Table of Contents

Overview

Dashboard component offers a graphical representation of data on the page. 

Note

Dashboard component is configured into an XML file.

Getting Started

Component XML File

...

  • <title> - is used to define a valid key defined in translation properties file. Its translation through the glossary will be used as the presentable name of the component.
  • <iconclass> - is used to define a font awesome icon class that will be used to render the icon of the component. 

    Note

    Use font awesome icon class supported by version 4.7.0.


  • <ejb> - is used to define a process ejb class name in which the method that will be used to retrieved chart’s data is implemented.
  • <method> - is used to define the method that will be used to retrieve chart's data.
  • <type> - is used to define the type of the chart. 

    Note

    Allowed values are BAR, DONUT, LINE, PIE, STACKED_BAR and SUMMARY.


  • <orientation> - is used to define the orientation of the chart's data.

    Note

    Allowed values are VERTICAL and HORIZONTAL.

    Applicable only for chart types BAR and STACKED_BAR.


  • <xaxislabel> - is used to define a valid key defined in translation properties file. Its translation through the glossary will be used as the X axis title.

    Note

    Applicable only for chart types BAR, LINE and STACKED_BAR.


  • <yaxislabel> - is used to define a valid key defined in translation properties file. Its translation through the glossary will be used as the X axis title.

    Note

    Applicable only for chart types BAR, LINE and STACKED_BAR.


  • <settings> - is used to defined the chart settings and should follow the below structure.

    Code Block
    languagexml
    <settings>
    	<setting>
    		<id></id>
    		<label></label>
    		<classname></classname> 
    	</setting>
    </settings>
    


    Note

    Settings must have the same order as the ejb method parameters.

    Each setting tag should consist of:

    • <id> - is used to define a unique id for the setting that will be used to construct dashboard component's xml.
    • <label> - is used to define a valid key defined in translation properties file. Its translation through the glossary will be used as the setting label.
    • <classname> - is used to define the class name of the data object that is mapping with the setting. 

...

Expand
title.java


