sort list by lastmessage

pull/7748/head
Guilherme Gazzo 8 years ago
parent 23fd756a7a
commit c42936cb81
No known key found for this signature in database
GPG Key ID: 1F85C9AD922D0829
  1. 216
      package.json
  2. 82
      packages/rocketchat-lib/startup/defaultRoomTypes.js
  3. 1
      packages/rocketchat-theme/client/imports/general/base_old.css
  4. 36
      packages/rocketchat-ui-account/client/accountPreferences.html
  5. 15
      packages/rocketchat-ui-account/client/accountPreferences.js
  6. 2
      packages/rocketchat-ui-sidenav/client/roomList.html
  7. 71
      packages/rocketchat-ui-sidenav/client/roomList.js
  8. 9
      packages/rocketchat-ui-sidenav/client/sideNav.html
  9. 42
      packages/rocketchat-ui-sidenav/client/sideNav.js
  10. 7
      server/methods/channelsList.js
  11. 5
      server/methods/saveUserPreferences.js

@ -1,110 +1,110 @@
{
"name": "Rocket.Chat",
"description": "The Ultimate Open Source WebChat Platform",
"version": "0.57.0-develop",
"author": {
"name": "Rocket.Chat",
"url": "https://rocket.chat/"
},
"contributors": [
{
"name": "Aaron Ogle",
"email": "aaron.ogle@rocket.chat"
},
{
"name": "Bradley Hilton",
"email": "bradley.hilton@rocket.chat"
},
{
"name": "Diego Sampaio",
"email": "diego.sampaio@rocket.chat"
},
{
"name": "Gabriel Engel",
"email": "gabriel.engel@rocket.chat"
},
{
"name": "Marcelo Schmidt",
"email": "marcelo.schmidt@rocket.chat"
},
{
"name": "Rodrigo Nascimento",
"email": "rodrigo.nascimento@rocket.chat"
},
{
"name": "Sing Li",
"email": "sing.li@rocket.chat"
}
],
"mocha": {
"tests": [
"packages/**/*.tests.js"
],
"files": [
"packages/**/*.js",
"!packages/**/*.tests.js"
]
},
"keywords": [
"rocketchat",
"rocket",
"chat"
],
"scripts": {
"start": "meteor npm i && meteor",
"lint": "eslint .",
"lint-fix": "eslint . --fix",
"stylelint": "stylelint packages/**/*.{less,css}",
"test": "node .scripts/start.js",
"deploy": "npm run build && pm2 startOrRestart pm2.json",
"chimp-watch": "chimp --ddp=http://localhost:3000 --watch --mocha --path=tests/end-to-end",
"chimp-test": "chimp tests/chimp-config.js",
"postinstall": "cd packages/rocketchat-katex && npm i",
"testunit-watch": "mocha --watch --opts ./mocha.opts \"`node -e \"console.log(require('./package.json').mocha.tests.join(' '))\"`\"",
"coverage": "nyc -r html mocha --opts ./mocha.opts \"`node -e \"console.log(require('./package.json').mocha.tests.join(' '))\"`\"",
"testunit": "mocha --opts ./mocha.opts \"`node -e \"console.log(require('./package.json').mocha.tests.join(' '))\"`\"",
"version": "node .scripts/version.js",
"set-version": "node .scripts/set-version.js",
"release": "npm run set-version --silent"
},
"license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/RocketChat/Rocket.Chat.git"
},
"bugs": {
"url": "https://github.com/RocketChat/Rocket.Chat/issues",
"email": "support@rocket.chat"
},
"devDependencies": {
"babel-mocha-es6-compiler": "^0.1.0",
"babel-plugin-array-includes": "^2.0.3",
"chimp": "^0.49.0",
"conventional-changelog-cli": "^1.3.1",
"eslint": "^4.0.0",
"postcss-cssnext": "^2.11.0",
"postcss-smart-import": "^0.7.4",
"simple-git": "^1.73.0",
"stylelint": "^7.11.1",
"supertest": "^3.0.0"
},
"dependencies": {
"@google-cloud/storage": "^1.1.1",
"aws-sdk": "^2.72.0",
"babel-runtime": "^6.23.0",
"bcrypt": "^1.0.2",
"codemirror": "^5.26.0",
"file-type": "^5.2.0",
"highlight.js": "^9.12.0",
"jquery": "^3.2.1",
"mime-db": "^1.28.0",
"mime-type": "^3.0.5",
"moment": "^2.18.1",
"moment-timezone": "^0.5.13",
"photoswipe": "^4.1.2",
"prom-client": "^9.1.1",
"semver": "^5.3.0",
"toastr": "^2.1.2",
"wolfy87-eventemitter": "^5.1.0"
}
"name": "Rocket.Chat",
"description": "The Ultimate Open Source WebChat Platform",
"version": "0.57.0-develop",
"author": {
"name": "Rocket.Chat",
"url": "https://rocket.chat/"
},
"contributors": [
{
"name": "Aaron Ogle",
"email": "aaron.ogle@rocket.chat"
},
{
"name": "Bradley Hilton",
"email": "bradley.hilton@rocket.chat"
},
{
"name": "Diego Sampaio",
"email": "diego.sampaio@rocket.chat"
},
{
"name": "Gabriel Engel",
"email": "gabriel.engel@rocket.chat"
},
{
"name": "Marcelo Schmidt",
"email": "marcelo.schmidt@rocket.chat"
},
{
"name": "Rodrigo Nascimento",
"email": "rodrigo.nascimento@rocket.chat"
},
{
"name": "Sing Li",
"email": "sing.li@rocket.chat"
}
],
"mocha": {
"tests": [
"packages/**/*.tests.js"
],
"files": [
"packages/**/*.js",
"!packages/**/*.tests.js"
]
},
"keywords": [
"rocketchat",
"rocket",
"chat"
],
"scripts": {
"start": "meteor npm i && meteor",
"lint": "eslint .",
"lint-fix": "eslint . --fix",
"stylelint": "stylelint packages/**/*.{less,css}",
"test": "node .scripts/start.js",
"deploy": "npm run build && pm2 startOrRestart pm2.json",
"chimp-watch": "chimp --ddp=http://localhost:3000 --watch --mocha --path=tests/end-to-end",
"chimp-test": "chimp tests/chimp-config.js",
"postinstall": "cd packages/rocketchat-katex && npm i",
"testunit-watch": "mocha --watch --opts ./mocha.opts \"`node -e \"console.log(require('./package.json').mocha.tests.join(' '))\"`\"",
"coverage": "nyc -r html mocha --opts ./mocha.opts \"`node -e \"console.log(require('./package.json').mocha.tests.join(' '))\"`\"",
"testunit": "mocha --opts ./mocha.opts \"`node -e \"console.log(require('./package.json').mocha.tests.join(' '))\"`\"",
"version": "node .scripts/version.js",
"set-version": "node .scripts/set-version.js",
"release": "npm run set-version --silent"
},
"license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/RocketChat/Rocket.Chat.git"
},
"bugs": {
"url": "https://github.com/RocketChat/Rocket.Chat/issues",
"email": "support@rocket.chat"
},
"devDependencies": {
"babel-mocha-es6-compiler": "^0.1.0",
"babel-plugin-array-includes": "^2.0.3",
"chimp": "^0.49.0",
"conventional-changelog-cli": "^1.3.1",
"eslint": "^4.0.0",
"postcss-cssnext": "^2.11.0",
"postcss-smart-import": "^0.7.4",
"simple-git": "^1.73.0",
"stylelint": "^7.11.1",
"supertest": "^3.0.0"
},
"dependencies": {
"@google-cloud/storage": "^1.1.1",
"aws-sdk": "^2.72.0",
"babel-runtime": "^6.23.0",
"bcrypt": "^1.0.2",
"codemirror": "^5.26.0",
"file-type": "^5.2.0",
"highlight.js": "^9.12.0",
"jquery": "^3.2.1",
"mime-db": "^1.28.0",
"mime-type": "^3.0.5",
"moment": "^2.18.1",
"moment-timezone": "^0.5.13",
"photoswipe": "^4.1.2",
"prom-client": "^9.1.1",
"semver": "^5.3.0",
"toastr": "^2.1.2",
"wolfy87-eventemitter": "^5.1.0"
}
}

