import { getSP } from '../pnp/pnpjs'; import '@pnp/sp/attachments'; export interface IAttachmentInfo { fileName: string; /** ServerRelativeUrl — прямая ссылка на скачивание. */ url: string; } /** Прочитать файл как ArrayBuffer (FileReader — совместимо со всеми браузерами). */ function readAsArrayBuffer(file: File): Promise { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = () => resolve(reader.result as ArrayBuffer); reader.onerror = () => reject(reader.error); reader.readAsArrayBuffer(file); }); } /** Вложения элемента списка (для режима согласующего — ссылки на скачивание). */ export async function getAttachments(listTitle: string, itemId: number): Promise { const files = await getSP() .web.lists.getByTitle(listTitle) .items.getById(itemId) .attachmentFiles(); return files.map((f) => ({ fileName: f.FileName, url: f.ServerRelativeUrl })); } /** * Прикрепить файлы к уже созданному элементу заявки. * Вызывать ПОСЛЕ создания элемента (нужен его id). */ export async function uploadAttachments( listTitle: string, itemId: number, files: File[] ): Promise { if (files.length === 0) { return; } const item = getSP().web.lists.getByTitle(listTitle).items.getById(itemId); for (let i = 0; i < files.length; i++) { const file = files[i]; const content = await readAsArrayBuffer(file); await item.attachmentFiles.add(file.name, content); } }