79 lines
2.8 KiB
JavaScript
79 lines
2.8 KiB
JavaScript
|
|
(function () {
|
||
|
|
'use strict';
|
||
|
|
|
||
|
|
var textarea = document.getElementById('description');
|
||
|
|
if (!textarea) return;
|
||
|
|
|
||
|
|
var form = textarea.closest('form');
|
||
|
|
if (!form) return;
|
||
|
|
|
||
|
|
// Create editor container
|
||
|
|
var editorContainer = document.createElement('div');
|
||
|
|
editorContainer.id = 'description-editor';
|
||
|
|
textarea.parentNode.insertBefore(editorContainer, textarea.nextSibling);
|
||
|
|
|
||
|
|
// Hide original textarea
|
||
|
|
textarea.style.display = 'none';
|
||
|
|
|
||
|
|
// Determine initial content
|
||
|
|
var initialContent = textarea.value || '';
|
||
|
|
var isHtml = /<[a-z][\s\S]*>/i.test(initialContent);
|
||
|
|
|
||
|
|
// Better-Table-Modul registrieren (idempotent)
|
||
|
|
if (typeof quillBetterTable !== 'undefined') {
|
||
|
|
Quill.register({ 'modules/better-table': quillBetterTable }, true);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Initialize Quill auf Goldstandard-Compact (kein Image/Video)
|
||
|
|
var quill = new Quill('#description-editor', {
|
||
|
|
theme: 'snow',
|
||
|
|
placeholder: 'Beschreibung eingeben...',
|
||
|
|
modules: {
|
||
|
|
toolbar: {
|
||
|
|
container: window.QuillToolbarPresets.compact(),
|
||
|
|
handlers: {
|
||
|
|
table: function () {
|
||
|
|
var tableModule = this.quill.getModule('better-table');
|
||
|
|
if (tableModule) tableModule.insertTable(3, 3);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
table: false,
|
||
|
|
'better-table': window.QuillToolbarPresets.betterTableConfig(),
|
||
|
|
keyboard: (typeof quillBetterTable !== 'undefined')
|
||
|
|
? { bindings: quillBetterTable.keyboardBindings }
|
||
|
|
: undefined,
|
||
|
|
imageResize: true
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
// Load existing content via dangerouslyPasteHTML statt innerHTML —
|
||
|
|
// so behält Quill 2.x auch alte Listen-Strukturen korrekt.
|
||
|
|
if (initialContent !== '') {
|
||
|
|
if (isHtml) {
|
||
|
|
quill.clipboard.dangerouslyPasteHTML(0, initialContent, 'silent');
|
||
|
|
} else {
|
||
|
|
// Plain text: convert newlines to paragraphs
|
||
|
|
var paragraphs = initialContent.split(/\n\n+/);
|
||
|
|
var html = paragraphs.map(function (p) {
|
||
|
|
var escaped = p.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
||
|
|
escaped = escaped.replace(/\n/g, '<br>');
|
||
|
|
return '<p>' + escaped + '</p>';
|
||
|
|
}).join('');
|
||
|
|
quill.clipboard.dangerouslyPasteHTML(0, html, 'silent');
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Sync Quill content to textarea before form submit
|
||
|
|
form.addEventListener('submit', function () {
|
||
|
|
var html = quill.root.innerHTML || '';
|
||
|
|
|
||
|
|
// Treat Quill empty state as empty string
|
||
|
|
if (html === '<p><br></p>' || html.replace(/<p>\s*<br\s*\/?>\s*<\/p>/g, '').trim() === '') {
|
||
|
|
textarea.value = '';
|
||
|
|
} else {
|
||
|
|
textarea.value = html;
|
||
|
|
}
|
||
|
|
});
|
||
|
|
})();
|