From bf4c4c517adba5072fbe00a110fbdd3b1b88bdb7 Mon Sep 17 00:00:00 2001 From: "gorbenko.pavel" Date: Mon, 24 Aug 2026 16:16:59 +0500 Subject: [PATCH] =?UTF-8?q?feat:=20=D1=87=D0=B0=D1=82=20=D0=BF=D0=BE=20?= =?UTF-8?q?=D0=B7=D0=B0=D1=8F=D0=B2=D0=BA=D0=B5=20=E2=80=94=20=D1=82=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=B2=20=D0=BE=D0=B1=D1=85=D0=BE?= =?UTF-8?q?=D0=B4=D0=BD=D0=BE=D0=BC=20=D0=BB=D0=B8=D1=81=D1=82=D0=B5,=20?= =?UTF-8?q?=D0=BB=D0=B8=D0=BC=D0=B8=D1=82=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=B4=D0=BE=2020?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Остальным восьми типам заявок чат пока не нужен: сужаем область до одной формы (isChatEnabledFor), не включая сразу везде. Лимит файлов на сообщение поднят с 5 до 20 — пяти оказалось мало для реальной переписки по обходному листу. --- .../features/approve/ApproveFeature.tsx | 9 +++++--- .../features/edit/EditFeature.tsx | 9 +++++--- .../shared/chat/chatEnabled.test.ts | 17 ++++++++++++++ .../requestPortal/shared/chat/chatEnabled.ts | 23 +++++++++++++++++++ .../shared/chat/chatFiles.service.ts | 2 +- .../requestPortal/shared/chat/index.ts | 1 + 6 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 src/webparts/requestPortal/shared/chat/chatEnabled.test.ts create mode 100644 src/webparts/requestPortal/shared/chat/chatEnabled.ts diff --git a/src/webparts/requestPortal/features/approve/ApproveFeature.tsx b/src/webparts/requestPortal/features/approve/ApproveFeature.tsx index e814209..88591ab 100644 --- a/src/webparts/requestPortal/features/approve/ApproveFeature.tsx +++ b/src/webparts/requestPortal/features/approve/ApproveFeature.tsx @@ -3,7 +3,7 @@ import type { WebPartContext } from '@microsoft/sp-webpart-base'; import styles from './ApproveFeature.module.scss'; import { getViewComponent } from '../../forms/viewRegistry'; import { isConfirmedStaleListId } from '../../shared/approval'; -import { RequestChat } from '../../shared/chat'; +import { RequestChat, isChatEnabledFor } from '../../shared/chat'; export interface IApproveFeatureProps { context: WebPartContext; @@ -44,8 +44,11 @@ const ApproveFeature: React.FC = ({ context, formKey, item {/* Доступно всем, кто может открыть заявку: автору, всем согласующим (и уже решившим, и ещё ждущим своей очереди) и исполнителям — - в отличие от панели решения, которая видна только текущему шагу. */} - + в отличие от панели решения, которая видна только текущему шагу. + Пока включено только для «Обходного листа» — см. isChatEnabledFor. */} + {isChatEnabledFor(formKey) && ( + + )} ) : (
Для формы «{formKey}» режим согласования пока не настроен.
diff --git a/src/webparts/requestPortal/features/edit/EditFeature.tsx b/src/webparts/requestPortal/features/edit/EditFeature.tsx index bcab503..401d502 100644 --- a/src/webparts/requestPortal/features/edit/EditFeature.tsx +++ b/src/webparts/requestPortal/features/edit/EditFeature.tsx @@ -5,7 +5,7 @@ import { getFormComponent } from '../../forms/registry'; import { REQUEST_TYPES } from '../../data/requests'; import { emitRequestsChanged } from '../../shared/requestEvents'; import { isConfirmedStaleListId } from '../../shared/approval'; -import { RequestChat } from '../../shared/chat'; +import { RequestChat, isChatEnabledFor } from '../../shared/chat'; export interface IEditFeatureProps { context: WebPartContext; @@ -69,8 +69,11 @@ const EditFeature: React.FC = ({ context, formKey, itemId, li {/* Обсуждение — то же самое, что видят согласующие (комментарии к строке заявки). Здесь оно особенно нужно: заявку правят как раз после - возврата на доработку, и уточнить причину логично не уходя с формы. */} - + возврата на доработку, и уточнить причину логично не уходя с формы. + Пока включено только для «Обходного листа» — см. isChatEnabledFor. */} + {isChatEnabledFor(formKey) && ( + + )} ); }; diff --git a/src/webparts/requestPortal/shared/chat/chatEnabled.test.ts b/src/webparts/requestPortal/shared/chat/chatEnabled.test.ts new file mode 100644 index 0000000..15088d1 --- /dev/null +++ b/src/webparts/requestPortal/shared/chat/chatEnabled.test.ts @@ -0,0 +1,17 @@ +import { isChatEnabledFor } from './chatEnabled'; + +describe('isChatEnabledFor', () => { + it('включён для «Обходного листа»', () => { + expect(isChatEnabledFor('clearance-form')).toBe(true); + }); + + it('выключен для остальных типов заявок', () => { + expect(isChatEnabledFor('hr-vacation')).toBe(false); + expect(isChatEnabledFor('it-1c-ticket')).toBe(false); + expect(isChatEnabledFor('recruiting-hire')).toBe(false); + }); + + it('незнакомый ключ — тоже выключен, а не бросает', () => { + expect(isChatEnabledFor('что-то-новое')).toBe(false); + }); +}); diff --git a/src/webparts/requestPortal/shared/chat/chatEnabled.ts b/src/webparts/requestPortal/shared/chat/chatEnabled.ts new file mode 100644 index 0000000..b3e6b6a --- /dev/null +++ b/src/webparts/requestPortal/shared/chat/chatEnabled.ts @@ -0,0 +1,23 @@ +import { RequestTypeId } from '../../models/types'; + +/** + * Типы заявок, для которых показывается чат (shared/chat). + * + * Пилот: только «Обходной лист» (forms/Clearance, FORM_ID = 'clearance-form'). + * Остальным формам чат пока не нужен — решение сузить область до одного типа, + * а не включать сразу на все девять. + * + * Ключ — строковый литерал, а не импорт FORM_ID из forms/Clearance/model: + * shared/* не должен зависеть от forms/* (зависимость идёт в обратную сторону + * — формы берут общее из shared), а RequestTypeId — обычная строка, не enum, + * так что литерал здесь не менее надёжен, чем в LIST_TITLE_BASE + * (shared/listTitles.ts), где тем же приёмом перечислены все типы заявок. + */ +const CHAT_ENABLED_FORM_IDS: ReadonlySet = new Set(['clearance-form']); + +/** Показывать ли чат по заявке для этого типа. Проверяется ДО монтирования + * RequestChat — иначе хук useRequestChat опрашивал бы SharePoint (загрузка + + * автообновление раз в 17с) и для заявок, где чат не включён. */ +export function isChatEnabledFor(formKey: RequestTypeId): boolean { + return CHAT_ENABLED_FORM_IDS.has(formKey); +} diff --git a/src/webparts/requestPortal/shared/chat/chatFiles.service.ts b/src/webparts/requestPortal/shared/chat/chatFiles.service.ts index e7d403a..1b0e578 100644 --- a/src/webparts/requestPortal/shared/chat/chatFiles.service.ts +++ b/src/webparts/requestPortal/shared/chat/chatFiles.service.ts @@ -25,7 +25,7 @@ import { fileStamp, storedFileName } from './chatFileNames'; export const MAX_FILE_SIZE_BYTES = 10 * 1024 * 1024; /** Сколько файлов можно приложить к одному сообщению. */ -export const MAX_FILES_PER_MESSAGE = 5; +export const MAX_FILES_PER_MESSAGE = 20; // Адрес библиотеки в пределах сессии не меняется, а нужен при каждой загрузке // переписки с файлами. Ошибку НЕ кешируем: не отвечавший на холодном старте diff --git a/src/webparts/requestPortal/shared/chat/index.ts b/src/webparts/requestPortal/shared/chat/index.ts index 7e0cef3..880fa18 100644 --- a/src/webparts/requestPortal/shared/chat/index.ts +++ b/src/webparts/requestPortal/shared/chat/index.ts @@ -1,5 +1,6 @@ // Единая точка импорта чата по заявке. export { RequestChat } from './ui/RequestChat'; +export { isChatEnabledFor } from './chatEnabled'; export { useRequestChat } from './useRequestChat'; export type { IRequestChat } from './useRequestChat'; export { getChatMessages, addChatMessage } from './requestChat.service';