Skip to main content
Version: 9.1

Dashboard Customization

The Customization Object

Every widget defines its own structure and allows this structure to be configured with a customization object. This enables fine-grained control over the visibility and behavior of UI components in the Dashboard widget. It allows teams to tailor the interface based on user roles, product branding, or embedding context.

This is a recursive module, so you can add keep and remove at the top level or within a view.

// The customization object
{
remove: [ ... ], // Optional. Global elements to remove.
keep: [ ... ], // Optional. Global elements to retain.
views: { // Supports the following:
list: { ... }, // The Asset List
design: { ... }, // The Dashboard Editor
preview: { ... }, // Preview mode of a Dashboard
endUser: { ... } // Live, interactive end-user dashboard
}
}

Within each view, you can include the following:

KeyTypeDescription
removestring[]List of UI controls to hide.
keepstring[]List of UI controls to retain (others at the same level will be removed).
defaultsobjectDefault settings for specific functionality.
subModulesobjectCustomizations for dependent components (e.g., chart panels, modals).
subModules.conditionalarrayList of rule-based customizations based on attributes (only for subModules).

The global verbs, keep and remove, are evaluated in order of precedence:

  1. remove: Removes matching keys.
  2. keep: Keeps matching keys while removing all others at the same level.

To simplify configuration, wildcards can be used:

PatternBehavior
*stringMatches anything ending with string.
string*Matches anything starting with string.
*string*Matches anything containing string.

Please Note:

  • For the keep definition, if a key matches the pattern, it will be the only item on its level to remain in the structure.
  • remove is a placeholder to signal that a control is not available in embed mode or should never be shown to users.
  • You may configure customization dynamically at runtime based on user roles or application state.
  • The grammar is extendable and supports overrides for dependent widgets using subModules.

Full Example

const customization = {
// Global elements to remove
remove: ['navBar.appTitle'], // Remove the application title from the navigation bar

views: {
// List View Customization
list: {
remove: [
'controlBarLeft.qCreateDash', // Remove "Create" button
'controlBarRight.qSwitchView', // Remove "Switch View" option
'assetList.asset.optionMenu.qDeleteDash', // Remove "Delete" action
'assetList.asset.optionMenu.qDuplDash', // Remove "Duplicate" action
'assetList.asset.optionMenu.qShareDash' // Remove "Manage Sharing" actions
],
defaults: {
assetListViewMode: 'table' // Set "Table" as default view
}
},

// Design View Customization
design: {
remove: [
'menuBar.file.qMnuCreateDash', // Remove "New" option
'menuBar.file.qMnuDuplicateDash', // Remove "Duplicate" option
'menuBar.file.qMnuDeleteDash', // Remove "Delete" option
'*Themes' // Remove all theme-related options
],
keep: [
'*DownloadDash.qDashPDF' // Keep only "Download PDF" in download menu
],
subModules: {
chartPanel: {
keep: ['header.optionMenu.qDownloadChart.qChartPDF'], // Keep "Download PDF" in chart panel
remove: ['header.qChartSelection'] // Remove "Chart Selection" option
}
}
},

// Preview View Customization
preview: {
remove: ['filterPanel'], // Remove filter panel
subModules: {
chartPanel: {
keep: ['header.qChartName'] // Keep only chart name
}
}
},

// End-User View Customization
endUser: {
subModules: {
chartPanel: {
conditional: [
{
condition: {
field: 'category',
operator: '=',
value: 'metric'
},
keep: ['header.optionMenu.qDownloadChart.qChartPDF'] // Keep "Download PDF" only for metrics
}
]
}
}
}
}
};

The views Parameters

