Files
request-portal/src/webparts/requestPortal/features/approve/ApproveFeature.tsx
T
gorbenko.pavel 53535e4180
Tests / frontend-test (pull_request) Successful in 2m7s
feat: чат включён в заявках на подбор, на приём и в отдел 1С
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 14:24:33 +05:00

69 lines
3.8 KiB
TypeScript

import * as React from 'react';
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, isChatEnabledFor } from '../../shared/chat';
export interface IApproveFeatureProps {
context: WebPartContext;
/** Ключ формы (тип заявки) из URL. */
formKey: string;
/** RowID заявки из URL. */
itemId: number;
/** Партиция, где лежит заявка (см. IRoute.listId) — не задана у ссылок старого формата. */
listId?: string;
/** Уведомление о загруженном уникальном коде заявки — транзитом в ViewComponent (см. заголовок Drawer в RequestPortal). */
onCodeLoaded?: (code: string) => void;
}
// Фича «Согласование»: открывается по ссылке из потока (mode=approve&type=&id=)
// и кликом по строке любой таблицы заявок. Показывает заявку в режиме чтения
// (панель решения — внутри самой формы просмотра, она зависит от её полей).
//
// Обсуждение (чат) добавлено ЗДЕСЬ, а не в девяти <Форма>View.tsx: оно ничего не
// знает о полях конкретной формы, а эта фича — единственный вход в просмотр
// заявки, общий для всех типов. Стоит вне .rp-print-root формы, поэтому в
// печатную версию заявки переписка не попадает.
const ApproveFeature: React.FC<IApproveFeatureProps> = ({ context, formKey, itemId, listId, onCodeLoaded }) => {
const ViewComponent = getViewComponent(formKey);
// Партиция указана и реестр ТОЧНО знает, что её там нет — см. тот же
// комментарий в EditFeature (isConfirmedStaleListId).
const partitionError =
listId && isConfirmedStaleListId(formKey, listId)
? `Не удалось открыть заявку: список «${listId}» не найден в реестре партиций. Ссылка могла устареть — попробуйте открыть заявку заново из списка.`
: undefined;
return (
<div className={styles.content}>
{partitionError ? (
<div className={styles.state}>{partitionError}</div>
) : ViewComponent ? (
<>
<React.Suspense fallback={<div className={styles.state}>Загрузка…</div>}>
<ViewComponent
context={context}
itemId={itemId}
formKey={formKey}
listId={listId}
onCodeLoaded={onCodeLoaded}
/>
</React.Suspense>
{/* Доступно всем, кто может открыть заявку: автору, всем согласующим
(и уже решившим, и ещё ждущим своей очереди) и исполнителям —
в отличие от панели решения, которая видна только текущему шагу.
Включено не для всех типов заявок — см. isChatEnabledFor. */}
{isChatEnabledFor(formKey) && (
<RequestChat context={context} formKey={formKey} itemId={itemId} listId={listId} />
)}
</>
) : (
<div className={styles.state}>Для формы «{formKey}» режим согласования пока не настроен.</div>
)}
</div>
);
};
export default ApproveFeature;