From 9c355673892b8f234908178f2929c2e33036f5e02337853a56baae4eae9c6f7b Mon Sep 17 00:00:00 2001 From: AidarKC Date: Tue, 19 May 2026 16:13:44 +0300 Subject: [PATCH] =?UTF-8?q?fix(dm):=20Ctrl+Enter=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=D1=81,=20=D0=B2=D1=80=D0=B5=D0=BC=D1=8F=20?= =?UTF-8?q?=D0=B2=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B5=20=D0=B8=20=D0=B2?= =?UTF-8?q?=D1=8B=D1=80=D0=B0=D0=B2=D0=BD=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BA=D0=B0=D1=80=D1=82=D0=BE=D1=87=D0=B5=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...-ctrl-enter-автоскролл-и-время-в-списке.md | 28 +++++++++++++++ VERSION.properties | 4 +-- shine-UI/js/pages/chat-view.js | 16 ++++++++- shine-UI/js/pages/messages-list.js | 8 ++--- shine-UI/styles/components.css | 36 ++++++++++++++++++- 5 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 Dev_Docs/Pending_Features/2026-05-19_1613_dm-ctrl-enter-автоскролл-и-время-в-списке.md diff --git a/Dev_Docs/Pending_Features/2026-05-19_1613_dm-ctrl-enter-автоскролл-и-время-в-списке.md b/Dev_Docs/Pending_Features/2026-05-19_1613_dm-ctrl-enter-автоскролл-и-время-в-списке.md new file mode 100644 index 0000000..4c31463 --- /dev/null +++ b/Dev_Docs/Pending_Features/2026-05-19_1613_dm-ctrl-enter-автоскролл-и-время-в-списке.md @@ -0,0 +1,28 @@ +# DM: Ctrl+Enter, автоскролл и время в списке + +- Статус: `pending` + +## Что сделано + +- Исправлено поведение ввода в чате: + - `Enter` отправляет сообщение; + - `Ctrl+Enter` добавляет перенос строки в поле ввода. +- В списке личных сообщений время последнего сообщения всегда отображается в правой колонке снизу. +- Бейдж непрочитанных сообщений (если есть) отображается над временем, не заменяя его. +- Обновлены стили карточки диалога для компактного и стабильного выравнивания. + +## Что проверять + +- В чате: + - нажать `Ctrl+Enter` в середине текста и убедиться, что вставляется новая строка; + - нажать `Enter` и убедиться, что сообщение отправляется. +- В списке диалогов: + - при `unread=0` справа снизу показывается время; + - при `unread>0` сверху бейдж, снизу всё равно показывается время; + - длинный текст последнего сообщения обрезается многоточием и не наезжает на время. + +## Ожидаемый результат + +- Управление вводом работает как в постановке. +- Время в карточке диалога не исчезает при наличии непрочитанных сообщений. +- Верстка карточки остаётся компактной и без сдвигов. diff --git a/VERSION.properties b/VERSION.properties index f6a9b74..d8ba1f9 100644 --- a/VERSION.properties +++ b/VERSION.properties @@ -1,2 +1,2 @@ -client.version=1.2.72 -server.version=1.2.66 +client.version=1.2.73 +server.version=1.2.67 diff --git a/shine-UI/js/pages/chat-view.js b/shine-UI/js/pages/chat-view.js index 640c042..d6c3375 100644 --- a/shine-UI/js/pages/chat-view.js +++ b/shine-UI/js/pages/chat-view.js @@ -418,7 +418,21 @@ export function render({ navigate, route }) { input?.addEventListener('input', () => autoResizeComposer(input)); input?.addEventListener('keydown', async (event) => { if (event.key !== 'Enter') return; - if (event.ctrlKey) return; + if (event.ctrlKey) { + event.preventDefault(); + const start = Number(input.selectionStart ?? input.value.length); + const end = Number(input.selectionEnd ?? input.value.length); + const value = String(input.value || ''); + input.value = `${value.slice(0, start)}\n${value.slice(end)}`; + const nextPos = start + 1; + try { + input.setSelectionRange(nextPos, nextPos); + } catch { + // ignore + } + autoResizeComposer(input); + return; + } event.preventDefault(); const text = String(input.value || '').trim(); if (!text) return; diff --git a/shine-UI/js/pages/messages-list.js b/shine-UI/js/pages/messages-list.js index 814bd5c..3ee0e5d 100644 --- a/shine-UI/js/pages/messages-list.js +++ b/shine-UI/js/pages/messages-list.js @@ -42,12 +42,12 @@ export function render({ navigate }) { row.className = 'list-item dm-dialog-card'; row.innerHTML = `
${item.initials}
-
-
- ${item.name} +
+
+ ${item.name} ${item.notInContacts ? 'не в контактах' : ''}
-

${item.lastMessage}

+

${item.lastMessage}

${item.unread ? `${item.unread}` : ''} diff --git a/shine-UI/styles/components.css b/shine-UI/styles/components.css index ed6a707..6d5cdb3 100644 --- a/shine-UI/styles/components.css +++ b/shine-UI/styles/components.css @@ -3405,6 +3405,10 @@ textarea.input { font-weight: 700; } +.dm-screen .list-item { + align-items: stretch; +} + .dm-screen .meta-muted { color: rgba(255, 255, 255, 0.5); } @@ -3430,14 +3434,44 @@ textarea.input { .dm-row-meta-col { display: grid; justify-items: end; - align-content: start; + align-content: end; gap: 6px; min-width: 64px; + align-self: stretch; +} + +.dm-row-main { + min-width: 0; + display: grid; + grid-template-rows: auto auto; + gap: 4px; +} + +.dm-row-title-wrap { + display: flex; + align-items: center; + gap: 8px; + min-width: 0; +} + +.dm-row-title { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.dm-row-last-message { + margin-top: 0 !important; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + padding-right: 6px; } .dm-row-time { font-size: 11px; line-height: 1.2; + white-space: nowrap; } .dm-chat-wrap {