From 440c13cc490c7e9d309e9e457bc46c5f8030dae7 Mon Sep 17 00:00:00 2001 From: Narayanan Madaswamy Date: Sun, 2 Aug 2026 10:37:20 +0530 Subject: [PATCH] Code Refactored --- .../WEB-INF/app/edp/punching/initcase.jsp | 72 +- .../build/WebContent/css/div.css | 3 +- .../js/edp/{ => punching}/application-save.js | 23 +- .../js/edp/punching/initiation-validation.js | 75 + .../js/edp/{ => punching}/initiation.js | 1244 ++++++++--------- .../WebContent/js/lib/form-validation.js | 150 ++ .../build/WebContent/js/lib/notifications.js | 19 +- .../nimble/utilities/CommonFunctions.java | 39 +- .../nimble/RoleVisibleBatchMigrationTest.java | 2 +- .../nimble/utilities/CommonFunctionsTest.java | 49 + 10 files changed, 987 insertions(+), 689 deletions(-) rename cygnus-onprem-app/build/WebContent/js/edp/{ => punching}/application-save.js (80%) create mode 100644 cygnus-onprem-app/build/WebContent/js/edp/punching/initiation-validation.js rename cygnus-onprem-app/build/WebContent/js/edp/{ => punching}/initiation.js (80%) create mode 100644 cygnus-onprem-app/build/WebContent/js/lib/form-validation.js create mode 100644 cygnus-onprem-app/src/test/java/matrix/nimble/utilities/CommonFunctionsTest.java diff --git a/cygnus-onprem-app/build/WebContent/WEB-INF/app/edp/punching/initcase.jsp b/cygnus-onprem-app/build/WebContent/WEB-INF/app/edp/punching/initcase.jsp index ebfb5c5..f3c127b 100644 --- a/cygnus-onprem-app/build/WebContent/WEB-INF/app/edp/punching/initcase.jsp +++ b/cygnus-onprem-app/build/WebContent/WEB-INF/app/edp/punching/initcase.jsp @@ -20,10 +20,12 @@ + - - + + + @@ -115,7 +117,7 @@ Appl No.
- +
@@ -123,7 +125,7 @@ Bank Code
- +
@@ -132,7 +134,7 @@
- @@ -152,7 +154,7 @@
- @@ -167,7 +169,7 @@ Name
- +
@@ -184,7 +186,7 @@
- @@ -264,10 +266,10 @@
Residence Details -
- RVR  - Same Resi - RTV +
+ RVR  + Same Resi + RTV
@@ -372,11 +374,11 @@
Office Details -
- OVR  - RCO  - Same Office - OTV +
+ OVR  + RCO  + Same Office + OTV
@@ -473,7 +475,7 @@

- +
@@ -508,11 +510,11 @@
Property Details -
- PVR  - RCP  - OCP  - Same Property +
+ PVR  + RCP  + OCP  + Same Property
@@ -527,7 +529,7 @@

- +
@@ -582,7 +584,7 @@

