X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fcomponents%2FMoveList.vue;h=6df5a70a1f1f002f28774d3def997582c109d31e;hb=933fd1f90a080c1a3e477cc36adebb5e8db8a9d3;hp=aa12969aa1c968311d1c2223632dd01bffa569f4;hpb=910d631b73cad5ffef1b4461157b704e7e7057d8;p=vchess.git diff --git a/client/src/components/MoveList.vue b/client/src/components/MoveList.vue index aa12969a..6df5a70a 100644 --- a/client/src/components/MoveList.vue +++ b/client/src/components/MoveList.vue @@ -2,85 +2,9 @@ import { store } from "@/store"; export default { name: "my-move-list", - props: ["moves", "cursor", "score", "message", "firstNum"], - watch: { - cursor: function(newCursor) { - if (window.innerWidth <= 767) return; //scrolling would hide chessboard - // Count grouped moves until the cursor (if multi-moves): - let groupsCount = -1; - let curCol = undefined; - for (let i = 0; i < newCursor; i++) { - const m = this.moves[i]; - if (m.color != curCol) { - groupsCount++; - curCol = m.color; - } - } - // $nextTick to wait for table > tr to be rendered - this.$nextTick(() => { - let rows = document.querySelectorAll("#movesList tr"); - if (rows.length > 0) { - rows[Math.floor(Math.max(groupsCount, 0) / 2)].scrollIntoView({ - behavior: "auto", - block: "nearest" - }); - } - }); - } - }, + props: ["moves", "show", "cursor", "score", "message", "firstNum"], + // TODO: if show == "byrows", show only full rows. render(h) { - if (this.moves.length == 0) return h("div"); - let tableContent = []; - let moveCounter = 0; - let tableRow = undefined; - let moveCells = undefined; - let curCellContent = ""; - let firstIndex = 0; - for (let i = 0; i < this.moves.length; i++) { - if (this.moves[i].color == "w") { - if (i == 0 || (i > 0 && this.moves[i - 1].color == "b")) { - if (tableRow) { - tableRow.children = moveCells; - tableContent.push(tableRow); - } - moveCells = [ - h("td", { domProps: { innerHTML: ++moveCounter + "." } }) - ]; - tableRow = h("tr", {}); - curCellContent = ""; - firstIndex = i; - } - } - // Next condition is fine because even if the first move is black, - // there will be the "..." which count as white move. - else if (this.moves[i].color == "b" && this.moves[i - 1].color == "w") - firstIndex = i; - curCellContent += this.moves[i].notation; - if ( - i < this.moves.length - 1 && - this.moves[i + 1].color == this.moves[i].color - ) - curCellContent += ","; - //color change - else { - moveCells.push( - h("td", { - domProps: { innerHTML: curCellContent }, - on: { click: () => this.gotoMove(i) }, - class: { - "highlight-lm": this.cursor >= firstIndex && this.cursor <= i - } - }) - ); - curCellContent = ""; - } - } - // Complete last row, which might not be full: - if (moveCells.length - 1 == 1) { - moveCells.push(h("td", { domProps: { innerHTML: "" } })); - } - tableRow.children = moveCells; - tableContent.push(tableRow); let rootElements = []; if (!!this.score && this.score != "*") { const scoreDiv = h( @@ -95,19 +19,97 @@ export default { ); rootElements.push(scoreDiv); } - rootElements.push( - h( - "table", - { - class: { - "moves-list": true + if (this.moves.length > 0) { + let tableContent = []; + let moveCounter = 0; + let tableRow = undefined; + let moveCells = undefined; + let curCellContent = ""; + let firstIndex = 0; + for (let i = 0; i < this.moves.length; i++) { + if (this.moves[i].color == "w") { + if (i == 0 || (i > 0 && this.moves[i - 1].color == "b")) { + if (tableRow) { + tableRow.children = moveCells; + tableContent.push(tableRow); + } + moveCells = [ + h( + "div", + { + "class": {td: true}, + domProps: { innerHTML: ++moveCounter + "." } + } + ) + ]; + tableRow = h("div", {"class": {tr: true}}); + curCellContent = ""; + firstIndex = i; } - }, - tableContent - ) - ); + } + // Next condition is fine because even if the first move is black, + // there will be the "..." which count as white move. + else if (this.moves[i].color == "b" && this.moves[i - 1].color == "w") + firstIndex = i; + curCellContent += this.moves[i].notation; + if ( + i < this.moves.length - 1 && + this.moves[i + 1].color == this.moves[i].color + ) + curCellContent += ","; + else { + // Color change + moveCells.push( + h( + "div", + { + "class": { + td: true, + "highlight-lm": this.cursor >= firstIndex && this.cursor <= i + }, + domProps: { innerHTML: curCellContent }, + on: { click: () => this.gotoMove(i) } + } + ) + ); + curCellContent = ""; + } + } + // Complete last row, which might not be full: + if (moveCells.length - 1 == 1) { + moveCells.push(h("div", {"class": {td: true}})); + } + tableRow.children = moveCells; + tableContent.push(tableRow); + rootElements.push( + h( + "div", + { + class: { + "moves-list": true + } + }, + tableContent + ) + ); + } return h("div", {}, rootElements); }, + watch: { + cursor: function(newCursor) { + if (window.innerWidth <= 767) return; //scrolling would hide chessboard + // $nextTick to wait for table > tr to be rendered + this.$nextTick(() => { + let curMove = document.querySelector(".td.highlight-lm"); + if (curMove) { + curMove.scrollIntoView({ + behavior: "auto", + block: "nearest" + }); + } + }); + } + }, methods: { gotoMove: function(index) { this.$emit("goto-move", index); @@ -118,67 +120,28 @@ export default { - -