2c5935b72d
Tests / frontend-test (pull_request) Successful in 1m16s
Обсуждение заявки поверх штатных комментариев SharePoint (PnPjs item.comments) — без новых колонок и провижининга, права на переписку раздаёт сам SharePoint по правам на элемент. Встроено в ApproveFeature и EditFeature (единственные входы в просмотр заявки для всех типов), поэтому доступно автору, всем согласующим (включая уже решивших и ещё не дошедших до своего шага) и исполнителям, а не только текущему шагу маршрута, как DecisionPanel. Автора комментария всегда ставит реальная учётка — отладочная подмена личности на запись в SharePoint не влияет, в UI есть предупреждение.
65 lines
3.5 KiB
TypeScript
65 lines
3.5 KiB
TypeScript
import '@pnp/sp/items';
|
||
import '@pnp/sp/comments';
|
||
import type { ICommentInfo, IComments } from '@pnp/sp/comments';
|
||
import { resolveDataList } from '../dataList';
|
||
import { RequestTypeId } from '../../models/types';
|
||
import { IChatMessage } from './models/IChatMessage';
|
||
import { toChatMessages } from './chatMessages';
|
||
|
||
/**
|
||
* Чат по заявке ПОВЕРХ штатных комментариев к строке списка.
|
||
*
|
||
* Почему комментарии, а не своя колонка/список переписки: комментарии к
|
||
* элементу — готовый механизм SharePoint. Он сам хранит автора и время, сам
|
||
* раздаёт права (кто видит заявку — видит переписку), не требует ни новой
|
||
* колонки в девяти списках, ни провижининга, и переписка не мешает
|
||
* согласованию (комментарий решения — отдельное поле строки маршрута).
|
||
*
|
||
* Заявка живёт в КОНКРЕТНОЙ партиции (списки нумерованные, см.
|
||
* shared/approval/listPartitions.ts), поэтому список резолвим общим
|
||
* resolveDataList(formKey, listId) — тем же, которым формы пишут саму заявку.
|
||
* Иначе переписка архивной заявки читалась бы из текущей партиции, где под
|
||
* тем же Id лежит другая заявка.
|
||
*/
|
||
|
||
/** Комментарии элемента списка данных заявки. */
|
||
function commentsOf(formKey: RequestTypeId, itemId: number, listId?: string): IComments {
|
||
return resolveDataList(formKey, listId).items.getById(itemId).comments;
|
||
}
|
||
|
||
/**
|
||
* Прочитать переписку по заявке.
|
||
*
|
||
* currentUserEmail нужен, чтобы отметить свои сообщения. Передаём РЕАЛЬНОГО
|
||
* пользователя (context.pageContext.user.email), а не подменённого: комментарий
|
||
* SharePoint пишет под настоящей учёткой, отладочная подмена личности
|
||
* (shared/impersonation.ts) на автора не влияет.
|
||
*
|
||
* SharePoint отдаёт комментарии страницей. Дочитывания страниц здесь нет:
|
||
* переписка по одной заявке — это единицы сообщений, и усложнять сервис под
|
||
* гипотетический случай смысла нет. Если объём вырастет, дочитывание добавится
|
||
* здесь, интерфейс менять не придётся.
|
||
*/
|
||
export async function getChatMessages(
|
||
formKey: RequestTypeId,
|
||
itemId: number,
|
||
listId: string | undefined,
|
||
currentUserEmail: string
|
||
): Promise<IChatMessage[]> {
|
||
const comments: ICommentInfo[] = await commentsOf(formKey, itemId, listId)();
|
||
return toChatMessages(comments, currentUserEmail);
|
||
}
|
||
|
||
/**
|
||
* Отправить сообщение — добавить комментарий к строке заявки. Автора и время
|
||
* ставит сам SharePoint, поэтому передаём только текст.
|
||
*/
|
||
export async function addChatMessage(
|
||
formKey: RequestTypeId,
|
||
itemId: number,
|
||
listId: string | undefined,
|
||
text: string
|
||
): Promise<void> {
|
||
await commentsOf(formKey, itemId, listId).add(text);
|
||
}
|