opnform/resources/js/forms/FormLogicConditionChecker.js

326 lines
11 KiB
JavaScript

export function conditionsMet (conditions, formData) {
if (conditions === undefined || conditions === null) {
return false
}
// If it's not a group, just a single condition
if (conditions.operatorIdentifier === undefined) {
return propertyConditionMet(conditions.value, conditions.value ? formData[conditions.value.property_meta.id] : null)
}
if (conditions.operatorIdentifier === 'and') {
let isvalid = true
conditions.children.forEach(childrenCondition => {
if (!conditionsMet(childrenCondition, formData)) {
isvalid = false
}
})
return isvalid
} else if (conditions.operatorIdentifier === 'or') {
let isvalid = false
conditions.children.forEach(childrenCondition => {
if (conditionsMet(childrenCondition, formData)) {
isvalid = true
}
})
return isvalid
}
throw new Error('Unexcepted operatorIdentifier:' + conditions.operatorIdentifier)
}
function propertyConditionMet (propertyCondition, value) {
if (!propertyCondition) {
return false
}
switch (propertyCondition.property_meta.type) {
case 'text':
case 'url':
case 'email':
case 'phone_number':
return textConditionMet(propertyCondition, value)
case 'number':
return numberConditionMet(propertyCondition, value)
case 'checkbox':
return checkboxConditionMet(propertyCondition, value)
case 'select':
return selectConditionMet(propertyCondition, value)
case 'date':
return dateConditionMet(propertyCondition, value)
case 'multi_select':
return multiSelectConditionMet(propertyCondition, value)
case 'files':
return filesConditionMet(propertyCondition, value)
}
return false
}
function checkEquals (condition, fieldValue) {
return condition.value === fieldValue
}
function checkContains (condition, fieldValue) {
return (fieldValue) ? fieldValue.includes(condition.value) : false
}
function checkListContains (condition, fieldValue) {
if (!fieldValue) return false
if (Array.isArray(condition.value)) {
return condition.value.every(r => fieldValue.includes(r))
} else {
return fieldValue.includes(condition.value)
}
}
function checkStartsWith (condition, fieldValue) {
return fieldValue.startsWith(condition.value)
}
function checkendsWith (condition, fieldValue) {
return fieldValue && fieldValue.endsWith(condition.value)
}
function checkIsEmpty (condition, fieldValue) {
return (!fieldValue || fieldValue.length === 0)
}
function checkGreaterThan (condition, fieldValue) {
return (condition.value && fieldValue && parseFloat(fieldValue) > parseFloat(condition.value))
}
function checkGreaterThanEqual (condition, fieldValue) {
return (condition.value && fieldValue && parseFloat(fieldValue) >= parseFloat(condition.value))
}
function checkLessThan (condition, fieldValue) {
return (condition.value && fieldValue && parseFloat(fieldValue) < parseFloat(condition.value))
}
function checkLessThanEqual (condition, fieldValue) {
return (condition.value && fieldValue && parseFloat(fieldValue) <= parseFloat(condition.value))
}
function checkBefore (condition, fieldValue) {
return (condition.value && fieldValue && fieldValue > condition.value)
}
function checkAfter (condition, fieldValue) {
return (condition.value && fieldValue && fieldValue < condition.value)
}
function checkOnOrBefore (condition, fieldValue) {
return (condition.value && fieldValue && fieldValue >= condition.value)
}
function checkOnOrAfter (condition, fieldValue) {
return (condition.value && fieldValue && fieldValue <= condition.value)
}
function checkPastWeek (condition, fieldValue) {
if (!fieldValue) return false
const fieldDate = new Date(fieldValue)
const today = new Date()
return (fieldDate <= today && fieldDate >= new Date(today.getFullYear(), today.getMonth(), today.getDate() - 7))
}
function checkPastMonth (condition, fieldValue) {
if (!fieldValue) return false
const fieldDate = new Date(fieldValue)
const today = new Date()
return (fieldDate <= today && fieldDate >= new Date(today.getFullYear(), today.getMonth() - 1, today.getDate()))
}
function checkPastYear (condition, fieldValue) {
if (!fieldValue) return false
const fieldDate = new Date(fieldValue)
const today = new Date()
return (fieldDate <= today && fieldDate >= new Date(today.getFullYear() - 1, today.getMonth(), today.getDate()))
}
function checkNextWeek (condition, fieldValue) {
if (!fieldValue) return false
const fieldDate = new Date(fieldValue)
const today = new Date()
return (fieldDate >= today && fieldDate <= new Date(today.getFullYear(), today.getMonth(), today.getDate() + 7))
}
function checkNextMonth (condition, fieldValue) {
if (!fieldValue) return false
const fieldDate = new Date(fieldValue)
const today = new Date()
return (fieldDate >= today && fieldDate <= new Date(today.getFullYear(), today.getMonth() + 1, today.getDate()))
}
function checkNextYear (condition, fieldValue) {
if (!fieldValue) return false
const fieldDate = new Date(fieldValue)
const today = new Date()
return (fieldDate >= today && fieldDate <= new Date(today.getFullYear() + 1, today.getMonth(), today.getDate()))
}
function checkLength (condition, fieldValue, operator = '===') {
if(!fieldValue || fieldValue.length === 0) return false;
switch (operator) {
case '===':
return fieldValue.length === parseInt(condition.value)
case '!==':
return fieldValue.length !== parseInt(condition.value)
case '>':
return fieldValue.length > parseInt(condition.value)
case '>=':
return fieldValue.length >= parseInt(condition.value)
case '<':
return fieldValue.length < parseInt(condition.value)
case '<=':
return fieldValue.length <= parseInt(condition.value)
}
return false
}
function textConditionMet (propertyCondition, value) {
switch (propertyCondition.operator) {
case 'equals':
return checkEquals(propertyCondition, value)
case 'does_not_equal':
return !checkEquals(propertyCondition, value)
case 'contains':
return checkContains(propertyCondition, value)
case 'does_not_contain':
return !checkContains(propertyCondition, value)
case 'starts_with':
return checkStartsWith(propertyCondition, value)
case 'ends_with':
return checkendsWith(propertyCondition, value)
case 'is_empty':
return checkIsEmpty(propertyCondition, value)
case 'is_not_empty':
return !checkIsEmpty(propertyCondition, value)
case 'content_length_equals':
return checkLength(propertyCondition, value, '===')
case 'content_length_does_not_equal':
return checkLength(propertyCondition, value, '!==')
case 'content_length_greater_than':
return checkLength(propertyCondition, value, '>')
case 'content_length_greater_than_or_equal_to':
return checkLength(propertyCondition, value, '>=')
case 'content_length_less_than':
return checkLength(propertyCondition, value, '<')
case 'content_length_less_than_or_equal_to':
return checkLength(propertyCondition, value, '<=')
}
return false
}
function numberConditionMet (propertyCondition, value) {
switch (propertyCondition.operator) {
case 'equals':
return checkEquals(propertyCondition, value)
case 'does_not_equal':
return !checkEquals(propertyCondition, value)
case 'greater_than':
return checkGreaterThan(propertyCondition, value)
case 'less_than':
return checkLessThan(propertyCondition, value)
case 'greater_than_or_equal_to':
return checkGreaterThanEqual(propertyCondition, value)
case 'less_than_or_equal_to':
return checkLessThanEqual(propertyCondition, value)
case 'is_empty':
return checkIsEmpty(propertyCondition, value)
case 'is_not_empty':
return checkIsEmpty(propertyCondition, value)
case 'content_length_equals':
return checkLength(propertyCondition, value, '===')
case 'content_length_does_not_equal':
return checkLength(propertyCondition, value, '!==')
case 'content_length_greater_than':
return checkLength(propertyCondition, value, '>')
case 'content_length_greater_than_or_equal_to':
return checkLength(propertyCondition, value, '>=')
case 'content_length_less_than':
return checkLength(propertyCondition, value, '<')
case 'content_length_less_than_or_equal_to':
return checkLength(propertyCondition, value, '<=')
}
return false
}
function checkboxConditionMet (propertyCondition, value) {
switch (propertyCondition.operator) {
case 'equals':
return checkEquals(propertyCondition, value)
case 'does_not_equal':
return !checkEquals(propertyCondition, value)
}
return false
}
function selectConditionMet (propertyCondition, value) {
switch (propertyCondition.operator) {
case 'equals':
return checkEquals(propertyCondition, value)
case 'does_not_equal':
return !checkEquals(propertyCondition, value)
case 'is_empty':
return checkIsEmpty(propertyCondition, value)
case 'is_not_empty':
return !checkIsEmpty(propertyCondition, value)
}
return false
}
function dateConditionMet (propertyCondition, value) {
switch (propertyCondition.operator) {
case 'equals':
return checkEquals(propertyCondition, value)
case 'before':
return checkBefore(propertyCondition, value)
case 'after':
return checkAfter(propertyCondition, value)
case 'on_or_before':
return checkOnOrBefore(propertyCondition, value)
case 'on_or_after':
return checkOnOrAfter(propertyCondition, value)
case 'is_empty':
return checkIsEmpty(propertyCondition, value)
case 'past_week':
return checkPastWeek(propertyCondition, value)
case 'past_month':
return checkPastMonth(propertyCondition, value)
case 'past_year':
return checkPastYear(propertyCondition, value)
case 'next_week':
return checkNextWeek(propertyCondition, value)
case 'next_month':
return checkNextMonth(propertyCondition, value)
case 'next_year':
return checkNextYear(propertyCondition, value)
}
return false
}
function multiSelectConditionMet (propertyCondition, value) {
switch (propertyCondition.operator) {
case 'contains':
return checkListContains(propertyCondition, value)
case 'does_not_contain':
return !checkListContains(propertyCondition, value)
case 'is_empty':
return checkIsEmpty(propertyCondition, value)
case 'is_not_empty':
return !checkIsEmpty(propertyCondition, value)
}
return false
}
function filesConditionMet (propertyCondition, value) {
switch (propertyCondition.operator) {
case 'is_empty':
return checkIsEmpty(propertyCondition, value)
case 'is_not_empty':
return !checkIsEmpty(propertyCondition, value)
}
return false
}