From b7bd8537a4b6b5c1f536eab14186376f3acacc12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A2=D0=B8=D0=BC=D1=83=D1=80=20=D0=93=D0=BE=D1=80=D0=BE?= =?UTF-8?q?=D0=B4=D0=B5=D1=86=D0=BA=D0=B8=D0=B9?= Date: Thu, 24 Sep 2026 12:21:43 +0500 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B8=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D1=8E=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D1=8F=20=D0=B2=20=D0=B1=D0=BE=D0=BA=D0=BE=D0=B2?= =?UTF-8?q?=D1=83=D1=8E=20=D0=BF=D0=B0=D0=BD=D0=B5=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../requestPortal/components/RequestPortal.tsx | 17 ++++++++++++++++- src/webparts/requestPortal/shared/config.ts | 7 +++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/webparts/requestPortal/components/RequestPortal.tsx b/src/webparts/requestPortal/components/RequestPortal.tsx index 784e954..bb098af 100644 --- a/src/webparts/requestPortal/components/RequestPortal.tsx +++ b/src/webparts/requestPortal/components/RequestPortal.tsx @@ -21,6 +21,7 @@ import { OwnTab, } from '../shared/routing'; import { onRequestsChanged, emitRequestsChanged } from '../shared/requestEvents'; +import { USER_GUIDE_URL } from '../shared/config'; import { getImpersonatedEmail, getImpersonatedDisplayName } from '../shared/impersonation'; import { confirmDiscardFormChanges, markFormClean, markFormDirty } from '../shared/unsavedChanges'; import { Drawer } from './Drawer/Drawer'; @@ -298,6 +299,11 @@ const RequestPortal: React.FC = ({ hasTeamsContext, context // Разделы бокового меню для пакетного Sidebar (счётчики — из navCounts). // «Отчёты» — только у тех, кому разрешено (см. canSeeReports выше): скрыт из // меню совсем, а не показан неактивным, — раздела для остальных как бы не существует. + // + // «Инструкция пользователя» — не раздел портала, а внешняя ссылка (docx в базе + // знаний). id 'instructions' НЕ входит в NavSection специально: обработчик + // onChange ниже перехватывает его до вызова goto() и открывает ссылку в новой + // вкладке, не меняя текущий раздел/маршрут. const navItems: ISidebarItem[] = [ { id: 'new', title: 'Новая заявка', icon: 'plus' }, { id: 'approvals', title: 'На согласовании', icon: 'user-check', count: navCounts?.approvals }, @@ -306,8 +312,17 @@ const RequestPortal: React.FC = ({ hasTeamsContext, context { id: 'own', title: 'Мои заявки', icon: 'clipboard' }, { id: 'search', title: 'Поиск', icon: 'search' }, ...(canSeeReports ? [{ id: 'reports', title: 'Отчёты', icon: 'chart' } as ISidebarItem] : []), + { id: 'instructions', title: 'Инструкция пользователя', icon: 'info' }, ]; + const handleNavChange = (id: string): void => { + if (id === 'instructions') { + window.open(USER_GUIDE_URL, '_blank', 'noopener'); + return; + } + goto(id as NavSection); + }; + return (
@@ -329,7 +344,7 @@ const RequestPortal: React.FC = ({ hasTeamsContext, context goto(id as NavSection)} + onChange={handleNavChange} brand="Портал заявок" collapsed={navCollapsed} onToggleCollapsed={() => setNavCollapsed((v) => !v)} diff --git a/src/webparts/requestPortal/shared/config.ts b/src/webparts/requestPortal/shared/config.ts index a506d85..707784f 100644 --- a/src/webparts/requestPortal/shared/config.ts +++ b/src/webparts/requestPortal/shared/config.ts @@ -8,6 +8,13 @@ */ export const DATA_SITE_URL = 'https://tnsukz.sharepoint.com/sites/requests'; +/** + * Инструкция пользователя по порталу (docx на сайте базы знаний) — ссылка в + * боковом меню (см. components/RequestPortal.tsx), открывается в новой вкладке. + */ +export const USER_GUIDE_URL = + 'https://tnsukz.sharepoint.com/:w:/r/sites/knowledge/DocLib8/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D0%B8%20%D0%BA%20IT%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0%D0%BC/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D1%8F%20-%20%D0%9F%D0%BE%D1%80%D1%82%D0%B0%D0%BB%20%D0%B7%D0%B0%D1%8F%D0%B2%D0%BE%D0%BA.docx?d=wce77e8a0d19d49b5b2fcdf13828e8bb3&csf=1&web=1&e=p9V3hU'; + /** * Внешний approval-route API (маршруты согласования по ролям). * Авторизация — AadHttpClient (SSO текущего пользователя) по clientId