From 5a7724bdbb1d8085dcf74a2dead67001be40d5bc Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Sat, 30 May 2026 17:28:25 +0300 Subject: [PATCH] =?UTF-8?q?feat(lab-content-engine):=20phase=205=20?= =?UTF-8?q?=E2=80=94=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B0=20=C2=AB=D0=92?= =?UTF-8?q?=20=D0=BB=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D1=8E=C2=BB=20=D0=BD=D0=B0=20=D0=BA=D0=B0=D1=80=D1=82=D0=BE?= =?UTF-8?q?=D1=87=D0=BA=D0=B5=20=D1=83=D1=87=D0=B5=D0=B1=D0=BD=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit textbooks.html: батч-запрос /api/lab/links/all?kind=textbook при загрузке -> labLinks byRef; на карточке учебника со связанными симуляциями добавлена кнопка «В лабораторию» (deep-link /lab?sim=, openLabSim со stopPropagation, чтобы клик не открывал учебник). (Прошлый коммит метил не ту разметку карточки — фикс.) Co-Authored-By: Claude Opus 4.8 (1M context) --- frontend/textbooks.html | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/frontend/textbooks.html b/frontend/textbooks.html index cbba5d0..b219108 100644 --- a/frontend/textbooks.html +++ b/frontend/textbooks.html @@ -454,16 +454,28 @@ return String(s || '').replace(/[&<>"']/g, c => ({ '&':'&','<':'<','>':'>','"':'"',"'":''' }[c])); } + let labLinks = {}; // { textbook_slug: [{id,title,cat}] } — связанные симуляции (Фаза 5) async function loadTextbooks() { try { - const r = await LS.api('/api/textbooks'); + const [r, labRes] = await Promise.all([ + LS.api('/api/textbooks'), + LS.api('/api/lab/links/all?kind=textbook').catch(() => ({ byRef: {} })), + ]); textbooks = r.textbooks || []; + labLinks = (labRes && labRes.byRef) || {}; render(); } catch (e) { document.getElementById('tb-grid').innerHTML = `
Не удалось загрузить: ${esc(e.message)}
`; } } + /* Фаза 5: открыть связанную симуляцию из карточки учебника (не уходя в учебник). */ + function openLabSim(simId, ev) { + if (ev) ev.stopPropagation(); + location.href = '/lab?sim=' + encodeURIComponent(simId); + } + window.openLabSim = openLabSim; + function render() { const grid = document.getElementById('tb-grid'); if (!textbooks.length) { @@ -509,6 +521,10 @@ ${isTeacher ? `` : ''} + ${(labLinks[t.slug] && labLinks[t.slug].length) ? `` : ''} `;