« get me outta code hell

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:
Diffstat (limited to 'src/data/things')
-rw-r--r--src/data/things/track.js47
1 files changed, 45 insertions, 2 deletions
diff --git a/src/data/things/track.js b/src/data/things/track.js
index 032171d0..f275b509 100644
--- a/src/data/things/track.js
+++ b/src/data/things/track.js
@@ -87,7 +87,6 @@ import {
 } from '#composite/wiki-properties';
 
 import {
-  alwaysReferenceByDirectory,
   exitWithoutUniqueCoverArt,
   inheritContributionListFromMainRelease,
   inheritFromMainRelease,
@@ -154,7 +153,51 @@ export class Track extends Thing {
       }),
     ],
 
-    alwaysReferenceByDirectory: alwaysReferenceByDirectory(),
+    // Controls how find.track works - it'll never be matched by
+    // a reference just to the track's name, which means you don't
+    // have to always reference some *other* (much more commonly
+    // referenced) track by directory instead of more naturally by name.
+    alwaysReferenceByDirectory: [
+      exposeUpdateValueOrContinue({
+        validate: input.value(isBoolean),
+      }),
+
+      withPropertyFromAlbum({
+        property: input.value('alwaysReferenceTracksByDirectory'),
+      }),
+
+      // Falsy mode means this exposes true if the album's property is true,
+      // but continues if the property is false (which is also the default).
+      exposeDependencyOrContinue({
+        dependency: '#album.alwaysReferenceTracksByDirectory',
+        mode: input.value('falsy'),
+      }),
+
+      exitWithoutDependency({
+        dependency: '_mainRelease',
+        value: input.value(false),
+      }),
+
+      exitWithoutDependency({
+        dependency: 'mainReleaseTrack',
+        value: input.value(false),
+      }),
+
+      withPropertyFromObject({
+        object: 'mainReleaseTrack',
+        property: input.value('name'),
+      }),
+
+      {
+        dependencies: ['name', '#mainReleaseTrack.name'],
+        compute: ({
+          ['name']: name,
+          ['#mainReleaseTrack.name']: mainReleaseName,
+        }) =>
+          getKebabCase(name) ===
+          getKebabCase(mainReleaseName),
+      },
+    ],
 
     // Album or track. The exposed value is really just what's provided here,
     // whether or not a matching track is found on a provided album, for