Files
Minecraft-Modern-Theme/Minecraft-Modern-Theme/js/mm-announcement-admin.js
2026-01-09 20:45:33 +01:00

159 lines
6.1 KiB
JavaScript

(function($){
$(document).ready(function(){
const fonts = window.MM_Announcement_Fonts || {};
const current = window.MM_Announcement_Current || {};
const fontSelect = $('#mm-announcement-font');
const sizeInput = $('#mm-announcement-size');
const bgInput = $('#mm-announcement-bg');
const colorInput = $('#mm-announcement-color');
const previewText = $('#mm-announcement-preview-text');
const previewWrap = $('#mm-announcement-preview');
const positionSelect = $('#mm-announcement-position');
// Helper: lädt Google-Font-Link oder updatet existing
function ensureGoogleFont(googleName) {
if (!googleName) return;
const id = 'mm-admin-google-font';
const href = 'https://fonts.googleapis.com/css2?family=' + encodeURIComponent(googleName) + ':wght@400;700&display=swap';
let link = document.getElementById(id);
if (link) {
if (link.getAttribute('href') !== href) link.setAttribute('href', href);
} else {
link = document.createElement('link');
link.id = id;
link.rel = 'stylesheet';
link.href = href;
document.head.appendChild(link);
}
}
// Update preview appearance based on font key
function updatePreviewForFontKey(key) {
const meta = fonts[key];
if (!meta) {
previewText.css('font-family', '');
return;
}
previewText.css('font-family', meta.css);
if (meta.google && meta.google_name) {
ensureGoogleFont(meta.google_name);
}
}
// Update size/colors/position UI
function updateSizeAndColors() {
const size = parseInt(sizeInput.val(), 10) || 16;
previewText.css('font-size', size + 'px');
previewWrap.css('background', bgInput.val());
previewWrap.css('color', colorInput.val());
}
// Read content from wp_editor (TinyMCE) or textarea
function getEditorText() {
// Try TinyMCE first
if ( typeof tinymce !== 'undefined' ) {
try {
const ed = tinymce.get('mm_announcement_text');
if (ed && !ed.isHidden()) {
// getContent then strip tags
const html = ed.getContent({format: 'html'});
const tmp = document.createElement('div');
tmp.innerHTML = html;
return tmp.textContent || tmp.innerText || '';
}
} catch (e) {
// ignore
}
}
// Fallback to textarea
const ta = $('#mm_announcement_text');
if (ta.length) {
const tmp = document.createElement('div');
tmp.innerHTML = ta.val();
return tmp.textContent || tmp.innerText || '';
}
return '';
}
// Update preview text from editor content
function updatePreviewTextFromEditor() {
const text = getEditorText();
if (text && text.trim().length) {
previewText.text(text.trim());
} else {
previewText.text(current.text || 'Das ist eine Vorschau: Wie sieht die Schrift aus?');
}
}
// Initialize controls with current settings
if (current.font) {
updatePreviewForFontKey(current.font);
fontSelect.val(current.font);
} else {
updatePreviewForFontKey(fontSelect.val());
}
if (current.size) sizeInput.val(current.size);
if (current.bg) bgInput.val(current.bg);
if (current.color) colorInput.val(current.color);
updateSizeAndColors();
updatePreviewTextFromEditor();
// Attach events --------------------------------------------------
// font change
fontSelect.on('change', function(){
const key = $(this).val();
updatePreviewForFontKey(key);
});
// size/color/position change
sizeInput.on('input change', updateSizeAndColors );
bgInput.on('input change', updateSizeAndColors );
colorInput.on('input change', updateSizeAndColors );
// Editor changes:
// - TinyMCE: listen for keyup / change events when editor is ready
// - Textarea: listen for input
function attachEditorListeners() {
// TinyMCE
if ( typeof tinymce !== 'undefined' ) {
const ed = tinymce.get('mm_announcement_text');
if (ed) {
ed.on('keyup change NodeChange', function(){
updatePreviewTextFromEditor();
});
}
}
// Textarea fallback
$('#mm_announcement_text').on('input change', function(){
updatePreviewTextFromEditor();
});
}
// TinyMCE initialisation might be async — poll short time then attach
let tries = 0;
const waitForEditor = setInterval(function(){
tries++;
if ( (typeof tinymce !== 'undefined' && tinymce.get('mm_announcement_text')) || $('#mm_announcement_text').length ) {
clearInterval(waitForEditor);
attachEditorListeners();
} else if (tries > 30) { // about 3s
clearInterval(waitForEditor);
// still attach textarea event just in case
$('#mm_announcement_text').on('input change', updatePreviewTextFromEditor);
}
}, 100);
// Also update preview when the form is programmatically changed (e.g., quicktags)
$(document).on('change', '#mm-announcement-font, #mm-announcement-size, #mm-announcement-bg, #mm-announcement-color', function(){
updateSizeAndColors();
updatePreviewForFontKey($('#mm-announcement-font').val());
updatePreviewTextFromEditor();
});
});
})(jQuery);