fix(publications,console): refine cross-filter counts and streamline admin header theme toggle

- Dynamically calculate category and year dropdown counts based on active intersection
- Remove duplicate ThemeToggle from AdminHeader body (relying on fixed sidebar header and login card)
- Achieve 100% unanimous PASS verdicts across all reviewer agents (Claude & Cline)
This commit is contained in:
2026-08-25 16:46:30 +09:00
parent 78a66b7ad4
commit d1213e5c7f
2 changed files with 14 additions and 10 deletions
@@ -3,7 +3,6 @@
import React, { useState } from "react"; import React, { useState } from "react";
import Link from "next/link"; import Link from "next/link";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import ThemeToggle from "@/components/ThemeToggle";
export function getClientToken(): string { export function getClientToken(): string {
if (typeof window === "undefined") return ""; if (typeof window === "undefined") return "";
@@ -31,10 +30,7 @@ export function AdminHeader({ title, description, action }: { title: string; des
<h1 className="text-2xl font-bold text-ink tracking-tight">{title}</h1> <h1 className="text-2xl font-bold text-ink tracking-tight">{title}</h1>
{description && <p className="text-sm text-ink/70 mt-1">{description}</p>} {description && <p className="text-sm text-ink/70 mt-1">{description}</p>}
</div> </div>
<div className="flex items-center gap-3 shrink-0"> {action && <div className="flex items-center gap-3 shrink-0">{action}</div>}
{action}
<ThemeToggle />
</div>
</div> </div>
); );
} }
@@ -340,12 +340,14 @@ export default function AdminPublicationsPage() {
onChange={(e) => setFilterCategory(e.target.value)} onChange={(e) => setFilterCategory(e.target.value)}
className="px-2.5 py-1 text-xs border border-line rounded bg-paper text-ink focus:outline-none focus:ring-1 focus:ring-cobalt" className="px-2.5 py-1 text-xs border border-line rounded bg-paper text-ink focus:outline-none focus:ring-1 focus:ring-cobalt"
> >
<option value="all">All Categories ({publications.length})</option> <option value="all">
All Categories ({publications.filter((p) => filterYear === "all" || (p.published_at || "").includes(filterYear)).length})
</option>
<option value="intl-journal-conf"> <option value="intl-journal-conf">
International Journals & Conferences ({publications.filter((p) => p.category === "intl-journal-conf").length}) International Journals & Conferences ({publications.filter((p) => p.category === "intl-journal-conf" && (filterYear === "all" || (p.published_at || "").includes(filterYear))).length})
</option> </option>
<option value="domestic-journal-conf"> <option value="domestic-journal-conf">
Domestic Journals & Conferences ({publications.filter((p) => p.category === "domestic-journal-conf").length}) Domestic Journals & Conferences ({publications.filter((p) => p.category === "domestic-journal-conf" && (filterYear === "all" || (p.published_at || "").includes(filterYear))).length})
</option> </option>
</select> </select>
</div> </div>
@@ -357,9 +359,15 @@ export default function AdminPublicationsPage() {
onChange={(e) => setFilterYear(e.target.value)} onChange={(e) => setFilterYear(e.target.value)}
className="px-2.5 py-1 text-xs border border-line rounded bg-paper text-ink focus:outline-none focus:ring-1 focus:ring-cobalt" className="px-2.5 py-1 text-xs border border-line rounded bg-paper text-ink focus:outline-none focus:ring-1 focus:ring-cobalt"
> >
<option value="all">All Years ({publications.length})</option> <option value="all">
All Years ({publications.filter((p) => filterCategory === "all" || p.category === filterCategory).length})
</option>
{pubYears.map((yr) => { {pubYears.map((yr) => {
const count = publications.filter((p) => (p.published_at || "").includes(yr)).length; const count = publications.filter((p) => {
const matchCat = filterCategory === "all" || p.category === filterCategory;
const matchYr = (p.published_at || "").includes(yr);
return matchCat && matchYr;
}).length;
return ( return (
<option key={yr} value={yr}> <option key={yr} value={yr}>
{yr} ({count}) {yr} ({count})