« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/common-util/search-spec.js7
-rw-r--r--src/content/dependencies/generateSearchSidebarBox.js17
-rw-r--r--src/static/css/site.css5
-rw-r--r--src/static/js/client/sidebar-search.js56
-rw-r--r--src/strings-default.yaml5
5 files changed, 87 insertions, 3 deletions
diff --git a/src/common-util/search-spec.js b/src/common-util/search-spec.js
index af5ec201..4ea0eed2 100644
--- a/src/common-util/search-spec.js
+++ b/src/common-util/search-spec.js
@@ -97,11 +97,15 @@ function baselineProcess(thing, opts) {
   fields.color =
     thing.color;
 
+  fields.disambiguator =
+    null;
+
   return fields;
 }
 
 const baselineStore = [
   'primaryName',
+  'disambiguator',
   'artwork',
   'color',
 ];
@@ -141,6 +145,9 @@ function genericProcess(thing, opts) {
       ? thing.act.name
       : null);
 
+  fields.disambiguator =
+    fields.parentName;
+
   fields.artTags =
     (thing.constructor.hasPropertyDescriptor('artTags')
       ? thing.artTags.map(artTag => artTag.nameShort)
diff --git a/src/content/dependencies/generateSearchSidebarBox.js b/src/content/dependencies/generateSearchSidebarBox.js
index 308a1105..87785906 100644
--- a/src/content/dependencies/generateSearchSidebarBox.js
+++ b/src/content/dependencies/generateSearchSidebarBox.js
@@ -58,6 +58,23 @@ export default {
               language.$(capsule, 'artTag')),
           ]),
 
+          language.encapsulate(capsule, 'resultDisambiguator', capsule => [
+            html.tag('template', {class: 'wiki-search-group-result-disambiguator-string'},
+              language.$(capsule, 'group', {
+                disambiguator: html.tag('slot', {name: 'disambiguator'}),
+              })),
+
+            html.tag('template', {class: 'wiki-search-flash-result-disambiguator-string'},
+              language.$(capsule, 'flash', {
+                disambiguator: html.tag('slot', {name: 'disambiguator'}),
+              })),
+
+            html.tag('template', {class: 'wiki-search-track-result-disambiguator-string'},
+              language.$(capsule, 'track', {
+                disambiguator: html.tag('slot', {name: 'disambiguator'}),
+              })),
+          ]),
+
           language.encapsulate(capsule, 'resultFilter', capsule => [
             html.tag('template', {class: 'wiki-search-album-result-filter-string'},
               language.$(capsule, 'album')),
diff --git a/src/static/css/site.css b/src/static/css/site.css
index f95b428d..e584f918 100644
--- a/src/static/css/site.css
+++ b/src/static/css/site.css
@@ -918,6 +918,11 @@ summary.underline-white > span:hover a:not(:hover) {
   display: inline-block;
 }
 
+.wiki-search-result-disambiguator {
+  opacity: 0.9;
+  display: inline-block;
+}
+
 .wiki-search-result-image-container {
   align-self: flex-start;
   flex-shrink: 0;
diff --git a/src/static/js/client/sidebar-search.js b/src/static/js/client/sidebar-search.js
index eae1e74e..4467766c 100644
--- a/src/static/js/client/sidebar-search.js
+++ b/src/static/js/client/sidebar-search.js
@@ -73,6 +73,10 @@ export const info = {
   groupResultKindString: null,
   tagResultKindString: null,
 
+  groupResultDisambiguatorString: null,
+  flashResultDisambiguatorString: null,
+  trackResultDisambiguatorString: null,
+
   albumResultFilterString: null,
   artistResultFilterString: null,
   flashResultFilterString: null,
@@ -196,6 +200,15 @@ export function getPageReferences() {
   info.tagResultKindString =
     findString('tag-result-kind');
 
+  info.groupResultDisambiguatorString =
+    findString('group-result-disambiguator');
+
+  info.flashResultDisambiguatorString =
+    findString('flash-result-disambiguator');
+
+  info.trackResultDisambiguatorString =
+    findString('track-result-disambiguator');
+
   info.albumResultFilterString =
     findString('album-result-filter');
 
@@ -841,7 +854,7 @@ function fillResultElements(results, {
   }
 
   for (const result of filteredResults) {
-    const el = generateSidebarSearchResult(result);
+    const el = generateSidebarSearchResult(result, filteredResults);
     if (!el) continue;
 
     info.results.appendChild(el);
@@ -890,13 +903,13 @@ function showFilterElements(results) {
   }
 }
 
-function generateSidebarSearchResult(result) {
+function generateSidebarSearchResult(result, results) {
   const preparedSlots = {
     color:
       result.data.color ?? null,
 
     name:
-      result.data.name ?? result.data.primaryName ?? null,
+      getSearchResultName(result),
 
     imageSource:
       getSearchResultImageSource(result),
@@ -961,9 +974,37 @@ function generateSidebarSearchResult(result) {
       return null;
   }
 
+  const compareReferenceType = otherResult =>
+    otherResult.referenceType === result.referenceType;
+
+  const compareName = otherResult =>
+    getSearchResultName(otherResult) === getSearchResultName(result);
+
+  const ambiguous =
+    results.some(otherResult =>
+      otherResult !== result &&
+      compareReferenceType(otherResult) &&
+      compareName(otherResult));
+
+  if (ambiguous) {
+    preparedSlots.disambiguate =
+      result.data.disambiguator;
+
+    preparedSlots.disambiguatorString =
+      info[result.referenceType + 'ResultDisambiguatorString'];
+  }
+
   return generateSidebarSearchResultTemplate(preparedSlots);
 }
 
+function getSearchResultName(result) {
+  return (
+    result.data.name ??
+    result.data.primaryName ??
+    null
+  );
+}
+
 function getSearchResultImageSource(result) {
   const {artwork} = result.data;
   if (!artwork) return null;
@@ -1039,6 +1080,15 @@ function generateSidebarSearchResultTemplate(slots) {
     }
   }
 
+  if (!accentSpan && slots.disambiguate) {
+    accentSpan = document.createElement('span');
+    accentSpan.classList.add('wiki-search-result-disambiguator');
+    accentSpan.appendChild(
+      templateContent(slots.disambiguatorString, {
+        disambiguator: slots.disambiguate,
+      }));
+  }
+
   if (!accentSpan && slots.kindString) {
     accentSpan = document.createElement('span');
     accentSpan.classList.add('wiki-search-result-kind');
diff --git a/src/strings-default.yaml b/src/strings-default.yaml
index be16ac19..93881aa2 100644
--- a/src/strings-default.yaml
+++ b/src/strings-default.yaml
@@ -857,6 +857,11 @@ misc:
       artist: "(artist)"
       group: "(group)"
 
+    resultDisambiguator:
+      group: "({DISAMBIGUATOR})"
+      flash: "(in {DISAMBIGUATOR})"
+      track: "(from {DISAMBIGUATOR})"
+
     resultFilter:
       album: "Albums"
       artTag: "Art Tags"