Merge branch 'develop' into add-auto-focus

pull/4300/head
Maki Nishifuji 9 years ago
commit 80970f144e
  1. 6
      .meteor/versions
  2. 8
      .snapcraft/edge/snapcraft.yaml
  3. 8
      .snapcraft/stable/snapcraft.yaml
  4. 47
      docker-compose.yml
  5. 5
      package.json
  6. 3
      packages/rocketchat-emoji-custom/client/lib/emojiCustom.js
  7. 11
      packages/rocketchat-file-upload/client/lib/FileUploadAmazonS3.js
  8. 9
      packages/rocketchat-file-upload/client/lib/FileUploadFileSystem.js
  9. 8
      packages/rocketchat-file-upload/client/lib/FileUploadGridFS.js
  10. 7
      packages/rocketchat-lib/client/lib/roomTypes.coffee
  11. 11
      packages/rocketchat-lib/server/lib/sendNotificationsOnMessage.js
  12. 15
      packages/rocketchat-lib/server/models/Subscriptions.coffee
  13. 160
      packages/rocketchat-theme/assets/stylesheets/base.less
  14. 25
      packages/rocketchat-theme/assets/stylesheets/utils/_colors.import.less
  15. 4
      packages/rocketchat-ui-flextab/flex-tab/tabs/userInfo.html
  16. 70
      packages/rocketchat-ui-master/server/inject.js
  17. 3
      packages/rocketchat-ui-message/message/message.html
  18. 14
      packages/rocketchat-ui-message/message/messageBox.coffee
  19. 6
      packages/rocketchat-ui-sidenav/side-nav/chatRoomItem.coffee
  20. 2
      packages/rocketchat-ui-sidenav/side-nav/chatRoomItem.html
  21. 2
      packages/rocketchat-ui/lib/fileUpload.coffee
  22. 4
      packages/rocketchat-ui/lib/textarea-autogrow.js
  23. 9
      packages/rocketchat-ui/views/app/room.coffee
  24. 2
      packages/rocketchat-ui/views/app/room.html
  25. 13
      server/methods/createDirectMessage.coffee
  26. 3
      server/methods/setUserActiveStatus.coffee
  27. 2
      server/publications/fullUserData.coffee
  28. 2
      server/publications/spotlight.coffee
  29. 1
      server/publications/userData.coffee
  30. 8
      server/startup/migrations/v061.js
  31. 87
      tests/test.js

@ -51,9 +51,9 @@ html-tools@1.0.11
htmljs@1.0.11
http@1.2.9
id-map@1.0.8
jalik:ufs@0.6.7
jalik:ufs-gridfs@0.1.1
jalik:ufs-local@0.2.5
jalik:ufs@0.6.8
jalik:ufs-gridfs@0.1.2
jalik:ufs-local@0.2.6
jparker:crypto-core@0.1.0
jparker:crypto-md5@0.1.1
jparker:gravatar@0.5.1

@ -41,12 +41,20 @@ parts:
plugin: dump
after: [mongodb]
source: https://cdn-download.rocket.chat/build/rocket.chat-develop.tgz
stage-packages:
- imagemagick
organize:
usr/bin/convert-im6: usr/bin/convert
stage:
- programs
- main.js
- usr
- lib
snap:
- programs
- main.js
- usr
- lib
mongodb:
source: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-3.2.7.tgz
plugin: dump

@ -33,12 +33,20 @@ parts:
plugin: dump
after: [mongodb]
source: https://rocket.chat/releases/latest/download
stage-packages:
- imagemagick
organize:
usr/bin/convert-im6: usr/bin/convert
stage:
- programs
- main.js
- usr
- lib
snap:
- programs
- main.js
- usr
- lib
mongodb:
source: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-3.2.7.tgz
plugin: dump

