From 7eda6868381e9e145d503294837f6f60de7e38e0 Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Tue, 18 Apr 2023 21:09:10 -0300 Subject: content: misc. changes, groups divided by tracks, relation sections --- .../generateTrackListDividedByGroups.js | 87 ++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 src/content/dependencies/generateTrackListDividedByGroups.js (limited to 'src/content/dependencies/generateTrackListDividedByGroups.js') diff --git a/src/content/dependencies/generateTrackListDividedByGroups.js b/src/content/dependencies/generateTrackListDividedByGroups.js new file mode 100644 index 00000000..69fedb28 --- /dev/null +++ b/src/content/dependencies/generateTrackListDividedByGroups.js @@ -0,0 +1,87 @@ +import {empty} from '../../util/sugar.js'; + +import groupTracksByGroup from '../util/groupTracksByGroup.js'; + +export default { + contentDependencies: ['linkTrack', 'linkContribution'], + + extraDependencies: ['html', 'language'], + + relations(relation, tracks, groups) { + if (empty(tracks)) { + return {}; + } + + const trackRelations = track => ({ + trackLink: + relation('linkTrack', track), + + contributionLinks: + track.artistContribs.map(contrib => + relation('linkContribution', contrib.who, contrib.what)), + }); + + if (empty(groups)) { + return { + flatItems: tracks.map(trackRelations), + }; + } + + const lists = groupTracksByGroup(tracks, groups); + + return { + groupedItems: + Array.from(lists.entries()).map(([groupOrOther, tracks]) => ({ + ...(groupOrOther === 'other' + ? {other: true} + : {groupLink: relation('linkGroup', groupOrOther)}), + + items: tracks.map(trackRelations), + })), + }; + }, + + generate(relations, {html, language}) { + // TODO: This is copy-pasted from generateTrackInfoPageContent, seems bad + + const formatContributions = + (contributionLinks, {showContribution = true, showIcons = true} = {}) => + language.formatConjunctionList( + contributionLinks.map(link => + link.slots({showContribution, showIcons}))); + + const formatTrackItem = ({trackLink, contributionLinks}) => + html.tag('li', + language.$('trackList.item.withArtists', { + track: trackLink, + by: + html.tag('span', {class: 'by'}, + language.$('trackList.item.withArtists.by', { + artists: + formatContributions(contributionLinks, { + showContribution: false, + showIcons: false, + }), + })), + })); + + if (relations.flatItems) { + return html.tag('ul', + relations.flatItems.map(formatTrackItem)); + } + + return html.tag('dl', + relations.groupedItems.map(({other, groupLink, items}) => [ + html.tag('dt', + (other + ? language.$('trackList.group.fromOther') + : language.$('trackList.group', { + group: groupLink + }))), + + html.tag('dd', + html.tag('ul', + items.map(formatTrackItem))), + ])); + }, +}; -- cgit 1.3.0-6-gf8a5