| 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;    }});
 |