From 5a80a0f501f1a8a818372e4eae15b681fb21fc92 Mon Sep 17 00:00:00 2001 From: Marcelo Schmidt Date: Thu, 24 Dec 2015 11:18:27 -0200 Subject: [PATCH] Added "Jump to" and infinite scroll to message search results --- i18n/en.i18n.json | 1 + .../client/views/pinnedMessages.coffee | 3 - .../client/views/stylesheets/messagepin.less | 11 --- .../client/views/starredMessages.coffee | 3 - .../client/views/stylesheets/messagestar.less | 11 --- .../assets/stylesheets/base.less | 36 +++++++++ .../flex-tab/tabs/messageSearch.coffee | 79 ++++++++++++++++--- .../flex-tab/tabs/messageSearch.html | 41 +++++++--- .../message/message.coffee | 4 +- server/methods/messageSearch.coffee | 11 ++- 10 files changed, 146 insertions(+), 54 deletions(-) diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index bfe22fc2fd4..e70ed2ba3b4 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -318,6 +318,7 @@ "No_groups_yet" : "You have no private groups yet.", "No_livechats" : "You have no livechats.", "No_permission_to_view_room" : "You don't have permission to view this room", + "No_results_found" : "No results found", "no_tokens_for_this_user" : "There are no tokens for this user", "No_user_with_username_%s_was_found" : "No user with username \"%s\" was found!", "Not_allowed" : "Not allowed", diff --git a/packages/rocketchat-message-pin/client/views/pinnedMessages.coffee b/packages/rocketchat-message-pin/client/views/pinnedMessages.coffee index 85720f1dd35..ba6df0cada8 100644 --- a/packages/rocketchat-message-pin/client/views/pinnedMessages.coffee +++ b/packages/rocketchat-message-pin/client/views/pinnedMessages.coffee @@ -5,9 +5,6 @@ Template.pinnedMessages.helpers messages: -> return PinnedMessage.find { rid: @rid }, { sort: { ts: -1 } } - notReadySubscription: -> - return 'notready' unless Template.instance().subscriptionsReady() - hasMore: -> return Template.instance().hasMore.get() diff --git a/packages/rocketchat-message-pin/client/views/stylesheets/messagepin.less b/packages/rocketchat-message-pin/client/views/stylesheets/messagepin.less index bab90b5664a..94248d67b99 100644 --- a/packages/rocketchat-message-pin/client/views/stylesheets/messagepin.less +++ b/packages/rocketchat-message-pin/client/views/stylesheets/messagepin.less @@ -15,17 +15,6 @@ } .pinned-messages-list { - &.notready { - background-image: url(/images/logo/loading.gif); - background-repeat: no-repeat; - background-position: 50% 50%; - height: 100px; - - .message { - display: none; - } - } - li.empty { color: #7f7f7f; text-align: center; diff --git a/packages/rocketchat-message-star/client/views/starredMessages.coffee b/packages/rocketchat-message-star/client/views/starredMessages.coffee index 6565b5f8222..f51eb088a15 100644 --- a/packages/rocketchat-message-star/client/views/starredMessages.coffee +++ b/packages/rocketchat-message-star/client/views/starredMessages.coffee @@ -5,9 +5,6 @@ Template.starredMessages.helpers messages: -> return StarredMessage.find { rid: @rid }, { sort: { ts: -1 } } - notReadySubscription: -> - return 'notready' unless Template.instance().subscriptionsReady() - hasMore: -> return Template.instance().hasMore.get() diff --git a/packages/rocketchat-message-star/client/views/stylesheets/messagestar.less b/packages/rocketchat-message-star/client/views/stylesheets/messagestar.less index 718f1528d4d..83e74cbb29b 100644 --- a/packages/rocketchat-message-star/client/views/stylesheets/messagestar.less +++ b/packages/rocketchat-message-star/client/views/stylesheets/messagestar.less @@ -9,17 +9,6 @@ } .starred-messages-list { - &.notready { - background-image: url(/images/logo/loading.gif); - background-repeat: no-repeat; - background-position: 50% 50%; - height: 100px; - - .message { - display: none; - } - } - li.empty { color: #7f7f7f; text-align: center; diff --git a/packages/rocketchat-theme/assets/stylesheets/base.less b/packages/rocketchat-theme/assets/stylesheets/base.less index 471f876ec52..4cb875a9bbe 100644 --- a/packages/rocketchat-theme/assets/stylesheets/base.less +++ b/packages/rocketchat-theme/assets/stylesheets/base.less @@ -4271,3 +4271,39 @@ a.github-fork { font-size: 40px; } } + +.search-messages-list { + .message-cog-container { + .message-action { + display: none !important; + &.jump-to-star-message { + display: block !important; + } + } + } + + .load-more { + text-transform: lowercase; + text-align: center; + line-height: 40px; + font-style: italic; + + .load-more-loading { + color: #aaa; + } + } + + .no-results { + text-align: center; + } +} + +.messages-box { + .message-cog-container { + .message-action { + &.jump-to-search-message { + display: none !important; + } + } + } +} diff --git a/packages/rocketchat-ui-flextab/flex-tab/tabs/messageSearch.coffee b/packages/rocketchat-ui-flextab/flex-tab/tabs/messageSearch.coffee index 59d128eec8e..633e4e2e846 100644 --- a/packages/rocketchat-ui-flextab/flex-tab/tabs/messageSearch.coffee +++ b/packages/rocketchat-ui-flextab/flex-tab/tabs/messageSearch.coffee @@ -1,3 +1,16 @@ +Meteor.startup -> + RocketChat.MessageAction.addButton + id: 'jump-to-search-message' + icon: 'icon-right-hand' + i18nLabel: 'Jump_to_message' + action: (event, instance) -> + message = @_arguments[1] + $('.message-dropdown:visible').hide() + RoomHistoryManager.getSurroundingMessages(message, 50) + + order: 100 + + Template.messageSearch.helpers tSearchMessages: -> return t('Search_Messages') @@ -5,6 +18,15 @@ Template.messageSearch.helpers searchResultMessages: -> return Template.instance().searchResult.get()?.messages + hasMore: -> + return Template.instance().hasMore.get() + + currentSearchTerm: -> + return Template.instance().currentSearchTerm.get() + + ready: -> + return Template.instance().ready.get() + Template.messageSearch.events "keydown #message-search": (e) -> if e.keyCode is 13 @@ -12,20 +34,57 @@ Template.messageSearch.events "keyup #message-search": _.debounce (e, t) -> value = e.target.value.trim() - if value is '' and t.currentSearchTerm - t.currentSearchTerm = '' + if value is '' and t.currentSearchTerm.get() + t.currentSearchTerm.set '' t.searchResult.set undefined + t.hasMore.set false return - else if value is t.currentSearchTerm + else if value is t.currentSearchTerm.get() return - Tracker.nonreactive -> - Meteor.call 'messageSearch', value, Session.get('openedRoom'), (error, result) -> - if result? and (result.messages?.length > 0 or result.users?.length > 0 or result.channels?.length > 0) - t.searchResult.set result - t.currentSearchTerm = value + t.hasMore.set true + t.limit.set 20 + t.search() , 500 + 'click .message-cog': (e, t) -> + e.stopPropagation() + e.preventDefault() + message_id = $(e.currentTarget).closest('.message').attr('id') + $('.message-dropdown:visible').hide() + $(".search-messages-list \##{message_id} .message-dropdown").remove() + message = Blaze.getData($("\.search-messages-list ##{message_id}")?[0])?._arguments?[1] + if message + actions = RocketChat.MessageAction.getButtons message + el = Blaze.toHTMLWithData Template.messageDropdown, { actions: actions } + $(".search-messages-list \##{message_id} .message-cog-container").append el + dropDown = $(".search-messages-list \##{message_id} .message-dropdown") + dropDown.show() + + 'scroll .content': _.throttle (e, t) -> + if e.target.scrollTop >= e.target.scrollHeight - e.target.clientHeight + t.limit.set(t.limit.get() + 20) + t.search() + , 200 + Template.messageSearch.onCreated -> - this.currentSearchTerm = '' - this.searchResult = new ReactiveVar + @currentSearchTerm = new ReactiveVar '' + @searchResult = new ReactiveVar + + @hasMore = new ReactiveVar true + @limit = new ReactiveVar 20 + @ready = new ReactiveVar true + + @search = => + @ready.set false + value = @$('#message-search').val() + Tracker.nonreactive => + Meteor.call 'messageSearch', value, Session.get('openedRoom'), @limit.get(), (error, result) => + @currentSearchTerm.set value + @ready.set true + if result? and (result.messages?.length > 0 or result.users?.length > 0 or result.channels?.length > 0) + @searchResult.set result + if result.messages?.length + result.users?.length + result.channels?.length < @limit.get() + @hasMore.set false + else + @searchResult.set() diff --git a/packages/rocketchat-ui-flextab/flex-tab/tabs/messageSearch.html b/packages/rocketchat-ui-flextab/flex-tab/tabs/messageSearch.html index 25931d64987..3b31486a97a 100644 --- a/packages/rocketchat-ui-flextab/flex-tab/tabs/messageSearch.html +++ b/packages/rocketchat-ui-flextab/flex-tab/tabs/messageSearch.html @@ -1,17 +1,34 @@ diff --git a/packages/rocketchat-ui-message/message/message.coffee b/packages/rocketchat-ui-message/message/message.coffee index bf417c06df4..7d9bcffbe28 100644 --- a/packages/rocketchat-ui-message/message/message.coffee +++ b/packages/rocketchat-ui-message/message/message.coffee @@ -133,7 +133,7 @@ Template.message.onViewRendered = (context) -> else if previousDataset.username isnt currentDataset.username or parseInt(currentDataset.timestamp) - parseInt(previousDataset.timestamp) > RocketChat.settings.get('Message_GroupingPeriod') * 1000 $currentNode.removeClass('sequential') - else + else if not $currentNode.hasClass 'new-day' $currentNode.addClass('sequential') if nextNode?.dataset? @@ -147,7 +147,7 @@ Template.message.onViewRendered = (context) -> if nextDataset.groupable isnt 'false' if nextDataset.username isnt currentDataset.username or parseInt(nextDataset.timestamp) - parseInt(currentDataset.timestamp) > RocketChat.settings.get('Message_GroupingPeriod') * 1000 $nextNode.removeClass('sequential') - else + else if not $nextNode.hasClass 'new-day' $nextNode.addClass('sequential') if not nextNode? diff --git a/server/methods/messageSearch.coffee b/server/methods/messageSearch.coffee index acd9da18c67..4c5d99a6151 100644 --- a/server/methods/messageSearch.coffee +++ b/server/methods/messageSearch.coffee @@ -1,5 +1,5 @@ Meteor.methods - messageSearch: (text, rid) -> + messageSearch: (text, rid, limit) -> ### text = 'from:rodrigo mention:gabriel chat' ### @@ -13,7 +13,7 @@ Meteor.methods options = sort: ts: -1 - limit: 20 + limit: limit or 20 # Query for senders from = [] @@ -54,14 +54,21 @@ Meteor.methods # $meta: 'textScore' if Object.keys(query).length > 0 + query.t = { $ne: 'rm' } # hide removed messages (userful when searching for user messages) + query._hidden = { $ne: true } # don't return _hidden messages + # Filter by room if rid? query.rid = rid try if Meteor.call('canAccessRoom', rid, this.userId) isnt false + console.log query result.messages = RocketChat.models.Messages.find(query, options).fetch() + # make sure we don't return more than limit results + # limit -= result.messages?.length + # ### # # USERS # ###