/* * 图片转换对话框脚本 **/ 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 < len; i++) { contents.push( '
', ); } $('#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]; } } }