Обходной лист (#7)
Tests / frontend-test (push) Successful in 1m16s

Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/7
This commit was merged in pull request #7.
This commit is contained in:
2026-08-17 05:43:38 +00:00
parent a937e33f2e
commit 364835eaf7
47 changed files with 1962 additions and 359 deletions
@@ -0,0 +1,39 @@
import { WebPartContext } from '@microsoft/sp-webpart-base';
/**
* ОТЛАДОЧНАЯ подмена «текущего пользователя»: портал ведёт себя так, будто им
* пользуется указанный сотрудник. Нужна, чтобы проверять маршруты и права
* согласующего (например, «карту СКУД правит начальник КДП» в обходном листе),
* не выпрашивая учётку у каждого участника маршрута.
*
* Значение задаётся в свойствах веб-части (property pane, см.
* RequestPortalWebPart.getPropertyPaneConfiguration) и живёт на уровне модуля —
* иначе его пришлось бы протаскивать пропсами через всё дерево до каждой формы.
*
* ЧТО ЭТО МЕНЯЕТ: только то, ЧЕЙ email портал отправляет как инициатора при
* планировании маршрута и по какому пользователю фильтрует «свои» заявки и
* очередь согласования.
*
* ЧЕГО ЭТО НЕ МЕНЯЕТ: прав доступа. Запись в SharePoint по-прежнему идёт под
* реальной учёткой (Author/Editor в списках — настоящий пользователь), токен к
* approval-route API тоже настоящий. То есть подмена не даёт увидеть то, к чему
* нет доступа, но ПОЗВОЛЯЕТ принять решение за чужой шаг согласования — поэтому
* на бою поле должно быть пустым (см. предупреждающую полосу в RequestPortal).
*/
let impersonatedEmail = '';
/** Вызывается веб-частью на каждый render — свойство могли поменять в панели. */
export function setImpersonatedEmail(email: string | undefined): void {
impersonatedEmail = (email || '').trim();
}
/** Заданная подмена ('' — подмены нет). Для предупреждающей полосы в интерфейсе. */
export function getImpersonatedEmail(): string {
return impersonatedEmail;
}
/** Email, под которым портал работает: подменённый, если задан, иначе — из токена. */
export function effectiveUserEmail(context: WebPartContext): string {
return impersonatedEmail || context.pageContext.user.email || '';
}