import React, { FC, useState, memo } from 'react'; import { css } from 'emotion'; import { Icon, TagList, HorizontalGroup, stylesFactory, useTheme } from '@grafana/ui'; import { GrafanaTheme } from '@grafana/data'; import { contextSrv } from 'app/core/services/context_srv'; import EmptyListCTA from 'app/core/components/EmptyListCTA/EmptyListCTA'; import { ConfirmDeleteModal } from './ConfirmDeleteModal'; import { MoveToFolderModal } from './MoveToFolderModal'; import { useSearchQuery } from '../hooks/useSearchQuery'; import { useManageDashboards } from '../hooks/useManageDashboards'; import { SearchResultsFilter } from './SearchResultsFilter'; import { SearchResults } from './SearchResults'; import { DashboardActions } from './DashboardActions'; import { SearchField } from './SearchField'; export interface Props { folderId?: number; folderUid?: string; } const { isEditor } = contextSrv; export const ManageDashboards: FC = memo(({ folderId, folderUid }) => { const theme = useTheme(); const styles = getStyles(theme); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [isMoveModalOpen, setIsMoveModalOpen] = useState(false); const queryParams = { skipRecent: true, skipStarred: true, folderIds: folderId ? [folderId] : [] }; const { query, hasFilters, onQueryChange, onRemoveStarred, onTagRemove, onClearFilters, onTagFilterChange, onStarredFilterChange, onTagAdd, } = useSearchQuery(queryParams); const { results, loading, canSave, allChecked, hasEditPermissionInFolders, canMove, canDelete, onToggleSection, onToggleChecked, onToggleAllChecked, onDeleteItems, onMoveItems, } = useManageDashboards(query, { hasEditPermissionInFolders: contextSrv.hasEditPermissionInFolders }, folderUid); const onMoveTo = () => { setIsMoveModalOpen(true); }; const onItemDelete = () => { setIsDeleteModalOpen(true); }; if (canSave && folderId && !hasFilters && results.length === 0) { return ( ); } return (
{hasFilters && (
{query.tag.length > 0 && (
)} {query.starred && ( )}
)}
{results?.length > 0 && ( )}
setIsDeleteModalOpen(false)} /> setIsMoveModalOpen(false)} />
); }); const getStyles = stylesFactory((theme: GrafanaTheme) => { return { searchField: css` height: auto; border-bottom: none; padding: 0; margin: 0; input { width: 400px; } `, }; });