Skip to content

Commit

Permalink
Merge pull request #186 from chesslablab/issue/181-Refactor-the-topOp…
Browse files Browse the repository at this point in the history
…eningsModal-component-into-an-ES6-module

Implemented TopOpeningsModal
  • Loading branch information
programarivm authored Apr 7, 2024
2 parents 930f9d7 + 844cbed commit b79c418
Show file tree
Hide file tree
Showing 3 changed files with 133 additions and 121 deletions.
129 changes: 129 additions & 0 deletions assets/js/pages/database/top_openings/TopOpeningsModal.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
import Modal from 'bootstrap/js/dist/modal.js';
import { Chart, registerables } from 'https://cdn.jsdelivr.net/npm/[email protected]/+esm';
import movesMetadataTable from '../../movesMetadataTable.js';
import { progressModal } from '../../ProgressModal.js';
import AbstractComponent from '../../../AbstractComponent.js';
import { sanWebSocket } from '../../../SanWebSocket.js';
import * as env from '../../../../env.js';
import * as mode from '../../../../mode.js';

Chart.register(...registerables);

export class TopOpeningsModal extends AbstractComponent {
_nBars = 25;

mount() {
const handleBarClick = (event, clickedElements) => {
this.props.progressModal.props.modal.show();
if (clickedElements.length === 0) {
return;
}
const { dataIndex, raw } = clickedElements[0].element.$context;
fetch(`${env.API_SCHEME}://${env.API_HOST}:${env.API_PORT}/${env.API_VERSION}/search`, {
method: 'POST',
headers: {
'X-Api-Key': `${env.API_KEY}`
},
body: JSON.stringify({
Result: event.chart.data.datasets[0].label,
ECO: event.chart.data.labels[dataIndex]
})
})
.then(res => res.json())
.then(res => {
this.props.movesMetadataTable.props = res[0];
this.props.movesMetadataTable.mount();
const add = {
movetext: res[0].movetext
};
sanWebSocket.send(`/start classical ${mode.SAN} "${JSON.stringify(add).replace(/"/g, '\\"')}"`);
})
.catch(error => {
// TODO
})
.finally(() => {
this.props.modal.hide();
this.props.progressModal.props.modal.hide();
});
}

const options = {
animation: false,
categoryPercentage: 1.0,
barPercentage: 1.0,
onHover: function(event, el) {
event.native.target.style.cursor = el[0] ? 'pointer' : 'default';
},
onClick: handleBarClick,
scales: {
x: {
grid: {
display: false
}
},
y: {
beginAtZero: true,
grid: {
display: false
}
}
}
}

if (this.props.stats?.winRateForWhite) {
new Chart(document.getElementById('winRateForWhiteChart'), {
type: 'bar',
data: {
labels: this.props.stats.winRateForWhite.map(value => value.ECO).slice(0, this._nBars),
datasets: [{
label: '1-0',
data: this.props.stats.winRateForWhite.map(value => value.total).slice(0, this._nBars),
backgroundColor: '#c0c0c0'
}]
},
options: options
});
}

if (this.props.stats?.drawRate) {
new Chart(document.getElementById('drawRateChart'), {
type: 'bar',
data: {
labels: this.props.stats.drawRate.map(value => value.ECO).slice(0, this._nBars),
datasets: [{
label: '1/2-1/2',
data: this.props.stats.drawRate.map(value => value.total).slice(0, this._nBars),
backgroundColor: '#888888'
}]
},
options: options
});
}

if (this.props.stats?.winRateForBlack) {
new Chart(document.getElementById('winRateForBlackChart'), {
type: 'bar',
data: {
labels: this.props.stats.winRateForBlack.map(value => value.ECO).slice(0, this._nBars),
datasets: [{
label: '0-1',
data: this.props.stats.winRateForBlack.map(value => value.total).slice(0, this._nBars),
backgroundColor: '#404040'
}]
},
options: options
});
}
}
}

export const topOpeningsModal = new TopOpeningsModal(
document.getElementById('topOpeningsModal'),
{
modal: new Modal(document.getElementById('topOpeningsModal')),
form: document.querySelector('#topOpeningsModal form'),
movesMetadataTable: movesMetadataTable,
progressModal: progressModal,
stats: {}
}
);
7 changes: 4 additions & 3 deletions assets/js/pages/database/top_openings/index.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import topOpeningsModal from './topOpeningsModal.js';
import { topOpeningsModal } from './TopOpeningsModal.js';
import boardActionsDropdown from '../../boardActionsDropdown.js';
import { gameStudyDropdown } from '../../GameStudyDropdown.js';
import historyButtons from '../../historyButtons.js';
Expand All @@ -20,8 +20,9 @@ await fetch(`${env.API_SCHEME}://${env.API_HOST}:${env.API_PORT}/${env.API_VERSI
})
.then(res => res.json())
.then(res => {
topOpeningsModal.mount(res);
topOpeningsModal.modal.show();
topOpeningsModal.props.stats = res;
topOpeningsModal.mount();
topOpeningsModal.props.modal.show();
})
.catch(error => {
// TODO
Expand Down
118 changes: 0 additions & 118 deletions assets/js/pages/database/top_openings/topOpeningsModal.js

This file was deleted.

0 comments on commit b79c418

Please sign in to comment.