aboutsummaryrefslogtreecommitdiffhomepage
path: root/ui
diff options
context:
space:
mode:
authorGravatar Frédéric Guillot <fred@miniflux.net>2019-04-28 18:20:46 -0700
committerGravatar fguillot <fred@miniflux.net>2019-04-28 18:35:58 -0700
commit4295a86e55e765e3e396a03c090bd08be9e0a390 (patch)
tree77b388feb1ec345c3823b7c7338ab8d293ff3b77 /ui
parent3c8cc0b2b69c8de7343dfbec0e22934c954487df (diff)
Add option to enable/disable keyboard shortcuts
Diffstat (limited to 'ui')
-rw-r--r--ui/form/settings.go31
-rw-r--r--ui/settings_show.go11
-rw-r--r--ui/static/js.go5
-rw-r--r--ui/static/js/bootstrap.js63
-rw-r--r--ui/static/js/keyboard_handler.js1
5 files changed, 59 insertions, 52 deletions
diff --git a/ui/form/settings.go b/ui/form/settings.go
index 0377f5f..8b4d7e6 100644
--- a/ui/form/settings.go
+++ b/ui/form/settings.go
@@ -13,13 +13,14 @@ import (
// SettingsForm represents the settings form.
type SettingsForm struct {
- Username string
- Password string
- Confirmation string
- Theme string
- Language string
- Timezone string
- EntryDirection string
+ Username string
+ Password string
+ Confirmation string
+ Theme string
+ Language string
+ Timezone string
+ EntryDirection string
+ KeyboardShortcuts bool
}
// Merge updates the fields of the given user.
@@ -29,6 +30,7 @@ func (s *SettingsForm) Merge(user *model.User) *model.User {
user.Language = s.Language
user.Timezone = s.Timezone
user.EntryDirection = s.EntryDirection
+ user.KeyboardShortcuts = s.KeyboardShortcuts
if s.Password != "" {
user.Password = s.Password
@@ -64,12 +66,13 @@ func (s *SettingsForm) Validate() error {
// NewSettingsForm returns a new SettingsForm.
func NewSettingsForm(r *http.Request) *SettingsForm {
return &SettingsForm{
- Username: r.FormValue("username"),
- Password: r.FormValue("password"),
- Confirmation: r.FormValue("confirmation"),
- Theme: r.FormValue("theme"),
- Language: r.FormValue("language"),
- Timezone: r.FormValue("timezone"),
- EntryDirection: r.FormValue("entry_direction"),
+ Username: r.FormValue("username"),
+ Password: r.FormValue("password"),
+ Confirmation: r.FormValue("confirmation"),
+ Theme: r.FormValue("theme"),
+ Language: r.FormValue("language"),
+ Timezone: r.FormValue("timezone"),
+ EntryDirection: r.FormValue("entry_direction"),
+ KeyboardShortcuts: r.FormValue("keyboard_shortcuts") == "1",
}
}
diff --git a/ui/settings_show.go b/ui/settings_show.go
index 39d85ca..2803dc4 100644
--- a/ui/settings_show.go
+++ b/ui/settings_show.go
@@ -27,11 +27,12 @@ func (h *handler) showSettingsPage(w http.ResponseWriter, r *http.Request) {
}
settingsForm := form.SettingsForm{
- Username: user.Username,
- Theme: user.Theme,
- Language: user.Language,
- Timezone: user.Timezone,
- EntryDirection: user.EntryDirection,
+ Username: user.Username,
+ Theme: user.Theme,
+ Language: user.Language,
+ Timezone: user.Timezone,
+ EntryDirection: user.EntryDirection,
+ KeyboardShortcuts: user.KeyboardShortcuts,
}
timezones, err := h.store.Timezones()
diff --git a/ui/static/js.go b/ui/static/js.go
index 1137cbc..9934eee 100644
--- a/ui/static/js.go
+++ b/ui/static/js.go
@@ -98,13 +98,14 @@ break;}}}
isEntry(){return document.querySelector("section.entry")!==null;}
isListView(){return document.querySelector(".items")!==null;}}
class LinkStateHandler{static flip(element){let labelElement=document.createElement("span");labelElement.className="link-flipped-state";labelElement.appendChild(document.createTextNode(element.dataset.labelNewState));element.parentNode.appendChild(labelElement);element.parentNode.removeChild(element);}}
-document.addEventListener("DOMContentLoaded",function(){FormHandler.handleSubmitButtons();let navHandler=new NavHandler();let keyboardHandler=new KeyboardHandler();keyboardHandler.on("g u",()=>navHandler.goToPage("unread"));keyboardHandler.on("g b",()=>navHandler.goToPage("starred"));keyboardHandler.on("g h",()=>navHandler.goToPage("history"));keyboardHandler.on("g f",()=>navHandler.goToFeedOrFeeds());keyboardHandler.on("g c",()=>navHandler.goToPage("categories"));keyboardHandler.on("g s",()=>navHandler.goToPage("settings"));keyboardHandler.on("ArrowLeft",()=>navHandler.goToPrevious());keyboardHandler.on("ArrowRight",()=>navHandler.goToNext());keyboardHandler.on("j",()=>navHandler.goToPrevious());keyboardHandler.on("p",()=>navHandler.goToPrevious());keyboardHandler.on("k",()=>navHandler.goToNext());keyboardHandler.on("n",()=>navHandler.goToNext());keyboardHandler.on("h",()=>navHandler.goToPage("previous"));keyboardHandler.on("l",()=>navHandler.goToPage("next"));keyboardHandler.on("o",()=>navHandler.openSelectedItem());keyboardHandler.on("v",()=>navHandler.openOriginalLink());keyboardHandler.on("m",()=>navHandler.toggleEntryStatus());keyboardHandler.on("A",()=>{let element=document.querySelector("a[data-on-click=markPageAsRead]");navHandler.markPageAsRead(element.dataset.showOnlyUnread||false);});keyboardHandler.on("s",()=>navHandler.saveEntry());keyboardHandler.on("d",()=>navHandler.fetchOriginalContent());keyboardHandler.on("f",()=>navHandler.toggleBookmark());keyboardHandler.on("?",()=>navHandler.showKeyboardShortcuts());keyboardHandler.on("#",()=>navHandler.unsubscribeFromFeed());keyboardHandler.on("/",(e)=>navHandler.setFocusToSearchInput(e));keyboardHandler.on("Escape",()=>ModalHandler.close());keyboardHandler.listen();let touchHandler=new TouchHandler(navHandler);touchHandler.listen();let mouseHandler=new MouseHandler();mouseHandler.onClick("a[data-save-entry]",(event)=>{EntryHandler.saveEntry(event.target);});mouseHandler.onClick("a[data-toggle-bookmark]",(event)=>{EntryHandler.toggleBookmark(event.target);});mouseHandler.onClick("a[data-toggle-status]",(event)=>{let currentItem=DomHelper.findParent(event.target,"entry");if(!currentItem){currentItem=DomHelper.findParent(event.target,"item");}
+document.addEventListener("DOMContentLoaded",function(){FormHandler.handleSubmitButtons();let navHandler=new NavHandler();if(!document.querySelector("body[data-disable-keyboard-shortcuts=true]")){let keyboardHandler=new KeyboardHandler();keyboardHandler.on("g u",()=>navHandler.goToPage("unread"));keyboardHandler.on("g b",()=>navHandler.goToPage("starred"));keyboardHandler.on("g h",()=>navHandler.goToPage("history"));keyboardHandler.on("g f",()=>navHandler.goToFeedOrFeeds());keyboardHandler.on("g c",()=>navHandler.goToPage("categories"));keyboardHandler.on("g s",()=>navHandler.goToPage("settings"));keyboardHandler.on("ArrowLeft",()=>navHandler.goToPrevious());keyboardHandler.on("ArrowRight",()=>navHandler.goToNext());keyboardHandler.on("j",()=>navHandler.goToPrevious());keyboardHandler.on("p",()=>navHandler.goToPrevious());keyboardHandler.on("k",()=>navHandler.goToNext());keyboardHandler.on("n",()=>navHandler.goToNext());keyboardHandler.on("h",()=>navHandler.goToPage("previous"));keyboardHandler.on("l",()=>navHandler.goToPage("next"));keyboardHandler.on("o",()=>navHandler.openSelectedItem());keyboardHandler.on("v",()=>navHandler.openOriginalLink());keyboardHandler.on("m",()=>navHandler.toggleEntryStatus());keyboardHandler.on("A",()=>{let element=document.querySelector("a[data-on-click=markPageAsRead]");navHandler.markPageAsRead(element.dataset.showOnlyUnread||false);});keyboardHandler.on("s",()=>navHandler.saveEntry());keyboardHandler.on("d",()=>navHandler.fetchOriginalContent());keyboardHandler.on("f",()=>navHandler.toggleBookmark());keyboardHandler.on("?",()=>navHandler.showKeyboardShortcuts());keyboardHandler.on("#",()=>navHandler.unsubscribeFromFeed());keyboardHandler.on("/",(e)=>navHandler.setFocusToSearchInput(e));keyboardHandler.on("Escape",()=>ModalHandler.close());keyboardHandler.listen();}
+let touchHandler=new TouchHandler(navHandler);touchHandler.listen();let mouseHandler=new MouseHandler();mouseHandler.onClick("a[data-save-entry]",(event)=>{EntryHandler.saveEntry(event.target);});mouseHandler.onClick("a[data-toggle-bookmark]",(event)=>{EntryHandler.toggleBookmark(event.target);});mouseHandler.onClick("a[data-toggle-status]",(event)=>{let currentItem=DomHelper.findParent(event.target,"entry");if(!currentItem){currentItem=DomHelper.findParent(event.target,"item");}
if(currentItem){EntryHandler.toggleEntryStatus(currentItem);}});mouseHandler.onClick("a[data-fetch-content-entry]",(event)=>{EntryHandler.fetchOriginalContent(event.target);});mouseHandler.onClick("a[data-on-click=markPageAsRead]",(event)=>{navHandler.markPageAsRead(event.target.dataset.showOnlyUnread||false);});mouseHandler.onClick("a[data-confirm]",(event)=>{(new ConfirmHandler()).handle(event);});mouseHandler.onClick("a[data-action=search]",(event)=>{navHandler.setFocusToSearchInput(event);});mouseHandler.onClick("a[data-link-state=flip]",(event)=>{LinkStateHandler.flip(event.target);},true);if(document.documentElement.clientWidth<600){let menuHandler=new MenuHandler();mouseHandler.onClick(".logo",()=>menuHandler.toggleMainMenu());mouseHandler.onClick(".header nav li",(event)=>menuHandler.clickMenuListItem(event));}
if("serviceWorker"in navigator){let scriptElement=document.getElementById("service-worker-script");if(scriptElement){navigator.serviceWorker.register(scriptElement.src);}}});})();`,
"sw": `'use strict';self.addEventListener("fetch",(event)=>{if(event.request.url.includes("/feed/icon/")){event.respondWith(caches.open("feed_icons").then((cache)=>{return cache.match(event.request).then((response)=>{return response||fetch(event.request).then((response)=>{cache.put(event.request,response.clone());return response;});});}));}});`,
}
var JavascriptsChecksums = map[string]string{
- "app": "a3b8e1f0b369fc0d543a67ee714bcdcbe5823bab0978118580e95e6c5cdecd2b",
+ "app": "fc9e4a86bde34308c169039227376cf2dfe7311ce4bf06c9a417316714bab273",
"sw": "55fffa223919cc18572788fb9c62fccf92166c0eb5d3a1d6f91c31f24d020be9",
}
diff --git a/ui/static/js/bootstrap.js b/ui/static/js/bootstrap.js
index a6952ee..bf7a690 100644
--- a/ui/static/js/bootstrap.js
+++ b/ui/static/js/bootstrap.js
@@ -2,36 +2,39 @@ document.addEventListener("DOMContentLoaded", function() {
FormHandler.handleSubmitButtons();
let navHandler = new NavHandler();
- let keyboardHandler = new KeyboardHandler();
- keyboardHandler.on("g u", () => navHandler.goToPage("unread"));
- keyboardHandler.on("g b", () => navHandler.goToPage("starred"));
- keyboardHandler.on("g h", () => navHandler.goToPage("history"));
- keyboardHandler.on("g f", () => navHandler.goToFeedOrFeeds());
- keyboardHandler.on("g c", () => navHandler.goToPage("categories"));
- keyboardHandler.on("g s", () => navHandler.goToPage("settings"));
- keyboardHandler.on("ArrowLeft", () => navHandler.goToPrevious());
- keyboardHandler.on("ArrowRight", () => navHandler.goToNext());
- keyboardHandler.on("j", () => navHandler.goToPrevious());
- keyboardHandler.on("p", () => navHandler.goToPrevious());
- keyboardHandler.on("k", () => navHandler.goToNext());
- keyboardHandler.on("n", () => navHandler.goToNext());
- keyboardHandler.on("h", () => navHandler.goToPage("previous"));
- keyboardHandler.on("l", () => navHandler.goToPage("next"));
- keyboardHandler.on("o", () => navHandler.openSelectedItem());
- keyboardHandler.on("v", () => navHandler.openOriginalLink());
- keyboardHandler.on("m", () => navHandler.toggleEntryStatus());
- keyboardHandler.on("A", () => {
- let element = document.querySelector("a[data-on-click=markPageAsRead]");
- navHandler.markPageAsRead(element.dataset.showOnlyUnread || false);
- });
- keyboardHandler.on("s", () => navHandler.saveEntry());
- keyboardHandler.on("d", () => navHandler.fetchOriginalContent());
- keyboardHandler.on("f", () => navHandler.toggleBookmark());
- keyboardHandler.on("?", () => navHandler.showKeyboardShortcuts());
- keyboardHandler.on("#", () => navHandler.unsubscribeFromFeed());
- keyboardHandler.on("/", (e) => navHandler.setFocusToSearchInput(e));
- keyboardHandler.on("Escape", () => ModalHandler.close());
- keyboardHandler.listen();
+
+ if (! document.querySelector("body[data-disable-keyboard-shortcuts=true]")) {
+ let keyboardHandler = new KeyboardHandler();
+ keyboardHandler.on("g u", () => navHandler.goToPage("unread"));
+ keyboardHandler.on("g b", () => navHandler.goToPage("starred"));
+ keyboardHandler.on("g h", () => navHandler.goToPage("history"));
+ keyboardHandler.on("g f", () => navHandler.goToFeedOrFeeds());
+ keyboardHandler.on("g c", () => navHandler.goToPage("categories"));
+ keyboardHandler.on("g s", () => navHandler.goToPage("settings"));
+ keyboardHandler.on("ArrowLeft", () => navHandler.goToPrevious());
+ keyboardHandler.on("ArrowRight", () => navHandler.goToNext());
+ keyboardHandler.on("j", () => navHandler.goToPrevious());
+ keyboardHandler.on("p", () => navHandler.goToPrevious());
+ keyboardHandler.on("k", () => navHandler.goToNext());
+ keyboardHandler.on("n", () => navHandler.goToNext());
+ keyboardHandler.on("h", () => navHandler.goToPage("previous"));
+ keyboardHandler.on("l", () => navHandler.goToPage("next"));
+ keyboardHandler.on("o", () => navHandler.openSelectedItem());
+ keyboardHandler.on("v", () => navHandler.openOriginalLink());
+ keyboardHandler.on("m", () => navHandler.toggleEntryStatus());
+ keyboardHandler.on("A", () => {
+ let element = document.querySelector("a[data-on-click=markPageAsRead]");
+ navHandler.markPageAsRead(element.dataset.showOnlyUnread || false);
+ });
+ keyboardHandler.on("s", () => navHandler.saveEntry());
+ keyboardHandler.on("d", () => navHandler.fetchOriginalContent());
+ keyboardHandler.on("f", () => navHandler.toggleBookmark());
+ keyboardHandler.on("?", () => navHandler.showKeyboardShortcuts());
+ keyboardHandler.on("#", () => navHandler.unsubscribeFromFeed());
+ keyboardHandler.on("/", (e) => navHandler.setFocusToSearchInput(e));
+ keyboardHandler.on("Escape", () => ModalHandler.close());
+ keyboardHandler.listen();
+ }
let touchHandler = new TouchHandler(navHandler);
touchHandler.listen();
diff --git a/ui/static/js/keyboard_handler.js b/ui/static/js/keyboard_handler.js
index bc5708c..ecf1f44 100644
--- a/ui/static/js/keyboard_handler.js
+++ b/ui/static/js/keyboard_handler.js
@@ -64,5 +64,4 @@ class KeyboardHandler {
return event.key;
}
-
}