From 8ec762f7908e783b351dac1105bfbb928877c9ee Mon Sep 17 00:00:00 2001 From: DCCONSTRUCTIONS Date: Wed, 6 May 2026 09:38:14 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=98=D0=97=D0=90=D0=99=D0=9D=20-=20?= =?UTF-8?q?=D0=9C=D0=95=D0=96=D0=9F=D0=A0=D0=9E=D0=95=D0=9A=D0=A2=D0=9D?= =?UTF-8?q?=D0=90=D0=AF=20=D0=9A=D0=9E=D0=9C=D0=9C=D0=A3=D0=9D=D0=98=D0=9A?= =?UTF-8?q?=D0=90=D0=A6=D0=98=D0=AF:=20=D1=81=D0=BE=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D1=8F=D0=BD=D0=B8=D0=B5=20workspace=20policy=20=D0=B2=20onboar?= =?UTF-8?q?ding?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/app/(all)/create-workspace/page.tsx | 56 +++++++++++++++++-- .../web/core/services/workspace.service.ts | 15 +++++ 2 files changed, 67 insertions(+), 4 deletions(-) diff --git a/plane-src/apps/web/app/(all)/create-workspace/page.tsx b/plane-src/apps/web/app/(all)/create-workspace/page.tsx index 80d17a1..a7c3648 100644 --- a/plane-src/apps/web/app/(all)/create-workspace/page.tsx +++ b/plane-src/apps/web/app/(all)/create-workspace/page.tsx @@ -4,7 +4,7 @@ * See the LICENSE file for details. */ -import { useState } from "react"; +import { useEffect, useState } from "react"; import { observer } from "mobx-react"; // plane imports import { useTranslation } from "@plane/i18n"; @@ -21,6 +21,9 @@ import { useInstance } from "@/hooks/store/use-instance"; import { useAppRouter } from "@/hooks/use-app-router"; // wrappers import { AuthenticationWrapper } from "@/lib/wrappers/authentication-wrapper"; +import { WorkspaceService, type NodeDCWorkspacePolicy } from "@/services/workspace.service"; + +const workspaceService = new WorkspaceService(); const CreateWorkspacePage = observer(function CreateWorkspacePage() { const { t } = useTranslation(); @@ -36,8 +39,39 @@ const CreateWorkspacePage = observer(function CreateWorkspacePage() { slug: "", organization_size: "", }); + const [workspacePolicy, setWorkspacePolicy] = useState(null); + const [workspacePolicyLoading, setWorkspacePolicyLoading] = useState(true); // derived values const isWorkspaceCreationDisabled = config?.is_workspace_creation_disabled ?? false; + const isWorkspaceCreationDeniedByNodeDC = Boolean(workspacePolicy?.enabled && !workspacePolicy.can_create_workspace); + const shouldBlockWorkspaceCreation = isWorkspaceCreationDisabled || isWorkspaceCreationDeniedByNodeDC; + + useEffect(() => { + let mounted = true; + + workspaceService + .getNodeDCWorkspacePolicy() + .then((policy) => { + if (mounted) setWorkspacePolicy(policy); + }) + .catch(() => { + if (mounted) { + setWorkspacePolicy({ + enabled: false, + can_create_workspace: true, + mode: "unavailable", + reason: "NODE.DC workspace policy is unavailable.", + }); + } + }) + .finally(() => { + if (mounted) setWorkspacePolicyLoading(false); + }); + + return () => { + mounted = false; + }; + }, []); // methods const getMailtoHref = () => { @@ -60,7 +94,17 @@ const CreateWorkspacePage = observer(function CreateWorkspacePage() {
- {isWorkspaceCreationDisabled ? ( + {workspacePolicyLoading ? ( +
+
+

Работайте во всех измерениях.

+

Проверяем доступ к workspace.

+
+

+ Сверяем платформенную policy NODE.DC перед созданием рабочего пространства. +

+
+ ) : shouldBlockWorkspaceCreation ? (
Workspace creation disabled

- {t("workspace_creation.errors.creation_disabled.title")} + {isWorkspaceCreationDeniedByNodeDC + ? "Workspace создаёт администратор." + : t("workspace_creation.errors.creation_disabled.title")}

- {t("workspace_creation.errors.creation_disabled.description")} + {isWorkspaceCreationDeniedByNodeDC + ? workspacePolicy?.reason || "Дождитесь назначения в рабочее пространство администратором NODE.DC." + : t("workspace_creation.errors.creation_disabled.description")}