js/spreadsheet/dataTableProcessor.js (162 lines of code) (raw):

/** * @file data table processor * @author sushuang(sushuang@baidu.com) */ define(function (require) { var $ = require('jquery'); var dtLib = require('dt/lib'); var renderers = require('./dataTableCellRenderers'); var helper = require('./helper'); var constant = require('./constant'); /** * @public */ var processor = {}; /** * 此方法只可在jsDataFactory中使用。 * 此方法不做throttle,因为只用于监听ob。 * 约定在ob更新的上游进行throttle(即codeInputsProcessor.fillJSData) * * @public * @param {Object} jsDataOb */ processor.fillFromJSData = function (jsDataOb) { var htIns = jsDataOb.getHTIns(); var editorData = htIns.dtEditorData; var dataWindow = editorData.getDataWindowSize(); var colCount = jsDataOb.getColCount(); var rowCount = jsDataOb.getRowCount(); var jsData = jsDataOb(); var jsDataType = jsDataOb.getType(); editorData.enlarge(colCount, rowCount); // Render var seriesInfo = jsDataOb.getSeriesInfo(jsDataType, colCount); for (var colIndex = 0; colIndex < dataWindow.colCount; colIndex++) { var seriesIndex = Math.floor(colIndex / seriesInfo.colStep); var oneSeriesData = jsData[seriesIndex]; for (var rowIndex = 0; rowIndex < dataWindow.rowCount; rowIndex++) { if (!oneSeriesData || rowIndex >= oneSeriesData.length) { editorData.uncheckSet(rowIndex, colIndex, null); } else { fillBySeriesLine[jsDataType]( rowIndex, seriesIndex, oneSeriesData[rowIndex], seriesInfo, jsDataOb, editorData ); } } } }; /** * 此方法只可在jsDataFactory中使用。 * * @public */ processor.fillJSData = function (jsDataOb) { var htIns = jsDataOb.getHTIns(); var editorData = htIns.dtEditorData; var jsData = []; var dataWindow = editorData.getDataWindowSize(); var jsDataType = jsDataOb.getType(); var seriesInfo = jsDataOb.getSeriesInfo(jsDataType, dataWindow.colCount); // 取数据 for (var seriesIndex = 0; seriesIndex < seriesInfo.count; seriesIndex++) { var oneSeries = []; for (var rowIndex = 0; rowIndex < dataWindow.rowCount; rowIndex++) { var line = getJSDataLine[jsDataType]( rowIndex, seriesIndex, seriesInfo, jsDataOb, editorData ); oneSeries.push(line); } jsData.push(oneSeries); } jsDataOb(jsData, dtLib.valueInfoForConfirmed(constant.UI_DATA_TABLE)); }; /** * @public */ processor.processCell = function (colSettings, jsDataOb, row, col) { var htIns = jsDataOb.getHTIns(); var colCount = htIns.countCols(); var seriesInfo = jsDataOb.getSeriesInfo(jsDataOb.getType(), colCount); if (seriesInfo.colStep > 1) { if (Math.floor(col / seriesInfo.colStep) % 2 === 0) { colSettings.renderer = renderers.high; } else { colSettings.renderer = renderers.normal; } } else { // 两个else分开写是为了逻辑上好读。 colSettings.renderer = renderers.normal; } }; /** * @inner */ var fillBySeriesLine = {}; // jshint ignore:line function arrayFillBySeriesLine(rowIndex, seriesIndex, line, seriesInfo, jsDataOb, editorData) { var seriesIndexBase = seriesIndex * seriesInfo.colStep; if ($.isArray(line)) { for (var colRelatedIndex = 0, lenj = line.length; colRelatedIndex < lenj; colRelatedIndex++) { var finalValue = helper.formatJSDataToEditorData( line[colRelatedIndex], jsDataOb, editorData ); editorData.uncheckSet( rowIndex, colRelatedIndex + seriesIndexBase, finalValue ); } } else { var finalValue = helper.formatJSDataToEditorData( line, jsDataOb, editorData ); editorData.uncheckSet(rowIndex, seriesIndexBase, finalValue); } } fillBySeriesLine[constant.JSDATA_DIM_ARRAY] = arrayFillBySeriesLine; fillBySeriesLine[constant.JSDATA_ARRAY_OBJECT] = function ( rowIndex, seriesIndex, line, seriesInfo, jsDataOb, editorData ) { var seriesIndexBase = seriesIndex * seriesInfo.colStep; var propertyMetas = jsDataOb.getPropertyMetas(); for (var i = 0, len = propertyMetas.length; i < len; i++) { var meta = propertyMetas[i]; var finalValue = helper.formatJSDataToEditorData( line[meta.propertyName], jsDataOb, editorData ); editorData.uncheckSet(rowIndex, seriesIndexBase, finalValue); } }; fillBySeriesLine[constant.JSDATA_GEO] = arrayFillBySeriesLine; /** * @inner */ var getJSDataLine = {}; // jshint ignore:line function arrayGetJSDataLine(rowIndex, seriesIndex, seriesInfo, jsDataOb, editorData) { var seriesIndexBase = seriesIndex * seriesInfo.colStep; var line; var itemDataType = jsDataOb.getItemDataType(); if (seriesInfo.seriesDim === 2) { line = []; for (var colRelatedIndex = 0; colRelatedIndex < seriesInfo.colStep; colRelatedIndex++) { var finalValue = editorData.get( rowIndex, colRelatedIndex + seriesIndexBase, itemDataType ); finalValue = helper.formatEditorDataToJSData( finalValue, jsDataOb, editorData ); line.push(finalValue); } } else { // seriesInfo.seriesDim === 1 line = helper.formatEditorDataToJSData( editorData.get(rowIndex, seriesIndexBase, itemDataType), jsDataOb, editorData ); } return line; } getJSDataLine[constant.JSDATA_DIM_ARRAY] = arrayGetJSDataLine; getJSDataLine[constant.JSDATA_ARRAY_OBJECT] = function ( rowIndex, seriesIndex, seriesInfo, jsDataOb, editorData ) { var seriesIndexBase = seriesIndex * seriesInfo.colStep; var propertyMetas = jsDataOb.getPropertyMetas(); var line = {}; for (var colRelatedIndex = 0, len = propertyMetas.length; colRelatedIndex < len; colRelatedIndex++ ) { var meta = propertyMetas[colRelatedIndex]; var finalValue = editorData.get( rowIndex, colRelatedIndex + seriesIndexBase, meta.itemDataType ); finalValue = helper.formatEditorDataToJSData( finalValue, jsDataOb, editorData ); line[meta.propertyName] = finalValue; } return line; }; getJSDataLine[constant.JSDATA_GEO] = arrayGetJSDataLine; return processor; });