Skip to content

Commit

Permalink
Revert "Revert "advanced search on user profile""
Browse files Browse the repository at this point in the history
This reverts commit c39a8a9.
  • Loading branch information
ornicar committed Sep 3, 2015
1 parent d5a21fa commit 693e21d
Show file tree
Hide file tree
Showing 18 changed files with 470 additions and 135 deletions.
22 changes: 13 additions & 9 deletions app/controllers/User.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package controllers
import play.api.libs.json.Json
import play.api.mvc._, Results._

import lila.api.Context
import lila.api.{ Context, BodyContext }
import lila.app._
import lila.app.mashup.GameFilterMenu
import lila.common.LilaCookie
Expand All @@ -22,6 +22,7 @@ object User extends LilaController {
private def gamePaginator = Env.game.paginator
private def forms = lila.user.DataForm
private def relationApi = Env.relation.api
private def userGameSearch = Env.gameSearch.userGameSearch

def tv(username: String) = Open { implicit ctx =>
OptionFuResult(UserRepo named username) { user =>
Expand All @@ -34,7 +35,7 @@ object User extends LilaController {
}
}

def show(username: String) = Open { implicit ctx =>
def show(username: String) = OpenBody { implicit ctx =>
filter(username, none, 1)
}

Expand All @@ -52,7 +53,7 @@ object User extends LilaController {
}
}

def showFilter(username: String, filterName: String, page: Int) = Open { implicit ctx =>
def showFilter(username: String, filterName: String, page: Int) = OpenBody { implicit ctx =>
filter(username, filterName.some, page)
}

Expand All @@ -71,7 +72,7 @@ object User extends LilaController {
username: String,
filterOption: Option[String],
page: Int,
status: Results.Status = Results.Ok)(implicit ctx: Context) =
status: Results.Status = Results.Ok)(implicit ctx: BodyContext) =
Reasonable(page) {
OptionFuResult(UserRepo named username) { u =>
if (u.enabled || isGranted(_.UserSpy)) negotiate(
Expand All @@ -90,35 +91,38 @@ object User extends LilaController {
}
}

private def userShow(u: UserModel, filterOption: Option[String], page: Int)(implicit ctx: Context) = for {
private def userShow(u: UserModel, filterOption: Option[String], page: Int)(implicit ctx: BodyContext) = for {
info Env.current.userInfo(u, ctx)
filters = GameFilterMenu(info, ctx.me, filterOption)
pag <- GameFilterMenu.paginatorOf(
userGameSearch = userGameSearch,
user = u,
info = info.some,
filter = filters.current,
me = ctx.me,
page = page)
page = page)(ctx.body)
relation <- ctx.userId ?? { relationApi.relation(_, u.id) }
notes <- ctx.me ?? { me =>
relationApi friends me.id flatMap { env.noteApi.get(u, me, _) }
}
followable <- ctx.isAuth ?? { Env.pref.api followable u.id }
blocked <- ctx.userId ?? { relationApi.blocks(u.id, _) }
} yield html.user.show(u, info, pag, filters, relation, notes, followable, blocked)
searchForm = GameFilterMenu.searchForm(userGameSearch, filters.current)(ctx.body)
} yield html.user.show(u, info, pag, filters, searchForm, relation, notes, followable, blocked)

private def userGames(u: UserModel, filterOption: Option[String], page: Int)(implicit ctx: Context) = {
private def userGames(u: UserModel, filterOption: Option[String], page: Int)(implicit ctx: BodyContext) = {
import lila.app.mashup.GameFilter.{ All, Playing }
filterOption.fold({
Env.simul isHosting u.id map (_.fold(Playing, All).name)
})(fuccess) flatMap { filterName =>
GameFilterMenu.paginatorOf(
userGameSearch = userGameSearch,
user = u,
info = none,
filter = GameFilterMenu.currentOf(GameFilterMenu.all, filterName),
me = ctx.me,
page = page
) map { filterName -> _ }
)(ctx.body) map { filterName -> _ }
}
}

Expand Down
21 changes: 17 additions & 4 deletions app/mashup/GameFilter.scala
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package lila.app
package mashup

import lila.common.paginator._
import lila.db.api.SortOrder
import lila.game.{ Game, Query }
import lila.user.User
import lila.db.api.SortOrder

import play.api.libs.json._
import play.api.mvc.Request
import scalaz.NonEmptyList

sealed abstract class GameFilter(val name: String)
Expand All @@ -20,6 +22,7 @@ object GameFilter {
case object Playing extends GameFilter("playing")
case object Bookmark extends GameFilter("bookmark")
case object Imported extends GameFilter("import")
case object Search extends GameFilter("search")
}

case class GameFilterMenu(
Expand All @@ -34,7 +37,7 @@ object GameFilterMenu {
import GameFilter._
import lila.db.Implicits.docId

val all = NonEmptyList.nel(All, List(Me, Rated, Win, Loss, Draw, Playing, Bookmark, Imported))
val all = NonEmptyList.nel(All, List(Me, Rated, Win, Loss, Draw, Playing, Bookmark, Imported, Search))

def apply(
info: UserInfo,
Expand Down Expand Up @@ -79,17 +82,19 @@ object GameFilterMenu {
case Win => user.count.win.some
case Loss => user.count.loss.some
case Draw => user.count.draw.some
case Search => user.count.game.some
case _ => None
}

import lila.common.paginator._
private def pag = Env.game.paginator

def paginatorOf(
userGameSearch: lila.gameSearch.UserGameSearch,
user: User,
info: Option[UserInfo],
filter: GameFilter,
me: Option[User],
page: Int): Fu[Paginator[Game]] = {
page: Int)(implicit req: Request[_]): Fu[Paginator[Game]] = {
val nb = cachedNbOf(user, info, filter)
def std(query: JsObject) = pag.recentlyCreated(query, nb)(page)
filter match {
Expand All @@ -108,6 +113,14 @@ object GameFilterMenu {
selector = Query nowPlaying user.id,
sort = Seq(),
nb = nb)(page)
case Search => userGameSearch(user, page)
}
}

def searchForm(
userGameSearch: lila.gameSearch.UserGameSearch,
filter: GameFilter)(implicit req: Request[_]): play.api.data.Form[_] = filter match {
case Search => userGameSearch.requestForm
case _ => userGameSearch.defaultForm
}
}
1 change: 1 addition & 0 deletions app/templating/UserHelper.scala
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,7 @@ trait UserHelper { self: I18nHelper with StringHelper with NumberHelper =>
case GameFilter.Playing => info.nbPlaying + " playing"
case GameFilter.Bookmark => trans.nbBookmarks(info.nbBookmark)
case GameFilter.Imported => trans.nbImportedGames(info.nbImported)
case GameFilter.Search => info.user.count.game + " " + trans.advancedSearch()
}).toString)

def describeUser(user: User) = {
Expand Down
12 changes: 10 additions & 2 deletions app/views/search/index.scala.html
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,14 @@ <h1 class="title">@trans.advancedSearch()</h1>
<div class="half">To @base.select(form("aiLevelMax"), Query.aiLevels, "".some)</div>
</td>
</tr>
<tr>
<th>
<label for="@form("source").id">Source</label>
</th>
<td class="single">
@base.select(form("source"), Query.sources, "".some)
</td>
</tr>
<tr>
<th>
<label for="@form("variant").id">@trans.variant()</label>
Expand Down Expand Up @@ -157,7 +165,7 @@ <h1 class="title">@trans.advancedSearch()</h1>
</tr>
<tr>
<th>
<label>Analysis <span class="help" title="Whether computer analysis is available or not">(?)</span></label>
<label for="analysed">Analysis <span class="help" title="Whether computer analysis is available or not">(?)</span></label>
</th>
<td class="single">
@{ base.checkbox(form("analysed"), "", 1) }
Expand All @@ -169,7 +177,7 @@ <h1 class="title">@trans.advancedSearch()</h1>
@paginator.map { pager =>
@if(pager.nbResults > 0) {
<div class="search_status">
<strong>@pager.nbResults.localize games found</strong>
<strong>@pager.nbResults.localize games found</strong>
<a class="permalink" href="@routes.Search.index()">Permalink</a>
<a class="permalink" rel="" href="@routes.Search.export()">Download PGN</a>
</div>
Expand Down
162 changes: 162 additions & 0 deletions app/views/search/user.scala.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
@(u: User, form: Form[_])(implicit ctx: Context)

@import lila.gameSearch.{ Query, Sorting }

<form rel="" class="search" action="@routes.User.showFilter(u.username, "search")" method="get">
<table>
<tr class="header">
<th colspan=2>@trans.advancedSearch()</th>
</tr>
<tr>
<th>
<label>Date</label>
</th>
<td>
<div class="half">From @base.select(form("dateMin"), Query.dates, "".some)</div>
<div class="half">To @base.select(form("dateMax"), Query.dates, "".some)</div>
</td>
</tr>
<tr>
<th>
<label>@trans.rating() <span class="help" title="The average rating of both players">(?)</span></label>
</th>
<td>
<div class="half">From @base.select(form("ratingMin"), Query.averageRatings, "".some)</div>
<div class="half">To @base.select(form("ratingMax"), Query.averageRatings, "".some)</div>
</td>
</tr>
<tr>
<th>
<label>Number of turns</label>
</th>
<td>
<div class="half">From @base.select(form("turnsMin"), Query.turns, "".some)</div>
<div class="half">To @base.select(form("turnsMax"), Query.turns, "".some)</div>
</td>
</tr>
<tr>
<th>
<label>@trans.duration()</label>
</th>
<td>
<div class="half">From @base.select(form("durationMin"), Query.durations, "".some)</div>
<div class="half">To @base.select(form("durationMax"), Query.durations, "".some)</div>
</td>
</tr>
<tr>
<th>
<label for="@form("source").id">Source</label>
</th>
<td class="single">
@base.select(form("source"), Query.sources, "".some)
</td>
</tr>
<tr>
<th>
<label for="@form("variant").id">@trans.variant()</label>
</th>
<td class="single">
@base.select(form("variant"), Query.variants, "".some)
</td>
</tr>
<tr>
<th>
<label for="@form("mode").id">@trans.mode()</label>
</th>
<td class="single">
@base.select(form("mode"), Query.modes, "".some)
</td>
</tr>
<tr>
<th>
<label for="@form("opening").id">@trans.opening()</label>
</th>
<td class="single">
@base.select(form("opening"), Query.openings, "".some)
</td>
</tr>
</table>
<table>
<tr>
<th>
<label for="@form("hasAi").id">@trans.opponent() <span class="help" title="Whether the player's opponent was a human or a computer">(?)</span></label>
</th>
<td class="single opponent">
@base.select(form("hasAi"), Query.hasAis, "".some)
</td>
</tr>
<tr class="aiLevel none">
<th>
<label for="@form("aiLevel").id">Stockfish level</label>
</th>
<td>
<div class="half">From @base.select(form("aiLevelMin"), Query.aiLevels, "".some)</div>
<div class="half">To @base.select(form("aiLevelMax"), Query.aiLevels, "".some)</div>
</td>
</tr>
<tr class="opponentName">
<th>
<label>Opponent name</label>
</th>
<td class="usernames">
<input value="@u.id" name="players.a" type="hidden">
@base.input(form("players")("b"))
</td>
</tr>
<tr class="winner user_row">
<th>
<label for="@form("players")("winner").id">@trans.winner()</label>
</th>
<td class="single">
<select id="@form("players")("winner").id" name="@form("players")("winner").name">
<option class="blank" value=""></option>
</select>
</td>
</tr>
@chess.Color.all.map { color =>
<tr class="@{color.name}User user_row">
<th>
<label for="@form("players")(color.name).id">@color.fold(trans.white, trans.black)()</label>
</th>
<td class="single">
<select id="@form("players")(color.name).id" name="@form("players")(color.name).name">
<option class="blank" value=""></option>
</select>
</td>
</tr>
}
<tr>
<th>
<label for="@form("status").id">Result</label>
</th>
<td class="single">
@base.select(form("status"), Query.statuses, "".some)
</td>
</tr>
<tr>
<th>
<label for="@form("winnerColor").id">Winner color</label>
</th>
<td class="single">
@base.select(form("winnerColor"), Query.winnerColors, "".some)
</td>
</tr>
<tr>
<th>
<label>Sort</label>
</th>
<td>
<div class="half">By @base.select(form("sort")("field"), Sorting.fields)</div>
<div class="half">Order @base.select(form("sort")("order"), Sorting.orders)</div>
</td>
</tr>
<tr>
<th>
<label for="analysed">Analysis <span class="help" title="Whether computer analysis is available or not">(?)</span></label>
</th>
<td class="single">
@{ base.checkbox(form("analysed"), "", 1) }
</td>
</tr>
</table>
</form>
Loading

0 comments on commit 693e21d

Please sign in to comment.