@gooddata/sdk-ui-dashboard 11.36.0-alpha.2 → 11.36.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE +63 -115
- package/esm/__version.d.ts +1 -1
- package/esm/__version.js +1 -1
- package/esm/index.d.ts +5 -13
- package/esm/index.js +2 -10
- package/esm/internal.d.ts +1 -1
- package/esm/model/commandHandlers/dashboard/common/filterViews.js +24 -1
- package/esm/model/commandHandlers/dashboard/common/parameterHydration.d.ts +7 -1
- package/esm/model/commandHandlers/dashboard/common/parameterHydration.js +16 -2
- package/esm/model/commandHandlers/dashboard/common/stateInitializers.js +4 -2
- package/esm/model/commandHandlers/drill/resolveDrillToCustomUrl.d.ts +7 -1
- package/esm/model/commandHandlers/drill/resolveDrillToCustomUrl.js +80 -4
- package/esm/model/commandHandlers/filterContext/filterViewHandler.js +10 -0
- package/esm/model/commandHandlers/filterContext/filterViewParameters.d.ts +7 -0
- package/esm/model/commandHandlers/filterContext/filterViewParameters.js +11 -0
- package/esm/model/commandHandlers/scheduledEmail/initializeAutomationsHandler.js +7 -1
- package/esm/model/store/config/configSelectors.d.ts +0 -6
- package/esm/model/store/config/configSelectors.js +0 -8
- package/esm/model/store/tabs/index.d.ts +4 -0
- package/esm/model/store/tabs/parameters/parametersReducers.d.ts +11 -1
- package/esm/model/store/tabs/parameters/parametersReducers.js +16 -8
- package/esm/model/store/tabs/parameters/parametersSelectors.d.ts +7 -0
- package/esm/model/store/tabs/parameters/parametersSelectors.js +17 -0
- package/esm/model/types/commonTypes.d.ts +11 -2
- package/esm/model/utils/measureValueFilterUtils.d.ts +14 -0
- package/esm/model/utils/measureValueFilterUtils.js +21 -0
- package/esm/presentation/alerting/DefaultAlertingDialog/{DefaultAlertingDialogNew.d.ts → DefaultAlertingDialog.d.ts} +1 -1
- package/esm/presentation/alerting/DefaultAlertingDialog/{DefaultAlertingDialogNew.js → DefaultAlertingDialog.js} +6 -12
- package/esm/presentation/alerting/DefaultAlertingDialog/components/AlertAttributeSelect.js +43 -9
- package/esm/presentation/alerting/DefaultAlertingDialog/hooks/useSaveAlertToBackend.js +13 -25
- package/esm/presentation/alerting/types.d.ts +1 -72
- package/esm/presentation/automationFilters/hooks/useValidateExistingAutomationFilters.d.ts +1 -2
- package/esm/presentation/automationFilters/hooks/useValidateExistingAutomationFilters.js +5 -5
- package/esm/presentation/dashboard/DashboardHeader/AlertingDialogProvider.js +1 -8
- package/esm/presentation/dashboard/DashboardHeader/ScheduledEmailDialogProvider.js +17 -8
- package/esm/presentation/dashboard/DashboardHeader/ShareDialogDashboardHeader.js +5 -2
- package/esm/presentation/dashboard/components/DashboardRenderer.js +2 -2
- package/esm/presentation/drill/DrillConfigPanel/DrillToUrl/CustomUrlEditor.js +97 -13
- package/esm/presentation/drill/DrillConfigPanel/DrillToUrl/CustomUrlEditorParameters.d.ts +1 -1
- package/esm/presentation/drill/DrillConfigPanel/DrillToUrl/CustomUrlEditorParameters.js +3 -3
- package/esm/presentation/drill/DrillConfigPanel/DrillToUrl/CustomUrlEditorParametersSections/DashboardParametersSection.d.ts +3 -2
- package/esm/presentation/drill/DrillConfigPanel/DrillToUrl/CustomUrlEditorParametersSections/DashboardParametersSection.js +17 -4
- package/esm/presentation/drill/DrillConfigPanel/DrillToUrl/CustomUrlEditorParametersSections/InsightParametersSection.d.ts +4 -2
- package/esm/presentation/drill/DrillConfigPanel/DrillToUrl/CustomUrlEditorParametersSections/InsightParametersSection.js +37 -4
- package/esm/presentation/drill/DrillConfigPanel/DrillToUrl/CustomUrlEditorParametersSections/Parameter.d.ts +4 -3
- package/esm/presentation/drill/DrillConfigPanel/DrillToUrl/CustomUrlEditorParametersSections/Parameter.js +3 -4
- package/esm/presentation/filterBar/attributeFilter/DefaultDashboardAttributeFilter.js +4 -1
- package/esm/presentation/filterBar/filterBar/DefaultDashboardFilterGroup.js +4 -1
- package/esm/presentation/localization/bundles/de-DE.localization-bundle.d.ts +2 -9
- package/esm/presentation/localization/bundles/de-DE.localization-bundle.js +2 -9
- package/esm/presentation/localization/bundles/en-AU.localization-bundle.d.ts +2 -9
- package/esm/presentation/localization/bundles/en-AU.localization-bundle.js +2 -9
- package/esm/presentation/localization/bundles/en-GB.localization-bundle.d.ts +2 -9
- package/esm/presentation/localization/bundles/en-GB.localization-bundle.js +2 -9
- package/esm/presentation/localization/bundles/en-US.localization-bundle.d.ts +4 -36
- package/esm/presentation/localization/bundles/en-US.localization-bundle.js +4 -36
- package/esm/presentation/localization/bundles/es-419.localization-bundle.d.ts +2 -9
- package/esm/presentation/localization/bundles/es-419.localization-bundle.js +2 -9
- package/esm/presentation/localization/bundles/es-ES.localization-bundle.d.ts +2 -9
- package/esm/presentation/localization/bundles/es-ES.localization-bundle.js +2 -9
- package/esm/presentation/localization/bundles/fi-FI.localization-bundle.d.ts +2 -9
- package/esm/presentation/localization/bundles/fi-FI.localization-bundle.js +2 -9
- package/esm/presentation/localization/bundles/fr-CA.localization-bundle.d.ts +2 -9
- package/esm/presentation/localization/bundles/fr-CA.localization-bundle.js +2 -9
- package/esm/presentation/localization/bundles/fr-FR.localization-bundle.d.ts +2 -9
- package/esm/presentation/localization/bundles/fr-FR.localization-bundle.js +2 -9
- package/esm/presentation/localization/bundles/id-ID.localization-bundle.d.ts +2 -9
- package/esm/presentation/localization/bundles/id-ID.localization-bundle.js +2 -9
- package/esm/presentation/localization/bundles/it-IT.localization-bundle.d.ts +2 -9
- package/esm/presentation/localization/bundles/it-IT.localization-bundle.js +2 -9
- package/esm/presentation/localization/bundles/ja-JP.localization-bundle.d.ts +2 -9
- package/esm/presentation/localization/bundles/ja-JP.localization-bundle.js +2 -9
- package/esm/presentation/localization/bundles/ko-KR.localization-bundle.d.ts +2 -9
- package/esm/presentation/localization/bundles/ko-KR.localization-bundle.js +2 -9
- package/esm/presentation/localization/bundles/nl-NL.localization-bundle.d.ts +2 -9
- package/esm/presentation/localization/bundles/nl-NL.localization-bundle.js +2 -9
- package/esm/presentation/localization/bundles/pl-PL.localization-bundle.d.ts +2 -9
- package/esm/presentation/localization/bundles/pl-PL.localization-bundle.js +2 -9
- package/esm/presentation/localization/bundles/pt-BR.localization-bundle.d.ts +2 -9
- package/esm/presentation/localization/bundles/pt-BR.localization-bundle.js +2 -9
- package/esm/presentation/localization/bundles/pt-PT.localization-bundle.d.ts +2 -9
- package/esm/presentation/localization/bundles/pt-PT.localization-bundle.js +2 -9
- package/esm/presentation/localization/bundles/ru-RU.localization-bundle.d.ts +2 -9
- package/esm/presentation/localization/bundles/ru-RU.localization-bundle.js +2 -9
- package/esm/presentation/localization/bundles/sl-SI.localization-bundle.d.ts +2 -9
- package/esm/presentation/localization/bundles/sl-SI.localization-bundle.js +2 -9
- package/esm/presentation/localization/bundles/th-TH.localization-bundle.d.ts +2 -9
- package/esm/presentation/localization/bundles/th-TH.localization-bundle.js +2 -9
- package/esm/presentation/localization/bundles/tr-TR.localization-bundle.d.ts +2 -9
- package/esm/presentation/localization/bundles/tr-TR.localization-bundle.js +2 -9
- package/esm/presentation/localization/bundles/uk-UA.localization-bundle.d.ts +2 -9
- package/esm/presentation/localization/bundles/uk-UA.localization-bundle.js +2 -9
- package/esm/presentation/localization/bundles/vi-VN.localization-bundle.d.ts +2 -9
- package/esm/presentation/localization/bundles/vi-VN.localization-bundle.js +2 -9
- package/esm/presentation/localization/bundles/zh-HK.localization-bundle.d.ts +2 -9
- package/esm/presentation/localization/bundles/zh-HK.localization-bundle.js +2 -9
- package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.d.ts +2 -9
- package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.js +2 -9
- package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.d.ts +2 -9
- package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.js +2 -9
- package/esm/presentation/scheduledEmail/DefaultScheduledEmailDialog/DefaultScheduledEmailDialog.js +26 -59
- package/esm/presentation/scheduledEmail/DefaultScheduledEmailDialog/hooks/useEditScheduledEmail.d.ts +2 -6
- package/esm/presentation/scheduledEmail/DefaultScheduledEmailDialog/hooks/useEditScheduledEmail.js +22 -104
- package/esm/presentation/scheduledEmail/DefaultScheduledEmailDialog/hooks/useSaveScheduledEmailToBackend.js +12 -33
- package/esm/presentation/scheduledEmail/hooks/useWidgetAutomationFilters.d.ts +3 -0
- package/esm/presentation/scheduledEmail/hooks/useWidgetAutomationFilters.js +46 -0
- package/esm/presentation/scheduledEmail/types.d.ts +1 -7
- package/esm/presentation/scheduledEmail/utils/filters.d.ts +2 -0
- package/esm/presentation/scheduledEmail/utils/filters.js +5 -0
- package/esm/presentation/shareDialog/DefaultShareDialog.d.ts +1 -1
- package/esm/presentation/shareDialog/DefaultShareDialog.js +2 -2
- package/esm/presentation/shareDialog/types.d.ts +5 -1
- package/esm/presentation/widget/insight/configuration/DrillTargets/useInvalidFilteringParametersIdentifiers.d.ts +2 -2
- package/esm/presentation/widget/insight/configuration/DrillTargets/useInvalidFilteringParametersIdentifiers.js +36 -5
- package/esm/presentation/widget/insight/configuration/InsightAlertConfig/EditAlert.js +2 -2
- package/esm/presentation/widget/insight/configuration/InsightAlertConfig/hooks/useInsightWidgetAlerting.js +3 -6
- package/esm/presentation/widget/insight/configuration/InsightAlerts.js +1 -9
- package/esm/sdk-ui-dashboard.d.ts +28 -240
- package/package.json +20 -20
- package/esm/model/react/filtering/shared.d.ts +0 -6
- package/esm/model/react/filtering/shared.js +0 -38
- package/esm/model/react/filtering/useAutomationAvailableDashboardFilters.d.ts +0 -13
- package/esm/model/react/filtering/useAutomationAvailableDashboardFilters.js +0 -54
- package/esm/model/react/filtering/useDashboardScheduledExportFilters.d.ts +0 -19
- package/esm/model/react/filtering/useDashboardScheduledExportFilters.js +0 -18
- package/esm/model/react/filtering/useScheduledExportFilters.d.ts +0 -26
- package/esm/model/react/filtering/useScheduledExportFilters.js +0 -23
- package/esm/model/react/filtering/useWidgetAlertFilters.d.ts +0 -33
- package/esm/model/react/filtering/useWidgetAlertFilters.js +0 -48
- package/esm/model/react/filtering/useWidgetScheduledExportFilters.d.ts +0 -33
- package/esm/model/react/filtering/useWidgetScheduledExportFilters.js +0 -48
- package/esm/model/react/useDashboardAlerting/useEnableAutomationFilterContext.d.ts +0 -4
- package/esm/model/react/useDashboardAlerting/useEnableAutomationFilterContext.js +0 -20
- package/esm/model/react/useDashboardAlertsOld.d.ts +0 -32
- package/esm/model/react/useDashboardAlertsOld.js +0 -141
- package/esm/presentation/alerting/DefaultAlertingDialog/DefaultAlertingDialogOld.d.ts +0 -5
- package/esm/presentation/alerting/DefaultAlertingDialog/DefaultAlertingDialogOld.js +0 -36
- package/esm/presentation/alerting/DefaultAlertingDialog/components/AlertAttributeSelectOld.d.ts +0 -17
- package/esm/presentation/alerting/DefaultAlertingDialog/components/AlertAttributeSelectOld.js +0 -103
- package/esm/presentation/alerting/DefaultAlertingManagementDialog/DefaultAlertingManagementDialogOld.d.ts +0 -5
- package/esm/presentation/alerting/DefaultAlertingManagementDialog/DefaultAlertingManagementDialogOld.js +0 -53
- package/esm/presentation/alerting/DefaultAlertingManagementDialog/components/AlertOld.d.ts +0 -9
- package/esm/presentation/alerting/DefaultAlertingManagementDialog/components/AlertOld.js +0 -84
- package/esm/presentation/alerting/DefaultAlertingManagementDialog/components/AlertsListOld.d.ts +0 -11
- package/esm/presentation/alerting/DefaultAlertingManagementDialog/components/AlertsListOld.js +0 -16
- package/esm/presentation/dashboard/DashboardHeader/AlertingDialogProviderOld.d.ts +0 -1
- package/esm/presentation/dashboard/DashboardHeader/AlertingDialogProviderOld.js +0 -12
- package/esm/presentation/scheduledEmail/DefaultScheduledEmailDialog/components/AttachmentsOld/AttachmentFilters.d.ts +0 -29
- package/esm/presentation/scheduledEmail/DefaultScheduledEmailDialog/components/AttachmentsOld/AttachmentFilters.js +0 -61
- package/esm/presentation/scheduledEmail/DefaultScheduledEmailDialog/components/AttachmentsOld/AttachmentFiltersList.d.ts +0 -6
- package/esm/presentation/scheduledEmail/DefaultScheduledEmailDialog/components/AttachmentsOld/AttachmentFiltersList.js +0 -12
- package/esm/presentation/scheduledEmail/DefaultScheduledEmailDialog/components/AttachmentsOld/AttachmentItems.d.ts +0 -17
- package/esm/presentation/scheduledEmail/DefaultScheduledEmailDialog/components/AttachmentsOld/AttachmentItems.js +0 -68
- package/esm/presentation/scheduledEmail/DefaultScheduledEmailDialog/components/AttachmentsOld/AttachmentsWrapper.d.ts +0 -4
- package/esm/presentation/scheduledEmail/DefaultScheduledEmailDialog/components/AttachmentsOld/AttachmentsWrapper.js +0 -6
- package/esm/presentation/scheduledEmail/DefaultScheduledEmailDialog/components/AttachmentsOld/DashboardAttachments.d.ts +0 -15
- package/esm/presentation/scheduledEmail/DefaultScheduledEmailDialog/components/AttachmentsOld/DashboardAttachments.js +0 -42
- package/esm/presentation/scheduledEmail/DefaultScheduledEmailDialog/components/AttachmentsOld/WidgetAttachments.d.ts +0 -18
- package/esm/presentation/scheduledEmail/DefaultScheduledEmailDialog/components/AttachmentsOld/WidgetAttachments.js +0 -25
- package/esm/presentation/scheduledEmail/DefaultScheduledEmailDialog/types.d.ts +0 -2
- package/esm/presentation/scheduledEmail/DefaultScheduledEmailDialog/types.js +0 -2
- package/esm/presentation/widget/insight/configuration/InsightAlertsOld.d.ts +0 -2
- package/esm/presentation/widget/insight/configuration/InsightAlertsOld.js +0 -43
|
@@ -5,15 +5,16 @@ import { HighlightStyle, StreamLanguage, syntaxHighlighting } from "@codemirror/
|
|
|
5
5
|
import { Tag } from "@lezer/highlight";
|
|
6
6
|
import { compact, uniqBy } from "lodash-es";
|
|
7
7
|
import { FormattedMessage, useIntl } from "react-intl";
|
|
8
|
-
import { filterObjRef, idRef, isArbitraryAttributeFilter, isAttributeFilter, isMatchAttributeFilter, isNegativeAttributeFilter, isPositiveAttributeFilter, isUriRef, objRefToString, serializeObjRef, } from "@gooddata/sdk-model";
|
|
8
|
+
import { filterObjRef, idRef, insightFilters as insightDefinitionFilters, isArbitraryAttributeFilter, isAttributeFilter, isMatchAttributeFilter, isMeasureValueFilter, isNegativeAttributeFilter, isPositiveAttributeFilter, isUriRef, objRefToString, serializeObjRef, } from "@gooddata/sdk-model";
|
|
9
9
|
import { ConfirmDialogBase, FullScreenOverlay, Overlay, OverlayController, OverlayControllerProvider, SyntaxHighlightingInput, useMediaQuery, } from "@gooddata/sdk-ui-kit";
|
|
10
10
|
import { dashboardAttributeFilterItemToAttributeFilter } from "../../../../converters/filterConverters.js";
|
|
11
11
|
import { useDashboardSelector } from "../../../../model/react/DashboardStoreProvider.js";
|
|
12
12
|
import { useWidgetFilters } from "../../../../model/react/useWidgetFilters.js";
|
|
13
|
-
import { selectAllCatalogDisplayFormsMap } from "../../../../model/store/catalog/catalogSelectors.js";
|
|
14
|
-
import { selectIsWhiteLabeled } from "../../../../model/store/config/configSelectors.js";
|
|
13
|
+
import { selectAllCatalogDisplayFormsMap, selectAllCatalogMeasuresMap, } from "../../../../model/store/catalog/catalogSelectors.js";
|
|
14
|
+
import { selectEnableMeasureValueFilterKD, selectIsWhiteLabeled, } from "../../../../model/store/config/configSelectors.js";
|
|
15
|
+
import { selectInsightByWidgetRef } from "../../../../model/store/insights/insightsSelectors.js";
|
|
15
16
|
import { selectAttributeFilterConfigsOverrides } from "../../../../model/store/tabs/attributeFilterConfigs/attributeFilterConfigsSelectors.js";
|
|
16
|
-
import { selectFilterContextAttributeFilterItems } from "../../../../model/store/tabs/filterContext/filterContextSelectors.js";
|
|
17
|
+
import { selectFilterContextAttributeFilterItems, selectFilterContextMeasureValueFilters, } from "../../../../model/store/tabs/filterContext/filterContextSelectors.js";
|
|
17
18
|
import { selectFilterableWidgetByRef } from "../../../../model/store/tabs/layout/layoutSelectors.js";
|
|
18
19
|
import { DASHBOARD_HEADER_OVERLAYS_Z_INDEX } from "../../../constants/zIndex.js";
|
|
19
20
|
import { useInvalidFilteringParametersIdentifiers } from "../../../widget/insight/configuration/DrillTargets/useInvalidFilteringParametersIdentifiers.js";
|
|
@@ -114,6 +115,30 @@ const buildValidDashboardFiltersFormattingRule = (attributeFilters, attributeFil
|
|
|
114
115
|
token: customTags.filter.toString(),
|
|
115
116
|
};
|
|
116
117
|
};
|
|
118
|
+
const buildValidDashboardMvfFormattingRule = (measureIdentifiers) => {
|
|
119
|
+
if (measureIdentifiers.length === 0) {
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
const validDashboardMvfPlaceholders = measureIdentifiers
|
|
123
|
+
.map((id) => `{dash_mvf_condition\\(${id}\\)}`)
|
|
124
|
+
.join("|");
|
|
125
|
+
return {
|
|
126
|
+
regex: new RegExp(`^${validDashboardMvfPlaceholders}`),
|
|
127
|
+
token: customTags.filter.toString(),
|
|
128
|
+
};
|
|
129
|
+
};
|
|
130
|
+
const buildValidInsightMvfFormattingRule = (measureIdentifiers) => {
|
|
131
|
+
if (measureIdentifiers.length === 0) {
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
const validInsightMvfPlaceholders = measureIdentifiers
|
|
135
|
+
.map((id) => `{mvf_condition\\(${id}\\)}`)
|
|
136
|
+
.join("|");
|
|
137
|
+
return {
|
|
138
|
+
regex: new RegExp(`^${validInsightMvfPlaceholders}`),
|
|
139
|
+
token: customTags.filter.toString(),
|
|
140
|
+
};
|
|
141
|
+
};
|
|
117
142
|
const IDENTIFIER_RULE = {
|
|
118
143
|
regex: /^\{workspace_id\}|\{project_id\}|\{visualization_id\}|\{widget_id\}|\{dashboard_id\}|\{client_id\}|\{data_product_id\}/,
|
|
119
144
|
token: customTags.identifier.toString(),
|
|
@@ -127,6 +152,14 @@ const INVALID_DASHBOARD_ATTRIBUTE_FILTER_RULE = {
|
|
|
127
152
|
regex: /^\{dash_attribute_filter_selection\(.*?\)\}/,
|
|
128
153
|
token: customTags.invalidFilter.toString(),
|
|
129
154
|
};
|
|
155
|
+
const INVALID_DASHBOARD_MVF_RULE = {
|
|
156
|
+
regex: /^\{dash_mvf_condition\(.*?\)\}/,
|
|
157
|
+
token: customTags.invalidFilter.toString(),
|
|
158
|
+
};
|
|
159
|
+
const INVALID_INSIGHT_MVF_RULE = {
|
|
160
|
+
regex: /^\{mvf_condition\(.*?\)\}/,
|
|
161
|
+
token: customTags.invalidFilter.toString(),
|
|
162
|
+
};
|
|
130
163
|
const INVALID_INSIGHT_ATTRIBUTE_FILTER_RULE = {
|
|
131
164
|
regex: /^\{attribute_filter_selection\(.*?\)\}/,
|
|
132
165
|
token: customTags.invalidFilter.toString(),
|
|
@@ -134,27 +167,55 @@ const INVALID_INSIGHT_ATTRIBUTE_FILTER_RULE = {
|
|
|
134
167
|
const DEFAULT_RULES = [
|
|
135
168
|
INVALID_DISPLAY_FORMS_RULE,
|
|
136
169
|
INVALID_DASHBOARD_ATTRIBUTE_FILTER_RULE,
|
|
170
|
+
INVALID_DASHBOARD_MVF_RULE,
|
|
171
|
+
INVALID_INSIGHT_MVF_RULE,
|
|
137
172
|
INVALID_INSIGHT_ATTRIBUTE_FILTER_RULE,
|
|
138
173
|
IDENTIFIER_RULE,
|
|
139
174
|
INVALID_IDENTIFIER_RULE,
|
|
140
175
|
];
|
|
141
|
-
const buildFormattingRules = (attributeDisplayForms, dashboardFilters, insightFilters, attributeFilterConfigs) => {
|
|
176
|
+
const buildFormattingRules = (attributeDisplayForms, dashboardFilters, insightFilters, dashboardMeasureIdentifiers, insightMeasureIdentifiers, attributeFilterConfigs) => {
|
|
142
177
|
const validDisplayFormsRule = buildValidDisplayFormsFormattingRule(attributeDisplayForms);
|
|
143
178
|
const validInsightFiltersRule = buildValidInsightFiltersFormattingRule(insightFilters);
|
|
144
179
|
const validDashboardFiltersRule = buildValidDashboardFiltersFormattingRule(dashboardFilters, attributeFilterConfigs);
|
|
180
|
+
const validDashboardMvfRule = buildValidDashboardMvfFormattingRule(dashboardMeasureIdentifiers);
|
|
181
|
+
const validInsightMvfRule = buildValidInsightMvfFormattingRule(insightMeasureIdentifiers);
|
|
145
182
|
return compact([
|
|
146
183
|
validDisplayFormsRule,
|
|
147
184
|
validDashboardFiltersRule,
|
|
185
|
+
validDashboardMvfRule,
|
|
148
186
|
validInsightFiltersRule,
|
|
187
|
+
validInsightMvfRule,
|
|
149
188
|
...DEFAULT_RULES,
|
|
150
189
|
]);
|
|
151
190
|
};
|
|
152
|
-
function UrlInputPanel({ currentUrlValue, onChange, onCursor, documentationLink, attributeDisplayForms, intl, insightFilters, dashboardFilters, attributeFilterConfigs, }) {
|
|
191
|
+
function UrlInputPanel({ currentUrlValue, onChange, onCursor, documentationLink, attributeDisplayForms, intl, insightFilters, dashboardFilters, dashboardMeasureValueFilters, insightMeasureValueFilters, enableInsightMeasureValueFilters, attributeFilterConfigs, }) {
|
|
153
192
|
const isWhiteLabeled = useDashboardSelector(selectIsWhiteLabeled);
|
|
193
|
+
const catalogMeasuresMap = useDashboardSelector(selectAllCatalogMeasuresMap);
|
|
194
|
+
const dashboardMeasureIdentifiers = useMemo(() => {
|
|
195
|
+
return (dashboardMeasureValueFilters ?? []).map((filter) => {
|
|
196
|
+
const measureRef = filter.dashboardMeasureValueFilter.measure;
|
|
197
|
+
return catalogMeasuresMap.get(measureRef)?.measure.id ?? objRefToString(measureRef);
|
|
198
|
+
});
|
|
199
|
+
}, [catalogMeasuresMap, dashboardMeasureValueFilters]);
|
|
200
|
+
const insightMeasureIdentifiers = useMemo(() => enableInsightMeasureValueFilters
|
|
201
|
+
? (insightMeasureValueFilters ?? []).map((filter) => {
|
|
202
|
+
const measureRef = filter.measureValueFilter.measure;
|
|
203
|
+
return objRefToString(measureRef);
|
|
204
|
+
})
|
|
205
|
+
: [], [enableInsightMeasureValueFilters, insightMeasureValueFilters]);
|
|
154
206
|
const syntaxHighlightingRules = useMemo(() => attributeDisplayForms &&
|
|
155
207
|
insightFilters &&
|
|
156
208
|
dashboardFilters &&
|
|
157
|
-
|
|
209
|
+
dashboardMeasureValueFilters &&
|
|
210
|
+
buildFormattingRules(attributeDisplayForms, dashboardFilters, insightFilters, dashboardMeasureIdentifiers, insightMeasureIdentifiers, attributeFilterConfigs), [
|
|
211
|
+
attributeDisplayForms,
|
|
212
|
+
insightFilters,
|
|
213
|
+
dashboardFilters,
|
|
214
|
+
dashboardMeasureValueFilters,
|
|
215
|
+
dashboardMeasureIdentifiers,
|
|
216
|
+
insightMeasureIdentifiers,
|
|
217
|
+
attributeFilterConfigs,
|
|
218
|
+
]);
|
|
158
219
|
return (_jsxs("div", { children: [
|
|
159
220
|
_jsx("label", { className: "gd-label", children: _jsx(FormattedMessage, { id: "configurationPanel.drillIntoUrl.editor.textAreaLabel" }) }), _jsx(UrlInput, { onChange: onChange, onCursor: onCursor, currentUrlValue: currentUrlValue, syntaxHighlightingRules: syntaxHighlightingRules, intl: intl }), !isWhiteLabeled && documentationLink ? _jsx(HelpLink, { link: documentationLink }) : null] }));
|
|
160
221
|
}
|
|
@@ -163,19 +224,33 @@ const initialCursorPosition = {
|
|
|
163
224
|
to: 0,
|
|
164
225
|
};
|
|
165
226
|
const insertPlaceholderAtCursor = (text, placeholder, cursor) => `${text.substring(0, cursor.from)}${placeholder}${text.substring(cursor.to)}`;
|
|
166
|
-
const
|
|
167
|
-
|
|
168
|
-
|
|
227
|
+
const URL_START_RULES = [
|
|
228
|
+
/^[A-Za-z0-9.\-+]+:/,
|
|
229
|
+
/^\{attribute_title\(/,
|
|
230
|
+
/^\{attribute_filter_selection\(/,
|
|
231
|
+
/^\{dash_attribute_filter_selection\(/,
|
|
232
|
+
/^\{dash_mvf_condition\(/,
|
|
233
|
+
];
|
|
234
|
+
const INSIGHT_MVF_URL_START_RULE = /^\{mvf_condition\(/;
|
|
235
|
+
const assertValidUrl = (url, enableInsightMeasureValueFilters) => {
|
|
236
|
+
const rules = enableInsightMeasureValueFilters
|
|
237
|
+
? [...URL_START_RULES, INSIGHT_MVF_URL_START_RULE]
|
|
238
|
+
: URL_START_RULES;
|
|
239
|
+
return rules.some((rule) => rule.test(url)) ? url : `https://${url}`;
|
|
240
|
+
};
|
|
169
241
|
const getWarningTextForInvalidParameters = (parameters) => {
|
|
170
242
|
const invalidParameters = parameters.map((parameter) => `"${parameter}"`).join(", ");
|
|
171
243
|
return (_jsx(FormattedMessage, { id: "configurationPanel.drillIntoUrl.editor.invalidAttributeDisplayForms", values: { invalidParameters } }));
|
|
172
244
|
};
|
|
173
245
|
function CustomUrlEditorDialog({ urlDrillTarget, documentationLink, onSelect, onClose, attributeDisplayForms, loadingAttributeDisplayForms = false, invalidAttributeDisplayFormIdentifiers, enableClientIdParameter, enableDataProductIdParameter, enableWidgetIdParameter, widgetRef, }) {
|
|
174
246
|
const intl = useIntl();
|
|
247
|
+
const enableInsightMeasureValueFilters = useDashboardSelector(selectEnableMeasureValueFilterKD);
|
|
175
248
|
const insightFilters = useSanitizedInsightFilters(widgetRef);
|
|
249
|
+
const insightMeasureValueFilters = useInsightMeasureValueFilters(widgetRef, enableInsightMeasureValueFilters);
|
|
176
250
|
const dashboardFilters = useSanitizedDashboardFilters();
|
|
251
|
+
const dashboardMeasureValueFilters = useDashboardSelector(selectFilterContextMeasureValueFilters);
|
|
177
252
|
const attributeFilterConfigs = useDashboardSelector(selectAttributeFilterConfigsOverrides);
|
|
178
|
-
const invalidFilteringParametersIdentifiers = useInvalidFilteringParametersIdentifiers(urlDrillTarget, insightFilters, dashboardFilters, attributeFilterConfigs);
|
|
253
|
+
const invalidFilteringParametersIdentifiers = useInvalidFilteringParametersIdentifiers(urlDrillTarget, insightFilters, dashboardFilters, dashboardMeasureValueFilters, enableInsightMeasureValueFilters ? insightMeasureValueFilters : undefined, enableInsightMeasureValueFilters, attributeFilterConfigs);
|
|
179
254
|
const invalidParameters = useMemo(() => {
|
|
180
255
|
return [...invalidAttributeDisplayFormIdentifiers, ...invalidFilteringParametersIdentifiers];
|
|
181
256
|
}, [invalidAttributeDisplayFormIdentifiers, invalidFilteringParametersIdentifiers]);
|
|
@@ -183,7 +258,7 @@ function CustomUrlEditorDialog({ urlDrillTarget, documentationLink, onSelect, on
|
|
|
183
258
|
? (isDrillToCustomUrlConfig(urlDrillTarget) && urlDrillTarget.customUrl) || ""
|
|
184
259
|
: "";
|
|
185
260
|
const [currentValue, setCurrentValue] = useState(previousValue);
|
|
186
|
-
const apply = () => onSelect(assertValidUrl(currentValue));
|
|
261
|
+
const apply = () => onSelect(assertValidUrl(currentValue, enableInsightMeasureValueFilters));
|
|
187
262
|
const handleOnChange = (value) => setCurrentValue(value);
|
|
188
263
|
const isApplyEnabled = currentValue && currentValue.localeCompare(previousValue) !== 0;
|
|
189
264
|
const [cursorPosition, setCursorPosition] = useState(initialCursorPosition);
|
|
@@ -197,7 +272,7 @@ function CustomUrlEditorDialog({ urlDrillTarget, documentationLink, onSelect, on
|
|
|
197
272
|
}), submitButtonText: intl.formatMessage({
|
|
198
273
|
id: "configurationPanel.drillIntoUrl.editor.applyButtonLabel",
|
|
199
274
|
}), isSubmitDisabled: !isApplyEnabled, submitOnEnterKey: false, onCancel: onClose, onSubmit: apply, warning: editorWarningText, children: [
|
|
200
|
-
_jsx(UrlInputPanel, { onChange: handleOnChange, onCursor: handleCursorPosition, documentationLink: documentationLink, currentUrlValue: currentValue, attributeDisplayForms: attributeDisplayForms, insightFilters: insightFilters, dashboardFilters: dashboardFilters, attributeFilterConfigs: attributeFilterConfigs, intl: intl }), _jsx(ParametersPanel, { insightFilters: insightFilters, dashboardFilters: dashboardFilters, attributeFilterConfigs: attributeFilterConfigs, attributeDisplayForms: attributeDisplayForms, loadingAttributeDisplayForms: loadingAttributeDisplayForms, enableClientIdParameter: enableClientIdParameter, enableDataProductIdParameter: enableDataProductIdParameter, enableWidgetIdParameter: enableWidgetIdParameter, onAdd: handleOnAdd, intl: intl, widgetRef: widgetRef })
|
|
275
|
+
_jsx(UrlInputPanel, { onChange: handleOnChange, onCursor: handleCursorPosition, documentationLink: documentationLink, currentUrlValue: currentValue, attributeDisplayForms: attributeDisplayForms, insightFilters: insightFilters, dashboardFilters: dashboardFilters, dashboardMeasureValueFilters: dashboardMeasureValueFilters, insightMeasureValueFilters: insightMeasureValueFilters, enableInsightMeasureValueFilters: enableInsightMeasureValueFilters, attributeFilterConfigs: attributeFilterConfigs, intl: intl }), _jsx(ParametersPanel, { insightFilters: insightFilters, dashboardFilters: dashboardFilters, dashboardMeasureValueFilters: dashboardMeasureValueFilters, insightMeasureValueFilters: insightMeasureValueFilters, attributeFilterConfigs: attributeFilterConfigs, attributeDisplayForms: attributeDisplayForms, loadingAttributeDisplayForms: loadingAttributeDisplayForms, enableClientIdParameter: enableClientIdParameter, enableDataProductIdParameter: enableDataProductIdParameter, enableWidgetIdParameter: enableWidgetIdParameter, onAdd: handleOnAdd, intl: intl, widgetRef: widgetRef })
|
|
201
276
|
] }));
|
|
202
277
|
}
|
|
203
278
|
const overlayController = OverlayController.getInstance(DASHBOARD_HEADER_OVERLAYS_Z_INDEX);
|
|
@@ -206,6 +281,15 @@ export function CustomUrlEditor(props) {
|
|
|
206
281
|
const SelectedOverlay = isMobileDevice ? FullScreenOverlay : Overlay;
|
|
207
282
|
return (_jsx(OverlayControllerProvider, { overlayController: overlayController, children: _jsx(SelectedOverlay, { onClose: props.onClose, isModal: true, closeOnOutsideClick: false, closeOnEscape: true, positionType: "fixed", className: "gd-modal-overlay", children: _jsx(CustomUrlEditorDialog, { ...props }) }) }));
|
|
208
283
|
}
|
|
284
|
+
function useInsightMeasureValueFilters(widgetRef, enabled) {
|
|
285
|
+
const insight = useDashboardSelector(selectInsightByWidgetRef(widgetRef));
|
|
286
|
+
return useMemo(() => {
|
|
287
|
+
if (!enabled || !insight) {
|
|
288
|
+
return [];
|
|
289
|
+
}
|
|
290
|
+
return insightDefinitionFilters(insight).filter(isMeasureValueFilter);
|
|
291
|
+
}, [enabled, insight]);
|
|
292
|
+
}
|
|
209
293
|
function useSanitizedInsightFilters(widgetRef) {
|
|
210
294
|
const widget = useDashboardSelector(selectFilterableWidgetByRef(widgetRef));
|
|
211
295
|
const widgetFiltersResult = useWidgetFilters(widget);
|
|
@@ -2,5 +2,5 @@ import { type IDashboardParametersSectionProps } from "./CustomUrlEditorParamete
|
|
|
2
2
|
import { type IInsightParametersSectionProps } from "./CustomUrlEditorParametersSections/InsightParametersSection.js";
|
|
3
3
|
import { type IIdentifierParametersSectionProps } from "./types.js";
|
|
4
4
|
type IParametersPanelProps = IInsightParametersSectionProps & IIdentifierParametersSectionProps & IDashboardParametersSectionProps;
|
|
5
|
-
export declare function ParametersPanel({ attributeDisplayForms, loadingAttributeDisplayForms, enableClientIdParameter, enableDataProductIdParameter, enableWidgetIdParameter, onAdd, intl, dashboardFilters, attributeFilterConfigs, insightFilters, widgetRef }: IParametersPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
export declare function ParametersPanel({ attributeDisplayForms, loadingAttributeDisplayForms, enableClientIdParameter, enableDataProductIdParameter, enableWidgetIdParameter, onAdd, intl, dashboardFilters, dashboardMeasureValueFilters, insightMeasureValueFilters, attributeFilterConfigs, insightFilters, widgetRef }: IParametersPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
6
6
|
export {};
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
// (C) 2020-
|
|
2
|
+
// (C) 2020-2026 GoodData Corporation
|
|
3
3
|
import { FormattedMessage } from "react-intl";
|
|
4
4
|
import { Bubble, BubbleHoverTrigger } from "@gooddata/sdk-ui-kit";
|
|
5
5
|
import { DashboardParametersSection, } from "./CustomUrlEditorParametersSections/DashboardParametersSection.js";
|
|
6
6
|
import { IdentifierParametersSection } from "./CustomUrlEditorParametersSections/IdentifierParametersSection.js";
|
|
7
7
|
import { InsightParametersSection, } from "./CustomUrlEditorParametersSections/InsightParametersSection.js";
|
|
8
|
-
export function ParametersPanel({ attributeDisplayForms, loadingAttributeDisplayForms, enableClientIdParameter, enableDataProductIdParameter, enableWidgetIdParameter, onAdd, intl, dashboardFilters, attributeFilterConfigs, insightFilters, widgetRef, }) {
|
|
8
|
+
export function ParametersPanel({ attributeDisplayForms, loadingAttributeDisplayForms, enableClientIdParameter, enableDataProductIdParameter, enableWidgetIdParameter, onAdd, intl, dashboardFilters, dashboardMeasureValueFilters, insightMeasureValueFilters, attributeFilterConfigs, insightFilters, widgetRef, }) {
|
|
9
9
|
return (_jsxs("div", { children: [
|
|
10
10
|
_jsxs("label", { className: "gd-label", children: [
|
|
11
11
|
_jsx(FormattedMessage, { id: "configurationPanel.drillIntoUrl.editor.parametersPanelLabel" }), _jsxs(BubbleHoverTrigger, { className: "gd-list-item-tooltip", showDelay: 0, hideDelay: 0, children: [
|
|
12
12
|
_jsx("span", { className: "gd-icon-circle-question gd-list-item-tooltip-icon" }), _jsx(Bubble, { className: "bubble-primary", alignPoints: [{ align: "cr cl" }], children: _jsx(FormattedMessage, { id: "configurationPanel.drillIntoUrl.editor.parametersPanelTooltip" }) })
|
|
13
13
|
] })
|
|
14
14
|
] }), _jsxs("div", { className: "gd-drill-to-url-parameters gd-drill-to-url-list", children: [
|
|
15
|
-
_jsx(InsightParametersSection, { attributeDisplayForms: attributeDisplayForms, loadingAttributeDisplayForms: loadingAttributeDisplayForms, onAdd: onAdd, intl: intl, insightFilters: insightFilters }), _jsx(DashboardParametersSection, { intl: intl, onAdd: onAdd, dashboardFilters: dashboardFilters, attributeFilterConfigs: attributeFilterConfigs }), _jsx(IdentifierParametersSection, { enableClientIdParameter: enableClientIdParameter, enableDataProductIdParameter: enableDataProductIdParameter, enableWidgetIdParameter: enableWidgetIdParameter, onAdd: onAdd, intl: intl, widgetRef: widgetRef })
|
|
15
|
+
_jsx(InsightParametersSection, { attributeDisplayForms: attributeDisplayForms, loadingAttributeDisplayForms: loadingAttributeDisplayForms, onAdd: onAdd, intl: intl, insightFilters: insightFilters, insightMeasureValueFilters: insightMeasureValueFilters, widgetRef: widgetRef }), _jsx(DashboardParametersSection, { intl: intl, onAdd: onAdd, dashboardFilters: dashboardFilters, dashboardMeasureValueFilters: dashboardMeasureValueFilters, attributeFilterConfigs: attributeFilterConfigs }), _jsx(IdentifierParametersSection, { enableClientIdParameter: enableClientIdParameter, enableDataProductIdParameter: enableDataProductIdParameter, enableWidgetIdParameter: enableWidgetIdParameter, onAdd: onAdd, intl: intl, widgetRef: widgetRef })
|
|
16
16
|
] })
|
|
17
17
|
] }));
|
|
18
18
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { type IAttributeFilter, type IDashboardAttributeFilterConfig } from "@gooddata/sdk-model";
|
|
1
|
+
import { type IAttributeFilter, type IDashboardAttributeFilterConfig, type IDashboardMeasureValueFilter } from "@gooddata/sdk-model";
|
|
2
2
|
import { type IParametersPanelSectionsCommonProps } from "../types.js";
|
|
3
3
|
export interface IDashboardParametersSectionProps extends IParametersPanelSectionsCommonProps {
|
|
4
4
|
dashboardFilters?: IAttributeFilter[];
|
|
5
|
+
dashboardMeasureValueFilters?: IDashboardMeasureValueFilter[];
|
|
5
6
|
attributeFilterConfigs?: IDashboardAttributeFilterConfig[];
|
|
6
7
|
}
|
|
7
|
-
export declare function DashboardParametersSection({ dashboardFilters, attributeFilterConfigs, onAdd }: IDashboardParametersSectionProps): import("react/jsx-runtime").JSX.Element | null;
|
|
8
|
+
export declare function DashboardParametersSection({ dashboardFilters, dashboardMeasureValueFilters, attributeFilterConfigs, intl, onAdd }: IDashboardParametersSectionProps): import("react/jsx-runtime").JSX.Element | null;
|
|
@@ -2,14 +2,19 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
|
|
|
2
2
|
// (C) 2020-2026 GoodData Corporation
|
|
3
3
|
import { Fragment } from "react";
|
|
4
4
|
import { FormattedMessage } from "react-intl";
|
|
5
|
-
import { filterLocalIdentifier, filterObjRef, } from "@gooddata/sdk-model";
|
|
5
|
+
import { filterLocalIdentifier, filterObjRef, objRefToString, } from "@gooddata/sdk-model";
|
|
6
|
+
import { MeasureValueFilterDetailsBubble } from "@gooddata/sdk-ui-filters/internal";
|
|
6
7
|
import { useDashboardSelector } from "../../../../../model/react/DashboardStoreProvider.js";
|
|
7
|
-
import { selectAllCatalogDisplayFormsMap } from "../../../../../model/store/catalog/catalogSelectors.js";
|
|
8
|
+
import { selectAllCatalogDisplayFormsMap, selectAllCatalogMeasuresMap, } from "../../../../../model/store/catalog/catalogSelectors.js";
|
|
8
9
|
import { DropdownSectionHeader } from "../DropdownSectionHeader.js";
|
|
9
10
|
import { DisplayFormParam } from "./DisplayFormParam.js";
|
|
10
|
-
|
|
11
|
+
import { Parameter } from "./Parameter.js";
|
|
12
|
+
export function DashboardParametersSection({ dashboardFilters, dashboardMeasureValueFilters, attributeFilterConfigs, intl, onAdd, }) {
|
|
11
13
|
const catalogDisplayFormsMap = useDashboardSelector(selectAllCatalogDisplayFormsMap);
|
|
12
|
-
|
|
14
|
+
const catalogMeasuresMap = useDashboardSelector(selectAllCatalogMeasuresMap);
|
|
15
|
+
const hasAttributeFilters = !!dashboardFilters?.length;
|
|
16
|
+
const hasMeasureValueFilters = !!dashboardMeasureValueFilters?.length;
|
|
17
|
+
return hasAttributeFilters || hasMeasureValueFilters ? (_jsxs(_Fragment, { children: [
|
|
13
18
|
_jsx(DropdownSectionHeader, { children: _jsx(FormattedMessage, { id: "configurationPanel.drillIntoUrl.editor.dashboardParametersSectionLabel" }) }), dashboardFilters?.map((filter, index) => {
|
|
14
19
|
const df = catalogDisplayFormsMap.get(filterObjRef(filter));
|
|
15
20
|
const filterIdentifier = df?.id;
|
|
@@ -24,5 +29,13 @@ export function DashboardParametersSection({ dashboardFilters, attributeFilterCo
|
|
|
24
29
|
}, isFilter: true })) : null, secondaryDf && areDfsDifferent ? (_jsx(DisplayFormParam, { item: secondaryDf, iconClassName: "gd-icon-filter", onAdd: () => {
|
|
25
30
|
onAdd(`{dash_attribute_filter_selection(${filterSecondaryIdentifier})}`);
|
|
26
31
|
}, isFilter: true })) : null] }, index));
|
|
32
|
+
}), dashboardMeasureValueFilters?.map((filter) => {
|
|
33
|
+
const { measure, localIdentifier, title } = filter.dashboardMeasureValueFilter;
|
|
34
|
+
const catalogMeasure = catalogMeasuresMap.get(measure);
|
|
35
|
+
const measureIdentifier = catalogMeasure?.measure.id ?? objRefToString(measure);
|
|
36
|
+
const measureTitle = title ?? catalogMeasure?.measure.title ?? measureIdentifier;
|
|
37
|
+
return (_jsx(Parameter, { name: measureTitle, description: measureIdentifier, detailTrigger: _jsx(MeasureValueFilterDetailsBubble, { title: measureTitle, requestHandler: catalogMeasure ? async () => catalogMeasure.measure : undefined }), iconClassName: "gd-icon-filter", onAdd: () => {
|
|
38
|
+
onAdd(`{dash_mvf_condition(${measureIdentifier})}`);
|
|
39
|
+
}, intl: intl }, localIdentifier));
|
|
27
40
|
})] })) : null;
|
|
28
41
|
}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { type IAttributeFilter } from "@gooddata/sdk-model";
|
|
1
|
+
import { type IAttributeFilter, type IMeasureValueFilter, type ObjRef } from "@gooddata/sdk-model";
|
|
2
2
|
import { type IAttributeWithDisplayForm, type IParametersPanelSectionsCommonProps } from "../types.js";
|
|
3
3
|
export interface IInsightParametersSectionProps extends IParametersPanelSectionsCommonProps {
|
|
4
4
|
attributeDisplayForms?: IAttributeWithDisplayForm[];
|
|
5
5
|
loadingAttributeDisplayForms: boolean;
|
|
6
6
|
insightFilters?: IAttributeFilter[];
|
|
7
|
+
insightMeasureValueFilters?: IMeasureValueFilter[];
|
|
8
|
+
widgetRef: ObjRef;
|
|
7
9
|
}
|
|
8
|
-
export declare function InsightParametersSection({ attributeDisplayForms, loadingAttributeDisplayForms, insightFilters, onAdd }: IInsightParametersSectionProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export declare function InsightParametersSection({ attributeDisplayForms, loadingAttributeDisplayForms, insightFilters, insightMeasureValueFilters, widgetRef, intl, onAdd }: IInsightParametersSectionProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,19 +1,52 @@
|
|
|
1
1
|
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
// (C) 2020-2026 GoodData Corporation
|
|
3
3
|
import { FormattedMessage } from "react-intl";
|
|
4
|
-
import { filterObjRef } from "@gooddata/sdk-model";
|
|
4
|
+
import { areObjRefsEqual, filterObjRef, insightMeasures, isLocalIdRef, measureAlias, measureItem, measureLocalId, measureTitle, objRefToString, } from "@gooddata/sdk-model";
|
|
5
|
+
import { MeasureValueFilterDetailsBubble } from "@gooddata/sdk-ui-filters/internal";
|
|
5
6
|
import { useDashboardSelector } from "../../../../../model/react/DashboardStoreProvider.js";
|
|
6
|
-
import { selectAllCatalogDisplayFormsMap } from "../../../../../model/store/catalog/catalogSelectors.js";
|
|
7
|
+
import { selectAllCatalogDisplayFormsMap, selectAllCatalogMeasuresMap, } from "../../../../../model/store/catalog/catalogSelectors.js";
|
|
8
|
+
import { selectInsightByWidgetRef } from "../../../../../model/store/insights/insightsSelectors.js";
|
|
7
9
|
import { DropdownSectionHeader } from "../DropdownSectionHeader.js";
|
|
8
10
|
import { DisplayFormParam } from "./DisplayFormParam.js";
|
|
9
|
-
|
|
11
|
+
import { Parameter } from "./Parameter.js";
|
|
12
|
+
export function InsightParametersSection({ attributeDisplayForms, loadingAttributeDisplayForms, insightFilters, insightMeasureValueFilters, widgetRef, intl, onAdd, }) {
|
|
10
13
|
const catalogDisplayForms = useDashboardSelector(selectAllCatalogDisplayFormsMap);
|
|
14
|
+
const catalogMeasuresMap = useDashboardSelector(selectAllCatalogMeasuresMap);
|
|
15
|
+
const insight = useDashboardSelector(selectInsightByWidgetRef(widgetRef));
|
|
16
|
+
const measures = insight ? insightMeasures(insight) : [];
|
|
11
17
|
return (_jsx(_Fragment, { children: (attributeDisplayForms && attributeDisplayForms.length > 0) ||
|
|
12
18
|
loadingAttributeDisplayForms ||
|
|
13
|
-
(insightFilters && insightFilters.length > 0)
|
|
19
|
+
(insightFilters && insightFilters.length > 0) ||
|
|
20
|
+
(insightMeasureValueFilters && insightMeasureValueFilters.length > 0) ? (_jsxs(_Fragment, { children: [
|
|
14
21
|
_jsx(DropdownSectionHeader, { children: _jsx(FormattedMessage, { id: "configurationPanel.drillIntoUrl.editor.insightParametersSectionLabel" }) }), loadingAttributeDisplayForms ? (_jsx("div", { className: "gd-drill-to-url-section-loading s-drill-to-custom-url-attr-section-loading", children: _jsx("div", { className: "gd-spinner small" }) })) : (attributeDisplayForms?.map((item) => (_jsx(DisplayFormParam, { item: item.displayForm, onAdd: onAdd }, item.displayForm.id)))), insightFilters?.map((filter, index) => {
|
|
15
22
|
const displayFormRef = filterObjRef(filter);
|
|
16
23
|
const df = catalogDisplayForms.get(displayFormRef);
|
|
17
24
|
return (df && (_jsx(DisplayFormParam, { item: df, onAdd: () => onAdd(`{attribute_filter_selection(${df.id})}`), iconClassName: "gd-icon-filter", isFilter: true }, index)));
|
|
25
|
+
}), insightMeasureValueFilters?.map((filter) => {
|
|
26
|
+
const { measure, localIdentifier } = filter.measureValueFilter;
|
|
27
|
+
const insightMeasure = getInsightMeasure(measure, measures);
|
|
28
|
+
const insightMeasureItem = insightMeasure ? measureItem(insightMeasure) : undefined;
|
|
29
|
+
const catalogMeasure = isLocalIdRef(measure)
|
|
30
|
+
? insightMeasureItem && catalogMeasuresMap.get(insightMeasureItem)
|
|
31
|
+
: catalogMeasuresMap.get(measure);
|
|
32
|
+
const measureIdentifier = objRefToString(measure);
|
|
33
|
+
const resolvedTitle = getInsightMeasureTitle(insightMeasure) ??
|
|
34
|
+
catalogMeasure?.measure.title ??
|
|
35
|
+
measureIdentifier;
|
|
36
|
+
return (_jsx(Parameter, { name: resolvedTitle, description: measureIdentifier, detailTrigger: _jsx(MeasureValueFilterDetailsBubble, { title: resolvedTitle, requestHandler: catalogMeasure ? async () => catalogMeasure.measure : undefined }), iconClassName: "gd-icon-filter", onAdd: () => {
|
|
37
|
+
onAdd(`{mvf_condition(${measureIdentifier})}`);
|
|
38
|
+
}, intl: intl }, localIdentifier ?? measureIdentifier));
|
|
18
39
|
})] })) : null }));
|
|
19
40
|
}
|
|
41
|
+
function getInsightMeasureTitle(measure) {
|
|
42
|
+
return measure ? (measureAlias(measure) ?? measureTitle(measure)) : undefined;
|
|
43
|
+
}
|
|
44
|
+
function getInsightMeasure(measureRef, measures) {
|
|
45
|
+
if (isLocalIdRef(measureRef)) {
|
|
46
|
+
return measures.find((measure) => measureLocalId(measure) === measureRef.localIdentifier);
|
|
47
|
+
}
|
|
48
|
+
return measures.find((measure) => {
|
|
49
|
+
const item = measureItem(measure);
|
|
50
|
+
return item ? areObjRefsEqual(item, measureRef) : false;
|
|
51
|
+
});
|
|
52
|
+
}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { type ReactElement } from "react";
|
|
1
|
+
import { type ReactElement, type ReactNode } from "react";
|
|
2
2
|
import { type IntlShape } from "react-intl";
|
|
3
3
|
interface IParameterProps {
|
|
4
4
|
name: string;
|
|
5
5
|
description?: string;
|
|
6
|
-
detailContent
|
|
6
|
+
detailContent?: ReactElement;
|
|
7
|
+
detailTrigger?: ReactNode;
|
|
7
8
|
iconClassName: string;
|
|
8
9
|
onAdd: () => void;
|
|
9
10
|
intl: IntlShape;
|
|
10
11
|
}
|
|
11
|
-
export declare function Parameter({ name, description, detailContent, iconClassName, onAdd, intl }: IParameterProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export declare function Parameter({ name, description, detailContent, detailTrigger, iconClassName, onAdd, intl }: IParameterProps): import("react/jsx-runtime").JSX.Element;
|
|
12
13
|
export {};
|
|
@@ -5,7 +5,7 @@ import classNames from "classnames";
|
|
|
5
5
|
import { Bubble, Button } from "@gooddata/sdk-ui-kit";
|
|
6
6
|
import { isDarkTheme, useTheme } from "@gooddata/sdk-ui-theme-provider";
|
|
7
7
|
import { simplifyText } from "@gooddata/util";
|
|
8
|
-
export function Parameter({ name, description, detailContent, iconClassName, onAdd, intl }) {
|
|
8
|
+
export function Parameter({ name, description, detailContent, detailTrigger, iconClassName, onAdd, intl, }) {
|
|
9
9
|
const [displayHelp, setDisplayHelp] = useState(false);
|
|
10
10
|
const theme = useTheme();
|
|
11
11
|
const isDark = theme && isDarkTheme(theme);
|
|
@@ -16,7 +16,6 @@ export function Parameter({ name, description, detailContent, iconClassName, onA
|
|
|
16
16
|
id: "configurationPanel.drillIntoUrl.editor.addParameterButtonLabel",
|
|
17
17
|
});
|
|
18
18
|
return (_jsxs("div", { id: id, className: itemClassNames, onClick: () => onAdd(), children: [
|
|
19
|
-
_jsx("span", { className: "gd-parameter-title", children: name }), description ? _jsxs("span", { className: "addon s-parameter-description", children: ["(", description, ")"] }) : null, _jsx(Button, { className: "gd-button gd-button-link s-parameter-add-button", value: addButtonLabel }), _jsxs("div", { className: "gd-list-item-tooltip", children: [
|
|
20
|
-
_jsx("span", { className: "gd-icon-circle-question gd-list-item-tooltip-icon s-parameter-help-icon", onMouseEnter: () => setDisplayHelp(true), onMouseLeave: () => setDisplayHelp(false) }), displayHelp ? (_jsx(Bubble, { className: `themed-bubble ${isDark ? "bubble-primary" : "bubble-light"}`, alignTo: `#${id}`, alignPoints: [{ align: "cr tl" }], children: detailContent })) : null] })
|
|
21
|
-
] }));
|
|
19
|
+
_jsx("span", { className: "gd-parameter-title", children: name }), description ? _jsxs("span", { className: "addon s-parameter-description", children: ["(", description, ")"] }) : null, _jsx(Button, { className: "gd-button gd-button-link s-parameter-add-button", value: addButtonLabel }), detailTrigger ? (_jsx("div", { className: "gd-list-item-tooltip", onClick: (event) => event.stopPropagation(), children: detailTrigger })) : detailContent ? (_jsxs("div", { className: "gd-list-item-tooltip", children: [
|
|
20
|
+
_jsx("span", { className: "gd-icon-circle-question gd-list-item-tooltip-icon s-parameter-help-icon", onMouseEnter: () => setDisplayHelp(true), onMouseLeave: () => setDisplayHelp(false) }), displayHelp ? (_jsx(Bubble, { className: `themed-bubble ${isDark ? "bubble-primary" : "bubble-light"}`, alignTo: `#${id}`, alignPoints: [{ align: "cr tl" }], children: detailContent })) : null] })) : null] }));
|
|
22
21
|
}
|
|
@@ -145,6 +145,9 @@ function DefaultDashboardAttributeFilterInner(props) {
|
|
|
145
145
|
filterTitle: title,
|
|
146
146
|
strong: (chunks) => _jsx("strong", { children: chunks }),
|
|
147
147
|
});
|
|
148
|
+
const filterDependencyIconAriaLabel = intl.formatMessage({
|
|
149
|
+
id: "filter.dependency.icon.aria.label",
|
|
150
|
+
});
|
|
148
151
|
const CustomTooltipComponent = useMemo(() => {
|
|
149
152
|
// When text filter FFs are enabled, the attribute filter dropdown header
|
|
150
153
|
// has its own help icon (AttributeFilterDetailsBubble), so hide this one.
|
|
@@ -160,7 +163,7 @@ function DefaultDashboardAttributeFilterInner(props) {
|
|
|
160
163
|
return undefined;
|
|
161
164
|
}, [displayAttributeTooltip, defaultAttributeFilterTitle, attributeDataSet, isOpen, title]);
|
|
162
165
|
const shouldExtendTitle = !!capabilities.supportsKeepingDependentFiltersSelection && isAttributeFilterDependent;
|
|
163
|
-
const titleExtension = shouldExtendTitle ? (_jsx(AttributeFilterDependencyTooltip, { tooltipContent: filterDependencyIconTooltip })) : null;
|
|
166
|
+
const titleExtension = shouldExtendTitle ? (_jsx(AttributeFilterDependencyTooltip, { tooltipContent: filterDependencyIconTooltip, ariaLabel: filterDependencyIconAriaLabel })) : null;
|
|
164
167
|
return (_jsx(AttributeFilterDropdownButton, { ...props, isDraggable: isDraggable, TooltipContentComponent: CustomTooltipComponent, titleExtension: titleExtension, className: isVirtualAttributeFilter ? "gd-virtual-attribute-filter-dropdown-button" : undefined }));
|
|
165
168
|
}
|
|
166
169
|
return DropdownButton;
|
|
@@ -120,7 +120,10 @@ export function DefaultDashboardFilterGroup(props) {
|
|
|
120
120
|
filterTitle,
|
|
121
121
|
strong: (chunks) => _jsx("strong", { children: chunks }),
|
|
122
122
|
});
|
|
123
|
-
|
|
123
|
+
const filterDependencyIconAriaLabel = intl.formatMessage({
|
|
124
|
+
id: "filter.dependency.icon.aria.label",
|
|
125
|
+
});
|
|
126
|
+
return (_jsx(AttributeFilterDependencyTooltip, { tooltipContent: filterDependencyIconTooltip, ariaLabel: filterDependencyIconAriaLabel }));
|
|
124
127
|
}, [capabilities.supportsKeepingDependentFiltersSelection, filterDependenciesByLocalId, intl]);
|
|
125
128
|
return (_jsx(FilterGroup, { title: groupItem.groupConfig.title, filters: itemFilters, getFilterIdentifier: getFilterIdentifier, hasSelectedElements: hasSelectedElements, renderFilter: renderFilter, getTitleExtension: getTitleExtension }));
|
|
126
129
|
}
|
|
@@ -225,7 +225,6 @@ export declare const de_DE: {
|
|
|
225
225
|
"dialogs.schedule.management.create.new": string;
|
|
226
226
|
"dialogs.schedule.management.create.tooManyMessage": string;
|
|
227
227
|
"dialogs.schedule.management.noSchedules": string;
|
|
228
|
-
"dialogs.schedule.management.attachments.attachment": string;
|
|
229
228
|
"dialogs.schedule.management.attachments.xlsx.settings": string;
|
|
230
229
|
"dialogs.schedule.management.attachments.csv.settings": string;
|
|
231
230
|
"dialogs.schedule.management.attachments.cells.merged": string;
|
|
@@ -235,14 +234,6 @@ export declare const de_DE: {
|
|
|
235
234
|
"dialogs.export.pdf.headline": string;
|
|
236
235
|
"dialogs.schedule.management.attachments.delete": string;
|
|
237
236
|
"dialogs.schedule.management.attachments.removed": string;
|
|
238
|
-
"dialogs.schedule.management.attachments.filters.title": string;
|
|
239
|
-
"dialogs.schedule.management.attachments.filters.using": string;
|
|
240
|
-
"dialogs.schedule.management.attachments.filters.default": string;
|
|
241
|
-
"dialogs.schedule.management.attachments.filters.edited": string;
|
|
242
|
-
"dialogs.schedule.management.attachments.filters.item.default": string;
|
|
243
|
-
"dialogs.schedule.management.attachments.filters.item.edited": string;
|
|
244
|
-
"dialogs.schedule.management.attachments.filters.item.tooltip": string;
|
|
245
|
-
"dialogs.schedule.management.attachments.filters.item.tooltip.disabled": string;
|
|
246
237
|
"dialogs.schedule.management.attachments.message": string;
|
|
247
238
|
"scheduledEmail.attachmentFormat.widget.png": string;
|
|
248
239
|
"scheduledEmail.attachmentFormat.widget.pptx": string;
|
|
@@ -482,6 +473,8 @@ export declare const de_DE: {
|
|
|
482
473
|
"configurationPanel.drillConfig.filterSelection.drillToDashboardDashboardFilter.tooltip": string;
|
|
483
474
|
"configurationPanel.drillConfig.filterSelection.drillToDashboardFilterNotCompatible.tooltip": string;
|
|
484
475
|
"configurationPanel.drillConfig.filterSelection.drillToDashboardMetricFilter.tooltip": string;
|
|
476
|
+
"configurationPanel.drillConfig.filterSelection.drillToDashboardDuplicateMetricFilter.tooltip": string;
|
|
477
|
+
"configurationPanel.drillConfig.filterSelection.drillToInsightMeasureValueFilter.tooltip": string;
|
|
485
478
|
"configurationPanel.drillConfig.filterSelection.drillToDashboardRankingFilter.tooltip": string;
|
|
486
479
|
"rankingFilter.preview.top_without_attribute_plain": string;
|
|
487
480
|
"rankingFilter.preview.bottom_without_attribute_plain": string;
|
|
@@ -227,7 +227,6 @@ export const de_DE = {
|
|
|
227
227
|
"dialogs.schedule.management.create.new": "Neu erstellen",
|
|
228
228
|
"dialogs.schedule.management.create.tooManyMessage": "Ihr Unternehmen hat das Limit für geplante Exporte erreicht. Wenden Sie sich an Ihren Administrator, um weitere zu erstellen.",
|
|
229
229
|
"dialogs.schedule.management.noSchedules": "Es gibt keine geplanten Exporte.{br}Neu erstellen.",
|
|
230
|
-
"dialogs.schedule.management.attachments.attachment": "Als {format} Datei anhängen",
|
|
231
230
|
"dialogs.schedule.management.attachments.xlsx.settings": "XLSX-Optionen",
|
|
232
231
|
"dialogs.schedule.management.attachments.csv.settings": "CSV-Optionen",
|
|
233
232
|
"dialogs.schedule.management.attachments.cells.merged": "Attributzellen zusammengeführt lassen",
|
|
@@ -237,14 +236,6 @@ export const de_DE = {
|
|
|
237
236
|
"dialogs.export.pdf.headline": "Export-Einstellungen (.pdf)",
|
|
238
237
|
"dialogs.schedule.management.attachments.delete": " Anhang löschen{format}",
|
|
239
238
|
"dialogs.schedule.management.attachments.removed": "{format}-Anhang entfernt.",
|
|
240
|
-
"dialogs.schedule.management.attachments.filters.title": "Dashboard-Filter",
|
|
241
|
-
"dialogs.schedule.management.attachments.filters.using": "unter Verwendung von",
|
|
242
|
-
"dialogs.schedule.management.attachments.filters.default": "Standard-Dashboard-Filter",
|
|
243
|
-
"dialogs.schedule.management.attachments.filters.edited": "bearbeitete Dashboard-Filter",
|
|
244
|
-
"dialogs.schedule.management.attachments.filters.item.default": "Standardfilter verwenden",
|
|
245
|
-
"dialogs.schedule.management.attachments.filters.item.edited": "Bearbeitete Filter verwenden",
|
|
246
|
-
"dialogs.schedule.management.attachments.filters.item.tooltip": "Der Standardstatus der Dashboard-Filter wird beim geplanten Export verwendet, auch wenn sich die Standardwerte in Zukunft ändern.",
|
|
247
|
-
"dialogs.schedule.management.attachments.filters.item.tooltip.disabled": "Um einen Export mit Standardfiltern zu planen, erstellen Sie einen neuen geplanten Export.",
|
|
248
239
|
"dialogs.schedule.management.attachments.message": "<strong>Hinweis</strong>. Cross-Filtering wird im geplanten Export nicht angewendet.",
|
|
249
240
|
"scheduledEmail.attachmentFormat.widget.png": "Schnappschuss (.png)",
|
|
250
241
|
"scheduledEmail.attachmentFormat.widget.pptx": "Einzelfolie (.pptx)",
|
|
@@ -484,6 +475,8 @@ export const de_DE = {
|
|
|
484
475
|
"configurationPanel.drillConfig.filterSelection.drillToDashboardDashboardFilter.tooltip": "Kann nicht aktiviert werden. Fügen Sie diesen Filter zuerst zum Ziel-Dashboard hinzu.",
|
|
485
476
|
"configurationPanel.drillConfig.filterSelection.drillToDashboardFilterNotCompatible.tooltip": "Kann nicht aktiviert werden. Der übereinstimmende Filter auf dem Zieldashboard unterstützt diesen Filtertyp nicht.",
|
|
486
477
|
"configurationPanel.drillConfig.filterSelection.drillToDashboardMetricFilter.tooltip": "Metrikfilter können nicht an das Ziel-Dashboard übergeben werden.",
|
|
478
|
+
"configurationPanel.drillConfig.filterSelection.drillToDashboardDuplicateMetricFilter.tooltip": "Ein anderer Filter für diese Metrik wird bereits übergeben.",
|
|
479
|
+
"configurationPanel.drillConfig.filterSelection.drillToInsightMeasureValueFilter.tooltip": "Filter ist auf das Drill-Ziel nicht anwendbar.",
|
|
487
480
|
"configurationPanel.drillConfig.filterSelection.drillToDashboardRankingFilter.tooltip": "Top-/Bottom-Filter können nicht an das Ziel-Dashboard übergeben werden.",
|
|
488
481
|
"rankingFilter.preview.top_without_attribute_plain": "Top {value} von {measure}",
|
|
489
482
|
"rankingFilter.preview.bottom_without_attribute_plain": "Bottom {value} von {measure}",
|
|
@@ -225,7 +225,6 @@ export declare const en_AU: {
|
|
|
225
225
|
"dialogs.schedule.management.create.new": string;
|
|
226
226
|
"dialogs.schedule.management.create.tooManyMessage": string;
|
|
227
227
|
"dialogs.schedule.management.noSchedules": string;
|
|
228
|
-
"dialogs.schedule.management.attachments.attachment": string;
|
|
229
228
|
"dialogs.schedule.management.attachments.xlsx.settings": string;
|
|
230
229
|
"dialogs.schedule.management.attachments.csv.settings": string;
|
|
231
230
|
"dialogs.schedule.management.attachments.cells.merged": string;
|
|
@@ -235,14 +234,6 @@ export declare const en_AU: {
|
|
|
235
234
|
"dialogs.export.pdf.headline": string;
|
|
236
235
|
"dialogs.schedule.management.attachments.delete": string;
|
|
237
236
|
"dialogs.schedule.management.attachments.removed": string;
|
|
238
|
-
"dialogs.schedule.management.attachments.filters.title": string;
|
|
239
|
-
"dialogs.schedule.management.attachments.filters.using": string;
|
|
240
|
-
"dialogs.schedule.management.attachments.filters.default": string;
|
|
241
|
-
"dialogs.schedule.management.attachments.filters.edited": string;
|
|
242
|
-
"dialogs.schedule.management.attachments.filters.item.default": string;
|
|
243
|
-
"dialogs.schedule.management.attachments.filters.item.edited": string;
|
|
244
|
-
"dialogs.schedule.management.attachments.filters.item.tooltip": string;
|
|
245
|
-
"dialogs.schedule.management.attachments.filters.item.tooltip.disabled": string;
|
|
246
237
|
"dialogs.schedule.management.attachments.message": string;
|
|
247
238
|
"scheduledEmail.attachmentFormat.widget.png": string;
|
|
248
239
|
"scheduledEmail.attachmentFormat.widget.pptx": string;
|
|
@@ -482,6 +473,8 @@ export declare const en_AU: {
|
|
|
482
473
|
"configurationPanel.drillConfig.filterSelection.drillToDashboardDashboardFilter.tooltip": string;
|
|
483
474
|
"configurationPanel.drillConfig.filterSelection.drillToDashboardFilterNotCompatible.tooltip": string;
|
|
484
475
|
"configurationPanel.drillConfig.filterSelection.drillToDashboardMetricFilter.tooltip": string;
|
|
476
|
+
"configurationPanel.drillConfig.filterSelection.drillToDashboardDuplicateMetricFilter.tooltip": string;
|
|
477
|
+
"configurationPanel.drillConfig.filterSelection.drillToInsightMeasureValueFilter.tooltip": string;
|
|
485
478
|
"configurationPanel.drillConfig.filterSelection.drillToDashboardRankingFilter.tooltip": string;
|
|
486
479
|
"rankingFilter.preview.top_without_attribute_plain": string;
|
|
487
480
|
"rankingFilter.preview.bottom_without_attribute_plain": string;
|
|
@@ -227,7 +227,6 @@ export const en_AU = {
|
|
|
227
227
|
"dialogs.schedule.management.create.new": "Create new",
|
|
228
228
|
"dialogs.schedule.management.create.tooManyMessage": "Your organisation has reached the limit of scheduled exports. Contact your administrator to create more.",
|
|
229
229
|
"dialogs.schedule.management.noSchedules": "There are no scheduled exports.{br}Create new.",
|
|
230
|
-
"dialogs.schedule.management.attachments.attachment": "Attach as a {format} file.",
|
|
231
230
|
"dialogs.schedule.management.attachments.xlsx.settings": "XLSX options",
|
|
232
231
|
"dialogs.schedule.management.attachments.csv.settings": "CSV options",
|
|
233
232
|
"dialogs.schedule.management.attachments.cells.merged": "Keep attribute cells merged",
|
|
@@ -237,14 +236,6 @@ export const en_AU = {
|
|
|
237
236
|
"dialogs.export.pdf.headline": "Export settings (.pdf)",
|
|
238
237
|
"dialogs.schedule.management.attachments.delete": "Delete {format} attachment",
|
|
239
238
|
"dialogs.schedule.management.attachments.removed": "{format} attachment removed.",
|
|
240
|
-
"dialogs.schedule.management.attachments.filters.title": "Dashboard filters",
|
|
241
|
-
"dialogs.schedule.management.attachments.filters.using": "using",
|
|
242
|
-
"dialogs.schedule.management.attachments.filters.default": "default dashboard filters",
|
|
243
|
-
"dialogs.schedule.management.attachments.filters.edited": "edited dashboard filters",
|
|
244
|
-
"dialogs.schedule.management.attachments.filters.item.default": "Use default filters",
|
|
245
|
-
"dialogs.schedule.management.attachments.filters.item.edited": "Use edited filters",
|
|
246
|
-
"dialogs.schedule.management.attachments.filters.item.tooltip": "Default state of dashboard filters will be used in the scheduled export, even if the default values change in the future.",
|
|
247
|
-
"dialogs.schedule.management.attachments.filters.item.tooltip.disabled": "To schedule an export with default filters, create a new scheduled export.",
|
|
248
239
|
"dialogs.schedule.management.attachments.message": "<strong>Note</strong>. Cross-filtering will not be applied in the scheduled export.",
|
|
249
240
|
"scheduledEmail.attachmentFormat.widget.png": "Snapshot (.png)",
|
|
250
241
|
"scheduledEmail.attachmentFormat.widget.pptx": "Single Slide (.pptx)",
|
|
@@ -484,6 +475,8 @@ export const en_AU = {
|
|
|
484
475
|
"configurationPanel.drillConfig.filterSelection.drillToDashboardDashboardFilter.tooltip": "Cannot be enabled. Add this filter to the target dashboard first.",
|
|
485
476
|
"configurationPanel.drillConfig.filterSelection.drillToDashboardFilterNotCompatible.tooltip": "Cannot be enabled. The matching filter on the target dashboard does not support this filter type.",
|
|
486
477
|
"configurationPanel.drillConfig.filterSelection.drillToDashboardMetricFilter.tooltip": "Metric filters cannot be passed to the target dashboard.",
|
|
478
|
+
"configurationPanel.drillConfig.filterSelection.drillToDashboardDuplicateMetricFilter.tooltip": "Another filter for this metric is already being passed.",
|
|
479
|
+
"configurationPanel.drillConfig.filterSelection.drillToInsightMeasureValueFilter.tooltip": "Filter is not applicable to the drill destination.",
|
|
487
480
|
"configurationPanel.drillConfig.filterSelection.drillToDashboardRankingFilter.tooltip": "Top/bottom filters can’t be passed to the target dashboard.",
|
|
488
481
|
"rankingFilter.preview.top_without_attribute_plain": "Top {value} of {measure}",
|
|
489
482
|
"rankingFilter.preview.bottom_without_attribute_plain": "Bottom {value} of {measure}",
|
|
@@ -225,7 +225,6 @@ export declare const en_GB: {
|
|
|
225
225
|
"dialogs.schedule.management.create.new": string;
|
|
226
226
|
"dialogs.schedule.management.create.tooManyMessage": string;
|
|
227
227
|
"dialogs.schedule.management.noSchedules": string;
|
|
228
|
-
"dialogs.schedule.management.attachments.attachment": string;
|
|
229
228
|
"dialogs.schedule.management.attachments.xlsx.settings": string;
|
|
230
229
|
"dialogs.schedule.management.attachments.csv.settings": string;
|
|
231
230
|
"dialogs.schedule.management.attachments.cells.merged": string;
|
|
@@ -235,14 +234,6 @@ export declare const en_GB: {
|
|
|
235
234
|
"dialogs.export.pdf.headline": string;
|
|
236
235
|
"dialogs.schedule.management.attachments.delete": string;
|
|
237
236
|
"dialogs.schedule.management.attachments.removed": string;
|
|
238
|
-
"dialogs.schedule.management.attachments.filters.title": string;
|
|
239
|
-
"dialogs.schedule.management.attachments.filters.using": string;
|
|
240
|
-
"dialogs.schedule.management.attachments.filters.default": string;
|
|
241
|
-
"dialogs.schedule.management.attachments.filters.edited": string;
|
|
242
|
-
"dialogs.schedule.management.attachments.filters.item.default": string;
|
|
243
|
-
"dialogs.schedule.management.attachments.filters.item.edited": string;
|
|
244
|
-
"dialogs.schedule.management.attachments.filters.item.tooltip": string;
|
|
245
|
-
"dialogs.schedule.management.attachments.filters.item.tooltip.disabled": string;
|
|
246
237
|
"dialogs.schedule.management.attachments.message": string;
|
|
247
238
|
"scheduledEmail.attachmentFormat.widget.png": string;
|
|
248
239
|
"scheduledEmail.attachmentFormat.widget.pptx": string;
|
|
@@ -482,6 +473,8 @@ export declare const en_GB: {
|
|
|
482
473
|
"configurationPanel.drillConfig.filterSelection.drillToDashboardDashboardFilter.tooltip": string;
|
|
483
474
|
"configurationPanel.drillConfig.filterSelection.drillToDashboardFilterNotCompatible.tooltip": string;
|
|
484
475
|
"configurationPanel.drillConfig.filterSelection.drillToDashboardMetricFilter.tooltip": string;
|
|
476
|
+
"configurationPanel.drillConfig.filterSelection.drillToDashboardDuplicateMetricFilter.tooltip": string;
|
|
477
|
+
"configurationPanel.drillConfig.filterSelection.drillToInsightMeasureValueFilter.tooltip": string;
|
|
485
478
|
"configurationPanel.drillConfig.filterSelection.drillToDashboardRankingFilter.tooltip": string;
|
|
486
479
|
"rankingFilter.preview.top_without_attribute_plain": string;
|
|
487
480
|
"rankingFilter.preview.bottom_without_attribute_plain": string;
|