committed by
GitHub
73 changed files with 942 additions and 1079 deletions
@ -0,0 +1,33 @@ |
|||||
|
/** |
||||
|
* Copyright © 2016-2024 The Thingsboard Authors |
||||
|
* |
||||
|
* 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. |
||||
|
*/ |
||||
|
package org.thingsboard.server.utils; |
||||
|
|
||||
|
import org.junit.Test; |
||||
|
import org.thingsboard.server.common.data.kv.DataType; |
||||
|
import org.thingsboard.server.service.subscription.TbSubscriptionUtils; |
||||
|
|
||||
|
import static org.assertj.core.api.Assertions.assertThat; |
||||
|
|
||||
|
public class TbSubscriptionUtilsTest { |
||||
|
|
||||
|
@Test |
||||
|
public void protoDataTypeSerialization() { |
||||
|
for (DataType dataType : DataType.values()) { |
||||
|
assertThat(TbSubscriptionUtils.fromProto(TbSubscriptionUtils.toProto(dataType))).as(dataType.name()).isEqualTo(dataType); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,59 @@ |
|||||
|
/** |
||||
|
* Copyright © 2016-2024 The Thingsboard Authors |
||||
|
* |
||||
|
* 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. |
||||
|
*/ |
||||
|
package org.thingsboard.server.dao.sql.rpc; |
||||
|
|
||||
|
import org.junit.Test; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.thingsboard.common.util.JacksonUtil; |
||||
|
import org.thingsboard.server.common.data.id.DeviceId; |
||||
|
import org.thingsboard.server.common.data.id.TenantId; |
||||
|
import org.thingsboard.server.common.data.rpc.Rpc; |
||||
|
import org.thingsboard.server.common.data.rpc.RpcStatus; |
||||
|
import org.thingsboard.server.dao.AbstractJpaDaoTest; |
||||
|
|
||||
|
import java.util.UUID; |
||||
|
|
||||
|
import static org.assertj.core.api.Assertions.assertThat; |
||||
|
|
||||
|
public class JpaRpcDaoTest extends AbstractJpaDaoTest { |
||||
|
|
||||
|
@Autowired |
||||
|
JpaRpcDao rpcDao; |
||||
|
|
||||
|
@Test |
||||
|
public void deleteOutdated() { |
||||
|
Rpc rpc = new Rpc(); |
||||
|
rpc.setTenantId(TenantId.SYS_TENANT_ID); |
||||
|
rpc.setDeviceId(new DeviceId(UUID.randomUUID())); |
||||
|
rpc.setStatus(RpcStatus.QUEUED); |
||||
|
rpc.setRequest(JacksonUtil.toJsonNode("{}")); |
||||
|
rpcDao.saveAndFlush(rpc.getTenantId(), rpc); |
||||
|
|
||||
|
rpc.setId(null); |
||||
|
rpcDao.saveAndFlush(rpc.getTenantId(), rpc); |
||||
|
|
||||
|
TenantId tenantId = TenantId.fromUUID(UUID.fromString("3d193a7a-774b-4c05-84d5-f7fdcf7a37cf")); |
||||
|
rpc.setId(null); |
||||
|
rpc.setTenantId(tenantId); |
||||
|
rpc.setDeviceId(new DeviceId(UUID.randomUUID())); |
||||
|
rpcDao.saveAndFlush(rpc.getTenantId(), rpc); |
||||
|
|
||||
|
assertThat(rpcDao.deleteOutdatedRpcByTenantId(TenantId.SYS_TENANT_ID, 0L)).isEqualTo(0); |
||||
|
assertThat(rpcDao.deleteOutdatedRpcByTenantId(TenantId.SYS_TENANT_ID, Long.MAX_VALUE)).isEqualTo(2); |
||||
|
assertThat(rpcDao.deleteOutdatedRpcByTenantId(tenantId, System.currentTimeMillis() + 1)).isEqualTo(1); |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,16 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
|
||||
|
<configuration> |
||||
|
<appender name="console" class="ch.qos.logback.core.ConsoleAppender"> |
||||
|
<encoder> |
||||
|
<pattern>%d{ISO8601} [%thread] %-5level %logger{36} - %msg%n</pattern> |
||||
|
</encoder> |
||||
|
</appender> |
||||
|
|
||||
|
<logger name="org.thingsboard.rule.engine.filter.TbCheckAlarmStatusNode" level="DEBUG"/> |
||||
|
|
||||
|
<root level="INFO"> |
||||
|
<appender-ref ref="console"/> |
||||
|
</root> |
||||
|
|
||||
|
</configuration> |
||||
@ -1,426 +0,0 @@ |
|||||
diff --git a/node_modules/echarts/lib/component/dataZoom/DataZoomModel.js b/node_modules/echarts/lib/component/dataZoom/DataZoomModel.js
|
|
||||
index d6c05f3..aafb0b8 100644
|
|
||||
--- a/node_modules/echarts/lib/component/dataZoom/DataZoomModel.js
|
|
||||
+++ b/node_modules/echarts/lib/component/dataZoom/DataZoomModel.js
|
|
||||
@@ -362,7 +362,10 @@ var DataZoomModel = /** @class */function (_super) {
|
|
||||
return axisProxy.getDataValueWindow(); |
|
||||
} |
|
||||
} else { |
|
||||
- return this.getAxisProxy(axisDim, axisIndex).getDataValueWindow();
|
|
||||
+ var axisProxy = this.getAxisProxy(axisDim, axisIndex);
|
|
||||
+ if (axisProxy) {
|
|
||||
+ return axisProxy.getDataValueWindow();
|
|
||||
+ }
|
|
||||
} |
|
||||
}; |
|
||||
/** |
|
||||
@@ -381,10 +384,10 @@ var DataZoomModel = /** @class */function (_super) {
|
|
||||
var axisInfo = this._targetAxisInfoMap.get(axisDim); |
|
||||
for (var j = 0; j < axisInfo.indexList.length; j++) { |
|
||||
var proxy = this.getAxisProxy(axisDim, axisInfo.indexList[j]); |
|
||||
- if (proxy.hostedBy(this)) {
|
|
||||
+ if (proxy && proxy.hostedBy(this)) {
|
|
||||
return proxy; |
|
||||
} |
|
||||
- if (!firstProxy) {
|
|
||||
+ if (proxy && !firstProxy) {
|
|
||||
firstProxy = proxy; |
|
||||
} |
|
||||
} |
|
||||
diff --git a/node_modules/echarts/lib/component/dataZoom/InsideZoomView.js b/node_modules/echarts/lib/component/dataZoom/InsideZoomView.js
|
|
||||
index 06469b2..cf0b2ea 100644
|
|
||||
--- a/node_modules/echarts/lib/component/dataZoom/InsideZoomView.js
|
|
||||
+++ b/node_modules/echarts/lib/component/dataZoom/InsideZoomView.js
|
|
||||
@@ -96,11 +96,14 @@ var getRangeHandlers = {
|
|
||||
range[0] = (range[0] - percentPoint) * scale + percentPoint; |
|
||||
range[1] = (range[1] - percentPoint) * scale + percentPoint; |
|
||||
// Restrict range. |
|
||||
- var minMaxSpan = this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();
|
|
||||
- sliderMove(0, range, [0, 100], 0, minMaxSpan.minSpan, minMaxSpan.maxSpan);
|
|
||||
- this.range = range;
|
|
||||
- if (lastRange[0] !== range[0] || lastRange[1] !== range[1]) {
|
|
||||
- return range;
|
|
||||
+ var proxy = this.dataZoomModel.findRepresentativeAxisProxy();
|
|
||||
+ if (proxy) {
|
|
||||
+ var minMaxSpan = proxy.getMinMaxSpan();
|
|
||||
+ sliderMove(0, range, [0, 100], 0, minMaxSpan.minSpan, minMaxSpan.maxSpan);
|
|
||||
+ this.range = range;
|
|
||||
+ if (lastRange[0] !== range[0] || lastRange[1] !== range[1]) {
|
|
||||
+ return range;
|
|
||||
+ }
|
|
||||
} |
|
||||
}, |
|
||||
pan: makeMover(function (range, axisModel, coordSysInfo, coordSysMainType, controller, e) { |
|
||||
diff --git a/node_modules/echarts/lib/component/dataZoom/SliderZoomView.js b/node_modules/echarts/lib/component/dataZoom/SliderZoomView.js
|
|
||||
index 98912e0..0cda6be 100644
|
|
||||
--- a/node_modules/echarts/lib/component/dataZoom/SliderZoomView.js
|
|
||||
+++ b/node_modules/echarts/lib/component/dataZoom/SliderZoomView.js
|
|
||||
@@ -64,7 +64,7 @@ var DEFAULT_MOVE_HANDLE_SIZE = 7;
|
|
||||
var HORIZONTAL = 'horizontal'; |
|
||||
var VERTICAL = 'vertical'; |
|
||||
var LABEL_GAP = 5; |
|
||||
-var SHOW_DATA_SHADOW_SERIES_TYPE = ['line', 'bar', 'candlestick', 'scatter'];
|
|
||||
+var SHOW_DATA_SHADOW_SERIES_TYPE = ['line', 'bar', 'candlestick', 'scatter', 'custom'];
|
|
||||
var REALTIME_ANIMATION_CONFIG = { |
|
||||
easing: 'cubicOut', |
|
||||
duration: 100, |
|
||||
@@ -359,30 +359,33 @@ var SliderZoomView = /** @class */function (_super) {
|
|
||||
var result; |
|
||||
var ecModel = this.ecModel; |
|
||||
dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { |
|
||||
- var seriesModels = dataZoomModel.getAxisProxy(axisDim, axisIndex).getTargetSeriesModels();
|
|
||||
- each(seriesModels, function (seriesModel) {
|
|
||||
- if (result) {
|
|
||||
- return;
|
|
||||
- }
|
|
||||
- if (showDataShadow !== true && indexOf(SHOW_DATA_SHADOW_SERIES_TYPE, seriesModel.get('type')) < 0) {
|
|
||||
- return;
|
|
||||
- }
|
|
||||
- var thisAxis = ecModel.getComponent(getAxisMainType(axisDim), axisIndex).axis;
|
|
||||
- var otherDim = getOtherDim(axisDim);
|
|
||||
- var otherAxisInverse;
|
|
||||
- var coordSys = seriesModel.coordinateSystem;
|
|
||||
- if (otherDim != null && coordSys.getOtherAxis) {
|
|
||||
- otherAxisInverse = coordSys.getOtherAxis(thisAxis).inverse;
|
|
||||
- }
|
|
||||
- otherDim = seriesModel.getData().mapDimension(otherDim);
|
|
||||
- result = {
|
|
||||
- thisAxis: thisAxis,
|
|
||||
- series: seriesModel,
|
|
||||
- thisDim: axisDim,
|
|
||||
- otherDim: otherDim,
|
|
||||
- otherAxisInverse: otherAxisInverse
|
|
||||
- };
|
|
||||
- }, this);
|
|
||||
+ var axisProxy = dataZoomModel.getAxisProxy(axisDim, axisIndex);
|
|
||||
+ if (axisProxy) {
|
|
||||
+ var seriesModels = axisProxy.getTargetSeriesModels();
|
|
||||
+ each(seriesModels, function (seriesModel) {
|
|
||||
+ if (result) {
|
|
||||
+ return;
|
|
||||
+ }
|
|
||||
+ if (showDataShadow !== true && indexOf(SHOW_DATA_SHADOW_SERIES_TYPE, seriesModel.get('type')) < 0) {
|
|
||||
+ return;
|
|
||||
+ }
|
|
||||
+ var thisAxis = ecModel.getComponent(getAxisMainType(axisDim), axisIndex).axis;
|
|
||||
+ var otherDim = getOtherDim(axisDim);
|
|
||||
+ var otherAxisInverse;
|
|
||||
+ var coordSys = seriesModel.coordinateSystem;
|
|
||||
+ if (otherDim != null && coordSys.getOtherAxis) {
|
|
||||
+ otherAxisInverse = coordSys.getOtherAxis(thisAxis).inverse;
|
|
||||
+ }
|
|
||||
+ otherDim = seriesModel.getData().mapDimension(otherDim);
|
|
||||
+ result = {
|
|
||||
+ thisAxis: thisAxis,
|
|
||||
+ series: seriesModel,
|
|
||||
+ thisDim: axisDim,
|
|
||||
+ otherDim: otherDim,
|
|
||||
+ otherAxisInverse: otherAxisInverse
|
|
||||
+ };
|
|
||||
+ }, this);
|
|
||||
+ }
|
|
||||
}, this); |
|
||||
return result; |
|
||||
}; |
|
||||
@@ -530,12 +533,17 @@ var SliderZoomView = /** @class */function (_super) {
|
|
||||
var dataZoomModel = this.dataZoomModel; |
|
||||
var handleEnds = this._handleEnds; |
|
||||
var viewExtend = this._getViewExtent(); |
|
||||
- var minMaxSpan = dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();
|
|
||||
- var percentExtent = [0, 100];
|
|
||||
- sliderMove(delta, handleEnds, viewExtend, dataZoomModel.get('zoomLock') ? 'all' : handleIndex, minMaxSpan.minSpan != null ? linearMap(minMaxSpan.minSpan, percentExtent, viewExtend, true) : null, minMaxSpan.maxSpan != null ? linearMap(minMaxSpan.maxSpan, percentExtent, viewExtend, true) : null);
|
|
||||
- var lastRange = this._range;
|
|
||||
- var range = this._range = asc([linearMap(handleEnds[0], viewExtend, percentExtent, true), linearMap(handleEnds[1], viewExtend, percentExtent, true)]);
|
|
||||
- return !lastRange || lastRange[0] !== range[0] || lastRange[1] !== range[1];
|
|
||||
+ var proxy = dataZoomModel.findRepresentativeAxisProxy();
|
|
||||
+ if (proxy) {
|
|
||||
+ var minMaxSpan = proxy.getMinMaxSpan();
|
|
||||
+ var percentExtent = [0, 100];
|
|
||||
+ sliderMove(delta, handleEnds, viewExtend, dataZoomModel.get('zoomLock') ? 'all' : handleIndex, minMaxSpan.minSpan != null ? linearMap(minMaxSpan.minSpan, percentExtent, viewExtend, true) : null, minMaxSpan.maxSpan != null ? linearMap(minMaxSpan.maxSpan, percentExtent, viewExtend, true) : null);
|
|
||||
+ var lastRange = this._range;
|
|
||||
+ var range = this._range = asc([linearMap(handleEnds[0], viewExtend, percentExtent, true), linearMap(handleEnds[1], viewExtend, percentExtent, true)]);
|
|
||||
+ return !lastRange || lastRange[0] !== range[0] || lastRange[1] !== range[1];
|
|
||||
+ } else {
|
|
||||
+ return false;
|
|
||||
+ }
|
|
||||
}; |
|
||||
SliderZoomView.prototype._updateView = function (nonRealtime) { |
|
||||
var displaybles = this._displayables; |
|
||||
diff --git a/node_modules/echarts/lib/component/dataZoom/dataZoomProcessor.js b/node_modules/echarts/lib/component/dataZoom/dataZoomProcessor.js
|
|
||||
index ce98fed..e154118 100644
|
|
||||
--- a/node_modules/echarts/lib/component/dataZoom/dataZoomProcessor.js
|
|
||||
+++ b/node_modules/echarts/lib/component/dataZoom/dataZoomProcessor.js
|
|
||||
@@ -90,7 +90,10 @@ var dataZoomProcessor = {
|
|
||||
// init stage and not after action dispatch handler, because |
|
||||
// reset should be called after seriesData.restoreData. |
|
||||
dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { |
|
||||
- dataZoomModel.getAxisProxy(axisDim, axisIndex).reset(dataZoomModel);
|
|
||||
+ var axisProxy = dataZoomModel.getAxisProxy(axisDim, axisIndex);
|
|
||||
+ if (axisProxy) {
|
|
||||
+ axisProxy.reset(dataZoomModel);
|
|
||||
+ }
|
|
||||
}); |
|
||||
// Caution: data zoom filtering is order sensitive when using |
|
||||
// percent range and no min/max/scale set on axis. |
|
||||
@@ -107,7 +110,10 @@ var dataZoomProcessor = {
|
|
||||
// So we should filter x-axis after reset x-axis immediately, |
|
||||
// and then reset y-axis and filter y-axis. |
|
||||
dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { |
|
||||
- dataZoomModel.getAxisProxy(axisDim, axisIndex).filterData(dataZoomModel, api);
|
|
||||
+ var axisProxy = dataZoomModel.getAxisProxy(axisDim, axisIndex);
|
|
||||
+ if (axisProxy) {
|
|
||||
+ axisProxy.filterData(dataZoomModel, api);
|
|
||||
+ }
|
|
||||
}); |
|
||||
}); |
|
||||
ecModel.eachComponent('dataZoom', function (dataZoomModel) { |
|
||||
diff --git a/node_modules/echarts/lib/component/toolbox/feature/DataZoom.js b/node_modules/echarts/lib/component/toolbox/feature/DataZoom.js
|
|
||||
index cf8d6bc..f9b9f90 100644
|
|
||||
--- a/node_modules/echarts/lib/component/toolbox/feature/DataZoom.js
|
|
||||
+++ b/node_modules/echarts/lib/component/toolbox/feature/DataZoom.js
|
|
||||
@@ -109,9 +109,12 @@ var DataZoomFeature = /** @class */function (_super) {
|
|
||||
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);
|
|
||||
+ var proxy = dataZoomModel.findRepresentativeAxisProxy(axisModel);
|
|
||||
+ if (proxy) {
|
|
||||
+ var minMaxSpan = proxy.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, |
|
||||
diff --git a/node_modules/echarts/lib/component/tooltip/TooltipView.js b/node_modules/echarts/lib/component/tooltip/TooltipView.js
|
|
||||
index b8a9b95..11e49c0 100644
|
|
||||
--- a/node_modules/echarts/lib/component/tooltip/TooltipView.js
|
|
||||
+++ b/node_modules/echarts/lib/component/tooltip/TooltipView.js
|
|
||||
@@ -360,7 +360,7 @@ var TooltipView = /** @class */function (_super) {
|
|
||||
each(itemCoordSys.dataByAxis, function (axisItem) { |
|
||||
var axisModel = ecModel.getComponent(axisItem.axisDim + 'Axis', axisItem.axisIndex); |
|
||||
var axisValue = axisItem.value; |
|
||||
- if (!axisModel || axisValue == null) {
|
|
||||
+ if (!axisModel || !axisModel.axis || axisValue == null) {
|
|
||||
return; |
|
||||
} |
|
||||
var axisValueLabel = axisPointerViewHelper.getValueLabel(axisValue, axisModel.axis, ecModel, axisItem.seriesDataIndices, axisItem.valueLabelOpt); |
|
||||
diff --git a/node_modules/echarts/lib/coord/axisHelper.js b/node_modules/echarts/lib/coord/axisHelper.js
|
|
||||
index a76c66b..e5b7ee5 100644
|
|
||||
--- a/node_modules/echarts/lib/coord/axisHelper.js
|
|
||||
+++ b/node_modules/echarts/lib/coord/axisHelper.js
|
|
||||
@@ -187,7 +187,9 @@ export function createScaleByModel(model, axisType) {
|
|
||||
}); |
|
||||
default: |
|
||||
// case 'value'/'interval', 'log', or others. |
|
||||
- return new (Scale.getClass(axisType) || IntervalScale)();
|
|
||||
+ return new (Scale.getClass(axisType) || IntervalScale)({
|
|
||||
+ ticksGenerator: model.get('ticksGenerator')
|
|
||||
+ });
|
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
diff --git a/node_modules/echarts/lib/coord/cartesian/Grid.js b/node_modules/echarts/lib/coord/cartesian/Grid.js
|
|
||||
index 5b18f02..39a57f8 100644
|
|
||||
--- a/node_modules/echarts/lib/coord/cartesian/Grid.js
|
|
||||
+++ b/node_modules/echarts/lib/coord/cartesian/Grid.js
|
|
||||
@@ -91,11 +91,11 @@ var Grid = /** @class */function () {
|
|
||||
var scale = axis.scale; |
|
||||
if ( |
|
||||
// Only value and log axis without interval support alignTicks. |
|
||||
- isIntervalOrLogScale(scale) && model.get('alignTicks') && model.get('interval') == null) {
|
|
||||
+ isIntervalOrLogScale(scale) && model.get('alignTicks') && model.get('interval') == null && model.get('ticksGenerator') == null) {
|
|
||||
axisNeedsAlign.push(axis); |
|
||||
} else { |
|
||||
niceScaleExtent(scale, model); |
|
||||
- if (isIntervalOrLogScale(scale)) {
|
|
||||
+ if (isIntervalOrLogScale(scale) && !scale.isBlank()) {
|
|
||||
// Can only align to interval or log axis. |
|
||||
alignTo = axis; |
|
||||
} |
|
||||
@@ -105,10 +105,15 @@ var Grid = /** @class */function () {
|
|
||||
// All axes has set alignTicks. Pick the first one. |
|
||||
// PENDING. Should we find the axis that both set interval, min, max and align to this one? |
|
||||
if (axisNeedsAlign.length) { |
|
||||
- if (!alignTo) {
|
|
||||
- alignTo = axisNeedsAlign.pop();
|
|
||||
- niceScaleExtent(alignTo.scale, alignTo.model);
|
|
||||
+ while (!alignTo && axisNeedsAlign.length) {
|
|
||||
+ var axis = axisNeedsAlign.pop();
|
|
||||
+ niceScaleExtent(axis.scale, axis.model);
|
|
||||
+ if (!axis.scale.isBlank()) {
|
|
||||
+ alignTo = axis;
|
|
||||
+ }
|
|
||||
} |
|
||||
+ }
|
|
||||
+ if (axisNeedsAlign.length && alignTo) {
|
|
||||
each(axisNeedsAlign, function (axis) { |
|
||||
alignScaleTicks(axis.scale, axis.model, alignTo.scale); |
|
||||
}); |
|
||||
diff --git a/node_modules/echarts/lib/data/SeriesData.js b/node_modules/echarts/lib/data/SeriesData.js
|
|
||||
index 98d5ce8..1c293a6 100644
|
|
||||
--- a/node_modules/echarts/lib/data/SeriesData.js
|
|
||||
+++ b/node_modules/echarts/lib/data/SeriesData.js
|
|
||||
@@ -900,13 +900,16 @@ var SeriesData = /** @class */function () {
|
|
||||
var dimInfo = data._dimInfos[dim]; |
|
||||
// Currently, only dimensions that has ordinalMeta can create inverted indices. |
|
||||
var ordinalMeta = dimInfo.ordinalMeta; |
|
||||
+ var stack = dimInfo.stack;
|
|
||||
var store = data._store; |
|
||||
- if (ordinalMeta) {
|
|
||||
- invertedIndices = invertedIndicesMap[dim] = new CtorInt32Array(ordinalMeta.categories.length);
|
|
||||
- // The default value of TypedArray is 0. To avoid miss
|
|
||||
- // mapping to 0, we should set it as INDEX_NOT_FOUND.
|
|
||||
- for (var i = 0; i < invertedIndices.length; i++) {
|
|
||||
- invertedIndices[i] = INDEX_NOT_FOUND;
|
|
||||
+ if (ordinalMeta || stack) {
|
|
||||
+ invertedIndices = invertedIndicesMap[dim] = stack ? new Array(store.count()) : new CtorInt32Array(ordinalMeta.categories.length);
|
|
||||
+ if (ordinalMeta) {
|
|
||||
+ // The default value of TypedArray is 0. To avoid miss
|
|
||||
+ // mapping to 0, we should set it as INDEX_NOT_FOUND.
|
|
||||
+ for (var i = 0; i < invertedIndices.length; i++) {
|
|
||||
+ invertedIndices[i] = INDEX_NOT_FOUND;
|
|
||||
+ }
|
|
||||
} |
|
||||
for (var i = 0; i < store.count(); i++) { |
|
||||
// Only support the case that all values are distinct. |
|
||||
diff --git a/node_modules/echarts/lib/data/Source.js b/node_modules/echarts/lib/data/Source.js
|
|
||||
index 7dda49b..2dd2b98 100644
|
|
||||
--- a/node_modules/echarts/lib/data/Source.js
|
|
||||
+++ b/node_modules/echarts/lib/data/Source.js
|
|
||||
@@ -252,7 +252,8 @@ function normalizeDimensionsOption(dimensionsDefine) {
|
|
||||
var item = { |
|
||||
name: rawItem.name, |
|
||||
displayName: rawItem.displayName, |
|
||||
- type: rawItem.type
|
|
||||
+ type: rawItem.type,
|
|
||||
+ stack: rawItem.stack
|
|
||||
}; |
|
||||
// User can set null in dimensions. |
|
||||
// We don't auto specify name, otherwise a given name may |
|
||||
diff --git a/node_modules/echarts/lib/data/helper/createDimensions.js b/node_modules/echarts/lib/data/helper/createDimensions.js
|
|
||||
index 00d7eb7..dd514b1 100644
|
|
||||
--- a/node_modules/echarts/lib/data/helper/createDimensions.js
|
|
||||
+++ b/node_modules/echarts/lib/data/helper/createDimensions.js
|
|
||||
@@ -110,6 +110,9 @@ source, opt) {
|
|
||||
} |
|
||||
dimDefItem.type != null && (resultItem.type = dimDefItem.type); |
|
||||
dimDefItem.displayName != null && (resultItem.displayName = dimDefItem.displayName); |
|
||||
+ if (dimDefItem.stack) {
|
|
||||
+ resultItem.stack = true;
|
|
||||
+ }
|
|
||||
var newIdx = resultList.length; |
|
||||
indicesMap[dimIdx] = newIdx; |
|
||||
resultItem.storeDimIndex = dimIdx; |
|
||||
diff --git a/node_modules/echarts/lib/data/helper/dataStackHelper.js b/node_modules/echarts/lib/data/helper/dataStackHelper.js
|
|
||||
index c25de1b..ea8300d 100644
|
|
||||
--- a/node_modules/echarts/lib/data/helper/dataStackHelper.js
|
|
||||
+++ b/node_modules/echarts/lib/data/helper/dataStackHelper.js
|
|
||||
@@ -91,7 +91,7 @@ export function enableDataStack(seriesModel, dimensionsInput, opt) {
|
|
||||
} |
|
||||
if (mayStack && !dimensionInfo.isExtraCoord) { |
|
||||
// Find the first ordinal dimension as the stackedByDimInfo. |
|
||||
- if (!byIndex && !stackedByDimInfo && dimensionInfo.ordinalMeta) {
|
|
||||
+ if (!byIndex && !stackedByDimInfo && (dimensionInfo.ordinalMeta || dimensionInfo.stack)) {
|
|
||||
stackedByDimInfo = dimensionInfo; |
|
||||
} |
|
||||
// Find the first stackable dimension as the stackedDimInfo. |
|
||||
diff --git a/node_modules/echarts/lib/scale/Interval.js b/node_modules/echarts/lib/scale/Interval.js
|
|
||||
index 1094662..363c0a5 100644
|
|
||||
--- a/node_modules/echarts/lib/scale/Interval.js
|
|
||||
+++ b/node_modules/echarts/lib/scale/Interval.js
|
|
||||
@@ -46,12 +46,17 @@ import * as numberUtil from '../util/number.js';
|
|
||||
import * as formatUtil from '../util/format.js'; |
|
||||
import Scale from './Scale.js'; |
|
||||
import * as helper from './helper.js'; |
|
||||
+import { isFunction } from 'zrender/lib/core/util.js';
|
|
||||
var roundNumber = numberUtil.round; |
|
||||
var IntervalScale = /** @class */function (_super) { |
|
||||
__extends(IntervalScale, _super); |
|
||||
- function IntervalScale() {
|
|
||||
- var _this = _super !== null && _super.apply(this, arguments) || this;
|
|
||||
+ function IntervalScale(setting) {
|
|
||||
+ var _this = _super.call(this, setting) || this;
|
|
||||
_this.type = 'interval'; |
|
||||
+ var ticksGenerator = _this.getSetting('ticksGenerator');
|
|
||||
+ if (isFunction(ticksGenerator)) {
|
|
||||
+ _this._ticksGenerator = ticksGenerator;
|
|
||||
+ }
|
|
||||
// Step is calculated in adjustExtent. |
|
||||
_this._interval = 0; |
|
||||
_this._intervalPrecision = 2; |
|
||||
@@ -104,7 +109,17 @@ var IntervalScale = /** @class */function (_super) {
|
|
||||
var extent = this._extent; |
|
||||
var niceTickExtent = this._niceExtent; |
|
||||
var intervalPrecision = this._intervalPrecision; |
|
||||
- var ticks = [];
|
|
||||
+ var ticksGenerator = this._ticksGenerator;
|
|
||||
+ var ticks;
|
|
||||
+ if (ticksGenerator) {
|
|
||||
+ try {
|
|
||||
+ ticks = ticksGenerator(extent, interval, niceTickExtent, intervalPrecision);
|
|
||||
+ if (ticks) {
|
|
||||
+ return ticks;
|
|
||||
+ }
|
|
||||
+ } catch (_e) {}
|
|
||||
+ }
|
|
||||
+ ticks = [];
|
|
||||
// If interval is 0, return []; |
|
||||
if (!interval) { |
|
||||
return ticks; |
|
||||
diff --git a/node_modules/echarts/types/dist/shared.d.ts b/node_modules/echarts/types/dist/shared.d.ts
|
|
||||
index ca74097..ef41ce2 100644
|
|
||||
--- a/node_modules/echarts/types/dist/shared.d.ts
|
|
||||
+++ b/node_modules/echarts/types/dist/shared.d.ts
|
|
||||
@@ -2422,6 +2422,9 @@ interface AxisBaseOptionCommon extends ComponentOption, AnimationOptionMixin {
|
|
||||
max: number; |
|
||||
}) => ScaleDataValue); |
|
||||
} |
|
||||
+
|
|
||||
+declare type NumericAxisTicksGenerator = (extent?: number[], interval?: number, niceTickExtent?: number[], intervalPrecision?: number) => {value: number}[];
|
|
||||
+
|
|
||||
interface NumericAxisBaseOptionCommon extends AxisBaseOptionCommon { |
|
||||
boundaryGap?: [number | string, number | string]; |
|
||||
/** |
|
||||
@@ -2447,6 +2450,8 @@ interface NumericAxisBaseOptionCommon extends AxisBaseOptionCommon {
|
|
||||
* Will be ignored if interval is set. |
|
||||
*/ |
|
||||
alignTicks?: boolean; |
|
||||
+
|
|
||||
+ ticksGenerator?: NumericAxisTicksGenerator;
|
|
||||
} |
|
||||
interface CategoryAxisBaseOption extends AxisBaseOptionCommon { |
|
||||
type?: 'category'; |
|
||||
@@ -6412,6 +6417,7 @@ declare type DimensionDefinition = {
|
|
||||
type?: DataStoreDimensionType; |
|
||||
name?: DimensionName; |
|
||||
displayName?: string; |
|
||||
+ stack?: boolean;
|
|
||||
}; |
|
||||
declare type DimensionDefinitionLoose = DimensionDefinition['name'] | DimensionDefinition; |
|
||||
declare const SOURCE_FORMAT_ORIGINAL: "original"; |
|
||||
diff --git a/node_modules/echarts/types/src/coord/axisCommonTypes.d.ts b/node_modules/echarts/types/src/coord/axisCommonTypes.d.ts
|
|
||||
index c5c2792..d524b70 100644
|
|
||||
--- a/node_modules/echarts/types/src/coord/axisCommonTypes.d.ts
|
|
||||
+++ b/node_modules/echarts/types/src/coord/axisCommonTypes.d.ts
|
|
||||
@@ -56,6 +56,9 @@ export interface AxisBaseOptionCommon extends ComponentOption, AnimationOptionMi
|
|
||||
max: number; |
|
||||
}) => ScaleDataValue); |
|
||||
} |
|
||||
+
|
|
||||
+export declare type NumericAxisTicksGenerator = (extent?: number[], interval?: number, niceTickExtent?: number[], intervalPrecision?: number) => {value: number}[];
|
|
||||
+
|
|
||||
export interface NumericAxisBaseOptionCommon extends AxisBaseOptionCommon { |
|
||||
boundaryGap?: [number | string, number | string]; |
|
||||
/** |
|
||||
@@ -81,6 +84,8 @@ export interface NumericAxisBaseOptionCommon extends AxisBaseOptionCommon {
|
|
||||
* Will be ignored if interval is set. |
|
||||
*/ |
|
||||
alignTicks?: boolean; |
|
||||
+
|
|
||||
+ ticksGenerator?: NumericAxisTicksGenerator;
|
|
||||
} |
|
||||
export interface CategoryAxisBaseOption extends AxisBaseOptionCommon { |
|
||||
type?: 'category'; |
|
||||
Loading…
Reference in new issue