UI - МЕЖПРОЕКТНАЯ КОММУНИКАЦИЯ: скрытие launcher-managed invite controls
This commit is contained in:
parent
11c8c6fb1b
commit
42bc0fb0e6
|
|
@ -7,11 +7,13 @@
|
||||||
import { observer } from "mobx-react";
|
import { observer } from "mobx-react";
|
||||||
import { usePathname } from "next/navigation";
|
import { usePathname } from "next/navigation";
|
||||||
import { useParams } from "react-router";
|
import { useParams } from "react-router";
|
||||||
|
import useSWR from "swr";
|
||||||
// plane imports
|
// plane imports
|
||||||
import { EUserPermissionsLevel, GROUPED_PROJECT_SETTINGS, PROJECT_SETTINGS_CATEGORIES } from "@plane/constants";
|
import { EUserPermissionsLevel, GROUPED_PROJECT_SETTINGS, PROJECT_SETTINGS_CATEGORIES } from "@plane/constants";
|
||||||
import { useTranslation } from "@plane/i18n";
|
import { useTranslation } from "@plane/i18n";
|
||||||
// components
|
// components
|
||||||
import { SettingsSidebarItem } from "@/components/settings/sidebar/item";
|
import { SettingsSidebarItem } from "@/components/settings/sidebar/item";
|
||||||
|
import { WorkspaceService } from "@/services/workspace.service";
|
||||||
// hooks
|
// hooks
|
||||||
import { useUserPermissions } from "@/hooks/store/user";
|
import { useUserPermissions } from "@/hooks/store/user";
|
||||||
// local imports
|
// local imports
|
||||||
|
|
@ -24,6 +26,8 @@ const PROJECT_CATEGORY_I18N_KEYS = {
|
||||||
execution: "project_settings_categories.execution",
|
execution: "project_settings_categories.execution",
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
|
const workspaceService = new WorkspaceService();
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
projectId: string;
|
projectId: string;
|
||||||
};
|
};
|
||||||
|
|
@ -37,15 +41,22 @@ export const ProjectSettingsSidebarItemCategories = observer(function ProjectSet
|
||||||
const pathname = usePathname();
|
const pathname = usePathname();
|
||||||
// store hooks
|
// store hooks
|
||||||
const { allowPermissions } = useUserPermissions();
|
const { allowPermissions } = useUserPermissions();
|
||||||
|
const { data: nodedcWorkspacePolicy } = useSWR(
|
||||||
|
workspaceSlug ? `NODEDC_WORKSPACE_POLICY_${workspaceSlug}` : null,
|
||||||
|
() => workspaceService.getNodeDCWorkspacePolicy(workspaceSlug?.toString())
|
||||||
|
);
|
||||||
// translation
|
// translation
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
const shouldHideMemberSettings = !nodedcWorkspacePolicy || nodedcWorkspacePolicy.managed_by === "launcher";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="mt-4 flex flex-col divide-y divide-white/6">
|
<div className="mt-4 flex flex-col divide-y divide-white/6">
|
||||||
{PROJECT_SETTINGS_CATEGORIES.map((category) => {
|
{PROJECT_SETTINGS_CATEGORIES.map((category) => {
|
||||||
const categoryItems = GROUPED_PROJECT_SETTINGS[category];
|
const categoryItems = GROUPED_PROJECT_SETTINGS[category];
|
||||||
const accessibleItems = categoryItems.filter((item) =>
|
const accessibleItems = categoryItems.filter(
|
||||||
allowPermissions(item.access, EUserPermissionsLevel.PROJECT, workspaceSlug, projectId)
|
(item) =>
|
||||||
|
(!shouldHideMemberSettings || item.key !== "members") &&
|
||||||
|
allowPermissions(item.access, EUserPermissionsLevel.PROJECT, workspaceSlug, projectId)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (accessibleItems.length === 0) return null;
|
if (accessibleItems.length === 0) return null;
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ import { observer } from "mobx-react";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { useParams, useRouter } from "next/navigation";
|
import { useParams, useRouter } from "next/navigation";
|
||||||
import type { MouseEvent } from "react";
|
import type { MouseEvent } from "react";
|
||||||
|
import useSWR from "swr";
|
||||||
import { Archive, BarChart3, Layers3, Settings, UserPlus } from "lucide-react";
|
import { Archive, BarChart3, Layers3, Settings, UserPlus } from "lucide-react";
|
||||||
import { Menu } from "@headlessui/react";
|
import { Menu } from "@headlessui/react";
|
||||||
// plane imports
|
// plane imports
|
||||||
|
|
@ -18,9 +19,12 @@ import type { IWorkspace } from "@plane/types";
|
||||||
import { cn, getFileURL, getUserRole } from "@plane/utils";
|
import { cn, getFileURL, getUserRole } from "@plane/utils";
|
||||||
// components
|
// components
|
||||||
import { openWorkspaceSettingsModal } from "@/components/workspace/settings/workspace-settings-modal.utils";
|
import { openWorkspaceSettingsModal } from "@/components/workspace/settings/workspace-settings-modal.utils";
|
||||||
|
import { WorkspaceService } from "@/services/workspace.service";
|
||||||
// plane web imports
|
// plane web imports
|
||||||
import { SubscriptionPill } from "@/plane-web/components/common/subscription/subscription-pill";
|
import { SubscriptionPill } from "@/plane-web/components/common/subscription/subscription-pill";
|
||||||
|
|
||||||
|
const workspaceService = new WorkspaceService();
|
||||||
|
|
||||||
type TProps = {
|
type TProps = {
|
||||||
workspace: IWorkspace;
|
workspace: IWorkspace;
|
||||||
activeWorkspace: IWorkspace | null;
|
activeWorkspace: IWorkspace | null;
|
||||||
|
|
@ -35,8 +39,13 @@ const SidebarDropdownItem = observer(function SidebarDropdownItem(props: TProps)
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
// hooks
|
// hooks
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
const { data: nodedcWorkspacePolicy } = useSWR(
|
||||||
|
workspace.id === activeWorkspace?.id ? `NODEDC_WORKSPACE_POLICY_${workspace.slug}` : null,
|
||||||
|
() => workspaceService.getNodeDCWorkspacePolicy(workspace.slug)
|
||||||
|
);
|
||||||
const canOpenWorkspaceSettings = [EUserPermissions.ADMIN, EUserPermissions.MEMBER].includes(workspace?.role);
|
const canOpenWorkspaceSettings = [EUserPermissions.ADMIN, EUserPermissions.MEMBER].includes(workspace?.role);
|
||||||
const canInviteMembers = [EUserPermissions.ADMIN].includes(workspace?.role);
|
const canInviteMembers =
|
||||||
|
[EUserPermissions.ADMIN].includes(workspace?.role) && nodedcWorkspacePolicy?.managed_by === "tasker";
|
||||||
|
|
||||||
const handleWorkspaceAction = (e: MouseEvent<HTMLButtonElement>, action: () => void) => {
|
const handleWorkspaceAction = (e: MouseEvent<HTMLButtonElement>, action: () => void) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ import { Fragment, useEffect, useCallback, useLayoutEffect, useRef, useState, ty
|
||||||
import { observer } from "mobx-react";
|
import { observer } from "mobx-react";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { createPortal } from "react-dom";
|
import { createPortal } from "react-dom";
|
||||||
|
import useSWR from "swr";
|
||||||
// icons
|
// icons
|
||||||
import { CirclePlus, LogOut, Mails } from "lucide-react";
|
import { CirclePlus, LogOut, Mails } from "lucide-react";
|
||||||
// ui
|
// ui
|
||||||
|
|
@ -21,6 +22,7 @@ import { Loader } from "@plane/ui";
|
||||||
import { orderWorkspacesList, cn } from "@plane/utils";
|
import { orderWorkspacesList, cn } from "@plane/utils";
|
||||||
// helpers
|
// helpers
|
||||||
import { AppSidebarItem } from "@/components/sidebar/sidebar-item";
|
import { AppSidebarItem } from "@/components/sidebar/sidebar-item";
|
||||||
|
import { WorkspaceService } from "@/services/workspace.service";
|
||||||
// hooks
|
// hooks
|
||||||
import { useAppTheme } from "@/hooks/store/use-app-theme";
|
import { useAppTheme } from "@/hooks/store/use-app-theme";
|
||||||
import { useWorkspace } from "@/hooks/store/use-workspace";
|
import { useWorkspace } from "@/hooks/store/use-workspace";
|
||||||
|
|
@ -30,6 +32,8 @@ import { useInstance } from "@/hooks/store/use-instance";
|
||||||
import { WorkspaceLogo } from "../logo";
|
import { WorkspaceLogo } from "../logo";
|
||||||
import SidebarDropdownItem from "./dropdown-item";
|
import SidebarDropdownItem from "./dropdown-item";
|
||||||
|
|
||||||
|
const workspaceService = new WorkspaceService();
|
||||||
|
|
||||||
type WorkspaceMenuRootProps = {
|
type WorkspaceMenuRootProps = {
|
||||||
variant: "sidebar" | "top-navigation" | "sidebar-panel" | "toolbar" | "expanded-toolbar";
|
variant: "sidebar" | "top-navigation" | "sidebar-panel" | "toolbar" | "expanded-toolbar";
|
||||||
};
|
};
|
||||||
|
|
@ -98,8 +102,12 @@ export const WorkspaceMenuRoot = observer(function WorkspaceMenuRoot(props: Work
|
||||||
const { signOut } = useUser();
|
const { signOut } = useUser();
|
||||||
const { updateUserProfile } = useUserProfile();
|
const { updateUserProfile } = useUserProfile();
|
||||||
const { currentWorkspace: activeWorkspace, workspaces } = useWorkspace();
|
const { currentWorkspace: activeWorkspace, workspaces } = useWorkspace();
|
||||||
|
const { data: nodedcWorkspacePolicy } = useSWR(currentUser ? "NODEDC_WORKSPACE_POLICY" : null, () =>
|
||||||
|
workspaceService.getNodeDCWorkspacePolicy()
|
||||||
|
);
|
||||||
// derived values
|
// derived values
|
||||||
const isWorkspaceCreationDisabled = config?.is_workspace_creation_disabled ?? false;
|
const isWorkspaceCreationDisabled = config?.is_workspace_creation_disabled ?? false;
|
||||||
|
const canCreateWorkspace = !isWorkspaceCreationDisabled && nodedcWorkspacePolicy?.can_create_workspace === true;
|
||||||
// translation
|
// translation
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
// local state
|
// local state
|
||||||
|
|
@ -312,7 +320,7 @@ export const WorkspaceMenuRoot = observer(function WorkspaceMenuRoot(props: Work
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div className="flex w-full flex-col items-start justify-start gap-2 px-4 py-2 text-13">
|
<div className="flex w-full flex-col items-start justify-start gap-2 px-4 py-2 text-13">
|
||||||
{!isWorkspaceCreationDisabled && (
|
{canCreateWorkspace && (
|
||||||
<Link href="/create-workspace" className="w-full">
|
<Link href="/create-workspace" className="w-full">
|
||||||
<Menu.Item
|
<Menu.Item
|
||||||
as="div"
|
as="div"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue