main
input#modalNewprob.modal(
type="checkbox"
- @change="infoMsg=''"
+ @change="fenFocusIfOpened($event)"
)
div#newprobDiv(
role="dialog"
data-checkbox="modalNewprob"
)
- .card(@keyup.enter="sendProblem()")
+ .card
label#closeNewprob.modal-close(for="modalNewprob")
fieldset
label(for="selectVariant") {{ st.tr["Variant"] }}
button(@click="sendProblem()") {{ st.tr["Send"] }}
#dialog.text-center {{ st.tr[infoMsg] }}
.row(v-if="showOne")
- .col-sm-12.col-md-10.col-md-offset-2
+ .col-sm-12.col-md-10.col-md-offset-1.col-lg-8.col-lg-offset-2
#topPage
+ .button-group(v-if="st.user.id == curproblem.uid")
+ button(@click="editProblem(curproblem)") {{ st.tr["Edit"] }}
+ button(@click="deleteProblem(curproblem)") {{ st.tr["Delete"] }}
span.vname {{ curproblem.vname }}
span.uname ({{ curproblem.uname }})
button.marginleft(@click="backToList()") {{ st.tr["Back to list"] }}
- button.nomargin(
- v-if="st.user.id == curproblem.uid"
- @click="editProblem(curproblem)"
- )
- | {{ st.tr["Edit"] }}
- button.nomargin(
- v-if="st.user.id == curproblem.uid"
- @click="deleteProblem(curproblem)"
- )
- | {{ st.tr["Delete"] }}
- p.clickable(
+ button.nomargin(@click="gotoPrevNext($event,curproblem,1)")
+ | {{ st.tr["Previous"] }}
+ button.nomargin(@click="gotoPrevNext($event,curproblem,-1)")
+ | {{ st.tr["Next_p"] }}
+ p.oneInstructions.clickable(
v-html="parseHtml(curproblem.instruction)"
@click="curproblem.showSolution=!curproblem.showSolution"
)
.row(v-else)
.col-sm-12.col-md-10.col-md-offset-1.col-lg-8.col-lg-offset-2
#controls
- button#newProblem(onClick="window.doClick('modalNewprob')")
+ button#newProblem(@click="prepareNewProblem()")
| {{ st.tr["New problem"] }}
label(for="checkboxMine") {{ st.tr["My problems"] }}
input#checkboxMine(
:value="v.id"
)
| {{ v.name }}
- table
+ table#tProblems
tr
th {{ st.tr["Variant"] }}
th {{ st.tr["Instructions"] }}
td {{ firstChars(p.instruction) }}
td {{ p.id }}
BaseGame(
+ ref="basegame"
v-if="showOne"
:game="game"
- :vr="vr"
)
</template>
onlyMines: false,
showOne: false,
infoMsg: "",
- vr: null, //"variant rules" object initialized from FEN
game: {
players: [{ name: "Problem" }, { name: "Problem" }],
mode: "analyze"
};
},
created: function() {
- ajax("/problems", "GET", res => {
- // Show newest problem first:
- this.problems = res.problems.sort((p1, p2) => p2.added - p1.added);
- if (this.st.variants.length > 0)
- this.problems.forEach(p => this.setVname(p));
- // Retrieve all problems' authors' names
- let names = {};
- this.problems.forEach(p => {
- if (p.uid != this.st.user.id) names[p.uid] = "";
- //unknwon for now
- else p.uname = this.st.user.name;
- });
- const showOneIfPid = () => {
- const pid = this.$route.query["id"];
- if (pid) this.showProblem(this.problems.find(p => p.id == pid));
- };
- if (Object.keys(names).length > 0) {
- ajax("/users", "GET", { ids: Object.keys(names).join(",") }, res2 => {
- res2.users.forEach(u => {
- names[u.id] = u.name;
+ ajax(
+ "/problems",
+ "GET",
+ {
+ success: (res) => {
+ // Show newest problem first:
+ this.problems = res.problems.sort((p1, p2) => p2.added - p1.added);
+ if (this.st.variants.length > 0)
+ this.problems.forEach(p => this.setVname(p));
+ // Retrieve all problems' authors' names
+ let names = {};
+ this.problems.forEach(p => {
+ if (p.uid != this.st.user.id) names[p.uid] = "";
+ else p.uname = this.st.user.name;
});
- this.problems.forEach(p => (p.uname = names[p.uid]));
- showOneIfPid();
- });
- } else showOneIfPid();
- });
+ const showOneIfPid = () => {
+ const pid = this.$route.query["id"];
+ if (!!pid) this.showProblem(this.problems.find(p => p.id == pid));
+ };
+ if (Object.keys(names).length > 0) {
+ ajax(
+ "/users",
+ "GET",
+ {
+ data: { ids: Object.keys(names).join(",") },
+ success: (res2) => {
+ res2.users.forEach(u => {
+ names[u.id] = u.name;
+ });
+ this.problems.forEach(p => {
+ if (!p.uname)
+ p.uname = names[p.uid];
+ });
+ showOneIfPid();
+ }
+ }
+ );
+ } else showOneIfPid();
+ }
+ }
+ );
},
mounted: function() {
- document
- .getElementById("newprobDiv")
+ document.getElementById("newprobDiv")
.addEventListener("click", processModalClick);
},
watch: {
},
$route: function(to) {
const pid = to.query["id"];
- if (pid) this.showProblem(this.problems.find(p => p.id == pid));
+ if (!!pid) this.showProblem(this.problems.find(p => p.id == pid));
else this.showOne = false;
}
},
methods: {
+ fenFocusIfOpened: function(event) {
+ if (event.target.checked) {
+ this.infoMsg = "";
+ document.getElementById("inputFen").focus();
+ }
+ },
setVname: function(prob) {
prob.vname = this.st.variants.find(v => v.id == prob.vid).name;
},
},
displayProblem: function(p) {
return (
- (this.selectedVar == 0 || p.vid == this.selectedVar) &&
+ (!this.selectedVar || p.vid == this.selectedVar) &&
((this.onlyMines && p.uid == this.st.user.id) ||
(!this.onlyMines && p.uid != this.st.user.id))
);
showProblem: function(p) {
this.loadVariant(p.vid, () => {
// The FEN is already checked at this stage:
- this.vr = new V(p.fen);
this.game.vname = p.vname;
- this.game.mycolor = this.vr.turn; //diagram orientation
+ this.game.mycolor = V.ParseFen(p.fen).turn; //diagram orientation
+ this.game.fenStart = p.fen;
this.game.fen = p.fen;
- this.$set(this.game, "fenStart", p.fen);
- this.copyProblem(p, this.curproblem);
this.showOne = true;
+ // $nextTick to be sure $refs["basegame"] exists
+ this.$nextTick(() => {
+ this.$refs["basegame"].re_setVariables(this.game); });
+ this.copyProblem(p, this.curproblem);
});
},
+ gotoPrevNext: function(e, prob, dir) {
+ const startIdx = this.problems.findIndex(p => p.id == prob.id);
+ let nextIdx = startIdx + dir;
+ while (
+ nextIdx >= 0 &&
+ nextIdx < this.problems.length &&
+ ((this.onlyMines && this.problems[nextIdx].uid != this.st.user.id) ||
+ (!this.onlyMines && this.problems[nextIdx].uid == this.st.user.id))
+ )
+ nextIdx += dir;
+ if (nextIdx >= 0 && nextIdx < this.problems.length)
+ this.setHrefPid(this.problems[nextIdx]);
+ else
+ alert(this.st.tr["No more problems"]);
+ },
+ prepareNewProblem: function() {
+ this.resetCurProb();
+ window.doClick("modalNewprob");
+ },
sendProblem: function() {
const error = checkProblem(this.curproblem);
if (error) {
- alert(error);
+ alert(this.st.tr[error]);
return;
}
const edit = this.curproblem.id > 0;
ajax(
"/problems",
edit ? "PUT" : "POST",
- { prob: this.curproblem },
- ret => {
- if (edit) {
- let editedP = this.problems.find(p => p.id == this.curproblem.id);
- this.copyProblem(this.curproblem, editedP);
- } //new problem
- else {
- let newProblem = Object.assign({}, this.curproblem);
- newProblem.id = ret.id;
- newProblem.uid = this.st.user.id;
- newProblem.uname = this.st.user.name;
- this.problems = this.problems.concat(newProblem);
+ {
+ data: { prob: this.curproblem },
+ success: (ret) => {
+ if (edit) {
+ let editedP = this.problems.find(p => p.id == this.curproblem.id);
+ this.copyProblem(this.curproblem, editedP);
+ this.showProblem(editedP);
+ }
+ else {
+ let newProblem = Object.assign({}, this.curproblem);
+ newProblem.id = ret.id;
+ newProblem.uid = this.st.user.id;
+ newProblem.uname = this.st.user.name;
+ this.problems = [newProblem].concat(this.problems);
+ }
+ document.getElementById("modalNewprob").checked = false;
+ this.infoMsg = "";
}
- this.resetCurProb();
- this.infoMsg = "";
}
);
},
editProblem: function(prob) {
- if (!prob.diag) this.setDiagram(prob); //V is loaded at this stage
+ // prob.diag might correspond to some other problem or be empty:
+ this.setDiagram(prob); //V is loaded at this stage
this.copyProblem(prob, this.curproblem);
window.doClick("modalNewprob");
},
deleteProblem: function(prob) {
if (confirm(this.st.tr["Are you sure?"])) {
- ajax("/problems", "DELETE", { id: prob.id }, () => {
- ArrayFun.remove(this.problems, p => p.id == prob.id);
- this.backToList();
- });
+ ajax(
+ "/problems",
+ "DELETE",
+ {
+ data: { id: prob.id },
+ success: () => {
+ ArrayFun.remove(this.problems, p => p.id == prob.id);
+ this.backToList();
+ }
+ }
+ );
}
}
}
margin: 0 auto
max-width: 400px
+table#tProblems
+ max-height: 100%
+
#controls
margin: 0
width: 100%
& > *
margin: 0
+p.oneInstructions
+ margin: 0
+ padding: 2px 5px
+ background-color: lightgreen
+
#topPage
span.vname
font-weight: bold