X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=public%2Fjavascripts%2Fcomponents%2Fproblems.js;h=60aa9c430833caa145aa522d7060a9e6e3a9d91b;hb=a9f262f38d7ae9ea4c935c549309bd2f773aa6c2;hp=b67203a35cc1952a5e14d15020dad103204630f8;hpb=a5d5668613d9a3d04c9a4f8b69122d02b7322137;p=vchess.git
diff --git a/public/javascripts/components/problems.js b/public/javascripts/components/problems.js
index b67203a3..60aa9c43 100644
--- a/public/javascripts/components/problems.js
+++ b/public/javascripts/components/problems.js
@@ -1,65 +1,135 @@
Vue.component('my-problems', {
data: function () {
return {
- problems: problemArray, //initial value
+ problems: [], //oldest first
+ myProblems: [], //same
+ curProblems: [], //assigned to either of the ones above
+ curIdx: 0, //index in (current) problems array
newProblem: {
fen: "",
instructions: "",
solution: "",
- stage: "nothing", //or "preview" after new problem is filled
+ preview: false,
},
};
},
template: `
-
-
OK, mais ces flèches n'ont pas la même action selon les vues
+ --> fetchN si liste, problème suivant/précédent sinon
+
+
+board qui bouge et activé que si #hash donnant numéro du problème
+deux listes : tous les problèmes sauf les miens
+ + les miens
+
+
+//TODO: filter "my problems" ==> liste séparée (lors de la requête serveur)
+--> bouton plutôt sous l'échiquier après soluce (sauf si anonymous)
+--> puis dans la vue "my problems (listing échiquier gauche / instrus + soluce cachée à droite
+if (this.mode == "problem")
+ {
+ // Show problem instructions
+ elementArray.push(
+ h('div',
+ {
+ attrs: { id: "instructions-div" },
+ "class": {
+ "clearer": true,
+ "section-content": true,
+ },
+ },
+ [
+ h('p',
+ {
+ attrs: { id: "problem-instructions" },
+ domProps: { innerHTML: this.problem.instructions }
+ }
+ )
+ ]
+ )
+ );
+ }
+
+
+ // TODO ici :: instrus + diag interactif + solution
+ my-board + pilotage via movesList + VariantRules !
+
+
+ if (this.mode == "problem")
+ {
+ // Show problem solution (on click)
+ elementArray.push(
+ h('div',
+ {
+ attrs: { id: "solution-div" },
+ "class": { "section-content": true },
+ },
+ [
+ h('h3',
+ {
+ "class": { clickable: true },
+ domProps: { innerHTML: translations["Show solution"] },
+ on: { click: this.toggleShowSolution },
+ }
+ ),
+ h('p',
+ {
+ attrs: { id: "problem-solution" },
+ domProps: { innerHTML: this.problem.solution }
+ }
+ )
+ ]
+ )
+ );
+ }
+
-
+
-
+
-
-
+
- Cancel
- Send
+ {{ translate("Cancel") }}
+ {{ translate("Send") }}
@@ -68,14 +138,43 @@ Vue.component('my-problems', {
computed: {
sortedProblems: function() {
// Newest problem first
- return this.problems.sort((p1,p2) => { return p2.added - p1.added; });
},
},
+ created: function() {
+ // Analyse URL: if a single problem required, show it. Otherwise,
+ // TODO: fetch most recent problems from server
+ // If the requested problem is in the list, just show it
+ this.tryNavigate();
+ },
methods: {
- // Propagate "show problem" event to parent component (my-variant)
- bubbleUp: function(problem) {
- this.$emit('show-problem', JSON.stringify(problem));
+ translate: function(text) {
+ return translations[text];
},
+ // TODO: obsolete:
+// // Propagate "show problem" event to parent component (my-variant)
+// bubbleUp: function(problem) {
+// this.$emit('show-problem', JSON.stringify(problem));
+// },
+ toggleShowSolution: function() {
+ let problemSolution = document.getElementById("problem-solution");
+ problemSolution.style.display =
+ !problemSolution.style.display || problemSolution.style.display == "none"
+ ? "block"
+ : "none";
+ },
+ showPreviousProblem: function() {
+ if (this.curIdx == 0)
+ this.fetchProblems("backward");
+ else
+ this.curIdx--;
+ },
+ showNextProblem: function() {
+ if (this.curIdx == this.problems.length - 1)
+ this.fetchProblems("forward");
+ else
+ this.curIdx++;
+ },
+ // TODO: modal "no more problems"
fetchProblems: function(direction) {
if (this.problems.length == 0)
return; //what could we do?!
@@ -89,12 +188,16 @@ Vue.component('my-problems', {
last_dt = this.problems[i].added;
}
}
- ajax("/problems/" + variant, "GET", {
+ ajax("/problems/" + variant.name, "GET", { //TODO: use variant._id ?
direction: direction,
last_dt: last_dt,
}, response => {
if (response.problems.length > 0)
- this.problems = response.problems;
+ {
+ this.problems = response.problems
+ .sort((p1,p2) => { return p1.added - p2.added; });
+ this.curIdx = response.problems.length - 1;
+ }
});
},
showNewproblemModal: function() {
@@ -102,16 +205,16 @@ Vue.component('my-problems', {
},
previewNewProblem: function() {
if (!V.IsGoodFen(this.newProblem.fen))
- return alert("Bad FEN string");
- if (this.newProblem.instructions.length == 0)
- return alert("Empty instructions");
- if (this.newProblem.solution.length == 0)
- return alert("Empty solution");
+ return alert(translations["Bad FEN description"]);
+ if (this.newProblem.instructions.trim().length == 0)
+ return alert(translations["Empty instructions"]);
+ if (this.newProblem.solution.trim().length == 0)
+ return alert(translations["Empty solution"]);
this.newProblem.stage = "preview";
},
sendNewProblem: function() {
// Send it to the server and close modal
- ajax("/problems/" + variant, "POST", {
+ ajax("/problems/" + variant.name, "POST", { //TODO: with variant._id ?
fen: this.newProblem.fen,
instructions: this.newProblem.instructions,
solution: this.newProblem.solution,
@@ -124,3 +227,6 @@ Vue.component('my-problems', {
},
},
})
+
+// TODO:
+// possibilité de supprimer / éditer si peer ID reconnu comme celui du probleme (champ "uploader")