MWF.xDesktop.requireApp("process.Xform", "$Input", null, false);
MWF.xDesktop.requireApp("process.Work", "lp." + o2.language, null, false);
/** @class Opinion 意见输入框。
* @o2cn 意见输入框
* @example
* //可以在脚本中获取该组件
* //方法1:
* var field = this.form.get("fieldId"); //获取组件对象
* //方法2
* var field = this.target; //在组件本身的脚本中获取,比如事件脚本、默认值脚本、校验脚本等等
*
* var data = field.getData(); //获取值
* field.setData("字符串值"); //设置值
* field.hide(); //隐藏字段
* var id = field.json.id; //获取字段标识
* var flag = field.isEmpty(); //字段是否为空
* @extends MWF.xApplication.process.Xform.$Input
* @o2category FormComponents
* @o2range {Process}
* @hideconstructor
*/
MWF.xApplication.process.Xform.Opinion = MWF.APPOpinion = new Class(
/** @lends MWF.xApplication.process.Xform.Opinion# */
{
Implements: [Events],
Extends: MWF.APP$Input,
_loadUserInterface: function () {
this._loadNode();
if (this.json.compute == "show") {
this._setValue(this._computeValue());
} else {
this._loadValue();
}
},
_loadNode: function () {
if (this.readonly) {
this._loadNodeRead();
} else {
this._loadNodeEdit();
}
},
_loadNodeRead: function () {
this.node.empty();
this.node.set({
"nodeId": this.json.id,
"MWFType": this.json.type
});
this.node.setStyle("display", "none");
},
validationConfigItem: function (routeName, data) {
var flag = (data.status === "all") ? true : (routeName === data.decision);
if (flag) {
var n = this.getInputData();
var v = (data.valueType === "value") ? n : n.length;
switch (data.operateor) {
case "isnull":
if (!v && !(this.handwritingFile && this.handwritingFile[layout.session.user.distinguishedName])) {
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 < data.value) {
this.notValidationMode(data.prompt);
return false;
}
break;
case "equal":
if (v == data.value) {
this.notValidationMode(data.prompt);
return false;
}
break;
case "neq":
if (v != data.value) {
this.notValidationMode(data.prompt);
return false;
}
break;
case "contain":
if (v.indexOf(data.value) != -1) {
this.notValidationMode(data.prompt);
return false;
}
break;
case "notcontain":
if (v.indexOf(data.value) == -1) {
this.notValidationMode(data.prompt);
return false;
}
break;
}
}
return true;
},
_resetNodeEdit: function () {
var input = new Element("textarea", {
"styles": {
"background": "transparent",
"width": "100%",
"border": "0px"
}
});
input.set(this.json.properties);
this.textarea = input;
var node = new Element("div", {
"styles": {
"ovwrflow": "hidden",
"position": "relative",
"padding-right": "2px"
}
}).inject(this.node, "after");
input.inject(node);
this.node.destroy();
this.node = node;
},
_loadNodeEdit: function () {
if (!this.json.preprocessing) {
this._resetNodeEdit();
}else{
this.textarea = this.node.getElement("textarea");
}
var input = this.node.getFirst();
if( !input && this.nodeHtml ){
this.node.set("html", this.nodeHtml);
input = this.node.getFirst();
}
input.set(this.json.properties);
//this.node = input;
this.node.set({
"id": this.json.id,
"MWFType": this.json.type
});
this.input = input;
if( this.json.isSelectIdea === "yes" ){
this.selectIdeaNode = new Element("div", {"styles": this.form.css.selectIdeaNode}).inject(this.node);
this.underLineNode = new Element("div", {"styles": {
"border-top": "1px solid #ccc",
"clear": "both"
}}).inject(this.node);
this.loadSelectIdea()
}
this.mediaActionArea = new Element("div", {"styles": this.form.css.inputOpinionMediaActionArea}).inject(this.node);
if (this.json.isHandwriting !== "no") {
/**
* @summary 手写意见按钮按钮。
* @member {Element}
*/
this.handwritingAction = new Element("div", {
"styles": this.form.css.inputOpinionHandwritingAction,
"text": MWF.xApplication.process.Work.LP.handwriting
}).inject(this.mediaActionArea);
this.handwritingAction.addEvent("click", function () {
this.handwriting();
}.bind(this));
}
if (this.json.isAudio !== "no") {
if (navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia) {
/**
* @summary 音频按钮.在浏览器支持HTML5的getUserMedia才可用。
* @member {Element}
*/
this.audioRecordAction = new Element("div", {
"styles": this.form.css.inputOpinionAudioRecordAction,
"text": MWF.xApplication.process.Work.LP.audioRecord
}).inject(this.mediaActionArea);
this.audioRecordAction.addEvent("click", function () {
this.audioRecord();
}.bind(this));
}
}
this.node.addEvent("change", function () {
this._setBusinessData(this.getInputData());
this.fireEvent("change");
}.bind(this));
this.node.getFirst().addEvent("blur", function () {
this.validation();
this.hideSelectOpinionNode();
}.bind(this));
this.node.getFirst().addEvent("keyup", function () {
this.validationMode();
}.bind(this));
this.node.getFirst().addEvent("keydown", function (e) {
if (this.selectOpinionNode && (this.selectOpinionNode.getStyle("display") != "none") && this.selectOpinionNode.getFirst()) {
if (e.code == 38) { //up
if (this.selectedOpinionNode) {
var node = this.selectedOpinionNode.getPrevious();
if (!node) node = this.selectOpinionNode.getLast();
this.unselectedOpinion(this.selectedOpinionNode);
this.selectedOpinion(node)
} else {
node = this.selectOpinionNode.getLast();
this.selectedOpinion(node)
}
}
if (e.code == 40) { //down
if (this.selectedOpinionNode) {
var node = this.selectedOpinionNode.getNext();
if (!node) node = this.selectOpinionNode.getFirst();
this.unselectedOpinion(this.selectedOpinionNode);
this.selectedOpinion(node)
} else {
node = this.selectOpinionNode.getFirst();
this.selectedOpinion(node)
}
}
if (e.code == 27) { //esc
this.hideSelectOpinionNode();
e.preventDefault();
}
if (e.code == 32 || e.code == 13) { //space
if (this.selectedOpinionNode) {
this.setOpinion(this.selectedOpinionNode.get("text"));
e.preventDefault();
}
}
}
}.bind(this));
if (!this.form.json.notLoadUserOpinion) {
MWF.UD.getDataJson("userOpinion", function (json) {
this.userOpinions = json;
}.bind(this), false);
}
this.node.getFirst().addEvent("input", function (e) {
this.startSearchOpinion();
}.bind(this));
this.node.getFirst().addEvent("focus", function () {
this.startSearchOpinion();
}.bind(this));
},
_afterLoaded: function(){
if (!this.isReadonly()){
this.setNodeSize();
this.loadDescription();
}
},
setNodeSize: function(){
if( this.textarea ){
var x = 0;
if( this.selectIdeaNode ){
var size = this.selectIdeaNode.getSize();
x = size.x + 5;
this.textarea.setStyles({
"height": ( size.y - 6 ) + "px",
"resize":"none",
"border-bottom": "0px",
"padding-right": "0px",
"width": "calc( 100% - "+ x +"px )"
});
this.node.setStyles({
"min-height": size.y + "px",
"height": "auto",
"overflow":"hidden",
"width": "100%"
});
this.mediaActionArea.setStyle("right", x+"px");
}
}
},
loadSelectIdea: function(){
this.selectIdeaScrollNode = new Element("div", {"styles": this.form.css.selectIdeaScrollNode}).inject(this.selectIdeaNode);
this.selectIdeaAreaNode = new Element("div", {
"styles": {
"overflow": "hidden"
}
}).inject(this.selectIdeaScrollNode);
MWF.require("MWF.widget.ScrollBar", function () {
new MWF.widget.ScrollBar(this.selectIdeaScrollNode, {
"style": "small",
"where": "before",
"distance": 30,
"friction": 4,
"indent": false,
"axis": {"x": false, "y": true}
});
}.bind(this));
MWF.UD.getDataJson("idea", function (json) {
if (json) {
if (json.ideas) {
this.setIdeaList(json.ideas);
}
} else {
MWF.UD.getPublicData("idea", function (pjson) {
if (pjson) {
if (pjson.ideas) {
this.setIdeaList(pjson.ideas);
}
}
}.bind(this));
}
}.bind(this));
},
setIdeaList: function (ideas) {
var _self = this;
ideas.each(function (idea) {
if (!idea) return;
new Element("div", {
"styles": this.form.css.selectIdeaItemNode,
"text": idea,
"events": {
"click": function () {
if(_self.descriptionNode)_self.descriptionNode.setStyle("display", "none");
if ( !_self.textarea.get("value") ) {
_self.textarea.set("value", this.get("text"));
} else {
_self.textarea.set("value", _self.textarea.get("value") + ", " + this.get("text"));
}
},
"mouseover": function () {
this.setStyles(_self.form.css.selectIdeaItemNode_over);
},
"mouseout": function () {
this.setStyles(_self.form.css.selectIdeaItemNode);
}
}
}).inject(this.selectIdeaAreaNode);
}.bind(this));
},
audioRecord: function () {
if (!this.audioRecordNode) this.createAudioRecordNode();
this.audioRecordNode.show();
this.audioRecordNode.position({
"relativeTo": this.node,
"position": "center",
"edge": "center"
});
var p = this.audioRecordNode.getPosition(this.form.app.content);
var top = p.y;
var left = p.x;
if (p.y < 0) top = 10;
if (p.x < 0) left = 10;
this.audioRecordNode.setStyles({
"top": "" + top + "px",
"left": "" + left + "px"
});
this.soundFile = {};
MWF.require("MWF.widget.AudioRecorder", function () {
/**
* @summary 音频意见组件.
* @member {o2.widget.AudioRecorder}
*/
this.audioRecorder = new MWF.widget.AudioRecorder(this.audioRecordNode, {
"onSave": function (audioFile) {
this.soundFile[layout.session.user.distinguishedName] = audioFile;
if (this.previewNode) {
this.previewNode.destroy();
this.previewNode = null;
}
this.previewNode = new Element("audio", {
"controls": true,
"src": window.URL.createObjectURL(audioFile)
}).inject(this.node);
this.audioRecordNode.hide();
// this.page.get("div_image").node.set("src",base64Image);
}.bind(this),
"onCancel": function () {
this.soundFile[layout.session.user.distinguishedName] = null;
delete this.soundFile[layout.session.user.distinguishedName];
if (this.previewNode) {
this.previewNode.destroy();
this.previewNode = null;
}
this.audioRecordNode.hide();
}.bind(this)
}, null);
}.bind(this));
},
createAudioRecordNode: function () {
this.audioRecordNode = new Element("div", {"styles": this.form.css.handwritingNode}).inject(this.node, "after");
var size = this.node.getSize();
var y = Math.max(size.y, 320);
var x = Math.max(size.x, 400);
x = Math.min(x, 600);
y = 320;
x = 500;
var zidx = this.node.getStyle("z-index").toInt() || 0;
zidx = (zidx < 1000) ? 1000 : zidx;
this.audioRecordNode.setStyles({
"height": "" + y + "px",
"width": "" + x + "px",
"z-index": zidx + 1
});
// this.audioRecordNode.position({
// "relativeTo": this.node,
// "position": "center",
// "edge": "center"
// });
},
/**
* @summary 弹出手写板.
* @example
* this.form.get("fieldId").handwriting();
*/
handwriting: function () {
if (!this.handwritingNode) this.createHandwriting();
this.handwritingNode.show();
if (layout.mobile) {
this.handwritingNode.setStyles({
"top": "0px",
"left": "0px"
});
} else {
this.handwritingNode.position({
"relativeTo": this.form.app.content || this.form.container,
"position": "center",
"edge": "center"
});
//var p = this.handwritingNode.getPosition(this.form.app.content);
var p = this.handwritingNode.getPosition(this.handwritingNode.getOffsetParent());
var top = p.y;
var left = p.x;
if (p.y < 0) top = 10;
if (p.x < 0) left = 10;
this.handwritingNode.setStyles({
"top": "" + top + "px",
"left": "" + left + "px"
});
}
},
createHandwriting: function () {
/**
* @summary 手写板容器.
* @member {Element}
*/
this.handwritingNode = new Element("div", {"styles": this.form.css.handwritingNode}).inject(this.node, "after");
var x, y;
if (layout.mobile) {
var bodySize = $(document.body).getSize();
x = bodySize.x;
y = bodySize.y;
this.json.tabletWidth = 0;
this.json.tabletHeight = 0;
} else {
var size = this.node.getSize();
x = Math.max(this.json.tabletWidth || size.x, 600);
this.json.tabletWidth = x;
y = Math.max(this.json.tabletHeight ? (parseInt(this.json.tabletHeight) + 110) : size.y, 320);
}
var zidx = this.node.getStyle("z-index").toInt() || 0;
zidx = (zidx < 1000) ? 1000 : zidx;
this.handwritingNode.setStyles({
"height": "" + y + "px",
"width": "" + x + "px",
"z-index": zidx + 1
});
if (layout.mobile) {
this.handwritingNode.addEvent('touchmove', function (e) {
e.preventDefault();
});
this.handwritingNode.setStyles({
"top": "0px",
"left": "0px"
}).inject($(document.body));
} else {
this.handwritingNode.position({
"relativeTo": this.node,
"position": "center",
"edge": "center"
});
}
this.handwritingAreaNode = new Element("div", {"styles": this.form.css.handwritingAreaNode}).inject(this.handwritingNode);
if (!layout.mobile) {
this.handwritingActionNode = new Element("div", {
"styles": this.form.css.handwritingActionNode,
"text": MWF.xApplication.process.Work.LP.saveWrite
}).inject(this.handwritingNode);
var h = this.handwritingActionNode.getSize().y + this.handwritingActionNode.getStyle("margin-top").toInt() + this.handwritingActionNode.getStyle("margin-bottom").toInt();
h = y - h;
this.handwritingAreaNode.setStyle("height", "" + h + "px");
} else {
this.handwritingAreaNode.setStyle("height", "" + y + "px");
}
this.handwritingFile = {};
MWF.require("MWF.widget.Tablet", function () {
/**
* @summary 手写板组件.
* @member {o2.widget.Tablet}
*/
this.tablet = new MWF.widget.Tablet(this.handwritingAreaNode, {
"style": "default",
"toolHidden": this.json.toolHidden || [],
"contentWidth": this.json.tabletWidth || 0,
"contentHeight": this.json.tabletHeight || 0,
"onSave": function (base64code, base64Image, imageFile) {
this.handwritingFile[layout.session.user.distinguishedName] = imageFile;
if (this.previewNode) {
this.previewNode.destroy();
this.previewNode = null;
}
if (this.json.isHandwritingPreview !== "no") {
this.previewNode = new Element("img", {"src": base64Image}).inject(this.node);
this.previewNode.setStyles({
"max-width": "90%"
})
}
this.handwritingNode.hide();
this.validation();
this.fireEvent("change");
// this.page.get("div_image").node.set("src",base64Image);
}.bind(this),
"onCancel": function () {
this.handwritingFile[layout.session.user.distinguishedName] = null;
delete this.handwritingFile[layout.session.user.distinguishedName];
if (this.previewNode) {
this.previewNode.destroy();
this.previewNode = null;
}
this.handwritingNode.hide();
}.bind(this)
}, null);
this.tablet.load();
}.bind(this));
if (layout.mobile) {
opt.tools = [
"save", "|",
"undo",
"redo", "|",
"reset", "|",
"cancel"
]
}
if (this.handwritingActionNode) {
this.handwritingActionNode.addEvent("click", function () {
//this.handwritingNode.hide();
if (this.tablet) this.tablet.save();
}.bind(this));
}
},
unselectedOpinion: function (node) {
node.setStyle("background-color", "#ffffff");
this.selectedOpinionNode = null;
},
selectedOpinion: function (node) {
node.setStyle("background-color", "#d2ddf5");
this.selectedOpinionNode = node;
},
startSearchOpinion: function () {
var t = this.input.get("value");
var arr = t.split(/(,\s*){1}|(;\s*){1}|\s+/g);
t = arr[arr.length - 1];
if (t.length) {
this.clearSearcheOpinionId();
this.searcheOpinionId = window.setTimeout(function () {
this.searchOpinions(t);
}.bind(this), 500);
} else {
this.clearSearcheOpinionId();
}
},
clearSearcheOpinionId: function () {
if (this.searcheOpinionId) {
window.clearTimeout(this.searcheOpinionId);
this.searcheOpinionId = "";
}
},
searchOpinions: function (t) {
var value = this.input.get("value");
var arr = value.split(/[\n\r]/g);
lines = arr.length;
value = arr[arr.length - 1];
var offsetValue = value;
//var offsetValue = value.substr(0, value.length-t.length);
if (this.userOpinions) {
var ops = this.userOpinions.filter(function (v, i) {
return v.contains(t) && (v != t);
}.bind(this));
if (ops.length) {
this.showSelectOpinionNode(ops, offsetValue, lines);
} else {
this.hideSelectOpinionNode(ops);
}
}
},
hideSelectOpinionNode: function () {
if (this.selectOpinionNode) this.selectOpinionNode.setStyle("display", "none");
},
showSelectOpinionNode: function (ops, offsetValue, lines) {
if (!this.selectOpinionNode) this.createSelectOpinionNode();
this.selectOpinionNode.empty();
ops.each(function (op) {
this.createSelectOpinionOption(op);
}.bind(this));
var inputSize = this.input.getSize();
var size = MWF.getTextSize(offsetValue, this.json.inputStyles);
var offY = ((size.y - 3) * lines) + 3;
if (offY > inputSize.y) offY = inputSize.y;
this.selectOpinionNode.setStyle("display", "block");
this.selectOpinionNode.position({
"relativeTo": this.node,
"position": "leftTop",
"edge": "leftTop",
"offset": {"x": size.x, "y": offY}
});
},
createSelectOpinionNode: function () {
this.selectOpinionNode = new Element("div", {"styles": this.form.css.opinionSelectNode}).inject(this.node);
},
createSelectOpinionOption: function (op) {
var option = new Element("div", {
"styles": this.form.css.opinionSelectOption,
"text": op
}).inject(this.selectOpinionNode);
if (this.json.selectItemStyles) option.setStyles(this.json.selectItemStyles);
option.addEvents({
"mouseover": function () {
this.setStyle("background-color", "#d2ddf5")
},
"mouseout": function () {
this.setStyle("background-color", "#ffffff")
},
"mousedown": function () {
this.setOpinion(op)
}.bind(this)
});
},
setOpinion: function (op) {
var v = this.input.get("value");
var arr = v.split(/(,\s*){1}|(;\s*){1}|\s+/g);
t = arr[arr.length - 1];
var leftStr = v.substr(0, v.length - t.length);
this.input.set("value", leftStr + op);
this.hideSelectOpinionNode();
this._setBusinessData(this.getInputData());
},
loadDescription: function () {
if (this.isReadonly()) return;
var v = this._getBusinessData();
if (!v) {
if (this.json.description) {
var size = this.node.getFirst().getSize();
var w = size.x - 3
if (this.json.showIcon != 'no' && !this.form.json.hideModuleIcon) {
w = size.x - 23;
}
if( this.handwritingAction ){
w = w - this.handwritingAction.getSize().x
}
if( this.audioRecordAction ){
w = w - this.audioRecordAction.getSize().x
}
this.descriptionNode = new Element("div", {
"styles": this.form.css.descriptionNode,
"text": this.json.description
}).inject(this.node);
this.descriptionNode.setStyles({
"width": "" + w + "px",
"height": "" + size.y + "px",
"line-height": "" + size.y + "px"
});
this.setDescriptionEvent();
}
}
},
setDescriptionEvent: function () {
if (this.descriptionNode) {
if (COMMON.Browser.Platform.name === "ios") {
this.descriptionNode.addEvents({
"click": function () {
this.descriptionNode.setStyle("display", "none");
this.node.getFirst().focus();
}.bind(this)
});
} else if (COMMON.Browser.Platform.name === "android") {
this.descriptionNode.addEvents({
"click": function () {
this.descriptionNode.setStyle("display", "none");
this.node.getFirst().focus();
}.bind(this)
});
} else {
this.descriptionNode.addEvents({
"click": function () {
this.descriptionNode.setStyle("display", "none");
this.node.getFirst().focus();
}.bind(this)
});
}
this.node.getFirst().addEvents({
"focus": function () {
this.descriptionNode.setStyle("display", "none");
}.bind(this),
"blur": function () {
if (!this.node.getFirst().get("value")) this.descriptionNode.setStyle("display", "block");
}.bind(this)
});
}
}
});
source