53535e4180
Tests / frontend-test (pull_request) Successful in 2m7s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
69 lines
3.8 KiB
TypeScript
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;
|