« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/data/things/homepage-layout/HomepageLayoutAlbumGridRow.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/data/things/homepage-layout/HomepageLayoutAlbumGridRow.js')
-rw-r--r--src/data/things/homepage-layout/HomepageLayoutAlbumGridRow.js68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/data/things/homepage-layout/HomepageLayoutAlbumGridRow.js b/src/data/things/homepage-layout/HomepageLayoutAlbumGridRow.js
new file mode 100644
index 00000000..fafeb1ed
--- /dev/null
+++ b/src/data/things/homepage-layout/HomepageLayoutAlbumGridRow.js
@@ -0,0 +1,68 @@
+import {input, V} from '#composite';
+import Thing from '#thing';
+
+import {anyOf, is, isCountingNumber, validateReference} from '#validators';
+
+import {exposeConstant, exposeDependency} from '#composite/control-flow';
+import {withResolvedReference} from '#composite/wiki-data';
+import {referenceList, soupyFind} from '#composite/wiki-properties';
+
+import {HomepageLayoutRow} from './HomepageLayoutRow.js';
+
+export class HomepageLayoutAlbumGridRow extends HomepageLayoutRow {
+  static [Thing.friendlyName] = `Homepage Album Grid Row`;
+
+  static [Thing.getPropertyDescriptors] = (opts, {Album, Group} = opts) => ({
+    // Update & expose
+
+    sourceGroup: [
+      {
+        flags: {expose: true, update: true, compose: true},
+
+        update: {
+          validate:
+            anyOf(
+              is('new-releases', 'new-additions'),
+              validateReference(Group[Thing.referenceType])),
+        },
+
+        expose: {
+          transform: (value, continuation) =>
+            (value === 'new-releases' || value === 'new-additions'
+              ? value
+              : continuation(value)),
+        },
+      },
+
+      withResolvedReference({
+        ref: input.updateValue(),
+        find: soupyFind.input('group'),
+      }),
+
+      exposeDependency('#resolvedReference'),
+    ],
+
+    sourceAlbums: referenceList({
+      class: input.value(Album),
+      find: soupyFind.input('album'),
+    }),
+
+    countAlbumsFromGroup: {
+      flags: {update: true, expose: true},
+      update: {validate: isCountingNumber},
+    },
+
+    // Expose only
+
+    isHomepageLayoutAlbumGridRow: exposeConstant(V(true)),
+    type: exposeConstant(V('album grid')),
+  });
+
+  static [Thing.yamlDocumentSpec] = {
+    fields: {
+      'Group': {property: 'sourceGroup'},
+      'Count': {property: 'countAlbumsFromGroup'},
+      'Albums': {property: 'sourceAlbums'},
+    },
+  };
+}