123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465 |
- 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);
- }
- });
|