« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/content/dependencies/generateAlbumGalleryStatsLine.js84
-rw-r--r--src/content/dependencies/generateAlbumReleaseInfo.js2
-rw-r--r--src/content/dependencies/generateGroupGalleryPageAlbumGrid.js15
-rw-r--r--src/content/dependencies/listAlbumsByDuration.js8
-rw-r--r--src/content/dependencies/listAlbumsByTracks.js8
-rw-r--r--src/data/things/album.js4
-rw-r--r--src/strings-default.yaml3
7 files changed, 82 insertions, 42 deletions
diff --git a/src/content/dependencies/generateAlbumGalleryStatsLine.js b/src/content/dependencies/generateAlbumGalleryStatsLine.js
index 75bffb36..09d9a30b 100644
--- a/src/content/dependencies/generateAlbumGalleryStatsLine.js
+++ b/src/content/dependencies/generateAlbumGalleryStatsLine.js
@@ -3,36 +3,56 @@ import {getTotalDuration} from '#wiki-data';
 export default {
   extraDependencies: ['html', 'language'],
 
-  data(album) {
-    return {
-      name: album.name,
-      date: album.date,
-      duration: getTotalDuration(album.tracks),
-      numTracks: album.tracks.length,
-    };
-  },
-
-  generate(data, {html, language}) {
-    const parts = ['albumGalleryPage.statsLine'];
-    const options = {};
-
-    options.tracks =
-      html.tag('b',
-        language.countTracks(data.numTracks, {unit: true}));
-
-    options.duration =
-      html.tag('b',
-        language.formatDuration(data.duration, {unit: true}));
-
-    if (data.date) {
-      parts.push('withDate');
-      options.date =
-        html.tag('b',
-          language.formatDate(data.date));
-    }
-
-    return (
-      html.tag('p', {class: 'quick-info'},
-        language.formatString(...parts, options)));
-  },
+  data: (album) => ({
+    date:
+      album.date,
+
+    hideDuration:
+      album.hideDuration,
+
+    duration:
+      (album.hideDuration
+        ? null
+        : getTotalDuration(album.tracks)),
+
+    tracks:
+      (album.hideDuration
+        ? null
+        : album.tracks.length),
+  }),
+
+  generate: (data, {html, language}) =>
+    html.tag('p', {class: 'quick-info'},
+      {[html.onlyIfContent]: true},
+
+      language.encapsulate('albumGalleryPage.statsLine', workingCapsule => {
+        const workingOptions = {};
+
+        if (data.hideDuration && !data.date) {
+          return html.blank();
+        }
+
+        if (!data.hideDuration) {
+          workingOptions.tracks =
+            html.tag('b',
+              language.countTracks(data.tracks, {unit: true}));
+
+          workingOptions.duration =
+            html.tag('b',
+              language.formatDuration(data.duration, {unit: true}));
+        }
+
+        if (data.date) {
+          workingCapsule += '.withDate';
+          workingOptions.date =
+            html.tag('b',
+              language.formatDate(data.date));
+        }
+
+        if (data.hideDuration) {
+          workingCapsule += '.noDuration';
+        }
+
+        return language.$(workingCapsule, workingOptions);
+      })),
 };
