From ef2dc03808609ae0474ddc6f2d92a7efb6427d14 Mon Sep 17 00:00:00 2001
From: Auri <me@aurieh.me>
Date: Tue, 11 Dec 2018 10:17:05 +0100
Subject: [PATCH] Resolve "UI for multi-disc albums"

---
 changes/changelog.d/631.enhacement     |  1 +
 front/src/App.vue                      |  8 +++++
 front/src/components/library/Album.vue | 42 +++++++++++++++++++++-----
 3 files changed, 44 insertions(+), 7 deletions(-)
 create mode 100644 changes/changelog.d/631.enhacement

diff --git a/changes/changelog.d/631.enhacement b/changes/changelog.d/631.enhacement
new file mode 100644
index 00000000..faafd8c2
--- /dev/null
+++ b/changes/changelog.d/631.enhacement
@@ -0,0 +1 @@
+Add UI elements for multi-disc albums (#631)
diff --git a/front/src/App.vue b/front/src/App.vue
index c4c5edb0..6e6f45ff 100644
--- a/front/src/App.vue
+++ b/front/src/App.vue
@@ -392,4 +392,12 @@ button.reset {
 [role="button"] {
   cursor: pointer;
 }
+
+.left.floated {
+  float: left;
+}
+
+.right.floated {
+  float: right;
+}
 </style>
diff --git a/front/src/components/library/Album.vue b/front/src/components/library/Album.vue
index 943aa9fc..9a4adfaf 100644
--- a/front/src/components/library/Album.vue
+++ b/front/src/components/library/Album.vue
@@ -39,12 +39,27 @@
           </a>
         </div>
       </section>
-      <section class="ui vertical stripe segment">
-        <h2>
-          <translate>Tracks</translate>
-        </h2>
-        <track-table v-if="album" :artist="album.artist" :display-position="true" :tracks="album.tracks"></track-table>
-      </section>
+      <template v-if="discs && discs.length > 1">
+        <section v-for="(tracks, disc_number) in discs" class="ui vertical stripe segment">
+          <translate
+            tag="h2"
+            class="left floated"
+            :translate-params="{number: disc_number + 1}"
+          >Volume %{ number }</translate>
+          <play-button class="right floated orange" :tracks="tracks">
+            <translate>Play all</translate>
+          </play-button>
+          <track-table :artist="album.artist" :display-position="true" :tracks="tracks"></track-table>
+        </section>
+      </template>
+      <template v-else>
+        <section class="ui vertical stripe segment">
+          <h2>
+            <translate>Tracks</translate>
+          </h2>
+          <track-table v-if="album" :artist="album.artist" :display-position="true" :tracks="album.tracks"></track-table>
+        </section>
+      </template>
       <section class="ui vertical stripe segment">
         <h2>
           <translate>User libraries</translate>
@@ -67,6 +82,17 @@ import LibraryWidget from "@/components/federation/LibraryWidget"
 
 const FETCH_URL = "albums/"
 
+function groupByDisc(acc, track) {
+  var dn = track.disc_number - 1
+  if (dn < 0) dn = 0
+  if (acc[dn] == undefined) {
+    acc.push([track])
+  } else {
+    acc[dn].push(track)
+  }
+  return acc
+}
+
 export default {
   props: ["id"],
   components: {
@@ -77,7 +103,8 @@ export default {
   data() {
     return {
       isLoading: true,
-      album: null
+      album: null,
+      discs: []
     }
   },
   created() {
@@ -91,6 +118,7 @@ export default {
       logger.default.debug('Fetching album "' + this.id + '"')
       axios.get(url).then(response => {
         self.album = backend.Album.clean(response.data)
+        self.discs = self.album.tracks.reduce(groupByDisc, [])
         self.isLoading = false
       })
     }
-- 
GitLab