diff --git a/src/webparts/requestPortal/shared/diagnostics.ts b/src/webparts/requestPortal/shared/diagnostics.ts index 09457ac..8a4e068 100644 --- a/src/webparts/requestPortal/shared/diagnostics.ts +++ b/src/webparts/requestPortal/shared/diagnostics.ts @@ -59,6 +59,16 @@ export function describeReason(reason: unknown): string { // escape-последовательности `Эл...`, и в UI вместо кириллицы видно // набор из "\u". Достаём odata.error.message.value через JSON.parse — сам // парсер раскодирует escape-последовательности обратно в текст. +// SharePoint отдаёт этот же текст и когда элемент правда удалён, и когда у +// пользователя просто нет прав на список/элемент (сервер прячет 403 за 404, +// чтобы не подтверждать существование элемента посторонним). По одному +// тексту эти два случая не различить, а "нет доступа" на практике встречается +// куда чаще, чем совпадение по времени с удалением — поэтому подменяем +// формулировку на более вероятную причину. +const ITEM_NOT_FOUND = 'Элемент не существует. Возможно, он был удален другим пользователем.'; +const NO_ACCESS_HINT = + 'Элемент не найден. Скорее всего, у вас нет доступа к этому списку или элементу (либо он был удалён).'; + export function friendlyErrorMessage(e: unknown): string { const message = e instanceof Error ? e.message : String(e); const start = message.indexOf('{'); @@ -69,6 +79,7 @@ export function friendlyErrorMessage(e: unknown): string { 'odata.error'?: { message?: { value?: string } }; }; const value = parsed['odata.error']?.message?.value; + if (value === ITEM_NOT_FOUND) return NO_ACCESS_HINT; if (value) return value; } catch { // Тело не JSON (или не то, что ожидали) — отдаём исходное сообщение.