diff --git a/frontend/my-materials.html b/frontend/my-materials.html index 9be5232..186b8cc 100644 --- a/frontend/my-materials.html +++ b/frontend/my-materials.html @@ -108,6 +108,8 @@ const edit = ``; const ann = (m.kind === 'board' || m.kind === 'image') ? `` : ''; + const fc = (m.kind === 'note') + ? `` : ''; const mv = moveSelect(m); if (m.kind === 'board' || m.kind === 'image') { return `
@@ -132,7 +134,7 @@
${esc(m.title || kind)}
${meta}
-
${mv}${edit}${del}
+
${mv}${fc}${edit}${del}
`; } @@ -351,6 +353,38 @@ } window.annotate = annotate; + /* ── Заметка → флешкарта ── */ + async function toFlashcard(id) { + const mt = _mats.find(x => x.id === id); + if (!mt) return; + let decks = []; + try { const d = await LS.fcListDecks(); decks = d.decks || []; } catch (e) {} + const opts = [''] + .concat(decks.map(d => ``)).join(''); + const front = (mt.title || '').trim() || (mt.body || '').slice(0, 80); + const back = (mt.body || '').trim() || (mt.title || ''); + const content = `
+ + + + + + +
`; + const m = LS.modal({ title: 'В флешкарты', content, size: 'sm', actions: [ + { label: 'Отмена', onClick: () => m.close() }, + { label: 'Создать карточку', primary: true, onClick: async () => { + try { + let deckId = m.body.querySelector('#fc-deck').value; + if (deckId === '__new') { const nd = await LS.fcCreateDeck({ title: 'Из материалов' }); deckId = nd.id; } + await LS.fcAddCard(deckId, { front: m.body.querySelector('#fc-front').value, back: m.body.querySelector('#fc-back').value }); + m.close(); LS.toast('Карточка добавлена в флешкарты', 'success'); + } catch (e) { LS.toast(e.message || 'Ошибка', 'error'); } + } }, + ] }); + } + window.toFlashcard = toFlashcard; + load(); diff --git a/js/api.js b/js/api.js index 718eadd..564eb7d 100644 --- a/js/api.js +++ b/js/api.js @@ -1050,6 +1050,7 @@ window.LS = { crAdminGetAllHistory, crAdminGetTeachersList, listMaterials, saveMaterial, updateMaterial, deleteMaterial, createMaterialCollection, updateMaterialCollection, deleteMaterialCollection, + fcListDecks, fcCreateDeck, fcAddCard, escapeHtml, esc, parseDate, fmtRelTime, safeHref, initPage, @@ -1251,6 +1252,9 @@ async function deleteMaterial(id) { return req('DELETE', `/materials/${id}`) async function createMaterialCollection(d) { return req('POST', '/materials/collections', d); } async function updateMaterialCollection(id,d){ return req('PATCH', `/materials/collections/${id}`, d); } async function deleteMaterialCollection(id) { return req('DELETE', `/materials/collections/${id}`); } +async function fcListDecks() { return req('GET', '/flashcards/decks'); } +async function fcCreateDeck(d) { return req('POST', '/flashcards/decks', d); } +async function fcAddCard(deckId, d) { return req('POST', `/flashcards/decks/${deckId}/cards`, d); } async function deleteFile(id) { return req('DELETE', `/files/${id}`); } async function getFileAccess(id) { return req('GET', `/files/${id}/access`); } async function assignFile(id, data) { return req('POST', `/files/${id}/assign`, data); }