Näytä luokat aakkosjärjestyksessä

This commit is contained in:
Juhani Krekelä 2024-05-17 15:32:19 +03:00
parent 01fc1f675f
commit 0e332aa026
3 changed files with 36 additions and 8 deletions

View File

@ -27,8 +27,9 @@
<script src="tietokanta.js"></script> <script src="tietokanta.js"></script>
<script src="käyttöliittymä.js"></script> <script src="käyttöliittymä.js"></script>
<script> <script>
suorita(tietokanta.transaktio((t)=> {t.lisää(taulut.luokat, '1A')}));
suorita(tietokanta.transaktio((t)=> {t.lisää(taulut.luokat, '1B')})); suorita(tietokanta.transaktio((t)=> {t.lisää(taulut.luokat, '1B')}));
suorita(tietokanta.transaktio((t)=> {t.lisää(taulut.luokat, '1A')}));
suorita(tietokanta.transaktio((t)=> {t.lisää(taulut.luokat, '1C')}));
suorita(tietokanta.transaktio((t) => {t.poista(taulut.luokat, 0)})); suorita(tietokanta.transaktio((t) => {t.poista(taulut.luokat, 0)}));
</script> </script>
</body> </body>

View File

@ -4,19 +4,25 @@ document.getElementById('kumoa').addEventListener('click', () => {
suorita(tietokanta.kumoa()); suorita(tietokanta.kumoa());
}); });
function suorita(muutokset) { function suorita([tietokanta, muutokset]) {
for (const muutos of muutokset) { for (const muutos of muutokset) {
suoritaMuutos(muutos); suoritaMuutos(tietokanta, muutos);
} }
} }
function suoritaMuutos(muutos) { function suoritaMuutos(tietokanta, muutos) {
const {taulu, id, vanha, uusi} = muutos; const {taulu, id, vanha, uusi} = muutos;
if (taulu === taulut.luokat && vanha === undefined) { if (taulu === taulut.luokat && vanha === undefined) {
// Uusi luokka // Uusi luokka
// TODO: Järjestele const järjestys = tietokanta.järjestyksessä(taulu, vertaa);
const seuraavaId = järjestys[järjestys.indexOf(id) + 1];
const luokatLista = document.getElementById('luokat-lista'); const luokatLista = document.getElementById('luokat-lista');
luokatLista.appendChild(luoLuokka(id, uusi)); // 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) { } else if (taulu === taulut.luokat && uusi === undefined) {
// Luokka poistettu // Luokka poistettu
const luokka = document.getElementById(`luokka-${id}`); const luokka = document.getElementById(`luokka-${id}`);
@ -26,6 +32,11 @@ function suoritaMuutos(muutos) {
} }
} }
function vertaa(a, b) {
// TODO: Parempi vertailufunktio?
return a.localeCompare(b);
}
function luoLuokka(id, nimi) { function luoLuokka(id, nimi) {
const li = document.createElement('li'); const li = document.createElement('li');
li.id = `luokka-${id}`; li.id = `luokka-${id}`;

View File

@ -80,7 +80,7 @@ class Tietokanta {
transaktio(funktio) { transaktio(funktio) {
const transaktio = new Transaktio(this); const transaktio = new Transaktio(this);
funktio(transaktio); funktio(transaktio);
return this.suorita(transaktio); return [tietokanta, this.suorita(transaktio)];
} }
suorita(transaktio) { suorita(transaktio) {
@ -129,7 +129,7 @@ class Tietokanta {
uusi: vanha, uusi: vanha,
}); });
} }
return kumotut; return [tietokanta, kumotut];
} }
hae(taulu, id) { hae(taulu, id) {
@ -138,6 +138,22 @@ class Tietokanta {
} }
return this.taulut.get(taulu).get(id); return this.taulut.get(taulu).get(id);
} }
järjestyksessä(taulu, järjestys) {
if (!this.taulut.has(taulu)) {
throw new Error(`ei taulua ${taulu}`);
}
const taulukko = Array.from(this.taulut.get(taulu).entries());
taulukko.sort(([xId, x], [yId, y]) => {
const vertaus = järjestys(x, y);
if (vertaus < 0 || vertaus > 0) {
return vertaus;
} else {
return xId - yId;
}
});
return taulukko.map(([id, _]) => id);
}
} }
const tietokanta = new Tietokanta; const tietokanta = new Tietokanta;