178 lines
4.8 KiB
JavaScript
178 lines
4.8 KiB
JavaScript
define([
|
|
'summernote/core/agent', 'summernote/core/dom',
|
|
'summernote/core/range',
|
|
'summernote/settings',
|
|
'summernote/EventHandler', 'summernote/Renderer',
|
|
'summernote/core/list', // odoo change for overwrite
|
|
'summernote/core/key' // odoo change for overwrite
|
|
], function (agent, dom, range, settings, EventHandler, Renderer, list, key) { // odoo change for overwrite
|
|
// jQuery namespace for summernote
|
|
$.summernote = $.summernote || {};
|
|
|
|
// extends default `settings`
|
|
$.extend($.summernote, settings);
|
|
|
|
var renderer = new Renderer();
|
|
var eventHandler = new EventHandler();
|
|
|
|
$.extend($.summernote, {
|
|
renderer: renderer,
|
|
eventHandler: eventHandler,
|
|
core: {
|
|
agent: agent,
|
|
dom: dom,
|
|
range: range,
|
|
list: list, // odoo change for overwrite
|
|
key: key // odoo change for overwrite
|
|
},
|
|
pluginEvents: {}
|
|
});
|
|
|
|
/**
|
|
* addPlugin
|
|
*
|
|
* @param {Object} plugin
|
|
*/
|
|
$.summernote.addPlugin = function (plugin) {
|
|
if (plugin.buttons) {
|
|
$.each(plugin.buttons, function (name, button) {
|
|
renderer.addButtonInfo(name, button);
|
|
});
|
|
}
|
|
|
|
if (plugin.dialogs) {
|
|
$.each(plugin.dialogs, function (name, dialog) {
|
|
renderer.addDialogInfo(name, dialog);
|
|
});
|
|
}
|
|
|
|
if (plugin.events) {
|
|
$.each(plugin.events, function (name, event) {
|
|
$.summernote.pluginEvents[name] = event;
|
|
});
|
|
}
|
|
|
|
if (plugin.langs) {
|
|
$.each(plugin.langs, function (locale, lang) {
|
|
if ($.summernote.lang[locale]) {
|
|
$.extend($.summernote.lang[locale], lang);
|
|
}
|
|
});
|
|
}
|
|
|
|
if (plugin.options) {
|
|
$.extend($.summernote.options, plugin.options);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* extend jquery fn
|
|
*/
|
|
$.fn.extend({
|
|
/**
|
|
* initialize summernote
|
|
* - create editor layout and attach Mouse and keyboard events.
|
|
*
|
|
* @param {Object} options
|
|
* @returns {this}
|
|
*/
|
|
summernote: function (options) {
|
|
// extend default options
|
|
options = $.extend({}, $.summernote.options, options);
|
|
|
|
// Include langInfo in options for later use, e.g. for image drag-n-drop
|
|
// Setup language info with en-US as default
|
|
options.langInfo = $.extend(true, {}, $.summernote.lang['en-US'], $.summernote.lang[options.lang]);
|
|
|
|
this.each(function (idx, holder) {
|
|
var $holder = $(holder);
|
|
|
|
// createLayout with options
|
|
renderer.createLayout($holder, options);
|
|
|
|
var info = renderer.layoutInfoFromHolder($holder);
|
|
eventHandler.attach(info, options);
|
|
|
|
// Textarea: auto filling the code before form submit.
|
|
if (dom.isTextarea($holder[0])) {
|
|
$holder.closest('form').submit(function () {
|
|
var contents = $holder.code();
|
|
$holder.val(contents);
|
|
|
|
// callback on submit
|
|
if (options.onsubmit) {
|
|
options.onsubmit(contents);
|
|
}
|
|
});
|
|
}
|
|
});
|
|
|
|
// focus on first editable element
|
|
if (this.first().length && options.focus) {
|
|
var info = renderer.layoutInfoFromHolder(this.first());
|
|
info.editable.focus();
|
|
}
|
|
|
|
// callback on init
|
|
if (this.length && options.oninit) {
|
|
options.oninit();
|
|
}
|
|
|
|
return this;
|
|
},
|
|
//
|
|
|
|
/**
|
|
* get the HTML contents of note or set the HTML contents of note.
|
|
*
|
|
* @param {String} [sHTML] - HTML contents(optional, set)
|
|
* @returns {this|String} - context(set) or HTML contents of note(get).
|
|
*/
|
|
code: function (sHTML) {
|
|
// get the HTML contents of note
|
|
if (sHTML === undefined) {
|
|
var $holder = this.first();
|
|
if (!$holder.length) { return; }
|
|
var info = renderer.layoutInfoFromHolder($holder);
|
|
if (!!(info && info.editable)) {
|
|
var isCodeview = info.editor.hasClass('codeview');
|
|
if (isCodeview && agent.hasCodeMirror) {
|
|
info.codable.data('cmEditor').save();
|
|
}
|
|
return isCodeview ? info.codable.val() : info.editable.html();
|
|
}
|
|
return dom.isTextarea($holder[0]) ? $holder.val() : $holder.html();
|
|
}
|
|
|
|
// set the HTML contents of note
|
|
this.each(function (i, holder) {
|
|
var info = renderer.layoutInfoFromHolder($(holder));
|
|
if (info && info.editable) { info.editable.html(sHTML); }
|
|
});
|
|
|
|
return this;
|
|
},
|
|
|
|
/**
|
|
* destroy Editor Layout and detach Key and Mouse Event
|
|
*
|
|
* @returns {this}
|
|
*/
|
|
destroy: function () {
|
|
this.each(function (idx, holder) {
|
|
var $holder = $(holder);
|
|
|
|
var info = renderer.layoutInfoFromHolder($holder);
|
|
if (!info || !info.editable) { return; }
|
|
|
|
var options = info.editor.data('options');
|
|
|
|
eventHandler.detach(info, options);
|
|
renderer.removeLayout($holder, info, options);
|
|
});
|
|
|
|
return this;
|
|
}
|
|
});
|
|
});
|