feat: добавлено отображение статуса делеганта и того кто его назначил
This commit is contained in:
@@ -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%;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user