charts.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. UE.parse.register('charts',function( utils ){
  2. utils.cssRule('chartsContainerHeight','.edui-chart-container { height:'+(this.chartContainerHeight||300)+'px}');
  3. var resourceRoot = this.rootPath,
  4. containers = this.root,
  5. sources = null;
  6. //不存在指定的根路径, 则直接退出
  7. if ( !resourceRoot ) {
  8. return;
  9. }
  10. if ( sources = parseSources() ) {
  11. loadResources();
  12. }
  13. function parseSources () {
  14. if ( !containers ) {
  15. return null;
  16. }
  17. return extractChartData( containers );
  18. }
  19. /**
  20. * 提取数据
  21. */
  22. function extractChartData ( rootNode ) {
  23. var data = [],
  24. tables = rootNode.getElementsByTagName( "table" );
  25. for ( var i = 0, tableNode; tableNode = tables[ i ]; i++ ) {
  26. if ( tableNode.getAttribute( "data-chart" ) !== null ) {
  27. data.push( formatData( tableNode ) );
  28. }
  29. }
  30. return data.length ? data : null;
  31. }
  32. function formatData ( tableNode ) {
  33. var meta = tableNode.getAttribute( "data-chart" ),
  34. metaConfig = {},
  35. data = [];
  36. //提取table数据
  37. for ( var i = 0, row; row = tableNode.rows[ i ]; i++ ) {
  38. var rowData = [];
  39. for ( var j = 0, cell; cell = row.cells[ j ]; j++ ) {
  40. var value = ( cell.innerText || cell.textContent || '' );
  41. rowData.push( cell.tagName == 'TH' ? value:(value | 0) );
  42. }
  43. data.push( rowData );
  44. }
  45. //解析元信息
  46. meta = meta.split( ";" );
  47. for ( var i = 0, metaData; metaData = meta[ i ]; i++ ) {
  48. metaData = metaData.split( ":" );
  49. metaConfig[ metaData[ 0 ] ] = metaData[ 1 ];
  50. }
  51. return {
  52. table: tableNode,
  53. meta: metaConfig,
  54. data: data
  55. };
  56. }
  57. //加载资源
  58. function loadResources () {
  59. loadJQuery();
  60. }
  61. function loadJQuery () {
  62. //不存在jquery, 则加载jquery
  63. if ( !window.jQuery ) {
  64. utils.loadFile(document,{
  65. src : resourceRoot + "/third-party/jquery-1.10.2.min.js",
  66. tag : "script",
  67. type : "text/javascript",
  68. defer : "defer"
  69. },function(){
  70. loadHighcharts();
  71. });
  72. } else {
  73. loadHighcharts();
  74. }
  75. }
  76. function loadHighcharts () {
  77. //不存在Highcharts, 则加载Highcharts
  78. if ( !window.Highcharts ) {
  79. utils.loadFile(document,{
  80. src : resourceRoot + "/third-party/highcharts/highcharts.js",
  81. tag : "script",
  82. type : "text/javascript",
  83. defer : "defer"
  84. },function(){
  85. loadTypeConfig();
  86. });
  87. } else {
  88. loadTypeConfig();
  89. }
  90. }
  91. //加载图表差异化配置文件
  92. function loadTypeConfig () {
  93. utils.loadFile(document,{
  94. src : resourceRoot + "/dialogs/charts/chart.config.js",
  95. tag : "script",
  96. type : "text/javascript",
  97. defer : "defer"
  98. },function(){
  99. render();
  100. });
  101. }
  102. //渲染图表
  103. function render () {
  104. var config = null,
  105. chartConfig = null,
  106. container = null;
  107. for ( var i = 0, len = sources.length; i < len; i++ ) {
  108. config = sources[ i ];
  109. chartConfig = analysisConfig( config );
  110. container = createContainer( config.table );
  111. renderChart( container, typeConfig[ config.meta.chartType ], chartConfig );
  112. }
  113. }
  114. /**
  115. * 渲染图表
  116. * @param container 图表容器节点对象
  117. * @param typeConfig 图表类型配置
  118. * @param config 图表通用配置
  119. * */
  120. function renderChart ( container, typeConfig, config ) {
  121. $( container ).highcharts( $.extend( {}, typeConfig, {
  122. credits: {
  123. enabled: false
  124. },
  125. exporting: {
  126. enabled: false
  127. },
  128. title: {
  129. text: config.title,
  130. x: -20 //center
  131. },
  132. subtitle: {
  133. text: config.subTitle,
  134. x: -20
  135. },
  136. xAxis: {
  137. title: {
  138. text: config.xTitle
  139. },
  140. categories: config.categories
  141. },
  142. yAxis: {
  143. title: {
  144. text: config.yTitle
  145. },
  146. plotLines: [{
  147. value: 0,
  148. width: 1,
  149. color: '#808080'
  150. }]
  151. },
  152. tooltip: {
  153. enabled: true,
  154. valueSuffix: config.suffix
  155. },
  156. legend: {
  157. layout: 'vertical',
  158. align: 'right',
  159. verticalAlign: 'middle',
  160. borderWidth: 1
  161. },
  162. series: config.series
  163. } ));
  164. }
  165. /**
  166. * 创建图表的容器
  167. * 新创建的容器会替换掉对应的table对象
  168. * */
  169. function createContainer ( tableNode ) {
  170. var container = document.createElement( "div" );
  171. container.className = "edui-chart-container";
  172. tableNode.parentNode.replaceChild( container, tableNode );
  173. return container;
  174. }
  175. //根据config解析出正确的类别和图表数据信息
  176. function analysisConfig ( config ) {
  177. var series = [],
  178. //数据类别
  179. categories = [],
  180. result = [],
  181. data = config.data,
  182. meta = config.meta;
  183. //数据对齐方式为相反的方式, 需要反转数据
  184. if ( meta.dataFormat != "1" ) {
  185. for ( var i = 0, len = data.length; i < len ; i++ ) {
  186. for ( var j = 0, jlen = data[ i ].length; j < jlen; j++ ) {
  187. if ( !result[ j ] ) {
  188. result[ j ] = [];
  189. }
  190. result[ j ][ i ] = data[ i ][ j ];
  191. }
  192. }
  193. data = result;
  194. }
  195. result = {};
  196. //普通图表
  197. if ( meta.chartType != typeConfig.length - 1 ) {
  198. categories = data[ 0 ].slice( 1 );
  199. for ( var i = 1, curData; curData = data[ i ]; i++ ) {
  200. series.push( {
  201. name: curData[ 0 ],
  202. data: curData.slice( 1 )
  203. } );
  204. }
  205. result.series = series;
  206. result.categories = categories;
  207. result.title = meta.title;
  208. result.subTitle = meta.subTitle;
  209. result.xTitle = meta.xTitle;
  210. result.yTitle = meta.yTitle;
  211. result.suffix = meta.suffix;
  212. } else {
  213. var curData = [];
  214. for ( var i = 1, len = data[ 0 ].length; i < len; i++ ) {
  215. curData.push( [ data[ 0 ][ i ], data[ 1 ][ i ] | 0 ] );
  216. }
  217. //饼图
  218. series[ 0 ] = {
  219. type: 'pie',
  220. name: meta.tip,
  221. data: curData
  222. };
  223. result.series = series;
  224. result.title = meta.title;
  225. result.suffix = meta.suffix;
  226. }
  227. return result;
  228. }
  229. });