|
class Grid2 {
|
|
|
|
columns = []
|
|
data = []
|
|
|
|
constructor(data){
|
|
this.data = data
|
|
if(this.data.length){
|
|
this.columns = Object.keys(this.data[0]);
|
|
}
|
|
this.columns = ['puzzle'];
|
|
}
|
|
createRow(record){
|
|
const el = document.createElement('div');
|
|
el.classList.add('row');
|
|
this.columns.forEach((column)=>{
|
|
const col = document.createElement('pre');
|
|
col.classList.add('col');
|
|
col.textContent = record[column];
|
|
el.appendChild(col);
|
|
})
|
|
return el;
|
|
}
|
|
render(el){
|
|
this.data.forEach((record)=>{
|
|
const row = this.createRow(record);
|
|
el.appendChild(row);
|
|
})
|
|
}
|
|
|
|
}
|
|
|
|
class Grid {
|
|
|
|
constructor(data){
|
|
this.cols = 5
|
|
this.data = data ? data : []
|
|
this.sort = data.sort
|
|
this.styleElement = null
|
|
}
|
|
get(index){
|
|
return this.data[index] ? this.data[index] : null
|
|
}
|
|
insert(record){
|
|
this.data.push(record)
|
|
}
|
|
renderStyle(container){
|
|
const el = document.createElement('style');
|
|
el.textContent = `
|
|
.rgrid {
|
|
font-size:16px;
|
|
display: 'grid';
|
|
grid-template-columns: repeat(${this.cols}, 1fr);
|
|
grid-template-rows: auto;
|
|
gap: 0px;
|
|
border-radius: 5px;
|
|
clear: both;
|
|
color: #efefef;
|
|
/*aspect-ratio: 1/1;*/
|
|
}
|
|
.rgrid-item {
|
|
width:relative;
|
|
padding: 10px;
|
|
/*aspect-ratio: 1/1*/;
|
|
text-align: left;
|
|
float: left;
|
|
background-color: #000;
|
|
|
|
}
|
|
.rgrid->pre {
|
|
width: 100%;
|
|
}
|
|
`
|
|
container.appendChild(el)
|
|
return el
|
|
}
|
|
render(container){
|
|
if(this.styleElement == null){
|
|
this.styleElement = this.renderStyle(container)
|
|
|
|
}
|
|
|
|
const el = document.createElement('div')
|
|
el.classList.add('rgrid');
|
|
this.data.forEach((record)=>{
|
|
const cell = this.createCell(record);
|
|
el.appendChild(cell);
|
|
})
|
|
|
|
for(let i =0; i< container.children.length; i++){
|
|
if(container.children[i] != this.styleElement){
|
|
|
|
container.children[i].remove()
|
|
};
|
|
}
|
|
|
|
|
|
container.appendChild(el)
|
|
|
|
return el
|
|
}
|
|
createCell(record){
|
|
const el = document.createElement('div');
|
|
el.classList.add('rgrid-item');
|
|
const pre = this.createPre(record);
|
|
el.appendChild(pre);
|
|
// el.textContent = record;
|
|
return el;
|
|
}
|
|
createPre(content){
|
|
const el = document.createElement('pre');
|
|
el.textContent = content;
|
|
return el;
|
|
}
|
|
|
|
}
|
|
|
|
const getPuzzleNode = (str, readOnly, size, darkMode) => {
|
|
darkMode = true
|
|
const sudoku = document.createElement('my-sudoku')
|
|
sudoku.setAttribute('puzzle', str ? str : 'generate')
|
|
if(readOnly)
|
|
sudoku.setAttribute('read-only', 'true')
|
|
sudoku.classList.add('sudoku')
|
|
if(darkMode){
|
|
sudoku.classList.add('sudoku-dark')
|
|
}
|
|
return sudoku
|
|
}
|
|
|
|
const renderPuzzleFromString = (str, readOnly, size, darkMode) => {
|
|
darkMode = true
|
|
const sudoku = document.createElement('my-sudoku')
|
|
sudoku.setAttribute('puzzle', str ? str : 'generate')
|
|
if(readOnly)
|
|
sudoku.setAttribute('read-only', 'true')
|
|
sudoku.classList.add('sudoku')
|
|
if(darkMode){
|
|
sudoku.classList.add('sudoku-dark')
|
|
}
|
|
document.body.appendChild(sudoku);
|
|
const id = generateIdByPosition(sudoku);
|
|
sudoku.id = id
|
|
return sudoku
|
|
}
|
|
|
|
class App {
|
|
container = null
|
|
constructor(){
|
|
}
|
|
async renderProcessList(container){
|
|
|
|
const processes = await this.getProcessList();
|
|
// processes.forEach(process=>{
|
|
// renderPuzzleFromString(process.puzzle,false,13,true)
|
|
// })
|
|
|
|
const grid = new Grid(processes.map(process=>{
|
|
return [process.puzzle ,
|
|
"duration: " +process.duration.toString(),
|
|
"initial: "+process.result_initial_count.toString(),
|
|
"steps: "," "+process.steps.toString(),
|
|
"steps total: "," "+process.steps_total.toString(),
|
|
"solved:" + process.solved_count.toString()
|
|
].join('\n')
|
|
}));
|
|
grid.render(container);
|
|
}
|
|
|
|
async renderStatistics(container){
|
|
const statistics = await this.statistics;
|
|
const column_one = `longest_running: ${statistics.longest_running}
|
|
solved_total: ${statistics.solved_total}
|
|
start: ${statistics.start}
|
|
steps_per_puzzle: ${statistics.steps_per_puzzle}
|
|
steps_total: ${statistics.steps_total}
|
|
time_winner: ${statistics.time_winner}`
|
|
const column_two = statistics.puzzle_winner
|
|
|
|
const column_three = statistics.solution_winner
|
|
|
|
const data = [column_one,column_two,column_three]
|
|
const grid = new Grid(data)
|
|
grid.render(container)
|
|
|
|
}
|
|
get statistics() {
|
|
return fetch('/json/statistics/').then(response=>{
|
|
return response.json();
|
|
}).then(data=>{
|
|
console.debug(data)
|
|
return data
|
|
})
|
|
}
|
|
async getProcessList() {
|
|
return fetch('/json/processes')
|
|
.then(response => {
|
|
if (!response.ok) {
|
|
throw new Error('Network response was not ok');
|
|
}
|
|
return response.json();
|
|
})
|
|
.then(data => {
|
|
console.log(data);
|
|
return data;
|
|
})
|
|
.catch(error => {
|
|
console.error('There was a problem with the fetch operation:', error);
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
const asyncAnimationFrame = async(callback)=>{
|
|
return new Promise((resolve)=>{
|
|
requestAnimationFrame(()=>{
|
|
resolve(callback());
|
|
})
|
|
})
|
|
}
|
|
|
|
|
|
let app;
|
|
|
|
document.addEventListener('DOMContentLoaded',(e)=>{
|
|
app = new App();
|
|
const refreshProcesList = async() =>{
|
|
setInterval(async()=>{
|
|
await asyncAnimationFrame(async ()=>{
|
|
const processes = await app.getProcessList();
|
|
|
|
newNodes = processes.map(process=>{
|
|
return getPuzzleNode(process.puzzle,false,13,true)
|
|
})
|
|
let hasChildren = document.body.childNodes[0].length ? true : false
|
|
let count = 0;
|
|
newNodes.forEach(node=>{
|
|
document.body.appendChild(node)
|
|
count++;
|
|
|
|
|
|
})
|
|
if(hasChildren)
|
|
for(let i = 0; i < count; i++){
|
|
document.body.childNodes[0].remove()
|
|
|
|
}
|
|
})
|
|
},1000);
|
|
}
|
|
|
|
//refreshProcesList();
|
|
setInterval(async()=>{
|
|
const el = document.getElementById('statistics');
|
|
asyncAnimationFrame(async ()=>{
|
|
|
|
await app.renderStatistics(el);
|
|
});
|
|
},200);
|
|
setInterval(async ()=>{
|
|
const el = document.getElementById('details')
|
|
|
|
asyncAnimationFrame(async ()=>{
|
|
await app.renderProcessList(el);
|
|
})
|
|
|
|
},200);
|
|
console.info("KAAR\n");
|
|
}) |