cq:isCancelledForChildren is not being set for panel container components while cancelling the inheritance | Community
Skip to main content
Level 2
April 6, 2026
Question

cq:isCancelledForChildren is not being set for panel container components while cancelling the inheritance

  • April 6, 2026
  • 1 reply
  • 22 views

I have created a custom component in my AEM as cloud which extends OTB Tab component and OTB Tab component extends the OTB Panel Container Component. And In this custom component i have added composite multifield field, now whenever i cancel the inheritance on live copy then ideally it should set cq:isCancelledForChildren as true , but it doesn’t,  resulting in overriding the manual changes done in this composite multifield on live copy. Do note this property gets set for normal components which are not extending OTB Tab or Accordian components. I believe this has something to do with cq:isContainer true property on panel container component. But i tried setting this as false and it doesnt work. Read few articles and found out that deepCancel on edit config helps to set this property but this also did not worked for me.
Any solution to this?

1 reply

PGURUKRISHNA
Level 4
April 6, 2026

Hey ​@JavedZi This is a known issue with AEM Panel Container components (Tabs, Accordion, Carousel). The 

cq:isCancelledForChildren

 property doesn't get set on inheritance cancellation because these components have 

cq:isContainer=true

, which changes how MSM (Multi Site Manager) handles them — it treats child nodes as independent "pages" rather than part of the component's content.

Here's the solution:

Add a custom 

rolloutConfig

 with a 

LiveActionFactory

 that forces deep cancellation for your component.

But the most direct and practical fix is:

  1. Override the 

    _cq_editConfig
     of your custom component to include the 
    cq:disableTargeting
     and the deep cancel behavior:

    In your component's 

    _cq_editConfig.xml
     (e.g., 
    ui.apps/src/main/content/jcr_root/apps/wknd/components/your-custom-tabs/_cq_editConfig.xml
    ):
    <?xml version="1.0" encoding="UTF-8"?>
    <jcr:root xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.day.com/jcr/jcr/1.0"
    jcr:primaryType="cq:EditConfig">
    <cq:listeners
    jcr:primaryType="nt:unstructured"
    afteredit="REFRESH_PAGE"
    afterinsert="REFRESH_PAGE"
    afterdelete="REFRESH_PAGE"/>
    </jcr:root>

     

  2. The actual fix — remove 

    cq:isContainer
     from your component's 
    .content.xml
     and instead manage the child panel items via the dialog (composite multifield) rather than as actual child resource nodes under the component:

    In your component's 

    .content.xml
    :
    <?xml version="1.0" encoding="UTF-8"?>
    <jc:root xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.day.com/jcr/jcr/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0"
    jcr:primaryType="cq:Component"
    jcr:title="Custom Tabs"
    sling:resourceSuperType="core/wcm/components/tabs/v1/tabs"
    componentGroup="WKND - Content"/>

     

    Do NOT include 

    cq:isContainer="{Boolean}true"
     — by not inheriting this property (or explicitly setting it to false), MSM will treat the entire component node tree as a single unit during rollout.
  3. If you must keep container behavior, the reliable workaround is to create a custom LiveAction that explicitly sets 

    cq:isCancelledForChildren=true
     on the component node when inheritance is cancelled:
    @Component(service = LiveActionFactory.class,
    property = {LiveActionFactory.LIVE_ACTION_NAME + "=customDeepCancelAction"})
    public class DeepCancelLiveActionFactory implements LiveActionFactory {

    @Override
    public LiveAction createAction(Resource resource) {
    return new DeepCancelLiveAction();
    }

    @Override
    public String createsAction() {
    return "customDeepCancelAction";
    }

    private static class DeepCancelLiveAction implements LiveAction {
    @Override
    public void execute(Resource source, Resource target, LiveRelationship relation, boolean autoSave, boolean isResetRollout) throws WCMException {
    if (target != null && relation.getStatus().isCancelled()) {
    ModifiableValueMap props = target.adaptTo(ModifiableValueMap.class);
    if (props != null) {
    props.put("cq:isCancelledForChildren", true);
    }
    }
    }

    @Override
    public String getName() { return "customDeepCancelAction"; }
    }
    }

     

     

Another approach: Option 2 (removing 

cq:isContainer

) is the cleanest if your composite multifield data is stored as properties/subnodes of the component itself and you don't need drag-and-drop child component authoring. This makes MSM treat the component like any normal component, and 

cq:isCancelledForChildren

 will be set automatically on inheritance cancellation.

Pagidala GuruKrishna