« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/content/dependencies/generateAlbumCommentaryPage.js68
-rw-r--r--src/content/dependencies/generateAlbumGalleryStatsLine.js12
-rw-r--r--src/content/dependencies/generateAlbumSocialEmbedDescription.js11
-rw-r--r--src/content/dependencies/generateTrackReleaseInfo.js14
-rw-r--r--src/data/things/Track.js31
-rw-r--r--src/data/things/album/Album.js36
-rw-r--r--src/strings-default.yaml54
7 files changed, 180 insertions, 46 deletions
diff --git a/src/content/dependencies/generateAlbumCommentaryPage.js b/src/content/dependencies/generateAlbumCommentaryPage.js
index 0d7fb2cb..02755cf2 100644
--- a/src/content/dependencies/generateAlbumCommentaryPage.js
+++ b/src/content/dependencies/generateAlbumCommentaryPage.js
@@ -96,10 +96,18 @@ export default {
     data.name = album.name;
     data.color = album.color;
     data.date = album.date;
+    data.dateStyle = album.dateStyle;
 
     data.trackCommentaryTrackDates =
       query.tracksWithCommentary
-        .map(track => track.dateFirstReleased);
+        .map(track =>
+          (+track.date !== +album.date
+            ? track.date
+            : null));
+
+    data.trackCommentaryTrackDateStyles =
+      query.tracksWithCommentary
+        .map(track => track.dateStyle);
 
     data.trackCommentaryDirectories =
       query.tracksWithCommentary
@@ -136,10 +144,21 @@ export default {
             [
               data.date &&
               relations.totals.entryCount >= 1 &&
-                language.$('releaseInfo.albumReleased', {
-                  date:
-                    html.tag('b',
-                      language.formatDate(data.date)),
+                language.encapsulate('releaseInfo', workingCapsule => {
+                  const workingOptions = {};
+
+                  workingOptions.date =
+                    html.tag('b', language.formatDate(data.date));
+
+                  if (data.dateStyle === 'released') {
+                    workingCapsule += '.albumReleased';
+                  } else if (data.dateStyle === 'posted') {
+                    workingCapsule += '.albumPosted';
+                  } else {
+                    return html.blank();
+                  }
+
+                  return language.$(workingCapsule, workingOptions);
                 }),
 
               language.encapsulate(pageCapsule, 'infoLine', workingCapsule => {
@@ -211,6 +230,7 @@ export default {
             entries: relations.trackCommentaryEntries,
             color: data.trackCommentaryColors,
             trackDate: data.trackCommentaryTrackDates,
+            trackDateStyle: data.trackCommentaryTrackDateStyles,
           }).map(({
               heading,
               link,
@@ -220,6 +240,7 @@ export default {
               entries,
               color,
               trackDate,
+              trackDateStyle,
             }) =>
               language.encapsulate(pageCapsule, 'entry', entryCapsule => [
                 language.encapsulate(entryCapsule, 'title.trackCommentary', titleCapsule =>
@@ -243,20 +264,37 @@ export default {
                       }),
                   })),
 
-              cover?.slots({
-                mode: 'commentary',
-                color: true,
-              }),
+                cover?.slots({
+                  mode: 'commentary',
+                  color: true,
+                }),
 
-              trackDate &&
-              trackDate !== data.date &&
                 html.tag('p', {class: 'track-info'},
-                  language.$('releaseInfo.trackReleased', {
-                    date: language.formatDate(trackDate),
+                  {[html.onlyIfContent]: true},
+
+                  language.encapsulate('releaseInfo', workingCapsule => {
+                    const workingOptions = {};
+
+                    if (!trackDate) {
+                      return html.blank();
+                    }
+
+                    workingOptions.date =
+                      language.formatDate(trackDate);
+
+                    if (trackDateStyle === 'released') {
+                      workingCapsule += '.trackReleased';
+                    } else if (trackDateStyle === 'posted') {
+                      workingCapsule += '.trackPosted';
+                    } else {
+                      return html.blank();
+                    }
+
+                    return language.$(workingCapsule, workingOptions);
                   })),
 
-              entries.map(entry => entry.slot('color', color)),
-            ])),
+                entries.map(entry => entry.slot('color', color)),
+              ])),
         ],
 
         navLinkStyle: 'hierarchical',
diff --git a/src/content/dependencies/generateAlbumGalleryStatsLine.js b/src/content/dependencies/generateAlbumGalleryStatsLine.js
index 75341937..394be6b8 100644
--- a/src/content/dependencies/generateAlbumGalleryStatsLine.js
+++ b/src/content/dependencies/generateAlbumGalleryStatsLine.js
@@ -5,6 +5,9 @@ export default {
     date:
       album.date,
 
+    dateStyle:
+      album.dateStyle,
+
     hideDuration:
       album.hideDuration,
 
@@ -40,8 +43,13 @@ export default {
               language.formatDuration(data.duration, {unit: true}));
         }
 
-        if (data.date) {
-          workingCapsule += '.withDate';
+        if (data.dateStyle === 'released') {
+          workingCapsule += '.withDateReleased';
+          workingOptions.date =
+            html.tag('b',
+              language.formatDate(data.date));
+        } else if (data.dateStyle === 'posted') {
+          workingCapsule += '.withDatePosted';
           workingOptions.date =
             html.tag('b',
               language.formatDate(data.date));
diff --git a/src/content/dependencies/generateAlbumSocialEmbedDescription.js b/src/content/dependencies/generateAlbumSocialEmbedDescription.js
index db6da5b7..f584b59e 100644
--- a/src/content/dependencies/generateAlbumSocialEmbedDescription.js
+++ b/src/content/dependencies/generateAlbumSocialEmbedDescription.js
@@ -10,6 +10,9 @@ export default {
 
     date:
       album.date,
+
+    dateStyle:
+      album.dateStyle,
   }),
 
   generate: (data, {language}) =>
@@ -28,8 +31,12 @@ export default {
           language.countTracks(data.tracks, {unit: true});
       }
 
-      if (data.date) {
-        workingCapsule += '.withReleaseDate';
+      if (data.dateStyle === 'released') {
+        workingCapsule += '.withDateReleased';
+        workingOptions.date =
+          language.formatDate(data.date);
+      } else if (data.dateStyle === 'posted') {
+        workingCapsule += '.withDatePosted';
         workingOptions.date =
           language.formatDate(data.date);
       }
diff --git a/src/content/dependencies/generateTrackReleaseInfo.js b/src/content/dependencies/generateTrackReleaseInfo.js
index 001f5a54..b610188a 100644
--- a/src/content/dependencies/generateTrackReleaseInfo.js
+++ b/src/content/dependencies/generateTrackReleaseInfo.js
@@ -22,6 +22,7 @@ export default {
 
     data.name = track.name;
     data.date = track.date;
+    data.dateStyle = track.dateStyle;
     data.duration = track.duration;
 
     const {album} = track;
@@ -65,10 +66,15 @@ export default {
             });
           }),
 
-          language.$(capsule, 'released', {
-            [language.onlyIfOptions]: ['date'],
-            date: language.formatDate(data.date),
-          }),
+          (data.dateStyle === 'released'
+            ? language.$(capsule, 'released', {
+                date: language.formatDate(data.date),
+              })
+         : data.dateStyle === 'posted'
+            ? language.$(capsule, 'posted', {
+                date: language.formatDate(data.date),
+              })
+            : html.blank()),
 
           language.$(capsule, 'duration', {
             [language.onlyIfOptions]: ['duration'],
diff --git a/src/data/things/Track.js b/src/data/things/Track.js
index 7eff2000..6fc38e5d 100644
--- a/src/data/things/Track.js
+++ b/src/data/things/Track.js
@@ -282,6 +282,7 @@ export class Track extends Thing {
     additionalNames: thingList(V(AdditionalName)),
 
     dateFirstReleased: simpleDate(),
+    datePosted: simpleDate(),
 
     // > Update & expose - Credits and contributors
 
@@ -721,11 +722,30 @@ export class Track extends Thing {
       },
 
       exposeDependencyOrContinue('dateFirstReleased'),
+      exposeDependencyOrContinue('datePosted'),
 
       withPropertyFromObject('album', V('date')),
       exposeDependency('#album.date'),
     ],
 
+    dateStyle: [
+      exitWithoutDependency('date'),
+
+      {
+        dependencies: ['_dateFirstReleased', '_datePosted'],
+        compute: (continuation, {
+          ['_dateFirstReleased']: dateFirstReleased,
+          ['_datePosted']: datePosted,
+        }) =>
+          (dateFirstReleased ? 'released'
+         : datePosted        ? 'posted'
+                             : continuation()),
+      },
+
+      withPropertyFromObject('album', V('dateStyle')),
+      exposeDependency('#album.dateStyle'),
+    ],
+
     trackNumber: [
       // Zero is the fallback, not one, but in most albums the first track
       // (and its intended output by this composition) will be one.
@@ -1060,10 +1080,8 @@ export class Track extends Thing {
         transform: parseAdditionalNames,
       },
 
-      'Date First Released': {
-        property: 'dateFirstReleased',
-        transform: parseDate,
-      },
+      'Date First Released': {property: 'dateFirstReleased', transform: parseDate},
+      'Date Posted': {property: 'datePosted', transform: parseDate},
 
       // Credits and contributors
 
@@ -1240,6 +1258,11 @@ export class Track extends Thing {
         ],
       },
 
+      {message: `Only one unique date per track is supported`, fields: [
+        'Date First Released',
+        'Date Posted',
+      ]},
+
       {message: `Don't include URLs alongside Excluding URLs, unless Excluding URLs is false`, fields: [
         'URLs',
         ['Excluding URLs', v => v !== false],
diff --git a/src/data/things/album/Album.js b/src/data/things/album/Album.js
index 47abb73a..1a07656a 100644
--- a/src/data/things/album/Album.js
+++ b/src/data/things/album/Album.js
@@ -223,7 +223,8 @@ export class Album extends Thing {
 
     additionalNames: thingList(V(AdditionalName)),
 
-    date: simpleDate(),
+    dateReleased: simpleDate(),
+    datePosted: simpleDate(),
     dateAddedToWiki: simpleDate(),
 
     // > Update & expose - Credits and contributors
@@ -527,6 +528,27 @@ export class Album extends Thing {
       withFlattenedList('#trackSections.tracks'),
       exposeDependency('#flattenedList'),
     ],
+
+    date: [
+      exposeDependencyOrContinue('dateReleased'),
+      exposeDependencyOrContinue('datePosted'),
+      exposeConstant(V(null)),
+    ],
+
+    dateStyle: [
+      exitWithoutDependency('date'),
+
+      {
+        dependencies: ['_dateReleased', '_datePosted'],
+        compute: ({
+          ['_dateReleased']: dateReleased,
+          ['_datePosted']: datePosted,
+        }) =>
+          (dateReleased ? 'released'
+         : datePosted   ? 'posted'
+                        : null),
+      },
+    ]
   });
 
   static [Thing.getSerializeDescriptors] = ({
@@ -721,15 +743,9 @@ export class Album extends Thing {
         transform: parseAdditionalNames,
       },
 
-      'Date': {
-        property: 'date',
-        transform: parseDate,
-      },
-
-      'Date Added': {
-        property: 'dateAddedToWiki',
-        transform: parseDate,
-      },
+      'Date': {property: 'dateReleased', transform: parseDate},
+      'Date Posted': {property: 'datePosted', transform: parseDate},
+      'Date Added': {property: 'dateAddedToWiki', transform: parseDate},
 
       // Credits and contributors
 
diff --git a/src/strings-default.yaml b/src/strings-default.yaml
index 4e1bf94c..ee7dff25 100644
--- a/src/strings-default.yaml
+++ b/src/strings-default.yaml
@@ -292,6 +292,11 @@ releaseInfo:
   released: "Released {DATE}."
   albumReleased: "Album released {DATE}."
   trackReleased: "Track released {DATE}."
+
+  posted: "Posted {DATE}."
+  albumPosted: "Album posted {DATE}."
+  trackPosted: "Track posted {DATE}."
+
   addedToWiki: "Added to wiki {DATE}."
 
   unofficialName: >-
@@ -1394,13 +1399,38 @@ albumPage:
     #   string, ex. "63 tracks".
 
     body:
-      withDuration: "{DURATION}."
-      withTracks: "{TRACKS}."
-      withReleaseDate: Released {DATE}.
-      withDuration.withTracks: "{DURATION}, {TRACKS}."
-      withDuration.withReleaseDate: "{DURATION}. Released {DATE}."
-      withTracks.withReleaseDate: "{TRACKS}. Released {DATE}."
-      withDuration.withTracks.withReleaseDate: "{DURATION}, {TRACKS}. Released {DATE}."
+      withDuration: >-
+        {DURATION}.
+
+      withTracks: >-
+        {TRACKS}.
+
+      withDateReleased: >-
+        Released {DATE}.
+
+      withDatePosted: >-
+        Posted {DATE}.
+
+      withDuration.withTracks: >-
+        {DURATION}, {TRACKS}.
+
+      withDuration.withDateReleased: >-
+        {DURATION}. Released {DATE}.
+
+      withDuration.withDatePosted: >-
+        {DURATION}. Posted {DATE}.
+
+      withTracks.withDateReleased: >-
+        {TRACKS}. Released {DATE}.
+
+      withTracks.withDatePosted: >-
+        {DURATION}. Posted {DATE}.
+
+      withDuration.withTracks.withDateReleased: >-
+        {DURATION}, {TRACKS}. Released {DATE}.
+
+      withDuration.withTracks.withDatePosted: >-
+        {DURATION}, {TRACKS}. Posted {DATE}.
 
 #
 # albumGalleryPage:
@@ -1421,12 +1451,18 @@ albumGalleryPage:
   statsLine: >-
     {TRACKS} totaling {DURATION}.
 
-  statsLine.withDate: >-
+  statsLine.withDateReleased: >-
     {TRACKS} totaling {DURATION}. Released {DATE}.
 
-  statsLine.withDate.noDuration: >-
+  statsLine.withDatePosted: >-
+    {TRACKS} totaling {DURATION}. Posted {DATE}.
+
+  statsLine.withDateReleased.noDuration: >-
     Released {DATE}.
 
+  statsLine.withDatePosted.noDuration: >-
+    Posted {DATE}.
+
   # coverArtistsLine:
   #   This is displayed if every track (which has artwork at all)
   #   has the same illustration credits.