diff --git a/static/assets/js/chat.js b/static/assets/js/chat.js index 61136a7..92b92d1 100644 --- a/static/assets/js/chat.js +++ b/static/assets/js/chat.js @@ -23,6 +23,8 @@ var chatUploadedFileNames = {}; var chatFileBlobCache = {}; var chatDmPickerSelected = {}; var chatReactionPickerEl = null; +var chatCurrentTeamId = null; // обрана «кімната» (команда Mattermost) +var chatDmOtherUserId = {}; // channelId -> id співрозмовника (для аватара ЛС) function chatPanelOpen(id) { var panel = document.getElementById(id); @@ -71,6 +73,8 @@ function chatInit() { chatUploadedFileNames = {}; chatFileBlobCache = {}; chatDmPickerSelected = {}; + chatCurrentTeamId = null; + chatDmOtherUserId = {}; chatLoadTeams().then(chatLoadChannels); chatConnectSocket(); @@ -140,9 +144,43 @@ function chatResolveUsernames(posts) { function chatLoadTeams() { return chatApiFetch('/users/me/teams').then(function (teams) { teams.forEach(function (team) { chatTeamsById[team.id] = team; }); + var sorted = teams.slice().sort(function (a, b) { return a.display_name.localeCompare(b.display_name); }); + if (!chatCurrentTeamId && sorted.length) chatCurrentTeamId = sorted[0].id; + chatRenderTeamSwitcher(); }).catch(function (e) { console.error(e); }); } +// Верхній перемикач «кімнат» — команди Mattermost (Офіс / Аптеки / Склад). +function chatRenderTeamSwitcher() { + var el = document.getElementById('chat-team-switcher'); + if (!el) return; + var teams = Object.keys(chatTeamsById).map(function (id) { return chatTeamsById[id]; }) + .sort(function (a, b) { return a.display_name.localeCompare(b.display_name); }); + if (teams.length <= 1) { el.innerHTML = ''; return; } // перемикати нема що + + el.innerHTML = ''; + var group = document.createElement('div'); + group.style.cssText = 'display:inline-flex; gap:0.25rem; background:var(--color-muted); border-radius:var(--radius); padding:0.25rem;'; + teams.forEach(function (t) { + var active = t.id === chatCurrentTeamId; + var btn = document.createElement('button'); + btn.type = 'button'; + btn.textContent = t.display_name; + btn.style.cssText = 'padding:0.3125rem 0.875rem; font-size:0.8125rem; font-weight:500; border:none; cursor:pointer; border-radius:calc(var(--radius) - 2px); transition:all 150ms;' + + (active ? ' background:var(--color-card); color:var(--color-card-foreground); box-shadow:0 1px 2px rgb(0 0 0/0.08);' + : ' background:transparent; color:var(--color-muted-foreground);'); + btn.onclick = function () { chatSelectTeam(t.id); }; + group.appendChild(btn); + }); + el.appendChild(group); +} + +function chatSelectTeam(teamId) { + chatCurrentTeamId = teamId; + chatRenderTeamSwitcher(); + chatRenderChannelList(); +} + function chatLoadChannels() { return chatApiFetch('/users/me/channels').then(function (channels) { chatChannels = channels @@ -161,8 +199,10 @@ function chatLoadChannels() { function chatResolveDmLabel(channel) { var promise; + var otherId = null; if (channel.type === 'D') { - var otherId = channel.name.split('__').filter(function (id) { return id !== chatConfig.currentUserId; })[0]; + otherId = channel.name.split('__').filter(function (id) { return id !== chatConfig.currentUserId; })[0]; + chatDmOtherUserId[channel.id] = otherId; promise = chatResolveUserIds([otherId]).then(function () { return chatUserNames[otherId] || otherId; }); @@ -178,6 +218,11 @@ function chatResolveDmLabel(channel) { chatDmLabels[channel.id] = label; var labelEl = document.getElementById('chat-dm-label-' + channel.id); if (labelEl) labelEl.textContent = label; + var avEl = document.getElementById('chat-dm-avatar-' + channel.id); + if (avEl) { + avEl.textContent = (label || '').slice(0, 2).toUpperCase(); + if (otherId) chatApplyAvatar(avEl, otherId); // фото — лише для особистих (не групових) + } if (chatCurrentChannelId === channel.id) chatUpdateHeader(channel); }).catch(function (e) { console.error(e); }); } @@ -186,15 +231,19 @@ function chatRenderChannelList() { var el = document.getElementById('chat-channel-list'); if (!el) return; - if (!chatChannels.length) { + var list = chatChannels.filter(function (ch) { + return !chatCurrentTeamId || ch.team_id === chatCurrentTeamId; + }); + + if (!list.length) { el.innerHTML = '