// function katalogToXML(katalog) { // let xml = ''; // // Object.entries(katalog).forEach(([kategorie, produkty]) => { // xml += ``; // // Object.entries(produkty).forEach(([nazev, data]) => { // xml += ``; // Object.entries(data).forEach(([key, value]) => { // xml += `<${key}>${value}`; // }); // xml += ``; // }); // // xml += ``; // }); // // xml += ''; // 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 = ''; $("#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() });