« 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/generateGroupGalleryPageAlbumGrid.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/content/dependencies/generateGroupGalleryPageAlbumGrid.js')
-rw-r--r--src/content/dependencies/generateGroupGalleryPageAlbumGrid.js85
1 files changed, 74 insertions, 11 deletions
diff --git a/src/content/dependencies/generateGroupGalleryPageAlbumGrid.js b/src/content/dependencies/generateGroupGalleryPageAlbumGrid.js
index ab768633..25e57a67 100644
--- a/src/content/dependencies/generateGroupGalleryPageAlbumGrid.js
+++ b/src/content/dependencies/generateGroupGalleryPageAlbumGrid.js
@@ -1,26 +1,65 @@
-import {stitchArrays} from '#sugar';
+import {empty, stitchArrays} from '#sugar';
 import {getTotalDuration} from '#wiki-data';
 
 export default {
-  contentDependencies: ['generateCoverGrid', 'image', 'linkAlbum'],
-  extraDependencies: ['language'],
+  contentDependencies: [
+    'generateArtistCredit',
+    'generateCoverGrid',
+    'image',
+    'linkAlbum',
+  ],
 
-  relations: (relation, albums, _group) => ({
+  extraDependencies: ['language', 'wikiData'],
+
+  query: (albums, group) => ({
+    notedGroups:
+      albums.map(album => {
+        const contextGroup = group;
+
+        const candidateGroups =
+          album.groups
+            .filter(group => !group.excludeFromGalleryTabs)
+            .filter(group => group.category !== contextGroup.category);
+
+        return candidateGroups.at(0) ?? null;
+      }),
+
+    notedArtistContribs:
+      albums.map(album => {
+        if (
+          album.artistContribs.length === 1 &&
+          !empty(group.closelyLinkedArtists) &&
+          (album.artistContribs[0].artist.name ===
+           group.closelyLinkedArtists[0].artist.name)
+        ) {
+          return [];
+        }
+
+        return album.artistContribs;
+      }),
+  }),
+
+  relations: (relation, query, albums, _group) => ({
     coverGrid:
       relation('generateCoverGrid'),
 
+    artistCredits:
+      query.notedArtistContribs
+        .map(contribs => relation('generateArtistCredit', contribs, [])),
+
     links:
-      albums.map(album =>
-        relation('linkAlbum', album)),
+      albums
+        .map(album => relation('linkAlbum', album)),
 
     images:
-      albums.map(album =>
-        (album.hasCoverArt
-          ? relation('image', album.coverArtworks[0])
-          : relation('image')))
+      albums
+        .map(album =>
+          (album.hasCoverArt
+            ? relation('image', album.coverArtworks[0])
+            : relation('image')))
   }),
 
-  data: (albums, group) => ({
+  data: (query, albums, group) => ({
     names:
       albums.map(album => album.name),
 
@@ -36,6 +75,10 @@ export default {
           ? null
           : getTotalDuration(album.tracks))),
 
+    groupNames:
+      query.notedGroups
+        .map(group => group ? group.name : null),
+
     notFromThisGroup:
       albums.map(album => !album.groups.includes(group)),
   }),
@@ -62,6 +105,26 @@ export default {
         itemAttributes:
           data.styles.map(style => ({'data-style': style})),
 
+        tab:
+          language.encapsulate(capsule, 'tab', capsule =>
+            stitchArrays({
+              groupName: data.groupNames,
+              artistCredit: relations.artistCredits,
+            }).map(({groupName, artistCredit}) =>
+                (groupName
+                  ? language.$(capsule, 'group', {
+                      group: groupName,
+                    })
+               : artistCredit
+                  ? artistCredit?.slots({
+                      normalStringKey:
+                        capsule + '.artists',
+
+                      normalFeaturingStringKey:
+                        capsule + '.artists.featuring',
+                    })
+                  : null))),
+
         info:
           stitchArrays({
             style: data.styles,