diff --git a/openspec/changes/web-modules/proposal.md b/openspec/changes/web-modules/proposal.md
index 5ae0d76..277f11b 100644
--- a/openspec/changes/web-modules/proposal.md
+++ b/openspec/changes/web-modules/proposal.md
@@ -37,8 +37,9 @@
по модулям и подсказками под полем; узкий экран с меткой проекта и сводной точкой состояния, модальная выезжающая
панель; «Задачи» без горизонтальной прокрутки страницы, просрочка текстом; «Вики» открывает корень и показывает
понятную шапку; мелкие тексты («Команды хаба», подсказка выбора проекта).
-- **Закрываемые follow-ups:** #94 (веб: T4.1, T4.2, T4.4, T4.5, T10.1–T10.7, T9.1), #90 (T7.5, T7.6), #73 (M-1…M-7),
- #68 (N-1, N-2, M-2, M-12, M-14, M-17, M-18, T5.3), #35 (M-9, O-16; T3.1/M-10 — отметить сделанным).
+- **Закрываемые follow-ups:** #94 (веб: T4.1, T4.2, T4.4, T4.5, T10.1–T10.7), #90 (T7.5, T7.6), #73 (M-1…M-7),
+ #68 (N-1, N-2, M-2, M-12, M-14, M-17, T5.3), #35 (M-9, O-16; T3.1/M-10 — отметить сделанным). Остаются открытыми: #68 M-18 (заголовки разделов 16 против 24 px) и #94 T9.1 (лишний `GET /projects`) —
+ в коде не закрыты.
## Non-Goals
diff --git a/web/src/App.test.tsx b/web/src/App.test.tsx
index 6f666c4..1de4031 100644
--- a/web/src/App.test.tsx
+++ b/web/src/App.test.tsx
@@ -43,7 +43,7 @@ describe("оболочка", () => {
it("«Сменить токен» показывает экран входа", async () => {
render();
- await userEvent.click(await screen.findByRole("button", { name: "Ещё" }));
+ await userEvent.click(within(await screen.findByRole("complementary", { name: "Панель приложения" })).getByRole("button", { name: "Ещё" })); // #68 M-2: на доске есть ещё и «Ещё — доска»
await userEvent.click(screen.getByRole("button", { name: "Сменить токен" }));
expect(getAuth().token).toBe("");
expect(screen.getByRole("heading", { name: "Вход в хаб" })).toBeInTheDocument();
diff --git a/web/src/modules/jira/board/BoardPage.test.tsx b/web/src/modules/jira/board/BoardPage.test.tsx
index 7fdea35..7845828 100644
--- a/web/src/modules/jira/board/BoardPage.test.tsx
+++ b/web/src/modules/jira/board/BoardPage.test.tsx
@@ -103,7 +103,7 @@ describe("страница доски", () => {
hub();
page();
await screen.findByText(/задач из 9/);
- await userEvent.click(screen.getByRole("button", { name: "Ещё" }));
+ await userEvent.click(screen.getByRole("button", { name: "Ещё — доска" }));
await userEvent.click(screen.getByRole("button", { name: "Экспорт JSON" }));
const text = (screen.getByRole("textbox") as HTMLTextAreaElement).value;
expect(JSON.parse(text)).toMatchObject({ format: "arm-ka-links/1", source: "Хаб" });
@@ -115,7 +115,7 @@ describe("страница доски", () => {
localStorage.setItem("graph-pos:board", '{"AURORA-9001":{"x":1,"ry":40}}');
page();
await screen.findByText(/задач из 9/);
- await userEvent.click(screen.getByRole("button", { name: "Ещё" }));
+ await userEvent.click(screen.getByRole("button", { name: "Ещё — доска" }));
await userEvent.click(screen.getByRole("button", { name: "Сбросить раскладку" }));
await userEvent.click(screen.getByRole("button", { name: "Да, сбросить" }));
expect(localStorage.getItem("graph-pos:board")).toBeNull();
@@ -139,7 +139,7 @@ describe("страница доски", () => {
await screen.findByText(/задач из 9/);
const input = document.querySelector('input[type="file"]') as HTMLInputElement;
const click = vi.spyOn(input, "click");
- await userEvent.click(screen.getByRole("button", { name: "Ещё" }));
+ await userEvent.click(screen.getByRole("button", { name: "Ещё — доска" }));
await userEvent.click(screen.getByRole("button", { name: "Загрузить файл…" }));
expect(click).toHaveBeenCalled();
});
@@ -170,8 +170,8 @@ describe("страница доски", () => {
page();
await screen.findByText(/задач из 9/);
expect(screen.getByRole("button", { name: "Обновить из Jira" })).toBeInTheDocument();
- await userEvent.click(screen.getByRole("button", { name: "Ещё" }));
- expect(screen.getByRole("button", { name: "Ещё" })).toHaveAttribute("aria-expanded", "true");
+ await userEvent.click(screen.getByRole("button", { name: "Ещё — доска" }));
+ expect(screen.getByRole("button", { name: "Ещё — доска" })).toHaveAttribute("aria-expanded", "true");
expect(screen.getByRole("button", { name: "Перечитать" })).toBeInTheDocument(); // меню действительно открыто
expect(screen.queryByRole("button", { name: /^Тема/ })).not.toBeInTheDocument();
});
diff --git a/web/src/modules/jira/board/components/BoardHeader.tsx b/web/src/modules/jira/board/components/BoardHeader.tsx
index 73d8a29..05cf239 100644
--- a/web/src/modules/jira/board/components/BoardHeader.tsx
+++ b/web/src/modules/jira/board/components/BoardHeader.tsx
@@ -35,7 +35,7 @@ export function BoardHeader(p: BoardHeaderProps) {
title="Сроки блокеров, задачи без исполнителя, передачи между людьми">
Проблемы {p.problemCount}
-