6f789f8f1c
Tests / frontend-test (push) Successful in 1m12s
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz> Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/9
74 lines
3.9 KiB
TypeScript
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;
|