@ -1,18 +1,12 @@
mongo:
image: mongo
# volumes:
# - ./data/runtime/db:/data/db
# - ./data/dump:/dump
command: mongod --smallfiles --oplogSize 128
rocketchat:
image: rocketchat/rocket.chat:latest
# volumes:
# - ./uploads:/app/uploads
volumes:
- ./uploads:/app/uploads
environment:
- PORT=3000
- ROOT_URL=http://yourhost:3000
- ROOT_URL=http://localhost:3000
- MONGO_URL=mongodb://mongo:27017/rocketchat
- MONGO_OPLOG_URL=mongodb://mongo:27017/local
- MAIL_URL=smtp://smtp.email
- HTTP_PROXY=http://proxy.domain.com
- HTTPS_PROXY=http://proxy.domain.com
@ -20,10 +14,28 @@ rocketchat:
- mongo:mongo
ports:
- 3000:3000
labels:
- "traefik.backend=rocketchat"
- "traefik.frontend.rule=Host: your.domain.tld"
mongo:
image: mongo:3.0
volumes:
- ./data/db:/data/db
# - ./data/dump:/dump
command: mongod --smallfiles --oplogSize 128 --replSet rs0
labels:
- "traefik.enable=false"
mongo-init-replica:
image: mongo:3.0
command: 'mongo mongo/rocketchat --eval "rs.initiate({ _id: ''rs0'', members: [ { _id: 0, host: ''localhost:27017'' } ]})"'
links:
- mongo:mongo
# hubot, the popular chatbot (add the bot user first and change the password before starting this image)
hubot:
image: rocketchat/hubot-rocketchat:v0.1.4
image: rocketchat/hubot-rocketchat:latest
environment:
- ROCKETCHAT_URL=rocketchat:3000
- ROCKETCHAT_ROOM=GENERAL
@ -34,6 +46,19 @@ hubot:
- EXTERNAL_SCRIPTS=hubot-help,hubot-seen,hubot-links,hubot-diagnostics
links:
- rocketchat:rocketchat
labels:
- "traefik.enable=false"
volumes:
- ./scripts:/home/hubot/scripts
# this is used to expose the hubot port for notifications on the host on port 3001, e.g. for hubot-jenkins-notifier
ports:
- 3001:8080
#traefik:
# image: traefik:latest
# command: traefik --docker --acme=true --acme.domains='your.domain.tld' --acme.email='your@email.tld' --acme.entrypoint=https --acme.storagefile=acme.json --defaultentrypoints=http --defaultentrypoints=https --entryPoints='Name:http Address::80 Redirect.EntryPoint:https' --entryPoints='Name:https Address::443 TLS.Certificates:'
# ports:
# - 80:80
# - 443:443
# volumes:
# - /var/run/docker.sock:/var/run/docker.sock

