« get me outta code hell

data: AdditionalFile - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/data
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2025-05-16 11:17:37 -0300
committer(quasar) nebula <qznebula@protonmail.com>2025-05-16 11:17:55 -0300
commit8461875e45c33fdec5a904b8137a9342bafc6c46 (patch)
treeb3d6baae1b1d72abaacf52ebf07d9ff3ec515df2 /src/data
parent1e700dfcc1e31376e1a6809f3c5841560e1e16d7 (diff)
data: AdditionalFile
Diffstat (limited to 'src/data')
-rw-r--r--src/data/composite/wiki-properties/additionalFiles.js30
-rw-r--r--src/data/composite/wiki-properties/index.js1
-rw-r--r--src/data/things/additional-file.js36
-rw-r--r--src/data/things/album.js6
-rw-r--r--src/data/things/index.js2
-rw-r--r--src/data/things/track.js16
-rw-r--r--src/data/yaml.js8
7 files changed, 56 insertions, 43 deletions
diff --git a/src/data/composite/wiki-properties/additionalFiles.js b/src/data/composite/wiki-properties/additionalFiles.js
deleted file mode 100644
index 6760527a..00000000
--- a/src/data/composite/wiki-properties/additionalFiles.js
+++ /dev/null
@@ -1,30 +0,0 @@
-// This is a somewhat more involved data structure - it's for additional
-// or "bonus" files associated with albums or tracks (or anything else).
-// It's got this form:
-//
-//   [
-//     {title: 'Booklet', files: ['Booklet.pdf']},
-//     {
-//       title: 'Wallpaper',
-//       description: 'Cool Wallpaper!',
-//       files: ['1440x900.png', '1920x1080.png']
-//     },
-//     {title: 'Alternate Covers', description: null, files: [...]},
-//     ...
-//   ]
-//
-
-import {isAdditionalFileList} from '#validators';
-
-// TODO: Not templateCompositeFrom.
-
-export default function() {
-  return {
-    flags: {update: true, expose: true},
-    update: {validate: isAdditionalFileList},
-    expose: {
-      transform: (additionalFiles) =>
-        additionalFiles ?? [],
-    },
-  };
-}
diff --git a/src/data/composite/wiki-properties/index.js b/src/data/composite/wiki-properties/index.js
index d5e7657e..b45eef13 100644
--- a/src/data/composite/wiki-properties/index.js
+++ b/src/data/composite/wiki-properties/index.js
@@ -3,7 +3,6 @@
 // Entries here may depend on entries in #composite/control-flow,
 // #composite/data, and #composite/wiki-data.
 
-export {default as additionalFiles} from './additionalFiles.js';
 export {default as additionalNameList} from './additionalNameList.js';
 export {default as annotatedReferenceList} from './annotatedReferenceList.js';
 export {default as color} from './color.js';
