fix(approval): колонки SLA в манифестах согласования + читаемый текст ошибки
Маршрут «Заявки на услуги» падал с 400 «Поле или свойство SLAhours не существует»: общий ApprovalListService читает и пишет SLAhours/ AskOverdueReason у ЛЮБОЙ формы, а в манифесте согласования их не было. Манифест копировался с TmcTransfer, где их тоже нет — там на тенанте колонки почему-то есть, поэтому не проявлялось, но следующая партиция списка создалась бы уже сломанной. Добавил обеим формам. Текст ошибки при этом выводился как «Поле…»: useMatrixEditor и useRequestTypeId клали в state сырой err.message, а PnPjs кладёт туда тело ответа SharePoint целиком, где кириллица — \u-escape-последовательности. Пропустил оба через friendlyErrorMessage, который для этого и написан (он уже используется формами). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -9,6 +9,8 @@
|
|||||||
{ "internalName": "StepOrder", "title": "Порядок", "type": "Number" },
|
{ "internalName": "StepOrder", "title": "Порядок", "type": "Number" },
|
||||||
{ "internalName": "AllowReassignToOtherApprovers", "title": "Можно перепоручать", "type": "Boolean" },
|
{ "internalName": "AllowReassignToOtherApprovers", "title": "Можно перепоручать", "type": "Boolean" },
|
||||||
{ "internalName": "Phase", "title": "Фаза", "type": "Choice", "choices": ["Согласование", "Исполнение"] },
|
{ "internalName": "Phase", "title": "Фаза", "type": "Choice", "choices": ["Согласование", "Исполнение"] },
|
||||||
|
{ "internalName": "SLAhours", "title": "SLA, часов", "type": "Number" },
|
||||||
|
{ "internalName": "AskOverdueReason", "title": "Опрос причины просрочки", "type": "Boolean" },
|
||||||
{ "internalName": "DelegatedBy", "title": "Кем переназначено", "type": "User", "userSelectionMode": "PeopleOnly" }
|
{ "internalName": "DelegatedBy", "title": "Кем переназначено", "type": "User", "userSelectionMode": "PeopleOnly" }
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,8 @@
|
|||||||
{ "internalName": "StepOrder", "title": "Порядок", "type": "Number" },
|
{ "internalName": "StepOrder", "title": "Порядок", "type": "Number" },
|
||||||
{ "internalName": "AllowReassignToOtherApprovers", "title": "Можно перепоручать", "type": "Boolean" },
|
{ "internalName": "AllowReassignToOtherApprovers", "title": "Можно перепоручать", "type": "Boolean" },
|
||||||
{ "internalName": "Phase", "title": "Фаза", "type": "Choice", "choices": ["Согласование", "Исполнение"] },
|
{ "internalName": "Phase", "title": "Фаза", "type": "Choice", "choices": ["Согласование", "Исполнение"] },
|
||||||
|
{ "internalName": "SLAhours", "title": "SLA, часов", "type": "Number" },
|
||||||
|
{ "internalName": "AskOverdueReason", "title": "Опрос причины просрочки", "type": "Boolean" },
|
||||||
{ "internalName": "DelegatedBy", "title": "Кем переназначено", "type": "User", "userSelectionMode": "PeopleOnly" }
|
{ "internalName": "DelegatedBy", "title": "Кем переназначено", "type": "User", "userSelectionMode": "PeopleOnly" }
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { useState, useEffect } from 'react';
|
import { useState, useEffect } from 'react';
|
||||||
|
import { friendlyErrorMessage } from '../diagnostics';
|
||||||
import { IMatrixRow } from './models/IMatrixRow';
|
import { IMatrixRow } from './models/IMatrixRow';
|
||||||
import { ISiteUser } from './models/ISiteUser';
|
import { ISiteUser } from './models/ISiteUser';
|
||||||
|
|
||||||
@@ -175,7 +176,11 @@ export function useMatrixEditor(
|
|||||||
})
|
})
|
||||||
.catch((err: Error) => {
|
.catch((err: Error) => {
|
||||||
if (!active) return;
|
if (!active) return;
|
||||||
setError(err.message);
|
// Через friendlyErrorMessage, а не err.message: PnPjs кладёт в message
|
||||||
|
// тело ответа SharePoint целиком, и кириллица в нём остаётся
|
||||||
|
// \u-escape-последовательностями — пользователь видел «Поле или
|
||||||
|
// свойство…» набором «Поле».
|
||||||
|
setError(friendlyErrorMessage(err));
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
});
|
});
|
||||||
return () => {
|
return () => {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import type { WebPartContext } from '@microsoft/sp-webpart-base';
|
import type { WebPartContext } from '@microsoft/sp-webpart-base';
|
||||||
|
import { friendlyErrorMessage } from '../diagnostics';
|
||||||
import { getRequestTypeIdByPageUrl } from './approvalRoute.service';
|
import { getRequestTypeIdByPageUrl } from './approvalRoute.service';
|
||||||
|
|
||||||
export interface IRequestTypeIdState {
|
export interface IRequestTypeIdState {
|
||||||
@@ -33,7 +34,9 @@ export function useRequestTypeId(context: WebPartContext, pageUrl: string): IReq
|
|||||||
})
|
})
|
||||||
.catch((e: Error) => {
|
.catch((e: Error) => {
|
||||||
if (alive) {
|
if (alive) {
|
||||||
setError(e.message);
|
// См. useMatrixEditor: сырой message от PnPjs/SharePoint показывает
|
||||||
|
// кириллицу \u-escape-последовательностями.
|
||||||
|
setError(friendlyErrorMessage(e));
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user