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.
443 lines
9.7 KiB
443 lines
9.7 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];
|
|
}
|
|
}
|
|
}
|
|
|