ui/lib/shared/addon/utils/evaluate.js

94 lines
1.9 KiB
JavaScript

import { get } from '@ember/object'
function getVariables(showIf, operator) {
if ( showIf.indexOf(operator) > -1 ) {
const array = showIf.split(operator);
if ( array.length === 2 ) {
return {
left: array[0],
right: array[1]
};
} else {
return null;
}
}
return null;
}
function getAnswer(variable, questions) {
const found = questions.find((q) => q.variable === variable);
if ( found ) {
return found.answer;
} else {
return variable;
}
}
function isEqual(showIf, allQuestions) {
showIf = showIf.trim();
const variables = getVariables(showIf, '=');
if ( variables ) {
const left = stringifyAnswer(getAnswer(variables.left, allQuestions));
const right = stringifyAnswer(variables.right);
return left === right;
}
return false;
}
function isNotEqual(showIf, allQuestions) {
showIf = showIf.trim();
const variables = getVariables(showIf, '!=');
if ( variables ) {
const left = stringifyAnswer(getAnswer(variables.left, allQuestions));
const right = stringifyAnswer(variables.right);
return left !== right;
}
return false;
}
function calExpression(showIf, allQuestions) {
if ( showIf.indexOf('!=') > -1 ) {
return isNotEqual(showIf, allQuestions);
} else {
return isEqual(showIf, allQuestions);
}
}
export function evaluate(question, allQuestions) {
if ( !question.showIf ) {
return true;
}
const and = question.showIf.split('&&');
const or = question.showIf.split('||');
let result;
if ( get(or, 'length') > 1 ) {
result = or.some((showIf) => calExpression(showIf, allQuestions));
} else {
result = and.every((showIf) => calExpression(showIf, allQuestions));
}
return result;
}
export function stringifyAnswer(answer) {
if ( answer === undefined || answer === null ) {
return '';
} else if ( typeof answer === 'string' ) {
return answer;
} else {
return `${ answer }`;
}
}