add a swiss tournament selector to the mod game view
parent
dc7c49f7b4
commit
a54b5919f4
|
@ -20,7 +20,7 @@ final class GameMod(env: Env) extends LilaController(env) {
|
|||
val form = filterForm.bindFromRequest()
|
||||
val filter = form.fold(_ => emptyFilter, identity)
|
||||
env.tournament.leaderboardApi.recentByUser(user, 1) zip
|
||||
guessSwisses(user) zip
|
||||
env.activity.read.recentSwissRanks(user.id) zip
|
||||
env.game.gameRepo.recentPovsByUserFromSecondary(user, 100, toDbSelect(filter)) flatMap {
|
||||
case ((arenas, swisses), povs) =>
|
||||
env.mod.assessApi.ofPovs(povs) map { games =>
|
||||
|
|
|
@ -25,7 +25,7 @@ object games {
|
|||
filterForm: Form[GameMod.Filter],
|
||||
games: List[(Pov, Option[PlayerAssessment])],
|
||||
arenas: Seq[TourEntry],
|
||||
swisses: Seq[Swiss]
|
||||
swisses: Seq[(Swiss.IdName, Int)]
|
||||
)(implicit
|
||||
ctx: Context
|
||||
) =
|
||||
|
@ -49,8 +49,16 @@ object games {
|
|||
t.tour.name()
|
||||
).mkString(" / ")
|
||||
),
|
||||
pluralize("Recent arenas", arenas.size).some,
|
||||
pluralize("recent arena", arenas.size).some,
|
||||
disabled = arenas.isEmpty
|
||||
),
|
||||
form3.select(
|
||||
filterForm("swiss"),
|
||||
swisses.map { case (swiss, rank) =>
|
||||
swiss.id.value -> s"rank ${rank} / ${swiss.name}"
|
||||
},
|
||||
s"${swisses.size} recent swiss".some,
|
||||
disabled = swisses.isEmpty
|
||||
)
|
||||
)
|
||||
)
|
||||
|
|
|
@ -9,6 +9,7 @@ import lila.game.LightPov
|
|||
import lila.practice.PracticeStructure
|
||||
import lila.user.User
|
||||
import lila.tournament.LeaderboardApi
|
||||
import lila.swiss.Swiss
|
||||
|
||||
final class ActivityReadApi(
|
||||
coll: Coll,
|
||||
|
@ -110,16 +111,7 @@ final class ActivityReadApi(
|
|||
swisses <-
|
||||
a.swisses
|
||||
.?? { swisses =>
|
||||
swissApi
|
||||
.idNames(swisses.value.map(_.id))
|
||||
.map {
|
||||
_.flatMap { idName =>
|
||||
swisses.value.find(_.id == idName.id) map { s =>
|
||||
(idName, s.rank)
|
||||
}
|
||||
}
|
||||
}
|
||||
.dmap(_.some.filter(_.nonEmpty))
|
||||
toSwissesView(swisses.value).dmap(_.some.filter(_.nonEmpty))
|
||||
}
|
||||
|
||||
} yield ActivityView(
|
||||
|
@ -141,6 +133,27 @@ final class ActivityReadApi(
|
|||
stream = a.stream
|
||||
)
|
||||
|
||||
def recentSwissRanks(userId: User.ID): Fu[List[(Swiss.IdName, Int)]] =
|
||||
coll
|
||||
.find(regexId(userId) ++ $doc(BSONHandlers.ActivityFields.swisses $exists true))
|
||||
.sort($sort desc "_id")
|
||||
.cursor[Activity](ReadPreference.secondaryPreferred)
|
||||
.list(10)
|
||||
.flatMap { activities =>
|
||||
toSwissesView(activities.flatMap(_.swisses.??(_.value)))
|
||||
}
|
||||
|
||||
private def toSwissesView(swisses: List[activities.SwissRank]): Fu[List[(Swiss.IdName, Int)]] =
|
||||
swissApi
|
||||
.idNames(swisses.map(_.id))
|
||||
.map {
|
||||
_.flatMap { idName =>
|
||||
swisses.find(_.id == idName.id) map { s =>
|
||||
(idName, s.rank)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private def addSignup(at: DateTime, recent: Vector[ActivityView]) = {
|
||||
val (found, views) = recent.foldLeft(false -> Vector.empty[ActivityView]) {
|
||||
case ((false, as), a) if a.interval contains at => (true, as :+ a.copy(signup = true))
|
||||
|
|
|
@ -24,3 +24,12 @@
|
|||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
.mod-games {
|
||||
&__filter-form {
|
||||
select {
|
||||
max-width: 30ch;
|
||||
margin-left: 1em;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue