feat: добавлено отображение статуса делеганта и того кто его назначил

This commit is contained in:
Тимур Городецкий
2026-08-17 12:06:09 +05:00
parent a937e33f2e
commit e6ca84827a
8 changed files with 91 additions and 156 deletions
@@ -253,13 +253,15 @@ export class ApprovalListService {
FIELDS.slaHours,
FIELDS.askOverdueReason,
`${FIELDS.approver}/Title`,
`${FIELDS.approver}/EMail`
`${FIELDS.approver}/EMail`,
`${FIELDS.delegatedBy}/Title`
)
.expand(FIELDS.approver)
.expand(FIELDS.approver, FIELDS.delegatedBy)
.orderBy(FIELDS.order, true)()) as Array<Record<string, unknown>>;
return rows.map((r, i) => {
const approver = r[FIELDS.approver] as { Title?: string; EMail?: string } | undefined;
const delegatedBy = r[FIELDS.delegatedBy] as { Title?: string } | undefined;
return {
order: (r[FIELDS.order] as number) ?? i + 1,
who: approver?.Title || '',
@@ -269,6 +271,9 @@ export class ApprovalListService {
date: this.formatDate((r[FIELDS.date] as string) || ''),
comment: (r[FIELDS.comment] as string) || '',
allowReassign: (r[FIELDS.allowReassign] as boolean) ?? false,
// Пусто у строк из штатного маршрута; заполнено только у делегатов
// (кого согласующий добавил перед собой) — матрица пометит их.
addedBy: delegatedBy?.Title || '',
phase: (r[FIELDS.phase] as string) || APPROVAL_PHASE.approval,
// Читаем, чтобы не потерять при пересохранении: writeRoute удаляет
// строки и создаёт их заново из матрицы, и без этих полей SLA,
@@ -8,6 +8,10 @@ export interface IMatrixRow {
date: string; // дата решения (дд.мм.гггг) или ''
comment: string;
allowReassign: boolean; // может ли этот согласующий добавить делеганта
// ФИО согласующего, который добавил ЭТУ строку перед собой (доп. согласующий,
// добавленный другим согласующим с правом переназначения — DelegatedBy). ''
// для обычных строк маршрута. Матрица показывает это пометкой под именем.
addedBy?: string;
phase?: string; // фаза строки: «Согласование» | «Исполнение» (см. APPROVAL_PHASE)
// Шаг идёт ОДНОВРЕМЕННО с предыдущим (у обоих одинаковый order — так
// activateNextQueued активирует их вместе). У первой строки всегда false.
@@ -141,6 +141,16 @@ export const ApprovalMatrix: React.FC<IApprovalMatrixProps> = ({
)}
<td data-label={roleLabel}>
{r.who}
{/* Доп. согласующий, добавленный другим согласующим (с правом
переназначения) — помечаем, кто его добавил. Пусто у обычных
строк маршрута. Как и комментарий — inline под именем, чтобы
не ломать rowSpan колонки «Шаг» у параллельных шагов. */}
{r.addedBy && (
<span className={styles.addedByInline}>
<span className={styles.addedByLabel}>Доп. согласующий, добавил:</span>{' '}
{r.addedBy}
</span>
)}
{/* Комментарий решения — мелким текстом под именем (не отдельной
строкой: иначе ломается rowSpan колонки «Шаг» у параллельных). */}
{r.comment && (
@@ -142,6 +142,20 @@
font-weight: 500;
}
// Пометка «доп. согласующий, добавил: …» — под именем согласующего. Золотой
// акцент, чтобы отличать таких участников от штатных строк маршрута.
.addedByInline {
display: block;
margin-top: 3px;
font-size: $fs-caption;
color: $gold-600;
line-height: 1.45;
}
.addedByLabel {
font-weight: 500;
}
// ВАЖНО: не display:flex — это сняло бы с ячейки display:table-cell, и она
// перестала бы вставать в строку рядом с соседней (кнопки уезжали на вторую
// строку). Ячейка остаётся табличной, кнопки держатся в строке через nowrap.
@@ -287,7 +301,8 @@
}
// Комментарий под именем — на всю ширину ячейки (своя строка).
.commentInline {
.commentInline,
.addedByInline {
flex-basis: 100%;
}