Files
request-portal/src/webparts/requestPortal/shared/fieldChoices/fieldChoices.service.ts
T
Тимур Городецкий e9b0df4822 feat: варианты полей заявки 1С из колонок SP + вид работ «Маршруты в ДО»
«Виды работ», «Организация» и «База 1С» теперь читаются из колонок списка
(общий хук shared/fieldChoices), а не из констант: новый пункт добавляется
в параметрах столбца без правки кода и деплоя. Пилот — на форме 1С, при
успехе переводим остальные формы. В стартовые варианты provisioning.json
добавлен «Маршруты в ДО».

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 14:37:42 +05:00

41 lines
2.0 KiB
TypeScript

import '@pnp/sp/fields';
import { getSP } from '../pnp/pnpjs';
/** Ответ SP по колонке Choice: массив в nometadata, { results } — в verbose-формате OData. */
interface IChoiceFieldResponse {
Choices?: string[] | { results?: string[] };
}
// Кеш на время жизни страницы: варианты администратор меняет редко, а форму за
// сессию открывают по нескольку раз — повторно ходить в SP незачем. Хранится
// промис, чтобы параллельные вызовы (три поля одной формы) не дублировали запрос.
const cache = new Map<string, Promise<string[]>>();
/**
* Варианты колонки Choice/MultiChoice прямо из списка SharePoint.
*
* Колонка списка — единственный источник вариантов: чтобы добавить пункт,
* достаточно дописать его в параметрах столбца, без правки кода и деплоя.
*/
export function getFieldChoices(listTitle: string, internalName: string): Promise<string[]> {
const key = `${listTitle}|${internalName}`.toLowerCase();
const cached = cache.get(key);
if (cached) return cached;
const request = loadFieldChoices(listTitle, internalName);
// Сбой не кешируем — при следующем открытии формы запрос уйдёт заново.
request.catch(() => cache.delete(key));
cache.set(key, request);
return request;
}
async function loadFieldChoices(listTitle: string, internalName: string): Promise<string[]> {
const field = (await getSP()
.web.lists.getByTitle(listTitle)
.fields.getByInternalNameOrTitle(internalName)
.select('Choices')()) as IChoiceFieldResponse;
const choices = Array.isArray(field.Choices) ? field.Choices : field.Choices?.results || [];
return choices.filter((choice) => choice.trim() !== '');
}