aboutsummaryrefslogtreecommitdiff
path: root/internal/ui/static/js/bootstrap.js
diff options
context:
space:
mode:
authorGravatar Frédéric Guillot <f@miniflux.net> 2023-08-10 19:46:45 -0700
committerGravatar Frédéric Guillot <f@miniflux.net> 2023-08-10 20:29:34 -0700
commit168a870c025bfef6efdeb46e166e79a16093c157 (patch)
tree4d8ab69c7e3ef03a7ade06e7b5e5053429a64c3b /internal/ui/static/js/bootstrap.js
parentc2349032552891745cbbc3d2a9e772845a0239f4 (diff)
downloadv2-168a870c025bfef6efdeb46e166e79a16093c157.tar.gz
v2-168a870c025bfef6efdeb46e166e79a16093c157.tar.zst
v2-168a870c025bfef6efdeb46e166e79a16093c157.zip
Move internal packages to an internal folder
For reference: https://go.dev/doc/go1.4#internalpackages
Diffstat (limited to 'internal/ui/static/js/bootstrap.js')
-rw-r--r--internal/ui/static/js/bootstrap.js126
1 files changed, 126 insertions, 0 deletions
diff --git a/internal/ui/static/js/bootstrap.js b/internal/ui/static/js/bootstrap.js
new file mode 100644
index 00000000..0cd878ef
--- /dev/null
+++ b/internal/ui/static/js/bootstrap.js
@@ -0,0 +1,126 @@
+document.addEventListener("DOMContentLoaded", function () {
+ handleSubmitButtons();
+
+ if (!document.querySelector("body[data-disable-keyboard-shortcuts=true]")) {
+ let keyboardHandler = new KeyboardHandler();
+ keyboardHandler.on("g u", () => goToPage("unread"));
+ keyboardHandler.on("g b", () => goToPage("starred"));
+ keyboardHandler.on("g h", () => goToPage("history"));
+ keyboardHandler.on("g f", () => goToFeedOrFeeds());
+ keyboardHandler.on("g c", () => goToPage("categories"));
+ keyboardHandler.on("g s", () => goToPage("settings"));
+ keyboardHandler.on("ArrowLeft", () => goToPrevious());
+ keyboardHandler.on("ArrowRight", () => goToNext());
+ keyboardHandler.on("k", () => goToPrevious());
+ keyboardHandler.on("p", () => goToPrevious());
+ keyboardHandler.on("j", () => goToNext());
+ keyboardHandler.on("n", () => goToNext());
+ keyboardHandler.on("h", () => goToPage("previous"));
+ keyboardHandler.on("l", () => goToPage("next"));
+ keyboardHandler.on("z t", () => scrollToCurrentItem());
+ keyboardHandler.on("o", () => openSelectedItem());
+ keyboardHandler.on("v", () => openOriginalLink());
+ keyboardHandler.on("V", () => openOriginalLink(true));
+ keyboardHandler.on("c", () => openCommentLink());
+ keyboardHandler.on("C", () => openCommentLink(true));
+ keyboardHandler.on("m", () => handleEntryStatus("next"));
+ keyboardHandler.on("M", () => handleEntryStatus("previous"));
+ keyboardHandler.on("A", () => markPageAsRead());
+ keyboardHandler.on("s", () => handleSaveEntry());
+ keyboardHandler.on("d", () => handleFetchOriginalContent());
+ keyboardHandler.on("f", () => handleBookmark());
+ keyboardHandler.on("F", () => goToFeed());
+ keyboardHandler.on("R", () => handleRefreshAllFeeds());
+ keyboardHandler.on("?", () => showKeyboardShortcuts());
+ keyboardHandler.on("+", () => goToAddSubscription());
+ keyboardHandler.on("#", () => unsubscribeFromFeed());
+ keyboardHandler.on("/", (e) => setFocusToSearchInput(e));
+ keyboardHandler.on("a", () => {
+ let enclosureElement = document.querySelector('.entry-enclosures');
+ if (enclosureElement) {
+ enclosureElement.toggleAttribute('open');
+ }
+ });
+ keyboardHandler.on("Escape", () => ModalHandler.close());
+ keyboardHandler.listen();
+ }
+
+ let touchHandler = new TouchHandler();
+ touchHandler.listen();
+
+ onClick("a[data-save-entry]", (event) => handleSaveEntry(event.target));
+ onClick("a[data-toggle-bookmark]", (event) => handleBookmark(event.target));
+ onClick("a[data-fetch-content-entry]", () => handleFetchOriginalContent());
+ onClick("a[data-action=search]", (event) => setFocusToSearchInput(event));
+ onClick("a[data-share-status]", () => handleShare());
+ onClick("a[data-action=markPageAsRead]", (event) => handleConfirmationMessage(event.target, () => markPageAsRead()));
+ onClick("a[data-toggle-status]", (event) => handleEntryStatus("next", event.target));
+
+ onClick("a[data-confirm]", (event) => handleConfirmationMessage(event.target, (url, redirectURL) => {
+ let request = new RequestBuilder(url);
+
+ request.withCallback((response) => {
+ if (redirectURL) {
+ window.location.href = redirectURL;
+ } else if (response && response.redirected && response.url) {
+ window.location.href = response.url;
+ } else {
+ window.location.reload();
+ }
+ });
+
+ request.execute();
+ }));
+
+ onClick("a[data-original-link='true']", (event) => {
+ handleEntryStatus("next", event.target, true);
+ }, true);
+ onAuxClick("a[data-original-link='true']", (event) => {
+ if (event.button == 1) {
+ handleEntryStatus("next", event.target, true);
+ }
+ }, true);
+
+ if (document.documentElement.clientWidth < 600) {
+ onClick(".logo", () => toggleMainMenu());
+ onClick(".header nav li", (event) => onClickMainMenuListItem(event));
+ }
+
+ if ("serviceWorker" in navigator) {
+ let scriptElement = document.getElementById("service-worker-script");
+ if (scriptElement) {
+ navigator.serviceWorker.register(scriptElement.src);
+ }
+ }
+
+ window.addEventListener('beforeinstallprompt', (e) => {
+ // Prevent Chrome 67 and earlier from automatically showing the prompt.
+ e.preventDefault();
+
+ let deferredPrompt = e;
+ const promptHomeScreen = document.getElementById('prompt-home-screen');
+ if (promptHomeScreen) {
+ promptHomeScreen.style.display = "block";
+
+ const btnAddToHomeScreen = document.getElementById('btn-add-to-home-screen');
+ if (btnAddToHomeScreen) {
+ btnAddToHomeScreen.addEventListener('click', (e) => {
+ e.preventDefault();
+ deferredPrompt.prompt();
+ deferredPrompt.userChoice.then(() => {
+ deferredPrompt = null;
+ promptHomeScreen.style.display = "none";
+ });
+ });
+ }
+ }
+ });
+
+ // enclosure media player position save & resume
+ const elements = document.querySelectorAll("audio[data-last-position],video[data-last-position]");
+ elements.forEach((element) => {
+ // we set the current time of media players
+ if (element.dataset.lastPosition){ element.currentTime = element.dataset.lastPosition; }
+ element.ontimeupdate = () => handlePlayerProgressionSave(element);
+ });
+});