Better site presentation (especially for languages settings)
[vchess.git] / client / src / components / MoveList.vue
index 920d524..6ff93d8 100644 (file)
@@ -1,5 +1,23 @@
 <template lang="pug">
 div
+  input#modalAdjust.modal(type="checkbox")
+  div#adjuster(
+    role="dialog"
+    data-checkbox="modalAdjust"
+  )
+    .card.text-center
+      label.modal-close(for="modalAdjust")
+      label(for="boardSize") {{ st.tr["Board size"] }}
+      input#boardSize.slider(
+        type="range"
+        min="0"
+        max="100"
+        value="50"
+        @input="adjustBoard()"
+      )
+  div#boardSizeBtnContainer
+    button#boardSizeBtn(onClick="window.doClick('modalAdjust')")
+      | {{ st.tr["Board size"] }}
   #scoreInfo(v-if="score!='*'")
     p {{ score }}
     p {{ st.tr[message] }}
@@ -17,13 +35,12 @@ div
         @click="() => gotoMove(moveIdx+1)"
       )
         | {{ notation(moves[moveIdx+1]) }}
-      // Else: just add an empty cell
-      //.td(v-else)
 </template>
 
 <script>
 import { store } from "@/store";
 import { getFullNotation } from "@/utils/notation";
+import { processModalClick } from "@/utils/modalClick";
 export default {
   name: "my-move-list",
   props: ["moves", "show", "cursor", "score", "message", "firstNum"],
@@ -32,6 +49,36 @@ export default {
       st: store.state
     };
   },
+  mounted: function() {
+    document.getElementById("adjuster").addEventListener(
+      "click",
+      processModalClick);
+    // Take full width on small screens:
+    let boardSize = parseInt(localStorage.getItem("boardSize"));
+    if (!boardSize) {
+      boardSize =
+        window.innerWidth >= 768
+          ? 0.75 * Math.min(window.innerWidth, window.innerHeight)
+          : window.innerWidth;
+    }
+    const movesWidth = window.innerWidth >= 768 ? 280 : 0;
+    document.getElementById("boardContainer").style.width = boardSize + "px";
+    let gameContainer = document.getElementById("gameContainer");
+    gameContainer.style.width = boardSize + movesWidth + "px";
+    document.getElementById("boardSize").value =
+      (boardSize * 100) / (window.innerWidth - movesWidth);
+    // timeout to avoid calling too many time the adjust method
+    let timeoutLaunched = false;
+    window.addEventListener("resize", () => {
+      if (!timeoutLaunched) {
+        timeoutLaunched = true;
+        setTimeout(() => {
+          this.adjustBoard();
+          timeoutLaunched = false;
+        }, 500);
+      }
+    });
+  },
   watch: {
     cursor: function(newCursor) {
       if (window.innerWidth <= 767) return; //scrolling would hide chessboard
@@ -58,6 +105,21 @@ export default {
     },
     gotoMove: function(index) {
       this.$emit("goto-move", index);
+    },
+    adjustBoard: function() {
+      const boardContainer = document.getElementById("boardContainer");
+      if (!boardContainer) return; //no board on page
+      const k = document.getElementById("boardSize").value;
+      const movesWidth = window.innerWidth >= 768 ? 280 : 0;
+      const minBoardWidth = 240; //TODO: these 240 and 280 are arbitrary...
+      // Value of 0 is board min size; 100 is window.width [- movesWidth]
+      const boardSize =
+        minBoardWidth +
+        (k * (window.innerWidth - (movesWidth + minBoardWidth))) / 100;
+      localStorage.setItem("boardSize", boardSize);
+      boardContainer.style.width = boardSize + "px";
+      document.getElementById("gameContainer").style.width =
+        boardSize + movesWidth + "px";
     }
   }
 };
@@ -89,4 +151,14 @@ export default {
 
 .td.highlight-lm
   background-color: plum
+
+#boardSizeBtnContainer
+  width: 100%
+  text-align: center
+
+button#boardSizeBtn
+  margin: 0
+
+[type="checkbox"]#modalAdjust+div .card
+  padding: 5px
 </style>