Убрать мёртвые SSE-ветки и двойную перезагрузку доски
Удалены ветки boards_changed/pipeline_stats (core их не публикует); перезагрузка при переклассификации коалесцируется scheduleBoardReload. Закрывает TD-SSE-DEAD и TD-DBL-CLICK.
This commit is contained in:
+2
-2
@@ -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 |
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user