« 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/flash.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/data/things/flash.js')
-rw-r--r--src/data/things/flash.js150
1 files changed, 150 insertions, 0 deletions
diff --git a/src/data/things/flash.js b/src/data/things/flash.js
new file mode 100644
index 0000000..1383fa8
--- /dev/null
+++ b/src/data/things/flash.js
@@ -0,0 +1,150 @@
+import Thing from './thing.js';
+
+import find from '../../util/find.js';
+
+export class Flash extends Thing {
+  static [Thing.referenceType] = 'flash';
+
+  static [Thing.getPropertyDescriptors] = ({
+    Artist,
+    Track,
+    FlashAct,
+
+    validators: {
+      isDirectory,
+      isNumber,
+      isString,
+      oneOf,
+    },
+  }) => ({
+    // Update & expose
+
+    name: Thing.common.name('Unnamed Flash'),
+
+    directory: {
+      flags: {update: true, expose: true},
+      update: {validate: isDirectory},
+
+      // Flashes expose directory differently from other Things! Their
+      // default directory is dependent on the page number (or ID), not
+      // the name.
+      expose: {
+        dependencies: ['page'],
+        transform(directory, {page}) {
+          if (directory === null && page === null) return null;
+          else if (directory === null) return page;
+          else return directory;
+        },
+      },
+    },
+
+    page: {
+      flags: {update: true, expose: true},
+      update: {validate: oneOf(isString, isNumber)},
+
+      expose: {
+        transform: (value) => (value === null ? null : value.toString()),
+      },
+    },
+
+    date: Thing.common.simpleDate(),
+
+    coverArtFileExtension: Thing.common.fileExtension('jpg'),
+
+    contributorContribsByRef: Thing.common.contribsByRef(),
+
+    featuredTracksByRef: Thing.common.referenceList(Track),
+
+    urls: Thing.common.urls(),
+
+    // Update only
+
+    artistData: Thing.common.wikiData(Artist),
+    trackData: Thing.common.wikiData(Track),
+    flashActData: Thing.common.wikiData(FlashAct),
+
+    // Expose only
+
+    contributorContribs: Thing.common.dynamicContribs('contributorContribsByRef'),
+
+    featuredTracks: Thing.common.dynamicThingsFromReferenceList(
+      'featuredTracksByRef',
+      'trackData',
+      find.track
+    ),
+
+    act: {
+      flags: {expose: true},
+
+      expose: {
+        dependencies: ['flashActData'],
+
+        compute: ({flashActData, [Flash.instance]: flash}) =>
+          flashActData.find((act) => act.flashes.includes(flash)) ?? null,
+      },
+    },
+
+    color: {
+      flags: {expose: true},
+
+      expose: {
+        dependencies: ['flashActData'],
+
+        compute: ({flashActData, [Flash.instance]: flash}) =>
+          flashActData.find((act) => act.flashes.includes(flash))?.color ?? null,
+      },
+    },
+  });
+
+  static [Thing.getSerializeDescriptors] = ({
+    serialize: S,
+  }) => ({
+    name: S.id,
+    page: S.id,
+    directory: S.id,
+    date: S.id,
+    contributors: S.toContribRefs,
+    tracks: S.toRefs,
+    urls: S.id,
+    color: S.id,
+  });
+}
+
+export class FlashAct extends Thing {
+  static [Thing.getPropertyDescriptors] = ({
+    validators: {
+      isColor,
+    },
+  }) => ({
+    // Update & expose
+
+    name: Thing.common.name('Unnamed Flash Act'),
+    color: Thing.common.color(),
+    anchor: Thing.common.simpleString(),
+    jump: Thing.common.simpleString(),
+
+    jumpColor: {
+      flags: {update: true, expose: true},
+      update: {validate: isColor},
+      expose: {
+        dependencies: ['color'],
+        transform: (jumpColor, {color}) =>
+          jumpColor ?? color,
+      }
+    },
+
+    flashesByRef: Thing.common.referenceList(Flash),
+
+    // Update only
+
+    flashData: Thing.common.wikiData(Flash),
+
+    // Expose only
+
+    flashes: Thing.common.dynamicThingsFromReferenceList(
+      'flashesByRef',
+      'flashData',
+      find.flash
+    ),
+  })
+}