Code Block
languagejava
themeEclipse
/**
	 * Load the subscriptions per life Cycle State.
	 * 
	 * @param subscriptionTypes - the subscription types to load the subscriptions for
	 * @param services - the services to load the subscriptions for
	 * 
	 * @return a map of the subscriptions per type and service. The key is the subscription type. The value is a map of the subscriptions per service for the respectively type where the key is the service and the value is the number of subscriptions. 
	 * @throws Exception
	 */
   	public HashMap<SubscriptionLifeCycleState, Integer> loadSubscriptionsPerLifeCycleState(ArrayList<CRMDOSubscriptionType> subscriptionTypes, ArrayList<SubscriptionLifeCycleState> subscriptionLifeCycleStates) throws Exception {

   		CRMProcessSubscriptionHook hook = (CRMProcessSubscriptionHook) loadHook();

   		if(hook!=null) 
		{
			hook.beforeLoadSubscriptionsPerLifeCycleState(subscriptionLifeCycleStates, subscriptionTypes);
		}
   		
   		HashMap<SubscriptionLifeCycleState, Integer> subscriptionsPerLifeCycleState = new HashMap<SubscriptionLifeCycleState, Integer>();
   		
   		try
   		{
   			ArrayList<Object> parameters = new ArrayList<Object>();
   			
   			String sql = 
   					"\n SELECT SUBLIFECYCLESTATEHISTORY.LIFECYCLESTATE AS LIFE_CYCLE_STATE, COUNT(SUBSCRIPTIONS.SUBID) AS TOTAL " +
   					"\n FROM SUBSCRIPTIONS " +
   					"\n INNER JOIN SUBLIFECYCLESTATEHISTORY ON SUBLIFECYCLESTATEHISTORY.SUBID = SUBSCRIPTIONS.SUBID " +
   					"\n INNER JOIN SUBSCRIPTIONTYPES ON SUBSCRIPTIONTYPES.SUBTYPEID = SUBSCRIPTIONS.SUBTYPEID " +
   					"\n WHERE SUBSCRIPTIONS.SUBDELETED=0 " +
   					"\n 	AND SUBLIFECYCLESTATEHISTORY.SUBLIFECYCLESTATEDELETED=0 " +
   					"\n 	AND ( " + 
					"\n 		SUBLIFECYCLESTATEHISTORY.SUBLIFECYCLESTATEFROMDATE IS NOT NULL " +
					"\n 		AND " + DateUtil.getSelectSQLDate(getCRMSession().getDbtype(), "SUBLIFECYCLESTATEHISTORY.SUBLIFECYCLESTATEFROMDATE") + " <= " + DateUtil.getSelectSQLDate(getCRMSession().getDbtype(), getCurrentDate()) + " " +
					"\n		) " +					
					"\n 	AND ( " + 
					"\n 		SUBLIFECYCLESTATEHISTORY.SUBLIFECYCLESTATETODATE IS NULL " +
					"\n       	OR " + DateUtil.getSelectSQLDate(getCRMSession().getDbtype(), "SUBLIFECYCLESTATEHISTORY.SUBLIFECYCLESTATETODATE") + " > " + DateUtil.getSelectSQLDate(getCRMSession().getDbtype(), getCurrentDate()) + " " +
					"\n		) ";
   			
   			if(subscriptionTypes!=null && subscriptionTypes.size()>0)
   			{
   				String subscriptionTypesSql = "";			
   				Iterator<CRMDOSubscriptionType> subscriptionTypesIter = subscriptionTypes.iterator();   				
   				while(subscriptionTypesIter.hasNext())
   				{
   					CRMDOSubscriptionType subscriptionType = subscriptionTypesIter.next();
   					
   					if(subscriptionType!=null)
   					{
   						parameters.add(subscriptionType.getId());
   						
   						if(subscriptionTypesSql.length()>0)
   						{
   							subscriptionTypesSql += ",";
   						}
   						
   						subscriptionTypesSql += "?";
   					}
   				}
   				
   				sql += " AND SUBSCRIPTIONS.SUBTYPEID IN (" + subscriptionTypesSql + ") ";
   			}
   			
   			if(subscriptionLifeCycleStates!=null && subscriptionLifeCycleStates.size()>0)
   			{
   				String subscriptionLifeCycleStatesSql = "";			
   				Iterator<SubscriptionLifeCycleState> subscriptionLifeCycleStatesIter = subscriptionLifeCycleStates.iterator();   				
   				while(subscriptionLifeCycleStatesIter.hasNext())
   				{
   					SubscriptionLifeCycleState subscriptionLifeCycleState = subscriptionLifeCycleStatesIter.next();
   					
   					if(subscriptionLifeCycleState!=null)
   					{
   						parameters.add(subscriptionLifeCycleState.toString());
   						
   						if(subscriptionLifeCycleStatesSql.length()>0)
   						{
   							subscriptionLifeCycleStatesSql += ",";
   						}
   						
   						subscriptionLifeCycleStatesSql += "?";
   					}
   				}

   				sql += " AND SUBLIFECYCLESTATEHISTORY.LIFECYCLESTATE IN (" + subscriptionLifeCycleStatesSql + ") ";
   			}
   			   			
   			sql +=	"\n GROUP BY SUBLIFECYCLESTATEHISTORY.LIFECYCLESTATE " +
   					"\n ORDER BY COUNT(SUBSCRIPTIONS.SUBID) DESC";
   			
   			ResultSetUtil rsu = SQLUtil.executeUsingPreparedStatement(sql, getCRMSession().getOrganisationID(), parameters);
			
			if(rsu!=null && rsu.getRowCount()>0)
			{				
				while (rsu.next())
				{					
					if(rsu.getString("LIFE_CYCLE_STATE")!=null && 
							rsu.getInteger("TOTAL")!=null)
					{
						//load subscription life cycle state
						SubscriptionLifeCycleState subscriptionLifeCycleState = SubscriptionLifeCycleState.valueOf(rsu.getString("LIFE_CYCLE_STATE"));
						
						subscriptionsPerLifeCycleState.put(subscriptionLifeCycleState, rsu.getInteger("TOTAL"));
					}
				}				
			}   	   			
   		}
   		catch (Exception e)
        {
        	e.printStackTrace();
        }
   		
   		if(hook!=null) 
		{
   			subscriptionsPerLifeCycleState = hook.afterLoadSubscriptionsPerLifeCycleState(subscriptionsPerLifeCycleState);
		}
   		
   		return subscriptionsPerLifeCycleState;
   	}



