Files
request-portal/src/webparts/requestPortal/features/edit/EditFeature.tsx
T
gorbenko.pavel 6f789f8f1c
Tests / frontend-test (push) Successful in 1m12s
Архивация списков (#9)
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/9
2026-08-19 09:07:53 +00:00

74 lines
3.9 KiB
TypeScript

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<IEditFeatureProps> = ({ context, formKey, itemId, listId, onClose }) => {
const FormComponent = getFormComponent(formKey);
const requestType = REQUEST_TYPES.filter((r) => r.id === formKey)[0];
if (!FormComponent || !requestType) {
return <div className={styles.state}>Для формы «{formKey}» редактирование не настроено.</div>;
}
// Партиция указана (заявки нумерованные, см. shared/approval/listPartitions.ts)
// и реестр ТОЧНО знает, что такого listId в серии типа нет (см.
// isConfirmedStaleListId) — устаревшая/битая ссылка. Если реестр про серию
// просто ничего не знает (approval-route не ответил при старте) — это НЕ
// повод отказывать: listId доверяем как есть, ровно как listTargetsForType в
// myRequests.service.ts. Проверяем ЗДЕСЬ, ДО монтирования формы: внутри неё
// имя списка резолвится синхронно (useMemo) и там уже негде красиво показать
// ошибку без риска уронить рендер всей панели — см. vacationApprovalService и
// аналоги в остальных формах.
if (listId && isConfirmedStaleListId(formKey, listId)) {
return (
<div className={styles.state}>
Не удалось открыть заявку: список «{listId}» не найден в реестре партиций. Ссылка могла устареть —
попробуйте открыть заявку заново из списка.
</div>
);
}
return (
<div className={styles.content}>
<React.Suspense fallback={<div className={styles.state}>Загрузка формы…</div>}>
<FormComponent
requestType={requestType}
context={context}
editId={itemId}
editListId={listId}
onCancel={onClose}
onSaved={() => {
emitRequestsChanged();
onClose();
}}
/>
</React.Suspense>
</div>
);
};
export default EditFeature;