import * as React from 'react'; import type { WebPartContext } from '@microsoft/sp-webpart-base'; import styles from '../approve/ApproveFeature.module.scss'; import { getFormComponent } from '../../forms/registry'; import { REQUEST_TYPES } from '../../data/requests'; import { emitRequestsChanged } from '../../shared/requestEvents'; import { isConfirmedStaleListId } from '../../shared/approval'; export interface IEditFeatureProps { context: WebPartContext; /** Ключ формы (тип заявки) из URL. */ formKey: string; /** RowID редактируемой заявки из URL. */ itemId: number; /** Партиция, где лежит заявка (см. IRoute.listId) — не задана у ссылок старого формата. */ listId?: string; /** Закрыть панель (после сохранения). */ onClose: () => void; } // Фича «Редактирование»: открывает СВОЮ незавершённую заявку (черновик, // возвращённую, отклонённую) в той же выезжающей панели, где обычно показывается // просмотр. Рендерит ту же форму, что и подача, но с editId — форма подгружает // существующую запись и сохраняет в неё же. // // Отдельно от features/submit намеренно: там форма живёт в потоке «плитки → // новая заявка», а тут — точечное открытие конкретной записи по ссылке. const EditFeature: React.FC = ({ context, formKey, itemId, listId, onClose }) => { const FormComponent = getFormComponent(formKey); const requestType = REQUEST_TYPES.filter((r) => r.id === formKey)[0]; if (!FormComponent || !requestType) { return
Для формы «{formKey}» редактирование не настроено.
; } // Партиция указана (заявки нумерованные, см. shared/approval/listPartitions.ts) // и реестр ТОЧНО знает, что такого listId в серии типа нет (см. // isConfirmedStaleListId) — устаревшая/битая ссылка. Если реестр про серию // просто ничего не знает (approval-route не ответил при старте) — это НЕ // повод отказывать: listId доверяем как есть, ровно как listTargetsForType в // myRequests.service.ts. Проверяем ЗДЕСЬ, ДО монтирования формы: внутри неё // имя списка резолвится синхронно (useMemo) и там уже негде красиво показать // ошибку без риска уронить рендер всей панели — см. vacationApprovalService и // аналоги в остальных формах. if (listId && isConfirmedStaleListId(formKey, listId)) { return (
Не удалось открыть заявку: список «{listId}» не найден в реестре партиций. Ссылка могла устареть — попробуйте открыть заявку заново из списка.
); } return (
Загрузка формы…
}> { emitRequestsChanged(); onClose(); }} /> ); }; export default EditFeature;