Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz> Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/10
This commit was merged in pull request #10.
This commit is contained in:
@@ -12,7 +12,7 @@ import { initSP } from './shared/pnp/pnpjs';
|
|||||||
import { installErrorLogging } from './shared/diagnostics';
|
import { installErrorLogging } from './shared/diagnostics';
|
||||||
import { setImpersonatedIdentity } from './shared/impersonation';
|
import { setImpersonatedIdentity } from './shared/impersonation';
|
||||||
import { APPROVAL_API_BASE_URL_LOCAL, APPROVAL_API_BASE_URL_PROD, setApprovalApiBaseUrl } from './shared/config';
|
import { APPROVAL_API_BASE_URL_LOCAL, APPROVAL_API_BASE_URL_PROD, setApprovalApiBaseUrl } from './shared/config';
|
||||||
import { initListPartitions } from './shared/approval/listPartitions';
|
import { initListPartitions } from './shared/approval';
|
||||||
import { ErrorOverlay } from './shared/ui';
|
import { ErrorOverlay } from './shared/ui';
|
||||||
import { PropertyPaneDebugUser } from './propertyPane/PropertyPaneDebugUser';
|
import { PropertyPaneDebugUser } from './propertyPane/PropertyPaneDebugUser';
|
||||||
|
|
||||||
@@ -76,7 +76,18 @@ export default class RequestPortalWebPart extends BaseClientSideWebPart<IRequest
|
|||||||
// формам синхронно (см. shared/listTitles.ts), а формы — лениво подгружаемые
|
// формам синхронно (см. shared/listTitles.ts), а формы — лениво подгружаемые
|
||||||
// чанки, монтируются заведомо позже onInit. initListPartitions не бросает:
|
// чанки, монтируются заведомо позже onInit. initListPartitions не бросает:
|
||||||
// при недоступном approval-route портал работает по конвенции имён.
|
// при недоступном approval-route портал работает по конвенции имён.
|
||||||
return Promise.all([this._getEnvironmentMessage(), initListPartitions(this.context)]).then(([message]) => {
|
//
|
||||||
|
// НЕ ждём эту загрузку здесь (не Promise.all, а просто вызов) — onInit
|
||||||
|
// блокирует ПЕРВЫЙ render() всего портала (SPFx не рисует веб-часть, пока
|
||||||
|
// его промис не разрешится), а два новых AAD-запроса к внешнему api.tnsu.kz
|
||||||
|
// не обязаны попадать в этот путь: раньше onInit резолвился почти мгновенно
|
||||||
|
// (только _getEnvironmentMessage, без сети), и весь портал — включая
|
||||||
|
// «Мои заявки» и «Новая заявка», которым партиции вообще не нужны сразу —
|
||||||
|
// ждал открытия форм. Партиции при этом гарантированно успевают раньше,
|
||||||
|
// чем смонтируется первая форма (ленивый чанк грузится дольше).
|
||||||
|
// eslint-disable-next-line no-void -- без void это «висячий» промис, а no-floating-promises здесь уровня error
|
||||||
|
void initListPartitions(this.context);
|
||||||
|
return this._getEnvironmentMessage().then(message => {
|
||||||
this._environmentMessage = message;
|
this._environmentMessage = message;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import type { ISidebarItem } from '@tnsu/ui-kit';
|
|||||||
import { ConfirmHost } from '../shared/ui';
|
import { ConfirmHost } from '../shared/ui';
|
||||||
import {
|
import {
|
||||||
navigate,
|
navigate,
|
||||||
|
persistNav,
|
||||||
persistOwnTab,
|
persistOwnTab,
|
||||||
persistOwnStatus,
|
persistOwnStatus,
|
||||||
persistPage,
|
persistPage,
|
||||||
@@ -130,6 +131,9 @@ const RequestPortal: React.FC<IRequestPortalProps> = ({ hasTeamsContext, context
|
|||||||
};
|
};
|
||||||
|
|
||||||
const goto = (nav: NavSection): void => {
|
const goto = (nav: NavSection): void => {
|
||||||
|
// Запоминаем раздел, чтобы следующий заход на портал (без rpnav в адресе)
|
||||||
|
// открыл его же, а не всегда «Новую заявку» (см. persistNav в routing.ts).
|
||||||
|
persistNav(nav);
|
||||||
// Клик по УЖЕ активному пункту меню не меняет маршрут, значит эффект
|
// Клик по УЖЕ активному пункту меню не меняет маршрут, значит эффект
|
||||||
// загрузки в таблице не перезапустится сам. Шлём событие обновления —
|
// загрузки в таблице не перезапустится сам. Шлём событие обновления —
|
||||||
// таблица на него подписана и перечитает данные фоном, не убирая с экрана
|
// таблица на него подписана и перечитает данные фоном, не убирая с экрана
|
||||||
|
|||||||
@@ -101,6 +101,11 @@ const ROUTE_CHANGE_EVENT = 'rp-route-change';
|
|||||||
// вернувшись обратно, фильтр каждый раз сбрасывался на «Все статусы».
|
// вернувшись обратно, фильтр каждый раз сбрасывался на «Все статусы».
|
||||||
const OWN_TAB_STORAGE_KEY = 'rp-own-tab';
|
const OWN_TAB_STORAGE_KEY = 'rp-own-tab';
|
||||||
const OWN_STATUS_STORAGE_KEY = 'rp-own-status';
|
const OWN_STATUS_STORAGE_KEY = 'rp-own-status';
|
||||||
|
// Раздел бокового меню — тем же приёмом: запоминается только по явному клику
|
||||||
|
// (см. persistNav в goto() RequestPortal.tsx), чтобы заход на портал без
|
||||||
|
// rpnav в адресе открывал тот раздел, на котором остановились в прошлый раз,
|
||||||
|
// а не всегда «Новую заявку».
|
||||||
|
const NAV_STORAGE_KEY = 'rp-nav';
|
||||||
// Страница запоминается ОТДЕЛЬНО ДЛЯ КАЖДОЙ таблицы (см. viewKeyOf): один общий
|
// Страница запоминается ОТДЕЛЬНО ДЛЯ КАЖДОЙ таблицы (см. viewKeyOf): один общий
|
||||||
// номер переносился бы между разделами, где у каждого свой объём данных, —
|
// номер переносился бы между разделами, где у каждого свой объём данных, —
|
||||||
// уйдя со страницы 3 «Моих заявок» в «На согласовании», где страница всего
|
// уйдя со страницы 3 «Моих заявок» в «На согласовании», где страница всего
|
||||||
@@ -246,17 +251,45 @@ export function persistOwnStatus(ownStatus: string | undefined): void {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function readStoredNav(): NavSection {
|
||||||
|
try {
|
||||||
|
const raw = window.localStorage.getItem(NAV_STORAGE_KEY);
|
||||||
|
return raw === 'approvals' ||
|
||||||
|
raw === 'execution' ||
|
||||||
|
raw === 'rework' ||
|
||||||
|
raw === 'own' ||
|
||||||
|
raw === 'search' ||
|
||||||
|
raw === 'new'
|
||||||
|
? raw
|
||||||
|
: 'new';
|
||||||
|
} catch {
|
||||||
|
return 'new';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Запомнить раздел бокового меню — вызывать только при явном выборе пользователя. */
|
||||||
|
export function persistNav(nav: NavSection): void {
|
||||||
|
try {
|
||||||
|
window.localStorage.setItem(NAV_STORAGE_KEY, nav);
|
||||||
|
} catch {
|
||||||
|
// localStorage недоступен (приватный режим и т.п.) — просто не сохраняем.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function parseNav(raw: string | undefined): NavSection {
|
function parseNav(raw: string | undefined): NavSection {
|
||||||
if (
|
if (
|
||||||
raw === 'approvals' ||
|
raw === 'approvals' ||
|
||||||
raw === 'execution' ||
|
raw === 'execution' ||
|
||||||
raw === 'rework' ||
|
raw === 'rework' ||
|
||||||
raw === 'own' ||
|
raw === 'own' ||
|
||||||
raw === 'search'
|
raw === 'search' ||
|
||||||
|
raw === 'new'
|
||||||
) {
|
) {
|
||||||
return raw;
|
return raw;
|
||||||
}
|
}
|
||||||
return 'new';
|
// В адресе раздела нет (rpnav отсутствует, в т.ч. при заходе на портал по
|
||||||
|
// голой ссылке) — открываем запомненный раздел, а не всегда «Новую заявку».
|
||||||
|
return readStoredNav();
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseOwnTab(raw: string | undefined): OwnTab {
|
function parseOwnTab(raw: string | undefined): OwnTab {
|
||||||
|
|||||||
Reference in New Issue
Block a user