From fe304be167d0306d9e5161ed504b107117b59841 Mon Sep 17 00:00:00 2001
From: Jan-Hendrik Willms <tleilax+studip@gmail.com>
Date: Mon, 9 Dec 2024 12:32:47 +0000
Subject: [PATCH] set wysiwyg editor to readonly mode when disabled or readonly
 attribute is set and let ir react to dynamic changes of these attributes,
 fixes #4979

Closes #4979

Merge request studip/studip!3738
---
 resources/assets/javascripts/lib/wysiwyg.js | 26 +++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/resources/assets/javascripts/lib/wysiwyg.js b/resources/assets/javascripts/lib/wysiwyg.js
index 09ad4770c76..1cc90e004c5 100644
--- a/resources/assets/javascripts/lib/wysiwyg.js
+++ b/resources/assets/javascripts/lib/wysiwyg.js
@@ -39,6 +39,27 @@ const wysiwyg = {
 
 export default wysiwyg;
 
+const observeTextarea = (() => {
+    const observer = new MutationObserver(mutations => {
+        mutations.forEach(mutation => {
+            const editor = getEditor(mutation.target);
+            const disabledFromAttributes = mutation.target.matches('[readonly],[disabled]');
+            const disabledFromEditor = editor.isReadOnly;
+
+            if (disabledFromAttributes && !disabledFromEditor) {
+                editor.enableReadOnlyMode('studip');
+            } else if (!disabledFromAttributes && disabledFromEditor) {
+                editor.disableReadOnlyMode('studip');
+            }
+        });
+    });
+
+    return textarea => observer.observe(textarea, {
+        attributes: true,
+        attributeFilter: ['disabled', 'readonly'],
+    });
+})();
+
 async function replaceTextarea(textarea) {
     if (hasEditor(textarea)) {
         return getEditor(textarea);
@@ -54,6 +75,11 @@ async function replaceTextarea(textarea) {
     const editor = await createEditor(chunk, textarea, editorType, options);
     enhanceEditor($textarea, editor);
 
+    if ($textarea[0].matches('[readonly],[disabled]')) {
+        editor.enableReadOnlyMode('studip');
+    }
+    observeTextarea($textarea[0]);
+
     setEditor(textarea, editor);
     $textarea.trigger('load.wysiwyg');
 
-- 
GitLab