import React, { FC, memo, useState } from 'react'; import { css } from 'emotion'; import { HorizontalGroup, stylesFactory, useTheme, Spinner } 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 { FilterInput } from 'app/core/components/FilterInput/FilterInput'; import { FolderDTO } from 'app/types'; import { useManageDashboards } from '../hooks/useManageDashboards'; import { SearchLayout } from '../types'; import { ConfirmDeleteModal } from './ConfirmDeleteModal'; import { MoveToFolderModal } from './MoveToFolderModal'; import { useSearchQuery } from '../hooks/useSearchQuery'; import { SearchResultsFilter } from './SearchResultsFilter'; import { SearchResults } from './SearchResults'; import { DashboardActions } from './DashboardActions'; import { connectWithRouteParams, ConnectProps, DispatchProps } from '../connect'; export interface Props { folder?: FolderDTO; } const { isEditor } = contextSrv; export const ManageDashboards: FC = memo(({ folder, params, updateLocation }) => { const folderId = folder?.id; const folderUid = folder?.uid; const theme = useTheme(); const styles = getStyles(theme); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [isMoveModalOpen, setIsMoveModalOpen] = useState(false); const defaultLayout = folderId ? SearchLayout.List : SearchLayout.Folders; const queryParams = { skipRecent: true, skipStarred: true, folderIds: folderId ? [folderId] : [], layout: defaultLayout, ...params, }; const { query, hasFilters, onQueryChange, onTagFilterChange, onStarredFilterChange, onTagAdd, onSortChange, onLayoutChange, } = useSearchQuery(queryParams, updateLocation); const { results, loading, initialLoading, canSave, allChecked, hasEditPermissionInFolders, canMove, canDelete, onToggleSection, onToggleChecked, onToggleAllChecked, onDeleteItems, onMoveItems, noFolders, } = useManageDashboards(query, {}, folder); const onMoveTo = () => { setIsMoveModalOpen(true); }; const onItemDelete = () => { setIsDeleteModalOpen(true); }; if (initialLoading) { return ; } if (noFolders && !hasFilters) { return ( ); } return (
setIsDeleteModalOpen(false)} /> setIsMoveModalOpen(false)} />
); }); export default connectWithRouteParams(ManageDashboards); const getStyles = stylesFactory((theme: GrafanaTheme) => { return { container: css` height: 100%; `, results: css` display: flex; flex-direction: column; flex: 1; height: 100%; margin-top: ${theme.spacing.xl}; `, spinner: css` display: flex; justify-content: center; align-items: center; min-height: 200px; `, }; });