dropdown field validation | Community
Skip to main content
October 13, 2023
Solved

dropdown field validation

  • October 13, 2023
  • 2 replies
  • 696 views

i have two dropdowns
first dropdown has values  1,2,3
second dropdown has values 4,5,6

in case second dropdown is value 5  is selected now  if in first dropdown if u select 2 then  in second dropdown 5 should be hidden and automaicallyy  second dropdown value should have become 4 in dropdown

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 Sady_Rifat

Hello @satishpothabathula ,

For your requirement, you can add a custom clientlib. To help or hints you can follow this JS, where after selecting the 1st dropdown other select field options are disabled. Where your requirement is just to hide.

Code Sinppet,

(function (document, $, Coral) { let $doc = $(document); $doc.on('foundation-contentloaded', function (e) { let _element = $('.cq-dialog-dropdown-showhide.dropdown-main')[0]; showHideHandler($(_element)); }); $(document).on("change", ".cq-dialog-dropdown-showhide", function(e) { showHideHandler($(this)); resetChild(); }); function showHideHandler(_this) { let desktopData = init(); for(let i=0; i<desktopData.children.length; i++){ let grandChildren = $(desktopData.children[i]).find("coral-select-item"); for (let j=0; j<=desktopData.index; j++){ grandChildren[j].removeAttribute("disabled"); } for(let j=desktopData.index+1; j<grandChildren.length; j++){ grandChildren[j].setAttribute("disabled", true); } } } function resetChild() { let desktopData = init(); let tabletChildren = $(desktopData.children[0]).find("coral-select-item"); let mobileChildren = $(desktopData.children[1]).find("coral-select-item"); let tabletSelectedIndex = Array.prototype.findIndex.call(tabletChildren, ele => ele.hasAttribute('selected')); let mobileSelectedIndex = Array.prototype.findIndex.call(mobileChildren, ele => ele.hasAttribute('selected')); if(desktopData.index < tabletSelectedIndex){ tabletChildren[tabletSelectedIndex].removeAttribute("selected"); tabletChildren[0].setAttribute("selected", true); } if(desktopData.index < mobileSelectedIndex){ mobileChildren[mobileSelectedIndex].removeAttribute("selected"); mobileChildren[0].setAttribute("selected", true); } } function init () { let desktopData = {}; let mother = $('coral-select.dropdown-main'); let elementChildren = $(mother).find('coral-select-item'); desktopData.index = Array.prototype.findIndex.call(elementChildren, ele => ele.hasAttribute('selected')); desktopData.children = $('coral-select.dropdown-child'); return desktopData; } })(document, Granite.$, Coral);

 

XML,

<rapidColumnConfigDesktop granite:class="cq-dialog-dropdown-showhide tab-show-hide-select dropdown-main" jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/form/select" fieldLabel="Column Layout for Desktop" name="./rapidColumnConfigDesktop"> <granite:data jcr:primaryType="nt:unstructured" cq-dialog-dropdown-showhide-target=".rapid-column-layout-show-hide" tab-showhide-target=".rapid-tab-show-hide"/> <items jcr:primaryType="nt:unstructured"> <oneColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}true" text="1 Column Layout" value="1"/> <twoColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="2 Column Layout" value="2"/> <threeColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="3 Column Layout" value="3"/> <fourColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="4 Column Layout" value="4"/> <fiveColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="5 Column Layout" value="5"/> <sixColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="6 Column Layout" value="6"/> </items> </rapidColumnConfigDesktop> <rapidColumnConfigTablet granite:class="dropdown-child" jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/form/select" fieldLabel="Column Layout for Tablet" name="./rapidColumnConfigTablet"> <items jcr:primaryType="nt:unstructured"> <oneColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}true" text="1 Column Layout" value="1"/> <twoColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="2 Column Layout" value="2"/> <threeColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="3 Column Layout" value="3"/> <fourColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="4 Column Layout" value="4"/> <fiveColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="5 Column Layout" value="5"/> <sixColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="6 Column Layout" value="6"/> </items> </rapidColumnConfigTablet> <rapidColumnConfigMobile granite:class="dropdown-child" jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/form/select" fieldLabel="Column Layout for Mobile" name="./rapidColumnConfigMobile"> <items jcr:primaryType="nt:unstructured"> <oneColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}true" text="1 Column Layout" value="1"/> <twoColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="2 Column Layout" value="2"/> <threeColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="3 Column Layout" value="3"/> <fourColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="4 Column Layout" value="4"/> <fiveColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="5 Column Layout" value="5"/> <sixColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="6 Column Layout" value="6"/> </items> </rapidColumnConfigMobile>

Hope this will help you to modify it.

2 replies

EstebanBustamante
Community Advisor and Adobe Champion
Community Advisor and Adobe Champion
October 13, 2023

Hi, 

 

I think the same principles that are applied to any of the below resources will work in your scenario, you just need to:

- Create a custom javascript that will run on dialog-ready

- Then you will add a listener onChange for the 1st dropdown,

