Убрать мёртвые SSE-ветки и двойную перезагрузку доски

Удалены ветки boards_changed/pipeline_stats (core их не публикует); перезагрузка при переклассификации коалесцируется scheduleBoardReload. Закрывает TD-SSE-DEAD и TD-DBL-CLICK.
This commit is contained in:
Rustam Khalimov
2026-09-11 17:52:05 +03:00
parent e15be9de2e
commit 0f79bd4e70
3 changed files with 20 additions and 12 deletions
+2 -2
View File
@@ -53,8 +53,8 @@
|---|---|---|---|---| |---|---|---|---|---|
| TD-SETTINGS-UI | Вынос оставшихся вкладок `SettingsView` в отдельные компоненты (частично сделано) | ревью 2026-09-08 | P3 | TECHDEBT | | TD-SETTINGS-UI | Вынос оставшихся вкладок `SettingsView` в отдельные компоненты (частично сделано) | ревью 2026-09-08 | P3 | TECHDEBT |
| TD-VIRT | Полная виртуализация длинных колонок (сейчас — прогрессивный рендер «Показать ещё») | ревью, этап 12 | P3 | TECHDEBT | | TD-VIRT | Полная виртуализация длинных колонок (сейчас — прогрессивный рендер «Показать ещё») | ревью, этап 12 | P3 | TECHDEBT |
| TD-SSE-DEAD | Мёртвые SSE-ветки фронта `boards_changed`/`pipeline_stats` (core их не публикует) | этап 12, E | P3 | TECHDEBT | | TD-SSE-DEAD | **Сделано (2026-09-11):** мёртвые SSE-ветки фронта `boards_changed`/`pipeline_stats` удалены из `store/lifecycle.js` (core их не публикует) | этап 12, E | P3 | DONE |
| TD-DBL-CLICK | Двойная перезагрузка доски у инициатора batch-reclassify (ответ + SSE) | этап 12, E | P3 | TECHDEBT | | TD-DBL-CLICK | **Сделано (2026-09-11):** перезагрузка доски при batch-переклассификации коалесцируется `scheduleBoardReload()` (ответ + SSE → один запрос) | этап 12, E | P3 | DONE |
| TD-TEST-HARNESS | Историческая гонка `FreeTcpPort` — устранена; следить за новыми хост-хелперами | этап 12, E | P3 | TECHDEBT | | TD-TEST-HARNESS | Историческая гонка `FreeTcpPort` — устранена; следить за новыми хост-хелперами | этап 12, E | P3 | TECHDEBT |
| TD-OLD-DOCS | Исторические доки несут старые термины под пометками (переписывать не нужно) | docs sweep | P3 | TECHDEBT | | TD-OLD-DOCS | Исторические доки несут старые термины под пометками (переписывать не нужно) | docs sweep | P3 | TECHDEBT |
| TD-SOURCE-PROVIDER | Провайдеры содержимого источников. **Сделано (2026-09-11):** `TelegramSourceContentProvider` + `ReadSource` RPC + `GET /api/cards/{id}/source` + UI «Обновить из источника». Осталось: провайдеры прочих источников по мере появления | generic source 2026-09-11 | P2 | TECHDEBT | | TD-SOURCE-PROVIDER | Провайдеры содержимого источников. **Сделано (2026-09-11):** `TelegramSourceContentProvider` + `ReadSource` RPC + `GET /api/cards/{id}/source` + UI «Обновить из источника». Осталось: провайдеры прочих источников по мере появления | generic source 2026-09-11 | P2 | TECHDEBT |
+14 -1
View File
@@ -630,6 +630,18 @@ export async function reloadBoardData() {
} }
} }
let _boardReloadTimer = null
// Коалесцирует частые перезагрузки доски (ответ + SSE) в один прогон —
// убирает двойную перезагрузку у инициатора batch-переклассификации.
export function scheduleBoardReload(delayMs = 250) {
if (_boardReloadTimer) return
_boardReloadTimer = setTimeout(() => {
_boardReloadTimer = null
reloadBoardData()
}, delayMs)
}
// принять ИИ-предложение: колонка становится обычной // принять ИИ-предложение: колонка становится обычной
export async function acceptSuggestedBoard(id) { export async function acceptSuggestedBoard(id) {
const b = containerById(id) const b = containerById(id)
@@ -669,7 +681,8 @@ export async function reclassifyInbox() {
const r = await api.post('/api/cards/reclassify') const r = await api.post('/api/cards/reclassify')
if (r?.started) { if (r?.started) {
toast(t('cards.reclassifying', { count: r.attempted }), { icon: 'sparkles' }) toast(t('cards.reclassifying', { count: r.attempted }), { icon: 'sparkles' })
await reloadBoardData() // Перезагрузку доски коалесцирует scheduleBoardReload: SSE cards_reclassified не дублирует запрос.
scheduleBoardReload()
} else if (r?.busy) { } else if (r?.busy) {
toast(t('cards.pereklassifikaciya-uzhe-zapushchena'), { icon: 'sparkles' }) toast(t('cards.pereklassifikaciya-uzhe-zapushchena'), { icon: 'sparkles' })
} else if (r?.reason) { } else if (r?.reason) {
+4 -9
View File
@@ -10,8 +10,8 @@ import { applyMlStatus, refreshMlStatus } from './ml.js'
import { import {
applyContainers, applyContainers,
applyColState, applyColState,
reloadBoardData,
reloadCards, reloadCards,
scheduleBoardReload,
upsertCard, upsertCard,
flashCard, flashCard,
revealCard, revealCard,
@@ -148,15 +148,10 @@ function startRealtime() {
state.dueReminderId = data.id state.dueReminderId = data.id
} else if (type === 'system_status') { } else if (type === 'system_status') {
refreshTgStatus() refreshTgStatus()
} else if (type === 'pipeline_stats' && data) {
// воркер обработал часть очереди: обновляем счётчики вкладки «Обработка»
state.pQueueCounts = { new: data.new || 0, ai: data.ai || 0, total: data.total || 0 }
state.pRejectedCount = data.rejected || 0
} else if (type === 'boards_changed') {
reloadBoardData()
} else if (type === 'cards_reclassified') { } else if (type === 'cards_reclassified') {
// переклассификация карточки/«Неразобранного» завершилась: мягко перечитываем доску и статус ML // Переклассификация карточки/«Неразобранного» завершилась: мягко перечитываем доску и статус ML
reloadBoardData() // (коалесцируется с перезагрузкой инициатора — без двойного запроса).
scheduleBoardReload()
refreshMlStatus() refreshMlStatus()
} }
}) })