Refactor keycodes
This commit is contained in:
parent
e34960392c
commit
f948120ba6
20 changed files with 178 additions and 200 deletions
|
|
@ -32,7 +32,7 @@ app.views.AspectCreate = app.views.Base.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
inputKeypress: function(evt) {
|
inputKeypress: function(evt) {
|
||||||
if(evt.which === 13) {
|
if(evt.which === Keycodes.ENTER) {
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
this.createAspect();
|
this.createAspect();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@ app.views.CommentStream = app.views.Base.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
keyDownOnCommentBox: function(evt) {
|
keyDownOnCommentBox: function(evt) {
|
||||||
if(evt.keyCode === 13 && evt.ctrlKey) {
|
if(evt.which === Keycodes.ENTER && evt.ctrlKey) {
|
||||||
this.$("form").submit();
|
this.$("form").submit();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ app.views.ConversationsForm = Backbone.View.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
keyDown : function(evt) {
|
keyDown : function(evt) {
|
||||||
if( evt.keyCode === 13 && evt.ctrlKey ) {
|
if(evt.which === Keycodes.ENTER && evt.ctrlKey) {
|
||||||
$(evt.target).parents("form").submit();
|
$(evt.target).parents("form").submit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ app.views.Conversations = Backbone.View.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
keyDown : function(evt) {
|
keyDown : function(evt) {
|
||||||
if( evt.keyCode === 13 && evt.ctrlKey ) {
|
if(evt.which === Keycodes.ENTER && evt.ctrlKey) {
|
||||||
$(evt.target).parents("form").submit();
|
$(evt.target).parents("form").submit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,11 +7,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
app.views.PublisherMention = app.views.SearchBase.extend({
|
app.views.PublisherMention = app.views.SearchBase.extend({
|
||||||
KEYS: {
|
|
||||||
PASTE: 118, BACKSPACE: 8, TAB: 9, RETURN: 13, ESC: 27, LEFT: 37,
|
|
||||||
UP: 38, RIGHT: 39, DOWN: 40, COMMA: 188, SPACE: 32, HOME: 36, END: 35
|
|
||||||
},
|
|
||||||
|
|
||||||
settings: {
|
settings: {
|
||||||
triggerChar: "@",
|
triggerChar: "@",
|
||||||
minChars: 2,
|
minChars: 2,
|
||||||
|
|
@ -222,7 +217,7 @@ app.views.PublisherMention = app.views.SearchBase.extend({
|
||||||
* user press up and down arrows.
|
* user press up and down arrows.
|
||||||
*/
|
*/
|
||||||
onArrowKeysPress: function(e){
|
onArrowKeysPress: function(e){
|
||||||
if(!this.isVisible() || (e.keyCode !== this.KEYS.UP && e.keyCode !== this.KEYS.DOWN)){
|
if(!this.isVisible() || (e.which !== Keycodes.UP && e.which !== Keycodes.DOWN)){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -231,12 +226,12 @@ app.views.PublisherMention = app.views.SearchBase.extend({
|
||||||
|
|
||||||
this.getTypeaheadInput().typeahead("activate");
|
this.getTypeaheadInput().typeahead("activate");
|
||||||
this.getTypeaheadInput().typeahead("open");
|
this.getTypeaheadInput().typeahead("open");
|
||||||
this.getTypeaheadInput().trigger($.Event("keydown", {keyCode: e.keyCode}));
|
this.getTypeaheadInput().trigger($.Event("keydown", {keyCode: e.keyCode, which: e.which}));
|
||||||
},
|
},
|
||||||
|
|
||||||
onInputBoxKeyPress: function(e){
|
onInputBoxKeyPress: function(e){
|
||||||
// Excluding ctrl+v from key press event in firefox
|
// Excluding ctrl+v from key press event in firefox
|
||||||
if(!((e.which === this.KEYS.PASTE && e.ctrlKey) || (e.keyCode === this.KEYS.BACKSPACE))){
|
if(!((String.fromCharCode(e.which).toLowerCase() === "v" && e.ctrlKey) || (e.which === Keycodes.BACKSPACE))){
|
||||||
var typedValue = String.fromCharCode(e.which || e.keyCode);
|
var typedValue = String.fromCharCode(e.which || e.keyCode);
|
||||||
this.inputBuffer.push(typedValue);
|
this.inputBuffer.push(typedValue);
|
||||||
}
|
}
|
||||||
|
|
@ -260,8 +255,8 @@ app.views.PublisherMention = app.views.SearchBase.extend({
|
||||||
|
|
||||||
onInputBoxKeyDown: function(e){
|
onInputBoxKeyDown: function(e){
|
||||||
// This also matches HOME/END on OSX which is CMD+LEFT, CMD+RIGHT
|
// This also matches HOME/END on OSX which is CMD+LEFT, CMD+RIGHT
|
||||||
if(e.keyCode === this.KEYS.LEFT || e.keyCode === this.KEYS.RIGHT ||
|
if(e.which === Keycodes.LEFT || e.which === Keycodes.RIGHT ||
|
||||||
e.keyCode === this.KEYS.HOME || e.keyCode === this.KEYS.END){
|
e.which === Keycodes.HOME || e.which === Keycodes.END){
|
||||||
_.defer(this.clearBuffer);
|
_.defer(this.clearBuffer);
|
||||||
|
|
||||||
// IE9 doesn't fire the oninput event when backspace or delete is pressed. This causes the highlighting
|
// IE9 doesn't fire the oninput event when backspace or delete is pressed. This causes the highlighting
|
||||||
|
|
@ -274,7 +269,7 @@ app.views.PublisherMention = app.views.SearchBase.extend({
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(e.keyCode === this.KEYS.BACKSPACE){
|
if(e.which === Keycodes.BACKSPACE){
|
||||||
this.inputBuffer = this.inputBuffer.slice(0, this.inputBuffer.length - 1);
|
this.inputBuffer = this.inputBuffer.slice(0, this.inputBuffer.length - 1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -283,17 +278,17 @@ app.views.PublisherMention = app.views.SearchBase.extend({
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(e.keyCode){
|
switch(e.which){
|
||||||
case this.KEYS.ESC:
|
case Keycodes.ESC:
|
||||||
case this.KEYS.SPACE:
|
case Keycodes.SPACE:
|
||||||
this.resetMentionBox();
|
this.resetMentionBox();
|
||||||
break;
|
break;
|
||||||
case this.KEYS.UP:
|
case Keycodes.UP:
|
||||||
case this.KEYS.DOWN:
|
case Keycodes.DOWN:
|
||||||
this.onArrowKeysPress(e);
|
this.onArrowKeysPress(e);
|
||||||
break;
|
break;
|
||||||
case this.KEYS.RETURN:
|
case Keycodes.RETURN:
|
||||||
case this.KEYS.TAB:
|
case Keycodes.TAB:
|
||||||
if(this.getSelected().size() === 1){
|
if(this.getSelected().size() === 1){
|
||||||
this.getSelected().click();
|
this.getSelected().click();
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -247,8 +247,9 @@ app.views.Publisher = Backbone.View.extend({
|
||||||
|
|
||||||
// avoid submitting form when pressing Enter key
|
// avoid submitting form when pressing Enter key
|
||||||
avoidEnter: function(evt){
|
avoidEnter: function(evt){
|
||||||
if(evt.keyCode === 13)
|
if(evt.which === Keycodes.ENTER) {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
getUploadedPhotos: function() {
|
getUploadedPhotos: function() {
|
||||||
|
|
@ -356,7 +357,7 @@ app.views.Publisher = Backbone.View.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
keyDown : function(evt) {
|
keyDown : function(evt) {
|
||||||
if( evt.keyCode === 13 && evt.ctrlKey ) {
|
if(evt.which === Keycodes.ENTER && evt.ctrlKey) {
|
||||||
this.$("form").submit();
|
this.$("form").submit();
|
||||||
this.open();
|
this.open();
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ app.views.Search = app.views.SearchBase.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
inputKeypress: function(evt){
|
inputKeypress: function(evt){
|
||||||
if(evt.which === 13 && $(".tt-suggestion.tt-cursor").length === 0){
|
if(evt.which === Keycodes.ENTER && $(".tt-suggestion.tt-cursor").length === 0){
|
||||||
$(evt.target).closest("form").submit();
|
$(evt.target).closest("form").submit();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ app.views.TagFollowingList = app.views.Base.extend({
|
||||||
});
|
});
|
||||||
|
|
||||||
this.$("input").bind('keydown', function(evt){
|
this.$("input").bind('keydown', function(evt){
|
||||||
if(evt.keyCode === 13 || evt.keyCode === 9 || evt.keyCode === 32){
|
if(evt.which === Keycodes.ENTER || evt.which === Keycodes.TAB || evt.which === Keycodes.SPACE) {
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
if( $('li.as-result-item.active').length === 0 ){
|
if( $('li.as-result-item.active').length === 0 ){
|
||||||
$('li.as-result-item').first().click();
|
$('li.as-result-item').first().click();
|
||||||
|
|
|
||||||
|
|
@ -73,7 +73,7 @@ Diaspora.Pages.UsersGettingStarted = function() {
|
||||||
});
|
});
|
||||||
|
|
||||||
autocompleteInput.bind('keydown', function(evt){
|
autocompleteInput.bind('keydown', function(evt){
|
||||||
if(evt.keyCode === 13 || evt.keyCode === 9 || evt.keyCode === 32){
|
if(evt.which === Keycodes.ENTER || evt.which === Keycodes.TAB || evt.which === Keycodes.SPACE) {
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
if( $('li.as-result-item.active').length === 0 ){
|
if( $('li.as-result-item.active').length === 0 ){
|
||||||
$('li.as-result-item').first().click();
|
$('li.as-result-item').first().click();
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@
|
||||||
});
|
});
|
||||||
|
|
||||||
autocompleteInput.bind('keydown', function(evt){
|
autocompleteInput.bind('keydown', function(evt){
|
||||||
if(evt.keyCode == 13 || evt.keyCode == 9 || evt.keyCode == 32){
|
if(evt.which === Keycodes.ENTER || evt.which === Keycodes.TAB || evt.which === Keycodes.SPACE) {
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
if( $('li.as-result-item.active').length == 0 ){
|
if( $('li.as-result-item.active').length == 0 ){
|
||||||
$('li.as-result-item').first().click();
|
$('li.as-result-item').first().click();
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@
|
||||||
});
|
});
|
||||||
|
|
||||||
autocompleteInput.bind('keydown', function(evt){
|
autocompleteInput.bind('keydown', function(evt){
|
||||||
if(evt.keyCode == 13 || evt.keyCode == 9 || evt.keyCode == 32){
|
if(evt.which === Keycodes.ENTER || evt.which === Keycodes.TAB || evt.which === Keycodes.SPACE) {
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
if( $('li.as-result-item.active').length == 0 ){
|
if( $('li.as-result-item.active').length == 0 ){
|
||||||
$('li.as-result-item').first().click();
|
$('li.as-result-item').first().click();
|
||||||
|
|
|
||||||
|
|
@ -66,6 +66,7 @@
|
||||||
|
|
||||||
"app",
|
"app",
|
||||||
"Diaspora",
|
"Diaspora",
|
||||||
|
"Keycodes",
|
||||||
"Mentions",
|
"Mentions",
|
||||||
"PosixBracketExpressions"
|
"PosixBracketExpressions"
|
||||||
]
|
]
|
||||||
|
|
|
||||||
117
lib/assets/javascripts/keycodes.js
Normal file
117
lib/assets/javascripts/keycodes.js
Normal file
|
|
@ -0,0 +1,117 @@
|
||||||
|
window.Keycodes = {
|
||||||
|
BACKSPACE: 8,
|
||||||
|
TAB: 9,
|
||||||
|
ENTER: 13,
|
||||||
|
RETURN: 13,
|
||||||
|
SHIFT: 16,
|
||||||
|
CTRL: 17,
|
||||||
|
ALT: 18,
|
||||||
|
PAUSE: 19,
|
||||||
|
BREAK: 19,
|
||||||
|
CAPSLOCK: 20,
|
||||||
|
ESCAPE: 27,
|
||||||
|
ESC: 27,
|
||||||
|
SPACEBAR: 32,
|
||||||
|
SPACE: 32,
|
||||||
|
PAGEUP: 33,
|
||||||
|
PAGEDOWN: 34,
|
||||||
|
END: 35,
|
||||||
|
HOME: 36,
|
||||||
|
LEFT: 37,
|
||||||
|
UP: 38,
|
||||||
|
RIGHT: 39,
|
||||||
|
DOWN: 40,
|
||||||
|
INSERT: 45,
|
||||||
|
DEL: 46,
|
||||||
|
DELETE: 46,
|
||||||
|
0: 48,
|
||||||
|
1: 49,
|
||||||
|
2: 50,
|
||||||
|
3: 51,
|
||||||
|
4: 52,
|
||||||
|
5: 53,
|
||||||
|
6: 54,
|
||||||
|
7: 55,
|
||||||
|
8: 56,
|
||||||
|
9: 57,
|
||||||
|
A: 65,
|
||||||
|
B: 66,
|
||||||
|
C: 67,
|
||||||
|
D: 68,
|
||||||
|
E: 69,
|
||||||
|
F: 70,
|
||||||
|
G: 71,
|
||||||
|
H: 72,
|
||||||
|
I: 73,
|
||||||
|
J: 74,
|
||||||
|
K: 75,
|
||||||
|
L: 76,
|
||||||
|
M: 77,
|
||||||
|
N: 78,
|
||||||
|
O: 79,
|
||||||
|
P: 80,
|
||||||
|
Q: 81,
|
||||||
|
R: 82,
|
||||||
|
S: 83,
|
||||||
|
T: 84,
|
||||||
|
U: 85,
|
||||||
|
V: 86,
|
||||||
|
W: 87,
|
||||||
|
X: 88,
|
||||||
|
Y: 89,
|
||||||
|
Z: 90,
|
||||||
|
LEFTWINDOW: 91,
|
||||||
|
RIGHTWINDOW: 92,
|
||||||
|
SELECT: 93,
|
||||||
|
NUMPAD0: 96,
|
||||||
|
NUMPAD1: 97,
|
||||||
|
NUMPAD2: 98,
|
||||||
|
NUMPAD3: 99,
|
||||||
|
NUMPAD4: 100,
|
||||||
|
NUMPAD5: 101,
|
||||||
|
NUMPAD6: 102,
|
||||||
|
NUMPAD7: 103,
|
||||||
|
NUMPAD8: 104,
|
||||||
|
NUMPAD9: 105,
|
||||||
|
MULTIPLY: 106,
|
||||||
|
ADD: 107,
|
||||||
|
SUBTRACT: 109,
|
||||||
|
DECIMALPOINT: 110,
|
||||||
|
DIVIDE: 111,
|
||||||
|
F1: 112,
|
||||||
|
F2: 113,
|
||||||
|
F3: 114,
|
||||||
|
F4: 115,
|
||||||
|
F5: 116,
|
||||||
|
F6: 117,
|
||||||
|
F7: 118,
|
||||||
|
F8: 119,
|
||||||
|
F9: 120,
|
||||||
|
F10: 121,
|
||||||
|
F11: 122,
|
||||||
|
F12: 123,
|
||||||
|
NUMLOCK: 144,
|
||||||
|
SCROLLLOCK: 145,
|
||||||
|
SEMICOLON: 186,
|
||||||
|
EQUALSIGN: 187,
|
||||||
|
COMMA: 188,
|
||||||
|
DASH: 189,
|
||||||
|
PERIOD: 190,
|
||||||
|
FORWARDSLASH: 191,
|
||||||
|
ACCENTGRAVE: 192,
|
||||||
|
OPENBRACKET: 219,
|
||||||
|
BACKSLASH: 220,
|
||||||
|
CLOSEBRACKET: 221,
|
||||||
|
SINGLEQUOTE: 222,
|
||||||
|
isInsertion: function(keyCode) {
|
||||||
|
if(keyCode <= 46 && keyCode !== this.RETURN && keyCode !== this.SPACEBAR) {
|
||||||
|
return false;
|
||||||
|
} else if(keyCode > 90 && keyCode < 96) {
|
||||||
|
return false;
|
||||||
|
} else if(keyCode >= 112 && keyCode <= 145) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
@ -47,13 +47,13 @@ describe("app.views.AspectCreate", function() {
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should call createAspect if the enter key was pressed", function() {
|
it("should call createAspect if the enter key was pressed", function() {
|
||||||
var e = $.Event("keypress", { which: 13 });
|
var e = $.Event("keypress", { which: Keycodes.ENTER });
|
||||||
this.view.inputKeypress(e);
|
this.view.inputKeypress(e);
|
||||||
expect(this.view.createAspect).toHaveBeenCalled();
|
expect(this.view.createAspect).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("shouldn't call createAspect if another key was pressed", function() {
|
it("shouldn't call createAspect if another key was pressed", function() {
|
||||||
var e = $.Event("keypress", { which: 42 });
|
var e = $.Event("keypress", { which: Keycodes.TAB });
|
||||||
this.view.inputKeypress(e);
|
this.view.inputKeypress(e);
|
||||||
expect(this.view.createAspect).not.toHaveBeenCalled();
|
expect(this.view.createAspect).not.toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -107,8 +107,7 @@ describe("app.views.CommentStream", function(){
|
||||||
var form = this.view.$("form");
|
var form = this.view.$("form");
|
||||||
form.submit(submitCallback);
|
form.submit(submitCallback);
|
||||||
|
|
||||||
var e = $.Event("keydown", { keyCode: 13 });
|
var e = $.Event("keydown", { which: Keycodes.ENTER, ctrlKey: false });
|
||||||
e.ctrlKey = false;
|
|
||||||
this.view.keyDownOnCommentBox(e);
|
this.view.keyDownOnCommentBox(e);
|
||||||
|
|
||||||
expect(submitCallback).not.toHaveBeenCalled();
|
expect(submitCallback).not.toHaveBeenCalled();
|
||||||
|
|
@ -119,8 +118,7 @@ describe("app.views.CommentStream", function(){
|
||||||
var form = this.view.$("form");
|
var form = this.view.$("form");
|
||||||
form.submit(submitCallback);
|
form.submit(submitCallback);
|
||||||
|
|
||||||
var e = $.Event("keydown", { keyCode: 13 });
|
var e = $.Event("keydown", { which: Keycodes.ENTER, ctrlKey: true });
|
||||||
e.ctrlKey = true;
|
|
||||||
this.view.keyDownOnCommentBox(e);
|
this.view.keyDownOnCommentBox(e);
|
||||||
|
|
||||||
expect(submitCallback).toHaveBeenCalled();
|
expect(submitCallback).toHaveBeenCalled();
|
||||||
|
|
|
||||||
|
|
@ -64,14 +64,14 @@ describe("app.views.Conversations", function(){
|
||||||
|
|
||||||
it("should submit the form with ctrl+enter", function(){
|
it("should submit the form with ctrl+enter", function(){
|
||||||
$("form#new_message").submit(this.submitCallback);
|
$("form#new_message").submit(this.submitCallback);
|
||||||
var e = $.Event("keydown", { keyCode: 13, ctrlKey: true });
|
var e = $.Event("keydown", { which: Keycodes.ENTER, ctrlKey: true });
|
||||||
$("textarea#message_text").trigger(e);
|
$("textarea#message_text").trigger(e);
|
||||||
expect(this.submitCallback).toHaveBeenCalled();
|
expect(this.submitCallback).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("shouldn't submit the form without the ctrl key", function(){
|
it("shouldn't submit the form without the ctrl key", function(){
|
||||||
$("form#new_message").submit(this.submitCallback);
|
$("form#new_message").submit(this.submitCallback);
|
||||||
var e = $.Event("keydown", { keyCode: 13, ctrlKey: false });
|
var e = $.Event("keydown", { which: Keycodes.ENTER, ctrlKey: false });
|
||||||
$("textarea#message_text").trigger(e);
|
$("textarea#message_text").trigger(e);
|
||||||
expect(this.submitCallback).not.toHaveBeenCalled();
|
expect(this.submitCallback).not.toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -225,8 +225,7 @@ describe("app.views.Publisher", function() {
|
||||||
var submitCallback = jasmine.createSpy().and.returnValue(false);
|
var submitCallback = jasmine.createSpy().and.returnValue(false);
|
||||||
form.submit(submitCallback);
|
form.submit(submitCallback);
|
||||||
|
|
||||||
var e = $.Event("keydown", { keyCode: 13 });
|
var e = $.Event("keydown", { which: Keycodes.ENTER, ctrlKey: true });
|
||||||
e.ctrlKey = true;
|
|
||||||
this.view.keyDown(e);
|
this.view.keyDown(e);
|
||||||
|
|
||||||
expect(submitCallback).toHaveBeenCalled();
|
expect(submitCallback).toHaveBeenCalled();
|
||||||
|
|
@ -460,8 +459,7 @@ describe("app.views.Publisher", function() {
|
||||||
describe('#avoidEnter', function(){
|
describe('#avoidEnter', function(){
|
||||||
it("Avoid submitting the form when pressing enter", function(){
|
it("Avoid submitting the form when pressing enter", function(){
|
||||||
// simulates the event object
|
// simulates the event object
|
||||||
var evt = {};
|
var evt = $.Event("keydown", { which: Keycodes.ENTER });
|
||||||
evt.keyCode = 13;
|
|
||||||
|
|
||||||
// should return false in order to avoid the form submition
|
// should return false in order to avoid the form submition
|
||||||
expect(this.view.avoidEnter(evt)).toBeFalsy();
|
expect(this.view.avoidEnter(evt)).toBeFalsy();
|
||||||
|
|
|
||||||
|
|
@ -16,9 +16,7 @@ describe("app.views.StreamShortcuts", function () {
|
||||||
describe("pressing 'j'", function(){
|
describe("pressing 'j'", function(){
|
||||||
it("should call 'gotoNext' if not pressed in an input field", function(){
|
it("should call 'gotoNext' if not pressed in an input field", function(){
|
||||||
spyOn(this.view, 'gotoNext');
|
spyOn(this.view, 'gotoNext');
|
||||||
var e = $.Event("keydown", { which: 74, target: {type: "div"} });
|
var e = $.Event("keydown", { which: Keycodes.J, target: {type: "div"} });
|
||||||
//verify that the test is correct
|
|
||||||
expect(String.fromCharCode( e.which ).toLowerCase()).toBe('j');
|
|
||||||
this.view._onHotkeyDown(e);
|
this.view._onHotkeyDown(e);
|
||||||
expect(this.view.gotoNext).toHaveBeenCalled();
|
expect(this.view.gotoNext).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
@ -32,9 +30,7 @@ describe("app.views.StreamShortcuts", function () {
|
||||||
it("shouldn't do anything if the user types in an input field", function(){
|
it("shouldn't do anything if the user types in an input field", function(){
|
||||||
spyOn(this.view, 'gotoNext');
|
spyOn(this.view, 'gotoNext');
|
||||||
spyOn(this.view, 'selectPost');
|
spyOn(this.view, 'selectPost');
|
||||||
var e = $.Event("keydown", { which: 74, target: {type: "textarea"} });
|
var e = $.Event("keydown", { which: Keycodes.J, target: {type: "textarea"} });
|
||||||
//verify that the test is correct
|
|
||||||
expect(String.fromCharCode( e.which ).toLowerCase()).toBe('j');
|
|
||||||
this.view._onHotkeyDown(e);
|
this.view._onHotkeyDown(e);
|
||||||
expect(this.view.gotoNext).not.toHaveBeenCalled();
|
expect(this.view.gotoNext).not.toHaveBeenCalled();
|
||||||
expect(this.view.selectPost).not.toHaveBeenCalled();
|
expect(this.view.selectPost).not.toHaveBeenCalled();
|
||||||
|
|
@ -44,9 +40,7 @@ describe("app.views.StreamShortcuts", function () {
|
||||||
describe("pressing 'k'", function(){
|
describe("pressing 'k'", function(){
|
||||||
it("should call 'gotoPrev' if not pressed in an input field", function(){
|
it("should call 'gotoPrev' if not pressed in an input field", function(){
|
||||||
spyOn(this.view, 'gotoPrev');
|
spyOn(this.view, 'gotoPrev');
|
||||||
var e = $.Event("keydown", { which: 75, target: {type: "div"} });
|
var e = $.Event("keydown", { which: Keycodes.K, target: {type: "div"} });
|
||||||
//verify that the test is correct
|
|
||||||
expect(String.fromCharCode( e.which ).toLowerCase()).toBe('k');
|
|
||||||
this.view._onHotkeyDown(e);
|
this.view._onHotkeyDown(e);
|
||||||
expect(this.view.gotoPrev).toHaveBeenCalled();
|
expect(this.view.gotoPrev).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
@ -60,9 +54,7 @@ describe("app.views.StreamShortcuts", function () {
|
||||||
it("shouldn't do anything if the user types in an input field", function(){
|
it("shouldn't do anything if the user types in an input field", function(){
|
||||||
spyOn(this.view, 'gotoPrev');
|
spyOn(this.view, 'gotoPrev');
|
||||||
spyOn(this.view, 'selectPost');
|
spyOn(this.view, 'selectPost');
|
||||||
var e = $.Event("keydown", { which: 75, target: {type: "textarea"} });
|
var e = $.Event("keydown", { which: Keycodes.K, target: {type: "textarea"} });
|
||||||
//verify that the test is correct
|
|
||||||
expect(String.fromCharCode( e.which ).toLowerCase()).toBe('k');
|
|
||||||
this.view._onHotkeyDown(e);
|
this.view._onHotkeyDown(e);
|
||||||
expect(this.view.gotoPrev).not.toHaveBeenCalled();
|
expect(this.view.gotoPrev).not.toHaveBeenCalled();
|
||||||
expect(this.view.selectPost).not.toHaveBeenCalled();
|
expect(this.view.selectPost).not.toHaveBeenCalled();
|
||||||
|
|
@ -72,18 +64,14 @@ describe("app.views.StreamShortcuts", function () {
|
||||||
describe("pressing 'c'", function(){
|
describe("pressing 'c'", function(){
|
||||||
it("should click on the comment-button if not pressed in an input field", function(){
|
it("should click on the comment-button if not pressed in an input field", function(){
|
||||||
spyOn(this.view, 'commentSelected');
|
spyOn(this.view, 'commentSelected');
|
||||||
var e = $.Event("keyup", { which: 67, target: {type: "div"} });
|
var e = $.Event("keyup", { which: Keycodes.C, target: {type: "div"} });
|
||||||
//verify that the test is correct
|
|
||||||
expect(String.fromCharCode( e.which ).toLowerCase()).toBe('c');
|
|
||||||
this.view._onHotkeyUp(e);
|
this.view._onHotkeyUp(e);
|
||||||
expect(this.view.commentSelected).toHaveBeenCalled();
|
expect(this.view.commentSelected).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("shouldn't do anything if the user types in an input field", function(){
|
it("shouldn't do anything if the user types in an input field", function(){
|
||||||
spyOn(this.view, 'commentSelected');
|
spyOn(this.view, 'commentSelected');
|
||||||
var e = $.Event("keyup", { which: 67, target: {type: "textarea"} });
|
var e = $.Event("keyup", { which: Keycodes.C, target: {type: "textarea"} });
|
||||||
//verify that the test is correct
|
|
||||||
expect(String.fromCharCode( e.which ).toLowerCase()).toBe('c');
|
|
||||||
this.view._onHotkeyUp(e);
|
this.view._onHotkeyUp(e);
|
||||||
expect(this.view.commentSelected).not.toHaveBeenCalled();
|
expect(this.view.commentSelected).not.toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
@ -92,18 +80,14 @@ describe("app.views.StreamShortcuts", function () {
|
||||||
describe("pressing 'l'", function(){
|
describe("pressing 'l'", function(){
|
||||||
it("should click on the like-button if not pressed in an input field", function(){
|
it("should click on the like-button if not pressed in an input field", function(){
|
||||||
spyOn(this.view, 'likeSelected');
|
spyOn(this.view, 'likeSelected');
|
||||||
var e = $.Event("keyup", { which: 76, target: {type: "div"} });
|
var e = $.Event("keyup", { which: Keycodes.L, target: {type: "div"} });
|
||||||
//verify that the test is correct
|
|
||||||
expect(String.fromCharCode( e.which ).toLowerCase()).toBe('l');
|
|
||||||
this.view._onHotkeyUp(e);
|
this.view._onHotkeyUp(e);
|
||||||
expect(this.view.likeSelected).toHaveBeenCalled();
|
expect(this.view.likeSelected).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("shouldn't do anything if the user types in an input field", function(){
|
it("shouldn't do anything if the user types in an input field", function(){
|
||||||
spyOn(this.view, 'likeSelected');
|
spyOn(this.view, 'likeSelected');
|
||||||
var e = $.Event("keyup", { which: 76, target: {type: "textarea"} });
|
var e = $.Event("keyup", { which: Keycodes.L, target: {type: "textarea"} });
|
||||||
//verify that the test is correct
|
|
||||||
expect(String.fromCharCode( e.which ).toLowerCase()).toBe('l');
|
|
||||||
this.view._onHotkeyUp(e);
|
this.view._onHotkeyUp(e);
|
||||||
expect(this.view.likeSelected).not.toHaveBeenCalled();
|
expect(this.view.likeSelected).not.toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
@ -112,18 +96,14 @@ describe("app.views.StreamShortcuts", function () {
|
||||||
describe("pressing 'r'", function(){
|
describe("pressing 'r'", function(){
|
||||||
it("should click on the reshare-button if not pressed in an input field", function(){
|
it("should click on the reshare-button if not pressed in an input field", function(){
|
||||||
spyOn(this.view, 'reshareSelected');
|
spyOn(this.view, 'reshareSelected');
|
||||||
var e = $.Event("keyup", { which: 82, target: {type: "div"} });
|
var e = $.Event("keyup", { which: Keycodes.R, target: {type: "div"} });
|
||||||
//verify that the test is correct
|
|
||||||
expect(String.fromCharCode( e.which ).toLowerCase()).toBe('r');
|
|
||||||
this.view._onHotkeyUp(e);
|
this.view._onHotkeyUp(e);
|
||||||
expect(this.view.reshareSelected).toHaveBeenCalled();
|
expect(this.view.reshareSelected).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("shouldn't do anything if the user types in an input field", function(){
|
it("shouldn't do anything if the user types in an input field", function(){
|
||||||
spyOn(this.view, 'reshareSelected');
|
spyOn(this.view, 'reshareSelected');
|
||||||
var e = $.Event("keyup", { which: 82, target: {type: "textarea"} });
|
var e = $.Event("keyup", { which: Keycodes.R, target: {type: "textarea"} });
|
||||||
//verify that the test is correct
|
|
||||||
expect(String.fromCharCode( e.which ).toLowerCase()).toBe('r');
|
|
||||||
this.view._onHotkeyUp(e);
|
this.view._onHotkeyUp(e);
|
||||||
expect(this.view.reshareSelected).not.toHaveBeenCalled();
|
expect(this.view.reshareSelected).not.toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
@ -132,18 +112,14 @@ describe("app.views.StreamShortcuts", function () {
|
||||||
describe("pressing 'm'", function(){
|
describe("pressing 'm'", function(){
|
||||||
it("should click on the more-button if not pressed in an input field", function(){
|
it("should click on the more-button if not pressed in an input field", function(){
|
||||||
spyOn(this.view, 'expandSelected');
|
spyOn(this.view, 'expandSelected');
|
||||||
var e = $.Event("keyup", { which: 77, target: {type: "div"} });
|
var e = $.Event("keyup", { which: Keycodes.M, target: {type: "div"} });
|
||||||
//verify that the test is correct
|
|
||||||
expect(String.fromCharCode( e.which ).toLowerCase()).toBe('m');
|
|
||||||
this.view._onHotkeyUp(e);
|
this.view._onHotkeyUp(e);
|
||||||
expect(this.view.expandSelected).toHaveBeenCalled();
|
expect(this.view.expandSelected).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("shouldn't do anything if the user types in an input field", function(){
|
it("shouldn't do anything if the user types in an input field", function(){
|
||||||
spyOn(this.view, 'expandSelected');
|
spyOn(this.view, 'expandSelected');
|
||||||
var e = $.Event("keyup", { which: 77, target: {type: "textarea"} });
|
var e = $.Event("keyup", { which: Keycodes.M, target: {type: "textarea"} });
|
||||||
//verify that the test is correct
|
|
||||||
expect(String.fromCharCode( e.which ).toLowerCase()).toBe('m');
|
|
||||||
this.view._onHotkeyUp(e);
|
this.view._onHotkeyUp(e);
|
||||||
expect(this.view.expandSelected).not.toHaveBeenCalled();
|
expect(this.view.expandSelected).not.toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
@ -152,18 +128,14 @@ describe("app.views.StreamShortcuts", function () {
|
||||||
describe("pressing 'o'", function(){
|
describe("pressing 'o'", function(){
|
||||||
it("should click on the more-button if not pressed in an input field", function(){
|
it("should click on the more-button if not pressed in an input field", function(){
|
||||||
spyOn(this.view, 'openFirstLinkSelected');
|
spyOn(this.view, 'openFirstLinkSelected');
|
||||||
var e = $.Event("keyup", { which: 79, target: {type: "div"} });
|
var e = $.Event("keyup", { which: Keycodes.O, target: {type: "div"} });
|
||||||
//verify that the test is correct
|
|
||||||
expect(String.fromCharCode( e.which ).toLowerCase()).toBe('o');
|
|
||||||
this.view._onHotkeyUp(e);
|
this.view._onHotkeyUp(e);
|
||||||
expect(this.view.openFirstLinkSelected).toHaveBeenCalled();
|
expect(this.view.openFirstLinkSelected).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("shouldn't do anything if the user types in an input field", function(){
|
it("shouldn't do anything if the user types in an input field", function(){
|
||||||
spyOn(this.view, 'openFirstLinkSelected');
|
spyOn(this.view, 'openFirstLinkSelected');
|
||||||
var e = $.Event("keyup", { which: 79, target: {type: "textarea"} });
|
var e = $.Event("keyup", { which: Keycodes.O, target: {type: "textarea"} });
|
||||||
//verify that the test is correct
|
|
||||||
expect(String.fromCharCode( e.which ).toLowerCase()).toBe('o');
|
|
||||||
this.view._onHotkeyUp(e);
|
this.view._onHotkeyUp(e);
|
||||||
expect(this.view.openFirstLinkSelected).not.toHaveBeenCalled();
|
expect(this.view.openFirstLinkSelected).not.toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
|
||||||
13
spec/javascripts/lib/keycodes_spec.js
Normal file
13
spec/javascripts/lib/keycodes_spec.js
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
describe("Keycodes", function() {
|
||||||
|
it("sets the correct keycode for letters", function() {
|
||||||
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("").forEach(function(c) {
|
||||||
|
expect(String.fromCharCode(Keycodes[c])).toBe(c);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("sets the correct keycode for digits", function() {
|
||||||
|
"0123456789".split("").forEach(function(c) {
|
||||||
|
expect(String.fromCharCode(Keycodes[c])).toBe(c);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
117
vendor/assets/javascripts/keycodes.js
vendored
117
vendor/assets/javascripts/keycodes.js
vendored
|
|
@ -1,117 +0,0 @@
|
||||||
var KEYCODES = {
|
|
||||||
BACKSPACE : 8,
|
|
||||||
TAB : 9,
|
|
||||||
ENTER : 13,
|
|
||||||
RETURN : 13,
|
|
||||||
SHIFT : 16,
|
|
||||||
CTRL : 17,
|
|
||||||
ALT : 18,
|
|
||||||
PAUSE : 19,
|
|
||||||
BREAK : 19,
|
|
||||||
CAPSLOCK : 20,
|
|
||||||
ESCAPE : 27,
|
|
||||||
ESC : 27,
|
|
||||||
SPACEBAR : 32,
|
|
||||||
SPACE: 32,
|
|
||||||
PAGEUP : 33,
|
|
||||||
PAGEDOWN : 34,
|
|
||||||
END : 35,
|
|
||||||
HOME : 36,
|
|
||||||
LEFT : 37,
|
|
||||||
UP : 38,
|
|
||||||
RIGHT : 39,
|
|
||||||
DOWN : 40,
|
|
||||||
INSERT : 45,
|
|
||||||
DEL : 46,
|
|
||||||
DELETE : 46,
|
|
||||||
0 : 48,
|
|
||||||
1 : 49,
|
|
||||||
2 : 50,
|
|
||||||
3 : 51,
|
|
||||||
4 : 52,
|
|
||||||
5 : 53,
|
|
||||||
6 : 54,
|
|
||||||
7 : 55,
|
|
||||||
8 : 56,
|
|
||||||
9 : 57,
|
|
||||||
A : 65,
|
|
||||||
B : 66,
|
|
||||||
C : 67,
|
|
||||||
D : 68,
|
|
||||||
E : 69,
|
|
||||||
F : 70,
|
|
||||||
G : 71,
|
|
||||||
H : 72,
|
|
||||||
I : 73,
|
|
||||||
J : 74,
|
|
||||||
K : 75,
|
|
||||||
L : 76,
|
|
||||||
M : 77,
|
|
||||||
N : 78,
|
|
||||||
O : 79,
|
|
||||||
P : 80,
|
|
||||||
Q : 81,
|
|
||||||
R : 82,
|
|
||||||
S : 83,
|
|
||||||
T : 84,
|
|
||||||
U : 85,
|
|
||||||
V : 86,
|
|
||||||
W : 87,
|
|
||||||
X : 88,
|
|
||||||
Y : 89,
|
|
||||||
Z : 90,
|
|
||||||
LEFTWINDOW : 91,
|
|
||||||
RIGHTWINDOW : 92,
|
|
||||||
SELECT : 93,
|
|
||||||
NUMPAD0 : 96,
|
|
||||||
NUMPAD1 : 97,
|
|
||||||
NUMPAD2 : 98,
|
|
||||||
NUMPAD3 : 99,
|
|
||||||
NUMPAD4 : 100,
|
|
||||||
NUMPAD5 : 101,
|
|
||||||
NUMPAD6 : 102,
|
|
||||||
NUMPAD7 : 103,
|
|
||||||
NUMPAD8 : 104,
|
|
||||||
NUMPAD9 : 105,
|
|
||||||
MULTIPLY : 106,
|
|
||||||
ADD : 107,
|
|
||||||
SUBTRACT : 109,
|
|
||||||
DECIMALPOINT : 110,
|
|
||||||
DIVIDE : 111,
|
|
||||||
F1 : 112,
|
|
||||||
F2 : 113,
|
|
||||||
F3 : 114,
|
|
||||||
F4 : 115,
|
|
||||||
F5 : 116,
|
|
||||||
F6 : 117,
|
|
||||||
F7 : 118,
|
|
||||||
F8 : 119,
|
|
||||||
F9 : 120,
|
|
||||||
F10 : 121,
|
|
||||||
F11 : 122,
|
|
||||||
F12 : 123,
|
|
||||||
NUMLOCK : 144,
|
|
||||||
SCROLLLOCK : 145,
|
|
||||||
SEMICOLON : 186,
|
|
||||||
EQUALSIGN : 187,
|
|
||||||
COMMA : 188,
|
|
||||||
DASH : 189,
|
|
||||||
PERIOD : 190,
|
|
||||||
FORWARDSLASH : 191,
|
|
||||||
ACCENTGRAVE : 192,
|
|
||||||
OPENBRACKET : 219,
|
|
||||||
BACKSLASH : 220,
|
|
||||||
CLOSEBRACKET : 221,
|
|
||||||
SINGLEQUOTE : 222,
|
|
||||||
isInsertion : function(keyCode){
|
|
||||||
if(keyCode <= 46 && keyCode != this.RETURN && keyCode != this.SPACEBAR){
|
|
||||||
return false;
|
|
||||||
}else if(keyCode > 90 && keyCode < 96){
|
|
||||||
return false;
|
|
||||||
}else if(keyCode >= 112 && keyCode <= 145){
|
|
||||||
return false;
|
|
||||||
}else {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
Loading…
Reference in a new issue