Line Chart

The following example shows a dashboard component of type LINE.


Pie Chart

The following example shows a dashboard component of type PIE.

...

The following examples show a dashboard component of type SUMMARY.

Expand
titleExmaple 1

Image Added

Expand
titleOutput

Image Added



Expand
title.xml


Code Block
languagexml
themeEclipse
<?xml version="1.0" encoding="UTF-8"?><dashboardcomponent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../xsd/dashboards.xsd">
	<title>key_subscriptions_per_life_cycle_state</title>
	<iconclass></iconclass>
	<ejb>CRMProcessSubscriptionBean</ejb>
	<method>loadSubscriptionsPerLifeCycleState</method>
	<type>SUMMARY</type>
	<orientation></orientation>
	<xaxislabel></xaxislabel>
	<yaxislabel></yaxislabel>
	<settings>
		<setting>
			<id>lifeCycleStates</id>
			<label>key_life_cycle_states</label>
			<classname>com.crm.dataobject.subscriptions.SubscriptionLifeCycleState</classname>			
		</setting>
		<setting>
			<id>types</id>
			<label>key_subscription_types</label>
			<classname>com.crm.dataobject.subscriptions.CRMDOSubscriptionType</classname>			
		</setting>		
	</settings>
	<summarypage>subscriptions/subscriptions</summarypage>	
	<summarypageparameters>
		<summarypageparameter>
			<name>lifeCycleState</name>
			<classname>com.crm.dataobject.subscriptions.SubscriptionLifeCycleState</classname>
			<field></field>			
			<axis></axis>
		</summarypageparameter>		
	</summarypageparameters>
	<columns>
		<column>
			<label>key_subscription_type</label>
		</column>	
		<column>
			<label>key_life_cycle_state</label>
		</column>	
	</columns>
</dashboardcomponent>



Expand
title.java


