From 3aa8abbe140b9523f3894bc7eb91216adf36473c Mon Sep 17 00:00:00 2001 From: twwu Date: Mon, 11 May 2026 16:14:04 +0800 Subject: [PATCH] feat: add role duplication functionality with copy role hook --- .../permissions-page/role-list/row-menu.tsx | 17 ++++++++++++----- .../access-control/use-workspace-roles.ts | 13 +++++++++++++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/web/app/components/header/account-setting/permissions-page/role-list/row-menu.tsx b/web/app/components/header/account-setting/permissions-page/role-list/row-menu.tsx index 03e809f7dc..2629a07d24 100644 --- a/web/app/components/header/account-setting/permissions-page/role-list/row-menu.tsx +++ b/web/app/components/header/account-setting/permissions-page/role-list/row-menu.tsx @@ -10,7 +10,7 @@ import { import { toast } from '@langgenius/dify-ui/toast' import { useCallback, useState } from 'react' import ActionButton from '@/app/components/base/action-button' -import { useDeleteWorkspaceRole } from '@/service/access-control/use-workspace-roles' +import { useCopyWorkspaceRole, useDeleteWorkspaceRole } from '@/service/access-control/use-workspace-roles' type RowMenuProps = { roleCategory: RoleCategory @@ -27,15 +27,22 @@ const RowMenu = ({ }: RowMenuProps) => { const [open, setOpen] = useState(false) - const { mutateAsync: deleteRole } = useDeleteWorkspaceRole() - const handleView = useCallback(() => onView?.(role), [onView, role]) const handleEdit = useCallback(() => onEdit?.(role), [onEdit, role]) + const { mutateAsync: copyRole } = useCopyWorkspaceRole() + const handleDuplicate = useCallback(() => { - // TODO: wire up to API when backend is ready - }, []) + copyRole(role.id, { + onSuccess: () => { + toast.success('Role duplicated successfully') + setOpen(false) + }, + }) + }, [copyRole, role.id]) + + const { mutateAsync: deleteRole } = useDeleteWorkspaceRole() const handleDelete = useCallback(() => { deleteRole(role.id, { diff --git a/web/service/access-control/use-workspace-roles.ts b/web/service/access-control/use-workspace-roles.ts index 3b63d7020e..683b2a9ce6 100644 --- a/web/service/access-control/use-workspace-roles.ts +++ b/web/service/access-control/use-workspace-roles.ts @@ -59,3 +59,16 @@ export const useDeleteWorkspaceRole = () => { }, }) } + +export const useCopyWorkspaceRole = () => { + const queryClient = useQueryClient() + + return useMutation({ + mutationKey: [NAME_SPACE, 'copy-workspace-role'], + mutationFn: (id: string) => + post(`/workspaces/current/rbac/roles/${id}/copy`), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: [NAME_SPACE, 'workspace-role-list'] }) + }, + }) +}