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"); })