Experimental update: preview corr move + allow deletion of any game
[vchess.git] / client / src / components / BaseGame.vue
index 4af4e15..e7977eb 100644 (file)
@@ -33,29 +33,19 @@ div#baseGame
           img.inline(src="/images/icons/play.svg")
         button(@click="gotoEnd()")
           img.inline(src="/images/icons/fast-forward.svg")
-      #belowControls
-        #downloadDiv(v-if="allowDownloadPGN")
-          a#download(href="#")
-          button(@click="download()") {{ st.tr["Download"] }} PGN
-        button(
-          v-if="canAnalyze"
-          @click="analyzePosition()"
-        )
-          | {{ st.tr["Analyse"] }}
-        // NOTE: variants pages already have a "Rules" link on top
-        button(
-          v-if="!$route.path.match('/variants/')"
-          @click="showRules()"
-        )
-          | {{ st.tr["Rules"] }}
     #movesList
       MoveList(
         :show="showMoves"
+        :canAnalyze="canAnalyze"
+        :canDownload="allowDownloadPGN"
         :score="game.score"
         :message="game.scoreMsg"
         :firstNum="firstMoveNumber"
         :moves="moves"
         :cursor="cursor"
+        @download="download"
+        @showrules="showRules"
+        @analyze="analyzePosition"
         @goto-move="gotoMove"
       )
     .clearer
@@ -87,18 +77,20 @@ export default {
       orientation: "w",
       score: "*", //'*' means 'unfinished'
       moves: [],
-      // TODO: later, use subCursor to navigate intra-multimoves?
       cursor: -1, //index of the move just played
       lastMove: null,
       firstMoveNumber: 0, //for printing
       incheck: [], //for Board
-      inMultimove: false
+      inMultimove: false,
+      inPlay: false,
+      stackToPlay: []
     };
   },
   watch: {
-    // game initial FEN changes when a new game starts
-    "game.fenStart": function() {
-      this.re_setVariables();
+    // game initial FEN changes when a new game starts.
+    // NOTE: when game ID change on Game page, fenStart may be temporarily undefined
+    "game.fenStart": function(fenStart) {
+      if (!!fenStart) this.re_setVariables();
     },
   },
   computed: {
@@ -265,15 +257,12 @@ export default {
     },
     showEndgameMsg: function(message) {
       this.endgameMessage = message;
-      let modalBox = document.getElementById("modalEog");
-      modalBox.checked = true;
-      setTimeout(() => {
-        modalBox.checked = false;
-      }, 2000);
+      document.getElementById("modalEog").checked = true;
     },
     // Animate an elementary move
     animateMove: function(move, callback) {
       let startSquare = document.getElementById(getSquareId(move.start));
+      if (!startSquare) return; //shouldn't happen but...
       let endSquare = document.getElementById(getSquareId(move.end));
       let rectStart = startSquare.getBoundingClientRect();
       let rectEnd = endSquare.getBoundingClientRect();
@@ -284,6 +273,9 @@ export default {
       let movingPiece = document.querySelector(
         "#" + getSquareId(move.start) + " > img.piece"
       );
+      // For some unknown reasons Opera get "movingPiece == null" error
+      // TOOO: is it calling 'animate()' twice ? One extra time ?
+      if (!movingPiece) return;
       // HACK for animation (with positive translate, image slides "under background")
       // Possible improvement: just alter squares on the piece's way...
       const squares = document.getElementsByClassName("board");
@@ -312,8 +304,15 @@ export default {
       }
     },
     // "light": if gotoMove() or gotoEnd()
-    // data: some custom data (addTime) to be re-emitted
-    play: function(move, received, light, data) {
+    play: function(move, received, light, noemit) {
+      if (!!noemit) {
+        if (this.inPlay) {
+          // Received moves in observed games can arrive too fast:
+          this.stackToPlay.unshift(move);
+          return;
+        }
+        this.inPlay = true;
+      }
       const navigate = !move;
       const playSubmove = (smove) => {
         if (!navigate) smove.notation = this.vr.getNotation(smove);
@@ -380,8 +379,15 @@ export default {
           }
           if (!navigate && this.game.mode != "analyze") {
             const L = this.moves.length;
-            // Post-processing (e.g. computer play)
-            this.$emit("newmove", this.moves[L-1], data);
+            if (!noemit)
+              // Post-processing (e.g. computer play)
+              this.$emit("newmove", this.moves[L-1]);
+            else {
+              this.inPlay = false;
+              if (this.stackToPlay.length > 0)
+                // Move(s) arrived in-between
+                this.play(this.stackToPlay.pop(), received, light, noemit);
+            }
           }
         }
       };
@@ -516,29 +522,19 @@ export default {
     display: inline-block
     width: 20%
     margin: 0
-    img.inline
-      height: 24px
-      padding-top: 5px
-    @media screen and (max-width: 767px)
-      img.inline
-        height: 18px
+    padding-top: 5px
+    padding-bottom: 5px
+
+img.inline
+  height: 24px
+  padding-top: 5px
+  @media screen and (max-width: 767px)
+    height: 18px
 
 #turnIndicator
   text-align: center
   font-weight: bold
 
-#belowControls
-  border-top: 1px solid #2f4f4f
-  text-align: center
-  margin: 0 auto
-  & > #downloadDiv
-    margin: 0
-    & > button
-      margin: 0
-  & > button
-    border-left: 1px solid #2f4f4f
-    margin: 0
-
 #boardContainer
   float: left
 // TODO: later, maybe, allow movesList of variable width