Search requests #2

Merged
gorbenko.pavel merged 11 commits from SearchRequests into main 2026-08-06 09:59:07 +00:00
5 changed files with 49 additions and 13 deletions
Showing only changes of commit a86c8d5464 - Show all commits
@@ -2,7 +2,7 @@
"dataListTitle": "Прием на работу — согласование",
"columns": [
{ "internalName": "TansuSiteApprover", "title": "Согласующий", "type": "User", "userSelectionMode": "PeopleOnly" },
{ "internalName": "RequestStatus", "title": "Статус", "type": "Choice", "choices": ["Черновик", "На согласовании", "Ждёт очереди", "Согласовано", "Отклонено", "Возвращена на доработку", "На исполнении", "Выполнено", "Выполнение", "Закрыта"] },
{ "internalName": "RequestStatus", "title": "Статус", "type": "Choice", "choices": ["Черновик", "Ждёт очереди", "На согласовании", "На исполнении", "Согласовано", "Выполнено", "Отклонено", "Возвращена на доработку"] },
{ "internalName": "Ticket", "title": "Заявка", "type": "Lookup", "lookupList": "Прием на работу — данные", "lookupShowField": "Title" },
{ "internalName": "Date", "title": "Дата", "type": "DateTime" },
{ "internalName": "Comment", "title": "Комментарий", "type": "Note" },
@@ -2,7 +2,7 @@
"dataListTitle": "Организация рабочего места — согласование",
"columns": [
{ "internalName": "TansuSiteApprover", "title": "Согласующий", "type": "User", "userSelectionMode": "PeopleOnly" },
{ "internalName": "RequestStatus", "title": "Статус", "type": "Choice", "choices": ["Черновик", "На согласовании", "Ждёт очереди", "Согласовано", "Отклонено", "Возвращена на доработку", "На исполнении", "Выполнено", "Выполнение", "Закрыта"] },
{ "internalName": "RequestStatus", "title": "Статус", "type": "Choice", "choices": ["Черновик", "Ждёт очереди", "На согласовании", "На исполнении", "Согласовано", "Выполнено", "Отклонено", "Возвращена на доработку"] },
{ "internalName": "Ticket", "title": "Заявка", "type": "Lookup", "lookupList": "Организация рабочего места — данные", "lookupShowField": "Title" },
{ "internalName": "Date", "title": "Дата", "type": "DateTime" },
{ "internalName": "Comment", "title": "Комментарий", "type": "Note" },
@@ -2,6 +2,7 @@
export {
REQUEST_STATUS,
REQUEST_STATUS_CHOICES,
APPROVAL_ROW_STATUS_CHOICES,
APPROVAL_PHASE,
APPROVAL_PHASE_CHOICES,
EDITABLE_STATUSES,
@@ -43,20 +43,40 @@ export function isEditableStatus(status: string | undefined): boolean {
return !status || EDITABLE_STATUSES.indexOf(status) !== -1;
}
// Полный набор значений для Choice-колонки Status при провижининге.
// Наборов значений ДВА, и они не совпадают — это разные сущности:
//
// 1) статус ЗАЯВКИ — колонка Status в списке «… — данные». Пишется формой
// (Черновик/На согласовании) и computeRequestStatus после каждого решения.
// «Ждёт очереди»/«На исполнении»/«Выполнено» здесь не бывают: это состояния
// отдельного шага маршрута, а не заявки целиком.
//
// 2) статус СТРОКИ МАРШРУТА — колонка RequestStatus в списке «… — согласование».
// Пишется createSteps/activateNextQueued/setDecision. «Выполнение»/«Закрыта»
// здесь не бывают: это агрегатные состояния заявки, у отдельного шага
// смысла не имеют.
//
// Держать их в синхроне с forms/*/provisioning.json и forms/*/approval/provisioning.json.
export const REQUEST_STATUS_CHOICES: string[] = [
REQUEST_STATUS.draft,
REQUEST_STATUS.onApproval,
REQUEST_STATUS.queued,
REQUEST_STATUS.approved,
REQUEST_STATUS.rejected,
REQUEST_STATUS.returned,
REQUEST_STATUS.onExecution,
REQUEST_STATUS.executed,
REQUEST_STATUS.execution,
REQUEST_STATUS.closed,
];
export const APPROVAL_ROW_STATUS_CHOICES: string[] = [
REQUEST_STATUS.draft,
REQUEST_STATUS.queued,
REQUEST_STATUS.onApproval,
REQUEST_STATUS.onExecution,
REQUEST_STATUS.approved,
REQUEST_STATUS.executed,
REQUEST_STATUS.rejected,
REQUEST_STATUS.returned,
];
// Фаза строки в списке маршрута: согласование (кто одобряет) и исполнение
// (кто выполняет после согласования). Обе фазы живут в одном списке «— согласование»,
// строки различаются колонкой Phase. Значения приходят из внешнего API как
@@ -4,16 +4,31 @@ import * as React from 'react';
// того — это просто «продолжить с того же места», а не синхронизация между
// вкладками/устройствами. key должен быть уникальным на раздел (см. вызовы в
// RequestsTableView/SearchView), иначе значения разных таблиц перепишут друг друга.
function readStored(storageKey: string): string {
try {
return window.localStorage.getItem(storageKey) || '';
} catch {
return '';
}
}
export function usePersistedQuery(key: string): [string, (value: string) => void] {
const storageKey = `rp-search-query:${key}`;
const [value, setValue] = React.useState<string>(() => {
try {
return window.localStorage.getItem(storageKey) || '';
} catch {
return '';
}
});
const [value, setValue] = React.useState<string>(() => readStored(storageKey));
// Компонент может продолжать жить, когда key поменялся: RequestsTableView —
// это один и тот же элемент для вкладок «На согласовании» и «Мои заявки»,
// меняется только проп kind. Инициализатор useState при этом повторно НЕ
// срабатывает, поэтому без перечитывания текст из одной вкладки оставался бы
// на экране во второй и записывался уже под её ключ — выглядело бы так, будто
// ключ у них общий.
const prevKey = React.useRef<string>(storageKey);
React.useEffect(() => {
if (prevKey.current === storageKey) return;
prevKey.current = storageKey;
setValue(readStored(storageKey));
}, [storageKey]);
const setPersisted = React.useCallback(
(next: string): void => {