« get me outta code hell

content, data: generateWikiHomepageAlbum{Carousel,Grid}Row - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2025-02-11 11:12:07 -0400
committer(quasar) nebula <qznebula@protonmail.com>2025-02-12 07:43:59 -0400
commitc45d45759395725128c030ac387bb20b80aada1e (patch)
treedd71e8354268ca5c48101b0b225144db982cc5cb /src
parent19d9c3a3d16ed08b2d0c9e09259ffb79a27cd3e9 (diff)
content, data: generateWikiHomepageAlbum{Carousel,Grid}Row
Diffstat (limited to 'src')
-rw-r--r--src/content/dependencies/generateWikiHomepageAlbumCarouselRow.js39
-rw-r--r--src/content/dependencies/generateWikiHomepageAlbumGridRow.js83
-rw-r--r--src/content/dependencies/generateWikiHomepageAlbumsRow.js115
-rw-r--r--src/content/dependencies/generateWikiHomepageSection.js9
-rw-r--r--src/data/checks.js7
-rw-r--r--src/data/things/homepage-layout.js46
6 files changed, 165 insertions, 134 deletions
diff --git a/src/content/dependencies/generateWikiHomepageAlbumCarouselRow.js b/src/content/dependencies/generateWikiHomepageAlbumCarouselRow.js
new file mode 100644
index 00000000..3068d951
--- /dev/null
+++ b/src/content/dependencies/generateWikiHomepageAlbumCarouselRow.js
@@ -0,0 +1,39 @@
+import {stitchArrays} from '#sugar';
+
+export default {
+  contentDependencies: ['generateCoverCarousel', 'image', 'linkAlbum'],
+
+  relations: (relation, row) => ({
+    coverCarousel:
+      relation('generateCoverCarousel'),
+
+    links:
+      row.albums
+        .map(album => relation('linkAlbum', album)),
+
+    images:
+      row.albums
+        .map(album => relation('image', album.artTags)),
+  }),
+
+  data: (row) => ({
+    paths:
+      row.albums.map(album =>
+        (album.hasCoverArt
+          ? ['media.albumCover', album.directory, album.coverArtFileExtension]
+          : null)),
+  }),
+
+  generate: (data, relations) =>
+    relations.coverCarousel.slots({
+      links:
+        relations.links,
+
+      images:
+        stitchArrays({
+          image: relations.images,
+          path: data.paths,
+        }).map(({image, path}) =>
+            image.slot('path', path)),
+    }),
+};
diff --git a/src/content/dependencies/generateWikiHomepageAlbumGridRow.js b/src/content/dependencies/generateWikiHomepageAlbumGridRow.js
new file mode 100644
index 00000000..c1d2c79d
--- /dev/null
+++ b/src/content/dependencies/generateWikiHomepageAlbumGridRow.js
@@ -0,0 +1,83 @@
+import {empty, stitchArrays} from '#sugar';
+import {getNewAdditions, getNewReleases} from '#wiki-data';
+
+export default {
+  contentDependencies: ['generateCoverGrid', 'image', 'linkAlbum'],
+  extraDependencies: ['language', 'wikiData'],
+
+  sprawl({albumData}, row) {
+    const sprawl = {};
+
+    switch (row.sourceGroup) {
+      case 'new-releases':
+        sprawl.albums = getNewReleases(row.countAlbumsFromGroup, {albumData});
+        break;
+
+      case 'new-additions':
+        sprawl.albums = getNewAdditions(row.countAlbumsFromGroup, {albumData});
+        break;
+
+      default:
+        sprawl.albums =
+          (row.sourceGroup
+            ? row.sourceGroup.albums
+                .slice()
+                .reverse()
+                .filter(album => album.isListedOnHomepage)
+                .slice(0, row.countAlbumsFromGroup)
+            : []);
+    }
+
+    if (!empty(row.sourceAlbums)) {
+      sprawl.albums.push(...row.sourceAlbums);
+    }
+
+    return sprawl;
+  },
+
+  relations: (relation, sprawl, _row) => ({
+    coverGrid:
+      relation('generateCoverGrid'),
+
+    links:
+      sprawl.albums
+        .map(album => relation('linkAlbum', album)),
+
+    images:
+      sprawl.albums
+        .map(album => relation('image', album.artTags)),
+  }),
+
+  data: (sprawl, _row) => ({
+    names:
+      sprawl.albums
+        .map(album => album.name),
+
+    paths:
+      sprawl.albums
+        .map(album =>
+          (album.hasCoverArt
+            ? ['media.albumCover', album.directory, album.coverArtFileExtension]
+            : null)),
+  }),
+
+  generate: (data, relations, {language}) =>
+    relations.coverGrid.slots({
+      links: relations.links,
+      names: data.names,
+
+      images:
+        stitchArrays({
+          image: relations.images,
+          path: data.paths,
+          name: data.names,
+        }).map(({image, path, name}) =>
+            image.slots({
+              path,
+              missingSourceContent:
+                language.$('misc.coverGrid.noCoverArt', {
+                  album: name,
+                }),
+              })),
+    }),
+};
diff --git a/src/content/dependencies/generateWikiHomepageAlbumsRow.js b/src/content/dependencies/generateWikiHomepageAlbumsRow.js
deleted file mode 100644
index 258e5fe1..00000000
--- a/src/content/dependencies/generateWikiHomepageAlbumsRow.js
+++ /dev/null
@@ -1,115 +0,0 @@
-import {empty, stitchArrays} from '#sugar';
-import {getNewAdditions, getNewReleases} from '#wiki-data';
-
-export default {
-  contentDependencies: [
-    'generateCoverCarousel',
-    'generateCoverGrid',
-    'image',
-    'linkAlbum',
-  ],
-
-  extraDependencies: ['language', 'wikiData'],
-
-  sprawl({albumData}, row) {
-    const sprawl = {};
-
-    switch (row.sourceGroup) {
-      case 'new-releases':
-        sprawl.albums = getNewReleases(row.countAlbumsFromGroup, {albumData});
-        break;
-
-      case 'new-additions':
-        sprawl.albums = getNewAdditions(row.countAlbumsFromGroup, {albumData});
-        break;
-
-      default:
-        sprawl.albums =
-          (row.sourceGroup
-            ? row.sourceGroup.albums
-                .slice()
-                .reverse()
-                .filter(album => album.isListedOnHomepage)
-                .slice(0, row.countAlbumsFromGroup)
-            : []);
-    }
-
-    if (!empty(row.sourceAlbums)) {
-      sprawl.albums.push(...row.sourceAlbums);
-    }
-
-    return sprawl;
-  },
-
-  relations: (relation, sprawl, row) => ({
-    coverGrid:
-      (row.displayStyle === 'grid'
-        ? relation('generateCoverGrid')
-        : null),
-
-    coverCarousel:
-      (row.displayStyle === 'carousel'
-        ? relation('generateCoverCarousel')
-        : null),
-
-    links:
-      sprawl.albums
-        .map(album => relation('linkAlbum', album)),
-
-    images:
-      sprawl.albums
-        .map(album => relation('image', album.artTags)),
-  }),
-
-  data: (sprawl, row) => ({
-    displayStyle:
-      row.displayStyle,
-
-    names:
-      (row.displayStyle === 'grid'
-        ? sprawl.albums
-            .map(album => album.name)
-        : null),
-
-    paths:
-      sprawl.albums
-        .map(album =>
-          (album.hasCoverArt
-            ? ['media.albumCover', album.directory, album.coverArtFileExtension]
-            : null)),
-  }),
-
-  generate(data, relations, {language}) {
-    // Grids and carousels share some slots! Very convenient.
-    const commonSlots = {};
-
-    commonSlots.links =
-      relations.links;
-
-    commonSlots.images =
-      stitchArrays({
-        image: relations.images,
-        path: data.paths,
-        name: data.names ?? data.paths.slice().fill(null),
-      }).map(({image, path, name}) =>
-          image.slots({
-            path,
-            missingSourceContent:
-              language.$('misc.coverGrid.noCoverArt', {
-                [language.onlyIfOptions]: ['album'],
-                album: name,
-              }),
-            }));
-
-    switch (data.displayStyle) {
-      case 'grid':
-        return relations.coverGrid.slots({
-          ...commonSlots,
-          names: data.names,
-        });
-
-      case 'carousel':
-        return relations.coverCarousel.slots(commonSlots);
-    }
-  },
-};
diff --git a/src/content/dependencies/generateWikiHomepageSection.js b/src/content/dependencies/generateWikiHomepageSection.js
index 963c5dde..49a474da 100644
--- a/src/content/dependencies/generateWikiHomepageSection.js
+++ b/src/content/dependencies/generateWikiHomepageSection.js
@@ -2,7 +2,8 @@ export default {
   contentDependencies: [
     'generateColorStyleAttribute',
     'generateWikiHomepageActionsRow',
-    'generateWikiHomepageAlbumsRow',
+    'generateWikiHomepageAlbumCarouselRow',
+    'generateWikiHomepageAlbumGridRow',
   ],
 
   extraDependencies: ['html'],
@@ -15,8 +16,10 @@ export default {
       homepageSection.rows.map(row =>
         (row.type === 'actions'
           ? relation('generateWikiHomepageActionsRow', row)
-       : row.type === 'albums'
-          ? relation('generateWikiHomepageAlbumsRow', row)
+       : row.type === 'album carousel'
+          ? relation('generateWikiHomepageAlbumCarouselRow', row)
+       : row.type === 'album grid'
+          ? relation('generateWikiHomepageAlbumGridRow', row)
           : null)),
   }),
 
