fix: ревью онлайн-урока — 8 исправлений багов, уязвимостей и улучшений
- draw_permitted: emit→emitToUser (WS доставка вместо SSE-only) - raised hands: убран in-memory Map, единый источник — таблица classroom_hands - endSession: очистка classroom_hands при завершении сессии - VALID_THEMES: исправлен список (добавлен corkboard, убраны dark/grid/dots) - XSS: crLoadOnlineStudents — inline onclick заменён на data-* + addEventListener - signal(): проверка что target_user_id является участником сессии - WS rate-limit: 120 msg/sec per connection - invalidateSession при join/leave для мгновенной видимости новых участников Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -3858,13 +3858,16 @@
|
||||
list.innerHTML = students.map(u => {
|
||||
const initials = (u.name || '?').split(' ').slice(0,2).map(w=>w[0]?.toUpperCase()||'').join('') || '?';
|
||||
const sel = _selectedUsers.find(s => s.id === u.id) ? 'selected' : '';
|
||||
return `<div class="cr-online-item ${sel}" id="cr-oi-${u.id}" onclick="crToggleOnlineUser(${u.id}, '${(u.name||'').replace(/'/g,"\\'")}')">
|
||||
return `<div class="cr-online-item ${sel}" id="cr-oi-${u.id}" data-uid="${u.id}" data-uname="${LS.esc(u.name || '')}">
|
||||
<span class="cr-online-dot"></span>
|
||||
<div class="cr-online-avatar">${initials}</div>
|
||||
<span class="cr-online-name">${LS.esc(u.name || u.email)}</span>
|
||||
<span class="cr-online-check"></span>
|
||||
</div>`;
|
||||
}).join('');
|
||||
list.querySelectorAll('.cr-online-item').forEach(el => {
|
||||
el.addEventListener('click', () => crToggleOnlineUser(Number(el.dataset.uid), el.dataset.uname));
|
||||
});
|
||||
if (window.lucide) lucide.createIcons();
|
||||
} catch { list.innerHTML = '<div class="cr-online-empty">Ошибка загрузки</div>'; }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user