From a86c8d54647979b083858023551526723ee6f2dc Mon Sep 17 00:00:00 2001 From: "gorbenko.pavel" Date: Thu, 6 Aug 2026 14:28:21 +0500 Subject: [PATCH] =?UTF-8?q?=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RecruitingHire/approval/provisioning.json | 2 +- .../WorkplaceSetup/approval/provisioning.json | 2 +- .../requestPortal/shared/approval/index.ts | 1 + .../shared/approval/models/statuses.ts | 28 +++++++++++++++--- .../requestPortal/shared/usePersistedQuery.ts | 29 ++++++++++++++----- 5 files changed, 49 insertions(+), 13 deletions(-) diff --git a/src/webparts/requestPortal/forms/RecruitingHire/approval/provisioning.json b/src/webparts/requestPortal/forms/RecruitingHire/approval/provisioning.json index bc3d124..45a8b4f 100644 --- a/src/webparts/requestPortal/forms/RecruitingHire/approval/provisioning.json +++ b/src/webparts/requestPortal/forms/RecruitingHire/approval/provisioning.json @@ -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" }, diff --git a/src/webparts/requestPortal/forms/WorkplaceSetup/approval/provisioning.json b/src/webparts/requestPortal/forms/WorkplaceSetup/approval/provisioning.json index f0c7bc5..e9b0968 100644 --- a/src/webparts/requestPortal/forms/WorkplaceSetup/approval/provisioning.json +++ b/src/webparts/requestPortal/forms/WorkplaceSetup/approval/provisioning.json @@ -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" }, diff --git a/src/webparts/requestPortal/shared/approval/index.ts b/src/webparts/requestPortal/shared/approval/index.ts index 9695f26..eeee35d 100644 --- a/src/webparts/requestPortal/shared/approval/index.ts +++ b/src/webparts/requestPortal/shared/approval/index.ts @@ -2,6 +2,7 @@ export { REQUEST_STATUS, REQUEST_STATUS_CHOICES, + APPROVAL_ROW_STATUS_CHOICES, APPROVAL_PHASE, APPROVAL_PHASE_CHOICES, EDITABLE_STATUSES, diff --git a/src/webparts/requestPortal/shared/approval/models/statuses.ts b/src/webparts/requestPortal/shared/approval/models/statuses.ts index b4461f2..8aa551c 100644 --- a/src/webparts/requestPortal/shared/approval/models/statuses.ts +++ b/src/webparts/requestPortal/shared/approval/models/statuses.ts @@ -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 как diff --git a/src/webparts/requestPortal/shared/usePersistedQuery.ts b/src/webparts/requestPortal/shared/usePersistedQuery.ts index a997e3b..65dff92 100644 --- a/src/webparts/requestPortal/shared/usePersistedQuery.ts +++ b/src/webparts/requestPortal/shared/usePersistedQuery.ts @@ -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(() => { - try { - return window.localStorage.getItem(storageKey) || ''; - } catch { - return ''; - } - }); + const [value, setValue] = React.useState(() => readStored(storageKey)); + + // Компонент может продолжать жить, когда key поменялся: RequestsTableView — + // это один и тот же элемент для вкладок «На согласовании» и «Мои заявки», + // меняется только проп kind. Инициализатор useState при этом повторно НЕ + // срабатывает, поэтому без перечитывания текст из одной вкладки оставался бы + // на экране во второй и записывался уже под её ключ — выглядело бы так, будто + // ключ у них общий. + const prevKey = React.useRef(storageKey); + React.useEffect(() => { + if (prevKey.current === storageKey) return; + prevKey.current = storageKey; + setValue(readStored(storageKey)); + }, [storageKey]); const setPersisted = React.useCallback( (next: string): void => {