From 1c1850deadd7963a4c4e4a926b259a27a1a899c2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Stephan=20B=C3=B6sch-Plepelits?= <skunk@xover.mud.at>
Date: Thu, 28 May 2020 14:59:46 +0200
Subject: [PATCH] tagsDisplay: for tag2link tags with multiple formatters show
 selector

---
 src/category.css   | 23 +++++++++++++++++++++++
 src/tagsDisplay.js | 42 ++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 63 insertions(+), 2 deletions(-)

diff --git a/src/category.css b/src/category.css
index 93ef0d8f..31da4eb7 100644
--- a/src/category.css
+++ b/src/category.css
@@ -161,3 +161,26 @@
 .info .infoShowDetails .summary {
   display: none;
 }
+
+dl > dd {
+  position: relative;
+}
+.tag2link {
+  position: absolute;
+  top: 1em;
+  left: 0;
+  border: 1px solid black;
+  padding: 0.25em;
+  background: white;
+  z-index: 1;
+}
+.tag2link > .closeButton {
+  float: right;
+}
+.tag2link > ul {
+  padding-left: 0;
+  margin: 0;
+}
+.tag2link > ul > li {
+  list-style: none;
+}
diff --git a/src/tagsDisplay.js b/src/tagsDisplay.js
index 08a38220..687af1d3 100644
--- a/src/tagsDisplay.js
+++ b/src/tagsDisplay.js
@@ -33,6 +33,7 @@ const formatter = [
   }
 ]
 
+let tag2link
 let compiled = false
 let defaultTemplate
 
@@ -91,17 +92,54 @@ register_hook('init_callback', (initState, callback) => {
       return callback()
     }
 
-    let tag2link = JSON.parse(result.body)
+    tag2link = JSON.parse(result.body)
 
     Object.keys(tag2link).forEach(key => {
       let tag = tag2link[key]
+      let link = tag.formatter[0].link.replace('$1', '{{ value }}')
+
+      if (tag.formatter.length > 1) {
+        link = "#\" onclick=\"return tag2link(this, " + JSON.stringify(key).replace(/"/g, '&quot;') + ", {{ value|json_encode }})"
+      }
 
       formatter.push({
         regexp: new RegExp("^" + key + "$"),
-        link: tag.formatter[0].link.replace('$1', '{{ value }}')
+        link
       })
     })
 
     callback()
   })
 })
+
+global.tag2link = function (dom, key, value) {
+  let div = document.createElement('div')
+  div.className = 'tag2link'
+  dom.parentNode.appendChild(div)
+
+  let closeButton = document.createElement('div')
+  closeButton.className = 'closeButton'
+  closeButton.innerHTML = '❌'
+  closeButton.onclick = () => {
+    dom.parentNode.removeChild(div)
+  }
+  div.appendChild(closeButton)
+
+  let selector = document.createElement('ul')
+  div.appendChild(selector)
+
+  let tag = tag2link[key]
+  tag.formatter.forEach(formatter => {
+    let li = document.createElement('li')
+
+    let a = document.createElement('a')
+    a.target = '_blank'
+    a.href = formatter.link.replace('$1', value)
+    a.appendChild(document.createTextNode(formatter.operator))
+
+    li.appendChild(a)
+    selector.appendChild(li)
+  })
+
+  return false
+}