Чат: сортировка по активности, непрочитанные, кнопка «Написати»

- Порядок каналов/ЛС — по реальному времени последнего поста (тянем per-channel,
  т.к. last_post_at из списка каналов ненадёжен), архивные (delete_at>0) — вниз
- Непрочитанные: счётчик по websocket, бейдж на строке + жирное имя, префикс
  «(N)» в тайтле, браузерное уведомление; сброс при открытии канала
- Кнопка «Написати в чат» на карточке сотрудника → /chat/?dm=<mm_id>,
  чат открывает/создаёт ЛС с этим человеком (идемпотентный /channels/direct)
- Тесты кнопки чата в EmployeeDetailTests

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-28 16:08:53 +03:00
parent ea2cc9daca
commit 85bd89f762
3 changed files with 158 additions and 9 deletions
+8 -1
View File
@@ -12,8 +12,15 @@
До списку співробітників
</a>
<div style="display:flex; align-items:center; gap:0.5rem;">
<a href="/tasks/?responsible={{ employee.pk }}" hx-get="/tasks/?responsible={{ employee.pk }}" hx-target="#main-content" hx-push-url="/tasks/?responsible={{ employee.pk }}" hx-indicator="#loader"
{% if employee.mattermost_user_id and employee.pk != request.user.pk %}
<a href="/chat/?dm={{ employee.mattermost_user_id }}" hx-get="/chat/?dm={{ employee.mattermost_user_id }}" hx-target="#main-content" hx-push-url="/chat/?dm={{ employee.mattermost_user_id }}" hx-indicator="#loader"
class="btn btn-primary" style="font-size:0.8125rem; text-decoration:none; display:inline-flex; align-items:center; gap:0.375rem;">
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg>
Написати в чат
</a>
{% endif %}
<a href="/tasks/?responsible={{ employee.pk }}" hx-get="/tasks/?responsible={{ employee.pk }}" hx-target="#main-content" hx-push-url="/tasks/?responsible={{ employee.pk }}" hx-indicator="#loader"
class="btn btn-secondary" style="font-size:0.8125rem; text-decoration:none; display:inline-flex; align-items:center; gap:0.375rem;">
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="12" x2="12" y1="5" y2="19"/><line x1="5" x2="19" y1="12" y2="12"/></svg>
Призначити задачу
</a>