From 27b3c8de2a9ea7cecb1130576d34847b2ac66fa3 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: Tue, 29 Sep 2026 12:41:25 +0500 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=B9=20=D1=88?= =?UTF-8?q?=D0=B0=D0=B3=20=D0=B2=20=D0=BC=D0=B0=D1=82=D1=80=D0=B8=D1=86?= =?UTF-8?q?=D0=B5=20=D0=BD=D0=B5=20=D0=BA=D0=BE=D0=BF=D0=B8=D1=80=D1=83?= =?UTF-8?q?=D0=B5=D1=82=20=D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D1=81=D0=BE=D0=B3=D0=BB=D0=B0=D1=81=D1=83=D1=8E=D1=89=D0=B5?= =?UTF-8?q?=D0=B3=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit После возврата заявки с одним согласующим каждый добавленный на доработке шаг показывался «Возвращена на доработку»: statusForNewRow копировал общий статус строк. Решения (согласовано/возвращено/отклонено/выполнено) больше не копируются — новый шаг показывается с «—». В SharePoint это не попадало: writeRoute и раньше писал всем строкам «Ждёт очереди». Co-Authored-By: Claude Opus 5.5 (1M context) --- .../shared/approval/useMatrixEditor.test.ts | 5 +++++ .../shared/approval/useMatrixEditor.ts | 14 ++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/webparts/requestPortal/shared/approval/useMatrixEditor.test.ts b/src/webparts/requestPortal/shared/approval/useMatrixEditor.test.ts index e0c548c..6bb44f1 100644 --- a/src/webparts/requestPortal/shared/approval/useMatrixEditor.test.ts +++ b/src/webparts/requestPortal/shared/approval/useMatrixEditor.test.ts @@ -165,6 +165,11 @@ describe('statusForNewRow', () => { expect(statusForNewRow(rows)).toBe('—'); }); + it('решение согласующего не копируется, даже если оно у всех одинаковое', () => { + expect(statusForNewRow([row({ status: 'Возвращена на доработку' })])).toBe('—'); + expect(statusForNewRow([row({ status: 'Согласовано' }), row({ status: 'Согласовано' })])).toBe('—'); + }); + it('пустой статус приравнивается к прочерку', () => { expect(statusForNewRow([row({ status: '' }), row({ status: '—' })])).toBe('—'); }); diff --git a/src/webparts/requestPortal/shared/approval/useMatrixEditor.ts b/src/webparts/requestPortal/shared/approval/useMatrixEditor.ts index d3f9e10..beb882e 100644 --- a/src/webparts/requestPortal/shared/approval/useMatrixEditor.ts +++ b/src/webparts/requestPortal/shared/approval/useMatrixEditor.ts @@ -3,6 +3,7 @@ import { friendlyErrorMessage } from '../diagnostics'; import { IMatrixRow } from './models/IMatrixRow'; import { ISiteUser } from './models/ISiteUser'; import { IApproverOrgInfo } from './approverOrgInfo'; +import { REQUEST_STATUS } from './models/statuses'; export interface IUseMatrixEditor { rows: IMatrixRow[]; @@ -79,9 +80,22 @@ export function withOrders(rows: IMatrixRow[]): IMatrixRow[] { // строкам общий статус, и показывать «—» рядом с «Черновик» было бы враньём. // Если статусы разные (возвращённая заявка, часть шагов уже с решениями) — // честнее оставить «—»: в какое состояние попадёт новый шаг, ещё не решено. +// +// Решение согласующего (Согласовано / Возвращена / Отклонено / Выполнено) не +// копируем никогда, даже если оно у всех строк одинаковое: у только что +// добавленного человека решения нет. Иначе после возврата заявки с одним +// согласующим каждый новый шаг показывался «Возвращена на доработку». +const DECISION_STATUSES: string[] = [ + REQUEST_STATUS.approved, + REQUEST_STATUS.returned, + REQUEST_STATUS.rejected, + REQUEST_STATUS.executed, +]; + export function statusForNewRow(rows: IMatrixRow[]): string { if (rows.length === 0) return '—'; const first = rows[0].status || '—'; + if (DECISION_STATUSES.indexOf(first) >= 0) return '—'; return rows.every((r) => (r.status || '—') === first) ? first : '—'; }