Jump to content

MediaWiki:Common.js: Difference between revisions

From Apogea Wiki
Dane (talk | contribs)
Fix sprite preview URL - use API to get actual file path (via update-page on MediaWiki MCP Server)
Dane (talk | contribs)
Scale sprite preview 2x (via update-page on MediaWiki MCP Server)
Line 63: Line 63:
                 console.log('[Apogea] Loading sprite preview for:', fileName);
                 console.log('[Apogea] Loading sprite preview for:', fileName);
                  
                  
                 // Use MediaWiki API to get the actual file URL
                 // Use MediaWiki API to get the actual file URL and dimensions
                 $.ajax({
                 $.ajax({
                     url: mw.util.wikiScript('api'),
                     url: mw.util.wikiScript('api'),
Line 70: Line 70:
                         titles: 'File:' + fileName,
                         titles: 'File:' + fileName,
                         prop: 'imageinfo',
                         prop: 'imageinfo',
                         iiprop: 'url',
                         iiprop: 'url|size',
                         format: 'json'
                         format: 'json'
                     },
                     },
Line 77: Line 77:
                         var pages = data.query.pages;
                         var pages = data.query.pages;
                         var url = null;
                         var url = null;
                        var width = null;
                        var height = null;
                          
                          
                         for (var id in pages) {
                         for (var id in pages) {
                             if (pages[id].imageinfo && pages[id].imageinfo[0]) {
                             if (pages[id].imageinfo && pages[id].imageinfo[0]) {
                                 url = pages[id].imageinfo[0].url;
                                 url = pages[id].imageinfo[0].url;
                                width = pages[id].imageinfo[0].width;
                                height = pages[id].imageinfo[0].height;
                                 break;
                                 break;
                             }
                             }
Line 86: Line 90:
                          
                          
                         if (url) {
                         if (url) {
                             preview.innerHTML = '<img src="' + url + '" alt="' + spriteName + '" class="pixel-sprite" style="image-rendering: pixelated; max-width: 64px;">';
                            // Scale up 2x
                            var scaledWidth = (width || 32) * 2;
                            var scaledHeight = (height || 32) * 2;
                             preview.innerHTML = '<img src="' + url + '" alt="' + spriteName + '" class="pixel-sprite" style="image-rendering: pixelated; width: ' + scaledWidth + 'px; height: ' + scaledHeight + 'px;">';
                         } else {
                         } else {
                             preview.innerHTML = '<span style="color: #c33;">Sprite not found: ' + fileName + '</span>';
                             preview.innerHTML = '<span style="color: #c33;">Sprite not found: ' + fileName + '</span>';

Revision as of 18:57, 29 January 2026

/**
 * Apogea Wiki Common JavaScript
 */

(function() {
    'use strict';

    /**
     * Sprite preview for Page Forms
     */
    function initSpritePreview() {
        console.log('[Apogea] Initializing sprite preview...');
        
        var inputs = document.querySelectorAll('input');
        
        inputs.forEach(function(input) {
            var name = input.getAttribute('name') || '';
            
            // Match sprite fields
            if (name.indexOf('sprite]') === -1) return;
            
            console.log('[Apogea] Found sprite field:', name);
            
            // Skip if already has preview
            if (input.dataset.hasPreview) return;
            input.dataset.hasPreview = 'true';
            
            // Create preview container
            var preview = document.createElement('div');
            preview.className = 'sprite-preview';
            preview.style.cssText = 'margin-top: 5px; min-height: 48px;';
            input.parentNode.appendChild(preview);
            
            // Find corresponding name field
            var container = input.closest('tr') || input.closest('fieldset') || input.parentNode.parentNode;
            var nameInput = null;
            if (container) {
                var allInputs = container.parentNode.querySelectorAll('input');
                allInputs.forEach(function(inp) {
                    var n = inp.getAttribute('name') || '';
                    if (n.indexOf('[name]') !== -1) {
                        nameInput = inp;
                    }
                });
            }
            
            function updatePreview() {
                var spriteName = input.value.trim();
                
                // Fall back to name field if sprite is empty
                if (!spriteName && nameInput) {
                    spriteName = nameInput.value.trim();
                }
                
                if (!spriteName) {
                    preview.innerHTML = '<span style="color: #888;">No preview</span>';
                    return;
                }
                
                // Replace underscores with spaces for the filename
                var fileName = spriteName.replace(/_/g, ' ') + '.png';
                
                console.log('[Apogea] Loading sprite preview for:', fileName);
                
                // Use MediaWiki API to get the actual file URL and dimensions
                $.ajax({
                    url: mw.util.wikiScript('api'),
                    data: {
                        action: 'query',
                        titles: 'File:' + fileName,
                        prop: 'imageinfo',
                        iiprop: 'url|size',
                        format: 'json'
                    },
                    dataType: 'json',
                    success: function(data) {
                        var pages = data.query.pages;
                        var url = null;
                        var width = null;
                        var height = null;
                        
                        for (var id in pages) {
                            if (pages[id].imageinfo && pages[id].imageinfo[0]) {
                                url = pages[id].imageinfo[0].url;
                                width = pages[id].imageinfo[0].width;
                                height = pages[id].imageinfo[0].height;
                                break;
                            }
                        }
                        
                        if (url) {
                            // Scale up 2x
                            var scaledWidth = (width || 32) * 2;
                            var scaledHeight = (height || 32) * 2;
                            preview.innerHTML = '<img src="' + url + '" alt="' + spriteName + '" class="pixel-sprite" style="image-rendering: pixelated; width: ' + scaledWidth + 'px; height: ' + scaledHeight + 'px;">';
                        } else {
                            preview.innerHTML = '<span style="color: #c33;">Sprite not found: ' + fileName + '</span>';
                        }
                    },
                    error: function() {
                        preview.innerHTML = '<span style="color: #888;">Preview unavailable</span>';
                    }
                });
            }
            
            // Update on input change (debounced)
            var timeout;
            input.addEventListener('input', function() {
                clearTimeout(timeout);
                timeout = setTimeout(updatePreview, 500);
            });
            
            // Also update when name field changes
            if (nameInput) {
                nameInput.addEventListener('input', function() {
                    if (!input.value.trim()) {
                        clearTimeout(timeout);
                        timeout = setTimeout(updatePreview, 500);
                    }
                });
            }
            
            // Initial preview
            updatePreview();
        });
    }

    // Run on page load
    function init() {
        console.log('[Apogea] Common.js loaded');
        initSpritePreview();
        
        // Watch for dynamically added fields
        var observer = new MutationObserver(function(mutations) {
            mutations.forEach(function(mutation) {
                if (mutation.addedNodes.length) {
                    initSpritePreview();
                }
            });
        });
        
        var form = document.querySelector('#pfForm, .pfForm, form');
        if (form) {
            observer.observe(form, { childList: true, subtree: true });
        }
    }

    // Wait for DOM and jQuery
    $(document).ready(init);

})();