всякие статусы лишние убраны
This commit is contained in:
@@ -106,9 +106,19 @@ function statusOptionClassName(status: string): string {
|
||||
// Колонки: «Автор» нужен там, где заявка чужая; «Статус» — где он не следует из
|
||||
// самого раздела. В истории решений важно и то, и другое: заявка чужая, а её
|
||||
// текущий статус мог уйти дальше вашего решения.
|
||||
function columnsFor(view: ListView): { author: boolean; status: boolean } {
|
||||
//
|
||||
// 'rework' — свои заявки (автор не нужен) И все с одним статусом «Возвращена на
|
||||
// доработку», раз именно по нему раздел и отобран (см. getOwnRequestsByStatus):
|
||||
// колонка из одинаковых плашек ничего не сообщает, только шумит. Та же логика,
|
||||
// что у очередей согласования/исполнения.
|
||||
//
|
||||
// 'own:created' — статус нужен, только пока показаны ВСЕ заявки. Стоит выбрать
|
||||
// его в фильтре, и колонка вырождается в тот же столбец одинаковых плашек,
|
||||
// поэтому она зависит не от одного вида, а ещё и от фильтра.
|
||||
function columnsFor(view: ListView, statusFilter: string): { author: boolean; status: boolean } {
|
||||
if (view === 'approvals' || view === 'execution') return { author: true, status: false };
|
||||
if (view === 'rework' || view === 'own:created') return { author: false, status: true };
|
||||
if (view === 'rework') return { author: false, status: false };
|
||||
if (view === 'own:created') return { author: false, status: !statusFilter };
|
||||
return { author: true, status: true };
|
||||
}
|
||||
|
||||
@@ -142,15 +152,14 @@ function formatDate(iso: string): string {
|
||||
// строка, а не только название), поэтому строка — <tr> с onClick + tabIndex
|
||||
// (доступ с клавиатуры: Enter/Space).
|
||||
//
|
||||
// «approvals»: автор — не текущий пользователь, поэтому нужна колонка «Автор»;
|
||||
// статус не показываем — здесь все заявки по определению на согласовании.
|
||||
// «own»: автор всегда текущий пользователь, зато важен статус.
|
||||
// Набор колонок зависит от раздела и от фильтра — см. columnsFor.
|
||||
const Table: React.FC<{
|
||||
rows: IMyRequest[];
|
||||
view: ListView;
|
||||
statusFilter: string;
|
||||
onOpen: (request: IMyRequest) => void;
|
||||
}> = ({ rows, view, onOpen }) => {
|
||||
const columns = columnsFor(view);
|
||||
}> = ({ rows, view, statusFilter, onOpen }) => {
|
||||
const columns = columnsFor(view, statusFilter);
|
||||
return (
|
||||
<div className={styles.tableWrap}>
|
||||
<table className={styles.table}>
|
||||
@@ -247,11 +256,22 @@ export const RequestsTableView: React.FC<IRequestsTableViewProps> = ({
|
||||
const [totalRows, setTotalRows] = React.useState<number>(0);
|
||||
const [query, setQuery] = usePersistedQuery(view);
|
||||
const [error, setError] = React.useState<string>('');
|
||||
|
||||
// query — то, что в поле ввода (меняется сразу); debouncedQuery — то, что
|
||||
// уходит в запрос (после паузы в наборе). Всё ниже завязано на debouncedQuery,
|
||||
// иначе поиск бил бы запросом по каждой набранной букве.
|
||||
const debouncedQuery = useDebouncedQuery(query);
|
||||
|
||||
// Какой ИМЕННО таблице принадлежат лежащие в состоянии rows/totalRows.
|
||||
// Компонент один на все разделы (см. LIST_VIEWS в RequestPortal), поэтому при
|
||||
// переключении раздела его состояние ещё хранит данные ПРЕДЫДУЩЕГО, пока не
|
||||
// отработает загрузка. Без этой отметки сброс страницы ниже принимал решение
|
||||
// по чужому totalRows и сбивал страницу на первую — из-за чего запомненная
|
||||
// страница затиралась при каждом переходе по левому меню.
|
||||
// Страница в ключ НЕ входит: totalRows один на всю таблицу, а не на страницу.
|
||||
const dataKey = `${view}|${statusFilter}|${debouncedQuery.trim()}`;
|
||||
const [loadedKey, setLoadedKey] = React.useState<string>('');
|
||||
|
||||
// Смена ЗАПРОСА сбрасывает страницу: набор результатов другой, и «страница 3»
|
||||
// от прошлого запроса к нему отношения не имеет. Смену вкладки/фильтра здесь
|
||||
// НЕ обрабатываем — там страница приходит уже правильной из маршрута
|
||||
@@ -292,6 +312,9 @@ export const RequestsTableView: React.FC<IRequestsTableViewProps> = ({
|
||||
const cached = readPage(cacheKey);
|
||||
setRows(cached ? cached.rows : undefined);
|
||||
setTotalRows(cached ? cached.totalRows : 0);
|
||||
// Пока не подтвердим, что загруженное относится к ТЕКУЩЕЙ таблице, ничего
|
||||
// на основании totalRows решать нельзя — см. loadedKey ниже.
|
||||
setLoadedKey(cached ? dataKey : '');
|
||||
|
||||
const q = debouncedQuery.trim();
|
||||
|
||||
@@ -340,6 +363,9 @@ export const RequestsTableView: React.FC<IRequestsTableViewProps> = ({
|
||||
setRows(fresh.rows);
|
||||
setTotalRows(fresh.totalRows);
|
||||
}
|
||||
// Данные точно от текущей таблицы — теперь по ним можно судить о
|
||||
// количестве страниц (см. сброс страницы ниже).
|
||||
setLoadedKey(dataKey);
|
||||
setError('');
|
||||
} catch (e) {
|
||||
if (!cancelled) setError((e as Error).message);
|
||||
@@ -372,9 +398,14 @@ export const RequestsTableView: React.FC<IRequestsTableViewProps> = ({
|
||||
// из запомненной, а заявок с тех пор стало меньше (часть согласовали, и они
|
||||
// ушли из этой очереди). Показывать пустую таблицу с непустым счётчиком —
|
||||
// выглядит как поломка, поэтому возвращаемся на последнюю существующую.
|
||||
//
|
||||
// Строго ПОСЛЕ проверки loadedKey: totalRows в состоянии может быть ещё от
|
||||
// предыдущей таблицы (компонент общий), и решение по нему сбило бы страницу
|
||||
// на первую при обычном переходе по левому меню.
|
||||
React.useEffect(() => {
|
||||
if (loadedKey !== dataKey) return;
|
||||
if (rows && page > totalPages) onPageChange(totalPages);
|
||||
}, [rows, page, totalPages, onPageChange]);
|
||||
}, [loadedKey, dataKey, rows, page, totalPages, onPageChange]);
|
||||
|
||||
return (
|
||||
<section className={styles.view}>
|
||||
@@ -419,7 +450,7 @@ export const RequestsTableView: React.FC<IRequestsTableViewProps> = ({
|
||||
)}
|
||||
{!error && rows && total > 0 && (
|
||||
<>
|
||||
<Table rows={visible} view={view} onOpen={onOpen} />
|
||||
<Table rows={visible} view={view} statusFilter={statusFilter} onOpen={onOpen} />
|
||||
<Pager page={page} totalPages={totalPages} onChange={onPageChange} />
|
||||
</>
|
||||
)}
|
||||
|
||||
Reference in New Issue
Block a user