Подтягивать подразделение рекомендателя из профиля SharePoint
ReferrerDepartment теперь заполняется из SPS-Department при выборе рекомендателя (approval.getProfileFields — тот же метод, что уже использует «Обходной лист» для Department), а не вводится вручную. Поле стало read-only, как Department в Clearance. VacancyDepartment (подразделение вакансии, куда рекомендуют) не тронут — это отдельное поле, не связанное с профилем рекомендателя. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -28,8 +28,14 @@
|
|||||||
reloadKey матрицы включает `data.Referrer`. Рекомендацию согласуют по линии
|
reloadKey матрицы включает `data.Referrer`. Рекомендацию согласуют по линии
|
||||||
рекомендателя — кандидата в тенанте нет, резолвить условия по нему нечем.
|
рекомендателя — кандидата в тенанте нет, резолвить условия по нему нечем.
|
||||||
- **Автоподстановка при создании:** рекомендатель = текущий пользователь, его
|
- **Автоподстановка при создании:** рекомендатель = текущий пользователь, его
|
||||||
должность из профиля (`SPS-JobTitle` через `approval.getJobTitle`), дата подачи =
|
должность и подразделение — из профиля SharePoint (`SPS-JobTitle`/`SPS-Department`
|
||||||
сегодня. При выборе другого рекомендателя должность подтягивается заново.
|
через `approval.getProfileFields`, как в «Обходном листе»), дата подачи =
|
||||||
|
сегодня. При выборе другого рекомендателя должность и подразделение
|
||||||
|
подтягиваются заново. **Подразделение — только для чтения** (в отличие от
|
||||||
|
должности не редактируется вручную: не участвует в условиях маршрута, поэтому
|
||||||
|
риска сломать согласование нет, и расхождение с профилем не нужно).
|
||||||
|
«Подразделение / Объект» вакансии (`VacancyDepartment`) — отдельное поле,
|
||||||
|
свободный текст: это подразделение, КУДА рекомендуют, а не рекомендателя.
|
||||||
- **Условное поле:** «Откуда знаете» = «Другое» → появляется обязательное
|
- **Условное поле:** «Откуда знаете» = «Другое» → появляется обязательное
|
||||||
уточнение `AcquaintanceSourceOther`. При смене варианта уточнение очищается,
|
уточнение `AcquaintanceSourceOther`. При смене варианта уточнение очищается,
|
||||||
и в список пишется `null` (см. `buildItem` в `submit.ts`).
|
и в список пишется `null` (см. `buildItem` в `submit.ts`).
|
||||||
|
|||||||
@@ -94,8 +94,9 @@ const ReferralForm: React.FC<IRequestFormProps> = ({
|
|||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, [editId, editListId]);
|
}, [editId, editListId]);
|
||||||
|
|
||||||
// Новая заявка: рекомендатель — сам подающий (подставляем его и должность из
|
// Новая заявка: рекомендатель — сам подающий (подставляем его, должность и
|
||||||
// профиля), дата подачи — сегодня.
|
// подразделение из профиля SharePoint — SPS-JobTitle/SPS-Department, как в
|
||||||
|
// «Обходном листе»), дата подачи — сегодня.
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (editId) {
|
if (editId) {
|
||||||
return;
|
return;
|
||||||
@@ -108,10 +109,14 @@ const ReferralForm: React.FC<IRequestFormProps> = ({
|
|||||||
SubmitDate: prev.SubmitDate || todayIso()
|
SubmitDate: prev.SubmitDate || todayIso()
|
||||||
}));
|
}));
|
||||||
approval
|
approval
|
||||||
.getJobTitle(user.loginName)
|
.getProfileFields(user.loginName)
|
||||||
.then((title) => {
|
.then((profile) => {
|
||||||
if (alive && title) {
|
if (alive) {
|
||||||
setData((prev) => ({ ...prev, ReferrerPosition: prev.ReferrerPosition || title }));
|
setData((prev) => ({
|
||||||
|
...prev,
|
||||||
|
ReferrerPosition: prev.ReferrerPosition || profile.jobTitle,
|
||||||
|
ReferrerDepartment: prev.ReferrerDepartment || profile.department
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch(() => undefined);
|
.catch(() => undefined);
|
||||||
@@ -121,15 +126,27 @@ const ReferralForm: React.FC<IRequestFormProps> = ({
|
|||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, [editId]);
|
}, [editId]);
|
||||||
|
|
||||||
// Выбор другого рекомендателя подтягивает его должность.
|
// Выбор другого рекомендателя подтягивает его должность и подразделение из
|
||||||
|
// профиля. Подразделение поле только для чтения (см. ReferrerSection) — в
|
||||||
|
// отличие от должности его нельзя поправить вручную, если профиль не
|
||||||
|
// синхронизирован: колонка не участвует в условиях маршрута, риска сломать
|
||||||
|
// согласование нет.
|
||||||
const handleReferrerChange = (login: string): void => {
|
const handleReferrerChange = (login: string): void => {
|
||||||
setData((prev) => ({ ...prev, Referrer: login }));
|
// Подразделение — только для чтения, поэтому сбрасываем сразу (а не ждём
|
||||||
|
// ответа профиля): иначе до резолва в поле виден отдел ПРЕЖНЕГО рекомендателя.
|
||||||
|
setData((prev) => ({ ...prev, Referrer: login, ReferrerDepartment: '' }));
|
||||||
if (!login) {
|
if (!login) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
approval
|
approval
|
||||||
.getJobTitle(login)
|
.getProfileFields(login)
|
||||||
.then((title) => setData((prev) => ({ ...prev, ReferrerPosition: title || prev.ReferrerPosition })))
|
.then((profile) =>
|
||||||
|
setData((prev) => ({
|
||||||
|
...prev,
|
||||||
|
ReferrerPosition: profile.jobTitle || prev.ReferrerPosition,
|
||||||
|
ReferrerDepartment: profile.department
|
||||||
|
}))
|
||||||
|
)
|
||||||
.catch(() => undefined);
|
.catch(() => undefined);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,12 @@ import * as React from 'react';
|
|||||||
import { CollapseSection, FormField, TextInput, PhoneInput, PeopleField } from '../../../shared/ui';
|
import { CollapseSection, FormField, TextInput, PhoneInput, PeopleField } from '../../../shared/ui';
|
||||||
import { ISectionProps, REFERRER_PLACEHOLDER } from '../model';
|
import { ISectionProps, REFERRER_PLACEHOLDER } from '../model';
|
||||||
|
|
||||||
|
// Подразделение подтягивается автоматически при выборе рекомендателя (см.
|
||||||
|
// ReferralForm.handleReferrerChange — SharePoint User Profile, SPS-Department) —
|
||||||
|
// свободный ввод здесь намеренно убран, чтобы не расходиться с профилем (как в
|
||||||
|
// «Обходном листе»).
|
||||||
|
const NOOP = (): void => undefined;
|
||||||
|
|
||||||
/** Секция 1: кто рекомендует — дата подачи, сам рекомендатель и его контакты. */
|
/** Секция 1: кто рекомендует — дата подачи, сам рекомендатель и его контакты. */
|
||||||
export const ReferrerSection: React.FC<ISectionProps> = ({ data, set, context, onReferrerChange }) => (
|
export const ReferrerSection: React.FC<ISectionProps> = ({ data, set, context, onReferrerChange }) => (
|
||||||
<CollapseSection title="Рекомендатель" icon="people">
|
<CollapseSection title="Рекомендатель" icon="people">
|
||||||
@@ -27,7 +33,9 @@ export const ReferrerSection: React.FC<ISectionProps> = ({ data, set, context, o
|
|||||||
<TextInput
|
<TextInput
|
||||||
id="ReferrerDepartment"
|
id="ReferrerDepartment"
|
||||||
value={data.ReferrerDepartment}
|
value={data.ReferrerDepartment}
|
||||||
onChange={(v) => set('ReferrerDepartment', v)}
|
onChange={NOOP}
|
||||||
|
readOnly
|
||||||
|
placeholder="Подставится автоматически по выбранному сотруднику"
|
||||||
/>
|
/>
|
||||||
</FormField>
|
</FormField>
|
||||||
<FormField label="Контактный телефон" htmlFor="ReferrerPhone" required>
|
<FormField label="Контактный телефон" htmlFor="ReferrerPhone" required>
|
||||||
|
|||||||
Reference in New Issue
Block a user