code/client/static/js/main.js (204 lines of code) (raw):
let basepath = "/api/v1/trainer"
let orig;
const httpStatusOk = 200;
const httpStatusCreated = 201;
const httpStatusNoContent = 204;
const httpStatusBadRequest = 400;
document.addEventListener('DOMContentLoaded', function(){
orig = new Originals();
listTrainer();
});
class Trainer {
constructor(name, age, city) {
this.name = name;
this.age = age;
this.city = city;
}
toForm(){
let form = new FormData();
form.append("name", this.name);
form.append("age", this.age);
form.append("city", this.city);
return form;
}
}
class Originals{
constructor() {
this.trainers = [];
}
update(trainers){
let i = 1
trainers.forEach(trainer => {
this.trainers[i] = trainer;
i++
});
}
get(id){
return this.trainers[id]
}
}
function renderListTrainer(resp){
let trainers = JSON.parse(resp);
orig.update(trainers)
let target = document.querySelector(".list");
target.innerHTML = "";
let ul = document.createElement("ul");
ul.classList.add("list")
let i = 1;
trainers.forEach(trainer => {
let fieldset = renderTrainer(trainer, i);
target.appendChild(fieldset)
i++
});
let input = renderTrainer(new Trainer("", "", ""), 0)
target.appendChild(input)
}
function renderTrainer(trainer, i){
let fieldset = document.createElement("fieldset")
let nameInput = document.createElement("input")
nameInput.id = "name_" + i;
nameInput.type = "text"
nameInput.value = trainer.name;
nameInput.placeholder = "Name"
let ageInput = document.createElement("input")
ageInput.id = "age_" + i;
ageInput.type = "number";
ageInput.value = trainer.age;
ageInput.placeholder = "Age";
let cityInput = document.createElement("input")
cityInput.id = "city_" + i;
cityInput.type = "text"
cityInput.value = trainer.city;
cityInput.placeholder = "City";
fieldset.appendChild(nameInput);
fieldset.appendChild(ageInput);
fieldset.appendChild(cityInput);
if (i == 0){
let createbtn = document.createElement("button")
createbtn.innerHTML = `<span class="text">add</span><span class="material-symbols-outlined">add_circle</span>`
createbtn.addEventListener("click", createHandler)
fieldset.appendChild(createbtn);
} else {
let updatebtn = document.createElement("button")
updatebtn.id="update_"+i;
updatebtn.innerHTML = `<span class="text">update</span><span class="material-symbols-outlined">change_circle</span>`
updatebtn.addEventListener("click", updateHandler)
fieldset.appendChild(updatebtn);
let deletebtn = document.createElement("button");
deletebtn.id="delete_"+i;
deletebtn.innerHTML = `<span class="text">delete</span><span class="material-symbols-outlined">delete</span>`
deletebtn.classList.add("delete")
deletebtn.addEventListener("click", deleteHandler)
fieldset.appendChild(deletebtn);
}
return fieldset;
}
function newTrainer(id){
let name = document.querySelector("#name_"+id).value
let age = parseInt(document.querySelector("#age_"+id ).value)
let city = document.querySelector("#city_"+id).value
let p = new Trainer(name, age, city)
return p
}
function createHandler(e){
let p = newTrainer(0)
createTrainer(p);
}
function deleteHandler(e){
let id = e.target.id.replace("delete_", "")
if (id == ""){
id = e.target.parentElement.id.replace("delete_", "")
}
let p = newTrainer(id)
deleteTrainer(p);
}
function updateHandler(e){
let id = e.target.id.replace("update_", "")
if (id == ""){
id = e.target.parentElement.id.replace("update_", "")
}
let replacement = newTrainer(id)
let original = orig.get(id)
updateTrainer(original, replacement)
}
function updateTrainer(original, replacement){
let data = {};
data.original = original;
data.replacement = replacement;
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == XMLHttpRequest.DONE) { // XMLHttpRequest.DONE == 4
if (xmlhttp.status == httpStatusOk) {
listTrainer()
}
else if (xmlhttp.status == httpStatusBadRequest) {
alert('There was an error httpStatusBadRequest');
}
else {
alert('something else other than httpStatusOk was returned');
console.log(xmlhttp.status);
}
}
};
xmlhttp.open("PUT", basepath, true);
xmlhttp.setRequestHeader("Content-Type", "application/json");
xmlhttp.send(JSON.stringify(data));
}
function createTrainer(trainer){
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == XMLHttpRequest.DONE) { // XMLHttpRequest.DONE == 4
if (xmlhttp.status == httpStatusCreated) {
listTrainer()
}
else if (xmlhttp.status == httpStatusBadRequest) {
alert('There was an error httpStatusBadRequest');
}
else {
alert('something else other than httpStatusCreated was returned');
console.log(xmlhttp.status);
}
}
};
xmlhttp.open("POST", basepath, true);
xmlhttp.setRequestHeader("Content-Type", "application/json");
xmlhttp.send(JSON.stringify(trainer));
}
function deleteTrainer(trainer){
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == XMLHttpRequest.DONE) { // XMLHttpRequest.DONE == 4
if (xmlhttp.status == httpStatusNoContent) {
listTrainer()
}
else if (xmlhttp.status == httpStatusBadRequest) {
alert('There was an error httpStatusBadRequest');
}
else {
alert('something else other than httpStatusNoContent was returned');
console.log(xmlhttp.status);
}
}
};
xmlhttp.open("DELETE", basepath, true);
xmlhttp.setRequestHeader("Content-Type", "application/json");
xmlhttp.send(JSON.stringify(trainer));
}
function listTrainer() {
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == XMLHttpRequest.DONE) { // XMLHttpRequest.DONE == 4
if (xmlhttp.status == httpStatusOk) {
renderListTrainer(xmlhttp.response);
}
else if (xmlhttp.status == httpStatusBadRequest) {
alert('There was an error httpStatusBadRequest');
}
else {
alert('something else other than httpStatusOk was returned');
}
}
};
xmlhttp.open("GET", basepath, true);
xmlhttp.send();
}