From 93007f471b843b08b7efd39c7764ace4acf3e999 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Fri, 23 Oct 2026 23:14:00 +0400 Subject: [PATCH] =?UTF-8?q?refactor(web):=20=D0=BE=D0=B1=D0=BE=D0=BB=D0=BE?= =?UTF-8?q?=D1=87=D0=BA=D0=B0=20=D0=B1=D0=B5=D1=80=D1=91=D1=82=20padded=20?= =?UTF-8?q?=D0=B8=20keepSearch=20=D0=B8=D0=B7=20=D0=BF=D1=83=D0=BD=D0=BA?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=20=D0=BF=D0=B0=D0=BD=D0=B5=D0=BB=D0=B8=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B5=D0=B9=20(#87)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- web/src/modules/jira/index.tsx | 4 ++-- web/src/modules/types.ts | 6 +++++- web/src/shell/Layout.tsx | 7 ++++--- web/src/shell/NotFound.tsx | 6 +++++- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/web/src/modules/jira/index.tsx b/web/src/modules/jira/index.tsx index c72c7e8..d4ceabf 100644 --- a/web/src/modules/jira/index.tsx +++ b/web/src/modules/jira/index.tsx @@ -26,8 +26,8 @@ export const jiraModule: HubModule = { ], nav: [ { to: "/board", label: "Доска связей", icon: }, - { to: "/issues", label: "Задачи", icon: }, - { to: "/feed", label: "Лента", icon: }, + { to: "/issues", label: "Задачи", icon: , padded: true }, + { to: "/feed", label: "Лента", icon: , padded: true, keepSearch: true }, ], Provider: RefreshProvider, SidebarStatus, diff --git a/web/src/modules/types.ts b/web/src/modules/types.ts index 0e7157f..78e7bf3 100644 --- a/web/src/modules/types.ts +++ b/web/src/modules/types.ts @@ -1,7 +1,11 @@ import type { ComponentType, ReactNode } from "react"; import type { Location, RouteObject } from "react-router"; -export type NavItem = { to: string; label: string; icon: ReactNode }; +export type NavItem = { + to: string; label: string; icon: ReactNode; + padded?: boolean; // страница с полями (не во всю ширину): оболочка не ставит ей класс page--board; для адресов вне панели класс ставится + keepSearch?: boolean; // при смене проекта строка запроса страницы сохраняется (параметры не проектные); иначе сбрасывается +}; // окно поверх страницы (карточка задачи): pageLocation — адрес страницы под окном, null — окна нет export type Overlay = { pageLocation: Location | null; element: ReactNode }; diff --git a/web/src/shell/Layout.tsx b/web/src/shell/Layout.tsx index fc98b5d..3081458 100644 --- a/web/src/shell/Layout.tsx +++ b/web/src/shell/Layout.tsx @@ -10,7 +10,8 @@ import { PAGE_ROUTES } from "./pages.tsx"; import { Sidebar } from "./Sidebar.tsx"; import "./shell.css"; -const NAV_PATHS: readonly string[] = MODULES.flatMap((m) => m.nav.map((n) => n.to)); +const NAV = MODULES.flatMap((m) => m.nav); +const NAV_PATHS: readonly string[] = NAV.map((n) => n.to); export function Layout() { const location = useLocation(); @@ -44,7 +45,7 @@ export function Layout() { const [newOpen, setNewOpen] = useState(false); // смена проекта: фильтры доски и списка — проектные и сбрасываются; период и виды ленты от проекта не зависят (R-1) const select = useCallback((label: string) => { - void navigate({ pathname: section ?? NAV_PATHS[0], search: withProject(section === "/feed" ? pageLocation.search : "", label) }); + void navigate({ pathname: section ?? NAV_PATHS[0], search: withProject(NAV.find((n) => n.to === section)?.keepSearch ? pageLocation.search : "", label) }); }, [navigate, section, pageLocation.search]); const ctx = useMemo(() => ({ state, projects: projects.data ?? [], select, openNew: () => setNewOpen(true) }), [state, projects.data, select]); @@ -54,7 +55,7 @@ export function Layout() {
-
+
n.to === section)?.padded ? "" : " page--board")}> {page}
diff --git a/web/src/shell/NotFound.tsx b/web/src/shell/NotFound.tsx index 1d17bde..e2378bb 100644 --- a/web/src/shell/NotFound.tsx +++ b/web/src/shell/NotFound.tsx @@ -1,11 +1,15 @@ +import { Fragment } from "react"; import { Link } from "react-router"; +import { MODULES } from "../modules/index.ts"; import { Notice } from "../ui/index.ts"; +const NAV = MODULES.flatMap((m) => m.nav); + export function NotFound() { return (
Страница не найдена}> - Разделы приложения: Доска связей, Задачи, Лента. + Разделы приложения: {NAV.map((n, i) => {i > 0 && ", "}{n.label})}.
);