- +
@@ -608,7 +610,7 @@
Reference Details -
+
Ref Check 
@@ -673,7 +675,7 @@
Document Details -
+
Doc VR 
@@ -696,10 +698,8 @@ - - -
- + +
@@ -722,8 +722,9 @@ diff --git a/cygnus-onprem-app/build/WebContent/css/div.css b/cygnus-onprem-app/build/WebContent/css/div.css index 36d1014..0471348 100644 --- a/cygnus-onprem-app/build/WebContent/css/div.css +++ b/cygnus-onprem-app/build/WebContent/css/div.css @@ -75,7 +75,8 @@ right:8px; cursor:pointer; } -.title #ctrldiv +.title #ctrldiv, +.title .ctrldiv { border:none; position:relative; diff --git a/cygnus-onprem-app/build/WebContent/js/edp/application-save.js b/cygnus-onprem-app/build/WebContent/js/edp/punching/application-save.js similarity index 80% rename from cygnus-onprem-app/build/WebContent/js/edp/application-save.js rename to cygnus-onprem-app/build/WebContent/js/edp/punching/application-save.js index 4f54fa7..6a372e5 100644 --- a/cygnus-onprem-app/build/WebContent/js/edp/application-save.js +++ b/cygnus-onprem-app/build/WebContent/js/edp/punching/application-save.js @@ -41,7 +41,12 @@ const INTEGER_FIELDS = new Set(["applicationId", "portfolioId", "bankBranchId", "residenceColonyId", "officeColonyId", "propertyColonyId", "formMode"]); const element = (id) => document.getElementById(id); - const value = (id) => element(id)?.value?.trim() ?? ""; + const value = (id) => { + const field = element(id); + if (!field) return ""; + window.CygnusFormValidation.sanitizeElement(field); + return field.value?.trim() ?? ""; + }; const integer = (id) => { const parsed = Number.parseInt(value(id), 10); return Number.isFinite(parsed) ? parsed : 0; @@ -74,24 +79,14 @@ notify("danger", "APP-4221", "At least one verification type is required."); return false; } - window.invalidFields = 0; - window.validate(element("applno"), "t", "AlphaNumeric"); - window.validate(element("bank_branch_id"), "t", ""); - window.validate(element("product"), "t", ""); - window.validate(element("customername"), "t", "AlphaSpace"); - window.validate(element("apptype"), "t", ""); - if (checked("rv")) window.CheckForm(element("rv"), "raddr1,raddr2,raddr3,rlandmark,colr,rcity,rpincode", "t,f,t,f,t,t,f", "SplInstruction,SplInstruction,SplInstruction,SplInstruction,SplInstruction,,Pincode"); - if (checked("ov")) window.CheckForm(element("ov"), "companyname,oaddr1,oaddr2,oaddr3,olandmark,colo,ocity,opincode,department,designation", "f,t,f,t,f,t,t,f,f,f", "SplInstruction,SplInstruction,SplInstruction,SplInstruction,SplInstruction,SplInstruction,,Pincode,SplInstruction,SplInstruction"); - if (checked("pv")) window.CheckForm(element("pv"), "paddr1,paddr2,paddr3,plandmark,colp,pcity,ppincode", "t,f,t,f,t,t,f", "SplInstruction,SplInstruction,SplInstruction,SplInstruction,SplInstruction,,Pincode"); - if (checked("rtv")) window.CheckForm(element("rtv"), "rphone", "t", "Phone"); - if (checked("otv")) window.CheckForm(element("otv"), "ophone", "t", "Phone"); - if (checked("refv")) window.CheckForm(element("refv"), "refname1,refaddress1,refcontactno1", "t,f,t", "AlphaSpace,SplInstruction,Phone"); + const validation = window.CygnusInitiationValidation.validateForm(); [["rv", "Rcolony", "colr"], ["ov", "Ocolony", "colo"], ["pv", "Pcolony", "colp"]] .forEach(([flag, hidden, visible]) => { if (checked(flag) && integer(hidden) === 0) window.highlightField(element(visible)); }); - if (document.querySelector(".matrix-validation-error-icon")) { + if (!validation.valid || document.querySelector(".matrix-validation-error-icon")) { notify("danger", "APP-4221", "Correct the highlighted fields and submit the application again."); + validation.invalid[0]?.focus(); return false; } return true; diff --git a/cygnus-onprem-app/build/WebContent/js/edp/punching/initiation-validation.js b/cygnus-onprem-app/build/WebContent/js/edp/punching/initiation-validation.js new file mode 100644 index 0000000..f1085c8 --- /dev/null +++ b/cygnus-onprem-app/build/WebContent/js/edp/punching/initiation-validation.js @@ -0,0 +1,75 @@ +(function (window, document) { + "use strict"; + + const element = (id) => document.getElementById(id); + const checked = (id) => Boolean(element(id)?.checked); + const requiredWhen = (id) => () => checked(id); + const sectionRule = (id, rule = {}) => Object.assign({ when: requiredWhen(id) }, rule); + const RULES = { + applno: { required: true, format: "AlphaNumeric", requiredMessage: "Application number is required." }, + bank_branch_id: { required: true, requiredMessage: "Bank branch is required." }, + product: { required: true, requiredMessage: "Product is required." }, + customername: { required: true, format: "AlphaSpace", requiredMessage: "Customer name is required." }, + apptype: { required: true, requiredMessage: "Application type is required." }, + bankcode: { format: "AlphaNumeric" }, fathername: { format: "AlphaSpace" }, dob: { format: "Date" }, + mobileno: { format: "AllowWrong" }, loanamount: { format: "LoanAmount" }, + contactperson: { format: "AlphaSpace" }, specialinst: { format: "SplInstruction" }, + raddr1: sectionRule("rv", { required: true, format: "SplInstruction" }), raddr2: sectionRule("rv", { format: "SplInstruction" }), + raddr3: sectionRule("rv", { required: true, format: "SplInstruction" }), rlandmark: sectionRule("rv", { format: "SplInstruction" }), + rcity: sectionRule("rv", { required: true }), colr: sectionRule("rv", { required: true, format: "SplInstruction" }), + rpincode: sectionRule("rv", { format: "Pincode" }), rphone: sectionRule("rtv", { required: true, format: "Phone" }), + companyname: sectionRule("ov", { format: "SplInstruction" }), oaddr1: sectionRule("ov", { required: true, format: "SplInstruction" }), + oaddr2: sectionRule("ov", { format: "SplInstruction" }), oaddr3: sectionRule("ov", { required: true, format: "SplInstruction" }), + olandmark: sectionRule("ov", { format: "SplInstruction" }), ocity: sectionRule("ov", { required: true }), + colo: sectionRule("ov", { required: true, format: "SplInstruction" }), opincode: sectionRule("ov", { format: "Pincode" }), + department: sectionRule("ov", { format: "SplInstruction" }), designation: sectionRule("ov", { format: "SplInstruction" }), + ophone: sectionRule("otv", { required: true, format: "Phone" }), extension: sectionRule("otv", { format: "Extension" }), + paddr1: sectionRule("pv", { required: true, format: "SplInstruction" }), paddr2: sectionRule("pv", { format: "SplInstruction" }), + paddr3: sectionRule("pv", { required: true, format: "SplInstruction" }), plandmark: sectionRule("pv", { format: "SplInstruction" }), + pcity: sectionRule("pv", { required: true }), colp: sectionRule("pv", { required: true, format: "SplInstruction" }), + ppincode: sectionRule("pv", { format: "Pincode" }), refname1: sectionRule("refv", { required: true, format: "AlphaSpace" }), + refaddress1: sectionRule("refv", { format: "SplInstruction" }), + refcontactno1: sectionRule("refv", { required: true, format: "Phone" }), + refname2: sectionRule("refv", { format: "AlphaSpace" }), refaddress2: sectionRule("refv", { format: "SplInstruction" }), + refcontactno2: sectionRule("refv", { format: "Phone" }) + }; + + function registerDynamicRules(form) { + if (!form) return; + form.querySelectorAll("#FormPanel6 [data-validation-required]").forEach(function (field) { + const label = field.closest(".widget")?.querySelector(".lblcontainer")?.textContent.trim(); + RULES[field.id] = { + required: field.dataset.validationRequired === "true", + format: field.dataset.validationFormat || "", + requiredMessage: (label || "This dynamic field") + " is required." + }; + }); + } + + function validateField(field) { + const target = typeof field === "string" ? element(field) : field; + const rule = target && RULES[target.id]; + return !target || !rule || window.CygnusFormValidation.validateElement(target, rule); + } + + function validateForm() { + return window.CygnusFormValidation.validateRules(RULES); + } + + function bind(form) { + if (!form || form.dataset.initiationValidationBound === "true") return; + registerDynamicRules(form); + form.dataset.initiationValidationBound = "true"; + form.addEventListener("focusout", function (event) { + window.CygnusFormValidation.sanitizeElement(event.target); + validateField(event.target); + }); + } + + window.CygnusInitiationValidation = Object.freeze({ + rules: RULES, + bind: bind, + validateField: validateField, + validateForm: validateForm + }); +}(window, document)); diff --git a/cygnus-onprem-app/build/WebContent/js/edp/initiation.js b/cygnus-onprem-app/build/WebContent/js/edp/punching/initiation.js similarity index 80% rename from cygnus-onprem-app/build/WebContent/js/edp/initiation.js rename to cygnus-onprem-app/build/WebContent/js/edp/punching/initiation.js index 6cad60e..26c0a47 100644 --- a/cygnus-onprem-app/build/WebContent/js/edp/initiation.js +++ b/cygnus-onprem-app/build/WebContent/js/edp/punching/initiation.js @@ -6,19 +6,19 @@ * workflow is intentionally isolated in application-save.js. */ var records=new Array(1); -var fields=new Array(1); -var recIndx = 0; -var recpos = 0; -var autocut = 0; -var SameAddr=new Array(0); -var AddrElem=new Array(4); -var selectedAddr=-1; -var FocusAfter="customername"; -AddrElem[0]=["rv","raddr1","raddr2","raddr3","rlandmark","Rcolony","colr","rcity","rpincode","rphone"]; -AddrElem[1]=["ov","companyname","oaddr1","oaddr2","oaddr3","olandmark","Ocolony","colo","ocity","opincode","ophone","extension"]; -AddrElem[2]=["pv","paddr1","paddr2","paddr3","plandmark","Pcolony","colp","pcity","ppincode"]; -AddrElem[3]=["bankcode","bankcode","bank_branch_id","product","loanamount","apptype","contactperson","specialinst"]; - +var fields=new Array(1); +var recIndx = 0; +var recpos = 0; +var autocut = 0; +var SameAddr=new Array(0); +var AddrElem=new Array(4); +var selectedAddr=-1; +var FocusAfter="customername"; +AddrElem[0]=["rv","raddr1","raddr2","raddr3","rlandmark","Rcolony","colr","rcity","rpincode","rphone"]; +AddrElem[1]=["ov","companyname","oaddr1","oaddr2","oaddr3","olandmark","Ocolony","colo","ocity","opincode","ophone","extension"]; +AddrElem[2]=["pv","paddr1","paddr2","paddr3","plandmark","Pcolony","colp","pcity","ppincode"]; +AddrElem[3]=["bankcode","bankcode","bank_branch_id","product","loanamount","apptype","contactperson","specialinst"]; + function InitPage() { var portField = document.getElementById("portfolio_id"); @@ -31,619 +31,611 @@ function InitPage() } centerDivBoth("formcontainer","H"); - HideSections('rtv'); - HideSections('otv'); - HideSections('section'); - UnhideSections(viscontents,ColDelim); + HideSections('rtv'); + HideSections('otv'); + HideSections('section'); + UnhideSections(viscontents,ColDelim); if (portField) { $(portField).val(port); } - if(port>0) - { - if(document.getElementById("ajaxmsg") !== null) - { - CallMessage('1001AJX:warning:Another operation is being processed, please wait..',3000,200,300); - return; - } - LoadingMsg("Fetching records, please wait...","ajaxmsg"); - RunAjax("GET","punchedrecs","val0="+port+"&val1="+($("#dynamicfields").val())+"&val2="+($("#uuid").val()),1); - } - -} - -function GotoRecord(el,searchtype) -{ -recno=el.value; -if(recno!='') - { - if(searchtype == 'recno') - { - if(recno > recIndx || recno <=0) - { - CallMessage('1001IRNG:error:Invalid input. Out of range',3000,200,300); - } - else - { - recpos=recno-1; - FillDetails(recpos); - } - } - else - { - for(index = 0; index < records.length; index++ ) - { - if( records[index][4] === recno ) { - recpos = index; - FillDetails(recpos); - break; - } - } - } - } -} -function AddNewRecord() -{ - if(recIndx== 0 || records[recIndx-1][0]!='0') - { - var cols=fields[0].length; - recIndx = recIndx+1; - recpos = recIndx-1; - records[recpos]=new Array(cols); - records[recpos][0]='0'; - records[recpos][1]=$("#portfolio_id").val(); - records[recpos][cols-4]='0'; - records[recpos][cols-3]=$("#company_id").val(); - records[recpos][cols-2]=$("#branch_id").val(); - records[recpos][cols-1]=''; - records[recpos][2]='******'; - } - else - { - recpos=recIndx-1; - } - FillDetails(recpos); -} -function AfterResponse(response,oprID) -{ - var rindx=0; - if(oprID==1) - { - $("#ajaxmsg").remove(); - if(response.trim().search('Error')==-1) - { - var rows=response.split(RowDelim); - for(rindx=0;rindx( 0 / "+(recIndx==0 ? "0" : recIndx)+" )"); - recpos=recIndx==0 ? 0 : recIndx-1; - FillDetails(recpos); - } - else if(oprID==2) - { - collen=fields[0].length; - $("#ajaxmsg").remove(); - if(response.trim().search('Error')==-1) - { - if(autocut==1) - { - records[recpos][collen-4]='1'; - } - if($("#case_id").val()!='0') - { - findRecord(3); - } - else - { - records[recpos][2]=response.split(ColDelim)[0]; - records[recpos][0]=response.split(ColDelim)[1]; - records[recpos][collen-1]=response.split(ColDelim)[2]; - AddNewRecord(); - } - CallMessage('1001IRNG:info:Record updated successfully',3000,200,300); - } - else - { - records[recpos][collen-4]='-1'; - CallMessage(response,3000,200,300); - } - } - else if(oprID==19 || oprID==20 || oprID==21 || oprID==22) - { - TabRows=response.split(RowDelim); - for(indx=0;indx0) tempPos=tempPos-1; - else return false; - } - if(arrOpr==3) - { - if(tempPos 0) - { - document.forms['casedetails'].reset(); - $("#recfound").html("( "+(indx+1)+" / "+(recIndx==0 ? "0" : recIndx)+" )"); - var findx=0; - for(findx=0;findx 0) - { - if(fields[0][findx]=='rv' || fields[0][findx]=='sradd' || fields[0][findx]=='rtv' || - fields[0][findx]=='ov' || fields[0][findx]=='soadd' || fields[0][findx]=='otv' || fields[0][findx]=='rco' - || fields[0][findx]=='pv' || fields[0][findx]=='rcp' || fields[0][findx]=='ocp' || fields[0][findx]=='spadd'|| fields[0][findx]=='refv'|| fields[0][findx]=='docv') - { - - if(fields[0][findx]=='docv') - { - if($("#"+fields[0][findx]).is(":visible")) - { - $("#"+fields[0][findx]).attr('checked',true); - } - } - else - { - if(records[indx][findx]=='1') - { - $("#"+fields[0][findx]).attr('checked',true); - } - else - { - $("#"+fields[0][findx]).attr('checked',false); - } - } - } - else - { - $("#"+fields[0][findx]).val(records[indx][findx]); - } - } - } - if($("#status").val()=='1') - { - $("#btnsave").hide(); - } - else - { - $("#btnsave").show(); - } - FireClickEvents(); - document.getElementById("applno").focus(); - } - else - { - CallMessage('5005MQRY:error:No records found',3000,200,300); - AddNewRecord(); - } -} -function FireClickEvents() -{ - HandleClick(document.getElementById('rv')); - HandleClick(document.getElementById('ov')); - HandleClick(document.getElementById('rtv')); - HandleClick(document.getElementById('otv')); - HandleClick(document.getElementById('pv')); - HandleClick(document.getElementById('refv')); -} -function FireToggleEvents() -{ - ToggleChks((document.getElementById('rv').checked && document.getElementById('ov').checked),'rco'+ColDelim,ColDelim); - ToggleChks((document.getElementById('apptype').value.toUpperCase()!='APPLICANT' && document.getElementById('apptype').value.toUpperCase()!='-1'),'sradd!C0L!soadd!C0L!spadd!C0L!','!C0L!'); - ToggleChks((document.getElementById('rv').checked),'rcp'+ColDelim,ColDelim); - ToggleChks((document.getElementById('ov').checked),'ocp'+ColDelim,ColDelim); -} -function HandleClick(el) -{ - if(el.id=='rv') - { - setFormValidation(el,'FormPanel2','raddr1,raddr2,raddr3,rlandmark,rcity,colr,rpincode','t,f,t,f,t,t,f','SplInstruction,SplInstruction,SplInstruction,SplInstruction,,SplInstruction,Pincode',document.getElementById('rtv').checked); - EnableDisableFields(el.checked,'raddr1,raddr2,raddr3,rlandmark,colr,rpincode',','); - } - if(el.id=='rtv') - { - setFormValidation(el,'FormPanel2','rphone','t','Phone',document.getElementById('rv').checked); - } - if(el.id=='ov') - { - setFormValidation(el,'FormPanel3','companyname,oaddr1,oaddr2,oaddr3,olandmark,ocity,colo,opincode,department,designation','f,t,f,t,f,t,t,f,f,f','SplInstruction,SplInstruction,SplInstruction,SplInstruction,SplInstruction,,SplInstruction,Pincode,SplInstruction,SplInstruction',document.getElementById('otv').checked); - EnableDisableFields(el.checked,'oaddr1,oaddr2,oaddr3,olandmark,colo,opincode',','); - } - if(el.id=='rco') - { - if(el.checked) - { - AutoFill('rco',1); - } - else - {AutoFill('rco',0);} - } - if(el.id=='otv') - { - setFormValidation(el,'FormPanel3','ophone','t','Phone',document.getElementById('ov').checked); - } - if(el.id=='pv') - { - setFormValidation(el,'FormPanel4','paddr1,paddr2,paddr3,plandmark,pcity,colp,ppincode','t,f,t,f,t,t,f','SplInstruction,SplInstruction,SplInstruction,SplInstruction,,SplInstruction,Pincode',false); - EnableDisableFields(el.checked,'paddr1,paddr2,paddr3,plandmark,colp,ppincode',','); - if(!el.checked) - { - chkrcp=document.getElementById('rcp'); - chkrcp.checked=false; - chkocp=document.getElementById('ocp'); - chkocp.checked=false; - } - } - if(el.id=='rcp') - { - if(el.checked) - { - AutoFill('rcp',1); - chkocp=document.getElementById('ocp'); - chkocp.checked=false; - chkprop=document.getElementById('pv'); - chkprop.checked=true; - HandleClick(chkprop); - } - else - {AutoFill('rcp',0);} - } - if(el.id=='ocp') - { - if(el.checked) - { - AutoFill('ocp',1); - chkrcp=document.getElementById('rcp'); - chkrcp.checked=false; - chkprop=document.getElementById('pv'); - chkprop.checked=true; - HandleClick(chkprop); - } - else - {AutoFill('ocp',0);} - } - if(el.id=='refv') - { - setFormValidation(el,'FormPanel5','refname1,refaddress1,refcontactno1','t,f,t','AlphaSpace,SplInstruction,Phone',false); - } -} -function setFormValidation(Elem,FormPanel,ChildElems,IsRequired,Validation,CounterPartElem) -{ - /*if(Elem.checked && !CounterPartElem) - { - hideForm(Elem.id, FormPanel); - } - if(!Elem.checked) - { - CheckForm(Elem,ChildElems,IsRequired,Validation); - if(!CounterPartElem) - { - hideForm(Elem.id, FormPanel); - } - }*/ - - if(Elem.checked || CounterPartElem) - { - UnhideSections(FormPanel+ColDelim, ColDelim); - } - else - { - HideSections(FormPanel); - } - CheckForm(Elem,ChildElems,IsRequired,Validation); - FireToggleEvents(); -} -function CheckForm(Elem,ChildElems,IsRequired,Validation) -{ - var Childs=ChildElems.split(","); - var IsChildReq=IsRequired.split(","); - var ValidString=Validation.split(","); - for(Indx=0;Indx"; - OptionPanel=OptionPanel+""; - for(cindx=0;cindx<4;cindx++) - { - Addr=Addr+" "+SameAddr[indx][cindx]; - } - OptionPanel=OptionPanel+""+Addr+""; - Addr=""; - } - OptionPanel=OptionPanel+"
"; - optDiv.innerHTML=OptionPanel; - ShowInputDialog(optDiv,"Select Address","hint","inptDialog"); - document.getElementById('rb0').focus(); -} -function FillSameDet(AddrIndex,OprID) -{ - - if(!(AddrIndex < 0)) - { - for(cindx=0;cindx1) - { - ShowAddrOptions(OprID); - } - else - { - FillSameDet(0,OprID); - } -} -function FindSameDet(Elm,Visit,focAfter) -{ - if($("#case_id").val()!='0' && Visit=='A') - { - return; - } - else - { - FocusAfter=focAfter; - var procFlag=true; - if(Elm.type=='checkbox') - { - procFlag=Elm.checked; - } - if(procFlag) - { - Applno=document.getElementById('applno').value; - if(Applno.length==0) - { - if(Elm.type=='checkbox'){Elm.checked=false;} - CallMessage('VLFRM:error:Please enter application number.',3000,200,300); - document.getElementById('applno').focus(); - return false; - } - else - { - SameAddr=new Array(0); // Empty Address Array - oprId=(Visit=='R' ? 19:Visit=='O' ? 20:Visit=='P' ? 21:22); - QryStr="val="+Applno+"&val1="+$("#portfolio_id").val()+"&val2="+oprId; - RunAjax("GET","findsdet",QryStr,oprId); - } - } - } -} -function FindStr(el,elmids,rstfld) -{ - el.value=el.value.split('->')[0]; - var skey=el.value.trim().toUpperCase(); - if(skey!='UNKNOWN' && skey!='-1') - { - var elms=elmids.split(ColDelim); - var indx=0; - for(indx=0;indx-1) - { - return true; - } - } - } - else - { - return true; - } - return false; -} -function HandleBlur(el) -{ - if(el.id=='rcity' || el.id=='ocity' || el.id=='pcity') - { - var pel= (el.id=='rcity' ? 'Rcolony':(el.id=='ocity' ? 'Ocolony':'Pcolony')); - var cel= (el.id=='rcity' ? 'raddr':(el.id=='ocity' ? 'oaddr':'paddr')); - var hel= (el.id=='rcity' ? 'colr':(el.id=='ocity' ? 'colo':'colp')); - var chk= (el.id=='rcity' ? 'rv':(el.id=='ocity' ? 'ov':'pv')); - if(!FindStr(el,cel+'2!C0L!'+cel+'3')) - { - CallMessage("1001AREA:error:Invalid area.", 3000, 200, 300); - $(el).val("-1"); - $("#"+pel).val(""); - $("#"+hel).val(""); - } - validate(el,document.getElementById(chk).checked ? 't':'f',''); - } - if(el.id=='colr' || el.id=='colo' || el.id=='colp') - { - var pel= (el.id=='colr' ? 'rv':(el.id=='colo' ? 'ov':'pv')); - var cel= (el.id=='colr' ? 'raddr':(el.id=='colo' ? 'oaddr':'paddr')); - if(!FindStr(el,cel+'2!C0L!'+cel+'3')) - { - CallMessage("1001AREA:error:Invalid colony.", 3000, 200, 300); - $(el).val(""); - } - if(el.value=='') - { - document.getElementsByName(el.id+'_hidden')[0].value=''; - } - if(document.getElementsByName(el.id+'_hidden')[0].value=='') - { - el.value=''; - } - validate(el,document.getElementById(pel).checked ? 't':'f','SplInstruction'); - } -} + if(port>0) + { + if(document.getElementById("ajaxmsg") !== null) + { + CygnusNotifications.show({type:"warning",code:"1001AJX",message:"Another operation is being processed, please wait.",duration:3000}); + return; + } + LoadingMsg("Fetching records, please wait...","ajaxmsg"); + RunAjax("GET","punchedrecs","val0="+encodeURIComponent(port)+"&val1="+encodeURIComponent($("#dynamicfields").val())+"&val2="+encodeURIComponent($("#uuid").val()),1); + } + +} + +function GotoRecord(el,searchtype) +{ + var recno=el.value; +if(recno!='') + { + if(searchtype == 'recno') + { + if(recno > recIndx || recno <=0) + { + CygnusNotifications.show({type:"danger",code:"1001IRNG",message:"Invalid input. Out of range",duration:3000}); + } + else + { + recpos=recno-1; + FillDetails(recpos); + } + } + else + { + for(var index = 0; index < records.length; index++ ) + { + if( records[index][4] === recno ) { + recpos = index; + FillDetails(recpos); + break; + } + } + } + } +} +function AddNewRecord() +{ + if(recIndx== 0 || records[recIndx-1][0]!='0') + { + var cols=fields[0].length; + recIndx = recIndx+1; + recpos = recIndx-1; + records[recpos]=new Array(cols); + records[recpos][0]='0'; + records[recpos][1]=$("#portfolio_id").val(); + records[recpos][cols-4]='0'; + records[recpos][cols-3]=$("#company_id").val(); + records[recpos][cols-2]=$("#branch_id").val(); + records[recpos][cols-1]=''; + records[recpos][2]='******'; + } + else + { + recpos=recIndx-1; + } + FillDetails(recpos); +} +function AfterResponse(response,oprID) +{ + var rindx=0; + if(oprID==1) + { + $("#ajaxmsg").remove(); + if(response.trim().search('Error')==-1) + { + var rows=response.split(RowDelim); + for(rindx=0;rindx( 0 / "+(recIndx==0 ? "0" : recIndx)+" )"); + recpos=recIndx==0 ? 0 : recIndx-1; + FillDetails(recpos); + } + else if(oprID==2) + { + var collen=fields[0].length; + $("#ajaxmsg").remove(); + if(response.trim().search('Error')==-1) + { + if(autocut==1) + { + records[recpos][collen-4]='1'; + } + if($("#case_id").val()!='0') + { + findRecord(3); + } + else + { + records[recpos][2]=response.split(ColDelim)[0]; + records[recpos][0]=response.split(ColDelim)[1]; + records[recpos][collen-1]=response.split(ColDelim)[2]; + AddNewRecord(); + } + CygnusNotifications.show({type:"info",code:"1001IRNG",message:"Record updated successfully",duration:3000}); + } + else + { + records[recpos][collen-4]='-1'; + CygnusNotifications.showLegacy(response,{duration:3000}); + } + } + else if(oprID==19 || oprID==20 || oprID==21 || oprID==22) + { + var TabRows=response.split(RowDelim); + for(var indx=0;indx0) tempPos=tempPos-1; + else return false; + } + if(arrOpr==3) + { + if(tempPos 0) + { + document.forms['casedetails'].reset(); + $("#recfound").html("( "+(indx+1)+" / "+(recIndx==0 ? "0" : recIndx)+" )"); + var findx=0; + for(findx=0;findx 0) + { + if(fields[0][findx]=='rv' || fields[0][findx]=='sradd' || fields[0][findx]=='rtv' || + fields[0][findx]=='ov' || fields[0][findx]=='soadd' || fields[0][findx]=='otv' || fields[0][findx]=='rco' + || fields[0][findx]=='pv' || fields[0][findx]=='rcp' || fields[0][findx]=='ocp' || fields[0][findx]=='spadd'|| fields[0][findx]=='refv'|| fields[0][findx]=='docv') + { + + if(fields[0][findx]=='docv') + { + if($("#"+fields[0][findx]).is(":visible")) + { + $("#"+fields[0][findx]).attr('checked',true); + } + } + else + { + if(records[indx][findx]=='1') + { + $("#"+fields[0][findx]).attr('checked',true); + } + else + { + $("#"+fields[0][findx]).attr('checked',false); + } + } + } + else + { + $("#"+fields[0][findx]).val(records[indx][findx]); + } + } + } + if($("#status").val()=='1') + { + $("#btnsave").hide(); + } + else + { + $("#btnsave").show(); + } + FireClickEvents(); + document.getElementById("applno").focus(); + } + else + { + CygnusNotifications.show({type:"danger",code:"5005MQRY",message:"No records found",duration:3000}); + AddNewRecord(); + } +} +function FireClickEvents() +{ + HandleClick(document.getElementById('rv')); + HandleClick(document.getElementById('ov')); + HandleClick(document.getElementById('rtv')); + HandleClick(document.getElementById('otv')); + HandleClick(document.getElementById('pv')); + HandleClick(document.getElementById('refv')); +} +function FireToggleEvents() +{ + ToggleChks((document.getElementById('rv').checked && document.getElementById('ov').checked),'rco'+ColDelim,ColDelim); + ToggleChks((document.getElementById('apptype').value.toUpperCase()!='APPLICANT' && document.getElementById('apptype').value.toUpperCase()!='-1'),'sradd!C0L!soadd!C0L!spadd!C0L!','!C0L!'); + ToggleChks((document.getElementById('rv').checked),'rcp'+ColDelim,ColDelim); + ToggleChks((document.getElementById('ov').checked),'ocp'+ColDelim,ColDelim); +} +function HandleClick(el) +{ + if(el.id=='rv') + { + setFormValidation(el,'FormPanel2','raddr1,raddr2,raddr3,rlandmark,rcity,colr,rpincode','t,f,t,f,t,t,f','SplInstruction,SplInstruction,SplInstruction,SplInstruction,,SplInstruction,Pincode',document.getElementById('rtv').checked); + EnableDisableFields(el.checked,'raddr1,raddr2,raddr3,rlandmark,colr,rpincode',','); + } + if(el.id=='rtv') + { + setFormValidation(el,'FormPanel2','rphone','t','Phone',document.getElementById('rv').checked); + } + if(el.id=='ov') + { + setFormValidation(el,'FormPanel3','companyname,oaddr1,oaddr2,oaddr3,olandmark,ocity,colo,opincode,department,designation','f,t,f,t,f,t,t,f,f,f','SplInstruction,SplInstruction,SplInstruction,SplInstruction,SplInstruction,,SplInstruction,Pincode,SplInstruction,SplInstruction',document.getElementById('otv').checked); + EnableDisableFields(el.checked,'oaddr1,oaddr2,oaddr3,olandmark,colo,opincode',','); + } + if(el.id=='rco') + { + if(el.checked) + { + AutoFill('rco',1); + } + else + {AutoFill('rco',0);} + } + if(el.id=='otv') + { + setFormValidation(el,'FormPanel3','ophone','t','Phone',document.getElementById('ov').checked); + } + if(el.id=='pv') + { + setFormValidation(el,'FormPanel4','paddr1,paddr2,paddr3,plandmark,pcity,colp,ppincode','t,f,t,f,t,t,f','SplInstruction,SplInstruction,SplInstruction,SplInstruction,,SplInstruction,Pincode',false); + EnableDisableFields(el.checked,'paddr1,paddr2,paddr3,plandmark,colp,ppincode',','); + if(!el.checked) + { + var chkrcp=document.getElementById('rcp'); + chkrcp.checked=false; + var chkocp=document.getElementById('ocp'); + chkocp.checked=false; + } + } + if(el.id=='rcp') + { + if(el.checked) + { + AutoFill('rcp',1); + var chkocp=document.getElementById('ocp'); + chkocp.checked=false; + var chkprop=document.getElementById('pv'); + chkprop.checked=true; + HandleClick(chkprop); + } + else + {AutoFill('rcp',0);} + } + if(el.id=='ocp') + { + if(el.checked) + { + AutoFill('ocp',1); + var chkrcp=document.getElementById('rcp'); + chkrcp.checked=false; + var chkprop=document.getElementById('pv'); + chkprop.checked=true; + HandleClick(chkprop); + } + else + {AutoFill('ocp',0);} + } + if(el.id=='refv') + { + setFormValidation(el,'FormPanel5','refname1,refaddress1,refcontactno1','t,f,t','AlphaSpace,SplInstruction,Phone',false); + } +} +function setFormValidation(Elem,FormPanel,ChildElems,IsRequired,Validation,CounterPartElem) +{ + if(Elem.checked || CounterPartElem) + { + UnhideSections(FormPanel+ColDelim, ColDelim); + } + else + { + HideSections(FormPanel); + } + CheckForm(Elem,ChildElems,IsRequired,Validation); + FireToggleEvents(); +} +function CheckForm(Elem,ChildElems,IsRequired,Validation) +{ + var Childs=ChildElems.split(","); + for(var Indx=0;Indx"; + OptionPanel=OptionPanel+""; + for(var cindx=0;cindx<4;cindx++) + { + Addr=Addr+" "+escapeHtml(SameAddr[indx][cindx]); + } + OptionPanel=OptionPanel+""+Addr+""; + Addr=""; + } + OptionPanel=OptionPanel+"
"; + optDiv.innerHTML=OptionPanel; + ShowInputDialog(optDiv,"Select Address","hint","inptDialog"); + document.getElementById('rb0').focus(); +} +function escapeHtml(value) +{ + return String(value == null ? "" : value).replace(/[&<>"']/g, function(character) { + return ({"&":"&","<":"<",">":">",'"':""","'":"'"})[character]; + }); +} +function FillSameDet(AddrIndex,OprID) +{ + + if(!(AddrIndex < 0)) + { + for(var cindx=0;cindx1) + { + ShowAddrOptions(OprID); + } + else if(SameAddr.length===1) + { + FillSameDet(0,OprID); + } + else + { + FillSameDet(-1,OprID); + } +} +function FindSameDet(Elm,Visit,focAfter) +{ + if($("#case_id").val()!='0' && Visit=='A') + { + return; + } + else + { + FocusAfter=focAfter; + var procFlag=true; + if(Elm.type=='checkbox') + { + procFlag=Elm.checked; + } + if(procFlag) + { + var Applno=document.getElementById('applno').value; + if(Applno.length==0) + { + if(Elm.type=='checkbox'){Elm.checked=false;} + CygnusNotifications.show({type:"danger",code:"VLFRM",message:"Please enter application number.",duration:3000}); + document.getElementById('applno').focus(); + return false; + } + else + { + SameAddr=new Array(0); // Empty Address Array + var oprId=(Visit=='R' ? 19:Visit=='O' ? 20:Visit=='P' ? 21:22); + var QryStr="val="+encodeURIComponent(Applno)+"&val1="+encodeURIComponent($("#portfolio_id").val())+"&val2="+encodeURIComponent(oprId); + RunAjax("GET","findsdet",QryStr,oprId); + } + } + } +} +function FindStr(el,elmids,rstfld) +{ + el.value=el.value.split('->')[0]; + var skey=el.value.trim().toUpperCase(); + if(skey!='UNKNOWN' && skey!='-1') + { + var elms=elmids.split(ColDelim); + var indx=0; + for(indx=0;indx-1) + { + return true; + } + } + } + else + { + return true; + } + return false; +} +function HandleBlur(el) +{ + if(el.id=='rcity' || el.id=='ocity' || el.id=='pcity') + { + var pel= (el.id=='rcity' ? 'Rcolony':(el.id=='ocity' ? 'Ocolony':'Pcolony')); + var cel= (el.id=='rcity' ? 'raddr':(el.id=='ocity' ? 'oaddr':'paddr')); + var hel= (el.id=='rcity' ? 'colr':(el.id=='ocity' ? 'colo':'colp')); + var chk= (el.id=='rcity' ? 'rv':(el.id=='ocity' ? 'ov':'pv')); + if(!FindStr(el,cel+'2!C0L!'+cel+'3')) + { + CygnusNotifications.show({type:"danger",code:"1001AREA",message:"Invalid area.",duration:3000}); + $(el).val("-1"); + $("#"+pel).val(""); + $("#"+hel).val(""); + } + CygnusInitiationValidation.validateField(el); + } + if(el.id=='colr' || el.id=='colo' || el.id=='colp') + { + var pel= (el.id=='colr' ? 'rv':(el.id=='colo' ? 'ov':'pv')); + var cel= (el.id=='colr' ? 'raddr':(el.id=='colo' ? 'oaddr':'paddr')); + if(!FindStr(el,cel+'2!C0L!'+cel+'3')) + { + CygnusNotifications.show({type:"danger",code:"1001AREA",message:"Invalid colony.",duration:3000}); + $(el).val(""); + } + if(el.value=='') + { + document.getElementsByName(el.id+'_hidden')[0].value=''; + } + if(document.getElementsByName(el.id+'_hidden')[0].value=='') + { + el.value=''; + } + CygnusInitiationValidation.validateField(el); + } +} diff --git a/cygnus-onprem-app/build/WebContent/js/lib/form-validation.js b/cygnus-onprem-app/build/WebContent/js/lib/form-validation.js new file mode 100644 index 0000000..9d7b4ad --- /dev/null +++ b/cygnus-onprem-app/build/WebContent/js/lib/form-validation.js @@ -0,0 +1,150 @@ +(function (window, document) { + "use strict"; + + const FORMATS = Object.freeze({ + Email: /^\S*\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,8}\b\S*$/, + Numeric: /^\d*$/, + AlphaNumeric: /^[a-zA-Z0-9_*\/\-]*$/, + AlphaSpace: /^[a-zA-Z0-9()\/ &]*$/, + LoanAmount: /^[a-zA-Z0-9. ]*$/, + SplInstruction: /^[a-zA-Z0-9():,#@.\-\/ ]*$/, + Remarks: /^[a-zA-Z0-9,(),:+&#@'.\-\/ ]*$/, + Pincode: /^\d{6}$/, + Phone: /^((\d{6,8}|\d{10}|\d{3}-\d{6,8})([\/](\d{6,8}|\d{10}|\d{3}-\d{6,8})){0,2})$/, + Extension: /^\d{3,4}$/ + }); + const DATE_PATTERN = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/; + + function sanitize(value, options) { + const multiline = Boolean(options && options.multiline); + let sanitized = String(value == null ? "" : value).replace(/\t/g, ""); + if (multiline) { + sanitized = sanitized.replace(/\r\n?/g, "\n").replace(/[^\x20-\x7E\n]/g, ""); + } else { + sanitized = sanitized.replace(/[\r\n]/g, "").replace(/[^\x20-\x7E]/g, ""); + } + return sanitized.trim(); + } + + function sanitizeElement(element) { + if (!element || typeof element.value !== "string") return ""; + const tagName = element.tagName ? element.tagName.toLowerCase() : ""; + const inputType = (element.type || "text").toLowerCase(); + const sanitizableInput = tagName === "input" && + ["text", "search", "tel", "email", "url", "password"].includes(inputType); + if (tagName !== "textarea" && !sanitizableInput) return element.value; + const sanitized = sanitize(element.value, { multiline: tagName === "textarea" }); + if (element.value !== sanitized) element.value = sanitized; + return sanitized; + } + + function valueOf(element) { + return element && typeof element.value === "string" ? element.value.trim() : ""; + } + + function isEmpty(element) { + const value = valueOf(element); + return value === "" || (element.type === "select-one" && value === "-1"); + } + + function isDate(value) { + const parts = DATE_PATTERN.exec(value); + if (!parts) return false; + const day = Number(parts[1]); + const month = Number(parts[2]); + const year = Number(parts[3]); + if (year < 1900 || year > 2100 || month < 1 || month > 12) return false; + const date = new Date(year, month - 1, day); + return date.getFullYear() === year && date.getMonth() === month - 1 && date.getDate() === day; + } + + function matchesFormat(value, format) { + if (!value || !format || format === "AllowWrong") return true; + const normalized = Object.keys(FORMATS).find((name) => name.toLowerCase() === format.toLowerCase()); + if (format.toLowerCase() === "date") return isDate(value); + return normalized ? FORMATS[normalized].test(value) : true; + } + + function errorHost(element) { + let current = element.parentNode; + let host = current; + while (current && current !== document.body) { + if ((" " + (current.className || "") + " ").indexOf(" inputcontainer ") !== -1) return current; + current = current.parentNode; + } + return host; + } + + function clearError(element) { + if (!element) return; + const icon = document.getElementById("err" + element.id); + if (icon && icon.parentNode) icon.parentNode.removeChild(icon); + element.classList.remove("errtxt"); + if (element.parentNode) element.parentNode.classList.remove("errdiv"); + element.removeAttribute("aria-invalid"); + element.removeAttribute("aria-describedby"); + if (typeof element.setCustomValidity === "function") element.setCustomValidity(""); + } + + function showError(element, message) { + if (!element) return; + clearError(element); + const host = errorHost(element); + const icon = document.createElement("img"); + icon.src = "/matrix/images/exclamation.png"; + icon.id = "err" + element.id; + icon.alt = message; + icon.title = message; + icon.className = "matrix-validation-error-icon" + + (element.type === "select-one" ? " matrix-validation-error-icon--select" : ""); + icon.style.cssText = "position:absolute;right:" + (element.type === "select-one" ? "24px" : "5px") + + ";top:50%;width:14px;height:14px;transform:translateY(-50%);z-index:3;pointer-events:none"; + host.style.position = "relative"; + host.appendChild(icon); + if (element.type === "select-one") element.parentNode.classList.add("errdiv"); + else element.classList.add("errtxt"); + element.setAttribute("aria-invalid", "true"); + element.setAttribute("aria-describedby", icon.id); + if (typeof element.setCustomValidity === "function") element.setCustomValidity(message); + } + + function validateElement(element, rule) { + if (!element) return true; + sanitizeElement(element); + if (typeof rule.when === "function" && !rule.when()) { + clearError(element); + return true; + } + const required = typeof rule.required === "function" ? rule.required() : Boolean(rule.required); + let message = ""; + if (required && isEmpty(element)) message = rule.requiredMessage || "This field is required."; + else if (!isEmpty(element) && !matchesFormat(valueOf(element), rule.format)) { + message = rule.formatMessage || "Enter a valid value."; + } + if (message) showError(element, message); + else clearError(element); + return message === ""; + } + + function validateLegacy(element, requiredFlag, format) { + return validateElement(element, { required: requiredFlag === "t", format: format }); + } + + function validateRules(rules) { + const invalid = []; + Object.keys(rules).forEach(function (id) { + const element = document.getElementById(id); + if (!validateElement(element, rules[id])) invalid.push(element); + }); + return { valid: invalid.length === 0, invalid: invalid }; + } + + window.CygnusFormValidation = Object.freeze({ + clearError: clearError, + sanitize: sanitize, + sanitizeElement: sanitizeElement, + validateElement: validateElement, + validateLegacy: validateLegacy, + validateRules: validateRules + }); +}(window, document)); diff --git a/cygnus-onprem-app/build/WebContent/js/lib/notifications.js b/cygnus-onprem-app/build/WebContent/js/lib/notifications.js index 692fef9..6e71509 100644 --- a/cygnus-onprem-app/build/WebContent/js/lib/notifications.js +++ b/cygnus-onprem-app/build/WebContent/js/lib/notifications.js @@ -74,5 +74,22 @@ document.getElementById("cygnus-notifications")?.replaceChildren(); } - window.CygnusNotifications = Object.freeze({ show, clear }); + function showLegacy(serialized, options) { + const text = String(serialized || ""); + const firstSeparator = text.indexOf(":"); + const secondSeparator = firstSeparator < 0 ? -1 : text.indexOf(":", firstSeparator + 1); + const settings = Object.assign({}, options); + if (secondSeparator > firstSeparator) { + settings.code = text.slice(0, firstSeparator); + const legacyType = text.slice(firstSeparator + 1, secondSeparator).toLowerCase(); + settings.type = legacyType === "error" ? "danger" : legacyType; + settings.message = text.slice(secondSeparator + 1); + } else { + settings.type = settings.type || "danger"; + settings.message = text; + } + return show(settings); + } + + window.CygnusNotifications = Object.freeze({ show, showLegacy, clear }); }(window, document)); diff --git a/cygnus-onprem-app/src/main/java/matrix/nimble/utilities/CommonFunctions.java b/cygnus-onprem-app/src/main/java/matrix/nimble/utilities/CommonFunctions.java index 5f0db0c..53c6697 100644 --- a/cygnus-onprem-app/src/main/java/matrix/nimble/utilities/CommonFunctions.java +++ b/cygnus-onprem-app/src/main/java/matrix/nimble/utilities/CommonFunctions.java @@ -5,10 +5,14 @@ import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.URL; import java.net.URLConnection; -import java.util.ArrayList; -import java.util.List; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; -public class CommonFunctions { +public class CommonFunctions { + private static final Pattern DYNAMIC_VALIDATION = Pattern.compile( + "(?i)validate\\s*\\(\\s*this\\s*,\\s*'([tf])'\\s*,\\s*'([^']*)"); private String ErrMsg; private String ErrCode; private String ErrDesc; @@ -102,14 +106,15 @@ public class CommonFunctions { } return GatewayList; } - public String DynamicControls(String [] Controls,String ControlVal) - { + public String DynamicControls(String [] Controls,String ControlVal) + { String CtrlHtml=""; String CtrlStyle=""; String CtrlClass=""; String CtrlEvents=""; String isSelected=""; - String maxLength="maxlength"; + String maxLength="maxlength"; + String validationAttributes=dynamicValidationAttributes(Controls[9]); String unit="px"; setCtrlType(Controls[14]); ControlVal=(ControlVal==null || ControlVal.equals("")) ? Controls[17] : ControlVal; @@ -151,11 +156,11 @@ public class CommonFunctions { CtrlHtml=CtrlHtml+"
"; if(getCtrlType().equals("text")) { - CtrlHtml=CtrlHtml+""; + CtrlHtml=CtrlHtml+""; } else if(getCtrlType().equals("checkbox")) { - CtrlHtml=CtrlHtml+""; + CtrlHtml=CtrlHtml+""; } CtrlHtml=CtrlHtml+"
"; } @@ -167,7 +172,7 @@ public class CommonFunctions { } CtrlHtml="
"+Controls[1]; CtrlHtml=CtrlHtml+"
"; - CtrlHtml=CtrlHtml+""; + CtrlHtml=CtrlHtml+""; CtrlHtml=CtrlHtml+"
"; } else if(getCtrlType().equals("select")) @@ -194,7 +199,7 @@ public class CommonFunctions { CtrlHtml="
"+Controls[1]; CtrlHtml=CtrlHtml+"
"; CtrlHtml=CtrlHtml+"
"; - CtrlHtml=CtrlHtml+""; CtrlHtml=CtrlHtml+""; CtrlHtml=CtrlHtml+"
"; } @@ -211,8 +216,18 @@ public class CommonFunctions { setGeneratedHtml(CtrlHtml); setDynamicCtrls(getDynamicCtrls()+Controls[2]+GlobalClass.ColDelim); } - return Controls[4]; - } + return Controls[4]; + } + + private String dynamicValidationAttributes(String onBlur) + { + if(onBlur==null || onBlur.isBlank()) return ""; + Matcher matcher=DYNAMIC_VALIDATION.matcher(onBlur); + if(!matcher.find()) return ""; + String format=matcher.group(2).trim().replaceFirst("[^A-Za-z0-9]+$", ""); + return "data-validation-required='"+(matcher.group(1).equalsIgnoreCase("t") ? "true" : "false")+ + "' data-validation-format='"+format+"'"; + } public String DesignControls(String ControlType,String Controlid,String TypeScript,String ValidationScript,String Style, String CssClass,String Fieldid,DBFunctions DBFunc,StringFunctions SFunc,String ControlVal) { String HtmlControl=""; diff --git a/cygnus-onprem-app/src/test/java/matrix/nimble/RoleVisibleBatchMigrationTest.java b/cygnus-onprem-app/src/test/java/matrix/nimble/RoleVisibleBatchMigrationTest.java index 19f90ee..c6c5323 100644 --- a/cygnus-onprem-app/src/test/java/matrix/nimble/RoleVisibleBatchMigrationTest.java +++ b/cygnus-onprem-app/src/test/java/matrix/nimble/RoleVisibleBatchMigrationTest.java @@ -515,7 +515,7 @@ class RoleVisibleBatchMigrationTest { String initialCase = Files.readString(punching.resolve("initcase.jsp")); assertTrue(initialCase.contains("GotoRecord(this,'recno')")); assertTrue(initialCase.contains("CygnusInitiation.save(event)")); - assertTrue(initialCase.contains("/matrix/js/edp/initiation.js")); + assertTrue(initialCase.contains("/matrix/js/edp/punching/initiation.js")); assertTrue(initialCase.contains("AddNewRecord()")); String initialDocs = Files.readString(punching.resolve("initdocs.jsp")); diff --git a/cygnus-onprem-app/src/test/java/matrix/nimble/utilities/CommonFunctionsTest.java b/cygnus-onprem-app/src/test/java/matrix/nimble/utilities/CommonFunctionsTest.java new file mode 100644 index 0000000..d53fb31 --- /dev/null +++ b/cygnus-onprem-app/src/test/java/matrix/nimble/utilities/CommonFunctionsTest.java @@ -0,0 +1,49 @@ +package matrix.nimble.utilities; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.Arrays; +import org.junit.jupiter.api.Test; + +class CommonFunctionsTest { + + @Test + void dynamicControlIncludesConfiguredValidationMetadata() { + CommonFunctions functions = functions(); + functions.DynamicControls(control("validate(this,'t','SplInstruction')"), ""); + + assertTrue(functions.getGeneratedHtml().contains("data-validation-required='true'")); + assertTrue(functions.getGeneratedHtml().contains("data-validation-format='SplInstruction'")); + } + + @Test + void dynamicControlNormalizesMalformedTrailingDateRule() { + CommonFunctions functions = functions(); + functions.DynamicControls(control("validate(this,'f','Date)"), ""); + + assertTrue(functions.getGeneratedHtml().contains("data-validation-required='false'")); + assertTrue(functions.getGeneratedHtml().contains("data-validation-format='Date'")); + } + + private CommonFunctions functions() { + CommonFunctions functions = new CommonFunctions(); + functions.setPrevControl(""); + functions.setDynamicCtrls(""); + functions.setGeneratedHtml(""); + return functions; + } + + private String[] control(String onBlur) { + String[] control = new String[27]; + Arrays.fill(control, ""); + control[0] = "1"; + control[1] = "Dynamic field"; + control[2] = "field1"; + control[5] = "40"; + control[9] = onBlur; + control[14] = "text"; + control[17] = ""; + control[26] = "1"; + return control; + } +}