Add select-all update button on control monitor toolbar.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -425,8 +425,8 @@ export default function MonitorPage() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function batchUpdate() {
|
async function batchUpdate(idsOverride?: number[]) {
|
||||||
const ids = [...selected];
|
const ids = idsOverride ?? [...selected];
|
||||||
if (!ids.length) return;
|
if (!ids.length) return;
|
||||||
const names = nodes
|
const names = nodes
|
||||||
.filter((n) => ids.includes(n.id))
|
.filter((n) => ids.includes(n.id))
|
||||||
@@ -457,6 +457,29 @@ export default function MonitorPage() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const updatableIds = nodes
|
||||||
|
.filter((n) => n.token_configured)
|
||||||
|
.map((n) => n.id);
|
||||||
|
const allSelected =
|
||||||
|
updatableIds.length > 0 && updatableIds.every((id) => selected.has(id));
|
||||||
|
|
||||||
|
function toggleSelectAll() {
|
||||||
|
setSelected((prev) => {
|
||||||
|
if (updatableIds.length === 0) return prev;
|
||||||
|
if (updatableIds.every((id) => prev.has(id))) return new Set();
|
||||||
|
return new Set(updatableIds);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function updateAll() {
|
||||||
|
if (!updatableIds.length) {
|
||||||
|
setErr("没有已配对 Token 的策略机可更新");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setSelected(new Set(updatableIds));
|
||||||
|
await batchUpdate(updatableIds);
|
||||||
|
}
|
||||||
|
|
||||||
const detailNode = detailId != null ? nodes.find((x) => x.id === detailId) : null;
|
const detailNode = detailId != null ? nodes.find((x) => x.id === detailId) : null;
|
||||||
const detail = detailNode ? pickStrategy(detailNode) : null;
|
const detail = detailNode ? pickStrategy(detailNode) : null;
|
||||||
const detailRunning =
|
const detailRunning =
|
||||||
@@ -497,6 +520,15 @@ export default function MonitorPage() {
|
|||||||
<button type="button" className="btn ghost" onClick={() => void refresh()}>
|
<button type="button" className="btn ghost" onClick={() => void refresh()}>
|
||||||
刷新
|
刷新
|
||||||
</button>
|
</button>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className="btn ghost"
|
||||||
|
disabled={!updatableIds.length}
|
||||||
|
onClick={() => void updateAll()}
|
||||||
|
title="选中全部已配对策略机并批量更新代码"
|
||||||
|
>
|
||||||
|
全选更新 ({updatableIds.length})
|
||||||
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="btn"
|
className="btn"
|
||||||
|
|||||||
Reference in New Issue
Block a user