« 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/artwork.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/data/things/artwork.js')
-rw-r--r--src/data/things/artwork.js97
1 files changed, 97 insertions, 0 deletions
diff --git a/src/data/things/artwork.js b/src/data/things/artwork.js
new file mode 100644
index 00000000..86cf6c8a
--- /dev/null
+++ b/src/data/things/artwork.js
@@ -0,0 +1,97 @@
+import {input} from '#composite';
+import Thing from '#thing';
+import {isContributionList, isDate} from '#validators';
+import {parseContributors} from '#yaml';
+
+import {withRecontextualizedContributionList, withResolvedContribs}
+  from '#composite/wiki-data';
+import {referenceList, simpleString, soupyFind, thing}
+  from '#composite/wiki-properties';
+
+import {
+  exposeDependency,
+  exposeDependencyOrContinue,
+  exposeUpdateValueOrContinue,
+} from '#composite/control-flow';
+
+import {withDate} from '#composite/things/artwork';
+
+export class Artwork extends Thing {
+  static [Thing.referenceType] = 'artwork';
+
+  static [Thing.getPropertyDescriptors] = ({
+    ArtTag,
+    Contribution,
+  }) => ({
+    // Update & expose
+
+    thing: thing(),
+
+    artTags: referenceList({
+      class: input.value(ArtTag),
+      find: soupyFind.input('artTag'),
+    }),
+
+    artistContribsFromThingProperty: simpleString(),
+    artistContribsArtistProperty: simpleString(),
+
+    artistContribs: [
+      withDate(),
+
+      withResolvedContribs({
+        from: input.updateValue({validate: isContributionList}),
+        date: '#date',
+        artistProperty: 'artistContribsArtistProperty',
+      }),
+
+      exposeDependencyOrContinue({
+        dependency: '#resolvedContribs',
+        mode: input.value('empty'),
+      }),
+
+      {
+        dependencies: ['thing', 'artistContribsFromThingProperty'],
+        compute: (continuation, {thing, artistContribsFromThingProperty}) =>
+          (artistContribsFromThingProperty
+            ? continuation({
+                '#artistContribs':
+                  thing[artistContribsFromThingProperty],
+              })
+            : continuation.exit(null)),
+      },
+
+      withRecontextualizedContributionList({
+        list: '#artistContribs',
+      }),
+
+      exposeDependency({
+        dependency: '#artistContribs',
+      }),
+    ],
+
+    dateFromThingProperty: simpleString(),
+
+    date: [
+      withDate({
+        from: input.updateValue({validate: isDate}),
+      }),
+
+      exposeDependency({dependency: '#date'}),
+    ],
+
+    // Update only
+
+    find: soupyFind(),
+  });
+
+  static [Thing.yamlDocumentSpec] = {
+    fields: {
+      'Artists': {
+        property: 'artistContribs',
+        transform: parseContributors,
+      },
+
+      'Art Tags': {property: 'artTags'},
+    },
+  };
+}