519 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			519 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| /*
 | ||
|  * 图片转换对话框脚本
 | ||
|  **/
 | ||
| 
 | ||
| var tableData = [],
 | ||
|     //编辑器页面table
 | ||
|     editorTable = null,
 | ||
|     chartsConfig = window.typeConfig,
 | ||
|     resizeTimer = null,
 | ||
|     //初始默认图表类型
 | ||
|     currentChartType = 0;
 | ||
| 
 | ||
| window.onload = function () {
 | ||
| 
 | ||
|     editorTable = domUtils.findParentByTagName( editor.selection.getRange().startContainer, 'table', true);
 | ||
| 
 | ||
|     //未找到表格, 显示错误页面
 | ||
|     if ( !editorTable ) {
 | ||
|         document.body.innerHTML = "<div class='edui-charts-not-data'>未找到数据</div>";
 | ||
|         return;
 | ||
|     }
 | ||
| 
 | ||
|     //初始化图表类型选择
 | ||
|     initChartsTypeView();
 | ||
|     renderTable( editorTable );
 | ||
|     initEvent();
 | ||
|     initUserConfig( editorTable.getAttribute( "data-chart" ) );
 | ||
|     $( "#scrollBed .view-box:eq("+ currentChartType +")" ).trigger( "click" );
 | ||
|     updateViewType( currentChartType );
 | ||
| 
 | ||
|     dialog.addListener( "resize", function () {
 | ||
| 
 | ||
|         if ( resizeTimer != null ) {
 | ||
|             window.clearTimeout( resizeTimer );
 | ||
|         }
 | ||
| 
 | ||
|         resizeTimer = window.setTimeout( function () {
 | ||
| 
 | ||
|             resizeTimer = null;
 | ||
| 
 | ||
|             renderCharts();
 | ||
| 
 | ||
|         }, 500 );
 | ||
| 
 | ||
|     } );
 | ||
| 
 | ||
| };
 | ||
| 
 | ||
