diff --git a/CLAUDE.md b/CLAUDE.md index ed31748..a34c2f0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -158,3 +158,22 @@ Translations in `view-webapp/.../WEB-INF/translations/` - French (fr) - German (de) - Korean (ko) + +## Current Work + +### User Preferences (feature/user-preferences branch) +Implemented "black vs white" display order option: +- Gear icon in header opens settings modal +- Preference stored in cookie (`blackFirst`) for server-side Velocity rendering +- localStorage backup via store2 (`prefs.blackFirst`) +- Velocity conditionals in tour-pairing.inc.html, tour-results.inc.html, result-sheets.html +- ViewServlet reads cookie and sets `$blackFirst` in Velocity context + +Files modified: +- `view-webapp/.../layouts/standard.html` - gear icon + settings modal +- `view-webapp/.../sass/main.scss` - settings modal styles +- `view-webapp/.../js/main.js` - prefs object + modal handlers + cookie set +- `view-webapp/.../kotlin/.../ViewServlet.kt` - read blackFirst cookie +- `view-webapp/.../tour-pairing.inc.html` - `#if($blackFirst)` conditionals +- `view-webapp/.../tour-results.inc.html` - `#if($blackFirst)` conditionals + inverted result display +- `view-webapp/.../result-sheets.html` - `#if($blackFirst)` conditionals diff --git a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/web/ViewServlet.kt b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/web/ViewServlet.kt index 166e737..e75ea37 100644 --- a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/web/ViewServlet.kt +++ b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/web/ViewServlet.kt @@ -43,6 +43,11 @@ class ViewServlet : VelocityViewServlet() { } } val lang = request.getAttribute("lang") as String + + // User preferences - read from cookie + val blackFirst = request.cookies?.find { it.name == "blackFirst" }?.value == "true" + context.put("blackFirst", blackFirst) + /* val menu = menuEntries!![uri] var title: String? = null diff --git a/view-webapp/src/main/sass/main.scss b/view-webapp/src/main/sass/main.scss index 9f61a22..5f3a59a 100644 --- a/view-webapp/src/main/sass/main.scss +++ b/view-webapp/src/main/sass/main.scss @@ -523,10 +523,22 @@ } } - #logout { + #logout, #settings { cursor: pointer; } + #settings-modal { + .setting { + margin: 0.5em 0; + label { + display: flex; + align-items: center; + gap: 0.5em; + cursor: pointer; + } + } + } + @media screen { #players-list { font-size: smaller; diff --git a/view-webapp/src/main/webapp/WEB-INF/layouts/standard.html b/view-webapp/src/main/webapp/WEB-INF/layouts/standard.html index 81c1e7d..19ecf05 100644 --- a/view-webapp/src/main/webapp/WEB-INF/layouts/standard.html +++ b/view-webapp/src/main/webapp/WEB-INF/layouts/standard.html @@ -44,6 +44,9 @@ #translate('tour-menu.inc.html') #end
| table | +#if($blackFirst) +black | +white | +#elsewhite | black | +#endhd | result | #set($dispRst = {'?':'?', 'w':'1-0', 'b':'0-1', '=':'½-½', 'X':'X', '#':'1-1', '0':'0-0'}) +#set($dispRstInv = {'?':'?', 'w':'0-1', 'b':'1-0', '=':'½-½', 'X':'X', '#':'1-1', '0':'0-0'}) #foreach($game in $individualGames) #set($white = $plmap[$game.w]) #set($black = $plmap[$game.b]) #if($black && $white)|
|---|---|---|---|---|---|---|---|
| ${game.t}. | +#if($blackFirst) +#if($black)$black.name#if($black.firstname) $black.firstname#end #rank($black.rank)#{else}BIP#end | +#if($white)$white.name#if($white.firstname) $white.firstname#end #rank($white.rank)#{else}BIP#end | +#else#if($white)$white.name#if($white.firstname) $white.firstname#end #rank($white.rank)#{else}BIP#end | #if($black)$black.name#if($black.firstname) $black.firstname#end #rank($black.rank)#{else}BIP#end | +#end$!game.h | -$dispRst[$game.r] | +#if($blackFirst)$dispRstInv[$game.r]#{else}$dispRst[$game.r]#end |