6.2.4. Using AJAX and HTML DOM Object

Warning

You are looking at documentation for an older release. Not what you want? See the current release documentation.

AJAX allows your gadget to be updated asynchronously by exchanging small amounts of data with the server behind the scenes. Besides, with the support of HTML DOM Object, the gadget's content can be created dynamically based on AJAX's response data. This section instructs you how to leverage these utilities to customize your gadget.

You can get the source code of this example here.

  1. Create a new Maven project with the following structure:

  2. Edit pom.xml file:

    
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>sample</groupId>
        <artifactId>gadget</artifactId>
        <packaging>war</packaging>
        <version>1.0</version>
        <name>Auto slideshow gadget sample</name>
        <build>
            <finalName>auto-slideshow</finalName>
        </build>
    </project>
  3. Edit web.xml file:

    
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="3.0" metadata-complete="true"
        xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
        <display-name>auto-slideshow</display-name>
    </web-app>
  4. Edit AutoSlideshowGadget.xml file:

    
    <?xml version="1.0" encoding="UTF-8" ?>
    <Module>
      <ModulePrefs title="Memories!" width="240" height="200"/>
      <Content type="html">
      <![CDATA[
      <!--Gadget's main body which will be added by HTML DOM Object later-->
      <div id="slideshow">
      </div>
      ]]>
      </Content>
    </Module>

    in which you name the gadget as Memories!. The main body consists of a div tag only. This file will be updated later.

  5. Download http://code.jquery.com/jquery-3.2.1.js and save it in webapp/gadgets/AutoSlideshowGadget/.

  6. Edit style.css file:

    
    img {width: 240px;
    }
    #slideshow { 
     
    margin: 10px auto 10px; 
       
    position: relative; 
       
    width: 240px; 
     
    height: 200px; 
        
    padding: 10px; 
        
    box-shadow: 0 0 20px rgba(0,0,0,0.4); 
    }
    #slideshow > div { 
       
    position: absolute; 
       
    top: 10px; 
        
    left: 10px; 
       
    right: 10px; 
      
    bottom: 10px; 
    }
  7. Edit myscript.js file. This script contains a function using AJAX to call DriverConnector API (see here for more details) to get all public images of root user. Another function, the traverseXMLDoc function will be added in next steps.

    function getImages() {
    	//This function uses AJAX to send GET request to server's DriverConnector API and receive XML response
    	jQuery.ajax({
    		type: "GET",
    		url: "/portal/rest/wcmDriver/getFoldersAndFiles?driverName=Collaboration&currentFolder=Users/r___/ro___/roo___/root/Public&currentPortal=intranet&repositoryName=repository&workspaceName=collaboration&filterBy=Image",
    		contentType: "application/xml; charset=utf-8",
    		dataType: "xml",
    		success: function (data, status, jqXHR) {
    			var strResults=new XMLSerializer().serializeToString(data.documentElement);
    			//build dynamic html content for "slideshow" div tag
    			traverseXMLDoc(strResults, "slideshow");
    		},
    		//error report
    		error: function (jqXHR, status) {
    			//error handler
    			alert("Cannot retrieve data!");
    		}
    	});
    }

    Note

    Notice the url parameter here is pointing to Public folder of root user to retrieve image files. Therefore, in later steps, it requires logging in as root user to upload images before anyone can use this gadget.

  8. Add the traverseXMLDoc function with 2 input parameters to this script as follows:

    function traverseXMLDoc(xmlDoc, idOfContainerDomElement){
    	//This function traverses through the whole XML response returned from server
    	var $xmlDocObjChildren, $contentDiv;
    	$contentDiv = $('#' + idOfContainerDomElement);
    	if ($contentDiv.length === 0) {
    		throw new Error('There are no DOM elements with this id: "' + idOfContainerDomElement + '"');
    	}
    	//Information of each image object is contained in "File" tag
    	$xmlDocObjChildren = $(xmlDoc).find("File");
    	$xmlDocObjChildren.each(function(index, Element) {
    		var	$currentObject = $(this),
    				childElementCount = Element.childElementCount,
    		//Image's url is contained in "url" attribute
    		currentNodeType = $currentObject.attr('url');
    		//Adding dynamic content into gadget's body
    		$contentDiv.append('<div><img src="'+currentNodeType+'"></div>');
    	});
    }
  9. Add some image effects by JavaScript and include all your created resources to the AutoSlideshowGadget.xml file:

    
    <?xml version="1.0" encoding="UTF-8" ?>
    <Module>
      <ModulePrefs title="Memories!" width="240" height="200"/>
      <Content type="html">
      <![CDATA[
      <script src="jquery-3.2.1.js"></script>
      <script src="myscript.js"></script>
      <link rel="stylesheet" type="text/css" href="style.css" />
      <!--Gadget's main body which will be added by HTML DOM Object later-->
      <div id="slideshow">
      </div>
      <!--Start calling js function-->
      <script type="text/javascript">
        getImages();
        //Creating gagdet's effects
        $("#slideshow > div:gt(0)").hide();
        setInterval(function() { 
          $('#slideshow > div:first')
            .fadeOut(1000)
            .next()
            .fadeIn(1000)
            .end()
            .appendTo('#slideshow');
        },  3000);
      </script>
        ]]>
      </Content>
    </Module>

    Notice that you can follow this section to create CSS and Javascript resources in separate files to share with other gadgets. In this guide, we make it simple by including these resources right inside the war package.

  10. Edit gadget.xml file:

    
    <gadgets xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.gatein.org/xml/ns/gatein_objects_1_0 http://www.gatein.org/xml/ns/gadgets_1_0"
        xmlns="http://www.gatein.org/xml/ns/gadgets_1_0">
        <gadget name="AutoSlideshowGadget">
            <path>/gadgets/AutoSlideshowGadget/AutoSlideshowGadget.xml</path>
        </gadget>
    </gadgets>
  11. Deploy the gadget and add it to Root's user dashboard. If necessary, see Creating a gadget for how to.

  12. Log in as Root, upload several images into DocumentsPublic.

The result is as below:

Copyright ©. All rights reserved. eXo Platform SAS
blog comments powered byDisqus