diff --git a/src/webparts/requestPortal/forms/Vacation/VacationForm.tsx b/src/webparts/requestPortal/forms/Vacation/VacationForm.tsx index a23479c..d317554 100644 --- a/src/webparts/requestPortal/forms/Vacation/VacationForm.tsx +++ b/src/webparts/requestPortal/forms/Vacation/VacationForm.tsx @@ -48,7 +48,7 @@ import { } from '../../shared/listTitles'; import { FORM_ID, IFormData, EMPTY_DATA, SetField, NOTICE_TITLE, NOTICE_ITEMS } from './model'; import { formIssues } from './validation'; -import { organizationRouteFieldValues } from '../../shared/dictionary/organizationRouteFields'; +import { vacationRouteFieldValues } from './routeFields'; import { saveVacationRequest, vacationApprovalService } from './submit'; import { loadVacationRequest } from './load'; import { RequestSection } from './sections/RequestSection'; @@ -175,11 +175,14 @@ const VacationForm: React.FC = ({ // маршрут читается из уже записанных строк, чтобы не затереть правки инициатора. // // Кадровый сотрудник и исполнитель в маршруте зависят от организации - // сотрудника (условия «Organization содержит …» в админке) — см. - // shared/dictionary/organizationRouteFields.ts. Организация приходит позже + // сотрудника и проекта (условия «Organization содержит …», «Project + // содержит …» в админке) — см. routeFields.ts. Организация приходит позже // выбора сотрудника (Employee/ByEmail), поэтому она в ключе перезагрузки: // маршрут пересчитается, когда придёт, а не останется рассчитанным без условий. - const routeFieldValues = useMemo(() => organizationRouteFieldValues(data.Organization), [data.Organization]); + const routeFieldValues = useMemo( + () => vacationRouteFieldValues({ Organization: data.Organization, Project: data.Project }), + [data.Organization, data.Project] + ); const routeOrgKey = routeFieldValues.map((f) => f.value).join('|'); const loadMatrix = useCallback( () => diff --git a/src/webparts/requestPortal/forms/Vacation/model.ts b/src/webparts/requestPortal/forms/Vacation/model.ts index 11b49c5..becb64b 100644 --- a/src/webparts/requestPortal/forms/Vacation/model.ts +++ b/src/webparts/requestPortal/forms/Vacation/model.ts @@ -40,7 +40,7 @@ export interface IFormData { Department: string; /** Id отдела из справочника; '' — если введён вручную без выбора из списка. */ DepartmentId: string; - /** Проект (справочник /Project, см. shared/dictionary/ProjectPicker) — необязательное, справочное. */ + /** Проект (справочник /Project, см. shared/dictionary/ProjectPicker) — обязательный, от него зависит кадровик в маршруте. */ Project: string; /** oid проекта ('' — если введён вручную без выбора из списка). */ ProjectId: string; diff --git a/src/webparts/requestPortal/forms/Vacation/routeFields.ts b/src/webparts/requestPortal/forms/Vacation/routeFields.ts new file mode 100644 index 0000000..0bdfd04 --- /dev/null +++ b/src/webparts/requestPortal/forms/Vacation/routeFields.ts @@ -0,0 +1,20 @@ +import type { IResolveFieldValue } from '../../shared/approval/models/IApprovalRouteApi'; +import { organizationRouteFieldValues } from '../../shared/dictionary/organizationRouteFields'; +import { IFormData } from './model'; + +/** Поля заявки, от которых зависит маршрут отпуска (условия шагов в админке маршрута #9). */ +export type VacationRouteInput = Pick; + +/** + * Значения полей для условных шагов маршрута (fieldValues при resolve). + * + * Кадровик на шаге 1 зависит и от компании, и от проекта: в офисе — кадровик + * компании («Organization содержит TANSU И Project содержит Офис TANSU»), на + * объекте — кадровик объекта («Project содержит Топар»). Проект — название из + * справочника /Project, как его показывает поле формы. + */ +export function vacationRouteFieldValues(input: VacationRouteInput): IResolveFieldValue[] { + const fieldValues = organizationRouteFieldValues(input.Organization); + const project = input.Project.trim(); + return project ? [...fieldValues, { fieldName: 'Project', value: project }] : fieldValues; +} diff --git a/src/webparts/requestPortal/forms/Vacation/sections/RequestSection.tsx b/src/webparts/requestPortal/forms/Vacation/sections/RequestSection.tsx index 6023068..547b989 100644 --- a/src/webparts/requestPortal/forms/Vacation/sections/RequestSection.tsx +++ b/src/webparts/requestPortal/forms/Vacation/sections/RequestSection.tsx @@ -20,7 +20,7 @@ export const RequestSection: React.FC = ({ data, set, context, on /> - + = [ data.Employee ? undefined : { field: 'Employee', label: 'Сотрудник' }, + projectIssue(data), startDateIssue(data), daysCountIssue(data) ];