fix: Permission levels for project settings (#2978)

* fix add subgroup issue FED-1101

* fix subgroup by None assignee FED-1100

* fix grouping by asignee or labels FED-1096

* fix create view popup FED-1093

* fix subgroup exception in swimlanes

* fix show sub issue filter FED-1102

* use Enums instead of numbers

* fix Estimates setting permission for admin

* disable access to project settings for viewers and guests

* fix project unautorized flicker

* add observer to estimates

* add permissions to member list
This commit is contained in:
rahulramesha 2023-12-04 20:03:23 +05:30 committed by sriram veeraghanta
parent c346d82b0b
commit a36aa4d093
24 changed files with 115 additions and 61 deletions

View file

@ -13,7 +13,7 @@ import { CustomSelect, Tooltip } from "@plane/ui";
// icons
import { ChevronDown, Dot, XCircle } from "lucide-react";
// constants
import { ROLE } from "constants/workspace";
import { EUserWorkspaceRoles, ROLE } from "constants/workspace";
// types
import { IProjectMember, TUserProjectRole } from "types";
@ -38,7 +38,7 @@ export const ProjectMemberListItem: React.FC<Props> = observer((props) => {
const { setToastAlert } = useToast();
// derived values
const isAdmin = currentProjectRole === 20;
const isAdmin = currentProjectRole === EUserWorkspaceRoles.ADMIN;
const memberDetails = member.member;
const handleRemove = async () => {
@ -148,12 +148,13 @@ export const ProjectMemberListItem: React.FC<Props> = observer((props) => {
disabled={
memberDetails.id === currentUser?.id ||
!member.member ||
(currentProjectRole && currentProjectRole !== 20 && currentProjectRole < member.role)
!currentProjectRole ||
currentProjectRole < member.role
}
placement="bottom-end"
>
{Object.keys(ROLE).map((key) => {
if (currentProjectRole && currentProjectRole !== 20 && currentProjectRole < parseInt(key)) return null;
if (currentProjectRole && !isAdmin && currentProjectRole < parseInt(key)) return null;
return (
<CustomSelect.Option key={key} value={parseInt(key, 10)}>

View file

@ -15,6 +15,7 @@ import { Loader } from "@plane/ui";
import { IProject, IUserLite, IWorkspace } from "types";
// fetch-keys
import { PROJECT_MEMBERS } from "constants/fetch-keys";
import { EUserWorkspaceRoles } from "constants/workspace";
const defaultValues: Partial<IProject> = {
project_lead: null,
@ -29,7 +30,7 @@ export const ProjectSettingsMemberDefaults: React.FC = observer(() => {
const { user: userStore, project: projectStore } = useMobxStore();
const { currentProjectDetails } = projectStore;
const { currentProjectRole } = userStore;
const isAdmin = currentProjectRole === 20;
const isAdmin = currentProjectRole === EUserWorkspaceRoles.ADMIN;
// hooks
const { setToastAlert } = useToast();
// form info

View file

@ -15,7 +15,7 @@ import useToast from "hooks/use-toast";
// types
import { IProjectMember, TUserProjectRole } from "types";
// constants
import { ROLE } from "constants/workspace";
import { EUserWorkspaceRoles, ROLE } from "constants/workspace";
type Props = {
isOpen: boolean;
@ -246,7 +246,8 @@ export const SendProjectInvitationModal: React.FC<Props> = observer((props) => {
width="w-full"
>
{Object.entries(ROLE).map(([key, label]) => {
if (parseInt(key) > (currentProjectRole ?? 5)) return null;
if (parseInt(key) > (currentProjectRole ?? EUserWorkspaceRoles.GUEST))
return null;
return (
<CustomSelect.Option key={key} value={key}>

View file

@ -9,6 +9,7 @@ import { useMobxStore } from "lib/mobx/store-provider";
import useToast from "hooks/use-toast";
// types
import { IProject } from "types";
import { EUserWorkspaceRoles } from "constants/workspace";
type Props = {};
@ -56,7 +57,7 @@ export const ProjectFeaturesList: FC<Props> = observer(() => {
user: { currentUser, currentProjectRole },
trackEvent: { setTrackElement, postHogEventTracker },
} = useMobxStore();
const isAdmin = currentProjectRole === 20;
const isAdmin = currentProjectRole === EUserWorkspaceRoles.ADMIN;
// hooks
const { setToastAlert } = useToast();
@ -97,7 +98,7 @@ export const ProjectFeaturesList: FC<Props> = observer(() => {
project_id: currentProjectDetails?.id,
project_name: currentProjectDetails?.name,
project_identifier: currentProjectDetails?.identifier,
enabled: !currentProjectDetails?.[feature.property as keyof IProject]
enabled: !currentProjectDetails?.[feature.property as keyof IProject],
});
handleSubmit({
[feature.property]: !currentProjectDetails?.[feature.property as keyof IProject],