From 67b3420d009202452130dc7cb67902edc1251747 Mon Sep 17 00:00:00 2001 From: kyy Date: Thu, 30 Apr 2026 12:00:40 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B4=80=EA=B3=84=20=EC=98=B5=EC=85=98?= =?UTF-8?q?=EB=B3=84=20=EC=A0=95=EB=B3=B4=20=ED=88=B4=ED=8C=81=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../features/clients/ClientRelationsPage.tsx | 139 +++++++++++++----- devfront/src/locales/en.toml | 10 ++ devfront/src/locales/ko.toml | 10 ++ devfront/src/locales/template.toml | 12 ++ 4 files changed, 131 insertions(+), 40 deletions(-) diff --git a/devfront/src/features/clients/ClientRelationsPage.tsx b/devfront/src/features/clients/ClientRelationsPage.tsx index 96653d1f..d5e317c2 100644 --- a/devfront/src/features/clients/ClientRelationsPage.tsx +++ b/devfront/src/features/clients/ClientRelationsPage.tsx @@ -1,6 +1,6 @@ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import type { AxiosError } from "axios"; -import { ArrowLeft, Link2, Plus, Trash2 } from "lucide-react"; +import { ArrowLeft, Info, Link2, Plus, Trash2, X } from "lucide-react"; import { useDeferredValue, useMemo, useState } from "react"; import { useAuth } from "react-oidc-context"; import { Link, useParams } from "react-router-dom"; @@ -62,6 +62,10 @@ function relationDescription(relation: RelationOption) { ); } +function relationPermitsInfo(relation: RelationOption) { + return t(`ui.dev.clients.relationships.option.${relation}.permits_info`, ""); +} + function formatUserLabel(user: DevAssignableUser) { const primary = user.name.trim() || user.email.trim(); return `${primary} (${user.email.trim()})`; @@ -81,6 +85,7 @@ function ClientRelationsPage() { null, ); const [isSearchOpen, setIsSearchOpen] = useState(false); + const [infoRelation, setInfoRelation] = useState(null); const systemRole = resolveProfileRole( auth.user?.profile as Record | undefined, @@ -307,6 +312,12 @@ function ClientRelationsPage() { } }; + const handleInfoToggle = (event: React.MouseEvent, relation: RelationOption) => { + event.preventDefault(); + event.stopPropagation(); + setInfoRelation(prev => (prev === relation ? null : relation)); + }; + if (!clientId) { return (
@@ -498,46 +509,76 @@ function ClientRelationsPage() { const disabled = selectedUserExistingRelations.has(relation); const isSelected = selectedRelations.includes(relation); + const isInfoVisible = infoRelation === relation; + return ( -