Files
awo-hamburg-intranet/module/tasks/assets/js/task_cert_quill_editor.js

79 lines
2.8 KiB
JavaScript
Raw Normal View History

(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, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
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;
}
});
})();