ViewKeyDescription
designcontrolBarRight.qDiscardThe button for discarding changes.
designcontrolBarRight.qPreviewAllows the preview mode visualization.
designcontrolBarRight.qPublishThe button for publishing a new version of the dashboard.
designcontrolBarRight.qStatusThe status label for the dashboard.
designdownloadModalThe options associated with the download modal.
designdownloadModal.qScheduleOptionThe schedule button inside the download modal.
designdownloadModal.qSubscribeExternalUsersThe option to add external users using the Enter key within the Subscribe tab.
designdownloadModal.qSubscribeOptionThe Subscribe tab within the Download modal.
designfilterPanelThe filters panel.
designfilterPanel.qAddFilterThe add button for the filter panel.
designheader.qShareDashThe manage sharing icon.
designmenuBar.file.qMnuCanvasSizeThe canvas size option inside the file menu. Only available if the canvas mode is Fixed.
designmenuBar.file.qMnuCreateDashThe new dashboard option inside the file menu. Only applies if no dashboardId was passed when embedding the widget.
designmenuBar.file.qMnuDeleteDashThe delete dashboard option inside the file menu. Only applies if no dashboardId was passed when embedding the widget.
designmenuBar.file.qMnuDownloadDashDownload options for the dashboard.
designmenuBar.file.qMnuDownloadDash.qDashCSVCSV download option.
designmenuBar.file.qMnuDownloadDash.qDashExcelExcel download option.
designmenuBar.file.qMnuDownloadDash.qDashPDFPDF download option.
designmenuBar.file.qMnuDuplicateDashThe duplicate dashboard option inside the file menu. Only applies if no dashboardId was passed when embedding the widget.
designmenuBar.file.qMnuOpenDashThe open dashboard option inside the file menu. Only applies if no dashboardId was passed when embedding the widget.
designmenuBar.file.qShareDashThe manage sharing option inside the file menu.
designmenuBar.gridThe grid menu.
designmenuBar.insert.qMnuInsertChartThe insert chart group inside the insert menu.
designmenuBar.insert.qMnuInsertChart.qMnuExistingChartThe option for inserting existing chart from the gallery for the insert menu.
designmenuBar.insert.qMnuInsertChart.qMnuNewChartThe option for inserting a new chart from the chart builder for the insert menu.
designnavBarThe main top bar.
designnavBar.qBackButtonThe back button on the nav bar. Only available when a dashboard is selected.
designtoolBar.gridThe grid group inside the toolbar.
designtoolBar.qCanvasSizeThe canvas size option inside the toolbar.
designtoolBar.qDownloadDashDownload options for the dashboard.
designtoolBar.qDownloadDash.qDashCSVCSV download option.
designtoolBar.qDownloadDash.qDashExcelExcel download option.
designtoolBar.qDownloadDash.qDashPDFPDF download option.
designtoolBar.qInsertChartThe insert chart group inside the toolbar.
designtoolBar.qInsertChart.qExistingChartThe option for inserting existing chart from the gallery for the toolbar.
designtoolBar.qInsertChart.qNewChartThe option for inserting a new chart from the chart builder for the toolbar.
designtoolBar.qResponsiveViewThe responsive view group in the toolbar.
endUserdownloadModalThe options associated with the download modal.
endUserdownloadModal.qScheduleOptionThe schedule button inside the download modal.
endUserfilterPanelThe filters panel.
endUserfilterPanel.qAddFilterThe add button for the filter panel.
endUsernavBarThe main top bar.
endUsernavBar.qBackButtonThe back button on the nav bar. Only available when a dashboard is selected.
listassetList.asset.optionMenu.qDeleteDashThe delete option inside the menu for the list.
listassetList.asset.optionMenu.qShareDashThe manage sharing option inside the menu for the list. Also enables the sharing modal via the icon in card/table view.
listcontrolBarLeft.qCreateDashThe create button for the asset list.
listnavBarThe main top bar.
previewcontrolBarRightThe list of options on the right side of the control bar.
previewfilterPanelThe filters panel.
previewfilterPanel.qAddFilterThe add button for the filter panel.
previewnavBarThe main top bar.
previewnavBar.qBackButtonThe back button on the nav bar.

Defaults

Enables you to set styles and other customizations for the dependent components.

defaults: {
customStyles:{
button: { 'color': '#200606' }
}
}

The following options are available for fontFamily properties.

  • 'Inter, serif'
  • 'Roboto, sans-serif'
  • 'Georgia, serif'
  • 'Palatino Linotype, Book Antiqua, Palatino, serif'
  • 'Times New Roman, Times, serif'
  • 'Arial, Helvetica, sans-serif'
  • 'Arial Black, Gadget, sans-serif'
  • 'Comic Sans MS, cursive, sans-serif'
  • 'Impact, Charcoal, sans-serif'
  • 'Lucida Sans Unicode, Lucida Grande, sans-serif'
  • 'Tahoma, Geneva, sans-serif'
  • 'Trebuchet MS, Helvetica, sans-serif'
  • 'Verdana, Geneva, sans-serif'
  • 'Courier New, Courier, monospace'
  • 'Lucida Console, Monaco, monospace'
