O2OA API

source

x_component_process_Xform/$Selector.js

o2.xDesktop.requireApp("process.Xform", "$Input", null, false);
/** @classdesc $Selector 组件类,此类为所有可选组件的父类
 * @class
 * @hideconstructor
 * @o2category FormComponents
 * @extends MWF.xApplication.process.Xform.$Input
 * @abstract
 */
MWF.xApplication.process.Xform.$Selector = MWF.APP$Selector = new Class(
    /** @lends MWF.xApplication.process.Xform.$Selector# */
{
    Extends: MWF.APP$Input,

    /**
     * 组件加载后触发。如果选项加载为异步,则异步处理完成后触发此事件
     * @event MWF.xApplication.process.Xform.$Selector#load
     * @see {@link https://www.yuque.com/o2oa/ixsnyt/hm5uft#i0zTS|组件事件说明}
     */

    _showValue: function (node, value) {
        var optionItems = this.getOptions();
        if (optionItems && typeOf(optionItems.then) === "function") {
            optionItems.then(function (opt) {
                this.__showValue(node, value, opt)
            }.bind(this));
        } else {
            this.__showValue(node, value, optionItems)
        }
    },
    /**
     * @summary 刷新选择项,如果选择项是脚本,重新计算。
     * @example
     * this.form.get('fieldId').resetOption();
     */
    resetOption: function () {
        this.node.empty();
        this.setOptions();
        this.fireEvent("resetOption");
    },
    /**
     * @summary 获取选择项。
     * @return {Array | Promise} 返回选择项数组或Promise,如:<pre><code class='language-js'>[
     *  "女|female",
     *  "男|male"
     * ]</code></pre>
     * @example
     * this.form.get('fieldId').getOptions();
     * @example
     * //异步
     * var opt = this.form.get('fieldId').getOptions();
     * Promise.resolve(opt).then(function(options){
     *     //options为选择项数组
     * })
     */
    getOptions: function (async, refresh) {
        this.optionsCache = null;
        var opt = this._getOptions(async, refresh);
        if ((opt && typeOf(opt.then) === "function")) {
            var p = Promise.resolve(opt).then(function (option) {
                this.moduleSelectAG = null;
                this.optionsCache = (option || []);
                return this.optionsCache;
            }.bind(this));
            this.moduleSelectAG = p;
            return p;
        } else {
            this.optionsCache = (opt || []);
            return this.optionsCache;
        }
    },
    _getOptions: function (async, refresh) {
        debugger;
        switch (this.json.itemType) {
            case "values":
                return this.json.itemValues;
            case "script":
                return this.form.Macro.exec(((this.json.itemScript) ? this.json.itemScript.code : ""), this);
            default:
                break;
        }

        var opts, firstOpts = this.getFirstOption();
        switch (this.json.itemType) {
            case "dict":
                opts = this.getOptionsWithDict(async, refresh);
                break;
            case "view":
                opts = this.getOptionsWithView(async, refresh);
                break;
            case "statement":
                opts = this.getOptionsWithStatement(async, refresh);
                break;
        }
        if (opts && typeOf(opts.then) === "function") {
            return Promise.resolve(opts).then(function (opts) {
                return this._contactOption(firstOpts, opts);
            }.bind(this));
        } else {
            return this._contactOption(firstOpts, opts);
        }
        // if( (defaultOpts && typeOf(defaultOpts.then) === "function" ) || (opts && typeOf(opts.then) === "function" ) ){
        //     return Promise.all( [defaultOpts, opts] ).then(function (arr) {
        //         return this._contactOption( arr[0], arr[1] );
        //     }.bind(this));
        // }else{
        //     return this._contactOption( defaultOpts, opts );
        // }
    },
    _contactOption: function (opt1, opt2) {
        var optA, optB;
        if (!opt1) opt1 = [];
        if (!opt2) opt2 = [];
        optA = typeOf(opt1) !== "array" ? [opt1] : opt1;
        optB = typeOf(opt2) !== "array" ? [opt2] : opt2;
        optA.each(function (o) {
            if (o) optB.unshift(o);
        });
        return optB;
    },
    getFirstOption: function () {
        //return this.form.Macro.exec(((this.json.defaultOptionsScript) ? this.json.defaultOptionsScript.code : ""), this);
        if (!this.json.firstOptionEnable) return [];
        return [this.json.firstOption || "|"];
    },

    /**
     * @summary 获取整理后的选择项。
     * @param {Boolean} [refresh] 是否忽略缓存重新计算可选项。
     * @return {Object} 返回整理后的选择项数组或Promise,如:
     * <pre><code class='language-js'>{"valueList": ["","female","male"], "textList": ["","女","男"]}
     * </code></pre>
     * @example
     * var optionData = this.form.get('fieldId').getOptionsObj();
     * @example
     * //异步
     * var opt = this.form.get('fieldId').getOptionsObj(true);
     * Promise.resolve(opt).then(function(optionData){
     *     //optionData为选择项
     * })
     */
    getOptionsObj: function (refresh) {
        var optionItems = (refresh !== true && this.optionsCache) ? this.optionsCache : this.getOptions();
        if (optionItems && typeOf(optionItems.then) === "function") {
            return Promise.resolve(optionItems).then(function (optItems) {
                return this._getOptionsObj(optItems);
            }.bind(this));
        } else {
            return this._getOptionsObj(optionItems);
        }
    },
    _getOptionsObj: function (optItems) {
        var textList = [];
        var valueList = [];
        optItems.each(function (item) {
            var tmps = item.split("|");
            textList.push(tmps[0]);
            valueList.push(tmps[1] || tmps[0]);
        });
        return {textList: textList, valueList: valueList};
    },

    setOptions: function () {
        var optionItems = this.getOptions();
        this._setOptions(optionItems);
    },

    /**
     * @summary 获取选中项的value和text。
     * @return {Object} 返回选中项的value和text,如:
     * <pre><code class='language-js'>{"value": ["male"], "text": ["男"]}
     * {"value": [""], "text": [""]}
     * </code></pre>
     * @example
     * var data = this.form.get('fieldId').getTextData();
     * var text = data.text[0] //获取选中项的文本
     */
    getTextData: function () {
        var ops;
        if (this.isReadonly()) {
            ops = this.getOptionsObj();
            var data = this._getBusinessData();
            var d = typeOf(data) === "array" ? data : [data];
            if (ops && typeOf(ops.then) === "function") {
                return Promise.resolve(ops).then(function (opts) {
                    return this._getTextData(d, opts)
                }.bind(this));
            } else {
                return this._getTextData(d, ops)
            }
        } else {
            return this._getInputTextData();
        }
    },
    _getTextData: function (d, opts) {
        var value = [], text = [];
        d.each(function (v) {
            var idx = opts.valueList.indexOf(v);
            value.push(v || "");
            text.push(idx > -1 ? opts.textList[idx] : (v || ""));
        });
        if (!value.length) value = [""];
        if (!text.length) text = [""];
        return {"value": value, "text": text};
    },


    getOptionsWithDict: function (async, refresh) {
        if (!this.json.itemDict || !this.json.itemDict.length) return [];
        var obj = this.json.itemDict[0];
        var dict = new this.form.Macro.environment.Dict({
            "type": obj.appType,
            "application": obj.appId,
            "name": obj.id
        });

        var paths = (this.json.itemDictPath || "").split("/");
        paths.splice(0, 1); //第一个是root,删掉
        var path = paths.length ? paths.join(".") : null;

        var asy = o2.typeOf(async) === "boolean" ? async : (this.json.itemDictAsync !== false);
        var data = dict.get(path, null, null, asy, refresh === true);
        if (data && typeOf(data.then) === "function") {
            return data.then(function (data) {
                return this.parseDictOptions(data);
            }.bind(this));
        } else {
            return this.parseDictOptions(data);
        }
    },
    getString: function (d) {
        switch (o2.typeOf(d)) {
            case "null":
                return "";
            case "string":
                return d;
            case "boolean":
            case "number":
            case "date":
                return d.toString();
            default:
                return "";
        }
    },
    parseDictOptions: function (d) {
        var arr = [], value, text, valuekey = this.json.dictValueKey, textkey = this.json.dictTextKey;
        switch (o2.typeOf(d)) {
            case "array":
                d.each(function (i) {
                    switch (o2.typeOf(i)) {
                        case "object":
                            if (valuekey && textkey) {
                                value = this.getString(i[valuekey]);
                                text = this.getString(i[textkey]);
                                arr.push(text + "|" + value);
                            } else if (valuekey) {
                                arr.push(this.getString(i[valuekey]));
                            } else if (textkey) {
                                arr.push(this.getString(i[textkey]));
                            }
                            break;
                        case "null":
                            break;
                        default:
                            arr.push(i.toString());
                            break;
                    }
                }.bind(this));
                return arr;
            case "object":
                Object.each(d, function (i, key) {
                    switch (o2.typeOf(i)) {
                        case "object":
                            if (valuekey && textkey) {
                                value = this.getString(i[valuekey]);
                                text = this.getString(i[textkey]);
                                arr.push(value + "|" + text);
                            } else if (valuekey) {
                                arr.push(this.getString(i[valuekey]));
                            } else if (textkey) {
                                arr.push(this.getString(i[textkey]));
                            }
                            break;
                        case "null":
                            break;
                        default:
                            arr.push(i.toString() + "|" + key.toString());
                            break;
                    }
                }.bind(this))
                return arr;
            case "null":
                return [];
            default:
                return [d.toString()];
        }
    },
    getOptionsWithView: function (async, refresh) {
        if (!this.json.itemView) return [];
        var obj = this.json.itemView;

        var asy = o2.typeOf(async) === "boolean" ? async : (this.json.itemViewAsync !== false);

        var filter = [];
        if (this.json.viewFilterList && this.json.viewFilterList.length) {
            this.json.viewFilterList.each(function (entry) {
                entry.value = this.form.Macro.exec(entry.code.code, this);
                filter.push(entry);
            }.bind(this));
        }

        var data = this.form.Macro.environment.view.lookup({
            "view": obj.id,
            "application": obj.application,
            "filter": filter
        }, null, asy);
        if (data && typeOf(data.then) === "function") {
            return data.then(function (data) {
                return this.parseViewOptions(data);
            }.bind(this));
        } else {
            return this.parseViewOptions(data);
        }
    },
    parseViewOptions: function (json) {
        var arr = [], value, text, valuekey = this.json.viewValueColumn, textkey = this.json.viewTextColumn;
        json.grid.each(function (d) {
            var i = d.data || {};
            if (valuekey && textkey) {
                value = valuekey === "bundle" ? d.bundle : (this.getString(i[valuekey]));
                text = textkey === "bundle" ? d.bundle : (this.getString(i[textkey]));
                arr.push(text + "|" + value);
            } else if (valuekey) {
                arr.push(valuekey === "bundle" ? d.bundle : (this.getString(i[valuekey])));
            } else if (textkey) {
                arr.push(textkey === "bundle" ? d.bundle : (this.getString(i[textkey])));
            }
        }.bind(this))
        return arr.unique();
    },

    getOptionsWithStatement: function (async, refresh) {
        if (!this.json.itemStatement) return [];
        var obj = this.json.itemStatement;

        var asy = o2.typeOf(async) === "boolean" ? async : (this.json.itemViewAsync !== false);

        var filter = [];
        if (this.json.statementFilterList && this.json.statementFilterList.length) {
            this.json.statementFilterList.each(function (entry) {
                entry.value = this.form.Macro.exec(entry.code.code, this);
                filter.push(entry);
            }.bind(this));
        }

        var parameter = {};
        if(this.json.statementParameterList && this.json.statementParameterList.length) {
            this.json.statementParameterList.each(function (entry) {
                parameter[entry.parameter] = this.parseParameter(entry);
            }.bind(this));
        }

        var data = this.form.Macro.environment.statement.execute({
            "name": obj.name,
            "mode": "data",
            "page": 1, //(number)可选,当前页码,默认为1
            "pageSize": 1000, //(number)可选,每页的数据条数,默认为20
            "filter": filter,
            "parameter": parameter,
            "parameterList": this.json.parameterList
        }, null, asy);
        if (data && typeOf(data.then) === "function") {
            return data.then(function (data) {
                return this.parseStatementOptions(data);
            }.bind(this));
        } else {
            return this.parseStatementOptions(data);
        }
    },
    parseStatementOptions: function (json) {
        var arr = [], value, text, valuekey = this.json.statementValueColumn,
            textkey = this.json.statementTextColumn;
        json.data.each(function (d) {
            if (valuekey && textkey) {
                value = this.getDataByPath(d, valuekey);
                text = this.getDataByPath(d, textkey);
                arr.push(text + "|" + value);
            } else if (valuekey) {
                value = this.getDataByPath(d, valuekey);
                arr.push(value);
            } else if (textkey) {
                text = this.getDataByPath(d, textkey);
                arr.push(text);
            }
        }.bind(this));
        return arr.unique();
    },
    parseParameter: function (f) {
        var value = f.value;
        if (f.valueType === "script") {
            value = this.form.Macro.exec(f.valueScript ? f.valueScript.code : "", this);
        }
        if (typeOf(value) === "date") {
            value = value.format("db");
        }
        var user = layout.user;
        switch (value) {
            case "@year":
                value = (new Date().getFullYear()).toString();
                break;
            case "@season":
                var m = new Date().format("%m");
                if (["01", "02", "03"].contains(m)) {
                    value = "1"
                } else if (["04", "05", "06"].contains(m)) {
                    value = "2"
                } else if (["07", "08", "09"].contains(m)) {
                    value = "3"
                } else {
                    value = "4"
                }
                break;
            case "@month":
                value = new Date().format("%Y-%m");
                break;
            case "@time":
                value = new Date().format("db");
                break;
            case "@date":
                value = new Date().format("%Y-%m-%d");
                break;
            default:
        }

        if (f.formatType === "dateTimeValue" || f.formatType === "datetimeValue") {
            value = "{ts '" + value + "'}"
        } else if (f.formatType === "dateValue") {
            value = "{d '" + value + "'}"
        } else if (f.formatType === "timeValue") {
            value = "{t '" + value + "'}"
        }
        return value;
    },
    getDataByPath: function (obj, path, isUppcase) {
        var pathList = isUppcase ? path.toUpperCase().split(".") : path.split(".");
        for (var i = 0; i < pathList.length; i++) {
            var p = pathList[i];
            if ((/(^[1-9]\d*$)/.test(p))) p = p.toInt();
            if (obj[p]) {
                obj = obj[p];
            } else if (obj[p] === undefined || obj[p] === null) {
                if (!isUppcase && i === 0) {
                    return this.getDataByPath(obj, path, true);
                } else {
                    obj = "";
                }
                break;
            } else {
                obj = obj[p];
                break;
            }
        }
        return this.getString(obj);
    }

});

results matching

    No results matching ''