diff --git a/src/data/checks.js b/src/data/checks.js
index e8a83c61..58f9daee 100644
--- a/src/data/checks.js
+++ b/src/data/checks.js
@@ -197,7 +197,12 @@ export function filterReferenceErrors(wikiData, {
     }],
 
     ['homepageLayout.sections.rows', {
-      _include: row => row.type === 'albums',
+      _include: row => row.type === 'album carousel',
+      albums: 'album',
+    }],
+
+    ['homepageLayout.sections.rows', {
+      _include: row => row.type === 'album grid',
       sourceGroup: '_homepageSourceGroup',
       sourceAlbums: 'album',
     }],
diff --git a/src/data/things/homepage-layout.js b/src/data/things/homepage-layout.js
index fa352ae7..45059370 100644
--- a/src/data/things/homepage-layout.js
+++ b/src/data/things/homepage-layout.js
@@ -82,8 +82,10 @@ export class HomepageLayout extends Thing {
         switch (document['Row']) {
           case 'actions':
             return HomepageLayoutActionsRow;
-          case 'albums':
-            return HomepageLayoutAlbumsRow;
+          case 'album carousel':
+            return HomepageLayoutAlbumCarouselRow;
+          case 'album grid':
+            return HomepageLayoutAlbumGridRow;
           default:
             throw new TypeError(`Unrecognized row type ${document['Row']}`);
         }
@@ -240,26 +242,41 @@ export class HomepageLayoutActionsRow extends HomepageLayoutRow {
   });
 }
 
