xref: /plugin/pagesicon/script/upload-form.js (revision b603bbe1e83f2122ab63b4df278133cf619e6be8)
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