From 472ba850f4ca76be61c7cc12df453641fc979f94 Mon Sep 17 00:00:00 2001 From: Nishchal Gautam Date: Sat, 17 Jun 2017 09:58:20 +0700 Subject: [PATCH 1/7] feat: add global search while searching message closes # 1615 --- .../client/tabs/messageSearch.js | 16 +++++++++--- server/methods/messageSearch.js | 25 +++++++++++-------- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/packages/rocketchat-ui-flextab/client/tabs/messageSearch.js b/packages/rocketchat-ui-flextab/client/tabs/messageSearch.js index e62719d4d32d0..41f225c0a45bd 100644 --- a/packages/rocketchat-ui-flextab/client/tabs/messageSearch.js +++ b/packages/rocketchat-ui-flextab/client/tabs/messageSearch.js @@ -8,8 +8,16 @@ Meteor.startup(function() { ], action() { const message = this._arguments[1]; + if (Session.get('openedRoom') === message.rid) { + return RoomHistoryManager.getSurroundingMessages(message, 50); + } + FlowRouter.goToRoomById(message.rid); RocketChat.MessageAction.hideDropDown(); - return RoomHistoryManager.getSurroundingMessages(message, 50); + window.setTimeout(() => { + RoomHistoryManager.getSurroundingMessages(message, 50); + }, 400); + // 400ms is popular among game devs as a good delay before transition starts + // ie. 50, 100, 200, 400, 800 are the favored timings }, order: 100 }); @@ -65,7 +73,7 @@ Template.messageSearch.events({ t.hasMore.set(true); t.limit.set(20); - return t.search(); + return t.search(true); } , 500), @@ -108,11 +116,11 @@ Template.messageSearch.onCreated(function() { this.limit = new ReactiveVar(20); this.ready = new ReactiveVar(true); - return this.search = () => { + return this.search = (globalSearch = false) => { this.ready.set(false); const value = this.$('#message-search').val(); return Tracker.nonreactive(() => { - return Meteor.call('messageSearch', value, Session.get('openedRoom'), this.limit.get(), (error, result) => { + return Meteor.call('messageSearch', value, (globalSearch) ? undefined: Session.get('openedRoom'), this.limit.get(), (error, result) => { this.currentSearchTerm.set(value); this.ready.set(true); if ((result != null) && (((result.messages != null ? result.messages.length : undefined) > 0) || ((result.users != null ? result.users.length : undefined) > 0) || ((result.channels != null ? result.channels.length : undefined) > 0))) { diff --git a/server/methods/messageSearch.js b/server/methods/messageSearch.js index 69d130fa564da..5a04b540cb91f 100644 --- a/server/methods/messageSearch.js +++ b/server/methods/messageSearch.js @@ -14,7 +14,7 @@ Meteor.methods({ }; check(text, String); - check(rid, String); + check(rid, Match.Maybe(String)); check(limit, Match.Optional(Number)); const currentUserId = Meteor.userId(); @@ -182,17 +182,22 @@ Meteor.methods({ query._hidden = { $ne: true // don't return _hidden messages }; - if (rid != null) { + if (rid) { query.rid = rid; - if (Meteor.call('canAccessRoom', rid, currentUserId) !== false) { - if (!RocketChat.settings.get('Message_ShowEditedStatus')) { - options.fields = { - 'editedAt': 0 - }; - } - result.messages = RocketChat.models.Messages.find(query, options).fetch(); - } + // check if user can access rid room + } else { + query.rid = { + $in : RocketChat.models.Rooms.findByContainingUsername(currentUserName) + .fetch() + .map(room => room._id) + }; + } + if (!RocketChat.settings.get('Message_ShowEditedStatus')) { + options.fields = { + 'editedAt': 0 + }; } + result.messages = RocketChat.models.Messages.find(query, options).fetch(); } return result; From 83dc18473e3f2bcdd49fa6655e82c26b00471895 Mon Sep 17 00:00:00 2001 From: Nishchal Gautam Date: Sat, 17 Jun 2017 10:08:25 +0700 Subject: [PATCH 2/7] check user permission to access the room --- server/methods/messageSearch.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server/methods/messageSearch.js b/server/methods/messageSearch.js index 5a04b540cb91f..6acd7f7671b66 100644 --- a/server/methods/messageSearch.js +++ b/server/methods/messageSearch.js @@ -185,6 +185,9 @@ Meteor.methods({ if (rid) { query.rid = rid; // check if user can access rid room + if (Meteor.call('canAccessRoom', rid, currentUserId) !== false) { + return result; + } } else { query.rid = { $in : RocketChat.models.Rooms.findByContainingUsername(currentUserName) From 5b7594f606f49b3d11fece8db791d31667043934 Mon Sep 17 00:00:00 2001 From: Thomas Clayton Date: Tue, 1 Aug 2017 20:12:37 +0300 Subject: [PATCH 3/7] add translations for global search --- packages/rocketchat-i18n/i18n/en.i18n.json | 1 + packages/rocketchat-i18n/i18n/fi.i18n.json | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json index 8f89a01f3d011..12c5338cf6e1a 100644 --- a/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/packages/rocketchat-i18n/i18n/en.i18n.json @@ -641,6 +641,7 @@ "Give_a_unique_name_for_the_custom_oauth": "Give a unique name for the custom oauth", "Give_the_application_a_name_This_will_be_seen_by_your_users": "Give the application a name. This will be seen by your users.", "Global": "Global", + "Global_Search": "Global search", "GoogleCloudStorage": "Google Cloud Storage", "GoogleNaturalLanguage_ServiceAccount_Description": "Service account key JSON file. More information can be found [here](https://cloud.google.com/natural-language/docs/common/auth#set_up_a_service_account)", "GoogleTagManager_id": "Google Tag Manager Id", diff --git a/packages/rocketchat-i18n/i18n/fi.i18n.json b/packages/rocketchat-i18n/i18n/fi.i18n.json index 8dffc605cc79a..ab600d9a5f9c8 100644 --- a/packages/rocketchat-i18n/i18n/fi.i18n.json +++ b/packages/rocketchat-i18n/i18n/fi.i18n.json @@ -466,6 +466,7 @@ "Give_a_unique_name_for_the_custom_oauth": "Anna yksilöllinen nimi mukautettua oauth varten", "Give_the_application_a_name_This_will_be_seen_by_your_users": "Anna sovelluksen nimi. Käyttäjät näkevät tämän.", "Global": "Yleinen", + "Global_Search": "Hae kaikilta kanavilta", "GoogleTagManager_id": "Google Tag Manager Id", "Guest_Pool": "Vieraspooli", "Hash": "Hash", From e5e0e8e46d420dd4a99180c0aece6f10f47244ed Mon Sep 17 00:00:00 2001 From: Tommi Savikko Date: Tue, 1 Aug 2017 22:18:13 +0300 Subject: [PATCH 4/7] add channel names to search results --- .../client/tabs/messageSearch.html | 1 + .../client/tabs/messageSearch.js | 21 +++++++++---------- .../rocketchat-ui-message/client/message.html | 5 +++++ .../rocketchat-ui-message/client/message.js | 9 ++++++++ 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/packages/rocketchat-ui-flextab/client/tabs/messageSearch.html b/packages/rocketchat-ui-flextab/client/tabs/messageSearch.html index 6d5dea5c72dbc..fec79ce64d679 100644 --- a/packages/rocketchat-ui-flextab/client/tabs/messageSearch.html +++ b/packages/rocketchat-ui-flextab/client/tabs/messageSearch.html @@ -9,6 +9,7 @@

