Merge pull request #1749 from RocketChat/message-search

Added "Jump to" and infinite scroll to message search results
pull/1751/head
Gabriel Engel 10 years ago
commit 341e39f4ef
  1. 1
      i18n/en.i18n.json
  2. 3
      packages/rocketchat-message-pin/client/views/pinnedMessages.coffee
  3. 11
      packages/rocketchat-message-pin/client/views/stylesheets/messagepin.less
  4. 3
      packages/rocketchat-message-star/client/views/starredMessages.coffee
  5. 11
      packages/rocketchat-message-star/client/views/stylesheets/messagestar.less
  6. 36
      packages/rocketchat-theme/assets/stylesheets/base.less
  7. 79
      packages/rocketchat-ui-flextab/flex-tab/tabs/messageSearch.coffee
  8. 41
      packages/rocketchat-ui-flextab/flex-tab/tabs/messageSearch.html
  9. 4
      packages/rocketchat-ui-message/message/message.coffee
  10. 11
      server/methods/messageSearch.coffee

@ -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 <strong>\"%s\"</strong> was found!",
"Not_allowed" : "Not allowed",

@ -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()

@ -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;

@ -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()

@ -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;

@ -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;
}
}
}
}

@ -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()

@ -1,17 +1,34 @@
<template name="messageSearch">
<div class="content">
<div class="control">
<form class="search-form" role="form">
<div class="input-line search">
<input type="text" id="message-search" class="search" placeholder="{{tSearchMessages}}" autocomplete="off" />
<i class="icon-right-open-small"></i>
</div>
</form>
<div class="list-view search-messages-list">
<div class="control">
<form class="search-form" role="form">
<div class="input-line search">
<input type="text" id="message-search" class="search" placeholder="{{tSearchMessages}}" autocomplete="off" />
<i class="icon-right-open-small"></i>
</div>
</form>
</div>
<ul class="list clearfix">
{{#if currentSearchTerm}}
{{#if searchResultMessages}}
{{#each searchResultMessages}}
{{#nrr nrrargs 'message' .}}{{/nrr}}
{{/each}}
{{#if hasMore}}
<li class="load-more">
{{#if ready}}
<a href="">{{_ "Has_more"}}...</a>
{{else}}
<div class="load-more-loading">{{_ "Loading..."}}</div>
{{/if}}
</li>
{{/if}}
{{else}}
<h2 class="no-results">{{_ "No_results_found"}}</h2>
{{/if}}
{{/if}}
</ul>
</div>
<ul>
{{#each searchResultMessages}}
{{#nrr nrrargs 'message' .}}{{/nrr}}
{{/each}}
</ul>
</div>
</template>

@ -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?

@ -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
# ###

Loading…
Cancel
Save