blob: 7420bede8117524b698f60b151f39e240abb28ce [file] [log] [blame]
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import Transformation from './transformation';
import {
getCurrentChart, getCurrentChartAxis, getCurrentChartParam,
serializeSharedAxes, useSharedAxis,
getCurrentChartAxisSpecs, getCurrentChartParamSpecs,
initializeConfig, resetAxisConfig, resetParameterConfig,
isAggregatorAxis, isGroupAxis, isKeyAxis, isSingleDimensionAxis,
removeDuplicatedColumnsInMultiDimensionAxis, applyMaxAxisCount,
isInputWidget, isOptionWidget, isCheckboxWidget, isTextareaWidget, parseParameter,
getTransformer,
} from './advanced-transformation-util';
const SETTING_TEMPLATE = 'app/tabledata/advanced-transformation-setting.html';
export default class AdvancedTransformation extends Transformation {
constructor(config, spec) {
super(config);
this.columns = []; /** [{ name, index, comment }] */
this.props = {};
this.spec = spec;
initializeConfig(config, spec);
}
emitConfigChange(conf) {
conf.chartChanged = false;
conf.parameterChanged = false;
this.emitConfig(conf);
}
emitChartChange(conf) {
conf.chartChanged = true;
conf.parameterChanged = false;
this.emitConfig(conf);
}
emitParameterChange(conf) {
conf.chartChanged = false;
conf.parameterChanged = true;
this.emitConfig(conf);
}
getSetting() {
const self = this; /** for closure */
const configInstance = self.config; /** for closure */
if (self.spec.initialized) {
self.spec.initialized = false;
self.emitConfig(configInstance);
}
return {
template: SETTING_TEMPLATE,
scope: {
config: configInstance,
columns: self.columns,
resetAxisConfig: () => {
resetAxisConfig(configInstance);
self.emitChartChange(configInstance);
},
resetParameterConfig: () => {
resetParameterConfig(configInstance);
self.emitParameterChange(configInstance);
},
toggleColumnPanel: () => {
configInstance.panel.columnPanelOpened = !configInstance.panel.columnPanelOpened;
self.emitConfigChange(configInstance);
},
toggleParameterPanel: () => {
configInstance.panel.parameterPanelOpened = !configInstance.panel.parameterPanelOpened;
self.emitConfigChange(configInstance);
},
getAxisAnnotation: (axisSpec) => {
let anno = `${axisSpec.name}`;
if (axisSpec.valueType) {
anno = `${anno} (${axisSpec.valueType})`;
}
return anno;
},
getAxisTypeAnnotation: (axisSpec) => {
let anno = '';
let minAxisCount = axisSpec.minAxisCount;
let maxAxisCount = axisSpec.maxAxisCount;
if (isSingleDimensionAxis(axisSpec)) {
maxAxisCount = 1;
}
let comment = '';
if (minAxisCount) {
comment = `min: ${minAxisCount}`;
}
if (minAxisCount && maxAxisCount) {
comment = `${comment}, `;
}
if (maxAxisCount) {
comment = `${comment}max: ${maxAxisCount}`;
}
if (comment !== '') {
anno = `${anno} (${comment})`;
}
return anno;
},
getAxisAnnotationColor: (axisSpec) => {
if (isAggregatorAxis(axisSpec)) {
return {'background-color': '#5782bd'};
} else if (isGroupAxis(axisSpec)) {
return {'background-color': '#cd5c5c'};
} else if (isKeyAxis(axisSpec)) {
return {'background-color': '#906ebd'};
} else {
return {'background-color': '#62bda9'};
}
},
useSharedAxis: (chartName) => {
return useSharedAxis(configInstance, chartName);
},
isGroupAxis: (axisSpec) => {
return isGroupAxis(axisSpec);
},
isKeyAxis: (axisSpec) => {
return isKeyAxis(axisSpec);
},
isAggregatorAxis: (axisSpec) => {
return isAggregatorAxis(axisSpec);
},
isSingleDimensionAxis: (axisSpec) => {
return isSingleDimensionAxis(axisSpec);
},
getSingleDimensionAxis: (axisSpec) => {
return getCurrentChartAxis(configInstance)[axisSpec.name];
},
chartChanged: (selected) => {
configInstance.chart.current = selected;
self.emitChartChange(configInstance);
},
axisChanged: function(e, ui, axisSpec) {
removeDuplicatedColumnsInMultiDimensionAxis(configInstance, axisSpec);
applyMaxAxisCount(configInstance, axisSpec);
self.emitChartChange(configInstance);
},
aggregatorChanged: (colIndex, axisSpec, aggregator) => {
if (isSingleDimensionAxis(axisSpec)) {
getCurrentChartAxis(configInstance)[axisSpec.name].aggr = aggregator;
} else {
getCurrentChartAxis(configInstance)[axisSpec.name][colIndex].aggr = aggregator;
removeDuplicatedColumnsInMultiDimensionAxis(configInstance, axisSpec);
}
self.emitChartChange(configInstance);
},
removeFromAxis: function(colIndex, axisSpec) {
if (isSingleDimensionAxis(axisSpec)) {
getCurrentChartAxis(configInstance)[axisSpec.name] = null;
} else {
getCurrentChartAxis(configInstance)[axisSpec.name].splice(colIndex, 1);
}
self.emitChartChange(configInstance);
},
isInputWidget: function(paramSpec) {
return isInputWidget(paramSpec);
},
isCheckboxWidget: function(paramSpec) {
return isCheckboxWidget(paramSpec);
},
isOptionWidget: function(paramSpec) {
return isOptionWidget(paramSpec);
},
isTextareaWidget: function(paramSpec) {
return isTextareaWidget(paramSpec);
},
parameterChanged: (paramSpec) => {
configInstance.chartChanged = false;
configInstance.parameterChanged = true;
self.emitParameterChange(configInstance);
},
parameterOnKeyDown: function(event, paramSpec) {
const code = event.keyCode || event.which;
if (code === 13 && isInputWidget(paramSpec)) {
self.emitParameterChange(configInstance);
} else if (code === 13 && event.shiftKey && isTextareaWidget(paramSpec)) {
self.emitParameterChange(configInstance);
}
event.stopPropagation(); /** avoid to conflict with paragraph shortcuts */
},
},
};
}
transform(tableData) {
this.columns = tableData.columns; /** used in `getSetting` */
/** initialize in `transform` instead of `getSetting` because this method is called before */
serializeSharedAxes(this.config);
const conf = this.config;
const chart = getCurrentChart(conf);
const axis = getCurrentChartAxis(conf);
const axisSpecs = getCurrentChartAxisSpecs(conf);
const param = getCurrentChartParam(conf);
const paramSpecs = getCurrentChartParamSpecs(conf);
const parsedParam = parseParameter(paramSpecs, param);
let {transformer, column} = getTransformer(conf, tableData.rows, axisSpecs, axis);
return {
chartChanged: conf.chartChanged,
parameterChanged: conf.parameterChanged,
chart: chart, /** current chart */
axis: axis, /** persisted axis */
parameter: parsedParam, /** persisted parameter */
column: column,
transformer: transformer,
};
}
}