From f6647230f710af2ab2c0519dc3f1fb6da17968e9 Mon Sep 17 00:00:00 2001 From: kyy Date: Fri, 27 Feb 2026 11:22:33 +0900 Subject: [PATCH] =?UTF-8?q?User=20Consent=20=ED=95=84=ED=84=B0(=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5)=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../features/clients/ClientConsentsPage.tsx | 150 ++++++++++++------ 1 file changed, 104 insertions(+), 46 deletions(-) diff --git a/devfront/src/features/clients/ClientConsentsPage.tsx b/devfront/src/features/clients/ClientConsentsPage.tsx index 1f44f2f6..ee9a31ab 100644 --- a/devfront/src/features/clients/ClientConsentsPage.tsx +++ b/devfront/src/features/clients/ClientConsentsPage.tsx @@ -34,8 +34,8 @@ function ClientConsentsPage() { const clientId = params.id ?? ""; const [subjectInput, setSubjectInput] = useState(""); const [subject, setSubject] = useState(""); - const [statusFilter, setStatusFilter] = useState("all"); - const [scopeFilter, setScopeFilter] = useState("all"); + const [statusFilter, setStatusFilter] = useState([]); + const [scopeFilter, setScopeFilter] = useState([]); const [isAdvancedFilterOpen, setIsAdvancedFilterOpen] = useState(false); const { data: clientData } = useQuery({ @@ -49,8 +49,8 @@ function ClientConsentsPage() { error, refetch, } = useQuery({ - queryKey: ["consents", clientId, subject, statusFilter], - queryFn: () => fetchConsents(subject, clientId, statusFilter), + queryKey: ["consents", clientId, subject], + queryFn: () => fetchConsents(subject, clientId, "all"), enabled: clientId.length > 0, }); const revokeMutation = useMutation({ @@ -77,7 +77,12 @@ function ClientConsentsPage() { const rows = consentsData?.items ?? []; const allScopes = Array.from(new Set(rows.flatMap((r) => r.grantedScopes))); const filteredRows = rows.filter((row) => { - return scopeFilter === "all" || row.grantedScopes.includes(scopeFilter); + const matchStatus = + statusFilter.length === 0 || statusFilter.includes(row.status); + const matchScope = + scopeFilter.length === 0 || + scopeFilter.some((s) => row.grantedScopes.includes(s)); + return matchStatus && matchScope; }); const handleExportCSV = () => { @@ -130,6 +135,30 @@ function ClientConsentsPage() { document.body.removeChild(link); }; + const handleStatusFilterChange = (status: string, checked: boolean) => { + if (checked) { + setStatusFilter((prev) => [...prev, status]); + } else { + setStatusFilter((prev) => prev.filter((s) => s !== status)); + } + }; + + const handleScopeFilterChange = (scope: string, checked: boolean) => { + if (checked) { + setScopeFilter((prev) => [...prev, scope]); + } else { + setScopeFilter((prev) => prev.filter((s) => s !== scope)); + } + }; + + const handleAllScopesChange = (checked: boolean) => { + if (checked) { + setScopeFilter(allScopes); + } else { + setScopeFilter([]); + } + }; + return (
@@ -175,7 +204,7 @@ function ClientConsentsPage() {
{clientData?.client?.status === "active" @@ -252,59 +281,88 @@ function ClientConsentsPage() {
{isAdvancedFilterOpen && ( -
-
- +
+
+ {t("ui.dev.clients.consents.status_label", "Status:")} - + handleStatusFilterChange("active", e.target.checked) + } + /> {t("ui.common.status.active", "Active")} - - - + +
-
- +
+ {t("ui.dev.clients.consents.scope_label", "Scope:")} - 0 + } + onChange={(e) => handleAllScopesChange(e.target.checked)} + /> + ALL + + )} {allScopes.map((scope) => ( - + ))} - +
- +
+ +
)}