mwf.xdesktop.requireapp("process.xform", "$module", null, false);
/** @class htmleditor html编辑器。
* @o2cn html编辑器
* @example
* //可以在脚本中获取该组件
* //方法1:
* var htmleditor = this.form.get("name"); //获取组件
* //方法2
* var htmleditor = this.target; //在组件事件脚本中获取
* @extends mwf.xapplication.process.xform.$module
* @o2category formcomponents
* @o2range {process|cms}
* @hideconstructor
*/
mwf.xapplication.process.xform.htmleditor = mwf.apphtmleditor = new class(
/** @lends mwf.xapplication.process.xform.htmleditor# */
{
extends: mwf.app$module,
options: {
/**
* 组件异步加载后触发.
* @event mwf.xapplication.process.xform.htmleditor#afterload
* @see {@link https://www.yuque.com/o2oa/ixsnyt/hm5uft#i0zts|组件事件说明}
*/
"moduleevents": ["queryload", "load", "postload", "afterload"]
},
initialize: function(node, json, form, options){
this.node = $(node);
this.node.store("module", this);
this.json = json;
this.form = form;
this.field = true;
this.fieldmoduleloaded = false;
},
load: function(){
this._loadmoduleevents();
if (this.fireevent("queryload")){
this._queryloaded();
this._loaduserinterface();
this._loadstyles();
//this._loadevents();
this._afterloaded();
this.fireevent("postload");
this.fireevent("load");
}
},
_loaduserinterface: function(){
this.node.empty();
if (this.isreadonly()){
// this.node.set("html", this._getbusinessdata());
this.node.setstyles({
"-webkit-user-select": "text",
"-moz-user-select": "text"
});
if( layout.mobile ){
this.loadlazyimage(function () { //图片懒加载
var images = this.node.getelements("img");
//移动端设置图片宽度为100%
images.each( function( img ){
if( img.hasclass("lozad") ){
img.setstyles({
"max-width" : "100%"
});
}else{
img.setstyles({
"height": "auto",
"max-width" : "100%"
});
}
}.bind(this));
this.fireevent("afterload");
this.fieldmoduleloaded = true;
}.bind(this))
}else{
this.loadlazyimage(function () { //图片懒加载
if(this.json.enablepreview !== "n"){
this.loadimageviewer(); //pc端点击显示大图
this.fireevent("afterload");
this.fieldmoduleloaded = true;
}
}.bind(this));
}
this.node.loadcss("../o2_lib/htmleditor/ckeditor4161/contents_o2.css");
}else{
var config = object.clone(this.json.editorproperties);
if (this.json.config){
if (this.json.config.code){
var obj = this.form.macro.exec(this.json.config.code, this);
object.each(obj, function(v, k){
config[k] = v;
});
}
}
this.loadckeditor(config);
}
// this._loadvalue();
},
loadlazyimage: function(callback){
o2.require("o2.widget.imagelazyloader", function(){
var loadder = new o2.widget.imagelazyloader(this.node, this._getbusinessdata());
loadder.load(function(){
if(callback)callback();
}.bind(this))
}.bind(this));
},
loadimageviewer: function(){
o2.require("o2.widget.imageviewer", function(){
var imageviewer = new o2.widget.imageviewer(this.node);
imageviewer.load();
}.bind(this));
},
loadckeditor: function(config){
common.ajaxmodule.loaddom("ckeditor", function(){
ckeditor.disableautoinline = true;
var editordiv = new element("div").inject(this.node);
var htmldata = this._getbusinessdata();
if (htmldata){
editordiv.set("html", htmldata);
}else if (this.json.templatecode){
editordiv.set("html", this.json.templatecode);
}
var height = this.node.getsize().y;
var editorconfig = config || {};
if (this.form.json.mode==="mobile"){
if (!editorconfig.toolbar && !editorconfig.toolbargroups){
editorconfig.toolbar = [
{ name: 'paragraph', items: [ 'bold', 'italic', "-" , 'textcolor', "bgcolor", 'justifyleft', 'justifycenter', 'justifyright', 'justifyblock', "-", 'undo', 'redo' ] },
{ name: 'basicstyles', items: [ 'styles', 'fontsize']},
{ name: 'insert', items : [ 'image' ] }
];
}
}
editorconfig.base64encode = !layout.mobile && (this.json.base64encode === "y");
editorconfig.enablepreview = (this.json.enablepreview !== "n");
editorconfig.localimagemaxwidth = 2000;
if(this.form.options.macro === "pagecontext"){
editorconfig.reference = this.form.json.id;
editorconfig.referencetype = "portalpage";
}else{
editorconfig.reference = this.form.businessdata.work.job;
editorconfig.referencetype = "processplatformjob";
}
if( editorconfig && editorconfig.extraplugins ){
var extraplugins = editorconfig.extraplugins;
extraplugins = typeof( extraplugins ) === "array" ? extraplugins : extraplugins.split(",");
extraplugins.push( 'lineheight' );
extraplugins.push( 'pagebreak' );
extraplugins.push( 'o2image' );
extraplugins.push( 'o2uploadimage' );
extraplugins.push('o2uploadremoteimage');
editorconfig.extraplugins = extraplugins;
}else{
editorconfig.extraplugins = ['lineheight','pagebreak', 'o2image','o2uploadimage', 'o2uploadremoteimage'];
}
if( editorconfig && editorconfig.removeplugins ){
var removeplugins = editorconfig.removeplugins;
removeplugins = typeof( removeplugins ) === "array" ? removeplugins : removeplugins.split(",");
editorconfig.removeplugins = removeplugins.concat(['image','easyimage','exportpdf','cloudservices']);
}else{
editorconfig.removeplugins = ['image','easyimage','exportpdf','cloudservices'];
}
// ckeditor.basepath = common.contentpath "/res/framework/htmleditor/ckeditor/";
// ckeditor.plugins.basepath = common.contentpath "/res/framework/htmleditor/ckeditor/plugins/";
this.editor = ckeditor.replace(editordiv, editorconfig);
this.editor.addcommand("ecnet", {
exec:function(editor){
this.ecnet();
}.bind(this)
});
this.editor.ui.add('ecnet', ckeditor.ui_button, {
label:mwf.xapplication.process.xform.lp.intelligentcorrection,
icon: '/x_component_process_xform/$form/default/icon/ecnet.png',
command:"ecnet"
});
this._loadevents();
//this.editor.on("loaded", function(){
// this._loadevents();
//}.bind(this));
//this.setdata(data)
this.editor.on("change", function(){
//this._setbusinessdata(this.getdata());
//在数据模板和数据表格中时
if( this.parentline )this._setbusinessdata(this.getdata());
}.bind(this));
if (this.json.ecnet==="y"){
// this.editor.on( "key", function( evt ) {
// // var char = evt.data.domevent.$.char;
// // if ([".", ",", "?", ";", "'", " "].indexof(char)!==-1){
// // this.ecnet(evt.editor.getdata());
// // }
// }.bind(this));
// this.editor.on("blur", function(){
// if (!this.notecnetflag) this.ecnet(this.getdata());
// }.bind(this));
}
this.fireevent("afterload");
this.fieldmoduleloaded = true;
// this._loadevents();
}.bind(this));
},
getecnetstring: function(node, nodes){
for (var i=0; inode.end increment) e = node.end increment;
var length = html.length;
var left = html.substring(0, s);
var ecnetstr = html.substring(s, e);
var right = html.substring(e, html.length);
html = left "" ecnetstr "" right;
increment = (html.length-length);
}.bind(this));
newnode.innerhtml = html;
node.pnode.replacechild(newnode, node.node);
node.pnode.textnode = node.node;
node.pnode.ecnetnode = newnode;
var _self = this;
var editorframe = this.editor.document.$.defaultview.frameelement;
var spans = newnode.getelementsbytagname("span");
if (spans.length){
for (var i = 0; i" node.ecnets[i].correct,
"events": {
"mouseover": function(){this.setstyle("background-color", "#dddddd")},
"mouseout": function(){this.setstyle("background-color", "#ffffff")},
"mousedown": function(){
var ecnetnode = this.getparent();
var node = ecnetnode.node;
var item = ecnetnode.node.ecnets[ecnetnode.idx];
var textnode = node.node.ownerdocument.createtextnode(item.correct);
ecnetnode.span.parentnode.replacechild(textnode, ecnetnode.span);
ecnetnode.destroy();
node.node.nodevalue = node.pnode.ecnetnode.innertext;
node.ecnets.erase(item);
if (!node.ecnets.length){
_self.ecnetnodes.erase(node);
}
}
}
}).inject(ecnetnode);
var ignorenode = new element("div", {
"styles": {
"padding": "3px 10px",
"font-size": "12px",
"cursor": "pointer"
},
"text": mwf.xapplication.process.xform.lp.ignore,
"events": {
"mouseover": function(){this.setstyle("background-color", "#dddddd")},
"mouseout": function(){this.setstyle("background-color", "#ffffff")},
"mousedown": function(){
var ecnetnode = this.getparent();
var node = ecnetnode.node;
var item = ecnetnode.node.ecnets[ecnetnode.idx];
var textnode = node.node.ownerdocument.createtextnode(ecnetnode.span.innertext);
ecnetnode.span.parentnode.replacechild(textnode, ecnetnode.span);
ecnetnode.destroy();
node.node.nodevalue = node.pnode.ecnetnode.innertext;
node.ecnets.erase(item);
if (!node.ecnets.length){
_self.ecnetnodes.erase(node);
}
}
}
}).inject(ecnetnode);
ecnetnode.node = node;
ecnetnode.idx = i;
span.ecnetnode = ecnetnode;
ecnetnode.span = span;
span.addeventlistener("click", function(){
var ecnetnode = this.ecnetnode;
ecnetnode.show();
var y = this.offsettop;
var x = this.offsetleft;
var w = this.offsetwidth;
var h = this.offsetheight;
var p = editorframe.getposition();
var s = ecnetnode.getsize();
var top = y p.y h 5;
var left = x p.x-((s.x-w)/2);
ecnetnode.style.left = "" left "px";
ecnetnode.style.top = "" top "px";
var _span = this;
var hideecnetnode = function(){
ecnetnode.hide();
_span.ownerdocument.removeeventlistener("mousedown", hideecnetnode);
};
this.ownerdocument.addeventlistener("mousedown", hideecnetnode);
});
}
}
}
//node.pnode.ecnetinfornode = ecnetnode;
// var spans = newnode.getelementsbytagname("span");
// if (spans.length){
// var span = spans[0];
// span.addeventlistener("click", function(){
// ecnetnode.style.display = "block";
// var y = span.offsettop;
// var x = span.offsetleft;
// var w = span.offsetwidth;
// var h = span.offsetheight;
// var p = editorframe.getposition();
// var s = ecnetnode.getsize();
// var top = y p.y h 5;
// var left = x p.x-((s.x-w)/2);
//
// ecnetnode.style.left = "" left "px";
// ecnetnode.style.top = "" top "px";
// });
// span.addeventlistener("mouseout", function(){});
// }
},
clearecnetnodes: function(){
if (this.ecnetnodes && this.ecnetnodes.length){
this.ecnetnodes.each(function(node){
if (node.pnode.ecnetnode){
if (node.pnode.ecnetinfornode) node.pnode.ecnetinfornode.destroy();
node.pnode.ecnetinfornode = null;
node.pnode.replacechild(node.pnode.textnode, node.pnode.ecnetnode);
}
}.bind(this));
this.ecnetnodes = [];
}
},
ecnet: function(data){
//this.editor.document.$.body.innertext
var editorframe = this.editor.document.$.defaultview.frameelement;
//var data = this.editor.getdata();
var body = this.editor.document.$.body;
if (!this.ecnetnodes) this.ecnetnodes = [];
if (this.ecnetnodes.length) this.clearecnetnodes();
var nodes = [];
this.ecnetstring = "";
this.getecnetstring(body, nodes);
mwf.actions.get("x_general_assemble_control").ecnetcheck({"value": this.ecnetstring}, function(json){
if (json.data.itemlist && json.data.itemlist.length){
nodes.each(function(node){
var items = [];
json.data.itemlist.each(function(item){
if ((node.end<=item.end && node.end>item.begin) || (node.start>=item.begin && node.startitem.end)){
items.push(item);
}
}.bind(this));
if (items.length){
node.ecnets = items;
this.ecnetnodes.push(node);
}
}.bind(this));
this.ecnetnodes.each(function(node){
this.createecnetnode(node);
}.bind(this));
// var item = json.data.itemlist[0];
// var left = data.substring(0, item.begin);
// var ecnetstr = data.substring(item.begin, item.end);
// var right = data.substring(item.end, data.length);
//
// var newdata = left "" ecnetstr "" right;
//this.editor.document.$.body.setselectionrange(item.begin, item.end);
//this.editor.setdata(newdata);
// var iframe = editorframe.clone();
// iframe.inject(this.node);
// iframe.position({
// "relativeto": editorframe,
// "position": 'upperleft',
// "edge": 'upperleft'
// });
// iframe.contentwindow.document.body.set("html", newdata);
}else{
body = null;
nodes = null;
}
}.bind(this));
},
_loadevents: function(editorconfig){
object.each(this.json.events, function(e, key){
if (e.code){
this.editor.on(key, function(event){
return this.form.macro.fire(e.code, this, event);
}.bind(this), this);
}
}.bind(this));
},
addmoduleevent: function(key, fun){
this.editor.on(key, function(event){
return (fun) ? fun(this, event) : null;
}.bind(this), this);
},
_loadvalue: function(){
var data = this._getbusinessdata();
},
// /**
// * @summary 重置组件的值为默认值或置空。
// * @example
// * this.form.get('fieldid').resetdata();
// */
resetdata: function(){
this.setdata(this._getbusinessdata());
},
/**
* @summary 判断组件值是否为空.
* @example
* if( this.form.get('fieldid').isempty() ){
* this.form.notice('html编辑器不能为空', 'warn');
* }
* @return {boolean} 值是否为空.
*/
isempty : function(){
return !this.getdata().trim();
},
/**
* 当表单上没有对应组件的时候,可以使用this.data[fieldid]获取值,但是this.form.get('fieldid')无法获取到组件。
* @summary 获取组件值。
* @example
* var data = this.form.get('fieldid').getdata();
* @example
* //如果无法确定表单上是否有组件,需要判断
* var data;
* if( this.form.get('fieldid') ){ //判断表单是否有无对应组件
* data = this.form.get('fieldid').getdata();
* }else{
* data = this.data['fieldid']; //直接从数据中获取字段值
* }
* @return 组件的数据.
*/
getdata: function(){
this.clearecnetnodes();
return this.editor ? this.editor.getdata() : this._getbusinessdata();
},
/**
* 当表单上没有对应组件的时候,可以使用this.data[fieldid] = data赋值。
* @summary 为组件赋值。
* @param data{string} .
* @example
* this.form.get("fieldid").setdata("test"); //赋文本值
* @example
* //如果无法确定表单上是否有组件,需要判断
* if( this.form.get('fieldid') ){ //判断表单是否有无对应组件
* this.form.get('fieldid').setdata( data );
* }else{
* this.data['fieldid'] = data;
* }
*/
setdata: function(data){
this._setbusinessdata(data);
if (this.editor) this.editor.setdata(data);
},
destroy: function(){
if( this.editor )this.editor.destroy();
},
createerrornode: function(text){
var node = new element("div");
var iconnode = new element("div", {
"styles": {
"width": "20px",
"height": "20px",
"float": "left",
"background": " center center no-repeat"
}
}).inject(node);
var textnode = new element("div", {
"styles": {
"line-height": "20px",
"margin-left": "20px",
"color": "red",
"word-break": "keep-all"
},
"text": text
}).inject(node);
return node;
},
notvalidationmode: function(text){
if (!this.isnotvalidationmode){
this.isnotvalidationmode = true;
this.node.store("borderstyle", this.node.getstyles("border-left", "border-right", "border-top", "border-bottom"));
this.node.setstyle("border", "1px solid red");
this.errnode = this.createerrornode(text).inject(this.node, "after");
this.shownotvalidationmode(this.node);
if (!this.errnode.isintoview()) this.errnode.scrollintoview(false);
}
},
shownotvalidationmode: function(node){
var p = node.getparent("div");
if (p){
if (p.get("mwftype") == "tab$content"){
if (p.getparent("div").getstyle("display")=="none"){
var contentareanode = p.getparent("div").getparent("div");
var tabareanode = contentareanode.getprevious("div");
var idx = contentareanode.getchildren().indexof(p.getparent("div"));
var tabnode = tabareanode.getlast().getfirst().getchildren()[idx];
tabnode.click();
p = tabareanode.getparent("div");
}
}
this.shownotvalidationmode(p);
}
},
validationmode: function(){
if (this.isnotvalidationmode){
this.isnotvalidationmode = false;
this.node.setstyles(this.node.retrieve("borderstyle"));
if (this.errnode){
this.errnode.destroy();
this.errnode = null;
}
}
},
validationconfigitem: function(routename, data){
var flag = (data.status=="all") ? true: (routename == data.decision);
if (flag){
var n = this.getdata();
var v = (data.valuetype=="value") ? n : n.length;
switch (data.operateor){
case "isnull":
if (!v){
this.notvalidationmode(data.prompt);
return false;
}
break;
case "notnull":
if (v){
this.notvalidationmode(data.prompt);
return false;
}
break;
case "gt":
if (v>data.value){
this.notvalidationmode(data.prompt);
return false;
}
break;
case "lt":
if (v"); //excel字段换行是
this.exceldata = data;
this.setdata(data, true);
},
validationexcel: function () {
if (!this.isreadonly()){
var errorlist = this.validationconfigexcel();
if (errorlist.length) return errorlist;
if (!this.json.validation) return [];
if (!this.json.validation.code) return [];
var flag = this.form.macro.exec(this.json.validation.code, this);
if (!flag) flag = mwf.xapplication.process.xform.lp.notvalidation;
if (flag.tostring() !== "true") {
return [flag];
}
}
return [];
},
validationconfigexcel: function () {
var errorlist = [];
if (this.json.validationconfig){
if (this.json.validationconfig.length){
for (var i=0; idata.value)return data.prompt;
break;
case "lt":
if (v