fix:передаю условия маршрута по компании в resolve и починил пагинацию /Project
Tests / frontend-test (push) Failing after 14s
Tests / frontend-test (push) Failing after 14s
This commit is contained in:
@@ -126,20 +126,42 @@ const RecruitingHireForm: React.FC<IRequestFormProps> = ({
|
||||
// data/requests.ts) → числовой RequestTypeId, нужный approval-route API.
|
||||
const requestTypeIdState = useRequestTypeId(context, requestType.id);
|
||||
const requestTypeId = requestTypeIdState.id;
|
||||
// Маршрут для этого типа заявки зависит от проекта (ByProject) — без projectId
|
||||
// бэкенд отвечает resolve: 404 «…и признака «по проекту» не найден» (поле
|
||||
// Project изначально задумывалось справочным, но выяснилось, что маршрут
|
||||
// всё-таки требует projectId, как в RecruitingSelection/TmcTransfer).
|
||||
const projectId = data.ProjectId || null;
|
||||
const matrixReady = !!editId || (!!projectId && !!requestTypeId);
|
||||
// Несколько шагов маршрута условны по компании (см. панель «Маршруты»:
|
||||
// «CompaniesJson = TOO QAZGEOMAX», «CompaniesJson = TOO CT Global», шаг с
|
||||
// сразу ДВУМЯ условиями одновременно). Companies — мультивыбор → ОДНА запись
|
||||
// fieldValues, value — имена выбранных компаний ЧЕРЕЗ ПРОБЕЛ (не JSON, не
|
||||
// массив — ResolveFieldValueDto на бэкенде принимает только строку, массив
|
||||
// даёт 400; сериализованный JSON не совпадает с условием при сравнении).
|
||||
// Плюс шаг «Роль: Планировщик» условен по названию проекта («Project не
|
||||
// содержит офис») — сюда идёт ТЕКСТ (data.Project), а не projectId (GUID),
|
||||
// который уже передаётся отдельным параметром resolve.
|
||||
const companiesFieldValue = data.Companies.map((c) => c.Name).sort().join(' ');
|
||||
const fieldValues = useMemo(() => {
|
||||
const companies = companiesFieldValue ? [{ fieldName: 'CompaniesJson', value: companiesFieldValue }] : [];
|
||||
return data.Project ? [...companies, { fieldName: 'Project', value: data.Project }] : companies;
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps -- companiesFieldValue — стабильный слепок data.Companies
|
||||
}, [companiesFieldValue, data.Project]);
|
||||
const loadMatrix = useCallback(
|
||||
() =>
|
||||
editId
|
||||
? approval
|
||||
.getMatrixForRequest(editId)
|
||||
.then((rows) => rows.filter((r) => r.phase !== APPROVAL_PHASE.execution))
|
||||
: getPlannedMatrix(context, requestTypeId as number, userEmail, approval, 'Approval'),
|
||||
[context, userEmail, approval, editId, requestTypeId]
|
||||
: getPlannedMatrix(context, requestTypeId as number, userEmail, approval, 'Approval', null, fieldValues, projectId),
|
||||
[context, userEmail, approval, editId, requestTypeId, fieldValues, projectId]
|
||||
);
|
||||
const matrix = useMatrixEditor(
|
||||
loadMatrix,
|
||||
`${userEmail}-${editId ?? 'new'}`,
|
||||
// projectId/companies в ключе → при их смене маршрут перезапрашивается.
|
||||
`${userEmail}-${editId ?? 'new'}-${projectId}-${companiesFieldValue}`,
|
||||
!readOnly,
|
||||
!!editId || !!requestTypeId,
|
||||
matrixReady,
|
||||
(login) => approval.getJobTitle(login)
|
||||
);
|
||||
|
||||
@@ -150,14 +172,14 @@ const RecruitingHireForm: React.FC<IRequestFormProps> = ({
|
||||
? approval
|
||||
.getMatrixForRequest(editId)
|
||||
.then((rows) => rows.filter((r) => r.phase === APPROVAL_PHASE.execution))
|
||||
: getPlannedMatrix(context, requestTypeId as number, userEmail, approval, 'Execution'),
|
||||
[context, userEmail, approval, editId, requestTypeId]
|
||||
: getPlannedMatrix(context, requestTypeId as number, userEmail, approval, 'Execution', null, fieldValues, projectId),
|
||||
[context, userEmail, approval, editId, requestTypeId, fieldValues, projectId]
|
||||
);
|
||||
const executors = useMatrixEditor(
|
||||
loadExecutors,
|
||||
`${userEmail}-${editId ?? 'new'}`,
|
||||
`${userEmail}-${editId ?? 'new'}-${projectId}-${companiesFieldValue}`,
|
||||
false,
|
||||
!!editId || !!requestTypeId,
|
||||
matrixReady,
|
||||
(login) => approval.getJobTitle(login)
|
||||
);
|
||||
|
||||
@@ -353,7 +375,12 @@ const RecruitingHireForm: React.FC<IRequestFormProps> = ({
|
||||
</CollapseSection>
|
||||
)}
|
||||
|
||||
<ApprovalMatrix editor={matrix} search={(q) => approval.searchUsers(q)} />
|
||||
<ApprovalMatrix
|
||||
editor={matrix}
|
||||
search={(q) => approval.searchUsers(q)}
|
||||
waiting={!matrixReady}
|
||||
waitingText="Выберите «Проект», чтобы построить маршрут согласования."
|
||||
/>
|
||||
|
||||
{!executors.loading && executors.rows.length > 0 && (
|
||||
<ApprovalMatrix
|
||||
|
||||
@@ -116,17 +116,29 @@ const RecruitingSelectionForm: React.FC<IRequestFormProps> = ({
|
||||
// Новая заявка: матрицу резолвим только когда есть и тип, и проект — иначе
|
||||
// 404 «маршрут не найден». При редактировании читаем уже записанные строки.
|
||||
const matrixReady = !!editId || (!!projectId && !!requestTypeId);
|
||||
// Условные шаги маршрута (см. [[request-portal-fieldvalues-routing]] — тот же
|
||||
// разбор на RecruitingHire): fieldName = internalName колонки. Companies —
|
||||
// мультивыбор → ОДНА запись fieldValues, value — имена выбранных компаний
|
||||
// ЧЕРЕЗ ПРОБЕЛ (не JSON, не массив — ResolveFieldValueDto на бэкенде
|
||||
// принимает только строку, массив даёт 400). ObjectProject — текст названия
|
||||
// проекта (не ObjectProjectId/GUID, тот уже уходит отдельным параметром projectId).
|
||||
const companiesFieldValue = data.Companies.map((c) => c.Name).sort().join(' ');
|
||||
const fieldValues = useMemo(() => {
|
||||
const companies = companiesFieldValue ? [{ fieldName: 'CompaniesJson', value: companiesFieldValue }] : [];
|
||||
return data.ObjectProject ? [...companies, { fieldName: 'ObjectProject', value: data.ObjectProject }] : companies;
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps -- companiesFieldValue — стабильный слепок data.Companies
|
||||
}, [companiesFieldValue, data.ObjectProject]);
|
||||
const loadMatrix = useCallback(
|
||||
() =>
|
||||
editId
|
||||
? approval.getMatrixForRequest(editId)
|
||||
: getPlannedMatrix(context, requestTypeId as number, userEmail, approval, 'Approval', null, undefined, projectId),
|
||||
[context, userEmail, approval, editId, requestTypeId, projectId]
|
||||
: getPlannedMatrix(context, requestTypeId as number, userEmail, approval, 'Approval', null, fieldValues, projectId),
|
||||
[context, userEmail, approval, editId, requestTypeId, fieldValues, projectId]
|
||||
);
|
||||
const matrix = useMatrixEditor(
|
||||
loadMatrix,
|
||||
// projectId в ключе → при смене проекта маршрут перезапрашивается.
|
||||
`${userEmail}-${editId ?? 'new'}-${projectId}`,
|
||||
// projectId/companies в ключе → при их смене маршрут перезапрашивается.
|
||||
`${userEmail}-${editId ?? 'new'}-${projectId}-${companiesFieldValue}`,
|
||||
!readOnly,
|
||||
matrixReady,
|
||||
(login) => approval.getJobTitle(login)
|
||||
|
||||
Reference in New Issue
Block a user