PageSourceSearch

https://charybde.alwaysdata.net/assets/bundle/393.ef6c566f.js

js charybde.alwaysdata.net collected 2026-10-09 18:22:52 UTC 9,175 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[393,792],{792(e,n,t){function i(e){var n=document.createElement("template");return e=e.trim(),n.innerHTML=e,n.content.firstChild}t.d(n,{default:()=>i})},393(e,n,t){t.d(n,{default:()=>a});var i=t(792);class a{constructor(){this.tableBody=document.querySelector("#shipping-table tbody"),this.addRangeButton=document.querySelector("#add-range"),this.addRangeButton.addEventListener("click",async()=>{const e=document.querySelector("#new-range-form"),n=await this.renderForm({},t=>{t.preventDefault();const i=new Biblys.Notification("Ajout en cours…",{loader:!0,sticky:!0});this.send(n).then(n=>{i.remove(),e.innerHTML="",this.fees.push(n),this.render(),new Biblys.Notification(`L'option <strong>${n.mode}</strong> a bien été ajoutée.`,{type:"success"})})});e.appendChild(n)}),this.getAll()}getAll(){return this.setLoadingState(!0),fetch("/api/admin/shipping",{headers:{Accept:"application/json"}}).then(e=>e.json()).then(e=>{if(e.error)throw e.error.message;this.setLoadingState(!1),this.fees=e,this.render()}).catch(window._alert)}send(e){const n=e.id.value?`/api/admin/shipping/${e.id.value}`:"/api/admin/shipping",t=e.id.value?"PUT":"POST";return fetch(n,{method:t,credentials:"same-origin",headers:{Accept:"application/json"},body:JSON.stringify(Object.fromEntries(new FormData(e)))}).then(e=>e.json()).then(e=>{if(e.error)throw e.error;return e}).catch(window._alert)}setLoadingState(e){this.tableBody.innerHTML=e?'<tr><td colspan="1">Chargement…</tr></td>':""}render(){this.tableBody.innerHTML="";this.fees.map(e=>this.renderRow(e)).forEach(e=>this.tableBody.appendChild(e))}renderRow(e){let n="",t="";e.is_compliant_with_french_law||(t='<span class="fa fa-exclamation-triangle" title="Ce tarif n\'est pas conforme à la loi française"></span>',n="table-warning");const a=(0,i.default)(`\n      <tr class="${n}">\n        <td>${t} ${e.mode}</td>\n        <td>${e.type}</td>\n        <td>${e.zone_name}</td>\n        <td class="nowrap">${this.renderConditions(e)}</td>\n        <td class="right">${window.currency(parseInt(e.fee)/100)}</td>\n      </tr>\n    `),o=(0,i.default)('<td class="action-buttons"></td>');return o.appendChild(this.renderEditIcon(e,a)),o.appendChild(this.renderArchiveIcon(e,a)),o.appendChild(this.renderDeleteIcon(e)),a.appendChild(o),a}renderEditIcon(e,n){const t=(0,i.default)('<span class="btn btn-primary btn-sm">\n        <span class="fa fa-pencil pointer" aria-label="modifier l\'option\'"></span>\n      </span>');return t.addEventListener("click",()=>this.onRangeEditButtonClick(e,n)),t}onRangeEditButtonClick(e,n){window.confirm(`Modifier une option existante peut impacter les commandes en cours. Il est recommandé de créer une nouvelle option et d'archiver l'ancienne plutôt que de modifier une option existante. Voulez-vous vraiment modifier l'option ${e.mode}?`)&&this.showRangeEditForm(e,n)}renderArchiveIcon(e){const n=(0,i.default)('<span class="btn btn-warning btn-sm">\n        <span class="fa fa-archive pointer" aria-label="Archiver l\'option"></span>\n      </span>');return n.addEventListener("click",()=>this.archiveRange(e)),n}renderDeleteIcon(e){const n=(0,i.default)('<span class="btn btn-danger btn-sm">\n        <span class="fa fa-trash-can pointer" aria-label="Supprimer l\'option"></span>\n      </span>');return n.addEventListener("click",()=>this.deleteRange(e)),n}renderConditions(e){const[n,t,i,a]=[e.max_weight,e.min_amount,e.max_amount,e.max_articles].map(e=>null===e?null:parseInt(e));let o=[];return null!==n&&o.push(`≤ ${n} g`),null!==t&&o.push(`≥ ${window.currency(t/100)}`),null!==i&&o.push(`≤ ${window.currency(i/100)}`),null!==a&&o.push(`≤ ${a} articles`),o.join("<br/>")}async renderForm({id:e="",mode:n="",type:t="",zone_id:i="",max_weight:a="",min_amount:o="",max_amount:s="",max_articles:r="",fee:l="",info:d=""},c){const m=await fetch("/api/admin/shipping/zones",{headers:{Accept:"application/json"}}),p=`\n      <input type="hidden" id="id" name="id" value="${e}">\n\n      <div class="form-group">\n        <label class="col-form-label label-inline" for="mode">Intitulé :</label>\n        <input type="text" id="mode" name="mode" class="form-control" value="${n}" required>\n      </div>\n\n      <div class="form-group">\n        <label class="col-form-label label-inline" for="mode">Type d'envoi :</label>\n        <select id="type" name="type" class="form-control" required>\n          <option value="normal" ${"normal"===t?"selected":""}>Normal</option>\n          <option value="colissimo" ${"colissimo"===t?"selected":""}>Colissimo</option>\n          <option value="mondial-relay" ${"mondial-relay"===t?"selected":""}>Mondial Relay</option>\n          <option value="magasin" ${"magasin"===t?"selected":""}>Retrait en magasin</option>\n        </select>\n      </div>\n\n      <div class="form-group">\n        <label class="col-form-label label-inline" for="zone_id">Zone :</label>\n        <select id="zone_id" name="zone_id" class="form-control" required>\n          ${(await m.json()).map(e=>`<option value="${e.id}" ${i===e.id?"selected":""}>${e.name}</option>`).join("")}\n        </select>\n      </div>\n\n      <fieldset>\n        <legend>Conditions</legend>\n\n        <p>\n          Cette option d'expédition sera proposée au client si la commande :\n        </p>\n\n        <div class="form-group">\n          <label class="col-form-label label-inline" for="max_weight">… a un poids (en grammes) inférieur ou égal à :</label>\n          <input type="number" min="1" step="1" id="max_weight" name="max_weight" class="form-control" value="${a}">\n        </div>\n\n        <div class="form-group">\n          <label class="col-form-label label-inline" for="min_amount">… a un montant (en centimes) supérieur ou égal à :</label>\n          <input type="number" min="1" step="1" id="min_amount" name="min_amount" class="form-control" value="${o}">\n        </div>\n\n        <div class="form-group">\n          <label class="col-form-label label-inline" for="max_amount">… a un montant (en centimes) inférieur ou égal à :</label>\n          <input type="number" min="1" step="1" id="max_amount" name="max_amount" class="form-control" value="${s}">\n        </div>\n\n        <div class="form-group">\n          <label class="col-form-label label-inline" for="max_articles">… a un nombre d'exemplaires inférieur ou égal à :</label>\n          <input type="number" min="1" step="1" id="max_articles" name="max_articles" class="form-control" value="${r}">\n        </div>\n\n      </fieldset>\n\n      <div class="form-group">\n        <label class="col-form-label label-inline" for="fee">Montant (en centimes) :</label>\n        <input type="number" min="0" step="1" id="fee" name="fee" class="form-control" value="${l}" required>\n      </div>\n\n      <div class="form-group">\n        <label class="col-form-label label-inline" for="info">Commentaire (affiché au client lorsqu'il choisit ce mode) :</label>\n        <input type="text" id="info" name="info" class="form-control" value="${null===d?"":d}">\n      </div>\n\n      <div class="form-group text-center">\n        <button type="submit" class="btn btn-primary">${""===e?"Ajouter":"Modifier"}</button>\n      </div>\n    `,u=document.createElement("form");return u.classList.add("fieldset"),u.innerHTML=p,u.addEventListener("submit",c.bind(this)),u}archiveRange(e){if(!window.confirm(`Voulez-vous vraiment archiver l'option ${e.mode}?`))return;const n=new Biblys.Notification("Archivage en cours…",{loader:!0,sticky:!0});fetch(`/api/admin/shipping/${e.id}/archive`,{method:"POST",credentials:"same-origin",headers:{Accept:"application/json"}}).then(e=>this._handleEmptyResponse(n,e)).then(()=>{new Biblys.Notification(`L'option <strong>${e.mode}</strong> a bien été archivée.`,{type:"success"}),this.fees=this.fees.filter(n=>n.id!==e.id),this.render()}).catch(window._alert)}deleteRange(e){if(!window.confirm(`Voulez-vous vraiment supprimer l'option ${e.mode}?`))return;const n=new Biblys.Notification("Suppression en cours…",{loader:!0,sticky:!0});fetch(`/api/admin/shipping/${e.id}`,{method:"DELETE",credentials:"same-origin",headers:{Accept:"application/json"}}).then(e=>this._handleEmptyResponse(n,e)).then(()=>{new Biblys.Notification(`L'option <strong>${e.mode}</strong> a bien été supprimée.`,{type:"success"}),this.fees=this.fees.filter(n=>n.id!==e.id),this.render()}).catch(window._alert)}async _handleEmptyResponse(e,n){if(e.remove(),204===n.status)return;const t=await n.json();if(t.error)throw t.error.message;throw new Error("Une erreur est survenue.")}async showRangeEditForm(e,n){const t=(0,i.default)("<tr></tr>"),a=(0,i.default)("<td colspan=8></td>"),o=await this.renderForm(e,n=>{n.preventDefault();const i=new Biblys.Notification(`Mise à jour de <strong>${e.mode}</strong> en cours…`,{loader:!0,sticky:!0});this.send(o).then(e=>{i.remove(),t.remove();const n=this.fees.findIndex(n=>e.id===n.id);this.fees[n]=e,this.render(),new Biblys.Notification(`L'option <strong>${e.mode}</strong> a bien été mise à jour.`,{type:"success"})})});t.appendChild(a),a.appendChild(o),n.after(t)}}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.