Following the now familiar pattern is a page with associated controller that pulls in the cross domain Dojo build, manages the data and delegates the chart production to a custom component:
<apex:page controller="DojoLineChartController"> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/dojo/1.5/dojo/dojo.xd.js" djConfig="parseOnLoad: true, modulePaths: { 'dojo': 'https://ajax.googleapis.com/ajax/libs/dojo/1.5/dojo', 'dijit': 'https://ajax.googleapis.com/ajax/libs/dojo/1.5/dijit', 'dojox': 'https://ajax.googleapis.com/ajax/libs/dojo/1.5/dojox' } "> </script> <apex:form > <table> <tr> <td>Labels:</td> <td> <apex:inputText value="{!labels}" size="80"/> </td> </tr> <tr> <td>Series 1:</td> <td> <apex:inputText value="{!series1}"/> </td> </tr> <tr> <td>Series 2:</td> <td> <apex:inputText value="{!series2}"/> </td> </tr> </table> <apex:commandButton value="Update"/> </apex:form> <c:DojoLineChart id="linechart" miny="0" maxy="12" stepy="3" labelsx="{!xAxisLabels}" title1="Essex" series1="{!series1}" color1="#000" title2="Norfolk" series2="{!series2}" color2="#C00" /> </apex:page>
The controller manages three String properties:
- A comma separated list of labels, used to produce the x axis labels
- A comma separated list of values for the first series to plot
- A comma separated list of values for the second series to plot
<apex:component > <apex:attribute name="miny" description="Minimum Y Axis value" type="Integer"/> <apex:attribute name="maxy" description="Maximum Y Axis value" type="Integer"/> <apex:attribute name="stepy" description="Maximum Y Axis value" type="Integer"/> <apex:attribute name="labelsx" description="X Axis Labels" type="String" /> <apex:attribute name="title1" description="Plot series 1 title - displayed in legend" type="String" /> <apex:attribute name="series1" description="Plot series 1, comma separated values" type="String" /> <apex:attribute name="color1" description="Plot series 1 colour" type="String" /> <apex:attribute name="title2" description="Plot series 2 title - displayed in legend" type="String" /> <apex:attribute name="series2" description="Plot series 2, comma separated values" type="String" /> <apex:attribute name="color2" description="Plot series 2 colour" type="String" /> <apex:attribute name="title3" description="Plot series 3 title - displayed in legend" type="String" /> <apex:attribute name="series3" description="Plot series 3, comma separated values" type="String" /> <apex:attribute name="color3" description="Plot series 3colour" type="String" /> <apex:attribute name="height" description="Chart Height" type="Integer" default="300"/> <apex:attribute name="width" description="Chart Width" type="Integer" default="800"/> <apex:attribute name="showLegend" description="Show Legend" type="Boolean" default="true"/> <script type="text/javascript"> dojo.require("dojox.charting.Chart2D"); dojo.require("dojox.charting.widget.Legend"); makeCharts = function(){ var chart1 = new dojox.charting.Chart2D("simplechart", {fill:"transparent"}); chart1.addPlot("default", {type: "Lines", markers: "true", hAxis: "x", vAxis: "y"}); chart1.addAxis("x", { <apex:outputText rendered="{!NOT(ISBLANK(labelsx))}"> labels: [ {!labelsx} ] </apex:outputText> }); chart1.addAxis("y", { <apex:outputText value="min:{!miny}," rendered="{!NOT(ISBLANK(miny))}"/> <apex:outputText value="max:{!maxy}," rendered="{!NOT(ISBLANK(maxy))}"/> <apex:outputText value="majorTickStep:{!stepy}," rendered="{!NOT(ISBLANK(stepy))}"/> vertical: true, natural: false}); <apex:outputPanel layout="none" rendered="{!NOT(ISBLANK(title1))}"> chart1.addSeries("{!title1}", [{!series1}], {plot: "other", stroke: {color:"{!color1}"}}); </apex:outputPanel> <apex:outputPanel layout="none" rendered="{!NOT(ISBLANK(title2))}"> chart1.addSeries("{!title2}", [{!series2}], {plot: "other", stroke: {color:"{!color2}"}}); </apex:outputPanel> <apex:outputPanel layout="none" rendered="{!NOT(ISBLANK(title3))}"> chart1.addSeries("{!title3}", [{!series3}], {plot: "other", stroke: {color:"{!color3}"}}); </apex:outputPanel> chart1.render(); <apex:outputText rendered="{!showLegend}"> var legend1 = new dojox.charting.widget.Legend({chart: chart1, horizontal: false}, "legend1"); </apex:outputText> }; dojo.addOnLoad(makeCharts); </script> <table> <tr> <td> <div id="simplechart" style="width: 800px; height: 300px;"></div> </td> <td style="vertical-align:middle"> <div id="legend1"></div> </td> </tr> </table> </apex:component>The chart is created with a plot and x and y axes. The component can take up to 3 series - these are conditionally added to to chart via apex:outputPanel components, along with the line colour. The component can also display a legend for the chart - if the showLegend attribute is set to true. When first opened, the page appears as:
Updating the values in the chart and clicking the Update button causes the graph to be redrawn with the new values:
This example, like the others in this series, is available in the Google Code project
No comments:
Post a Comment