diff options
Diffstat (limited to 'src/data')
| -rw-r--r-- | src/data/things/Track.js | 47 | ||||
| -rw-r--r-- | src/data/things/sorting-rule/ThingSortingRule.js | 9 |
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; } |