New layout test
This commit is contained in:
+4
-5
@@ -44,7 +44,10 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="p-2 flex-fill text-truncate">
|
<div class="p-2 flex-fill text-truncate">
|
||||||
<div class="d-block text-truncate">${name}</div>
|
<div class="d-block text-truncate">${name}</div>
|
||||||
${<if-has-release>}${release class="text-decoration-none link-success text-truncate"}${</if-has-release>}
|
<div class="text-truncate">
|
||||||
|
${<if-has-artists>}${artists class="d-none d-sm-inline"}${</if-has-artists>}
|
||||||
|
${<if-has-release>}${release class="d-inline text-decoration-none link-success"}${</if-has-release>}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="p-2 d-none d-sm-block text-muted">
|
<div class="p-2 d-none d-sm-block text-muted">
|
||||||
${duration}
|
${duration}
|
||||||
@@ -64,10 +67,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</message>
|
</message>
|
||||||
|
|
||||||
<message id="Lms.Explore.Tracks.template.entry-artist">
|
|
||||||
${artist class="text-decoration-none link-secondary"}
|
|
||||||
</message>
|
|
||||||
|
|
||||||
<message id="Lms.Explore.Tracks.template.track-info">
|
<message id="Lms.Explore.Tracks.template.track-info">
|
||||||
<div class="modal fade" tabindex="-1">
|
<div class="modal fade" tabindex="-1">
|
||||||
<div class="modal-dialog modal-dialog-scrollable">
|
<div class="modal-dialog modal-dialog-scrollable">
|
||||||
|
|||||||
@@ -401,9 +401,8 @@ Track::getArtists(EnumSet<TrackArtistLinkType> linkTypes) const
|
|||||||
oss << " AND t_a_l.type IN (";
|
oss << " AND t_a_l.type IN (";
|
||||||
|
|
||||||
bool first {true};
|
bool first {true};
|
||||||
for (TrackArtistLinkType type : linkTypes)
|
for ([[maybe_unused]] TrackArtistLinkType type : linkTypes)
|
||||||
{
|
{
|
||||||
(void) type;
|
|
||||||
if (!first)
|
if (!first)
|
||||||
oss << ", ";
|
oss << ", ";
|
||||||
oss << "?";
|
oss << "?";
|
||||||
@@ -430,7 +429,7 @@ Track::getArtistIds(EnumSet<TrackArtistLinkType> linkTypes) const
|
|||||||
|
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss <<
|
oss <<
|
||||||
"SELECT a.id from artist a"
|
"SELECT DISTINCT a.id from artist a"
|
||||||
" INNER JOIN track_artist_link t_a_l ON a.id = t_a_l.artist_id"
|
" INNER JOIN track_artist_link t_a_l ON a.id = t_a_l.artist_id"
|
||||||
" INNER JOIN track t ON t.id = t_a_l.track_id";
|
" INNER JOIN track t ON t.id = t_a_l.track_id";
|
||||||
|
|
||||||
@@ -439,9 +438,8 @@ Track::getArtistIds(EnumSet<TrackArtistLinkType> linkTypes) const
|
|||||||
oss << " AND t_a_l.type IN (";
|
oss << " AND t_a_l.type IN (";
|
||||||
|
|
||||||
bool first {true};
|
bool first {true};
|
||||||
for (TrackArtistLinkType type : linkTypes)
|
for ([[maybe_unused]] TrackArtistLinkType type : linkTypes)
|
||||||
{
|
{
|
||||||
(void) type;
|
|
||||||
if (!first)
|
if (!first)
|
||||||
oss << ", ";
|
oss << ", ";
|
||||||
oss << "?";
|
oss << "?";
|
||||||
@@ -450,14 +448,14 @@ Track::getArtistIds(EnumSet<TrackArtistLinkType> linkTypes) const
|
|||||||
oss << ")";
|
oss << ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
Wt::Dbo::Query<ArtistId> query {session()->query<ArtistId>(oss.str())
|
auto query {session()->query<ArtistId>(oss.str())};
|
||||||
.where("t.id = ?").bind(getId())};
|
|
||||||
|
|
||||||
for (TrackArtistLinkType type : linkTypes)
|
for (TrackArtistLinkType type : linkTypes)
|
||||||
query.bind(type);
|
query.bind(type);
|
||||||
|
|
||||||
Wt::Dbo::collection<ArtistId> res = query;
|
query.where("t.id = ?").bind(getId());
|
||||||
return std::vector<ArtistId>(std::begin(res), std::end(res));
|
|
||||||
|
auto res {query.resultList()};
|
||||||
|
return std::vector<ArtistId>(std::cbegin(res), std::cend(res));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<TrackArtistLink::pointer>
|
std::vector<TrackArtistLink::pointer>
|
||||||
|
|||||||
@@ -91,6 +91,18 @@ TEST_F(DatabaseFixture, Artist_singleTrack)
|
|||||||
EXPECT_EQ(track->getArtists({}).size(), 1);
|
EXPECT_EQ(track->getArtists({}).size(), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto transaction {session.createSharedTransaction()};
|
||||||
|
|
||||||
|
auto artists {track->getArtistIds({TrackArtistLinkType::Artist})};
|
||||||
|
ASSERT_EQ(artists.size(), 1);
|
||||||
|
EXPECT_EQ(artists.front(), artist.getId());
|
||||||
|
|
||||||
|
ASSERT_EQ(track->getArtistIds({TrackArtistLinkType::Artist}).size(), 1);
|
||||||
|
EXPECT_TRUE(track->getArtistIds({TrackArtistLinkType::ReleaseArtist}).empty());
|
||||||
|
EXPECT_EQ(track->getArtistIds({}).size(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
auto transaction {session.createSharedTransaction()};
|
auto transaction {session.createSharedTransaction()};
|
||||||
auto tracks {Track::find(session, Track::FindParameters{}.setName("MyTrackName").setArtistName("MyArtist"))};
|
auto tracks {Track::find(session, Track::FindParameters{}.setName("MyTrackName").setArtistName("MyArtist"))};
|
||||||
|
|||||||
@@ -377,22 +377,11 @@ Release::refreshView()
|
|||||||
|
|
||||||
entry->bindString("name", Wt::WString::fromUTF8(track->getName()), Wt::TextFormat::Plain);
|
entry->bindString("name", Wt::WString::fromUTF8(track->getName()), Wt::TextFormat::Plain);
|
||||||
|
|
||||||
const auto artists {track->getArtists({TrackArtistLinkType::Artist})};
|
const auto artists {track->getArtistIds({TrackArtistLinkType::Artist})};
|
||||||
if (variousArtists && !artists.empty())
|
if (variousArtists && !artists.empty())
|
||||||
{
|
{
|
||||||
entry->setCondition("if-has-artists", true);
|
entry->setCondition("if-has-artists", true);
|
||||||
|
entry->bindWidget("artists", Utils::createArtistContainer(artists));
|
||||||
Wt::WContainerWidget* artistsContainer {entry->bindNew<Wt::WContainerWidget>("artists")};
|
|
||||||
bool firstArtist {true};
|
|
||||||
for (const auto& artist : artists)
|
|
||||||
{
|
|
||||||
if (!firstArtist)
|
|
||||||
artistsContainer->addNew<Wt::WText>(" · ");
|
|
||||||
auto anchor {Utils::createArtistAnchor(artist)};
|
|
||||||
anchor->addStyleClass("link-success text-decoration-none"); // hack
|
|
||||||
artistsContainer->addWidget(std::move(anchor));
|
|
||||||
firstArtist = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto trackNumber {track->getTrackNumber()};
|
auto trackNumber {track->getTrackNumber()};
|
||||||
|
|||||||
@@ -31,6 +31,7 @@
|
|||||||
#include "services/database/Track.hpp"
|
#include "services/database/Track.hpp"
|
||||||
#include "services/database/TrackArtistLink.hpp"
|
#include "services/database/TrackArtistLink.hpp"
|
||||||
#include "services/scrobbling/IScrobblingService.hpp"
|
#include "services/scrobbling/IScrobblingService.hpp"
|
||||||
|
#include "utils/Logger.hpp"
|
||||||
#include "utils/Service.hpp"
|
#include "utils/Service.hpp"
|
||||||
|
|
||||||
#include "common/Template.hpp"
|
#include "common/Template.hpp"
|
||||||
@@ -160,6 +161,16 @@ namespace UserInterface::TrackListHelpers
|
|||||||
const Release::pointer release {track->getRelease()};
|
const Release::pointer release {track->getRelease()};
|
||||||
const TrackId trackId {track->getId()};
|
const TrackId trackId {track->getId()};
|
||||||
|
|
||||||
|
const auto artists {track->getArtistIds({TrackArtistLinkType::Artist})};
|
||||||
|
LMS_LOG(UI, DEBUG) << "Found " << artists.size() << " artists!";
|
||||||
|
if (!artists.empty())
|
||||||
|
{
|
||||||
|
entry->setCondition("if-has-artists", true);
|
||||||
|
Wt::WContainerWidget* artistsContainer {entry->bindWidget("artists", Utils::createArtistContainer(artists))};
|
||||||
|
if (track->getRelease())
|
||||||
|
artistsContainer->addNew<Wt::WText>(" — ");
|
||||||
|
}
|
||||||
|
|
||||||
if (track->getRelease())
|
if (track->getRelease())
|
||||||
{
|
{
|
||||||
entry->setCondition("if-has-release", true);
|
entry->setCondition("if-has-release", true);
|
||||||
|
|||||||
Reference in New Issue
Block a user