Code Block
languagejava
themeEclipse
/**
	 * Load the subscriptions per life Cycle State.
	 * 
	 * @param subscriptionTypes - the subscription types to load the subscriptions for
	 * @param services - the services to load the subscriptions for
	 * 
	 * @return a map of the subscriptions per type and service. The key is the subscription type. The value is a map of the subscriptions per service for the respectively type where the key is the service and the value is the number of subscriptions. 
	 * @throws Exception
	 */
   	public HashMap<SubscriptionLifeCycleState, Integer> loadSubscriptionsPerLifeCycleState(ArrayList<CRMDOSubscriptionType> subscriptionTypes, ArrayList<SubscriptionLifeCycleState> subscriptionLifeCycleStates) throws Exception {

   		CRMProcessSubscriptionHook hook = (CRMProcessSubscriptionHook) loadHook();

   		if(hook!=null) 
		{
			hook.beforeLoadSubscriptionsPerLifeCycleState(subscriptionLifeCycleStates, subscriptionTypes);
		}
   		
   		HashMap<SubscriptionLifeCycleState, Integer> subscriptionsPerLifeCycleState = new HashMap<SubscriptionLifeCycleState, Integer>();
   		
   		try
   		{
   			ArrayList<Object> parameters = new ArrayList<Object>();
   			
   			String sql = 
   					"\n SELECT SUBLIFECYCLESTATEHISTORY.LIFECYCLESTATE AS LIFE_CYCLE_STATE, COUNT(SUBSCRIPTIONS.SUBID) AS TOTAL " +
   					"\n FROM SUBSCRIPTIONS " +
   					"\n INNER JOIN SUBLIFECYCLESTATEHISTORY ON SUBLIFECYCLESTATEHISTORY.SUBID = SUBSCRIPTIONS.SUBID " +
   					"\n INNER JOIN SUBSCRIPTIONTYPES ON SUBSCRIPTIONTYPES.SUBTYPEID = SUBSCRIPTIONS.SUBTYPEID " +
   					"\n WHERE SUBSCRIPTIONS.SUBDELETED=0 " +
   					"\n 	AND SUBLIFECYCLESTATEHISTORY.SUBLIFECYCLESTATEDELETED=0 " +
   					"\n 	AND ( " + 
					"\n 		SUBLIFECYCLESTATEHISTORY.SUBLIFECYCLESTATEFROMDATE IS NOT NULL " +
					"\n 		AND " + DateUtil.getSelectSQLDate(getCRMSession().getDbtype(), "SUBLIFECYCLESTATEHISTORY.SUBLIFECYCLESTATEFROMDATE") + " <= " + DateUtil.getSelectSQLDate(getCRMSession().getDbtype(), getCurrentDate()) + " " +
					"\n		) " +					
					"\n 	AND ( " + 
					"\n 		SUBLIFECYCLESTATEHISTORY.SUBLIFECYCLESTATETODATE IS NULL " +
					"\n       	OR " + DateUtil.getSelectSQLDate(getCRMSession().getDbtype(), "SUBLIFECYCLESTATEHISTORY.SUBLIFECYCLESTATETODATE") + " > " + DateUtil.getSelectSQLDate(getCRMSession().getDbtype(), getCurrentDate()) + " " +
					"\n		) ";
   			
   			if(subscriptionTypes!=null && subscriptionTypes.size()>0)
   			{
   				String subscriptionTypesSql = "";			
   				Iterator<CRMDOSubscriptionType> subscriptionTypesIter = subscriptionTypes.iterator();   				
   				while(subscriptionTypesIter.hasNext())
   				{
   					CRMDOSubscriptionType subscriptionType = subscriptionTypesIter.next();
   					
   					if(subscriptionType!=null)
   					{
   						parameters.add(subscriptionType.getId());
   						
   						if(subscriptionTypesSql.length()>0)
   						{
   							subscriptionTypesSql += ",";
   						}
   						
   						subscriptionTypesSql += "?";
   					}
   				}
   				
   				sql += " AND SUBSCRIPTIONS.SUBTYPEID IN (" + subscriptionTypesSql + ") ";
   			}
   			
   			if(subscriptionLifeCycleStates!=null && subscriptionLifeCycleStates.size()>0)
   			{
   				String subscriptionLifeCycleStatesSql = "";			
   				Iterator<SubscriptionLifeCycleState> subscriptionLifeCycleStatesIter = subscriptionLifeCycleStates.iterator();   				
   				while(subscriptionLifeCycleStatesIter.hasNext())
   				{
   					SubscriptionLifeCycleState subscriptionLifeCycleState = subscriptionLifeCycleStatesIter.next();
   					
   					if(subscriptionLifeCycleState!=null)
   					{
   						parameters.add(subscriptionLifeCycleState.toString());
   						
   						if(subscriptionLifeCycleStatesSql.length()>0)
   						{
   							subscriptionLifeCycleStatesSql += ",";
   						}
   						
   						subscriptionLifeCycleStatesSql += "?";
   					}
   				}

   				sql += " AND SUBLIFECYCLESTATEHISTORY.LIFECYCLESTATE IN (" + subscriptionLifeCycleStatesSql + ") ";
   			}
   			   			
   			sql +=	"\n GROUP BY SUBLIFECYCLESTATEHISTORY.LIFECYCLESTATE " +
   					"\n ORDER BY COUNT(SUBSCRIPTIONS.SUBID) DESC";
   			
   			ResultSetUtil rsu = SQLUtil.executeUsingPreparedStatement(sql, getCRMSession().getOrganisationID(), parameters);
			
			if(rsu!=null && rsu.getRowCount()>0)
			{				
				while (rsu.next())
				{					
					if(rsu.getString("LIFE_CYCLE_STATE")!=null && 
							rsu.getInteger("TOTAL")!=null)
					{
						//load subscription life cycle state
						SubscriptionLifeCycleState subscriptionLifeCycleState = SubscriptionLifeCycleState.valueOf(rsu.getString("LIFE_CYCLE_STATE"));
						
						subscriptionsPerLifeCycleState.put(subscriptionLifeCycleState, rsu.getInteger("TOTAL"));
					}
				}				
			}   	   			
   		}
   		catch (Exception e)
        {
        	e.printStackTrace();
        }
   		
   		if(hook!=null) 
		{
   			subscriptionsPerLifeCycleState = hook.afterLoadSubscriptionsPerLifeCycleState(subscriptionsPerLifeCycleState);
		}
   		
   		return subscriptionsPerLifeCycleState;
   	}