Архивация списков (#9)
Tests / frontend-test (push) Successful in 1m12s

Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/9
This commit was merged in pull request #9.
This commit is contained in:
2026-08-19 09:07:53 +00:00
parent 3a71d0df1f
commit 6f789f8f1c
67 changed files with 2617 additions and 901 deletions
+16 -2
View File
@@ -52,6 +52,15 @@ export interface IRoute {
formKey?: string;
/** Id заявки в списке данных — для 'approve' и 'edit'. */
itemId?: number;
/**
* Серверный относительный url КОНКРЕТНОЙ партиции, где лежит заявка — для
* 'approve' и 'edit'. Списки заявок нумерованные (см. shared/approval/
* listPartitions.ts): без этого поля заявка всегда открывалась бы так, будто
* лежит в ТЕКУЩЕЙ партиции, и архивная заявка читалась/сохранялась бы не в
* тот список. Не задан — значит партиция неизвестна (старая ссылка без
* параметра), и форма/просмотр откатываются на текущую партицию.
*/
listId?: string;
/** Id исходной заявки для предзаполнения — для 'create' (напр. орг. места на основе прием). */
sourceId?: number;
/** Подвкладка «Моих заявок»; задана только при nav='own'. */
@@ -263,6 +272,7 @@ export function parseRoute(search: string = window.location.search): IRoute {
const formKey = params.get('rptype') ?? undefined;
const idRaw = params.get('rpid');
const itemId = idRaw ? Number(idRaw) : undefined;
const listId = params.get('rplist') ?? undefined;
const sourceRaw = params.get('rpsource');
const sourceId = sourceRaw ? Number(sourceRaw) : undefined;
@@ -288,11 +298,11 @@ export function parseRoute(search: string = window.location.search): IRoute {
// страницей: закрыв панель, пользователь должен вернуться ровно в тот же
// список и на то же место в нём.
if (mode === 'approve' && formKey && itemId && !isNaN(itemId)) {
return { mode: 'approve', nav, formKey, itemId, ownTab, ownStatus, page, query };
return { mode: 'approve', nav, formKey, itemId, listId, ownTab, ownStatus, page, query };
}
// Редактирование собственной незавершённой заявки — та же панель, но с формой.
if (mode === 'edit' && formKey && itemId && !isNaN(itemId)) {
return { mode: 'edit', nav, formKey, itemId, ownTab, ownStatus, page, query };
return { mode: 'edit', nav, formKey, itemId, listId, ownTab, ownStatus, page, query };
}
// Создание производной заявки с предзаполнением из исходной.
if (formKey && sourceId && !isNaN(sourceId)) {
@@ -308,6 +318,7 @@ function buildQuery(route: IRoute): string {
params.delete('rpnav');
params.delete('rptype');
params.delete('rpid');
params.delete('rplist');
params.delete('rpsource');
params.delete('rptab');
params.delete('rpstatus');
@@ -331,6 +342,9 @@ function buildQuery(route: IRoute): string {
params.set('rpmode', route.mode);
params.set('rptype', route.formKey);
params.set('rpid', String(route.itemId));
// Партиция неизвестна (архивная ссылка старого формата, до этого поля) —
// ссылка всё равно валидна, форма/просмотр просто откатятся на текущую.
if (route.listId) params.set('rplist', route.listId);
} else if (route.mode === 'create' && route.formKey && route.sourceId) {
params.set('rptype', route.formKey);
params.set('rpsource', String(route.sourceId));