From e79b07318030cd925153298ea47ebf88545ee27d Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Sun, 25 Oct 2026 20:27:58 +0400 Subject: [PATCH] =?UTF-8?q?fix(web):=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20?= =?UTF-8?q?=D1=81=D0=BC=D0=B5=D0=BD=D1=8B=20=D0=BC=D0=B5=D1=82=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=B8=20=D1=81=D0=B1=D1=80=D0=BE=D1=81=D0=B0,=20hideDone=20?= =?UTF-8?q?=D0=B1=D0=B5=D0=B7=20=D1=84=D0=BB=D0=B0=D0=B6=D0=BA=D0=B0=20(#1?= =?UTF-8?q?12)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5.5 --- .../modules/jira/agile/AgileToolbar.test.tsx | 34 +++++++++++++++++++ web/src/modules/jira/agile/AgileToolbar.tsx | 2 +- web/src/modules/jira/agile/useAgileView.ts | 1 + 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/web/src/modules/jira/agile/AgileToolbar.test.tsx b/web/src/modules/jira/agile/AgileToolbar.test.tsx index 101927d..a5882ef 100644 --- a/web/src/modules/jira/agile/AgileToolbar.test.tsx +++ b/web/src/modules/jira/agile/AgileToolbar.test.tsx @@ -79,4 +79,38 @@ describe("AgileToolbar", () => { render(); expect(assignee().value).toBe(""); }); + + it("смена метки и страницы без размонтирования: q сброшен, чужие значения не протекают, прежние данные целы", () => { + const r = render(); + fireEvent.change(assignee(), { target: { value: "ivanov" } }); + fireEvent.click(screen.getByLabelText("Скрыть выполненные")); + fireEvent.change(search(), { target: { value: "abc" } }); + const before = localStorage.getItem(AGILE_KEY); + r.rerender(); + expect(search().value).toBe(""); + expect(assignee().value).toBe(""); + expect((screen.getByLabelText("Скрыть выполненные") as HTMLInputElement).checked).toBe(false); + expect(localStorage.getItem(AGILE_KEY)).toBe(before); + r.rerender(); + expect(assignee().value).toBe(""); + expect(localStorage.getItem(AGILE_KEY)).toBe(before); + r.rerender(); + expect(assignee().value).toBe("ivanov"); + expect(search().value).toBe(""); + }); + + it("сброс сохраняет collapsed, hiddenColumns и epicsPanel", () => { + localStorage.setItem(AGILE_KEY, JSON.stringify({ AWPCA: { backlog: { + assignee: "ivanov", epic: "E-1", hideDone: true, collapsed: ["E-1"], hiddenColumns: ["Done"], epicsPanel: false } } })); + render(); + fireEvent.click(screen.getByText("Сбросить фильтры")); + expect(stored().AWPCA.backlog).toEqual({ + assignee: "", epic: "", hideDone: false, collapsed: ["E-1"], hiddenColumns: ["Done"], epicsPanel: false }); + }); + + it("showHideDone=false: сохранённый hideDone не показывает «Сбросить фильтры»", () => { + localStorage.setItem(AGILE_KEY, JSON.stringify({ AWPCA: { backlog: { hideDone: true } } })); + render(); + expect(screen.queryByText("Сбросить фильтры")).toBeNull(); + }); }); diff --git a/web/src/modules/jira/agile/AgileToolbar.tsx b/web/src/modules/jira/agile/AgileToolbar.tsx index 6cfbc2a..83880a9 100644 --- a/web/src/modules/jira/agile/AgileToolbar.tsx +++ b/web/src/modules/jira/agile/AgileToolbar.tsx @@ -19,7 +19,7 @@ export function AgileToolbar({ filter, setQ, set, onReset, assignees, showHideDo set({ hideDone: e.target.checked })} /> )} {children} - {hasFilters(filter) && } + {hasFilters({ ...filter, hideDone: filter.hideDone && showHideDone }) && } ); } diff --git a/web/src/modules/jira/agile/useAgileView.ts b/web/src/modules/jira/agile/useAgileView.ts index 49b72eb..36e8e78 100644 --- a/web/src/modules/jira/agile/useAgileView.ts +++ b/web/src/modules/jira/agile/useAgileView.ts @@ -13,6 +13,7 @@ export function useAgileView(label: string, page: AgilePage) { setState(cur); } const ref = useRef(cur); + // ref обновляется при рендере: set/reset в одном событии должны видеть актуальный вид, а не замыкание прошлого рендера ref.current = cur; const commit = useCallback((next: typeof state) => {