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 language xml <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.
...
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>
|
Code Block | ||||
---|---|---|---|---|
| ||||
/** * 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; } |
Summary Chart
The following example shows a dashboard component of type SUMMARY.
...