diff options
author | (quasar) nebula <qznebula@protonmail.com> | 2024-10-15 23:43:21 -0300 |
---|---|---|
committer | (quasar) nebula <qznebula@protonmail.com> | 2024-11-02 22:12:49 -0300 |
commit | 7c8abdbb551a05b0d9083bf13a7d82b22b866566 (patch) | |
tree | 654bd438ee106da6112f64d7a481516d169c21e9 /src/content/dependencies/generateAlbumSecondaryNavGroupPart.js | |
parent | 8e2fb80d5b41e5d452f7922b0d4eee8d582ac06f (diff) |
content: generateAlbumSecondaryNavGroupPart
Diffstat (limited to 'src/content/dependencies/generateAlbumSecondaryNavGroupPart.js')
-rw-r--r-- | src/content/dependencies/generateAlbumSecondaryNavGroupPart.js | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/src/content/dependencies/generateAlbumSecondaryNavGroupPart.js b/src/content/dependencies/generateAlbumSecondaryNavGroupPart.js new file mode 100644 index 00000000..81b0c75a --- /dev/null +++ b/src/content/dependencies/generateAlbumSecondaryNavGroupPart.js @@ -0,0 +1,98 @@ +import {sortChronologically} from '#sort'; +import {atOffset} from '#sugar'; + +export default { + contentDependencies: [ + 'generateColorStyleAttribute', + 'generatePreviousNextLinks', + 'linkAlbumDynamically', + 'linkGroup', + ], + + extraDependencies: ['html', 'language'], + + query(group, album) { + const query = {}; + + if (album.date) { + // Sort by latest first. This matches the sorting order used on group + // gallery pages, ensuring that previous/next matches moving up/down + // the gallery. Note that this makes the index offsets "backwards" + // compared to how latest-last chronological lists are accessed. + const albums = + sortChronologically( + group.albums.filter(album => album.date), + {latestFirst: true}); + + const currentIndex = + albums.indexOf(album); + + query.previousAlbum = + atOffset(albums, currentIndex, +1); + + query.nextAlbum = + atOffset(albums, currentIndex, -1); + } + + return query; + }, + + relations: (relation, query, group, _album) => ({ + groupLink: + relation('linkGroup', group), + + colorStyle: + relation('generateColorStyleAttribute', group.color), + + previousNextLinks: + relation('generatePreviousNextLinks'), + + previousAlbumLink: + (query.previousAlbum + ? relation('linkAlbumDynamically', query.previousAlbum) + : null), + + nextAlbumLink: + (query.nextAlbum + ? relation('linkAlbumDynamically', query.nextAlbum) + : null), + }), + + slots: { + mode: { + validate: v => v.is('album', 'track'), + default: 'album', + }, + }, + + generate: (relations, slots, {html, language}) => + html.tag('span', {class: 'nav-link'}, + relations.colorStyle + .slot('context', 'primary-only'), + + language.encapsulate('albumSecondaryNav.group', workingCapsule => { + const workingOptions = {}; + + workingOptions.group = + relations.groupLink + .slot('color', false); + + if (slots.mode === 'album') { + const {previousNextLinks} = relations; + + previousNextLinks.setSlots({ + previousLink: relations.previousAlbumLink, + nextLink: relations.nextAlbumLink, + id: false, + }); + + if (!html.isBlank(previousNextLinks)) { + workingCapsule += '.withPreviousNext'; + workingOptions.previousNext = + language.formatUnitList(previousNextLinks.content); + } + } + + return language.$(workingCapsule, workingOptions); + })), +}; |