X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=public%2Fjavascripts%2Fcomponents%2Fproblems.js;fp=public%2Fjavascripts%2Fcomponents%2Fproblems.js;h=6edab93d9b5264d9e66e51fc4f9852272dcc5e8b;hb=badeb466c977ed9a8e1b464a2236001126decb9e;hp=6f03fd973bae4330c0eba1dceada95e00dee5669;hpb=60d9063fdfcd4b7628fbc0e0fc594f083bda8761;p=vchess.git diff --git a/public/javascripts/components/problems.js b/public/javascripts/components/problems.js index 6f03fd97..6edab93d 100644 --- a/public/javascripts/components/problems.js +++ b/public/javascripts/components/problems.js @@ -14,6 +14,7 @@ Vue.component('my-problems', { // New problem (to upload), or existing problem to edit: modalProb: { id: 0, //defined if it's an edit + uid: 0, //...also fen: "", instructions: "", solution: "", @@ -24,48 +25,51 @@ Vue.component('my-problems', { template: `
- - -
-

- {{ curProb.instructions }} -

+

{{ curProb.instructions }}

- +

{{ translations["Show solution"] }}

-

- {{ curProb.solution }} -

+

{{ curProb.solution }}

- +
- +
- @@ -73,9 +77,7 @@ Vue.component('my-problems', {
-

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

+

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

@@ -83,39 +85,28 @@ Vue.component('my-problems', { :placeholder='translate("Full FEN description")'/>
-

- {{ translate("Safe HTML tags allowed") }} -

- +

{{ translate("Safe HTML tags allowed") }}

+ - + - +
-
@@ -123,9 +114,7 @@ Vue.component('my-problems', {
-

- {{ nomoreMessage }} -

+

{{ nomoreMessage }}

@@ -160,11 +149,17 @@ Vue.component('my-problems', { }, showProblem: function(num) { const pid = num || this.pbNum; - location.hash = "#" + pid; - const pIdx = this.singletons.findIndex(p => p.id == pid); - if (pIdx >= 0) - curProb = this.singletons[pIdx]; - else + location.hash = "#problems?id=" + pid; + for (let parray of [this.singletons,this.problems,this.myProblems]) + { + const pIdx = parray.findIndex(p => p.id == pid); + if (pIdx >= 0) + { + curProb = parray[pIdx]; + break; + } + } + if (!curProb) { // Cannot find problem in current set; get from server, and add to singletons. ajax( @@ -240,27 +235,30 @@ Vue.component('my-problems', { }, displayList: function() { this.curProb = null; - location.hash = ""; + location.hash = "#problems"; // Fetch problems if first call (if #num, and then lists) if (!this.listsInitialized) this.firstFetch(); }, toggleListDisplay: function() { - this.display = (this.display == "others" ? "mine" : "others"); + const displays = ["mine","others"]; + const curIndex = displays.findIndex(item => item == this.display); + this.display = displays[1-curIndex]; }, fetchProblems: function(type, direction) { let problems = (type == "others" ? this.problems : this.myProblems); + // "last datetime" set at a value OK for an empty initial array let last_dt = (direction=="forward" ? 0 : Number.MAX_SAFE_INTEGER); - if (this.problems.length > 0) + if (problems.length > 0) { // Search for newest date (or oldest) last_dt = problems[0].added; for (let i=1; i last_dt) || - (direction == "backward" && this.problems[i].added < last_dt)) + if ((direction == "forward" && problems[i].added > last_dt) || + (direction == "backward" && problems[i].added < last_dt)) { - last_dt = this.problems[i].added; + last_dt = problems[i].added; } } } @@ -276,7 +274,7 @@ Vue.component('my-problems', { if (response.problems.length > 0) { Array.prototype.push.apply(problems, - response.problems.sort((p1,p2) => { return p1.added - p2.added; })); + response.problems.sort((p1,p2) => { return p2.added - p1.added; })); // If one list is empty but not the other, show the non-empty const otherArray = (type == "mine" ? this.problems : this.myProblems); if (problems.length > 0 && otherArray.length == 0) @@ -286,21 +284,22 @@ Vue.component('my-problems', { ); }, previewProblem: function() { - if (!V.IsGoodFen(this.newProblem.fen)) + if (!V.IsGoodFen(this.modalProb.fen)) return alert(translations["Bad FEN description"]); - if (this.newProblem.instructions.trim().length == 0) + if (this.modalProb.instructions.trim().length == 0) return alert(translations["Empty instructions"]); - if (this.newProblem.solution.trim().length == 0) + if (this.modalProb.solution.trim().length == 0) return alert(translations["Empty solution"]); - this.modalProb.preview = true; + Vue.set(this.modalProb, "preview", true); }, editProblem: function(prob) { this.modalProb = prob; + Vue.set(this.modalProb, "preview", false); document.getElementById("modal-newproblem").checked = true; }, deleteProblem: function(pid) { ajax( - "/problems/" + variant.id + "/" + pid, + "/problems/" + pid, "DELETE", response => { // Delete problem from the list on client side @@ -318,11 +317,17 @@ Vue.component('my-problems', { this.modalProb, response => { document.getElementById("modal-newproblem").checked = false; + Vue.set(this.modalProb, "preview", false); if (this.modalProb.id == 0) { - this.modalProb.added = Date.now(); - this.modalProb.preview = false; - this.myProblems.push(JSON.parse(JSON.stringify(this.modalProb))); + this.myProblems.unshift({ + added: Date.now(), + id: response.id, + uid: user.id, + fen: this.modalProb.fen, + instructions: this.modalProb.instructions, + solution: this.modalProb.solution, + }); } else this.modalProb.id = 0;