FolderActionsButton: Move folder action set up for provisioned folders (#111913)
This commit is contained in:
@@ -7,7 +7,9 @@ import { Button, Drawer, Dropdown, Icon, Menu, MenuItem } from '@grafana/ui';
|
|||||||
import { Permissions } from 'app/core/components/AccessControl';
|
import { Permissions } from 'app/core/components/AccessControl';
|
||||||
import { appEvents } from 'app/core/core';
|
import { appEvents } from 'app/core/core';
|
||||||
import { RepoType } from 'app/features/provisioning/Wizard/types';
|
import { RepoType } from 'app/features/provisioning/Wizard/types';
|
||||||
|
import { BulkMoveProvisionedResource } from 'app/features/provisioning/components/BulkActions/BulkMoveProvisionedResource';
|
||||||
import { DeleteProvisionedFolderForm } from 'app/features/provisioning/components/Folders/DeleteProvisionedFolderForm';
|
import { DeleteProvisionedFolderForm } from 'app/features/provisioning/components/Folders/DeleteProvisionedFolderForm';
|
||||||
|
import { useIsProvisionedInstance } from 'app/features/provisioning/hooks/useIsProvisionedInstance';
|
||||||
import { getReadOnlyTooltipText } from 'app/features/provisioning/utils/repository';
|
import { getReadOnlyTooltipText } from 'app/features/provisioning/utils/repository';
|
||||||
import { ShowModalReactEvent } from 'app/types/events';
|
import { ShowModalReactEvent } from 'app/types/events';
|
||||||
import { FolderDTO } from 'app/types/folders';
|
import { FolderDTO } from 'app/types/folders';
|
||||||
@@ -29,14 +31,18 @@ export function FolderActionsButton({ folder, repoType, isReadOnlyRepo }: Props)
|
|||||||
const [isOpen, setIsOpen] = useState(false);
|
const [isOpen, setIsOpen] = useState(false);
|
||||||
const [showPermissionsDrawer, setShowPermissionsDrawer] = useState(false);
|
const [showPermissionsDrawer, setShowPermissionsDrawer] = useState(false);
|
||||||
const [showDeleteProvisionedFolderDrawer, setShowDeleteProvisionedFolderDrawer] = useState(false);
|
const [showDeleteProvisionedFolderDrawer, setShowDeleteProvisionedFolderDrawer] = useState(false);
|
||||||
|
const [showMoveProvisionedFolderDrawer, setShowMoveProvisionedFolderDrawer] = useState(false);
|
||||||
const [moveFolder] = useMoveFolderMutationFacade();
|
const [moveFolder] = useMoveFolderMutationFacade();
|
||||||
|
const isProvisionedInstance = useIsProvisionedInstance();
|
||||||
|
|
||||||
const deleteFolder = useDeleteFolderMutationFacade();
|
const deleteFolder = useDeleteFolderMutationFacade();
|
||||||
|
|
||||||
const { canEditFolders, canDeleteFolders, canViewPermissions, canSetPermissions } = getFolderPermissions(folder);
|
const { canEditFolders, canDeleteFolders, canViewPermissions, canSetPermissions } = getFolderPermissions(folder);
|
||||||
const isProvisionedFolder = folder.managedBy === ManagerKind.Repo;
|
const isProvisionedFolder = folder.managedBy === ManagerKind.Repo;
|
||||||
|
// When its single provisioned folder, cannot move the root repository folder
|
||||||
|
const isProvisionedRootFolder = isProvisionedFolder && !isProvisionedInstance && folder.parentUid === undefined;
|
||||||
// Can only move folders when the folder is not provisioned
|
// Can only move folders when the folder is not provisioned
|
||||||
const canMoveFolder = canEditFolders && !isProvisionedFolder;
|
const canMoveFolder = canEditFolders && !isProvisionedRootFolder;
|
||||||
|
|
||||||
const onMove = async (destinationUID: string) => {
|
const onMove = async (destinationUID: string) => {
|
||||||
await moveFolder({ folderUID: folder.uid, destinationUID: destinationUID });
|
await moveFolder({ folderUID: folder.uid, destinationUID: destinationUID });
|
||||||
@@ -115,6 +121,10 @@ export function FolderActionsButton({ folder, repoType, isReadOnlyRepo }: Props)
|
|||||||
setShowDeleteProvisionedFolderDrawer(true);
|
setShowDeleteProvisionedFolderDrawer(true);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleShowMoveProvisionedFolderDrawer = () => {
|
||||||
|
setShowMoveProvisionedFolderDrawer(true);
|
||||||
|
};
|
||||||
|
|
||||||
const managePermissionsLabel = t('browse-dashboards.folder-actions-button.manage-permissions', 'Manage permissions');
|
const managePermissionsLabel = t('browse-dashboards.folder-actions-button.manage-permissions', 'Manage permissions');
|
||||||
const moveLabel = t('browse-dashboards.folder-actions-button.move', 'Move');
|
const moveLabel = t('browse-dashboards.folder-actions-button.move', 'Move');
|
||||||
const deleteLabel = t('browse-dashboards.folder-actions-button.delete', 'Delete');
|
const deleteLabel = t('browse-dashboards.folder-actions-button.delete', 'Delete');
|
||||||
@@ -122,7 +132,12 @@ export function FolderActionsButton({ folder, repoType, isReadOnlyRepo }: Props)
|
|||||||
const menu = (
|
const menu = (
|
||||||
<Menu>
|
<Menu>
|
||||||
{canViewPermissions && <MenuItem onClick={() => setShowPermissionsDrawer(true)} label={managePermissionsLabel} />}
|
{canViewPermissions && <MenuItem onClick={() => setShowPermissionsDrawer(true)} label={managePermissionsLabel} />}
|
||||||
{canMoveFolder && !isReadOnlyRepo && <MenuItem onClick={showMoveModal} label={moveLabel} />}
|
{canMoveFolder && !isReadOnlyRepo && (
|
||||||
|
<MenuItem
|
||||||
|
onClick={isProvisionedFolder ? handleShowMoveProvisionedFolderDrawer : showMoveModal}
|
||||||
|
label={moveLabel}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
{canDeleteFolders && !isReadOnlyRepo && (
|
{canDeleteFolders && !isReadOnlyRepo && (
|
||||||
<MenuItem
|
<MenuItem
|
||||||
destructive
|
destructive
|
||||||
@@ -175,6 +190,19 @@ export function FolderActionsButton({ folder, repoType, isReadOnlyRepo }: Props)
|
|||||||
/>
|
/>
|
||||||
</Drawer>
|
</Drawer>
|
||||||
)}
|
)}
|
||||||
|
{showMoveProvisionedFolderDrawer && (
|
||||||
|
<Drawer
|
||||||
|
title={t('browse-dashboards.action.move-provisioned-folder', 'Move provisioned folder')}
|
||||||
|
subtitle={folder.title}
|
||||||
|
onClose={() => setShowMoveProvisionedFolderDrawer(false)}
|
||||||
|
>
|
||||||
|
<BulkMoveProvisionedResource
|
||||||
|
folderUid={folder.uid}
|
||||||
|
selectedItems={{ dashboard: {}, folder: { [folder.uid]: true } }}
|
||||||
|
onDismiss={() => setShowMoveProvisionedFolderDrawer(false)}
|
||||||
|
/>
|
||||||
|
</Drawer>
|
||||||
|
)}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3496,6 +3496,7 @@
|
|||||||
"move-modal-field-label": "Folder name",
|
"move-modal-field-label": "Folder name",
|
||||||
"move-modal-text": "This action will move the following content:",
|
"move-modal-text": "This action will move the following content:",
|
||||||
"move-modal-title": "Move",
|
"move-modal-title": "Move",
|
||||||
|
"move-provisioned-folder": "Move provisioned folder",
|
||||||
"moving": "Moving...",
|
"moving": "Moving...",
|
||||||
"new-folder-name-required-phrase": "Folder name is required.",
|
"new-folder-name-required-phrase": "Folder name is required.",
|
||||||
"selected-mix-resources-modal-text": "You have selected both provisioned and non-provisioned resources. These cannot be processed together. Please select only provisioned resources or only non-provisioned resources and try again.",
|
"selected-mix-resources-modal-text": "You have selected both provisioned and non-provisioned resources. These cannot be processed together. Please select only provisioned resources or only non-provisioned resources and try again.",
|
||||||
|
|||||||
Reference in New Issue
Block a user