home · contact · privacy
Link tags everywhere to tag-filtered files listing. master
authorChristian Heller <c.heller@plomlompom.de>
Mon, 17 Feb 2025 04:45:59 +0000 (05:45 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Mon, 17 Feb 2025 04:45:59 +0000 (05:45 +0100)
src/templates/_base.tmpl
src/templates/file_data.tmpl
src/templates/files.tmpl
src/ytplom/http.py

index 62443c8087cbac91d039f0058c337bca0a9973ad..e90f9f86178db07188a771fc49501642c3126898 100644 (file)
@@ -61,16 +61,29 @@ function player_command(command) {
     });
 }
 
     });
 }
 
+function father_tag_links(parent_element, tags) {
+    tags.forEach((tag) => {
+        const a_tag = new_child_to('a', parent_element, tag);
+        a_tag.href = `?needed_tag=${encodeURIComponent(tag)}`;
+        parent_element.appendChild(document.createTextNode(' '));
+    });
+}
+
 event_handlers.push(function(data) {  // update player state
     for (const [id, text] of [
 event_handlers.push(function(data) {  // update player state
     for (const [id, text] of [
-            ["playing_tags", data.title_tags ? `(tags: ${data.title_tags})` : ""],
             ["a_playing", data.title],
             ["player_state", data.is_running ? (data.is_playing ? "playing:" : "paused:") : "stopped" + (data.title ? ':' : '')],
             ["btn_play", data.is_playing ? "pause" : "play"]]) {
             ["a_playing", data.title],
             ["player_state", data.is_running ? (data.is_playing ? "playing:" : "paused:") : "stopped" + (data.title ? ':' : '')],
             ["btn_play", data.is_playing ? "pause" : "play"]]) {
-        document.getElementById(id).textContent = text; }
+        document.getElementById(id).textContent = text;
+    }
+    const span_tags = document.getElementById("playing_tags");
+    span_tags.innerHTML = "";
+    father_tag_links(span_tags, data.title_tags);
     for (const btn of document.getElementsByClassName("btn_if_can_play")) {
     for (const btn of document.getElementsByClassName("btn_if_can_play")) {
-        btn.disabled = !data.can_play; }
-    document.getElementById("a_playing").href = data.title_digest ? `${PATH_PREFIX_FILE}${data.title_digest}` : PATH_PLAYLIST ; })
+        btn.disabled = !data.can_play;
+    }
+    document.getElementById("a_playing").href = data.title_digest ? `${PATH_PREFIX_FILE}${data.title_digest}` : PATH_PLAYLIST ;
+})
 
 {% block script %}
 {% endblock %}
 
 {% block script %}
 {% endblock %}
index 634f41a5f1723070c9c74a3ffb103134475f509c..a2eea56c70b9d77a6e6a19cd5599b08baeb74548 100644 (file)
@@ -50,7 +50,7 @@ no
 {% for tag in file.tags_showable %}
 <tr>
 <td class="tag_checkboxes"><input type="checkbox" name="tags" value="{{tag}}" checked{% if not allow_edit %} disabled{% endif %}/></td>
 {% for tag in file.tags_showable %}
 <tr>
 <td class="tag_checkboxes"><input type="checkbox" name="tags" value="{{tag}}" checked{% if not allow_edit %} disabled{% endif %}/></td>
-<td>{{tag}}</td>
+<td><a href="/{{page_names.files}}?needed_tag={{tag|urlencode}}">{{tag}}</a></td>
 </tr>
 {% endfor %}
 {% if allow_edit %}
 </tr>
 {% endfor %}
 {% if allow_edit %}
index cd7dcf1052e392093a426617f8bb7867169f2b06..88bc7a74d16ae644b1d0237551a24989a8520cb1 100644 (file)
@@ -6,7 +6,7 @@
 const PATH_FILES_JSON = "/{{page_names.files_json}}";
 
 const all_tags = {{showable_tags|tojson|safe}};
 const PATH_FILES_JSON = "/{{page_names.files_json}}";
 
 const all_tags = {{showable_tags|tojson|safe}};
-var needed_tags = [];
+var needed_tags = {{needed_tags|tojson|safe}};
 var filtered_files = [];
 
 function select_tag() {
 var filtered_files = [];
 
 function select_tag() {
@@ -64,7 +64,7 @@ async function update_files_list() {
         btn_inject.onclick = function() { player_command(`inject_${file.digest}`) };
         btn_inject.disabled = !file.present;
         btn_inject.textContent = 'inject';
         btn_inject.onclick = function() { player_command(`inject_${file.digest}`) };
         btn_inject.disabled = !file.present;
         btn_inject.textContent = 'inject';
-        new_child_to('td', tr, file.tags_showable.join(", "));
+        father_tag_links(new_child_to('td', tr), file.tags_showable);
         const td_link = new_child_to('td', tr);
         const a = new_child_to('a', td_link, file.rel_path);
         a.href = `${PATH_PREFIX_FILE}${file.digest}`;
         const td_link = new_child_to('td', tr);
         const a = new_child_to('a', td_link, file.rel_path);
         a.href = `${PATH_PREFIX_FILE}${file.digest}`;
index e1d893a496a86be6681acedbc9a34f4f924062b2..59da51cd5b20f39c4c2b79424565105d7c26a7fa 100644 (file)
@@ -256,11 +256,11 @@ class _TaskHandler(PlomHttpHandler):
                             conn, self.server.player.current_digest)
             if last_sent < self.server.player.last_update:
                 last_sent = self.server.player.last_update
                             conn, self.server.player.current_digest)
             if last_sent < self.server.player.last_update:
                 last_sent = self.server.player.last_update
-                title, tags, digest = '', '', ''
+                title, digest, tags = '', '', []
                 if selected:
                 if selected:
-                    tags = selected.tags_showable.joined
                     title = str(selected.rel_path)
                     digest = selected.digest.b64
                     title = str(selected.rel_path)
                     digest = selected.digest.b64
+                    tags = selected.tags_showable.as_str_list
                 payload['is_running'] = self.server.player.is_running
                 payload['is_playing'] = self.server.player.is_playing
                 payload['can_play'] = self.server.player.can_play
                 payload['is_running'] = self.server.player.is_running
                 payload['is_playing'] = self.server.player.is_playing
                 payload['can_play'] = self.server.player.can_play
@@ -291,8 +291,9 @@ class _TaskHandler(PlomHttpHandler):
     def _send_files_index(self) -> None:
         with DbConn() as conn:
             showable_tags = sorted(list(VideoFile.all_tags_showable(conn)))
     def _send_files_index(self) -> None:
         with DbConn() as conn:
             showable_tags = sorted(list(VideoFile.all_tags_showable(conn)))
-        self._send_rendered_template(_NAME_TEMPLATE_FILES,
-                                     {'showable_tags': showable_tags})
+        self._send_rendered_template(_NAME_TEMPLATE_FILES, {
+            'showable_tags': showable_tags,
+            'needed_tags': self.params.all_for('needed_tag')})
 
     def _send_files_json(self) -> None:
         with DbConn() as conn:
 
     def _send_files_json(self) -> None:
         with DbConn() as conn: