Files

383 lines
13 KiB
JavaScript
Executable File

// function katalogToXML(katalog) {
// let xml = '<katalog>';
//
// Object.entries(katalog).forEach(([kategorie, produkty]) => {
// xml += `<kategorie nazev="${kategorie}">`;
//
// Object.entries(produkty).forEach(([nazev, data]) => {
// xml += `<produkt nazev="${nazev}">`;
// Object.entries(data).forEach(([key, value]) => {
// xml += `<${key}>${value}</${key}>`;
// });
// xml += `</produkt>`;
// });
//
// xml += `</kategorie>`;
// });
//
// xml += '</katalog>';
// return xml;
// }
//
//
// function xmlToKatalog(xmlString) {
// const parser = new DOMParser();
// const xmlDoc = parser.parseFromString(xmlString, "application/xml");
// const katalog = {};
//
// xmlDoc.querySelectorAll('kategorie').forEach(kat => {
// const kNazev = kat.getAttribute('nazev');
// katalog[kNazev] = {};
//
// kat.querySelectorAll('produkt').forEach(prod => {
// const pNazev = prod.getAttribute('nazev');
// const data = {};
//
// prod.childNodes.forEach(node => {
// if(node.nodeType === 1) { // ELEMENT_NODE
// const key = node.nodeName;
// let value = node.textContent;
// // pokus převést čísla
// if(!isNaN(value)) value = Number(value);
// data[key] = value;
// }
// });
//
// katalog[kNazev][pNazev] = data;
// });
// });
//
// return katalog;
// }
function uuidv4() {
return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, c =>
(+c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> +c / 4).toString(16)
);
}
// Vypocita ceny do katalogu na zaklade zadane ceny bez DPH
// Ceny se zaokrouhluji na koruny nahoru
// Vsechny rozmery v katalogu jsou v cm
function vypocitejCenu(uuid) {
let nazev = document.getElementById("nazev-"+uuid).value
// Prehodi pripadnou desetinnou carku na desetinnou tecku
let zakladniCenaBezDPH = document.getElementById("cena-"+uuid).value.replace(/,/,'.')
let mj = document.getElementById("mj-"+uuid).value
// Rozbije rozmery na jednotlive hodnoty, prevede na cisla, seradi vzestupne
let rozmery = document.getElementById("rozmery-"+uuid).value.split('/').map(Number).sort((x, y) => x - y)
let cena = {
"bezDPH": zakladniCenaBezDPH,
"sDPH": zakladniCenaBezDPH * 1.21,
"ks": 0
}
console.log(mj)
if (mj == "ks") {
cena.ks = cena.sDPH
}
// MJ = m
// cena je s DPH za m
// pouzije se pouze nejvetsi z rozmeru
else if (mj == "m") {
cena.ks = cena.sDPH/(100/rozmery.pop())
}
// MJ = m2
// cena je s DPH za m2
// zahazuje se nejmensi ze tri rozmeru
// vypocet je cena/(10000/(r1*r2))
else if (mj == "m2") {
cena.ks = cena.sDPH/(10000/(rozmery.pop()*rozmery.pop()))
}
// MJ = m3
// cena je s DPH za m3
// vypocet je cena/(1000000/(r1*r2*r3))
else if (mj == "m3") {
cena.ks = cena.sDPH/(1000000/(rozmery.pop()*rozmery.pop()*rozmery.pop()))
}
cena.bezDPH = Math.ceil(cena.bezDPH)
cena.sDPH= Math.ceil(cena.sDPH)
cena.ks = Math.ceil(cena.ks)
document.getElementById("cenadph-"+uuid).value = cena.sDPH
document.getElementById("cenaks-"+uuid).value = cena.ks
return cena
}
function zapniNaElementSortableJS(el) {
new Sortable(el, {
group: 'nested',
animation: 150,
fallbackOnBody: true,
filter: ".ignore-elements",
onMove: function (evt) {
const dragged = evt.dragged; // element, který se táhne
const target = evt.to; // element, kam by měl být vložen
const isPolozka = dragged.classList.contains('polozka'); // např. kategorie mají class 'category'
const targetIsKatalog = target.classList.contains('katalog'); // produkty mají class 'item'
// Pokud se snažíme vložit kategorii do produktu, zablokuj
if (! isPolozka && ! targetIsKatalog) {
return false; // zakáže přesun
}
return true; // jinak povolit
},
swapThreshold: 0.65
});
}
// Rucne vyrobit polozku
document.addEventListener("click", function(event) {
if (event.target.classList.contains("pridat-polozku")) {
let kategorie = event.target.closest(".kategorie");
let seznam = kategorie.querySelector(".polozky");
let nova = vyrobPolozku("Nova polozka", 100, "m3", "10/10/100");
seznam.appendChild(nova);
}
// Rucne vyrobit kategorii
if (event.target.classList.contains("pridat-kategorii")) {
//let katalog = event.target.closest(".katalog");
let katalog = document.getElementById("katalog")
let nova = vyrobKategorii("Nova Kategorie");
katalog.appendChild(nova)
//event.target.before(nova)
}
if (event.target.classList.contains("vymaz-kat")) {
let potvrzeni = confirm("Opravdu vymazat?")
if(potvrzeni) {
event.target.closest(".kategorie").remove()
}
}
if (event.target.classList.contains("vymaz")) {
let potvrzeni = confirm("Opravdu vymazat?")
if(potvrzeni) {
event.target.closest(".polozka").remove()
}
}
if(event.target.classList.contains("ulozit-katalog")) {
// tady se bude implementovat ulozeni katalogu do XML
console.log(document.getElementById("katalog"))
}
});
function ulozitKatalog() {
let katalog = {}
$("#katalog").children().each(function(i) {
let kategorie = $(this).find("input[id^='nazev-']").first().val();
let produkty = {}
$(this).find(".polozka").each(function(){
let polozka = {}
let nazev = $(this).find("input[id^='nazev-']").first().val()
polozka["nazev"] = nazev
polozka["rozmery"] = $(this).find("input[id^='rozmery-']").first().val()
polozka["cena"] = $(this).find("input[id^='cena-']").first().val()
polozka["cenadph"] = $(this).find("input[id^='cenadph-']").first().val()
polozka["cenaks"] = $(this).find("input[id^='cenaks-']").first().val()
polozka["mj"] = $(this).find("select[id^='mj-'] :selected").val()
produkty[nazev] = polozka
})
katalog[kategorie] = produkty
})
data = {"security_token":"jebatceckyhajzel", "akce":"nahraj", "katalog": katalog}
url = "http://localhost/skripty/katalog.php"
dataType = "json"
$.ajax({
type: "POST",
url: url,
data: JSON.stringify(data),
dataType: "json",
contentType: "application/json; charset=utf-8",
success: function(x, status, xhr) {
console.log(x)
}
});
}
function vyrobPolozku(nazev, cena, mj, rozmery, cenadph = -1, cenaks = -1) {
let uuid = uuidv4()
let btnDel = document.createElement("button");
btnDel.className = "vymaz"
btnDel.textContent = "✗"
let nova = document.createElement("div");
nova.className = "list-group-item nested-2 polozka";
nova.id = uuid
nova.appendChild(btnDel)
let nazevPolozky = document.createElement("input")
nazevPolozky.setAttribute("type", "text")
nazevPolozky.value = nazev
nazevPolozky.id = "nazev-" + uuid
let rozmeryPolozky = document.createElement("input")
rozmeryPolozky.setAttribute("type", "text")
rozmeryPolozky.value = rozmery
rozmeryPolozky.id = "rozmery-" + uuid
rozmeryPolozky.setAttribute("onChange", "vypocitejCenu(this.parentElement.id)")
let cenaPolozky = document.createElement("input")
cenaPolozky.setAttribute("type", "text")
cenaPolozky.setAttribute("onChange", "vypocitejCenu(this.parentElement.id)")
cenaPolozky.value = cena
cenaPolozky.id = "cena-" + uuid
let cenaPolozkySDPH = document.createElement("input")
cenaPolozkySDPH.setAttribute("type", "text")
cenaPolozkySDPH.id = "cenadph-" + uuid
cenaPolozkySDPH.value = (cena >= 0) ? cenadph : 0
let cenaPolozkyKs = document.createElement("input")
cenaPolozkyKs.setAttribute("type", "text")
cenaPolozkyKs.id = "cenaks-" + uuid
cenaPolozkyKs.value = (cena >= 0) ? cenaks : 0
let mjPolozky = document.createElement("select")
mjPolozky.id = "mj-" + uuid
mjPolozky.setAttribute("onChange", "vypocitejCenu(this.parentElement.id)")
let mjMoznosti = [{"klic": "m", "hodnota": "m"}, {"klic": "m2","hodnota": "m²"},{"klic": "m3","hodnota": "m³"},{"klic": "ks","hodnota": "ks"}]
mjMoznosti.forEach((x, index, array) => {
var option = document.createElement("option");
option.value = x.klic
option.text = x.hodnota
mjPolozky.appendChild(option);
});
nova.appendChild(document.createTextNode(" Nazev "));
nova.appendChild(nazevPolozky)
nova.appendChild(document.createTextNode(" Rozmery "));
nova.appendChild(rozmeryPolozky)
nova.appendChild(document.createTextNode(" MJ "));
nova.appendChild(mjPolozky)
nova.appendChild(document.createTextNode(" Cena bez DPH "));
nova.appendChild(cenaPolozky)
nova.appendChild(document.createTextNode(" Cena s DPH "));
nova.appendChild(cenaPolozkySDPH)
nova.appendChild(document.createTextNode(" Cena s DPH/ks "));
nova.appendChild(cenaPolozkyKs)
return nova
}
function nactiKatalogy() {
url = "http://localhost/skripty/katalog.php"
$.ajax({
type: "POST",
url: url,
dataType: "json",
success: function(x, status, xhr) {
for(i = 0; i < x.length; i++) {
option = '<option value="'+ x[i] + '">' + x[i] + '</option>';
$("#fileSelect").append(option)
}
}
});
}
function vyrobKategorii(nazev) {
let uuid = uuidv4()
let kategorie = document.createElement("div")
kategorie.className = "list-group-item nested-1 kategorie"
let nazevKategorie = document.createElement("input")
nazevKategorie.setAttribute("type", "text")
nazevKategorie.value = nazev
nazevKategorie.id = "nazev-" + uuid
//kategorie.textContent = nazev
kategorie.appendChild(nazevKategorie)
let katProdCont = document.createElement("div")
katProdCont.className = "list-group nested-sortable polozky"
kategorie.appendChild(katProdCont)
let pridavatko = document.createElement("button");
pridavatko.className = "pridat-polozku"
pridavatko.textContent = "Pridat Polozku"
let btnDel = document.createElement("button");
btnDel.className = "vymaz-kat"
btnDel.textContent = "Odebrat Kategorii"
kategorie.appendChild(btnDel)
kategorie.appendChild(pridavatko)
zapniNaElementSortableJS(katProdCont)
return kategorie
}
function vyrobKatalog() {
let kat = document.createElement("div")
kat.className = "list-group nested-sortable katalog"
kat.id = "katalog"
zapniNaElementSortableJS(kat)
return kat
}
// Vygenerovat ze vzorovych dat
// Tady se nepredpoklada dopocitani ceny s DPH a za kus
// Cena s DPH a za kus bude ulozena v datech predem vyrobeneho katalogu
let kata = vyrobKatalog()
function naplnitKatalog() {
let potvrzeni = confirm("Nacist vybrany katalog?\r !! Neulozene zmeny budou ztraceny !!")
if(! potvrzeni) {
return
}
document.getElementById("katalog").innerHTML=""
let katalog;
data = {"security_token":"jebatceckyhajzel", "akce":"obsah", "soubor": $("#fileSelect :selected").val()}
url = "http://localhost/skripty/katalog.php"
dataType = "json"
$.ajax({
type: "POST",
url: url,
data: JSON.stringify(data),
dataType: "json",
contentType: "application/json; charset=utf-8",
success: function(x, status, xhr) {
katalog = JSON.parse(x)
Object.entries(katalog).forEach(([kategorie, produkty]) => {
let kat = vyrobKategorii(kategorie)
katProdCont = kat.getElementsByClassName("polozky")[0]
Object.entries(produkty).forEach(([nazev, data]) => {
let prod = vyrobPolozku(nazev, data.cena, data.mj, data.rozmery, data.cenadph, data.cenaks)
katProdCont.appendChild(prod)
});
kata.appendChild(kat)
});
}
});
}
function vystavitKatalog() {
let soubor = $("#fileSelect :selected").val()
let potvrzeni = confirm("Zverejnit katalog " + soubor + " na web ?")
if(! potvrzeni) {
return
}
data = {"security_token":"jebatceckyhajzel", "akce":"zverejni", "soubor": soubor}
url = "http://localhost/skripty/katalog.php"
dataType = "json"
$.ajax({
type: "POST",
url: url,
data: JSON.stringify(data),
dataType: "json",
contentType: "application/json; charset=utf-8",
});
}
document.getElementById("telo").appendChild(kata)
$(document).ready(function () {
nactiKatalogy()
});