cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
463 lines (462 loc) • 15.9 kB
JavaScript
import { SERIES_UNIVERSAL_TRANSITION_PROP } from "../model/Series.mjs";
import { each, filter, map, createHashMap, isArray, extend } from "../../../zrender/lib/core/util.mjs";
import { applyMorphAnimation, getPathList } from "./morphTransitionHelper.mjs";
import Path from "../../../zrender/lib/graphic/Path.mjs";
import "../util/graphic.mjs";
import DataDiffer from "../data/DataDiffer.mjs";
import { normalizeToArray, makeInner } from "../util/model.mjs";
import { getAnimationConfig, initProps, getOldStyle } from "./basicTransition.mjs";
import Displayable from "../../../zrender/lib/graphic/Displayable.mjs";
var DATA_COUNT_THRESHOLD = 1e4;
var getUniversalTransitionGlobalStore = makeInner();
function getGroupIdDimension(data) {
var dimensions = data.dimensions;
for (var i = 0; i < dimensions.length; i++) {
var dimInfo = data.getDimensionInfo(dimensions[i]);
if (dimInfo && dimInfo.otherDims.itemGroupId === 0) {
return dimensions[i];
}
}
}
function flattenDataDiffItems(list) {
var items = [];
each(list, function(seriesInfo) {
var data = seriesInfo.data;
if (data.count() > DATA_COUNT_THRESHOLD) {
return;
}
var indices = data.getIndices();
var groupDim = getGroupIdDimension(data);
for (var dataIndex = 0; dataIndex < indices.length; dataIndex++) {
items.push({
dataGroupId: seriesInfo.dataGroupId,
data,
dim: seriesInfo.dim || groupDim,
divide: seriesInfo.divide,
dataIndex
});
}
});
return items;
}
function fadeInElement(newEl, newSeries, newIndex) {
newEl.traverse(function(el) {
if (el instanceof Path) {
initProps(el, {
style: {
opacity: 0
}
}, newSeries, {
dataIndex: newIndex,
isFrom: true
});
}
});
}
function removeEl(el) {
if (el.parent) {
var computedTransform = el.getComputedTransform();
el.setLocalTransform(computedTransform);
el.parent.remove(el);
}
}
function stopAnimation(el) {
el.stopAnimation();
if (el.isGroup) {
el.traverse(function(child) {
child.stopAnimation();
});
}
}
function animateElementStyles(el, dataIndex, seriesModel) {
var animationConfig = getAnimationConfig("update", seriesModel, dataIndex);
animationConfig && el.traverse(function(child) {
if (child instanceof Displayable) {
var oldStyle = getOldStyle(child);
if (oldStyle) {
child.animateFrom({
style: oldStyle
}, animationConfig);
}
}
});
}
function isAllIdSame(oldDiffItems, newDiffItems) {
var len = oldDiffItems.length;
if (len !== newDiffItems.length) {
return false;
}
for (var i = 0; i < len; i++) {
var oldItem = oldDiffItems[i];
var newItem = newDiffItems[i];
if (oldItem.data.getId(oldItem.dataIndex) !== newItem.data.getId(newItem.dataIndex)) {
return false;
}
}
return true;
}
function transitionBetween(oldList, newList, api) {
var oldDiffItems = flattenDataDiffItems(oldList);
var newDiffItems = flattenDataDiffItems(newList);
function updateMorphingPathProps(from, to, rawFrom, rawTo, animationCfg) {
if (rawFrom || from) {
to.animateFrom({
style: rawFrom && rawFrom !== from ? extend(extend({}, rawFrom.style), from.style) : from.style
}, animationCfg);
}
}
function findKeyDim(items) {
for (var i2 = 0; i2 < items.length; i2++) {
if (items[i2].dim) {
return items[i2].dim;
}
}
}
var oldKeyDim = findKeyDim(oldDiffItems);
var newKeyDim = findKeyDim(newDiffItems);
var hasMorphAnimation = false;
function createKeyGetter(isOld, onlyGetId) {
return function(diffItem) {
var data = diffItem.data;
var dataIndex = diffItem.dataIndex;
if (onlyGetId) {
return data.getId(dataIndex);
}
var dataGroupId = diffItem.dataGroupId;
var keyDim = isOld ? oldKeyDim || newKeyDim : newKeyDim || oldKeyDim;
var dimInfo = keyDim && data.getDimensionInfo(keyDim);
var dimOrdinalMeta = dimInfo && dimInfo.ordinalMeta;
if (dimInfo) {
var key = data.get(dimInfo.name, dataIndex);
if (dimOrdinalMeta) {
return dimOrdinalMeta.categories[key] || key + "";
}
return key + "";
}
var itemVal = data.getRawDataItem(dataIndex);
if (itemVal && itemVal.groupId) {
return itemVal.groupId + "";
}
return dataGroupId || data.getId(dataIndex);
};
}
var useId = isAllIdSame(oldDiffItems, newDiffItems);
var isElementStillInChart = {};
if (!useId) {
for (var i = 0; i < newDiffItems.length; i++) {
var newItem = newDiffItems[i];
var el = newItem.data.getItemGraphicEl(newItem.dataIndex);
if (el) {
isElementStillInChart[el.id] = true;
}
}
}
function updateOneToOne(newIndex, oldIndex) {
var oldItem = oldDiffItems[oldIndex];
var newItem2 = newDiffItems[newIndex];
var newSeries = newItem2.data.hostModel;
var oldEl = oldItem.data.getItemGraphicEl(oldItem.dataIndex);
var newEl = newItem2.data.getItemGraphicEl(newItem2.dataIndex);
if (oldEl === newEl) {
newEl && animateElementStyles(newEl, newItem2.dataIndex, newSeries);
return;
}
if (oldEl && isElementStillInChart[oldEl.id]) {
return;
}
if (newEl) {
stopAnimation(newEl);
if (oldEl) {
stopAnimation(oldEl);
removeEl(oldEl);
hasMorphAnimation = true;
applyMorphAnimation(getPathList(oldEl), getPathList(newEl), newItem2.divide, newSeries, newIndex, updateMorphingPathProps);
} else {
fadeInElement(newEl, newSeries, newIndex);
}
}
}
new DataDiffer(oldDiffItems, newDiffItems, createKeyGetter(true, useId), createKeyGetter(false, useId), null, "multiple").update(updateOneToOne).updateManyToOne(function(newIndex, oldIndices) {
var newItem2 = newDiffItems[newIndex];
var newData = newItem2.data;
var newSeries = newData.hostModel;
var newEl = newData.getItemGraphicEl(newItem2.dataIndex);
var oldElsList = filter(map(oldIndices, function(idx) {
return oldDiffItems[idx].data.getItemGraphicEl(oldDiffItems[idx].dataIndex);
}), function(oldEl) {
return oldEl && oldEl !== newEl && !isElementStillInChart[oldEl.id];
});
if (newEl) {
stopAnimation(newEl);
if (oldElsList.length) {
each(oldElsList, function(oldEl) {
stopAnimation(oldEl);
removeEl(oldEl);
});
hasMorphAnimation = true;
applyMorphAnimation(getPathList(oldElsList), getPathList(newEl), newItem2.divide, newSeries, newIndex, updateMorphingPathProps);
} else {
fadeInElement(newEl, newSeries, newItem2.dataIndex);
}
}
}).updateOneToMany(function(newIndices, oldIndex) {
var oldItem = oldDiffItems[oldIndex];
var oldEl = oldItem.data.getItemGraphicEl(oldItem.dataIndex);
if (oldEl && isElementStillInChart[oldEl.id]) {
return;
}
var newElsList = filter(map(newIndices, function(idx) {
return newDiffItems[idx].data.getItemGraphicEl(newDiffItems[idx].dataIndex);
}), function(el2) {
return el2 && el2 !== oldEl;
});
var newSeris = newDiffItems[newIndices[0]].data.hostModel;
if (newElsList.length) {
each(newElsList, function(newEl) {
return stopAnimation(newEl);
});
if (oldEl) {
stopAnimation(oldEl);
removeEl(oldEl);
hasMorphAnimation = true;
applyMorphAnimation(
getPathList(oldEl),
getPathList(newElsList),
oldItem.divide,
newSeris,
newIndices[0],
updateMorphingPathProps
);
} else {
each(newElsList, function(newEl) {
return fadeInElement(newEl, newSeris, newIndices[0]);
});
}
}
}).updateManyToMany(function(newIndices, oldIndices) {
new DataDiffer(oldIndices, newIndices, function(rawIdx) {
return oldDiffItems[rawIdx].data.getId(oldDiffItems[rawIdx].dataIndex);
}, function(rawIdx) {
return newDiffItems[rawIdx].data.getId(newDiffItems[rawIdx].dataIndex);
}).update(function(newIndex, oldIndex) {
updateOneToOne(newIndices[newIndex], oldIndices[oldIndex]);
}).execute();
}).execute();
if (hasMorphAnimation) {
each(newList, function(_a) {
var data = _a.data;
var seriesModel = data.hostModel;
var view = seriesModel && api.getViewOfSeriesModel(seriesModel);
var animationCfg = getAnimationConfig("update", seriesModel, 0);
if (view && seriesModel.isAnimationEnabled() && animationCfg && animationCfg.duration > 0) {
view.group.traverse(function(el2) {
if (el2 instanceof Path && !el2.animators.length) {
el2.animateFrom({
style: {
opacity: 0
}
}, animationCfg);
}
});
}
});
}
}
function getSeriesTransitionKey(series) {
var seriesKey = series.getModel("universalTransition").get("seriesKey");
if (!seriesKey) {
return series.id;
}
return seriesKey;
}
function convertArraySeriesKeyToString(seriesKey) {
if (isArray(seriesKey)) {
return seriesKey.sort().join(",");
}
return seriesKey;
}
function getDivideShapeFromData(data) {
if (data.hostModel) {
return data.hostModel.getModel("universalTransition").get("divideShape");
}
}
function findTransitionSeriesBatches(globalStore, params) {
var updateBatches = createHashMap();
var oldDataMap = createHashMap();
var oldDataMapForSplit = createHashMap();
each(globalStore.oldSeries, function(series, idx) {
var oldDataGroupId = globalStore.oldDataGroupIds[idx];
var oldData = globalStore.oldData[idx];
var transitionKey = getSeriesTransitionKey(series);
var transitionKeyStr = convertArraySeriesKeyToString(transitionKey);
oldDataMap.set(transitionKeyStr, {
dataGroupId: oldDataGroupId,
data: oldData
});
if (isArray(transitionKey)) {
each(transitionKey, function(key) {
oldDataMapForSplit.set(key, {
key: transitionKeyStr,
dataGroupId: oldDataGroupId,
data: oldData
});
});
}
});
each(params.updatedSeries, function(series) {
if (series.isUniversalTransitionEnabled() && series.isAnimationEnabled()) {
var newDataGroupId = series.get("dataGroupId");
var newData = series.getData();
var transitionKey = getSeriesTransitionKey(series);
var transitionKeyStr = convertArraySeriesKeyToString(transitionKey);
var oldData = oldDataMap.get(transitionKeyStr);
if (oldData) {
updateBatches.set(transitionKeyStr, {
oldSeries: [{
dataGroupId: oldData.dataGroupId,
divide: getDivideShapeFromData(oldData.data),
data: oldData.data
}],
newSeries: [{
dataGroupId: newDataGroupId,
divide: getDivideShapeFromData(newData),
data: newData
}]
});
} else {
if (isArray(transitionKey)) {
var oldSeries_1 = [];
each(transitionKey, function(key) {
var oldData2 = oldDataMap.get(key);
if (oldData2.data) {
oldSeries_1.push({
dataGroupId: oldData2.dataGroupId,
divide: getDivideShapeFromData(oldData2.data),
data: oldData2.data
});
}
});
if (oldSeries_1.length) {
updateBatches.set(transitionKeyStr, {
oldSeries: oldSeries_1,
newSeries: [{
dataGroupId: newDataGroupId,
data: newData,
divide: getDivideShapeFromData(newData)
}]
});
}
} else {
var oldData_1 = oldDataMapForSplit.get(transitionKey);
if (oldData_1) {
var batch = updateBatches.get(oldData_1.key);
if (!batch) {
batch = {
oldSeries: [{
dataGroupId: oldData_1.dataGroupId,
data: oldData_1.data,
divide: getDivideShapeFromData(oldData_1.data)
}],
newSeries: []
};
updateBatches.set(oldData_1.key, batch);
}
batch.newSeries.push({
dataGroupId: newDataGroupId,
data: newData,
divide: getDivideShapeFromData(newData)
});
}
}
}
}
});
return updateBatches;
}
function querySeries(series, finder) {
for (var i = 0; i < series.length; i++) {
var found = finder.seriesIndex != null && finder.seriesIndex === series[i].seriesIndex || finder.seriesId != null && finder.seriesId === series[i].id;
if (found) {
return i;
}
}
}
function transitionSeriesFromOpt(transitionOpt, globalStore, params, api) {
var from = [];
var to = [];
each(normalizeToArray(transitionOpt.from), function(finder) {
var idx = querySeries(globalStore.oldSeries, finder);
if (idx >= 0) {
from.push({
dataGroupId: globalStore.oldDataGroupIds[idx],
data: globalStore.oldData[idx],
divide: getDivideShapeFromData(globalStore.oldData[idx]),
dim: finder.dimension
});
}
});
each(normalizeToArray(transitionOpt.to), function(finder) {
var idx = querySeries(params.updatedSeries, finder);
if (idx >= 0) {
var data = params.updatedSeries[idx].getData();
to.push({
dataGroupId: globalStore.oldDataGroupIds[idx],
data,
divide: getDivideShapeFromData(data),
dim: finder.dimension
});
}
});
if (from.length > 0 && to.length > 0) {
transitionBetween(from, to, api);
}
}
function installUniversalTransition(registers) {
registers.registerUpdateLifecycle("series:beforeupdate", function(ecMOdel, api, params) {
each(normalizeToArray(params.seriesTransition), function(transOpt) {
each(normalizeToArray(transOpt.to), function(finder) {
var series = params.updatedSeries;
for (var i = 0; i < series.length; i++) {
if (finder.seriesIndex != null && finder.seriesIndex === series[i].seriesIndex || finder.seriesId != null && finder.seriesId === series[i].id) {
series[i][SERIES_UNIVERSAL_TRANSITION_PROP] = true;
}
}
});
});
});
registers.registerUpdateLifecycle("series:transition", function(ecModel, api, params) {
var globalStore = getUniversalTransitionGlobalStore(api);
if (globalStore.oldSeries && params.updatedSeries && params.optionChanged) {
var transitionOpt = params.seriesTransition;
if (transitionOpt) {
each(normalizeToArray(transitionOpt), function(opt) {
transitionSeriesFromOpt(opt, globalStore, params, api);
});
} else {
var updateBatches_1 = findTransitionSeriesBatches(globalStore, params);
each(updateBatches_1.keys(), function(key) {
var batch = updateBatches_1.get(key);
transitionBetween(batch.oldSeries, batch.newSeries, api);
});
}
each(params.updatedSeries, function(series) {
if (series[SERIES_UNIVERSAL_TRANSITION_PROP]) {
series[SERIES_UNIVERSAL_TRANSITION_PROP] = false;
}
});
}
var allSeries = ecModel.getSeries();
var savedSeries = globalStore.oldSeries = [];
var savedDataGroupIds = globalStore.oldDataGroupIds = [];
var savedData = globalStore.oldData = [];
for (var i = 0; i < allSeries.length; i++) {
var data = allSeries[i].getData();
if (data.count() < DATA_COUNT_THRESHOLD) {
savedSeries.push(allSeries[i]);
savedDataGroupIds.push(allSeries[i].get("dataGroupId"));
savedData.push(data);
}
}
});
}
export { installUniversalTransition };