Linux SRV-16 6.18.44-paas #1 SMP PREEMPT_DYNAMIC Thu Aug 13 10:08:12 UTC 2026 x86_64
/
proc
/
212
/
task
/
212
/
root
/
srv
/
data
/
web
/
vhosts
/
www.impressionrapide.fr
/
htdocs
/
public
/
js
/
//proc/212/task/212/root/srv/data/web/vhosts/www.impressionrapide.fr/htdocs/public/js/configure.js
addEventListener("DOMContentLoaded", () => { let choices = document.getElementsByClassName("is-handled"); let data = { quantity: document.querySelector("[data-option='quantity'].active"), grammage: document.querySelector("[data-option='grammage'].active"), pages: document.querySelector("[data-option='pages'].active"), color: document.querySelector("[data-option='color'].active"), size: document.querySelector("[data-option='size'].active"), finishing: document.querySelector("[data-option='finishing'].active"), fold: document.querySelector("[data-option='fold'].active"), }; let loadingImg = `<img src='/images/loading.gif' alt="loading" width="20" height="20">`; for (let i = 0; i < choices.length; i++) { choices[i].addEventListener("click", () => { let selector = choices[i].getAttribute("data-option"); activate(choices[i], selector); if (selector === "mockup_generator") return; registerValue(choices[i], selector); getPrice(i); }) } function activate(current, selector) { let list = document.querySelectorAll(`[data-option="${selector}"]`); for (let i = 0; i < list.length; i++) { list[i].classList.remove("active"); } current.classList.add("active"); if(selector === "mockup_generator") { showMockupPromptGenerator(current.getAttribute('value')); } } function registerValue(element, selector) { let value = element.getAttribute("data-value"); document.getElementById(`cart_item_${selector}`).value = value; } function getPrice(i) { quantity = document.getElementById("cart_item_quantity").value; color = document.getElementById("cart_item_color").value; grammage = document.getElementById("cart_item_grammage").value; finishing = document.getElementById("cart_item_finishing").value; fold = document.getElementById("cart_item_fold").value; pages = document.getElementById("cart_item_pages").value; size = document.getElementById("cart_item_size").value; document.getElementById("currentItemPrice").innerHTML = loadingImg; document.getElementById("totalPrice").innerHTML = loadingImg; document.getElementById("tvaPrice").innerHTML = loadingImg; // document.getElementById("expeditionCost").innerHTML = loadingImg; let request = new XMLHttpRequest(); request.open("POST", 'price', true); request.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); request.onload = () => { console.log(request.response); const response = JSON.parse(request.response); if (!response.price) { sendAlert("warning", "Combinaison impossible"); undo(i); } else { document.getElementById("currentItemPrice").innerText = Number(response.price).toFixed(2) + " €"; document.getElementById("totalPrice").innerText = Number(response.cartTotal + response.tva).toFixed(2) + " €"; document.getElementById("tvaPrice").innerText = Number(response.tva).toFixed(2) + " €"; data[choices[i].getAttribute("data-option")] = document.querySelector("[data-option='" + choices[i].getAttribute("data-option") + "'].active"); data.price = response.price; data.tva = response.tva; } } let requestString = `quantity=${quantity}&color=${color}&grammage=${grammage}&finishing=${finishing}&fold=${fold}&pages=${pages}&size=${size}`; request.send(requestString); } function undo(i) { let option = choices[i].getAttribute("data-option"); activate(data[option], option); document.getElementById("currentItemPrice").innerText = Number(data.price).toFixed(2) + " €"; document.getElementById("totalPrice").innerText = Number(data.cartTotal).toFixed(2) + " €"; document.getElementById("tvaPrice").innerText = Number(data.tva).toFixed(2) + " €"; } function showMockupPromptGenerator(val) { if(val === "1") { document.getElementById("prompt-data").classList.remove("d-none"); document.getElementById("mockup-image").classList.add("d-none"); } else { document.getElementById("mockup-image").classList.remove("d-none"); document.getElementById("prompt-data").classList.add("d-none"); } } getPrice(0); }) /** * Verifies if the form is fully complete * @returns {Boolean} false if isn't completed */ function verifyCompletion() { let inputs = [ { input: "quantity", name: "Quantité" }, { input: "size", name: "Format" }, { input: "pages", name: "Nombre de pages" }, { input: "grammage", name: "Papier" }, { input: "finishing", name: "Finition du papier" }, { input: "color", name: "Couleurs" }, { input: "fold", name: "Pliage" }, { input: "designFile_file", name: "Fichier" }, ]; for (let i = 0; i < inputs.length; i++) { let elem = document.getElementById(`cart_item_${inputs[i].input}`); if (elem.value.length < 1) { if (inputs[i].name == "Fichier") { if (document.getElementById("cart_item_textMessage").value.length < 1) { sendAlert("danger", `Veuiller remplir le champs fichier ou message.`); document.getElementById("file_input_fake").classList.add("has-error"); document.getElementById("file_input_fake").addEventListener("click", () => { document.getElementById("file_input_fake").classList.remove("has-error"); clearAlerts(); }); return false; } } else { sendAlert("danger", `Veuillez remplir le champ ${inputs[i].name}`); return false; } } } document.querySelector('[name="cart_item"]').submit(); return true; } // caractéristiques du produit reprises par la génération comme par l'affinage const mockupConfigurationInputs = [ { input: "quantity", name: "Quantité" }, { input: "size", name: "Format" }, { input: "pages", name: "Nombre de pages" }, { input: "grammage", name: "Papier" }, { input: "finishing", name: "Finition du papier" }, { input: "color", name: "Couleurs" }, { input: "fold", name: "Pliage" }, ]; /** * Ajoute la configuration produit courante à la requête. * @returns {Boolean} false si une caractéristique manque */ function appendMockupConfiguration(formData) { for (let i = 0; i < mockupConfigurationInputs.length; i++) { let elem = document.getElementById(`cart_item_${mockupConfigurationInputs[i].input}`); if (elem.value.length < 1) { sendAlert("danger", `Veuillez remplir le champ ${mockupConfigurationInputs[i].name}`); return false; } formData.append(mockupConfigurationInputs[i].input, elem.value); } return true; } function generetateMockup(product_id, path) { let formData = new FormData(); if (!appendMockupConfiguration(formData)) { return false; } if (mockup_designFile_file.files.length > 0) { formData.append("designFile", mockup_designFile_file.files[0]); } let promptEl = document.getElementById("cart_item_mock_up_prompt"); if (promptEl) { formData.append("mock_up_prompt", promptEl.value); } sendMockupRequest( path, formData, document.getElementById("generate-mockup-btn"), "Une erreur est survenue lors de la génération de la maquette." ); return true; } function refineMockup(product_id, path) { let mockupInput = document.getElementById("cart_item_mockup"); let promptEl = document.getElementById("mockup_refine_prompt"); if (!mockupInput || mockupInput.value.length < 1) { sendAlert("warning", "Générez d'abord une maquette avant de l'affiner."); return false; } if (!promptEl || promptEl.value.trim().length < 1) { sendAlert("warning", "Décrivez les corrections à apporter à la maquette."); return false; } let formData = new FormData(); if (!appendMockupConfiguration(formData)) { return false; } formData.append("mockup", mockupInput.value); formData.append("refine_prompt", promptEl.value.trim()); sendMockupRequest( path, formData, document.getElementById("refine-mockup-btn"), "Une erreur est survenue lors de l'affinage de la maquette." ); return true; } /** * Envoie une demande de maquette (génération ou affinage) et lie la maquette * obtenue au futur cartItem. */ function sendMockupRequest(path, formData, button, errorMessage) { let buttonText = button.innerHTML; button.innerHTML = `<img src='/images/loading.gif' alt="loading" width="20" height="20">`; button.style.pointerEvents = "none"; let request = new XMLHttpRequest(); request.open("POST", path, true); request.onload = () => { button.innerHTML = buttonText; button.style.pointerEvents = ""; let response; try { response = JSON.parse(request.response); } catch (e) { sendAlert("danger", errorMessage); return; } if (response.error) { sendAlert("warning", response.error); } else if (response.mockupUrl) { // lie la maquette générée au futur cartItem via le champ caché du formulaire document.getElementById("cart_item_mockup").value = response.mockup; window.open(response.mockupUrl, "_blank"); showMockupRefine(response.mockupUrl); } }; request.onerror = () => { button.innerHTML = buttonText; button.style.pointerEvents = ""; sendAlert("danger", errorMessage); }; request.send(formData); } // champs de création, remplacés par le bloc d'affinage une fois la maquette produite const mockupGenerationBlocks = ["mockup-choices", "mockup-description", "mockup-base-file", "generate-mockup-btn"]; function showMockupRefine(mockupUrl) { let block = document.getElementById("mockup-refine"); if (!block) return; toggleMockupGeneration(false); block.classList.remove("d-none"); let link = document.getElementById("current-mockup-link"); if (link) link.href = mockupUrl; let promptEl = document.getElementById("mockup_refine_prompt"); if (promptEl) promptEl.value = ""; } function hideMockupRefine() { let block = document.getElementById("mockup-refine"); if (block) block.classList.add("d-none"); toggleMockupGeneration(true); } function toggleMockupGeneration(visible) { mockupGenerationBlocks.forEach((id) => { let element = document.getElementById(id); if (element) element.classList.toggle("d-none", !visible); }) } let fileInput = document.getElementById("cart_item_designFile_file"); fileInput.addEventListener("input", () => { sendAlert("success", "Un fichier à été selectionné !"); let filename = fileInput.value.split("\\"); filename = filename[filename.length-1]; document.getElementById("file_input_name").innerText = filename }) let mockup_designFile_file = document.getElementById("mockup_designFile_file"); let mockup_designFile_image = document.getElementById("mockup_designFile_image"); // ces champs n'existent que si la section "Maquette" est affichée if (mockup_designFile_file) { mockup_designFile_file.addEventListener("input", () => { sendAlert("success", "Un fichier à été selectionné !"); let filename = mockup_designFile_file.value.split("\\"); filename = filename[filename.length-1]; document.getElementById("mockup_file_input_name").innerText = filename // le visuel a changé : la maquette générée précédemment n'est plus valable let mockupInput = document.getElementById("cart_item_mockup"); if (mockupInput) mockupInput.value = ""; hideMockupRefine(); }) } if (mockup_designFile_image) { mockup_designFile_image.addEventListener("input", () => { if (mockup_designFile_image.files.length < 1) return; let file = mockup_designFile_image.files[0]; let filename = mockup_designFile_image.value.split("\\"); filename = filename[filename.length-1]; let nameEl = document.getElementById("mockup_file_image_name"); let mockupInput = document.getElementById("cart_item_mockup"); // la maquette précédemment liée n'est plus valable tant que l'upload n'a pas abouti if (mockupInput) mockupInput.value = ""; let formData = new FormData(); formData.append("mockup_designFile_image", file); nameEl.innerHTML = `<img src='/images/loading.gif' alt="loading" width="20" height="20">`; let request = new XMLHttpRequest(); request.open("POST", mockup_designFile_image.dataset.uploadUrl, true); request.onload = () => { let response; try { response = JSON.parse(request.response); } catch (e) { nameEl.innerText = filename; sendAlert("danger", "Une erreur est survenue lors de l'envoi de la maquette."); return; } if (response.error) { nameEl.innerText = filename; sendAlert("warning", response.error); } else if (response.mockup) { // lie la maquette uploadée au futur cartItem via le champ caché du formulaire if (mockupInput) mockupInput.value = response.mockup; nameEl.innerText = filename; sendAlert("success", "Maquette enregistrée !"); } }; request.onerror = () => { nameEl.innerText = filename; sendAlert("danger", "Une erreur est survenue lors de l'envoi de la maquette."); }; request.send(formData); }) }