Skip to content

Commit ca8d55e

Browse files
Closes #625: Filter and sorts direct messages and private groups.
1 parent b79a08a commit ca8d55e

16 files changed

+342
-22
lines changed

.jshintrc

+1
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797
"swal" : true,
9898
"t" : true,
9999
"TAPi18n" : true,
100+
"Template" : true,
100101
"toastr" : true,
101102
"Tracker" : true,
102103
"TimeSync" : true

HISTORY.md

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
## NEXT
22

33
- Fixes #2477: Admin settings, plain-text SMTP password.
4+
- Closes #625: Filter and sorts direct messages and private groups.
45

56
## 0.22.0, 2016-Mar-14
67

i18n/en.i18n.json

+10
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@
8989
"Administration" : "Administration",
9090
"After_OAuth2_authentication_users_will_be_redirected_to_this_URL" : "After OAuth2 authentication, users will be redirected to this URL",
9191
"Alias" : "Alias",
92+
"All" : "All",
9293
"All_channels" : "All channels",
9394
"Allow_Invalid_SelfSigned_Certs" : "Allow Invalid Self-Signed Certs",
9495
"Allow_Invalid_SelfSigned_Certs_Description" : "Allow invalid and self-signed SSL certificate's for link validation and previews.",
@@ -172,6 +173,7 @@
172173
"Desktop_Notifications_Enabled" : "Desktop Notifications are Enabled",
173174
"Direct_message_someone" : "Direct message someone",
174175
"Direct_Messages" : "Direct Messages",
176+
"Direct_Messages_list" : "Direct Messages",
175177
"Disable_Favorite_Rooms" : "Disable Favorites",
176178
"Disable_New_Message_Notification" : "Disable New Message Notification",
177179
"Disable_New_Room_Notification" : "Disable New Room Notification",
@@ -235,6 +237,7 @@
235237
"GoogleTagManager_id" : "Google Tag Manager Id",
236238
"Has_more" : "Has more",
237239
"Have_your_own_chat" : "Have your own web chat. Developed with Meteor.com, the Rocket.Chat is a great solution for developers looking forward to build and evolve their own chat platform.",
240+
"Hidden" : "Hidden",
238241
"Hide_Group_Warning" : "Are you sure you want to hide the group \"%s\"?",
239242
"Hide_Private_Warning" : "Are you sure you want to hide the discussion with \"%s\"?",
240243
"Hide_room" : "Hide room",
@@ -286,6 +289,7 @@
286289
"Join_audio_call" : "Join audio call",
287290
"Join_the_Community" : "Join the Community",
288291
"Join_video_call" : "Join video call",
292+
"Joined" : "Joined",
289293
"Jump" : "Jump",
290294
"Jump_to_first_unread" : "Jump to first unread",
291295
"Jump_to_message" : "Jump to message",
@@ -294,6 +298,7 @@
294298
"Language_Version" : "English Version",
295299
"Last_login" : "Last login",
296300
"Last_message" : "Last message",
301+
"Last_seen" : "Last seen",
297302
"Layout" : "Layout",
298303
"Layout_Home_Body" : "Home Body",
299304
"Layout_Home_Title" : "Home Title",
@@ -350,6 +355,7 @@
350355
"Leave_room" : "Leave room",
351356
"Leave_Room_Warning" : "Are you sure you want to leave the room \"%s\"?",
352357
"line" : "line",
358+
"List_of_Direct_Messages" : "List of Direct Messages",
353359
"Load_more" : "Load more",
354360
"Loading..." : "Loading...",
355361
"Loading_more_from_history" : "Loading more from history",
@@ -401,6 +407,7 @@
401407
"Meta_robots" : "Robots",
402408
"minutes" : "minutes",
403409
"More_channels" : "More channels",
410+
"More_direct_messages" : "More direct messages",
404411
"More_groups" : "More private groups",
405412
"More_unreads" : "More unreads",
406413
"Msgs" : "Msgs",
@@ -444,6 +451,7 @@
444451
"Old_and_new_password_required" : "You need to provide both old and new password for changing your password.",
445452
"Online" : "Online",
446453
"Only_you_can_see_this_message" : "Only you can see this message",
454+
"Open" : "Open",
447455
"Oops!" : "Oops",
448456
"Opt_out_statistics" : "Don't send my statistics to Rocket.Chat",
449457
"Opt_out_statistics_warning" : "By sending your statistics, you'll help us identify how many instances of Rocket.Chat are deployed, as well as how good the system is behaving, so we can further improve it. Don't worry, as no user information is sent and all the information we receive is kept confidential. If you want to continue sending us your statistics, uncheck the above checkbox. Thank you.",
@@ -550,7 +558,9 @@
550558
"Script_Enabled" : "Script Enabled",
551559
"Search" : "Search",
552560
"Search_Channels" : "Search Channels",
561+
"Search_Direct_Messages" : "Search Direct Messages",
553562
"Search_Messages" : "Search Messages",
563+
"Search_Private_Groups" : "Search Private Groups",
554564
"Search_settings" : "Search settings",
555565
"seconds" : "seconds",
556566
"See_all" : "See all",

