diff options
Diffstat (limited to 'src/content')
-rw-r--r-- | src/content/dependencies/generateAlbumSidebar.js | 52 | ||||
-rw-r--r-- | src/content/dependencies/generateAlbumSidebarSeriesBox.js | 102 |
2 files changed, 145 insertions, 9 deletions
diff --git a/src/content/dependencies/generateAlbumSidebar.js b/src/content/dependencies/generateAlbumSidebar.js index 355a9a9a..ec1b670f 100644 --- a/src/content/dependencies/generateAlbumSidebar.js +++ b/src/content/dependencies/generateAlbumSidebar.js @@ -1,12 +1,30 @@ +import {stitchArrays} from '#sugar'; + export default { contentDependencies: [ 'generateAlbumSidebarGroupBox', + 'generateAlbumSidebarSeriesBox', 'generateAlbumSidebarTrackListBox', 'generatePageSidebar', 'generatePageSidebarConjoinedBox', ], - relations: (relation, album, track) => ({ + query(album) { + const query = {}; + + query.groups = + album.groups; + + query.groupSerieses = + query.groups + .map(group => + group.serieses + .filter(series => series.albums.includes(album))); + + return query; + }, + + relations: (relation, query, album, track) => ({ sidebar: relation('generatePageSidebar'), @@ -17,19 +35,34 @@ export default { relation('generateAlbumSidebarTrackListBox', album, track), groupBoxes: - album.groups.map(group => - relation('generateAlbumSidebarGroupBox', album, group)), + query.groups + .map(group => + relation('generateAlbumSidebarGroupBox', album, group)), + + seriesBoxes: + query.groupSerieses + .map(serieses => serieses + .map(series => + relation('generateAlbumSidebarSeriesBox', album, series))), }), - data: (album, track) => ({ + data: (_query, _album, track) => ({ isAlbumPage: !track, }), - generate: (data, relations) => - relations.sidebar.slots({ + generate(data, relations) { + const groupAndSeriesBoxes = + stitchArrays({ + groupBox: relations.groupBoxes, + seriesBoxes: relations.seriesBoxes, + }).map(({groupBox, seriesBoxes}) => + [groupBox, ...seriesBoxes]) + .flat(); + + return relations.sidebar.slots({ boxes: [ data.isAlbumPage && - relations.groupBoxes + groupAndSeriesBoxes .map(box => box.slot('mode', 'album')), relations.trackListBox, @@ -38,10 +71,11 @@ export default { relations.conjoinedBox.slots({ attributes: {class: 'conjoined-group-sidebar-box'}, boxes: - relations.groupBoxes + groupAndSeriesBoxes .map(box => box.slot('mode', 'track')) .map(box => box.content), /* TODO: Kludge. */ }), ], - }), + }); + } }; diff --git a/src/content/dependencies/generateAlbumSidebarSeriesBox.js b/src/content/dependencies/generateAlbumSidebarSeriesBox.js new file mode 100644 index 00000000..37616cb2 --- /dev/null +++ b/src/content/dependencies/generateAlbumSidebarSeriesBox.js @@ -0,0 +1,102 @@ +import {atOffset} from '#sugar'; + +export default { + contentDependencies: [ + 'generatePageSidebarBox', + 'linkAlbum', + 'linkGroup', + 'transformContent', + ], + + extraDependencies: ['html', 'language'], + + query(album, series) { + const query = {}; + + const albums = + series.albums; + + const index = + albums.indexOf(album); + + query.previousAlbum = + atOffset(albums, index, -1); + + query.nextAlbum = + atOffset(albums, index, +1); + + return query; + }, + + relations: (relation, query, _album, series) => ({ + box: + relation('generatePageSidebarBox'), + + groupLink: + relation('linkGroup', series.group), + + description: + relation('transformContent', series.description), + + previousAlbumLink: + (query.previousAlbum + ? relation('linkAlbum', query.previousAlbum) + : null), + + nextAlbumLink: + (query.nextAlbum + ? relation('linkAlbum', query.nextAlbum) + : null), + }), + + data: (_query, _album, series) => ({ + name: series.name, + }), + + slots: { + mode: { + validate: v => v.is('album', 'track'), + default: 'track', + }, + }, + + generate: (data, relations, slots, {html, language}) => + language.encapsulate('albumSidebar.groupBox', boxCapsule => + relations.box.slots({ + attributes: {class: 'individual-series-sidebar-box'}, + content: [ + html.tag('h1', + language.$(boxCapsule, 'title', { + group: + relations.groupLink.slots({ + attributes: {class: 'series'}, + content: language.sanitize(data.name), + }), + })), + + slots.mode === 'album' && + relations.description + ?.slot('mode', 'multiline'), + + slots.mode === 'album' && + html.tag('p', {class: 'series-chronology-link'}, + {[html.onlyIfContent]: true}, + + language.$(boxCapsule, 'next', { + [language.onlyIfOptions]: ['album'], + + album: relations.nextAlbumLink, + })), + + slots.mode === 'album' && + html.tag('p', {class: 'series-chronology-link'}, + {[html.onlyIfContent]: true}, + + language.$(boxCapsule, 'previous', { + [language.onlyIfOptions]: ['album'], + + album: relations.previousAlbumLink, + })), + ], + })), +}; |