diff --git a/src/data/things/additional-file.js b/src/data/things/additional-file.js
new file mode 100644
index 00000000..3bf3dce9
--- /dev/null
+++ b/src/data/things/additional-file.js
@@ -0,0 +1,36 @@
+import {input} from '#composite';
+import Thing from '#thing';
+import {isString, validateArrayItems} from '#validators';
+
+import {contentString, simpleString} from '#composite/wiki-properties';
+
+import {exposeConstant, exposeUpdateValueOrContinue}
+  from '#composite/control-flow';
+
+export class AdditionalFile extends Thing {
+  static [Thing.getPropertyDescriptors] = ({}) => ({
+    // Update & expose
+
+    title: simpleString(),
+
+    description: contentString(),
+
+    files: [
+      exposeUpdateValueOrContinue({
+        validate: input.value(validateArrayItems(isString)),
+      }),
+
+      exposeConstant({
+        value: input.value(null),
+      }),
+    ],
+  });
+
+  static [Thing.yamlDocumentSpec] = {
+    fields: {
+      'Title': {property: 'title'},
+      'Description': {property: 'description'},
+      'Files': {property: 'files'},
+    },
+  };
+}
diff --git a/src/data/things/album.js b/src/data/things/album.js
index c71b9820..37d01233 100644
--- a/src/data/things/album.js
+++ b/src/data/things/album.js
@@ -33,7 +33,6 @@ import {exitWithoutContribs, withDirectory, withCoverArtDate}
   from '#composite/wiki-data';
 
 import {
-  additionalFiles,
   additionalNameList,
   color,
   commentatorArtists,
@@ -69,6 +68,7 @@ export class Album extends Thing {
   static [Thing.referenceType] = 'album';
 
   static [Thing.getPropertyDescriptors] = ({
+    AdditionalFile,
     ArtTag,
     Artwork,
     CommentaryEntry,
@@ -216,7 +216,9 @@ export class Album extends Thing {
       class: input.value(CreditingSourcesEntry),
     }),
 
-    additionalFiles: additionalFiles(),
+    additionalFiles: thingList({
+      class: input.value(AdditionalFile),
+    }),
 
     trackSections: thingList({
       class: input.value(TrackSection),
diff --git a/src/data/things/index.js b/src/data/things/index.js
index b832ab75..3fda2bd1 100644
--- a/src/data/things/index.js
+++ b/src/data/things/index.js
@@ -9,6 +9,7 @@ import * as serialize from '#serialize';
 import {withEntries} from '#sugar';
 import Thing from '#thing';
 
+import * as additionalFileClasses from './additional-file.js';
 import * as albumClasses from './album.js';
 import * as artTagClasses from './art-tag.js';
 import * as artistClasses from './artist.js';
@@ -26,6 +27,7 @@ import * as trackClasses from './track.js';
 import * as wikiInfoClasses from './wiki-info.js';
 
 const allClassLists = {
+  'additional-file.js': additionalFileClasses,
   'album.js': albumClasses,
   'art-tag.js': artTagClasses,
   'artist.js': artistClasses,
diff --git a/src/data/things/track.js b/src/data/things/track.js
index 57aaa90d..2c5e4fd7 100644
--- a/src/data/things/track.js
+++ b/src/data/things/track.js
@@ -38,7 +38,6 @@ import {
 } from '#composite/wiki-data';
 
 import {
-  additionalFiles,
   additionalNameList,
   commentatorArtists,
   constitutibleArtworkList,
@@ -86,6 +85,7 @@ export class Track extends Thing {
   static [Thing.referenceType] = 'track';
 
   static [Thing.getPropertyDescriptors] = ({
+    AdditionalFile,
     Album,
     ArtTag,
     Artwork,
@@ -240,9 +240,17 @@ export class Track extends Thing {
       }),
     ],
 
-    additionalFiles: additionalFiles(),
-    sheetMusicFiles: additionalFiles(),
-    midiProjectFiles: additionalFiles(),
+    additionalFiles: thingList({
+      class: input.value(AdditionalFile),
+    }),
+
+    sheetMusicFiles: thingList({
+      class: input.value(AdditionalFile),
+    }),
+
+    midiProjectFiles: thingList({
+      class: input.value(AdditionalFile),
+    }),
 
     mainReleaseTrack: singleReference({
       class: input.value(Track),
diff --git a/src/data/yaml.js b/src/data/yaml.js
index 6abb3fb7..80fb2e87 100644
--- a/src/data/yaml.js
+++ b/src/data/yaml.js
@@ -611,15 +611,11 @@ export function parseContributors(entries) {
   });
 }
 
-export function parseAdditionalFiles(entries) {
+export function parseAdditionalFiles(entries, {subdoc, AdditionalFile}) {
   return parseArrayEntries(entries, item => {
     if (typeof item !== 'object') return item;
 
-    return {
-      title: item['Title'],
-      description: item['Description'] ?? null,
-      files: item['Files'],
-    };
+    return subdoc(AdditionalFile, item);
   });
 }