1(function () { 2 'use strict'; 3 4 const config = window.LamasonSkuListUrlBuilder || {}; 5 const i18n = Object.assign({ 6 generating: 'Generando URL...', 7 generated: 'URL generada.', 8 copied: 'URL copiada.', 9 copyError: 'No se pudo copiar la URL.', 10 openError: 'No se pudo abrir la URL.' 11 }, config.i18n || {}); 12 13 function findRoot(element) { 14 return element.closest('[data-lamason-sku-url-builder]'); 15 } 16 17 function setFeedback(root, message, type) { 18 const feedback = root.querySelector('[data-lamason-sku-url-feedback]'); 19 20 if (!feedback) { 21 return; 22 } 23 24 feedback.textContent = message || ''; 25 feedback.classList.remove('is-error', 'is-success'); 26 27 if (type) { 28 feedback.classList.add('is-' + type); 29 } 30 } 31 32 function setLoading(root, isLoading) { 33 const submit = root.querySelector('[data-lamason-sku-url-submit]'); 34 35 if (!submit) { 36 return; 37 } 38 39 submit.disabled = isLoading; 40 submit.setAttribute('aria-busy', isLoading ? 'true' : 'false'); 41 } 42 43 function showResult(root, url) { 44 const result = root.querySelector('[data-lamason-sku-url-result]'); 45 const output = root.querySelector('[data-lamason-sku-url-output]'); 46 47 if (!result || !output) { 48 return; 49 } 50 51 output.value = url; 52 result.hidden = false; 53 } 54 55 function getResultUrl(root) { 56 const output = root.querySelector('[data-lamason-sku-url-output]'); 57 58 return output ? output.value : ''; 59 } 60 61 function copyWithFallback(input) { 62 input.focus(); 63 input.select(); 64 input.setSelectionRange(0, input.value.length); 65 66 return document.execCommand('copy'); 67 } 68 69 function copyUrl(root) { 70 const output = root.querySelector('[data-lamason-sku-url-output]'); 71 72 if (!output || !output.value) { 73 return; 74 } 75 76 if (navigator.clipboard && navigator.clipboard.writeText) { 77 navigator.clipboard.writeText(output.value) 78 .then(function () { 79 setFeedback(root, i18n.copied, 'success'); 80 }) 81 .catch(function () { 82 const copied = copyWithFallback(output); 83 setFeedback(root, copied ? i18n.copied : i18n.copyError, copied ? 'success' : 'error'); 84 }); 85 86 return; 87 } 88 89 const copied = copyWithFallback(output); 90 setFeedback(root, copied ? i18n.copied : i18n.copyError, copied ? 'success' : 'error'); 91 } 92 93 function openUrl(root) { 94 const url = getResultUrl(root); 95 96 if (!url) { 97 return; 98 } 99 100 const opened = window.open(url, '_blank', 'noopener'); 101 102 if (!opened) { 103 setFeedback(root, i18n.openError, 'error'); 104 } 105 } 106 107 function generateUrl(root) { 108 const input = root.querySelector('[data-lamason-sku-url-input]'); 109 const result = root.querySelector('[data-lamason-sku-url-result]'); 110 const skus = input ? input.value.trim() : ''; 111 112 if (!skus) { 113 setFeedback(root, 'Ingresa al menos un SKU.', 'error'); 114 return; 115 } 116 117 if (result) { 118 result.hidden = true; 119 } 120 121 setLoading(root, true); 122 setFeedback(root, i18n.generating, ''); 123 124 const data = new FormData(); 125 data.append('action', config.action); 126 data.append('nonce', config.nonce); 127 data.append('skus', skus); 128 129 fetch(config.ajaxUrl, { 130 method: 'POST', 131 credentials: 'same-origin', 132 body: data 133 }) 134 .then(function (response) { 135 return response.json(); 136 }) 137 .then(function (payload) { 138 if (!payload || !payload.success) { 139 throw new Error(payload && payload.data && payload.data.message ? payload.data.message : 'No se pudo generar la URL.'); 140 } 141 142 showResult(root, payload.data.url); 143 setFeedback(root, i18n.generated, 'success'); 144 }) 145 .catch(function (error) { 146 setFeedback(root, error.message, 'error'); 147 }) 148 .finally(function () {
149 setLoading(root, false); 150 }); 151 } 152 153 document.addEventListener('submit', function (event) { 154 const form = event.target.closest('[data-lamason-sku-url-form]'); 155 156 if (!form) { 157 return; 158 } 159 160 event.preventDefault(); 161 162 const root = findRoot(form); 163 164 if (root) { 165 generateUrl(root); 166 } 167 }); 168 169 document.addEventListener('click', function (event) { 170 const copyButton = event.target.closest('[data-lamason-sku-url-copy]'); 171 const openButton = event.target.closest('[data-lamason-sku-url-open]'); 172 const button = copyButton || openButton; 173 174 if (!button) { 175 return; 176 } 177 178 const root = findRoot(button); 179 180 if (!root) { 181 return; 182 } 183 184 if (copyButton) { 185 copyUrl(root); 186 } 187 188 if (openButton) { 189 openUrl(root); 190 } 191 }); 192})();
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.