@ -1,10 +1,28 @@
/* globals openRoom */
RocketChat.roomTypes.add(null, 0, {
// favorite
RocketChat.roomTypes.add('unread', 10, {
unread: true,
label: 'Unread'
});
// favorite
RocketChat.roomTypes.add('f', 20, {
icon: 'star',
label: 'Favorites'
});
RocketChat.roomTypes.add('c', 10, {
// activity
RocketChat.roomTypes.add('activity', 30, {
// icon: 'star',
label: 'Conversations'
});
RocketChat.roomTypes.add('channels', 30, {
label: 'Channels'
});
// public
RocketChat.roomTypes.add('c', 30, {
icon: 'hashtag',
label: 'Channels',
route: {
@ -36,7 +54,37 @@ RocketChat.roomTypes.add('c', 10, {
}
});
RocketChat.roomTypes.add('d', 20, {
// private
RocketChat.roomTypes.add('p', 40, {
icon: 'lock',
label: 'Private_Groups',
route: {
name: 'group',
path: '/group/:name',
action(params) {
return openRoom('p', params.name);
}
},
findRoom(identifier) {
const query = {
t: 'p',
name: identifier
};
return ChatRoom.findOne(query);
},
roomName(roomData) {
return roomData.name;
},
condition() {
return RocketChat.authz.hasAllPermission('view-p-room');
}
});
// direct
RocketChat.roomTypes.add('d', 50, {
icon: false,
label: 'Direct_Messages',
route: {
@ -92,31 +140,3 @@ RocketChat.roomTypes.add('d', 20, {
return Session.get(`user_${ subscription.name }_status`);
}
});
RocketChat.roomTypes.add('p', 30, {
icon: 'lock',
label: 'Private_Groups',
route: {
name: 'group',
path: '/group/:name',
action(params) {
return openRoom('p', params.name);
}
},
findRoom(identifier) {
const query = {
t: 'p',
name: identifier
};
return ChatRoom.findOne(query);
},
roomName(roomData) {
return roomData.name;
},
condition() {
return RocketChat.authz.hasAllPermission('view-p-room');
}
});

@ -1558,7 +1558,6 @@
/* MAIN CONTENT + MAIN PAGES */
.rc-old.main-content {
position: fixed;
top: 0;
bottom: 0;
left: var(--rooms-box-width);

@ -94,13 +94,6 @@
<label><input type="radio" name="collapseMediaByDefault" value="0" checked="{{checked 'collapseMediaByDefault' false true}}" /> {{_ "False"}}</label>
</div>
</div>
<div class="input-line double-col" id="unreadRoomsMode">
<label>{{_ "Unread_Rooms_Mode"}}</label>
<div>
<label><input type="radio" name="unreadRoomsMode" value="1" checked="{{checked 'unreadRoomsMode' true}}" /> {{_ "True"}}</label>
<label><input type="radio" name="unreadRoomsMode" value="0" checked="{{checked 'unreadRoomsMode' false true}}" /> {{_ "False"}}</label>
</div>
</div>
<div class="input-line double-col" id="hideUsernames">
<label>{{_ "Hide_usernames"}}</label>
<div>
@ -131,14 +124,35 @@
<label><input type="radio" name="hideAvatars" value="0" checked="{{checked 'hideAvatars' false true}}"/> {{_ "False"}}</label>
</div>
</div>
<div class="input-line double-col" id="mergeChannels">
<div class="input-line double-col" id="unreadRoomsMode">
<label>{{_ "Unread_Rooms_Mode"}}</label>
<div>
<label><input type="radio" name="unreadRoomsMode" value="1" checked="{{checked 'unreadRoomsMode' true}}" /> {{_ "True"}}</label>
<label><input type="radio" name="unreadRoomsMode" value="0" checked="{{checked 'unreadRoomsMode' false true}}" /> {{_ "False"}}</label>
</div>
</div>
<div class="input-line double-col" id="roomsListExhibitionMode">
<label>Modo de exibição</label>
<div>
<select class="input-monitor" name="roomsListExhibitionMode">
<option value="unread" selected="{{selected 'roomsListExhibitionMode' 'unread'}}">nao lidas primeiro</option>
<option value="activity" selected="{{selected 'roomsListExhibitionMode' 'activity'}}">ordenar por atividade</option>
<option value="category" selected="{{selected 'roomsListExhibitionMode' 'category' true}}">separado em categoria</option>
</select>
<div class="info">{{_ "Enter_Behaviour_Description"}}</div>
</div>
</div>
{{# with disabled=showMergedChannels}}
<div class="input-line double-col" id="mergeChannels" {{disabled}}>
<label>{{_ "UI_Merge_Channels_Groups"}}</label>
<div>
<label><input type="radio" name="mergeChannels" value="1" checked="{{checked 'mergeChannels' true}}" /> {{_ "True"}}</label>
<label><input type="radio" name="mergeChannels" value="0" checked="{{checked 'mergeChannels' false}}" /> {{_ "False"}}</label>
<label><input type="radio" name="mergeChannels" value="-1" checked="{{checked 'mergeChannels' undefined true}}" /> {{_ "Default"}}</label>
<label><input type="radio" name="mergeChannels" value="1" checked="{{checked 'mergeChannels' true}}" {{disabled}}/> {{_ "True"}}</label>
<label><input type="radio" name="mergeChannels" value="0" checked="{{checked 'mergeChannels' false}}" {{disabled}}/> {{_ "False"}}</label>
<label><input type="radio" name="mergeChannels" value="-1" checked="{{checked 'mergeChannels' undefined true}}" {{disabled}}/> {{_ "Default"}}</label>
</div>
</div>
{{/with}}
<div class="input-line double-col" id="sendOnEnter">
<label>{{_ "Enter_Behaviour"}}</label>
<div>

@ -1,6 +1,9 @@
/*globals defaultUserLanguage, KonchatNotification */
import toastr from 'toastr';
Template.accountPreferences.helpers({
showMergedChannels() {
return ['category', 'unread'].includes(Template.instance().roomsListExhibitionMode.get()) ? '' : 'disabled';
},
audioAssets() {
return (RocketChat.CustomSounds && RocketChat.CustomSounds.getList && RocketChat.CustomSounds.getList()) || [];
},
@ -72,14 +75,18 @@ Template.accountPreferences.helpers({
});
Template.accountPreferences.onCreated(function() {
const user = Meteor.user();
const settingsTemplate = this.parentTemplate(3);
if (settingsTemplate.child == null) {
settingsTemplate.child = [];
}
settingsTemplate.child.push(this);
const user = Meteor.user();
if (user && user.settings && user.settings.preferences) {
this.roomsListExhibitionMode = new ReactiveVar(user.settings.preferences.roomsListExhibitionMode || 'category');
this.useEmojis = new ReactiveVar(user.settings.preferences.desktopNotificationDuration == null || user.settings.preferences.useEmojis);
} else {
this.roomsListExhibitionMode = new ReactiveVar('category');
}
let instance = this;
this.autorun(() => {
@ -116,6 +123,8 @@ Template.accountPreferences.onCreated(function() {
data.mergeChannels = $('#mergeChannels').find('input:checked').val();
data.sendOnEnter = $('#sendOnEnter').find('select').val();
data.unreadRoomsMode = $('input[name=unreadRoomsMode]:checked').val();
data.roomsListExhibitionMode = $('select[name=roomsListExhibitionMode]').val();
data.autoImageLoad = $('input[name=autoImageLoad]:checked').val();
data.emailNotificationMode = $('select[name=emailNotificationMode]').val();
data.highlights = _.compact(_.map($('[name=highlights]').val().split(','), function(e) {
@ -166,6 +175,10 @@ Template.accountPreferences.events({
text: TAPi18n.__('This_is_a_desktop_notification')
});
},
'change [name=roomsListExhibitionMode]'(e, instance) {
const value = $(e.currentTarget).val();
instance.roomsListExhibitionMode.set(value);
},
'change .audio'(e) {
e.preventDefault();
const audio = $(e.currentTarget).val();

@ -3,7 +3,7 @@
{{> livechat . }}
{{else}}
{{#with rooms}}
{{#if shouldAppear .. rooms}}
{{#if shouldAppear .. .}}
<h3 class="rooms-list__type sidebar-content">
{{_ ../label}}
{{#with count}}

@ -1,40 +1,50 @@
Template.roomList.helpers({
rooms() {
if (this.unread) {
return Template.instance().unreadRooms;
if (this.identifier == 'unread') {
const query = {
alert: true,
open: true,
hideUnreadStatus: { $ne: true }
};
return ChatSubscription.find(query, { sort: { 't': 1, 'name': 1 }});
}
if (this.anonymous) {
return RocketChat.models.Rooms.find({t: 'c'}, { sort: { name: 1 } });
}
const user = Meteor.user();
const favoritesEnabled = RocketChat.settings.get('Favorite_Rooms');
const query = {
open: true
};
if (this.identifier) {
if (this.isCombined) {
query.t = { $in: ['c', 'p']};
} else {
query.t = { $in: [this.identifier] };
let sort = { 't': 1, 'name': 1 };
if (this.identifier === 'f') {
query.f = favoritesEnabled;
} else {
let types = [this.identifier];
if (this.identifier === 'activity') {
types = ['c', 'p', 'd'];
sort = { _updatedAt : -1};
}
if (this.identifier === 'channels' || this.identifier === 'unread') {
types= [ 'c', 'p'];
}
const user = Meteor.user();
if (user && user.settings && user.settings.preferences && user.settings.preferences.roomsListExhibitionMode === 'unread') {
query.$or = [
{ alert: { $ne: true } },
{ hideUnreadStatus: true }
];
}
query.t = { $in: types };
query.f = { $ne: favoritesEnabled };
} else {
query.f = favoritesEnabled;
}
if (user && user.settings && user.settings.preferences && user.settings.preferences.unreadRoomsMode) {
query.$or = [
{ alert: { $ne: true } },
{ hideUnreadStatus: true }
];
}
return ChatSubscription.find(query, { sort: { 't': 1, 'name': 1 }});
return ChatSubscription.find(query, { sort });
},
isLivechat() {
@ -47,9 +57,8 @@ Template.roomList.helpers({
or is favorite and has one room
or is unread and has one room
*/
const nonFavorite = group.identifier || group.unread;
const showNormalRooms = !group.unread || Template.instance().unreadRooms.count();
return showNormalRooms && nonFavorite || !group.unread && !this.anonymous && rooms.count();
return !['unread', 'f'].includes(group.identifier) || rooms.count();
},
hasMoreChannelsButton(room) {
@ -76,13 +85,13 @@ Template.roomList.events({
});
Template.roomList.onCreated(function() {
this.autorun(() => {
const query = {
alert: true,
open: true,
hideUnreadStatus: { $ne: true }
};
return this.unreadRooms = ChatSubscription.find(query, { sort: { 't': 1, 'name': 1 }});
});
// this.autorun(() => {
// const query = {
// alert: true,
// open: true,
// hideUnreadStatus: { $ne: true }
// };
//
// return this.unreadRooms = ChatSubscription.find(query, { sort: { 't': 1, 'name': 1 }});
// });
});

@ -9,16 +9,9 @@
{{_ "More_unreads"}} <i class="icon-up-big"></i>
</div>
<div class="rooms-list" aria-label="{{_ "Channels"}}" role="region">
{{#if hasUnread}}
{{> roomList unread=true label="Unread_Rooms" }}
{{/if}}
{{#each roomType}}
{{#if canShowRoomType}}
{{> roomList identifier=identifier label=label isCombined=isCombined }}
{{/if}}
{{> roomList identifier=identifier label=label }}
{{/each}}
{{#if canViewHistory}}
<h3 class="history-div">
<a href="{{pathFor 'privateHistory'}}">{{_ "History"}}</a>

@ -3,7 +3,11 @@
Template.sideNav.helpers({
hasUnread() {
const user = Meteor.user();
return user && user.settings && user.settings.preferences && user.settings.preferences.unreadRoomsMode;
return user && user.settings && user.settings.preferences && user.settings.preferences.roomsListExhibitionMode === 'unread';
},
sortByActivity() {
const user = Meteor.user();
return user && user.settings && user.settings.preferences && user.settings.preferences.roomsListExhibitionMode === 'activity';
},
flexTemplate() {
return SideNav.getFlex().template;
@ -18,23 +22,23 @@ Template.sideNav.helpers({
},
roomType() {
return RocketChat.roomTypes.getTypes();
},
canShowRoomType() {
if (Template.instance().mergedChannels.get()) {
return RocketChat.roomTypes.checkCondition(this) && (this.identifier !== 'p');
}
return RocketChat.roomTypes.checkCondition(this);
},
isCombined() {
if (Template.instance().mergedChannels.get()) {
return this.identifier === 'c';
}
return false;
const types = RocketChat.roomTypes.getTypes();
const user = Meteor.user();
const preferences = (user && user.settings && user.settings.preferences && user.settings.preferences) || {};
const mode = preferences.roomsListExhibitionMode || 'activity';
const filter = {
activity(room) {
return ['f', 'activity'].includes(room.identifier);
},
unread(room) {
return ['f', ...(preferences.mergeChannels ? ['channels'] : ['p', 'c']), 'd', 'unread'].includes(room.identifier);
},
category(room) {
return ['f', ...(preferences.mergeChannels ? ['channels'] : ['p', 'c']), 'd'].includes(room.identifier);
}
}[mode];
return types.filter(filter);
}
});
@ -78,7 +82,7 @@ Template.sideNav.onCreated(function() {
const user = Meteor.user();
let userPref = null;
if (user && user.settings && user.settings.preferences) {
userPref = user.settings.preferences.mergeChannels;
userPref = user.settings.preferences.roomsListExhibitionMode === 'category' && user.settings.preferences.mergeChannels;
}
this.mergedChannels.set((userPref != null) ? userPref : RocketChat.settings.get('UI_Merge_Channels_Groups'));

@ -58,14 +58,15 @@ Meteor.methods({
}
if (channelType !== 'public' && RocketChat.authz.hasPermission(Meteor.userId(), 'view-p-room')) {
const userPref = Meteor.user() && Meteor.user().settings && Meteor.user().settings.preferences && Meteor.user().settings.preferences.mergeChannels;
const user = Meteor.user();
const userPref = user && user.settings && user.settings.preferences && user.settings.preferences.mergeChannels && user.settings.preferences.roomsListExhibitionMode === 'category';
const globalPref = RocketChat.settings.get('UI_Merge_Channels_Groups');
const mergeChannels = userPref || globalPref;
const mergeChannels = userPref !== undefined ? userPref : globalPref;
if (mergeChannels) {
roomTypes.push({
type: 'p',
username: Meteor.user().username
username: user.username
});
}
}

@ -50,7 +50,12 @@ Meteor.methods({
} else {
delete preferences.mergeChannels;
}
if (settings.unreadRoomsMode) {
preferences.unreadRoomsMode = settings.unreadRoomsMode === '1' ? true : false;
}
console.log(settings.roomsListExhibitionMode, 'aaaaaaaaaaa');
preferences.roomsListExhibitionMode = ['category', 'unread', 'activity'].includes(settings.roomsListExhibitionMode) ? settings.roomsListExhibitionMode : 'category';
if (settings.unreadAlert) {
preferences.unreadAlert = settings.unreadAlert === '1' ? true : false;
}

Loading…
Cancel
Save