From 0f04d08d130e09d521faf67d94588f97e4606e3c Mon Sep 17 00:00:00 2001
From: ArtOfCode- <hello@artofcode.co.uk>
Date: Tue, 30 Jun 2020 15:43:14 +0100
Subject: [PATCH] Display tag descriptions in selector

---
 app/assets/javascripts/tags.js | 29 +++++++++++++++++++++++++++--
 db/schema.rb                   |  2 +-
 2 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/app/assets/javascripts/tags.js b/app/assets/javascripts/tags.js
index 78ea2e368..f8ef98d40 100644
--- a/app/assets/javascripts/tags.js
+++ b/app/assets/javascripts/tags.js
@@ -1,4 +1,26 @@
 $(() => {
+  const sum = (ary) => ary.reduce((a, b) => a + b, 0);
+
+  const splitWordsMaxLength = (text, max) => {
+    const words = text.split(' ');
+    const splat = [[]];
+    words.forEach(word => {
+      if (sum(splat[splat.length - 1].map(w => w.length + 1)) > max - word.length) {
+        splat.push([]);
+      }
+      splat[splat.length - 1].push(word);
+    });
+    return splat.map(s => s.join(' '));
+  };
+
+  const template = (tag) => {
+    const tagSpan = `<span>${tag.text}</span>`;
+    const descSpan = !!tag.desc ?
+      `<br/><span class="has-color-tertiary-900 has-font-size-caption">${splitWordsMaxLength(tag.desc, 120)[0]}...</span>` :
+      '';
+    return $(tagSpan + descSpan);
+  }
+
   $('.js-tag-select').each((i, el) => {
     const $tgt = $(el);
     const useIds = $tgt.attr('data-use-ids') === 'true';
@@ -11,8 +33,11 @@ $(() => {
         },
         headers: { 'Accept': 'application/json' },
         delay: 100,
-        processResults: data => ({results: data.map(t => ({id: useIds ? t.id : t.name, text: t.name}))}),
-      }
+        processResults: data => {
+          return {results: data.map(t => ({id: useIds ? t.id : t.name, text: t.name, desc: t.excerpt}))};
+        },
+      },
+      templateResult: template
     });
   });
 
diff --git a/db/schema.rb b/db/schema.rb
index 3578990e1..2235b7b0c 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -225,7 +225,7 @@ ActiveRecord::Schema.define(version: 2020_06_30_105117) do
     t.integer "post_type_id", null: false
     t.text "body_markdown"
     t.integer "answer_count", default: 0, null: false
-    t.datetime "last_activity", default: -> { "current_timestamp()" }, null: false
+    t.datetime "last_activity", default: -> { "CURRENT_TIMESTAMP" }, null: false
     t.string "att_source"
     t.string "att_license_name"
     t.string "att_license_link"
-- 
GitLab