got logicjump to work and added more comparison fields
This commit is contained in:
parent
02e25ef739
commit
13c68f7411
@ -8,33 +8,6 @@ var mongoose = require('mongoose'),
|
||||
_ = require('lodash'),
|
||||
math = require('mathjs');
|
||||
|
||||
/**
|
||||
* Calculate a 32 bit FNV-1a hash
|
||||
* Found here: https://gist.github.com/vaiorabbit/5657561
|
||||
* Ref.: http://isthe.com/chongo/tech/comp/fnv/
|
||||
*
|
||||
* @param {string} str the input value
|
||||
* @param {boolean} [asString=false] set to true to return the hash value as
|
||||
* 8-digit hex string instead of an integer
|
||||
* @param {integer} [seed] optionally pass the hash of the previous chunk
|
||||
* @returns {integer | string}
|
||||
*/
|
||||
function hashFnv32a(str, asString, seed) {
|
||||
/*jshint bitwise:false */
|
||||
var i, l,
|
||||
hval = (seed === undefined) ? 0x811c9dc5 : seed;
|
||||
|
||||
for (i = 0, l = str.length; i < l; i++) {
|
||||
hval ^= str.charCodeAt(i);
|
||||
hval += (hval << 1) + (hval << 4) + (hval << 7) + (hval << 8) + (hval << 24);
|
||||
}
|
||||
if( asString ){
|
||||
// Convert to 8 digit hex string
|
||||
return ("0000000" + (hval >>> 0).toString(16)).substr(-8);
|
||||
}
|
||||
return hval >>> 0;
|
||||
}
|
||||
|
||||
var schemaOptions = {
|
||||
toObject: {
|
||||
virtuals: true
|
||||
@ -48,8 +21,18 @@ var LogicJumpSchema = new Schema({
|
||||
expressionString: {
|
||||
type: String,
|
||||
enum: [
|
||||
'a == b',
|
||||
'a !== b'
|
||||
'field == static',
|
||||
'field != static',
|
||||
'field > static',
|
||||
'field >= static',
|
||||
'field <= static',
|
||||
'field < static',
|
||||
'field contains static',
|
||||
'field !contains static',
|
||||
'field begins static',
|
||||
'field !begins static',
|
||||
'field ends static',
|
||||
'field !ends static',
|
||||
]
|
||||
},
|
||||
fieldA: {
|
||||
@ -93,21 +76,6 @@ var LogicJumpSchema = new Schema({
|
||||
|
||||
*/
|
||||
|
||||
LogicJumpSchema.virtual('result').get(function () {
|
||||
if (this.expressionString && this.fieldA.fieldValue && this.valueB) {
|
||||
var valA = hashFnv32a(String(this.fieldA.fieldValue));
|
||||
var valB = hashFnv32a(String(this.valueB));
|
||||
var scope = {
|
||||
'a': valA,
|
||||
'b': valB
|
||||
};
|
||||
return math.eval(this.expressionString, scope);
|
||||
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
mongoose.model('LogicJump', LogicJumpSchema);
|
||||
|
||||
module.exports = LogicJumpSchema;
|
||||
|
@ -38,7 +38,8 @@
|
||||
"angular-translate": "~2.11.0",
|
||||
"ng-device-detector": "~3.0.1",
|
||||
"ng-translate": "*",
|
||||
"mathjs": "^3.4.1"
|
||||
"mathjs": "^3.4.1",
|
||||
"jsep": "^0.3.1"
|
||||
},
|
||||
"resolutions": {
|
||||
"angular-bootstrap": "^0.14.0",
|
||||
|
@ -1,5 +1,14 @@
|
||||
'use strict';
|
||||
|
||||
//FIXME: Should find an appropriate place for this
|
||||
//Setting up jsep
|
||||
jsep.addBinaryOp("contains", 10);
|
||||
jsep.addBinaryOp("!contains", 10);
|
||||
jsep.addBinaryOp("begins", 10);
|
||||
jsep.addBinaryOp("!begins", 10);
|
||||
jsep.addBinaryOp("ends", 10);
|
||||
jsep.addBinaryOp("!ends", 10);
|
||||
|
||||
/**
|
||||
* Calculate a 32 bit FNV-1a hash
|
||||
* Found here: https://gist.github.com/vaiorabbit/5657561
|
||||
@ -121,15 +130,62 @@ angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCoun
|
||||
*/
|
||||
var evaluateLogicJump = function(field){
|
||||
console.log('evaluateLogicJump');
|
||||
console.log(field.fieldValue);
|
||||
var logicJump = field.logicJump;
|
||||
if (logicJump.expressionString && logicJump.valueB) {
|
||||
var valA = hashFnv32a(String(field.fieldValue));
|
||||
var valB = hashFnv32a(String(logicJump.valueB));
|
||||
var scope = {
|
||||
'a': valA,
|
||||
'b': valB
|
||||
};
|
||||
return math.eval(logicJump.expressionString, scope);
|
||||
|
||||
if (logicJump.expressionString && logicJump.valueB && field.fieldValue) {
|
||||
var parse_tree = jsep(logicJump.expressionString);
|
||||
var left, right;
|
||||
|
||||
console.log(parse_tree);
|
||||
|
||||
if(parse_tree.left.name === 'field'){
|
||||
left = field.fieldValue;
|
||||
right = logicJump.valueB
|
||||
} else {
|
||||
left = logicJump.valueB;
|
||||
right = field.fieldValue;
|
||||
}
|
||||
|
||||
if(field.fieldType === 'number' || field.fieldType === 'scale' || field.fieldType === 'rating'){
|
||||
switch(parse_tree.operator) {
|
||||
case '==':
|
||||
return (parseInt(left) === parseInt(right));
|
||||
case '!==':
|
||||
return (parseInt(left) !== parseInt(right));
|
||||
case '>':
|
||||
return (parseInt(left) > parseInt(right));
|
||||
case '>=':
|
||||
return (parseInt(left) > parseInt(right));
|
||||
case '<':
|
||||
return (parseInt(left) < parseInt(right));
|
||||
case '<=':
|
||||
return (parseInt(left) <= parseInt(right));
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
switch(parse_tree.operator) {
|
||||
case '==':
|
||||
return (left === right);
|
||||
case '!==':
|
||||
return (left !== right);
|
||||
case 'contains':
|
||||
return (left.indexOf(right) > -1);
|
||||
case '!contains':
|
||||
return !(left.indexOf(right) > -1);
|
||||
case 'begins':
|
||||
return left.startsWith(right);
|
||||
case '!begins':
|
||||
return !left.startsWith(right);
|
||||
case 'ends':
|
||||
return left.endsWith(right);
|
||||
case '!ends':
|
||||
return left.endsWith(right);
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@ -210,7 +266,6 @@ angular.module('view-form').directive('submitFormDirective', ['$http', 'TimeCoun
|
||||
|
||||
$rootScope.nextField = $scope.nextField = function(){
|
||||
var currField = $scope.myform.visible_form_fields[$scope.selected.index];
|
||||
console.log(currField.logicJump);
|
||||
|
||||
if($scope.selected && $scope.selected.index > -1){
|
||||
//Jump to logicJump's destination if it is true
|
||||
|
@ -308,10 +308,10 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row" ng-if="myform.form_fields.length > 1 && myform.form_fields[$index].logicJump.fieldA">
|
||||
<div class="row" ng-if="myform.form_fields.length > 1">
|
||||
<h4> Logic Jump </h4>
|
||||
</div>
|
||||
<div class="row" ng-if="myform.form_fields.length > 1 && myform.form_fields[$index].logicJump.fieldA">
|
||||
<div class="row" ng-if="myform.form_fields.length > 1">
|
||||
<div class="col-md-4 col-xs-12 field-input">{{ 'ADD_LOGIC_JUMP' | translate }}</div>
|
||||
<div class="col-md-8 col-xs-12 field-input">
|
||||
<label class="btn col-xs-5">
|
||||
@ -330,27 +330,73 @@
|
||||
|
||||
<div class="row question" ng-if="myform.form_fields.length > 1 && myform.form_fields[$index].logicJump.fieldA">
|
||||
<div class="col-md-4 col-sm-12">
|
||||
<!-- FIX ME: translate this -->
|
||||
<b> If this field </b>
|
||||
</div>
|
||||
<div class="col-md-4 col-sm-12">
|
||||
<select style="width:100%" ng-model="field.logicJump.expressionString"
|
||||
value="{{field.logicJump.expressionString}}"
|
||||
name="logicjump_expressionString{{field._id}}">
|
||||
<option value="a == b">
|
||||
<option value="field == static">
|
||||
<!-- FIX ME: translate this -->
|
||||
is equal to
|
||||
</option>
|
||||
<option value="a !== b">
|
||||
<option value="field != static">
|
||||
<!-- FIX ME: translate this -->
|
||||
is not equal to
|
||||
</option>
|
||||
|
||||
<option value="field > static" ng-if-start="field.fieldType === 'number' || field.fieldType === 'rating' || field.fieldType === 'number'">
|
||||
<!-- FIX ME: translate this -->
|
||||
is greater than
|
||||
</option>
|
||||
<option value="field >= static">
|
||||
<!-- FIX ME: translate this -->
|
||||
is greater or equal than
|
||||
</option>
|
||||
<option value="field < static">
|
||||
<!-- FIX ME: translate this -->
|
||||
is smaller than
|
||||
</option>
|
||||
<option value="field <= static" ng-if-end>
|
||||
<!-- FIX ME: translate this -->
|
||||
is smaller or equal than
|
||||
</option>
|
||||
|
||||
<option value="field contains static" ng-if-start="field.fieldType !== 'number' && field.fieldType !== 'rating' && field.fieldType !== 'number'">
|
||||
<!-- FIX ME: translate this -->
|
||||
contains
|
||||
</option>
|
||||
<option value="field !contains static">
|
||||
<!-- FIX ME: translate this -->
|
||||
does not contain
|
||||
</option>
|
||||
<option value="field ends static">
|
||||
<!-- FIX ME: translate this -->
|
||||
ends with
|
||||
</option>
|
||||
<option value="field !ends static">
|
||||
<!-- FIX ME: translate this -->
|
||||
does not end with
|
||||
</option>
|
||||
<option value="field starts static">
|
||||
<!-- FIX ME: translate this -->
|
||||
starts with
|
||||
</option>
|
||||
<option value="field !starts static" ng-if-end>
|
||||
<!-- FIX ME: translate this -->
|
||||
does not start with
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-4 col-sm-12">
|
||||
<input type="text" ng-model="field.logicJump.valueB"/>
|
||||
</div>
|
||||
<div class="col-md-4 col-md-offset-2">
|
||||
<div class="col-md-2">
|
||||
<!-- FIX ME: translate this -->
|
||||
<b>Jumps to </b>
|
||||
</div>
|
||||
<div class="col-md-6 col-sm-12">
|
||||
<div class="col-md-10">
|
||||
<select style="width:100%" ng-model="field.logicJump.jumpTo"
|
||||
value="{{field.logicJump.jumpTo}}"
|
||||
name="logicjump_jumpTo{{field._id}}">
|
||||
|
Loading…
Reference in New Issue
Block a user