]> littlesong.place Git - littlesongplace.git/commitdiff
Use ajax for form submission
authorChris Fulljames <christianfulljames@gmail.com>
Wed, 19 Feb 2025 12:30:07 +0000 (07:30 -0500)
committerChris Fulljames <christianfulljames@gmail.com>
Wed, 19 Feb 2025 12:30:07 +0000 (07:30 -0500)
templates/base.html
todo.txt

index be0e150c6be1fff64ae4acddbed5a7e8ecb54606..ff091383cbf0a6ac4251181e43d91d7bc402b0a7 100644 (file)
                     return;
                 }
 
-                // Only intercept links to other pages on the site
                 var targetUrl = new URL(event.target.href);
-                var currentUrl = new URL(window.location.href);
-                if (targetUrl.origin !== currentUrl.origin) {
-                    return;  // Link to external site
+                if (urlIsOnSameSite(targetUrl)) {
+                    event.preventDefault();
+                    fetch(targetUrl, {redirect: "follow", headers: {"Accept": "application/json"}}).then(handleAjaxResponse);
                 }
-
-                event.preventDefault();
-
-                // Update HTML
-                getPageAjax(targetUrl);
-            })
-            async function getPageAjax(url) {
-                fetch(url, {redirect: "follow", headers: {"Accept": "application/json"}}).then(async (response) => {
-                    // Update URL in browser window, minus request-type field
-                    var url = new URL(response.url);
-                    url.searchParams.delete("request-type");
-                    window.history.pushState({}, "", url);
-
-                    // Get page content from JSON response
-                    var data = await response.json();
-                    document.getElementById("main").innerHTML = data.body;
-                    document.title = data.title;
-
-                    // Trigger event to signal new page has loaded
-                    var event = new Event("DOMContentLoaded");
-                    document.dispatchEvent(event);
-
-                    // Refresh navbar in case logged-in status changed
-                    updateNavbar(data.username);
+            });
+            document.addEventListener("DOMContentLoaded", (e) => {
+                document.querySelectorAll("form").forEach((form) => {
+                    console.log("found form");
+                    form.addEventListener("submit", (event) => {
+                        console.log("on submit");
+                        var targetUrl = new URL(event.target.action);
+                        if (urlIsOnSameSite(targetUrl)) {
+                            event.preventDefault();
+                            var formData = new FormData(event.target);
+                            fetch(targetUrl, {redirect: "follow", body: formData, method: event.target.method, headers: {"Accept": "application/json"}})
+                                .then(handleAjaxResponse);
+                        }
+                    });
                 });
+            });
+            function urlIsOnSameSite(targetUrl) {
+                var currentUrl = new URL(window.location.href);
+                return targetUrl.origin === currentUrl.origin;
+            }
+            async function handleAjaxResponse(response) {
+                // Update URL in browser window, minus request-type field
+                var url = new URL(response.url);
+                url.searchParams.delete("request-type");
+                window.history.pushState({}, "", url);
+
+                // Get page content from JSON response
+                var data = await response.json();
+                document.getElementById("main").innerHTML = data.body;
+                document.title = data.title;
+
+                // Trigger event to signal new page has loaded
+                var event = new Event("DOMContentLoaded");
+                document.dispatchEvent(event);
+
+                // Refresh navbar in case logged-in status changed
+                updateNavbar(data.username);
             }
             function updateNavbar(username) {
                 var loggedIn = username ? true : false;
index 5867d39ed67e33cc66b4157d6fdf58e42a0ee107..f5afb4d751cf621d4c498bfaf4e7c1270e4b2c38 100644 (file)
--- a/todo.txt
+++ b/todo.txt
@@ -1,9 +1,9 @@
 NOW
 - AJAX pages so songs can play during navigation
-    - Forms
     - Back (history stack)
     - Update page colors
     - Use correct content type header for response
+    - HTTP Error handling
 - Break up main.py, test_offline.py
 - Pinned profile playlists