'use strict'; document.getElementById('kumoa').addEventListener('click', () => { kumoa(); piirräKaikki(); }); document.getElementById('tee-uudelleen').addEventListener('click', () => { teeUudelleen(); piirräKaikki(); }); document.getElementById('lisää-luokka-aste').addEventListener('click', () => { suorita(tapahtumaTyypit.lisääAste); piirräKaikki(); }); document.getElementById('lisää-opettaja').addEventListener('submit', (tapahtuma) => { tapahtuma.preventDefault(); let virheElementti = document.getElementById('opettaja-virhe'); let nimiElementti = document.getElementById('opettaja-nimi'); let lyhenneElementti = document.getElementById('opettaja-lyhenne'); let nimi = nimiElementti.value; let lyhenne = lyhenneElementti.value; // Jos käyttäjä ei ole manuallisesti lisännyt lyhennettä, käytä // automaattisesti luotua. if (lyhenne === '') { lyhenne = lyhenneElementti.placeholder; } let toinenNimi = opettajat.lyhenne(lyhenne); if (toinenNimi === undefined) { suorita(tapahtumaTyypit.lisääOpettaja, lyhenne, nimi); nimiElementti.value = ''; lyhenneElementti.value = ''; lyhenneElementti.placeholder = ''; virheElementti.classList.add('piilotettu'); piirräKaikki(); } else if (toinenNimi === nimi) { virheElementti.firstChild.textContent = `Opettaja ${nimi} on jo listassa`; virheElementti.classList.remove('piilotettu'); } else { virheElementti.firstChild.textContent = `Jokaisella opettajalla tulee olla oma lyhenne. Lyhenne ${lyhenne} on jo käytössä opettajalla ${toinenNimi}`; virheElementti.classList.remove('piilotettu'); } }); document.getElementById('lisää-tila').addEventListener('submit', (tapahtuma) => { tapahtuma.preventDefault(); let nimiElementti = document.getElementById('tila-nimi'); suorita(tapahtumaTyypit.lisääTila, nimiElementti.value); nimiElementti.value = ''; piirräKaikki(); }); document.getElementById('opettaja-nimi').addEventListener('input', () => { let osat = document.getElementById('opettaja-nimi').value.split(' '); let lyhenne = []; for (let osa of osat) { if (osa.length !== 0) { // TODO: Toimii vain yhden koodipisteen pituisilla // grafeemiklustereilla. let koodi = osa.codePointAt(0); lyhenne.push(String.fromCodePoint(koodi)); } } lyhenne = lyhenne.join(''); document.getElementById('opettaja-lyhenne').placeholder = lyhenne; }); document.getElementById('lisää-tunti').addEventListener('submit', (tapahtuma) => { tapahtuma.preventDefault(); let nimiElementti = document.getElementById('tunti-nimi'); let luokkaElementti = document.getElementById('tunti-luokka'); let opettajaElementti = document.getElementById('tunti-opettaja'); let tilaElementti = document.getElementById('tunti-tila'); let nimi = nimiElementti.value; let luokka = luokkaElementti.value; let opettajaLyhenne = opettajaElementti.value; let tila = parseInt(tilaElementti.value); suorita( tapahtumaTyypit.lisääTunti, nimi, luokka, opettajaLyhenne, tila, ); nimiElementti.value = ''; luokkaElementti.value = ''; opettajaElementti.value = ''; tilaElementti.value = ''; piirräKaikki(); }); function piirräKaikki() { piirräLuokat(); piirräOpettajat(); piirräTilat(); piirräTunnit(); } function piirräLuokat() { let vanhaLuokkaAsteLista = document.getElementById('luokka-asteet'); let luokkaAsteLista = luoLuokkaAsteLista(); vanhaLuokkaAsteLista.parentNode.replaceChild( luokkaAsteLista, vanhaLuokkaAsteLista ); let vanhaTuntiLuokkaValinta = document.getElementById('tunti-luokka'); let tuntiLuokkaValinta = document.createElement('select'); tuntiLuokkaValinta.id = 'tunti-luokka'; tuntiLuokkaValinta.required = true; for (let luokka of luokkaAsteet.luokat()) { let valinta = document.createElement('option'); valinta.appendChild(document.createTextNode(luokka)); tuntiLuokkaValinta.appendChild(valinta); } tuntiLuokkaValinta.value = ''; vanhaTuntiLuokkaValinta.parentNode.replaceChild( tuntiLuokkaValinta, vanhaTuntiLuokkaValinta ); } function luoLuokkaAsteLista() { let luokkaAsteLista = document.createElement('ul'); luokkaAsteLista.id = 'luokka-asteet'; for (let aste = 0; aste < luokkaAsteet.asteet.length; aste++) { if (luokkaAsteet.asteet[aste] !== undefined) { let luokkaAsteListassa = luoLuokkaAsteListassa(aste); luokkaAsteLista.appendChild(luokkaAsteListassa); } } return luokkaAsteLista; } function luoLuokkaAsteListassa(aste) { let luokkaAsteListassa = document.createElement('li'); luokkaAsteListassa.classList.add('luokka-aste'); luokkaAsteListassa.appendChild(luoPainike('+', () => { suorita(tapahtumaTyypit.lisääLuokka, aste); piirräKaikki(); })); luokkaAsteListassa.appendChild(luoPainike('-', () => { if (luokkaAsteet.asteet[aste].luokat().length > 1) { suorita(tapahtumaTyypit.poistaLuokka, aste); } else { suorita(tapahtumaTyypit.poistaAste, aste); } piirräKaikki(); })); luokkaAsteListassa.appendChild(luoLuokkaLista(aste)); let muokkausVirhe = document.createElement('span'); muokkausVirhe.classList.add('virhe'); muokkausVirhe.classList.add('piilotettu'); muokkausVirhe.appendChild(document.createTextNode('')); luokkaAsteListassa.appendChild(muokkausVirhe); // Luo muokkauspainike ja -lomake, joista vain yksi on näkyvillä kerralla let muokkausLomake = document.createElement('form'); muokkausLomake.classList.add('piilotettu'); muokkausLomake.classList.add('luokka-aste-lomake'); let asteValitsin = document.createElement('input'); asteValitsin.classList.add('luokka-aste-kenttä'); asteValitsin.type = 'number'; asteValitsin.min = 1; asteValitsin.value = aste; muokkausLomake.append(asteValitsin); let muokkausLomakePainike = document.createElement('input'); muokkausLomakePainike.type = 'submit'; muokkausLomakePainike.value = '✓'; muokkausLomake.appendChild(muokkausLomakePainike); muokkausLomake.addEventListener('submit', (tapahtuma) => { tapahtuma.preventDefault(); let uusiAste = parseInt(asteValitsin.value); if (luokkaAsteet.asteet[uusiAste] === undefined || aste === uusiAste) { suorita(tapahtumaTyypit.muutaAste, aste, uusiAste); piirräKaikki(); } else { muokkausVirhe.firstChild.textContent = `Luokka-aste ${uusiAste} on jo olemassa.`; muokkausVirhe.classList.remove('piilotettu'); } }); luokkaAsteListassa.appendChild(muokkausLomake); let muokkausPainike = luoPainike('✎', () => { muokkausLomake.classList.remove('piilotettu'); muokkausPainike.classList.add('piilotettu'); }); luokkaAsteListassa.appendChild(muokkausPainike); return luokkaAsteListassa; } function luoLuokkaLista(aste) { let luokkaLista = document.createElement('ul'); luokkaLista.classList.add('luokat'); for (let luokka of luokkaAsteet.asteet[aste].luokat()) { let luokkaListassa = document.createElement('li'); luokkaListassa.appendChild(document.createTextNode(`${aste}${luokka}`)); luokkaLista.appendChild(luokkaListassa); } return luokkaLista; } function piirräOpettajat() { let vanhaOpettajaLista = document.getElementById('opettajat'); let opettajaLista = luoOpettajaLista(); vanhaOpettajaLista.parentNode.replaceChild( opettajaLista, vanhaOpettajaLista ); let vanhaTuntiOpettajaValinta = document.getElementById('tunti-opettaja'); let tuntiOpettajaValinta = document.createElement('select'); tuntiOpettajaValinta.id = 'tunti-opettaja'; tuntiOpettajaValinta.required = true; for (let [lyhenne, nimi] of opettajat.opettajat()) { let valinta = document.createElement('option'); valinta.appendChild(document.createTextNode(nimi)); valinta.value = lyhenne; tuntiOpettajaValinta.appendChild(valinta); } tuntiOpettajaValinta.value = ''; vanhaTuntiOpettajaValinta.parentNode.replaceChild( tuntiOpettajaValinta, vanhaTuntiOpettajaValinta ); } function luoOpettajaLista() { let opettajaLista = document.createElement('ul'); opettajaLista.id = 'opettajat'; for (let [lyhenne, nimi] of opettajat.opettajat()) { opettajaLista.appendChild(luoOpettajaListassa(lyhenne, nimi)); } return opettajaLista; } function luoOpettajaListassa(lyhenne, nimi) { let opettajaListassa = document.createElement('li'); opettajaListassa.appendChild(luoPainike('-', () => { suorita(tapahtumaTyypit.poistaOpettaja, lyhenne); piirräKaikki(); })); let opettajanNimi = document.createElement('span'); opettajanNimi.appendChild(document.createTextNode(`${lyhenne} ${nimi}`)); opettajaListassa.appendChild(opettajanNimi); return opettajaListassa; } function piirräTilat() { let vanhaTilaLista = document.getElementById('tilat'); let tilaLista = luoTilaLista(); vanhaTilaLista.parentNode.replaceChild( tilaLista, vanhaTilaLista ); let vanhaTuntiTilaValinta = document.getElementById('tunti-tila'); let tuntiTilaValinta = document.createElement('select'); tuntiTilaValinta.id = 'tunti-tila'; tuntiTilaValinta.required = true; for (let [id, tila] of tilat.tilat()) { let valinta = document.createElement('option'); valinta.appendChild(document.createTextNode(tila)); valinta.value = id; tuntiTilaValinta.appendChild(valinta); } tuntiTilaValinta.value = ''; vanhaTuntiTilaValinta.parentNode.replaceChild( tuntiTilaValinta, vanhaTuntiTilaValinta ); } function luoTilaLista() { let tilaLista = document.createElement('ul'); tilaLista.id = 'tilat'; for (let [id, tila] of tilat.tilat()) { let tilaListassa = document.createElement('li'); tilaListassa.appendChild(luoPainike('-', () => { suorita(tapahtumaTyypit.poistaTila, id); piirräKaikki(); })); let tilanNimi = document.createElement('span'); tilanNimi.appendChild(document.createTextNode(`${tila}`)); tilaListassa.appendChild(tilanNimi); tilaLista.appendChild(tilaListassa); } return tilaLista; } function piirräTunnit() { let vanhaTuntiLista = document.getElementById('tunnit'); let tuntiLista = luoTuntiLista(); vanhaTuntiLista.parentNode.replaceChild( tuntiLista, vanhaTuntiLista ); } function luoTuntiLista() { let tuntiLista = document.createElement('ul'); tuntiLista.id = 'tunnit'; for (let [id, tunti] of tunnit.järjestyksessä()) { let tuntiListassa = document.createElement('li'); tuntiListassa.appendChild(luoPainike('-', () => { console.log(id); suorita(tapahtumaTyypit.poistaTunti, id); piirräKaikki(); })); let tuntiTiiviste = document.createElement('span'); let nimi = tunti.nimi; let luokat = tunti.luokat.alkiot().join(', '); let opettajat = tunti.opettajaLyhenteet.alkiot().join(', '); let tunninTilat = tilojenNimet(tilat, tunti.tilat.alkiot()); let teksti = `${nimi} ${luokat} ${opettajat} ${tunninTilat}`; tuntiTiiviste.appendChild(document.createTextNode(teksti)); tuntiListassa.appendChild(tuntiTiiviste); tuntiLista.appendChild(tuntiListassa); } return tuntiLista; } function luoPainike(teksti, funktio) { let painike = document.createElement('input'); painike.type = 'button'; painike.value = teksti; painike.addEventListener('click', funktio); return painike; } // TOOD: Käyttöliittymätestit