Last active
February 15, 2018 20:35
-
-
Save iberck/a65a9be1014787a2a54762f946396fa6 to your computer and use it in GitHub Desktop.
Utils versión Javascript
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// start | |
importPackage(com.liquidsoft.msurvey.api); | |
/** | |
* Crea un array a partir del rango indicado: | |
* | |
* Array.range(1,3) -> [1,2,3] | |
* Array.range(0,10,2)) -> [0,2,4,6,8,10] | |
* Array.range('a','d')) -> ['a','b','c','d'] | |
* Array.range('R','V')) -> ['R','S','T','U', 'V'] | |
* | |
* @param {Number} init (inclusive) | |
* @param {Number} end (inclusive) | |
* @param {Number} step indica el incremento, 1 por defecto | |
* @returns {Array} | |
*/ | |
Array.range = function (init, end, step) { | |
var A = []; | |
if (typeof init === 'number') { | |
A[0] = init; | |
step = step || 1; | |
while (init + step <= end) { | |
A[A.length] = init += step; | |
} | |
} else { | |
var s = 'abcdefghijklmnopqrstuvwxyz'; | |
if (init === init.toUpperCase()) { | |
end = end.toUpperCase(); | |
s = s.toUpperCase(); | |
} | |
s = s.substring(s.indexOf(init), s.indexOf(end) + 1); | |
A = s.split(''); | |
} | |
return A; | |
}; | |
/** | |
* Agrega el método contains a la clase Array, el método retorna true si contiene el valor, false en caso contrario. | |
* | |
* Ej: | |
* Array.range(1,9).contains(1) -> true | |
* Array.range(1,9).contains("1") -> true | |
* Array.range(1,9).contains(10) -> false | |
* | |
* @param {type} value | |
* @returns {Boolean} | |
*/ | |
Array.prototype.contains = function (value) { | |
return this.indexOf(value) > -1 || this.indexOf(""+value) > -1 || this.indexOf(parseFloat(value)) > -1; | |
}; | |
/** | |
* Retorna true si este array contiene alguno de los elementos de "valuesArray" | |
* | |
* @param {type} value | |
* @returns {Boolean} | |
*/ | |
Array.prototype.containsOr = function (valuesArray) { | |
for (var i = 0; i < valuesArray.length; i++) { | |
if (this.contains(valuesArray[i])) { | |
return true; | |
} | |
} | |
return false; | |
}; | |
/** | |
* Retorna true si este array contiene todos los elementos de "valuesArray" | |
* | |
* @param {type} value | |
* @returns {Boolean} | |
*/ | |
Array.prototype.containsAnd = function (valuesArray) { | |
for (var i = 0; i < valuesArray.length; i++) { | |
if (!this.contains(valuesArray[i])) { | |
return false; | |
} | |
} | |
return true; | |
}; | |
Utils = { | |
// Obtiene el valor de las opciones seleccionadas en una pregunta de opciones múltiples | |
enterOptsValues: function (alias) { | |
var answer = ApiClient.findAnswerOptions(alias); | |
return Utils.enterOptsValuesByAnswer(answer); | |
}, | |
enterOptsValuesByAnswer: function (answer) { | |
if (answer==null) { | |
return []; | |
} | |
var enterOptions = answer.getEnterOptions(); | |
var valuesSel = []; | |
for (var i = 0; i < enterOptions.length(); i++) { | |
var optAlias = enterOptions.get(i); | |
var opt = ApiClient.findItem(optAlias); | |
valuesSel.push(""+opt.getValue()); | |
} | |
return valuesSel; | |
}, | |
enterOptValue: function (alias) { | |
var answer = ApiClient.findAnswer(alias); | |
return Utils.enterOptValueByAnswer(answer); | |
}, | |
// Obtiene el valor de la opción seleccionada en una pregunta de opciones simples | |
enterOptValueByAnswer: function (answer) { | |
var valuesSel = Utils.enterOptsValuesByAnswer(answer); | |
if (valuesSel.length>1) { | |
throw "La pregunta " + answer.getQAlias() +" tiene más de una respuesta"; | |
} | |
if (valuesSel.length==0) { // respuesta nula | |
return -1; | |
} | |
return valuesSel[0]; | |
}, | |
enterColumnValByAnswer: function(answer, rowValue) { | |
if (answer!=null) { | |
var matrixJsonObj = answer.getEnterMatrix(); // matrix single format: jsonobject {"aliasOpt1":"aliasCol1", "aliasOpt2":"aliasCol1"} | |
var options = matrixJsonObj.names(); | |
for (var i = 0; i < options.length(); i++) { | |
var optionAlias = options.get(i); | |
var opt = ApiClient.findItem(optionAlias); | |
if (opt.getValue() == rowValue) { | |
var colAlias = matrixJsonObj.get(optionAlias); | |
var col = ApiClient.findItem(colAlias); | |
return col.getValue(); | |
} | |
} | |
} | |
return -1; | |
}, | |
// Obtiene el valor de la columna que se capturó en la fila con valor "rowValue" dentro de la pregunta con alias "alias" | |
enterColumnVal: function(alias, rowValue) { | |
var answer = ApiClient.findAnswer(alias); | |
return Utils.enterColumnValByAnswer(answer, rowValue); | |
}, | |
// Obtiene el texto capturado en la pregunta de texto abierto | |
enterTextByAnswer: function(answer) { | |
return answer!=null ? answer.getEnterText() : ""; | |
}, | |
enterTextFloatByAnswer: function(answer) { | |
return parseFloat(Utils.enterTextByAnswer(answer)); | |
}, | |
enterTextIntByAnswer: function(answer) { | |
return parseInt(Utils.enterTextByAnswer(answer), 10); // radix 10 | |
}, | |
enterTextInt: function(alias) { | |
var answer = ApiClient.findAnswer(alias); | |
return Utils.enterTextIntByAnswer(answer); | |
}, | |
enterTextFloat: function(alias) { | |
var answer = ApiClient.findAnswer(alias); | |
return Utils.enterTextFloatByAnswer(answer); | |
}, | |
// Obtiene el texto capturado en una opción de una pregunta de opciones abiertas | |
// alias: alias del nodo | |
// optAlias: alias de la opción de la cual se desea obtener el texto | |
enterOptText: function(alias, optAlias) { | |
var answer = ApiClient.findAnswerOptions(alias); | |
if (answer!=null) { | |
var optionsText = answer.getOptionsText(); // jsonObject {"aliasopt":"text", "aliasopt2":"text2"} | |
var text = optionsText.get(optAlias); | |
return text!=null && text.trim()!="" ? text : null; | |
} else { | |
return null; | |
} | |
}, | |
// Obtiene el texto capturado en una opción de una pregunta de opciones abiertas | |
// alias: alias del nodo | |
// optValue: valor de la opción de la cual se desea obtener el texto | |
enterOptTextByValue: function(alias, optValue) { | |
var opt = Utils.findItemByValue(alias, optValue); | |
return Utils.enterOptText(alias, opt.getAlias()); | |
}, | |
// Obtiene el texto de la opción seleccionada en una pregunta de opciones simples o simples con otra. | |
// Esta función se puede invocar con un solo argumento si no se trata de una pregunta de opciones con otra: Utils.enterOptSingleText("P10") | |
enterOptSingleText: function(alias, otherValue) { | |
var answer = ApiClient.findAnswerOptions(alias); // opc simples | |
if (answer==null) { | |
return null; | |
} | |
if (otherValue==null) {// no se envió el argumento, -1 por defecto | |
otherValue = -1; | |
} | |
var enterOptAlias = answer.getEnterOption(); | |
var enterOpt = ApiClient.findItem(enterOptAlias); | |
var enterVal = enterOpt.getValue(); | |
return enterVal != otherValue ? enterOpt.getText() : answer.getEnterOtherText(); // 997 (otra) | |
}, | |
// Pone visibles todas las opciones del nodo "alias" a excepción de "skip" (opcional, por defecto []) | |
setVisibleAllOptions: function(alias, skip) { | |
if (skip==undefined) { | |
skip=[]; | |
} | |
var node=ApiClient.findQuestionOptions(alias); | |
var nodeOpts = node.getOptions(); | |
for (var i = 0; i < nodeOpts.length; i++) { | |
var opt = nodeOpts[i]; | |
if (!skip.contains(opt.getValue())) { | |
opt.setVisible(true); | |
} | |
} | |
}, | |
// alias: alias del nodo sobre el que se va incluir las opciones, debe ser de tipo opciones/matriz | |
// includeAliasNodesArray: includeAliasNodes array con los alias de los nodos de los cuales se van a incluir los valores de las opciones contestadas, pueden no traer respuesta. | |
// skipValues array que contiene los valores de las opciones del nodo a omitir, las opciones con estos valores no las toca y las deja con su propiedad setVisible intacta (parámetro opcional, por defecto []). | |
// resetAllOptions true: hace visibles todas las opciones antes de hacer el include, false: deja intactas las opciones en su propiedad visible (parámetro opcional, por defecto true) | |
// Ejemplo: | |
// includeOptionsValues("P2B", ["P2", "P2A"], [99]) : Muestra en P2B las opciones capturadas en P2/P2A, la opción con código 99 se queda visible (intacta) | |
includeOptionsValues: function(alias, includeAliasNodesArray, skipValuesArray, resetAllOptions) { | |
if (resetAllOptions == undefined) { | |
resetAllOptions = true; | |
} | |
if (resetAllOptions) { | |
Utils.setVisibleAllOptions(alias, skipValuesArray); | |
} | |
if (skipValuesArray==undefined) { | |
skipValuesArray=[]; | |
} | |
var valuesSel = []; | |
for (var i = 0; i < includeAliasNodesArray.length; i++) { | |
var aliasNode = includeAliasNodesArray[i]; | |
var answerOpts = ApiClient.findAnswerOptions(aliasNode); | |
if (answerOpts!=null) { | |
var valuesSel2 = Utils.enterOptsValuesByAnswer(answerOpts); | |
for (var j = 0; j < valuesSel2.length; j++) { | |
valuesSel.push(""+valuesSel2[j]); | |
} | |
} | |
} | |
var node=ApiClient.findQuestionOptions(alias); | |
var nodeOpts = node.getOptions(); | |
for (var i = 0; i < nodeOpts.length; i++) { | |
var opt = nodeOpts[i]; | |
var value = opt.getValue(); | |
if (!skipValuesArray.contains(value) && opt.isVisible()) { | |
if (valuesSel.contains(value)) { // la opción fue seleccionada | |
opt.setVisible(true); | |
} else { | |
opt.setVisible(false); | |
} | |
} | |
} | |
}, | |
// Utils.excludeOptionsValues("P48A", ["P48"]); | |
// Utils.excludeOptionsValues("P48B", ["P48", "P48A"]); | |
excludeOptionsValues: function(alias, excludeAliasNodesArray, skipValuesArray, resetAllOptions) { | |
if (resetAllOptions == undefined) { | |
resetAllOptions = true; | |
} | |
if (resetAllOptions) { | |
Utils.setVisibleAllOptions(alias, skipValuesArray); | |
} | |
if (skipValuesArray==undefined) { | |
skipValuesArray=[]; | |
} | |
var valuesSel = []; | |
for (var i = 0; i < excludeAliasNodesArray.length; i++) { | |
var aliasNode = excludeAliasNodesArray[i]; | |
var answerOpts = ApiClient.findAnswerOptions(aliasNode); | |
if (answerOpts!=null) { | |
var valuesSel2 = Utils.enterOptsValuesByAnswer(answerOpts); | |
for (var j = 0; j < valuesSel2.length; j++) { | |
valuesSel.push(""+valuesSel2[j]); | |
} | |
} | |
} | |
var node=ApiClient.findQuestionOptions(alias); | |
var nodeOpts = node.getOptions(); | |
for (var i = 0; i < nodeOpts.length; i++) { | |
var opt = nodeOpts[i]; | |
var value = opt.getValue(); | |
if (!skipValuesArray.contains(value) && opt.isVisible()) { | |
if (valuesSel.contains(value)) { // la opción fue seleccionada | |
opt.setVisible(false); | |
} else { | |
opt.setVisible(true); | |
} | |
} | |
} | |
}, | |
// Ej. Utils.replaceNodeTextVars("P59", {"P12_TEXT": P12_TEXT, "P2_TEXT": P2_TEXT}); | |
replaceNodeTextVars: function (alias, mapVars) { | |
var data = new JSONObject(); | |
for (var key in mapVars) { | |
data.put(""+key, mapVars[key]); | |
} | |
var node = ApiClient.findNode(alias); | |
node.expandText(data); | |
}, | |
// valida si está capturada al menos la primer opción de la pregunta de opciones de texto abierto | |
isEnterFirstMentionOptsText: function (answer) { | |
if (answer==null){ | |
return false; | |
} | |
var alias = answer.getQAlias(); | |
var node = ApiClient.findNode(alias); | |
var nodeOpts = node.getOptions(); | |
var firstOptAlias = nodeOpts[0].getAlias(); | |
var optionsText = answer.getOptionsText(); // jsonObject {"aliasopt":"text", "aliasopt2":"text2"} | |
var options = optionsText.names();//jsonarray | |
var firstMention = optionsText.get(firstOptAlias); | |
return firstMention != null ? firstMention.trim()!="": false; | |
}, | |
isBlank: function(text) { | |
return text==null || text.trim()==""; | |
}, | |
isInt:function(text) { | |
return !isNaN(text) && (function(x) { return (x | 0) === x; })(parseFloat(text)); | |
}, | |
isEnterAllOptsText: function (answer) { | |
if (answer==null){ | |
return false; | |
} | |
var firstOptAlias = nodeOpts[0].getAlias(); | |
var optionsText = answer.getOptionsText(); // jsonObject {"aliasopt":"text", "aliasopt2":"text2"} | |
var alias = answer.getQAlias(); | |
var node = ApiClient.findNode(alias); | |
var nodeOpts = node.getOptions(); | |
for (var i = 0; i < nodeOpts.length; i++) { | |
var opt = nodeOpts[i]; | |
var text = optionsText.get(opt.getAlias()); | |
if (Utils.isBlank(text)) { | |
return false; | |
} | |
} | |
return true; | |
}, | |
// Todos lo valores de las casillas (visibles) deben ser enteros mayores o iguales a 0 | |
isEnterAllOptsTextAsPosInt: function (answer) { | |
if (answer==null){ | |
return false; | |
} | |
var optionsText = answer.getOptionsText(); // jsonObject {"aliasopt":"text", "aliasopt2":"text2"} | |
var alias = answer.getQAlias(); | |
var node = ApiClient.findNode(alias); | |
var nodeOpts = node.getOptions(); | |
for (var i = 0; i < nodeOpts.length; i++) { | |
var opt = nodeOpts[i]; | |
if (!opt.isVisible()){ | |
continue; | |
} | |
if (optionsText.has(opt.getAlias())) { | |
var text = optionsText.get(opt.getAlias()); | |
if (!Utils.isInt(text) || text<0) { | |
return false; | |
} | |
} else { | |
return false; | |
} | |
} | |
return true; | |
}, | |
// retorna true si ninguna columna o solo 1 tiene el valor de la columna indicada | |
isTwoOrMoreRowsWithColValue: function(answer, colValue) { | |
var matrixJsonObj = answer.getEnterMatrix(); // jsonobject {"aliasOpt1":"aliasCol1", "aliasOpt2":"aliasCol1"} | |
var options = matrixJsonObj.names(); | |
var countCol = 0; | |
for (var i = 0; i < options.length(); i++) { | |
var optionAlias = options.get(i); | |
var colAlias = matrixJsonObj.get(optionAlias); | |
var col = ApiClient.findItem(colAlias); | |
var colVal = col.getValue(); | |
if (colVal==colValue) { | |
countCol++; | |
} | |
} | |
return countCol>=2; | |
}, | |
// oculta el item con valor "itemValue" que se encuentra dentro del nodo "alias" | |
hideItemWithValue: function(alias, itemValue) { | |
var node = ApiClient.findNode(alias); | |
var item = Utils.findItemByValue(alias, itemValue); | |
item.setVisible(false); | |
}, | |
// muestra el item con valor "itemValue" que se encuentra dentro del nodo "alias" | |
showItemWithValue: function(alias, itemValue) { | |
var node = ApiClient.findNode(alias); | |
var item = Utils.findItemByValue(alias, itemValue); | |
item.setVisible(true); | |
}, | |
// Busca dentro del nodo "alias" el item con valor itemValue | |
findItemByValue: function(alias, itemValue) { | |
var node = ApiClient.findNode(alias); | |
var items = node.getItems(); | |
for (var i = 0; i < items.length; i++) { | |
var item = items[i]; | |
if (item.getValue() == itemValue) { | |
return item; | |
} | |
} | |
throw "no existe el item " + itemValue + " dentro del nodo " + alias; | |
}, | |
// Si eligen el código que se encuentra en la llave del mapa dentro de "aliasValues", mostrará "aliasShows" con el valor del código del mapa. | |
// | |
// Ejemplo: | |
// ThisUtils.showAndWaitByMapRules("P12", "F8", {1:"A", 2:"B", 3:"C", 4:"D"}); | |
// Muestra P12A si eligen F8(cod1) | |
// Muestra P12B si eligen F8(cod2) | |
// Muestra P12C si eligen F8(cod3) | |
// Muestra P12D si eligen F8(cod4) | |
showAndWaitByMapRules: function(aliasShows, aliasValues, map) { | |
var enterValues = Utils.enterOptsValues(aliasValues); | |
for (var key in map) { | |
if (enterValues.contains(key)) { | |
var letter = map[key]; | |
ApiClient.showAndWait(aliasShows+letter); | |
} | |
} | |
}, | |
// muestra el nodo "alias" sustituyendo previamente las variables de "mapVars" | |
showAndWaitWithReplace: function(alias, mapVars) { | |
Utils.replaceNodeTextVars(alias, mapVars); | |
ApiClient.showAndWait(alias); | |
}, | |
onlyShowItemWithValue: function(alias, itemValue, skipValuesArray) { | |
if (skipValuesArray==null) { | |
skipValuesArray=[]; | |
} | |
var node = ApiClient.findNode(alias); | |
var items = node.getItems(); | |
for (var i = 0; i < items.length; i++) { | |
var item = items[i]; | |
var val = item.getValue(); | |
if(!skipValuesArray.contains(val)) { | |
item.setVisible(val == itemValue); | |
} | |
} | |
}, | |
// Obtiene los valores de las opciones seleccionadas en los nodos "nodesArray" | |
// nodesArray: array con los alias de los nodos | |
enterNodesOptsValues: function (nodesArray) { | |
var valuesSelAll = []; | |
for (var i = 0; i < nodesArray.length; i++) { | |
var nodeValuesSel = Utils.enterOptsValues(nodesArray[i]); | |
valuesSelAll = valuesSelAll.concat(nodeValuesSel); | |
} | |
return valuesSelAll; | |
}, | |
} | |
ThisUtils = { | |
// obtiene los textos de las opciones OTRA1/OTRA2/OTRA3 | |
getP2OtherTexts123: function() { | |
var text1=null; | |
var text2=null; | |
var text3=null; | |
var enterValP2 = Utils.enterOptValue("P2"); | |
if (enterValP2 == 997) { | |
// Si contestan algo en P2/OTRA: | |
// T1: P2/OTRA | |
// T2: P2T_1 | |
// T3: P2T_2 | |
text1 = Utils.enterOptSingleText("P2", 997); | |
text2 = Utils.enterOptTextByValue("P2T", 9971); | |
text3 = Utils.enterOptTextByValue("P2T", 9972); | |
} else { | |
// Si NO contestan algo en P2/OTRA: | |
// T1: P2T_1 | |
// T2: P2T_2 | |
// T3: P2T_3 | |
text1 = Utils.enterOptTextByValue("P2T", 9971); | |
text2 = Utils.enterOptTextByValue("P2T", 9972); | |
text3 = Utils.enterOptTextByValue("P2T", 9973); | |
} | |
return [text1,text2,text3]; | |
}, | |
} | |
function onNavigate(params) { | |
ApiClient.showAndWait($node); | |
var next = ApiClient.findNext($node); | |
return next; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment