diaspora/app/assets/javascripts/app/views/stream/shortcuts.js
Steffen van Bergerem 35aa0badc5
Refactor stream shortcuts
closes #7127
2016-09-30 01:44:24 +02:00

117 lines
3.3 KiB
JavaScript

// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
app.views.StreamShortcuts = Backbone.View.extend({
_headerSize: 60,
initialize: function() {
app.helpers.Shortcuts("keydown", this._onHotkeyDown.bind(this));
app.helpers.Shortcuts("keyup", this._onHotkeyUp.bind(this));
},
_onHotkeyDown: function(event) {
// trigger the events based on what key was pressed
switch (String.fromCharCode( event.which ).toLowerCase()) {
case "j":
this.gotoNext();
break;
case "k":
this.gotoPrev();
break;
default:
}
},
_onHotkeyUp: function(event) {
// trigger the events based on what key was pressed
switch (String.fromCharCode( event.which ).toLowerCase()) {
case "c":
this.commentSelected();
break;
case "l":
this.likeSelected();
break;
case "r":
this.reshareSelected();
break;
case "m":
this.expandSelected();
break;
case "o":
this.openFirstLinkSelected();
break;
default:
}
},
gotoNext: function() {
// select next post: take the first post under the header
var streamElements = this.$("div.stream-element.loaded");
var posUser = window.pageYOffset;
for (var i = 0; i < streamElements.length; i++) {
if (Math.round($(streamElements[i]).offset().top) > posUser + this._headerSize) {
this.selectPost(streamElements[i]);
return;
}
}
// standard: last post
if (streamElements[streamElements.length - 1]) {
this.selectPost(streamElements[streamElements.length - 1]);
}
},
gotoPrev: function() {
// select previous post: take the first post above the header
var streamElements = this.$("div.stream-element.loaded");
var posUser = window.pageYOffset;
for (var i = streamElements.length - 1; i >= 0; i--) {
if (Math.round($(streamElements[i]).offset().top) < posUser + this._headerSize) {
this.selectPost(streamElements[i]);
return;
}
}
// standard: first post
if (streamElements[0]) {
this.selectPost(streamElements[0]);
}
},
commentSelected: function() {
this.shortcutSelected().find("a.focus_comment_textarea").click();
},
likeSelected: function() {
this.shortcutSelected().find("a.like:first").click();
},
reshareSelected: function() {
this.shortcutSelected().find("a.reshare:first").click();
},
expandSelected: function() {
this.shortcutSelected().find("div.expander:first").click();
},
shortcutSelected: function() {
return this.$("div.stream-element.loaded.shortcut_selected");
},
openFirstLinkSelected: function() {
var link = $("div.collapsible a[target='_blank']:first");
if(link.length > 0) {
// click does only work with vanilla javascript
link[0].click();
}
},
selectPost: function(element){
//remove the selection and selected-class from all posts
this.shortcutSelected().removeClass("shortcut_selected").removeClass("highlighted");
//move to new post
window.scrollTo(window.pageXOffset, Math.round($(element).offset().top - this._headerSize));
//add the selection and selected-class to new post
element.className+=" shortcut_selected highlighted";
}
});
// @license-end