Holger Brunn
11 years ago
6 changed files with 360 additions and 0 deletions
-
22web_ckeditor4/__init__.py
-
114web_ckeditor4/__openerp__.py
-
6web_ckeditor4/static/src/css/web_ckeditor4.css
-
BINweb_ckeditor4/static/src/img/icon.png
-
1web_ckeditor4/static/src/js/ckeditor_basepath.js
-
217web_ckeditor4/static/src/js/web_ckeditor4.js
@ -0,0 +1,22 @@ |
|||||
|
# -*- encoding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# OpenERP, Open Source Management Solution |
||||
|
# This module copyright (C) 2013 Therp BV (<http://therp.nl>) |
||||
|
# All Rights Reserved |
||||
|
# |
||||
|
# This program is free software: you can redistribute it and/or modify |
||||
|
# it under the terms of the GNU Affero General Public License as |
||||
|
# published by the Free Software Foundation, either version 3 of the |
||||
|
# License, or (at your option) any later version. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU Affero General Public License for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU Affero General Public License |
||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
|
@ -0,0 +1,114 @@ |
|||||
|
# -*- encoding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# OpenERP, Open Source Management Solution |
||||
|
# This module copyright (C) 2013 Therp BV (<http://therp.nl>) |
||||
|
# All Rights Reserved |
||||
|
# |
||||
|
# This program is free software: you can redistribute it and/or modify |
||||
|
# it under the terms of the GNU Affero General Public License as |
||||
|
# published by the Free Software Foundation, either version 3 of the |
||||
|
# License, or (at your option) any later version. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU Affero General Public License for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU Affero General Public License |
||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
|
||||
|
{ |
||||
|
'name': 'CKEditor 4.x widget', |
||||
|
'version': '1.0', |
||||
|
'description': """ |
||||
|
This addon provides a widget for editing html fields via CKEditor 4.x |
||||
|
|
||||
|
Use widget="text_html" if you need just html display. In the unlikely case |
||||
|
you need specific features of ckeditor, use widget="text_ckeditor4". |
||||
|
""", |
||||
|
'author': 'Therp BV', |
||||
|
'website': 'http://www.therp.nl', |
||||
|
"category": "Tools", |
||||
|
"depends": [ |
||||
|
'web', |
||||
|
], |
||||
|
'css': [ |
||||
|
'static/src/css/web_ckeditor4.css', |
||||
|
], |
||||
|
'data': [ |
||||
|
], |
||||
|
'js': [ |
||||
|
'static/src/js/ckeditor_basepath.js', |
||||
|
'static/lib/ckeditor/ckeditor.js', |
||||
|
'static/lib/ckeditor/config.js', |
||||
|
#to debug ckeditor, comment the lines above, |
||||
|
#do a |
||||
|
#cd static/lib |
||||
|
#git clone https://github.com/ckeditor/ckeditor-dev.git trunk |
||||
|
#cd trunk |
||||
|
#git checkout remotes/origin/release/4.1.x |
||||
|
#and uncomment the lines below |
||||
|
# 'static/lib/trunk/ckeditor.js', |
||||
|
# 'static/lib/trunk/core/event.js', |
||||
|
# 'static/lib/trunk/core/editor_basic.js', |
||||
|
# 'static/lib/trunk/core/env.js', |
||||
|
# 'static/lib/trunk/core/ckeditor_basic.js', |
||||
|
# 'static/lib/trunk/core/dom.js', |
||||
|
# 'static/lib/trunk/core/tools.js', |
||||
|
# 'static/lib/trunk/core/dtd.js', |
||||
|
# 'static/lib/trunk/core/dom/event.js', |
||||
|
# 'static/lib/trunk/core/dom/domobject.js', |
||||
|
# 'static/lib/trunk/core/dom/node.js', |
||||
|
# 'static/lib/trunk/core/dom/window.js', |
||||
|
# 'static/lib/trunk/core/dom/document.js', |
||||
|
# 'static/lib/trunk/core/dom/nodelist.js', |
||||
|
# 'static/lib/trunk/core/dom/element.js', |
||||
|
# 'static/lib/trunk/core/dom/documentfragment.js', |
||||
|
# 'static/lib/trunk/core/dom/walker.js', |
||||
|
# 'static/lib/trunk/core/dom/range.js', |
||||
|
# 'static/lib/trunk/core/dom/iterator.js', |
||||
|
# 'static/lib/trunk/core/command.js', |
||||
|
# 'static/lib/trunk/core/ckeditor_base.js', |
||||
|
# 'static/lib/trunk/core/config.js', |
||||
|
# 'static/lib/trunk/core/filter.js', |
||||
|
# 'static/lib/trunk/core/focusmanager.js', |
||||
|
# 'static/lib/trunk/core/keystrokehandler.js', |
||||
|
# 'static/lib/trunk/core/lang.js', |
||||
|
# 'static/lib/trunk/core/scriptloader.js', |
||||
|
# 'static/lib/trunk/core/resourcemanager.js', |
||||
|
# 'static/lib/trunk/core/plugins.js', |
||||
|
# 'static/lib/trunk/core/ui.js', |
||||
|
# 'static/lib/trunk/core/editor.js', |
||||
|
# 'static/lib/trunk/core/htmlparser.js', |
||||
|
# 'static/lib/trunk/core/htmlparser/basicwriter.js', |
||||
|
# 'static/lib/trunk/core/htmlparser/node.js', |
||||
|
# 'static/lib/trunk/core/htmlparser/comment.js', |
||||
|
# 'static/lib/trunk/core/htmlparser/text.js', |
||||
|
# 'static/lib/trunk/core/htmlparser/cdata.js', |
||||
|
# 'static/lib/trunk/core/htmlparser/fragment.js', |
||||
|
# 'static/lib/trunk/core/htmlparser/filter.js', |
||||
|
# 'static/lib/trunk/core/htmldataprocessor.js', |
||||
|
# 'static/lib/trunk/core/htmlparser/element.js', |
||||
|
# 'static/lib/trunk/core/template.js', |
||||
|
# 'static/lib/trunk/core/ckeditor.js', |
||||
|
# 'static/lib/trunk/core/creators/inline.js', |
||||
|
# 'static/lib/trunk/core/creators/themedui.js', |
||||
|
# 'static/lib/trunk/core/editable.js', |
||||
|
# 'static/lib/trunk/core/selection.js', |
||||
|
# 'static/lib/trunk/core/style.js', |
||||
|
# 'static/lib/trunk/core/dom/comment.js', |
||||
|
# 'static/lib/trunk/core/dom/elementpath.js', |
||||
|
# 'static/lib/trunk/core/dom/text.js', |
||||
|
# 'static/lib/trunk/core/dom/rangelist.js', |
||||
|
# 'static/lib/trunk/core/skin.js', |
||||
|
# 'static/lib/trunk/core/_bootstrap.js', |
||||
|
#end of ckeditor debug |
||||
|
'static/src/js/web_ckeditor4.js', |
||||
|
], |
||||
|
'installable': True, |
||||
|
'auto_install': False, |
||||
|
'certificate': '', |
||||
|
} |
@ -0,0 +1,6 @@ |
|||||
|
.openerp .oe_form_field_text_ckeditor4.disabled, .openerp td.oe_form_field_text_ckeditor4, .openerp .oe_form_field_text_ckeditor4_raw.disabled.openerp, .openerp td.oe_form_field_text_ckeditor4_raw { |
||||
|
/* here we need to reset openerp's styles to |
||||
|
* have the HTML display as (probably) intended |
||||
|
*/ |
||||
|
white-space: normal; |
||||
|
} |
After Width: 80 | Height: 80 | Size: 8.1 KiB |
@ -0,0 +1 @@ |
|||||
|
CKEDITOR_BASEPATH='/web_ckeditor4/static/lib/ckeditor/' |
@ -0,0 +1,217 @@ |
|||||
|
/* -*- encoding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# OpenERP, Open Source Management Solution |
||||
|
# This module copyright (C) 2013 Therp BV (<http://therp.nl>)
|
||||
|
# All Rights Reserved |
||||
|
# |
||||
|
# This program is free software: you can redistribute it and/or modify |
||||
|
# it under the terms of the GNU Affero General Public License as |
||||
|
# published by the Free Software Foundation, either version 3 of the |
||||
|
# License, or (at your option) any later version. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU Affero General Public License for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU Affero General Public License |
||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
# |
||||
|
############################################################################*/ |
||||
|
|
||||
|
openerp.web_ckeditor4 = function(openerp) |
||||
|
{ |
||||
|
var ckeditor_addFunction_org = CKEDITOR.tools.addFunction; |
||||
|
//this is a quite complicated way to kind of monkey patch the private
|
||||
|
//method onDomReady of ckeditor's plugin wysiwigarea, which causes problems
|
||||
|
//when the editor is about to be destroyed but because of OpenERP's
|
||||
|
//architecture updated one last time with its current value
|
||||
|
CKEDITOR.tools.addFunction = function(fn, scope) |
||||
|
{ |
||||
|
if(scope && scope._ && scope._.attrChanges && scope._.detach) |
||||
|
{ |
||||
|
var scope_reference = scope; |
||||
|
return ckeditor_addFunction_org(function() |
||||
|
{ |
||||
|
var self = this, |
||||
|
self_arguments=arguments; |
||||
|
setTimeout(function() |
||||
|
{ |
||||
|
if(CKEDITOR.instances[self.editor.name]) |
||||
|
{ |
||||
|
fn.apply(self, self_arguments); |
||||
|
} |
||||
|
}, 0); |
||||
|
}, scope); |
||||
|
} |
||||
|
return ckeditor_addFunction_org(fn, scope); |
||||
|
}; |
||||
|
|
||||
|
CKEDITOR.on('dialogDefinition', function(e) |
||||
|
{ |
||||
|
_.each(e.data.definition.contents, function(element) |
||||
|
{ |
||||
|
if(element.filebrowser!='uploadButton') |
||||
|
{ |
||||
|
return |
||||
|
} |
||||
|
_.each(element.elements, function(element) |
||||
|
{ |
||||
|
if(!element.onClick || element.type!='fileButton') |
||||
|
{ |
||||
|
return |
||||
|
} |
||||
|
var onClick_org = element.onClick; |
||||
|
element.onClick = function(e1) |
||||
|
{ |
||||
|
onClick_org.apply(this, arguments); |
||||
|
_.each(jQuery('#'+this.domId).closest('table') |
||||
|
.find('iframe').contents().find(':file') |
||||
|
.get(0).files, |
||||
|
function(file) |
||||
|
{ |
||||
|
var reader = new FileReader(); |
||||
|
reader.onload = function(load_event) |
||||
|
{ |
||||
|
CKEDITOR.tools.callFunction( |
||||
|
e.editor._.filebrowserFn, |
||||
|
load_event.target.result, |
||||
|
''); |
||||
|
} |
||||
|
reader.readAsDataURL(file); |
||||
|
}); |
||||
|
return false; |
||||
|
} |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
|
||||
|
openerp.web.form.widgets.add('text_ckeditor4', |
||||
|
'openerp.web_ckeditor4.FieldCKEditor4'); |
||||
|
openerp.web.form.widgets.add('text_ckeditor4_raw', |
||||
|
'openerp.web_ckeditor4.FieldCKEditor4Raw'); |
||||
|
openerp.web.form.widgets.add('text_html', |
||||
|
'openerp.web_ckeditor4.FieldCKEditor4'); |
||||
|
openerp.web.form.widgets.add('html', |
||||
|
'openerp.web_ckeditor4.FieldCKEditor4'); |
||||
|
|
||||
|
function filter_html(value, ckeditor_filter, ckeditor_writer) |
||||
|
{ |
||||
|
var fragment = CKEDITOR.htmlParser.fragment.fromHtml(value); |
||||
|
ckeditor_filter.applyTo(fragment); |
||||
|
ckeditor_writer.reset(); |
||||
|
fragment.writeHtml(ckeditor_writer); |
||||
|
return ckeditor_writer.getHtml(); |
||||
|
}; |
||||
|
|
||||
|
default_ckeditor_filter = new CKEDITOR.filter( |
||||
|
{ |
||||
|
'*': |
||||
|
{ |
||||
|
attributes: 'href,src,style,alt,width,height,dir', |
||||
|
styles: '*', |
||||
|
classes: '*', |
||||
|
}, |
||||
|
'html head title meta style body p div span a h1 h2 h3 h4 h5 img br hr table tr th td ul ol li dd dt strong pre b i': true, |
||||
|
}); |
||||
|
default_ckeditor_writer = new CKEDITOR.htmlParser.basicWriter(); |
||||
|
|
||||
|
openerp.web_ckeditor4.FieldCKEditor4 = openerp.web.form.FieldText.extend({ |
||||
|
ckeditor_config: { |
||||
|
removePlugins: 'iframe,flash,forms,smiley,pagebreak,stylescombo', |
||||
|
filebrowserImageUploadUrl: 'dummy', |
||||
|
extraPlugins: 'filebrowser', |
||||
|
}, |
||||
|
ckeditor_filter: default_ckeditor_filter, |
||||
|
ckeditor_writer: default_ckeditor_writer, |
||||
|
start: function() |
||||
|
{ |
||||
|
this._super.apply(this, arguments); |
||||
|
|
||||
|
CKEDITOR.lang.load(openerp.session.user_context.lang.split('_')[0], 'en', function() {}); |
||||
|
}, |
||||
|
initialize_content: function() |
||||
|
{ |
||||
|
var self = this; |
||||
|
this._super.apply(this, arguments); |
||||
|
if(!this.$textarea) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
this.editor = CKEDITOR.replace(this.$textarea.get(0), |
||||
|
_.extend( |
||||
|
{ |
||||
|
language: openerp.session.user_context.lang.split('_')[0], |
||||
|
on: |
||||
|
{ |
||||
|
'change': function() |
||||
|
{ |
||||
|
self.store_dom_value(); |
||||
|
}, |
||||
|
}, |
||||
|
}, |
||||
|
this.ckeditor_config)); |
||||
|
}, |
||||
|
store_dom_value: function() |
||||
|
{ |
||||
|
this.internal_set_value(this.editor ? this.editor.getData() : openerp.web.parse_value(this.get('value'), this)); |
||||
|
}, |
||||
|
filter_html: function(value) |
||||
|
{ |
||||
|
return filter_html(value, this.ckeditor_filter, this.ckeditor_writer); |
||||
|
}, |
||||
|
render_value: function() |
||||
|
{ |
||||
|
if(this.get("effective_readonly")) |
||||
|
{ |
||||
|
this.$el.html(this.filter_html(this.get('value'))); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
if(this.editor) |
||||
|
{ |
||||
|
var self = this; |
||||
|
if(this.editor.status != 'ready') |
||||
|
{ |
||||
|
var instanceReady = function() |
||||
|
{ |
||||
|
self.editor.setData(self.get('value') || ''); |
||||
|
self.editor.removeListener('instanceReady', instanceReady); |
||||
|
}; |
||||
|
this.editor.on('instanceReady', instanceReady); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
self.editor.setData(self.get('value') || ''); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
undelegateEvents: function() |
||||
|
{ |
||||
|
this._cleanup_editor(); |
||||
|
return this._super.apply(this, arguments); |
||||
|
}, |
||||
|
_cleanup_editor: function() |
||||
|
{ |
||||
|
if(this.editor) |
||||
|
{ |
||||
|
CKEDITOR.remove(this.editor); |
||||
|
this.editor.removeAllListeners(); |
||||
|
this.editor = null; |
||||
|
} |
||||
|
}, |
||||
|
destroy_content: function() |
||||
|
{ |
||||
|
this._cleanup_editor(); |
||||
|
} |
||||
|
}); |
||||
|
openerp.web_ckeditor4.FieldCKEditor4Raw = openerp.web_ckeditor4.FieldCKEditor4.extend({ |
||||
|
filter_html: function(value) |
||||
|
{ |
||||
|
return value; |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue