e9b0df4822
«Виды работ», «Организация» и «База 1С» теперь читаются из колонок списка (общий хук shared/fieldChoices), а не из констант: новый пункт добавляется в параметрах столбца без правки кода и деплоя. Пилот — на форме 1С, при успехе переводим остальные формы. В стартовые варианты provisioning.json добавлен «Маршруты в ДО». Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
41 lines
2.0 KiB
TypeScript
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() !== '');
|
|
}
|