« get me outta code hell

content: listTracksByDate: mind order of release - 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>2025-02-19 17:14:14 -0400
committer(quasar) nebula <qznebula@protonmail.com>2025-03-02 08:24:13 -0400
commit0b44cbc30a1b9f311f9908db5a82d68f4d93febb (patch)
treeb79baeb97d4f5357625e327046ae2ebdbc78c2f5
parentc175c01397a12055082904395511ed8822536604 (diff)
content: listTracksByDate: mind order of release
-rw-r--r--src/content/dependencies/listTracksByDate.js89
1 files changed, 47 insertions, 42 deletions
diff --git a/src/content/dependencies/listTracksByDate.js b/src/content/dependencies/listTracksByDate.js
index b2cba5e6..66ca4af5 100644
--- a/src/content/dependencies/listTracksByDate.js
+++ b/src/content/dependencies/listTracksByDate.js
@@ -5,49 +5,54 @@ export default {
   contentDependencies: ['generateListingPage', 'linkAlbum', 'linkTrack'],
   extraDependencies: ['language', 'wikiData'],
 
-  sprawl({trackData}) {
-    return {trackData};
-  },
+  sprawl: ({trackData}) => ({trackData}),
 
   query({trackData}, spec) {
-    return {
-      spec,
+    const query = {spec};
+
+    query.tracks =
+      sortAlbumsTracksChronologically(
+        trackData.filter(track => track.date));
+
+    query.chunks =
+      chunkByProperties(query.tracks, ['album', 'date']);
 
-      chunks:
-        chunkByProperties(
-          sortAlbumsTracksChronologically(
-            trackData.filter(track => track.date)),
-          ['album', 'date']),
-    };
+    return query;
   },
 
-  relations(relation, query) {
-    return {
-      page: relation('generateListingPage', query.spec),
+  relations: (relation, query) => ({
+    page:
+      relation('generateListingPage', query.spec),
 
-      albumLinks:
-        query.chunks
-          .map(({album}) => relation('linkAlbum', album)),
+    albumLinks:
+      query.chunks
+        .map(({album}) => relation('linkAlbum', album)),
 
-      trackLinks:
-        query.chunks
-          .map(({chunk}) => chunk
-            .map(track => relation('linkTrack', track))),
-    };
-  },
+    trackLinks:
+      query.chunks
+        .map(({chunk}) => chunk
+          .map(track => relation('linkTrack', track))),
+  }),
 
-  data(query) {
-    return {
-      dates:
-        query.chunks
-          .map(({date}) => date),
+  data: (query) => ({
+    dates:
+      query.chunks
+        .map(({date}) => date),
 
-      secreleases:
-        query.chunks.map(({chunk}) =>
-          chunk.map(track =>
-            track.mainReleaseTrack !== null)),
-    };
-  },
+    rereleases:
+      query.chunks
+        .map(({chunk}) => chunk
+          .map(track =>
+            // Check if the index of this track...
+            query.tracks.indexOf(track) >
+            // ...is greater than the *smallest* index
+            // of any of this track's *other* releases.
+            // (It won't be greater than its own index,
+            // so we can use otherReleases here, rather
+            // than allReleases.)
+            Math.min(...
+              track.otherReleases.map(t => query.tracks.indexOf(t))))),
+  }),
 
   generate(data, relations, {language}) {
     return relations.page.slots({
@@ -65,20 +70,20 @@ export default {
       chunkRows:
         stitchArrays({
           trackLinks: relations.trackLinks,
-          secreleases: data.secreleases,
-        }).map(({trackLinks, secreleases}) =>
+          rereleases: data.rereleases,
+        }).map(({trackLinks, rereleases}) =>
             stitchArrays({
               trackLink: trackLinks,
-              secrelease: secreleases,
-            }).map(({trackLink, secrelease}) =>
-                (secrelease
+              rerelease: rereleases,
+            }).map(({trackLink, rerelease}) =>
+                (rerelease
                   ? {stringsKey: 'rerelease', track: trackLink}
                   : {track: trackLink}))),
 
       chunkRowAttributes:
-        data.secreleases.map(secreleases =>
-          secreleases.map(secrelease =>
-            (secrelease
+        data.rereleases.map(rereleases =>
+          rereleases.map(rerelease =>
+            (rerelease
               ? {class: 'rerelease'}
               : null))),
     });