« get me outta code hell

content: generateAlbumLinkNavAccent & friends - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/content/dependencies/generateAlbumNavSwitcher.js
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2026-05-28 14:25:50 -0300
committer(quasar) nebula <qznebula@protonmail.com>2026-05-28 14:25:50 -0300
commit8cf17aae87ba968d35c9871be9f90997cd5a80ad (patch)
tree25725594d8a4c62f294ed08c0f7c33d71a99bc75 /src/content/dependencies/generateAlbumNavSwitcher.js
parent045b3eee42ce2ce20793f65ca7f4752457bbe77d (diff)
content: generateAlbumLinkNavAccent & friends
Diffstat (limited to 'src/content/dependencies/generateAlbumNavSwitcher.js')
-rw-r--r--src/content/dependencies/generateAlbumNavSwitcher.js133
1 files changed, 133 insertions, 0 deletions
diff --git a/src/content/dependencies/generateAlbumNavSwitcher.js b/src/content/dependencies/generateAlbumNavSwitcher.js
new file mode 100644
index 00000000..24a562f4
--- /dev/null
+++ b/src/content/dependencies/generateAlbumNavSwitcher.js
@@ -0,0 +1,133 @@
+import {atOffset} from '#sugar';
+import {albumHasSubstantialCommentaryPage} from '#wiki-data';
+
+export default {
+  query(album, track) {
+    const query = {};
+
+    const index =
+      (track
+        ? album.tracks.indexOf(track)
+        : null);
+
+    query.previousTrack =
+      (track
+        ? atOffset(album.tracks, index, -1)
+        : null);
+
+    query.nextTrack =
+      (track
+        ? atOffset(album.tracks, index, +1)
+        : null);
+
+    return query;
+  },
+
+  relations: (relation, query, album, _track) => ({
+    switcher:
+      relation('generateInterpageDotSwitcher'),
+
+    previousLink:
+      relation('generatePreviousLink'),
+
+    nextLink:
+      relation('generateNextLink'),
+
+    previousTrackLink:
+      (query.previousTrack
+        ? relation('linkTrack', query.previousTrack)
+        : null),
+
+    nextTrackLink:
+      (query.nextTrack
+        ? relation('linkTrack', query.nextTrack)
+        : null),
+
+    albumGalleryLink:
+      relation('linkAlbumGallery', album),
+
+    albumCommentaryLink:
+      relation('linkAlbumCommentary', album),
+  }),
+
+  data: (query, album, track) => ({
+    hasMultipleTracks:
+      album.tracks.length > 1,
+
+    hasSubstantialCommentaryPage:
+      albumHasSubstantialCommentaryPage(album),
+
+    galleryIsStub:
+      album.tracks.every(t => !t.hasUniqueCoverArt),
+
+    isTrackPage:
+      !!track,
+  }),
+
+  slots: {
+    showTrackNavigation: {type: 'boolean', default: false},
+    showExtraLinks: {type: 'boolean', default: false},
+
+    currentExtra: {
+      validate: v => v.is('gallery', 'commentary'),
+    },
+  },
+
+  generate(data, relations, slots, {html, language}) {
+    const albumNavCapsule = language.encapsulate('albumPage.nav');
+    const trackNavCapsule = language.encapsulate('trackPage.nav');
+
+    const previousLink =
+      data.isTrackPage &&
+        relations.previousLink.slot('link', relations.previousTrackLink);
+
+    const nextLink =
+      data.isTrackPage &&
+        relations.nextLink.slot('link', relations.nextTrackLink);
+
+    const galleryLink =
+      (!data.galleryIsStub ||
+       slots.currentExtra === 'gallery') &&
+        relations.albumGalleryLink.slots({
+          attributes: {class: slots.currentExtra === 'gallery' && 'current'},
+          content: language.$(albumNavCapsule, 'gallery'),
+        });
+
+    const commentaryLink =
+      (data.hasSubstantialCommentaryPage ||
+       slots.currentExtra === 'commentary') &&
+        relations.albumCommentaryLink.slots({
+          attributes: {class: slots.currentExtra === 'commentary' && 'current'},
+          content: language.$(albumNavCapsule, 'commentary'),
+        });
+
+    const randomLink =
+      data.hasMultipleTracks &&
+        html.tag('a',
+          {id: 'random-button'},
+          {href: '#', 'data-random': 'track-in-sidebar'},
+
+          (data.isTrackPage
+            ? language.$(trackNavCapsule, 'random')
+            : language.$(albumNavCapsule, 'randomTrack')));
+
+    return relations.switcher.slots({
+      links: [
+        slots.showTrackNavigation &&
+          previousLink,
+
+        slots.showTrackNavigation &&
+          nextLink,
+
+        slots.showExtraLinks &&
+          galleryLink,
+
+        slots.showExtraLinks &&
+          commentaryLink,
+
+        slots.showTrackNavigation &&
+          randomLink,
+      ],
+    });
+  },
+};