feat: 任务全景默认按设备分组+全展开+全部展开/折叠按钮(与产品管理一致)

This commit is contained in:
2026-08-10 11:47:03 +08:00
parent 34724e478c
commit 5d6e2135c0

View File

@ -39,7 +39,7 @@ export default function AdminTasksPage() {
// 搜索 & 筛选 // 搜索 & 筛选
const [keyword, setKeyword] = useState(""); const [keyword, setKeyword] = useState("");
const [statusFilter, setStatusFilter] = useState(""); const [statusFilter, setStatusFilter] = useState("");
const [groupBy, setGroupBy] = useState<"order" | "device">("order"); // 🔧 分组维度 const [groupBy, setGroupBy] = useState<"order" | "device">("device");
const [products, setProducts] = useState<ProductResponse[]>([]); const [products, setProducts] = useState<ProductResponse[]>([]);
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const [error, setError] = useState<string | null>(null); const [error, setError] = useState<string | null>(null);
@ -76,7 +76,6 @@ export default function AdminTasksPage() {
function handleSearch(e?: React.FormEvent) { function handleSearch(e?: React.FormEvent) {
e?.preventDefault(); e?.preventDefault();
setExpandedOrders(new Set());
setExpandedProducts(new Set()); setExpandedProducts(new Set());
setTaskTrees({}); setTaskTrees({});
loadProducts(keyword); loadProducts(keyword);
@ -107,6 +106,11 @@ export default function AdminTasksPage() {
})); }));
}, [products, statusFilter, groupBy]); }, [products, statusFilter, groupBy]);
// 🔧 默认全部展开
useEffect(() => {
setExpandedOrders(new Set(orderGroups.map(g => g.orderNo)));
}, [orderGroups]);
// ---- 手风琴切换 ---- // ---- 手风琴切换 ----
function toggleOrder(orderNo: string) { function toggleOrder(orderNo: string) {
setExpandedOrders((prev) => { setExpandedOrders((prev) => {
@ -231,14 +235,22 @@ export default function AdminTasksPage() {
{/* ---- 搜索 + 筛选 ---- */} {/* ---- 搜索 + 筛选 ---- */}
<div className="mb-6 rounded-xl bg-white p-4 shadow-sm"> <div className="mb-6 rounded-xl bg-white p-4 shadow-sm">
<div className="mb-3 flex items-center gap-2"> <div className="mb-3 flex items-center justify-between">
<span className="text-xs text-gray-400">:</span> <div className="flex items-center gap-2">
{(["order", "device"] as const).map(m => ( <span className="text-xs text-gray-400">:</span>
<button key={m} onClick={() => setGroupBy(m)} {(["order", "device"] as const).map(m => (
className={`rounded-full px-3 py-1 text-xs font-medium transition-colors ${groupBy === m ? "bg-blue-600 text-white" : "bg-gray-100 text-gray-500 hover:bg-gray-200"}`}> <button key={m} onClick={() => setGroupBy(m)}
{m === "order" ? "按订单" : "按设备"} className={`rounded-full px-3 py-1 text-xs font-medium transition-colors ${groupBy === m ? "bg-blue-600 text-white" : "bg-gray-100 text-gray-500 hover:bg-gray-200"}`}>
</button> {m === "order" ? "按订单" : "按设备"}
))} </button>
))}
</div>
<div className="flex gap-1">
<button onClick={() => setExpandedOrders(new Set(orderGroups.map(g => g.orderNo)))}
className="rounded px-2 py-1 text-[11px] text-blue-600 hover:bg-blue-50"></button>
<button onClick={() => setExpandedOrders(new Set())}
className="rounded px-2 py-1 text-[11px] text-gray-400 hover:bg-gray-100"></button>
</div>
</div> </div>
<form onSubmit={handleSearch} className="flex items-center gap-2"> <form onSubmit={handleSearch} className="flex items-center gap-2">
<div className="relative flex-1 max-w-xl"> <div className="relative flex-1 max-w-xl">