- Once the event triggers (meaning your 1st dropdown change) you will execute any validation or logic you need via JS.

 

 

 

Examples:

https://adapttoaem.blogspot.com/2021/02/setting-dynamic-dropdownselect-value-in.html

https://sadyrifat.medium.com/show-hide-aem-cq-dialog-fields-based-on-select-field-selection-a-comprehensive-guide-bee591abd24c

https://experienceleaguecommunities.adobe.com/t5/adobe-experience-manager/in-aem-based-on-selection-of-drop-down-show-some-hide-some/m-p/363710 

 

Hope this helps

Esteban Bustamante
Sady_Rifat
Community Advisor
Sady_RifatCommunity AdvisorAccepted solution
Community Advisor
October 16, 2023

Hello @satishpothabathula ,

For your requirement, you can add a custom clientlib. To help or hints you can follow this JS, where after selecting the 1st dropdown other select field options are disabled. Where your requirement is just to hide.

Code Sinppet,

(function (document, $, Coral) { let $doc = $(document); $doc.on('foundation-contentloaded', function (e) { let _element = $('.cq-dialog-dropdown-showhide.dropdown-main')[0]; showHideHandler($(_element)); }); $(document).on("change", ".cq-dialog-dropdown-showhide", function(e) { showHideHandler($(this)); resetChild(); }); function showHideHandler(_this) { let desktopData = init(); for(let i=0; i<desktopData.children.length; i++){ let grandChildren = $(desktopData.children[i]).find("coral-select-item"); for (let j=0; j<=desktopData.index; j++){ grandChildren[j].removeAttribute("disabled"); } for(let j=desktopData.index+1; j<grandChildren.length; j++){ grandChildren[j].setAttribute("disabled", true); } } } function resetChild() { let desktopData = init(); let tabletChildren = $(desktopData.children[0]).find("coral-select-item"); let mobileChildren = $(desktopData.children[1]).find("coral-select-item"); let tabletSelectedIndex = Array.prototype.findIndex.call(tabletChildren, ele => ele.hasAttribute('selected')); let mobileSelectedIndex = Array.prototype.findIndex.call(mobileChildren, ele => ele.hasAttribute('selected')); if(desktopData.index < tabletSelectedIndex){ tabletChildren[tabletSelectedIndex].removeAttribute("selected"); tabletChildren[0].setAttribute("selected", true); } if(desktopData.index < mobileSelectedIndex){ mobileChildren[mobileSelectedIndex].removeAttribute("selected"); mobileChildren[0].setAttribute("selected", true); } } function init () { let desktopData = {}; let mother = $('coral-select.dropdown-main'); let elementChildren = $(mother).find('coral-select-item'); desktopData.index = Array.prototype.findIndex.call(elementChildren, ele => ele.hasAttribute('selected')); desktopData.children = $('coral-select.dropdown-child'); return desktopData; } })(document, Granite.$, Coral);

 

XML,

<rapidColumnConfigDesktop granite:class="cq-dialog-dropdown-showhide tab-show-hide-select dropdown-main" jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/form/select" fieldLabel="Column Layout for Desktop" name="./rapidColumnConfigDesktop"> <granite:data jcr:primaryType="nt:unstructured" cq-dialog-dropdown-showhide-target=".rapid-column-layout-show-hide" tab-showhide-target=".rapid-tab-show-hide"/> <items jcr:primaryType="nt:unstructured"> <oneColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}true" text="1 Column Layout" value="1"/> <twoColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="2 Column Layout" value="2"/> <threeColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="3 Column Layout" value="3"/> <fourColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="4 Column Layout" value="4"/> <fiveColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="5 Column Layout" value="5"/> <sixColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="6 Column Layout" value="6"/> </items> </rapidColumnConfigDesktop> <rapidColumnConfigTablet granite:class="dropdown-child" jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/form/select" fieldLabel="Column Layout for Tablet" name="./rapidColumnConfigTablet"> <items jcr:primaryType="nt:unstructured"> <oneColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}true" text="1 Column Layout" value="1"/> <twoColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="2 Column Layout" value="2"/> <threeColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="3 Column Layout" value="3"/> <fourColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="4 Column Layout" value="4"/> <fiveColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="5 Column Layout" value="5"/> <sixColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="6 Column Layout" value="6"/> </items> </rapidColumnConfigTablet> <rapidColumnConfigMobile granite:class="dropdown-child" jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/form/select" fieldLabel="Column Layout for Mobile" name="./rapidColumnConfigMobile"> <items jcr:primaryType="nt:unstructured"> <oneColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}true" text="1 Column Layout" value="1"/> <twoColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="2 Column Layout" value="2"/> <threeColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="3 Column Layout" value="3"/> <fourColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="4 Column Layout" value="4"/> <fiveColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="5 Column Layout" value="5"/> <sixColumnLayout jcr:primaryType="nt:unstructured" selected="{Boolean}false" text="6 Column Layout" value="6"/> </items> </rapidColumnConfigMobile>

Hope this will help you to modify it.