diff options
| author | leiyu3 <s444814187@gmail.com> | 2025-07-17 15:51:53 -0400 |
|---|---|---|
| committer | leiyu3 <s444814187@gmail.com> | 2025-07-17 15:51:53 -0400 |
| commit | 410b700036782b10ce5b5a7324a9c2b2c16fb286 (patch) | |
| tree | c749b2d192cabd4e72c7f8dc0a89d12a2d3a4d4d /layouts | |
| parent | 0ad3aded292b86234ebb75e8403b6abd964f4d80 (diff) | |
| download | letsworship-410b700036782b10ce5b5a7324a9c2b2c16fb286.tar.gz letsworship-410b700036782b10ce5b5a7324a9c2b2c16fb286.zip | |
setlist mvp
Diffstat (limited to 'layouts')
| -rw-r--r-- | layouts/_default/baseof.html | 147 | ||||
| -rw-r--r-- | layouts/_default/home.html | 8 | ||||
| -rw-r--r-- | layouts/_default/single.html | 8 |
3 files changed, 85 insertions, 78 deletions
diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html index 9dad6a7..bdb4b03 100644 --- a/layouts/_default/baseof.html +++ b/layouts/_default/baseof.html | |||
| @@ -28,15 +28,6 @@ | |||
| 28 | </div> | 28 | </div> |
| 29 | 29 | ||
| 30 | 30 | ||
| 31 | <div id="setlist-tab">Setlist</div> | ||
| 32 | |||
| 33 | <div id="setlist-sidebar" class="hidden"> | ||
| 34 | <h6>Set List</h3> | ||
| 35 | <ul id="setlist"></ul> | ||
| 36 | <button id="add-to-setlist">+ Add Song</button> | ||
| 37 | </div> | ||
| 38 | |||
| 39 | |||
| 40 | </body> | 31 | </body> |
| 41 | 32 | ||
| 42 | <script> | 33 | <script> |
| @@ -69,6 +60,75 @@ | |||
| 69 | } | 60 | } |
| 70 | 61 | ||
| 71 | setTheme(); | 62 | setTheme(); |
| 63 | |||
| 64 | document.addEventListener("DOMContentLoaded", () => { | ||
| 65 | const setlistTab = document.getElementById("setlist-tab"); | ||
| 66 | const setlistSidebar = document.getElementById("setlist-sidebar"); | ||
| 67 | const setlistEl = document.getElementById("setlist"); | ||
| 68 | const addButton = document.getElementById("add-to-setlist"); | ||
| 69 | |||
| 70 | // Load setlist from localStorage | ||
| 71 | let setlist = JSON.parse(localStorage.getItem("setlist")) || []; | ||
| 72 | |||
| 73 | function saveSetlist() { | ||
| 74 | localStorage.setItem("setlist", JSON.stringify(setlist)); | ||
| 75 | } | ||
| 76 | |||
| 77 | function renderSetlist() { | ||
| 78 | setlistEl.innerHTML = ""; | ||
| 79 | setlist.forEach((song) => { | ||
| 80 | const li = document.createElement("li"); | ||
| 81 | |||
| 82 | const link = document.createElement("a"); | ||
| 83 | link.href = song.url; | ||
| 84 | link.textContent = song.title; | ||
| 85 | link.style.flex = "1"; | ||
| 86 | |||
| 87 | const key = document.createElement("span"); | ||
| 88 | key.textContent = `[${song.key}] `; | ||
| 89 | key.style.marginLeft = "6px"; | ||
| 90 | key.style.color = "#555"; | ||
| 91 | |||
| 92 | const removeBtn = document.createElement("button"); | ||
| 93 | removeBtn.textContent = "−"; | ||
| 94 | removeBtn.addEventListener("click", () => { | ||
| 95 | setlist = setlist.filter((s) => s.url !== song.url); | ||
| 96 | saveSetlist(); | ||
| 97 | renderSetlist(); | ||
| 98 | }); | ||
| 99 | |||
| 100 | li.appendChild(key); | ||
| 101 | li.appendChild(link); | ||
| 102 | li.appendChild(removeBtn); | ||
| 103 | setlistEl.appendChild(li); | ||
| 104 | }); | ||
| 105 | } | ||
| 106 | |||
| 107 | // Toggle sidebar | ||
| 108 | setlistTab.addEventListener("click", () => { | ||
| 109 | setlistSidebar.classList.toggle("hidden"); | ||
| 110 | }); | ||
| 111 | |||
| 112 | // Add current song | ||
| 113 | addButton.addEventListener("click", () => { | ||
| 114 | const title = document.title.split(" | ")[0]; // Adjust to your site's title format | ||
| 115 | const url = window.location.href; | ||
| 116 | const keySelector = document.getElementById("key-selector"); | ||
| 117 | const transposedKey = keySelector?.value || "C"; | ||
| 118 | |||
| 119 | const exists = setlist.some((s) => s.url === url); | ||
| 120 | if (!exists) { | ||
| 121 | // Add ?key=E or &key=E if query already exists | ||
| 122 | const urlObj = new URL(url); | ||
| 123 | urlObj.searchParams.set("key", transposedKey); | ||
| 124 | setlist.push({ title, url: urlObj.toString(), key: transposedKey }); | ||
| 125 | saveSetlist(); | ||
| 126 | renderSetlist(); | ||
| 127 | } | ||
| 128 | }); | ||
| 129 | |||
| 130 | renderSetlist(); | ||
| 131 | }); | ||
| 72 | 132 | ||
| 73 | 133 | ||
| 74 | </script> | 134 | </script> |
| @@ -161,75 +221,6 @@ document.addEventListener("DOMContentLoaded", () => { | |||
| 161 | document.body.classList.toggle("hide-chords", !toggle.checked); | 221 | document.body.classList.toggle("hide-chords", !toggle.checked); |
| 162 | }); | 222 | }); |
| 163 | }); | 223 | }); |
| 164 | |||
| 165 | document.addEventListener("DOMContentLoaded", () => { | ||
| 166 | const setlistTab = document.getElementById("setlist-tab"); | ||
| 167 | const setlistSidebar = document.getElementById("setlist-sidebar"); | ||
| 168 | const setlistEl = document.getElementById("setlist"); | ||
| 169 | const addButton = document.getElementById("add-to-setlist"); | ||
| 170 | |||
| 171 | // Load setlist from localStorage | ||
| 172 | let setlist = JSON.parse(localStorage.getItem("setlist")) || []; | ||
| 173 | |||
| 174 | function saveSetlist() { | ||
| 175 | localStorage.setItem("setlist", JSON.stringify(setlist)); | ||
| 176 | } | ||
| 177 | |||
| 178 | function renderSetlist() { | ||
| 179 | setlistEl.innerHTML = ""; | ||
| 180 | setlist.forEach((song) => { | ||
| 181 | const li = document.createElement("li"); | ||
| 182 | |||
| 183 | const link = document.createElement("a"); | ||
| 184 | link.href = song.url; | ||
| 185 | link.textContent = song.title; | ||
| 186 | link.style.flex = "1"; | ||
| 187 | |||
| 188 | const key = document.createElement("span"); | ||
| 189 | key.textContent = ` (${song.key})`; | ||
| 190 | key.style.marginLeft = "6px"; | ||
| 191 | key.style.color = "#555"; | ||
| 192 | |||
| 193 | const removeBtn = document.createElement("button"); | ||
| 194 | removeBtn.textContent = "−"; | ||
| 195 | removeBtn.addEventListener("click", () => { | ||
| 196 | setlist = setlist.filter((s) => s.url !== song.url); | ||
| 197 | saveSetlist(); | ||
| 198 | renderSetlist(); | ||
| 199 | }); | ||
| 200 | |||
| 201 | li.appendChild(link); | ||
| 202 | li.appendChild(key); | ||
| 203 | li.appendChild(removeBtn); | ||
| 204 | setlistEl.appendChild(li); | ||
| 205 | }); | ||
| 206 | } | ||
| 207 | |||
| 208 | // Toggle sidebar | ||
| 209 | setlistTab.addEventListener("click", () => { | ||
| 210 | setlistSidebar.classList.toggle("hidden"); | ||
| 211 | }); | ||
| 212 | |||
| 213 | // Add current song | ||
| 214 | addButton.addEventListener("click", () => { | ||
| 215 | const title = document.title.split(" | ")[0]; // Adjust to your site's title format | ||
| 216 | const url = window.location.href; | ||
| 217 | const keySelector = document.getElementById("key-selector"); | ||
| 218 | const transposedKey = keySelector?.value || "C"; | ||
| 219 | |||
| 220 | const exists = setlist.some((s) => s.url === url); | ||
| 221 | if (!exists) { | ||
| 222 | // Add ?key=E or &key=E if query already exists | ||
| 223 | const urlObj = new URL(url); | ||
| 224 | urlObj.searchParams.set("key", transposedKey); | ||
| 225 | setlist.push({ title, url: urlObj.toString(), key: transposedKey }); | ||
| 226 | saveSetlist(); | ||
| 227 | renderSetlist(); | ||
| 228 | } | ||
| 229 | }); | ||
| 230 | |||
| 231 | renderSetlist(); | ||
| 232 | }); | ||
| 233 | </script> | 224 | </script> |
| 234 | {{ end }} | 225 | {{ end }} |
| 235 | 226 | ||
diff --git a/layouts/_default/home.html b/layouts/_default/home.html index 52db7eb..997ed7d 100644 --- a/layouts/_default/home.html +++ b/layouts/_default/home.html | |||
| @@ -72,6 +72,14 @@ | |||
| 72 | {{ .Content }} | 72 | {{ .Content }} |
| 73 | </div> | 73 | </div> |
| 74 | 74 | ||
| 75 | <div id="setlist-tab">Setlist</div> | ||
| 76 | |||
| 77 | <div id="setlist-sidebar" class="hidden"> | ||
| 78 | <h6>Set List</h3> | ||
| 79 | <ul id="setlist"></ul> | ||
| 80 | <button id="add-to-setlist" style="display: none">+ Add Song</button> | ||
| 81 | </div> | ||
| 82 | |||
| 75 | <div class="back-to-top"> | 83 | <div class="back-to-top"> |
| 76 | <a href="#top"> | 84 | <a href="#top"> |
| 77 | back to top | 85 | back to top |
diff --git a/layouts/_default/single.html b/layouts/_default/single.html index ad55680..3c863a1 100644 --- a/layouts/_default/single.html +++ b/layouts/_default/single.html | |||
| @@ -63,6 +63,14 @@ | |||
| 63 | {{ .Content }} | 63 | {{ .Content }} |
| 64 | </div> | 64 | </div> |
| 65 | 65 | ||
| 66 | <div id="setlist-tab">Setlist</div> | ||
| 67 | |||
| 68 | <div id="setlist-sidebar" class="hidden"> | ||
| 69 | <h6>Set List</h3> | ||
| 70 | <ul id="setlist"></ul> | ||
| 71 | <button id="add-to-setlist">+ Add Song</button> | ||
| 72 | </div> | ||
| 73 | |||
| 66 | {{/* Back to top */}} | 74 | {{/* Back to top */}} |
| 67 | <div class="back-to-top"> | 75 | <div class="back-to-top"> |
| 68 | <a href="#top"> | 76 | <a href="#top"> |