| function initChartsTypeView () {
 | ||
| 
 | ||
|     var contents = [];
 | ||
| 
 | ||
|     for ( var i = 0, len = chartsConfig.length; i<len; i++ ) {
 | ||
| 
 | ||
|         contents.push( '<div class="view-box" data-chart-type="'+ i +'"><img width="300" src="images/charts'+ i +'.png"></div>' );
 | ||
| 
 | ||
|     }
 | ||
| 
 | ||
|     $( "#scrollBed" ).html( contents.join( "" ) );
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| //渲染table, 以便用户修改数据
 | ||
| function renderTable ( table ) {
 | ||
| 
 | ||
|     var tableHtml = [];
 | ||
| 
 | ||
|     //构造数据
 | ||
|     for ( var i = 0, row; row = table.rows[ i ]; i++ ) {
 | ||
| 
 | ||
|         tableData[ i ] = [];
 | ||
|         tableHtml[ i ] = [];
 | ||
| 
 | ||
|         for ( var j = 0, cell; cell = row.cells[ j ]; j++ ) {
 | ||
| 
 | ||
|             var value = getCellValue( cell );
 | ||
| 
 | ||
|             if ( i > 0 && j > 0 ) {
 | ||
|                 value = +value;
 | ||
|             }
 | ||
| 
 | ||
|             if ( i === 0 || j === 0 ) {
 | ||
|                 tableHtml[ i ].push( '<th>'+ value +'</th>' );
 | ||
|             } else {
 | ||
|                 tableHtml[ i ].push( '<td><input type="text" class="data-item" value="'+ value +'"></td>' );
 | ||
|             }
 | ||
| 
 | ||
|             tableData[ i ][ j ] = value;
 | ||
| 
 | ||
|         }
 | ||
| 
 | ||
|         tableHtml[ i ] = tableHtml[ i ].join( "" );
 | ||
| 
 | ||
|     }
 | ||
| 
 | ||
|     //draw 表格
 | ||
|     $( "#tableContainer" ).html( '<table id="showTable" border="1"><tbody><tr>'+ tableHtml.join( "</tr><tr>" ) +'</tr></tbody></table>' );
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| /*
 | ||
|  * 根据表格已有的图表属性初始化当前图表属性
 | ||
|  */
 | ||
| function initUserConfig ( config ) {
 | ||
| 
 | ||
|     var parsedConfig = {};
 | ||
| 
 | ||
|     if ( !config ) {
 | ||
|         return;
 | ||
|     }
 | ||
| 
 | ||
|     config = config.split( ";" );
 | ||
| 
 | ||
|     $.each( config, function ( index, item ) {
 | ||
| 
 | ||
|         item = item.split( ":" );
 | ||
|         parsedConfig[ item[ 0 ] ] = item[ 1 ];
 | ||
| 
 | ||
|     } );
 | ||
| 
 | ||
|     setUserConfig( parsedConfig );
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| function initEvent () {
 | ||
| 
 | ||
|     var cacheValue = null,
 | ||
|         //图表类型数
 | ||
|         typeViewCount = chartsConfig.length- 1,
 | ||
|         $chartsTypeViewBox = $( '#scrollBed .view-box' );
 | ||
| 
 | ||
|     $( ".charts-format" ).delegate( ".format-ctrl", "change", function () {
 | ||
| 
 | ||
|         renderCharts();
 | ||
| 
 | ||
|     } )
 | ||
| 
 | ||
|     $( ".table-view" ).delegate( ".data-item", "focus", function () {
 | ||
| 
 | ||
|         cacheValue = this.value;
 | ||
| 
 | ||
|     } ).delegate( ".data-item", "blur", function () {
 | ||
| 
 | ||
|         if ( this.value !== cacheValue ) {
 | ||
|             renderCharts();
 | ||
|         }
 | ||
| 
 | ||
|         cacheValue = null;
 | ||
| 
 | ||
|     } );
 | ||
| 
 | ||
|     $( "#buttonContainer" ).delegate( "a", "click", function (e) {
 | ||
| 
 | ||
|         e.preventDefault();
 | ||
| 
 | ||
|         if ( this.getAttribute( "data-title" ) === 'prev' ) {
 | ||
| 
 | ||
|             if ( currentChartType > 0 ) {
 | ||
|                 currentChartType--;
 | ||
|                 updateViewType( currentChartType );
 | ||
|             }
 | ||
| 
 | ||
|         } else {
 | ||
| 
 | ||
|             if ( currentChartType < typeViewCount ) {
 | ||
|                 currentChartType++;
 | ||
|                 updateViewType( currentChartType );
 | ||
|             }
 | ||
| 
 | ||
|         }
 | ||
| 
 | ||
|     } );
 | ||
| 
 | ||
|     //图表类型变化
 | ||
|     $( '#scrollBed' ).delegate( ".view-box", "click", function (e) {
 | ||
| 
 | ||
|         var index = $( this ).attr( "data-chart-type" );
 | ||
|         $chartsTypeViewBox.removeClass( "selected" );
 | ||
|         $( $chartsTypeViewBox[ index ] ).addClass( "selected" );
 | ||
| 
 | ||
|         currentChartType = index | 0;
 | ||
| 
 | ||
|         //饼图, 禁用部分配置
 | ||
|         if ( currentChartType === chartsConfig.length - 1 ) {
 | ||
| 
 | ||
|             disableNotPieConfig();
 | ||
| 
 | ||
|         //启用完整配置
 | ||
|         } else {
 | ||
| 
 | ||
|             enableNotPieConfig();
 | ||
| 
 | ||
|         }
 | ||
| 
 | ||
|         renderCharts();
 | ||
| 
 | ||
|     } );
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| function renderCharts () {
 | ||
| 
 | ||
|     var data = collectData();
 | ||
| 
 | ||
|     $('#chartsContainer').highcharts( $.extend( {}, chartsConfig[ currentChartType ], {
 | ||
| 
 | ||
|         credits: {
 | ||
|             enabled: false
 | ||
|         },
 | ||
|         exporting: {
 | ||
|             enabled: false
 | ||
|         },
 | ||
|         title: {
 | ||
|             text: data.title,
 | ||
|             x: -20 //center
 | ||
|         },
 | ||
|         subtitle: {
 | ||
|             text: data.subTitle,
 | ||
|             x: -20
 | ||
|         },
 | ||
|         xAxis: {
 | ||
|             title: {
 | ||
|                 text: data.xTitle
 | ||
|             },
 | ||
|             categories: data.categories
 | ||
|         },
 | ||
|         yAxis: {
 | ||
|             title: {
 | ||
|                 text: data.yTitle
 | ||
|             },
 | ||
|             plotLines: [{
 | ||
|                 value: 0,
 | ||
|                 width: 1,
 | ||
|                 color: '#808080'
 | ||
|             }]
 | ||
|         },
 | ||
|         tooltip: {
 | ||
|             enabled: true,
 | ||
|             valueSuffix: data.suffix
 | ||
|         },
 | ||
|         legend: {
 | ||
|             layout: 'vertical',
 | ||
|             align: 'right',
 | ||
|             verticalAlign: 'middle',
 | ||
|             borderWidth: 1
 | ||
|         },
 | ||
|         series: data.series
 | ||
| 
 | ||
|     } ));
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| function updateViewType ( index ) {
 | ||
| 
 | ||
|     $( "#scrollBed" ).css( 'marginLeft', -index*324+'px' );
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| function collectData () {
 | ||
| 
 | ||
|     var form = document.forms[ 'data-form' ],
 | ||
|         data = null;
 | ||
| 
 | ||
|     if ( currentChartType !== chartsConfig.length - 1 ) {
 | ||
| 
 | ||
|         data = getSeriesAndCategories();
 | ||
|         $.extend( data, getUserConfig() );
 | ||
| 
 | ||
|     //饼图数据格式
 | ||
|     } else {
 | ||
|         data = getSeriesForPieChart();
 | ||
|         data.title = form[ 'title' ].value;
 | ||
|         data.suffix = form[ 'unit' ].value;
 | ||
|     }
 | ||
| 
 | ||
|     return data;
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| /**
 | ||
|  * 获取用户配置信息
 | ||
|  */
 | ||
| function getUserConfig () {
 | ||
| 
 | ||
|     var form = document.forms[ 'data-form' ],
 | ||
|         info = {
 | ||
|             title: form[ 'title' ].value,
 | ||
|             subTitle: form[ 'sub-title' ].value,
 | ||
|             xTitle: form[ 'x-title' ].value,
 | ||
|             yTitle: form[ 'y-title' ].value,
 | ||
|             suffix: form[ 'unit' ].value,
 | ||
|             //数据对齐方式
 | ||
|             tableDataFormat: getTableDataFormat (),
 | ||
|             //饼图提示文字
 | ||
|             tip: $( "#tipInput" ).val()
 | ||
|         };
 | ||
| 
 | ||
|     return info;
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| function setUserConfig ( config ) {
 | ||
| 
 | ||
|     var form = document.forms[ 'data-form' ];
 | ||
| 
 | ||
|     config.title && ( form[ 'title' ].value = config.title );
 | ||
|     config.subTitle && ( form[ 'sub-title' ].value = config.subTitle );
 | ||
|     config.xTitle && ( form[ 'x-title' ].value = config.xTitle );
 | ||
|     config.yTitle && ( form[ 'y-title' ].value = config.yTitle );
 | ||
|     config.suffix && ( form[ 'unit' ].value = config.suffix );
 | ||
|     config.dataFormat == "-1" && ( form[ 'charts-format' ][ 1 ].checked = true );
 | ||
|     config.tip && ( form[ 'tip' ].value = config.tip );
 | ||
|     currentChartType = config.chartType || 0;
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| function getSeriesAndCategories () {
 | ||
| 
 | ||
|     var form = document.forms[ 'data-form' ],
 | ||
|         series = [],
 | ||
|         categories = [],
 | ||
|         tmp = [],
 | ||
|         tableData = getTableData();
 | ||
| 
 | ||
|     //反转数据
 | ||
|     if ( getTableDataFormat() === "-1" ) {
 | ||
| 
 | ||
|         for ( var i = 0, len = tableData.length; i < len; i++ ) {
 | ||
| 
 | ||
|             for ( var j = 0, jlen = tableData[ i ].length; j < jlen; j++ ) {
 | ||
| 
 | ||
|                 if ( !tmp[ j ] ) {
 | ||
|                     tmp[ j ] = [];
 | ||
|                 }
 | ||
| 
 | ||
|                 tmp[ j ][ i ] = tableData[ i ][ j ];
 | ||
| 
 | ||
|             }
 | ||
| 
 | ||
|         }
 | ||
| 
 | ||
|         tableData = tmp;
 | ||
| 
 | ||
|     }
 | ||
| 
 | ||
|     categories = tableData[0].slice( 1 );
 | ||
| 
 | ||
|     for ( var i = 1, data; data = tableData[ i ]; i++ ) {
 | ||
| 
 | ||
|         series.push( {
 | ||
|             name: data[ 0 ],
 | ||
|             data: data.slice( 1 )
 | ||
|         } );
 | ||
| 
 | ||
|     }
 | ||
| 
 | ||
|     return {
 | ||
|         series: series,
 | ||
|         categories: categories
 | ||
|     };
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| /*
 | ||
|  * 获取数据源数据对齐方式
 | ||
|  */
 | ||
| function getTableDataFormat () {
 | ||
| 
 | ||
|     var form = document.forms[ 'data-form' ],
 | ||
|         items = form['charts-format'];
 | ||
| 
 | ||
|     return items[ 0 ].checked ? items[ 0 ].value : items[ 1 ].value;
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| /*
 | ||
|  * 禁用非饼图类型的配置项
 | ||
|  */
 | ||
| function disableNotPieConfig() {
 | ||
| 
 | ||
|     updateConfigItem( 'disable' );
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| /*
 | ||
|  * 启用非饼图类型的配置项
 | ||
|  */
 | ||
| function enableNotPieConfig() {
 | ||
| 
 | ||
|     updateConfigItem( 'enable' );
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| function updateConfigItem ( value ) {
 | ||
| 
 | ||
|     var table = $( "#showTable" )[ 0 ],
 | ||
|         isDisable = value === 'disable' ? true : false;
 | ||
| 
 | ||
|     //table中的input处理
 | ||
|     for ( var i = 2 , row; row = table.rows[ i ]; i++ ) {
 | ||
| 
 | ||
|         for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) {
 | ||
| 
 | ||
|             $( "input", cell ).attr( "disabled", isDisable );
 | ||
| 
 | ||
|         }
 | ||
| 
 | ||
|     }
 | ||
| 
 | ||
|     //其他项处理
 | ||
|     $( "input.not-pie-item" ).attr( "disabled", isDisable );
 | ||
|     $( "#tipInput" ).attr( "disabled", !isDisable )
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| /*
 | ||
|  * 获取饼图数据
 | ||
|  * 饼图的数据只取第一行的
 | ||
|  **/
 | ||
| function getSeriesForPieChart () {
 | ||
| 
 | ||
|     var series = {
 | ||
|             type: 'pie',
 | ||
|             name: $("#tipInput").val(),
 | ||
|             data: []
 | ||
|         },
 | ||
|         tableData = getTableData();
 | ||
| 
 | ||
| 
 | ||
|     for ( var j = 1, jlen = tableData[ 0 ].length; j < jlen; j++ ) {
 | ||
| 
 | ||
|         var title = tableData[ 0 ][ j ],
 | ||
|             val = tableData[ 1 ][ j ];
 | ||
| 
 | ||
|         series.data.push( [ title, val ] );
 | ||
| 
 | ||
|     }
 | ||
| 
 | ||
|     return {
 | ||
|         series: [ series ]
 | ||
|     };
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| function getTableData () {
 | ||
| 
 | ||
|     var table = document.getElementById( "showTable" ),
 | ||
|         xCount = table.rows[0].cells.length - 1,
 | ||
|         values = getTableInputValue();
 | ||
| 
 | ||
|     for ( var i = 0, value; value = values[ i ]; i++ ) {
 | ||
| 
 | ||
|         tableData[ Math.floor( i / xCount ) + 1 ][ i % xCount + 1 ] = values[ i ];
 | ||
| 
 | ||
|     }
 | ||
| 
 | ||
|     return tableData;
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| function getTableInputValue () {
 | ||
| 
 | ||
|     var table = document.getElementById( "showTable" ),
 | ||
|         inputs = table.getElementsByTagName( "input" ),
 | ||
|         values = [];
 | ||
| 
 | ||
|     for ( var i = 0, input; input = inputs[ i ]; i++ ) {
 | ||
|         values.push( input.value | 0 );
 | ||
|     }
 | ||
| 
 | ||
|     return values;
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| function getCellValue ( cell ) {
 | ||
| 
 | ||
|     var value = utils.trim( ( cell.innerText || cell.textContent || '' ) );
 | ||
| 
 | ||
|     return value.replace( new RegExp( UE.dom.domUtils.fillChar, 'g' ), '' ).replace( /^\s+|\s+$/g, '' );
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| //dialog确认事件
 | ||
| dialog.onok = function () {
 | ||
| 
 | ||
|     //收集信息
 | ||
|     var form = document.forms[ 'data-form' ],
 | ||
|         info = getUserConfig();
 | ||
| 
 | ||
|     //添加图表类型
 | ||
|     info.chartType = currentChartType;
 | ||
| 
 | ||
|     //同步表格数据到编辑器
 | ||
|     syncTableData();
 | ||
| 
 | ||
|     //执行图表命令
 | ||
|     editor.execCommand( 'charts', info );
 | ||
| 
 | ||
| };
 | ||
| 
 | ||
| /*
 | ||
|  * 同步图表编辑视图的表格数据到编辑器里的原始表格
 | ||
|  */
 | ||
| function syncTableData () {
 | ||
| 
 | ||
|     var tableData = getTableData();
 | ||
| 
 | ||
|     for ( var i = 1, row; row = editorTable.rows[ i ]; i++ ) {
 | ||
| 
 | ||
|         for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) {
 | ||
| 
 | ||
|             cell.innerHTML = tableData[ i ] [ j ];
 | ||
| 
 | ||
|         }
 | ||
| 
 | ||
|     }
 | ||
| 
 | ||
| } |