o2oa api: x-游戏厅捕鱼达人

source

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
网站地图