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:
@@ -49,6 +49,15 @@
|
||||
<div class="chat-messages" id="chatMessages"></div>
|
||||
|
||||
<div class="chat-composer">
|
||||
<div class="chat-reply-bar" id="chatReplyBar" hidden>
|
||||
<i data-lucide="corner-up-left"></i>
|
||||
<span class="chat-reply-meta">
|
||||
<span class="chat-reply-who" id="chatReplyWho"></span>
|
||||
<span class="chat-reply-text" id="chatReplyText"></span>
|
||||
<span class="chat-reply-file" id="chatReplyFile" hidden></span>
|
||||
</span>
|
||||
<button type="button" class="chat-attach-del" id="chatReplyCancel" title="Отменить ответ">✕</button>
|
||||
</div>
|
||||
<div class="chat-attach-list" id="chatAttachList" hidden></div>
|
||||
<div class="chat-compose-row">
|
||||
<button class="chat-attach-btn" id="chatAttachBtn" type="button" title="Прикрепить файл или фото"><i data-lucide="paperclip"></i></button>
|
||||
|
||||
Reference in New Issue
Block a user