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';