diff --git a/approot/artist.xml b/approot/artist.xml index 070c46c7..b3252bf0 100644 --- a/approot/artist.xml +++ b/approot/artist.xml @@ -13,13 +13,13 @@ ${releases class="list-group"} - + ${name} diff --git a/approot/release.xml b/approot/release.xml index 68def396..dcefa70c 100644 --- a/approot/release.xml +++ b/approot/release.xml @@ -16,11 +16,16 @@

${name}

${artist-name}

${}${year}${}${} (${orig-year})${}

+ ${clusters} ${play-btn}${add-btn} ${tracks}
+ + ${name} + + ${}${disc-number}-${}${}${track-number}. ${} ${}${artist-name} - ${} diff --git a/src/database/DbArtist.cpp b/src/database/DbArtist.cpp index bd871e7f..ec08bc52 100644 --- a/src/database/DbArtist.cpp +++ b/src/database/DbArtist.cpp @@ -202,6 +202,4 @@ Artist::getClusters(int size) const return std::vector(res.begin(), res.end()); } - - } // namespace Database diff --git a/src/database/Release.cpp b/src/database/Release.cpp index 134db031..73c65bdf 100644 --- a/src/database/Release.cpp +++ b/src/database/Release.cpp @@ -225,4 +225,23 @@ Release::getTracks(const std::set& clusterIds) const return std::vector< Wt::Dbo::ptr > (res.begin(), res.end()); } +std::vector> +Release::getClusters(int size) const +{ + assert(self()); + assert(self()->id() != Wt::Dbo::dbo_traits::invalidId() ); + assert(session()); + + Wt::Dbo::Query query = session()->query + ("select c from cluster c INNER JOIN track t ON c.id = t_c.cluster_id INNER JOIN track_cluster t_c ON t_c.track_id = t.id INNER JOIN release r ON t.release_id = r.id") + .where("r.id = ?").bind(self()->id()) + .groupBy("c.id") + .orderBy("COUNT(c.id) DESC") + .limit(size); + + Wt::Dbo::collection res = query; + + return std::vector(res.begin(), res.end()); +} + } // namespace Database diff --git a/src/database/Release.hpp b/src/database/Release.hpp index b9d8acac..7e46795e 100644 --- a/src/database/Release.hpp +++ b/src/database/Release.hpp @@ -57,6 +57,7 @@ class Release : public Wt::Dbo::Dbo bool& moreExpected); std::vector> getTracks(const std::set& clusters = std::set()) const; + std::vector> getClusters(int size) const; // Create static pointer create(Wt::Dbo::Session& session, const std::string& name, const std::string& MBID = ""); diff --git a/src/ui/ArtistView.cpp b/src/ui/ArtistView.cpp index 6b770af0..eefc62a6 100644 --- a/src/ui/ArtistView.cpp +++ b/src/ui/ArtistView.cpp @@ -75,14 +75,14 @@ Artist::refresh() t->addFunction("tr", &Wt::WTemplate::Functions::tr); auto clusterContainers = new Wt::WContainerWidget(); - t->bindWidget("tags", clusterContainers); + t->bindWidget("clusters", clusterContainers); { auto clusters = artist->getClusters(3); for (auto cluster : clusters) { - auto entry = new Wt::WTemplate(Wt::WString::tr("template-artist-tag-entry"), clusterContainers); + auto entry = new Wt::WTemplate(Wt::WString::tr("template-artist-cluster-entry"), clusterContainers); entry->bindString("name", Wt::WString::fromUTF8(cluster->getName()), Wt::PlainText); } diff --git a/src/ui/ReleaseView.cpp b/src/ui/ReleaseView.cpp index bd224e47..8493da75 100644 --- a/src/ui/ReleaseView.cpp +++ b/src/ui/ReleaseView.cpp @@ -110,6 +110,20 @@ Release::refresh() cover->setImageLink(Wt::WLink (SessionImageResource()->getReleaseUrl(release.id(), 512))); t->bindWidget("cover", cover); + auto clusterContainers = new Wt::WContainerWidget(); + t->bindWidget("clusters", clusterContainers); + + { + auto clusters = release->getClusters(3); + + for (auto cluster : clusters) + { + auto entry = new Wt::WTemplate(Wt::WString::tr("template-release-cluster-entry"), clusterContainers); + + entry->bindString("name", Wt::WString::fromUTF8(cluster->getName()), Wt::PlainText); + } + } + { auto playBtn = new Wt::WText(Wt::WString::tr("btn-release-play-btn"), Wt::XHTMLText); t->bindWidget("play-btn", playBtn);