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 = ({ context, formKey, itemId, listId, onCodeLoaded }) => { const ViewComponent = getViewComponent(formKey); // Партиция указана и реестр ТОЧНО знает, что её там нет — см. тот же // комментарий в EditFeature (isConfirmedStaleListId). const partitionError = listId && isConfirmedStaleListId(formKey, listId) ? `Не удалось открыть заявку: список «${listId}» не найден в реестре партиций. Ссылка могла устареть — попробуйте открыть заявку заново из списка.` : undefined; return (
{partitionError ? (
{partitionError}
) : ViewComponent ? ( <> Загрузка…
}> {/* Доступно всем, кто может открыть заявку: автору, всем согласующим (и уже решившим, и ещё ждущим своей очереди) и исполнителям — в отличие от панели решения, которая видна только текущему шагу. Включено не для всех типов заявок — см. isChatEnabledFor. */} {isChatEnabledFor(formKey) && ( )} ) : (
Для формы «{formKey}» режим согласования пока не настроен.
)} ); }; export default ApproveFeature;