1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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 %}
|