From 1b07f086b4d2fd87ce1d7a4524f92b5077b5d19a Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Wed, 27 May 2026 17:53:38 +0300 Subject: [PATCH] =?UTF-8?q?debug(tracker):=20=D0=B2=D0=B8=D0=B7=D1=83?= =?UTF-8?q?=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=B1=D0=B5=D0=B9=D0=B4?= =?UTF-8?q?=D0=B6=20=D0=B2=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BE=D0=BC=20=D0=BD?= =?UTF-8?q?=D0=B8=D0=B6=D0=BD=D0=B5=D0=BC=20=D1=83=D0=B3=D0=BB=D1=83=20+?= =?UTF-8?q?=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=BD=D1=8B=D0=B9=20?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=20POST'=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/routes/textbooks.js | 2 ++ frontend/js/textbook-tracker.js | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/backend/src/routes/textbooks.js b/backend/src/routes/textbooks.js index 3ca22ca..664b315 100644 --- a/backend/src/routes/textbooks.js +++ b/backend/src/routes/textbooks.js @@ -214,6 +214,8 @@ router.get('/:slug', (req, res) => { /* POST /api/textbooks/:slug/progress — update progress */ router.post('/:slug/progress', (req, res) => { + // DEBUG: log incoming progress writes + console.log('[progress]', new Date().toISOString(), 'user', req.user && req.user.id, '| slug=', req.params.slug, '| body=', JSON.stringify(req.body || {})); const t = db.prepare('SELECT id FROM textbooks WHERE slug=? AND is_active=1').get(req.params.slug); if (!t) return res.status(404).json({ error: 'Учебник не найден' }); diff --git a/frontend/js/textbook-tracker.js b/frontend/js/textbook-tracker.js index 9f3e21a..8d94a39 100644 --- a/frontend/js/textbook-tracker.js +++ b/frontend/js/textbook-tracker.js @@ -235,6 +235,30 @@ refreshCheckUI(key); persist(); syncToServer({ mark_read: key }); + updateDebugBadge(); + } + + // DEBUG: визуальный бейдж прогресса в правом нижнем углу. + function ensureDebugBadge() { + if (document.getElementById('tb-debug-badge')) return; + const b = document.createElement('div'); + b.id = 'tb-debug-badge'; + b.style.cssText = 'position:fixed;bottom:12px;right:12px;z-index:99999;background:rgba(15,23,42,.92);color:#fff;padding:10px 14px;border-radius:10px;font-family:monospace;font-size:12px;line-height:1.5;box-shadow:0 4px 14px rgba(0,0,0,.3);max-width:260px'; + document.body.appendChild(b); + updateDebugBadge(); + } + function updateDebugBadge() { + const b = document.getElementById('tb-debug-badge'); + if (!b) return; + const activeParaEl = document.querySelector('.para-pill.active[data-para]'); + const active = activeParaEl ? activeParaEl.dataset.para : '?'; + b.innerHTML = + '
tracker debug
' + + '
slug: ' + slug + '
' + + '
active pill: ' + active + '
' + + '
localState.last: ' + (localState.last || '?') + '
' + + '
read [' + localState.read.length + ']: ' + (localState.read.slice(-8).join(',') || '—') + '
' + + '
Кликай пилюли — должно меняться
'; } function wirePillTracking() { @@ -532,6 +556,8 @@ function boot() { console.log('[tracker] boot, slug =', slug, '| LS:', typeof LS !== 'undefined', '| token:', typeof LS !== 'undefined' && LS.getToken && !!LS.getToken()); + ensureDebugBadge(); + setInterval(updateDebugBadge, 1000); injectStyles(); installBackButton(); installBookmarksBtn();