dojo_chart_viewer.xts 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!--
  3. Licensed Materials - Property of IBM
  4. IBM Cognos Products: cogadmin
  5. (C) Copyright IBM Corp. 2005, 2013
  6. US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  7. -->
  8. <!--
  9. Copyright (C) 2008 Cognos ULC, an IBM Company. All rights reserved.
  10. Cognos (R) is a trademark of Cognos ULC, (formerly Cognos Incorporated).
  11. -->
  12. <xts:morphlet version="1.0" xmlns:xts="http://developer.cognos.com/schemas/xts/" messageBase="messages/cogadminuimsgs.xml">
  13. <xts:block id="decode" processor="XSLT" type="exec" mode="interpret" nodelist="env">
  14. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xts="http://developer.cognos.com/schemas/xts/" xmlns:xtsext="xalan://com.cognos.xts.ext.XTSExt" exclude-result-prefixes="xts xtsext">
  15. <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>
  16. <xsl:template match="/">
  17. <xts:sequence>
  18. <xts:replace select="/root/env/param[@name = 'frag-state']">
  19. <param name="state">
  20. <xsl:value-of select="xtsext:base64decode(/root/env/param[@name = 'frag-state'], true())" disable-output-escaping="yes"/>
  21. </param>
  22. </xts:replace>
  23. </xts:sequence>
  24. </xsl:template>
  25. </xsl:stylesheet>
  26. </xts:block>
  27. <xts:block id="response" type="exec" mode="interpret" processor="XSLT" dependency="decode">
  28. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  29. xmlns:xts="http://developer.cognos.com/schemas/xts/" xmlns:xtsext="xalan://com.cognos.xts.ext.XTSExt"
  30. xmlns:xos="http://developer.cognos.com/schemas/xts/output/" exclude-result-prefixes="xts xtsext xos">
  31. <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no" />
  32. <!--
  33. The dojo chart viewer is a fragment using Dojo toolkit to render simple charts(bars or columns), the fragment is expecting a JSON from /root/env/param[@name='source'] as it's feed, the format of JSON is like this:
  34. {
  35. "type": "Bars",
  36. "titles": {
  37. "xTitle": "Monitoring Activities",
  38. "yTitle": "Number of Activities"
  39. },
  40. "rows": [
  41. {
  42. "label": "Pending",
  43. "value": "1"
  44. },
  45. {
  46. "label": "Executing",
  47. "value": "3"
  48. },
  49. {
  50. "label": "Waiting",
  51. "value": "2"
  52. },
  53. {
  54. "label": "Suspended",
  55. "value": "4"
  56. }
  57. ]
  58. }
  59. -->
  60. <xsl:template match="/">
  61. <xsl:variable name="source">
  62. <xsl:choose>
  63. <xsl:when test="/root/env/param[@name='source']">
  64. <xsl:value-of select="xtsext:javascriptencode(string(/root/env/param[@name='source']))"/>
  65. </xsl:when>
  66. <xsl:when test="/root/env/param[@name='state']">
  67. <xsl:value-of select="xtsext:javascriptencode(string(/root/env/param[@name='state']))"/>
  68. </xsl:when>
  69. </xsl:choose>
  70. </xsl:variable>
  71. <xts:sequence>
  72. <xts:append select="/root/output">
  73. <xos:part>
  74. <xos:entityHeader>
  75. <xos:param name="Content-Type">text/xml</xos:param>
  76. </xos:entityHeader>
  77. <xos:entityBody>
  78. <fragment>
  79. <info>
  80. <title>Dojo Chart Viewer</title>
  81. </info>
  82. <meta>
  83. <modes>view</modes>
  84. <publishedEvents>
  85. </publishedEvents>
  86. </meta>
  87. <library type="text/javascript" href="$WEB$/dojo16/dojo/dojo.js"/>
  88. <css type="text/css" media="all" href="$WEB$/dojo16/dijit/themes/tundra/tundra.css"/>
  89. <markup>
  90. <mimeType>text/html</mimeType>
  91. <markupXml>
  92. <script type="text/javascript">
  93. dojo.require("dojox.charting.Chart2D");
  94. dojo.require("dojox.charting.action2d.Highlight");
  95. dojo.require("dojox.charting.action2d.Tooltip");
  96. dojo.require("dojox.charting.themes.BlueDusk");
  97. dojo.require("dojox.secure.capability");
  98. dojo.addOnLoad(function(){
  99. var DEFAULT_WIDTH = 750, //for the sake of resolution 1024x768
  100. HEIGHT_PER_ROW = 30,
  101. X_AXIS_HEIGHT = 40,
  102. TITLE_HEIGHT = 15,
  103. NUMBER_OF_TICKS = 3,
  104. MIN_X = 15;
  105. var source = '<xsl:value-of select="$source"/>';
  106. //pass in the text of a script. If it passes and it can be eval'ed, it should be safe.
  107. // remove 2 known unicode characters that fail in validate() - but only for the validate call
  108. safeSource = source.replace(/\uff3f|\uff5c/g, '');
  109. dojox.secure.capability.validate(safeSource,[],{});
  110. var data = dojo.fromJson(source);
  111. var rows = data.rows;
  112. var chart = new dojox.charting.Chart2D("chart_THIS_",{fill:"transparent"});
  113. //inject the tundra css into body class, before we have an elegant solution
  114. var body = document.getElementsByTagName("body")[0];
  115. var currClass = dojo.attr( body, "class" ) || "";
  116. if (currClass.indexOf ("tundra") == -1){
  117. dojo.attr( body, "class", currClass + " tundra" );
  118. }
  119. //prepare the data needed by chart object
  120. var preChart = {
  121. maxValue : MIN_X,
  122. totalValue : 0,
  123. labels : [{text:"",value:0}],
  124. series : []
  125. };
  126. var funcs = [];
  127. _addTraverseRowsFunc = function (func) {
  128. if (dojo.isFunction(func)){
  129. funcs.push (func);
  130. }
  131. };
  132. //maxValue
  133. _addTraverseRowsFunc(function(row){
  134. var absValue = Math.abs(row.value);
  135. if (absValue &gt; preChart.maxValue){
  136. preChart.maxValue = absValue;
  137. }
  138. });
  139. getMaxLabel= function(min,max) {
  140. var MOD = 15;
  141. if (max &lt;= min) return min;
  142. var delta = max % MOD;
  143. if (delta == 0) {
  144. return max;
  145. } else {
  146. return max + MOD - delta;
  147. }
  148. };
  149. //totalValue
  150. _addTraverseRowsFunc(function(row){
  151. preChart.totalValue += Math.abs(row.value);
  152. });
  153. //labels
  154. _addTraverseRowsFunc(function(row,index){
  155. preChart.labels.push({text:row.label,value:index+1});
  156. });
  157. //series
  158. _addTraverseRowsFunc(function(row){
  159. preChart.series.push(parseInt(row.value));
  160. });
  161. //walk the rows and apply the functions registered.
  162. dojo.forEach(funcs,function(item){
  163. dojo.forEach(rows,item);
  164. });
  165. //adjust the fragment container to a proper height
  166. var height = rows.length * HEIGHT_PER_ROW + X_AXIS_HEIGHT;
  167. dojo.byId("_THIS_content").style.height = height + TITLE_HEIGHT;
  168. dojo.byId("title_THIS_").innerHTML = '<xts:string id="IDS_BARCHART_TOTAL" encode="javascript"/>: ' + preChart.totalValue;
  169. dojo.byId("title_THIS_").style.width = DEFAULT_WIDTH;
  170. dojo.byId("chart_THIS_").style.whiteSpace = 'nowrap';
  171. var maxLabel = getMaxLabel(MIN_X,preChart.maxValue);
  172. chart.addAxis("x", {
  173. fixLower: "major",
  174. fixUpper: "major",
  175. minorTicks: false,
  176. microTicks: false,
  177. majorTickStep : maxLabel/NUMBER_OF_TICKS,
  178. max: maxLabel,
  179. min: 0,
  180. font: "normal normal normal 8pt tahoma"
  181. }).addAxis("y", {
  182. vertical: true,
  183. fixLower: "none",
  184. fixUpper: "none",
  185. minorTicks: false,
  186. microTicks: false,
  187. labels: preChart.labels,
  188. font: "normal normal normal 8pt tahoma"
  189. }).addPlot("default", {
  190. type: data.type,
  191. gap: 3
  192. }).addPlot("grid", {
  193. type: "Grid",
  194. hMinorLines: false,
  195. hMajorLines: false,
  196. vMinorLines: false,
  197. vMajorLines: true
  198. }).setTheme(dojox.charting.themes.BlueDusk);
  199. chart.addSeries("Series 1",preChart.series);
  200. var highlight = new dojox.charting.action2d.Highlight(chart, "default");
  201. var tooltip = new dojox.charting.action2d.Tooltip(chart, "default");
  202. chart.resize(DEFAULT_WIDTH,height);
  203. });
  204. </script>
  205. <div id="title_THIS_" style="text-align:center; width:700px; font-weight:bold;"/>
  206. <div id="chart_THIS_"/>
  207. </markupXml>
  208. </markup>
  209. <state>
  210. <xsl:value-of select="xtsext:base64encode($source, true())"/>
  211. </state>
  212. </fragment>
  213. </xos:entityBody>
  214. </xos:part>
  215. </xts:append>
  216. </xts:sequence>
  217. </xsl:template>
  218. </xsl:stylesheet>
  219. </xts:block>
  220. </xts:morphlet>