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.
- <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 |
---|
|
<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:
...
Expand |
---|
|
Expand |
---|
| Image Removed Image Added |
Expand |
---|
|
Code Block |
---|
| <?xml version="1.0" encoding="UTF-8"?><dashboardcomponent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../xsd/dashboards.xsd">
<title>key_effective_subscriptions_per_type_and_service</title>
<iconclass></iconclass>
<ejb>CRMProcessSubscriptionBean</ejb>
<method>loadSubscriptionsPerTypeAndProduct</method>
<type>BAR</type>
<orientation>VERTICAL</orientation>
<xaxislabel>key_subscription_services</xaxislabel>
<yaxislabel>key_number_of_subscriptions</yaxislabel>
<settings>
<setting>
<id>types</id>
<label>key_subscription_types</label>
<classname>com.crm.dataobject.subscriptions.CRMDOSubscriptionType</classname>
</setting>
<setting>
<id>serviceTypes</id>
<label>key_service_types</label>
<classname>com.crm.dataobject.products.CRMDOProductType</classname>
</setting>
</settings>
<summarypage>subscriptions/subscriptions</summarypage>
<summarypageparameters>
<summarypageparameter>
<name>types</name>
<classname>com.crm.dataobject.subscriptions.CRMDOSubscriptionType</classname>
<field>name</field>
<axis>Z_AXIS</axis>
</summarypageparameter>
<summarypageparameter>
<name>serviceTypes</name>
<classname>com.crm.dataobject.products.CRMDOProductType</classname>
<field>code</field>
<axis>X_AXIS</axis>
</summarypageparameter>
</summarypageparameters>
<columns>
<column>
<label></label>
</column>
</columns>
</dashboardcomponent>
|
|
Expand |
---|
|
Code Block |
---|
| /**
* Load the subscriptions per type and service.
*
* @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
*/
@SuppressWarnings("unchecked")
public HashMap<CRMDOSubscriptionType, HashMap<CRMDOProduct, Integer>> loadSubscriptionsPerTypeAndProduct(ArrayList<CRMDOSubscriptionType> subscriptionTypes, ArrayList<CRMDOProductType> serviceTypes) throws Exception {
CRMProcessSubscriptionHook hook = (CRMProcessSubscriptionHook) loadHook();
if(hook!=null)
{
hook.beforeLoadSubscriptionsPerTypeAndService(subscriptionTypes, serviceTypes);
}
HashMap<CRMDOSubscriptionType, HashMap<CRMDOProduct, Integer>> subscriptionsPerTypeAndService = new HashMap<CRMDOSubscriptionType, HashMap<CRMDOProduct, Integer>>();
try
{
ArrayList<Object> parameters = new ArrayList<Object>();
parameters.add(SubscriptionLifeCycleState.EFFECTIVE.toString());
parameters.add(ProductTypeClassification.SERVICES.toString());
String sql =
"\n SELECT SUBSCRIPTIONTYPES.SUBTYPEID AS SUBSCRIPTION_TYPE, PRODUCTS.PRODID AS SERVICE, COUNT(SUBSCRIPTIONS.SUBID) AS TOTAL " +
"\n FROM SUBSCRIPTIONS " +
"\n INNER JOIN SUBSCRIPTIONTYPES ON SUBSCRIPTIONTYPES.SUBTYPEID=SUBSCRIPTIONS.SUBTYPEID " +
"\n INNER JOIN SUBSCRIPTIONSERVICES ON SUBSCRIPTIONSERVICES.SUBID=SUBSCRIPTIONS.SUBID " +
"\n INNER JOIN PRODUCTS ON SUBSCRIPTIONSERVICES.PRODID=PRODUCTS.PRODID " +
"\n INNER JOIN PRODUCTTYPES ON PRODUCTTYPES.PRODTYPEID=PRODUCTS.PRODTYPEID " +
"\n INNER JOIN SUBLIFECYCLESTATEHISTORY ON SUBLIFECYCLESTATEHISTORY.SUBID = SUBSCRIPTIONS.SUBID " +
"\n WHERE SUBSCRIPTIONS.SUBDELETED=0 " +
"\n AND SUBSCRIPTIONSERVICES.SUBSERVICEDELETED=0 " +
"\n AND PRODUCTS.PRODDELETED=0" +
"\n AND SUBLIFECYCLESTATEHISTORY.SUBLIFECYCLESTATEDELETED=0 " +
"\n AND SUBLIFECYCLESTATEHISTORY.LIFECYCLESTATE=? " +
"\n AND PRODUCTTYPES.PRODTYPECLASSIFICATION=? " +
"\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(serviceTypes!=null && serviceTypes.size()>0)
{
String serviceTypesSql = "";
Iterator<CRMDOProductType> serviceTypesIter = serviceTypes.iterator();
while(serviceTypesIter.hasNext())
{
CRMDOProductType serviceType = serviceTypesIter.next();
if(serviceType!=null)
{
parameters.add(serviceType.getId());
if(serviceTypesSql.length()>0)
{
serviceTypesSql += ",";
}
serviceTypesSql += "?";
}
}
sql += " AND PRODUCTTYPES.PRODTYPEID IN (" + serviceTypesSql + ") ";
}
sql += "\n GROUP BY SUBSCRIPTIONTYPES.SUBTYPEID, PRODUCTS.PRODID " +
"\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("SUBSCRIPTION_TYPE")!=null &&
rsu.getString("SERVICE")!=null &&
rsu.getInteger("TOTAL")!=null)
{
//load subscription type
CRMDOSubscriptionType subscriptionType = (CRMDOSubscriptionType)subscriptionTypeBean.load(rsu.getString("SUBSCRIPTION_TYPE"), new ArrayList<String>());
//load service
CRMDOProduct service = (CRMDOProduct)productBean.load(rsu.getString("SERVICE"), new ArrayList<String>());
HashMap<CRMDOProduct, Integer> perService = new HashMap<CRMDOProduct, Integer>();
if(containsKey(subscriptionsPerTypeAndService, subscriptionType))
{
perService = (HashMap<CRMDOProduct, Integer>) get(subscriptionsPerTypeAndService, subscriptionType);
perService.put(service, rsu.getInteger("TOTAL"));
}
else
{
perService.put(service, rsu.getInteger("TOTAL"));
subscriptionsPerTypeAndService.put(subscriptionType, perService);
}
}
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
if(hook!=null)
{
subscriptionsPerTypeAndService = hook.afterLoadSubscriptionsPerTypeAndService(subscriptionsPerTypeAndService);
}
return subscriptionsPerTypeAndService;
} |
|
|
...
Expand |
---|
title | Horizontal Bar Chart |
---|
|
Expand |
---|
| Image Removed Image Added |
Expand |
---|
|
Code Block |
---|
| <?xml version="1.0" encoding="UTF-8"?><dashboardcomponent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../xsd/dashboards.xsd">
<title>key_effective_subscriptions_per_type_and_service</title>
<iconclass></iconclass>
<ejb>CRMProcessSubscriptionBean</ejb>
<method>loadSubscriptionsPerTypeAndProduct</method>
<type>BAR</type>
<orientation>HORIZONTAL</orientation>
<xaxislabel>key_subscription_services</xaxislabel>
<yaxislabel>key_number_of_subscriptions</yaxislabel>
<settings>
<setting>
<id>types</id>
<label>key_subscription_types</label>
<classname>com.crm.dataobject.subscriptions.CRMDOSubscriptionType</classname>
</setting>
<setting>
<id>serviceTypes</id>
<label>key_service_types</label>
<classname>com.crm.dataobject.products.CRMDOProductType</classname>
</setting>
</settings>
<summarypage>subscriptions/subscriptions</summarypage>
<summarypageparameters>
<summarypageparameter>
<name>types</name>
<classname>com.crm.dataobject.subscriptions.CRMDOSubscriptionType</classname>
<field>name</field>
<axis>Z_AXIS</axis>
</summarypageparameter>
<summarypageparameter>
<name>serviceTypes</name>
<classname>com.crm.dataobject.products.CRMDOProductType</classname>
<field>code</field>
<axis>X_AXIS</axis>
</summarypageparameter>
</summarypageparameters>
<columns>
<column>
<label></label>
</column>
</columns>
</dashboardcomponent> |
|
Expand |
---|
|
Code Block |
---|
| /**
* Load the subscriptions per type and service.
*
* @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
*/
@SuppressWarnings("unchecked")
public HashMap<CRMDOSubscriptionType, HashMap<CRMDOProduct, Integer>> loadSubscriptionsPerTypeAndProduct(ArrayList<CRMDOSubscriptionType> subscriptionTypes, ArrayList<CRMDOProductType> serviceTypes) throws Exception {
CRMProcessSubscriptionHook hook = (CRMProcessSubscriptionHook) loadHook();
if(hook!=null)
{
hook.beforeLoadSubscriptionsPerTypeAndService(subscriptionTypes, serviceTypes);
}
HashMap<CRMDOSubscriptionType, HashMap<CRMDOProduct, Integer>> subscriptionsPerTypeAndService = new HashMap<CRMDOSubscriptionType, HashMap<CRMDOProduct, Integer>>();
try
{
ArrayList<Object> parameters = new ArrayList<Object>();
parameters.add(SubscriptionLifeCycleState.EFFECTIVE.toString());
parameters.add(ProductTypeClassification.SERVICES.toString());
String sql =
"\n SELECT SUBSCRIPTIONTYPES.SUBTYPEID AS SUBSCRIPTION_TYPE, PRODUCTS.PRODID AS SERVICE, COUNT(SUBSCRIPTIONS.SUBID) AS TOTAL " +
"\n FROM SUBSCRIPTIONS " +
"\n INNER JOIN SUBSCRIPTIONTYPES ON SUBSCRIPTIONTYPES.SUBTYPEID=SUBSCRIPTIONS.SUBTYPEID " +
"\n INNER JOIN SUBSCRIPTIONSERVICES ON SUBSCRIPTIONSERVICES.SUBID=SUBSCRIPTIONS.SUBID " +
"\n INNER JOIN PRODUCTS ON SUBSCRIPTIONSERVICES.PRODID=PRODUCTS.PRODID " +
"\n INNER JOIN PRODUCTTYPES ON PRODUCTTYPES.PRODTYPEID=PRODUCTS.PRODTYPEID " +
"\n INNER JOIN SUBLIFECYCLESTATEHISTORY ON SUBLIFECYCLESTATEHISTORY.SUBID = SUBSCRIPTIONS.SUBID " +
"\n WHERE SUBSCRIPTIONS.SUBDELETED=0 " +
"\n AND SUBSCRIPTIONSERVICES.SUBSERVICEDELETED=0 " +
"\n AND PRODUCTS.PRODDELETED=0" +
"\n AND SUBLIFECYCLESTATEHISTORY.SUBLIFECYCLESTATEDELETED=0 " +
"\n AND SUBLIFECYCLESTATEHISTORY.LIFECYCLESTATE=? " +
"\n AND PRODUCTTYPES.PRODTYPECLASSIFICATION=? " +
"\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(serviceTypes!=null && serviceTypes.size()>0)
{
String serviceTypesSql = "";
Iterator<CRMDOProductType> serviceTypesIter = serviceTypes.iterator();
while(serviceTypesIter.hasNext())
{
CRMDOProductType serviceType = serviceTypesIter.next();
if(serviceType!=null)
{
parameters.add(serviceType.getId());
if(serviceTypesSql.length()>0)
{
serviceTypesSql += ",";
}
serviceTypesSql += "?";
}
}
sql += " AND PRODUCTTYPES.PRODTYPEID IN (" + serviceTypesSql + ") ";
}
sql += "\n GROUP BY SUBSCRIPTIONTYPES.SUBTYPEID, PRODUCTS.PRODID " +
"\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("SUBSCRIPTION_TYPE")!=null &&
rsu.getString("SERVICE")!=null &&
rsu.getInteger("TOTAL")!=null)
{
//load subscription type
CRMDOSubscriptionType subscriptionType = (CRMDOSubscriptionType)subscriptionTypeBean.load(rsu.getString("SUBSCRIPTION_TYPE"), new ArrayList<String>());
//load service
CRMDOProduct service = (CRMDOProduct)productBean.load(rsu.getString("SERVICE"), new ArrayList<String>());
HashMap<CRMDOProduct, Integer> perService = new HashMap<CRMDOProduct, Integer>();
if(containsKey(subscriptionsPerTypeAndService, subscriptionType))
{
perService = (HashMap<CRMDOProduct, Integer>) get(subscriptionsPerTypeAndService, subscriptionType);
perService.put(service, rsu.getInteger("TOTAL"));
}
else
{
perService.put(service, rsu.getInteger("TOTAL"));
subscriptionsPerTypeAndService.put(subscriptionType, perService);
}
}
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
if(hook!=null)
{
subscriptionsPerTypeAndService = hook.afterLoadSubscriptionsPerTypeAndService(subscriptionsPerTypeAndService);
}
return subscriptionsPerTypeAndService;
} |
|
|
...
Donut Chart
The following example shows show a dashboard component of type DONUT.
Expand |
---|
|
Image Removed Image Added |
Expand |
---|
|
Code Block |
---|
| <?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>DONUT</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></label>
</column>
</columns>
</dashboardcomponent> |
|
...
The following example shows a dashboard component of type PIE.
Expand |
---|
|
Image Removed Image Added |
Expand |
---|
|
Code Block |
---|
| <?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>PIE</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></label>
</column>
</columns>
</dashboardcomponent>
|
|
...
Stacked Bar Chart
The following examples shows show a dashboard component of type STACKED_BAR.
...
Expand |
---|
title | Vertical Stacked Bar Chart |
---|
|
Image Added Expand |
---|
| Image Added Image Added |
|
...
Summary Chart
The following example shows examples show a dashboard component of type SUMMARY.
...