import { useState } from 'react'; import { config, locationService, reportInteraction } from '@grafana/runtime'; import { Button, Drawer, Dropdown, Icon, Menu, MenuItem } from '@grafana/ui'; import { Permissions } from 'app/core/components/AccessControl'; import { appEvents } from 'app/core/core'; import { t, Trans } from 'app/core/internationalization'; import { FolderDTO } from 'app/types'; import { ShowModalReactEvent } from 'app/types/events'; import { useDeleteFolderMutation, useMoveFolderMutation } from '../api/browseDashboardsAPI'; import { getFolderPermissions } from '../permissions'; import { DeleteModal } from './BrowseActions/DeleteModal'; import { MoveModal } from './BrowseActions/MoveModal'; interface Props { folder: FolderDTO; } export function FolderActionsButton({ folder }: Props) { const [isOpen, setIsOpen] = useState(false); const [showPermissionsDrawer, setShowPermissionsDrawer] = useState(false); const [moveFolder] = useMoveFolderMutation(); const [deleteFolder] = useDeleteFolderMutation(); const { canEditFolders, canDeleteFolders, canViewPermissions, canSetPermissions } = getFolderPermissions(folder); // Can only move folders when nestedFolders is enabled const canMoveFolder = config.featureToggles.nestedFolders && canEditFolders; const onMove = async (destinationUID: string) => { await moveFolder({ folder, destinationUID }); reportInteraction('grafana_manage_dashboards_item_moved', { item_counts: { folder: 1, dashboard: 0, }, source: 'folder_actions', }); }; const onDelete = async () => { await deleteFolder(folder); reportInteraction('grafana_manage_dashboards_item_deleted', { item_counts: { folder: 1, dashboard: 0, }, source: 'folder_actions', }); const { parents } = folder; const parentUrl = parents && parents.length ? parents[parents.length - 1].url : '/dashboards'; locationService.push(parentUrl); }; const showMoveModal = () => { appEvents.publish( new ShowModalReactEvent({ component: MoveModal, props: { selectedItems: { folder: { [folder.uid]: true }, dashboard: {}, panel: {}, $all: false, }, onConfirm: onMove, }, }) ); }; const showDeleteModal = () => { appEvents.publish( new ShowModalReactEvent({ component: DeleteModal, props: { selectedItems: { folder: { [folder.uid]: true }, dashboard: {}, panel: {}, $all: false, }, onConfirm: onDelete, }, }) ); }; const managePermissionsLabel = t('browse-dashboards.folder-actions-button.manage-permissions', 'Manage permissions'); const moveLabel = t('browse-dashboards.folder-actions-button.move', 'Move'); const deleteLabel = t('browse-dashboards.folder-actions-button.delete', 'Delete'); const menu = ( {canViewPermissions && setShowPermissionsDrawer(true)} label={managePermissionsLabel} />} {canMoveFolder && } {canDeleteFolders && } ); if (!canViewPermissions && !canMoveFolder && !canDeleteFolders) { return null; } return ( <> {showPermissionsDrawer && ( setShowPermissionsDrawer(false)} size="md" > )} ); }