« 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/generateArtistInfoPageTracksChunk.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/content/dependencies/generateArtistInfoPageTracksChunk.js')
-rw-r--r--src/content/dependencies/generateArtistInfoPageTracksChunk.js92
1 files changed, 83 insertions, 9 deletions
diff --git a/src/content/dependencies/generateArtistInfoPageTracksChunk.js b/src/content/dependencies/generateArtistInfoPageTracksChunk.js
index 7d00fdd6..50278271 100644
--- a/src/content/dependencies/generateArtistInfoPageTracksChunk.js
+++ b/src/content/dependencies/generateArtistInfoPageTracksChunk.js
@@ -2,24 +2,70 @@ import {sortAlbumsTracksChronologically} from '#sort';
 import {empty, unique} from '#sugar';
 import {getTotalDuration} from '#wiki-data';
 
+function countTowardTotals(contribs) {
+  const track = contribs[0].thing;
+
+  if (track.isSecondaryRelease) {
+    const all =
+      Object.fromEntries(
+        unique(contribs.map(contrib => contrib.thingProperty))
+          .map(prop => [
+            prop,
+            track.mainReleaseTrack[prop].slice(),
+          ]));
+
+    contribs = contribs.flatMap(a => {
+      const array = all[a.thingProperty];
+      const index =
+        array.findIndex(b =>
+          b.artist === a.artist &&
+          b.annotation === a.annotation);
+
+      if (index === -1) return [];
+      return array.splice(index, 1);
+    }).filter(Boolean);
+  }
+
+  return contribs.some(contrib =>
+    contrib.countInContributionTotals ||
+    contrib.countInDurationTotals);
+}
+
 export default {
-  relations: (relation, artist, album, trackContribLists) => ({
+  query: (_artist, _album, trackContribLists) => ({
+    contribListsCountingTowardTotals:
+      trackContribLists
+        .filter(contribs => countTowardTotals(contribs)),
+
+    contribListsNotCountingTowardTotals:
+      trackContribLists
+        .filter(contribs => !countTowardTotals(contribs)),
+  }),
+
+  relations: (relation, query, artist, album, _trackContribLists) => ({
     template:
       relation('generateArtistInfoPageChunk'),
 
     albumLink:
       relation('linkAlbum', album),
 
-    // Intentional mapping here: each item may be associated with
-    // more than one contribution.
-    items:
-      trackContribLists.map(trackContribs =>
+    albumArtistCredit:
+      relation('generateArtistCredit', album.artistContribs, []),
+
+    itemsCountingTowardTotals:
+      query.contribListsCountingTowardTotals.map(trackContribs =>
+        relation('generateArtistInfoPageTracksChunkItem',
+          artist,
+          trackContribs)),
+
+    itemsNotCountingTowardTotals:
+      query.contribListsNotCountingTowardTotals.map(trackContribs =>
         relation('generateArtistInfoPageTracksChunkItem',
           artist,
           trackContribs)),
   }),
 
-  data(artist, album, trackContribLists) {
+  data(artist, _query, album, trackContribLists) {
     const data = {};
 
     const contribs =
@@ -71,10 +117,28 @@ export default {
     return data;
   },
 
-  generate: (data, relations, {html}) =>
+  generate: (data, relations, {html, language}) =>
     relations.template.slots({
       mode: 'album',
-      link: relations.albumLink,
+
+      link:
+        language.encapsulate('artistPage.creditList.album', workingCapsule => {
+          const creditCapsule = workingCapsule + '.credit';
+          const workingOptions = {album: relations.albumLink};
+
+          relations.albumArtistCredit.setSlots({
+            normalStringKey: creditCapsule + '.by',
+          });
+
+          if (!html.isBlank(relations.albumArtistCredit)) {
+            workingCapsule += '.withCredit';
+            workingOptions.credit =
+              html.tag('span', {class: 'by'},
+                relations.albumArtistCredit);
+          }
+
+          return language.$(workingCapsule, workingOptions);
+        }),
 
       dates: data.dates,
       duration: data.duration,
@@ -85,6 +149,16 @@ export default {
           data.numLinkingOtherReleases > 1 &&
             {class: 'offset-tooltips'},
 
-          relations.items),
+          [
+            relations.itemsCountingTowardTotals,
+
+            !empty(relations.itemsCountingTowardTotals) &&
+            !empty(relations.itemsNotCountingTowardTotals) &&
+              html.tag('li', {class: 'divider'},
+                html.tag('hr')),
+
+            relations.itemsNotCountingTowardTotals
+              .map(item => item.slot('showDuration', false)),
+          ]),
     }),
 };