Expand my Community achievements bar.

Don’t miss the AEM Skill Exchange in SF on Nov 14—hear from industry leaders, learn best practices, and enhance your AEM strategy with practical tips.
SOLVED

Reset Dynamic Form with multiple tables

Avatar

Level 2

I have a form to build flowable dynamic lesson plans for training.  Each lesson plan form consists of multiple pages, some of the pages contain multiple subforms, several having dynamic table rows.  I am attempting to place a single reset form button on the page to clear all field values and reset all table row instances to 1 by clicking a button on the form master page. 

My Current XFA/javascript attempt is below;

LP.#pageSet[0].Pt1.sFrmPfHd.resetForm::click - (JavaScript, client)
  xfa.host.resetData();
//  xfa.host.remerge(); <- didn't work
// loop through table and delete rows
while (LP.Pg1.FlowContentPg1.rowSFrmTngMethodPick.tblData._rowSubform.count > 1)
{
  LP.Pg1.FlowContentPg1.rowSFrmTngMethodPick.tblData._rowSubform.removeInstance(0);
}
while (LP.Pg1.FlowContentPg1.rowSFrmTngMethodsFree.tblData._rowSubform.count > 1)
{
  LP.Pg1.FlowContentPg1.rowSFrmTngMethodsFree.tblData._rowSubform.removeInstance(0);
}
while (LP.Pg3.PgBody.rowSFrmTngMethodPick.tblData._rowSubform.count > 1)
{
  LP.Pg3.PgBody.rowSFrmTngMethodPick.tblData._rowSubform.removeInstance(0);
}
while (LP.Pg3.PgBody.rowSFrmTngMethodsFree.tblData._rowSubform.count > 1)
{
  LP.Pg3.PgBody.rowSFrmTngMethodsFree.tblData._rowSubform.removeInstance(0);
}
while (LP.Pg3.PgBody.rowSFrmLP.tblData._rowSubform.count > 1)
{
  LP.Pg3.PgBody.rowSFrmLP.tblData._rowSubform.removeInstance(0);
}

I would attach the form but cannot seem to find that as an option.  If you would like to see  the actual form please email me.

mailto:toby.yadon@us.af.mil

1 Accepted Solution

Avatar

Correct answer by
Level 10

This should do the trick.

// Reset subforms to inital number of occurences

function resetSubforms (oNode) {

    if (oNode.className === "subform") {

    if (oNode.instanceManager !== null) {

    var iCount = oNode.instanceManager.count,

    iMin = oNode.occur.min ? oNode.occur.min : 1,

    iInit = oNode.occur.initial ? oNode.occur.initial : iMin;

    if (iCount > iInit) {

    oNode.instanceManager.setInstances(iInit);

    }

    }

    }

    for (var i = 0; i < oNode.nodes.length; i += 1) {

        resetSubforms (oNode.nodes.item(i));

    }

}

resetSubforms (xfa.form); // call the function

View solution in original post

3 Replies

Avatar

Level 10

You should use the setInstances() method first to reset the table to the desired amount of rows.

Then use the resetData() method.

// Reset tables

LP.Pg1.FlowContentPg1.rowSFrmTngMethodPick.tblData._rowSubform.setInstances(1);

LP.Pg1.FlowContentPg1.rowSFrmTngMethodsFree.tblData._rowSubform.setInstances(1);

// reset data

xfa.host.resetData();

Avatar

Level 2

I tried your suggestion and was unable to make it work.  I may not be addressing the dynamic node addresses quite the way I need to.  Would it be possible to write a generic loop to loop through the node tree and reset all setInstances(1) without having to specify them individually?  This would also make the function usefule in a multitude of forms...

Thank you for your time.

Avatar

Correct answer by
Level 10

This should do the trick.

// Reset subforms to inital number of occurences

function resetSubforms (oNode) {

    if (oNode.className === "subform") {

    if (oNode.instanceManager !== null) {

    var iCount = oNode.instanceManager.count,

    iMin = oNode.occur.min ? oNode.occur.min : 1,

    iInit = oNode.occur.initial ? oNode.occur.initial : iMin;

    if (iCount > iInit) {

    oNode.instanceManager.setInstances(iInit);

    }

    }

    }

    for (var i = 0; i < oNode.nodes.length; i += 1) {

        resetSubforms (oNode.nodes.item(i));

    }

}

resetSubforms (xfa.form); // call the function