feat: дата выхода сотрудника в закладке «Все заявки» по организации рабочего места (#24)
Tests / frontend-test (push) Successful in 1m58s
Tests / frontend-test (push) Successful in 1m58s
Колонка «Дата выхода» (StartDate) показывается только во «Все заявки» для типа it-workplace-setup. Значение дочитывается из списка данных по партиции строки, только для видимой страницы; учтено в сигнатуре кеша страницы. Функция вынесена в startDates.service.ts, чтобы не превысить лимит строк myRequests.service.ts. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> --------- Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz> Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/24
This commit was merged in pull request #24.
This commit is contained in:
@@ -17,12 +17,14 @@ import {
|
||||
hydratePendingAuthors,
|
||||
searchOwnRequests,
|
||||
} from './myRequests.service';
|
||||
import { hydrateStartDates } from './startDates.service';
|
||||
import { IMyRequest } from './models/IMyRequest';
|
||||
import { DataTable, IDataTableColumn, IconButton } from '@tnsu/ui-kit';
|
||||
import { REQUEST_STATUS, IRequestType, StatusBadge } from '../../shared/approval';
|
||||
import { confirmAndDeleteDraft, isDeletableStatus } from '../../shared/draftDeletion';
|
||||
import { friendlyErrorMessage } from '../../shared/diagnostics';
|
||||
import { getFormComponent } from '../../forms/registry';
|
||||
import { FORM_ID as WORKPLACE_SETUP_FORM_ID } from '../../forms/WorkplaceSetup/model';
|
||||
import { onRequestsChanged } from '../../shared/requestEvents';
|
||||
import { perfScope } from '../../shared/perfTrace';
|
||||
import { useRoutedQuery } from '../../shared/usePersistedQuery';
|
||||
@@ -135,6 +137,8 @@ interface ITableColumns {
|
||||
status: boolean;
|
||||
/** Колонка «Исполнитель» — у кого заявка сейчас (см. showsAssignee). */
|
||||
assignee: boolean;
|
||||
/** Колонка «Дата выхода» — только «Все заявки» по организации рабочего места. */
|
||||
startDate?: boolean;
|
||||
/** Заголовок колонки с комментарием; undefined — колонки нет. */
|
||||
commentLabel?: string;
|
||||
}
|
||||
@@ -157,7 +161,12 @@ function showsAssignee(view: ListView, statusFilter: string): boolean {
|
||||
return true;
|
||||
}
|
||||
|
||||
function columnsFor(view: ListView, statusFilter: string): ITableColumns {
|
||||
/** Дата выхода сотрудника есть только у заявки на организацию рабочего места, и показываем её во «Все заявки». */
|
||||
function showsStartDate(view: ListView, type: IRequestType | undefined): boolean {
|
||||
return view === 'all' && type?.pageUrl === WORKPLACE_SETUP_FORM_ID;
|
||||
}
|
||||
|
||||
function columnsFor(view: ListView, statusFilter: string, startDate = false): ITableColumns {
|
||||
const assignee = showsAssignee(view, statusFilter);
|
||||
const decisionStatus = decisionStatusFor(view, statusFilter);
|
||||
const commentLabel =
|
||||
@@ -171,7 +180,7 @@ function columnsFor(view: ListView, statusFilter: string): ITableColumns {
|
||||
if (view === 'rework') return { author: false, status: false, assignee, commentLabel };
|
||||
if (view === 'own:created') return { author: false, status: !statusFilter, assignee, commentLabel };
|
||||
// 'all' — заявки всех авторов вперемешку, поэтому нужны и автор, и статус.
|
||||
if (view === 'all') return { author: true, status: true, assignee };
|
||||
if (view === 'all') return { author: true, status: true, assignee, startDate };
|
||||
// История решений: заявка чужая, поэтому нужен автор. Статус — только если он
|
||||
// не предопределён самой вкладкой («Отклонённые мной» — это всегда «Отклонено»,
|
||||
// а вот у согласованных/выполненных заявка могла уйти дальше по маршруту).
|
||||
@@ -235,6 +244,8 @@ const Table: React.FC<{
|
||||
rows: IMyRequest[];
|
||||
view: ListView;
|
||||
statusFilter: string;
|
||||
/** Показывать колонку «Дата выхода» (см. showsStartDate). */
|
||||
withStartDate: boolean;
|
||||
sort: ISortState;
|
||||
onSort: (key: SortKey) => void;
|
||||
onOpen: (request: IMyRequest) => void;
|
||||
@@ -242,8 +253,8 @@ const Table: React.FC<{
|
||||
onShowHistory: (request: IMyRequest) => void;
|
||||
/** Удалить черновик; задан только там, где в таблице бывают свои черновики. */
|
||||
onDelete?: (request: IMyRequest) => void;
|
||||
}> = ({ rows, view, statusFilter, sort, onSort, onOpen, onShowHistory, onDelete }) => {
|
||||
const cols = columnsFor(view, statusFilter);
|
||||
}> = ({ rows, view, statusFilter, withStartDate, sort, onSort, onOpen, onShowHistory, onDelete }) => {
|
||||
const cols = columnsFor(view, statusFilter, withStartDate);
|
||||
const sortable = (label: string, key: SortKey): React.ReactNode => (
|
||||
<SortableHeader label={label} sortKey={key} sort={sort} onSort={onSort} />
|
||||
);
|
||||
@@ -261,6 +272,14 @@ const Table: React.FC<{
|
||||
{ key: 'title', title: 'Название', render: (r) => r.title || r.code || `#${r.id}` },
|
||||
{ key: 'date', title: sortable('Дата', 'date'), width: '110px', render: (r) => formatDate(r.created) }
|
||||
];
|
||||
if (cols.startDate) {
|
||||
columns.push({
|
||||
key: 'startDate',
|
||||
title: 'Дата выхода',
|
||||
width: '120px',
|
||||
render: (r) => formatDate(r.startDate ?? '') || '—'
|
||||
});
|
||||
}
|
||||
if (cols.author) {
|
||||
columns.push({
|
||||
key: 'author',
|
||||
@@ -588,6 +607,7 @@ export const RequestsTableView: React.FC<IRequestsTableViewProps> = ({
|
||||
await Promise.all([
|
||||
decisionStatus ? hydrateDecisionComments(context, types, result.rows, decisionStatus) : undefined,
|
||||
showsAssignee(view, statusFilter) ? hydrateCurrentAssignees(context, types, result.rows) : undefined,
|
||||
showsStartDate(view, allRequestsType) ? hydrateStartDates(context, result.rows) : undefined,
|
||||
]);
|
||||
return result;
|
||||
};
|
||||
@@ -745,6 +765,7 @@ export const RequestsTableView: React.FC<IRequestsTableViewProps> = ({
|
||||
rows={visible}
|
||||
view={view}
|
||||
statusFilter={statusFilter}
|
||||
withStartDate={showsStartDate(view, allRequestsType)}
|
||||
sort={sort}
|
||||
onSort={refinement.onSort}
|
||||
onOpen={onOpen}
|
||||
|
||||
Reference in New Issue
Block a user