SYWEB-7: Up & down keys let user step through the history as per readline or xchat

This commit is contained in:
Emmanuel ROHEE 2014-09-17 14:18:39 +02:00
parent f9bb000ccf
commit d9a9a47075
2 changed files with 72 additions and 3 deletions

View file

@ -404,12 +404,15 @@ angular.module('RoomController', ['ngSanitize', 'matrixFilter', 'mFileInput'])
}; };
$scope.send = function() { $scope.send = function() {
if ($scope.textInput === "") { if (undefined === $scope.textInput || $scope.textInput === "") {
return; return;
} }
scrollToBottom(true); scrollToBottom(true);
// Store the command in the history
history.push($scope.textInput);
var promise; var promise;
var cmd; var cmd;
var args; var args;
@ -847,4 +850,69 @@ angular.module('RoomController', ['ngSanitize', 'matrixFilter', 'mFileInput'])
$rootScope.currentCall = call; $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();
}
};
}]); }]);

View file

@ -156,7 +156,8 @@
<td width="*"> <td width="*">
<textarea id="mainInput" rows="1" ng-model="textInput" ng-enter="send()" <textarea id="mainInput" rows="1" ng-model="textInput" ng-enter="send()"
ng-disabled="state.permission_denied" 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>
<td id="buttonsCell"> <td id="buttonsCell">
<button ng-click="send()" ng-disabled="state.permission_denied">Send</button> <button ng-click="send()" ng-disabled="state.permission_denied">Send</button>