|
|
/* * 图片转换对话框脚本 **/
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]; } } }
|