diff --git a/packages/rocketchat-lib/lib/roomTypesCommon.js b/packages/rocketchat-lib/lib/roomTypesCommon.js
index 1df20edae0b3..c0e669eff40d 100644
--- a/packages/rocketchat-lib/lib/roomTypesCommon.js
+++ b/packages/rocketchat-lib/lib/roomTypesCommon.js
@@ -10,11 +10,12 @@ this.roomTypesCommon = class {
@param identifier An identifier to the room type. If a real room, MUST BE the same of `db.rocketchat_room.t` field, if not, can be null
@param order Order number of the type
@param config
- template: template name to render on sideNav
icon: icon class
+ label: i18n label
route:
name: route name
action: route action function
+ identifier: room type identifier
*/
add(identifier = Random.id(), order, config) {
@@ -29,7 +30,7 @@ this.roomTypesCommon = class {
identifier,
order
});
- this.roomTypes[identifier] = config;
+ this.roomTypes[identifier] = {...config, identifier};
if (config.route && config.route.path && config.route.name && config.route.action) {
const routeConfig = {
name: config.route.name,
diff --git a/packages/rocketchat-lib/startup/defaultRoomTypes.js b/packages/rocketchat-lib/startup/defaultRoomTypes.js
index 40fe79c9daf1..a206f6386fdc 100644
--- a/packages/rocketchat-lib/startup/defaultRoomTypes.js
+++ b/packages/rocketchat-lib/startup/defaultRoomTypes.js
@@ -1,12 +1,12 @@
/* globals openRoom */
RocketChat.roomTypes.add(null, 0, {
- template: 'starredRooms',
- icon: 'icon-star'
+ icon: 'icon-star',
+ label: 'Favorites'
});
RocketChat.roomTypes.add('c', 10, {
- template: 'channels',
icon: 'icon-hash',
+ label: 'Channels',
route: {
name: 'channel',
path: '/channel/:name',
@@ -37,8 +37,8 @@ RocketChat.roomTypes.add('c', 10, {
});
RocketChat.roomTypes.add('d', 20, {
- template: 'directMessages',
icon: 'icon-at',
+ label: 'Direct_Messages',
route: {
name: 'direct',
path: '/direct/:username',
@@ -94,8 +94,8 @@ RocketChat.roomTypes.add('d', 20, {
});
RocketChat.roomTypes.add('p', 30, {
- template: 'privateGroups',
icon: 'icon-lock',
+ label: 'Private_Groups',
route: {
name: 'group',
path: '/group/:name',
diff --git a/packages/rocketchat-livechat/roomType.js b/packages/rocketchat-livechat/roomType.js
index c59fdf9a8034..de542583e119 100644
--- a/packages/rocketchat-livechat/roomType.js
+++ b/packages/rocketchat-livechat/roomType.js
@@ -1,8 +1,8 @@
/* globals openRoom, LivechatInquiry */
RocketChat.roomTypes.add('l', 5, {
- template: 'livechat',
icon: 'icon-chat-empty',
+ label: 'Livechat',
route: {
name: 'live',
path: '/live/:code(\\d+)',
diff --git a/packages/rocketchat-theme/client/imports/base.less b/packages/rocketchat-theme/client/imports/base.less
index ef347f0f7da2..fab93a754a92 100644
--- a/packages/rocketchat-theme/client/imports/base.less
+++ b/packages/rocketchat-theme/client/imports/base.less
@@ -1630,16 +1630,23 @@ label.required::after {
}
}
- .unread-rooms-mode {
+ .unread-rooms-mode,
+ .unread-rooms-mode + ul {
max-height: 0;
opacity: 0;
overflow: hidden;
+ margin: 0;
+ }
- &.has-unread {
- transition: max-height 1s ease-in, opacity 0.5s linear;
- max-height: 5000px;
- opacity: 1;
- }
+ .unread-rooms-mode.has-unread {
+ margin: 25px 0 0;
+ }
+
+ .unread-rooms-mode.has-unread,
+ .unread-rooms-mode.has-unread + ul {
+ transition: max-height 1s ease-in, opacity 0.5s linear;
+ max-height: 5000px;
+ opacity: 1;
}
}
diff --git a/packages/rocketchat-theme/client/imports/rtl.less b/packages/rocketchat-theme/client/imports/rtl.less
index 21b90888e39b..ee0e6c7d8a18 100644
--- a/packages/rocketchat-theme/client/imports/rtl.less
+++ b/packages/rocketchat-theme/client/imports/rtl.less
@@ -109,7 +109,7 @@
direction: rtl;
.padding-right(8px);
- h3.add-room {
+ h3.room-type {
i {
.left(6px);
}
@@ -200,7 +200,7 @@
h3 {
.padding-right(10px);
- &.add-room {
+ &.room-type {
i {
.left(6px);
}
diff --git a/packages/rocketchat-ui-sidenav/client/channels.html b/packages/rocketchat-ui-sidenav/client/channels.html
deleted file mode 100644
index b64b836d30db..000000000000
--- a/packages/rocketchat-ui-sidenav/client/channels.html
+++ /dev/null
@@ -1,13 +0,0 @@
-
- {{_ "No_channels_yet" }} {{_ "No_channels_yet" }} {{_ "No_channels_yet" }} {{_ "No_direct_messages_yet" }} {{_ "No_groups_yet" }} {{_ "The_field_is_required" .}} {{_ "No_channels_yet" }}
- {{_ "Channels"}} ({{rooms.count}})
-
-
- {{#each rooms}}
- {{> chatRoomItem }}
- {{else}}
-
-
-
diff --git a/packages/rocketchat-ui-sidenav/client/channels.js b/packages/rocketchat-ui-sidenav/client/channels.js
deleted file mode 100644
index dd4087812ae5..000000000000
--- a/packages/rocketchat-ui-sidenav/client/channels.js
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-Template.channels.helpers({
- isActive() {
- if (ChatSubscription.findOne({ t: { $in: ['c']}, f: { $ne: true }, open: true, rid: Session.get('openedRoom') }, { fields: { _id: 1 } }) !== null) {
- return 'active';
- }
- },
-
- rooms() {
- const query = {
- t: { $in: ['c']},
- open: true
- };
-
- if (RocketChat.settings.get('Favorite_Rooms')) {
- query.f = { $ne: true };
- }
-
- if (Meteor.user() && Meteor.user().settings && Meteor.user().settings.preferences && Meteor.user().settings.preferences.unreadRoomsMode) {
- query.$or = [
- { alert: { $ne: true } },
- { hideUnreadStatus: true }
- ];
- }
-
- return ChatSubscription.find(
- query, { sort: { 't': 1, 'name': 1 }});
- }
-});
-
-Template.channels.events({
- 'click .more-channels'() {
- SideNav.setFlex('listChannelsFlex');
- return SideNav.openFlex();
- }
-});
diff --git a/packages/rocketchat-ui-sidenav/client/channelsAnonymous.html b/packages/rocketchat-ui-sidenav/client/channelsAnonymous.html
deleted file mode 100644
index 71f67470c1ad..000000000000
--- a/packages/rocketchat-ui-sidenav/client/channelsAnonymous.html
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
- {{_ "Channels"}} ({{rooms.count}})
-
-
- {{#each rooms}}
- {{> chatRoomItem }}
- {{else}}
-
-
-
diff --git a/packages/rocketchat-ui-sidenav/client/channelsAnonymous.js b/packages/rocketchat-ui-sidenav/client/channelsAnonymous.js
deleted file mode 100644
index c4a121b093a6..000000000000
--- a/packages/rocketchat-ui-sidenav/client/channelsAnonymous.js
+++ /dev/null
@@ -1,23 +0,0 @@
-Template.channelsAnonymous.helpers({
- isActive() {
- const currentRoom = RocketChat.models.Rooms.findOne({ _id: Session.get('openedRoom') });
- if (currentRoom) {
- return 'active';
- }
- },
-
- rooms() {
- const query = {
- t: 'c'
- };
-
- return RocketChat.models.Rooms.find(query, { sort: { name: 1 } });
- }
-});
-
-Template.channelsAnonymous.events({
- 'click .more-channels'() {
- SideNav.setFlex('listChannelsFlex');
- SideNav.openFlex();
- }
-});
diff --git a/packages/rocketchat-ui-sidenav/client/combined.html b/packages/rocketchat-ui-sidenav/client/combined.html
deleted file mode 100644
index 54632b0bf205..000000000000
--- a/packages/rocketchat-ui-sidenav/client/combined.html
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
- {{_ "Channels"}} ({{rooms.count}})
-
-
- {{#each rooms}}
- {{> chatRoomItem }}
- {{else}}
-
-
-
diff --git a/packages/rocketchat-ui-sidenav/client/combined.js b/packages/rocketchat-ui-sidenav/client/combined.js
deleted file mode 100644
index 95a386606a05..000000000000
--- a/packages/rocketchat-ui-sidenav/client/combined.js
+++ /dev/null
@@ -1,33 +0,0 @@
-Template.combined.helpers({
- isActive() {
- if (ChatSubscription.findOne({ t: { $in: ['c', 'p']}, f: { $ne: true }, open: true, rid: Session.get('openedRoom') }, { fields: { _id: 1 } })) {
- return 'active';
- }
- },
-
- rooms() {
- const query = {
- t: { $in: ['c', 'p']},
- open: true
- };
-
- if (RocketChat.settings.get('Favorite_Rooms')) {
- query.f = { $ne: true };
- }
-
- if (Meteor.user() && Meteor.user().settings && Meteor.user().settings.preferences && Meteor.user().settings.preferences.unreadRoomsMode) {
- query.$or = [
- { alert: { $ne: true } },
- { hideUnreadStatus: true }
- ];
- }
-
- return ChatSubscription.find(query, { sort: { 'name': 1 }});
- }});
-
-Template.combined.events({
- 'click .more-channels'() {
- SideNav.setFlex('listCombinedFlex');
- return SideNav.openFlex();
- }
-});
diff --git a/packages/rocketchat-ui-sidenav/client/directMessages.html b/packages/rocketchat-ui-sidenav/client/directMessages.html
deleted file mode 100644
index 86b212392541..000000000000
--- a/packages/rocketchat-ui-sidenav/client/directMessages.html
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
- {{_ "Direct_Messages"}} ({{rooms.count}})
-
-
- {{#each rooms}}
- {{> chatRoomItem }}
- {{else}}
-
-
diff --git a/packages/rocketchat-ui-sidenav/client/directMessages.js b/packages/rocketchat-ui-sidenav/client/directMessages.js
deleted file mode 100644
index 68e09b80d82e..000000000000
--- a/packages/rocketchat-ui-sidenav/client/directMessages.js
+++ /dev/null
@@ -1,26 +0,0 @@
-Template.directMessages.helpers({
- isActive() {
- if (ChatSubscription.findOne({ t: { $in: ['d']}, f: { $ne: true }, open: true, rid: Session.get('openedRoom') }, { fields: { _id: 1 } })) {
- return 'active';
- }
- },
-
- rooms() {
- const query = { t: { $in: ['d']}, f: { $ne: true }, open: true };
- const sort = { 't': 1 };
-
- if (Meteor.user() && Meteor.user().settings && Meteor.user().settings.preferences && Meteor.user().settings.preferences.unreadRoomsMode) {
- query.$or = [
- { alert: { $ne: true } },
- { hideUnreadStatus: true }
- ];
- }
-
- if (RocketChat.settings.get('UI_Use_Real_Name')) {
- sort.fname = 1;
- }
- sort.name = 1;
-
- return ChatSubscription.find(query, { sort });
- }
-});
diff --git a/packages/rocketchat-ui-sidenav/client/privateGroups.html b/packages/rocketchat-ui-sidenav/client/privateGroups.html
deleted file mode 100644
index 03a5d37ee724..000000000000
--- a/packages/rocketchat-ui-sidenav/client/privateGroups.html
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
- {{_ "Private_Groups"}} ({{rooms.count}})
-
-
- {{#each rooms}}
- {{> chatRoomItem }}
- {{else}}
-
- {{#if $gt total totalOpen}}
-
- {{/if}}
-
diff --git a/packages/rocketchat-ui-sidenav/client/privateGroups.js b/packages/rocketchat-ui-sidenav/client/privateGroups.js
deleted file mode 100644
index 84203ce5c299..000000000000
--- a/packages/rocketchat-ui-sidenav/client/privateGroups.js
+++ /dev/null
@@ -1,35 +0,0 @@
-Template.privateGroups.helpers({
- isActive() {
- if (ChatSubscription.findOne({ t: { $in: ['p']}, f: { $ne: true }, open: true, rid: Session.get('openedRoom') }, { fields: { _id: 1 } })) {
- return 'active';
- }
- },
-
- rooms() {
- const query = { t: { $in: ['p']}, f: { $ne: true }, open: true };
-
- if (Meteor.user() && Meteor.user().settings && Meteor.user().settings.preferences && Meteor.user().settings.preferences.unreadRoomsMode) {
- query.$or = [
- { alert: { $ne: true } },
- { hideUnreadStatus: true }
- ];
- }
-
- return ChatSubscription.find(query, { sort: { 't': 1, 'name': 1 }});
- },
-
- total() {
- return ChatSubscription.find({ t: { $in: ['p']}, f: { $ne: true } }).count();
- },
-
- totalOpen() {
- return ChatSubscription.find({ t: { $in: ['p']}, f: { $ne: true }, open: true }).count();
- }
-});
-
-Template.privateGroups.events({
- 'click .more-groups'() {
- SideNav.setFlex('listPrivateGroupsFlex');
- return SideNav.openFlex();
- }
-});
diff --git a/packages/rocketchat-ui-sidenav/client/privateGroupsFlex.html b/packages/rocketchat-ui-sidenav/client/privateGroupsFlex.html
deleted file mode 100644
index b44af2de8eb5..000000000000
--- a/packages/rocketchat-ui-sidenav/client/privateGroupsFlex.html
+++ /dev/null
@@ -1,59 +0,0 @@
-
- {{_ "Private_Groups"}}
- {{_ "Create_new"}}
-
- {{#each selectedUsers}}
-
-
+ {{_ ../label}} ({{count}})
+
+
+ {{#each room in this}}
+ {{> chatRoomItem room }}
+ {{else}}
+
+
+ {{#if hasMoreChannelsButton ..}}
+
+ {{/if}}
+
+ {{#if hasMoreGroupsButton ..}}
+
+ {{/if}}
+ {{/with}}
+ {{/if}}
+ {{/if}}
+
diff --git a/packages/rocketchat-ui-sidenav/client/roomList.js b/packages/rocketchat-ui-sidenav/client/roomList.js
new file mode 100644
index 000000000000..9854b2db7ac9
--- /dev/null
+++ b/packages/rocketchat-ui-sidenav/client/roomList.js
@@ -0,0 +1,100 @@
+Template.roomList.helpers({
+ rooms() {
+ if (this.unread) {
+ return Template.instance().unreadRooms;
+ }
+
+ 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] };
+ }
+
+ 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 }});
+ },
+
+ isActiveFavorite() {
+ if (!this.identifier && !this.unread && !this.anonymous) {
+ return ChatSubscription.find({ f: true }).count();
+ }
+
+ return true;
+ },
+
+ isLivechat() {
+ return this.identifier === 'l';
+ },
+
+ unreadClass(room) {
+ let classes = '';
+
+ if (room.unread) {
+ const user = Meteor.user();
+ classes += 'unread-rooms-mode';
+
+ if ((user && user.settings && user.settings.preferences && user.settings.preferences.unreadRoomsMode) && (Template.instance().unreadRooms.count())) {
+ classes += ' has-unread';
+ }
+ }
+
+ return classes;
+ },
+
+ hasMoreChannelsButton(room) {
+ return room.identifier === 'c' || room.anonymous;
+ },
+
+ hasMoreGroupsButton(room) {
+ return room.identifier === 'p';
+ }
+});
+
+Template.roomList.events({
+ 'click .more'(e, t) {
+ if (t.data.identifier === 'p') {
+ SideNav.setFlex('listPrivateGroupsFlex');
+ } else if (t.data.isCombined) {
+ SideNav.setFlex('listCombinedFlex');
+ } else {
+ SideNav.setFlex('listChannelsFlex');
+ }
+
+ return SideNav.openFlex();
+ }
+});
+
+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 }});
+ });
+});
diff --git a/packages/rocketchat-ui-sidenav/client/sideNav.html b/packages/rocketchat-ui-sidenav/client/sideNav.html
index 389eae9a8b9b..3df52a7246d4 100644
--- a/packages/rocketchat-ui-sidenav/client/sideNav.html
+++ b/packages/rocketchat-ui-sidenav/client/sideNav.html
@@ -10,11 +10,11 @@