Table of Contents
...
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.
...
The following example shows a dashboard component of type PIE.
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; } |
...