Game edition ok, and other minor tweaks

This commit is contained in:
Claude Brisson
2024-01-19 05:43:07 +01:00
parent 897246c7a6
commit cffa4ce699
9 changed files with 131 additions and 14 deletions

View File

@@ -13,7 +13,7 @@ interface ApiHandler {
when (request.method) { when (request.method) {
"GET" -> get(request, response) "GET" -> get(request, response)
"POST" -> post(request) "POST" -> post(request)
"PUT" -> put(request) "PUT" -> put(request)
"DELETE" -> delete(request) "DELETE" -> delete(request)
else -> notImplemented() else -> notImplemented()
} }

View File

@@ -16,7 +16,7 @@ interface PairgothApiHandler: ApiHandler {
fun Tournament<*>.dispatchEvent(event: Event, data: Json? = null) { fun Tournament<*>.dispatchEvent(event: Event, data: Json? = null) {
Event.dispatch(event, Json.Object("tournament" to id, "data" to data)) Event.dispatch(event, Json.Object("tournament" to id, "data" to data))
// when storage is not in memory, the tournament has to be persisted // when storage is not in memory, the tournament has to be persisted
if (event != Event.tournamentAdded && event != Event.tournamentDeleted && event != Event.gameUpdated) if (event != Event.tournamentAdded && event != Event.tournamentDeleted)
Store.replaceTournament(this) Store.replaceTournament(this)
} }

View File

@@ -71,6 +71,7 @@ object PairingHandler: PairgothApiHandler {
val playing = (tournament.games(round).values).filter { it.id != gameId }.flatMap { val playing = (tournament.games(round).values).filter { it.id != gameId }.flatMap {
listOf(it.black, it.white) listOf(it.black, it.white)
}.toSet() }.toSet()
if (game.result != Game.Result.UNKNOWN) badRequest("Game already has a result");
game.black = payload.getID("b") ?: badRequest("missing black player id") game.black = payload.getID("b") ?: badRequest("missing black player id")
game.white = payload.getID("w") ?: badRequest("missing white player id") game.white = payload.getID("w") ?: badRequest("missing white player id")
tournament.recomputeDUDD(round, game.id) tournament.recomputeDUDD(round, game.id)

View File

@@ -202,6 +202,9 @@
} }
} }
} }
#pairables {
margin-bottom: 1em;
}
#paired { #paired {
.listitem { .listitem {
position: relative; position: relative;

View File

@@ -120,8 +120,14 @@ Element.prototype.hide = function() {
return this; return this;
} }
NodeList.prototype.text = function(txt) { NodeList.prototype.text = function(txt) {
this.item(0).text(txt); if (typeof(txt) === 'undefined') {
return this; return this.item(0).text();
} else {
this.forEach(elem => {
elem.text(txt);
});
return this;
}
} }
Element.prototype.text = function(txt) { Element.prototype.text = function(txt) {
if (typeof(txt) === 'undefined') { if (typeof(txt) === 'undefined') {

View File

@@ -18,6 +18,26 @@ function unpair(games) {
}); });
} }
function editGame(game) {
let t = game.find('.table');
let w = game.find('.white');
let b = game.find('.black');
let h = game.find('.handicap');
let form = $('#pairing-form')[0];
form.val('id', game.data('id'));
form.val('t', t.data('value'));
form.val('w', w.data('id'));
$('#edit-pairing-white').text(w.text());
form.val('b', b.data('id'));
$('#edit-pairing-black').text(b.text());
form.val('h', h.data('value'));
$('#update-pairing').addClass('disabled');
modal('edit-pairing');
}
onLoad(()=>{ onLoad(()=>{
$('.listitem').on('click', e => { $('.listitem').on('click', e => {
if (e.shiftKey && typeof(focused) !== 'undefined') { if (e.shiftKey && typeof(focused) !== 'undefined') {
@@ -31,13 +51,17 @@ onLoad(()=>{
let parent = e.target.closest('.multi-select'); let parent = e.target.closest('.multi-select');
let children = parent.childNodes.filter('.listitem'); let children = parent.childNodes.filter('.listitem');
for (let j = from; j <= to; ++j) { new Tablesort($('#players')[0]); for (let j = from; j <= to; ++j) { new Tablesort($('#players')[0]);
children.item(j).addClass('selected'); children.item(j).addClass('selected');
children.item(j).attr('draggable', true); children.item(j).attr('draggable', true);
} }
} else { } else {
let target = e.target.closest('.listitem'); let target = e.target.closest('.listitem');
focused = target.toggleClass('selected').attr('draggable', target.hasClass('selected')); if (e.detail === 1) {
focused = target.toggleClass('selected').attr('draggable', target.hasClass('selected'));
} else {
focused = target.attr('draggable', target.hasClass('selected'));
editGame(focused);
}
} }
}); });
$('#pair').on('click', e => { $('#pair').on('click', e => {
@@ -56,4 +80,39 @@ onLoad(()=>{
} }
unpair(games); unpair(games);
}); });
$('#pairing-form [name]').on('input', e => {
$('#update-pairing').removeClass('disabled');
});
$('#pairing-exchange').on('click', e => {
let form = $('#pairing-form')[0];
let w = form.val('w');
let b = form.val('b');
form.val('w', b);
form.val('b', w);
let wName = $('#edit-pairing-white').text();
let bName = $('#edit-pairing-black').text();
$('#edit-pairing-white').text(bName);
$('#edit-pairing-black').text(wName);
$('#update-pairing').removeClass('disabled');
});
$('#pairing-form').on('submit', e => {
e.preventDefault();
return false;
});
$('#update-pairing').on('click', e => {
let form = $('#pairing-form')[0];
let game = {
id: form.val('id'),
t: form.val('t'),
w: form.val('w'),
b: form.val('b'),
h: form.val('h')
}
api.putJson(`tour/${tour_id}/pair/${activeRound}`, game)
.then(game => {
if (game !== 'error') {
document.location.reload();
}
});
});
}); });

View File

@@ -122,7 +122,6 @@ onLoad(() => {
$('#player-form')[0].dispatchEvent(new CustomEvent('submit', {cancelable: true})); $('#player-form')[0].dispatchEvent(new CustomEvent('submit', {cancelable: true}));
}); });
$('#player-form').on('submit', e => { $('#player-form').on('submit', e => {
("submitting!!")
e.preventDefault(); e.preventDefault();
let form = $('#player-form')[0]; let form = $('#player-form')[0];
let player = { let player = {

View File

@@ -9,9 +9,9 @@ function setResult(id, result) {
let dispResult = result; let dispResult = result;
switch (result) { switch (result) {
case '?': break; case '?': break;
case 'w': white.addClass('winner'); black.addClass('looser'); dispResult = 'w+'; break; case 'w': white.addClass('winner'); black.addClass('looser'); dispResult = '1-0'; break;
case 'b': black.addClass('winner'); white.addClass('looser'); dispResult = 'b+'; break; case 'b': black.addClass('winner'); white.addClass('looser'); dispResult = '0-1'; break;
case '=': break; case '=': dispResult = '½-½'; break;
case 'X': break; case 'X': break;
case '#': white.addClass('winner'); black.addClass('winner'); dispResult = '1-1'; break; case '#': white.addClass('winner'); black.addClass('winner'); dispResult = '1-1'; break;
case '0': white.addClass('looser'); black.addClass('looser'); dispResult = '0-0'; break; case '0': white.addClass('looser'); black.addClass('looser'); dispResult = '0-0'; break;

View File

@@ -52,11 +52,11 @@
#set($white = $pmap[$game.w]) #set($white = $pmap[$game.w])
#set($black = $pmap[$game.b]) #set($black = $pmap[$game.b])
<div class="listitem game" data-id="$game.id"> <div class="listitem game" data-id="$game.id">
<div class="table">#$game.t</div> <div class="table" data-value="$game.t">#$game.t</div>
<div class="white">#if($white)$white.name $white.firstname#{else}BIP#end</div> <div class="white" data-id="$game.w">#if($white)$white.name $white.firstname#{else}BIP#end</div>
<div class="levels">#if($white)#rank($white.rank)#end&nbsp;/&nbsp;#if($black)#rank($black.rank)#end</div> <div class="levels">#if($white)#rank($white.rank)#end&nbsp;/&nbsp;#if($black)#rank($black.rank)#end</div>
<div class="black">#if($black)$black.name $black.firstname#{else}BIP#end</div> <div class="black" data-id="$game.b">#if($black)$black.name $black.firstname#{else}BIP#end</div>
<div class="handicap">#if($game.h)h$game.h#{else}&nbsp;#end</div> <div class="handicap" data-value="$game.h">#if($game.h)h$game.h#{else}&nbsp;#end</div>
</div> </div>
#end #end
</div> </div>
@@ -64,3 +64,52 @@
</div> </div>
</div> </div>
</div> </div>
<div id="edit-pairing" class="popup">
<div class="popup-body">
<form id="pairing-form" class="ui form edit">
<input type="hidden" name="id"/>
<div class="popup-content">
<div class="inline fields">
<div class="field">
<label>Tbl</label>
<span class="nobreak">#<input name="t" type="number"/></span>
</div>
<div class="field">
<label>White</label>
<input type="hidden" name="w"/>
<div id="edit-pairing-white"></div>
</div>
<div class="field">
<button id="pairing-exchange" type="button" class="ui icon button">
<i class="fa fa-exchange"></i>
</button>
</div>
<div class="field">
<label>Black</label>
<input type="hidden" name="b"/>
<div id="edit-pairing-black"></div>
</div>
<div class="field">
<label>Hd</label>
<select name="h">
#foreach($h in [0..9])
<option value="$h">$h</option>
#end
</select>
</div>
</div>
</div>
<div class="popup-footer">
<button id="cancel-pairing" type="button" class="ui gray right labeled icon floating close button">
<i class="times icon"></i>
Cancel
</button>
<button id="update-pairing" type="button" class="ui green right labeled icon floating button">
<i class="check icon"></i>
Update
</button>
</div>
</form>
</div>
</div>