intra_monitor/public/js/mentions.js
2026-03-18 14:19:29 +03:00

60 lines
2.4 KiB
JavaScript

async function loadMentions() {
const d=await apiGet('/api/mentions');
if(!d) return;
mentionsData = d.mentions||[];
mentionUnread = d.unread||0;
renderMentionsBell();
}
function renderMentionsBell() {
const badge=document.getElementById('notif-badge');
const btn =document.getElementById('notif-btn');
if(!badge||!btn) return;
if(mentionUnread>0){badge.textContent=mentionUnread;badge.style.display='block';}
else badge.style.display='none';
}
function toggleMentionsDropdown() {
const dd=document.getElementById('mentions-dropdown');
if(!dd) return;
const isOpen=dd.classList.contains('open');
dd.classList.toggle('open',!isOpen);
if(!isOpen) renderMentionsList();
}
document.addEventListener('click',e=>{
const dd=document.getElementById('mentions-dropdown');
if(dd&&!document.getElementById('notif-btn')?.contains(e.target)&&!dd.contains(e.target)) dd.classList.remove('open');
});
function renderMentionsList() {
const el=document.getElementById('mentions-list');
if(!el) return;
if(!mentionsData.length){el.innerHTML='<div class="mentions-empty">Нет упоминаний</div>';return;}
el.innerHTML=mentionsData.slice(0,10).map(m=>{
const unread=!m.read_at;
const task=allData.find(d=>String(d.task.id)===String(m.task_id));
const num=task?(task.task.tasknumber||task.task.id):m.task_id;
return`<div class="mention-item ${unread?'unread':''}" onclick="jumpToMention('${m.task_id}')">
<span class="m-dot ${unread?'':'read'}"></span>
<span class="m-task">#${num}</span>
<span class="m-by">↩ ${esc(m.mentioned_by)}</span>
<span class="m-time">${timeAgo(new Date(m.created_at))}</span>
</div>`;
}).join('');
}
async function jumpToMention(taskId) {
document.getElementById('mentions-dropdown')?.classList.remove('open');
STATE_CHIP_KEYS.forEach(k=>stateChips[k]=true);
['chip-reply','chip-wait','chip-resolved','chip-hidden','chip-unmarked'].forEach(id=>document.getElementById(id)?.classList.remove('inactive'));
document.getElementById('chip-all')?.classList.remove('off');
const idx=allData.findIndex(d=>String(d.task.id)===String(taskId));
if(idx!==-1){
currentPage=1; renderTable();
setTimeout(()=>{
const row=document.querySelector(`tbody tr[data-idx="${idx}"]`);
if(row) row.scrollIntoView({behavior:'smooth',block:'center'});
openDetail(idx);
},100);
}
}