Implemented multi-move possibility in a moves list => better support for multi-moves...
[vchess.git] / client / src / views / Problems.vue
index e17bead..2d6ac69 100644 (file)
@@ -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"
   )
 </template>
 
@@ -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