« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/thing/homepage-layout.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/thing/homepage-layout.js')
-rw-r--r--src/thing/homepage-layout.js99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/thing/homepage-layout.js b/src/thing/homepage-layout.js
new file mode 100644
index 0000000..4717391
--- /dev/null
+++ b/src/thing/homepage-layout.js
@@ -0,0 +1,99 @@
+import CacheableObject from './cacheable-object.js';
+
+import {
+    isColor,
+    isCountingNumber,
+    isName,
+    isString,
+    oneOf,
+    validateArrayItems,
+    validateInstanceOf,
+    validateReference,
+    validateReferenceList,
+} from './validators.js';
+
+export class HomepageLayoutRow extends CacheableObject {
+    static propertyDescriptors = {
+        // Update & expose
+
+        name: {
+            flags: {update: true, expose: true},
+            update: {validate: isName}
+        },
+
+        type: {
+            flags: {update: true, expose: true},
+
+            update: {
+                validate(value) {
+                    throw new Error(`'type' property validator must be overridden`);
+                }
+            }
+        },
+
+        color: {
+            flags: {update: true, expose: true},
+            update: {validate: isColor}
+        },
+    };
+}
+
+export class HomepageLayoutAlbumsRow extends HomepageLayoutRow {
+    static propertyDescriptors = {
+        ...HomepageLayoutRow.propertyDescriptors,
+
+        // Update & expose
+
+        type: {
+            flags: {update: true, expose: true},
+            update: {
+                validate(value) {
+                    if (value !== 'albums') {
+                        throw new TypeError(`Expected 'albums'`);
+                    }
+
+                    return true;
+                }
+            }
+        },
+
+        sourceGroupByRef: {
+            flags: {update: true, expose: true},
+            update: {validate: validateReference('group')}
+        },
+
+        sourceAlbumsByRef: {
+            flags: {update: true, expose: true},
+            update: {validate: validateReferenceList('album')}
+        },
+
+        countAlbumsFromGroup: {
+            flags: {update: true, expose: true},
+            update: {validate: isCountingNumber}
+        },
+
+        actionLinks: {
+            flags: {update: true, expose: true},
+            update: {validate: validateArrayItems(isString)}
+        },
+    }
+}
+
+export default class HomepageLayout extends CacheableObject {
+    static propertyDescriptors = {
+        // Update & expose
+
+        sidebarContent: {
+            flags: {update: true, expose: true},
+            update: {validate: isString}
+        },
+
+        rows: {
+            flags: {update: true, expose: true},
+
+            update: {
+                validate: validateArrayItems(validateInstanceOf(HomepageLayoutRow))
+            }
+        },
+    };
+}