Order albums by original date, if available (fallback on date)
This commit is contained in:
+1
-1
@@ -15,7 +15,7 @@
|
||||
<h2>${name}</h2>
|
||||
${<if-has-release-artists>}${artists}${</if-has-release-artists>}
|
||||
${<if-has-various-release-artists>}<div class="text-secondary">${tr:Lms.Explore.various-artists}</div>${</if-has-various-release-artists>}
|
||||
<div class="small text-muted">${<if-has-year>}${year}${<if-has-orig-year>} (${orig-year})${</if-has-orig-year>} · ${</if-has-year>}${duration}</div>
|
||||
<div class="small text-muted">${<if-has-year>}${year} · ${</if-has-year>}${duration}</div>
|
||||
${clusters class="mb-2"}
|
||||
<div class="btn-group">
|
||||
${play-btn class="btn btn-primary"}
|
||||
|
||||
@@ -41,6 +41,9 @@ createQuery(Session& session, const Release::FindParameters& params)
|
||||
auto query {session.getDboSession().query<ReleaseId>("SELECT DISTINCT r.id from release r")};
|
||||
|
||||
if (params.sortMethod == ReleaseSortMethod::LastWritten
|
||||
|| params.sortMethod == ReleaseSortMethod::Date
|
||||
|| params.sortMethod == ReleaseSortMethod::OriginalDate
|
||||
|| params.sortMethod == ReleaseSortMethod::OriginalDateDesc
|
||||
|| params.writtenAfter.isValid()
|
||||
|| params.dateRange
|
||||
|| params.artist.isValid())
|
||||
@@ -160,8 +163,11 @@ createQuery(Session& session, const Release::FindParameters& params)
|
||||
case ReleaseSortMethod::Date:
|
||||
query.orderBy("t.date, r.name COLLATE NOCASE");
|
||||
break;
|
||||
case ReleaseSortMethod::DateDesc:
|
||||
query.orderBy("t.date DESC, r.name COLLATE NOCASE");
|
||||
case ReleaseSortMethod::OriginalDate:
|
||||
query.orderBy("CASE WHEN t.original_date IS NULL THEN t.date ELSE t.original_date END, t.date, r.name COLLATE NOCASE");
|
||||
break;
|
||||
case ReleaseSortMethod::OriginalDateDesc:
|
||||
query.orderBy("CASE WHEN t.original_date IS NULL THEN t.date ELSE t.original_date END DESC, t.date, r.name COLLATE NOCASE");
|
||||
break;
|
||||
case ReleaseSortMethod::StarredDateDesc:
|
||||
assert(params.starringUser.isValid());
|
||||
|
||||
@@ -98,7 +98,8 @@ namespace Database
|
||||
None,
|
||||
Name,
|
||||
Date,
|
||||
DateDesc,
|
||||
OriginalDate,
|
||||
OriginalDateDesc,
|
||||
Random,
|
||||
LastWritten,
|
||||
StarredDateDesc,
|
||||
|
||||
@@ -530,3 +530,73 @@ TEST_F(DatabaseFixture, Release_releaseType)
|
||||
EXPECT_TRUE(release.get()->getSecondaryTypes().contains(ReleaseTypeSecondary::Compilation));
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(DatabaseFixture, ReleaseSortOrder)
|
||||
{
|
||||
ScopedRelease release1 {session, "MyRelease1"};
|
||||
const Wt::WDate release1Date {Wt::WDate {2000, 2, 3}};
|
||||
const Wt::WDate release1OriginalDate {Wt::WDate {1993, 4, 5}};
|
||||
|
||||
ScopedRelease release2 {session, "MyRelease2"};
|
||||
const Wt::WDate release2Date {Wt::WDate {1994, 2, 3}};
|
||||
|
||||
ScopedTrack track1 {session, "MyTrack1"};
|
||||
ScopedTrack track2 {session, "MyTrack2"};
|
||||
|
||||
ASSERT_LT(release2Date, release1Date);
|
||||
ASSERT_GT(release2Date, release1OriginalDate);
|
||||
|
||||
{
|
||||
auto transaction {session.createUniqueTransaction()};
|
||||
|
||||
track1.get().modify()->setRelease(release1.get());
|
||||
track1.get().modify()->setOriginalDate(release1OriginalDate);
|
||||
track1.get().modify()->setDate(release1Date);
|
||||
|
||||
track2.get().modify()->setRelease(release2.get());
|
||||
track2.get().modify()->setDate(release2Date);
|
||||
}
|
||||
|
||||
{
|
||||
auto transaction {session.createSharedTransaction()};
|
||||
|
||||
const auto releases {Release::find(session, Release::FindParameters {}.setSortMethod(ReleaseSortMethod::Name) )};
|
||||
ASSERT_EQ(releases.results.size(), 2);
|
||||
EXPECT_EQ(releases.results.front(), release1.getId());
|
||||
EXPECT_EQ(releases.results.back(), release2.getId());
|
||||
}
|
||||
|
||||
{
|
||||
auto transaction {session.createSharedTransaction()};
|
||||
|
||||
const auto releases {Release::find(session, Release::FindParameters {}.setSortMethod(ReleaseSortMethod::Random) )};
|
||||
ASSERT_EQ(releases.results.size(), 2);
|
||||
}
|
||||
|
||||
{
|
||||
auto transaction {session.createSharedTransaction()};
|
||||
|
||||
const auto releases {Release::find(session, Release::FindParameters {}.setSortMethod(ReleaseSortMethod::Date) )};
|
||||
ASSERT_EQ(releases.results.size(), 2);
|
||||
EXPECT_EQ(releases.results.front(), release2.getId());
|
||||
EXPECT_EQ(releases.results.back(), release1.getId());
|
||||
}
|
||||
|
||||
{
|
||||
auto transaction {session.createSharedTransaction()};
|
||||
|
||||
const auto releases {Release::find(session, Release::FindParameters {}.setSortMethod(ReleaseSortMethod::OriginalDate) )};
|
||||
ASSERT_EQ(releases.results.size(), 2);
|
||||
EXPECT_EQ(releases.results.front(), release1.getId());
|
||||
EXPECT_EQ(releases.results.back(), release2.getId());
|
||||
}
|
||||
{
|
||||
auto transaction {session.createSharedTransaction()};
|
||||
|
||||
const auto releases {Release::find(session, Release::FindParameters {}.setSortMethod(ReleaseSortMethod::OriginalDateDesc) )};
|
||||
ASSERT_EQ(releases.results.size(), 2);
|
||||
EXPECT_EQ(releases.results.front(), release2.getId());
|
||||
EXPECT_EQ(releases.results.back(), release1.getId());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -212,7 +212,7 @@ Artist::refreshReleases()
|
||||
Release::FindParameters params;
|
||||
params.setClusters(_filters.getClusterIds());
|
||||
params.setArtist(_artistId, {TrackArtistLinkType::ReleaseArtist}, {});
|
||||
params.setSortMethod(ReleaseSortMethod::DateDesc);
|
||||
params.setSortMethod(ReleaseSortMethod::OriginalDateDesc);
|
||||
|
||||
const auto releases {Release::find(LmsApp->getDbSession(), params)};
|
||||
if (!releases.results.empty())
|
||||
@@ -272,7 +272,7 @@ Artist::refreshAppearsOnReleases()
|
||||
Release::FindParameters params;
|
||||
params.setClusters(_filters.getClusterIds());
|
||||
params.setArtist(_artistId, types, {TrackArtistLinkType::ReleaseArtist});
|
||||
params.setSortMethod(ReleaseSortMethod::DateDesc);
|
||||
params.setSortMethod(ReleaseSortMethod::OriginalDateDesc);
|
||||
|
||||
const auto releases {Release::find(LmsApp->getDbSession(), params)};
|
||||
if (!releases.results.empty())
|
||||
|
||||
@@ -66,19 +66,11 @@ namespace UserInterface::ReleaseListHelpers
|
||||
|
||||
if (showYear)
|
||||
{
|
||||
if (std::optional<int> year {release->getReleaseYear()})
|
||||
Wt::WString year {ReleaseHelpers::buildReleaseYearString(release->getReleaseYear(), release->getReleaseYear(true))};
|
||||
if (!year.empty())
|
||||
{
|
||||
entry->setCondition("if-has-year", true);
|
||||
|
||||
std::string strYear {std::to_string(*year)};
|
||||
|
||||
std::optional<int> originalYear {release->getReleaseYear(true)};
|
||||
if (originalYear && *originalYear != *year)
|
||||
{
|
||||
strYear += " (" + std::to_string(*originalYear) + ")";
|
||||
}
|
||||
|
||||
entry->bindString("year", strYear, Wt::TextFormat::Plain);
|
||||
entry->bindString("year", year, Wt::TextFormat::Plain);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -142,4 +134,20 @@ namespace UserInterface::ReleaseHelpers
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
Wt::WString buildReleaseYearString(std::optional<int> year, std::optional<int> originalYear)
|
||||
{
|
||||
Wt::WString res;
|
||||
|
||||
// Year can be here, but originalYear can't be here without year (enforced by scanner)
|
||||
if (!year)
|
||||
return res;
|
||||
|
||||
if (originalYear && *originalYear != *year)
|
||||
res = std::to_string(*originalYear) + " (" + std::to_string(*year) + ")";
|
||||
else
|
||||
res = std::to_string(*year);
|
||||
|
||||
return res;
|
||||
}
|
||||
} // namespace UserInterface::ReleaseHelpers}
|
||||
|
||||
@@ -41,4 +41,5 @@ namespace UserInterface::ReleaseListHelpers
|
||||
namespace UserInterface::ReleaseHelpers
|
||||
{
|
||||
Wt::WString buildReleaseTypeString(Database::ReleaseTypePrimary primaryType, EnumSet<Database::ReleaseTypeSecondary> secondaryTypes);
|
||||
Wt::WString buildReleaseYearString(std::optional<int> year, std::optional<int> originalYear);
|
||||
}
|
||||
|
||||
@@ -246,18 +246,11 @@ Release::refreshView()
|
||||
|
||||
bindString("name", Wt::WString::fromUTF8(release->getName()), Wt::TextFormat::Plain);
|
||||
|
||||
std::optional<int> year {release->getReleaseYear()};
|
||||
if (year)
|
||||
Wt::WString year {ReleaseHelpers::buildReleaseYearString(release->getReleaseYear(), release->getReleaseYear(true))};
|
||||
if (!year.empty())
|
||||
{
|
||||
setCondition("if-has-year", true);
|
||||
bindInt("year", *year);
|
||||
|
||||
std::optional<int> originalYear {release->getReleaseYear(true)};
|
||||
if (originalYear && *originalYear != *year)
|
||||
{
|
||||
setCondition("if-has-orig-year", true);
|
||||
bindInt("orig-year", *originalYear);
|
||||
}
|
||||
bindString("year", year, Wt::TextFormat::Plain);
|
||||
}
|
||||
|
||||
bindString("duration", Utils::durationToString(release->getDuration()), Wt::TextFormat::Plain);
|
||||
|
||||
Reference in New Issue
Block a user