« get me outta code hell

data: Track: 'Name Detail: section' - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/data/things
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2026-06-10 10:32:21 -0300
committer(quasar) nebula <qznebula@protonmail.com>2026-06-10 10:32:21 -0300
commit8ac83829b4f1add4c57504210d08758e63540853 (patch)
tree1a5f793d626f51ad405d49680c254a964f3c038c /src/data/things
parent52272a8da9a798803abd1176a8294845e8567641 (diff)
data: Track: 'Name Detail: section'
Diffstat (limited to 'src/data/things')
-rw-r--r--src/data/things/Track.js39
-rw-r--r--src/data/things/album/TrackSection.js46
2 files changed, 67 insertions, 18 deletions
diff --git a/src/data/things/Track.js b/src/data/things/Track.js
index 1f7375be..f6b3346c 100644
--- a/src/data/things/Track.js
+++ b/src/data/things/Track.js
@@ -169,12 +169,12 @@ export class Track extends Thing {
           input.updateValue({
             validate:
               anyOf(
-                isBoolean,
-                is('album'),
+                is(false),
+                is('album', 'section'),
                 isDirectory,
                 strictArrayOf(
                   anyOf(
-                    is('album'),
+                    is('album', 'section'),
                     isDirectory))),
           }),
       }),
@@ -781,21 +781,37 @@ export class Track extends Thing {
         }) =>
           (nameDetail === 'album'
             ? null
+         : nameDetail === 'section'
+            ? null
             : nameDetail),
       },
     ],
 
     nameDetailAcrossWiki: [
       withPropertyFromObject('album', V('nameDetailForTracks')),
+      withPropertyFromObject('trackSection', V('nameDetailForTracks')),
 
       {
-        dependencies: ['_nameDetail', '#album.nameDetailForTracks'],
+        dependencies: [
+          '_nameDetail',
+          '#album.nameDetailForTracks',
+          '#trackSection.nameDetailForTracks',
+        ],
+
         compute: ({
-          ['_nameDetail']: nameDetail,
-          ['#album.nameDetailForTracks']: nameDetailFromAlbum,
+          ['_nameDetail']:
+            nameDetail,
+
+          ['#album.nameDetailForTracks']:
+            albumNameDetailForTracks,
+
+          ['#trackSection.nameDetailForTracks']:
+            trackSectionNameDetailForTracks,
         }) =>
           (nameDetail === 'album'
-            ? nameDetailFromAlbum
+            ? albumNameDetailForTracks
+         : nameDetail === 'section'
+            ? trackSectionNameDetailForTracks
             : nameDetail),
       },
     ],
@@ -1062,7 +1078,14 @@ export class Track extends Thing {
       'Name Detail': {property: 'nameDetail'},
 
       'Directory': {property: 'directory'},
-      'Suffix Directory': {property: 'suffixDirectory'},
+
+      'Suffix Directory': {
+        property: 'suffixDirectory',
+        transform: value =>
+          (value === true
+            ? 'album'
+            : value),
+      },
 
       'Reference By Directory': {property: 'referenceByDirectory'},
 
diff --git a/src/data/things/album/TrackSection.js b/src/data/things/album/TrackSection.js
index 00963d1b..0e6adb6d 100644
--- a/src/data/things/album/TrackSection.js
+++ b/src/data/things/album/TrackSection.js
@@ -13,6 +13,7 @@ import {
   isDirectory,
   isExcludingURLsReason,
   isNumber,
+  isString,
 } from '#validators';
 
 import {withLengthOfList, withNearbyItemFromList, withPropertyFromObject}
@@ -48,6 +49,22 @@ export class TrackSection extends Thing {
 
     name: name(V('Unnamed Track Section')),
 
+    // Track sections don't have a Name Detail themselves, but they do provide
+    // a value which tracks can reference via 'Name Detail: section'.
+    nameDetailForTracks: {
+      flags: {update: true, expose: true},
+
+      update: {validate: isString},
+
+      expose: {
+        dependencies: ['name'],
+        transform: (value, {name}) =>
+          (value
+            ? value
+            : name),
+      },
+    },
+
     unqualifiedDirectory: directory(),
 
     directorySuffixForTracks: [
@@ -55,18 +72,25 @@ export class TrackSection extends Thing {
         validate: input.value(isDirectory),
       }),
 
-      withPropertyFromObject('album', V('directorySuffixForTracks')),
-      exposeDependency('#album.directorySuffixForTracks'),
+      {
+        dependencies: ['unqualifiedDirectory', 'name', 'nameDetailForTracks'],
+        compute: ({unqualifiedDirectory, name, nameDetailForTracks}) =>
+          (nameDetailForTracks === name
+            ? unqualifiedDirectory
+            : getKebabCase(nameDetailForTracks)),
+      },
     ],
 
-    suffixTrackDirectoriesByDefault: [
-      exposeUpdateValueOrContinue({
-        validate: input.value(isBoolean),
-      }),
-
-      withPropertyFromObject('album', V('suffixTrackDirectoriesByDefault')),
-      exposeDependency('#album.suffixTrackDirectoriesByDefault'),
-    ],
+    // Not quite a flag, because it supports (and defaults to) null.
+    // The value false means to explicitly ignore that the album is
+    // providing Suffix Track Directories: true. The value true means
+    // to use the TRACK SECTION's own directory suffix. The value null
+    // defers to the album's suffixTrackDirectoriesByDefault, which is
+    // simply true or false.
+    suffixTrackDirectoriesByDefault: {
+      flags: {expose: true, update: true},
+      update: {validate: isBoolean},
+    },
 
     color: [
       exposeUpdateValueOrContinue({
@@ -204,6 +228,8 @@ export class TrackSection extends Thing {
   static [Thing.yamlDocumentSpec] = {
     fields: {
       'Section': {property: 'name'},
+      'Name Detail For Tracks': {property: 'nameDetailForTracks'},
+
       'Directory Suffix': {property: 'directorySuffixForTracks'},
       'Suffix Track Directories': {property: 'suffixTrackDirectoriesByDefault'},