diff options
Diffstat (limited to 'src/content/dependencies/generateAlbumTrackListItem.js')
-rw-r--r-- | src/content/dependencies/generateAlbumTrackListItem.js | 150 |
1 files changed, 41 insertions, 109 deletions
diff --git a/src/content/dependencies/generateAlbumTrackListItem.js b/src/content/dependencies/generateAlbumTrackListItem.js index 7d5d2c6e..44297c15 100644 --- a/src/content/dependencies/generateAlbumTrackListItem.js +++ b/src/content/dependencies/generateAlbumTrackListItem.js @@ -1,75 +1,36 @@ -import {compareArrays, empty} from '#sugar'; - export default { - contentDependencies: [ - 'generateAlbumTrackListMissingDuration', - 'linkContribution', - 'linkTrack', - ], - - extraDependencies: ['getColors', 'html', 'language'], - - query(track, album) { - const query = {}; + contentDependencies: ['generateTrackListItem'], + extraDependencies: ['html'], - query.duration = track.duration ?? 0; + query: (track, album) => ({ + trackHasDuration: + !!track.duration, - query.trackHasDuration = !!track.duration; - - query.sectionHasDuration = + sectionHasDuration: !album.trackSections .some(section => section.tracks.every(track => !track.duration) && - section.tracks.includes(track)); - - query.albumHasDuration = - album.tracks.some(track => track.duration); + section.tracks.includes(track)), - return query; - }, + albumHasDuration: + album.tracks.some(track => track.duration), + }), - relations(relation, query, track) { - const relations = {}; - - if (!empty(track.artistContribs)) { - relations.contributionLinks = - track.artistContribs - .map(contrib => relation('linkContribution', contrib)); - } - - relations.trackLink = - relation('linkTrack', track); - - if (!query.trackHasDuration) { - relations.missingDuration = - relation('generateAlbumTrackListMissingDuration'); - } - - return relations; - }, + relations: (relation, query, track) => ({ + item: + relation('generateTrackListItem', + track, + track.album.artistContribs), + }), - data(query, track, album) { - const data = {}; + data: (query, track, album) => ({ + trackHasDuration: query.trackHasDuration, + sectionHasDuration: query.sectionHasDuration, + albumHasDuration: query.albumHasDuration, - data.duration = query.duration; - data.trackHasDuration = query.trackHasDuration; - data.sectionHasDuration = query.sectionHasDuration; - data.albumHasDuration = query.albumHasDuration; - - if (track.color !== album.color) { - data.color = track.color; - } - - data.showArtists = - !empty(track.artistContribs) && - (empty(album.artistContribs) || - !compareArrays( - track.artistContribs.map(contrib => contrib.artist), - album.artistContribs.map(contrib => contrib.artist), - {checkOrder: false})); - - return data; - }, + colorize: + track.color !== album.color, + }), slots: { collapseDurationScope: { @@ -80,51 +41,22 @@ export default { }, }, - generate: (data, relations, slots, {getColors, html, language}) => - language.encapsulate('trackList.item', itemCapsule => - html.tag('li', - data.color && - {style: `--primary-color: ${getColors(data.color).primary}`}, - - language.encapsulate(itemCapsule, workingCapsule => { - const workingOptions = {}; - - workingOptions.track = - relations.trackLink - .slot('color', false); - - const collapseDuration = - (slots.collapseDurationScope === 'track' - ? !data.trackHasDuration - : slots.collapseDurationScope === 'section' - ? !data.sectionHasDuration - : slots.collapseDurationScope === 'album' - ? !data.albumHasDuration - : false); - - if (!collapseDuration) { - workingCapsule += '.withDuration'; - workingOptions.duration = - (data.trackHasDuration - ? language.$(itemCapsule, 'withDuration.duration', { - duration: - language.formatDuration(data.duration), - }) - : relations.missingDuration); - } - - if (data.showArtists) { - workingCapsule += '.withArtists'; - workingOptions.by = - html.tag('span', {class: 'by'}, - html.metatag('chunkwrap', {split: ','}, - html.resolve( - language.$(itemCapsule, 'withArtists.by', { - artists: - language.formatConjunctionList(relations.contributionLinks), - })))); - } - - return language.$(workingCapsule, workingOptions); - }))), + generate: (data, relations, slots) => + relations.item.slots({ + showArtists: true, + + showDuration: + (slots.collapseDurationScope === 'track' + ? data.trackHasDuration + : slots.collapseDurationScope === 'section' + ? data.sectionHasDuration + : slots.collapseDurationScope === 'album' + ? data.albumHasDuration + : true), + + colorMode: + (data.colorize + ? 'line' + : 'none'), + }), }; |