feat: Алтынай Бултурукова правит все поля заявок на подбор и приём на своём шаге
Tests / frontend-test (push) Successful in 1m14s

This commit is contained in:
Тимур Городецкий
2026-09-24 17:02:57 +05:00
parent 9b83c54491
commit 8cfb364f9c
8 changed files with 215 additions and 40 deletions
@@ -0,0 +1,20 @@
/**
* Кто на СВОЁМ АКТИВНОМ шаге согласования может править ВСЕ поля заявки
* (а не только отдельные, как расчётная группа в RecruitingHire).
*
* Пока фиксированный email одного человека (Алтынай Бултурукова, начальник
* отдела подбора и адаптации персонала) — группы SharePoint для этого ещё
* нет, как и в routeEditRights.ts. ВРЕМЕННО.
*
* Подключено только в «Заявке на подбор» и «Заявке на прием» (Реферальная
* рекомендация — нет, по решению Тимура 2026-09-24). Вложения этим правом не
* открываются — только поля.
*/
const FULL_FIELD_EDITOR_EMAILS: ReadonlySet<string> = new Set([
'a.bulturukova@tnsu.kz' // Алтынай Бултурукова
]);
/** Может ли этот email править все поля заявки на своём активном шаге (см. выше). */
export function canEditAllFields(email: string | undefined): boolean {
return !!email && FULL_FIELD_EDITOR_EMAILS.has(email.trim().toLowerCase());
}
@@ -63,6 +63,7 @@ export type { IUseMatrixEditor } from './useMatrixEditor';
export { resolveApproverOrgInfo } from './approverOrgInfo';
export type { IApproverOrgInfo } from './approverOrgInfo';
export { canEditRoute } from './routeEditRights';
export { canEditAllFields } from './fullEditRights';
export { ApprovalMatrix } from './ui/ApprovalMatrix';
export { UserPicker } from './ui/UserPicker';
export { DecisionPanel } from './ui/DecisionPanel';
@@ -26,8 +26,10 @@ interface IDecisionPanelProps {
*/
onDecided?: (status: string) => void | Promise<void>;
/** Выполнить ПЕРЕД применением решения (напр. сохранить поля, заполненные
* согласующим). Если бросит — решение не применяется, показывается ошибка. */
onBeforeDecide?: () => Promise<void>;
* согласующим). Если бросит — решение не применяется, показывается ошибка.
* decision — какое решение применяется (проверки, нужные только при
* согласовании, не должны мешать возврату/отклонению). */
onBeforeDecide?: (decision: ApproverDecision) => Promise<void>;
/** Поиск пользователей — нужен для переназначения (делегирования). Без него
* кнопка «Переназначить» не показывается. */
search?: (query: string) => Promise<ISiteUser[]>;
@@ -110,7 +112,7 @@ export const DecisionPanel: React.FC<IDecisionPanelProps> = ({
setSubmitting(true);
try {
if (onBeforeDecide) {
await onBeforeDecide();
await onBeforeDecide(decision);
}
const status = await service.decide(requestId, pendingRow.id, decision, comment.trim());
// Сначала побочные действия решения, потом «сохранено»: пока onDecided не