feat(chat): ответы на сообщения с цитатой и переходом к оригиналу
Кнопка «Ответить» у каждого сообщения: цитата показывается в новом сообщении и в поле ввода, отмена — ✕ или Escape, переключение треда сбрасывает ответ. Клик по цитате прокручивает ленту к исходному сообщению и подсвечивает его. Цитата повторяет вложение оригинала: имя файла с иконкой, для картинок — миниатюра WebP через существующий /api/chat/files/:token. - chat_messages.reply_to_id: FK на саму таблицу с ON DELETE SET NULL, миграция и ensureChatTables, индекс - POST .../messages принимает reply_to_id и проверяет, что родитель в этом же треде и не удалён; вложения при ошибке подчищаются - цитата едет в списке, при отправке и в SSE правки/удаления, так что у собеседника она обновляется по живому каналу - бэкап: reply_to_id в normalizeRestoreData, при restore ссылка принимается только если родитель восстановился, иначе NULL - shorts: скрывать поле «Резидент» при добавлении без разбора строк
This commit is contained in:
@@ -157,6 +157,7 @@ function openShortsModal(row) {
|
||||
document.getElementById('shortsDate').value = row ? row.lesson_date : todayIso();
|
||||
document.getElementById('shortsTopic').value = row ? (row.topic || '') : '';
|
||||
document.getElementById('shortsResident').value = row ? (row.resident || '') : '';
|
||||
document.getElementById('shortsResidentField').style.display = row ? '' : 'none';
|
||||
document.getElementById('shortsUsed').checked = row ? !!row.used : false;
|
||||
document.getElementById('shortsUsedAt').value = row && row.used_at ? String(row.used_at).slice(0, 10) : '';
|
||||
const usedDisplay = row ? '' : 'none';
|
||||
|
||||
Reference in New Issue
Block a user