[WEB-1255] fix: edit and delete access control for views (#4964)

This commit is contained in:
rahulramesha
2024-06-28 20:57:31 +05:30
committed by GitHub
parent 3b2af2d028
commit 96563b438e
4 changed files with 17 additions and 14 deletions

View File

@@ -32,9 +32,11 @@ export const ViewQuickActions: React.FC<Props> = observer((props) => {
// store hooks
const {
membership: { currentProjectRole },
data,
} = useUser();
// auth
const isEditingAllowed = !!currentProjectRole && currentProjectRole >= EUserProjectRoles.MEMBER;
const isOwner = view?.owned_by === data?.id;
const isAdmin = !!currentProjectRole && currentProjectRole == EUserProjectRoles.ADMIN;
const viewLink = `${workspaceSlug}/projects/${projectId}/views/${view.id}`;
const handleCopyText = () =>
@@ -53,7 +55,7 @@ export const ViewQuickActions: React.FC<Props> = observer((props) => {
action: () => setCreateUpdateViewModal(true),
title: "Edit",
icon: Pencil,
shouldRender: isEditingAllowed,
shouldRender: isOwner,
},
{
key: "open-new-tab",
@@ -72,7 +74,7 @@ export const ViewQuickActions: React.FC<Props> = observer((props) => {
action: () => setDeleteViewModal(true),
title: "Delete",
icon: Trash2,
shouldRender: isEditingAllowed,
shouldRender: isOwner || isAdmin,
},
];

View File

@@ -56,7 +56,7 @@ export const ViewListItemAction: FC<Props> = observer((props) => {
removeViewFromFavorites(workspaceSlug.toString(), projectId.toString(), view.id);
};
const createdByDetails = view.created_by ? getUserDetails(view.created_by) : undefined;
const ownedByDetails = view.owned_by ? getUserDetails(view.owned_by) : undefined;
return (
<>
@@ -81,7 +81,7 @@ export const ViewListItemAction: FC<Props> = observer((props) => {
</div>
{/* created by */}
{<ButtonAvatars showTooltip={false} userIds={createdByDetails?.id ?? []} />}
{<ButtonAvatars showTooltip={false} userIds={ownedByDetails?.id ?? []} />}
{isEditingAllowed && (
<FavoriteStar

View File

@@ -11,8 +11,8 @@ import { ContextMenu, CustomMenu, TContextMenuItem, TOAST_TYPE, setToast } from
// components
import { CreateUpdateWorkspaceViewModal, DeleteGlobalViewModal } from "@/components/workspace";
// constants
import { EUserProjectRoles } from "@/constants/project";
import { EViewAccess } from "@/constants/views";
import { EUserWorkspaceRoles } from "@/constants/workspace";
// helpers
import { cn } from "@/helpers/common.helper";
import { copyUrlToClipboard } from "@/helpers/string.helper";
@@ -35,9 +35,11 @@ export const WorkspaceViewQuickActions: React.FC<Props> = observer((props) => {
// store hooks
const {
membership: { currentWorkspaceRole },
data,
} = useUser();
// auth
const isEditingAllowed = !!currentWorkspaceRole && currentWorkspaceRole >= EUserProjectRoles.MEMBER;
const isOwner = view?.owned_by === data?.id;
const isAdmin = !!currentWorkspaceRole && currentWorkspaceRole === EUserWorkspaceRoles.ADMIN;
const viewLink = `${workspaceSlug}/workspace-views/${view.id}`;
const handleCopyText = () =>
@@ -56,7 +58,7 @@ export const WorkspaceViewQuickActions: React.FC<Props> = observer((props) => {
action: () => setUpdateViewModal(true),
title: "Edit",
icon: Pencil,
shouldRender: isEditingAllowed,
shouldRender: isOwner,
},
{
key: "open-new-tab",
@@ -75,7 +77,7 @@ export const WorkspaceViewQuickActions: React.FC<Props> = observer((props) => {
action: () => setDeleteViewModal(true),
title: "Delete",
icon: Trash2,
shouldRender: isEditingAllowed,
shouldRender: isOwner || isAdmin,
},
];

View File

@@ -1,5 +1,6 @@
import { action, makeObservable, observable } from "mobx";
// types
import { makeObservable, observable } from "mobx";
import { computedFn } from "mobx-utils";
// type
import { IUserLite } from "@plane/types";
// store
import { CoreRootStore } from "../root.store";
@@ -27,8 +28,6 @@ export class MemberRootStore implements IMemberRootStore {
makeObservable(this, {
// observables
memberMap: observable,
// computed actions
getUserDetails: action,
});
// sub-stores
this.workspace = new WorkspaceMemberStore(this, _rootStore);
@@ -39,5 +38,5 @@ export class MemberRootStore implements IMemberRootStore {
* @description get user details rom userId
* @param userId
*/
getUserDetails = (userId: string): IUserLite | undefined => this.memberMap?.[userId] ?? undefined;
getUserDetails = computedFn((userId: string): IUserLite | undefined => this.memberMap?.[userId] ?? undefined);
}