Feat/selection title reports access (#21)
Tests / frontend-test (push) Successful in 1m19s

Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/21
This commit was merged in pull request #21.
This commit is contained in:
2026-09-25 04:43:37 +00:00
parent ab21683377
commit ec94de3c1b
10 changed files with 144 additions and 8372 deletions
@@ -73,18 +73,31 @@ const RequestPortal: React.FC<IRequestPortalProps> = ({ hasTeamsContext, context
const [mobileNavOpen, setMobileNavOpen] = React.useState<boolean>(false);
const [navCounts, setNavCounts] = React.useState<INavCounts | undefined>(undefined);
// Раздел «Отчёты» — точечный список почт, пока в SharePoint нет группы HR
// (см. reportsAccess.ts). Пересчитывается на каждый рендер намеренно: сам
// hasReportsAccess — синхронная проверка без сети, а input (effectiveUserEmail)
// меняется только по подмене личности в property pane, что и так вызывает
// ререндер всей веб-части.
const canSeeReports = hasReportsAccess(context);
// Раздел «Отчёты» — группа «Отчеты по заявкам» + администраторы (см.
// reportsAccess.ts). undefined — ответ ещё не пришёл. Перезапрашиваем при
// смене подменённой личности.
const [canSeeReports, setCanSeeReports] = React.useState<boolean | undefined>(undefined);
React.useEffect(() => {
let cancelled = false;
setCanSeeReports(undefined);
hasReportsAccess(context)
.then((v) => {
if (!cancelled) setCanSeeReports(v);
})
.catch(() => {
if (!cancelled) setCanSeeReports(false);
});
return () => {
cancelled = true;
};
}, [context, impersonatedEmail]);
// Прямой переход по ссылке (?rpnav=reports) в обход бокового меню — тот же
// раздел, что скрыт из навигации, должен быть недоступен и так: без этого
// редиректа он открылся бы у любого, кто угадает или сохранит такую ссылку.
// Пока ответ не пришёл — не редиректим, иначе участника группы выкинет.
React.useEffect(() => {
if (route.nav === 'reports' && !canSeeReports) {
if (route.nav === 'reports' && canSeeReports === false) {
navigate({ mode: 'submit', nav: 'new' }, { replace: true });
}
}, [route.nav, canSeeReports]);