'use strict'; document.getElementById('kumoa').addEventListener('click', () => { suorita(_tietokanta.kumoa()); }); document.getElementById('luokat-uusi').addEventListener('submit', (e) => { e.preventDefault(); suorita(_tietokanta.transaktio((t) => { const luokanNimi = document.getElementById('luokat-uusi-nimi').value; t.lisää(taulut.luokat, luokanNimi) document.getElementById('luokat-uusi-nimi').value = ''; })); }); function suorita([tietokanta, muutokset]) { for (const muutos of muutokset) { suoritaMuutos(tietokanta, muutos); } } function suoritaMuutos(tietokanta, muutos) { const {taulu, id, vanha, uusi} = muutos; if (taulu === taulut.luokat && vanha === undefined) { // Uusi luokka const järjestys = tietokanta.järjestyksessä(taulu, vertaa); const seuraavaId = järjestys[järjestys.indexOf(id) + 1]; const luokatLista = document.getElementById('luokat-lista'); // getElementById palauttaa null:n, jos id:tä ei löydy. Jos tämä luokka // on viimeinen, seuraavaId on undefined, eikä DOM:ssa ole luokkaa // "luokka-undefined". seuraava on siis null silloin kuin tämä luokka // tulee lisätä listan loppuun, joka vastaa insertBefore:n toimintaa const seuraava = document.getElementById(`luokka-${seuraavaId}`); luokatLista.insertBefore(luoLuokka(id, uusi), seuraava); } else if (taulu === taulut.luokat && uusi === undefined) { // Luokka poistettu const luokka = document.getElementById(`luokka-${id}`); luokka.parentElement.removeChild(luokka); } else { throw new Error(`Ei toteutettu ${taulu} ${id} ${vanha} ${uusi}`); } } function vertaa(a, b) { // TODO: Parempi vertailufunktio? return a.localeCompare(b); } function luoLuokka(id, nimi) { const li = document.createElement('li'); li.id = `luokka-${id}`; li.textContent = nimi; return li; }