diff options
author | Emmanuel ROHEE <erohee@amdocs.com> | 2014-09-17 14:18:39 +0200 |
---|---|---|
committer | Emmanuel ROHEE <erohee@amdocs.com> | 2014-09-17 14:18:39 +0200 |
commit | d9a9a470758edd596676239271fefb820785e1b3 (patch) | |
tree | e399c6e0efa8784c57ceef3296451a6c270358a0 /webclient/room | |
parent | WEB-35: joins/parts should trigger desktop notifications (diff) | |
download | synapse-d9a9a470758edd596676239271fefb820785e1b3.tar.xz |
SYWEB-7: Up & down keys let user step through the history as per readline or xchat
Diffstat (limited to 'webclient/room')
-rw-r--r-- | webclient/room/room-controller.js | 72 | ||||
-rw-r--r-- | webclient/room/room.html | 3 |
2 files changed, 72 insertions, 3 deletions
diff --git a/webclient/room/room-controller.js b/webclient/room/room-controller.js index 6e1d83a23d..15056b947a 100644 --- a/webclient/room/room-controller.js +++ b/webclient/room/room-controller.js @@ -404,12 +404,15 @@ angular.module('RoomController', ['ngSanitize', 'matrixFilter', 'mFileInput']) }; $scope.send = function() { - if ($scope.textInput === "") { + if (undefined === $scope.textInput || $scope.textInput === "") { return; } scrollToBottom(true); - + + // Store the command in the history + history.push($scope.textInput); + var promise; var cmd; var args; @@ -847,4 +850,69 @@ angular.module('RoomController', ['ngSanitize', 'matrixFilter', 'mFileInput']) $rootScope.currentCall = call; }; + // Manage history of typed messages + var history = { + // The list of typed messages. Index 0 is the more recents + data: [], + + // The position in the history currently displayed + position: -1, + + // The message the user has started to type before going into the history + typingMessage: undefined, + + // Store a message in the history + push: function(message) { + this.data.unshift(message); + + // Reset history position + this.position = -1; + this.typingMessage = undefined; + }, + + // Move in the history + go: function(offset) { + + if (-1 === this.position) { + // User starts to go to into the history, save the current line + this.typingMessage = $scope.textInput; + } + else { + // If the user modified this line in history, keep the change + this.data[this.position] = $scope.textInput; + } + + // Bounds the new position to valid data + var newPosition = this.position + offset; + newPosition = Math.max(-1, newPosition); + newPosition = Math.min(newPosition, this.data.length - 1); + this.position = newPosition; + + if (-1 !== this.position) { + // Show the message from the history + $scope.textInput = this.data[this.position]; + } + else if (undefined !== this.typingMessage) { + // Go back to the message the user started to type + $scope.textInput = this.typingMessage; + } + } + }; + + // Make history singleton methods available from HTML + $scope.history = { + goUp: function($event) { + if ($scope.room_id) { + history.go(1); + } + $event.preventDefault(); + }, + goDown: function($event) { + if ($scope.room_id) { + history.go(-1); + } + $event.preventDefault(); + } + }; + }]); diff --git a/webclient/room/room.html b/webclient/room/room.html index 886c2afe64..33ad06ea80 100644 --- a/webclient/room/room.html +++ b/webclient/room/room.html @@ -156,7 +156,8 @@ <td width="*"> <textarea id="mainInput" rows="1" ng-model="textInput" ng-enter="send()" ng-disabled="state.permission_denied" - ng-focus="true" autocomplete="off" tab-complete/> + ng-keydown="(38 === $event.which) ? history.goUp($event) : ((40 === $event.which) ? history.goDown($event) : 0)" + ng-focus="true" autocomplete="off" tab-complete/> </td> <td id="buttonsCell"> <button ng-click="send()" ng-disabled="state.permission_denied">Send</button> |