From d782ce6bb8eb1bd34c6279f983948638c8c936df Mon Sep 17 00:00:00 2001 From: Karl Prieb Date: Tue, 30 Jan 2018 13:50:33 -0200 Subject: [PATCH 01/26] new sidebar header --- .../components/sidebar/sidebar-account.css | 221 ------------------ .../components/sidebar/sidebar-header.css | 105 +++++++++ .../client/imports/general/variables.css | 4 +- packages/rocketchat-theme/client/main.css | 2 +- .../rocketchat-ui-master/public/icons.svg | 5 + .../client/accountBox.html | 27 --- .../client/accountBox.js | 134 ----------- .../client/createCombinedFlex.js | 8 - .../client/listChannelsFlex.js | 8 - .../client/listCombinedFlex.js | 8 - .../client/listPrivateGroupsFlex.js | 8 - .../rocketchat-ui-sidenav/client/sideNav.html | 5 +- .../rocketchat-ui-sidenav/client/sideNav.js | 8 - .../client/sidebarHeader.html | 21 ++ .../client/sidebarHeader.js | 189 +++++++++++++++ packages/rocketchat-ui-sidenav/package.js | 4 +- .../rocketchat-ui/client/lib/accountBox.js | 14 -- packages/rocketchat-ui/client/lib/sideNav.js | 34 --- .../rocketchat-ui/client/views/app/popover.js | 35 --- 19 files changed, 326 insertions(+), 514 deletions(-) delete mode 100644 packages/rocketchat-theme/client/imports/components/sidebar/sidebar-account.css create mode 100644 packages/rocketchat-theme/client/imports/components/sidebar/sidebar-header.css delete mode 100644 packages/rocketchat-ui-sidenav/client/accountBox.html delete mode 100644 packages/rocketchat-ui-sidenav/client/accountBox.js create mode 100644 packages/rocketchat-ui-sidenav/client/sidebarHeader.html create mode 100644 packages/rocketchat-ui-sidenav/client/sidebarHeader.js diff --git a/packages/rocketchat-theme/client/imports/components/sidebar/sidebar-account.css b/packages/rocketchat-theme/client/imports/components/sidebar/sidebar-account.css deleted file mode 100644 index f06c1eb42fe7..000000000000 --- a/packages/rocketchat-theme/client/imports/components/sidebar/sidebar-account.css +++ /dev/null @@ -1,221 +0,0 @@ -.sidebar-light { - & .sidebar__account-username { - color: var(--color-dark); - } - - & .sidebar__account-menu { - fill: var(--color-dark); - } - - & .sidebar__account.active:hover { - background-color: var(--sidebar-background-light-hover); - } -} - -.sidebar__account { - display: flex; - - margin: 0 0 var(--sidebar-extra-small-default-padding); - - padding: var(--sidebar-extra-small-default-padding) var(--sidebar-default-padding); - - transition: background-color 0.3s; - - align-items: center; - - &.active:hover { - cursor: pointer; - - background-color: var(--sidebar-item-hover-background); - } - - &-thumb { - - flex: 0 0 var(--sidebar-account-thumb-size); - - width: var(--sidebar-account-thumb-size); - height: var(--sidebar-account-thumb-size); - margin: 0 0.5rem 0 0; - } - - &-data { - position: relative; - - display: flex; - overflow: hidden; - flex-direction: column; - flex: 1; - - margin: 0 0.5rem; - } - - &-username { - overflow: hidden; - flex: 1; - - max-width: fit-content; - height: calc(var(--sidebar-account-username-size) + 0.1rem); - - white-space: nowrap; - text-overflow: ellipsis; - - color: var(--sidebar-account-username-color); - - font-size: var(--sidebar-account-username-size); - font-weight: var(--sidebar-account-username-weight); - line-height: calc(var(--sidebar-account-username-size) + 0.1rem); - } - - &-visual-status { - max-width: 124px; - margin-right: 8px; - - user-select: none; - - font-size: var(--sidebar-account-status-font-size); - } - - &-status { - display: flex; - - margin: 0 -0.25rem; - - color: var(--sidebar-account-status-color); - - align-items: center; - } - - &-status-bullet { - display: block; - - width: var(--sidebar-account-status-bullet-size); - height: var(--sidebar-account-status-bullet-size); - margin: 0.25rem; - - border-radius: var(--sidebar-account-status-bullet-radius); - - &--online { - background-color: var(--status-online); - } - - &--away { - background-color: var(--status-away); - } - - &--busy { - background-color: var(--status-busy); - } - - &--invisible { - background-color: var(--status-invisible); - } - - &--offline { - background-color: var(--status-invisible); - } - } - - &-label { - - position: relative; - - padding: 0; - - cursor: pointer; - - &:hover .sidebar__account-menu { - fill: var(--sidebar-account-status-color); - } - } - - &-menu { - transition: fill 0.2s; - - font-size: 1.375rem; - - fill: var(--sidebar-account-username-color); - } - - & .rc-popover { - top: 40px; - left: 0; - } -} - -.rtl .sidebar__account .rc-popover { - right: 0; - left: initial; -} - -@media (width <= 400px) { - .sidebar__account { - margin: 0 0 5px; - padding: var(--sidebar-extra-small-default-padding) calc(var(--sidebar-small-default-padding) - 8px) var(--sidebar-extra-small-default-padding); - - &-thumb { - - flex: 0 0 var(--sidebar-small-account-thumb-size); - - width: var(--sidebar-small-account-thumb-size); - height: var(--sidebar-small-account-thumb-size); - } - - &-data { - flex-direction: row; - - margin: 0; - align-items: center; - } - - &-username { - width: auto; - margin: 0 0.65rem; - - font-weight: var(--sidebar-small-account-username-weight); - } - - &-visual-status { - display: none; - } - - &-status-bullet { - width: var(--sidebar-small-account-status-bullet-size); - height: var(--sidebar-small-account-status-bullet-size); - margin: 0; - } - } -} - -.rc-popover--account { - & [data-type="set-state"] { - & .rc-icon { - font-size: var(--sidebar-account-status-bullet-size); - } - - &.rc-popover__item { - &--online { - & .rc-icon { - color: var(--status-online); - } - } - - &--away { - & .rc-icon { - color: var(--status-away); - } - } - - &--busy { - & .rc-icon { - color: var(--status-busy); - } - } - - &--offline { - & .rc-icon { - color: var(--status-invisible); - } - } - } - } -} diff --git a/packages/rocketchat-theme/client/imports/components/sidebar/sidebar-header.css b/packages/rocketchat-theme/client/imports/components/sidebar/sidebar-header.css new file mode 100644 index 000000000000..cfc237780711 --- /dev/null +++ b/packages/rocketchat-theme/client/imports/components/sidebar/sidebar-header.css @@ -0,0 +1,105 @@ +.sidebar__header { + display: flex; + + margin: 0 -10px; + padding: var(--sidebar-default-padding); + align-items: center; + + &-thumb { + position: relative; + + flex: 0 0 var(--sidebar-account-thumb-size); + + width: var(--sidebar-account-thumb-size); + height: var(--sidebar-account-thumb-size); + margin: 0 10px; + } + + &-status-bullet { + position: absolute; + + right: -2px; + bottom: -1px; + + display: block; + + width: var(--sidebar-account-status-bullet-size); + height: var(--sidebar-account-status-bullet-size); + + border-width: 2px; + + border-style: solid; + border-color: var(--sidebar-background); + + border-radius: var(--sidebar-account-status-bullet-radius); + + &--online { + background-color: var(--status-online); + } + + &--away { + background-color: var(--status-away); + } + + &--busy { + background-color: var(--status-busy); + } + + &--invisible { + background-color: var(--status-invisible); + } + + &--offline { + background-color: var(--status-invisible); + } + } +} + +.sidebar__toolbar { + display: flex; + flex: 1 1 100%; + + margin: 0 10px; + justify-content: space-between; + + &-button { + color: var(--sidebar-item-text-color); + + font-size: 18px; + fill: var(--sidebar-item-text-color); + } +} + +.rc-popover--sidebar-header { + & [data-type="set-state"] { + & .rc-icon { + font-size: var(--sidebar-account-status-bullet-size); + } + + &.rc-popover__item { + &--online { + & .rc-icon { + color: var(--status-online); + } + } + + &--away { + & .rc-icon { + color: var(--status-away); + } + } + + &--busy { + & .rc-icon { + color: var(--status-busy); + } + } + + &--offline { + & .rc-icon { + color: var(--status-invisible); + } + } + } + } +} diff --git a/packages/rocketchat-theme/client/imports/general/variables.css b/packages/rocketchat-theme/client/imports/general/variables.css index 8caed14de318..b1d02fe211a7 100644 --- a/packages/rocketchat-theme/client/imports/general/variables.css +++ b/packages/rocketchat-theme/client/imports/general/variables.css @@ -176,9 +176,9 @@ /* * Sidebar Account */ - --sidebar-account-thumb-size: 36px; + --sidebar-account-thumb-size: 23px; --sidebar-small-account-thumb-size: 40px; - --sidebar-account-status-bullet-size: 12px; + --sidebar-account-status-bullet-size: 10px; --sidebar-small-account-status-bullet-size: 8px; --sidebar-account-status-bullet-radius: 50%; --sidebar-account-username-size: 1rem; diff --git a/packages/rocketchat-theme/client/main.css b/packages/rocketchat-theme/client/main.css index cf9975789520..d814af14d0d2 100644 --- a/packages/rocketchat-theme/client/main.css +++ b/packages/rocketchat-theme/client/main.css @@ -17,7 +17,7 @@ /* Sidebar */ @import 'imports/components/sidebar/sidebar.css'; -@import 'imports/components/sidebar/sidebar-account.css'; +@import 'imports/components/sidebar/sidebar-header.css'; @import 'imports/components/sidebar/sidebar-item.css'; @import 'imports/components/sidebar/sidebar-flex.css'; @import 'imports/components/sidebar/toolbar.css'; diff --git a/packages/rocketchat-ui-master/public/icons.svg b/packages/rocketchat-ui-master/public/icons.svg index 463f804ab401..7ba5fb41052f 100644 --- a/packages/rocketchat-ui-master/public/icons.svg +++ b/packages/rocketchat-ui-master/public/icons.svg @@ -83,4 +83,9 @@ + + + + + diff --git a/packages/rocketchat-ui-sidenav/client/accountBox.html b/packages/rocketchat-ui-sidenav/client/accountBox.html deleted file mode 100644 index 466b6609edd5..000000000000 --- a/packages/rocketchat-ui-sidenav/client/accountBox.html +++ /dev/null @@ -1,27 +0,0 @@ - diff --git a/packages/rocketchat-ui-sidenav/client/accountBox.js b/packages/rocketchat-ui-sidenav/client/accountBox.js deleted file mode 100644 index 5450d8af62b3..000000000000 --- a/packages/rocketchat-ui-sidenav/client/accountBox.js +++ /dev/null @@ -1,134 +0,0 @@ -/* globals popover isRtl */ - -Template.accountBox.helpers({ - myUserInfo() { - if (Meteor.user() == null && RocketChat.settings.get('Accounts_AllowAnonymousRead')) { - return { - name: t('Anonymous'), - fname: RocketChat.settings.get('UI_Use_Real_Name') && t('Anonymous'), - status: 'online', - visualStatus: t('online'), - bullet: 'general-success-background', - username: 'anonymous' - }; - } - - const user = Meteor.user() || {}; - const { name, username } = user; - const userStatus = Session.get(`user_${ username }_status`); - - return { - name: Session.get(`user_${ username }_name`) || username, - status: Session.get(`user_${ username }_status`), - visualStatus: t(userStatus.charAt(0).toUpperCase() + userStatus.slice(1)), - bullet: userStatus, - _id: Meteor.userId(), - username, - fname: RocketChat.settings.get('UI_Use_Real_Name') && name - }; - }, - - isAnonymous() { - if (Meteor.userId() == null && RocketChat.settings.get('Accounts_AllowAnonymousRead')) { - return 'disabled'; - } - } -}); - -Template.accountBox.events({ - 'click .sidebar__account.active'() { - let adminOption; - if (RocketChat.authz.hasAtLeastOnePermission(['view-statistics', 'view-room-administration', 'view-user-administration', 'view-privileged-setting' ]) || (RocketChat.AdminBox.getOptions().length > 0)) { - adminOption = { - icon: 'customize', - name: t('Administration'), - type: 'open', - id: 'administration' - }; - } - - const accountBox = document.querySelector('.sidebar__account'); - - const config = { - popoverClass: 'account', - columns: [ - { - groups: [ - { - title: t('User'), - items: [ - { - icon: 'circle', - name: t('Online'), - type: 'set-state', - id: 'online', - modifier: 'online' - }, - { - icon: 'circle', - name: t('Away'), - type: 'set-state', - id: 'away', - modifier: 'away' - }, - { - icon: 'circle', - name: t('Busy'), - type: 'set-state', - id: 'busy', - modifier: 'busy' - }, - { - icon: 'circle', - name: t('Invisible'), - type: 'set-state', - id: 'offline', - modifier: 'offline' - } - ] - }, - { - items: AccountBox.getItems().map(item => { - return { - icon: item.icon, - name: t(item.name), - type: 'open', - id: item.name, - href: item.href, - sideNav: item.sideNav - }; - }).concat([ - adminOption, - { - icon: 'user', - name: t('My_Account'), - type: 'open', - id: 'account' - }, - { - icon: 'sign-out', - name: t('Logout'), - type: 'open', - id: 'logout' - } - ]) - } - - ] - } - ], - position: { - top: accountBox.offsetHeight - }, - customCSSProperties: { - width: `${ accountBox.offsetWidth - parseInt(getComputedStyle(accountBox)['padding-left'].replace('px', '')) * 2 }px`, - left: isRtl() ? 'auto' : getComputedStyle(accountBox)['padding-left'], - right: 'auto' - } - }; - - popover.open(config); - } -}); - -Template.accountBox.onRendered(() => AccountBox.init()); diff --git a/packages/rocketchat-ui-sidenav/client/createCombinedFlex.js b/packages/rocketchat-ui-sidenav/client/createCombinedFlex.js index 4310bc1a32d8..57054a30284f 100644 --- a/packages/rocketchat-ui-sidenav/client/createCombinedFlex.js +++ b/packages/rocketchat-ui-sidenav/client/createCombinedFlex.js @@ -78,14 +78,6 @@ Template.createCombinedFlex.events({ return SideNav.closeFlex(() => instance.clearForm()); }, - 'mouseenter header'() { - return SideNav.overArrow(); - }, - - 'mouseleave header'() { - return SideNav.leaveArrow(); - }, - 'keydown input[type="text"]'() { return Template.instance().error.set([]); }, diff --git a/packages/rocketchat-ui-sidenav/client/listChannelsFlex.js b/packages/rocketchat-ui-sidenav/client/listChannelsFlex.js index 12e2c9f458ca..b5fc23331e44 100644 --- a/packages/rocketchat-ui-sidenav/client/listChannelsFlex.js +++ b/packages/rocketchat-ui-sidenav/client/listChannelsFlex.js @@ -40,14 +40,6 @@ Template.listChannelsFlex.events({ } }, - 'mouseenter header'() { - return SideNav.overArrow(); - }, - - 'mouseleave header'() { - return SideNav.leaveArrow(); - }, - 'scroll .content': _.throttle(function(e, t) { if (t.hasMore.get() && (e.target.scrollTop >= (e.target.scrollHeight - e.target.clientHeight))) { return t.limit.set(t.limit.get() + 50); diff --git a/packages/rocketchat-ui-sidenav/client/listCombinedFlex.js b/packages/rocketchat-ui-sidenav/client/listCombinedFlex.js index c17049f867d2..a1066749077b 100644 --- a/packages/rocketchat-ui-sidenav/client/listCombinedFlex.js +++ b/packages/rocketchat-ui-sidenav/client/listCombinedFlex.js @@ -43,14 +43,6 @@ Template.listCombinedFlex.events({ return SideNav.closeFlex(); }, - 'mouseenter header'() { - return SideNav.overArrow(); - }, - - 'mouseleave header'() { - return SideNav.leaveArrow(); - }, - 'scroll .content': _.throttle(function(e, t) { if (t.hasMore.get() && (e.target.scrollTop >= (e.target.scrollHeight - e.target.clientHeight))) { return t.limit.set(t.limit.get() + 50); diff --git a/packages/rocketchat-ui-sidenav/client/listPrivateGroupsFlex.js b/packages/rocketchat-ui-sidenav/client/listPrivateGroupsFlex.js index dcf26eca5638..6c81377dd7a8 100644 --- a/packages/rocketchat-ui-sidenav/client/listPrivateGroupsFlex.js +++ b/packages/rocketchat-ui-sidenav/client/listPrivateGroupsFlex.js @@ -25,14 +25,6 @@ Template.listPrivateGroupsFlex.events({ return SideNav.closeFlex(); }, - 'mouseenter header'() { - return SideNav.overArrow(); - }, - - 'mouseleave header'() { - return SideNav.leaveArrow(); - }, - 'scroll .content': _.throttle(function(e, t) { if (t.hasMore.get() && (e.target.scrollTop >= (e.target.scrollHeight - e.target.clientHeight))) { return t.limit.set(t.limit.get() + 50); diff --git a/packages/rocketchat-ui-sidenav/client/sideNav.html b/packages/rocketchat-ui-sidenav/client/sideNav.html index 5278c254f221..79c6d0a84c5e 100644 --- a/packages/rocketchat-ui-sidenav/client/sideNav.html +++ b/packages/rocketchat-ui-sidenav/client/sideNav.html @@ -1,9 +1,6 @@ - - diff --git a/packages/rocketchat-ui-sidenav/client/sidebarHeader.js b/packages/rocketchat-ui-sidenav/client/sidebarHeader.js index 8217f4646d91..50a69633ca6d 100644 --- a/packages/rocketchat-ui-sidenav/client/sidebarHeader.js +++ b/packages/rocketchat-ui-sidenav/client/sidebarHeader.js @@ -182,7 +182,7 @@ Template.sidebarHeader.helpers({ } }); -Template.sidebarHeaderButton.events({ +Template.sidebarHeader.events({ 'click .js-button'(e) { return this.action && this.action.apply(this); } From ac43d7598ab76bad48a6139479d90c94cde6e4e1 Mon Sep 17 00:00:00 2001 From: Karl Prieb Date: Tue, 30 Jan 2018 16:47:30 -0200 Subject: [PATCH 03/26] fix set state --- .../components/sidebar/sidebar-header.css | 40 +++++++++---------- .../client/sidebarHeader.js | 27 +++++++------ .../rocketchat-ui/client/views/app/popover.js | 5 --- 3 files changed, 34 insertions(+), 38 deletions(-) diff --git a/packages/rocketchat-theme/client/imports/components/sidebar/sidebar-header.css b/packages/rocketchat-theme/client/imports/components/sidebar/sidebar-header.css index cfc237780711..e8f963c38765 100644 --- a/packages/rocketchat-theme/client/imports/components/sidebar/sidebar-header.css +++ b/packages/rocketchat-theme/client/imports/components/sidebar/sidebar-header.css @@ -71,34 +71,32 @@ } .rc-popover--sidebar-header { - & [data-type="set-state"] { - & .rc-icon { - font-size: var(--sidebar-account-status-bullet-size); - } + & .rc-icon { + font-size: var(--sidebar-account-status-bullet-size); + } - &.rc-popover__item { - &--online { - & .rc-icon { - color: var(--status-online); - } + & .rc-popover__item { + &--online { + & .rc-icon { + color: var(--status-online); } + } - &--away { - & .rc-icon { - color: var(--status-away); - } + &--away { + & .rc-icon { + color: var(--status-away); } + } - &--busy { - & .rc-icon { - color: var(--status-busy); - } + &--busy { + & .rc-icon { + color: var(--status-busy); } + } - &--offline { - & .rc-icon { - color: var(--status-invisible); - } + &--offline { + & .rc-icon { + color: var(--status-invisible); } } } diff --git a/packages/rocketchat-ui-sidenav/client/sidebarHeader.js b/packages/rocketchat-ui-sidenav/client/sidebarHeader.js index 50a69633ca6d..d63d595c434a 100644 --- a/packages/rocketchat-ui-sidenav/client/sidebarHeader.js +++ b/packages/rocketchat-ui-sidenav/client/sidebarHeader.js @@ -1,4 +1,11 @@ /* globals popover isRtl */ + +const setStatus = status => { + AccountBox.setStatus(status); + RocketChat.callbacks.run('userStatusManuallySet', status); + popover.close(); +}; + const toolbarButtons = [ { name: t('Search'), @@ -57,30 +64,26 @@ const toolbarButtons = [ { icon: 'circle', name: t('Online'), - type: 'set-state', - id: 'online', - modifier: 'online' + modifier: 'online', + action: () => setStatus('online') }, { icon: 'circle', name: t('Away'), - type: 'set-state', - id: 'away', - modifier: 'away' + modifier: 'away', + action: () => setStatus('away') }, { icon: 'circle', name: t('Busy'), - type: 'set-state', - id: 'busy', - modifier: 'busy' + modifier: 'busy', + action: () => setStatus('busy') }, { icon: 'circle', name: t('Invisible'), - type: 'set-state', - id: 'offline', - modifier: 'offline' + modifier: 'offline', + action: () => setStatus('offline') } ] }, diff --git a/packages/rocketchat-ui/client/views/app/popover.js b/packages/rocketchat-ui/client/views/app/popover.js index 4518b8112330..6d045c9fe40f 100644 --- a/packages/rocketchat-ui/client/views/app/popover.js +++ b/packages/rocketchat-ui/client/views/app/popover.js @@ -164,11 +164,6 @@ Template.popover.events({ popover.close(); } }, - 'click [data-type="set-state"]'(e) { - AccountBox.setStatus(e.currentTarget.dataset.id); - RocketChat.callbacks.run('userStatusManuallySet', e.currentTarget.dataset.status); - popover.close(); - }, 'click [data-type="sidebar-item"]'(e, instance) { popover.close(); const { rid, name, template } = instance.data.data; From b5e9c9c09d4c42eeb4655bebe5a6ec43578c9ab9 Mon Sep 17 00:00:00 2001 From: Karl Prieb Date: Wed, 31 Jan 2018 12:14:51 -0200 Subject: [PATCH 04/26] Fix saveUserPreferences method --- .../rocketchat-lib/server/models/Users.js | 11 +- .../client/accountPreferences.html | 48 ++++---- .../client/accountPreferences.js | 38 +++--- server/methods/saveUserPreferences.js | 111 ++++++------------ 4 files changed, 83 insertions(+), 125 deletions(-) diff --git a/packages/rocketchat-lib/server/models/Users.js b/packages/rocketchat-lib/server/models/Users.js index 5381c8f7ce4d..ef78d79bb3fc 100644 --- a/packages/rocketchat-lib/server/models/Users.js +++ b/packages/rocketchat-lib/server/models/Users.js @@ -436,10 +436,15 @@ class ModelUsers extends RocketChat.models._Base { } setPreferences(_id, preferences) { + const settings = Object.assign( + {}, + ...Object.keys(preferences).map(key => { + return {[`settings.preferences.${ key }`]: preferences[key]}; + }) + ); + const update = { - $set: { - 'settings.preferences': preferences - } + $set: settings }; return this.update(_id, update); diff --git a/packages/rocketchat-ui-account/client/accountPreferences.html b/packages/rocketchat-ui-account/client/accountPreferences.html index 22fb954194eb..9be9b43c5448 100644 --- a/packages/rocketchat-ui-account/client/accountPreferences.html +++ b/packages/rocketchat-ui-account/client/accountPreferences.html @@ -30,8 +30,8 @@

{{_ "User_Presence"}}

- - + +
@@ -101,73 +101,73 @@

{{_ "Messages"}}

- - + +
- - + +
- - + +
- - + +
- - + +
- - + +
- - + +
{{#if showRoles}}
- - + +
{{/if}}
- - + +
- - + +
@@ -231,8 +231,8 @@

{{_ "Sidebar"}}

- - + +
diff --git a/packages/rocketchat-ui-account/client/accountPreferences.js b/packages/rocketchat-ui-account/client/accountPreferences.js index fa33889e3be6..92120fec0e8e 100644 --- a/packages/rocketchat-ui-account/client/accountPreferences.js +++ b/packages/rocketchat-ui-account/client/accountPreferences.js @@ -129,37 +129,30 @@ Template.accountPreferences.onCreated(function() { data.newRoomNotification = $('select[name=newRoomNotification]').val(); data.newMessageNotification = $('select[name=newMessageNotification]').val(); - data.useEmojis = $('input[name=useEmojis]:checked').val(); - data.convertAsciiEmoji = $('input[name=convertAsciiEmoji]:checked').val(); - data.saveMobileBandwidth = $('input[name=saveMobileBandwidth]:checked').val(); - data.collapseMediaByDefault = $('input[name=collapseMediaByDefault]:checked').val(); + data.useEmojis = JSON.parse($('input[name=useEmojis]:checked').val()); + data.convertAsciiEmoji = JSON.parse($('input[name=convertAsciiEmoji]:checked').val()); + data.saveMobileBandwidth = JSON.parse($('input[name=saveMobileBandwidth]:checked').val()); + data.collapseMediaByDefault = JSON.parse($('input[name=collapseMediaByDefault]:checked').val()); data.viewMode = parseInt($('#viewMode').find('select').val()); - data.hideUsernames = $('#hideUsernames').find('input:checked').val(); - data.hideRoles = $('#hideRoles').find('input:checked').val(); - data.hideFlexTab = $('#hideFlexTab').find('input:checked').val(); - data.hideAvatars = $('#hideAvatars').find('input:checked').val(); - data.mergeChannels = $('#mergeChannels').find('input:checked').val(); + data.hideUsernames = JSON.parse($('#hideUsernames').find('input:checked').val()); + data.hideRoles = JSON.parse($('#hideRoles').find('input:checked').val()); + data.hideFlexTab = JSON.parse($('#hideFlexTab').find('input:checked').val()); + data.hideAvatars = JSON.parse($('#hideAvatars').find('input:checked').val()); + data.mergeChannels = parseInt($('#mergeChannels').find('input:checked').val()); data.sendOnEnter = $('#sendOnEnter').find('select').val(); data.roomsListExhibitionMode = $('select[name=roomsListExhibitionMode]').val(); - data.autoImageLoad = $('input[name=autoImageLoad]:checked').val(); + data.autoImageLoad = JSON.parse($('input[name=autoImageLoad]:checked').val()); data.emailNotificationMode = $('select[name=emailNotificationMode]').val(); - data.desktopNotificationDuration = $('input[name=desktopNotificationDuration]').val(); + data.desktopNotificationDuration = $('input[name=desktopNotificationDuration]').val() === '' ? RocketChat.settings.get('Accounts_Default_User_Preferences_desktopNotificationDuration') : parseInt($('input[name=desktopNotificationDuration]').val()); data.desktopNotifications = $('#desktopNotifications').find('select').val(); data.mobileNotifications = $('#mobileNotifications').find('select').val(); - data.unreadAlert = $('#unreadAlert').find('input:checked').val(); + data.unreadAlert = JSON.parse($('#unreadAlert').find('input:checked').val()); data.notificationsSoundVolume = parseInt($('#notificationsSoundVolume').val()); - data.roomCounterSidebar = $('#roomCounterSidebar').find('input:checked').val(); + data.roomCounterSidebar = JSON.parse($('#roomCounterSidebar').find('input:checked').val()); data.highlights = _.compact(_.map($('[name=highlights]').val().split('\n'), function(e) { return s.trim(e); })); - const selectedLanguage = $('#language').val(); - const enableAutoAway = $('#enableAutoAway').find('input:checked').val(); - const idleTimeLimit = parseInt($('input[name=idleTimeLimit]').val()); - - data.enableAutoAway = enableAutoAway; - data.idleTimeLimit = idleTimeLimit; - let reload = false; // if highlights changed we need page reload @@ -168,17 +161,22 @@ Template.accountPreferences.onCreated(function() { reload = true; } + const selectedLanguage = $('#language').val(); if (this.shouldUpdateLocalStorageSetting('userLanguage', selectedLanguage)) { localStorage.setItem('userLanguage', selectedLanguage); data.language = selectedLanguage; reload = true; } + const enableAutoAway = JSON.parse($('#enableAutoAway').find('input:checked').val()); + data.enableAutoAway = enableAutoAway; if (this.shouldUpdateLocalStorageSetting('enableAutoAway', enableAutoAway)) { localStorage.setItem('enableAutoAway', enableAutoAway); reload = true; } + const idleTimeLimit = $('input[name=idleTimeLimit]').val() === '' ? RocketChat.settings.get('Accounts_Default_User_Preferences_idleTimeoutLimit') : parseInt($('input[name=idleTimeLimit]').val()); + data.idleTimeLimit = idleTimeLimit; if (this.shouldUpdateLocalStorageSetting('idleTimeLimit', idleTimeLimit)) { localStorage.setItem('idleTimeLimit', idleTimeLimit); reload = true; diff --git a/server/methods/saveUserPreferences.js b/server/methods/saveUserPreferences.js index 0e9a56c2bd21..b70ff3e98bf2 100644 --- a/server/methods/saveUserPreferences.js +++ b/server/methods/saveUserPreferences.js @@ -1,93 +1,48 @@ Meteor.methods({ saveUserPreferences(settings) { - check(settings, Object); + check(settings, Match.ObjectIncluding({ + language: Match.Optional(String), + newRoomNotification: Match.Optional(String), + newMessageNotification: Match.Optional(String), + useEmojis: Match.Optional(Boolean), + convertAsciiEmoji: Match.Optional(Boolean), + saveMobileBandwidth: Match.Optional(Boolean), + collapseMediaByDefault: Match.Optional(Boolean), + autoImageLoad: Match.Optional(Boolean), + emailNotificationMode: Match.Optional(String), + roomsListExhibitionMode: Match.Optional(String), + unreadAlert: Match.Optional(Boolean), + notificationsSoundVolume: Match.Optional(Number), + desktopNotifications: Match.Optional(String), + mobileNotifications: Match.Optional(String), + enableAutoAway: Match.Optional(Boolean), + highlights: [String], + desktopNotificationDuration: Match.Optional(Number), + viewMode: Match.Optional(Number), + hideUsernames: Match.Optional(Boolean), + hideRoles: Match.Optional(Boolean), + hideAvatars: Match.Optional(Boolean), + hideFlexTab: Match.Optional(Boolean), + sendOnEnter: Match.Optional(String), + roomCounterSidebar: Match.Optional(Boolean), + mergeChannels: Match.Optional(Number), + idleTimeLimit: Match.Optional(Number) + })); if (Meteor.userId()) { - const preferences = {}; - if (settings.language != null) { RocketChat.models.Users.setLanguage(Meteor.userId(), settings.language); } - if (settings.newRoomNotification) { - preferences.newRoomNotification = settings.newRoomNotification; - } - - if (settings.newMessageNotification) { - preferences.newMessageNotification = settings.newMessageNotification; - } - - if (settings.useEmojis) { - preferences.useEmojis = settings.useEmojis === '1' ? true : false; - } - - if (settings.convertAsciiEmoji) { - preferences.convertAsciiEmoji = settings.convertAsciiEmoji === '1' ? true : false; - } - - if (settings.saveMobileBandwidth) { - preferences.saveMobileBandwidth = settings.saveMobileBandwidth === '1' ? true : false; - } - - if (settings.collapseMediaByDefault) { - preferences.collapseMediaByDefault = settings.collapseMediaByDefault === '1' ? true : false; - } - - if (settings.autoImageLoad) { - preferences.autoImageLoad = settings.autoImageLoad === '1' ? true : false; - } - - if (settings.emailNotificationMode) { - preferences.emailNotificationMode = settings.emailNotificationMode; - } - - if (settings.mergeChannels !== '-1') { - preferences.mergeChannels = settings.mergeChannels === '1'; + if (settings.mergeChannels !== -1) { + settings.mergeChannels = settings.mergeChannels === '1'; } else { - delete preferences.mergeChannels; - } - - preferences.roomsListExhibitionMode = ['category', 'unread', 'activity'].includes(settings.roomsListExhibitionMode) ? settings.roomsListExhibitionMode : 'category'; - - if (settings.unreadAlert) { - preferences.unreadAlert = settings.unreadAlert === '1' ? true : false; - } - - if (settings.notificationsSoundVolume) { - preferences.notificationsSoundVolume = settings.notificationsSoundVolume; - } - - if (settings.audioNotifications) { - preferences.audioNotifications = settings.audioNotifications; - } - - if (settings.desktopNotifications) { - preferences.desktopNotifications = settings.desktopNotifications; - } - - if (settings.mobileNotifications) { - preferences.mobileNotifications = settings.mobileNotifications; - } - if (settings.idleTimeLimit) { - preferences.idleTimeLimit = settings.idleTimeLimit; - } - - preferences.enableAutoAway = settings.enableAutoAway === '1'; - - if (settings.highlights) { - preferences.highlights = settings.highlights; + delete settings.mergeChannels; } - preferences.desktopNotificationDuration = settings.desktopNotificationDuration - 0; - preferences.viewMode = settings.viewMode || 0; - preferences.hideUsernames = settings.hideUsernames === '1'; - preferences.hideRoles = settings.hideRoles === '1'; - preferences.hideAvatars = settings.hideAvatars === '1'; - preferences.hideFlexTab = settings.hideFlexTab === '1'; - preferences.sendOnEnter = settings.sendOnEnter; - preferences.roomCounterSidebar = settings.roomCounterSidebar === '1'; + settings.roomsListExhibitionMode = ['category', 'unread', 'activity'].includes(settings.roomsListExhibitionMode) ? settings.roomsListExhibitionMode : 'category'; - RocketChat.models.Users.setPreferences(Meteor.userId(), preferences); + RocketChat.models.Users.setPreferences(Meteor.userId(), settings); return true; } From b52402ddb345bb9cd762c8024fb0c27646a50306 Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Thu, 1 Feb 2018 14:55:14 -0200 Subject: [PATCH 05/26] sort ;ist --- packages/rocketchat-api/server/api.js | 5 ++ .../lib/roomTypes/conversation.js | 4 +- .../rocketchat-lib/lib/roomTypes/direct.js | 4 +- .../rocketchat-lib/lib/roomTypes/favorite.js | 4 + .../rocketchat-lib/lib/roomTypes/index.js | 2 - .../rocketchat-lib/lib/roomTypes/private.js | 4 +- .../rocketchat-lib/lib/roomTypes/public.js | 4 +- .../rocketchat-lib/lib/roomTypes/unread.js | 2 +- .../startup/defaultRoomTypes.js | 2 - .../client/imports/components/popover.css | 4 + .../rocketchat-ui-sidenav/client/roomList.js | 77 ++++++++++++------- .../client/sidebarHeader.js | 29 ++++++- .../client/sortlist.html | 56 ++++++++++++++ .../rocketchat-ui-sidenav/client/sortlist.js | 36 +++++++++ packages/rocketchat-ui-sidenav/package.js | 2 + server/methods/saveUserPreferences.js | 47 +++++++---- 16 files changed, 223 insertions(+), 59 deletions(-) create mode 100644 packages/rocketchat-ui-sidenav/client/sortlist.html create mode 100644 packages/rocketchat-ui-sidenav/client/sortlist.js diff --git a/packages/rocketchat-api/server/api.js b/packages/rocketchat-api/server/api.js index df2e1a9dd72a..7350271ee1b0 100644 --- a/packages/rocketchat-api/server/api.js +++ b/packages/rocketchat-api/server/api.js @@ -222,15 +222,20 @@ class API extends Restivus { post() { const args = loginCompatibility(this.bodyParams); + console.log('args ->', args); + const invocation = new DDPCommon.MethodInvocation({ connection: { close() {} } }); + console.log('invocation ->', invocation); + let auth; try { auth = DDP._CurrentInvocation.withValue(invocation, () => Meteor.call('login', args)); + console.log('UTH ->', auth); } catch (error) { let e = error; if (error.reason === 'User not found') { diff --git a/packages/rocketchat-lib/lib/roomTypes/conversation.js b/packages/rocketchat-lib/lib/roomTypes/conversation.js index 009dbf59ccbf..6f7caa07bdc5 100644 --- a/packages/rocketchat-lib/lib/roomTypes/conversation.js +++ b/packages/rocketchat-lib/lib/roomTypes/conversation.js @@ -3,7 +3,7 @@ import { RoomTypeConfig } from '../RoomTypeConfig'; export class ConversationRoomType extends RoomTypeConfig { constructor() { super({ - identifier: 'activity', + identifier: 'merged', order: 30, label: 'Conversations' }); @@ -11,6 +11,6 @@ export class ConversationRoomType extends RoomTypeConfig { condition() { const user = Meteor.user(); - return RocketChat.getUserPreference(user, 'roomsListExhibitionMode') === 'activity'; + return RocketChat.getUserPreference(user, 'mergeChannels'); } } diff --git a/packages/rocketchat-lib/lib/roomTypes/direct.js b/packages/rocketchat-lib/lib/roomTypes/direct.js index 3a8c6c8455f4..44078e0e9190 100644 --- a/packages/rocketchat-lib/lib/roomTypes/direct.js +++ b/packages/rocketchat-lib/lib/roomTypes/direct.js @@ -62,8 +62,8 @@ export class DirectMessageRoomType extends RoomTypeConfig { condition() { const user = Meteor.user(); - const roomsListExhibitionMode = RocketChat.getUserPreference(user, 'roomsListExhibitionMode'); - return !roomsListExhibitionMode || ['unread', 'category'].includes(roomsListExhibitionMode) && RocketChat.authz.hasAtLeastOnePermission(['view-d-room', 'view-joined-room']); + const mergeChannels = RocketChat.getUserPreference(user, 'mergeChannels'); + return !mergeChannels && RocketChat.authz.hasAtLeastOnePermission(['view-d-room', 'view-joined-room']); } getUserStatus(roomId) { diff --git a/packages/rocketchat-lib/lib/roomTypes/favorite.js b/packages/rocketchat-lib/lib/roomTypes/favorite.js index 55e061547d75..2b927c0767ad 100644 --- a/packages/rocketchat-lib/lib/roomTypes/favorite.js +++ b/packages/rocketchat-lib/lib/roomTypes/favorite.js @@ -10,4 +10,8 @@ export class FavoriteRoomType extends RoomTypeConfig { label: 'Favorites' }); } + condition() { + const user = Meteor.user(); + return RocketChat.settings.get('Favorite_Rooms') && RocketChat.getUserPreference(user, 'sidebarShowFavorites'); + } } diff --git a/packages/rocketchat-lib/lib/roomTypes/index.js b/packages/rocketchat-lib/lib/roomTypes/index.js index 739421c89b38..4c0fd94d732d 100644 --- a/packages/rocketchat-lib/lib/roomTypes/index.js +++ b/packages/rocketchat-lib/lib/roomTypes/index.js @@ -1,4 +1,3 @@ -import { ChannelsRoomType } from './channels'; import { ConversationRoomType } from './conversation'; import { DirectMessageRoomType } from './direct'; import { FavoriteRoomType } from './favorite'; @@ -7,7 +6,6 @@ import { PublicRoomType } from './public'; import { UnreadRoomType } from './unread'; export { - ChannelsRoomType, ConversationRoomType, DirectMessageRoomType, FavoriteRoomType, diff --git a/packages/rocketchat-lib/lib/roomTypes/private.js b/packages/rocketchat-lib/lib/roomTypes/private.js index c0a3fdbfe2f4..4b7aea976400 100644 --- a/packages/rocketchat-lib/lib/roomTypes/private.js +++ b/packages/rocketchat-lib/lib/roomTypes/private.js @@ -44,9 +44,9 @@ export class PrivateRoomType extends RoomTypeConfig { condition() { const user = Meteor.user(); - const roomsListExhibitionMode = RocketChat.getUserPreference(user, 'roomsListExhibitionMode'); + // const roomsListExhibitionMode = RocketChat.getUserPreference(user, 'roomsListExhibitionMode'); const mergeChannels = RocketChat.getUserPreference(user, 'mergeChannels'); - return !roomsListExhibitionMode || ['unread', 'category'].includes(roomsListExhibitionMode) && !mergeChannels && RocketChat.authz.hasAllPermission('view-p-room'); + return !mergeChannels && RocketChat.authz.hasAllPermission('view-p-room'); } isGroupChat() { diff --git a/packages/rocketchat-lib/lib/roomTypes/public.js b/packages/rocketchat-lib/lib/roomTypes/public.js index 442423364c9d..fb9c9e277ad3 100644 --- a/packages/rocketchat-lib/lib/roomTypes/public.js +++ b/packages/rocketchat-lib/lib/roomTypes/public.js @@ -42,9 +42,9 @@ export class PublicRoomType extends RoomTypeConfig { condition() { const user = Meteor.user(); - const roomsListExhibitionMode = RocketChat.getUserPreference(user, 'roomsListExhibitionMode'); + // const roomsListExhibitionMode = RocketChat.getUserPreference(user, 'roomsListExhibitionMode'); const mergeChannels = RocketChat.getUserPreference(user, 'mergeChannels'); - return !roomsListExhibitionMode || ['unread', 'category'].includes(roomsListExhibitionMode) && !mergeChannels && (RocketChat.authz.hasAtLeastOnePermission(['view-c-room', 'view-joined-room']) || RocketChat.settings.get('Accounts_AllowAnonymousRead') === true); + return !mergeChannels && (RocketChat.authz.hasAtLeastOnePermission(['view-c-room', 'view-joined-room']) || RocketChat.settings.get('Accounts_AllowAnonymousRead') === true); } showJoinLink(roomId) { diff --git a/packages/rocketchat-lib/lib/roomTypes/unread.js b/packages/rocketchat-lib/lib/roomTypes/unread.js index 395036c65088..0e15cf0aa6fa 100644 --- a/packages/rocketchat-lib/lib/roomTypes/unread.js +++ b/packages/rocketchat-lib/lib/roomTypes/unread.js @@ -13,6 +13,6 @@ export class UnreadRoomType extends RoomTypeConfig { condition() { const user = Meteor.user(); - return RocketChat.getUserPreference(user, 'roomsListExhibitionMode') === 'unread'; + return RocketChat.getUserPreference(user, 'sidebarShowUnread'); } } diff --git a/packages/rocketchat-lib/startup/defaultRoomTypes.js b/packages/rocketchat-lib/startup/defaultRoomTypes.js index 3bb90fc29299..9f9e006f1324 100644 --- a/packages/rocketchat-lib/startup/defaultRoomTypes.js +++ b/packages/rocketchat-lib/startup/defaultRoomTypes.js @@ -1,5 +1,4 @@ import { - ChannelsRoomType, ConversationRoomType, DirectMessageRoomType, FavoriteRoomType, @@ -11,7 +10,6 @@ import { RocketChat.roomTypes.add(new UnreadRoomType()); RocketChat.roomTypes.add(new FavoriteRoomType()); RocketChat.roomTypes.add(new ConversationRoomType()); -RocketChat.roomTypes.add(new ChannelsRoomType()); RocketChat.roomTypes.add(new PublicRoomType()); RocketChat.roomTypes.add(new PrivateRoomType()); RocketChat.roomTypes.add(new DirectMessageRoomType()); diff --git a/packages/rocketchat-theme/client/imports/components/popover.css b/packages/rocketchat-theme/client/imports/components/popover.css index 72a8fabeffa6..702117b30f34 100644 --- a/packages/rocketchat-theme/client/imports/components/popover.css +++ b/packages/rocketchat-theme/client/imports/components/popover.css @@ -101,6 +101,10 @@ } } + &--bold { + font-weight: bold; + } + &--star-filled .rc-icon { fill: currentColor; } diff --git a/packages/rocketchat-ui-sidenav/client/roomList.js b/packages/rocketchat-ui-sidenav/client/roomList.js index 17219a65d425..6a538a1ef3ac 100644 --- a/packages/rocketchat-ui-sidenav/client/roomList.js +++ b/packages/rocketchat-ui-sidenav/client/roomList.js @@ -5,37 +5,47 @@ import { UiTextContext } from 'meteor/rocketchat:lib'; Template.roomList.helpers({ rooms() { - if (this.identifier === 'unread') { - const query = { - alert: true, - open: true, - hideUnreadStatus: {$ne: true} - }; - return ChatSubscription.find(query, {sort: {'t': 1, 'name': 1}}); - } + + /* + modes: + sortby activity/alphabetical + merge channels into one list + show favorites + show unread + */ + if (this.anonymous) { return RocketChat.models.Rooms.find({t: 'c'}, {sort: {name: 1}}); } - - const favoritesEnabled = RocketChat.settings.get('Favorite_Rooms'); - + const user = Meteor.user(); + const sortBy = RocketChat.getUserPreference(user, 'sidebarSortby') || 'activity'; const query = { open: true }; - const sort = { 't': 1 }; - if (this.identifier === 'd' && RocketChat.settings.get('UI_Use_Real_Name')) { - sort.fname = 1; - } else { - sort.name = 1; + + const sort = {}; + + if (sortBy === 'activity') { + sort.t = 1; + } else { // alphabetical + sort[this.identifier === 'd' && RocketChat.settings.get('UI_Use_Real_Name') ? 'fname' : 'name'] = /descending/.test(sortBy) ? -1 : 1; } + + if (this.identifier === 'unread') { + query.alert = true; + query.hideUnreadStatus = {$ne: true}; + return ChatSubscription.find(query, {sort}); + } + + const favoritesEnabled = RocketChat.settings.get('Favorite_Rooms') && RocketChat.getUserPreference(user, 'sidebarShowFavorites'); + if (this.identifier === 'f') { query.f = favoritesEnabled; } else { let types = [this.identifier]; - const user = Meteor.user(); - if (this.identifier === 'activity') { + if (this.identifier === 'merged') { types = ['c', 'p', 'd']; } @@ -43,10 +53,10 @@ Template.roomList.helpers({ types = ['c', 'p']; } - if (this.identifier === 'tokens' && user && user.services && user.services.tokenpass) { - query.tokens = { $exists: true }; - } else if (this.identifier === 'c' || this.identifier === 'p') { + if (['c', 'p'].includes(this.identifier)) { query.tokens = { $exists: false }; + } else if (this.identifier === 'tokens' && user && user.services && user.services.tokenpass) { + query.tokens = { $exists: true }; } if (RocketChat.getUserPreference(user, 'roomsListExhibitionMode') === 'unread') { @@ -59,15 +69,28 @@ Template.roomList.helpers({ query.t = {$in: types}; query.f = {$ne: favoritesEnabled}; } - if (this.identifier === 'activity') { - const list = ChatSubscription.find(query).fetch().map(sub => { - const lm = RocketChat.models.Rooms.findOne(sub.rid, {fields: {_updatedAt: 1}})._updatedAt; + + if (sortBy === 'activity') { + const list = ChatSubscription.find(query, {sort: {rid : 1}}).fetch(); + const ids = list.map(sub => sub.rid); + const rooms = RocketChat.models.Rooms.find({ + _id: { $in : ids} + }, + { + sort : { + _id: 1 + }, + fields: {_updatedAt: 1} + }).fetch(); + + + return _.sortBy(list.map((sub, i) => { + const lm = rooms[i]._updatedAt; return { lm: lm && lm.toISOString(), ...sub }; - }); - return _.sortBy(list, 'lm').reverse(); + }), 'lm').reverse(); } return ChatSubscription.find(query, {sort}); }, @@ -83,7 +106,7 @@ Template.roomList.helpers({ or is unread and has one room */ - return !['unread', 'f'].includes(group.identifier) || rooms.count(); + return !['unread', 'f'].includes(group.identifier) || (rooms.length || rooms.count && rooms.count()); }, roomType(room) { diff --git a/packages/rocketchat-ui-sidenav/client/sidebarHeader.js b/packages/rocketchat-ui-sidenav/client/sidebarHeader.js index d63d595c434a..dcb9056db7fe 100644 --- a/packages/rocketchat-ui-sidenav/client/sidebarHeader.js +++ b/packages/rocketchat-ui-sidenav/client/sidebarHeader.js @@ -21,7 +21,32 @@ const toolbarButtons = [ }, { name: t('Sort'), - icon: 'sort' + icon: 'sort', + action: (e) => { + const sidebarHeader = document.querySelector('.sidebar__header'); + const sidebarHeaderPadding = parseInt(getComputedStyle(sidebarHeader)['padding-left'].replace('px', '')) * 2; + const sidebarHeaderMargin = parseInt(getComputedStyle(sidebarHeader)['margin-left'].replace('px', '')) * 2; + const options = []; + const config = { + template: 'sortlist', + mousePosition: () => ({ + x: e.currentTarget.getBoundingClientRect().left, + y: e.currentTarget.getBoundingClientRect().bottom + 50 + }), + customCSSProperties: () => ({ + top: `${ e.currentTarget.getBoundingClientRect().bottom + 10 }px`, + left: `${ e.currentTarget.getBoundingClientRect().left - 10 }px` + }), + data: { + change : (value) => { + // return instance.form[key].set(key === 'desktopNotificationDuration' ? parseInt(value) : value); + }, + // value: instance.form[key].get(), + options + } + }; + popover.open(config); + } }, { name: t('Create_A_New_Channel'), @@ -187,6 +212,6 @@ Template.sidebarHeader.helpers({ Template.sidebarHeader.events({ 'click .js-button'(e) { - return this.action && this.action.apply(this); + return this.action && this.action.apply(this, [e]); } }); diff --git a/packages/rocketchat-ui-sidenav/client/sortlist.html b/packages/rocketchat-ui-sidenav/client/sortlist.html new file mode 100644 index 000000000000..aff7c36ffeda --- /dev/null +++ b/packages/rocketchat-ui-sidenav/client/sortlist.html @@ -0,0 +1,56 @@ + diff --git a/packages/rocketchat-ui-sidenav/client/sortlist.js b/packages/rocketchat-ui-sidenav/client/sortlist.js new file mode 100644 index 000000000000..6b152312aa7a --- /dev/null +++ b/packages/rocketchat-ui-sidenav/client/sortlist.js @@ -0,0 +1,36 @@ +/* globals menu*/ + +Template.sortlist.helpers({ + favorite() { + return RocketChat.settings.get('Favorite_Rooms'); + }, + checked(prop, field) { + const user = Meteor.user(); + if (prop === 'sidebarShowFavorites') { + return RocketChat.getUserPreference(user, 'sidebarShowFavorites'); + } + if (prop === 'mergeChannels') { + return RocketChat.getUserPreference(user, 'mergeChannels'); + } + if (prop === 'sidebarShowUnread') { + return RocketChat.getUserPreference(user, 'sidebarShowUnread'); + } + if (prop === 'sidebarSortby') { + return (RocketChat.getUserPreference(user, 'sidebarSortby') || 'activity') === field; + } + } +}); + +Template.sortlist.events({ + 'change input'({currentTarget}) { + const name = currentTarget.getAttribute('name'); + const value = currentTarget.getAttribute('type') === 'checkbox' ? currentTarget.checked : currentTarget.value; + Meteor.call('saveUserPreferences', { + [name] : value + }); + } +}); + +Template.sortlist.onRendered(function() { + +}); diff --git a/packages/rocketchat-ui-sidenav/package.js b/packages/rocketchat-ui-sidenav/package.js index b8cc33e7a303..752ba50ba538 100644 --- a/packages/rocketchat-ui-sidenav/package.js +++ b/packages/rocketchat-ui-sidenav/package.js @@ -28,6 +28,7 @@ Package.onUse(function(api) { api.addFiles('client/sideNav.html', 'client'); api.addFiles('client/toolbar.html', 'client'); api.addFiles('client/roomList.html', 'client'); + api.addFiles('client/sortlist.html', 'client'); api.addFiles('client/userStatus.html', 'client'); api.addFiles('client/createCombinedFlex.js', 'client'); @@ -39,5 +40,6 @@ Package.onUse(function(api) { api.addFiles('client/sidebarItem.js', 'client'); api.addFiles('client/sideNav.js', 'client'); api.addFiles('client/roomList.js', 'client'); + api.addFiles('client/sortlist.js', 'client'); api.addFiles('client/toolbar.js', 'client'); }); diff --git a/server/methods/saveUserPreferences.js b/server/methods/saveUserPreferences.js index b70ff3e98bf2..6dad8488504a 100644 --- a/server/methods/saveUserPreferences.js +++ b/server/methods/saveUserPreferences.js @@ -1,6 +1,6 @@ Meteor.methods({ saveUserPreferences(settings) { - check(settings, Match.ObjectIncluding({ + const keys = { language: Match.Optional(String), newRoomNotification: Match.Optional(String), newMessageNotification: Match.Optional(String), @@ -16,7 +16,7 @@ Meteor.methods({ desktopNotifications: Match.Optional(String), mobileNotifications: Match.Optional(String), enableAutoAway: Match.Optional(Boolean), - highlights: [String], + highlights: Match.Optional([String]), desktopNotificationDuration: Match.Optional(Number), viewMode: Match.Optional(Number), hideUsernames: Match.Optional(Boolean), @@ -25,26 +25,39 @@ Meteor.methods({ hideFlexTab: Match.Optional(Boolean), sendOnEnter: Match.Optional(String), roomCounterSidebar: Match.Optional(Boolean), - mergeChannels: Match.Optional(Number), - idleTimeLimit: Match.Optional(Number) - })); + idleTimeLimit: Match.Optional(Number), + // sidebarMergeChannels: Match.Optional(Boolean), + sidebarShowFavorites: Match.Optional(Boolean), + sidebarShowUnread: Match.Optional(Boolean), + sidebarSortby: Match.Optional(String) + }; + check(settings, Match.ObjectIncluding(keys)); + if (settings.mergeChannels) { + check(settings, Match.ObjectIncluding({ + mergeChannels: Match.OneOf(Number, Boolean) + })); + } + const user = Meteor.userId(); + if (!user) { + return false; + } + + if (settings.language != null) { + RocketChat.models.Users.setLanguage(user, settings.language); + } + + if (settings.mergeChannels != null) { + settings.mergeChannels = ['1', true].includes(settings.mergeChannels); + } - if (Meteor.userId()) { - if (settings.language != null) { - RocketChat.models.Users.setLanguage(Meteor.userId(), settings.language); - } - if (settings.mergeChannels !== -1) { - settings.mergeChannels = settings.mergeChannels === '1'; - } else { - delete settings.mergeChannels; - } + if (settings.roomsListExhibitionMode != null) { settings.roomsListExhibitionMode = ['category', 'unread', 'activity'].includes(settings.roomsListExhibitionMode) ? settings.roomsListExhibitionMode : 'category'; + } - RocketChat.models.Users.setPreferences(Meteor.userId(), settings); + RocketChat.models.Users.setPreferences(user, settings); - return true; - } + return true; } }); From 07226e27faa11f90e6afe142a4b263085e7d2225 Mon Sep 17 00:00:00 2001 From: Karl Prieb Date: Thu, 1 Feb 2018 15:14:07 -0200 Subject: [PATCH 06/26] sidenav viewmode --- .../client/views/sideNav/livechat.html | 4 - .../components/sidebar/sidebar-header.css | 2 +- .../components/sidebar/sidebar-item.css | 2 +- .../rocketchat-ui-sidenav/client/sideNav.html | 2 +- .../rocketchat-ui-sidenav/client/sideNav.js | 9 +- .../client/sidebarHeader.js | 102 +++++++++++++++++- server/methods/saveUserPreferences.js | 4 +- 7 files changed, 112 insertions(+), 13 deletions(-) diff --git a/packages/rocketchat-livechat/client/views/sideNav/livechat.html b/packages/rocketchat-livechat/client/views/sideNav/livechat.html index a895584a1ef3..d92756fbbb70 100644 --- a/packages/rocketchat-livechat/client/views/sideNav/livechat.html +++ b/packages/rocketchat-livechat/client/views/sideNav/livechat.html @@ -15,8 +15,6 @@

    {{#each room in inquiries}} {{> chatRoomItem room }} - {{else}} -

    {{_ "No_livechats" }}

    {{/each}}
{{/if}} @@ -32,8 +30,6 @@

{{/if}} {{#each room in rooms}} {{> chatRoomItem room }} - {{else}} -

{{_ "No_livechats" }}

{{/each}} diff --git a/packages/rocketchat-theme/client/imports/components/sidebar/sidebar-header.css b/packages/rocketchat-theme/client/imports/components/sidebar/sidebar-header.css index e8f963c38765..9e3347e82184 100644 --- a/packages/rocketchat-theme/client/imports/components/sidebar/sidebar-header.css +++ b/packages/rocketchat-theme/client/imports/components/sidebar/sidebar-header.css @@ -71,7 +71,7 @@ } .rc-popover--sidebar-header { - & .rc-icon { + & .rc-popover__icon-element--circle { font-size: var(--sidebar-account-status-bullet-size); } diff --git a/packages/rocketchat-theme/client/imports/components/sidebar/sidebar-item.css b/packages/rocketchat-theme/client/imports/components/sidebar/sidebar-item.css index f0b0914bbff1..938d20aeb434 100644 --- a/packages/rocketchat-theme/client/imports/components/sidebar/sidebar-item.css +++ b/packages/rocketchat-theme/client/imports/components/sidebar/sidebar-item.css @@ -12,7 +12,7 @@ } } -.sidebar--big { +.sidebar--extended { & > .rooms-list, & .rooms-list__toolbar-search { & .sidebar-item { diff --git a/packages/rocketchat-ui-sidenav/client/sideNav.html b/packages/rocketchat-ui-sidenav/client/sideNav.html index 79c6d0a84c5e..a497e6a44571 100644 --- a/packages/rocketchat-ui-sidenav/client/sideNav.html +++ b/packages/rocketchat-ui-sidenav/client/sideNav.html @@ -1,5 +1,5 @@