« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/content/dependencies/generateAdditionalFilesListChunk.js51
1 files changed, 38 insertions, 13 deletions
diff --git a/src/content/dependencies/generateAdditionalFilesListChunk.js b/src/content/dependencies/generateAdditionalFilesListChunk.js
index a9ae96c3..18d5b894 100644
--- a/src/content/dependencies/generateAdditionalFilesListChunk.js
+++ b/src/content/dependencies/generateAdditionalFilesListChunk.js
@@ -1,21 +1,46 @@
 import {compareArrays, stitchArrays} from '#sugar';
 
 export default {
-  query: (file) => ({
-    contextContribs:
-      ((file.thing.isTrack &&
-        compareArrays(
-          file.thing.artistContribs.map(contrib => contrib.artist),
-          file.thing.album.artistContribs.map(contrib => contrib.artist),
-          {checkOrder: false}))
-
-        ? file.thing.artistContribs
+  query(file) {
+    const query = {};
 
+    const album =
+      (file.thing.isTrack
+        ? file.thing.album
      : file.thing.isAlbum
-        ? file.thing.artistContribs
-
-        : []),
-  }),
+        ? file.thing
+        : []);
+
+    // Consider all presented additional file lists, not just ones
+    // of the same type as this chunk/list.
+    const nearbyAdditionalFiles =
+      (album
+        ? [...album.additionalFiles,
+           ...album.tracks.flatMap(track => [
+              ...track.additionalFiles,
+              ...track.sheetMusicFiles,
+              ...track.midiProjectFiles,
+            ])]
+        : []);
+
+    const contribsMatch = (a, b) =>
+      compareArrays(
+        a.artistContribs.map(contrib => contrib.artist),
+        b.artistContribs.map(contrib => contrib.artist),
+        {checkOrder: false});
+
+    if (
+      nearbyAdditionalFiles.every(x => contribsMatch(x, file)) &&
+      nearbyAdditionalFiles.every(x => contribsMatch(x, x.thing)) &&
+      nearbyAdditionalFiles.every(x => contribsMatch(x, album))
+    ) {
+      query.contextContribs = file.thing.artistContribs;
+    } else {
+      query.contextContribs = [];
+    }
+
+    return query;
+  },
 
   relations: (relation, query, file) => ({
     description: