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.
251 lines
9.4 KiB
251 lines
9.4 KiB
1 month ago
|
|
||
|
/*
|
||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||
|
* or more contributor license agreements. See the NOTICE file
|
||
|
* distributed with this work for additional information
|
||
|
* regarding copyright ownership. The ASF licenses this file
|
||
|
* to you 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.
|
||
|
*/
|
||
|
|
||
|
|
||
|
/**
|
||
|
* AUTO-GENERATED FILE. DO NOT MODIFY.
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||
|
* or more contributor license agreements. See the NOTICE file
|
||
|
* distributed with this work for additional information
|
||
|
* regarding copyright ownership. The ASF licenses this file
|
||
|
* to you 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 { __extends } from "tslib";
|
||
|
// TODO depends on DataZoom and Brush
|
||
|
import * as zrUtil from 'zrender/lib/core/util.js';
|
||
|
import BrushController from '../../helper/BrushController.js';
|
||
|
import BrushTargetManager from '../../helper/BrushTargetManager.js';
|
||
|
import * as history from '../../dataZoom/history.js';
|
||
|
import sliderMove from '../../helper/sliderMove.js';
|
||
|
import { ToolboxFeature } from '../featureManager.js';
|
||
|
import { makeInternalComponentId, parseFinder } from '../../../util/model.js';
|
||
|
import { registerInternalOptionCreator } from '../../../model/internalComponentCreator.js';
|
||
|
var each = zrUtil.each;
|
||
|
var DATA_ZOOM_ID_BASE = makeInternalComponentId('toolbox-dataZoom_');
|
||
|
var ICON_TYPES = ['zoom', 'back'];
|
||
|
var DataZoomFeature = /** @class */function (_super) {
|
||
|
__extends(DataZoomFeature, _super);
|
||
|
function DataZoomFeature() {
|
||
|
return _super !== null && _super.apply(this, arguments) || this;
|
||
|
}
|
||
|
DataZoomFeature.prototype.render = function (featureModel, ecModel, api, payload) {
|
||
|
if (!this._brushController) {
|
||
|
this._brushController = new BrushController(api.getZr());
|
||
|
this._brushController.on('brush', zrUtil.bind(this._onBrush, this)).mount();
|
||
|
}
|
||
|
updateZoomBtnStatus(featureModel, ecModel, this, payload, api);
|
||
|
updateBackBtnStatus(featureModel, ecModel);
|
||
|
};
|
||
|
DataZoomFeature.prototype.onclick = function (ecModel, api, type) {
|
||
|
handlers[type].call(this);
|
||
|
};
|
||
|
DataZoomFeature.prototype.remove = function (ecModel, api) {
|
||
|
this._brushController && this._brushController.unmount();
|
||
|
};
|
||
|
DataZoomFeature.prototype.dispose = function (ecModel, api) {
|
||
|
this._brushController && this._brushController.dispose();
|
||
|
};
|
||
|
DataZoomFeature.prototype._onBrush = function (eventParam) {
|
||
|
var areas = eventParam.areas;
|
||
|
if (!eventParam.isEnd || !areas.length) {
|
||
|
return;
|
||
|
}
|
||
|
var snapshot = {};
|
||
|
var ecModel = this.ecModel;
|
||
|
this._brushController.updateCovers([]); // remove cover
|
||
|
var brushTargetManager = new BrushTargetManager(makeAxisFinder(this.model), ecModel, {
|
||
|
include: ['grid']
|
||
|
});
|
||
|
brushTargetManager.matchOutputRanges(areas, ecModel, function (area, coordRange, coordSys) {
|
||
|
if (coordSys.type !== 'cartesian2d') {
|
||
|
return;
|
||
|
}
|
||
|
var brushType = area.brushType;
|
||
|
if (brushType === 'rect') {
|
||
|
setBatch('x', coordSys, coordRange[0]);
|
||
|
setBatch('y', coordSys, coordRange[1]);
|
||
|
} else {
|
||
|
setBatch({
|
||
|
lineX: 'x',
|
||
|
lineY: 'y'
|
||
|
}[brushType], coordSys, coordRange);
|
||
|
}
|
||
|
});
|
||
|
history.push(ecModel, snapshot);
|
||
|
this._dispatchZoomAction(snapshot);
|
||
|
function setBatch(dimName, coordSys, minMax) {
|
||
|
var axis = coordSys.getAxis(dimName);
|
||
|
var axisModel = axis.model;
|
||
|
var dataZoomModel = findDataZoom(dimName, axisModel, ecModel);
|
||
|
// Restrict range.
|
||
|
var minMaxSpan = dataZoomModel.findRepresentativeAxisProxy(axisModel).getMinMaxSpan();
|
||
|
if (minMaxSpan.minValueSpan != null || minMaxSpan.maxValueSpan != null) {
|
||
|
minMax = sliderMove(0, minMax.slice(), axis.scale.getExtent(), 0, minMaxSpan.minValueSpan, minMaxSpan.maxValueSpan);
|
||
|
}
|
||
|
dataZoomModel && (snapshot[dataZoomModel.id] = {
|
||
|
dataZoomId: dataZoomModel.id,
|
||
|
startValue: minMax[0],
|
||
|
endValue: minMax[1]
|
||
|
});
|
||
|
}
|
||
|
function findDataZoom(dimName, axisModel, ecModel) {
|
||
|
var found;
|
||
|
ecModel.eachComponent({
|
||
|
mainType: 'dataZoom',
|
||
|
subType: 'select'
|
||
|
}, function (dzModel) {
|
||
|
var has = dzModel.getAxisModel(dimName, axisModel.componentIndex);
|
||
|
has && (found = dzModel);
|
||
|
});
|
||
|
return found;
|
||
|
}
|
||
|
};
|
||
|
;
|
||
|
DataZoomFeature.prototype._dispatchZoomAction = function (snapshot) {
|
||
|
var batch = [];
|
||
|
// Convert from hash map to array.
|
||
|
each(snapshot, function (batchItem, dataZoomId) {
|
||
|
batch.push(zrUtil.clone(batchItem));
|
||
|
});
|
||
|
batch.length && this.api.dispatchAction({
|
||
|
type: 'dataZoom',
|
||
|
from: this.uid,
|
||
|
batch: batch
|
||
|
});
|
||
|
};
|
||
|
DataZoomFeature.getDefaultOption = function (ecModel) {
|
||
|
var defaultOption = {
|
||
|
show: true,
|
||
|
filterMode: 'filter',
|
||
|
// Icon group
|
||
|
icon: {
|
||
|
zoom: 'M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1',
|
||
|
back: 'M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26'
|
||
|
},
|
||
|
// `zoom`, `back`
|
||
|
title: ecModel.getLocaleModel().get(['toolbox', 'dataZoom', 'title']),
|
||
|
brushStyle: {
|
||
|
borderWidth: 0,
|
||
|
color: 'rgba(210,219,238,0.2)'
|
||
|
}
|
||
|
};
|
||
|
return defaultOption;
|
||
|
};
|
||
|
return DataZoomFeature;
|
||
|
}(ToolboxFeature);
|
||
|
var handlers = {
|
||
|
zoom: function () {
|
||
|
var nextActive = !this._isZoomActive;
|
||
|
this.api.dispatchAction({
|
||
|
type: 'takeGlobalCursor',
|
||
|
key: 'dataZoomSelect',
|
||
|
dataZoomSelectActive: nextActive
|
||
|
});
|
||
|
},
|
||
|
back: function () {
|
||
|
this._dispatchZoomAction(history.pop(this.ecModel));
|
||
|
}
|
||
|
};
|
||
|
function makeAxisFinder(dzFeatureModel) {
|
||
|
var setting = {
|
||
|
xAxisIndex: dzFeatureModel.get('xAxisIndex', true),
|
||
|
yAxisIndex: dzFeatureModel.get('yAxisIndex', true),
|
||
|
xAxisId: dzFeatureModel.get('xAxisId', true),
|
||
|
yAxisId: dzFeatureModel.get('yAxisId', true)
|
||
|
};
|
||
|
// If both `xAxisIndex` `xAxisId` not set, it means 'all'.
|
||
|
// If both `yAxisIndex` `yAxisId` not set, it means 'all'.
|
||
|
// Some old cases set like this below to close yAxis control but leave xAxis control:
|
||
|
// `{ feature: { dataZoom: { yAxisIndex: false } }`.
|
||
|
if (setting.xAxisIndex == null && setting.xAxisId == null) {
|
||
|
setting.xAxisIndex = 'all';
|
||
|
}
|
||
|
if (setting.yAxisIndex == null && setting.yAxisId == null) {
|
||
|
setting.yAxisIndex = 'all';
|
||
|
}
|
||
|
return setting;
|
||
|
}
|
||
|
function updateBackBtnStatus(featureModel, ecModel) {
|
||
|
featureModel.setIconStatus('back', history.count(ecModel) > 1 ? 'emphasis' : 'normal');
|
||
|
}
|
||
|
function updateZoomBtnStatus(featureModel, ecModel, view, payload, api) {
|
||
|
var zoomActive = view._isZoomActive;
|
||
|
if (payload && payload.type === 'takeGlobalCursor') {
|
||
|
zoomActive = payload.key === 'dataZoomSelect' ? payload.dataZoomSelectActive : false;
|
||
|
}
|
||
|
view._isZoomActive = zoomActive;
|
||
|
featureModel.setIconStatus('zoom', zoomActive ? 'emphasis' : 'normal');
|
||
|
var brushTargetManager = new BrushTargetManager(makeAxisFinder(featureModel), ecModel, {
|
||
|
include: ['grid']
|
||
|
});
|
||
|
var panels = brushTargetManager.makePanelOpts(api, function (targetInfo) {
|
||
|
return targetInfo.xAxisDeclared && !targetInfo.yAxisDeclared ? 'lineX' : !targetInfo.xAxisDeclared && targetInfo.yAxisDeclared ? 'lineY' : 'rect';
|
||
|
});
|
||
|
view._brushController.setPanels(panels).enableBrush(zoomActive && panels.length ? {
|
||
|
brushType: 'auto',
|
||
|
brushStyle: featureModel.getModel('brushStyle').getItemStyle()
|
||
|
} : false);
|
||
|
}
|
||
|
registerInternalOptionCreator('dataZoom', function (ecModel) {
|
||
|
var toolboxModel = ecModel.getComponent('toolbox', 0);
|
||
|
var featureDataZoomPath = ['feature', 'dataZoom'];
|
||
|
if (!toolboxModel || toolboxModel.get(featureDataZoomPath) == null) {
|
||
|
return;
|
||
|
}
|
||
|
var dzFeatureModel = toolboxModel.getModel(featureDataZoomPath);
|
||
|
var dzOptions = [];
|
||
|
var finder = makeAxisFinder(dzFeatureModel);
|
||
|
var finderResult = parseFinder(ecModel, finder);
|
||
|
each(finderResult.xAxisModels, function (axisModel) {
|
||
|
return buildInternalOptions(axisModel, 'xAxis', 'xAxisIndex');
|
||
|
});
|
||
|
each(finderResult.yAxisModels, function (axisModel) {
|
||
|
return buildInternalOptions(axisModel, 'yAxis', 'yAxisIndex');
|
||
|
});
|
||
|
function buildInternalOptions(axisModel, axisMainType, axisIndexPropName) {
|
||
|
var axisIndex = axisModel.componentIndex;
|
||
|
var newOpt = {
|
||
|
type: 'select',
|
||
|
$fromToolbox: true,
|
||
|
// Default to be filter
|
||
|
filterMode: dzFeatureModel.get('filterMode', true) || 'filter',
|
||
|
// Id for merge mapping.
|
||
|
id: DATA_ZOOM_ID_BASE + axisMainType + axisIndex
|
||
|
};
|
||
|
newOpt[axisIndexPropName] = axisIndex;
|
||
|
dzOptions.push(newOpt);
|
||
|
}
|
||
|
return dzOptions;
|
||
|
});
|
||
|
export default DataZoomFeature;
|