From 6bb0114d4601554ee157458564328065389216c6 Mon Sep 17 00:00:00 2001
From: Roel Kluin <r.o.e.lkluin@gmail.com>
Date: Wed, 7 Jun 2023 00:02:55 +0200
Subject: [PATCH] fix that tags were not actually stored

---
 javascript/tagger.js | 81 +++++++++++++++++++++++++++++++++-----------
 1 file changed, 61 insertions(+), 20 deletions(-)

diff --git a/javascript/tagger.js b/javascript/tagger.js
index 5757995..1927b37 100644
--- a/javascript/tagger.js
+++ b/javascript/tagger.js
@@ -45,18 +45,22 @@ document.addEventListener('DOMContentLoaded', () => {
         // option texts
         waitQuerySelector('#additional-tags'),
         waitQuerySelector('#exclude-tags'),
+        waitQuerySelector('#search-tags'),
+        waitQuerySelector('#replace-tags'),
 
         // tag-confident labels
         waitQuerySelector('#rating-confidents'),
         waitQuerySelector('#tag-confidents')
     ]).then(elements => {
 
-        const $additionalTags = elements[0].querySelector('textarea')
-        const $excludeTags = elements[1].querySelector('textarea')
-        const $ratingConfidents = elements[2]
-        const $tagConfidents = elements[3]
+        const $additionalTags = elements[0];
+        const $excludeTags = elements[1];
+        const $searchTags = elements[2];
+        const $replaceTags = elements[3];
+        const $ratingConfidents = elements[4];
+        const $tagConfidents = elements[5];
 
-        let $selectedTextarea = $additionalTags
+        let $selectedTextarea = $additionalTags;
 
         /**
          * @this {HTMLElement}
@@ -64,11 +68,13 @@ document.addEventListener('DOMContentLoaded', () => {
          * @listens document#click
          */
         function onClickTextarea(e) {
-            $selectedTextarea = this
+            $selectedTextarea = this;
         }
 
-        $additionalTags.addEventListener('click', onClickTextarea)
-        $excludeTags.addEventListener('click', onClickTextarea)
+        $additionalTags.addEventListener('click', onClickTextarea);
+        $excludeTags.addEventListener('click', onClickTextarea);
+        $searchTags.addEventListener('click', onClickTextarea);
+        $replaceTags.addEventListener('click', onClickTextarea);
 
         /**
          * @this {HTMLElement}
@@ -77,23 +83,58 @@ document.addEventListener('DOMContentLoaded', () => {
          */
         function onClickLabels(e) {
             // find clicked label item's wrapper element
-            const tag = e.target.innerText;
-            if (tag.endsWith('%')) {
-                return
+            let tag = e.target.innerText;
+
+            // when clicking unlucky, you get all tags and percentages. Prevent inserting those here.
+            const multiTag = new RegExp(`\\n.*\\n`);
+            if (tag.match(multiTag)) {
+                return;
             }
 
-            // ignore if tag is already exist in textbox
-            const escapedTag = tag.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
-            const pattern = new RegExp(`(^|,)\\s{0,}${escapedTag}\\s{0,}($|,)`)
-            if (pattern.test($selectedTextarea.value)) {
-                return
+            // when clicking on the dotted line or the percentage, you get the percentage as well. Don't include it in the tags.
+            // use this fact to choose whether to insert in positive or negative. May require some getting used to, but saves
+            // having to select the input field.
+            const pctPattern = new RegExp(`\\n?([0-9.]+)%$`);
+            let percentage = tag.match(pctPattern);
+            if (percentage) {
+                tag = tag.replace(pctPattern, '');
+                if (tag == '') {
+                    //percentage = percentage[1];
+                    // could trigger a set Thresold value event
+                    return;
+                }
+                // when clicking on athe dotted line, insert in either the exclude or replace list
+                // when not clicking on the dotted line, insert in the additingal or search list
+                if ($selectedTextarea == $additionalTags) {
+                    $selectedTextarea = $excludeTags;
+                } else if ($selectedTextarea == $searchTags) {
+                    $selectedTextarea = $replaceTags;
+                }
+            } else if ($selectedTextarea == $excludeTags) {
+                $selectedTextarea = $additionalTags;
+            } else if ($selectedTextarea == $replaceTags) {
+                $selectedTextarea = $searchTags;
+            }
+
+            let value = $selectedTextarea.querySelector('textarea').value;
+            if ($selectedTextarea != $replaceTags) {
+                // ignore if tag is already exist in textbox
+                const escapedTag = tag.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
+                const pattern = new RegExp(`(^|,)\\s{0,}${escapedTag}\\s{0,}($|,)`);
+                if (pattern.test(value)) {
+                    return;
+                }
             }
 
-            if ($selectedTextarea.value !== '') {
-                $selectedTextarea.value += ', '
+            // besides setting the value an event needs to be triggered or the value isn't actually stored.
+            const spaceOrAlreadyWithComma = new RegExp(`(^|.*,)\\s*$`);
+            if (!spaceOrAlreadyWithComma.test(value)) {
+                value += ', ';
             }
+            const input_event = new Event('input');
+            $selectedTextarea.querySelector('textarea').value = value + tag;
+            $selectedTextarea.querySelector('textarea').dispatchEvent(input_event);
 
-            $selectedTextarea.value += tag
         }
 
         $ratingConfidents.addEventListener('click', onClickLabels)
@@ -102,4 +143,4 @@ document.addEventListener('DOMContentLoaded', () => {
     }).catch(err => {
         console.error(err)
     })
-})
\ No newline at end of file
+})