@ -44,7 +44,9 @@
"scripts": {
"start": "meteor run",
"lint": "eslint .",
"deploy": "npm run build && pm2 startOrRestart pm2.json"
"deploy": "npm run build && pm2 startOrRestart pm2.json",
"chimp-watch": "chimp --ddp=http://localhost:3000 --watch --mocha --path=tests",
"chimp-test": "chimp --mocha --path=tests --mochaSlow=0"
},
"license": "MIT",
"repository": {
@ -56,6 +58,7 @@
"email": "support@rocket.chat"
},
"devDependencies": {
"chimp": "^0.40.7",
"eslint": "^3.1.1"
},
"dependencies": {

@ -144,10 +144,11 @@ Meteor.startup(() =>
Meteor.call('listEmojiCustom', (error, result) => {
RocketChat.emoji.packages.emojiCustom.emojisByCategory = { rocket: [] };
for (let emoji of result) {
RocketChat.emoji.packages.emojiCustom.emojisByCategory.rocket.push(`${emoji.name}`);
RocketChat.emoji.packages.emojiCustom.emojisByCategory.rocket.push(emoji.name);
RocketChat.emoji.list[`:${emoji.name}:`] = emoji;
RocketChat.emoji.list[`:${emoji.name}:`].emojiPackage = 'emojiCustom';
for (let alias of emoji['aliases']) {
RocketChat.emoji.packages.emojiCustom.emojisByCategory.rocket.push(alias);
RocketChat.emoji.list[`:${alias}:`] = {};
RocketChat.emoji.list[`:${alias}:`].emojiPackage = 'emojiCustom';
RocketChat.emoji.list[`:${alias}:`].aliasOf = emoji.name;

@ -5,10 +5,13 @@ FileUpload.AmazonS3 = class FileUploadAmazonS3 extends FileUploadBase {
super(meta, file);
this.uploader = new Slingshot.Upload('rocketchat-uploads', { rid: meta.rid });
}
start() {
this.uploader.send(this.file, (error, downloadUrl) => {
var file, item, uploading;
this.computation.stop();
if (error) {
uploading = Session.get('uploading');
if (uploading !== null) {
@ -39,12 +42,14 @@ FileUpload.AmazonS3 = class FileUploadAmazonS3 extends FileUploadBase {
});
}
});
}
getProgress() {
return this.uploader.progress();
this.computation = Tracker.autorun(() => {
this.onProgress(this.uploader.progress());
});
}
onProgress() {}
stop() {
if (this.uploader && this.uploader.xhr) {
this.uploader.xhr.abort();

@ -46,14 +46,17 @@ FileUpload.FileSystem = class FileUploadFileSystem extends FileUploadBase {
});
}
});
this.handler.onProgress = (file, progress) => {
this.onProgress(progress);
};
}
start() {
return this.handler.start();
}
getProgress() {
return this.handler.getProgress();
}
onProgress() {}
stop() {
return this.handler.stop();

@ -37,15 +37,17 @@ FileUpload.GridFS = class FileUploadGridFS extends FileUploadBase {
});
}
});
this.handler.onProgress = (file, progress) => {
this.onProgress(progress);
};
}
start() {
return this.handler.start();
}
getProgress() {
return this.handler.getProgress();
}
onProgress() {}
stop() {
return this.handler.stop();

@ -42,6 +42,13 @@ RocketChat.roomTypes = new class roomTypesClient extends roomTypesCommon
return room?.ro is true and Array.isArray(room?.muted) and room?.muted.indexOf(user.username) != -1
archived: (roomId) ->
fields = { archived: 1 }
room = ChatRoom.findOne({ _id: roomId }, fields : fields)
return room?.archived is true
verifyCanSendMessage: (roomId) ->
room = ChatRoom.findOne({ _id: roomId }, { fields: { t: 1 } })
return if not room?.t?

@ -192,14 +192,17 @@ RocketChat.callbacks.add('afterSaveMessage', function(message, room) {
}, {
fields: {
_id: 1,
username: 1
username: 1,
active: 1
}
}).fetch();
if (room.t === 'c' && !toAll) {
const callJoin = function(usersOfMentionItem) {
Meteor.runAsUser(usersOfMentionItem._id, function() {
return Meteor.call('joinRoom', room._id);
});
if (usersOfMentionItem.active) {
Meteor.runAsUser(usersOfMentionItem._id, function() {
return Meteor.call('joinRoom', room._id);
});
}
};
for (i = 0, len = usersOfDesktopMentions.length; i < len; i++) {
usersOfMentionItem = usersOfDesktopMentions[i];

@ -97,7 +97,7 @@ RocketChat.models.Subscriptions = new class extends RocketChat.models._Base
open: false
archived: true
return @update query, update
return @update query, update, { multi: true }
unarchiveByRoomId: (roomId) ->
query =
@ -109,7 +109,7 @@ RocketChat.models.Subscriptions = new class extends RocketChat.models._Base
open: true
archived: false
return @update query, update
return @update query, update, { multi: true }
hideByRoomIdAndUserId: (roomId, userId) ->
query =
@ -307,6 +307,17 @@ RocketChat.models.Subscriptions = new class extends RocketChat.models._Base
return @update query, update
setArchivedByUsername: (username, archived) ->
query =
t: 'd'
name: username
update =
$set:
archived: archived
return @update query, update, { multi: true }
# INSERT
createWithRoomAndUser: (room, user, extraData) ->
subscription =

@ -583,60 +583,6 @@ label.required:after {
content: ' *';
}
.loading {
top: 0;
right: 0;
bottom: 0;
left: 0;
display: flex;
align-items: center;
position: absolute;
justify-content: center;
text-align: center;
> div {
width: 10px;
height: 10px;
background-color: #ccc;
margin: 2px;
border-radius: 100%;
display: inline-block;
-webkit-animation: loading-bouncedelay 1.4s infinite ease-in-out both;
animation: loading-bouncedelay 1.4s infinite ease-in-out both;
}
.bounce1 {
-webkit-animation-delay: -0.32s;
animation-delay: -0.32s;
}
.bounce2 {
-webkit-animation-delay: -0.16s;
animation-delay: -0.16s;
}
}
@-webkit-keyframes loading-bouncedelay {
0%,
80%,
100% {
-webkit-transform: scale(0)
}
40% {
-webkit-transform: scale(1.0)
}
}
@keyframes loading-bouncedelay {
0%,
80%,
100% {
-webkit-transform: scale(0);
transform: scale(0);
}
40% {
-webkit-transform: scale(1.0);
transform: scale(1.0);
}
}
.btn-loading {
pointer-events: none;
cursor: not-allowed;
@ -855,7 +801,6 @@ label.required:after {
background-size: cover;
background-repeat: no-repeat;
background-position: center;
border-radius: 4px;
}
&[initials]:before {
content: attr(initials);
@ -1383,6 +1328,10 @@ label.required:after {
&:hover {
text-decoration: none;
}
.archived {
font-style: italic;
}
}
.opt {
position: absolute;
@ -2001,17 +1950,26 @@ label.required:after {
.container-bars {
position: absolute;
top: 61px;
z-index: 11;
top: 55px;
z-index: 100;
font-weight: bold;
display: flex;
flex-direction: column;
border-radius: 0 0 10px 10px;
border-radius: 4px;
overflow: hidden;
font-size: 1em;
left: 5px;
right: 5px;
box-shadow: 0px 1px 1px 0 rgba(0,0,0,0.2), 0 2px 10px 0 rgba(0,0,0,.16);
left: 10px;
right: 10px;
box-shadow: 0px 1px 1px 0 rgba(0, 0, 0, 0.2), 0 2px 10px 0 rgba(0, 0, 0, .16);
.transition(transform 0.4s ease, visibility 0.3s ease, opacity 0.3s ease);
.transform(translateY(-10px));
opacity: 0;
visibility: hidden;
&.show {
opacity: 1;
visibility: visible;
.transform(translateY(0px));
}
> div {
line-height: 28px;
padding: 0 10px;
@ -2161,12 +2119,14 @@ label.required:after {
padding-bottom: 9px;
padding-left: 49px;
border-radius: 0;
overflow-y: hidden;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
resize: none;
line-height: 16px;
border-top-width: 0;
border-bottom-width: 0;
border-left-width: 0;
max-height: 200px;
}
.stream-info {
float: left;
@ -2449,30 +2409,38 @@ label.required:after {
&:hover {
background-color: @message-hover-background-color;
}
&.new-day {
margin-top: 60px;
&:before {
content: attr(data-date);
display: block;
position: absolute;
top: -30px;
left: 0;
.day-divider {
height: 50px;
display: none;
text-align: center;
left: 0;
position: absolute;
top: 0px;
right: 0;
align-items: center;
justify-content: center;
span {
padding: 0 8px;
z-index: 1;
border-radius: 4px;
font-size: 12px;
font-weight: 600;
text-align: center;
.calc(left, ~"50% - 70px");
z-index: 10;
padding: 0 10px;
min-width: 140px;
}
&:after {
&:before {
position: absolute;
content: " ";
display: block;
position: absolute;
top: -20px;
border-bottom-width: 1px;
border-bottom-style: solid;
top: 25px;
left: 0;
border-top: 1px solid;
width: 100%;
right: 0;
}
}
&.new-day {
padding-top: 60px;
.day-divider {
display: flex;
}
}
.message-action {
@ -2749,6 +2717,15 @@ body:not(.is-cordova) {
.cozy {
.message {
padding: 4px 20px 4px 70px;
&.new-day {
padding-top: 45px;
.day-divider {
height: 40px;
&:before {
top: 20px;
}
}
}
.body {
margin-top: 0;
}
@ -2759,6 +2736,15 @@ body:not(.is-cordova) {
.message {
min-height: 26px;
padding: 5px 15px 0 37px;
&.new-day {
padding-top: 31px;
.day-divider {
height: 26px;
&:before {
top: 13px;
}
}
}
.body {
display: inline;
.inline-image img {
@ -4100,7 +4086,7 @@ body:not(.is-cordova) {
display: flex;
align-items: center;
justify-content: center;
margin: 0 51px 0 12px;
margin: 0 40px 0 0;
> div {
padding: 40px;
border-radius: 10px;
@ -4113,7 +4099,7 @@ body:not(.is-cordova) {
@media (min-width: 780px) {
.dropzone.over .dropzone-overlay {
margin: 0 51px 0 270px;
margin: 0 40px 0 260px;
}
}
@ -4159,6 +4145,16 @@ body:not(.is-cordova) {
.social-login {
margin-bottom: 10px;
}
.message-form textarea {
max-height: 100px !important;
}
}
@media all and(max-height: 260px) {
.message-form textarea {
max-height: 50px !important;
}
}
.webrtc-video {

@ -1,4 +1,5 @@
.custom-scroll(@background, @thumb, @width: 8px, @height: 8px) {
-ms-overflow-style: -ms-autohiding-scrollbar;
&::-webkit-scrollbar {
height: @height;
width: @width;
@ -129,7 +130,6 @@ html {
body {
color: @primary-font-color;
background-color: @primary-background-color;
}
textarea,
@ -715,6 +715,7 @@ a.github-fork {
}
}
textarea {
.custom-scroll(transparent, #EAEAEA);
&.editing {
background-color: #fff7d8;
}
@ -804,12 +805,15 @@ a.github-fork {
.message {
&.new-day {
&:before {
.day-divider {
color: @secondary-font-color;
background-color: @content-background-color;
}
&:after {
border-top-color: #ddd;
span {
background-color: @content-background-color;
}
&:before {
border-bottom-color: @tertiary-background-color;
}
}
}
.user {
@ -903,11 +907,14 @@ a.github-fork {
}
.message {
&.new-day {
&:before {
.day-divider {
background-color: @secondary-background-color;
}
&:after {
border-top-color: @tertiary-background-color;
span {
background-color: @secondary-background-color;
}
&:before {
border-bottom-color: @tertiary-background-color;
}
}
}
}

@ -41,7 +41,9 @@
</div>
{{/with}}
<nav>
{{> videoButtons}}
{{#if user.active}}
{{> videoButtons}}
{{/if}}
{{#if showAll}}
{{#if canDirectMessage user.username}}

@ -1,14 +1,68 @@
/* globals Inject */
Inject.rawBody('page-loading', `
<div id="initial-page-loading" class="page-loading">
<div class="loading">
<div class="bounce1"></div>
<div class="bounce2"></div>
<div class="bounce3"></div>
</div>
</div>`
);
<style>
.loading {
top: 0;
right: 0;
bottom: 0;
left: 0;
display: flex;
align-items: center;
position: absolute;
justify-content: center;
text-align: center;
}
.loading > div {
width: 10px;
height: 10px;
margin: 2px;
border-radius: 100%;
display: inline-block;
-webkit-animation: loading-bouncedelay 1.4s infinite ease-in-out both;
animation: loading-bouncedelay 1.4s infinite ease-in-out both;
}
.loading .bounce1 {
-webkit-animation-delay: -0.32s;
animation-delay: -0.32s;
}
.loading .bounce2 {
-webkit-animation-delay: -0.16s;
animation-delay: -0.16s;
}
@-webkit-keyframes loading-bouncedelay {
0%, 80%, 100% { -webkit-transform: scale(0) }
40% { -webkit-transform: scale(1.0) }
}
@keyframes loading-bouncedelay {
0%, 80%, 100% { transform: scale(0); }
40% { transform: scale(1.0); }
}
</style>
<div id="initial-page-loading" class="page-loading">
<div class="loading">
<div class="bounce1"></div>
<div class="bounce2"></div>
<div class="bounce3"></div>
</div>
</div>`);
RocketChat.settings.get('theme-color-primary-background-color', function(key, value) {
if (value) {
Inject.rawHead('theme-color-primary-background-color', `<style>body { background-color: ${value};}</style>`);
} else {
Inject.rawHead('theme-color-primary-background-color', '<style>body { background-color: #04436a;}</style>');
}
});
RocketChat.settings.get('theme-color-tertiary-font-color', function(key, value) {
if (value) {
Inject.rawHead('theme-color-tertiary-font-color', `<style>.loading > div { background-color: ${value};}</style>`);
} else {
Inject.rawHead('theme-color-tertiary-font-color', '<style>.loading > div { background-color: #cccccc;}</style>');
}
});
RocketChat.settings.get('Site_Url', function() {
Meteor.defer(function() {

@ -1,5 +1,8 @@
<template name="message">
<li id="{{_id}}" class="message {{isSequential}} {{system}} {{t}} {{own}} {{isTemp}} {{chatops}} {{customClass}}" data-username="{{u.username}}" data-groupable="{{isGroupable}}" data-date="{{date}}" data-timestamp="{{timestamp}}">
<div class="day-divider">
<span>{{date}}</span>
</div>
{{#if avatar}}
{{#if avatarFromUsername}}
<button class="thumb user-card-message" data-username="{{u.username}}" tabindex="1">{{> avatar username=avatarFromUsername}}</button>

@ -31,7 +31,19 @@ Template.messageBox.helpers
subscribed: ->
return RocketChat.roomTypes.verifyCanSendMessage @_id
allowedToSend: ->
return !RocketChat.roomTypes.readOnly @_id, Meteor.user()
if RocketChat.roomTypes.readOnly @_id, Meteor.user()
return false
if RocketChat.roomTypes.archived @_id
return false
roomData = Session.get('roomData' + this._id)
if roomData?.t is 'd'
if ChatSubscription.findOne({ rid: this._id }, { fields: { archived: 1 } })?.archived
return false
return true
getPopupConfig: ->
template = Template.instance()
return {

@ -34,6 +34,9 @@ Template.chatRoomItem.helpers
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)
@ -72,6 +75,9 @@ Template.chatRoomItem.events
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()

@ -5,7 +5,7 @@
<span class="unread">{{unread}}</span>
{{/if}}
<i class="{{roomIcon}} {{userStatus}}" aria-label=""></i>
<span class='name'>{{name}}</span>
<span class='name {{archived}}'>{{name}}</span>
{{#if $not unread}}
<span class='opt'>
<i class="icon-eye-off hide-room" title="{{_ "Hide_room"}}" aria-label="{{_ "Hide_room"}}"></i>

@ -89,7 +89,7 @@ readAsArrayBuffer = (file, callback) ->
upload = fileUploadHandler record, file.file
upload.handler.onProgress = (file, progress) ->
upload.onProgress = (progress) ->
uploading = Session.get('uploading') or []
item = _.findWhere(uploading, {id: upload.id})

@ -54,7 +54,7 @@
shadow.css('width', $self.width());
shadow.html(val + (noFlickerPad === 0 ? '...' : '')); // Append '...' to resize pre-emptively.
var newHeight = Math.max(shadow.height() + noFlickerPad, minHeight);
var newHeight = Math.max(shadow.height() + noFlickerPad + 1, minHeight);
if (settings.preGrowCallback !== null) {
newHeight = settings.preGrowCallback($self, shadow, newHeight, minHeight);
}
@ -64,7 +64,7 @@
if (settings.postGrowCallback !== null) {
settings.postGrowCallback($self);
}
}
};
$self.change(update).keyup(update).keydown({
event: 'keydown'

@ -86,6 +86,9 @@ Template.room.helpers
return data
containerBarsShow: (unreadData, uploading) ->
return 'show' if (unreadData?.count > 0 and unreadData.since?) or uploading?.length > 0
formatUnreadSince: ->
if not this.since? then return
@ -525,7 +528,7 @@ Template.room.onRendered ->
template = this
containerBars = $('.messages-container > .container-bars')
messageBox = $('.messages-box')
template.isAtBottom = ->
if wrapper.scrollTop >= wrapper.scrollHeight - wrapper.clientHeight
@ -597,9 +600,9 @@ Template.room.onRendered ->
, 50
updateUnreadCount = _.throttle ->
containerBarsOffset = containerBars.offset()
messageBoxOffset = messageBox.offset()
lastInvisibleMessageOnScreen = document.elementFromPoint(containerBarsOffset.left-1, containerBarsOffset.top+1)
lastInvisibleMessageOnScreen = document.elementFromPoint(messageBoxOffset.left+1, messageBoxOffset.top+1)
if lastInvisibleMessageOnScreen?.id?
lastMessage = ChatMessage.findOne lastInvisibleMessageOnScreen.id
if lastMessage?

@ -17,7 +17,7 @@
<span class="room-topic">{{{RocketChatMarkdown roomTopic}}}</span>
</h2>
</header>
<div class="container-bars">
<div class="container-bars {{containerBarsShow unreadData uploading}}">
{{#with unreadData}}
{{#if since}}
{{#if count}}

@ -38,10 +38,7 @@ Meteor.methods
ts: now
# Make user I have a subcription to this room
RocketChat.models.Subscriptions.upsert
rid: rid
$and: [{'u._id': me._id}] # work around to solve problems with upsert and dot
,
upsertSubscription =
$set:
ts: now
ls: now
@ -54,6 +51,14 @@ Meteor.methods
u:
_id: me._id
username: me.username
if to.active is false
upsertSubscription.$set.archived = true
RocketChat.models.Subscriptions.upsert
rid: rid
$and: [{'u._id': me._id}] # work around to solve problems with upsert and dot
,
upsertSubscription
# Make user the target user has a subcription to this room
RocketChat.models.Subscriptions.upsert

@ -10,7 +10,10 @@ Meteor.methods
unless RocketChat.authz.hasPermission( Meteor.userId(), 'edit-other-user-active-status') is true
throw new Meteor.Error 'error-not-allowed', 'Not allowed', { method: 'setUserActiveStatus' }
user = RocketChat.models.Users.findOneById userId
RocketChat.models.Users.setUserActive userId, active
RocketChat.models.Subscriptions.setArchivedByUsername user?.username, !active
if active is false
RocketChat.models.Users.unsetLoginTokens userId

@ -8,6 +8,7 @@ Meteor.publish 'fullUserData', (filter, limit) ->
status: 1
utcOffset: 1
type: 1
active: 1
if RocketChat.authz.hasPermission( @userId, 'view-full-other-user-info') is true
fields = _.extend fields,
@ -16,7 +17,6 @@ Meteor.publish 'fullUserData', (filter, limit) ->
statusConnection: 1
createdAt: 1
lastLogin: 1
active: 1
services: 1
requirePasswordChange: 1
requirePasswordChangeReason: 1

@ -10,7 +10,7 @@ Meteor.methods
regex = new RegExp s.trim(s.escapeRegExp(text)), "i"
if RocketChat.authz.hasPermission this.userId, 'view-d-room'
result.users = RocketChat.models.Users.findByUsername(regex, { limit: 5, fields: { username: 1, status: 1 }, sort: { username: 1 } }).fetch()
result.users = RocketChat.models.Users.findByActiveUsersUsernameExcept(text, [ username ], { limit: 5, fields: { username: 1, status: 1 }, sort: { username: 1 } }).fetch()
if RocketChat.authz.hasPermission this.userId, 'view-c-room'
result.rooms = RocketChat.models.Rooms.findByNameAndTypeNotContainingUsername(regex, 'c', username, { limit: 5, fields: { t: 1, name: 1 }, sort: { name: 1 } }).fetch()

@ -14,6 +14,7 @@ Meteor.publish 'userData', ->
language: 1
settings: 1
roles: 1
active: 1
defaultRoom: 1
'services.github': 1
'services.gitlab': 1

@ -0,0 +1,8 @@
RocketChat.Migrations.add({
version: 61,
up: function() {
RocketChat.models.Users.find({ active: false }).forEach(function(user) {
RocketChat.models.Subscriptions.setArchivedByUsername(user.username, true);
});
}
});

@ -0,0 +1,87 @@
/* eslint-env mocha */
/* eslint-disable func-names, prefer-arrow-callback */
// These are Chimp globals
/* globals browser */
const username = 'user-test-'+Date.now();
describe('Basic usage', function() {
before(function() {
browser.url('http://localhost:3000');
});
it('load page', function(done) {
browser.waitForExist('body');
done();
});
it('crate user', function(done) {
browser.waitForExist('.register');
browser.click('.register');
browser.waitForExist('[name=name]');
browser.setValue('[name=name]', username);
browser.setValue('[name=email]', username+'@rocket.chat');
browser.setValue('[name=pass]', 'rocket.chat');
browser.setValue('[name=confirm-pass]', 'rocket.chat');
browser.click('.submit > button');
browser.waitForExist('form#login-card input#username', 5000);
browser.click('.submit > button');
browser.waitForExist('.main-content', 5000);
done();
});
it('logout', function(done) {
browser.waitForVisible('.account-box');
browser.click('.account-box');
browser.pause(200);
browser.waitForVisible('#logout');
browser.click('#logout');
done();
});
it('login', function(done) {
browser.waitForExist('[name=emailOrUsername]');
browser.setValue('[name=emailOrUsername]', username+'@rocket.chat');
browser.setValue('[name=pass]', 'rocket.chat');
browser.click('.submit > button');
browser.waitForExist('.main-content', 5000);
done();
});
it('open GENERAL', function(done) {
browser.waitForExist('.wrapper > ul .link-room-GENERAL', 50000);
browser.click('.wrapper > ul .link-room-GENERAL');
browser.waitForExist('.input-message', 5000);
done();
});
it('send a message', function(done) {
const message = 'message from '+username;
browser.setValue('.input-message', message);
browser.waitForExist('.message-buttons.send-button');
browser.click('.message-buttons.send-button');
browser.waitUntil(function() {
return browser.getText('.message:last-child .body') === message;
}, 2000);
done();
});
});
Loading…
Cancel
Save