-export class HomepageLayoutAlbumsRow extends HomepageLayoutRow {
-  static [Thing.friendlyName] = `Homepage Albums Row`;
+export class HomepageLayoutAlbumCarouselRow extends HomepageLayoutRow {
+  static [Thing.friendlyName] = `Homepage Album Carousel Row`;
 
   static [Thing.getPropertyDescriptors] = (opts, {Album, Group} = opts) => ({
     ...HomepageLayoutRow[Thing.getPropertyDescriptors](opts),
 
     // Update & expose
 
-    displayStyle: {
-      flags: {update: true, expose: true},
+    albums: referenceList({
+      class: input.value(Album),
+      find: soupyFind.input('album'),
+    }),
 
-      update: {
-        validate: is('grid', 'carousel'),
-      },
+    // Expose only
 
-      expose: {
-        transform: (displayStyle) =>
-          displayStyle ?? 'grid',
-      },
+    type: {
+      flags: {expose: true},
+      expose: {compute: () => 'album carousel'},
     },
+  });
+
+  static [Thing.yamlDocumentSpec] = Thing.extendDocumentSpec(HomepageLayoutRow, {
+    fields: {
+      'Albums': {property: 'albums'},
+    },
+  });
+}
+
+export class HomepageLayoutAlbumGridRow extends HomepageLayoutRow {
+  static [Thing.friendlyName] = `Homepage Album Grid Row`;
+
+  static [Thing.getPropertyDescriptors] = (opts, {Album, Group} = opts) => ({
+    ...HomepageLayoutRow[Thing.getPropertyDescriptors](opts),
+
+    // Update & expose
 
     sourceGroup: [
       {
@@ -302,13 +319,12 @@ export class HomepageLayoutAlbumsRow extends HomepageLayoutRow {
 
     type: {
       flags: {expose: true},
-      expose: {compute: () => 'albums'},
+      expose: {compute: () => 'album grid'},
     },
   });
 
   static [Thing.yamlDocumentSpec] = Thing.extendDocumentSpec(HomepageLayoutRow, {
     fields: {
-      'Display Style': {property: 'displayStyle'},
       'Group': {property: 'sourceGroup'},
       'Count': {property: 'countAlbumsFromGroup'},
       'Albums': {property: 'sourceAlbums'},