ViewPropertyTypeDescriptionExample
listassetListViewModestringDefines the default view mode for the asset list."card" or "table"
---For Text Items-----------
designcustomStyles.text.alignTextstringDefault align text for the text element."left", "center", "right", or "justify"
designcustomStyles.text.backgroundColorstringDefault background color.Examples: '#000000', 'green', 'GREEN'
designcustomStyles.text.borderColorstringDefault border color for the text element.Example: '#000000', 'green', 'GREEN'
designcustomStyles.text.borderStylestringDefault border Style"solid", "dotted", "dashed", or "double"
designcustomStyles.text.borderWidthstringDefault border widthAny value between "1px" to "20px"
designcustomStyles.text.fontColorstringDefault font color for the text elementExample: '#000000', 'green', 'GREEN'
designcustomStyles.text.fontFamilystringDefault font for the text elementEx: 'Lucida Console, Monaco, monospace'
designcustomStyles.text.fontSizestringDefault font size for the text elementChoose from: 8, 9, 10, 11, 12, 14, 15, 16, 18, 24, 30, 36, 48, 60, 72, or "96px"
designcustomStyles.text.fontStylebooleanDefault font style for the text element (italic styling)true
designcustomStyles.text.fontWeightbooleanDefault font weight for the text element (bold styling)true
designcustomStyles.text.paddingBottomnumberDefault padding bottom for the text element"20px"
designcustomStyles.text.paddingLeftnumberDefault padding left for the text element"20px"
designcustomStyles.text.paddingRightnumberDefault padding right for the text element"20px"
designcustomStyles.text.paddingTopnumberDefault padding top for the text element"20px"
designcustomStyles.text.strikebooleanDefault strike for the text elementtrue
designcustomStyles.text.underlinebooleanDefault underline for the text elementtrue
---For Image Items---------
designcustomStyles.image.aspectstringDefault aspect for image"contain", "cover", or "fill"
---For Button Items---------
designcustomStyles.button.backgroundstringbutton background colorExamples: '#000000', 'green', 'GREEN'
designcustomStyles.button.colorstringbutton font colorExamples: '#000000', 'green', 'GREEN'
designcustomStyles.button.fontFamilystringbutton fontFamily'Lucida Console, Monaco, monospace'
designcustomStyles.button.fontSizestringbutton font sizeChoose from 8, 9, 10, 11, 12, 14, 15, 16, 18, 24, 30, 36, 48, 60, 72, or "96px"
designcustomStyles.button.labelstringtext for the element"Any cool text you want"
designcustomStyles.button.urlstringurl for the button click event"www.any-cool-url.con"
---For Header Items---------
designcustomStyles.header.layoutWidthstringwidth of the header"screen" or "canvas"
designcustomStyles.header.backgroundColorstringBackground color for the headerExamples: '#000000', 'green', 'GREEN'
designcustomStyles.header.heightstringDefault header size.Value should be between 10 and 300.
designcustomStyles.header.backgroundImageConfigstringDefault aspect for header background image"contain", "cover" or "fill"
designcustomStyles.header.backgroundImageConfigstringBackground image for the header."www.any-cool-url.con"
---For Tabs Items---------
designcustomStyles.tab.backgroundColorstringTabs indicator colorExamples: '#000000', 'green', 'GREEN'
designcustomStyles.tab.borderstringTabs' border colorExamples: '#000000', 'green', 'GREEN'
designcustomStyles.tab.fontColorstringTabs font colorExamples: '#000000', 'green', 'GREEN'
designcustomStyles.tab.fontSizestringTabs font size'8px', '9px', '10px', '11px', '12px', '14px', '15px', '16px', '18px', '24px' or '30px'
designcustomStyles.tab.fontTypestringTabs font typeEx: 'Lucida Console, Monaco, monospace'
designcustomStyles.tab.generalSizestringDefault size for tabsEx: "20px"
designcustomStyles.tab.namestringLabel for the name of a new tab.Ex: "My cool new label"
designcustomStyles.tab.selectorColorstringSelected tab indicator colorExamples: '#000000', 'green', 'GREEN'
designcustomStyles.tab.widthTypestringTabs definition for width type"MANUAL", "AUTOMATIC", or "SAME_SIZE"
---For Input Box Items---------
designcustomStyles.filterCtrlInputBox.backgroundstringBackground color for the Filter ControlExamples: '#000000', 'green', 'GREEN'
designcustomStyles.filterCtrlInputBox.borderstringBorder color for the apply filter buttonExamples: '#000000', 'green', 'GREEN'
designcustomStyles.filterCtrlInputBox.buttonBackgroundstringBackground color of the apply filter button in the Filter ControlExamples: '#000000', 'green', 'GREEN'
designcustomStyles.filterCtrlInputBox.buttonBorderstringBorder color of the apply filter button in the Filter ControlExamples: '#000000', 'green', 'GREEN'
designcustomStyles.filterCtrlInputBox.buttonLabelstringLabel to display text on the apply filter button"My label"
designcustomStyles.filterCtrlInputBox.buttonTextstringText color of the apply filter button in the Filter ControlExamples: '#000000', 'green', 'GREEN'
designcustomStyles.filterCtrlInputBox.defaultValidatorstringDefault validator selected for the Filter ControlExample: 'CONTAINS'
designcustomStyles.filterCtrlInputBox.disabledBooleanDisables the Filter Controltrue or false
designcustomStyles.filterCtrlInputBox.fontstringFont color for the apply filter buttonExamples: '#000000', 'green', 'GREEN'
designcustomStyles.filterCtrlInputBox.fontFamilystringList of font types for the Filter Control'Lucida Console, Monaco, monospace'
designcustomStyles.filterCtrlInputBox.labelstringName definition in the filter control, which can be a column name or any text from the panel configuration."My Label"
designcustomStyles.filterCtrlInputBox.listGroupingsarrayGrouping listExample: ['FULL_YEAR','DAY', 'MONTH', 'WEEK', 'YEAR']
designcustomStyles.filterCtrlInputBox.placeHolderstringPlaceholder text for the filter field"any string"
designcustomStyles.filterCtrlInputBox.selectedGroupingstringGrouping selected by the user in interaction mode'FULL_DATE', 'DATE', 'YEAR' etc.
designcustomStyles.filterCtrlInputBox.selectedValidatorstringValidator selected by the user in interaction modeValidator or Operator selected for the user in the Interactive Mode.
designcustomStyles.filterCtrlInputBox.selectorCheckboxesstringColor of the selector checkboxExamples: '#000000', 'green', 'GREEN'
designcustomStyles.filterCtrlInputBox.triggerTypestringDisplays the Apply Filter button or operates automatically'BUTTON' or 'AUTOMATIC'
designcustomStyles.filterCtrlInputBox.typestringDefault column type to load'NUMERIC', 'DATE', 'TEXT_LABEL'
designcustomStyles.filterCtrlInputBox.typeModulestringFor Inputbox, it should be 'inputbox'; for Filter Date, 'date'; and for Multiselect, 'multiselect''inputbox'
designcustomStyles.filterCtrlInputBox.validatorsSelectedObjectObject for the validators/operators listExample: [{id: 'EQUALS', label: 'Equals', 'action': 'EQUALS'}, {id: 'NOT_EQUAL', label: 'Not Equal', 'action': 'NOT_EQUAL'}]
---For Multiselect List Items---------
designcustomStyles.filterCtrlMultiSelectList.buttonBackgroundstringDefault background color for buttonsExamples: '#000000', 'green', 'GREEN'
designcustomStyles.filterCtrlMultiSelectList.buttonBackgroundstringDefault background color for filter buttonsExamples: '#000000', 'green', 'GREEN'
designcustomStyles.filterCtrlMultiSelectList.buttonBorderstringDefault border color for filter buttonsExamples: '#000000', 'green', 'GREEN'
designcustomStyles.filterCtrlMultiSelectList.buttonLabelstringLabel to display the text on the apply filter button"My Label"
designcustomStyles.filterCtrlMultiSelectList.buttonTextstringDefault text color for filter buttonsExamples: '#000000', 'green', 'GREEN'
designcustomStyles.filterCtrlMultiSelectList.defaultValidatorstringDefault validator/operator to loadExamples: '#000000', 'green', 'GREEN'
designcustomStyles.filterCtrlMultiSelectList.disabledBooleanDisables state of the Filter Controltrue or false
designcustomStyles.filterCtrlMultiSelectList.fontstringDefault font colorExamples: '#000000', 'green', 'GREEN'
designcustomStyles.filterCtrlMultiSelectList.fontFamilystringList of font types for Filter Control'Lucida Console, Monaco, monospace'
designcustomStyles.filterCtrlMultiSelectList.labelstringDefines the name in the filter control, which can be a column name or any text from the panel configuration.Example: "Column name"
designcustomStyles.filterCtrlMultiSelectList.listItemsObjectList of elements to be selected in the Multi-select ListExample: [{"enabled": true, "value": "Abu Dabi", "valueid": "abudabi" }, {"enabled": true, "value": "Abu Dabi", "valueid": "abudabi"}]
designcustomStyles.filterCtrlMultiSelectList.multiSelectTypestringGroups of values.'LIST' or 'DROPDOWN'
designcustomStyles.filterCtrlMultiSelectList.placeholderstringDefault placeholder for the input field"any string text"
designcustomStyles.filterCtrlMultiSelectList.selectedValidatorstringValidator/operator selected by the userExample: [{id: 'EQUALS', label: 'Equals', 'action': 'EQUALS'}, {id: 'NOT_EQUAL', label: 'Not Equal', 'action': 'NOT_EQUAL'}]
designcustomStyles.filterCtrlMultiSelectList.selectorCheckboxesstringDefault color for the selector checkboxExamples: '#000000', 'green', 'GREEN'
designcustomStyles.filterCtrlMultiSelectList.triggerTypestringShows the Apply Filter button or operates automaticallyExamples: '#000000', 'green', 'GREEN'
designcustomStyles.filterCtrlMultiSelectList.typestringDefault column type to loadCan be: 'NUMERIC', 'DATE', or 'TEXT_LABEL'.
designcustomStyles.filterCtrlMultiSelectList.typeModulestringMulti-select 'multiselect'; for Filter Inputbox: 'inputbox'; and for Datepicker: 'date'.'multiselect'
designcustomStyles.filterCtrlMultiSelectList.validatorsSelectedObjectObject to list the validators/operatorsExample: [{id: 'EQUALS', label: 'Equals', 'action': 'EQUALS'}, {id: 'NOT_EQUAL', label: 'Not Equal', 'action': 'NOT_EQUAL'}]
---For Date Picker Items---------
designcustomStyles.filterCtrlDatePicker.buttonBackgroundstringBackground color for the filter buttonExamples: '#000000', 'green', 'GREEN'
designcustomStyles.filterCtrlDatePicker.buttonBackgroundstringBackground color for the apply filter buttonExamples: '#000000', 'green', 'GREEN'
designcustomStyles.filterCtrlDatePicker.buttonBorderstringBorder color for the filter buttonExamples: '#000000', 'green', 'GREEN'
designcustomStyles.filterCtrlDatePicker.buttonLabelstringSets text for the Apply Filter button"My Label"
designcustomStyles.filterCtrlDatePicker.buttonTextstringText color for the filter buttonExamples: '#000000', 'green', 'GREEN'
designcustomStyles.filterCtrlDatePicker.defaultValidatorstringDefault validator/operator to loadExample: 'EQUALS'
designcustomStyles.filterCtrlDatePicker.disabledbooleanto toggle the disabled state of the filter controltrue or false
designcustomStyles.filterCtrlDatePicker.fontstringFont color for the apply filter buttonExamples: '#000000', 'green', 'GREEN'
designcustomStyles.filterCtrlDatePicker.fontFamilystringList of font types for the filter controlExample: 'Lucida Console, Monaco, monospace'
designcustomStyles.filterCtrlDatePicker.labelstringSets a name for the filter control"My Label"
designcustomStyles.filterCtrlDatePicker.placeholderstringDefault placeholder"Some placeholder string"
designcustomStyles.filterCtrlDatePicker.selectedValidatorstringValidator or operator selected for the user in Interactive ModeExample: 'EQUALS'
designcustomStyles.filterCtrlDatePicker.selectorCheckboxesstringColor of the selector checkboxExamples: '#000000', 'green', 'GREEN'
designcustomStyles.filterCtrlDatePicker.triggerTypestringSets default trigger action, either with a button or automatic mode (on blur)'BUTTON' or 'AUTOMATIC'
designcustomStyles.filterCtrlDatePicker.typestringDefault column type to load'NUMERIC', 'DATE', 'TEXT_LABEL'
designcustomStyles.filterCtrlDatePicker.typeModulestringMulti-select 'multiselect'; for Filter Inputbox: 'inputbox'; and for Datepicker: 'date'.'date'
designcustomStyles.filterCtrlDatePicker.validatorsSelectedObjectObject to list the validators/operatorsExample: [{id: 'EQUALS', label: 'Equals', 'action': 'EQUALS'}, {id: 'NOT_EQUAL', label: 'Not Equal', 'action': 'NOT_EQUAL'}]
---For Filter Panel Items---------
design, preview, enduserfilterSettings.defaultCollapsedbooleanDefault value for the configuration option collapsedtrue or false
design, preview, enduserfilterSettings.displayIconbooleanDefault value for the display icon option in the filter panels settingstrue or false
design, preview, enduserfilterSettings.displayColorbooleanDefault value for the display color option in the filter panels settingstrue or false
design, preview, enduserfilterSettings.scopeDashboardColorstringDefault color for filters created under the dashboard scope when displayed inside the filter panelExamples: '#000000', 'green', 'GREEN'
design, preview, enduserfilterSettings.scopeTabColorstringDefault color for filters created under the tab scope when displayed inside the filter panelExamples: '#000000', 'green', 'GREEN'
design, preview, enduserfilterSettings.scopePanelColorstringDefault color for filters created under the panel scope when displayed inside the filter panelExamples: '#000000', 'green', 'GREEN'

