Beide Module wurden aus einem anderen Kundenprojekt kopiert und bereinigt: Knowledgecenter: - Bild-Cache (1.985 Dateien) geleert, Ordnerstruktur mit .gitkeep behalten - Files-Gallery-Lizenzschlüssel entfernt (config.php) - Kundenspezifische Kategorien gelöscht: Teil I/II/III QM-Struktur, nummerierte QM-Kapitel, Gremien (Präsidium/Finanzausschuss/Landesausschuss), Sitzungsservice-Serie, Protokoll-Abteilungen, Testeinträge - 56 generische Kategorien bleiben (Downloads, Onboarding, Personalthemen …) Tasks: - Alle Betriebsdaten gelöscht (114 Tasks, 914 Submissions, 579 Assignments) - Task-Definitionen und Verlinkungen geleert - Kategoriestruktur bleibt (Allgemein, IT, Personal, Buchhaltung …) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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;
|
|
}
|
|
});
|
|
})();
|