Não consigo adicionar novos elementos criados no form na tabela nem para serem exibidos adequadamente no LocalStorage.
Até o momento, eu só consegui iterar os objetos do json (que estão no JS) na tabela e no LocalStorage, mas, quando tento criar um novo elemento diretamente na webpage, ele não adiciona na tabela ou é só incorporado ao LocalStorage, porém explicitado como [Object object] no lado da key. Segue o código abaixo:
HTML
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8" />
<title>Escola</title>
</head>
<body>
<main>
<section>
<form id="form">
<h2>Dados do aluno</h2>
<label for="turma">Turma:</label>
<input type="text" id="turma" />
<label for="nome">Nome:</label>
<input type="text" id="nome" />
<label for="serie">Série:</label>
<select id="serie">
<option value="1">1º ano - ensino médio</option>
<option value="2">2º ano - ensino médio</option>
<option value="3">3º ano - ensino médio</option>
</select>
<label for="faltas">Faltas:</label>
<input type="text" id="faltas" />
<label for="turno">Turno:</label>
<select id="turno">
<option value="m">Matutino</option>
<option value="v">Vespertino</option>
<option value="n">Noturno</option>
</select>
<input type="button" id="botao-cadastro" value="cadastrar" />
</form>
</section>
<section>
<table id="tabela-colegio">
<thead>
<tr>
<th>Turma</th>
<th>Aluno</th>
<th>Série</th>
<th>Faltas</th>
<th>Turno</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</section>
</main>
<script src="js/colegio.js"></script>
</body>
</html>
JS
let turmas = [
{
nome: "A",
alunos: [
{
nome: "José",
serie: "1º ano - ensino médio",
faltas: 20,
turno: {
periodo: "noturno"
}
},
{
nome: "Hugo",
serie: "1º ano - ensino médio",
faltas: 32,
turno: {
periodo: "matutino"
}
}
]
},
{
nome: "B",
alunos: [
{
nome: "Mariana",
serie: "2º ano - ensino médio",
faltas: 13,
turno: {
periodo: "verspetino"
}
},
{
nome: "Paulo",
serie: "3º ano - ensino médio",
faltas: 5,
turno: {
periodo: "matutino"
}
}
]
}
];
console.log(turmas);
function novaTr(tbody, arrayValores) {
const novaTr = tbody.insertRow();
novaTr.classList.add('aluno-turma');
arrayValores.forEach(function(v, i) {
const novaTd = novaTr.insertCell(i);
let novoTexto = document.createTextNode(v);
if (typeof v == "object") {
novoTexto = v;
}
novaTd.appendChild(novoTexto);
});
}
function criaTabela() {
let tbodyColegio = document
.getElementById("tabela-colegio")
.getElementsByTagName("tbody")[0];
for (let turma of turmas) {
for (let aluno of turma.alunos) {
let turno = "";
if (aluno.turno !== undefined) {
turno = aluno.turno.periodo;
}
novaTr(tbodyColegio, [
turma.nome,
aluno.nome,
aluno.serie,
aluno.faltas,
aluno.turno.periodo,
criaBotaoDeEditarTr(),
criaBotaoDeApagarTr()
]);
}
}
return tbodyColegio;
}
console.log(criaTabela());
function criaBotaoDeApagarTr() {
const botaoApagar = document.createElement("button");
botaoApagar.classList.add("botao-apagar");
botaoApagar.innerHTML = "excluir";
return botaoApagar;
}
function criaBotaoDeEditarTr() {
const botaoEditar = document.createElement("button");
botaoEditar.classList.add("botao-editar");
botaoEditar.innerHTML = "editar";
return botaoEditar;
}
function getInformacoes() {
if (localStorage.getItem("turmas") == null) {
localStorage.setItem("turmas", JSON.stringify(
[
{
nome: "A",
alunos: [
{
nome: "José",
serie: "1º ano - ensino médio",
faltas: 20,
turno: {
periodo: "noturno"
}
},
{
nome: "Hugo",
serie: "1º ano - ensino médio",
faltas: 32,
turno: {
periodo: "matutino"
}
}
]
},
{
nome: "B",
alunos: [
{
nome: "Mariana",
serie: "2º ano - ensino médio",
faltas: 13,
turno: {
periodo: "verspetino"
}
},
{
nome: "Paulo",
serie: "3º ano - ensino médio",
faltas: 5,
turno: {
periodo: "matutino"
}
}
]
}
]
));
}
return JSON.parse(localStorage.getItem("turmas"));
}
function setInformacoes(turmas) {
localStorage.setItem(turmas, JSON.stringify(turmas));
}
console.log(getInformacoes());
document.getElementById("botao-cadastro").addEventListener("click", function() {
let form = document.getElementById("form");
let informacoesForm = new FormData(form);
let novaInfo = Object.fromEntries(informacoesForm);
let informacoes = getInformacoes();
informacoes.push(novaInfo);
setInformacoes(informacoes);
pushData();
});
///////// TENTATIVA 1 //////////////////
let turma;
let aluno;
let serie;
let faltas;
let turno;
function getTaskInput() {
try {
turma = document.querySelector('#value').value;
aluno = document.querySelector('#aluno').value;
serie = document.querySelector('#serie').value;
faltas = document.querySelector('#faltas').value;
turno = document.querySelector('#turno').value;
console.log("Succesfully retrieved data. " +
"Turma: " + turma +
". Aluno: " + aluno +
". Série: " + serie +
". Faltas: " + faltas +
". Turno: " + turno);
} catch(e) {
console.log("Failed to retrieve data, unexpecter error.");
}
}
let taskObject;
function taskToObject() {
taskObject = {
turma: turma,
aluno: aluno,
serie: serie,
faltas: faltas,
turno: turno
}
}
let taskArray;
function getTaskArray() {
let taskArrayString = localStorage.getItem("turmas");
if (taskArrayString !== null && typeof taskArrayString === "string") {
taskArray = JSON.parse(taskArrayString); // <------
console.log("Succesfully retrieved 'tasks' and contents.");
} else {
console.log("Succesfully retrieved 'tasks', contents were not a string or held no contents. Contents of 'tasks' reset to empty array");
let emptyArray = JSON.stringify([]);
localStorage.setItem("turmas", emptyArray);
taskArray = localStorage.getItem("turmas");
taskArray = JSON.parse(taskArray); // <------
}
}
let taskString;
function pushData() {
taskString = JSON.stringify(taskObject);
taskArray.push(taskString); // <----- !No need to assign there.
}
A parte do JS que tem as funções getTaskInput(), taskToObject() e getTaskArray() foi um código que tirei para implementar o dados criados no form para o LocalStorage, mas só aparece no seguinte formato:
key
[object Object],[object Object],[object Object]
value
2: {} (só aparece um array vazio)
Edit 1: essas funções que eu mencionei acima não foram inicializadas e não sei nem mais onde colocá-las para ver se o código funciona.
Edit 2: consertei o id turma que se encontra dentro da function getTaskInput e coloquei todas as functions mencionadas dentro do eventListener de ‘botao-cadastro’ e só está imprimindo no console as mensagens do bloco tryCatch da função getTaskInput.