1(function () { 2 function parseTemplates(raw) { 3 if (!raw) return []; 4 try { 5 var parsed = JSON.parse(raw); 6 return Array.isArray(parsed) ? parsed : []; 7 } catch (e) { 8 return []; 9 } 10 } 11 12 function cleanBase(name) { 13 name = String(name || '').trim(); 14 if (!name) return ''; 15 16 var parts = name.split(':'); 17 name = parts[parts.length - 1] || ''; 18 name = name.replace(/\.[a-z0-9]+$/i, ''); 19 name = name.replace(/[^a-zA-Z0-9_\-]/g, '_').replace(/^_+|_+$/g, ''); 20 return name; 21 } 22 23 function updateChoices(variant, filename, pageName, templates) { 24 var selected = filename.value; 25 filename.innerHTML = ''; 26 27 var variantKey = variant.value === 'small' ? 'small' : 'big'; 28 var seen = {}; 29 30 (templates[variantKey] || []).forEach(function (tpl) { 31 var resolved = String(tpl || '').replace(/~pagename~/g, pageName); 32 var base = cleanBase(resolved); 33 if (!base || seen[base]) return; 34 35 seen[base] = true; 36 var option = document.createElement('option'); 37 option.value = base; 38 option.textContent = base + '.ext'; 39 filename.appendChild(option); 40 }); 41 42 for (var i = 0; i < filename.options.length; i++) { 43 if (filename.options[i].value === selected) { 44 filename.selectedIndex = i; 45 return; 46 } 47 } 48 49 filename.selectedIndex = filename.options.length ? 0 : -1; 50 } 51 52 function initForm(form) { 53 var variant = form.querySelector('#pagesicon_icon_variant'); 54 var filename = form.querySelector('#pagesicon_icon_filename'); 55 if (!variant || !filename) return; 56 57 var pageName = form.dataset.pageName || ''; 58 var templates = { 59 big: parseTemplates(form.dataset.bigTemplates), 60 small: parseTemplates(form.dataset.smallTemplates) 61 }; 62 63 variant.addEventListener('change', function () { 64 updateChoices(variant, filename, pageName, templates); 65 }); 66 67 updateChoices(variant, filename, pageName, templates); 68 } 69 70 document.addEventListener('DOMContentLoaded', function () { 71 document.querySelectorAll('.pagesicon-upload-form').forEach(initForm); 72 }); 73})(); 74