diff options
Diffstat (limited to 'src/content/dependencies/generateArtistInfoPageTracksChunk.js')
| -rw-r--r-- | src/content/dependencies/generateArtistInfoPageTracksChunk.js | 92 |
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)), + ]), }), }; |