« get me outta code hell

content, data: Track.nameDetailWithinAlbum, directory magic, etc - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2026-05-25 07:09:39 -0300
committer(quasar) nebula <qznebula@protonmail.com>2026-05-25 07:09:39 -0300
commitd783d3bf1eb1cd501d28dff58b258708a70d7e3c (patch)
treee8896add7353110093509a4c1ceedd64f535a78d
parent44b1b14624ff3c87ae14d00b7e9f2ca34c5d63d3 (diff)
content, data: Track.nameDetailWithinAlbum, directory magic, etc
-rw-r--r--src/content/dependencies/generateAlbumSidebarTrackSection.js2
-rw-r--r--src/content/dependencies/generateAlbumTrackListItem.js2
-rw-r--r--src/content/dependencies/generateNearbyTrackList.js24
-rw-r--r--src/content/dependencies/generateTrackInfoPage.js2
-rw-r--r--src/content/dependencies/generateTrackListItem.js20
-rw-r--r--src/content/dependencies/generateTrackNavLinks.js2
-rw-r--r--src/data/things/Track.js154
7 files changed, 176 insertions, 30 deletions
diff --git a/src/content/dependencies/generateAlbumSidebarTrackSection.js b/src/content/dependencies/generateAlbumSidebarTrackSection.js
index 97941698..94785c2d 100644
--- a/src/content/dependencies/generateAlbumSidebarTrackSection.js
+++ b/src/content/dependencies/generateAlbumSidebarTrackSection.js
@@ -42,7 +42,7 @@ export default {
 
     data.trackNameDetails =
       trackSection.tracks
-        .map(track => track.nameDetail);
+        .map(track => track.nameDetailWithinAlbum);
 
     data.tracksAreMissingCommentary =
       trackSection.tracks
diff --git a/src/content/dependencies/generateAlbumTrackListItem.js b/src/content/dependencies/generateAlbumTrackListItem.js
index 7024284b..e46e9904 100644
--- a/src/content/dependencies/generateAlbumTrackListItem.js
+++ b/src/content/dependencies/generateAlbumTrackListItem.js
@@ -47,7 +47,7 @@ export default {
           ? 'auto'
           : false),
 
-      showDetail: true,
+      showDetail: 'from within album',
 
       showDuration:
         (slots.collapseDurationScope === 'track'
diff --git a/src/content/dependencies/generateNearbyTrackList.js b/src/content/dependencies/generateNearbyTrackList.js
index ebea7206..ff1c969b 100644
--- a/src/content/dependencies/generateNearbyTrackList.js
+++ b/src/content/dependencies/generateNearbyTrackList.js
@@ -1,3 +1,5 @@
+import {stitchArrays} from '#sugar';
+
 export default {
   query: (tracks, contextTrack, _contextContributions) => ({
     presentedTracks:
@@ -14,6 +16,12 @@ export default {
         .map(track => relation('generateTrackListItem', track, contextContributions)),
   }),
 
+  data: (query, _tracks, contextTrack, _contextContributions) => ({
+    presentedTracksMatchContextRelease:
+      query.presentedTracks
+        .map(track => track.album === contextTrack.album),
+  }),
+
   slots: {
     showArtists: {
       validate: v => v.is(true, false, 'auto'),
@@ -36,15 +44,25 @@ export default {
     },
   },
 
-  generate: (relations, slots, {html}) =>
+  generate: (data, relations, slots, {html}) =>
     html.tag('ul',
       {[html.onlyIfContent]: true},
 
-      relations.items.map(item =>
+      stitchArrays({
+        item: relations.items,
+        releasesMatch: data.presentedTracksMatchContextRelease,
+      }).map(({item, releasesMatch}) =>
         item.slots({
           showArtists: slots.showArtists,
           showDuration: slots.showDuration,
-          showDetail: slots.showDetail,
+
+          showDetail:
+            (slots.showDetail && releasesMatch
+              ? 'from within album'
+          : slots.showDetail
+              ? 'from across wiki'
+              : false),
+
           colorMode: slots.colorMode,
         }))),
 };
diff --git a/src/content/dependencies/generateTrackInfoPage.js b/src/content/dependencies/generateTrackInfoPage.js
index 33242b4e..8b92c1be 100644
--- a/src/content/dependencies/generateTrackInfoPage.js
+++ b/src/content/dependencies/generateTrackInfoPage.js
@@ -147,7 +147,7 @@ export default {
       track.nameStyle,
 
     nameDetail:
-      track.nameDetail,
+      track.nameDetailAcrossWiki,
 
     color:
       track.color,
diff --git a/src/content/dependencies/generateTrackListItem.js b/src/content/dependencies/generateTrackListItem.js
index c1f6ff93..ce975326 100644
--- a/src/content/dependencies/generateTrackListItem.js
+++ b/src/content/dependencies/generateTrackListItem.js
@@ -28,8 +28,11 @@ export default {
     date:
       track.date,
 
-    detail:
-      track.nameDetail,
+    nameDetailWithinAlbum:
+      track.nameDetailWithinAlbum,
+
+    nameDetailAcrossWiki:
+      track.nameDetailAcrossWiki,
 
     duration:
       track.duration ?? 0,
@@ -47,7 +50,7 @@ export default {
     },
 
     showDetail: {
-      type: 'boolean',
+      validate: v => v.is('from across wiki', 'from within album', false),
       default: false,
     },
 
@@ -124,12 +127,19 @@ export default {
             relations.trackLink
               .slot('color', slots.colorMode === 'track');
 
-          if (data.detail && slots.showDetail) {
+          const nameDetail =
+            (slots.showDetail === 'from within album'
+              ? data.nameDetailWithinAlbum
+           : slots.showDetail
+              ? data.nameDetailAcrossWiki
+              : null);
+
+          if (nameDetail) {
             workingCapsule += '.withDetail';
             workingOptions.detailAccent =
               html.tag('span', {class: 'name-detail'},
                 language.$(itemCapsule, 'withDetail', 'accent', {
-                  detail: language.sanitize(data.detail),
+                  detail: language.sanitize(nameDetail),
                 }));
           }
 
diff --git a/src/content/dependencies/generateTrackNavLinks.js b/src/content/dependencies/generateTrackNavLinks.js
index 21ba48db..55029aa4 100644
--- a/src/content/dependencies/generateTrackNavLinks.js
+++ b/src/content/dependencies/generateTrackNavLinks.js
@@ -24,7 +24,7 @@ export default {
       track.trackNumber,
 
     nameDetail:
-      track.nameDetail,
+      track.nameDetailWithinAlbum,
   }),
 
   slots: {
diff --git a/src/data/things/Track.js b/src/data/things/Track.js
index 473de163..19d111e9 100644
--- a/src/data/things/Track.js
+++ b/src/data/things/Track.js
@@ -7,7 +7,7 @@ import find, {keyRefRegex} from '#find';
 import {onlyItem} from '#sugar';
 import {sortByDate, sortFlashesChronologically} from '#sort';
 import Thing from '#thing';
-import {compareKebabCase} from '#wiki-data';
+import {compareKebabCase, getKebabCase} from '#wiki-data';
 
 import {
   anyOf,
@@ -19,6 +19,7 @@ import {
   isDate,
   isExcludingURLsReason,
   isFileExtension,
+  isString,
   validateReference,
 } from '#validators';
 
@@ -153,13 +154,11 @@ export class Track extends Thing {
       exposeConstant(V('normal')),
     ],
 
-    nameDetail: simpleString(),
-
     directory: directory({
       suffix: 'directorySuffix',
     }),
 
-    suffixDirectoryFromAlbum: [
+    suffixDirectory: [
       exposeUpdateValueOrContinue({
         validate: input.value(isBoolean),
       }),
@@ -580,6 +579,16 @@ export class Track extends Thing {
 
     // > Update only
 
+    nameDetail: {
+      flags: {update: true},
+      update: {
+        validate:
+          anyOf(
+            is('album'),
+            isString),
+      },
+    },
+
     find: soupyFind(),
     reverse: soupyReverse(),
 
@@ -593,16 +602,101 @@ export class Track extends Thing {
 
     isTrack: exposeConstant(V(true)),
 
+    nameForReferencingAcrossWiki: [
+      // When referencing without any particular context,
+      // all referenceByDirectory values except for 'normally'
+      // count against referencing by name.
+      {
+        dependencies: ['referenceByDirectory'],
+        compute: (continuation, {referenceByDirectory}) =>
+          (referenceByDirectory !== 'normally'
+            ? continuation.exit(null)
+            : continuation()),
+      },
+
+      {
+        dependencies: ['name', 'nameDetailAcrossWiki'],
+        compute: (continuation, {name, nameDetailAcrossWiki}) =>
+          (nameDetailAcrossWiki
+            ? continuation.exit(`${name} (${nameDetailAcrossWiki})`)
+            : continuation()),
+      },
+
+      exposeDependency('name'),
+    ],
+
     commentatorArtists: commentatorArtists(),
 
     directorySuffix: [
-      exitWithoutDependency('suffixDirectoryFromAlbum', {
-        value: input.value(null),
-        mode: input.value('falsy'),
-      }),
-
       withPropertyFromObject('trackSection', V('directorySuffix')),
-      exposeDependency('#trackSection.directorySuffix'),
+
+      {
+        dependencies: [
+          '_suffixDirectory',
+           'suffixDirectory',
+          '#trackSection.directorySuffix',
+        ],
+
+        compute(continuation, {
+          ['_suffixDirectory']: suffixDirectoryUpdateValue,
+          [ 'suffixDirectory']: suffixDirectoryComputedValue,
+          ['#trackSection.directorySuffix']: directorySuffixFromAlbum,
+        }) {
+          // If directly set to true or inheriting true...
+          if (suffixDirectoryComputedValue === true) {
+            return directorySuffixFromAlbum;
+          }
+
+          // If directly set to false...
+          if (suffixDirectoryUpdateValue === false) {
+            return null;
+          }
+
+          // If inheriting false or defaulting to false...
+          return continuation();
+        },
+      },
+
+      // Don't follow any "automatic" directory suffix logic if the track's
+      // entire directory is set outright.
+      {
+        dependencies: ['_directory'],
+        compute(continuation, {
+          ['_directory']: directoryUpdateValue,
+        }) {
+          if (directoryUpdateValue) {
+            return null;
+          }
+
+          return continuation();
+        },
+      },
+
+      {
+        dependencies: [
+          '_nameDetail',
+           'nameDetailAcrossWiki',
+          '#trackSection.directorySuffix',
+        ],
+
+        compute(continuation, {
+          ['_nameDetail']: nameDetail,
+          [ 'nameDetailAcrossWiki']: nameDetailAcrossWiki,
+          ['#trackSection.directorySuffix']: directorySuffixFromAlbum,
+        }) {
+          if (nameDetail === 'album') {
+            return directorySuffixFromAlbum;
+          }
+
+          if (nameDetailAcrossWiki) {
+            return getKebabCase(nameDetailAcrossWiki);
+          }
+
+          return continuation();
+        },
+      },
+
+      exposeConstant(V(null)),
     ],
 
     date: [
@@ -639,6 +733,33 @@ export class Track extends Thing {
       },
     ],
 
+    nameDetailWithinAlbum: [
+      {
+        dependencies: ['_nameDetail'],
+        compute: ({
+          ['_nameDetail']: nameDetail,
+        }) =>
+          (nameDetail === 'album'
+            ? null
+            : nameDetail),
+      },
+    ],
+
+    nameDetailAcrossWiki: [
+      withPropertyFromObject('album', V('name')),
+
+      {
+        dependencies: ['_nameDetail', '#album.name'],
+        compute: ({
+          ['_nameDetail']: nameDetail,
+          ['#album.name']: albumName,
+        }) =>
+          (nameDetail === 'album'
+            ? albumName
+            : nameDetail),
+      },
+    ],
+
     // Whether or not the track has "unique" cover artwork - a cover which is
     // specifically associated with this track in particular, rather than with
     // the track's album as a whole. This is typically used to select between
@@ -979,7 +1100,7 @@ export class Track extends Thing {
       'Name Detail': {property: 'nameDetail'},
 
       'Directory': {property: 'directory'},
-      'Suffix Directory': {property: 'suffixDirectoryFromAlbum'},
+      'Suffix Directory': {property: 'suffixDirectory'},
 
       'Reference By Directory': {property: 'referenceByDirectory'},
 
@@ -1205,11 +1326,9 @@ export class Track extends Thing {
 
       bindTo: 'trackData',
 
-      // When referencing without any particular context, all values
-      // except for 'normally' count against referencing by name.
       getMatchableNames: track =>
-        (track.referenceByDirectory === 'normally'
-          ? [track.name]
+        (track.nameForReferencingAcrossWiki
+          ? [track.nameForReferencingAcrossWiki]
           : []),
     },
 
@@ -1220,10 +1339,9 @@ export class Track extends Thing {
       include: track =>
         !CacheableObject.getUpdateValue(track, 'mainRelease'),
 
-      // This is an acontextual reference.
       getMatchableNames: track =>
-        (track.referenceByDirectory === 'normally'
-          ? [track.name]
+        (track.nameForReferencingAcrossWiki
+          ? [track.nameForReferencingAcrossWiki]
           : []),
     },