скрипт поправлен
This commit is contained in:
@@ -2,7 +2,7 @@
|
|||||||
"dataListTitle": "Прием на работу — согласование",
|
"dataListTitle": "Прием на работу — согласование",
|
||||||
"columns": [
|
"columns": [
|
||||||
{ "internalName": "TansuSiteApprover", "title": "Согласующий", "type": "User", "userSelectionMode": "PeopleOnly" },
|
{ "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": "Ticket", "title": "Заявка", "type": "Lookup", "lookupList": "Прием на работу — данные", "lookupShowField": "Title" },
|
||||||
{ "internalName": "Date", "title": "Дата", "type": "DateTime" },
|
{ "internalName": "Date", "title": "Дата", "type": "DateTime" },
|
||||||
{ "internalName": "Comment", "title": "Комментарий", "type": "Note" },
|
{ "internalName": "Comment", "title": "Комментарий", "type": "Note" },
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"dataListTitle": "Организация рабочего места — согласование",
|
"dataListTitle": "Организация рабочего места — согласование",
|
||||||
"columns": [
|
"columns": [
|
||||||
{ "internalName": "TansuSiteApprover", "title": "Согласующий", "type": "User", "userSelectionMode": "PeopleOnly" },
|
{ "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": "Ticket", "title": "Заявка", "type": "Lookup", "lookupList": "Организация рабочего места — данные", "lookupShowField": "Title" },
|
||||||
{ "internalName": "Date", "title": "Дата", "type": "DateTime" },
|
{ "internalName": "Date", "title": "Дата", "type": "DateTime" },
|
||||||
{ "internalName": "Comment", "title": "Комментарий", "type": "Note" },
|
{ "internalName": "Comment", "title": "Комментарий", "type": "Note" },
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
export {
|
export {
|
||||||
REQUEST_STATUS,
|
REQUEST_STATUS,
|
||||||
REQUEST_STATUS_CHOICES,
|
REQUEST_STATUS_CHOICES,
|
||||||
|
APPROVAL_ROW_STATUS_CHOICES,
|
||||||
APPROVAL_PHASE,
|
APPROVAL_PHASE,
|
||||||
APPROVAL_PHASE_CHOICES,
|
APPROVAL_PHASE_CHOICES,
|
||||||
EDITABLE_STATUSES,
|
EDITABLE_STATUSES,
|
||||||
|
|||||||
@@ -43,20 +43,40 @@ export function isEditableStatus(status: string | undefined): boolean {
|
|||||||
return !status || EDITABLE_STATUSES.indexOf(status) !== -1;
|
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[] = [
|
export const REQUEST_STATUS_CHOICES: string[] = [
|
||||||
REQUEST_STATUS.draft,
|
REQUEST_STATUS.draft,
|
||||||
REQUEST_STATUS.onApproval,
|
REQUEST_STATUS.onApproval,
|
||||||
REQUEST_STATUS.queued,
|
|
||||||
REQUEST_STATUS.approved,
|
REQUEST_STATUS.approved,
|
||||||
REQUEST_STATUS.rejected,
|
REQUEST_STATUS.rejected,
|
||||||
REQUEST_STATUS.returned,
|
REQUEST_STATUS.returned,
|
||||||
REQUEST_STATUS.onExecution,
|
|
||||||
REQUEST_STATUS.executed,
|
|
||||||
REQUEST_STATUS.execution,
|
REQUEST_STATUS.execution,
|
||||||
REQUEST_STATUS.closed,
|
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 как
|
// строки различаются колонкой Phase. Значения приходят из внешнего API как
|
||||||
|
|||||||
@@ -4,16 +4,31 @@ import * as React from 'react';
|
|||||||
// того — это просто «продолжить с того же места», а не синхронизация между
|
// того — это просто «продолжить с того же места», а не синхронизация между
|
||||||
// вкладками/устройствами. key должен быть уникальным на раздел (см. вызовы в
|
// вкладками/устройствами. key должен быть уникальным на раздел (см. вызовы в
|
||||||
// RequestsTableView/SearchView), иначе значения разных таблиц перепишут друг друга.
|
// RequestsTableView/SearchView), иначе значения разных таблиц перепишут друг друга.
|
||||||
export function usePersistedQuery(key: string): [string, (value: string) => void] {
|
function readStored(storageKey: string): string {
|
||||||
const storageKey = `rp-search-query:${key}`;
|
|
||||||
|
|
||||||
const [value, setValue] = React.useState<string>(() => {
|
|
||||||
try {
|
try {
|
||||||
return window.localStorage.getItem(storageKey) || '';
|
return window.localStorage.getItem(storageKey) || '';
|
||||||
} catch {
|
} catch {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
|
||||||
|
export function usePersistedQuery(key: string): [string, (value: string) => void] {
|
||||||
|
const storageKey = `rp-search-query:${key}`;
|
||||||
|
|
||||||
|
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(
|
const setPersisted = React.useCallback(
|
||||||
(next: string): void => {
|
(next: string): void => {
|
||||||
|
|||||||
Reference in New Issue
Block a user