« 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.js87
1 files changed, 85 insertions, 2 deletions
diff --git a/src/data/things/artwork.js b/src/data/things/artwork.js
index 2a97fd6d..3cdb07d0 100644
--- a/src/data/things/artwork.js
+++ b/src/data/things/artwork.js
@@ -24,7 +24,7 @@ import {
   parseDimensions,
 } from '#yaml';
 
-import {withPropertyFromObject} from '#composite/data';
+import {withIndexInList, withPropertyFromObject} from '#composite/data';
 
 import {
   exitWithoutDependency,
@@ -44,6 +44,7 @@ import {
 import {
   contentString,
   directory,
+  flag,
   reverseReferenceList,
   simpleString,
   soupyFind,
@@ -52,7 +53,13 @@ import {
   wikiData,
 } from '#composite/wiki-properties';
 
-import {withDate} from '#composite/things/artwork';
+import {
+  withAttachedArtwork,
+  withContainingArtworkList,
+  withContribsFromAttachedArtwork,
+  withPropertyFromAttachedArtwork,
+  withDate,
+} from '#composite/things/artwork';
 
 export class Artwork extends Thing {
   static [Thing.referenceType] = 'artwork';
@@ -68,6 +75,7 @@ export class Artwork extends Thing {
     }),
 
     thing: thing(),
+    thingProperty: simpleString(),
 
     label: simpleString(),
     source: contentString(),
@@ -152,6 +160,8 @@ export class Artwork extends Thing {
       }),
     ],
 
+    attachAbove: flag(false),
+
     artistContribsFromThingProperty: simpleString(),
     artistContribsArtistProperty: simpleString(),
 
@@ -169,6 +179,12 @@ export class Artwork extends Thing {
         mode: input.value('empty'),
       }),
 
+      withContribsFromAttachedArtwork(),
+
+      exposeDependencyOrContinue({
+        dependency: '#attachedArtwork.artistContribs',
+      }),
+
       exitWithoutDependency({
         dependency: 'artistContribsFromThingProperty',
         value: input.value([]),
@@ -207,6 +223,14 @@ export class Artwork extends Thing {
         mode: input.value('empty'),
       }),
 
+      withPropertyFromAttachedArtwork({
+        property: input.value('artTags'),
+      }),
+
+      exposeDependencyOrContinue({
+        dependency: '#attachedArtwork.artTags',
+      }),
+
       exitWithoutDependency({
         dependency: 'artTagsFromThingProperty',
         value: input.value([]),
@@ -302,6 +326,51 @@ export class Artwork extends Thing {
     referencedByArtworks: reverseReferenceList({
       reverse: soupyReverse.input('artworksWhichReference'),
     }),
+
+    isMainArtwork: [
+      withContainingArtworkList(),
+
+      exitWithoutDependency({
+        dependency: '#containingArtworkList',
+        value: input.value(null),
+      }),
+
+      {
+        dependencies: [input.myself(), '#containingArtworkList'],
+        compute: ({
+          [input.myself()]: myself,
+          ['#containingArtworkList']: list,
+        }) =>
+          list[0] === myself,
+      },
+    ],
+
+    mainArtwork: [
+      withContainingArtworkList(),
+
+      exitWithoutDependency({
+        dependency: '#containingArtworkList',
+        value: input.value(null),
+      }),
+
+      {
+        dependencies: ['#containingArtworkList'],
+        compute: ({'#containingArtworkList': list}) =>
+          list[0],
+      },
+    ],
+
+    attachedArtwork: [
+      withAttachedArtwork(),
+
+      exposeDependency({
+        dependency: '#attachedArtwork',
+      }),
+    ],
+
+    attachingArtworks: reverseReferenceList({
+      reverse: soupyReverse.input('artworksWhichAttach'),
+    }),
   });
 
   static [Thing.yamlDocumentSpec] = {
@@ -322,6 +391,8 @@ export class Artwork extends Thing {
         transform: parseDate,
       },
 
+      'Attach Above': {property: 'attachAbove'},
+
       'Artists': {
         property: 'artistContribs',
         transform: parseContributors,
@@ -358,6 +429,18 @@ export class Artwork extends Thing {
       date: ({artwork}) => artwork.date,
     },
 
+    artworksWhichAttach: {
+      bindTo: 'artworkData',
+
+      referencing: referencingArtwork =>
+        (referencingArtwork.attachAbove
+          ? [referencingArtwork]
+          : []),
+
+      referenced: referencingArtwork =>
+        [referencingArtwork.attachedArtwork],
+    },
+
     artworksWhichFeature: {
       bindTo: 'artworkData',