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) => {