feat: дата выхода сотрудника в закладке «Все заявки» по организации рабочего места (#24)
Tests / frontend-test (push) Successful in 1m58s
Tests / frontend-test (push) Successful in 1m58s
Колонка «Дата выхода» (StartDate) показывается только во «Все заявки» для типа it-workplace-setup. Значение дочитывается из списка данных по партиции строки, только для видимой страницы; учтено в сигнатуре кеша страницы. Функция вынесена в startDates.service.ts, чтобы не превысить лимит строк myRequests.service.ts. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> --------- Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz> Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/24
This commit was merged in pull request #24.
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
import { WebPartContext } from '@microsoft/sp-webpart-base';
|
||||
import '@pnp/sp/webs';
|
||||
import '@pnp/sp/lists';
|
||||
import '@pnp/sp/items';
|
||||
import { spForSite } from '../../shared/pnp/pnpjs';
|
||||
import { traced } from '../../shared/perfTrace';
|
||||
import { IMyRequest } from './models/IMyRequest';
|
||||
|
||||
/**
|
||||
* Проставляет startDate — дату выхода сотрудника (колонка StartDate списка
|
||||
* данных). Только для видимой страницы; группировка по партиции строки, как в
|
||||
* hydrateAuthors: в другой партиции тот же Id — чужая заявка. Мутирует строки.
|
||||
*/
|
||||
export async function hydrateStartDates(context: WebPartContext, rows: IMyRequest[]): Promise<void> {
|
||||
if (rows.length === 0) return;
|
||||
return traced('дата выхода (REST)', () => hydrateStartDatesInner(context, rows));
|
||||
}
|
||||
|
||||
async function hydrateStartDatesInner(context: WebPartContext, rows: IMyRequest[]): Promise<void> {
|
||||
const byPartition = new Map<string, { siteUrl: string; listId: string; typeName: string; ids: number[] }>();
|
||||
rows.forEach((r) => {
|
||||
const bucket = byPartition.get(r.listId.toLowerCase()) || {
|
||||
siteUrl: r.siteUrl,
|
||||
listId: r.listId,
|
||||
typeName: r.requestTypeName,
|
||||
ids: [],
|
||||
};
|
||||
bucket.ids.push(r.id);
|
||||
byPartition.set(r.listId.toLowerCase(), bucket);
|
||||
});
|
||||
|
||||
const byKey = new Map<string, string>();
|
||||
await Promise.all(
|
||||
Array.from(byPartition.values()).map(async ({ siteUrl, listId, typeName, ids }) => {
|
||||
try {
|
||||
const sp = spForSite(siteUrl, context);
|
||||
const dataRows = (await sp.web
|
||||
.getList(listId)
|
||||
.items.filter(ids.map((id) => `Id eq ${id}`).join(' or '))
|
||||
.select('Id', 'StartDate')
|
||||
.top(ids.length)()) as Array<Record<string, unknown>>;
|
||||
dataRows.forEach((r) => byKey.set(`${listId.toLowerCase()}-${r.Id as number}`, (r.StartDate as string) || ''));
|
||||
} catch (e) {
|
||||
console.error(
|
||||
`[Все заявки] Не удалось дочитать дату выхода для «${typeName}» (${listId}):`,
|
||||
(e as Error).message
|
||||
);
|
||||
}
|
||||
})
|
||||
);
|
||||
|
||||
rows.forEach((r) => {
|
||||
r.startDate = byKey.get(`${r.listId.toLowerCase()}-${r.id}`) ?? '';
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user