First add a class name to the HTML mine is "agreementHTML"
Wrap the HTML in a DIV, and then use spans where you want to add your field data. Give the spans matching id and class values. My example below.
<div>
<p>I, <span id="authorizedSignatoryHTML" class="authorizedSignatoryHTML">___________________</span>, hereby grant permission to Southern Illinois University School of Medicine, in partnership with SIU-C (when applicable), to bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla and shall include but not be limited to the following purpose(s):</p>
<p>Bla bla bla bla bla bla bla bla bla.</p>
<p>Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla blabla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla blabla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla blabla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.</p>
<p>IN WITNESS WHEREOF this permission form is executed this <span id="dayHTML" class="dayHTML">DAY HERE</span> day of <span id="monthHTML" class="monthHTML">MONTH HERE</span>, <span id="yearHTML" class="yearHTML">YEAR HERE</span>.</p>
</div>
My Custom HTML uses 'ordinal suffix' for displaying the day. So you can ignore that code. But here is my JavaScript.
/*----------------------------------------------------------*/
/* START: Read Only mode code */
/*----------------------------------------------------------*/
let form = Object.values(window.states)[0];
console.log('form.readonly: ' + form.readonly);
/*----------------------------------------------------------*/
/* END: Read Only mode code */
/*----------------------------------------------------------*/
/*----------------------------------------------------------*/
/* START: get Ordinal suffix of a day */
/*----------------------------------------------------------*/
/* Found the following lines of code here */
/* https://answers.laserfiche.com/questions/153152/Forms--Custom-row-labels#153197 */
function getOrdinalSuffix(theDay)
{
var j = theDay % 10;
var k = theDay % 100;
if (j == 1 && k != 11)
{
return theDay + "st";
};
if (j == 2 && k != 12)
{
return theDay + "nd";
};
if (j == 3 && k != 13)
{
return theDay + "rd";
};
return theDay + "th";
};
/*----------------------------------------------------------*/
/* END: get Ordinal suffix of a day */
/*----------------------------------------------------------*/
/*----------------------------------------------------------*/
/* START:check if DOMParser is supported */
/*----------------------------------------------------------*/
function isDOMParsSupported ()
{
if (!window.DOMParser) return false;
let parser = new DOMParser();
try {
parser.parseFromString('x', 'text/html');
} catch(err) {
return false;
};
return true;
};
/*----------------------------------------------------------*/
/* END:check if DOMParser is supported */
/*----------------------------------------------------------*/
/*----------------------------------------------------------*/
/* START: Convert a template string into HTML DOM nodes */
/*----------------------------------------------------------*/
function convertToDom(str) {
/* use DOPParser() if it is supported */
if(isDOMParsSupported){
let parser = new DOMParser();
let doc = parser.parseFromString(str, 'text/html');
return doc.body;
};
/* runs if DOPParser() is NOT supproted */
let dom = document.createElement('div');
dom.innerHTML = str;
return dom;
};
/*----------------------------------------------------------*/
/* END: Convert a template string into HTML DOM nodes */
/*----------------------------------------------------------*/
/* field IDs where data is pulled from */
const sigNameID = 11;
const dayID = 56;
const dayOrdinalSuffixID = 63;
const monthID = 58;
const yearID = 17;
/* grab the current field values -- on load these will be blank for me */
let sigName = LFForm.getFieldValues({fieldId: sigNameID});
let theDay = getOrdinalSuffix(LFForm.getFieldValues({fieldId: dayID}));
let theMonth = LFForm.getFieldValues({fieldId: monthID});
let theYear = LFForm.getFieldValues({fieldId: yearID});
/* this is the class name of the HTML field*/
const agreementHTMLObj = LFForm.findFieldsByClassName("agreementHTML")[0];
// console.log('agreementHTMLObj: ' + agreementHTMLObj);
// console.table(agreementHTMLObj)
let agreementHTMLData;
/* NOTE: when in read only view the HTML may or may not be saved in a */
/* couple different places. If the first comes back as undefined then */
/* I grab the next spot. */
if (form.readonly) {
agreementHTMLData = agreementHTMLObj.settings.label;
if (agreementHTMLData === undefined) {
agreementHTMLData = agreementHTMLObj.settings.default;
}
} else {
agreementHTMLData = agreementHTMLObj.data;
};
let agreementHTMLDataParse = convertToDom(agreementHTMLData);
/* find the spans */
let authSigSpan = agreementHTMLDataParse.getElementsByClassName("authorizedSignatoryHTML")[0];
let theDaySpan = agreementHTMLDataParse.getElementsByClassName("dayHTML")[0];
let theMonthSpan = agreementHTMLDataParse.getElementsByClassName("monthHTML")[0];
let theYearSpan = agreementHTMLDataParse.getElementsByClassName("yearHTML")[0];
function setAuthorizedSignatoryHTML(){
console.log('authSigSpan: ' + authSigSpan);
console.table(authSigSpan);
/* Update the content of the elements */
authSigSpan.textContent = sigName;
theDaySpan.textContent = theDay;
theMonthSpan.textContent = theMonth;
theYearSpan.textContent = theYear;
/* update the custom HTML */
LFForm.changeFieldSettings(agreementHTMLObj, { content: agreementHTMLDataParse.innerHTML });
};
/* On Load */
setAuthorizedSignatoryHTML();
/* A LFForm.onFieldChange is needed for each field that will be used to */
/* update the HTML */
LFForm.onFieldChange(function(){
/* Update the content of the elements */
sigName = LFForm.getFieldValues({fieldId: sigNameID});
authSigSpan.textContent = sigName;
LFForm.changeFieldSettings(agreementHTMLObj, { content: agreementHTMLDataParse.innerHTML });
}, {fieldId: sigNameID});
LFForm.onFieldChange(function(){
/* Update the content of the elements */
theDay = getOrdinalSuffix(LFForm.getFieldValues({fieldId: dayID}));
theDaySpan.textContent = theDay;
LFForm.changeFieldSettings(agreementHTMLObj, { content: agreementHTMLDataParse.innerHTML });
/* update the hidden field - this field is used in another step */
LFForm.setFieldValues({fieldId: dayOrdinalSuffixID}, theDay);
}, {fieldId: dayID});
LFForm.onFieldChange(function(){
/* Update the content of the elements */
theMonth = LFForm.getFieldValues({fieldId: monthID});
theMonthSpan.textContent = theMonth
LFForm.changeFieldSettings(agreementHTMLObj, { content: agreementHTMLDataParse.innerHTML });
}, {fieldId: monthID});
LFForm.onFieldChange(function(){
/* Update the content of the elements */
theYear = LFForm.getFieldValues({fieldId: yearID});
theYearSpan.textContent = theYear;
LFForm.changeFieldSettings(agreementHTMLObj, { content: agreementHTMLDataParse.innerHTML });
}, {fieldId: yearID});
Down the line in the process when the values are not being changed you can go back to just referencing the 'dataset' values within the Custom HTML (ex: {/dataset/Initiator_Name_Display} )
Let me know if you need any of this explained .. not sure it's all clear. :)