Experimental change: options replacing randomness (more general)
[vchess.git] / client / src / views / Rules.vue
index 09d5e06..fc3a0cd 100644 (file)
@@ -1,5 +1,30 @@
 <template lang="pug">
 main
+  input#modalOptions.modal(type="checkbox")
+  div#optionsDiv(
+    role="dialog"
+    data-checkbox="modalOptions"
+  )
+    .card
+      label.modal-close(for="modalOptions")
+      h3 {{ st.tr["Options"] }}
+      fieldset(v-if="!!V")
+        div(v-for="select of V.Options.select")
+          label(:for="select.variable + '_opt'") {{ st.tr[select.label] }} *
+          select(:id="select.variable + '_opt'")
+            option(
+              v-for="o of select.options"
+              :value="o.value"
+              :selected="o.value == select.defaut"
+            )
+              | {{ st.tr[o.label] }}
+        div(v-for="check of V.Options.check")
+          label(:for="check.variable + '_opt'") {{ st.tr[check.label] }} *
+          input(
+            :id="check.variable + '_opt'"
+            type="checkbox"
+            :checked="check.defaut")
+      button(@click="setOptions()") {{ st.tr["Validate"] }}
   .row
     .col-sm-12.col-md-10.col-md-offset-1.col-lg-8.col-lg-offset-2
       .button-group
@@ -44,6 +69,7 @@ import ComputerGame from "@/components/ComputerGame.vue";
 import { store } from "@/store";
 import { replaceByDiag } from "@/utils/printDiagram";
 import { CompgameStorage } from "@/utils/compgameStorage";
+import { processModalClick } from "@/utils/modalClick";
 import afterRawLoad from "@/utils/afterRawLoad";
 export default {
   name: "my-rules",
@@ -58,9 +84,9 @@ export default {
       // variables passed to ComputerGame:
       gameInfo: {
         vname: "",
-        mode: "versus",
+        mode: "versus"
       },
-      V: null,
+      V: null
     };
   },
   watch: {
@@ -72,6 +98,10 @@ export default {
     // NOTE: variant cannot be set before store is initialized
     this.re_setVariant(this.$route.params["vname"]);
   },
+  mounted: function() {
+    document.getElementById("optionsDiv")
+      .addEventListener("click", processModalClick);
+  },
   computed: {
     showAnalyzeBtn: function() {
       return !!this.V && this.V.CanAnalyze;
@@ -117,12 +147,38 @@ export default {
         }, 500);
       });
     },
-    startGame: function(mode) {
+    setOptions: function() {
+      let options = {};
+      // Get/set options variables / TODO: v-model?!
+      for (const check of this.V.Options.check) {
+        const elt = document.getElementById(check.variable + "_opt");
+        if (elt.checked) options[check.variable] = true;
+      }
+      for (const select of this.V.Options.select) {
+        const elt = document.getElementById(select.variable + "_opt");
+        options[select.variable] = elt.value;
+      }
+      document.getElementById("modalOptions").checked = false;
+      if (this.whatNext == "analyze") this.gotoAnalyze(options);
+      else this.startGame(this.whatNext, options);
+    },
+    startGame: function(mode, options) {
       if (this.gameInProgress) return;
-      this.gameInProgress = true;
-      this.display = "computer";
-      this.gameInfo.mode = mode;
-      if (this.gameInfo.mode == "versus") {
+      const next = (game, options) => {
+        this.gameInProgress = true;
+        this.display = "computer";
+        this.gameInfo.mode = mode;
+        this.$refs["compgame"].launchGame(game, options);
+      };
+      if (!!options) {
+        next(null, options);
+        return;
+      }
+      const askOptions = () => {
+        this.whatNext = mode;
+        doClick("modalOptions");
+      };
+      if (mode == "versus") {
         CompgameStorage.get(this.gameInfo.vname, (game) => {
           // NOTE: game might be null (if none stored yet)
           if (!!game && !V.IsGoodFen(game.fen)) {
@@ -130,10 +186,14 @@ export default {
             CompgameStorage.remove(game.vname);
             game = null;
           }
-          this.$refs["compgame"].launchGame(game);
+          if (!!game || Object.keys(V.Options).length == 0) next(game);
+          else askOptions();
         });
       }
-      else this.$refs["compgame"].launchGame();
+      else {
+        if (Object.keys(V.Options).length == 0) next();
+        else askOptions();
+      }
     },
     // The user wants to stop the game:
     stopGame: function() {
@@ -145,11 +205,17 @@ export default {
       if (this.gameInfo.mode == "versus")
         CompgameStorage.remove(this.gameInfo.vname);
     },
-    gotoAnalyze: function() {
-      this.$router.push(
-        "/analyse/" + this.gameInfo.vname +
-        "/?fen=" + V.GenRandInitFen(this.st.settings.randomness)
-      );
+    gotoAnalyze: function(options) {
+      if (!options && Object.keys(V.Options).length > 0) {
+        this.whatNext = "analyze";
+        doClick("modalOptions");
+      }
+      else {
+        this.$router.push(
+          "/analyse/" + this.gameInfo.vname +
+          "/?fen=" + V.GenRandInitFen(options)
+        );
+      }
     }
   }
 };