From b9f2b025940ffa9969bce07a67607c96cc96d4b5 Mon Sep 17 00:00:00 2001 From: James Allen Date: Tue, 15 Jul 2014 18:25:12 +0100 Subject: [PATCH 1/7] Sort out scroll in chat --- .../Features/Chat/ChatController.coffee | 2 +- services/web/app/views/project/editor.jade | 3 +- .../web/app/views/project/editor/chat.jade | 19 +++-- .../web/app/views/project/editor/header.jade | 18 ++-- .../public/coffee/directives/scroll.coffee | 84 ++++++++++++++----- .../chat/controllers/ChatController.coffee | 57 ++++--------- .../ide/chat/services/chatMessages.coffee | 82 ++++++++++++++++++ .../track-changes/TrackChangesManager.coffee | 2 +- .../directives/infiniteScroll.coffee | 24 +++--- .../public/stylesheets/app/editor/chat.less | 6 ++ 10 files changed, 198 insertions(+), 99 deletions(-) create mode 100644 services/web/public/coffee/ide/chat/services/chatMessages.coffee diff --git a/services/web/app/coffee/Features/Chat/ChatController.coffee b/services/web/app/coffee/Features/Chat/ChatController.coffee index f8a6e9065b..a38c26a9fc 100644 --- a/services/web/app/coffee/Features/Chat/ChatController.coffee +++ b/services/web/app/coffee/Features/Chat/ChatController.coffee @@ -18,7 +18,7 @@ module.exports = getMessages: (req, res)-> project_id = req.params.Project_id - query = req.body + query = req.query logger.log project_id:project_id, query:query, "getting messages" ChatHandler.getMessages project_id, query, (err, messages)-> if err? diff --git a/services/web/app/views/project/editor.jade b/services/web/app/views/project/editor.jade index 67d73c83f1..fa28574721 100644 --- a/services/web/app/views/project/editor.jade +++ b/services/web/app/views/project/editor.jade @@ -61,7 +61,7 @@ block content include ./editor/track-changes .ui-layout-east - //- include ./editor/chat + include ./editor/chat script(type="text/ng-template", id="genericMessageModalTemplate") .modal-header @@ -118,4 +118,5 @@ block content data-ace-base=jsPath+'ace', src=jsPath+'libs/require.js?fingerprint='+fingerprint(jsPath + 'libs/require.js') ) + diff --git a/services/web/app/views/project/editor/chat.jade b/services/web/app/views/project/editor/chat.jade index 244f15a8f5..2ae878059f 100644 --- a/services/web/app/views/project/editor/chat.jade +++ b/services/web/app/views/project/editor/chat.jade @@ -1,24 +1,25 @@ aside.chat( ng-controller="ChatController" - infinite-scroll="loadMore()" - infinite-scroll-disabled="chat.loading || chat.atEnd" - infinite-scroll-initialize="ui.chatOpen" ) .messages( - infinite-scroll="loadMore()" + infinite-scroll="loadMoreMessages()" infinite-scroll-disabled="chat.loading || chat.atEnd" infinite-scroll-initialize="ui.chatOpen" - scroll-glue + infinite-scroll-upwards="true" + update-scroll-bottom-on="messages:updated" ) .infinite-scroll-inner + .loading(ng-show="chat.loading") + i.fa.fa-fw.fa-spin.fa-refresh + | Loading... ul.list-unstyled li.message( - ng-repeat="message in chat.groupedMessages | orderBy:'timestamp':false" + ng-repeat="message in chat.messages" ng-controller="ChatMessageController" ng-class="{'self': message.user.id == user.id }" ) - div.date(ng-if="$index == 0 || (message.timestamp - chat.groupedMessages[$index - 1].timestamp) > 5 * 60 * 1000") - {{ message.timestamp | formatDate:'h:MMa' }} {{ message.timestamp | relativeDate }} + div.date(ng-if="$index == 0 || (message.timestamp - chat.messages[$index - 1].timestamp) > 5 * 60 * 1000") + {{ message.timestamp | formatDate:'h:mm a' }} {{ message.timestamp | relativeDate }} span.avatar img(ng-src="{{message.user.gravatar_url}}") div.message-wrapper @@ -30,7 +31,7 @@ aside.chat( }" ) .arrow(ng-style="{'border-color': 'hsl({{ hue(message.user) }}, 60%, 80%)'}") - p(ng-repeat="content in message.contents") {{ content }} + p(ng-repeat="content in message.contents track by $index") {{ content }} .new-message textarea(placeholder="Your message...", on-enter="sendMessage()", ng-model="newMessageContent") diff --git a/services/web/app/views/project/editor/header.jade b/services/web/app/views/project/editor/header.jade index a123d9d14f..cff127cfda 100644 --- a/services/web/app/views/project/editor/header.jade +++ b/services/web/app/views/project/editor/header.jade @@ -50,12 +50,12 @@ header.toolbar.toolbar-header(ng-cloak, ng-hide="state.loading") tooltip-placement="bottom" ) i.fa.fa-fw.fa-history - //- a.btn.btn-full-height( - //- href, - //- tooltip="Chat", - //- tooltip-placement="bottom", - //- ng-class="{ active: ui.chatOpen }", - //- ng-click="toggleChat()", - //- ng-controller="ChatButtonController" - //- ) - //- i.fa.fa-fw.fa-comment \ No newline at end of file + a.btn.btn-full-height( + href, + tooltip="Chat", + tooltip-placement="bottom", + ng-class="{ active: ui.chatOpen }", + ng-click="toggleChat()", + ng-controller="ChatButtonController" + ) + i.fa.fa-fw.fa-comment \ No newline at end of file diff --git a/services/web/public/coffee/directives/scroll.coffee b/services/web/public/coffee/directives/scroll.coffee index d3ba6ebe0c..39f2b1a334 100644 --- a/services/web/public/coffee/directives/scroll.coffee +++ b/services/web/public/coffee/directives/scroll.coffee @@ -1,34 +1,74 @@ define [ "base" ], (App) -> - fakeNgModel = (initValue) -> $setViewValue: (value) -> @$viewValue = value return - $viewValue: initValue + + App.directive "updateScrollBottomOn", -> + # return { + # priority: 1 + # require: ["?ngModel"] + # restrict: "A" + # link: (scope, $el, attrs, ctrls) -> + # scrollToBottom = -> + # el.scrollTop = el.scrollHeight + # return + # + # shouldActivateAutoScroll = -> + # # + 1 catches off by one errors in chrome + # el.scrollTop + el.clientHeight + 1 >= el.scrollHeight + # + # + # el = $el[0] + # ngModel = ctrls[0] or fakeNgModel(true) + # + # scope.$watch -> + # console.log "SCOPE CHANGED", ngModel.$viewValue + # if ngModel.$viewValue + # scrollToBottom() + # + # $el.bind "scroll", -> + # activate = shouldActivateAutoScroll() + # scope.$apply ngModel.$setViewValue.bind(ngModel, activate) if activate isnt ngModel.$viewValue + # + # return + # } - App.directive "scrollGlue", -> + return { - - priority: 1 - require: ["?ngModel"] restrict: "A" - - link: (scope, $el, attrs, ctrls) -> - scrollToBottom = -> - el.scrollTop = el.scrollHeight - - shouldActivateAutoScroll = -> - el.scrollTop + el.clientHeight + 10 >= el.scrollHeight - - el = $el[0] - ngModel = ctrls[0] or fakeNgModel(true) - scope.$watch -> - scrollToBottom() if ngModel.$viewValue - - $el.bind "scroll", -> - activate = shouldActivateAutoScroll() - scope.$apply ngModel.$setViewValue.bind(ngModel, activate) if activate isnt ngModel.$viewValue + link: (scope, element, attrs, ctrls) -> + # We keep the offset from the bottom fixed whenever the event fires + # + # ^ | ^ + # | | | scrollTop + # | | v + # | |----------- + # | | ^ + # | | | + # | | | clientHeight (viewable area) + # | | | + # | | | + # | | v + # | |----------- + # | | ^ + # | | | scrollBottom + # v | v + # \ + # scrollHeight + + scrollBottom = 0 + element.on "scroll", (e) -> + scrollBottom = element[0].scrollHeight - element[0].scrollTop - element[0].clientHeight + console.log "SCROLL BOTTOM CHANGED", scrollBottom + + scope.$on attrs.updateScrollBottomOn, () -> + setTimeout () -> + console.log "RESTORING SCROLL BOTTOM", scrollBottom + element.scrollTop(element[0].scrollHeight - element[0].clientHeight - scrollBottom) + , 0 } + diff --git a/services/web/public/coffee/ide/chat/controllers/ChatController.coffee b/services/web/public/coffee/ide/chat/controllers/ChatController.coffee index ff40b84c6d..751d1746fd 100644 --- a/services/web/public/coffee/ide/chat/controllers/ChatController.coffee +++ b/services/web/public/coffee/ide/chat/controllers/ChatController.coffee @@ -1,48 +1,21 @@ define [ "base" + "ide/chat/services/chatMessages" ], (App) -> - App.controller "ChatController", ["$scope", "$http", "ide", "$location", ($scope, $http, @ide, $location) -> - MESSAGES_URL = "/project/#{$scope.project_id}/messages" - CONNECTED_USER_URL = "/project/#{$scope.project_id}/connected_users" - - $scope.$on "project:joined", => - @ide.socket.on "new-chat-message", (message) => - $scope.chat.messages.push(message) - - $http.get(MESSAGES_URL).success (data, status, headers, config)-> - $scope.chat.messages = data - - $http.get(CONNECTED_USER_URL).success (data)-> - console.log data - + App.controller "ChatController", ($scope, chatMessages, @ide, $location) -> + $scope.chat = chatMessages.state + $scope.$watchCollection "chat.messages", (messages) -> if messages? - console.log "grouping messages" - $scope.chat.groupedMessages = groupMessages(messages) - + $scope.$emit "messages:updated" + $scope.sendMessage = -> - body = - content:$scope.newMessageContent - _csrf : window.csrfToken - $http.post(MESSAGES_URL, body).success (data, status, headers, config)-> - $scope.newMessageContent = "" - - TIMESTAMP_GROUP_SIZE = 5 * 60 * 1000 # 5 minutes - groupMessages = (messages) -> - previousMessage = null - groupedMessages = [] - for message in messages - shouldGroup = previousMessage? and - previousMessage.user == message.user and - message.timestamp - previousMessage.timestamp < TIMESTAMP_GROUP_SIZE - if shouldGroup - previousMessage.timestamp = message.timestamp - previousMessage.contents.push message.content - else - groupedMessages.push(previousMessage = { - user: message.user - timestamp: message.timestamp - contents: [message.content] - }) - return groupedMessages - ] \ No newline at end of file + chatMessages + .sendMessage $scope.newMessageContent + .then () -> + $scope.newMessageContent = "" + + $scope.loadMoreMessages = -> + chatMessages.loadMoreMessages() + + \ No newline at end of file diff --git a/services/web/public/coffee/ide/chat/services/chatMessages.coffee b/services/web/public/coffee/ide/chat/services/chatMessages.coffee new file mode 100644 index 0000000000..d63768db03 --- /dev/null +++ b/services/web/public/coffee/ide/chat/services/chatMessages.coffee @@ -0,0 +1,82 @@ +define [ + "base" +], (App) -> + App.factory "chatMessages", ($http, ide) -> + MESSAGES_URL = "/project/#{ide.project_id}/messages" + MESSAGE_LIMIT = 3 + CONNECTED_USER_URL = "/project/#{ide.project_id}/connected_users" + + chat = { + state: + messages: [] + loading: false + atEnd: false + nextBeforeTimestamp: null + } + + ide.socket.on "new-chat-message", (message) => + appendMessage(message) + + chat.loadMoreMessages = () -> + return if chat.state.atEnd + + url = MESSAGES_URL + "?limit=#{MESSAGE_LIMIT}" + if chat.state.nextBeforeTimestamp? + url += "&before=#{chat.state.nextBeforeTimestamp}" + + chat.state.loading = true + return $http + .get(url) + .success (messages = [])-> + chat.state.loading = false + if messages.length < MESSAGE_LIMIT + chat.state.atEnd = true + messages.reverse() + prependMessages(messages) + chat.state.nextBeforeTimestamp = chat.state.messages[0]?.timestamp + console.log messages, chat.state + + TIMESTAMP_GROUP_SIZE = 5 * 60 * 1000 # 5 minutes + + prependMessage = (message) -> + console.log "PREPENDING MESSAGE", message + firstMessage = chat.state.messages[0] + shouldGroup = firstMessage? and + firstMessage.user.id == message.user.id and + firstMessage.timestamp - message.timestamp < TIMESTAMP_GROUP_SIZE + if shouldGroup + firstMessage.timestamp = message.timestamp + firstMessage.contents.unshift message.content + else + chat.state.messages.unshift({ + user: message.user + timestamp: message.timestamp + contents: [message.content] + }) + + prependMessages = (messages) -> + for message in messages.slice(0).reverse() + prependMessage(message) + + appendMessage = (message) -> + lastMessage = chat.state.messages[chat.state.messages.length - 1] + shouldGroup = lastMessage? and + lastMessage.user.id == message.user.id and + message.timestamp - lastMessage.timestamp < TIMESTAMP_GROUP_SIZE + if shouldGroup + lastMessage.timestamp = message.timestamp + lastMessage.contents.push message.content + else + chat.state.messages.push({ + user: message.user + timestamp: message.timestamp + contents: [message.content] + }) + + chat.sendMessage = (message) -> + body = + content: message + _csrf : window.csrfToken + return $http.post(MESSAGES_URL, body) + + return chat \ No newline at end of file diff --git a/services/web/public/coffee/ide/track-changes/TrackChangesManager.coffee b/services/web/public/coffee/ide/track-changes/TrackChangesManager.coffee index d902f2de54..7817cb8725 100644 --- a/services/web/public/coffee/ide/track-changes/TrackChangesManager.coffee +++ b/services/web/public/coffee/ide/track-changes/TrackChangesManager.coffee @@ -63,7 +63,7 @@ define [ @$scope.trackChanges.updates[indexOfLastUpdateNotByMe].selectedFrom = true - BATCH_SIZE: 4 + BATCH_SIZE: 10 fetchNextBatchOfUpdates: () -> url = "/project/#{@ide.project_id}/updates?min_count=#{@BATCH_SIZE}" if @$scope.trackChanges.nextBeforeTimestamp? diff --git a/services/web/public/coffee/ide/track-changes/directives/infiniteScroll.coffee b/services/web/public/coffee/ide/track-changes/directives/infiniteScroll.coffee index dcc087c25a..65b1ac51eb 100644 --- a/services/web/public/coffee/ide/track-changes/directives/infiniteScroll.coffee +++ b/services/web/public/coffee/ide/track-changes/directives/infiniteScroll.coffee @@ -8,29 +8,25 @@ define [ element.css 'overflow-y': 'auto' atEndOfListView = () -> + if attrs.infiniteScrollUpwards? + atTopOfListView() + else + atBottomOfList() + + atTopOfListView = () -> + element.scrollTop() < 30 + + atBottomOfListView = () -> element.scrollTop() + element.height() >= innerElement.height() - 30 listShorterThanContainer = () -> - element.innerHeight() > @$(".change-list").outerHeight() + element.height() > innerElement.height() loadUntilFull = () -> if (listShorterThanContainer() or atEndOfListView()) and not scope.$eval(attrs.infiniteScrollDisabled) promise = scope.$eval(attrs.infiniteScroll) promise.then () -> loadUntilFull() - # @collection.fetchNextBatch - # error: (error) => - # @hideLoading() - # @showEmptyMessageIfCollectionEmpty() - # callback(error) - # success: (collection, response) => - # @hideLoading() - # if @collection.isAtEnd() - # @atEndOfCollection = true - # @showEmptyMessageIfCollectionEmpty() - # callback() - # else - # @loadUntilFull(callback) element.on "scroll", (event) -> loadUntilFull() diff --git a/services/web/public/stylesheets/app/editor/chat.less b/services/web/public/stylesheets/app/editor/chat.less index ebf4e67e9a..717dc37309 100644 --- a/services/web/public/stylesheets/app/editor/chat.less +++ b/services/web/public/stylesheets/app/editor/chat.less @@ -1,6 +1,12 @@ @new-message-height: 80px; .chat { + .loading { + font-family: @font-family-serif; + padding: @line-height-computed / 2; + text-align: center; + } + .messages { position: absolute; top: 0; From 57409df92b65bd408ef1edbc2bad5f9c847c264d Mon Sep 17 00:00:00 2001 From: James Allen Date: Tue, 15 Jul 2014 18:26:30 +0100 Subject: [PATCH 2/7] Remove dead code --- .../public/coffee/directives/scroll.coffee | 38 ------------------- 1 file changed, 38 deletions(-) diff --git a/services/web/public/coffee/directives/scroll.coffee b/services/web/public/coffee/directives/scroll.coffee index 39f2b1a334..7a700d93e5 100644 --- a/services/web/public/coffee/directives/scroll.coffee +++ b/services/web/public/coffee/directives/scroll.coffee @@ -1,43 +1,7 @@ define [ "base" ], (App) -> - fakeNgModel = (initValue) -> - $setViewValue: (value) -> - @$viewValue = value - return - $viewValue: initValue - App.directive "updateScrollBottomOn", -> - # return { - # priority: 1 - # require: ["?ngModel"] - # restrict: "A" - # link: (scope, $el, attrs, ctrls) -> - # scrollToBottom = -> - # el.scrollTop = el.scrollHeight - # return - # - # shouldActivateAutoScroll = -> - # # + 1 catches off by one errors in chrome - # el.scrollTop + el.clientHeight + 1 >= el.scrollHeight - # - # - # el = $el[0] - # ngModel = ctrls[0] or fakeNgModel(true) - # - # scope.$watch -> - # console.log "SCOPE CHANGED", ngModel.$viewValue - # if ngModel.$viewValue - # scrollToBottom() - # - # $el.bind "scroll", -> - # activate = shouldActivateAutoScroll() - # scope.$apply ngModel.$setViewValue.bind(ngModel, activate) if activate isnt ngModel.$viewValue - # - # return - # } - - return { restrict: "A" link: (scope, element, attrs, ctrls) -> @@ -63,11 +27,9 @@ define [ scrollBottom = 0 element.on "scroll", (e) -> scrollBottom = element[0].scrollHeight - element[0].scrollTop - element[0].clientHeight - console.log "SCROLL BOTTOM CHANGED", scrollBottom scope.$on attrs.updateScrollBottomOn, () -> setTimeout () -> - console.log "RESTORING SCROLL BOTTOM", scrollBottom element.scrollTop(element[0].scrollHeight - element[0].clientHeight - scrollBottom) , 0 } From 81eca796133d9c006dd6ceecfcfa8f70debb6ee9 Mon Sep 17 00:00:00 2001 From: James Allen Date: Tue, 15 Jul 2014 18:32:18 +0100 Subject: [PATCH 3/7] Deep watch messages to catch all updates --- .../public/coffee/ide/chat/controllers/ChatController.coffee | 3 ++- .../web/public/coffee/ide/chat/services/chatMessages.coffee | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/services/web/public/coffee/ide/chat/controllers/ChatController.coffee b/services/web/public/coffee/ide/chat/controllers/ChatController.coffee index 751d1746fd..401a9def27 100644 --- a/services/web/public/coffee/ide/chat/controllers/ChatController.coffee +++ b/services/web/public/coffee/ide/chat/controllers/ChatController.coffee @@ -5,9 +5,10 @@ define [ App.controller "ChatController", ($scope, chatMessages, @ide, $location) -> $scope.chat = chatMessages.state - $scope.$watchCollection "chat.messages", (messages) -> + $scope.$watch "chat.messages", (messages) -> if messages? $scope.$emit "messages:updated" + , true # Deep watch $scope.sendMessage = -> chatMessages diff --git a/services/web/public/coffee/ide/chat/services/chatMessages.coffee b/services/web/public/coffee/ide/chat/services/chatMessages.coffee index d63768db03..00d6c3bbf1 100644 --- a/services/web/public/coffee/ide/chat/services/chatMessages.coffee +++ b/services/web/public/coffee/ide/chat/services/chatMessages.coffee @@ -39,7 +39,6 @@ define [ TIMESTAMP_GROUP_SIZE = 5 * 60 * 1000 # 5 minutes prependMessage = (message) -> - console.log "PREPENDING MESSAGE", message firstMessage = chat.state.messages[0] shouldGroup = firstMessage? and firstMessage.user.id == message.user.id and From 2a3ff3c523a75bc1b4d2055c33384629e862cabd Mon Sep 17 00:00:00 2001 From: James Allen Date: Tue, 15 Jul 2014 18:33:59 +0100 Subject: [PATCH 4/7] Fix unit tests --- .../web/test/UnitTests/coffee/Chat/ChatControllerTests.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/test/UnitTests/coffee/Chat/ChatControllerTests.coffee b/services/web/test/UnitTests/coffee/Chat/ChatControllerTests.coffee index 8fa69097c6..6a2df298f5 100644 --- a/services/web/test/UnitTests/coffee/Chat/ChatControllerTests.coffee +++ b/services/web/test/UnitTests/coffee/Chat/ChatControllerTests.coffee @@ -55,7 +55,7 @@ describe "ChatController", -> describe "getMessages", -> beforeEach -> - @req.body = @query + @req.query = @query it "should ask the chat handler about the request", (done)-> From 604a877f125a998285187d53fc22188c7d2370bc Mon Sep 17 00:00:00 2001 From: James Allen Date: Tue, 15 Jul 2014 18:50:46 +0100 Subject: [PATCH 5/7] Load chat messages in reasonable sized chunks --- .../web/public/coffee/ide/chat/services/chatMessages.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/public/coffee/ide/chat/services/chatMessages.coffee b/services/web/public/coffee/ide/chat/services/chatMessages.coffee index 00d6c3bbf1..bc92cf9903 100644 --- a/services/web/public/coffee/ide/chat/services/chatMessages.coffee +++ b/services/web/public/coffee/ide/chat/services/chatMessages.coffee @@ -3,7 +3,7 @@ define [ ], (App) -> App.factory "chatMessages", ($http, ide) -> MESSAGES_URL = "/project/#{ide.project_id}/messages" - MESSAGE_LIMIT = 3 + MESSAGE_LIMIT = 50 CONNECTED_USER_URL = "/project/#{ide.project_id}/connected_users" chat = { From e0266e309f12a7bb6592e5c843093ca91fe7c8aa Mon Sep 17 00:00:00 2001 From: James Allen Date: Tue, 15 Jul 2014 20:44:13 +0100 Subject: [PATCH 6/7] Put project link in header --- services/web/app/views/layout/navbar.jade | 29 ------------------- .../web/app/views/project/editor/header.jade | 6 ++++ .../app/views/project/editor/left-menu.jade | 8 ----- 3 files changed, 6 insertions(+), 37 deletions(-) diff --git a/services/web/app/views/layout/navbar.jade b/services/web/app/views/layout/navbar.jade index 9ec79b03ea..38bd507d64 100644 --- a/services/web/app/views/layout/navbar.jade +++ b/services/web/app/views/layout/navbar.jade @@ -31,33 +31,4 @@ nav.navbar.navbar-default else | !{item.text} - //- li.dropdown - //- a.dropdown-toggle(href='#',data-toggle="dropdown") - //- | Help - //- b.caret - //- ul.dropdown-menu - //- li - //- a(href='/learn') Documentation - //- -if(typeof(tenderUrl) != "undefined") - //- li - //- a.js-tender-widget(href='#') Contact Support - - //- -if(session && session.user) - //- li.dropdown - //- a.dropdown-toggle(href="#",data-toggle="dropdown") - //- | Account - //- b.caret - //- ul.dropdown-menu - //- li - //- a(href='/user/settings').userSettingsLink Account Settings - //- - if (settings.enableSubscriptions) - //- li - //- a(href='/user/subscription').subscriptionLink Subscription - //- li - //- a(href='/logout').logoutLink Logout - //- -else - //- li - //- a(href='/register') Register - //- li - //- a#loginLink(href='/login'+getRedirAsQueryString()) Login diff --git a/services/web/app/views/project/editor/header.jade b/services/web/app/views/project/editor/header.jade index cff127cfda..833ce393f5 100644 --- a/services/web/app/views/project/editor/header.jade +++ b/services/web/app/views/project/editor/header.jade @@ -6,6 +6,12 @@ header.toolbar.toolbar-header(ng-cloak, ng-hide="state.loading") tooltip-placement="bottom" ) i.fa.fa-fw.fa-bars + a( + href="/project" + tooltip="Back to projects", + tooltip-placement="bottom" + ) + i.fa.fa-fw.fa-level-up .toolbar-center.project-name(ng-controller="ProjectNameController") span.name( diff --git a/services/web/app/views/project/editor/left-menu.jade b/services/web/app/views/project/editor/left-menu.jade index ea1f141671..ebb3a67612 100644 --- a/services/web/app/views/project/editor/left-menu.jade +++ b/services/web/app/views/project/editor/left-menu.jade @@ -2,14 +2,6 @@ aside#left-menu.full-size( ng-class="{ 'shown': ui.leftMenuShown }" ng-cloak ) - ul.list-unstyled.nav - li - a( - href="/project" - ) - i.fa.fa-list-alt.fa-fw - |   View All Projects - h4 Download ul.list-unstyled.nav.nav-downloads From 1d7a595c6c3d81f9bbb364791240e66ddfca68ae Mon Sep 17 00:00:00 2001 From: James Allen Date: Wed, 16 Jul 2014 10:52:06 +0100 Subject: [PATCH 7/7] Small chat scroll tweaks --- services/web/app/views/project/editor/chat.jade | 2 +- services/web/public/coffee/directives/scroll.coffee | 4 ++-- .../public/coffee/ide/chat/controllers/ChatController.coffee | 5 ++++- .../web/public/coffee/ide/chat/services/chatMessages.coffee | 1 - 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/services/web/app/views/project/editor/chat.jade b/services/web/app/views/project/editor/chat.jade index 2ae878059f..754d044392 100644 --- a/services/web/app/views/project/editor/chat.jade +++ b/services/web/app/views/project/editor/chat.jade @@ -6,7 +6,7 @@ aside.chat( infinite-scroll-disabled="chat.loading || chat.atEnd" infinite-scroll-initialize="ui.chatOpen" infinite-scroll-upwards="true" - update-scroll-bottom-on="messages:updated" + update-scroll-bottom-on="updateScrollPosition" ) .infinite-scroll-inner .loading(ng-show="chat.loading") diff --git a/services/web/public/coffee/directives/scroll.coffee b/services/web/public/coffee/directives/scroll.coffee index 7a700d93e5..f39f45ff4f 100644 --- a/services/web/public/coffee/directives/scroll.coffee +++ b/services/web/public/coffee/directives/scroll.coffee @@ -1,7 +1,7 @@ define [ "base" ], (App) -> - App.directive "updateScrollBottomOn", -> + App.directive "updateScrollBottomOn", ($timeout) -> return { restrict: "A" link: (scope, element, attrs, ctrls) -> @@ -29,7 +29,7 @@ define [ scrollBottom = element[0].scrollHeight - element[0].scrollTop - element[0].clientHeight scope.$on attrs.updateScrollBottomOn, () -> - setTimeout () -> + $timeout () -> element.scrollTop(element[0].scrollHeight - element[0].clientHeight - scrollBottom) , 0 } diff --git a/services/web/public/coffee/ide/chat/controllers/ChatController.coffee b/services/web/public/coffee/ide/chat/controllers/ChatController.coffee index 401a9def27..8affd3d26a 100644 --- a/services/web/public/coffee/ide/chat/controllers/ChatController.coffee +++ b/services/web/public/coffee/ide/chat/controllers/ChatController.coffee @@ -7,8 +7,11 @@ define [ $scope.$watch "chat.messages", (messages) -> if messages? - $scope.$emit "messages:updated" + $scope.$emit "updateScrollPosition" , true # Deep watch + + $scope.$on "layout:chat:resize", () -> + $scope.$emit "updateScrollPosition" $scope.sendMessage = -> chatMessages diff --git a/services/web/public/coffee/ide/chat/services/chatMessages.coffee b/services/web/public/coffee/ide/chat/services/chatMessages.coffee index bc92cf9903..74d074e3c2 100644 --- a/services/web/public/coffee/ide/chat/services/chatMessages.coffee +++ b/services/web/public/coffee/ide/chat/services/chatMessages.coffee @@ -34,7 +34,6 @@ define [ messages.reverse() prependMessages(messages) chat.state.nextBeforeTimestamp = chat.state.messages[0]?.timestamp - console.log messages, chat.state TIMESTAMP_GROUP_SIZE = 5 * 60 * 1000 # 5 minutes