You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
519 lines
11 KiB
519 lines
11 KiB
/* |
|
* 图片转换对话框脚本 |
|
**/ |
|
|
|
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 ]; |
|
|
|
} |
|
|
|
} |
|
|
|
} |