{{_ "Search_Messages"}}

diff --git a/packages/rocketchat-ui-flextab/client/tabs/messageSearch.js b/packages/rocketchat-ui-flextab/client/tabs/messageSearch.js index ceb7cb291655d..29bcb451a468e 100644 --- a/packages/rocketchat-ui-flextab/client/tabs/messageSearch.js +++ b/packages/rocketchat-ui-flextab/client/tabs/messageSearch.js @@ -16,7 +16,11 @@ Meteor.startup(function() { if (window.matchMedia('(max-width: 500px)').matches) { Template.instance().tabBar.close(); } - return RoomHistoryManager.getSurroundingMessages(message, 50); + window.setTimeout(() => { + RoomHistoryManager.getSurroundingMessages(message, 50); + }, 400); + // 400ms is popular among game devs as a good delay before transition starts + // ie. 50, 100, 200, 400, 800 are the favored timings }, order: 100 }); @@ -50,6 +54,7 @@ Template.messageSearch.helpers({ message() { return _.extend(this, { customClass: 'search' }); } + }); Template.messageSearch.events({ @@ -69,17 +74,12 @@ Template.messageSearch.events({ } else if (value === t.currentSearchTerm.get()) { return; } - + const globalSearch = $('#global-search').is(':checked'); t.hasMore.set(true); t.limit.set(20); -<<<<<<< HEAD - return t.search(true); + return t.search(globalSearch); } , 500), -======= - return t.search(); - }, 500), ->>>>>>> 00fd6a8bf3b911055d1f53629d56baab01bfca10 'click .message-cog'(e, t) { e.stopPropagation(); @@ -113,8 +113,7 @@ Template.messageSearch.events({ Template.messageSearch.onCreated(function() { this.currentSearchTerm = new ReactiveVar(''); - this.searchResult = new ReactiveVar; - + this.searchResult = new ReactiveVar(); this.hasMore = new ReactiveVar(true); this.limit = new ReactiveVar(20); this.ready = new ReactiveVar(true); @@ -126,7 +125,7 @@ Template.messageSearch.onCreated(function() { return Meteor.call('messageSearch', value, (globalSearch) ? undefined: Session.get('openedRoom'), this.limit.get(), (error, result) => { this.currentSearchTerm.set(value); this.ready.set(true); - if ((result != null) && (((result.messages != null ? result.messages.length : undefined) > 0) || ((result.users != null ? result.users.length : undefined) > 0) || ((result.channels != null ? result.channels.length : undefined) > 0))) { + if ((result != null) && (((result.messages !== null ? result.messages.length : undefined) > 0) || ((result.users != null ? result.users.length : undefined) > 0) || ((result.channels != null ? result.channels.length : undefined) > 0))) { this.searchResult.set(result); if (((result.messages != null ? result.messages.length : undefined) + (result.users != null ? result.users.length : undefined) + (result.channels != null ? result.channels.length : undefined)) < this.limit.get()) { return this.hasMore.set(false); diff --git a/packages/rocketchat-ui-message/client/message.html b/packages/rocketchat-ui-message/client/message.html index 3a02fa4d14b6c..b214930a4c540 100644 --- a/packages/rocketchat-ui-message/client/message.html +++ b/packages/rocketchat-ui-message/client/message.html @@ -22,6 +22,11 @@ {{/if}} {{/if}} + {{#if fromSearch}} + + {{channelName}} + + {{/if}} {{#each roleTags}} {{description}} diff --git a/packages/rocketchat-ui-message/client/message.js b/packages/rocketchat-ui-message/client/message.js index 40def8559037f..6d8658f3eea00 100644 --- a/packages/rocketchat-ui-message/client/message.js +++ b/packages/rocketchat-ui-message/client/message.js @@ -264,6 +264,15 @@ Template.message.helpers({ if (subscription == null) { return 'hidden'; } + }, + channelName() { + return Session.get(`roomData${ this.rid }`).name; + }, + roomIcon() { + return RocketChat.roomTypes.getIcon(Session.get(`roomData${ this.rid }`).t); + }, + fromSearch() { + return (this.customClass==='search'); } }); From da26796a28f794ccf9fffe3d1060ffe48409ed87 Mon Sep 17 00:00:00 2001 From: Tommi Savikko Date: Tue, 1 Aug 2017 22:27:14 +0300 Subject: [PATCH 5/7] fix eslint --- .../client/tabs/messageSearch.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/rocketchat-ui-flextab/client/tabs/messageSearch.js b/packages/rocketchat-ui-flextab/client/tabs/messageSearch.js index 29bcb451a468e..0fc3d236ecec6 100644 --- a/packages/rocketchat-ui-flextab/client/tabs/messageSearch.js +++ b/packages/rocketchat-ui-flextab/client/tabs/messageSearch.js @@ -17,10 +17,10 @@ Meteor.startup(function() { Template.instance().tabBar.close(); } window.setTimeout(() => { - RoomHistoryManager.getSurroundingMessages(message, 50); - }, 400); - // 400ms is popular among game devs as a good delay before transition starts - // ie. 50, 100, 200, 400, 800 are the favored timings + RoomHistoryManager.getSurroundingMessages(message, 50); + }, 400); + // 400ms is popular among game devs as a good delay before transition starts + // ie. 50, 100, 200, 400, 800 are the favored timings }, order: 100 }); @@ -78,8 +78,7 @@ Template.messageSearch.events({ t.hasMore.set(true); t.limit.set(20); return t.search(globalSearch); - } - , 500), + }, 500), 'click .message-cog'(e, t) { e.stopPropagation(); From 7e36607ed2ca641a371519e13097577c13d4947a Mon Sep 17 00:00:00 2001 From: Tommi Savikko Date: Sun, 13 Aug 2017 19:14:54 +0300 Subject: [PATCH 6/7] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a1de201ca5aee..224f0dc2cb335 100644 --- a/README.md +++ b/README.md @@ -267,6 +267,7 @@ It is a great solution for communities and companies wanting to privately host t - File Upload / Sharing - Scalable file sharing - S3 uploads with CDN downloads - Full text search +- Global search (from all channels/rooms at once) - Live chat / Messaging call center - LDAP Authentication - CAS 1.0, 2.0 support for education institutions and hosting providers worldwide From 967d7aa0937df7e0ca3deb34073931d0df103502 Mon Sep 17 00:00:00 2001 From: Rodrigo Nascimento Date: Mon, 12 Feb 2018 11:54:22 -0200 Subject: [PATCH 7/7] Add setting to enable global search --- packages/rocketchat-i18n/i18n/en.i18n.json | 1 + packages/rocketchat-lib/server/startup/settings.js | 8 +++++++- .../client/tabs/messageSearch.html | 8 +++++--- .../client/tabs/messageSearch.js | 7 +++++-- packages/rocketchat-ui-message/client/message.html | 10 +++++----- packages/rocketchat-ui-message/client/message.js | 11 ++++++++--- 6 files changed, 31 insertions(+), 14 deletions(-) diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json index bac7e5b8e50dd..60d32127e5e8c 100644 --- a/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/packages/rocketchat-i18n/i18n/en.i18n.json @@ -1242,6 +1242,7 @@ "Message_DateFormat_Description": "See also: Moment.js", "Message_deleting_blocked": "This message cannot be deleted anymore", "Message_editing": "Message editing", + "Message_GlobalSearch": "Global Search", "Message_GroupingPeriod": "Grouping Period (in seconds)", "Message_GroupingPeriodDescription": "Messages will be grouped with previous message if both are from the same user and the elapsed time was less than the informed time in seconds.", "Message_HideType_au": "Hide \"User Added\" messages", diff --git a/packages/rocketchat-lib/server/startup/settings.js b/packages/rocketchat-lib/server/startup/settings.js index 2271edd7005c8..1aa1c27c51eb9 100644 --- a/packages/rocketchat-lib/server/startup/settings.js +++ b/packages/rocketchat-lib/server/startup/settings.js @@ -1313,10 +1313,16 @@ RocketChat.settings.addGroup('Message', function() { 'public': true }); - return this.add('Message_HideType_mute_unmute', false, { + this.add('Message_HideType_mute_unmute', false, { type: 'boolean', 'public': true }); + + this.add('Message_GlobalSearch', false, { + type: 'boolean', + 'public': true, + alert: 'This feature is currently in beta and could decrease the application performance! Please report bugs to github.com/RocketChat/Rocket.Chat/issues' + }); }); RocketChat.settings.addGroup('Meta', function() { diff --git a/packages/rocketchat-ui-flextab/client/tabs/messageSearch.html b/packages/rocketchat-ui-flextab/client/tabs/messageSearch.html index 4eb73b180bc52..91b5d256cc5d1 100644 --- a/packages/rocketchat-ui-flextab/client/tabs/messageSearch.html +++ b/packages/rocketchat-ui-flextab/client/tabs/messageSearch.html @@ -14,9 +14,11 @@ - + {{#if allowGlobalSearch}} + + {{/if}} diff --git a/packages/rocketchat-ui-flextab/client/tabs/messageSearch.js b/packages/rocketchat-ui-flextab/client/tabs/messageSearch.js index a3a6a658f4bf4..5fd559a1f1882 100644 --- a/packages/rocketchat-ui-flextab/client/tabs/messageSearch.js +++ b/packages/rocketchat-ui-flextab/client/tabs/messageSearch.js @@ -15,7 +15,7 @@ Meteor.startup(function() { } FlowRouter.goToRoomById(message.rid); - RocketChat.MessageAction.hideDropDown(); + // RocketChat.MessageAction.hideDropDown(); if (window.matchMedia('(max-width: 500px)').matches) { Template.instance().tabBar.close(); @@ -59,8 +59,11 @@ Template.messageSearch.helpers({ message() { return _.extend(this, { customClass: 'search', actionContext: 'search'}); - } + }, + allowGlobalSearch() { + return RocketChat.settings.get('Message_GlobalSearch'); + } }); Template.messageSearch.events({ diff --git a/packages/rocketchat-ui-message/client/message.html b/packages/rocketchat-ui-message/client/message.html index 00e3177084a13..21d59b1f887ed 100644 --- a/packages/rocketchat-ui-message/client/message.html +++ b/packages/rocketchat-ui-message/client/message.html @@ -22,11 +22,6 @@ {{/if}} {{/if}} - {{#if fromSearch}} - - {{channelName}} - - {{/if}} {{#each roleTags}} {{description}} @@ -55,6 +50,11 @@ {{_ "Only_you_can_see_this_message"}} {{/if}} + {{#if fromSearch}} + + {{>icon icon=roomIcon}}{{channelName}} + + {{/if}}
{{#if isSnippet}}
{{_ "Snippet_name"}}: {{snippetName}}
diff --git a/packages/rocketchat-ui-message/client/message.js b/packages/rocketchat-ui-message/client/message.js index 58cc084f6a5cf..3b42c51c3880d 100644 --- a/packages/rocketchat-ui-message/client/message.js +++ b/packages/rocketchat-ui-message/client/message.js @@ -266,13 +266,18 @@ Template.message.helpers({ } }, channelName() { - return Session.get(`roomData${ this.rid }`).name; + const subscription = RocketChat.models.Subscriptions.findOne({rid: this.rid}); + return subscription && subscription.name; }, roomIcon() { - return RocketChat.roomTypes.getIcon(Session.get(`roomData${ this.rid }`).t); + const room = Session.get(`roomData${ this.rid }`); + if (room && room.t === 'd') { + return 'at'; + } + return RocketChat.roomTypes.getIcon(room && room.t); }, fromSearch() { - return (this.customClass==='search'); + return this.customClass === 'search'; }, actionContext() { return this.actionContext;