123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337 |
- UE.parse.register('charts',function( utils ){
- utils.cssRule('chartsContainerHeight','.edui-chart-container { height:'+(this.chartContainerHeight||300)+'px}');
- var resourceRoot = this.rootPath,
- containers = this.root,
- sources = null;
- //不存在指定的根路径, 则直接退出
- if ( !resourceRoot ) {
- return;
- }
- if ( sources = parseSources() ) {
- loadResources();
- }
- function parseSources () {
- if ( !containers ) {
- return null;
- }
- return extractChartData( containers );
- }
- /**
- * 提取数据
- */
- function extractChartData ( rootNode ) {
- var data = [],
- tables = rootNode.getElementsByTagName( "table" );
- for ( var i = 0, tableNode; tableNode = tables[ i ]; i++ ) {
- if ( tableNode.getAttribute( "data-chart" ) !== null ) {
- data.push( formatData( tableNode ) );
- }
- }
- return data.length ? data : null;
- }
- function formatData ( tableNode ) {
- var meta = tableNode.getAttribute( "data-chart" ),
- metaConfig = {},
- data = [];
- //提取table数据
- for ( var i = 0, row; row = tableNode.rows[ i ]; i++ ) {
- var rowData = [];
- for ( var j = 0, cell; cell = row.cells[ j ]; j++ ) {
- var value = ( cell.innerText || cell.textContent || '' );
- rowData.push( cell.tagName == 'TH' ? value:(value | 0) );
- }
- data.push( rowData );
- }
- //解析元信息
- meta = meta.split( ";" );
- for ( var i = 0, metaData; metaData = meta[ i ]; i++ ) {
- metaData = metaData.split( ":" );
- metaConfig[ metaData[ 0 ] ] = metaData[ 1 ];
- }
- return {
- table: tableNode,
- meta: metaConfig,
- data: data
- };
- }
- //加载资源
- function loadResources () {
- loadJQuery();
- }
- function loadJQuery () {
- //不存在jquery, 则加载jquery
- if ( !window.jQuery ) {
- utils.loadFile(document,{
- src : resourceRoot + "/third-party/jquery-1.10.2.min.js",
- tag : "script",
- type : "text/javascript",
- defer : "defer"
- },function(){
- loadHighcharts();
- });
- } else {
- loadHighcharts();
- }
- }
- function loadHighcharts () {
- //不存在Highcharts, 则加载Highcharts
- if ( !window.Highcharts ) {
- utils.loadFile(document,{
- src : resourceRoot + "/third-party/highcharts/highcharts.js",
- tag : "script",
- type : "text/javascript",
- defer : "defer"
- },function(){
- loadTypeConfig();
- });
- } else {
- loadTypeConfig();
- }
- }
- //加载图表差异化配置文件
- function loadTypeConfig () {
- utils.loadFile(document,{
- src : resourceRoot + "/dialogs/charts/chart.config.js",
- tag : "script",
- type : "text/javascript",
- defer : "defer"
- },function(){
- render();
- });
- }
- //渲染图表
- function render () {
- var config = null,
- chartConfig = null,
- container = null;
- for ( var i = 0, len = sources.length; i < len; i++ ) {
- config = sources[ i ];
- chartConfig = analysisConfig( config );
- container = createContainer( config.table );
- renderChart( container, typeConfig[ config.meta.chartType ], chartConfig );
- }
- }
- /**
- * 渲染图表
- * @param container 图表容器节点对象
- * @param typeConfig 图表类型配置
- * @param config 图表通用配置
- * */
- function renderChart ( container, typeConfig, config ) {
- $( container ).highcharts( $.extend( {}, typeConfig, {
- credits: {
- enabled: false
- },
- exporting: {
- enabled: false
- },
- title: {
- text: config.title,
- x: -20 //center
- },
- subtitle: {
- text: config.subTitle,
- x: -20
- },
- xAxis: {
- title: {
- text: config.xTitle
- },
- categories: config.categories
- },
- yAxis: {
- title: {
- text: config.yTitle
- },
- plotLines: [{
- value: 0,
- width: 1,
- color: '#808080'
- }]
- },
- tooltip: {
- enabled: true,
- valueSuffix: config.suffix
- },
- legend: {
- layout: 'vertical',
- align: 'right',
- verticalAlign: 'middle',
- borderWidth: 1
- },
- series: config.series
- } ));
- }
- /**
- * 创建图表的容器
- * 新创建的容器会替换掉对应的table对象
- * */
- function createContainer ( tableNode ) {
- var container = document.createElement( "div" );
- container.className = "edui-chart-container";
- tableNode.parentNode.replaceChild( container, tableNode );
- return container;
- }
- //根据config解析出正确的类别和图表数据信息
- function analysisConfig ( config ) {
- var series = [],
- //数据类别
- categories = [],
- result = [],
- data = config.data,
- meta = config.meta;
- //数据对齐方式为相反的方式, 需要反转数据
- if ( meta.dataFormat != "1" ) {
- for ( var i = 0, len = data.length; i < len ; i++ ) {
- for ( var j = 0, jlen = data[ i ].length; j < jlen; j++ ) {
- if ( !result[ j ] ) {
- result[ j ] = [];
- }
- result[ j ][ i ] = data[ i ][ j ];
- }
- }
- data = result;
- }
- result = {};
- //普通图表
- if ( meta.chartType != typeConfig.length - 1 ) {
- categories = data[ 0 ].slice( 1 );
- for ( var i = 1, curData; curData = data[ i ]; i++ ) {
- series.push( {
- name: curData[ 0 ],
- data: curData.slice( 1 )
- } );
- }
- result.series = series;
- result.categories = categories;
- result.title = meta.title;
- result.subTitle = meta.subTitle;
- result.xTitle = meta.xTitle;
- result.yTitle = meta.yTitle;
- result.suffix = meta.suffix;
- } else {
- var curData = [];
- for ( var i = 1, len = data[ 0 ].length; i < len; i++ ) {
- curData.push( [ data[ 0 ][ i ], data[ 1 ][ i ] | 0 ] );
- }
- //饼图
- series[ 0 ] = {
- type: 'pie',
- name: meta.tip,
- data: curData
- };
- result.series = series;
- result.title = meta.title;
- result.suffix = meta.suffix;
- }
- return result;
- }
- });
|