fix(ct): степпер черновика открыт до шага, до которого дошла СТ

В новой вкладке (из реестра) сессии нет, и у черновика без маршрута
степпер давал кликнуть только шаг 1 — до таблицы приходилось идти через
«Сохранить и продолжить» на каждом шаге. Теперь доступные шаги — по
данным СТ из SP: позиции → 2, КП → 3, маршрут → 4.
This commit is contained in:
Тимур Городецкий
2026-10-22 09:29:51 +05:00
parent f99732962b
commit 1669c1b0e8
3 changed files with 46 additions and 3 deletions
@@ -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 { reachableStep } from './utils/reachableStep';
import { Alert, Spinner } from '@tnsu/ui-kit';
import styles from './CtCreateForm.module.scss';
import '@tnsu/ui-kit/styles.css';
@@ -191,9 +192,13 @@ const CtCreateForm: React.FC<ICtCreateFormProps> = ({ context, userDisplayName,
// Автор, СТ возвращена на доработку — шаг 4: там видно, кто вернул и что исправить.
ensureHighestStep(4);
goToStep(4);
} else if (approvalMatrix.length > 0) {
// Regular reload — make Step 4 accessible; only mark complete if CT is fully resolved
ensureHighestStep(4);
} else {
// Автор открыл свою СТ — открываем шаги, до которых она уже дошла (позиции → 2, КП → 3, маршрут → 4).
ensureHighestStep(reachableStep({
hasPositions: positions.length > 0,
hasKp: rawOffers.length > 0 || uploadedKpFiles.length > 0,
hasRoute: approvalMatrix.length > 0,
}));
if (ct.status === 'approved' || ct.status === 'rejected') {
markStepComplete(4);
}
@@ -0,0 +1,21 @@
import { reachableStep } from './reachableStep';
describe('reachableStep (до какого шага открыт степпер у СТ, загруженной из SP)', () => {
// Черновик в новой вкладке: сессии нет → степпер открывал только шаг 1, хотя позиции и КП уже есть,
// и до шага 3 приходилось идти через «Сохранить и продолжить» на каждом шаге.
it('пустая СТ — только шаг 1', () => {
expect(reachableStep({ hasPositions: false, hasKp: false, hasRoute: false })).toBe(1);
});
it('позиции выбраны — открыт шаг 2', () => {
expect(reachableStep({ hasPositions: true, hasKp: false, hasRoute: false })).toBe(2);
});
it('есть КП — открыт шаг 3', () => {
expect(reachableStep({ hasPositions: true, hasKp: true, hasRoute: false })).toBe(3);
});
it('есть маршрут согласования — открыт шаг 4', () => {
expect(reachableStep({ hasPositions: true, hasKp: true, hasRoute: true })).toBe(4);
});
});
@@ -0,0 +1,17 @@
import { FormStep } from '../types/domain';
// Что уже есть в СТ, загруженной из SP.
export interface CtProgress {
hasPositions: boolean;
hasKp: boolean;
hasRoute: boolean;
}
// До какого шага открыт степпер по данным самой СТ, а не по сессии вкладки. Без этого черновик,
// открытый в новой вкладке (из реестра), давал кликнуть только шаг 1, хотя позиции и КП уже есть.
export function reachableStep(progress: CtProgress): FormStep {
if (progress.hasRoute) return 4;
if (progress.hasKp) return 3;
if (progress.hasPositions) return 2;
return 1;
}