Is there a way to to add reusable parts of dialog under different nodes for different use cases | Community
Skip to main content
Level 2
November 11, 2020
Solved

Is there a way to to add reusable parts of dialog under different nodes for different use cases

  • November 11, 2020
  • 3 replies
  • 8179 views

Here's my problem I want to reuse my dialog for images using foundation include.

 

My use cases are in one instance I need my node structures to be the following: 

 

component1/cta/images

component2/mobile/images

 

It may be an oversight on my part but I can't seem to find a way that I can include my images dialog under the differing node structure cta or mobile. Is this possible and if so what would I use?

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.
Best answer by SebNamek

A colleague found the answer to this using the new namespace property on include. We had to upgrade our acs commons to use the new include param.

Here's a link to the documentation and an example usage https://adobe-consulting-services.github.io/acs-aem-commons/features/granite/parameterized-namespace-include/index.html.
example:

<typographyOptions jcr:primaryType="nt:unstructured" sling:resourceType="acs-commons/granite/ui/components/include" path="airmiles/components/component-elements/typographyOptionsV3" namespace="small"/> <typographyOptions jcr:primaryType="nt:unstructured" sling:resourceType="acs-commons/granite/ui/components/include" path="airmiles/components/component-elements/typographyOptionsV3" namespace="medium"/>

This will yield our reusable TypographyOptions dialog with an appended small and medium in front of the namespace.
ex: small/fontSize & medium/fontSize


3 replies

Manjunath_K
Level 7
November 11, 2020

Hi @sebnamek ,

Hope i understood your requirement, you can create reusable dialog fields at one location & refer same fields from component A, component B etc. using foundation include.

 

Create reusable field at common location (ex: /apps/project-name/widgets/image-field/.content.xml) & add image field in .content.xml

<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:granite="http://www.adobe.com/jcr/granite/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
jcr:primaryType="nt:unstructured">
<items jcr:primaryType="nt:unstructured">
<column
jcr:primaryType="nt:unstructured"
sling:resourceType="granite/ui/components/coral/foundation/container">
<items jcr:primaryType="nt:unstructured">
<image
jcr:primaryType="nt:unstructured"
sling:resourceType="cq/gui/components/authoring/dialog/fileupload"
allowUpload="{Boolean}false"
autoStart="{Boolean}false"
class="cq-droptarget"
fieldDescription="Configure Image"
fieldLabel="Image"
fileNameParameter="./fileName"
fileReferenceParameter="./image"
mimeTypes="[image]"
multiple="{Boolean}false"
name="./file"
uploadUrl="${suffix.path}"
useHTML5="{Boolean}true"/>
</items>
</column>
</items>
</jcr:root>

 

In Component A reuse the image field using foundation include:

<items jcr:primaryType="nt:unstructured">
<imageFieldInclude
jcr:primaryType="nt:unstructured"
sling:resourceType="granite/ui/components/coral/foundation/include"
path="/apps/project-name/widgets/image-field/items/column"/>
</items>

 

In Component B reuse the image field using foundation include:

<items jcr:primaryType="nt:unstructured">
<imageFieldInclude
jcr:primaryType="nt:unstructured"
sling:resourceType="granite/ui/components/coral/foundation/include"
path="/apps/project-name/widgets/image-field/items/column"/>
</items>

 

Hope this helps! 

SebNamekAuthor
Level 2
November 11, 2020

Thanks @manjunath_k,

That's also how I understood it. It seems like a pretty huge missed opportunity. It really limits the reusability of components in my application 

arunpatidar
Community Advisor
Community Advisor
November 12, 2020

Can you try with Sling Resource Merger(sling:resourceSuperType)? There you can override any properties you want. 

e.g. 

 

<image jcr:primaryType="nt:unstructured" name="./another/name" sling:resourceSuperType="/apps/myapp/component/component1/cq:dialogs/cta/image"/>

 

Arun Patidar
SebNamekAuthor
Level 2
November 17, 2020

This is great I didn't know this was possible. If I understand this properly would I need to do this for every property on the image dialog that needs to change?

If that's the case I'm not sure this would help because we have 15-20 properties on our image dialog. I will definitely keep this in mind for the future though.

SebNamekAuthorAccepted solution
Level 2
December 3, 2020

A colleague found the answer to this using the new namespace property on include. We had to upgrade our acs commons to use the new include param.

Here's a link to the documentation and an example usage https://adobe-consulting-services.github.io/acs-aem-commons/features/granite/parameterized-namespace-include/index.html.
example:

<typographyOptions jcr:primaryType="nt:unstructured" sling:resourceType="acs-commons/granite/ui/components/include" path="airmiles/components/component-elements/typographyOptionsV3" namespace="small"/> <typographyOptions jcr:primaryType="nt:unstructured" sling:resourceType="acs-commons/granite/ui/components/include" path="airmiles/components/component-elements/typographyOptionsV3" namespace="medium"/>

This will yield our reusable TypographyOptions dialog with an appended small and medium in front of the namespace.
ex: small/fontSize & medium/fontSize


Adobe Employee
December 17, 2020
Glad to see my contribution is being used 🙂 Enjoy. I was not aware of the sling merger when I created this. Maybe would be cool if the merger can support namespacing.