diff options
Diffstat (limited to 'src/content/dependencies/generateAlbumSidebar.js')
-rw-r--r-- | src/content/dependencies/generateAlbumSidebar.js | 69 |
1 files changed, 62 insertions, 7 deletions
diff --git a/src/content/dependencies/generateAlbumSidebar.js b/src/content/dependencies/generateAlbumSidebar.js index bd53ef71..464274e3 100644 --- a/src/content/dependencies/generateAlbumSidebar.js +++ b/src/content/dependencies/generateAlbumSidebar.js @@ -1,4 +1,5 @@ -import {stitchArrays} from '#sugar'; +import {sortAlbumsTracksChronologically} from '#sort'; +import {stitchArrays, transposeArrays} from '#sugar'; export default { contentDependencies: [ @@ -7,6 +8,7 @@ export default { 'generateAlbumSidebarTrackListBox', 'generatePageSidebar', 'generatePageSidebarConjoinedBox', + 'generateTrackReleaseBox', ], extraDependencies: ['html', 'wikiData'], @@ -17,7 +19,7 @@ export default { groupData.flatMap(group => group.serieses), }), - query(sprawl, album) { + query(sprawl, album, track) { const query = {}; query.groups = @@ -35,6 +37,33 @@ export default { series.albums.includes(album) && !query.groups.includes(series.group)); + if (track) { + const albumTrackMap = + new Map(transposeArrays([ + track.allReleases.map(t => t.album), + track.allReleases, + ])); + + const allReleaseAlbums = + sortAlbumsTracksChronologically( + Array.from(albumTrackMap.keys())); + + const currentReleaseIndex = + allReleaseAlbums.indexOf(track.album); + + const earlierReleaseAlbums = + allReleaseAlbums.slice(0, currentReleaseIndex); + + const laterReleaseAlbums = + allReleaseAlbums.slice(currentReleaseIndex + 1); + + query.earlierReleaseTracks = + earlierReleaseAlbums.map(album => albumTrackMap.get(album)); + + query.laterReleaseTracks = + laterReleaseAlbums.map(album => albumTrackMap.get(album)); + } + return query; }, @@ -63,25 +92,45 @@ export default { query.disconnectedSerieses .map(series => relation('generateAlbumSidebarSeriesBox', album, series)), + + earlierTrackReleaseBoxes: + (track + ? query.earlierReleaseTracks + .map(track => + relation('generateTrackReleaseBox', track)) + : null), + + laterTrackReleaseBoxes: + (track + ? query.laterReleaseTracks + .map(track => + relation('generateTrackReleaseBox', track)) + : null), }), - data: (_query, _sprawl, _album, track) => ({ + data: (_query, _sprawl, album, track) => ({ isAlbumPage: !track, + isTrackPage: !!track, + + albumStyle: album.style, }), generate(data, relations, {html}) { + const presentGroupsLikeAlbum = + data.isAlbumPage || + data.albumStyle === 'single'; + for (const box of [ ...relations.groupBoxes, ...relations.seriesBoxes.flat(), ...relations.disconnectedSeriesBoxes, ]) { - box.setSlot('mode', - data.isAlbumPage ? 'album' : 'track'); + box.setSlot('mode', presentGroupsLikeAlbum ? 'album' : 'track'); } return relations.sidebar.slots({ boxes: [ - data.isAlbumPage && [ + presentGroupsLikeAlbum && [ relations.disconnectedSeriesBoxes, stitchArrays({ @@ -98,9 +147,15 @@ export default { ]), ], + data.isTrackPage && + relations.earlierTrackReleaseBoxes, + relations.trackListBox, - !data.isAlbumPage && + data.isTrackPage && + relations.laterTrackReleaseBoxes, + + !presentGroupsLikeAlbum && relations.conjoinedBox.slots({ attributes: {class: 'conjoined-group-sidebar-box'}, boxes: |