td {{ p.vname }}
td {{ firstChars(p.instruction) }}
td {{ p.id }}
+ button#loadMoreBtn(
+ v-if="hasMore"
+ @click="loadMore()"
+ )
+ | {{ st.tr["Load more"] }}
BaseGame(
+ ref="basegame"
v-if="showOne"
:game="game"
)
loadedVar: 0, //corresponding to loaded V
selectedVar: 0, //to filter problems based on variant
problems: [],
+ // timestamp of oldest showed problem:
+ cursor: Number.MAX_SAFE_INTEGER,
+ // hasMore == TRUE: a priori there could be more problems to load
+ hasMore: true,
onlyMines: false,
showOne: false,
infoMsg: "",
"/problems",
"GET",
{
+ data: { cursor: this.cursor },
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;
- });
+ // The returned list is sorted from most recent to oldest
+ this.problems = res.problems;
+ const L = res.problems.length;
+ if (L > 0) this.cursor = res.problems[L - 1].added;
+ else this.hasMore = false;
const showOneIfPid = () => {
const pid = this.$route.query["id"];
- if (pid) this.showProblem(this.problems.find(p => p.id == pid));
+ 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();
+ this.decorate(this.problems, showOneIfPid);
}
}
);
},
$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;
}
},
setVname: function(prob) {
prob.vname = this.st.variants.find(v => v.id == prob.vid).name;
},
+ // Add vname and user names:
+ decorate: function(problems, callback) {
+ if (this.st.variants.length > 0)
+ problems.forEach(p => this.setVname(p));
+ // Retrieve all problems' authors' names
+ let names = {};
+ problems.forEach(p => {
+ if (p.uid != this.st.user.id) names[p.uid] = "";
+ else p.uname = this.st.user.name;
+ });
+ 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;
+ });
+ problems.forEach(p => {
+ if (!p.uname)
+ p.uname = names[p.uid];
+ });
+ if (!!callback) callback();
+ }
+ }
+ );
+ } else if (!!callback) callback();
+ },
firstChars: function(text) {
let preparedText = text
// Replace line jumps and <br> by spaces
// The FEN is already checked at this stage:
this.game.vname = p.vname;
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) {
}
);
}
+ },
+ loadMore: function() {
+ ajax(
+ "/problems",
+ "GET",
+ {
+ data: { cursor: this.cursor },
+ success: (res) => {
+ const L = res.problems.length;
+ if (L > 0) {
+ this.decorate(res.problems);
+ this.problems = this.problems.concat(res.problems);
+ this.cursor = res.problems[L - 1].added;
+ } else this.hasMore = false;
+ }
+ }
+ );
}
}
};
table#tProblems
max-height: 100%
+button#loadMoreBtn
+ display: block
+ margin: 0 auto
+
#controls
margin: 0
width: 100%