diff options
Diffstat (limited to 'src/content/dependencies/generateGroupInfoPage.js')
-rw-r--r-- | src/content/dependencies/generateGroupInfoPage.js | 278 |
1 files changed, 118 insertions, 160 deletions
diff --git a/src/content/dependencies/generateGroupInfoPage.js b/src/content/dependencies/generateGroupInfoPage.js index e6b0ded1..7b9c2afa 100644 --- a/src/content/dependencies/generateGroupInfoPage.js +++ b/src/content/dependencies/generateGroupInfoPage.js @@ -1,209 +1,168 @@ -import {empty, stitchArrays} from '#sugar'; +import {stitchArrays} from '#sugar'; export default { contentDependencies: [ - 'generateAbsoluteDatetimestamp', 'generateColorStyleAttribute', - 'generateContentHeading', + 'generateGroupInfoPageAlbumsSection', 'generateGroupNavLinks', 'generateGroupSecondaryNav', 'generateGroupSidebar', 'generatePageLayout', - 'linkAlbum', + 'linkArtist', 'linkExternal', - 'linkGroupGallery', - 'linkGroup', 'transformContent', ], extraDependencies: ['html', 'language', 'wikiData'], - sprawl({wikiInfo}) { - return { - enableGroupUI: wikiInfo.enableGroupUI, - }; - }, + sprawl: ({wikiInfo}) => ({ + enableGroupUI: + wikiInfo.enableGroupUI, - query(sprawl, group) { - const albums = - group.albums; + wikiColor: + wikiInfo.color, + }), - const albumGroups = - albums - .map(album => album.groups); + query: (_sprawl, group) => ({ + aliasLinkedArtists: + group.closelyLinkedArtists + .filter(({annotation}) => + annotation === 'alias'), - const albumOtherCategory = - albumGroups - .map(groups => groups - .map(group => group.category) - .find(category => category !== group.category)); + generalLinkedArtists: + group.closelyLinkedArtists + .filter(({annotation}) => + annotation !== 'alias'), + }), - const albumOtherGroups = - stitchArrays({ - groups: albumGroups, - category: albumOtherCategory, - }).map(({groups, category}) => - groups - .filter(group => group.category === category)); + relations: (relation, query, sprawl, group) => ({ + layout: + relation('generatePageLayout'), - return {albums, albumOtherGroups}; - }, + navLinks: + relation('generateGroupNavLinks', group), - relations(relation, query, sprawl, group) { - const relations = {}; - const sec = relations.sections = {}; + secondaryNav: + (sprawl.enableGroupUI + ? relation('generateGroupSecondaryNav', group) + : null), - relations.layout = - relation('generatePageLayout'); + sidebar: + (sprawl.enableGroupUI + ? relation('generateGroupSidebar', group) + : null), - relations.navLinks = - relation('generateGroupNavLinks', group); + wikiColorAttribute: + relation('generateColorStyleAttribute', sprawl.wikiColor), - if (sprawl.enableGroupUI) { - relations.secondaryNav = - relation('generateGroupSecondaryNav', group); + closeArtistLinks: + query.generalLinkedArtists + .map(({artist}) => relation('linkArtist', artist)), - relations.sidebar = - relation('generateGroupSidebar', group); - } + aliasArtistLinks: + query.aliasLinkedArtists + .map(({artist}) => relation('linkArtist', artist)), - sec.info = {}; - - sec.info.visitLinks = + visitLinks: group.urls - .map(url => relation('linkExternal', url)); - - if (group.description) { - sec.info.description = - relation('transformContent', group.description); - } - - if (!empty(query.albums)) { - sec.albums = {}; - - sec.albums.heading = - relation('generateContentHeading'); - - sec.albums.galleryLink = - relation('linkGroupGallery', group); + .map(url => relation('linkExternal', url)), - sec.albums.albumColorStyles = - query.albums - .map(album => relation('generateColorStyleAttribute', album.color)); + description: + relation('transformContent', group.description), - sec.albums.albumLinks = - query.albums - .map(album => relation('linkAlbum', album)); + albumSection: + relation('generateGroupInfoPageAlbumsSection', group), + }), - sec.albums.otherGroupLinks = - query.albumOtherGroups - .map(groups => groups - .map(group => relation('linkGroup', group))); + data: (query, _sprawl, group) => ({ + name: + group.name, - sec.albums.datetimestamps = - group.albums.map(album => - (album.date - ? relation('generateAbsoluteDatetimestamp', album.date) - : null)); - } + color: + group.color, - return relations; - }, + closeArtistAnnotations: + query.generalLinkedArtists + .map(({annotation}) => annotation), + }), - data(query, sprawl, group) { - const data = {}; - - data.name = group.name; - data.color = group.color; - - return data; - }, - - generate(data, relations, {html, language}) { - const {sections: sec} = relations; - - return relations.layout - .slots({ - title: language.$('groupInfoPage.title', {group: data.name}), + generate: (data, relations, {html, language}) => + language.encapsulate('groupInfoPage', pageCapsule => + relations.layout.slots({ + title: language.$(pageCapsule, 'title', {group: data.name}), headingMode: 'sticky', color: data.color, mainContent: [ html.tag('p', {[html.onlyIfContent]: true}, + {[html.joinChildren]: html.tag('br')}, + + language.encapsulate(pageCapsule, 'closelyLinkedArtists', capsule => [ + language.encapsulate(capsule, capsule => { + const [workingCapsule, option] = + (relations.closeArtistLinks.length === 0 + ? [null, null] + : relations.closeArtistLinks.length === 1 + ? [language.encapsulate(capsule, 'one'), 'artist'] + : [language.encapsulate(capsule, 'multiple'), 'artists']); + + if (!workingCapsule) return html.blank(); + + return language.$(workingCapsule, { + [option]: + language.formatUnitList( + stitchArrays({ + link: relations.closeArtistLinks, + annotation: data.closeArtistAnnotations, + }).map(({link, annotation}) => + language.encapsulate(capsule, 'artist', workingCapsule => { + const workingOptions = {}; + + workingOptions.artist = + link.slots({ + attributes: [relations.wikiColorAttribute], + }); + + if (annotation) { + workingCapsule += '.withAnnotation'; + workingOptions.annotation = annotation; + } + + return language.$(workingCapsule, workingOptions); + }))), + }); + }), + + language.$(capsule, 'aliases', { + [language.onlyIfOptions]: ['aliases'], + + aliases: + language.formatConjunctionList( + relations.aliasArtistLinks.map(link => + link.slots({ + attributes: [relations.wikiColorAttribute], + }))), + }), + ])), + + html.tag('p', + {[html.onlyIfContent]: true}, + language.$('releaseInfo.visitOn', { [language.onlyIfOptions]: ['links'], + links: language.formatDisjunctionList( - sec.info.visitLinks + relations.visitLinks .map(link => link.slot('context', 'group'))), })), html.tag('blockquote', {[html.onlyIfContent]: true}, - sec.info.description - ?.slot('mode', 'multiline')), - - sec.albums && [ - sec.albums.heading - .slots({ - tag: 'h2', - title: language.$('groupInfoPage.albumList.title'), - }), + relations.description.slot('mode', 'multiline')), - html.tag('p', - language.$('groupInfoPage.viewAlbumGallery', { - link: - sec.albums.galleryLink - .slot('content', language.$('groupInfoPage.viewAlbumGallery.link')), - })), - - html.tag('ul', - stitchArrays({ - albumLink: sec.albums.albumLinks, - otherGroupLinks: sec.albums.otherGroupLinks, - datetimestamp: sec.albums.datetimestamps, - albumColorStyle: sec.albums.albumColorStyles, - }).map(({ - albumLink, - otherGroupLinks, - datetimestamp, - albumColorStyle, - }) => { - const prefix = 'groupInfoPage.albumList.item'; - const parts = [prefix]; - const options = {}; - - options.album = - albumLink.slot('color', false); - - if (datetimestamp) { - parts.push('withYear'); - options.yearAccent = - language.$(prefix, 'yearAccent', { - year: - datetimestamp.slots({style: 'year', tooltip: true}), - }); - } - - if (!empty(otherGroupLinks)) { - parts.push('withOtherGroup'); - options.otherGroupAccent = - html.tag('span', {class: 'other-group-accent'}, - language.$(prefix, 'otherGroupAccent', { - groups: - language.formatConjunctionList( - otherGroupLinks.map(groupLink => - groupLink.slot('color', false))), - })); - } - - return ( - html.tag('li', - albumColorStyle, - language.$(...parts, options))); - })), - ], + relations.albumSection, ], leftSidebar: @@ -216,6 +175,5 @@ export default { navLinks: relations.navLinks.content, secondaryNav: relations.secondaryNav ?? null, - }); - }, + })), }; |