From 7320c53ab7e2c520bd6438f2d17b1fb3e0a556e6 Mon Sep 17 00:00:00 2001 From: "Grot (@grafanabot)" <43478413+grafanabot@users.noreply.github.com> Date: Fri, 3 Jun 2022 09:56:40 -0400 Subject: [PATCH] [v9.0.x] Alerting: Make folder filter clearable in Alert list panel (#50169) Co-authored-by: Peter Holmberg --- .../core/components/Select/FolderPicker.tsx | 22 ++++++++++++++----- public/app/plugins/panel/alertlist/module.tsx | 19 +++++++++------- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/public/app/core/components/Select/FolderPicker.tsx b/public/app/core/components/Select/FolderPicker.tsx index 6770d47a0ef..878e7d9d9fb 100644 --- a/public/app/core/components/Select/FolderPicker.tsx +++ b/public/app/core/components/Select/FolderPicker.tsx @@ -3,7 +3,7 @@ import React, { PureComponent } from 'react'; import { AppEvents, SelectableValue } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; -import { AsyncSelect } from '@grafana/ui'; +import { ActionMeta, AsyncSelect } from '@grafana/ui'; import { contextSrv } from 'app/core/services/context_srv'; import { createFolder, getFolderById, searchFolders } from 'app/features/manage-dashboards/state/actions'; import { DashboardSearchHit } from 'app/features/search/types'; @@ -25,6 +25,7 @@ export interface Props { filter?: FolderPickerFilter; allowEmpty?: boolean; showRoot?: boolean; + onClear?: () => void; accessControlMetadata?: boolean; /** * Skips loading all folders in order to find the folder matching @@ -116,11 +117,16 @@ export class FolderPicker extends PureComponent { return options; }; - onFolderChange = (newFolder: SelectableValue) => { + onFolderChange = (newFolder: SelectableValue, actionMeta: ActionMeta) => { if (!newFolder) { newFolder = { value: 0, label: this.props.rootName }; } + if (actionMeta.action === 'clear' && this.props.onClear) { + this.props.onClear(); + return; + } + this.setState( { folder: newFolder, @@ -130,13 +136,17 @@ export class FolderPicker extends PureComponent { }; createNewFolder = async (folderName: string) => { - // @ts-ignore const newFolder = await createFolder({ title: folderName }); let folder = { value: -1, label: 'Not created' }; if (newFolder.id > -1) { appEvents.emit(AppEvents.alertSuccess, ['Folder Created', 'OK']); folder = { value: newFolder.id, label: newFolder.title }; - await this.onFolderChange(folder); + this.setState( + { + folder: newFolder, + }, + () => this.props.onChange({ id: newFolder.value!, title: newFolder.label! }) + ); } else { appEvents.emit(AppEvents.alertError, ['Folder could not be created']); } @@ -190,7 +200,8 @@ export class FolderPicker extends PureComponent { render() { const { folder } = this.state; - const { enableCreateNew, inputId } = this.props; + const { enableCreateNew, inputId, onClear } = this.props; + const isClearable = typeof onClear === 'function'; return (
@@ -205,6 +216,7 @@ export class FolderPicker extends PureComponent { loadOptions={this.debouncedSearch} onChange={this.onFolderChange} onCreateOption={this.createNewFolder} + isClearable={isClearable} />
); diff --git a/public/app/plugins/panel/alertlist/module.tsx b/public/app/plugins/panel/alertlist/module.tsx index 0b3bf28ae80..1b0bcf65a87 100644 --- a/public/app/plugins/panel/alertlist/module.tsx +++ b/public/app/plugins/panel/alertlist/module.tsx @@ -3,13 +3,13 @@ import React from 'react'; import { PanelPlugin } from '@grafana/data'; import { config, DataSourcePicker } from '@grafana/runtime'; import { TagsInput } from '@grafana/ui'; -import { RuleFolderPicker } from 'app/features/alerting/unified/components/rule-editor/RuleFolderPicker'; - +import { FolderPicker } from 'app/core/components/Select/FolderPicker'; import { ALL_FOLDER, GENERAL_FOLDER, ReadonlyFolderPicker, -} from '../../../core/components/Select/ReadonlyFolderPicker/ReadonlyFolderPicker'; +} from 'app/core/components/Select/ReadonlyFolderPicker/ReadonlyFolderPicker'; +import { PermissionLevelString } from 'app/types'; import { AlertList } from './AlertList'; import { alertListPanelMigrationHandler } from './AlertListMigrationHandler'; @@ -238,12 +238,15 @@ const unifiedAlertList = new PanelPlugin(UnifiedAlertLi defaultValue: null, editor: function RenderFolderPicker(props) { return ( - { - return props.onChange({ title, id }); - }} + showRoot={false} + allowEmpty={true} + initialTitle={props.value?.title} + initialFolderId={props.value?.id} + permissionLevel={PermissionLevelString.View} + onClear={() => props.onChange('')} + {...props} /> ); },