From 11797c9d2ceb9e527d72e9c95924ae85f3a42b23 Mon Sep 17 00:00:00 2001 From: David Okulski Date: Tue, 18 Nov 2025 12:28:42 -0800 Subject: [PATCH 1/9] created net portal interface for kiln v2 --- dictionary/interfaces.js | 66 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/dictionary/interfaces.js b/dictionary/interfaces.js index 2b709f1..ef9587d 100644 --- a/dictionary/interfaces.js +++ b/dictionary/interfaces.js @@ -74,6 +74,72 @@ const interfaces = { ] }, + NETportalsV2: { + interface: [ + { + type: "button", + label: "Submit", + mode: ["portalEdit"], + style: "primary", + actions: [ + { + "action_type": "javascript", + "script": "if (!validateAllFields()?.isValid) { setModalTitle('Validation Error'); setModalMessage('Please fix the highlighted fields.'); setModalOpen(true); return false; }" + }, + { + "action_type": "javascript", + "script": "const confirmed = await confirmModal(); if (!confirmed) { return false; }" + }, + { + action_type: "endpoint", + api_path: "API.saveButtonAction", + type: "POST", + body: "tokenId: params['id'], savedForm: JSON.stringify(createSavedData())" + }, + { + action_type: "endpoint", + api_path: "API.submitButtonAction", + type: "POST", + body: "tokenId: params['id']" + }, + { + action_type: "javascript", + script: `await handleSubmit();` + } + ] + }, + { + type: "button", + label: "Cancel", + mode: ["portalEdit", "portalView"], + style: "secondary", + actions: [ + { + action_type: "endpoint", + api_path: "API.cancelButtonAction", + type: "POST", + body: "tokenId: params['id']", + }, + { + action_type: "javascript", + script: "await handleCancel();" + } + ] + }, + { + type: "button", + label: "Print", + mode: ["portalView"], + style: "tertiary", + actions: [ + { + action_type: "javascript", + script: "handlePrint();" + } + ] + } + ] + }, CAREGIVER: { interface: [ { From fdd84cb2d8d97245420a947684395487c5d6c7fd Mon Sep 17 00:00:00 2001 From: Viswam Date: Tue, 25 Nov 2025 14:56:42 -0800 Subject: [PATCH 2/9] Changes for CaregiverV2 interface --- dictionary/interfaces.js | 52 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/dictionary/interfaces.js b/dictionary/interfaces.js index ef9587d..8c24a5c 100644 --- a/dictionary/interfaces.js +++ b/dictionary/interfaces.js @@ -190,6 +190,58 @@ const interfaces = { } ] } + ] + }, + CAREGIVERV2: { + interface: [ + { + mode: [ + "portalNew", + "portalEdit" + ], + type: "button", + label: "Save", + style: "", + actions: [ + { + script: "if (!validateAllFields()?.isValid){ window.parent.postMessage(JSON.stringify({ \"event\": \"errorOnSave\" }), \"*\");return true; }", + action_type: "javascript" + }, + { + body: "tokenId: params['id'], savedForm: JSON.stringify(createSavedData())", + path: "/application-forms/saveDraft", + type: "POST", + api_path: "API.saveButtonAction", + action_type: "endpoint" + } + ] + }, + { + mode: [ + "portalNew", + "portalEdit" + ], + type: "button", + label: "Complete", + style: "", + actions: [ + { + script: "if (!validateAllFields()?.isValid){ window.parent.postMessage(JSON.stringify({ \"event\": \"errorOnComplete\" }), \"*\"); return false; }", + action_type: "javascript" + }, + { + body: "tokenId: params['id'], savedForm: JSON.stringify(createSavedData())", + path: "/application-forms/submit", + type: "POST", + api_path: "API.saveButtonAction", + action_type: "endpoint" + }, + { + script: `await handleSubmit();`, + action_type: "javascript" + } + ] + } ] } }; From 1a68d35532be91fb1dadcad09759e56a61eb5497 Mon Sep 17 00:00:00 2001 From: David Okulski Date: Wed, 26 Nov 2025 16:40:21 -0800 Subject: [PATCH 3/9] Added logging to clearICM api call --- saveICMdataHandler.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/saveICMdataHandler.js b/saveICMdataHandler.js index cd21527..66ca883 100644 --- a/saveICMdataHandler.js +++ b/saveICMdataHandler.js @@ -398,7 +398,13 @@ async function clearICMLockedFlag(req, res) { if (params.icmWorkspace) { query.workspace = params.icmWorkspace; } + console.log("Params for clear:",params); + console.log("Query for clear:",query); + console.log("Raw Host for clear:",rawHost); + console.log("Config Opts clear:",configOpt); + response = await axios.put(url, saveJson, { params: query, headers }); + console.log("Response Clear:",response.status); return res.status(200).send({}); } From 97aadb9877183afcdc42dfdb63529778c7f43d51 Mon Sep 17 00:00:00 2001 From: David Okulski Date: Thu, 27 Nov 2025 09:14:04 -0800 Subject: [PATCH 4/9] More logs --- saveICMdataHandler.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/saveICMdataHandler.js b/saveICMdataHandler.js index 66ca883..836c11a 100644 --- a/saveICMdataHandler.js +++ b/saveICMdataHandler.js @@ -341,6 +341,10 @@ async function clearICMLockedFlag(req, res) { .send({ error: getErrorMessage("ATTACHMENT_ID_REQUIRED") }); } let username = null; + console.log("1.Params for clear:",params); + console.log("1.Query for clear:",query); + console.log("1.Raw Host for clear:",rawHost); + console.log("1.Config Opts clear:",configOpt); if (params["token"]) { username = await getUsername(params["token"], params["employeeEndpoint"]); @@ -398,10 +402,10 @@ async function clearICMLockedFlag(req, res) { if (params.icmWorkspace) { query.workspace = params.icmWorkspace; } - console.log("Params for clear:",params); - console.log("Query for clear:",query); - console.log("Raw Host for clear:",rawHost); - console.log("Config Opts clear:",configOpt); + console.log("2.Params for clear:",params); + console.log("2.Query for clear:",query); + console.log("2.Raw Host for clear:",rawHost); + console.log("2.Config Opts clear:",configOpt); response = await axios.put(url, saveJson, { params: query, headers }); console.log("Response Clear:",response.status); From 8f7dc571c2deaba8d5c88e4048c3071d049d4ef2 Mon Sep 17 00:00:00 2001 From: David Okulski Date: Thu, 27 Nov 2025 09:21:01 -0800 Subject: [PATCH 5/9] updated logs --- saveICMdataHandler.js | 1 - 1 file changed, 1 deletion(-) diff --git a/saveICMdataHandler.js b/saveICMdataHandler.js index 836c11a..5e41112 100644 --- a/saveICMdataHandler.js +++ b/saveICMdataHandler.js @@ -342,7 +342,6 @@ async function clearICMLockedFlag(req, res) { } let username = null; console.log("1.Params for clear:",params); - console.log("1.Query for clear:",query); console.log("1.Raw Host for clear:",rawHost); console.log("1.Config Opts clear:",configOpt); From c4d715943db514fd2da1f33c5ce429f920b70201 Mon Sep 17 00:00:00 2001 From: David Okulski Date: Thu, 27 Nov 2025 09:34:52 -0800 Subject: [PATCH 6/9] remove debugging logs --- saveICMdataHandler.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/saveICMdataHandler.js b/saveICMdataHandler.js index 5e41112..e09c06d 100644 --- a/saveICMdataHandler.js +++ b/saveICMdataHandler.js @@ -401,10 +401,7 @@ async function clearICMLockedFlag(req, res) { if (params.icmWorkspace) { query.workspace = params.icmWorkspace; } - console.log("2.Params for clear:",params); - console.log("2.Query for clear:",query); - console.log("2.Raw Host for clear:",rawHost); - console.log("2.Config Opts clear:",configOpt); + response = await axios.put(url, saveJson, { params: query, headers }); console.log("Response Clear:",response.status); From 7adbdd0e903f47c72b2c92ab4b4e68da6a0026f5 Mon Sep 17 00:00:00 2001 From: David Okulski Date: Thu, 27 Nov 2025 09:35:05 -0800 Subject: [PATCH 7/9] removed more logs --- saveICMdataHandler.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/saveICMdataHandler.js b/saveICMdataHandler.js index e09c06d..60c9d97 100644 --- a/saveICMdataHandler.js +++ b/saveICMdataHandler.js @@ -68,7 +68,6 @@ async function getICMAttachmentStatus(attachment_id, username, params) { async function saveICMdata(req, res) { try { let params = req.body; - console.log("Req for Save:",params); const rawHost = (req.get("X-Original-Server") || req.hostname); const configOpt = appCfg[rawHost] || Object.values(appCfg).find(cfg => { try { @@ -78,7 +77,6 @@ async function saveICMdata(req, res) { } }) || {}; params = { ...params,...configOpt }; - console.log("Params for Save:",params); const attachment_id = params["attachmentId"]; const savedFormParam = params["savedForm"]; @@ -217,7 +215,7 @@ async function saveICMdata(req, res) { const xml = saveJson["XML Hierarchy"]; const xmlSize = Buffer.byteLength(xml, 'utf8'); // size in bytes - console.log("XML Hierarchy:", xml); + // console.log("XML Hierarchy:", xml); console.log("XML Hierarchy length (chars):", xml.length); console.log("XML Hierarchy size (bytes):", xmlSize); let url = buildUrlWithParams(params["apiHost"], params["saveEndpoint"] + attachment_id + '/', params); @@ -341,9 +339,6 @@ async function clearICMLockedFlag(req, res) { .send({ error: getErrorMessage("ATTACHMENT_ID_REQUIRED") }); } let username = null; - console.log("1.Params for clear:",params); - console.log("1.Raw Host for clear:",rawHost); - console.log("1.Config Opts clear:",configOpt); if (params["token"]) { username = await getUsername(params["token"], params["employeeEndpoint"]); @@ -401,10 +396,8 @@ async function clearICMLockedFlag(req, res) { if (params.icmWorkspace) { query.workspace = params.icmWorkspace; } - response = await axios.put(url, saveJson, { params: query, headers }); - console.log("Response Clear:",response.status); return res.status(200).send({}); } From d0718d3043e2ce9c468ddc4993248b6ee0b16d30 Mon Sep 17 00:00:00 2001 From: Danilo Meireles Date: Fri, 28 Nov 2025 15:16:54 -0800 Subject: [PATCH 8/9] Reuse Keycloak token in loadICMdata to reduce duplicate auth calls --- saveICMdataHandler.js | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/saveICMdataHandler.js b/saveICMdataHandler.js index 60c9d97..f78f015 100644 --- a/saveICMdataHandler.js +++ b/saveICMdataHandler.js @@ -12,9 +12,10 @@ const { formExceptions } = require("./dictionary/jsonXmlConversion.js"); const { propertyExists, propertyNotEmpty, keyExists } = require("./dictionary/dictionaryUtils.js"); const SIEBEL_ICM_API_FORMS_ENDPOINT = process.env.SIEBEL_ICM_API_FORMS_ENDPOINT; -// utility function to fetch Attachment status (In Progress, Open...) -// and Locked By User field -async function getICMAttachmentStatus(attachment_id, username, params) { + +// Fetch attachment status and locked-by fields from ICM +// authHeaders: optional pre-acquired headers to avoid duplicate Keycloak token calls +async function getICMAttachmentStatus(attachment_id, username, params, authHeaders = null) { let return_data = {}; return_data["Status"] = ""; return_data["Locked by User"] = ""; @@ -39,6 +40,7 @@ async function getICMAttachmentStatus(attachment_id, username, params) { Authorization: `Bearer ${grant.id_token.token}`, "X-ICM-TrustedUsername": username, } + const query = { viewMode: "Catalog" } @@ -253,7 +255,7 @@ async function loadICMdata(req, res) { let params = req.body; const rawHost = (req.get("X-Original-Server") || req.hostname); const configOpt = appCfg[rawHost]; - params = { ...params,...configOpt }; + params = { ...params,...configOpt }; const attachment_id = params["attachmentId"]; const office_name = params["OfficeName"]; console.log("attachment_id>>", attachment_id); @@ -275,9 +277,23 @@ async function loadICMdata(req, res) { return res .status(401) .send({ error: getErrorMessage("INVALID_USER") }); - } - let icm_metadata = await getICMAttachmentStatus(attachment_id, username, params); - let icm_status = icm_metadata["Status"]; + } + + // Acquire token once and reuse for all ICM calls + let authHeaders; + try { + const grant = await keycloakForSiebel.grantManager.obtainFromClientCredentials(); + authHeaders = { + Authorization: `Bearer ${grant.id_token.token}`, + "X-ICM-TrustedUsername": username, + }; + } catch (error) { + console.error("Failed to acquire Keycloak token:", error); + return res.status(500).send({ error: getErrorMessage("GENERIC_ERROR_MSG") }); + } + + let icm_metadata = await getICMAttachmentStatus(attachment_id, username, params, authHeaders); + let icm_status = icm_metadata["Status"]; if (!icm_status || icm_status == "") { console.log("Error fetching Form Instance Thin data for ", attachment_id); return res @@ -288,12 +304,6 @@ async function loadICMdata(req, res) { let url = buildUrlWithParams(params["apiHost"], params["saveEndpoint"] + attachment_id + '/', params); try { let response; - const grant = - await keycloakForSiebel.grantManager.obtainFromClientCredentials(); - const headers = { - Authorization: `Bearer ${grant.id_token.token}`, - "X-ICM-TrustedUsername": username, - } const query = { viewMode: "Catalog", inlineattachment: true @@ -301,9 +311,9 @@ async function loadICMdata(req, res) { if (params.icmWorkspace) { query.workspace = params.icmWorkspace; } - response = await axios.get(url, { params: query, headers }); + response = await axios.get(url, { params: query, headers: authHeaders }); let return_data = Buffer.from(response.data["Doc Attachment Id"], 'base64').toString('utf-8'); - //validate the returned data to be of the expected format + //validate the returned data to be of the expected format const valid = isJsonStringValid(return_data); if (!valid) { console.log('JSON is not valid '); From aa3a68e75aa450d552248be857e8c983569aae3e Mon Sep 17 00:00:00 2001 From: Danilo Meireles Date: Fri, 28 Nov 2025 15:17:13 -0800 Subject: [PATCH 9/9] reuse Keycloak token in loadICMdata to reduce duplicate auth calls --- saveICMdataHandler.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/saveICMdataHandler.js b/saveICMdataHandler.js index f78f015..df6997a 100644 --- a/saveICMdataHandler.js +++ b/saveICMdataHandler.js @@ -34,11 +34,16 @@ async function getICMAttachmentStatus(attachment_id, username, params, authHeade let url = buildUrlWithParams(params["apiHost"], params["saveEndpoint"] + attachment_id + '/', params); try { let response; - const grant = - await keycloakForSiebel.grantManager.obtainFromClientCredentials(); - const headers = { - Authorization: `Bearer ${grant.id_token.token}`, - "X-ICM-TrustedUsername": username, + let headers; + + if (authHeaders) { + headers = authHeaders; + } else { + const grant = await keycloakForSiebel.grantManager.obtainFromClientCredentials(); + headers = { + Authorization: `Bearer ${grant.id_token.token}`, + "X-ICM-TrustedUsername": username, + }; } const query = {