function stahnoutKatalog(data) { // převod na JSON string const jsonString = JSON.stringify(katalog2JSON(), null, 2); // vytvoření blobu (soubor v paměti) const blob = new Blob([jsonString], { type: "application/json" }); // vytvoření odkazu const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = "katalog.json"; // simulace kliknutí a.click(); // úklid URL.revokeObjectURL(url); } function uuidv4() { return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, c => (+c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> +c / 4).toString(16) ); } function prepocitejCenu(rozmery, vstupniCena, mj) { vat = 21 vatKoeficient = (1 + (vat/100)) desetinnaMista = 4 // Ucetni vypocet ceny se provadi s presnosti na x desetinnych mist let cena = { "bezDPH": vstupniCena.toFixed(desetinnaMista), "sDPH": (vstupniCena * vatKoeficient).toFixed(desetinnaMista), "ks": -1 } 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") { delka = (rozmery.pop()/100).toFixed(desetinnaMista) cena.ks = cena.sDPH * delka } // MJ = m2; cena je s DPH za m2 // zahazuje se nejmensi ze tri rozmeru else if (mj == "m2") { obsah = ((rozmery.pop()*rozmery.pop())/10000).toFixed(desetinnaMista) cena.ks = cena.sDPH * obsah //cena.ks = cena.sDPH/(10000/(rozmery.pop()*rozmery.pop())) console.log("Cena " + cena.ks) } // MJ = m3; cena je s DPH za m3 else if (mj == "m3") { objem = ((rozmery.pop()*rozmery.pop()*rozmery.pop())/1000000).toFixed(desetinnaMista) //cena.ks = cena.sDPH/(1000000/(rozmery.pop()*rozmery.pop()*rozmery.pop())) cena.ks = cena.sDPH * objem } 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.id == "nahratKata") { document.getElementById("inputFile").click() // Simuluje kliknuti na input>file // zpracování souboru document.getElementById("inputFile").addEventListener("change", (e) => { const file = e.target.files[0]; if (!file) return; const reader = new FileReader(); reader.onload = () => { try { const data = JSON.parse(reader.result); JSON2Katalog(reader.result) } catch (err) { console.error("Neplatný JSON"); } }; reader.readAsText(file); }); } 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")) } }); document.addEventListener("change", function(event) { if(event.target.classList.contains("prepocitavaniCeny")) { let uuid = event.target.parentElement.id let vstupniCena = Number(document.getElementById("cena-"+uuid).value.replace(/,/,'.')) let mj = document.getElementById("mj-"+uuid).value let rozmery = document.getElementById("rozmery-"+uuid).value.replace(/,/,'.').split('/').map(Number).sort((x, y) => x - y) cena = prepocitejCenu(rozmery, vstupniCena, mj) document.getElementById("cenadph-"+uuid).value = Math.ceil(cena.sDPH) document.getElementById("cenaks-"+uuid).value = Math.ceil(cena.ks) } }); 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 rozmeryPolozky = document.createElement("input") rozmeryPolozky.setAttribute("type", "text") rozmeryPolozky.className = "prepocitavaniCeny" rozmeryPolozky.value = rozmery rozmeryPolozky.id = "rozmery-" + uuid let cenaPolozky = document.createElement("input") cenaPolozky.setAttribute("type", "text") cenaPolozky.className = "prepocitavaniCeny" 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.className = "prepocitavaniCeny" 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); }); mjPolozky.value = mj // nova.appendChild(document.createTextNode(" Nazev ")); // nova.appendChild(nazevPolozky) nova.appendChild(document.createTextNode(" Rozměry ")); 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 = "/skripty/katalog.php" $.ajax({ type: "POST", url: url, dataType: "json", success: function(x, status, xhr) { $("#fileSelect").empty(); for(i = 0; i < x.length; i++) { option = ''; $("#fileSelect").append(option) } } }); } function katalog2JSON() { 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 }) return katalog } function ulozitKatalog() { data = {"security_token":"jebatceckyhajzel", "akce":"nahraj", "katalog": katalog2JSON()} url = "/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) { nactiKatalogy(); } }); } 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 = "/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) { JSON2Katalog(x) } }); } function JSON2Katalog(x) { 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]) => { console.log(data.mj) 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 = "https://drevoprodej-benes.cz/skripty/katalog.php" url = "/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() });