X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fviews%2FProblems.vue;h=2d6ac6924a975c32d9189461d8f5c0beff7b1076;hb=e71161fbfffe53b0f4b174e0467cdd98cc70b7b0;hp=e17bead7ea68ff4cfb5b1991a5d6dbddbdb12ba4;hpb=910d631b73cad5ffef1b4461157b704e7e7057d8;p=vchess.git diff --git a/client/src/views/Problems.vue b/client/src/views/Problems.vue index e17bead7..2d6ac692 100644 --- a/client/src/views/Problems.vue +++ b/client/src/views/Problems.vue @@ -8,7 +8,7 @@ main role="dialog" data-checkbox="modalNewprob" ) - .card(@keyup.enter="sendProblem()") + .card label#closeNewprob.modal-close(for="modalNewprob") fieldset label(for="selectVariant") {{ st.tr["Variant"] }} @@ -45,22 +45,19 @@ main button(@click="sendProblem()") {{ st.tr["Send"] }} #dialog.text-center {{ st.tr[infoMsg] }} .row(v-if="showOne") - .col-sm-12.col-md-10.col-md-offset-2 + .col-sm-12.col-md-10.col-md-offset-1.col-lg-8.col-lg-offset-2 #topPage + .button-group(v-if="st.user.id == curproblem.uid") + button(@click="editProblem(curproblem)") {{ st.tr["Edit"] }} + button(@click="deleteProblem(curproblem)") {{ st.tr["Delete"] }} span.vname {{ curproblem.vname }} span.uname ({{ curproblem.uname }}) button.marginleft(@click="backToList()") {{ st.tr["Back to list"] }} - button.nomargin( - v-if="st.user.id == curproblem.uid" - @click="editProblem(curproblem)" - ) - | {{ st.tr["Edit"] }} - button.nomargin( - v-if="st.user.id == curproblem.uid" - @click="deleteProblem(curproblem)" - ) - | {{ st.tr["Delete"] }} - p.clickable( + button.nomargin(@click="gotoPrevNext($event,curproblem,1)") + | {{ st.tr["Previous"] }} + button.nomargin(@click="gotoPrevNext($event,curproblem,-1)") + | {{ st.tr["Next"] }} + p.oneInstructions.clickable( v-html="parseHtml(curproblem.instruction)" @click="curproblem.showSolution=!curproblem.showSolution" ) @@ -72,7 +69,7 @@ main .row(v-else) .col-sm-12.col-md-10.col-md-offset-1.col-lg-8.col-lg-offset-2 #controls - button#newProblem(onClick="window.doClick('modalNewprob')") + button#newProblem(@click="prepareNewProblem()") | {{ st.tr["New problem"] }} label(for="checkboxMine") {{ st.tr["My problems"] }} input#checkboxMine( @@ -86,7 +83,7 @@ main :value="v.id" ) | {{ v.name }} - table + table#tProblems tr th {{ st.tr["Variant"] }} th {{ st.tr["Instructions"] }} @@ -102,7 +99,6 @@ main BaseGame( v-if="showOne" :game="game" - :vr="vr" ) @@ -142,7 +138,6 @@ export default { onlyMines: false, showOne: false, infoMsg: "", - vr: null, //"variant rules" object initialized from FEN game: { players: [{ name: "Problem" }, { name: "Problem" }], mode: "analyze" @@ -159,7 +154,6 @@ export default { let names = {}; this.problems.forEach(p => { if (p.uid != this.st.user.id) names[p.uid] = ""; - //unknwon for now else p.uname = this.st.user.name; }); const showOneIfPid = () => { @@ -171,7 +165,10 @@ export default { res2.users.forEach(u => { names[u.id] = u.name; }); - this.problems.forEach(p => (p.uname = names[p.uid])); + this.problems.forEach(p => { + if (!p.uname) + p.uname = names[p.uid]; + }); showOneIfPid(); }); } else showOneIfPid(); @@ -273,7 +270,7 @@ export default { }, displayProblem: function(p) { return ( - (this.selectedVar == 0 || p.vid == this.selectedVar) && + (!this.selectedVar || p.vid == this.selectedVar) && ((this.onlyMines && p.uid == this.st.user.id) || (!this.onlyMines && p.uid != this.st.user.id)) ); @@ -281,19 +278,37 @@ export default { showProblem: function(p) { this.loadVariant(p.vid, () => { // The FEN is already checked at this stage: - this.vr = new V(p.fen); this.game.vname = p.vname; - this.game.mycolor = this.vr.turn; //diagram orientation + this.game.mycolor = V.ParseFen(p.fen).turn; //diagram orientation this.game.fen = p.fen; this.$set(this.game, "fenStart", p.fen); this.copyProblem(p, this.curproblem); this.showOne = true; }); }, + gotoPrevNext: function(e, prob, dir) { + const startIdx = this.problems.findIndex(p => p.id == prob.id); + let nextIdx = startIdx + dir; + while ( + nextIdx >= 0 && + nextIdx < this.problems.length && + ((this.onlyMines && this.problems[nextIdx].uid != this.st.user.id) || + (!this.onlyMines && this.problems[nextIdx].uid == this.st.user.id)) + ) + nextIdx += dir; + if (nextIdx >= 0 && nextIdx < this.problems.length) + this.setHrefPid(this.problems[nextIdx]); + else + alert(this.st.tr["No more problems"]); + }, + prepareNewProblem: function() { + this.resetCurProb(); + window.doClick("modalNewprob"); + }, sendProblem: function() { const error = checkProblem(this.curproblem); if (error) { - alert(error); + alert(this.st.tr[error]); return; } const edit = this.curproblem.id > 0; @@ -306,21 +321,23 @@ export default { if (edit) { let editedP = this.problems.find(p => p.id == this.curproblem.id); this.copyProblem(this.curproblem, editedP); - } //new problem + this.showProblem(editedP); + } else { let newProblem = Object.assign({}, this.curproblem); newProblem.id = ret.id; newProblem.uid = this.st.user.id; newProblem.uname = this.st.user.name; - this.problems = this.problems.concat(newProblem); + this.problems = [newProblem].concat(this.problems); } - this.resetCurProb(); + document.getElementById("modalNewprob").checked = false; this.infoMsg = ""; } ); }, editProblem: function(prob) { - if (!prob.diag) this.setDiagram(prob); //V is loaded at this stage + // prob.diag might correspond to some other problem or be empty: + this.setDiagram(prob); //V is loaded at this stage this.copyProblem(prob, this.curproblem); window.doClick("modalNewprob"); }, @@ -351,6 +368,9 @@ textarea margin: 0 auto max-width: 400px +table#tProblems + max-height: 100% + #controls margin: 0 width: 100% @@ -358,6 +378,11 @@ textarea & > * margin: 0 +p.oneInstructions + margin: 0 + padding: 2px 5px + background-color: lightgreen + #topPage span.vname font-weight: bold