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

Validate page properties on save in 6.5

Avatar

Level 4

Hi,

 

I want to validate page properties after saving a page and based on the validations need to show an Error or allow to save that page.

 

I tried with below JS wherein it failing when ever a required field in page properties is filled and trying to save the page it is saving even it is not a valid case.

$(document).on("foundation-contentloaded", function(e) {
    $("#id1, #id2").on("click", function() {

		 validate();

    });
    $(".foundation-fixedanchor .coral3-Button--primary").on("click", function() {

        validate();

    });
    $(".foundation-wizard-control .coral3-Button--primary").on("click", function() {

     validate(); 

    });
    $("#id3").on("change keyup focus", function() {

        validate(); 
    });
});

 

Is there any way that we can do validation after saving the page and show an error alert if it fails?

1 Accepted Solution

Avatar

Correct answer by
Community Advisor

@Leela-Pavan-Kumarthis is definitely possible, but it will require some additional script. Please have a look on below example - it is not production ready - but in general it meets criteria you have describe. There are 2 elements, XML structure that contains radio group section and text field for ID. Second part is very simple javascript that should be registered as a client lib that will be available within page properties.

 

<rights jcr:primaryType="nt:unstructured" jcr:title="Rights" sling:resourceType="granite/ui/components/coral/foundation/form/fieldset">
  <items jcr:primaryType="nt:unstructured">
    <radiogroup jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/foundation/form/radiogroup">
      <items jcr:primaryType="nt:unstructured">
        <option1 jcr:primaryType="nt:unstructured" name="./rights" sling:resourceType="granite/ui/components/foundation/form/radio" text="Public" value="public"/>
        <option2 jcr:primaryType="nt:unstructured" name="./rights" sling:resourceType="granite/ui/components/foundation/form/radio" text="Private" value="private"/>
      </items>
    </radiogroup>
    <id jcr:primaryType="nt:unstructured" fieldLabel="ID" name="./id" sling:resourceType="granite/ui/components/coral/foundation/form/textfield"/>
  </items>
</rights>
(function(window, document, $, Granite) {
    'use strict';

    $('input[type="radio"]').click(function(){
    	if ($(this).is(':checked'))
    	{
        	var cmp = $('input[name*="./id"]')
        	if ($(this).val() == 'private') {
				cmp.attr('aria-required', 'true');
        	}
        	if ($(this).val() == 'public') {
				cmp.removeAttr('aria-required');
            	cmp.removeAttr('aria-invalid');
        	}
    	}
    });

})(window, document, Granite.$, Granite);

 

View solution in original post

3 Replies

Avatar

Community Advisor

Hi @Leela-Pavan-Kumar, did you consider to use required property. This will give you result like below - it is used i.e. by OOTB Title field. Author is not able to save page properties until he sets title value.

You can find page properties implementation under /libs/wcm/foundation/components/basicpage/v1/basicpage/tabs.

page-properties-validation.png

Avatar

Level 4

 

Hi @lukasz-m ,

 

Fields in Page Properties:

 

Rights : (Radio Group, Mandatory)
     - Public (Radio Button)
     - Private (Radio Button)

ID : (Text Field)

We have a radio group where in public and private options are there and this is mandatory & Text field which is not mandatory

 

 

If an author selects

  • Public - ID (Text Field) is optional
  • Private - ID(Text Field) is mandatory

 

Finally , This ID(Text Field)  needs to be dynamically mark as required if it is private.

 

Can we do this in AEM 6.5?

 

 

Avatar

Correct answer by
Community Advisor

@Leela-Pavan-Kumarthis is definitely possible, but it will require some additional script. Please have a look on below example - it is not production ready - but in general it meets criteria you have describe. There are 2 elements, XML structure that contains radio group section and text field for ID. Second part is very simple javascript that should be registered as a client lib that will be available within page properties.

 

<rights jcr:primaryType="nt:unstructured" jcr:title="Rights" sling:resourceType="granite/ui/components/coral/foundation/form/fieldset">
  <items jcr:primaryType="nt:unstructured">
    <radiogroup jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/foundation/form/radiogroup">
      <items jcr:primaryType="nt:unstructured">
        <option1 jcr:primaryType="nt:unstructured" name="./rights" sling:resourceType="granite/ui/components/foundation/form/radio" text="Public" value="public"/>
        <option2 jcr:primaryType="nt:unstructured" name="./rights" sling:resourceType="granite/ui/components/foundation/form/radio" text="Private" value="private"/>
      </items>
    </radiogroup>
    <id jcr:primaryType="nt:unstructured" fieldLabel="ID" name="./id" sling:resourceType="granite/ui/components/coral/foundation/form/textfield"/>
  </items>
</rights>
(function(window, document, $, Granite) {
    'use strict';

    $('input[type="radio"]').click(function(){
    	if ($(this).is(':checked'))
    	{
        	var cmp = $('input[name*="./id"]')
        	if ($(this).val() == 'private') {
				cmp.attr('aria-required', 'true');
        	}
        	if ($(this).val() == 'public') {
				cmp.removeAttr('aria-required');
            	cmp.removeAttr('aria-invalid');
        	}
    	}
    });

})(window, document, Granite.$, Granite);