« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/content/dependencies/linkOtherReleaseOnArtistInfoPage.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/content/dependencies/linkOtherReleaseOnArtistInfoPage.js')
-rw-r--r--src/content/dependencies/linkOtherReleaseOnArtistInfoPage.js48
1 files changed, 45 insertions, 3 deletions
diff --git a/src/content/dependencies/linkOtherReleaseOnArtistInfoPage.js b/src/content/dependencies/linkOtherReleaseOnArtistInfoPage.js
index d3f7853a..ec856631 100644
--- a/src/content/dependencies/linkOtherReleaseOnArtistInfoPage.js
+++ b/src/content/dependencies/linkOtherReleaseOnArtistInfoPage.js
@@ -1,20 +1,62 @@
+import {sortAlbumsTracksChronologically, sortContributionsChronologically}
+  from '#sort';
+import {chunkArtistTrackContributions} from '#wiki-data';
+
 export default {
   contentDependencies: ['generateColorStyleAttribute'],
   extraDependencies: ['html', 'language'],
 
-  relations: (relation, track) => ({
+  query(track, artist) {
+    const relevantInfoPageChunkingContributions =
+      track.allReleases
+        .flatMap(release => [
+          ...release.artistContribs,
+          ...release.contributorContribs,
+        ])
+        .filter(c => c.artist === artist);
+
+    sortContributionsChronologically(
+      relevantInfoPageChunkingContributions,
+      sortAlbumsTracksChronologically);
+
+    const contributionChunks =
+      chunkArtistTrackContributions(relevantInfoPageChunkingContributions);
+
+    const trackChunks =
+      contributionChunks
+        .map(chunksInAlbum => chunksInAlbum
+          .map(chunksInTrack => chunksInTrack[0].thing));
+
+    const trackChunksForThisAlbum =
+      trackChunks
+        .filter(tracks => tracks[0].album === track.album);
+
+    const containingChunkIndex =
+      trackChunksForThisAlbum
+        .findIndex(tracks => tracks.includes(track));
+
+    return {containingChunkIndex};
+  },
+
+  relations: (relation, _query, track, _artist) => ({
     colorStyle:
       relation('generateColorStyleAttribute', track.album.color),
   }),
 
-  data: (track) => ({
+  data: (query, track, _artist) => ({
     albumName:
       track.album.name,
+
+    albumDirectory:
+      track.album.directory,
+
+    containingChunkIndex:
+      query.containingChunkIndex,
   }),
 
   generate: (data, relations, {html, language}) =>
     html.tag('a',
-      {href: '#'},
+      {href: `#tracks-${data.albumDirectory}-${data.containingChunkIndex}`},
       relations.colorStyle.slot('context', 'primary-only'),
       language.sanitize(data.albumName)),
 };