diff options
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 %} |
