добавлен комментарий
This commit is contained in:
@@ -8,8 +8,8 @@ import {
|
||||
getLinkedTypes,
|
||||
getOwnRequests,
|
||||
getOwnRequestsByStatus,
|
||||
hydrateDecisionComments,
|
||||
hydratePendingAuthors,
|
||||
hydrateReturnComments,
|
||||
searchOwnRequests,
|
||||
} from './myRequests.service';
|
||||
import { IMyRequest } from './models/IMyRequest';
|
||||
@@ -117,26 +117,45 @@ function statusOptionClassName(status: string): string {
|
||||
// его в фильтре, и колонка вырождается в тот же столбец одинаковых плашек,
|
||||
// поэтому она зависит не от одного вида, а ещё и от фильтра.
|
||||
//
|
||||
// «Причина возврата» — там, где показаны ТОЛЬКО возвращённые заявки: для них
|
||||
// это главное, ради чего в список и заходят (что именно просят исправить).
|
||||
// Статус решения, ОБЩИЙ для всех строк раздела, — если он есть, показывать его
|
||||
// колонкой незачем (столбец одинаковых плашек), зато полезен комментарий
|
||||
// согласующего: почему вернули или почему отклонили. Именно за этим в такие
|
||||
// списки и заходят.
|
||||
function decisionStatusFor(view: ListView, statusFilter: string): string | undefined {
|
||||
if (view === 'rework') return REQUEST_STATUS.returned;
|
||||
if (view === 'own:rejected') return REQUEST_STATUS.rejected;
|
||||
if (
|
||||
view === 'own:created' &&
|
||||
(statusFilter === REQUEST_STATUS.returned || statusFilter === REQUEST_STATUS.rejected)
|
||||
) {
|
||||
return statusFilter;
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
interface ITableColumns {
|
||||
author: boolean;
|
||||
status: boolean;
|
||||
returnComment: boolean;
|
||||
/** Заголовок колонки с комментарием; undefined — колонки нет. */
|
||||
commentLabel?: string;
|
||||
}
|
||||
|
||||
function columnsFor(view: ListView, statusFilter: string): ITableColumns {
|
||||
const returnedOnly =
|
||||
view === 'rework' || (view === 'own:created' && statusFilter === REQUEST_STATUS.returned);
|
||||
const decisionStatus = decisionStatusFor(view, statusFilter);
|
||||
const commentLabel =
|
||||
decisionStatus === REQUEST_STATUS.rejected
|
||||
? 'Причина отклонения'
|
||||
: decisionStatus === REQUEST_STATUS.returned
|
||||
? 'Причина возврата'
|
||||
: undefined;
|
||||
|
||||
if (view === 'approvals' || view === 'execution') {
|
||||
return { author: true, status: false, returnComment: false };
|
||||
}
|
||||
if (view === 'rework') return { author: false, status: false, returnComment: true };
|
||||
if (view === 'own:created') {
|
||||
return { author: false, status: !statusFilter, returnComment: returnedOnly };
|
||||
}
|
||||
return { author: true, status: true, returnComment: false };
|
||||
if (view === 'approvals' || view === 'execution') return { author: true, status: false };
|
||||
if (view === 'rework') return { author: false, status: false, commentLabel };
|
||||
if (view === 'own:created') return { author: false, status: !statusFilter, commentLabel };
|
||||
// История решений: заявка чужая, поэтому нужен автор. Статус — только если он
|
||||
// не предопределён самой вкладкой («Отклонённые мной» — это всегда «Отклонено»,
|
||||
// а вот у согласованных/выполненных заявка могла уйти дальше по маршруту).
|
||||
return { author: true, status: !decisionStatus, commentLabel };
|
||||
}
|
||||
|
||||
export interface IRequestsTableViewProps {
|
||||
@@ -188,7 +207,7 @@ const Table: React.FC<{
|
||||
<th className={styles.colDate}>Дата</th>
|
||||
{columns.author && <th className={styles.colAuthor}>Автор</th>}
|
||||
{columns.status && <th className={styles.colStatus}>Статус</th>}
|
||||
{columns.returnComment && <th className={styles.colComment}>Причина возврата</th>}
|
||||
{columns.commentLabel && <th className={styles.colComment}>{columns.commentLabel}</th>}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -221,9 +240,9 @@ const Table: React.FC<{
|
||||
{r.status ? <StatusBadge status={r.status} size="sm" /> : '—'}
|
||||
</td>
|
||||
)}
|
||||
{columns.returnComment && (
|
||||
{columns.commentLabel && (
|
||||
<td className={styles.colComment}>
|
||||
{r.returnComment || <span className={styles.commentEmpty}>Без комментария</span>}
|
||||
{r.decisionComment || <span className={styles.commentEmpty}>Без комментария</span>}
|
||||
</td>
|
||||
)}
|
||||
</tr>
|
||||
@@ -341,18 +360,12 @@ export const RequestsTableView: React.FC<IRequestsTableViewProps> = ({
|
||||
|
||||
const q = debouncedQuery.trim();
|
||||
|
||||
const fetchPage = async (): Promise<IPage> => {
|
||||
const fetchRows = async (): Promise<IPage> => {
|
||||
// «Доработка» — тот же список, что «Инициированные», просто со статусом,
|
||||
// зашитым в раздел, а не выбранным в фильтре.
|
||||
if (view === 'rework' || (view === 'own:created' && statusFilter)) {
|
||||
const status = view === 'rework' ? REQUEST_STATUS.returned : statusFilter;
|
||||
const result = await getOwnRequestsByStatus(context, types, status, page, debouncedQuery);
|
||||
// Причина возврата живёт в строке маршрута — дочитываем только для
|
||||
// видимой страницы и только там, где колонка показывается.
|
||||
if (status === REQUEST_STATUS.returned) {
|
||||
await hydrateReturnComments(context, types, result.rows);
|
||||
}
|
||||
return result;
|
||||
return getOwnRequestsByStatus(context, types, status, page, debouncedQuery);
|
||||
}
|
||||
|
||||
if (view === 'own:created') {
|
||||
@@ -378,6 +391,19 @@ export const RequestsTableView: React.FC<IRequestsTableViewProps> = ({
|
||||
return { rows: pageRows, totalRows: filtered.length };
|
||||
};
|
||||
|
||||
// Комментарий к решению дочитываем ОДНИМ местом на все ветки: «Доработка» и
|
||||
// «Отклонённые мной» приходят разными путями (по автору и по строкам
|
||||
// маршрута соответственно), а колонка у них одинаковая по смыслу. И только
|
||||
// для видимой страницы — как и автор в hydratePendingAuthors.
|
||||
const fetchPage = async (): Promise<IPage> => {
|
||||
const result = await fetchRows();
|
||||
const decisionStatus = decisionStatusFor(view, statusFilter);
|
||||
if (decisionStatus) {
|
||||
await hydrateDecisionComments(context, types, result.rows, decisionStatus);
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
const load = async (): Promise<void> => {
|
||||
try {
|
||||
const fresh = await fetchPage();
|
||||
|
||||
Reference in New Issue
Block a user