From 97bf274c6bfba4123c6dfb83cc22bc6b99bad8be Mon Sep 17 00:00:00 2001 From: lokses Date: Tue, 28 Jul 2026 21:24:35 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A7=D0=B0=D1=82:=20=D0=BF=D0=BE=D0=B8=D1=81?= =?UTF-8?q?=D0=BA=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B9?= =?UTF-8?q?=20=D0=BF=D0=BE=20=D0=B2=D1=81=D0=B5=D0=BC=20=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=B0=D0=BD=D0=B4=D0=B0=D0=BC,=20=D0=B0=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=BF=D0=BE=20=D1=82?= =?UTF-8?q?=D0=B5=D0=BA=D1=83=D1=89=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mattermost search per-team — опрашиваем все команды пользователя параллельно и сливаем результаты с дедупликацией по id. ЛС/групповые попадают в выдачу любой команды. Сбой одной команды не валит весь поиск. Co-Authored-By: Claude Opus 4.8 --- static/assets/js/chat.js | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/static/assets/js/chat.js b/static/assets/js/chat.js index efc5823..7dd9ef5 100644 --- a/static/assets/js/chat.js +++ b/static/assets/js/chat.js @@ -543,19 +543,31 @@ function chatSearchMessages(terms) { var messagesEl = document.getElementById('chat-messages'); if (!resultsEl) return; if (!terms) { chatCloseSearch(); return; } - if (!chatCurrentTeamId) return; + + // Пошук по УСІХ командах (Mattermost search — per-team), результати зливаємо. + // ЛС/групові не прив'язані до команди й потрапляють у видачу будь-якої з них. + var teamIds = Object.keys(chatTeamsById); + if (!teamIds.length && chatCurrentTeamId) teamIds = [chatCurrentTeamId]; + if (!teamIds.length) return; resultsEl.style.display = 'flex'; if (messagesEl) messagesEl.style.display = 'none'; resultsEl.innerHTML = '
Пошук…
'; - chatApiFetch('/teams/' + chatCurrentTeamId + '/posts/search', { - method: 'POST', - headers: {'Content-Type': 'application/json'}, - body: JSON.stringify({terms: terms, is_or_search: false, per_page: 30}), - }).then(function (data) { - var ids = data.order || []; - var posts = ids.map(function (id) { return data.posts[id]; }).filter(Boolean); + var body = JSON.stringify({terms: terms, is_or_search: false, per_page: 30}); + var merged = {}; // id -> post (дедуплікація між командами) + Promise.all(teamIds.map(function (tid) { + return chatApiFetch('/teams/' + tid + '/posts/search', { + method: 'POST', + headers: {'Content-Type': 'application/json'}, + body: body, + }).then(function (data) { + (data.order || []).forEach(function (id) { + if (data.posts && data.posts[id]) merged[id] = data.posts[id]; + }); + }).catch(function () { /* збій однієї команди не валить весь пошук */ }); + })).then(function () { + var posts = Object.keys(merged).map(function (id) { return merged[id]; }); return chatResolveUsernames(posts).then(function () { chatRenderSearchResults(posts); });