diff --git a/src/content/dependencies/generateAlbumReleaseInfo.js b/src/content/dependencies/generateAlbumReleaseInfo.js
index 2a958244..a156dfec 100644
--- a/src/content/dependencies/generateAlbumReleaseInfo.js
+++ b/src/content/dependencies/generateAlbumReleaseInfo.js
@@ -36,7 +36,7 @@ export default {
         .map(track => track.duration)
         .filter(value => value > 0);
 
-    if (empty(durationTerms)) {
+    if (empty(durationTerms) || album.hideDuration) {
       data.duration = null;
       data.durationApproximate = null;
     } else {
diff --git a/src/content/dependencies/generateGroupGalleryPageAlbumGrid.js b/src/content/dependencies/generateGroupGalleryPageAlbumGrid.js
index 7d9aa2d2..96cadb03 100644
--- a/src/content/dependencies/generateGroupGalleryPageAlbumGrid.js
+++ b/src/content/dependencies/generateGroupGalleryPageAlbumGrid.js
@@ -25,7 +25,10 @@ export default {
       albums.map(album => album.name),
 
     durations:
-      albums.map(album => getTotalDuration(album.tracks)),
+      albums.map(album =>
+        (album.hideDuration
+          ? null
+          : getTotalDuration(album.tracks))),
 
     tracks:
       albums.map(album => album.tracks.length),
@@ -58,9 +61,11 @@ export default {
             tracks: data.tracks,
             duration: data.durations,
           }).map(({tracks, duration}) =>
-              language.$(capsule, 'details.albumLength', {
-                tracks: language.countTracks(tracks, {unit: true}),
-                time: language.formatDuration(duration),
-              })),
+              (duration
+                ? language.$(capsule, 'details.albumLength', {
+                    tracks: language.countTracks(tracks, {unit: true}),
+                    time: language.formatDuration(duration),
+                  })
+                : null)),
       })),
 };
diff --git a/src/content/dependencies/listAlbumsByDuration.js b/src/content/dependencies/listAlbumsByDuration.js
index c60685ab..c28fd800 100644
--- a/src/content/dependencies/listAlbumsByDuration.js
+++ b/src/content/dependencies/listAlbumsByDuration.js
@@ -11,8 +11,12 @@ export default {
   },
 
   query({albumData}, spec) {
-    const albums = sortAlphabetically(albumData.slice());
-    const durations = albums.map(album => getTotalDuration(album.tracks));
+    const albums =
+      sortAlphabetically(
+        albumData.filter(album => !album.hideDuration));
+
+    const durations =
+      albums.map(album => getTotalDuration(album.tracks));
 
     filterByCount(albums, durations);
     sortByCount(albums, durations, {greatestFirst: true});
diff --git a/src/content/dependencies/listAlbumsByTracks.js b/src/content/dependencies/listAlbumsByTracks.js
index 798e6c2e..36bda4f4 100644
--- a/src/content/dependencies/listAlbumsByTracks.js
+++ b/src/content/dependencies/listAlbumsByTracks.js
@@ -10,8 +10,12 @@ export default {
   },
 
   query({albumData}, spec) {
-    const albums = sortAlphabetically(albumData.slice());
-    const counts = albums.map(album => album.tracks.length);
+    const albums =
+      sortAlphabetically(
+        albumData.filter(album => !album.hideDuration));
+
+    const counts =
+      albums.map(album => album.tracks.length);
 
     filterByCount(albums, counts);
     sortByCount(albums, counts, {greatestFirst: true});
diff --git a/src/data/things/album.js b/src/data/things/album.js
index bb11aad8..3350d6da 100644
--- a/src/data/things/album.js
+++ b/src/data/things/album.js
@@ -145,6 +145,8 @@ export class Album extends Thing {
     isListedOnHomepage: flag(true),
     isListedInGalleries: flag(true),
 
+    hideDuration: flag(false),
+
     // > Update & expose - General metadata
 
     color: color(),
@@ -607,6 +609,8 @@ export class Album extends Thing {
       'Listed on Homepage': {property: 'isListedOnHomepage'},
       'Listed in Galleries': {property: 'isListedInGalleries'},
 
+      'Hide Duration': {property: 'hideDuration'},
+
       // General metadata
 
       'Color': {property: 'color'},
diff --git a/src/strings-default.yaml b/src/strings-default.yaml
index c43e757e..372f64c3 100644
--- a/src/strings-default.yaml
+++ b/src/strings-default.yaml
@@ -1178,6 +1178,9 @@ albumGalleryPage:
   statsLine.withDate: >-
     {TRACKS} totaling {DURATION}. Released {DATE}.
 
+  statsLine.withDate.noDuration: >-
+    Released {DATE}.
+
   # coverArtistsLine:
   #   This is displayed if every track (which has artwork at all)
   #   has the same illustration credits.