From 40ac6bfa2c1877297c8b037b2045bed0e099c030 Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Fri, 12 Feb 2016 19:38:49 +0700 Subject: [PATCH] /analysis variant selector WIP --- app/controllers/UserAnalysis.scala | 20 ++++++--- app/views/board/userAnalysis.scala.html | 19 +++++++- conf/routes | 2 +- modules/api/src/main/RoundApi.scala | 2 +- modules/chess | 2 +- modules/rating/src/main/PerfType.scala | 5 ++- public/javascripts/big.js | 13 ++++++ public/stylesheets/analyse.css | 58 +++++++++++++++++++++++++ 8 files changed, 110 insertions(+), 11 deletions(-) diff --git a/app/controllers/UserAnalysis.scala b/app/controllers/UserAnalysis.scala index 611c7715b2eb..77cc5d924f4c 100644 --- a/app/controllers/UserAnalysis.scala +++ b/app/controllers/UserAnalysis.scala @@ -3,6 +3,8 @@ package controllers import chess.format.Forsyth import chess.format.Forsyth.SituationPlus import chess.Situation +import chess.variant.Standard +import chess.variant.Variant import play.api.libs.json.Json import play.api.mvc._ import scala.concurrent.duration._ @@ -14,16 +16,22 @@ import views._ object UserAnalysis extends LilaController with TheftPrevention { - def index = load("") + def index = load("", Standard) - def load(urlFen: String) = Open { implicit ctx => + def variantOrLoad(something: String) = + Variant.byKey get something match { + case Some(variant) => load("", variant) + case None => load(something, Standard) + } + + def load(urlFen: String, variant: Variant) = Open { implicit ctx => val fenStr = Some(urlFen.trim.replace("_", " ")).filter(_.nonEmpty) orElse get("fen") val decodedFen = fenStr.map { java.net.URLDecoder.decode(_, "UTF-8").trim }.filter(_.nonEmpty) - val situation = (decodedFen flatMap Forsyth.<<<) | SituationPlus(Situation(chess.variant.Standard), 1) + val situation = (decodedFen flatMap Forsyth.<<<) | SituationPlus(Situation(variant), 1) val pov = makePov(situation) val orientation = get("color").flatMap(chess.Color.apply) | pov.color Env.api.roundApi.userAnalysisJson(pov, ctx.pref, decodedFen, orientation, owner = false) map { data => - Ok(html.board.userAnalysis(data, none)) + Ok(html.board.userAnalysis(data, variant)) } } @@ -36,7 +44,7 @@ object UserAnalysis extends LilaController with TheftPrevention { whitePlayer = lila.game.Player.white, blackPlayer = lila.game.Player.black, mode = chess.Mode.Casual, - variant = chess.variant.Standard, + variant = from.situation.board.variant, source = lila.game.Source.Api, pgnImport = None).copy(id = "synthetic"), from.situation.color) @@ -46,7 +54,7 @@ object UserAnalysis extends LilaController with TheftPrevention { GameRepo initialFen game.id flatMap { initialFen => val pov = Pov(game, chess.Color(color == "white")) Env.api.roundApi.userAnalysisJson(pov, ctx.pref, initialFen, pov.color, owner = isMyPov(pov)) map { data => - Ok(html.board.userAnalysis(data, pov.some)) + Ok(html.board.userAnalysis(data, pov.game.variant)) } } map NoCache } diff --git a/app/views/board/userAnalysis.scala.html b/app/views/board/userAnalysis.scala.html index 8a96f04828b5..677d948c69c4 100644 --- a/app/views/board/userAnalysis.scala.html +++ b/app/views/board/userAnalysis.scala.html @@ -1,4 +1,6 @@ -@(data: play.api.libs.json.JsObject, pov: Option[Pov])(implicit ctx: Context) +@(data: play.api.libs.json.JsObject, variant: chess.variant.Variant)(implicit ctx: Context) + +@import lila.rating.PerfType.iconByVariant @moreCss = { @cssTag("analyse.css") @@ -41,10 +43,25 @@ } } +@side = { +
+
+ @variant.name + +
+
+ @chess.variant.Variant.all.filterNot(chess.variant.FromPosition ==).map { v => + @v.name + } +
+
+} + @base.layout( title = trans.analysis.str(), moreCss = moreCss, moreJs = moreJs, +side = side.some, chessground = false, openGraph = lila.app.ui.OpenGraph( title = "Chess analysis board", diff --git a/conf/routes b/conf/routes index ec07b021a410..8fad308d9339 100644 --- a/conf/routes +++ b/conf/routes @@ -114,7 +114,7 @@ POST /training/:id/attempt controllers.Puzzle.attempt(id: Int) POST /training/:id/vote controllers.Puzzle.vote(id: Int) # User Analysis -GET /analysis/*urlFen controllers.UserAnalysis.load(urlFen: String) +GET /analysis/*something controllers.UserAnalysis.variantOrLoad(something: String) GET /analysis controllers.UserAnalysis.index # Round diff --git a/modules/api/src/main/RoundApi.scala b/modules/api/src/main/RoundApi.scala index 4b56ca027aad..8abe4e804ffc 100644 --- a/modules/api/src/main/RoundApi.scala +++ b/modules/api/src/main/RoundApi.scala @@ -82,7 +82,7 @@ private[api] final class RoundApi( pgnMoves = pov.game.pgnMoves, variant = pov.game.variant, a = a, - initialFen = initialFen | chess.format.Forsyth.initial)) + initialFen = initialFen | pov.game.variant.initialFen)) private def withNote(note: String)(json: JsObject) = if (note.isEmpty) json else json + ("note" -> JsString(note)) diff --git a/modules/chess b/modules/chess index b7ebe876414a..856aa08bebbd 160000 --- a/modules/chess +++ b/modules/chess @@ -1 +1 @@ -Subproject commit b7ebe876414a1cf2b2b367b65082f3e3aff4113a +Subproject commit 856aa08bebbd6f363ba9676270041eda20aa1dfa diff --git a/modules/rating/src/main/PerfType.scala b/modules/rating/src/main/PerfType.scala index 9d4c1134050c..9dbff30fa575 100644 --- a/modules/rating/src/main/PerfType.scala +++ b/modules/rating/src/main/PerfType.scala @@ -141,7 +141,6 @@ object PerfType { } def byVariant(variant: chess.variant.Variant): Option[PerfType] = variant match { - case chess.variant.Standard => none case chess.variant.Crazyhouse => Crazyhouse.some case chess.variant.Chess960 => Chess960.some case chess.variant.KingOfTheHill => KingOfTheHill.some @@ -150,5 +149,9 @@ object PerfType { case chess.variant.Atomic => Atomic.some case chess.variant.Horde => Horde.some case chess.variant.RacingKings => RacingKings.some + case _ => none } + + def iconByVariant(variant: chess.variant.Variant): Char = + byVariant(variant).getOrElse(Classical).iconChar } diff --git a/public/javascripts/big.js b/public/javascripts/big.js index cff306f09774..38f075396e2f 100644 --- a/public/javascripts/big.js +++ b/public/javascripts/big.js @@ -742,6 +742,19 @@ lichess.numberFormat = (function() { return false; }); + $('.mselect .button').on('click', function() { + var $p = $(this).parent(); + $p.toggleClass('shown'); + setTimeout(function() { + var handler = function(e) { + if ($.contains($p[0], e.target)) return; + $p.removeClass('shown'); + $('html').off('click', handler); + }; + $('html').on('click', handler); + }, 10); + }); + var powerTipLoader = '
'; lichess.userPowertip = function($els, placement) { diff --git a/public/stylesheets/analyse.css b/public/stylesheets/analyse.css index e56561b5e41c..3629caf156d3 100644 --- a/public/stylesheets/analyse.css +++ b/public/stylesheets/analyse.css @@ -848,6 +848,64 @@ table.modAssessment td.noMatch { color: #759900; } +.mselect { + margin-top: 20px; + width: 100%; + font-size: 1.2em; + box-sizing: border-box; + display:inline-block; + position: relative; + padding:0; + border:0; +} +.mselect .button { + position: relative; + display: inline-block; + box-sizing: border-box; + width: 100%; + padding: 10px; +} +.mselect .button i { + font-size: 10px; + position: absolute; + right: 5px; + top: 14px; +} +.mselect .list { + width:100%; + margin:0; + padding:0; + position:absolute; + top:0; + text-align: left; + list-style-type:none; + font-weight: normal; + background:#FFF; + box-shadow: 0px 8px 17px 0px rgba(0, 0, 0, 0.2), 0px 6px 20px 0px rgba(0, 0, 0, 0.19); + border-radius: 3px; + display: none; +} +.mselect.shown .list { + display: block; +} +.mselect .list a { + display: block; + padding: 10px; + background:#fff; + transition: 0.13s; + outline:0; + text-decoration:none; + cursor:pointer; +} +.mselect .list a:hover{ + background: #3893E8; + color: #fff; +} +.mselect [data-icon]:before { + font-size: 1.5em; + margin-right: 10px; +} + body.coords_2 .gauge_displayed square[data-coord-y]::before { color: #fff; text-shadow: 0 1px 2px #000;