diff options
| author | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-07-16 10:24:27 +0200 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-07-16 10:25:50 +0200 | 
| commit | 5511e44f8bf92addeaadc9ddcf39fb8e27f9c50c (patch) | |
| tree | c621737b9c4f522aa9aacbb1013713ea40fe0533 /chimere/templates/tinymce/tinymce_init.js | |
| parent | a6db3281d61e57a33526ef3794bc60ed24415ff2 (diff) | |
| download | Chimère-5511e44f8bf92addeaadc9ddcf39fb8e27f9c50c.tar.bz2 Chimère-5511e44f8bf92addeaadc9ddcf39fb8e27f9c50c.zip | |
Fix tinymce reinit on ajax call
Diffstat (limited to 'chimere/templates/tinymce/tinymce_init.js')
| -rw-r--r-- | chimere/templates/tinymce/tinymce_init.js | 84 | 
1 files changed, 84 insertions, 0 deletions
| diff --git a/chimere/templates/tinymce/tinymce_init.js b/chimere/templates/tinymce/tinymce_init.js new file mode 100644 index 0000000..8ebceb3 --- /dev/null +++ b/chimere/templates/tinymce/tinymce_init.js @@ -0,0 +1,84 @@ +(function($) { +  {% if is_admin_inline %} +  $(function() { +  {% endif %} +    function tinymce4_init(selector) { +      var tinymce4_config = { +        {% for key, value in callbacks.items %} +          '{{ key }}': {{ value|safe }}, +        {% endfor %} +        setup: function (editor) { +          editor.on('change', function () { +            editor.save(); +          }); +        }, +        {{ tinymce_config|safe }} +      }; +      if (typeof selector != 'undefined') { +        tinymce4_config['selector'] = selector; +      } +      // only the next line is added in chimere to force reinit +      tinymce.remove(tinymce4_config['selector']); +      tinymce.init(tinymce4_config); +    } // End tinymce4_init +{% if not is_admin_inline %} +    tinymce4_init(); +})(); +{% else %} +    // Add TinyMCE 4 widgets to textaras inside a node +    function add_editors(node) { +      $(node).find('.tinymce4-editor').each(function(i, elem) { +        if ($(elem).css('display') != 'none' && elem.id.indexOf('__prefix__') == -1) { +          tinymce4_init(elem.tagName + '#' + elem.id); +        } +      }); +    } + +    // Remove TinyMCE 4 widgets from textareas inside a node +    function remove_editors(node) { +      $(node).find('.tinymce4-editor').each(function(i, elem) { +        $(tinymce.EditorManager.editors).each(function(i, editor) { +          if (editor.id == elem.id) { +            editor.remove(); +          } +        }); +      }); +    } + +    // Restore consistency of TinyMCE 4 widgets +    function refresh_editors() { +      $(tinymce.EditorManager.editors).each(function(i, editor) { +        var elem = editor.getElement(); +        if (editor.id != elem.id) { +          editor.remove(); +          tinymce4_init(elem.tagName + '#' + elem.id); +        } +      }); +    } + +    // Use MutationObserver to track adding or removing Django admin inline formsets +    // to add adn remove TinyMCE editor widgets. +    var observer = new MutationObserver(function(mutations) { +      $(mutations).each(function(i, mutation) { +        $(mutation.addedNodes).each(function(i, node) { +          // Add TinyMCE widgets to new textareas. +          add_editors(node); +        }); // End addedNodes +        $(mutation.removedNodes).each(function(i, node) { +          // Remove TinyMCE widgets from textareas inside removed nodes. +          remove_editors(node); +          // Refresh remaining TinyMCE widgets to return them to consistent state +          // After removing an inline formset, Django admin scripts +          // change IDs of remaining textareas, +          // so textarea ID != ID of the TinyMCE instance attached to it. +          refresh_editors(); +        }); // End removedNodes +      }); // End mutations +    }); // End MutationObserver + +    $('div.inline-group').each(function (index, node) { +        observer.observe(node, { childList: true, subtree: true }) +    }); +  }); // End document.ready +})(django.jQuery); +{% endif %} | 
