X-Git-Url: https://git.auder.net/?p=vchess.git;a=blobdiff_plain;f=public%2Fjavascripts%2Fcomponents%2Fproblems.js;h=4caabb554487bbb699ec254b1643337437b121df;hp=594d6e648b0832e664ab01324e78ace994be1d9a;hb=b6487fb9c41705187cf97215fc9e8f86a59057c7;hpb=da06a6eb0237123ce43fdb01cb06246b8b57f5e5 diff --git a/public/javascripts/components/problems.js b/public/javascripts/components/problems.js index 594d6e64..4caabb55 100644 --- a/public/javascripts/components/problems.js +++ b/public/javascripts/components/problems.js @@ -1,81 +1,134 @@ Vue.component('my-problems', { data: function () { return { - problems: problemArray //initial value + problems: problemArray, //initial value + newProblem: { + fen: "", + instructions: "", + solution: "", + stage: "nothing", //or "preview" after new problem is filled + }, }; }, template: ` -
- - - - +
+ + + +
+
-
+
-

Add problem

-
+

{{ translate("Add a problem") }}

+
- - + +
-

- Allowed HTML tags: - <p>,<br>,<,ul>,<ol>,<li> -

- - + + +
-

- Note: if you made a mistake, please let me know at - contact@vchess.club -

+
+ + + +
+ + +
+
`, computed: { sortedProblems: function() { // Newest problem first - return problems.sort((p1,p2) => { return p2.added - p1.added; }); - }, - mailErrProblem: function() { - return "mailto:contact@vchess.club?subject=[" + variant + " problems] error"; + return this.problems.sort((p1,p2) => { return p2.added - p1.added; }); }, }, methods: { - fetchProblems: function(direction) { - // TODO: ajax call return list of max 10 problems - // Do not do anything if no older problems (and store this result in cache!) - // TODO: ajax call return list of max 10 problems - // Do not do anything if no newer problems + translate: function(text) { + return translations[text]; + }, + // Propagate "show problem" event to parent component (my-variant) + bubbleUp: function(problem) { + this.$emit('show-problem', JSON.stringify(problem)); }, - showProblem: function(prob) { - //TODO: send event with object prob.fen, prob.instructions, prob.solution - //Event should propagate to game, which set mode=="problem" + other variables - //click on a problem ==> land on variant page with mode==friend, FEN prefilled... ok - // click on problem ==> masque problems, affiche game tab, launch new game Friend with - // FEN + turn + flags + rappel instructions / solution on click sous l'échiquier + fetchProblems: function(direction) { + if (this.problems.length == 0) + return; //what could we do?! + // Search for newest date (or oldest) + let last_dt = this.problems[0].added; + for (let i=0; i last_dt) || + (direction == "backward" && this.problems[i].added < last_dt)) + { + last_dt = this.problems[i].added; + } + } + ajax("/problems/" + variant, "GET", { + direction: direction, + last_dt: last_dt, + }, response => { + if (response.problems.length > 0) + this.problems = response.problems; + }); }, showNewproblemModal: function() { document.getElementById("modal-newproblem").checked = true; }, - postNewProblem: function() { - const fen = document.getElementById("newpbFen").value; - const instructions = document.getElementById("newpbInstructions").value; - const solution = document.getElementById("newpbSolution").value; - + previewNewProblem: function() { + if (!V.IsGoodFen(this.newProblem.fen)) + 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", { + fen: this.newProblem.fen, + instructions: this.newProblem.instructions, + solution: this.newProblem.solution, + }, response => { + this.newProblem.added = Date.now(); + this.problems.push(JSON.parse(JSON.stringify(this.newProblem))); + document.getElementById("modal-newproblem").checked = false; + this.newProblem.stage = "nothing"; + }); }, }, }) + +// TODO: +// possibilité de supprimer / éditer si peer ID reconnu comme celui du probleme (champ "uploader") +// --> côté serveur on vérifie un certain "secret" +// --> filtre possible "mes problèmes"