submodules > Chart Panel

const subModules = {
chartPanel: {
keep: ['menu.download.pdf']
}
}
KeyDescription
headerThe entire header for the panel
header.qChartNameThe title of the panel
header.qFitPanelThe fit-to-panel button
header.qSortingThe sorting button
header.qChartSelectionThe chart selection button
header.qFilterThe filter and the options for filtering
header.optionMenuThe three dot button
header.optionMenu.qEditChartThe edit option inside the three dot button
header.optionMenu.qDuplicateChartThe duplicate option inside the three dot button
header.optionMenu.qDownloadChartThe download option inside the three dot button
header.optionMenu.qDownloadChart.qChartJPGThe JPG format in the download option
header.optionMenu.qDownloadChart.qChartPDFThe PDF format in the download option
header.optionMenu.qDownloadChart.qChartCSVThe CSV format in the download option
header.optionMenu.qDownloadChart.qChartSummaryThe CSV summary format in the download option
header.optionMenu.qDownloadChart.qChartExcelThe Excel format in the download option
header.qColumnReplacementThe column replacement section in column settings
header.qColumnAggregationThe column aggregation section in column settings
optionDateGroupingThe column date grouping section in column settings
optionDateGrouping.qDayOnlyThe option for (Day Month) in date grouping dropdown
optionDateGrouping.qMonthThe option for (Month, Year) in date grouping dropdown
optionDateGrouping.qMonthOnlyThe option for (Month) in date grouping dropdown
optionDateGrouping.qQuarterThe option for (Quarter, Year) in date grouping dropdown
optionDateGrouping.qQuarterOnlyThe option for (Quarter) in date grouping dropdown
optionDateGrouping.qWeekThe option for (Week, Year) in date grouping dropdown
optionDateGrouping.qYearThe option for (Year) in date grouping dropdown
optionDateGrouping.qDayThe option for (Full Date) in date grouping dropdown
optionDateGrouping.qHourThe option for (Date, Hour) in date grouping dropdown
optionDateGrouping.qHourOnlyThe option for (Hour) in date grouping dropdown
optionDateGrouping.qMinuteThe option for (Date, Minute) in date grouping dropdown
optionDateGrouping.qMinuteOnlyThe option for (Minute) in date grouping dropdown
optionDateGrouping.qSecondThe option for (Date, Second) in date grouping dropdown
optionDateGrouping.qSecondOnlyThe option for (Second) in date grouping dropdown

conditional blocks

You can use the conditional block to show/hide elements based on widget metadata or attributes (e.g., a chart's category). At present, the only valid value for the field attribute is "category", which can have a value of: "metric", "chart", or "summary".

"conditional": [ // Please check your conditions to avoid any logical conflicts.
{
"condition": {
"field": "category",
"operator": "=",
"value": "metric"
},
"keep": ["*.download.excel"]
},
{
"condition": {
"field": "category",
"operator": "=",
"value": "chart"
},
"keep": ["*.download.pdf"]
}
]