/* * 图片转换对话框脚本 **/ 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 = "
未找到数据
"; 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' ); } $( "#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( ''+ value +'' ); } else { tableHtml[ i ].push( '' ); } tableData[ i ][ j ] = value; } tableHtml[ i ] = tableHtml[ i ].join( "" ); } //draw 表格 $( "#tableContainer" ).html( ''+ tableHtml.join( "" ) +'
' ); } /* * 根据表格已有的图表属性初始化当前图表属性 */ 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 ]; } } }