diff --git a/packages/rocketchat-ui-sidenav/client/chatRoomItem.coffee b/packages/rocketchat-ui-sidenav/client/chatRoomItem.coffee deleted file mode 100644 index 99b126be3492..000000000000 --- a/packages/rocketchat-ui-sidenav/client/chatRoomItem.coffee +++ /dev/null @@ -1,122 +0,0 @@ -Template.chatRoomItem.helpers - - alert: -> - if FlowRouter.getParam('_id') isnt this.rid or not document.hasFocus() - return this.alert - - unread: -> - if (FlowRouter.getParam('_id') isnt this.rid or not document.hasFocus()) and this.unread > 0 - return this.unread - - userStatus: -> - userStatus = RocketChat.roomTypes.getUserStatus(this.t, this.rid); - return 'status-' + (userStatus or 'offline') - - name: -> - return this.name - - roomIcon: -> - return RocketChat.roomTypes.getIcon this.t - - active: -> - if Session.get('openedRoom') is this.rid - return 'active' - - canLeave: -> - roomData = Session.get('roomData' + this.rid) - - return false unless roomData - - if (roomData.cl? and not roomData.cl) or roomData.t is 'd' - return false - else - return true - - route: -> - return RocketChat.roomTypes.getRouteLink @t, @ - - archived: -> - return if this.archived then 'archived' - -Template.chatRoomItem.rendered = -> - if not (FlowRouter.getParam('_id')? and FlowRouter.getParam('_id') is this.data.rid) and not this.data.ls and this.data.alert is true - KonchatNotification.newRoom(this.data.rid) - -Template.chatRoomItem.events - - 'click .open-room': (e) -> - menu.close() - - 'click .hide-room': (e) -> - e.stopPropagation() - e.preventDefault() - - rid = this.rid - name = this.name - - warnText = switch this.t - when 'c' then 'Hide_Room_Warning' - when 'p' then 'Hide_Group_Warning' - when 'd' then 'Hide_Private_Warning' - - swal { - title: t('Are_you_sure') - text: if warnText then t(warnText, name) else '' - type: 'warning' - showCancelButton: true - confirmButtonColor: '#DD6B55' - confirmButtonText: t('Yes_hide_it') - cancelButtonText: t('Cancel') - closeOnConfirm: true - html: false - }, -> - if FlowRouter.getRouteName() in ['channel', 'group', 'direct'] and Session.get('openedRoom') is rid - FlowRouter.go 'home' - - Meteor.call 'hideRoom', rid, (err) -> - if err - handleError(err) - else - if rid is Session.get('openedRoom') - Session.delete('openedRoom') - - 'click .leave-room': (e) -> - e.stopPropagation() - e.preventDefault() - - rid = this.rid - name = this.name - - warnText = switch - when this.t == 'c' then 'Leave_Room_Warning' - when this.t == 'p' then 'Leave_Group_Warning' - when this.t == 'd' then 'Leave_Private_Warning' - swal { - title: t('Are_you_sure') - text: t(warnText, name) - type: 'warning' - showCancelButton: true - confirmButtonColor: '#DD6B55' - confirmButtonText: t('Yes_leave_it') - cancelButtonText: t('Cancel') - closeOnConfirm: false - html: false - }, (isConfirm) -> - if isConfirm - Meteor.call 'leaveRoom', rid, (err) -> - if err - swal { - title: t('Warning') - text: handleError(err, false) - type: 'warning' - html: false - } - - else - swal.close() - if FlowRouter.getRouteName() in ['channel', 'group', 'direct'] and Session.get('openedRoom') is rid - FlowRouter.go 'home' - - RoomManager.close rid - else - swal.close() diff --git a/packages/rocketchat-ui-sidenav/client/chatRoomItem.js b/packages/rocketchat-ui-sidenav/client/chatRoomItem.js new file mode 100644 index 000000000000..4d6e64bf8ded --- /dev/null +++ b/packages/rocketchat-ui-sidenav/client/chatRoomItem.js @@ -0,0 +1,158 @@ +/* globals KonchatNotification, menu */ + +Template.chatRoomItem.helpers({ + + alert() { + if ((FlowRouter.getParam('_id') !== this.rid) || !document.hasFocus()) { + return this.alert; + } + }, + + unread() { + if (((FlowRouter.getParam('_id') !== this.rid) || !document.hasFocus()) && (this.unread > 0)) { + return this.unread; + } + }, + + userStatus() { + const userStatus = RocketChat.roomTypes.getUserStatus(this.t, this.rid); + return `status-${userStatus || 'offline'}`; + }, + + name() { + return this.name; + }, + + roomIcon() { + return RocketChat.roomTypes.getIcon(this.t); + }, + + active() { + if (Session.get('openedRoom') === this.rid) { + return 'active'; + } + }, + + canLeave() { + const roomData = Session.get('roomData' + this.rid); + + if (!roomData) { return false; } + + if (((roomData.cl != null) && !roomData.cl) || (roomData.t === 'd')) { + return false; + } else { + return true; + } + }, + + route() { + return RocketChat.roomTypes.getRouteLink(this.t, this); + }, + + archived() { + return this.archived ? 'archived' : undefined; + } +}); + +Template.chatRoomItem.rendered = function() { + if (!(FlowRouter.getParam('_id') && (FlowRouter.getParam('_id') === this.data.rid)) && !this.data.ls && (this.data.alert === true)) { + return KonchatNotification.newRoom(this.data.rid); + } +}; + +Template.chatRoomItem.events({ + + 'click .open-room'() { + return menu.close(); + }, + + 'click .hide-room'(e) { + e.stopPropagation(); + e.preventDefault(); + + const { rid } = this; + const { name } = this; + + const warnText = (() => { + switch (this.t) { + case 'c': return 'Hide_Room_Warning'; + case 'p': return 'Hide_Group_Warning'; + case 'd': return 'Hide_Private_Warning'; + } + })(); + + return swal({ + title: t('Are_you_sure'), + text: warnText ? t(warnText, name) : '', + type: 'warning', + showCancelButton: true, + confirmButtonColor: '#DD6B55', + confirmButtonText: t('Yes_hide_it'), + cancelButtonText: t('Cancel'), + closeOnConfirm: true, + html: false + }, function() { + if (['channel', 'group', 'direct'].includes(FlowRouter.getRouteName()) && (Session.get('openedRoom') === rid)) { + FlowRouter.go('home'); + } + + return Meteor.call('hideRoom', rid, function(err) { + if (err) { + return handleError(err); + } else if (rid === Session.get('openedRoom')) { + return Session.delete('openedRoom'); + } + }); + }); + }, + + 'click .leave-room'(e) { + e.stopPropagation(); + e.preventDefault(); + + const { rid } = this; + const { name } = this; + + const warnText = (() => { + switch (false) { + case this.t !== 'c': return 'Leave_Room_Warning'; + case this.t !== 'p': return 'Leave_Group_Warning'; + case this.t !== 'd': return 'Leave_Private_Warning'; + } + })(); + return swal({ + title: t('Are_you_sure'), + text: t(warnText, name), + type: 'warning', + showCancelButton: true, + confirmButtonColor: '#DD6B55', + confirmButtonText: t('Yes_leave_it'), + cancelButtonText: t('Cancel'), + closeOnConfirm: false, + html: false + }, function(isConfirm) { + if (isConfirm) { + return Meteor.call('leaveRoom', rid, function(err) { + if (err) { + return swal({ + title: t('Warning'), + text: handleError(err, false), + type: 'warning', + html: false + }); + + } else { + swal.close(); + if (['channel', 'group', 'direct'].includes(FlowRouter.getRouteName()) && (Session.get('openedRoom') === rid)) { + FlowRouter.go('home'); + } + + return RoomManager.close(rid); + } + }); + } else { + return swal.close(); + } + }); + } +}); diff --git a/packages/rocketchat-ui-sidenav/client/listChannelsFlex.coffee b/packages/rocketchat-ui-sidenav/client/listChannelsFlex.coffee deleted file mode 100644 index 82ef54e9c7bb..000000000000 --- a/packages/rocketchat-ui-sidenav/client/listChannelsFlex.coffee +++ /dev/null @@ -1,95 +0,0 @@ -Template.listChannelsFlex.helpers - channel: -> - return Template.instance().channelsList?.get() - hasMore: -> - return Template.instance().hasMore.get() - sortChannelsSelected: (sort) -> - return Template.instance().sortChannels.get() is sort - sortSubscriptionsSelected: (sort) -> - return Template.instance().sortSubscriptions.get() is sort - showSelected: (show) -> - return Template.instance().show.get() is show - member: -> - return !!RocketChat.models.Subscriptions.findOne({ name: @name, open: true }) - hidden: -> - return !!RocketChat.models.Subscriptions.findOne({ name: @name, open: false }) - -Template.listChannelsFlex.events - 'click header': -> - SideNav.closeFlex() - - 'click .channel-link': -> - SideNav.closeFlex() - - 'click footer .create': -> - if RocketChat.authz.hasAtLeastOnePermission( 'create-c') - SideNav.setFlex "createChannelFlex" - - 'mouseenter header': -> - SideNav.overArrow() - - 'mouseleave header': -> - SideNav.leaveArrow() - - 'scroll .content': _.throttle (e, t) -> - if t.hasMore.get() and e.target.scrollTop >= e.target.scrollHeight - e.target.clientHeight - t.limit.set(t.limit.get() + 50) - , 200 - - 'submit .search-form': (e) -> - e.preventDefault() - - 'keyup #channel-search': _.debounce (e, instance) -> - instance.nameFilter.set($(e.currentTarget).val()) - , 300 - - 'change #sort-channels': (e, instance) -> - instance.sortChannels.set($(e.currentTarget).val()) - - 'change #sort-subscriptions': (e, instance) -> - instance.sortSubscriptions.set($(e.currentTarget).val()) - - 'change #show': (e, instance) -> - show = $(e.currentTarget).val() - if show is 'joined' - instance.$('#sort-channels').hide(); - instance.$('#sort-subscriptions').show(); - else - instance.$('#sort-channels').show(); - instance.$('#sort-subscriptions').hide(); - instance.show.set(show) - -Template.listChannelsFlex.onCreated -> - @channelsList = new ReactiveVar [] - @hasMore = new ReactiveVar true - @limit = new ReactiveVar 50 - @nameFilter = new ReactiveVar '' - @sortChannels = new ReactiveVar 'name' - @sortSubscriptions = new ReactiveVar 'name' - @show = new ReactiveVar 'all' - - @autorun => - if @show.get() is 'joined' - @hasMore.set true - options = { fields: { name: 1 } } - if _.isNumber @limit.get() - options.limit = @limit.get() - if _.trim(@sortSubscriptions.get()) - switch @sortSubscriptions.get() - when 'name' - options.sort = { name: 1 } - when 'ls' - options.sort = { ls: -1 } - @channelsList.set RocketChat.models.Subscriptions.find({ - name: new RegExp s.trim(s.escapeRegExp(@nameFilter.get())), "i" - t: 'c' - }, options).fetch() - if @channelsList.get().length < @limit.get() - @hasMore.set false - else - Meteor.call 'channelsList', @nameFilter.get(), 'public', @limit.get(), @sortChannels.get(), (err, result) => - if result - @hasMore.set true - @channelsList.set result.channels - if result.channels.length < @limit.get() - @hasMore.set false diff --git a/packages/rocketchat-ui-sidenav/client/listChannelsFlex.js b/packages/rocketchat-ui-sidenav/client/listChannelsFlex.js new file mode 100644 index 000000000000..c3e32239ae43 --- /dev/null +++ b/packages/rocketchat-ui-sidenav/client/listChannelsFlex.js @@ -0,0 +1,131 @@ +Template.listChannelsFlex.helpers({ + channel() { + return Template.instance().channelsList.get(); + }, + hasMore() { + return Template.instance().hasMore.get(); + }, + sortChannelsSelected(sort) { + return Template.instance().sortChannels.get() === sort; + }, + sortSubscriptionsSelected(sort) { + return Template.instance().sortSubscriptions.get() === sort; + }, + showSelected(show) { + return Template.instance().show.get() === show; + }, + member() { + return !!RocketChat.models.Subscriptions.findOne({ name: this.name, open: true }); + }, + hidden() { + return !!RocketChat.models.Subscriptions.findOne({ name: this.name, open: false }); + } +}); + +Template.listChannelsFlex.events({ + 'click header'() { + return SideNav.closeFlex(); + }, + + 'click .channel-link'() { + return SideNav.closeFlex(); + }, + + 'click footer .create'() { + if (RocketChat.authz.hasAtLeastOnePermission('create-c')) { + return SideNav.setFlex('createChannelFlex'); + } + }, + + '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); + } + } + , 200), + + 'submit .search-form'(e) { + return e.preventDefault(); + }, + + 'keyup #channel-search': _.debounce((e, instance) => instance.nameFilter.set($(e.currentTarget).val()) + , 300), + + 'change #sort-channels'(e, instance) { + return instance.sortChannels.set($(e.currentTarget).val()); + }, + + 'change #sort-subscriptions'(e, instance) { + return instance.sortSubscriptions.set($(e.currentTarget).val()); + }, + + 'change #show'(e, instance) { + const show = $(e.currentTarget).val(); + if (show === 'joined') { + instance.$('#sort-channels').hide(); + instance.$('#sort-subscriptions').show(); + } else { + instance.$('#sort-channels').show(); + instance.$('#sort-subscriptions').hide(); + } + return instance.show.set(show); + } +}); + +Template.listChannelsFlex.onCreated(function() { + this.channelsList = new ReactiveVar([]); + this.hasMore = new ReactiveVar(true); + this.limit = new ReactiveVar(50); + this.nameFilter = new ReactiveVar(''); + this.sortChannels = new ReactiveVar('name'); + this.sortSubscriptions = new ReactiveVar('name'); + this.show = new ReactiveVar('all'); + + return this.autorun(() => { + if (this.show.get() === 'joined') { + this.hasMore.set(true); + const options = { fields: { name: 1 } }; + if (_.isNumber(this.limit.get())) { + options.limit = this.limit.get(); + } + if (_.trim(this.sortSubscriptions.get())) { + switch (this.sortSubscriptions.get()) { + case 'name': + options.sort = { name: 1 }; + break; + case 'ls': + options.sort = { ls: -1 }; + break; + } + } + this.channelsList.set(RocketChat.models.Subscriptions.find({ + name: new RegExp(s.trim(s.escapeRegExp(this.nameFilter.get())), 'i'), + t: 'c' + }, options).fetch() + ); + if (this.channelsList.get().length < this.limit.get()) { + return this.hasMore.set(false); + } + } else { + return Meteor.call('channelsList', this.nameFilter.get(), 'public', this.limit.get(), this.sortChannels.get(), (err, result) => { + if (result) { + this.hasMore.set(true); + this.channelsList.set(result.channels); + if (result.channels.length < this.limit.get()) { + return this.hasMore.set(false); + } + } + } + ); + } + } + ); +}); diff --git a/packages/rocketchat-ui-sidenav/client/listCombinedFlex.coffee b/packages/rocketchat-ui-sidenav/client/listCombinedFlex.coffee deleted file mode 100644 index 9db78fe07414..000000000000 --- a/packages/rocketchat-ui-sidenav/client/listCombinedFlex.coffee +++ /dev/null @@ -1,109 +0,0 @@ -Template.listCombinedFlex.helpers - channel: -> - return Template.instance().channelsList?.get() - hasMore: -> - return Template.instance().hasMore.get() - sortChannelsSelected: (sort) -> - return Template.instance().sortChannels.get() is sort - sortSubscriptionsSelected: (sort) -> - return Template.instance().sortSubscriptions.get() is sort - showSelected: (show) -> - return Template.instance().show.get() is show - channelTypeSelected: (type) -> - return Template.instance().channelType.get() is type - member: -> - return !!RocketChat.models.Subscriptions.findOne({ name: @name, open: true }) - hidden: -> - return !!RocketChat.models.Subscriptions.findOne({ name: @name, open: false }) - roomIcon: -> - return RocketChat.roomTypes.getIcon @t - url: -> - return if @t is 'p' then 'group' else 'channel' - -Template.listCombinedFlex.events - 'click header': -> - SideNav.closeFlex() - - 'click .channel-link': -> - SideNav.closeFlex() - - 'mouseenter header': -> - SideNav.overArrow() - - 'mouseleave header': -> - SideNav.leaveArrow() - - 'scroll .content': _.throttle (e, t) -> - if t.hasMore.get() and e.target.scrollTop >= e.target.scrollHeight - e.target.clientHeight - t.limit.set(t.limit.get() + 50) - , 200 - - 'submit .search-form': (e) -> - e.preventDefault() - - 'keyup #channel-search': _.debounce (e, instance) -> - instance.nameFilter.set($(e.currentTarget).val()) - , 300 - - 'change #sort-channels': (e, instance) -> - instance.sortChannels.set($(e.currentTarget).val()) - - 'change #channel-type': (e, instance) -> - instance.channelType.set($(e.currentTarget).val()) - - 'change #sort-subscriptions': (e, instance) -> - instance.sortSubscriptions.set($(e.currentTarget).val()) - - 'change #show': (e, instance) -> - show = $(e.currentTarget).val() - if show is 'joined' - instance.$('#sort-channels').hide(); - instance.$('#sort-subscriptions').show(); - else - instance.$('#sort-channels').show(); - instance.$('#sort-subscriptions').hide(); - instance.show.set(show) - -Template.listCombinedFlex.onCreated -> - @channelsList = new ReactiveVar [] - @hasMore = new ReactiveVar true - @limit = new ReactiveVar 50 - @nameFilter = new ReactiveVar '' - @sortChannels = new ReactiveVar 'name' - @sortSubscriptions = new ReactiveVar 'name' - @channelType = new ReactiveVar 'all' - @show = new ReactiveVar 'all' - @type = if @t is 'p' then 'group' else 'channel' - - @autorun => - if @show.get() is 'joined' - @hasMore.set true - options = { fields: { name: 1, t: 1 } } - if _.isNumber @limit.get() - options.limit = @limit.get() - if _.trim(@sortSubscriptions.get()) - switch @sortSubscriptions.get() - when 'name' - options.sort = { name: 1 } - when 'ls' - options.sort = { ls: -1 } - type = {$in: ['c', 'p']} - if _.trim(@channelType.get()) - switch @channelType.get() - when 'public' - type = 'c' - when 'private' - type = 'p' - @channelsList.set RocketChat.models.Subscriptions.find({ - name: new RegExp s.trim(s.escapeRegExp(@nameFilter.get())), "i" - t: type - }, options).fetch() - if @channelsList.get().length < @limit.get() - @hasMore.set false - else - Meteor.call 'channelsList', @nameFilter.get(), @channelType.get(), @limit.get(), @sortChannels.get(), (err, result) => - if result - @hasMore.set true - @channelsList.set result.channels - if result.channels.length < @limit.get() - @hasMore.set false diff --git a/packages/rocketchat-ui-sidenav/client/listCombinedFlex.js b/packages/rocketchat-ui-sidenav/client/listCombinedFlex.js new file mode 100644 index 000000000000..1231cca57b51 --- /dev/null +++ b/packages/rocketchat-ui-sidenav/client/listCombinedFlex.js @@ -0,0 +1,151 @@ +Template.listCombinedFlex.helpers({ + channel() { + return Template.instance().channelsList.get(); + }, + hasMore() { + return Template.instance().hasMore.get(); + }, + sortChannelsSelected(sort) { + return Template.instance().sortChannels.get() === sort; + }, + sortSubscriptionsSelected(sort) { + return Template.instance().sortSubscriptions.get() === sort; + }, + showSelected(show) { + return Template.instance().show.get() === show; + }, + channelTypeSelected(type) { + return Template.instance().channelType.get() === type; + }, + member() { + return !!RocketChat.models.Subscriptions.findOne({ name: this.name, open: true }); + }, + hidden() { + return !!RocketChat.models.Subscriptions.findOne({ name: this.name, open: false }); + }, + roomIcon() { + return RocketChat.roomTypes.getIcon(this.t); + }, + url() { + return this.t === 'p' ? 'group' : 'channel'; + } +}); + +Template.listCombinedFlex.events({ + 'click header'() { + return SideNav.closeFlex(); + }, + + 'click .channel-link'() { + 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); + } + } + , 200), + + 'submit .search-form'(e) { + return e.preventDefault(); + }, + + 'keyup #channel-search': _.debounce((e, instance) => instance.nameFilter.set($(e.currentTarget).val()) + , 300), + + 'change #sort-channels'(e, instance) { + return instance.sortChannels.set($(e.currentTarget).val()); + }, + + 'change #channel-type'(e, instance) { + return instance.channelType.set($(e.currentTarget).val()); + }, + + 'change #sort-subscriptions'(e, instance) { + return instance.sortSubscriptions.set($(e.currentTarget).val()); + }, + + 'change #show'(e, instance) { + const show = $(e.currentTarget).val(); + if (show === 'joined') { + instance.$('#sort-channels').hide(); + instance.$('#sort-subscriptions').show(); + } else { + instance.$('#sort-channels').show(); + instance.$('#sort-subscriptions').hide(); + } + return instance.show.set(show); + } +}); + +Template.listCombinedFlex.onCreated(function() { + this.channelsList = new ReactiveVar([]); + this.hasMore = new ReactiveVar(true); + this.limit = new ReactiveVar(50); + this.nameFilter = new ReactiveVar(''); + this.sortChannels = new ReactiveVar('name'); + this.sortSubscriptions = new ReactiveVar('name'); + this.channelType = new ReactiveVar('all'); + this.show = new ReactiveVar('all'); + this.type = this.t === 'p' ? 'group' : 'channel'; + + return this.autorun(() => { + if (this.show.get() === 'joined') { + this.hasMore.set(true); + const options = { fields: { name: 1, t: 1 } }; + if (_.isNumber(this.limit.get())) { + options.limit = this.limit.get(); + } + if (_.trim(this.sortSubscriptions.get())) { + switch (this.sortSubscriptions.get()) { + case 'name': + options.sort = { name: 1 }; + break; + case 'ls': + options.sort = { ls: -1 }; + break; + } + } + let type = {$in: ['c', 'p']}; + if (_.trim(this.channelType.get())) { + switch (this.channelType.get()) { + case 'public': + type = 'c'; + break; + case 'private': + type = 'p'; + break; + } + } + this.channelsList.set(RocketChat.models.Subscriptions.find({ + name: new RegExp(s.trim(s.escapeRegExp(this.nameFilter.get())), 'i'), + t: type + }, options).fetch() + ); + if (this.channelsList.get().length < this.limit.get()) { + return this.hasMore.set(false); + } + } else { + return Meteor.call('channelsList', this.nameFilter.get(), this.channelType.get(), this.limit.get(), this.sortChannels.get(), (err, result) => { + if (result) { + this.hasMore.set(true); + this.channelsList.set(result.channels); + if (result.channels.length < this.limit.get()) { + return this.hasMore.set(false); + } + } + } + ); + } + } + ); +}); diff --git a/packages/rocketchat-ui-sidenav/client/listPrivateGroupsFlex.coffee b/packages/rocketchat-ui-sidenav/client/listPrivateGroupsFlex.coffee deleted file mode 100644 index 7a79f26bec57..000000000000 --- a/packages/rocketchat-ui-sidenav/client/listPrivateGroupsFlex.coffee +++ /dev/null @@ -1,63 +0,0 @@ -Template.listPrivateGroupsFlex.helpers - groups: -> - return Template.instance().groups.get() - hasMore: -> - return Template.instance().hasMore.get() - sortSelected: (sort) -> - return Template.instance().sort.get() is sort - hidden: -> - return !!RocketChat.models.Subscriptions.findOne({ name: @name, open: false }) - -Template.listPrivateGroupsFlex.events - 'click header': -> - SideNav.closeFlex() - - 'click .channel-link': -> - SideNav.closeFlex() - - 'mouseenter header': -> - SideNav.overArrow() - - 'mouseleave header': -> - SideNav.leaveArrow() - - 'scroll .content': _.throttle (e, t) -> - if t.hasMore.get() and e.target.scrollTop >= e.target.scrollHeight - e.target.clientHeight - t.limit.set(t.limit.get() + 50) - , 200 - - 'keyup #channel-search': _.debounce (e, instance) -> - instance.nameFilter.set($(e.currentTarget).val()) - , 300 - - 'change #sort': (e, instance) -> - instance.sort.set($(e.currentTarget).val()) - -Template.listPrivateGroupsFlex.onCreated -> - @groups = new ReactiveVar [] - @hasMore = new ReactiveVar true - @limit = new ReactiveVar 50 - @nameFilter = new ReactiveVar '' - @sort = new ReactiveVar 'name' - - @autorun => - @hasMore.set true - options = { fields: { name: 1 } } - if _.isNumber @limit.get() - options.limit = @limit.get() - if _.trim(@sort.get()) - switch @sort.get() - when 'name' - options.sort = { name: 1 } - when 'ls' - options.sort = { ls: -1 } - - query = { t: { $in: ['p']}, f: { $ne: true }, archived: { $ne: true } } - - @groups.set RocketChat.models.Subscriptions.find({ - name: new RegExp s.trim(s.escapeRegExp(@nameFilter.get())), "i" - t: 'p' - archived: { $ne: true } - }, options).fetch() - if @groups.get().length < @limit.get() - @hasMore.set false diff --git a/packages/rocketchat-ui-sidenav/client/listPrivateGroupsFlex.js b/packages/rocketchat-ui-sidenav/client/listPrivateGroupsFlex.js new file mode 100644 index 000000000000..edcbd0d63207 --- /dev/null +++ b/packages/rocketchat-ui-sidenav/client/listPrivateGroupsFlex.js @@ -0,0 +1,83 @@ +Template.listPrivateGroupsFlex.helpers({ + groups() { + return Template.instance().groups.get(); + }, + hasMore() { + return Template.instance().hasMore.get(); + }, + sortSelected(sort) { + return Template.instance().sort.get() === sort; + }, + hidden() { + return !!RocketChat.models.Subscriptions.findOne({ name: this.name, open: false }); + } +}); + +Template.listPrivateGroupsFlex.events({ + 'click header'() { + return SideNav.closeFlex(); + }, + + 'click .channel-link'() { + 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); + } + } + , 200), + + 'keyup #channel-search': _.debounce((e, instance) => instance.nameFilter.set($(e.currentTarget).val()) + , 300), + + 'change #sort'(e, instance) { + return instance.sort.set($(e.currentTarget).val()); + } +}); + +Template.listPrivateGroupsFlex.onCreated(function() { + this.groups = new ReactiveVar([]); + this.hasMore = new ReactiveVar(true); + this.limit = new ReactiveVar(50); + this.nameFilter = new ReactiveVar(''); + this.sort = new ReactiveVar('name'); + + return this.autorun(() => { + this.hasMore.set(true); + const options = { fields: { name: 1 } }; + if (_.isNumber(this.limit.get())) { + options.limit = this.limit.get(); + } + if (_.trim(this.sort.get())) { + switch (this.sort.get()) { + case 'name': + options.sort = { name: 1 }; + break; + case 'ls': + options.sort = { ls: -1 }; + break; + } + } + + this.groups.set(RocketChat.models.Subscriptions.find({ + name: new RegExp(s.trim(s.escapeRegExp(this.nameFilter.get())), 'i'), + t: 'p', + archived: { $ne: true } + }, options).fetch() + ); + if (this.groups.get().length < this.limit.get()) { + return this.hasMore.set(false); + } + } + ); +}); diff --git a/packages/rocketchat-ui-sidenav/package.js b/packages/rocketchat-ui-sidenav/package.js index abb4afe516d7..6083411ef586 100644 --- a/packages/rocketchat-ui-sidenav/package.js +++ b/packages/rocketchat-ui-sidenav/package.js @@ -39,13 +39,13 @@ Package.onUse(function(api) { api.addFiles('client/accountBox.js', 'client'); api.addFiles('client/combined.js', 'client'); - api.addFiles('client/chatRoomItem.coffee', 'client'); + api.addFiles('client/chatRoomItem.js', 'client'); api.addFiles('client/channels.js', 'client'); api.addFiles('client/createCombinedFlex.coffee', 'client'); api.addFiles('client/directMessages.js', 'client'); - api.addFiles('client/listChannelsFlex.coffee', 'client'); - api.addFiles('client/listCombinedFlex.coffee', 'client'); - api.addFiles('client/listPrivateGroupsFlex.coffee', 'client'); + api.addFiles('client/listChannelsFlex.js', 'client'); + api.addFiles('client/listCombinedFlex.js', 'client'); + api.addFiles('client/listPrivateGroupsFlex.js', 'client'); api.addFiles('client/privateGroups.js', 'client'); api.addFiles('client/privateGroupsFlex.coffee', 'client'); api.addFiles('client/sideNav.coffee', 'client');