(pageMode === "templates" ? "templates" : "jobs");
+ // Route-bound modes must follow pageMode; internal tabs only when pageMode === "all".
+ // Without this, React reuses the same component instance across
+ // /biz-compare ↔ /compare-templates and pageTab stays stuck.
+ const activeTab: PageTab =
+ pageMode === "templates" ? "templates" : pageMode === "jobs" ? "jobs" : pageTab;
const showTabSwitch = pageMode === "all";
const [busy, setBusy] = useState(false);
@@ -838,6 +843,20 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [refresh]);
+ // Keep local tab + dismiss overlays when route mode flips (component may be reused).
+ useEffect(() => {
+ if (pageMode === "templates") setPageTab("templates");
+ else if (pageMode === "jobs") setPageTab("jobs");
+ setTplOpen(false);
+ setJobCreateOpen(false);
+ setCreateStep(0);
+ setJobId("");
+ setRuns([]);
+ setRunDetail(null);
+ setResultSheetId("");
+ setBoardFs(false);
+ }, [pageMode]);
+
useEffect(() => {
void (async () => {
if (!beforeTaskId) {
@@ -1046,12 +1065,12 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage
let display = (activeRunSheet?.display_fields || []).filter(Boolean);
if (!display.length) {
display = [...keys, ...compare];
- } else {
- // keys first, then rest of display order
- const rest = display.filter((f) => !keySet.has(f));
- display = [...keys, ...rest];
}
- let extras = display.filter((f) => !keySet.has(f));
+ // Column order: Key → Compare → Display-only (context)
+ // Compare fields always appear (even if display unticked), matching backend.
+ const compareCols = [...compare];
+ const displayOnly = display.filter((f) => !keySet.has(f) && !compareSet.has(f));
+ let extras = [...compareCols, ...displayOnly];
// Presence / sparse display: if no value columns, pull fields from sample
// added/removed rows so 缺失/多余 still show side data.
if (!extras.length && pagedDiffs.length) {
@@ -1066,7 +1085,7 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage
}
return {
keys,
- compare,
+ compare: compareCols,
extras,
compareSet,
presence: !(activeRunSheet?.compare_fields || []).length,
@@ -1922,7 +1941,7 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage
{pageMode === "templates" ? t("bizCompare.templates") : t("bizCompare.title")}
- {pageTab === "templates" ? (
+ {activeTab === "templates" ? (
<>
- {pageTab === "templates" ? (
+ {activeTab === "templates" ? (
{t("bizCompare.templateImportHint")}