ФУНКЦИИ - МЕЖПРОЕКТНАЯ КОММУНИКАЦИЯ: policy создания workspace в Launcher
This commit is contained in:
@@ -67,8 +67,13 @@ export interface LauncherSettings {
|
||||
brand: {
|
||||
logoLinkUrl: string;
|
||||
};
|
||||
taskManager: {
|
||||
workspaceCreationPolicy: TaskManagerWorkspaceCreationPolicy;
|
||||
};
|
||||
}
|
||||
|
||||
export type TaskManagerWorkspaceCreationPolicy = "any_authorized_user" | "task_admins_only" | "disabled";
|
||||
|
||||
export interface ProfileOption {
|
||||
userId: string;
|
||||
label: string;
|
||||
@@ -94,6 +99,9 @@ export const defaultLauncherSettings: LauncherSettings = {
|
||||
brand: {
|
||||
logoLinkUrl: "/",
|
||||
},
|
||||
taskManager: {
|
||||
workspaceCreationPolicy: "any_authorized_user",
|
||||
},
|
||||
};
|
||||
|
||||
export const initialLauncherData: LauncherData = normalizeLauncherData({
|
||||
@@ -115,15 +123,29 @@ export function normalizeLauncherSettings(settings?: Partial<LauncherSettings> |
|
||||
typeof settings?.brand === "object" && settings.brand !== null
|
||||
? settings.brand
|
||||
: ({} as Partial<LauncherSettings["brand"]>);
|
||||
const taskManager =
|
||||
typeof settings?.taskManager === "object" && settings.taskManager !== null
|
||||
? settings.taskManager
|
||||
: ({} as Partial<LauncherSettings["taskManager"]>);
|
||||
const logoLinkUrl = typeof brand.logoLinkUrl === "string" && brand.logoLinkUrl.trim() ? brand.logoLinkUrl.trim() : "/";
|
||||
const workspaceCreationPolicy = isTaskManagerWorkspaceCreationPolicy(taskManager.workspaceCreationPolicy)
|
||||
? taskManager.workspaceCreationPolicy
|
||||
: defaultLauncherSettings.taskManager.workspaceCreationPolicy;
|
||||
|
||||
return {
|
||||
brand: {
|
||||
logoLinkUrl,
|
||||
},
|
||||
taskManager: {
|
||||
workspaceCreationPolicy,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
function isTaskManagerWorkspaceCreationPolicy(value: unknown): value is TaskManagerWorkspaceCreationPolicy {
|
||||
return value === "any_authorized_user" || value === "task_admins_only" || value === "disabled";
|
||||
}
|
||||
|
||||
export function normalizeLauncherData(data: Partial<LauncherData> | null | undefined): LauncherData {
|
||||
const payload = data ?? {};
|
||||
|
||||
|
||||
@@ -62,6 +62,7 @@ import {
|
||||
type LauncherData,
|
||||
type LauncherSettings,
|
||||
type MeResponse,
|
||||
type TaskManagerWorkspaceCreationPolicy,
|
||||
} from "../../shared/api/mockApi";
|
||||
import { uploadStorageFile } from "../../shared/api/storageApi";
|
||||
import { cn } from "../../shared/lib/cn";
|
||||
@@ -885,6 +886,27 @@ const accessAssignmentOptions: Array<NodeDcSelectOption<AccessAssignmentValue>>
|
||||
{ value: "deny", label: "Deny", description: "Исключение", tone: "red" },
|
||||
];
|
||||
|
||||
const taskManagerWorkspacePolicyOptions: Array<NodeDcSelectOption<TaskManagerWorkspaceCreationPolicy>> = [
|
||||
{
|
||||
value: "any_authorized_user",
|
||||
label: "Все с доступом",
|
||||
description: "Пользователь с доступом к Operational Core может создать собственный workspace.",
|
||||
tone: "green",
|
||||
},
|
||||
{
|
||||
value: "task_admins_only",
|
||||
label: "Только админы",
|
||||
description: "Workspace создают только суперпользователь и админы Operational Core.",
|
||||
tone: "yellow",
|
||||
},
|
||||
{
|
||||
value: "disabled",
|
||||
label: "Отключено",
|
||||
description: "Создание workspace закрыто для всех через платформенную policy.",
|
||||
tone: "red",
|
||||
},
|
||||
];
|
||||
|
||||
const mediaAccept = "image/*,video/*,.gif,.webm,.mov,.mp4,.m4v,.avi,.mkv";
|
||||
const modalActionAccentRgb = [247, 248, 244] as const;
|
||||
|
||||
@@ -2401,13 +2423,19 @@ function MiscSection({
|
||||
onUpdateSettings: (patch: Partial<LauncherSettings>) => void;
|
||||
}) {
|
||||
const [logoLinkUrl, setLogoLinkUrl] = useState(data.settings.brand.logoLinkUrl);
|
||||
const [workspaceCreationPolicy, setWorkspaceCreationPolicy] = useState(
|
||||
data.settings.taskManager.workspaceCreationPolicy
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
setLogoLinkUrl(data.settings.brand.logoLinkUrl);
|
||||
}, [data.settings.brand.logoLinkUrl]);
|
||||
setWorkspaceCreationPolicy(data.settings.taskManager.workspaceCreationPolicy);
|
||||
}, [data.settings.brand.logoLinkUrl, data.settings.taskManager.workspaceCreationPolicy]);
|
||||
|
||||
const normalizedLogoLinkUrl = logoLinkUrl.trim() || "/";
|
||||
const hasChanges = normalizedLogoLinkUrl !== data.settings.brand.logoLinkUrl;
|
||||
const hasChanges =
|
||||
normalizedLogoLinkUrl !== data.settings.brand.logoLinkUrl ||
|
||||
workspaceCreationPolicy !== data.settings.taskManager.workspaceCreationPolicy;
|
||||
|
||||
return (
|
||||
<GlassSurface className="table-shell admin-settings-panel">
|
||||
@@ -2423,7 +2451,12 @@ function MiscSection({
|
||||
type="button"
|
||||
icon={<Save size={16} />}
|
||||
disabled={!hasChanges}
|
||||
onClick={() => onUpdateSettings({ brand: { logoLinkUrl: normalizedLogoLinkUrl } })}
|
||||
onClick={() =>
|
||||
onUpdateSettings({
|
||||
brand: { logoLinkUrl: normalizedLogoLinkUrl },
|
||||
taskManager: { workspaceCreationPolicy },
|
||||
})
|
||||
}
|
||||
>
|
||||
Сохранить
|
||||
</Button>
|
||||
@@ -2440,6 +2473,18 @@ function MiscSection({
|
||||
/>
|
||||
<small>Куда ведёт клик по логотипу NODE.DC. Можно указать относительный путь или полный URL.</small>
|
||||
</label>
|
||||
<label className="admin-settings-field">
|
||||
<span>Operational Core: создание workspace</span>
|
||||
<NodeDcSelect
|
||||
className="admin-modal-select-wrap"
|
||||
triggerClassName="admin-modal-select-trigger"
|
||||
value={workspaceCreationPolicy}
|
||||
options={taskManagerWorkspacePolicyOptions}
|
||||
label="Политика создания workspace в Operational Core"
|
||||
onChange={(value) => setWorkspaceCreationPolicy(value)}
|
||||
/>
|
||||
<small>Платформенная policy для новых пользователей без назначенных рабочих пространств в Task Manager.</small>
|
||||
</label>
|
||||
</div>
|
||||
</GlassSurface>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user