kantime-rule-engine
Version:
A library for custom validation in the form based on the user defined json schema.
389 lines (315 loc) • 13.5 kB
JavaScript
let _ = require("lodash");
let _jQ = require("jsonq");
import { Engine } from './ruleEngine.js';
import { isNullOrUndefined } from 'util';
import { skipActionlibrary, eventActionlibrary, FormStateActionlibrary } from './engineActionlibrary.js'
import { RuleParser,RuleTraversal } from './ruleEngineParser';
let engine_EventsInfo = [];
let engine_Inputdata={};
let engine_MasterRules={};
let engine_EvalFormRules={};
export const SetInputData = (EngineinputData,EnginemasterRules,EvalformRules) => {
try {
engine_Inputdata = EngineinputData;
engine_MasterRules = EnginemasterRules;
engine_EvalFormRules = EvalformRules;
} catch (error) {
throw error
}
}
export const SkipRuleEngine = (RulesfromUI) => {
let Output = {};
try {
console.log('Skip Rule Engine started.');
let StateMasterRules = {};
let FormRules = {};
StateMasterRules = GetMasterRulesFromState("SkipLogic");
if (!isNullOrUndefined(RulesfromUI) && RulesfromUI.length > 0) { //Executed On Event Called
FormRules = GetFormRules("SkipLogic", RulesfromUI);
}
else { //Executed On Page Load
FormRules = GetFormRules("SkipLogic", "");
Eventcollector(StateMasterRules, FormRules.ValidFormRules, "SkipLogic");
}
Output = EngineExecution(StateMasterRules, FormRules, "RuleSetForSkipLogic");
console.log({Output})
if (!isNullOrUndefined(Output)) {
skipActionlibrary(Output.EngineResult);
}
console.log('Skip Rule Engine End.');
console.log('===============================');
} catch (error) {
throw error;
}
return Output;
}
export const EventDrivenRuleEngine = (RulesfromUI) => {
let Output = {};
try {
console.log('Event Driven Rule Engine started.');
let StateMasterRules = {};
let FormRules = {};
StateMasterRules = GetMasterRulesFromState("EventDriven");
if (!isNullOrUndefined(RulesfromUI) && RulesfromUI.length > 0) { //Executed On Event Called
FormRules = GetFormRules("EventDriven", RulesfromUI);
}
else { //Executed On Page Load
FormRules = GetFormRules("EventDriven", "");
Eventcollector(StateMasterRules, FormRules.ValidFormRules, "EventDriven");
}
Output = EngineExecution(StateMasterRules, FormRules, "RuleSetForEventDriven");
if (!isNullOrUndefined(Output)) {
eventActionlibrary(Output.EngineResult,StateMasterRules);
}
console.log('Event Driven Rule Engine End.');
console.log('===============================');
} catch (error) {
throw error;
}
return Output;
}
export const FormStateRuleEngine = (RulesfromUI) => {
let Output = {};
try {
console.log('Form State Rule Engine started.')
let StateMasterRules = {};
let FormRules = {};
StateMasterRules = GetMasterRulesFromState("FormState");
if (!isNullOrUndefined(RulesfromUI) && RulesfromUI.length > 0) {
FormRules = GetFormRules("FormState", RulesfromUI);
}
else {
FormRules = GetFormRules("FormState", "");
}
Output = EngineExecution(StateMasterRules, FormRules, "RuleSetForFormState");
if (!isNullOrUndefined(Output)) {
FormStateActionlibrary(Output.EngineResult);
}
console.log('Form State Rule Engine End.');
console.log('===============================');
} catch (error) {
throw error;
}
return Output;
}
function EngineExecution(MasterRules, FormRules, RuleSetInternalname) {
let Output = {};
try {
let _FormRules = {};
let _MasterRulesForEngine = {};
_jQ.setPathValue(_MasterRulesForEngine, [RuleSetInternalname], MasterRules);
_jQ.setPathValue(_FormRules, [RuleSetInternalname], FormRules.ValidFormRules);
_jQ.setPathValue(Output, ["InValidFormRules"], FormRules.InValidFormRules);
let EngineResult = Engine(engine_Inputdata, _FormRules, _MasterRulesForEngine);
_jQ.setPathValue(Output, ["EngineResult"], EngineResult);
} catch (error) {
throw error
}
return Output;
}
function GetFormRules(fromcontext, RulesfromUI) {
let Output = {};
try {
let StateFormRules = GetFormRulesFromContext(fromcontext);
let ValidFormRules = [];
let InValidFormRules = [];
if (!isNullOrUndefined(RulesfromUI) && RulesfromUI.length > 0) {
_.each(RulesfromUI, (item, index) => {
if (_jQ.contains(StateFormRules, item))
ValidFormRules.push(item);
else
InValidFormRules.push(item);
});
}
else {
ValidFormRules = StateFormRules;
}
_jQ.setPathValue(Output, ["InValidFormRules"], InValidFormRules);
_jQ.setPathValue(Output, ["ValidFormRules"], ValidFormRules);
} catch (error) {
throw error
}
return Output;
}
function GetMasterRulesFromState(fromcontext) {
let OutResult = {};
// let _MasterRules = GetMasterRules();
try {
if (fromcontext == "SkipLogic") {
OutResult = _jQ.pathValue(engine_MasterRules, ["RuleSetForSkipLogic"]);
}
if (fromcontext == "EventDriven") {
OutResult = _jQ.pathValue(engine_MasterRules, ["RuleSetForEventDriven"]);
}
if (fromcontext == "FormState") {
OutResult = _jQ.pathValue(engine_MasterRules, ["RuleSetForFormState"]);
}
} catch (error) {
throw error;
}
return OutResult;
}
function GetFormRulesFromContext(fromcontext) {
let OutResult = {};
// let _FormRules = GetFormRulesfromRedux();
try {
if (fromcontext == "SkipLogic") {
OutResult = _jQ.pathValue(engine_EvalFormRules, ["RuleSetForSkipLogic"]);
}
if (fromcontext == "EventDriven") {
OutResult = _jQ.pathValue(engine_EvalFormRules, ["RuleSetForEventDriven"]);
}
if (fromcontext == "FormState") {
OutResult = _jQ.pathValue(engine_EvalFormRules, ["RuleSetForFormState"]);
}
} catch (error) {
throw error;
}
return OutResult;
}
// engine_EventsInfo = [
// {
// id: "txthhhd",
// Events: [
// { EventType: "onfocus", EventRules: ["skip.Rule1", "formstate.Rule2"] },
// { EventType: "onChange", EventRules: ["skip.Rule1", "formstate.Rule2"] }
// ]
// }
// ]
function Eventcollector(MasterRule, FormRules, fromcontext) {
try {
if (fromcontext == "SkipLogic") {
_.each(FormRules, (RuleID, i) => {
try
{
let Eventnames = _jQ.pathValue(MasterRule, [RuleID, "actionData", "Skip", "event"]);
let srceleinfo = _jQ.pathValue(MasterRule, [RuleID, "actionData", "Skip", "srcEleInfo"]);
if (isNullOrUndefined(Eventnames)) {
Eventnames = "focusout";
}
if (!isNullOrUndefined(srceleinfo) && !isNullOrUndefined(Eventnames))
Eventfinder("skip.", Eventnames, srceleinfo, RuleID);
}
catch(error)
{
console.log(error);
}
});
}
if (fromcontext == "EventDriven") {
_.each(FormRules, (RuleID, i) => {
try
{
let Eventnames = _jQ.pathValue(MasterRule, [RuleID, "actionData", "Mandate", "event"]);
let srceleinfo = _jQ.pathValue(MasterRule, [RuleID, "actionData", "Mandate", "srcEleInfo"]);
if (!isNullOrUndefined(srceleinfo) && !isNullOrUndefined(Eventnames))
Eventfinder("eventdriven.", Eventnames, srceleinfo, RuleID);
let tgtEleInfo = _jQ.pathValue(MasterRule, [RuleID, "actionData", "Mandate", "tgtEleInfo"]);
if (!isNullOrUndefined(tgtEleInfo)) {
_.each(tgtEleInfo, (tgele, j) => {
Eventfinder("eventdriven.", tgele.event, tgele.eleinfo, RuleID);
});
}
}
catch(error)
{
console.log(error);
}
});
}
} catch (error) {
throw error
}
}
function Eventfinder(frmtxt, Eventnames, srceleinfo, RuleID) {
try {
if(!isNullOrUndefined(srceleinfo)){
_.each(srceleinfo,(srcele,indx)=>{
if(indx!=0 && !isNullOrUndefined(srcele)) {
if (!(_jQ.contains(engine_EventsInfo, { "id": srcele }, true))) {
let eventsdetail = {};
eventsdetail = _jQ.setPathValue(eventsdetail, ["id"], srcele);
if (!isNullOrUndefined(Eventnames)) {
_.each(Eventnames.split(','), (evt, i) => {
eventsdetail = _jQ.setPathValue(eventsdetail, ["Events", i, "EventType"], evt);
eventsdetail = _jQ.setPathValue(eventsdetail, ["Events", i, "EventRules", 0], frmtxt + RuleID);
});
}
engine_EventsInfo.push(eventsdetail);
}
else {
let existseleindex = _jQ.index(engine_EventsInfo, { "id": srcele }, true);
if (!isNullOrUndefined(Eventnames)) {
_.each(Eventnames.split(','), (evt, i) => {
if (_jQ.contains(engine_EventsInfo[existseleindex].Events, { "EventType": evt }, true)) {
let existseventtypeindex = _jQ.index(engine_EventsInfo[existseleindex].Events, { "EventType": evt }, true);
if (engine_EventsInfo[existseleindex].Events[existseventtypeindex].EventRules.indexOf(frmtxt + RuleID) < 0)
engine_EventsInfo[existseleindex].Events[existseventtypeindex].EventRules.push(frmtxt + RuleID);
}
else {
let Event = {};
_jQ.setPathValue(Event, ["EventType"], evt);
_jQ.setPathValue(Event, ["EventRules", 0], frmtxt + RuleID);
engine_EventsInfo[existseleindex].Events.push(Event);
}
});
}
}
}
});
}
} catch (error) {
throw error
}
}
export const EventBinding = () => {
try {
if (engine_EventsInfo.length > 0) {
_.each(engine_EventsInfo, (eng_Evtinfo, i) => {
var inputele = document.getElementById(eng_Evtinfo.id);
if (!isNullOrUndefined(inputele) && !isNullOrUndefined(eng_Evtinfo.Events)) {
_.each(eng_Evtinfo.Events, (evt) => {
inputele.addEventListener(evt.EventType, function () { EventEngineexecution(evt.EventRules) });
});
}
});
}
} catch (error) {
throw error;
}
}
export const EventEngineexecution = (EngineRuleList) => {
try {
let EventDrivenRules = [];
let skipRules = [];
if (EngineRuleList.length > 0 && !isNullOrUndefined(EngineRuleList)) {
EngineRuleList.map((item) => {
if (item.indexOf('eventdriven') > -1)
EventDrivenRules.push(item.split('.')[1]);
if (item.indexOf('skip') > -1)
skipRules.push(item.split('.')[1]);
});
if (!isNullOrUndefined(skipRules) && skipRules.length > 0)
SkipRuleEngine(skipRules);
if (!isNullOrUndefined(EventDrivenRules) && EventDrivenRules.length > 0)
EventDrivenRuleEngine(EventDrivenRules);
}
} catch (error) {
throw error
}
}
export const GetRuleEvalOutput = (RulesQueue, RuleSetDefinition) => {
let getRefRuleQueue=[];
getRefRuleQueue = RuleTraversal(RulesQueue, RuleSetDefinition);
let RuleOutput = RuleParser(getRefRuleQueue.items, RuleSetDefinition,engine_Inputdata);
return RuleOutput.Rule;
}
export const OnDemandRuleEngineExecution = (formRules) => {
let Output = {};
try {
Output = Engine(engine_Inputdata, formRules, engine_MasterRules)
} catch (error) {
throw error
}
return Output;
}