packages/rocketchat-lib/server/models/Subscriptions.coffee

+17
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,23 @@ RocketChat.models.Subscriptions = new class extends RocketChat.models._Base
3434

3535
return @find query, options
3636

37+
findByType: (types, options) ->
38+
query =
39+
t:
40+
$in: types
41+
42+
return @find query, options
43+
44+
findByNameContainingAndTypes: (name, types, options) ->
45+
nameRegex = new RegExp s.trim(s.escapeRegExp(name)), "i"
46+
47+
query =
48+
t:
49+
$in: types
50+
name: nameRegex
51+
52+
return @find query, options
53+
3754
getLastSeen: (options = {}) ->
3855
query = { ls: { $exists: 1 } }
3956
options.sort = { ls: -1 }

packages/rocketchat-theme/assets/stylesheets/base.less

+6-1
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ blockquote {
339339
}
340340
.icon-search,
341341
.icon-right-open-small,
342-
.icon-sort-alt-up {
342+
.icon-sort-alt-up, .icon-comment {
343343
position: absolute;
344344
left: 2px;
345345
top: 10px;
@@ -1542,6 +1542,11 @@ a.github-fork {
15421542
.icon-logout {
15431543
margin-left: 1px;
15441544
}
1545+
1546+
&.fixed {
1547+
opacity: 1;
1548+
.transform(translateX(0));
1549+
}
15451550
}
15461551
i {
15471552
font-size: 14px;

packages/rocketchat-ui-sidenav/package.js

+2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ Package.onUse(function(api) {
2929
api.addFiles('side-nav/directMessages.html', 'client');
3030
api.addFiles('side-nav/directMessagesFlex.html', 'client');
3131
api.addFiles('side-nav/listChannelsFlex.html', 'client');
32+
api.addFiles('side-nav/listDirectMessagesFlex.html', 'client');
3233
api.addFiles('side-nav/listPrivateGroupsFlex.html', 'client');
3334
api.addFiles('side-nav/privateGroups.html', 'client');
3435
api.addFiles('side-nav/privateGroupsFlex.html', 'client');
@@ -44,6 +45,7 @@ Package.onUse(function(api) {
4445
api.addFiles('side-nav/directMessages.coffee', 'client');
4546
api.addFiles('side-nav/directMessagesFlex.coffee', 'client');
4647
api.addFiles('side-nav/listChannelsFlex.coffee', 'client');
48+
api.addFiles('side-nav/listDirectMessagesFlex.js', 'client');
4749
api.addFiles('side-nav/listPrivateGroupsFlex.coffee', 'client');
4850
api.addFiles('side-nav/privateGroups.coffee', 'client');
4951
api.addFiles('side-nav/privateGroupsFlex.coffee', 'client');

packages/rocketchat-ui-sidenav/side-nav/channels.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@ <h3 class="add-room {{isActive}}">
1212
<p class="empty">{{_ "No_channels_yet" }}</p>
1313
{{/each}}
1414
</ul>
15-
<a href="" class="more more-channels">{{_ "More_channels"}} ..</a>
15+
<a href="" class="more more-channels">{{_ "More_channels"}}...</a>
1616
</template>

packages/rocketchat-ui-sidenav/side-nav/directMessages.coffee

+4
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,7 @@ Template.directMessages.events
1414
'click .add-room': (e, instance) ->
1515
SideNav.setFlex "directMessagesFlex"
1616
SideNav.openFlex()
17+
18+
'click .more-direct-messages': ->
19+
SideNav.setFlex "listDirectMessagesFlex"
20+
SideNav.openFlex()

packages/rocketchat-ui-sidenav/side-nav/directMessages.html

+1
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@ <h3 class="add-room {{isActive}}">
99
{{else}}
1010
<p class="empty">{{_ "No_direct_messages_yet" }}</p>
1111
{{/each}}
12+
<a href="" class="more more-direct-messages">{{_ "More_direct_messages"}}...</a>
1213
</ul>
1314
</template>

packages/rocketchat-ui-sidenav/side-nav/listChannelsFlex.coffee

+53-14
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,16 @@ Template.listChannelsFlex.helpers
33
return Template.instance().channelsList?.get()
44
hasMore: ->
55
return Template.instance().hasMore.get()
6-
tSearchChannels: ->
7-
return t('Search_Channels')
8-
sortSelected: (sort) ->
9-
return Template.instance().sort.get() is sort
6+
sortChannelsSelected: (sort) ->
7+
return Template.instance().sortChannels.get() is sort
8+
sortSubscriptionsSelected: (sort) ->
9+
return Template.instance().sortSubscriptions.get() is sort
10+
showSelected: (show) ->
11+
return Template.instance().show.get() is show
12+
member: ->
13+
return !!RocketChat.models.Subscriptions.findOne({ name: @name, open: true })
14+
hidden: ->
15+
return !!RocketChat.models.Subscriptions.findOne({ name: @name, open: false })
1016

1117
Template.listChannelsFlex.events
1218
'click header': ->
@@ -26,28 +32,61 @@ Template.listChannelsFlex.events
2632
SideNav.leaveArrow()
2733

2834
'scroll .content': _.throttle (e, t) ->
29-
if e.target.scrollTop >= e.target.scrollHeight - e.target.clientHeight
35+
if t.hasMore.get() and e.target.scrollTop >= e.target.scrollHeight - e.target.clientHeight
3036
t.limit.set(t.limit.get() + 50)
3137
, 200
3238

3339
'keyup #channel-search': _.debounce (e, instance) ->
3440
instance.nameFilter.set($(e.currentTarget).val())
3541
, 300
3642

37-
'change #sort': (e, instance) ->
38-
instance.sort.set($(e.currentTarget).val())
43+
'change #sort-channels': (e, instance) ->
44+
instance.sortChannels.set($(e.currentTarget).val())
45+
46+
'change #sort-subscriptions': (e, instance) ->
47+
instance.sortSubscriptions.set($(e.currentTarget).val())
48+
49+
'change #show': (e, instance) ->
50+
show = $(e.currentTarget).val()
51+
if show is 'joined'
52+
instance.$('#sort-channels').hide();
53+
instance.$('#sort-subscriptions').show();
54+
else
55+
instance.$('#sort-channels').show();
56+
instance.$('#sort-subscriptions').hide();
57+
instance.show.set(show)
3958

4059
Template.listChannelsFlex.onCreated ->
4160
@channelsList = new ReactiveVar []
4261
@hasMore = new ReactiveVar true
4362
@limit = new ReactiveVar 50
4463
@nameFilter = new ReactiveVar ''
45-
@sort = new ReactiveVar 'msgs'
64+
@sortChannels = new ReactiveVar 'msgs'
65+
@sortSubscriptions = new ReactiveVar 'name'
66+
@show = new ReactiveVar 'joined'
4667

4768
@autorun =>
48-
Meteor.call 'channelsList', @nameFilter.get(), @limit.get(), @sort.get(), (err, result) =>
49-
if result
50-
@hasMore.set true
51-
@channelsList.set result.channels
52-
if result.channels.length < @limit.get()
53-
@hasMore.set false
69+
if @show.get() is 'joined'
70+
@hasMore.set true
71+
options = { fields: { name: 1 } }
72+
if _.isNumber @limit.get()
73+
options.limit = @limit.get()
74+
if _.trim(@sortSubscriptions.get())
75+
switch @sortSubscriptions.get()
76+
when 'name'
77+
options.sort = { name: 1 }
78+
when 'ls'
79+
options.sort = { ls: -1 }
80+
@channelsList.set RocketChat.models.Subscriptions.find({
81+
name: new RegExp s.trim(s.escapeRegExp(@nameFilter.get())), "i"
82+
t: 'c'
83+
}, options).fetch()
84+
if @channelsList.get().length < @limit.get()
85+
@hasMore.set false
86+
else
87+
Meteor.call 'channelsList', @nameFilter.get(), @limit.get(), @sortChannels.get(), (err, result) =>
88+
if result
89+
@hasMore.set true
90+
@channelsList.set result.channels
91+
if result.channels.length < @limit.get()
92+
@hasMore.set false

packages/rocketchat-ui-sidenav/side-nav/listChannelsFlex.html

+23-4
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,27 @@ <h4>{{_ "Channels"}}</h4>
1010
<div class="search">
1111
<form class="search-form" role="form">
1212
<div class="input-line search">
13-
<input type="text" id="channel-search" class="search" placeholder="{{tSearchChannels}}" autocomplete="off" />
13+
<input type="text" id="channel-search" class="search" placeholder="{{_ "Search_Channels"}}" autocomplete="off" />
1414
<i class="icon-right-open-small"></i>
1515
</div>
1616
<div class="input-line search">
17-
<select class="c-select" id="sort">
18-
<option value="name" selected="{{sortSelected 'name'}}">{{_ "Name"}}</option>
19-
<option value="msgs" selected="{{sortSelected 'msgs'}}">{{_ "Number_of_messages"}}</option>
17+
<select class="c-select" id="sort-channels" style="display: none">
18+
<option value="name" selected="{{sortChannelsSelected 'name'}}">{{_ "Name"}}</option>
19+
<option value="msgs" selected="{{sortChannelsSelected 'msgs'}}">{{_ "Number_of_messages"}}</option>
20+
</select>
21+
<select class="c-select" id="sort-subscriptions">
22+
<option value="name" selected="{{sortSubscriptionsSelected 'name'}}">{{_ "Name"}}</option>
23+
<option value="ls" selected="{{sortSubscriptionsSelected 'ls'}}">{{_ "Last_seen"}}</option>
2024
</select>
2125
<i class="icon-sort-alt-up"></i>
2226
</div>
27+
<div class="input-line search">
28+
<select class="c-select" id="show">
29+
<option value="joined" selected="{{showSelected 'joined'}}">{{_ "Joined"}}</option>
30+
<option value="all" selected="{{showSelected 'all'}}">{{_ "All"}}</option>
31+
</select>
32+
<i class="icon-comment"></i>
33+
</div>
2334
</form>
2435
</div>
2536
</div>
@@ -30,6 +41,14 @@ <h4>{{_ "Channels_list"}}</h4>
3041
<a href="{{pathFor 'channel' name=name}}" class="channel-link">
3142
<i class="icon-hash"></i>
3243
{{name}}
44+
<span class='opt fixed'>
45+
{{#if member}}
46+
<i class="icon-eye" title="{{_ "Open"}}" aria-label="{{_ "Open"}}"></i>
47+
{{/if}}
48+
{{#if hidden}}
49+
<i class="icon-eye-off" title="{{_ "Hidden"}}" aria-label="{{_ "Hidden"}}"></i>
50+
{{/if}}
51+
</span>
3352
</a>
3453
</li>
3554
{{/each}}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<template name="listDirectMessagesFlex">
2+
<header>
3+
<div>
4+
<h4>{{_ "Direct_Messages"}}</h4>
5+
</div>
6+
</header>
7+
<div class="content">
8+
<div class="wrapper">
9+
<div class="flex-control">
10+
<div class="search">
11+
<form class="search-form" role="form">
12+
<div class="input-line search">
13+
<input type="text" id="channel-search" class="search" placeholder="{{_ "Search_Direct_Messages"}}" autocomplete="off" />
14+
<i class="icon-right-open-small"></i>
15+
</div>
16+
<div class="input-line search">
17+
<select class="c-select" id="sort">
18+
<option value="name" selected="{{sortSelected 'name'}}">{{_ "Name"}}</option>
19+
<option value="ls" selected="{{sortSelected 'ls'}}">{{_ "Last_seen"}}</option>
20+
</select>
21+
<i class="icon-sort-alt-up"></i>
22+
</div>
23+
</form>
24+
</div>
25+
</div>
26+
<h4>{{_ "List_of_Direct_Messages"}}</h4>
27+
<ul>
28+
{{#each rooms}}
29+
<li>
30+
<a href="{{pathFor 'direct' username=name}}" class="channel-link">
31+
<i class="icon-at {{userStatus}}"></i>
32+
{{name}}
33+
<span class='opt fixed'>
34+
{{#if hidden}}
35+
<i class="icon-eye-off" title="{{_ "Hidden"}}" aria-label="{{_ "Hidden"}}"></i>
36+
{{/if}}
37+
</span>
38+
</a>
39+
</li>
40+
{{/each}}
41+
{{#if hasMore}}
42+
<li class="load-more">
43+
{{#if Template.subscriptionsReady}}
44+
<a href="">{{_ "Has_more"}}...</a>
45+
{{else}}
46+
<div class="load-more-loading">{{_ "Loading..."}}</div>
47+
{{/if}}
48+
</li>
49+
{{/if}}
50+
</ul>
51+
</div>
52+
</div>
53+
</template>

0 commit comments

Comments
 (0)