112 lines
3.7 KiB
HTML
112 lines
3.7 KiB
HTML
@(games: Seq[Game], user: Option[User] = None, ownerLink: Boolean = false, mini: Boolean = false)(implicit ctx: Context)
|
|
|
|
@gamePlayer(variant: chess.variant.Variant, player: Player) = {
|
|
<div class="player @player.color.name">
|
|
@player.playerUser.map { playerUser =>
|
|
@userIdLink(playerUser.id.some, withOnline = false)
|
|
<br />
|
|
@if(player.berserk) { @berserkIconSpanHtml }
|
|
@playerUser.rating@if(player.provisional) {?}
|
|
@playerUser.ratingDiff.map(showRatingDiff)
|
|
}.getOrElse {
|
|
@player.aiLevel.map { level =>
|
|
<span>@aiName(level, false)</span><br />@aiRating(level)
|
|
}.getOrElse {
|
|
<span>@player.nameSplit match {
|
|
case Some((name, rating)) => {
|
|
<span>@name</span>@rating.map { r =>
|
|
<br />@rating
|
|
}
|
|
}
|
|
case _ => {<span class="anon">@User.anonymous</span>}
|
|
}</span>
|
|
}
|
|
}
|
|
</div>
|
|
}
|
|
|
|
@games.map { g =>
|
|
<div class="game_row paginated_element">
|
|
@defining(user flatMap g.player) { fromPlayer =>
|
|
@defining(fromPlayer | g.firstPlayer ) { firstPlayer =>
|
|
@gameFen(Pov(g, firstPlayer), ownerLink, withTitle = false)
|
|
<a class="game_link_overlay" href="@gameLink(g, firstPlayer.color, ownerLink)"></a>
|
|
<div class="infos" data-icon="@gameIcon(g)">
|
|
<div class="header">
|
|
<strong>
|
|
@if(g.imported) {
|
|
<span>IMPORT</span>
|
|
@g.pgnImport.flatMap(_.user).map { user =>
|
|
@trans.by(userIdLink(user.some, None, false))
|
|
}
|
|
•
|
|
@if(g.variant.exotic) {
|
|
@variantLink(g.variant, g.variant.name.toUpperCase, cssClass = "hint--top")
|
|
} else {
|
|
@g.variant.name.toUpperCase
|
|
}
|
|
} else {
|
|
@g.clock.map(_.config.show).getOrElse {
|
|
@g.daysPerTurn.map { days =>
|
|
<span data-hint="@trans.correspondence()" class="hint--top">@if(days == 1) {@trans.oneDay()} else {@trans.nbDays.pluralSame(days)}</span>
|
|
}.getOrElse {
|
|
<span data-hint="@trans.unlimited()" class="hint--top">∞</span>
|
|
}
|
|
}
|
|
• @g.perfType.map(_.name).getOrElse {@chess.variant.FromPosition.name}
|
|
• @g.rated.fold(trans.rated(), trans.casual())
|
|
}
|
|
</strong>
|
|
@g.pgnImport.flatMap(_.date).getOrElse(momentFromNow(g.createdAt))
|
|
@g.tournamentId.map { tourId =>
|
|
• @tournamentLink(tourId)
|
|
}
|
|
@g.simulId.map { simulId =>
|
|
• @simulLink(simulId)
|
|
}
|
|
</div>
|
|
<div class="versus">
|
|
@gamePlayer(g.variant, g.whitePlayer)
|
|
<div class="swords" data-icon="U"></div>
|
|
@gamePlayer(g.variant, g.blackPlayer)
|
|
</div>
|
|
<div class="result">
|
|
@if(g.isBeingPlayed) {@trans.playingRightNow()} else {
|
|
@if(g.finishedOrAborted) {
|
|
<span class="@{ g.winner.flatMap(w => fromPlayer.map(p => (p == w).fold("up", "down"))) }">
|
|
@gameEndStatus(g)@g.winner.map { winner =>, @winner.color.fold(trans.whiteIsVictorious(), trans.blackIsVictorious()) }
|
|
</span>
|
|
} else {
|
|
@g.turnColor.fold(trans.whitePlays(), trans.blackPlays())
|
|
}
|
|
}
|
|
</div>
|
|
@if(g.turns > 0) {
|
|
@defining(g openingPgnMoves 20) { pgnMoves =>
|
|
@if(!g.fromPosition) {
|
|
@g.opening.map { opening =>
|
|
<div class="opening">@opening.opening.ecoName</div>
|
|
}
|
|
}
|
|
<div class="pgn">@pgnMoves.take(6).grouped(2).zipWithIndex.map {
|
|
case (Vector(w, b), i) => {@(i+1). @w @b}
|
|
case (Vector(w), i) => {@(i+1). @w}
|
|
case _ => {}
|
|
}.mkString(" ")@if(g.turns > 6) { ... @{1 + (g.turns - 1) / 2} moves }
|
|
</div>
|
|
}
|
|
} else {
|
|
<br /><br />
|
|
}
|
|
<div class="metadata">
|
|
@if(g.metadata.analysed) {<span data-icon=""> @trans.computerAnalysisAvailable()</span><br />}
|
|
@g.pgnImport.flatMap(_.user).map { user =>
|
|
PGN import by @userIdLink(user.some)<br />
|
|
}
|
|
</div>
|
|
</div>
|
|
}
|
|
}
|
|
</div>
|
|
}
|