Skip to content

Commit

Permalink
Merge branch 'master' into persistentChallenge
Browse files Browse the repository at this point in the history
* master:
  fix tournament TV
  fix game search date field
  flexible game search date constraints
  upgrade scalachess
  • Loading branch information
ornicar committed Jan 31, 2016
2 parents 6ca40a9 + 755cfa4 commit 56ef190
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 18 deletions.
17 changes: 14 additions & 3 deletions modules/gameSearch/src/main/DataForm.scala
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import chess.{ Mode }
import org.joda.time.DateTime
import play.api.data._
import play.api.data.Forms._
import play.api.data.validation.Constraints

import lila.common.Form._
import lila.search.Range
Expand Down Expand Up @@ -32,8 +33,8 @@ private[gameSearch] final class DataForm {
"aiLevelMax" -> optional(numberIn(Query.aiLevels)),
"durationMin" -> optional(numberIn(Query.durations)),
"durationMax" -> optional(numberIn(Query.durations)),
"dateMin" -> optional(dateConstraint),
"dateMax" -> optional(dateConstraint),
"dateMin" -> DataForm.dateField,
"dateMax" -> DataForm.dateField,
"status" -> optional(numberIn(Query.statuses)),
"analysed" -> optional(number),
"sort" -> optional(mapping(
Expand All @@ -43,6 +44,15 @@ private[gameSearch] final class DataForm {
)(SearchData.apply)(SearchData.unapply)) fill SearchData()
}

private[gameSearch] object DataForm {

val DateDelta = """^(\d+)(\w)$""".r
private val dateConstraint = Constraints.pattern(
regex = DateDelta,
error = "Invalid date.")
val dateField = optional(nonEmptyText.verifying(dateConstraint))
}

private[gameSearch] case class SearchData(
players: SearchPlayer = SearchPlayer(),
winnerColor: Option[Int] = None,
Expand Down Expand Up @@ -90,7 +100,8 @@ private[gameSearch] case class SearchData(

def nonEmptyQuery = Some(query).filter(_.nonEmpty)

private val DateDelta = """^(\d+)(\w)$""".r
import DataForm.DateDelta

private def toDate(delta: String): Option[DateTime] = delta match {
case DateDelta(n, "h") => parseIntOption(n) map DateTime.now.minusHours
case DateDelta(n, "d") => parseIntOption(n) map DateTime.now.minusDays
Expand Down
10 changes: 6 additions & 4 deletions modules/tournament/src/main/JsonView.scala
Original file line number Diff line number Diff line change
Expand Up @@ -170,14 +170,16 @@ final class JsonView(
"rating" -> rp.player.rating,
"ratingDiff" -> rp.player.ratingDiff)
}
val orientation = featured.game.playerByUserId(featured.player1.player.userId).fold(featured.game.firstColor)(_.color)
Json.obj(
"id" -> featured.game.id,
"fen" -> (chess.format.Forsyth exportBoard featured.game.toChess.board),
"color" -> orientation.name,
"color" -> (featured.game.variant match {
case chess.variant.RacingKings => chess.White
case _ => featured.game.firstColor
}).name,
"lastMove" -> ~featured.game.castleLastMoveTime.lastMoveString,
"player1" -> playerJson(featured.player1),
"player2" -> playerJson(featured.player2))
"white" -> playerJson(featured.white),
"black" -> playerJson(featured.black))
}

private def myInfoJson(i: PlayerInfo) = Json.obj(
Expand Down
4 changes: 2 additions & 2 deletions modules/tournament/src/main/model.scala
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ object RankedPlayer {

case class FeaturedGame(
game: lila.game.Game,
player1: RankedPlayer,
player2: RankedPlayer)
white: RankedPlayer,
black: RankedPlayer)

case class Winner(tourId: String, tourName: String, userId: String)
21 changes: 12 additions & 9 deletions ui/tournament/src/view/pairings.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
var m = require('mithril');
var partial = require('chessground').util.partial;
var opposite = require('chessground').util.opposite;
var util = require('./util');
var status = require('game').status;

Expand All @@ -14,17 +15,19 @@ function user(p, it) {
};
}

function featured(f, n) {
function featuredPlayer(f, orientation) {
var p = f[orientation === 'top' ? opposite(f.color) : f.color];
return m('div.vstext.' + orientation, [
m('strong', '#' + p.rank),
util.player(p)
])
}

function featured(f) {
return m('div.featured', [
m('div.vstext.top', [
m('strong', '#' + f.player2.rank),
util.player(f.player2)
]),
featuredPlayer(f, 'top'),
util.miniBoard(f),
m('div.vstext.bottom', [
m('strong', '#' + f.player1.rank),
util.player(f.player1)
])
featuredPlayer(f, 'bottom')
]);
}

Expand Down

0 comments on commit 56ef190

Please sign in to comment.