From f99732962b6f0304a7a6f9be81e2a6d0cf32e809 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A2=D0=B8=D0=BC=D1=83=D1=80=20=D0=93=D0=BE=D1=80=D0=BE?= =?UTF-8?q?=D0=B4=D0=B5=D1=86=D0=BA=D0=B8=D0=B9?= Date: Thu, 22 Oct 2026 09:23:19 +0500 Subject: [PATCH] =?UTF-8?q?fix(ct):=20=D0=A1=D0=A2=20=D0=BF=D0=BE=20=D1=81?= =?UTF-8?q?=D1=81=D1=8B=D0=BB=D0=BA=D0=B5=20=D0=BE=D1=82=D0=BA=D1=80=D1=8B?= =?UTF-8?q?=D0=B2=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=BF=D0=BE=D1=81=D0=BB?= =?UTF-8?q?=D0=B5=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=B8=D0=B7=20SP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Шаги рендерились сразу, а СТ подгружалась позже. Шаг 1 запоминал выбор при появлении — пустой, и при открытии из реестра показывал «Выберите позиции», пока не обновить страницу. Теперь до загрузки — спиннер, ошибка загрузки показывается в форме, а не только в консоли. --- .../ct/components/CtCreateForm.module.scss | 7 ++++++ .../forms/ct/components/CtCreateForm.tsx | 22 ++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/webparts/ctFormsPortal/forms/ct/components/CtCreateForm.module.scss b/src/webparts/ctFormsPortal/forms/ct/components/CtCreateForm.module.scss index b12f7a9..e052702 100644 --- a/src/webparts/ctFormsPortal/forms/ct/components/CtCreateForm.module.scss +++ b/src/webparts/ctFormsPortal/forms/ct/components/CtCreateForm.module.scss @@ -26,6 +26,13 @@ } } +.loader { + display: flex; + align-items: center; + justify-content: center; + padding: 64px 0; +} + .content { flex: 1; background: $surface; diff --git a/src/webparts/ctFormsPortal/forms/ct/components/CtCreateForm.tsx b/src/webparts/ctFormsPortal/forms/ct/components/CtCreateForm.tsx index 89e90c4..79b0509 100644 --- a/src/webparts/ctFormsPortal/forms/ct/components/CtCreateForm.tsx +++ b/src/webparts/ctFormsPortal/forms/ct/components/CtCreateForm.tsx @@ -14,6 +14,7 @@ import { buildOffersFromSpRecords } from './utils/spOffers'; import { isUserInApprovalChain } from './utils/approvalAccess'; import { CtAccess, getCtAccess, isCtAuthor } from './utils/ctAccess'; import { noOfferRecordsToSuppliers, withNoOfferSuppliers } from './utils/noOfferSuppliers'; +import { Alert, Spinner } from '@tnsu/ui-kit'; import styles from './CtCreateForm.module.scss'; import '@tnsu/ui-kit/styles.css'; @@ -35,6 +36,11 @@ const CtCreateForm: React.FC = ({ context, userDisplayName, ensureHighestStep, } = useCtForm(); + // Открыта существующая СТ — шаги не показываем, пока она не загрузится из SP. Иначе шаг 1 успевал + // появиться с пустой сессией и запоминал пустой выбор: «Выберите позиции», хотя позиции в СТ есть. + const [isCtLoading, setIsCtLoading] = useState(!!initialCtId); + const [ctLoadError, setCtLoadError] = useState(undefined); + // Режим формы — по тому, кто открыл и в каком статусе СТ (getCtAccess), а не по ctid/ctId в ссылке. // Считается на каждом рендере из данных СТ — ничего не «прилипает» в сессии: после «Перезапустить // согласование» или возврата на доработку режим меняется сам. astel-k — цены не видит никогда. @@ -192,11 +198,14 @@ const CtCreateForm: React.FC = ({ context, userDisplayName, markStepComplete(4); } } + setIsCtLoading(false); }).catch((err) => { // Раньше ошибка глоталась молча → при сбое любого запроса форма оставалась // на устаревшем статусе из session storage (напр. «Сформирована» вместо - // «На согласовании»). Теперь хотя бы видно, какой запрос упал. + // «На согласовании»). Показываем ошибку, а шаги — по данным сессии, если они есть. console.error("[CtCreateForm] загрузка СТ по ссылке упала:", err); + setCtLoadError(`Не удалось загрузить СТ: ${(err as Error).message ?? 'неизвестная ошибка'}`); + setIsCtLoading(false); }); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); @@ -256,8 +265,19 @@ const CtCreateForm: React.FC = ({ context, userDisplayName, } }; + if (isCtLoading) { + return ( +
+
+ +
+
+ ); + } + return (
+ {ctLoadError && {ctLoadError}}