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