« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/data
diff options
context:
space:
mode:
Diffstat (limited to 'src/data')
-rw-r--r--src/data/things/Track.js47
-rw-r--r--src/data/things/sorting-rule/ThingSortingRule.js9
2 files changed, 51 insertions, 5 deletions
diff --git a/src/data/things/Track.js b/src/data/things/Track.js
index 7ce55e51..7eff2000 100644
--- a/src/data/things/Track.js
+++ b/src/data/things/Track.js
@@ -677,6 +677,10 @@ export class Track extends Thing {
             : continuation()),
       },
 
+      exposeDependency('nameForSorting'),
+    ],
+
+    nameForSorting: [
       {
         dependencies: ['name', 'nameDetailAcrossWiki'],
         compute: (continuation, {name, nameDetailAcrossWiki}) =>
@@ -1453,30 +1457,65 @@ export class Track extends Thing {
     return this.album.getAlbumArtPath(filename);
   }
 
-  countOwnContributionInContributionTotals(_contrib) {
+  countOwnContributionInContributionTotals(contrib) {
     if (!this.countInArtistTotals) {
       return false;
     }
 
     if (this.isSecondaryRelease) {
-      return false;
+      const correspondingContrib =
+        this.getCorrespondingMainReleaseContrib(contrib);
+
+      if (correspondingContrib) {
+        return false;
+      }
     }
 
     return true;
   }
 
-  countOwnContributionInDurationTotals(_contrib) {
+  countOwnContributionInDurationTotals(contrib) {
     if (!this.countInArtistTotals) {
       return false;
     }
 
     if (this.isSecondaryRelease) {
-      return false;
+      const correspondingContrib =
+        this.getCorrespondingMainReleaseContrib(contrib);
+
+      if (correspondingContrib) {
+        return false;
+      }
     }
 
     return true;
   }
 
+  getCorrespondingMainReleaseContrib(contrib) {
+    if (!this.isSecondaryRelease) return null;
+
+    const filterMatchingContrib = c =>
+      c.artist === contrib.artist &&
+      c.annotation === contrib.annotation;
+
+    const myList =
+      this[contrib.thingProperty]
+        .filter(filterMatchingContrib);
+
+    const mainList =
+      this.mainReleaseTrack[contrib.thingProperty]
+        .filter(filterMatchingContrib);
+
+    const index = myList.indexOf(contrib);
+
+    if (index === -1) {
+      const key = contrib.thingProperty;
+      throw new Error(`Couldn't find contribution in track's own ${key}`);
+    }
+
+    return mainList.at(index) ?? null;
+  }
+
   [inspect.custom](depth) {
     const parts = [];
 
diff --git a/src/data/things/sorting-rule/ThingSortingRule.js b/src/data/things/sorting-rule/ThingSortingRule.js
index b5cc76dc..6dbaccf7 100644
--- a/src/data/things/sorting-rule/ThingSortingRule.js
+++ b/src/data/things/sorting-rule/ThingSortingRule.js
@@ -51,7 +51,14 @@ export class ThingSortingRule extends SortingRule {
           continue;
         }
 
-        if (lc.endsWith('name')) {
+        if (lc === 'name') {
+          sortByName(sortable, {
+            getName: thing =>
+              thing.nameForSorting ??
+              thing.name,
+          });
+          continue;
+        } else if (lc.endsWith('name')) {
           sortByName(sortable, {getName: get});
           continue;
         }