import { bC as isString, bD as reduce, bE as map$1, bF as assert, bG as isArray$1, bH as isObject$3, bI as createHashMap, bJ as each$f, bK as indexOf, bL as isNumber, bM as isStringSafe, bN as env, bO as __extends, bP as inherits, bQ as extend, bR as isFunction, bS as Path, bT as liftColor, bU as isArrayLike, bV as keys, bW as retrieve2, bX as ZRImage, bY as createFromString, bZ as mergePath$1, b_ as subPixelOptimize$1, b$ as Transformable, c0 as invert, c1 as applyTransform$1, c2 as defaults, c3 as identity, c4 as mul, c5 as hasOwn, c6 as subPixelOptimizeLine$1, c7 as subPixelOptimizeRect$1, c8 as extendFromString, c9 as Circle, ca as Ellipse, cb as Sector, cc as Ring, cd as Polygon, ce as Polyline$1, cf as Rect$2, cg as Line$1, ch as BezierCurve, ci as Arc, cj as BoundingRect, ck as CompoundPath, cl as Group$3, cm as IncrementalDisplayable, cn as LinearGradient, co as OrientedBoundingRect, cp as Point, cq as RadialGradient, cr as ZRText, cs as trim$1, ct as merge, cu as clone$1, cv as mixin, cw as normalizeCssArray$1, cx as encodeHTML, cy as curry$1, cz as isTypedArray, cA as filter, cB as bind$1, cC as setAsPrimitive, cD as concatArray, cE as noop, cF as calculateTextPosition, cG as WeakMap, cH as LRU, cI as platformApi, cJ as brushSingle, cK as Eventful, cL as init$2, cM as sort$2, cN as registerSSRDataGetter, cO as slice, cP as parsePercent$1, cQ as eqNaN, cR as registerPainter, cS as contain$1, cT as min, cU as max, cV as getBoundingRect, cW as dist, cX as lerp, cY as PathProxy, cZ as quadraticProjectPoint, c_ as cubicProjectPoint, c$ as normalizeRadian, d0 as cubicRootAt, d1 as cubicAt, d2 as lerp$1, d3 as normalizeArcAngles, d4 as retrieve3, d5 as retrieve, d6 as rotate, d7 as find, d8 as isMiddleOrRightButtonOnMouseUpDown, d9 as stop, da as parseXML, db as parseSVG, dc as makeViewBoxTransform, dd as Displayable, de as copy, df as create$1, dg as copy$1, dh as mergeAll, di as fromPoints, dj as translate, dk as scale$1, dl as parse, dm as stringify, dn as fastLerp, dp as modifyAlpha, dq as modifyHSL, dr as clone$2, ds as normalize$3, dt as scale$2, du as create$2, dv as sub, dw as len, dx as set$1, dy as scaleAndAdd$1, dz as quadraticSubdivide, dA as quadraticAt$1, dB as distSquare, dC as clone$3, dD as quadraticDerivativeAt, dE as containStroke, dF as containStroke$1, dG as lift, dH as TRANSFORMABLE_PROPS, dI as cloneValue, dJ as isDom, dK as addEventListener, dL as normalizeEvent, dM as transformLocalCoord, dN as isRegExp, dO as SVGPainter, dP as CanvasPainter, dQ as isCombineMorphing, dR as morphPath, dS as combineMorph, dT as separateMorph, dU as clonePath } from "./.pnpm.BW3P1y8f.js"; var RADIAN_EPSILON = 1e-4; var ROUND_SUPPORTED_PRECISION_MAX = 20; function _trim(str) { return str.replace(/^\s+|\s+$/g, ""); } function linearMap$2(val, domain, range, clamp2) { var d0 = domain[0]; var d1 = domain[1]; var r0 = range[0]; var r1 = range[1]; var subDomain = d1 - d0; var subRange = r1 - r0; if (subDomain === 0) { return subRange === 0 ? r0 : (r0 + r1) / 2; } if (clamp2) { if (subDomain > 0) { if (val <= d0) { return r0; } else if (val >= d1) { return r1; } } else { if (val >= d0) { return r0; } else if (val <= d1) { return r1; } } } else { if (val === d0) { return r0; } if (val === d1) { return r1; } } return (val - d0) / subDomain * subRange + r0; } function parsePercent(percent, all) { switch (percent) { case "center": case "middle": percent = "50%"; break; case "left": case "top": percent = "0%"; break; case "right": case "bottom": percent = "100%"; break; } if (isString(percent)) { if (_trim(percent).match(/%$/)) { return parseFloat(percent) / 100 * all; } return parseFloat(percent); } return percent == null ? NaN : +percent; } function round$1(x, precision, returnStr) { if (precision == null) { precision = 10; } precision = Math.min(Math.max(0, precision), ROUND_SUPPORTED_PRECISION_MAX); x = (+x).toFixed(precision); return returnStr ? x : +x; } function asc$2(arr) { arr.sort(function(a, b) { return a - b; }); return arr; } function getPrecision(val) { val = +val; if (isNaN(val)) { return 0; } if (val > 1e-14) { var e = 1; for (var i = 0; i < 15; i++, e *= 10) { if (Math.round(val * e) / e === val) { return i; } } } return getPrecisionSafe(val); } function getPrecisionSafe(val) { var str = val.toString().toLowerCase(); var eIndex = str.indexOf("e"); var exp = eIndex > 0 ? +str.slice(eIndex + 1) : 0; var significandPartLen = eIndex > 0 ? eIndex : str.length; var dotIndex = str.indexOf("."); var decimalPartLen = dotIndex < 0 ? 0 : significandPartLen - 1 - dotIndex; return Math.max(0, decimalPartLen - exp); } function getPixelPrecision(dataExtent, pixelExtent) { var log = Math.log; var LN10 = Math.LN10; var dataQuantity = Math.floor(log(dataExtent[1] - dataExtent[0]) / LN10); var sizeQuantity = Math.round(log(Math.abs(pixelExtent[1] - pixelExtent[0])) / LN10); var precision = Math.min(Math.max(-dataQuantity + sizeQuantity, 0), 20); return !isFinite(precision) ? 20 : precision; } function getPercentSeats(valueList, precision) { var sum2 = reduce(valueList, function(acc, val) { return acc + (isNaN(val) ? 0 : val); }, 0); if (sum2 === 0) { return []; } var digits = Math.pow(10, precision); var votesPerQuota = map$1(valueList, function(val) { return (isNaN(val) ? 0 : val) / sum2 * digits * 100; }); var targetSeats = digits * 100; var seats = map$1(votesPerQuota, function(votes) { return Math.floor(votes); }); var currentSum = reduce(seats, function(acc, val) { return acc + val; }, 0); var remainder = map$1(votesPerQuota, function(votes, idx) { return votes - seats[idx]; }); while (currentSum < targetSeats) { var max2 = Number.NEGATIVE_INFINITY; var maxId = null; for (var i = 0, len2 = remainder.length; i < len2; ++i) { if (remainder[i] > max2) { max2 = remainder[i]; maxId = i; } } ++seats[maxId]; remainder[maxId] = 0; ++currentSum; } return map$1(seats, function(seat) { return seat / digits; }); } function addSafe(val0, val1) { var maxPrecision = Math.max(getPrecision(val0), getPrecision(val1)); var sum2 = val0 + val1; return maxPrecision > ROUND_SUPPORTED_PRECISION_MAX ? sum2 : round$1(sum2, maxPrecision); } var MAX_SAFE_INTEGER = 9007199254740991; function remRadian(radian) { var pi2 = Math.PI * 2; return (radian % pi2 + pi2) % pi2; } function isRadianAroundZero(val) { return val > -RADIAN_EPSILON && val < RADIAN_EPSILON; } var TIME_REG = /^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d{1,2})(?::(\d{1,2})(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/; function parseDate(value) { if (value instanceof Date) { return value; } else if (isString(value)) { var match = TIME_REG.exec(value); if (!match) { return /* @__PURE__ */ new Date(NaN); } if (!match[8]) { return new Date(+match[1], +(match[2] || 1) - 1, +match[3] || 1, +match[4] || 0, +(match[5] || 0), +match[6] || 0, match[7] ? +match[7].substring(0, 3) : 0); } else { var hour = +match[4] || 0; if (match[8].toUpperCase() !== "Z") { hour -= +match[8].slice(0, 3); } return new Date(Date.UTC(+match[1], +(match[2] || 1) - 1, +match[3] || 1, hour, +(match[5] || 0), +match[6] || 0, match[7] ? +match[7].substring(0, 3) : 0)); } } else if (value == null) { return /* @__PURE__ */ new Date(NaN); } return new Date(Math.round(value)); } function quantity(val) { return Math.pow(10, quantityExponent(val)); } function quantityExponent(val) { if (val === 0) { return 0; } var exp = Math.floor(Math.log(val) / Math.LN10); if (val / Math.pow(10, exp) >= 10) { exp++; } return exp; } function nice(val, round2) { var exponent = quantityExponent(val); var exp10 = Math.pow(10, exponent); var f = val / exp10; var nf; { if (f < 1.5) { nf = 1; } else if (f < 2.5) { nf = 2; } else if (f < 4) { nf = 3; } else if (f < 7) { nf = 5; } else { nf = 10; } } val = nf * exp10; return exponent >= -20 ? +val.toFixed(exponent < 0 ? -exponent : 0) : val; } function quantile(ascArr, p) { var H = (ascArr.length - 1) * p + 1; var h = Math.floor(H); var v = +ascArr[h - 1]; var e = H - h; return e ? v + e * (ascArr[h] - v) : v; } function reformIntervals(list) { list.sort(function(a, b) { return littleThan2(a, b, 0) ? -1 : 1; }); var curr = -Infinity; var currClose = 1; for (var i = 0; i < list.length; ) { var interval = list[i].interval; var close_1 = list[i].close; for (var lg = 0; lg < 2; lg++) { if (interval[lg] <= curr) { interval[lg] = curr; close_1[lg] = !lg ? 1 - currClose : 1; } curr = interval[lg]; currClose = close_1[lg]; } if (interval[0] === interval[1] && close_1[0] * close_1[1] !== 1) { list.splice(i, 1); } else { i++; } } return list; function littleThan2(a, b, lg2) { return a.interval[lg2] < b.interval[lg2] || a.interval[lg2] === b.interval[lg2] && (a.close[lg2] - b.close[lg2] === (!lg2 ? 1 : -1) || !lg2 && littleThan2(a, b, 1)); } } function numericToNumber(val) { var valFloat = parseFloat(val); return valFloat == val && (valFloat !== 0 || !isString(val) || val.indexOf("x") <= 0) ? valFloat : NaN; } function isNumeric(val) { return !isNaN(numericToNumber(val)); } function getRandomIdBase() { return Math.round(Math.random() * 9); } function getGreatestCommonDividor(a, b) { if (b === 0) { return a; } return getGreatestCommonDividor(b, a % b); } function getLeastCommonMultiple(a, b) { if (a == null) { return b; } if (b == null) { return a; } return a * b / getGreatestCommonDividor(a, b); } function throwError(msg) { throw new Error(msg); } function interpolateNumber(p0, p1, percent) { return (p1 - p0) * percent + p0; } var DUMMY_COMPONENT_NAME_PREFIX = "series\0"; var INTERNAL_COMPONENT_ID_PREFIX = "\0_ec_\0"; function normalizeToArray(value) { return value instanceof Array ? value : value == null ? [] : [value]; } function defaultEmphasis(opt, key, subOpts) { if (opt) { opt[key] = opt[key] || {}; opt.emphasis = opt.emphasis || {}; opt.emphasis[key] = opt.emphasis[key] || {}; for (var i = 0, len2 = subOpts.length; i < len2; i++) { var subOptName = subOpts[i]; if (!opt.emphasis[key].hasOwnProperty(subOptName) && opt[key].hasOwnProperty(subOptName)) { opt.emphasis[key][subOptName] = opt[key][subOptName]; } } } } var TEXT_STYLE_OPTIONS = ["fontStyle", "fontWeight", "fontSize", "fontFamily", "rich", "tag", "color", "textBorderColor", "textBorderWidth", "width", "height", "lineHeight", "align", "verticalAlign", "baseline", "shadowColor", "shadowBlur", "shadowOffsetX", "shadowOffsetY", "textShadowColor", "textShadowBlur", "textShadowOffsetX", "textShadowOffsetY", "backgroundColor", "borderColor", "borderWidth", "borderRadius", "padding"]; function getDataItemValue(dataItem) { return isObject$3(dataItem) && !isArray$1(dataItem) && !(dataItem instanceof Date) ? dataItem.value : dataItem; } function isDataItemOption(dataItem) { return isObject$3(dataItem) && !(dataItem instanceof Array); } function mappingToExists(existings, newCmptOptions, mode) { var isNormalMergeMode = mode === "normalMerge"; var isReplaceMergeMode = mode === "replaceMerge"; var isReplaceAllMode = mode === "replaceAll"; existings = existings || []; newCmptOptions = (newCmptOptions || []).slice(); var existingIdIdxMap = createHashMap(); each$f(newCmptOptions, function(cmptOption, index) { if (!isObject$3(cmptOption)) { newCmptOptions[index] = null; return; } }); var result = prepareResult(existings, existingIdIdxMap, mode); if (isNormalMergeMode || isReplaceMergeMode) { mappingById(result, existings, existingIdIdxMap, newCmptOptions); } if (isNormalMergeMode) { mappingByName(result, newCmptOptions); } if (isNormalMergeMode || isReplaceMergeMode) { mappingByIndex(result, newCmptOptions, isReplaceMergeMode); } else if (isReplaceAllMode) { mappingInReplaceAllMode(result, newCmptOptions); } makeIdAndName(result); return result; } function prepareResult(existings, existingIdIdxMap, mode) { var result = []; if (mode === "replaceAll") { return result; } for (var index = 0; index < existings.length; index++) { var existing = existings[index]; if (existing && existing.id != null) { existingIdIdxMap.set(existing.id, index); } result.push({ existing: mode === "replaceMerge" || isComponentIdInternal(existing) ? null : existing, newOption: null, keyInfo: null, brandNew: null }); } return result; } function mappingById(result, existings, existingIdIdxMap, newCmptOptions) { each$f(newCmptOptions, function(cmptOption, index) { if (!cmptOption || cmptOption.id == null) { return; } var optionId = makeComparableKey(cmptOption.id); var existingIdx = existingIdIdxMap.get(optionId); if (existingIdx != null) { var resultItem = result[existingIdx]; assert(!resultItem.newOption, 'Duplicated option on id "' + optionId + '".'); resultItem.newOption = cmptOption; resultItem.existing = existings[existingIdx]; newCmptOptions[index] = null; } }); } function mappingByName(result, newCmptOptions) { each$f(newCmptOptions, function(cmptOption, index) { if (!cmptOption || cmptOption.name == null) { return; } for (var i = 0; i < result.length; i++) { var existing = result[i].existing; if (!result[i].newOption && existing && (existing.id == null || cmptOption.id == null) && !isComponentIdInternal(cmptOption) && !isComponentIdInternal(existing) && keyExistAndEqual("name", existing, cmptOption)) { result[i].newOption = cmptOption; newCmptOptions[index] = null; return; } } }); } function mappingByIndex(result, newCmptOptions, brandNew) { each$f(newCmptOptions, function(cmptOption) { if (!cmptOption) { return; } var resultItem; var nextIdx = 0; while ( // Be `!resultItem` only when `nextIdx >= result.length`. (resultItem = result[nextIdx]) && (resultItem.newOption || isComponentIdInternal(resultItem.existing) || // In mode "replaceMerge", here no not-mapped-non-internal-existing. resultItem.existing && cmptOption.id != null && !keyExistAndEqual("id", cmptOption, resultItem.existing)) ) { nextIdx++; } if (resultItem) { resultItem.newOption = cmptOption; resultItem.brandNew = brandNew; } else { result.push({ newOption: cmptOption, brandNew, existing: null, keyInfo: null }); } nextIdx++; }); } function mappingInReplaceAllMode(result, newCmptOptions) { each$f(newCmptOptions, function(cmptOption) { result.push({ newOption: cmptOption, brandNew: true, existing: null, keyInfo: null }); }); } function makeIdAndName(mapResult) { var idMap = createHashMap(); each$f(mapResult, function(item) { var existing = item.existing; existing && idMap.set(existing.id, item); }); each$f(mapResult, function(item) { var opt = item.newOption; assert(!opt || opt.id == null || !idMap.get(opt.id) || idMap.get(opt.id) === item, "id duplicates: " + (opt && opt.id)); opt && opt.id != null && idMap.set(opt.id, item); !item.keyInfo && (item.keyInfo = {}); }); each$f(mapResult, function(item, index) { var existing = item.existing; var opt = item.newOption; var keyInfo = item.keyInfo; if (!isObject$3(opt)) { return; } keyInfo.name = opt.name != null ? makeComparableKey(opt.name) : existing ? existing.name : DUMMY_COMPONENT_NAME_PREFIX + index; if (existing) { keyInfo.id = makeComparableKey(existing.id); } else if (opt.id != null) { keyInfo.id = makeComparableKey(opt.id); } else { var idNum = 0; do { keyInfo.id = "\0" + keyInfo.name + "\0" + idNum++; } while (idMap.get(keyInfo.id)); } idMap.set(keyInfo.id, item); }); } function keyExistAndEqual(attr, obj1, obj2) { var key1 = convertOptionIdName(obj1[attr], null); var key2 = convertOptionIdName(obj2[attr], null); return key1 != null && key2 != null && key1 === key2; } function makeComparableKey(val) { return convertOptionIdName(val, ""); } function convertOptionIdName(idOrName, defaultValue) { if (idOrName == null) { return defaultValue; } return isString(idOrName) ? idOrName : isNumber(idOrName) || isStringSafe(idOrName) ? idOrName + "" : defaultValue; } function isNameSpecified(componentModel) { var name = componentModel.name; return !!(name && name.indexOf(DUMMY_COMPONENT_NAME_PREFIX)); } function isComponentIdInternal(cmptOption) { return cmptOption && cmptOption.id != null && makeComparableKey(cmptOption.id).indexOf(INTERNAL_COMPONENT_ID_PREFIX) === 0; } function makeInternalComponentId(idSuffix) { return INTERNAL_COMPONENT_ID_PREFIX + idSuffix; } function setComponentTypeToKeyInfo(mappingResult, mainType, componentModelCtor) { each$f(mappingResult, function(item) { var newOption = item.newOption; if (isObject$3(newOption)) { item.keyInfo.mainType = mainType; item.keyInfo.subType = determineSubType(mainType, newOption, item.existing, componentModelCtor); } }); } function determineSubType(mainType, newCmptOption, existComponent, componentModelCtor) { var subType = newCmptOption.type ? newCmptOption.type : existComponent ? existComponent.subType : componentModelCtor.determineSubType(mainType, newCmptOption); return subType; } function compressBatches(batchA, batchB) { var mapA = {}; var mapB = {}; makeMap(batchA || [], mapA); makeMap(batchB || [], mapB, mapA); return [mapToArray(mapA), mapToArray(mapB)]; function makeMap(sourceBatch, map2, otherMap) { for (var i = 0, len2 = sourceBatch.length; i < len2; i++) { var seriesId = convertOptionIdName(sourceBatch[i].seriesId, null); if (seriesId == null) { return; } var dataIndices = normalizeToArray(sourceBatch[i].dataIndex); var otherDataIndices = otherMap && otherMap[seriesId]; for (var j = 0, lenj = dataIndices.length; j < lenj; j++) { var dataIndex = dataIndices[j]; if (otherDataIndices && otherDataIndices[dataIndex]) { otherDataIndices[dataIndex] = null; } else { (map2[seriesId] || (map2[seriesId] = {}))[dataIndex] = 1; } } } } function mapToArray(map2, isData) { var result = []; for (var i in map2) { if (map2.hasOwnProperty(i) && map2[i] != null) { if (isData) { result.push(+i); } else { var dataIndices = mapToArray(map2[i], true); dataIndices.length && result.push({ seriesId: i, dataIndex: dataIndices }); } } } return result; } } function queryDataIndex(data, payload) { if (payload.dataIndexInside != null) { return payload.dataIndexInside; } else if (payload.dataIndex != null) { return isArray$1(payload.dataIndex) ? map$1(payload.dataIndex, function(value) { return data.indexOfRawIndex(value); }) : data.indexOfRawIndex(payload.dataIndex); } else if (payload.name != null) { return isArray$1(payload.name) ? map$1(payload.name, function(value) { return data.indexOfName(value); }) : data.indexOfName(payload.name); } } function makeInner() { var key = "__ec_inner_" + innerUniqueIndex++; return function(hostObj) { return hostObj[key] || (hostObj[key] = {}); }; } var innerUniqueIndex = getRandomIdBase(); function parseFinder$1(ecModel, finderInput, opt) { var _a2 = preParseFinder(finderInput, opt), mainTypeSpecified = _a2.mainTypeSpecified, queryOptionMap = _a2.queryOptionMap, others = _a2.others; var result = others; var defaultMainType = opt ? opt.defaultMainType : null; if (!mainTypeSpecified && defaultMainType) { queryOptionMap.set(defaultMainType, {}); } queryOptionMap.each(function(queryOption, mainType) { var queryResult = queryReferringComponents(ecModel, mainType, queryOption, { useDefault: defaultMainType === mainType, enableAll: opt && opt.enableAll != null ? opt.enableAll : true, enableNone: opt && opt.enableNone != null ? opt.enableNone : true }); result[mainType + "Models"] = queryResult.models; result[mainType + "Model"] = queryResult.models[0]; }); return result; } function preParseFinder(finderInput, opt) { var finder; if (isString(finderInput)) { var obj = {}; obj[finderInput + "Index"] = 0; finder = obj; } else { finder = finderInput; } var queryOptionMap = createHashMap(); var others = {}; var mainTypeSpecified = false; each$f(finder, function(value, key) { if (key === "dataIndex" || key === "dataIndexInside") { others[key] = value; return; } var parsedKey = key.match(/^(\w+)(Index|Id|Name)$/) || []; var mainType = parsedKey[1]; var queryType = (parsedKey[2] || "").toLowerCase(); if (!mainType || !queryType || opt && opt.includeMainTypes && indexOf(opt.includeMainTypes, mainType) < 0) { return; } mainTypeSpecified = mainTypeSpecified || !!mainType; var queryOption = queryOptionMap.get(mainType) || queryOptionMap.set(mainType, {}); queryOption[queryType] = value; }); return { mainTypeSpecified, queryOptionMap, others }; } var SINGLE_REFERRING = { useDefault: true, enableAll: false, enableNone: false }; var MULTIPLE_REFERRING = { useDefault: false, enableAll: true, enableNone: true }; function queryReferringComponents(ecModel, mainType, userOption, opt) { opt = opt || SINGLE_REFERRING; var indexOption = userOption.index; var idOption = userOption.id; var nameOption = userOption.name; var result = { models: null, specified: indexOption != null || idOption != null || nameOption != null }; if (!result.specified) { var firstCmpt = void 0; result.models = opt.useDefault && (firstCmpt = ecModel.getComponent(mainType)) ? [firstCmpt] : []; return result; } if (indexOption === "none" || indexOption === false) { assert(opt.enableNone, '`"none"` or `false` is not a valid value on index option.'); result.models = []; return result; } if (indexOption === "all") { assert(opt.enableAll, '`"all"` is not a valid value on index option.'); indexOption = idOption = nameOption = null; } result.models = ecModel.queryComponents({ mainType, index: indexOption, id: idOption, name: nameOption }); return result; } function setAttribute(dom, key, value) { dom.setAttribute ? dom.setAttribute(key, value) : dom[key] = value; } function getAttribute(dom, key) { return dom.getAttribute ? dom.getAttribute(key) : dom[key]; } function getTooltipRenderMode(renderModeOption) { if (renderModeOption === "auto") { return env.domSupported ? "html" : "richText"; } else { return renderModeOption || "html"; } } function groupData(array, getKey2) { var buckets = createHashMap(); var keys2 = []; each$f(array, function(item) { var key = getKey2(item); (buckets.get(key) || (keys2.push(key), buckets.set(key, []))).push(item); }); return { keys: keys2, buckets }; } function interpolateRawValues(data, precision, sourceValue, targetValue, percent) { var isAutoPrecision = precision == null || precision === "auto"; if (targetValue == null) { return targetValue; } if (isNumber(targetValue)) { var value = interpolateNumber(sourceValue || 0, targetValue, percent); return round$1(value, isAutoPrecision ? Math.max(getPrecision(sourceValue || 0), getPrecision(targetValue)) : precision); } else if (isString(targetValue)) { return percent < 1 ? sourceValue : targetValue; } else { var interpolated = []; var leftArr = sourceValue; var rightArr = targetValue; var length_1 = Math.max(leftArr ? leftArr.length : 0, rightArr.length); for (var i = 0; i < length_1; ++i) { var info = data.getDimensionInfo(i); if (info && info.type === "ordinal") { interpolated[i] = (percent < 1 && leftArr ? leftArr : rightArr)[i]; } else { var leftVal = leftArr && leftArr[i] ? leftArr[i] : 0; var rightVal = rightArr[i]; var value = interpolateNumber(leftVal, rightVal, percent); interpolated[i] = round$1(value, isAutoPrecision ? Math.max(getPrecision(leftVal), getPrecision(rightVal)) : precision); } } return interpolated; } } var TYPE_DELIMITER = "."; var IS_CONTAINER = "___EC__COMPONENT__CONTAINER___"; var IS_EXTENDED_CLASS = "___EC__EXTENDED_CLASS___"; function parseClassType(componentType) { var ret = { main: "", sub: "" }; if (componentType) { var typeArr = componentType.split(TYPE_DELIMITER); ret.main = typeArr[0] || ""; ret.sub = typeArr[1] || ""; } return ret; } function checkClassType(componentType) { assert(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(componentType), 'componentType "' + componentType + '" illegal'); } function isExtendedClass(clz) { return !!(clz && clz[IS_EXTENDED_CLASS]); } function enableClassExtend(rootClz, mandatoryMethods) { rootClz.$constructor = rootClz; rootClz.extend = function(proto2) { var superClass = this; var ExtendedClass; if (isESClass(superClass)) { ExtendedClass = /** @class */ (function(_super) { __extends(class_1, _super); function class_1() { return _super.apply(this, arguments) || this; } return class_1; })(superClass); } else { ExtendedClass = function() { (proto2.$constructor || superClass).apply(this, arguments); }; inherits(ExtendedClass, this); } extend(ExtendedClass.prototype, proto2); ExtendedClass[IS_EXTENDED_CLASS] = true; ExtendedClass.extend = this.extend; ExtendedClass.superCall = superCall; ExtendedClass.superApply = superApply; ExtendedClass.superClass = superClass; return ExtendedClass; }; } function isESClass(fn) { return isFunction(fn) && /^class\s/.test(Function.prototype.toString.call(fn)); } function mountExtend(SubClz, SupperClz) { SubClz.extend = SupperClz.extend; } var classBase = Math.round(Math.random() * 10); function enableClassCheck(target) { var classAttr = ["__\0is_clz", classBase++].join("_"); target.prototype[classAttr] = true; target.isInstance = function(obj) { return !!(obj && obj[classAttr]); }; } function superCall(context, methodName) { var args = []; for (var _i = 2; _i < arguments.length; _i++) { args[_i - 2] = arguments[_i]; } return this.superClass.prototype[methodName].apply(context, args); } function superApply(context, methodName, args) { return this.superClass.prototype[methodName].apply(context, args); } function enableClassManagement(target) { var storage2 = {}; target.registerClass = function(clz) { var componentFullType = clz.type || clz.prototype.type; if (componentFullType) { checkClassType(componentFullType); clz.prototype.type = componentFullType; var componentTypeInfo = parseClassType(componentFullType); if (!componentTypeInfo.sub) { storage2[componentTypeInfo.main] = clz; } else if (componentTypeInfo.sub !== IS_CONTAINER) { var container = makeContainer(componentTypeInfo); container[componentTypeInfo.sub] = clz; } } return clz; }; target.getClass = function(mainType, subType, throwWhenNotFound) { var clz = storage2[mainType]; if (clz && clz[IS_CONTAINER]) { clz = subType ? clz[subType] : null; } if (throwWhenNotFound && !clz) { throw new Error(!subType ? mainType + ".type should be specified." : "Component " + mainType + "." + (subType || "") + " is used but not imported."); } return clz; }; target.getClassesByMainType = function(componentType) { var componentTypeInfo = parseClassType(componentType); var result = []; var obj = storage2[componentTypeInfo.main]; if (obj && obj[IS_CONTAINER]) { each$f(obj, function(o, type) { type !== IS_CONTAINER && result.push(o); }); } else { result.push(obj); } return result; }; target.hasClass = function(componentType) { var componentTypeInfo = parseClassType(componentType); return !!storage2[componentTypeInfo.main]; }; target.getAllClassMainTypes = function() { var types = []; each$f(storage2, function(obj, type) { types.push(type); }); return types; }; target.hasSubTypes = function(componentType) { var componentTypeInfo = parseClassType(componentType); var obj = storage2[componentTypeInfo.main]; return obj && obj[IS_CONTAINER]; }; function makeContainer(componentTypeInfo) { var container = storage2[componentTypeInfo.main]; if (!container || !container[IS_CONTAINER]) { container = storage2[componentTypeInfo.main] = {}; container[IS_CONTAINER] = true; } return container; } } function makeStyleMapper(properties, ignoreParent) { for (var i = 0; i < properties.length; i++) { if (!properties[i][1]) { properties[i][1] = properties[i][0]; } } ignoreParent = ignoreParent || false; return function(model, excludes, includes) { var style = {}; for (var i2 = 0; i2 < properties.length; i2++) { var propName = properties[i2][1]; if (excludes && indexOf(excludes, propName) >= 0 || includes && indexOf(includes, propName) < 0) { continue; } var val = model.getShallow(propName, ignoreParent); if (val != null) { style[properties[i2][0]] = val; } } return style; }; } var AREA_STYLE_KEY_MAP = [ ["fill", "color"], ["shadowBlur"], ["shadowOffsetX"], ["shadowOffsetY"], ["opacity"], ["shadowColor"] // Option decal is in `DecalObject` but style.decal is in `PatternObject`. // So do not transfer decal directly. ]; var getAreaStyle = makeStyleMapper(AREA_STYLE_KEY_MAP); var AreaStyleMixin = ( /** @class */ (function() { function AreaStyleMixin2() { } AreaStyleMixin2.prototype.getAreaStyle = function(excludes, includes) { return getAreaStyle(this, excludes, includes); }; return AreaStyleMixin2; })() ); var getECData = makeInner(); var setCommonECData = function(seriesIndex, dataType, dataIdx, el) { if (el) { var ecData = getECData(el); ecData.dataIndex = dataIdx; ecData.dataType = dataType; ecData.seriesIndex = seriesIndex; ecData.ssrType = "chart"; if (el.type === "group") { el.traverse(function(child) { var childECData = getECData(child); childECData.seriesIndex = seriesIndex; childECData.dataIndex = dataIdx; childECData.dataType = dataType; childECData.ssrType = "chart"; }); } } }; var _highlightNextDigit = 1; var _highlightKeyMap = {}; var getSavedStates = makeInner(); var getComponentStates = makeInner(); var HOVER_STATE_NORMAL = 0; var HOVER_STATE_BLUR = 1; var HOVER_STATE_EMPHASIS = 2; var SPECIAL_STATES = ["emphasis", "blur", "select"]; var DISPLAY_STATES = ["normal", "emphasis", "blur", "select"]; var Z2_EMPHASIS_LIFT = 10; var Z2_SELECT_LIFT = 9; var HIGHLIGHT_ACTION_TYPE = "highlight"; var DOWNPLAY_ACTION_TYPE = "downplay"; var SELECT_ACTION_TYPE = "select"; var UNSELECT_ACTION_TYPE = "unselect"; var TOGGLE_SELECT_ACTION_TYPE = "toggleSelect"; function hasFillOrStroke(fillOrStroke) { return fillOrStroke != null && fillOrStroke !== "none"; } function doChangeHoverState(el, stateName, hoverStateEnum) { if (el.onHoverStateChange && (el.hoverState || 0) !== hoverStateEnum) { el.onHoverStateChange(stateName); } el.hoverState = hoverStateEnum; } function singleEnterEmphasis(el) { doChangeHoverState(el, "emphasis", HOVER_STATE_EMPHASIS); } function singleLeaveEmphasis(el) { if (el.hoverState === HOVER_STATE_EMPHASIS) { doChangeHoverState(el, "normal", HOVER_STATE_NORMAL); } } function singleEnterBlur(el) { doChangeHoverState(el, "blur", HOVER_STATE_BLUR); } function singleLeaveBlur(el) { if (el.hoverState === HOVER_STATE_BLUR) { doChangeHoverState(el, "normal", HOVER_STATE_NORMAL); } } function singleEnterSelect(el) { el.selected = true; } function singleLeaveSelect(el) { el.selected = false; } function updateElementState(el, updater, commonParam) { updater(el, commonParam); } function traverseUpdateState(el, updater, commonParam) { updateElementState(el, updater, commonParam); el.isGroup && el.traverse(function(child) { updateElementState(child, updater, commonParam); }); } function setStatesFlag(el, stateName) { switch (stateName) { case "emphasis": el.hoverState = HOVER_STATE_EMPHASIS; break; case "normal": el.hoverState = HOVER_STATE_NORMAL; break; case "blur": el.hoverState = HOVER_STATE_BLUR; break; case "select": el.selected = true; } } function getFromStateStyle(el, props, toStateName, defaultValue) { var style = el.style; var fromState = {}; for (var i = 0; i < props.length; i++) { var propName = props[i]; var val = style[propName]; fromState[propName] = val == null ? defaultValue && defaultValue[propName] : val; } for (var i = 0; i < el.animators.length; i++) { var animator = el.animators[i]; if (animator.__fromStateTransition && animator.__fromStateTransition.indexOf(toStateName) < 0 && animator.targetName === "style") { animator.saveTo(fromState, props); } } return fromState; } function createEmphasisDefaultState(el, stateName, targetStates, state) { var hasSelect = targetStates && indexOf(targetStates, "select") >= 0; var cloned = false; if (el instanceof Path) { var store = getSavedStates(el); var fromFill = hasSelect ? store.selectFill || store.normalFill : store.normalFill; var fromStroke = hasSelect ? store.selectStroke || store.normalStroke : store.normalStroke; if (hasFillOrStroke(fromFill) || hasFillOrStroke(fromStroke)) { state = state || {}; var emphasisStyle = state.style || {}; if (emphasisStyle.fill === "inherit") { cloned = true; state = extend({}, state); emphasisStyle = extend({}, emphasisStyle); emphasisStyle.fill = fromFill; } else if (!hasFillOrStroke(emphasisStyle.fill) && hasFillOrStroke(fromFill)) { cloned = true; state = extend({}, state); emphasisStyle = extend({}, emphasisStyle); emphasisStyle.fill = liftColor(fromFill); } else if (!hasFillOrStroke(emphasisStyle.stroke) && hasFillOrStroke(fromStroke)) { if (!cloned) { state = extend({}, state); emphasisStyle = extend({}, emphasisStyle); } emphasisStyle.stroke = liftColor(fromStroke); } state.style = emphasisStyle; } } if (state) { if (state.z2 == null) { if (!cloned) { state = extend({}, state); } var z2EmphasisLift = el.z2EmphasisLift; state.z2 = el.z2 + (z2EmphasisLift != null ? z2EmphasisLift : Z2_EMPHASIS_LIFT); } } return state; } function createSelectDefaultState(el, stateName, state) { if (state) { if (state.z2 == null) { state = extend({}, state); var z2SelectLift = el.z2SelectLift; state.z2 = el.z2 + (z2SelectLift != null ? z2SelectLift : Z2_SELECT_LIFT); } } return state; } function createBlurDefaultState(el, stateName, state) { var hasBlur = indexOf(el.currentStates, stateName) >= 0; var currentOpacity = el.style.opacity; var fromState = !hasBlur ? getFromStateStyle(el, ["opacity"], stateName, { opacity: 1 }) : null; state = state || {}; var blurStyle = state.style || {}; if (blurStyle.opacity == null) { state = extend({}, state); blurStyle = extend({ // Already being applied 'emphasis'. DON'T mul opacity multiple times. opacity: hasBlur ? currentOpacity : fromState.opacity * 0.1 }, blurStyle); state.style = blurStyle; } return state; } function elementStateProxy(stateName, targetStates) { var state = this.states[stateName]; if (this.style) { if (stateName === "emphasis") { return createEmphasisDefaultState(this, stateName, targetStates, state); } else if (stateName === "blur") { return createBlurDefaultState(this, stateName, state); } else if (stateName === "select") { return createSelectDefaultState(this, stateName, state); } } return state; } function setDefaultStateProxy(el) { el.stateProxy = elementStateProxy; var textContent = el.getTextContent(); var textGuide = el.getTextGuideLine(); if (textContent) { textContent.stateProxy = elementStateProxy; } if (textGuide) { textGuide.stateProxy = elementStateProxy; } } function enterEmphasisWhenMouseOver(el, e) { !shouldSilent(el, e) && !el.__highByOuter && traverseUpdateState(el, singleEnterEmphasis); } function leaveEmphasisWhenMouseOut(el, e) { !shouldSilent(el, e) && !el.__highByOuter && traverseUpdateState(el, singleLeaveEmphasis); } function enterEmphasis(el, highlightDigit) { el.__highByOuter |= 1 << (highlightDigit || 0); traverseUpdateState(el, singleEnterEmphasis); } function leaveEmphasis(el, highlightDigit) { !(el.__highByOuter &= ~(1 << (highlightDigit || 0))) && traverseUpdateState(el, singleLeaveEmphasis); } function enterBlur(el) { traverseUpdateState(el, singleEnterBlur); } function leaveBlur(el) { traverseUpdateState(el, singleLeaveBlur); } function enterSelect(el) { traverseUpdateState(el, singleEnterSelect); } function leaveSelect(el) { traverseUpdateState(el, singleLeaveSelect); } function shouldSilent(el, e) { return el.__highDownSilentOnTouch && e.zrByTouch; } function allLeaveBlur(api) { var model = api.getModel(); var leaveBlurredSeries = []; var allComponentViews = []; model.eachComponent(function(componentType, componentModel) { var componentStates = getComponentStates(componentModel); var isSeries2 = componentType === "series"; var view = isSeries2 ? api.getViewOfSeriesModel(componentModel) : api.getViewOfComponentModel(componentModel); !isSeries2 && allComponentViews.push(view); if (componentStates.isBlured) { view.group.traverse(function(child) { singleLeaveBlur(child); }); isSeries2 && leaveBlurredSeries.push(componentModel); } componentStates.isBlured = false; }); each$f(allComponentViews, function(view) { if (view && view.toggleBlurSeries) { view.toggleBlurSeries(leaveBlurredSeries, false, model); } }); } function blurSeries(targetSeriesIndex, focus, blurScope, api) { var ecModel = api.getModel(); blurScope = blurScope || "coordinateSystem"; function leaveBlurOfIndices(data, dataIndices) { for (var i = 0; i < dataIndices.length; i++) { var itemEl = data.getItemGraphicEl(dataIndices[i]); itemEl && leaveBlur(itemEl); } } if (targetSeriesIndex == null) { return; } if (!focus || focus === "none") { return; } var targetSeriesModel = ecModel.getSeriesByIndex(targetSeriesIndex); var targetCoordSys = targetSeriesModel.coordinateSystem; if (targetCoordSys && targetCoordSys.master) { targetCoordSys = targetCoordSys.master; } var blurredSeries = []; ecModel.eachSeries(function(seriesModel) { var sameSeries = targetSeriesModel === seriesModel; var coordSys = seriesModel.coordinateSystem; if (coordSys && coordSys.master) { coordSys = coordSys.master; } var sameCoordSys = coordSys && targetCoordSys ? coordSys === targetCoordSys : sameSeries; if (!// Not blur other series if blurScope series (blurScope === "series" && !sameSeries || blurScope === "coordinateSystem" && !sameCoordSys || focus === "series" && sameSeries)) { var view = api.getViewOfSeriesModel(seriesModel); view.group.traverse(function(child) { if (child.__highByOuter && sameSeries && focus === "self") { return; } singleEnterBlur(child); }); if (isArrayLike(focus)) { leaveBlurOfIndices(seriesModel.getData(), focus); } else if (isObject$3(focus)) { var dataTypes = keys(focus); for (var d = 0; d < dataTypes.length; d++) { leaveBlurOfIndices(seriesModel.getData(dataTypes[d]), focus[dataTypes[d]]); } } blurredSeries.push(seriesModel); getComponentStates(seriesModel).isBlured = true; } }); ecModel.eachComponent(function(componentType, componentModel) { if (componentType === "series") { return; } var view = api.getViewOfComponentModel(componentModel); if (view && view.toggleBlurSeries) { view.toggleBlurSeries(blurredSeries, true, ecModel); } }); } function blurComponent(componentMainType, componentIndex, api) { if (componentMainType == null || componentIndex == null) { return; } var componentModel = api.getModel().getComponent(componentMainType, componentIndex); if (!componentModel) { return; } getComponentStates(componentModel).isBlured = true; var view = api.getViewOfComponentModel(componentModel); if (!view || !view.focusBlurEnabled) { return; } view.group.traverse(function(child) { singleEnterBlur(child); }); } function blurSeriesFromHighlightPayload(seriesModel, payload, api) { var seriesIndex = seriesModel.seriesIndex; var data = seriesModel.getData(payload.dataType); if (!data) { return; } var dataIndex = queryDataIndex(data, payload); dataIndex = (isArray$1(dataIndex) ? dataIndex[0] : dataIndex) || 0; var el = data.getItemGraphicEl(dataIndex); if (!el) { var count2 = data.count(); var current = 0; while (!el && current < count2) { el = data.getItemGraphicEl(current++); } } if (el) { var ecData = getECData(el); blurSeries(seriesIndex, ecData.focus, ecData.blurScope, api); } else { var focus_1 = seriesModel.get(["emphasis", "focus"]); var blurScope = seriesModel.get(["emphasis", "blurScope"]); if (focus_1 != null) { blurSeries(seriesIndex, focus_1, blurScope, api); } } } function findComponentHighDownDispatchers(componentMainType, componentIndex, name, api) { var ret = { focusSelf: false, dispatchers: null }; if (componentMainType == null || componentMainType === "series" || componentIndex == null || name == null) { return ret; } var componentModel = api.getModel().getComponent(componentMainType, componentIndex); if (!componentModel) { return ret; } var view = api.getViewOfComponentModel(componentModel); if (!view || !view.findHighDownDispatchers) { return ret; } var dispatchers = view.findHighDownDispatchers(name); var focusSelf; for (var i = 0; i < dispatchers.length; i++) { if (getECData(dispatchers[i]).focus === "self") { focusSelf = true; break; } } return { focusSelf, dispatchers }; } function handleGlobalMouseOverForHighDown(dispatcher, e, api) { var ecData = getECData(dispatcher); var _a2 = findComponentHighDownDispatchers(ecData.componentMainType, ecData.componentIndex, ecData.componentHighDownName, api), dispatchers = _a2.dispatchers, focusSelf = _a2.focusSelf; if (dispatchers) { if (focusSelf) { blurComponent(ecData.componentMainType, ecData.componentIndex, api); } each$f(dispatchers, function(dispatcher2) { return enterEmphasisWhenMouseOver(dispatcher2, e); }); } else { blurSeries(ecData.seriesIndex, ecData.focus, ecData.blurScope, api); if (ecData.focus === "self") { blurComponent(ecData.componentMainType, ecData.componentIndex, api); } enterEmphasisWhenMouseOver(dispatcher, e); } } function handleGlobalMouseOutForHighDown(dispatcher, e, api) { allLeaveBlur(api); var ecData = getECData(dispatcher); var dispatchers = findComponentHighDownDispatchers(ecData.componentMainType, ecData.componentIndex, ecData.componentHighDownName, api).dispatchers; if (dispatchers) { each$f(dispatchers, function(dispatcher2) { return leaveEmphasisWhenMouseOut(dispatcher2, e); }); } else { leaveEmphasisWhenMouseOut(dispatcher, e); } } function toggleSelectionFromPayload(seriesModel, payload, api) { if (!isSelectChangePayload(payload)) { return; } var dataType = payload.dataType; var data = seriesModel.getData(dataType); var dataIndex = queryDataIndex(data, payload); if (!isArray$1(dataIndex)) { dataIndex = [dataIndex]; } seriesModel[payload.type === TOGGLE_SELECT_ACTION_TYPE ? "toggleSelect" : payload.type === SELECT_ACTION_TYPE ? "select" : "unselect"](dataIndex, dataType); } function updateSeriesElementSelection(seriesModel) { var allData = seriesModel.getAllData(); each$f(allData, function(_a2) { var data = _a2.data, type = _a2.type; data.eachItemGraphicEl(function(el, idx) { seriesModel.isSelected(idx, type) ? enterSelect(el) : leaveSelect(el); }); }); } function getAllSelectedIndices(ecModel) { var ret = []; ecModel.eachSeries(function(seriesModel) { var allData = seriesModel.getAllData(); each$f(allData, function(_a2) { _a2.data; var type = _a2.type; var dataIndices = seriesModel.getSelectedDataIndices(); if (dataIndices.length > 0) { var item = { dataIndex: dataIndices, seriesIndex: seriesModel.seriesIndex }; if (type != null) { item.dataType = type; } ret.push(item); } }); }); return ret; } function enableHoverEmphasis(el, focus, blurScope) { setAsHighDownDispatcher(el, true); traverseUpdateState(el, setDefaultStateProxy); enableHoverFocus(el, focus, blurScope); } function disableHoverEmphasis(el) { setAsHighDownDispatcher(el, false); } function toggleHoverEmphasis(el, focus, blurScope, isDisabled) { isDisabled ? disableHoverEmphasis(el) : enableHoverEmphasis(el, focus, blurScope); } function enableHoverFocus(el, focus, blurScope) { var ecData = getECData(el); if (focus != null) { ecData.focus = focus; ecData.blurScope = blurScope; } else if (ecData.focus) { ecData.focus = null; } } var OTHER_STATES = ["emphasis", "blur", "select"]; var defaultStyleGetterMap = { itemStyle: "getItemStyle", lineStyle: "getLineStyle", areaStyle: "getAreaStyle" }; function setStatesStylesFromModel(el, itemModel, styleType, getter) { styleType = styleType || "itemStyle"; for (var i = 0; i < OTHER_STATES.length; i++) { var stateName = OTHER_STATES[i]; var model = itemModel.getModel([stateName, styleType]); var state = el.ensureState(stateName); state.style = getter ? getter(model) : model[defaultStyleGetterMap[styleType]](); } } function setAsHighDownDispatcher(el, asDispatcher) { var disable = asDispatcher === false; var extendedEl = el; if (el.highDownSilentOnTouch) { extendedEl.__highDownSilentOnTouch = el.highDownSilentOnTouch; } if (!disable || extendedEl.__highDownDispatcher) { extendedEl.__highByOuter = extendedEl.__highByOuter || 0; extendedEl.__highDownDispatcher = !disable; } } function isHighDownDispatcher(el) { return !!(el && el.__highDownDispatcher); } function enableComponentHighDownFeatures(el, componentModel, componentHighDownName) { var ecData = getECData(el); ecData.componentMainType = componentModel.mainType; ecData.componentIndex = componentModel.componentIndex; ecData.componentHighDownName = componentHighDownName; } function getHighlightDigit(highlightKey) { var highlightDigit = _highlightKeyMap[highlightKey]; if (highlightDigit == null && _highlightNextDigit <= 32) { highlightDigit = _highlightKeyMap[highlightKey] = _highlightNextDigit++; } return highlightDigit; } function isSelectChangePayload(payload) { var payloadType = payload.type; return payloadType === SELECT_ACTION_TYPE || payloadType === UNSELECT_ACTION_TYPE || payloadType === TOGGLE_SELECT_ACTION_TYPE; } function isHighDownPayload(payload) { var payloadType = payload.type; return payloadType === HIGHLIGHT_ACTION_TYPE || payloadType === DOWNPLAY_ACTION_TYPE; } function savePathStates(el) { var store = getSavedStates(el); store.normalFill = el.style.fill; store.normalStroke = el.style.stroke; var selectState = el.states.select || {}; store.selectFill = selectState.style && selectState.style.fill || null; store.selectStroke = selectState.style && selectState.style.stroke || null; } var transitionStore = makeInner(); function getAnimationConfig(animationType, animatableModel, dataIndex, extraOpts, extraDelayParams) { var animationPayload; if (animatableModel && animatableModel.ecModel) { var updatePayload = animatableModel.ecModel.getUpdatePayload(); animationPayload = updatePayload && updatePayload.animation; } var animationEnabled = animatableModel && animatableModel.isAnimationEnabled(); var isUpdate = animationType === "update"; if (animationEnabled) { var duration = void 0; var easing = void 0; var delay = void 0; if (extraOpts) { duration = retrieve2(extraOpts.duration, 200); easing = retrieve2(extraOpts.easing, "cubicOut"); delay = 0; } else { duration = animatableModel.getShallow(isUpdate ? "animationDurationUpdate" : "animationDuration"); easing = animatableModel.getShallow(isUpdate ? "animationEasingUpdate" : "animationEasing"); delay = animatableModel.getShallow(isUpdate ? "animationDelayUpdate" : "animationDelay"); } if (animationPayload) { animationPayload.duration != null && (duration = animationPayload.duration); animationPayload.easing != null && (easing = animationPayload.easing); animationPayload.delay != null && (delay = animationPayload.delay); } if (isFunction(delay)) { delay = delay(dataIndex, extraDelayParams); } if (isFunction(duration)) { duration = duration(dataIndex); } var config = { duration: duration || 0, delay, easing }; return config; } else { return null; } } function animateOrSetProps(animationType, el, props, animatableModel, dataIndex, cb, during) { var isFrom = false; var removeOpt; if (isFunction(dataIndex)) { during = cb; cb = dataIndex; dataIndex = null; } else if (isObject$3(dataIndex)) { cb = dataIndex.cb; during = dataIndex.during; isFrom = dataIndex.isFrom; removeOpt = dataIndex.removeOpt; dataIndex = dataIndex.dataIndex; } var isRemove = animationType === "leave"; if (!isRemove) { el.stopAnimation("leave"); } var animationConfig = getAnimationConfig(animationType, animatableModel, dataIndex, isRemove ? removeOpt || {} : null, animatableModel && animatableModel.getAnimationDelayParams ? animatableModel.getAnimationDelayParams(el, dataIndex) : null); if (animationConfig && animationConfig.duration > 0) { var duration = animationConfig.duration; var animationDelay = animationConfig.delay; var animationEasing = animationConfig.easing; var animateConfig = { duration, delay: animationDelay || 0, easing: animationEasing, done: cb, force: !!cb || !!during, // Set to final state in update/init animation. // So the post processing based on the path shape can be done correctly. setToFinal: !isRemove, scope: animationType, during }; isFrom ? el.animateFrom(props, animateConfig) : el.animateTo(props, animateConfig); } else { el.stopAnimation(); !isFrom && el.attr(props); during && during(1); cb && cb(); } } function updateProps$1(el, props, animatableModel, dataIndex, cb, during) { animateOrSetProps("update", el, props, animatableModel, dataIndex, cb, during); } function initProps(el, props, animatableModel, dataIndex, cb, during) { animateOrSetProps("enter", el, props, animatableModel, dataIndex, cb, during); } function isElementRemoved(el) { if (!el.__zr) { return true; } for (var i = 0; i < el.animators.length; i++) { var animator = el.animators[i]; if (animator.scope === "leave") { return true; } } return false; } function removeElement(el, props, animatableModel, dataIndex, cb, during) { if (isElementRemoved(el)) { return; } animateOrSetProps("leave", el, props, animatableModel, dataIndex, cb, during); } function fadeOutDisplayable(el, animatableModel, dataIndex, done) { el.removeTextContent(); el.removeTextGuideLine(); removeElement(el, { style: { opacity: 0 } }, animatableModel, dataIndex, done); } function removeElementWithFadeOut(el, animatableModel, dataIndex) { function doRemove() { el.parent && el.parent.remove(el); } if (!el.isGroup) { fadeOutDisplayable(el, animatableModel, dataIndex, doRemove); } else { el.traverse(function(disp) { if (!disp.isGroup) { fadeOutDisplayable(disp, animatableModel, dataIndex, doRemove); } }); } } function saveOldStyle(el) { transitionStore(el).oldStyle = el.style; } function getOldStyle(el) { return transitionStore(el).oldStyle; } var mathMax$6 = Math.max; var mathMin$6 = Math.min; var _customShapeMap = {}; function extendShape(opts) { return Path.extend(opts); } var extendPathFromString = extendFromString; function extendPath(pathData, opts) { return extendPathFromString(pathData, opts); } function registerShape(name, ShapeClass) { _customShapeMap[name] = ShapeClass; } function getShapeClass(name) { if (_customShapeMap.hasOwnProperty(name)) { return _customShapeMap[name]; } } function makePath(pathData, opts, rect, layout2) { var path = createFromString(pathData, opts); if (rect) { if (layout2 === "center") { rect = centerGraphic(rect, path.getBoundingRect()); } resizePath(path, rect); } return path; } function makeImage(imageUrl, rect, layout2) { var zrImg = new ZRImage({ style: { image: imageUrl, x: rect.x, y: rect.y, width: rect.width, height: rect.height }, onload: function(img) { if (layout2 === "center") { var boundingRect = { width: img.width, height: img.height }; zrImg.setStyle(centerGraphic(rect, boundingRect)); } } }); return zrImg; } function centerGraphic(rect, boundingRect) { var aspect = boundingRect.width / boundingRect.height; var width = rect.height * aspect; var height; if (width <= rect.width) { height = rect.height; } else { width = rect.width; height = width / aspect; } var cx = rect.x + rect.width / 2; var cy = rect.y + rect.height / 2; return { x: cx - width / 2, y: cy - height / 2, width, height }; } var mergePath = mergePath$1; function resizePath(path, rect) { if (!path.applyTransform) { return; } var pathRect = path.getBoundingRect(); var m = pathRect.calculateTransform(rect); path.applyTransform(m); } function subPixelOptimizeLine(shape, lineWidth) { subPixelOptimizeLine$1(shape, shape, { lineWidth }); return shape; } function subPixelOptimizeRect(param) { subPixelOptimizeRect$1(param.shape, param.shape, param.style); return param; } var subPixelOptimize = subPixelOptimize$1; function getTransform$1(target, ancestor) { var mat = identity([]); while (target && target !== ancestor) { mul(mat, target.getLocalTransform(), mat); target = target.parent; } return mat; } function applyTransform(target, transform2, invert$1) { if (transform2 && !isArrayLike(transform2)) { transform2 = Transformable.getLocalTransform(transform2); } if (invert$1) { transform2 = invert([], transform2); } return applyTransform$1([], target, transform2); } function transformDirection(direction, transform2, invert2) { var hBase = transform2[4] === 0 || transform2[5] === 0 || transform2[0] === 0 ? 1 : Math.abs(2 * transform2[4] / transform2[0]); var vBase = transform2[4] === 0 || transform2[5] === 0 || transform2[2] === 0 ? 1 : Math.abs(2 * transform2[4] / transform2[2]); var vertex = [direction === "left" ? -hBase : direction === "right" ? hBase : 0, direction === "top" ? -vBase : direction === "bottom" ? vBase : 0]; vertex = applyTransform(vertex, transform2, invert2); return Math.abs(vertex[0]) > Math.abs(vertex[1]) ? vertex[0] > 0 ? "right" : "left" : vertex[1] > 0 ? "bottom" : "top"; } function isNotGroup(el) { return !el.isGroup; } function isPath$1(el) { return el.shape != null; } function groupTransition(g1, g2, animatableModel) { if (!g1 || !g2) { return; } function getElMap(g) { var elMap = {}; g.traverse(function(el) { if (isNotGroup(el) && el.anid) { elMap[el.anid] = el; } }); return elMap; } function getAnimatableProps(el) { var obj = { x: el.x, y: el.y, rotation: el.rotation }; if (isPath$1(el)) { obj.shape = extend({}, el.shape); } return obj; } var elMap1 = getElMap(g1); g2.traverse(function(el) { if (isNotGroup(el) && el.anid) { var oldEl = elMap1[el.anid]; if (oldEl) { var newProp = getAnimatableProps(el); el.attr(getAnimatableProps(oldEl)); updateProps$1(el, newProp, animatableModel, getECData(el).dataIndex); } } }); } function clipPointsByRect(points2, rect) { return map$1(points2, function(point) { var x = point[0]; x = mathMax$6(x, rect.x); x = mathMin$6(x, rect.x + rect.width); var y = point[1]; y = mathMax$6(y, rect.y); y = mathMin$6(y, rect.y + rect.height); return [x, y]; }); } function clipRectByRect(targetRect, rect) { var x = mathMax$6(targetRect.x, rect.x); var x2 = mathMin$6(targetRect.x + targetRect.width, rect.x + rect.width); var y = mathMax$6(targetRect.y, rect.y); var y2 = mathMin$6(targetRect.y + targetRect.height, rect.y + rect.height); if (x2 >= x && y2 >= y) { return { x, y, width: x2 - x, height: y2 - y }; } } function createIcon(iconStr, opt, rect) { var innerOpts = extend({ rectHover: true }, opt); var style = innerOpts.style = { strokeNoScale: true }; rect = rect || { x: -1, y: -1, width: 2, height: 2 }; if (iconStr) { return iconStr.indexOf("image://") === 0 ? (style.image = iconStr.slice(8), defaults(style, rect), new ZRImage(innerOpts)) : makePath(iconStr.replace("path://", ""), innerOpts, rect, "center"); } } function linePolygonIntersect(a1x, a1y, a2x, a2y, points2) { for (var i = 0, p2 = points2[points2.length - 1]; i < points2.length; i++) { var p = points2[i]; if (lineLineIntersect(a1x, a1y, a2x, a2y, p[0], p[1], p2[0], p2[1])) { return true; } p2 = p; } } function lineLineIntersect(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) { var mx = a2x - a1x; var my = a2y - a1y; var nx = b2x - b1x; var ny = b2y - b1y; var nmCrossProduct = crossProduct2d(nx, ny, mx, my); if (nearZero(nmCrossProduct)) { return false; } var b1a1x = a1x - b1x; var b1a1y = a1y - b1y; var q = crossProduct2d(b1a1x, b1a1y, mx, my) / nmCrossProduct; if (q < 0 || q > 1) { return false; } var p = crossProduct2d(b1a1x, b1a1y, nx, ny) / nmCrossProduct; if (p < 0 || p > 1) { return false; } return true; } function crossProduct2d(x1, y1, x2, y2) { return x1 * y2 - x2 * y1; } function nearZero(val) { return val <= 1e-6 && val >= -1e-6; } function setTooltipConfig(opt) { var itemTooltipOption = opt.itemTooltipOption; var componentModel = opt.componentModel; var itemName = opt.itemName; var itemTooltipOptionObj = isString(itemTooltipOption) ? { formatter: itemTooltipOption } : itemTooltipOption; var mainType = componentModel.mainType; var componentIndex = componentModel.componentIndex; var formatterParams = { componentType: mainType, name: itemName, $vars: ["name"] }; formatterParams[mainType + "Index"] = componentIndex; var formatterParamsExtra = opt.formatterParamsExtra; if (formatterParamsExtra) { each$f(keys(formatterParamsExtra), function(key) { if (!hasOwn(formatterParams, key)) { formatterParams[key] = formatterParamsExtra[key]; formatterParams.$vars.push(key); } }); } var ecData = getECData(opt.el); ecData.componentMainType = mainType; ecData.componentIndex = componentIndex; ecData.tooltipConfig = { name: itemName, option: defaults({ content: itemName, encodeHTMLContent: true, formatterParams }, itemTooltipOptionObj) }; } function traverseElement(el, cb) { var stopped; if (el.isGroup) { stopped = cb(el); } if (!stopped) { el.traverse(cb); } } function traverseElements(els, cb) { if (els) { if (isArray$1(els)) { for (var i = 0; i < els.length; i++) { traverseElement(els[i], cb); } } else { traverseElement(els, cb); } } } registerShape("circle", Circle); registerShape("ellipse", Ellipse); registerShape("sector", Sector); registerShape("ring", Ring); registerShape("polygon", Polygon); registerShape("polyline", Polyline$1); registerShape("rect", Rect$2); registerShape("line", Line$1); registerShape("bezierCurve", BezierCurve); registerShape("arc", Arc); const graphic = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, Arc, BezierCurve, BoundingRect, Circle, CompoundPath, Ellipse, Group: Group$3, Image: ZRImage, IncrementalDisplayable, Line: Line$1, LinearGradient, OrientedBoundingRect, Path, Point, Polygon, Polyline: Polyline$1, RadialGradient, Rect: Rect$2, Ring, Sector, Text: ZRText, applyTransform, clipPointsByRect, clipRectByRect, createIcon, extendPath, extendShape, getShapeClass, getTransform: getTransform$1, groupTransition, initProps, isElementRemoved, lineLineIntersect, linePolygonIntersect, makeImage, makePath, mergePath, registerShape, removeElement, removeElementWithFadeOut, resizePath, setTooltipConfig, subPixelOptimize, subPixelOptimizeLine, subPixelOptimizeRect, transformDirection, traverseElements, updateProps: updateProps$1 }, Symbol.toStringTag, { value: "Module" })); var EMPTY_OBJ = {}; function setLabelText(label, labelTexts) { for (var i = 0; i < SPECIAL_STATES.length; i++) { var stateName = SPECIAL_STATES[i]; var text = labelTexts[stateName]; var state = label.ensureState(stateName); state.style = state.style || {}; state.style.text = text; } var oldStates = label.currentStates.slice(); label.clearStates(true); label.setStyle({ text: labelTexts.normal }); label.useStates(oldStates, true); } function getLabelText(opt, stateModels, interpolatedValue) { var labelFetcher = opt.labelFetcher; var labelDataIndex = opt.labelDataIndex; var labelDimIndex = opt.labelDimIndex; var normalModel = stateModels.normal; var baseText; if (labelFetcher) { baseText = labelFetcher.getFormattedLabel(labelDataIndex, "normal", null, labelDimIndex, normalModel && normalModel.get("formatter"), interpolatedValue != null ? { interpolatedValue } : null); } if (baseText == null) { baseText = isFunction(opt.defaultText) ? opt.defaultText(labelDataIndex, opt, interpolatedValue) : opt.defaultText; } var statesText = { normal: baseText }; for (var i = 0; i < SPECIAL_STATES.length; i++) { var stateName = SPECIAL_STATES[i]; var stateModel = stateModels[stateName]; statesText[stateName] = retrieve2(labelFetcher ? labelFetcher.getFormattedLabel(labelDataIndex, stateName, null, labelDimIndex, stateModel && stateModel.get("formatter")) : null, baseText); } return statesText; } function setLabelStyle(targetEl, labelStatesModels, opt, stateSpecified) { opt = opt || EMPTY_OBJ; var isSetOnText = targetEl instanceof ZRText; var needsCreateText = false; for (var i = 0; i < DISPLAY_STATES.length; i++) { var stateModel = labelStatesModels[DISPLAY_STATES[i]]; if (stateModel && stateModel.getShallow("show")) { needsCreateText = true; break; } } var textContent = isSetOnText ? targetEl : targetEl.getTextContent(); if (needsCreateText) { if (!isSetOnText) { if (!textContent) { textContent = new ZRText(); targetEl.setTextContent(textContent); } if (targetEl.stateProxy) { textContent.stateProxy = targetEl.stateProxy; } } var labelStatesTexts = getLabelText(opt, labelStatesModels); var normalModel = labelStatesModels.normal; var showNormal = !!normalModel.getShallow("show"); var normalStyle = createTextStyle(normalModel, stateSpecified && stateSpecified.normal, opt, false, !isSetOnText); normalStyle.text = labelStatesTexts.normal; if (!isSetOnText) { targetEl.setTextConfig(createTextConfig(normalModel, opt, false)); } for (var i = 0; i < SPECIAL_STATES.length; i++) { var stateName = SPECIAL_STATES[i]; var stateModel = labelStatesModels[stateName]; if (stateModel) { var stateObj = textContent.ensureState(stateName); var stateShow = !!retrieve2(stateModel.getShallow("show"), showNormal); if (stateShow !== showNormal) { stateObj.ignore = !stateShow; } stateObj.style = createTextStyle(stateModel, stateSpecified && stateSpecified[stateName], opt, true, !isSetOnText); stateObj.style.text = labelStatesTexts[stateName]; if (!isSetOnText) { var targetElEmphasisState = targetEl.ensureState(stateName); targetElEmphasisState.textConfig = createTextConfig(stateModel, opt, true); } } } textContent.silent = !!normalModel.getShallow("silent"); if (textContent.style.x != null) { normalStyle.x = textContent.style.x; } if (textContent.style.y != null) { normalStyle.y = textContent.style.y; } textContent.ignore = !showNormal; textContent.useStyle(normalStyle); textContent.dirty(); if (opt.enableTextSetter) { labelInner(textContent).setLabelText = function(interpolatedValue) { var labelStatesTexts2 = getLabelText(opt, labelStatesModels, interpolatedValue); setLabelText(textContent, labelStatesTexts2); }; } } else if (textContent) { textContent.ignore = true; } targetEl.dirty(); } function getLabelStatesModels(itemModel, labelName) { labelName = labelName || "label"; var statesModels = { normal: itemModel.getModel(labelName) }; for (var i = 0; i < SPECIAL_STATES.length; i++) { var stateName = SPECIAL_STATES[i]; statesModels[stateName] = itemModel.getModel([stateName, labelName]); } return statesModels; } function createTextStyle(textStyleModel, specifiedTextStyle, opt, isNotNormal, isAttached) { var textStyle = {}; setTextStyleCommon(textStyle, textStyleModel, opt, isNotNormal, isAttached); specifiedTextStyle && extend(textStyle, specifiedTextStyle); return textStyle; } function createTextConfig(textStyleModel, opt, isNotNormal) { opt = opt || {}; var textConfig = {}; var labelPosition; var labelRotate = textStyleModel.getShallow("rotate"); var labelDistance = retrieve2(textStyleModel.getShallow("distance"), isNotNormal ? null : 5); var labelOffset = textStyleModel.getShallow("offset"); labelPosition = textStyleModel.getShallow("position") || (isNotNormal ? null : "inside"); labelPosition === "outside" && (labelPosition = opt.defaultOutsidePosition || "top"); if (labelPosition != null) { textConfig.position = labelPosition; } if (labelOffset != null) { textConfig.offset = labelOffset; } if (labelRotate != null) { labelRotate *= Math.PI / 180; textConfig.rotation = labelRotate; } if (labelDistance != null) { textConfig.distance = labelDistance; } textConfig.outsideFill = textStyleModel.get("color") === "inherit" ? opt.inheritColor || null : "auto"; return textConfig; } function setTextStyleCommon(textStyle, textStyleModel, opt, isNotNormal, isAttached) { opt = opt || EMPTY_OBJ; var ecModel = textStyleModel.ecModel; var globalTextStyle = ecModel && ecModel.option.textStyle; var richItemNames = getRichItemNames(textStyleModel); var richResult; if (richItemNames) { richResult = {}; for (var name_1 in richItemNames) { if (richItemNames.hasOwnProperty(name_1)) { var richTextStyle = textStyleModel.getModel(["rich", name_1]); setTokenTextStyle(richResult[name_1] = {}, richTextStyle, globalTextStyle, opt, isNotNormal, isAttached, false, true); } } } if (richResult) { textStyle.rich = richResult; } var overflow = textStyleModel.get("overflow"); if (overflow) { textStyle.overflow = overflow; } var margin = textStyleModel.get("minMargin"); if (margin != null) { textStyle.margin = margin; } setTokenTextStyle(textStyle, textStyleModel, globalTextStyle, opt, isNotNormal, isAttached, true, false); } function getRichItemNames(textStyleModel) { var richItemNameMap; while (textStyleModel && textStyleModel !== textStyleModel.ecModel) { var rich = (textStyleModel.option || EMPTY_OBJ).rich; if (rich) { richItemNameMap = richItemNameMap || {}; var richKeys = keys(rich); for (var i = 0; i < richKeys.length; i++) { var richKey = richKeys[i]; richItemNameMap[richKey] = 1; } } textStyleModel = textStyleModel.parentModel; } return richItemNameMap; } var TEXT_PROPS_WITH_GLOBAL = ["fontStyle", "fontWeight", "fontSize", "fontFamily", "textShadowColor", "textShadowBlur", "textShadowOffsetX", "textShadowOffsetY"]; var TEXT_PROPS_SELF = ["align", "lineHeight", "width", "height", "tag", "verticalAlign", "ellipsis"]; var TEXT_PROPS_BOX = ["padding", "borderWidth", "borderRadius", "borderDashOffset", "backgroundColor", "borderColor", "shadowColor", "shadowBlur", "shadowOffsetX", "shadowOffsetY"]; function setTokenTextStyle(textStyle, textStyleModel, globalTextStyle, opt, isNotNormal, isAttached, isBlock, inRich) { globalTextStyle = !isNotNormal && globalTextStyle || EMPTY_OBJ; var inheritColor = opt && opt.inheritColor; var fillColor = textStyleModel.getShallow("color"); var strokeColor = textStyleModel.getShallow("textBorderColor"); var opacity = retrieve2(textStyleModel.getShallow("opacity"), globalTextStyle.opacity); if (fillColor === "inherit" || fillColor === "auto") { if (inheritColor) { fillColor = inheritColor; } else { fillColor = null; } } if (strokeColor === "inherit" || strokeColor === "auto") { if (inheritColor) { strokeColor = inheritColor; } else { strokeColor = null; } } if (!isAttached) { fillColor = fillColor || globalTextStyle.color; strokeColor = strokeColor || globalTextStyle.textBorderColor; } if (fillColor != null) { textStyle.fill = fillColor; } if (strokeColor != null) { textStyle.stroke = strokeColor; } var textBorderWidth = retrieve2(textStyleModel.getShallow("textBorderWidth"), globalTextStyle.textBorderWidth); if (textBorderWidth != null) { textStyle.lineWidth = textBorderWidth; } var textBorderType = retrieve2(textStyleModel.getShallow("textBorderType"), globalTextStyle.textBorderType); if (textBorderType != null) { textStyle.lineDash = textBorderType; } var textBorderDashOffset = retrieve2(textStyleModel.getShallow("textBorderDashOffset"), globalTextStyle.textBorderDashOffset); if (textBorderDashOffset != null) { textStyle.lineDashOffset = textBorderDashOffset; } if (!isNotNormal && opacity == null && !inRich) { opacity = opt && opt.defaultOpacity; } if (opacity != null) { textStyle.opacity = opacity; } if (!isNotNormal && !isAttached) { if (textStyle.fill == null && opt.inheritColor) { textStyle.fill = opt.inheritColor; } } for (var i = 0; i < TEXT_PROPS_WITH_GLOBAL.length; i++) { var key = TEXT_PROPS_WITH_GLOBAL[i]; var val = retrieve2(textStyleModel.getShallow(key), globalTextStyle[key]); if (val != null) { textStyle[key] = val; } } for (var i = 0; i < TEXT_PROPS_SELF.length; i++) { var key = TEXT_PROPS_SELF[i]; var val = textStyleModel.getShallow(key); if (val != null) { textStyle[key] = val; } } if (textStyle.verticalAlign == null) { var baseline = textStyleModel.getShallow("baseline"); if (baseline != null) { textStyle.verticalAlign = baseline; } } if (!isBlock || !opt.disableBox) { for (var i = 0; i < TEXT_PROPS_BOX.length; i++) { var key = TEXT_PROPS_BOX[i]; var val = textStyleModel.getShallow(key); if (val != null) { textStyle[key] = val; } } var borderType = textStyleModel.getShallow("borderType"); if (borderType != null) { textStyle.borderDash = borderType; } if ((textStyle.backgroundColor === "auto" || textStyle.backgroundColor === "inherit") && inheritColor) { textStyle.backgroundColor = inheritColor; } if ((textStyle.borderColor === "auto" || textStyle.borderColor === "inherit") && inheritColor) { textStyle.borderColor = inheritColor; } } } function getFont(opt, ecModel) { var gTextStyleModel = ecModel && ecModel.getModel("textStyle"); return trim$1([ // FIXME in node-canvas fontWeight is before fontStyle opt.fontStyle || gTextStyleModel && gTextStyleModel.getShallow("fontStyle") || "", opt.fontWeight || gTextStyleModel && gTextStyleModel.getShallow("fontWeight") || "", (opt.fontSize || gTextStyleModel && gTextStyleModel.getShallow("fontSize") || 12) + "px", opt.fontFamily || gTextStyleModel && gTextStyleModel.getShallow("fontFamily") || "sans-serif" ].join(" ")); } var labelInner = makeInner(); function setLabelValueAnimation(label, labelStatesModels, value, getDefaultText) { if (!label) { return; } var obj = labelInner(label); obj.prevValue = obj.value; obj.value = value; var normalLabelModel = labelStatesModels.normal; obj.valueAnimation = normalLabelModel.get("valueAnimation"); if (obj.valueAnimation) { obj.precision = normalLabelModel.get("precision"); obj.defaultInterpolatedText = getDefaultText; obj.statesModels = labelStatesModels; } } function animateLabelValue(textEl, dataIndex, data, animatableModel, labelFetcher) { var labelInnerStore = labelInner(textEl); if (!labelInnerStore.valueAnimation || labelInnerStore.prevValue === labelInnerStore.value) { return; } var defaultInterpolatedText = labelInnerStore.defaultInterpolatedText; var currValue = retrieve2(labelInnerStore.interpolatedValue, labelInnerStore.prevValue); var targetValue = labelInnerStore.value; function during(percent) { var interpolated = interpolateRawValues(data, labelInnerStore.precision, currValue, targetValue, percent); labelInnerStore.interpolatedValue = percent === 1 ? null : interpolated; var labelText = getLabelText({ labelDataIndex: dataIndex, labelFetcher, defaultText: defaultInterpolatedText ? defaultInterpolatedText(interpolated) : interpolated + "" }, labelInnerStore.statesModels, interpolated); setLabelText(textEl, labelText); } textEl.percent = 0; (labelInnerStore.prevValue == null ? initProps : updateProps$1)(textEl, { // percent is used to prevent animation from being aborted #15916 percent: 1 }, animatableModel, dataIndex, null, during); } var PATH_COLOR = ["textStyle", "color"]; var textStyleParams = ["fontStyle", "fontWeight", "fontSize", "fontFamily", "padding", "lineHeight", "rich", "width", "height", "overflow"]; var tmpText = new ZRText(); var TextStyleMixin = ( /** @class */ (function() { function TextStyleMixin2() { } TextStyleMixin2.prototype.getTextColor = function(isEmphasis) { var ecModel = this.ecModel; return this.getShallow("color") || (!isEmphasis && ecModel ? ecModel.get(PATH_COLOR) : null); }; TextStyleMixin2.prototype.getFont = function() { return getFont({ fontStyle: this.getShallow("fontStyle"), fontWeight: this.getShallow("fontWeight"), fontSize: this.getShallow("fontSize"), fontFamily: this.getShallow("fontFamily") }, this.ecModel); }; TextStyleMixin2.prototype.getTextRect = function(text) { var style = { text, verticalAlign: this.getShallow("verticalAlign") || this.getShallow("baseline") }; for (var i = 0; i < textStyleParams.length; i++) { style[textStyleParams[i]] = this.getShallow(textStyleParams[i]); } tmpText.useStyle(style); tmpText.update(); return tmpText.getBoundingRect(); }; return TextStyleMixin2; })() ); var LINE_STYLE_KEY_MAP = [ ["lineWidth", "width"], ["stroke", "color"], ["opacity"], ["shadowBlur"], ["shadowOffsetX"], ["shadowOffsetY"], ["shadowColor"], ["lineDash", "type"], ["lineDashOffset", "dashOffset"], ["lineCap", "cap"], ["lineJoin", "join"], ["miterLimit"] // Option decal is in `DecalObject` but style.decal is in `PatternObject`. // So do not transfer decal directly. ]; var getLineStyle = makeStyleMapper(LINE_STYLE_KEY_MAP); var LineStyleMixin = ( /** @class */ (function() { function LineStyleMixin2() { } LineStyleMixin2.prototype.getLineStyle = function(excludes) { return getLineStyle(this, excludes); }; return LineStyleMixin2; })() ); var ITEM_STYLE_KEY_MAP = [ ["fill", "color"], ["stroke", "borderColor"], ["lineWidth", "borderWidth"], ["opacity"], ["shadowBlur"], ["shadowOffsetX"], ["shadowOffsetY"], ["shadowColor"], ["lineDash", "borderType"], ["lineDashOffset", "borderDashOffset"], ["lineCap", "borderCap"], ["lineJoin", "borderJoin"], ["miterLimit", "borderMiterLimit"] // Option decal is in `DecalObject` but style.decal is in `PatternObject`. // So do not transfer decal directly. ]; var getItemStyle = makeStyleMapper(ITEM_STYLE_KEY_MAP); var ItemStyleMixin = ( /** @class */ (function() { function ItemStyleMixin2() { } ItemStyleMixin2.prototype.getItemStyle = function(excludes, includes) { return getItemStyle(this, excludes, includes); }; return ItemStyleMixin2; })() ); var Model = ( /** @class */ (function() { function Model2(option, parentModel, ecModel) { this.parentModel = parentModel; this.ecModel = ecModel; this.option = option; } Model2.prototype.init = function(option, parentModel, ecModel) { }; Model2.prototype.mergeOption = function(option, ecModel) { merge(this.option, option, true); }; Model2.prototype.get = function(path, ignoreParent) { if (path == null) { return this.option; } return this._doGet(this.parsePath(path), !ignoreParent && this.parentModel); }; Model2.prototype.getShallow = function(key, ignoreParent) { var option = this.option; var val = option == null ? option : option[key]; if (val == null && !ignoreParent) { var parentModel = this.parentModel; if (parentModel) { val = parentModel.getShallow(key); } } return val; }; Model2.prototype.getModel = function(path, parentModel) { var hasPath = path != null; var pathFinal = hasPath ? this.parsePath(path) : null; var obj = hasPath ? this._doGet(pathFinal) : this.option; parentModel = parentModel || this.parentModel && this.parentModel.getModel(this.resolveParentPath(pathFinal)); return new Model2(obj, parentModel, this.ecModel); }; Model2.prototype.isEmpty = function() { return this.option == null; }; Model2.prototype.restoreData = function() { }; Model2.prototype.clone = function() { var Ctor = this.constructor; return new Ctor(clone$1(this.option)); }; Model2.prototype.parsePath = function(path) { if (typeof path === "string") { return path.split("."); } return path; }; Model2.prototype.resolveParentPath = function(path) { return path; }; Model2.prototype.isAnimationEnabled = function() { if (!env.node && this.option) { if (this.option.animation != null) { return !!this.option.animation; } else if (this.parentModel) { return this.parentModel.isAnimationEnabled(); } } }; Model2.prototype._doGet = function(pathArr, parentModel) { var obj = this.option; if (!pathArr) { return obj; } for (var i = 0; i < pathArr.length; i++) { if (!pathArr[i]) { continue; } obj = obj && typeof obj === "object" ? obj[pathArr[i]] : null; if (obj == null) { break; } } if (obj == null && parentModel) { obj = parentModel._doGet(this.resolveParentPath(pathArr), parentModel.parentModel); } return obj; }; return Model2; })() ); enableClassExtend(Model); enableClassCheck(Model); mixin(Model, LineStyleMixin); mixin(Model, ItemStyleMixin); mixin(Model, AreaStyleMixin); mixin(Model, TextStyleMixin); var base = Math.round(Math.random() * 10); function getUID(type) { return [type || "", base++].join("_"); } function enableSubTypeDefaulter(target) { var subTypeDefaulters = {}; target.registerSubTypeDefaulter = function(componentType, defaulter) { var componentTypeInfo = parseClassType(componentType); subTypeDefaulters[componentTypeInfo.main] = defaulter; }; target.determineSubType = function(componentType, option) { var type = option.type; if (!type) { var componentTypeMain = parseClassType(componentType).main; if (target.hasSubTypes(componentType) && subTypeDefaulters[componentTypeMain]) { type = subTypeDefaulters[componentTypeMain](option); } } return type; }; } function enableTopologicalTravel(entity, dependencyGetter) { entity.topologicalTravel = function(targetNameList, fullNameList, callback, context) { if (!targetNameList.length) { return; } var result = makeDepndencyGraph(fullNameList); var graph = result.graph; var noEntryList = result.noEntryList; var targetNameSet = {}; each$f(targetNameList, function(name) { targetNameSet[name] = true; }); while (noEntryList.length) { var currComponentType = noEntryList.pop(); var currVertex = graph[currComponentType]; var isInTargetNameSet = !!targetNameSet[currComponentType]; if (isInTargetNameSet) { callback.call(context, currComponentType, currVertex.originalDeps.slice()); delete targetNameSet[currComponentType]; } each$f(currVertex.successor, isInTargetNameSet ? removeEdgeAndAdd : removeEdge); } each$f(targetNameSet, function() { var errMsg = ""; throw new Error(errMsg); }); function removeEdge(succComponentType) { graph[succComponentType].entryCount--; if (graph[succComponentType].entryCount === 0) { noEntryList.push(succComponentType); } } function removeEdgeAndAdd(succComponentType) { targetNameSet[succComponentType] = true; removeEdge(succComponentType); } }; function makeDepndencyGraph(fullNameList) { var graph = {}; var noEntryList = []; each$f(fullNameList, function(name) { var thisItem = createDependencyGraphItem(graph, name); var originalDeps = thisItem.originalDeps = dependencyGetter(name); var availableDeps = getAvailableDependencies(originalDeps, fullNameList); thisItem.entryCount = availableDeps.length; if (thisItem.entryCount === 0) { noEntryList.push(name); } each$f(availableDeps, function(dependentName) { if (indexOf(thisItem.predecessor, dependentName) < 0) { thisItem.predecessor.push(dependentName); } var thatItem = createDependencyGraphItem(graph, dependentName); if (indexOf(thatItem.successor, dependentName) < 0) { thatItem.successor.push(name); } }); }); return { graph, noEntryList }; } function createDependencyGraphItem(graph, name) { if (!graph[name]) { graph[name] = { predecessor: [], successor: [] }; } return graph[name]; } function getAvailableDependencies(originalDeps, fullNameList) { var availableDeps = []; each$f(originalDeps, function(dep) { indexOf(fullNameList, dep) >= 0 && availableDeps.push(dep); }); return availableDeps; } } function inheritDefaultOption(superOption, subOption) { return merge(merge({}, superOption, true), subOption, true); } const langEN = { time: { month: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], monthAbbr: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], dayOfWeek: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], dayOfWeekAbbr: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] }, legend: { selector: { all: "All", inverse: "Inv" } }, toolbox: { brush: { title: { rect: "Box Select", polygon: "Lasso Select", lineX: "Horizontally Select", lineY: "Vertically Select", keep: "Keep Selections", clear: "Clear Selections" } }, dataView: { title: "Data View", lang: ["Data View", "Close", "Refresh"] }, dataZoom: { title: { zoom: "Zoom", back: "Zoom Reset" } }, magicType: { title: { line: "Switch to Line Chart", bar: "Switch to Bar Chart", stack: "Stack", tiled: "Tile" } }, restore: { title: "Restore" }, saveAsImage: { title: "Save as Image", lang: ["Right Click to Save Image"] } }, series: { typeNames: { pie: "Pie chart", bar: "Bar chart", line: "Line chart", scatter: "Scatter plot", effectScatter: "Ripple scatter plot", radar: "Radar chart", tree: "Tree", treemap: "Treemap", boxplot: "Boxplot", candlestick: "Candlestick", k: "K line chart", heatmap: "Heat map", map: "Map", parallel: "Parallel coordinate map", lines: "Line graph", graph: "Relationship graph", sankey: "Sankey diagram", funnel: "Funnel chart", gauge: "Gauge", pictorialBar: "Pictorial bar", themeRiver: "Theme River Map", sunburst: "Sunburst", custom: "Custom chart", chart: "Chart" } }, aria: { general: { withTitle: 'This is a chart about "{title}"', withoutTitle: "This is a chart" }, series: { single: { prefix: "", withName: " with type {seriesType} named {seriesName}.", withoutName: " with type {seriesType}." }, multiple: { prefix: ". It consists of {seriesCount} series count.", withName: " The {seriesId} series is a {seriesType} representing {seriesName}.", withoutName: " The {seriesId} series is a {seriesType}.", separator: { middle: "", end: "" } } }, data: { allData: "The data is as follows: ", partialData: "The first {displayCnt} items are: ", withName: "the data for {name} is {value}", withoutName: "{value}", separator: { middle: ", ", end: ". " } } } }; const langZH = { time: { month: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], monthAbbr: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"], dayOfWeek: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"], dayOfWeekAbbr: ["日", "一", "二", "三", "四", "五", "六"] }, legend: { selector: { all: "全选", inverse: "反选" } }, toolbox: { brush: { title: { rect: "矩形选择", polygon: "圈选", lineX: "横向选择", lineY: "纵向选择", keep: "保持选择", clear: "清除选择" } }, dataView: { title: "数据视图", lang: ["数据视图", "关闭", "刷新"] }, dataZoom: { title: { zoom: "区域缩放", back: "区域缩放还原" } }, magicType: { title: { line: "切换为折线图", bar: "切换为柱状图", stack: "切换为堆叠", tiled: "切换为平铺" } }, restore: { title: "还原" }, saveAsImage: { title: "保存为图片", lang: ["右键另存为图片"] } }, series: { typeNames: { pie: "饼图", bar: "柱状图", line: "折线图", scatter: "散点图", effectScatter: "涟漪散点图", radar: "雷达图", tree: "树图", treemap: "矩形树图", boxplot: "箱型图", candlestick: "K线图", k: "K线图", heatmap: "热力图", map: "地图", parallel: "平行坐标图", lines: "线图", graph: "关系图", sankey: "桑基图", funnel: "漏斗图", gauge: "仪表盘图", pictorialBar: "象形柱图", themeRiver: "主题河流图", sunburst: "旭日图", custom: "自定义图表", chart: "图表" } }, aria: { general: { withTitle: "这是一个关于“{title}”的图表。", withoutTitle: "这是一个图表," }, series: { single: { prefix: "", withName: "图表类型是{seriesType},表示{seriesName}。", withoutName: "图表类型是{seriesType}。" }, multiple: { prefix: "它由{seriesCount}个图表系列组成。", withName: "第{seriesId}个系列是一个表示{seriesName}的{seriesType},", withoutName: "第{seriesId}个系列是一个{seriesType},", separator: { middle: ";", end: "。" } } }, data: { allData: "其数据是——", partialData: "其中,前{displayCnt}项是——", withName: "{name}的数据是{value}", withoutName: "{value}", separator: { middle: ",", end: "" } } } }; var LOCALE_ZH = "ZH"; var LOCALE_EN = "EN"; var DEFAULT_LOCALE = LOCALE_EN; var localeStorage = {}; var localeModels = {}; var SYSTEM_LANG = !env.domSupported ? DEFAULT_LOCALE : (function() { var langStr = ( /* eslint-disable-next-line */ (document.documentElement.lang || navigator.language || navigator.browserLanguage || DEFAULT_LOCALE).toUpperCase() ); return langStr.indexOf(LOCALE_ZH) > -1 ? LOCALE_ZH : DEFAULT_LOCALE; })(); function registerLocale(locale, localeObj) { locale = locale.toUpperCase(); localeModels[locale] = new Model(localeObj); localeStorage[locale] = localeObj; } function createLocaleObject(locale) { if (isString(locale)) { var localeObj = localeStorage[locale.toUpperCase()] || {}; if (locale === LOCALE_ZH || locale === LOCALE_EN) { return clone$1(localeObj); } else { return merge(clone$1(localeObj), clone$1(localeStorage[DEFAULT_LOCALE]), false); } } else { return merge(clone$1(locale), clone$1(localeStorage[DEFAULT_LOCALE]), false); } } function getLocaleModel(lang) { return localeModels[lang]; } function getDefaultLocaleModel() { return localeModels[DEFAULT_LOCALE]; } registerLocale(LOCALE_EN, langEN); registerLocale(LOCALE_ZH, langZH); var ONE_SECOND = 1e3; var ONE_MINUTE = ONE_SECOND * 60; var ONE_HOUR = ONE_MINUTE * 60; var ONE_DAY = ONE_HOUR * 24; var ONE_YEAR = ONE_DAY * 365; var defaultLeveledFormatter = { year: "{yyyy}", month: "{MMM}", day: "{d}", hour: "{HH}:{mm}", minute: "{HH}:{mm}", second: "{HH}:{mm}:{ss}", millisecond: "{HH}:{mm}:{ss} {SSS}", none: "{yyyy}-{MM}-{dd} {HH}:{mm}:{ss} {SSS}" }; var fullDayFormatter = "{yyyy}-{MM}-{dd}"; var fullLeveledFormatter = { year: "{yyyy}", month: "{yyyy}-{MM}", day: fullDayFormatter, hour: fullDayFormatter + " " + defaultLeveledFormatter.hour, minute: fullDayFormatter + " " + defaultLeveledFormatter.minute, second: fullDayFormatter + " " + defaultLeveledFormatter.second, millisecond: defaultLeveledFormatter.none }; var primaryTimeUnits = ["year", "month", "day", "hour", "minute", "second", "millisecond"]; var timeUnits = ["year", "half-year", "quarter", "month", "week", "half-week", "day", "half-day", "quarter-day", "hour", "minute", "second", "millisecond"]; function pad(str, len2) { str += ""; return "0000".substr(0, len2 - str.length) + str; } function getPrimaryTimeUnit(timeUnit) { switch (timeUnit) { case "half-year": case "quarter": return "month"; case "week": case "half-week": return "day"; case "half-day": case "quarter-day": return "hour"; default: return timeUnit; } } function isPrimaryTimeUnit(timeUnit) { return timeUnit === getPrimaryTimeUnit(timeUnit); } function getDefaultFormatPrecisionOfInterval(timeUnit) { switch (timeUnit) { case "year": case "month": return "day"; case "millisecond": return "millisecond"; default: return "second"; } } function format(time, template, isUTC, lang) { var date = parseDate(time); var y = date[fullYearGetterName(isUTC)](); var M = date[monthGetterName(isUTC)]() + 1; var q = Math.floor((M - 1) / 3) + 1; var d = date[dateGetterName(isUTC)](); var e = date["get" + (isUTC ? "UTC" : "") + "Day"](); var H = date[hoursGetterName(isUTC)](); var h = (H - 1) % 12 + 1; var m = date[minutesGetterName(isUTC)](); var s = date[secondsGetterName(isUTC)](); var S = date[millisecondsGetterName(isUTC)](); var a = H >= 12 ? "pm" : "am"; var A = a.toUpperCase(); var localeModel = lang instanceof Model ? lang : getLocaleModel(lang || SYSTEM_LANG) || getDefaultLocaleModel(); var timeModel = localeModel.getModel("time"); var month = timeModel.get("month"); var monthAbbr = timeModel.get("monthAbbr"); var dayOfWeek = timeModel.get("dayOfWeek"); var dayOfWeekAbbr = timeModel.get("dayOfWeekAbbr"); return (template || "").replace(/{a}/g, a + "").replace(/{A}/g, A + "").replace(/{yyyy}/g, y + "").replace(/{yy}/g, pad(y % 100 + "", 2)).replace(/{Q}/g, q + "").replace(/{MMMM}/g, month[M - 1]).replace(/{MMM}/g, monthAbbr[M - 1]).replace(/{MM}/g, pad(M, 2)).replace(/{M}/g, M + "").replace(/{dd}/g, pad(d, 2)).replace(/{d}/g, d + "").replace(/{eeee}/g, dayOfWeek[e]).replace(/{ee}/g, dayOfWeekAbbr[e]).replace(/{e}/g, e + "").replace(/{HH}/g, pad(H, 2)).replace(/{H}/g, H + "").replace(/{hh}/g, pad(h + "", 2)).replace(/{h}/g, h + "").replace(/{mm}/g, pad(m, 2)).replace(/{m}/g, m + "").replace(/{ss}/g, pad(s, 2)).replace(/{s}/g, s + "").replace(/{SSS}/g, pad(S, 3)).replace(/{S}/g, S + ""); } function leveledFormat(tick, idx, formatter, lang, isUTC) { var template = null; if (isString(formatter)) { template = formatter; } else if (isFunction(formatter)) { template = formatter(tick.value, idx, { level: tick.level }); } else { var defaults$1 = extend({}, defaultLeveledFormatter); if (tick.level > 0) { for (var i = 0; i < primaryTimeUnits.length; ++i) { defaults$1[primaryTimeUnits[i]] = "{primary|" + defaults$1[primaryTimeUnits[i]] + "}"; } } var mergedFormatter = formatter ? formatter.inherit === false ? formatter : defaults(formatter, defaults$1) : defaults$1; var unit = getUnitFromValue(tick.value, isUTC); if (mergedFormatter[unit]) { template = mergedFormatter[unit]; } else if (mergedFormatter.inherit) { var targetId = timeUnits.indexOf(unit); for (var i = targetId - 1; i >= 0; --i) { if (mergedFormatter[unit]) { template = mergedFormatter[unit]; break; } } template = template || defaults$1.none; } if (isArray$1(template)) { var levelId = tick.level == null ? 0 : tick.level >= 0 ? tick.level : template.length + tick.level; levelId = Math.min(levelId, template.length - 1); template = template[levelId]; } } return format(new Date(tick.value), template, isUTC, lang); } function getUnitFromValue(value, isUTC) { var date = parseDate(value); var M = date[monthGetterName(isUTC)]() + 1; var d = date[dateGetterName(isUTC)](); var h = date[hoursGetterName(isUTC)](); var m = date[minutesGetterName(isUTC)](); var s = date[secondsGetterName(isUTC)](); var S = date[millisecondsGetterName(isUTC)](); var isSecond = S === 0; var isMinute = isSecond && s === 0; var isHour = isMinute && m === 0; var isDay = isHour && h === 0; var isMonth = isDay && d === 1; var isYear = isMonth && M === 1; if (isYear) { return "year"; } else if (isMonth) { return "month"; } else if (isDay) { return "day"; } else if (isHour) { return "hour"; } else if (isMinute) { return "minute"; } else if (isSecond) { return "second"; } else { return "millisecond"; } } function getUnitValue(value, unit, isUTC) { var date = isNumber(value) ? parseDate(value) : value; unit = unit || getUnitFromValue(value, isUTC); switch (unit) { case "year": return date[fullYearGetterName(isUTC)](); case "half-year": return date[monthGetterName(isUTC)]() >= 6 ? 1 : 0; case "quarter": return Math.floor((date[monthGetterName(isUTC)]() + 1) / 4); case "month": return date[monthGetterName(isUTC)](); case "day": return date[dateGetterName(isUTC)](); case "half-day": return date[hoursGetterName(isUTC)]() / 24; case "hour": return date[hoursGetterName(isUTC)](); case "minute": return date[minutesGetterName(isUTC)](); case "second": return date[secondsGetterName(isUTC)](); case "millisecond": return date[millisecondsGetterName(isUTC)](); } } function fullYearGetterName(isUTC) { return isUTC ? "getUTCFullYear" : "getFullYear"; } function monthGetterName(isUTC) { return isUTC ? "getUTCMonth" : "getMonth"; } function dateGetterName(isUTC) { return isUTC ? "getUTCDate" : "getDate"; } function hoursGetterName(isUTC) { return isUTC ? "getUTCHours" : "getHours"; } function minutesGetterName(isUTC) { return isUTC ? "getUTCMinutes" : "getMinutes"; } function secondsGetterName(isUTC) { return isUTC ? "getUTCSeconds" : "getSeconds"; } function millisecondsGetterName(isUTC) { return isUTC ? "getUTCMilliseconds" : "getMilliseconds"; } function fullYearSetterName(isUTC) { return isUTC ? "setUTCFullYear" : "setFullYear"; } function monthSetterName(isUTC) { return isUTC ? "setUTCMonth" : "setMonth"; } function dateSetterName(isUTC) { return isUTC ? "setUTCDate" : "setDate"; } function hoursSetterName(isUTC) { return isUTC ? "setUTCHours" : "setHours"; } function minutesSetterName(isUTC) { return isUTC ? "setUTCMinutes" : "setMinutes"; } function secondsSetterName(isUTC) { return isUTC ? "setUTCSeconds" : "setSeconds"; } function millisecondsSetterName(isUTC) { return isUTC ? "setUTCMilliseconds" : "setMilliseconds"; } function addCommas(x) { if (!isNumeric(x)) { return isString(x) ? x : "-"; } var parts = (x + "").split("."); return parts[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g, "$1,") + (parts.length > 1 ? "." + parts[1] : ""); } function toCamelCase(str, upperCaseFirst) { str = (str || "").toLowerCase().replace(/-(.)/g, function(match, group1) { return group1.toUpperCase(); }); if (upperCaseFirst && str) { str = str.charAt(0).toUpperCase() + str.slice(1); } return str; } var normalizeCssArray = normalizeCssArray$1; function makeValueReadable(value, valueType, useUTC) { var USER_READABLE_DEFUALT_TIME_PATTERN = "{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}"; function stringToUserReadable(str) { return str && trim$1(str) ? str : "-"; } function isNumberUserReadable(num) { return !!(num != null && !isNaN(num) && isFinite(num)); } var isTypeTime = valueType === "time"; var isValueDate = value instanceof Date; if (isTypeTime || isValueDate) { var date = isTypeTime ? parseDate(value) : value; if (!isNaN(+date)) { return format(date, USER_READABLE_DEFUALT_TIME_PATTERN, useUTC); } else if (isValueDate) { return "-"; } } if (valueType === "ordinal") { return isStringSafe(value) ? stringToUserReadable(value) : isNumber(value) ? isNumberUserReadable(value) ? value + "" : "-" : "-"; } var numericResult = numericToNumber(value); return isNumberUserReadable(numericResult) ? addCommas(numericResult) : isStringSafe(value) ? stringToUserReadable(value) : typeof value === "boolean" ? value + "" : "-"; } var TPL_VAR_ALIAS = ["a", "b", "c", "d", "e", "f", "g"]; var wrapVar = function(varName, seriesIdx) { return "{" + varName + (seriesIdx == null ? "" : seriesIdx) + "}"; }; function formatTpl(tpl, paramsList, encode) { if (!isArray$1(paramsList)) { paramsList = [paramsList]; } var seriesLen = paramsList.length; if (!seriesLen) { return ""; } var $vars = paramsList[0].$vars || []; for (var i = 0; i < $vars.length; i++) { var alias = TPL_VAR_ALIAS[i]; tpl = tpl.replace(wrapVar(alias), wrapVar(alias, 0)); } for (var seriesIdx = 0; seriesIdx < seriesLen; seriesIdx++) { for (var k = 0; k < $vars.length; k++) { var val = paramsList[seriesIdx][$vars[k]]; tpl = tpl.replace(wrapVar(TPL_VAR_ALIAS[k], seriesIdx), encode ? encodeHTML(val) : val); } } return tpl; } function formatTplSimple(tpl, param, encode) { each$f(param, function(value, key) { tpl = tpl.replace("{" + key + "}", value); }); return tpl; } function getTooltipMarker(inOpt, extraCssText) { var opt = isString(inOpt) ? { color: inOpt, extraCssText } : inOpt || {}; var color = opt.color; var type = opt.type; extraCssText = opt.extraCssText; var renderMode = opt.renderMode || "html"; if (!color) { return ""; } if (renderMode === "html") { return type === "subItem" ? '' : ''; } else { var markerId = opt.markerId || "markerX"; return { renderMode, content: "{" + markerId + "|} ", style: type === "subItem" ? { width: 4, height: 4, borderRadius: 2, backgroundColor: color } : { width: 10, height: 10, borderRadius: 5, backgroundColor: color } }; } } function convertToColorString(color, defaultColor) { defaultColor = defaultColor || "transparent"; return isString(color) ? color : isObject$3(color) ? color.colorStops && (color.colorStops[0] || {}).color || defaultColor : defaultColor; } function windowOpen(link, target) { if (target === "_blank" || target === "blank") { var blank = window.open(); blank.opener = null; blank.location.href = link; } else { window.open(link, target); } } var each$e = each$f; var LOCATION_PARAMS = ["left", "right", "top", "bottom", "width", "height"]; var HV_NAMES = [["width", "left", "right"], ["height", "top", "bottom"]]; function boxLayout(orient, group, gap, maxWidth, maxHeight) { var x = 0; var y = 0; if (maxWidth == null) { maxWidth = Infinity; } if (maxHeight == null) { maxHeight = Infinity; } var currentLineMaxSize = 0; group.eachChild(function(child, idx) { var rect = child.getBoundingRect(); var nextChild = group.childAt(idx + 1); var nextChildRect = nextChild && nextChild.getBoundingRect(); var nextX; var nextY; if (orient === "horizontal") { var moveX = rect.width + (nextChildRect ? -nextChildRect.x + rect.x : 0); nextX = x + moveX; if (nextX > maxWidth || child.newline) { x = 0; nextX = moveX; y += currentLineMaxSize + gap; currentLineMaxSize = rect.height; } else { currentLineMaxSize = Math.max(currentLineMaxSize, rect.height); } } else { var moveY = rect.height + (nextChildRect ? -nextChildRect.y + rect.y : 0); nextY = y + moveY; if (nextY > maxHeight || child.newline) { x += currentLineMaxSize + gap; y = 0; nextY = moveY; currentLineMaxSize = rect.width; } else { currentLineMaxSize = Math.max(currentLineMaxSize, rect.width); } } if (child.newline) { return; } child.x = x; child.y = y; child.markRedraw(); orient === "horizontal" ? x = nextX + gap : y = nextY + gap; }); } var box = boxLayout; curry$1(boxLayout, "vertical"); curry$1(boxLayout, "horizontal"); function getAvailableSize(positionInfo, containerRect, margin) { var containerWidth = containerRect.width; var containerHeight = containerRect.height; var x = parsePercent(positionInfo.left, containerWidth); var y = parsePercent(positionInfo.top, containerHeight); var x2 = parsePercent(positionInfo.right, containerWidth); var y2 = parsePercent(positionInfo.bottom, containerHeight); (isNaN(x) || isNaN(parseFloat(positionInfo.left))) && (x = 0); (isNaN(x2) || isNaN(parseFloat(positionInfo.right))) && (x2 = containerWidth); (isNaN(y) || isNaN(parseFloat(positionInfo.top))) && (y = 0); (isNaN(y2) || isNaN(parseFloat(positionInfo.bottom))) && (y2 = containerHeight); margin = normalizeCssArray(margin || 0); return { width: Math.max(x2 - x - margin[1] - margin[3], 0), height: Math.max(y2 - y - margin[0] - margin[2], 0) }; } function getLayoutRect(positionInfo, containerRect, margin) { margin = normalizeCssArray(margin || 0); var containerWidth = containerRect.width; var containerHeight = containerRect.height; var left = parsePercent(positionInfo.left, containerWidth); var top = parsePercent(positionInfo.top, containerHeight); var right = parsePercent(positionInfo.right, containerWidth); var bottom = parsePercent(positionInfo.bottom, containerHeight); var width = parsePercent(positionInfo.width, containerWidth); var height = parsePercent(positionInfo.height, containerHeight); var verticalMargin = margin[2] + margin[0]; var horizontalMargin = margin[1] + margin[3]; var aspect = positionInfo.aspect; if (isNaN(width)) { width = containerWidth - right - horizontalMargin - left; } if (isNaN(height)) { height = containerHeight - bottom - verticalMargin - top; } if (aspect != null) { if (isNaN(width) && isNaN(height)) { if (aspect > containerWidth / containerHeight) { width = containerWidth * 0.8; } else { height = containerHeight * 0.8; } } if (isNaN(width)) { width = aspect * height; } if (isNaN(height)) { height = width / aspect; } } if (isNaN(left)) { left = containerWidth - right - width - horizontalMargin; } if (isNaN(top)) { top = containerHeight - bottom - height - verticalMargin; } switch (positionInfo.left || positionInfo.right) { case "center": left = containerWidth / 2 - width / 2 - margin[3]; break; case "right": left = containerWidth - width - horizontalMargin; break; } switch (positionInfo.top || positionInfo.bottom) { case "middle": case "center": top = containerHeight / 2 - height / 2 - margin[0]; break; case "bottom": top = containerHeight - height - verticalMargin; break; } left = left || 0; top = top || 0; if (isNaN(width)) { width = containerWidth - horizontalMargin - left - (right || 0); } if (isNaN(height)) { height = containerHeight - verticalMargin - top - (bottom || 0); } var rect = new BoundingRect(left + margin[3], top + margin[0], width, height); rect.margin = margin; return rect; } function positionElement(el, positionInfo, containerRect, margin, opt, out) { var h = !opt || !opt.hv || opt.hv[0]; var v = !opt || !opt.hv || opt.hv[1]; var boundingMode = opt && opt.boundingMode || "all"; out = out || el; out.x = el.x; out.y = el.y; if (!h && !v) { return false; } var rect; if (boundingMode === "raw") { rect = el.type === "group" ? new BoundingRect(0, 0, +positionInfo.width || 0, +positionInfo.height || 0) : el.getBoundingRect(); } else { rect = el.getBoundingRect(); if (el.needLocalTransform()) { var transform2 = el.getLocalTransform(); rect = rect.clone(); rect.applyTransform(transform2); } } var layoutRect = getLayoutRect(defaults({ width: rect.width, height: rect.height }, positionInfo), containerRect, margin); var dx = h ? layoutRect.x - rect.x : 0; var dy = v ? layoutRect.y - rect.y : 0; if (boundingMode === "raw") { out.x = dx; out.y = dy; } else { out.x += dx; out.y += dy; } if (out === el) { el.markRedraw(); } return true; } function sizeCalculable(option, hvIdx) { return option[HV_NAMES[hvIdx][0]] != null || option[HV_NAMES[hvIdx][1]] != null && option[HV_NAMES[hvIdx][2]] != null; } function fetchLayoutMode(ins) { var layoutMode = ins.layoutMode || ins.constructor.layoutMode; return isObject$3(layoutMode) ? layoutMode : layoutMode ? { type: layoutMode } : null; } function mergeLayoutParam(targetOption, newOption, opt) { var ignoreSize = opt && opt.ignoreSize; !isArray$1(ignoreSize) && (ignoreSize = [ignoreSize, ignoreSize]); var hResult = merge2(HV_NAMES[0], 0); var vResult = merge2(HV_NAMES[1], 1); copy2(HV_NAMES[0], targetOption, hResult); copy2(HV_NAMES[1], targetOption, vResult); function merge2(names, hvIdx) { var newParams = {}; var newValueCount = 0; var merged = {}; var mergedValueCount = 0; var enoughParamNumber = 2; each$e(names, function(name) { merged[name] = targetOption[name]; }); each$e(names, function(name) { hasProp(newOption, name) && (newParams[name] = merged[name] = newOption[name]); hasValue(newParams, name) && newValueCount++; hasValue(merged, name) && mergedValueCount++; }); if (ignoreSize[hvIdx]) { if (hasValue(newOption, names[1])) { merged[names[2]] = null; } else if (hasValue(newOption, names[2])) { merged[names[1]] = null; } return merged; } if (mergedValueCount === enoughParamNumber || !newValueCount) { return merged; } else if (newValueCount >= enoughParamNumber) { return newParams; } else { for (var i = 0; i < names.length; i++) { var name_1 = names[i]; if (!hasProp(newParams, name_1) && hasProp(targetOption, name_1)) { newParams[name_1] = targetOption[name_1]; break; } } return newParams; } } function hasProp(obj, name) { return obj.hasOwnProperty(name); } function hasValue(obj, name) { return obj[name] != null && obj[name] !== "auto"; } function copy2(names, target, source) { each$e(names, function(name) { target[name] = source[name]; }); } } function getLayoutParams(source) { return copyLayoutParams({}, source); } function copyLayoutParams(target, source) { source && target && each$e(LOCATION_PARAMS, function(name) { source.hasOwnProperty(name) && (target[name] = source[name]); }); return target; } var inner$l = makeInner(); var ComponentModel = ( /** @class */ (function(_super) { __extends(ComponentModel2, _super); function ComponentModel2(option, parentModel, ecModel) { var _this = _super.call(this, option, parentModel, ecModel) || this; _this.uid = getUID("ec_cpt_model"); return _this; } ComponentModel2.prototype.init = function(option, parentModel, ecModel) { this.mergeDefaultAndTheme(option, ecModel); }; ComponentModel2.prototype.mergeDefaultAndTheme = function(option, ecModel) { var layoutMode = fetchLayoutMode(this); var inputPositionParams = layoutMode ? getLayoutParams(option) : {}; var themeModel = ecModel.getTheme(); merge(option, themeModel.get(this.mainType)); merge(option, this.getDefaultOption()); if (layoutMode) { mergeLayoutParam(option, inputPositionParams, layoutMode); } }; ComponentModel2.prototype.mergeOption = function(option, ecModel) { merge(this.option, option, true); var layoutMode = fetchLayoutMode(this); if (layoutMode) { mergeLayoutParam(this.option, option, layoutMode); } }; ComponentModel2.prototype.optionUpdated = function(newCptOption, isInit) { }; ComponentModel2.prototype.getDefaultOption = function() { var ctor = this.constructor; if (!isExtendedClass(ctor)) { return ctor.defaultOption; } var fields = inner$l(this); if (!fields.defaultOption) { var optList = []; var clz = ctor; while (clz) { var opt = clz.prototype.defaultOption; opt && optList.push(opt); clz = clz.superClass; } var defaultOption2 = {}; for (var i = optList.length - 1; i >= 0; i--) { defaultOption2 = merge(defaultOption2, optList[i], true); } fields.defaultOption = defaultOption2; } return fields.defaultOption; }; ComponentModel2.prototype.getReferringComponents = function(mainType, opt) { var indexKey = mainType + "Index"; var idKey = mainType + "Id"; return queryReferringComponents(this.ecModel, mainType, { index: this.get(indexKey, true), id: this.get(idKey, true) }, opt); }; ComponentModel2.prototype.getBoxLayoutParams = function() { var boxLayoutModel = this; return { left: boxLayoutModel.get("left"), top: boxLayoutModel.get("top"), right: boxLayoutModel.get("right"), bottom: boxLayoutModel.get("bottom"), width: boxLayoutModel.get("width"), height: boxLayoutModel.get("height") }; }; ComponentModel2.prototype.getZLevelKey = function() { return ""; }; ComponentModel2.prototype.setZLevel = function(zlevel) { this.option.zlevel = zlevel; }; ComponentModel2.protoInitialize = (function() { var proto2 = ComponentModel2.prototype; proto2.type = "component"; proto2.id = ""; proto2.name = ""; proto2.mainType = ""; proto2.subType = ""; proto2.componentIndex = 0; })(); return ComponentModel2; })(Model) ); mountExtend(ComponentModel, Model); enableClassManagement(ComponentModel); enableSubTypeDefaulter(ComponentModel); enableTopologicalTravel(ComponentModel, getDependencies); function getDependencies(componentType) { var deps = []; each$f(ComponentModel.getClassesByMainType(componentType), function(clz) { deps = deps.concat(clz.dependencies || clz.prototype.dependencies || []); }); deps = map$1(deps, function(type) { return parseClassType(type).main; }); if (componentType !== "dataset" && indexOf(deps, "dataset") <= 0) { deps.unshift("dataset"); } return deps; } var platform = ""; if (typeof navigator !== "undefined") { platform = navigator.platform || ""; } var decalColor = "rgba(0, 0, 0, 0.2)"; const globalDefault = { darkMode: "auto", // backgroundColor: 'rgba(0,0,0,0)', colorBy: "series", color: ["#5470c6", "#91cc75", "#fac858", "#ee6666", "#73c0de", "#3ba272", "#fc8452", "#9a60b4", "#ea7ccc"], gradientColor: ["#f6efa6", "#d88273", "#bf444c"], aria: { decal: { decals: [{ color: decalColor, dashArrayX: [1, 0], dashArrayY: [2, 5], symbolSize: 1, rotation: Math.PI / 6 }, { color: decalColor, symbol: "circle", dashArrayX: [[8, 8], [0, 8, 8, 0]], dashArrayY: [6, 0], symbolSize: 0.8 }, { color: decalColor, dashArrayX: [1, 0], dashArrayY: [4, 3], rotation: -Math.PI / 4 }, { color: decalColor, dashArrayX: [[6, 6], [0, 6, 6, 0]], dashArrayY: [6, 0] }, { color: decalColor, dashArrayX: [[1, 0], [1, 6]], dashArrayY: [1, 0, 6, 0], rotation: Math.PI / 4 }, { color: decalColor, symbol: "triangle", dashArrayX: [[9, 9], [0, 9, 9, 0]], dashArrayY: [7, 2], symbolSize: 0.75 }] } }, // If xAxis and yAxis declared, grid is created by default. // grid: {}, textStyle: { // color: '#000', // decoration: 'none', // PENDING fontFamily: platform.match(/^Win/) ? "Microsoft YaHei" : "sans-serif", // fontFamily: 'Arial, Verdana, sans-serif', fontSize: 12, fontStyle: "normal", fontWeight: "normal" }, // http://blogs.adobe.com/webplatform/2014/02/24/using-blend-modes-in-html-canvas/ // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation // Default is source-over blendMode: null, stateAnimation: { duration: 300, easing: "cubicOut" }, animation: "auto", animationDuration: 1e3, animationDurationUpdate: 500, animationEasing: "cubicInOut", animationEasingUpdate: "cubicInOut", animationThreshold: 2e3, // Configuration for progressive/incremental rendering progressiveThreshold: 3e3, progressive: 400, // Threshold of if use single hover layer to optimize. // It is recommended that `hoverLayerThreshold` is equivalent to or less than // `progressiveThreshold`, otherwise hover will cause restart of progressive, // which is unexpected. // see example . hoverLayerThreshold: 3e3, // See: module:echarts/scale/Time useUTC: false }; var VISUAL_DIMENSIONS = createHashMap(["tooltip", "label", "itemName", "itemId", "itemGroupId", "itemChildGroupId", "seriesName"]); var SOURCE_FORMAT_ORIGINAL = "original"; var SOURCE_FORMAT_ARRAY_ROWS = "arrayRows"; var SOURCE_FORMAT_OBJECT_ROWS = "objectRows"; var SOURCE_FORMAT_KEYED_COLUMNS = "keyedColumns"; var SOURCE_FORMAT_TYPED_ARRAY = "typedArray"; var SOURCE_FORMAT_UNKNOWN = "unknown"; var SERIES_LAYOUT_BY_COLUMN = "column"; var SERIES_LAYOUT_BY_ROW = "row"; var BE_ORDINAL = { Must: 1, Might: 2, Not: 3 // Other cases }; var innerGlobalModel = makeInner(); function resetSourceDefaulter(ecModel) { innerGlobalModel(ecModel).datasetMap = createHashMap(); } function makeSeriesEncodeForAxisCoordSys(coordDimensions, seriesModel, source) { var encode = {}; var datasetModel = querySeriesUpstreamDatasetModel(seriesModel); if (!datasetModel || !coordDimensions) { return encode; } var encodeItemName = []; var encodeSeriesName = []; var ecModel = seriesModel.ecModel; var datasetMap = innerGlobalModel(ecModel).datasetMap; var key = datasetModel.uid + "_" + source.seriesLayoutBy; var baseCategoryDimIndex; var categoryWayValueDimStart; coordDimensions = coordDimensions.slice(); each$f(coordDimensions, function(coordDimInfoLoose, coordDimIdx) { var coordDimInfo = isObject$3(coordDimInfoLoose) ? coordDimInfoLoose : coordDimensions[coordDimIdx] = { name: coordDimInfoLoose }; if (coordDimInfo.type === "ordinal" && baseCategoryDimIndex == null) { baseCategoryDimIndex = coordDimIdx; categoryWayValueDimStart = getDataDimCountOnCoordDim(coordDimInfo); } encode[coordDimInfo.name] = []; }); var datasetRecord = datasetMap.get(key) || datasetMap.set(key, { categoryWayDim: categoryWayValueDimStart, valueWayDim: 0 }); each$f(coordDimensions, function(coordDimInfo, coordDimIdx) { var coordDimName = coordDimInfo.name; var count2 = getDataDimCountOnCoordDim(coordDimInfo); if (baseCategoryDimIndex == null) { var start = datasetRecord.valueWayDim; pushDim(encode[coordDimName], start, count2); pushDim(encodeSeriesName, start, count2); datasetRecord.valueWayDim += count2; } else if (baseCategoryDimIndex === coordDimIdx) { pushDim(encode[coordDimName], 0, count2); pushDim(encodeItemName, 0, count2); } else { var start = datasetRecord.categoryWayDim; pushDim(encode[coordDimName], start, count2); pushDim(encodeSeriesName, start, count2); datasetRecord.categoryWayDim += count2; } }); function pushDim(dimIdxArr, idxFrom, idxCount) { for (var i = 0; i < idxCount; i++) { dimIdxArr.push(idxFrom + i); } } function getDataDimCountOnCoordDim(coordDimInfo) { var dimsDef = coordDimInfo.dimsDef; return dimsDef ? dimsDef.length : 1; } encodeItemName.length && (encode.itemName = encodeItemName); encodeSeriesName.length && (encode.seriesName = encodeSeriesName); return encode; } function makeSeriesEncodeForNameBased(seriesModel, source, dimCount) { var encode = {}; var datasetModel = querySeriesUpstreamDatasetModel(seriesModel); if (!datasetModel) { return encode; } var sourceFormat = source.sourceFormat; var dimensionsDefine = source.dimensionsDefine; var potentialNameDimIndex; if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS || sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) { each$f(dimensionsDefine, function(dim, idx) { if ((isObject$3(dim) ? dim.name : dim) === "name") { potentialNameDimIndex = idx; } }); } var idxResult = (function() { var idxRes0 = {}; var idxRes1 = {}; var guessRecords = []; for (var i = 0, len2 = Math.min(5, dimCount); i < len2; i++) { var guessResult = doGuessOrdinal(source.data, sourceFormat, source.seriesLayoutBy, dimensionsDefine, source.startIndex, i); guessRecords.push(guessResult); var isPureNumber = guessResult === BE_ORDINAL.Not; if (isPureNumber && idxRes0.v == null && i !== potentialNameDimIndex) { idxRes0.v = i; } if (idxRes0.n == null || idxRes0.n === idxRes0.v || !isPureNumber && guessRecords[idxRes0.n] === BE_ORDINAL.Not) { idxRes0.n = i; } if (fulfilled(idxRes0) && guessRecords[idxRes0.n] !== BE_ORDINAL.Not) { return idxRes0; } if (!isPureNumber) { if (guessResult === BE_ORDINAL.Might && idxRes1.v == null && i !== potentialNameDimIndex) { idxRes1.v = i; } if (idxRes1.n == null || idxRes1.n === idxRes1.v) { idxRes1.n = i; } } } function fulfilled(idxResult2) { return idxResult2.v != null && idxResult2.n != null; } return fulfilled(idxRes0) ? idxRes0 : fulfilled(idxRes1) ? idxRes1 : null; })(); if (idxResult) { encode.value = [idxResult.v]; var nameDimIndex = potentialNameDimIndex != null ? potentialNameDimIndex : idxResult.n; encode.itemName = [nameDimIndex]; encode.seriesName = [nameDimIndex]; } return encode; } function querySeriesUpstreamDatasetModel(seriesModel) { var thisData = seriesModel.get("data", true); if (!thisData) { return queryReferringComponents(seriesModel.ecModel, "dataset", { index: seriesModel.get("datasetIndex", true), id: seriesModel.get("datasetId", true) }, SINGLE_REFERRING).models[0]; } } function queryDatasetUpstreamDatasetModels(datasetModel) { if (!datasetModel.get("transform", true) && !datasetModel.get("fromTransformResult", true)) { return []; } return queryReferringComponents(datasetModel.ecModel, "dataset", { index: datasetModel.get("fromDatasetIndex", true), id: datasetModel.get("fromDatasetId", true) }, SINGLE_REFERRING).models; } function guessOrdinal(source, dimIndex) { return doGuessOrdinal(source.data, source.sourceFormat, source.seriesLayoutBy, source.dimensionsDefine, source.startIndex, dimIndex); } function doGuessOrdinal(data, sourceFormat, seriesLayoutBy, dimensionsDefine, startIndex, dimIndex) { var result; var maxLoop = 5; if (isTypedArray(data)) { return BE_ORDINAL.Not; } var dimName; var dimType; if (dimensionsDefine) { var dimDefItem = dimensionsDefine[dimIndex]; if (isObject$3(dimDefItem)) { dimName = dimDefItem.name; dimType = dimDefItem.type; } else if (isString(dimDefItem)) { dimName = dimDefItem; } } if (dimType != null) { return dimType === "ordinal" ? BE_ORDINAL.Must : BE_ORDINAL.Not; } if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) { var dataArrayRows = data; if (seriesLayoutBy === SERIES_LAYOUT_BY_ROW) { var sample = dataArrayRows[dimIndex]; for (var i = 0; i < (sample || []).length && i < maxLoop; i++) { if ((result = detectValue(sample[startIndex + i])) != null) { return result; } } } else { for (var i = 0; i < dataArrayRows.length && i < maxLoop; i++) { var row = dataArrayRows[startIndex + i]; if (row && (result = detectValue(row[dimIndex])) != null) { return result; } } } } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) { var dataObjectRows = data; if (!dimName) { return BE_ORDINAL.Not; } for (var i = 0; i < dataObjectRows.length && i < maxLoop; i++) { var item = dataObjectRows[i]; if (item && (result = detectValue(item[dimName])) != null) { return result; } } } else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) { var dataKeyedColumns = data; if (!dimName) { return BE_ORDINAL.Not; } var sample = dataKeyedColumns[dimName]; if (!sample || isTypedArray(sample)) { return BE_ORDINAL.Not; } for (var i = 0; i < sample.length && i < maxLoop; i++) { if ((result = detectValue(sample[i])) != null) { return result; } } } else if (sourceFormat === SOURCE_FORMAT_ORIGINAL) { var dataOriginal = data; for (var i = 0; i < dataOriginal.length && i < maxLoop; i++) { var item = dataOriginal[i]; var val = getDataItemValue(item); if (!isArray$1(val)) { return BE_ORDINAL.Not; } if ((result = detectValue(val[dimIndex])) != null) { return result; } } } function detectValue(val2) { var beStr = isString(val2); if (val2 != null && Number.isFinite(Number(val2)) && val2 !== "") { return beStr ? BE_ORDINAL.Might : BE_ORDINAL.Not; } else if (beStr && val2 !== "-") { return BE_ORDINAL.Must; } } return BE_ORDINAL.Not; } var internalOptionCreatorMap = createHashMap(); function registerInternalOptionCreator(mainType, creator) { assert(internalOptionCreatorMap.get(mainType) == null && creator); internalOptionCreatorMap.set(mainType, creator); } function concatInternalOptions(ecModel, mainType, newCmptOptionList) { var internalOptionCreator = internalOptionCreatorMap.get(mainType); if (!internalOptionCreator) { return newCmptOptionList; } var internalOptions = internalOptionCreator(ecModel); if (!internalOptions) { return newCmptOptionList; } return newCmptOptionList.concat(internalOptions); } var innerColor = makeInner(); var innerDecal = makeInner(); var PaletteMixin = ( /** @class */ (function() { function PaletteMixin2() { } PaletteMixin2.prototype.getColorFromPalette = function(name, scope, requestNum) { var defaultPalette = normalizeToArray(this.get("color", true)); var layeredPalette = this.get("colorLayer", true); return getFromPalette(this, innerColor, defaultPalette, layeredPalette, name, scope, requestNum); }; PaletteMixin2.prototype.clearColorPalette = function() { clearPalette(this, innerColor); }; return PaletteMixin2; })() ); function getDecalFromPalette(ecModel, name, scope, requestNum) { var defaultDecals = normalizeToArray(ecModel.get(["aria", "decal", "decals"])); return getFromPalette(ecModel, innerDecal, defaultDecals, null, name, scope, requestNum); } function getNearestPalette(palettes, requestColorNum) { var paletteNum = palettes.length; for (var i = 0; i < paletteNum; i++) { if (palettes[i].length > requestColorNum) { return palettes[i]; } } return palettes[paletteNum - 1]; } function getFromPalette(that, inner2, defaultPalette, layeredPalette, name, scope, requestNum) { scope = scope || that; var scopeFields = inner2(scope); var paletteIdx = scopeFields.paletteIdx || 0; var paletteNameMap = scopeFields.paletteNameMap = scopeFields.paletteNameMap || {}; if (paletteNameMap.hasOwnProperty(name)) { return paletteNameMap[name]; } var palette = requestNum == null || !layeredPalette ? defaultPalette : getNearestPalette(layeredPalette, requestNum); palette = palette || defaultPalette; if (!palette || !palette.length) { return; } var pickedPaletteItem = palette[paletteIdx]; if (name) { paletteNameMap[name] = pickedPaletteItem; } scopeFields.paletteIdx = (paletteIdx + 1) % palette.length; return pickedPaletteItem; } function clearPalette(that, inner2) { inner2(that).paletteIdx = 0; inner2(that).paletteNameMap = {}; } var reCreateSeriesIndices; var assertSeriesInitialized; var initBase; var OPTION_INNER_KEY = "\0_ec_inner"; var OPTION_INNER_VALUE = 1; var GlobalModel = ( /** @class */ (function(_super) { __extends(GlobalModel2, _super); function GlobalModel2() { return _super !== null && _super.apply(this, arguments) || this; } GlobalModel2.prototype.init = function(option, parentModel, ecModel, theme2, locale, optionManager) { theme2 = theme2 || {}; this.option = null; this._theme = new Model(theme2); this._locale = new Model(locale); this._optionManager = optionManager; }; GlobalModel2.prototype.setOption = function(option, opts, optionPreprocessorFuncs2) { var innerOpt = normalizeSetOptionInput(opts); this._optionManager.setOption(option, optionPreprocessorFuncs2, innerOpt); this._resetOption(null, innerOpt); }; GlobalModel2.prototype.resetOption = function(type, opt) { return this._resetOption(type, normalizeSetOptionInput(opt)); }; GlobalModel2.prototype._resetOption = function(type, opt) { var optionChanged = false; var optionManager = this._optionManager; if (!type || type === "recreate") { var baseOption = optionManager.mountOption(type === "recreate"); if (!this.option || type === "recreate") { initBase(this, baseOption); } else { this.restoreData(); this._mergeOption(baseOption, opt); } optionChanged = true; } if (type === "timeline" || type === "media") { this.restoreData(); } if (!type || type === "recreate" || type === "timeline") { var timelineOption = optionManager.getTimelineOption(this); if (timelineOption) { optionChanged = true; this._mergeOption(timelineOption, opt); } } if (!type || type === "recreate" || type === "media") { var mediaOptions = optionManager.getMediaOption(this); if (mediaOptions.length) { each$f(mediaOptions, function(mediaOption) { optionChanged = true; this._mergeOption(mediaOption, opt); }, this); } } return optionChanged; }; GlobalModel2.prototype.mergeOption = function(option) { this._mergeOption(option, null); }; GlobalModel2.prototype._mergeOption = function(newOption, opt) { var option = this.option; var componentsMap = this._componentsMap; var componentsCount = this._componentsCount; var newCmptTypes = []; var newCmptTypeMap = createHashMap(); var replaceMergeMainTypeMap = opt && opt.replaceMergeMainTypeMap; resetSourceDefaulter(this); each$f(newOption, function(componentOption, mainType) { if (componentOption == null) { return; } if (!ComponentModel.hasClass(mainType)) { option[mainType] = option[mainType] == null ? clone$1(componentOption) : merge(option[mainType], componentOption, true); } else if (mainType) { newCmptTypes.push(mainType); newCmptTypeMap.set(mainType, true); } }); if (replaceMergeMainTypeMap) { replaceMergeMainTypeMap.each(function(val, mainTypeInReplaceMerge) { if (ComponentModel.hasClass(mainTypeInReplaceMerge) && !newCmptTypeMap.get(mainTypeInReplaceMerge)) { newCmptTypes.push(mainTypeInReplaceMerge); newCmptTypeMap.set(mainTypeInReplaceMerge, true); } }); } ComponentModel.topologicalTravel(newCmptTypes, ComponentModel.getAllClassMainTypes(), visitComponent, this); function visitComponent(mainType) { var newCmptOptionList = concatInternalOptions(this, mainType, normalizeToArray(newOption[mainType])); var oldCmptList = componentsMap.get(mainType); var mergeMode = ( // `!oldCmptList` means init. See the comment in `mappingToExists` !oldCmptList ? "replaceAll" : replaceMergeMainTypeMap && replaceMergeMainTypeMap.get(mainType) ? "replaceMerge" : "normalMerge" ); var mappingResult = mappingToExists(oldCmptList, newCmptOptionList, mergeMode); setComponentTypeToKeyInfo(mappingResult, mainType, ComponentModel); option[mainType] = null; componentsMap.set(mainType, null); componentsCount.set(mainType, 0); var optionsByMainType = []; var cmptsByMainType = []; var cmptsCountByMainType = 0; var tooltipExists; each$f(mappingResult, function(resultItem, index) { var componentModel = resultItem.existing; var newCmptOption = resultItem.newOption; if (!newCmptOption) { if (componentModel) { componentModel.mergeOption({}, this); componentModel.optionUpdated({}, false); } } else { var isSeriesType = mainType === "series"; var ComponentModelClass = ComponentModel.getClass( mainType, resultItem.keyInfo.subType, !isSeriesType // Give a more detailed warn later if series don't exists ); if (!ComponentModelClass) { return; } if (mainType === "tooltip") { if (tooltipExists) { return; } tooltipExists = true; } if (componentModel && componentModel.constructor === ComponentModelClass) { componentModel.name = resultItem.keyInfo.name; componentModel.mergeOption(newCmptOption, this); componentModel.optionUpdated(newCmptOption, false); } else { var extraOpt = extend({ componentIndex: index }, resultItem.keyInfo); componentModel = new ComponentModelClass(newCmptOption, this, this, extraOpt); extend(componentModel, extraOpt); if (resultItem.brandNew) { componentModel.__requireNewView = true; } componentModel.init(newCmptOption, this, this); componentModel.optionUpdated(null, true); } } if (componentModel) { optionsByMainType.push(componentModel.option); cmptsByMainType.push(componentModel); cmptsCountByMainType++; } else { optionsByMainType.push(void 0); cmptsByMainType.push(void 0); } }, this); option[mainType] = optionsByMainType; componentsMap.set(mainType, cmptsByMainType); componentsCount.set(mainType, cmptsCountByMainType); if (mainType === "series") { reCreateSeriesIndices(this); } } if (!this._seriesIndices) { reCreateSeriesIndices(this); } }; GlobalModel2.prototype.getOption = function() { var option = clone$1(this.option); each$f(option, function(optInMainType, mainType) { if (ComponentModel.hasClass(mainType)) { var opts = normalizeToArray(optInMainType); var realLen = opts.length; var metNonInner = false; for (var i = realLen - 1; i >= 0; i--) { if (opts[i] && !isComponentIdInternal(opts[i])) { metNonInner = true; } else { opts[i] = null; !metNonInner && realLen--; } } opts.length = realLen; option[mainType] = opts; } }); delete option[OPTION_INNER_KEY]; return option; }; GlobalModel2.prototype.getTheme = function() { return this._theme; }; GlobalModel2.prototype.getLocaleModel = function() { return this._locale; }; GlobalModel2.prototype.setUpdatePayload = function(payload) { this._payload = payload; }; GlobalModel2.prototype.getUpdatePayload = function() { return this._payload; }; GlobalModel2.prototype.getComponent = function(mainType, idx) { var list = this._componentsMap.get(mainType); if (list) { var cmpt = list[idx || 0]; if (cmpt) { return cmpt; } else if (idx == null) { for (var i = 0; i < list.length; i++) { if (list[i]) { return list[i]; } } } } }; GlobalModel2.prototype.queryComponents = function(condition) { var mainType = condition.mainType; if (!mainType) { return []; } var index = condition.index; var id = condition.id; var name = condition.name; var cmpts = this._componentsMap.get(mainType); if (!cmpts || !cmpts.length) { return []; } var result; if (index != null) { result = []; each$f(normalizeToArray(index), function(idx) { cmpts[idx] && result.push(cmpts[idx]); }); } else if (id != null) { result = queryByIdOrName("id", id, cmpts); } else if (name != null) { result = queryByIdOrName("name", name, cmpts); } else { result = filter(cmpts, function(cmpt) { return !!cmpt; }); } return filterBySubType(result, condition); }; GlobalModel2.prototype.findComponents = function(condition) { var query = condition.query; var mainType = condition.mainType; var queryCond = getQueryCond(query); var result = queryCond ? this.queryComponents(queryCond) : filter(this._componentsMap.get(mainType), function(cmpt) { return !!cmpt; }); return doFilter(filterBySubType(result, condition)); function getQueryCond(q) { var indexAttr = mainType + "Index"; var idAttr = mainType + "Id"; var nameAttr = mainType + "Name"; return q && (q[indexAttr] != null || q[idAttr] != null || q[nameAttr] != null) ? { mainType, // subType will be filtered finally. index: q[indexAttr], id: q[idAttr], name: q[nameAttr] } : null; } function doFilter(res) { return condition.filter ? filter(res, condition.filter) : res; } }; GlobalModel2.prototype.eachComponent = function(mainType, cb, context) { var componentsMap = this._componentsMap; if (isFunction(mainType)) { var ctxForAll_1 = cb; var cbForAll_1 = mainType; componentsMap.each(function(cmpts2, componentType) { for (var i2 = 0; cmpts2 && i2 < cmpts2.length; i2++) { var cmpt2 = cmpts2[i2]; cmpt2 && cbForAll_1.call(ctxForAll_1, componentType, cmpt2, cmpt2.componentIndex); } }); } else { var cmpts = isString(mainType) ? componentsMap.get(mainType) : isObject$3(mainType) ? this.findComponents(mainType) : null; for (var i = 0; cmpts && i < cmpts.length; i++) { var cmpt = cmpts[i]; cmpt && cb.call(context, cmpt, cmpt.componentIndex); } } }; GlobalModel2.prototype.getSeriesByName = function(name) { var nameStr = convertOptionIdName(name, null); return filter(this._componentsMap.get("series"), function(oneSeries) { return !!oneSeries && nameStr != null && oneSeries.name === nameStr; }); }; GlobalModel2.prototype.getSeriesByIndex = function(seriesIndex) { return this._componentsMap.get("series")[seriesIndex]; }; GlobalModel2.prototype.getSeriesByType = function(subType) { return filter(this._componentsMap.get("series"), function(oneSeries) { return !!oneSeries && oneSeries.subType === subType; }); }; GlobalModel2.prototype.getSeries = function() { return filter(this._componentsMap.get("series"), function(oneSeries) { return !!oneSeries; }); }; GlobalModel2.prototype.getSeriesCount = function() { return this._componentsCount.get("series"); }; GlobalModel2.prototype.eachSeries = function(cb, context) { assertSeriesInitialized(this); each$f(this._seriesIndices, function(rawSeriesIndex) { var series = this._componentsMap.get("series")[rawSeriesIndex]; cb.call(context, series, rawSeriesIndex); }, this); }; GlobalModel2.prototype.eachRawSeries = function(cb, context) { each$f(this._componentsMap.get("series"), function(series) { series && cb.call(context, series, series.componentIndex); }); }; GlobalModel2.prototype.eachSeriesByType = function(subType, cb, context) { assertSeriesInitialized(this); each$f(this._seriesIndices, function(rawSeriesIndex) { var series = this._componentsMap.get("series")[rawSeriesIndex]; if (series.subType === subType) { cb.call(context, series, rawSeriesIndex); } }, this); }; GlobalModel2.prototype.eachRawSeriesByType = function(subType, cb, context) { return each$f(this.getSeriesByType(subType), cb, context); }; GlobalModel2.prototype.isSeriesFiltered = function(seriesModel) { assertSeriesInitialized(this); return this._seriesIndicesMap.get(seriesModel.componentIndex) == null; }; GlobalModel2.prototype.getCurrentSeriesIndices = function() { return (this._seriesIndices || []).slice(); }; GlobalModel2.prototype.filterSeries = function(cb, context) { assertSeriesInitialized(this); var newSeriesIndices = []; each$f(this._seriesIndices, function(seriesRawIdx) { var series = this._componentsMap.get("series")[seriesRawIdx]; cb.call(context, series, seriesRawIdx) && newSeriesIndices.push(seriesRawIdx); }, this); this._seriesIndices = newSeriesIndices; this._seriesIndicesMap = createHashMap(newSeriesIndices); }; GlobalModel2.prototype.restoreData = function(payload) { reCreateSeriesIndices(this); var componentsMap = this._componentsMap; var componentTypes = []; componentsMap.each(function(components, componentType) { if (ComponentModel.hasClass(componentType)) { componentTypes.push(componentType); } }); ComponentModel.topologicalTravel(componentTypes, ComponentModel.getAllClassMainTypes(), function(componentType) { each$f(componentsMap.get(componentType), function(component) { if (component && (componentType !== "series" || !isNotTargetSeries(component, payload))) { component.restoreData(); } }); }); }; GlobalModel2.internalField = (function() { reCreateSeriesIndices = function(ecModel) { var seriesIndices = ecModel._seriesIndices = []; each$f(ecModel._componentsMap.get("series"), function(series) { series && seriesIndices.push(series.componentIndex); }); ecModel._seriesIndicesMap = createHashMap(seriesIndices); }; assertSeriesInitialized = function(ecModel) { }; initBase = function(ecModel, baseOption) { ecModel.option = {}; ecModel.option[OPTION_INNER_KEY] = OPTION_INNER_VALUE; ecModel._componentsMap = createHashMap({ series: [] }); ecModel._componentsCount = createHashMap(); var airaOption = baseOption.aria; if (isObject$3(airaOption) && airaOption.enabled == null) { airaOption.enabled = true; } mergeTheme(baseOption, ecModel._theme.option); merge(baseOption, globalDefault, false); ecModel._mergeOption(baseOption, null); }; })(); return GlobalModel2; })(Model) ); function isNotTargetSeries(seriesModel, payload) { if (payload) { var index = payload.seriesIndex; var id = payload.seriesId; var name_1 = payload.seriesName; return index != null && seriesModel.componentIndex !== index || id != null && seriesModel.id !== id || name_1 != null && seriesModel.name !== name_1; } } function mergeTheme(option, theme2) { var notMergeColorLayer = option.color && !option.colorLayer; each$f(theme2, function(themeItem, name) { if (name === "colorLayer" && notMergeColorLayer) { return; } if (!ComponentModel.hasClass(name)) { if (typeof themeItem === "object") { option[name] = !option[name] ? clone$1(themeItem) : merge(option[name], themeItem, false); } else { if (option[name] == null) { option[name] = themeItem; } } } }); } function queryByIdOrName(attr, idOrName, cmpts) { if (isArray$1(idOrName)) { var keyMap_1 = createHashMap(); each$f(idOrName, function(idOrNameItem) { if (idOrNameItem != null) { var idName = convertOptionIdName(idOrNameItem, null); idName != null && keyMap_1.set(idOrNameItem, true); } }); return filter(cmpts, function(cmpt) { return cmpt && keyMap_1.get(cmpt[attr]); }); } else { var idName_1 = convertOptionIdName(idOrName, null); return filter(cmpts, function(cmpt) { return cmpt && idName_1 != null && cmpt[attr] === idName_1; }); } } function filterBySubType(components, condition) { return condition.hasOwnProperty("subType") ? filter(components, function(cmpt) { return cmpt && cmpt.subType === condition.subType; }) : components; } function normalizeSetOptionInput(opts) { var replaceMergeMainTypeMap = createHashMap(); opts && each$f(normalizeToArray(opts.replaceMerge), function(mainType) { replaceMergeMainTypeMap.set(mainType, true); }); return { replaceMergeMainTypeMap }; } mixin(GlobalModel, PaletteMixin); var availableMethods = [ "getDom", "getZr", "getWidth", "getHeight", "getDevicePixelRatio", "dispatchAction", "isSSR", "isDisposed", "on", "off", "getDataURL", "getConnectedDataURL", // 'getModel', "getOption", // 'getViewOfComponentModel', // 'getViewOfSeriesModel', "getId", "updateLabelLayout" ]; var ExtensionAPI = ( /** @class */ /* @__PURE__ */ (function() { function ExtensionAPI2(ecInstance) { each$f(availableMethods, function(methodName) { this[methodName] = bind$1(ecInstance[methodName], ecInstance); }, this); } return ExtensionAPI2; })() ); var coordinateSystemCreators = {}; var CoordinateSystemManager = ( /** @class */ (function() { function CoordinateSystemManager2() { this._coordinateSystems = []; } CoordinateSystemManager2.prototype.create = function(ecModel, api) { var coordinateSystems = []; each$f(coordinateSystemCreators, function(creator, type) { var list = creator.create(ecModel, api); coordinateSystems = coordinateSystems.concat(list || []); }); this._coordinateSystems = coordinateSystems; }; CoordinateSystemManager2.prototype.update = function(ecModel, api) { each$f(this._coordinateSystems, function(coordSys) { coordSys.update && coordSys.update(ecModel, api); }); }; CoordinateSystemManager2.prototype.getCoordinateSystems = function() { return this._coordinateSystems.slice(); }; CoordinateSystemManager2.register = function(type, creator) { coordinateSystemCreators[type] = creator; }; CoordinateSystemManager2.get = function(type) { return coordinateSystemCreators[type]; }; return CoordinateSystemManager2; })() ); var QUERY_REG = /^(min|max)?(.+)$/; var OptionManager = ( /** @class */ (function() { function OptionManager2(api) { this._timelineOptions = []; this._mediaList = []; this._currentMediaIndices = []; this._api = api; } OptionManager2.prototype.setOption = function(rawOption, optionPreprocessorFuncs2, opt) { if (rawOption) { each$f(normalizeToArray(rawOption.series), function(series) { series && series.data && isTypedArray(series.data) && setAsPrimitive(series.data); }); each$f(normalizeToArray(rawOption.dataset), function(dataset) { dataset && dataset.source && isTypedArray(dataset.source) && setAsPrimitive(dataset.source); }); } rawOption = clone$1(rawOption); var optionBackup = this._optionBackup; var newParsedOption = parseRawOption(rawOption, optionPreprocessorFuncs2, !optionBackup); this._newBaseOption = newParsedOption.baseOption; if (optionBackup) { if (newParsedOption.timelineOptions.length) { optionBackup.timelineOptions = newParsedOption.timelineOptions; } if (newParsedOption.mediaList.length) { optionBackup.mediaList = newParsedOption.mediaList; } if (newParsedOption.mediaDefault) { optionBackup.mediaDefault = newParsedOption.mediaDefault; } } else { this._optionBackup = newParsedOption; } }; OptionManager2.prototype.mountOption = function(isRecreate) { var optionBackup = this._optionBackup; this._timelineOptions = optionBackup.timelineOptions; this._mediaList = optionBackup.mediaList; this._mediaDefault = optionBackup.mediaDefault; this._currentMediaIndices = []; return clone$1(isRecreate ? optionBackup.baseOption : this._newBaseOption); }; OptionManager2.prototype.getTimelineOption = function(ecModel) { var option; var timelineOptions = this._timelineOptions; if (timelineOptions.length) { var timelineModel = ecModel.getComponent("timeline"); if (timelineModel) { option = clone$1( // FIXME:TS as TimelineModel or quivlant interface timelineOptions[timelineModel.getCurrentIndex()] ); } } return option; }; OptionManager2.prototype.getMediaOption = function(ecModel) { var ecWidth = this._api.getWidth(); var ecHeight = this._api.getHeight(); var mediaList = this._mediaList; var mediaDefault = this._mediaDefault; var indices = []; var result = []; if (!mediaList.length && !mediaDefault) { return result; } for (var i = 0, len2 = mediaList.length; i < len2; i++) { if (applyMediaQuery(mediaList[i].query, ecWidth, ecHeight)) { indices.push(i); } } if (!indices.length && mediaDefault) { indices = [-1]; } if (indices.length && !indicesEquals(indices, this._currentMediaIndices)) { result = map$1(indices, function(index) { return clone$1(index === -1 ? mediaDefault.option : mediaList[index].option); }); } this._currentMediaIndices = indices; return result; }; return OptionManager2; })() ); function parseRawOption(rawOption, optionPreprocessorFuncs2, isNew) { var mediaList = []; var mediaDefault; var baseOption; var declaredBaseOption = rawOption.baseOption; var timelineOnRoot = rawOption.timeline; var timelineOptionsOnRoot = rawOption.options; var mediaOnRoot = rawOption.media; var hasMedia = !!rawOption.media; var hasTimeline = !!(timelineOptionsOnRoot || timelineOnRoot || declaredBaseOption && declaredBaseOption.timeline); if (declaredBaseOption) { baseOption = declaredBaseOption; if (!baseOption.timeline) { baseOption.timeline = timelineOnRoot; } } else { if (hasTimeline || hasMedia) { rawOption.options = rawOption.media = null; } baseOption = rawOption; } if (hasMedia) { if (isArray$1(mediaOnRoot)) { each$f(mediaOnRoot, function(singleMedia) { if (singleMedia && singleMedia.option) { if (singleMedia.query) { mediaList.push(singleMedia); } else if (!mediaDefault) { mediaDefault = singleMedia; } } }); } } doPreprocess(baseOption); each$f(timelineOptionsOnRoot, function(option) { return doPreprocess(option); }); each$f(mediaList, function(media) { return doPreprocess(media.option); }); function doPreprocess(option) { each$f(optionPreprocessorFuncs2, function(preProcess) { preProcess(option, isNew); }); } return { baseOption, timelineOptions: timelineOptionsOnRoot || [], mediaDefault, mediaList }; } function applyMediaQuery(query, ecWidth, ecHeight) { var realMap = { width: ecWidth, height: ecHeight, aspectratio: ecWidth / ecHeight // lower case for convenience. }; var applicable = true; each$f(query, function(value, attr) { var matched = attr.match(QUERY_REG); if (!matched || !matched[1] || !matched[2]) { return; } var operator = matched[1]; var realAttr = matched[2].toLowerCase(); if (!compare(realMap[realAttr], value, operator)) { applicable = false; } }); return applicable; } function compare(real, expect, operator) { if (operator === "min") { return real >= expect; } else if (operator === "max") { return real <= expect; } else { return real === expect; } } function indicesEquals(indices1, indices2) { return indices1.join(",") === indices2.join(","); } var each$d = each$f; var isObject$2 = isObject$3; var POSSIBLE_STYLES = ["areaStyle", "lineStyle", "nodeStyle", "linkStyle", "chordStyle", "label", "labelLine"]; function compatEC2ItemStyle(opt) { var itemStyleOpt = opt && opt.itemStyle; if (!itemStyleOpt) { return; } for (var i = 0, len2 = POSSIBLE_STYLES.length; i < len2; i++) { var styleName = POSSIBLE_STYLES[i]; var normalItemStyleOpt = itemStyleOpt.normal; var emphasisItemStyleOpt = itemStyleOpt.emphasis; if (normalItemStyleOpt && normalItemStyleOpt[styleName]) { opt[styleName] = opt[styleName] || {}; if (!opt[styleName].normal) { opt[styleName].normal = normalItemStyleOpt[styleName]; } else { merge(opt[styleName].normal, normalItemStyleOpt[styleName]); } normalItemStyleOpt[styleName] = null; } if (emphasisItemStyleOpt && emphasisItemStyleOpt[styleName]) { opt[styleName] = opt[styleName] || {}; if (!opt[styleName].emphasis) { opt[styleName].emphasis = emphasisItemStyleOpt[styleName]; } else { merge(opt[styleName].emphasis, emphasisItemStyleOpt[styleName]); } emphasisItemStyleOpt[styleName] = null; } } } function convertNormalEmphasis(opt, optType, useExtend) { if (opt && opt[optType] && (opt[optType].normal || opt[optType].emphasis)) { var normalOpt = opt[optType].normal; var emphasisOpt = opt[optType].emphasis; if (normalOpt) { if (useExtend) { opt[optType].normal = opt[optType].emphasis = null; defaults(opt[optType], normalOpt); } else { opt[optType] = normalOpt; } } if (emphasisOpt) { opt.emphasis = opt.emphasis || {}; opt.emphasis[optType] = emphasisOpt; if (emphasisOpt.focus) { opt.emphasis.focus = emphasisOpt.focus; } if (emphasisOpt.blurScope) { opt.emphasis.blurScope = emphasisOpt.blurScope; } } } } function removeEC3NormalStatus(opt) { convertNormalEmphasis(opt, "itemStyle"); convertNormalEmphasis(opt, "lineStyle"); convertNormalEmphasis(opt, "areaStyle"); convertNormalEmphasis(opt, "label"); convertNormalEmphasis(opt, "labelLine"); convertNormalEmphasis(opt, "upperLabel"); convertNormalEmphasis(opt, "edgeLabel"); } function compatTextStyle(opt, propName) { var labelOptSingle = isObject$2(opt) && opt[propName]; var textStyle = isObject$2(labelOptSingle) && labelOptSingle.textStyle; if (textStyle) { for (var i = 0, len2 = TEXT_STYLE_OPTIONS.length; i < len2; i++) { var textPropName = TEXT_STYLE_OPTIONS[i]; if (textStyle.hasOwnProperty(textPropName)) { labelOptSingle[textPropName] = textStyle[textPropName]; } } } } function compatEC3CommonStyles(opt) { if (opt) { removeEC3NormalStatus(opt); compatTextStyle(opt, "label"); opt.emphasis && compatTextStyle(opt.emphasis, "label"); } } function processSeries(seriesOpt) { if (!isObject$2(seriesOpt)) { return; } compatEC2ItemStyle(seriesOpt); removeEC3NormalStatus(seriesOpt); compatTextStyle(seriesOpt, "label"); compatTextStyle(seriesOpt, "upperLabel"); compatTextStyle(seriesOpt, "edgeLabel"); if (seriesOpt.emphasis) { compatTextStyle(seriesOpt.emphasis, "label"); compatTextStyle(seriesOpt.emphasis, "upperLabel"); compatTextStyle(seriesOpt.emphasis, "edgeLabel"); } var markPoint = seriesOpt.markPoint; if (markPoint) { compatEC2ItemStyle(markPoint); compatEC3CommonStyles(markPoint); } var markLine = seriesOpt.markLine; if (markLine) { compatEC2ItemStyle(markLine); compatEC3CommonStyles(markLine); } var markArea = seriesOpt.markArea; if (markArea) { compatEC3CommonStyles(markArea); } var data = seriesOpt.data; if (seriesOpt.type === "graph") { data = data || seriesOpt.nodes; var edgeData = seriesOpt.links || seriesOpt.edges; if (edgeData && !isTypedArray(edgeData)) { for (var i = 0; i < edgeData.length; i++) { compatEC3CommonStyles(edgeData[i]); } } each$f(seriesOpt.categories, function(opt) { removeEC3NormalStatus(opt); }); } if (data && !isTypedArray(data)) { for (var i = 0; i < data.length; i++) { compatEC3CommonStyles(data[i]); } } markPoint = seriesOpt.markPoint; if (markPoint && markPoint.data) { var mpData = markPoint.data; for (var i = 0; i < mpData.length; i++) { compatEC3CommonStyles(mpData[i]); } } markLine = seriesOpt.markLine; if (markLine && markLine.data) { var mlData = markLine.data; for (var i = 0; i < mlData.length; i++) { if (isArray$1(mlData[i])) { compatEC3CommonStyles(mlData[i][0]); compatEC3CommonStyles(mlData[i][1]); } else { compatEC3CommonStyles(mlData[i]); } } } if (seriesOpt.type === "gauge") { compatTextStyle(seriesOpt, "axisLabel"); compatTextStyle(seriesOpt, "title"); compatTextStyle(seriesOpt, "detail"); } else if (seriesOpt.type === "treemap") { convertNormalEmphasis(seriesOpt.breadcrumb, "itemStyle"); each$f(seriesOpt.levels, function(opt) { removeEC3NormalStatus(opt); }); } else if (seriesOpt.type === "tree") { removeEC3NormalStatus(seriesOpt.leaves); } } function toArr(o) { return isArray$1(o) ? o : o ? [o] : []; } function toObj(o) { return (isArray$1(o) ? o[0] : o) || {}; } function globalCompatStyle(option, isTheme) { each$d(toArr(option.series), function(seriesOpt) { isObject$2(seriesOpt) && processSeries(seriesOpt); }); var axes = ["xAxis", "yAxis", "radiusAxis", "angleAxis", "singleAxis", "parallelAxis", "radar"]; isTheme && axes.push("valueAxis", "categoryAxis", "logAxis", "timeAxis"); each$d(axes, function(axisName) { each$d(toArr(option[axisName]), function(axisOpt) { if (axisOpt) { compatTextStyle(axisOpt, "axisLabel"); compatTextStyle(axisOpt.axisPointer, "label"); } }); }); each$d(toArr(option.parallel), function(parallelOpt) { var parallelAxisDefault = parallelOpt && parallelOpt.parallelAxisDefault; compatTextStyle(parallelAxisDefault, "axisLabel"); compatTextStyle(parallelAxisDefault && parallelAxisDefault.axisPointer, "label"); }); each$d(toArr(option.calendar), function(calendarOpt) { convertNormalEmphasis(calendarOpt, "itemStyle"); compatTextStyle(calendarOpt, "dayLabel"); compatTextStyle(calendarOpt, "monthLabel"); compatTextStyle(calendarOpt, "yearLabel"); }); each$d(toArr(option.radar), function(radarOpt) { compatTextStyle(radarOpt, "name"); if (radarOpt.name && radarOpt.axisName == null) { radarOpt.axisName = radarOpt.name; delete radarOpt.name; } if (radarOpt.nameGap != null && radarOpt.axisNameGap == null) { radarOpt.axisNameGap = radarOpt.nameGap; delete radarOpt.nameGap; } }); each$d(toArr(option.geo), function(geoOpt) { if (isObject$2(geoOpt)) { compatEC3CommonStyles(geoOpt); each$d(toArr(geoOpt.regions), function(regionObj) { compatEC3CommonStyles(regionObj); }); } }); each$d(toArr(option.timeline), function(timelineOpt) { compatEC3CommonStyles(timelineOpt); convertNormalEmphasis(timelineOpt, "label"); convertNormalEmphasis(timelineOpt, "itemStyle"); convertNormalEmphasis(timelineOpt, "controlStyle", true); var data = timelineOpt.data; isArray$1(data) && each$f(data, function(item) { if (isObject$3(item)) { convertNormalEmphasis(item, "label"); convertNormalEmphasis(item, "itemStyle"); } }); }); each$d(toArr(option.toolbox), function(toolboxOpt) { convertNormalEmphasis(toolboxOpt, "iconStyle"); each$d(toolboxOpt.feature, function(featureOpt) { convertNormalEmphasis(featureOpt, "iconStyle"); }); }); compatTextStyle(toObj(option.axisPointer), "label"); compatTextStyle(toObj(option.tooltip).axisPointer, "label"); } function get(opt, path) { var pathArr = path.split(","); var obj = opt; for (var i = 0; i < pathArr.length; i++) { obj = obj && obj[pathArr[i]]; if (obj == null) { break; } } return obj; } function set(opt, path, val, overwrite) { var pathArr = path.split(","); var obj = opt; var key; var i = 0; for (; i < pathArr.length - 1; i++) { key = pathArr[i]; if (obj[key] == null) { obj[key] = {}; } obj = obj[key]; } if (obj[pathArr[i]] == null) { obj[pathArr[i]] = val; } } function compatLayoutProperties(option) { option && each$f(LAYOUT_PROPERTIES, function(prop) { if (prop[0] in option && !(prop[1] in option)) { option[prop[1]] = option[prop[0]]; } }); } var LAYOUT_PROPERTIES = [["x", "left"], ["y", "top"], ["x2", "right"], ["y2", "bottom"]]; var COMPATITABLE_COMPONENTS = ["grid", "geo", "parallel", "legend", "toolbox", "title", "visualMap", "dataZoom", "timeline"]; var BAR_ITEM_STYLE_MAP = [["borderRadius", "barBorderRadius"], ["borderColor", "barBorderColor"], ["borderWidth", "barBorderWidth"]]; function compatBarItemStyle(option) { var itemStyle = option && option.itemStyle; if (itemStyle) { for (var i = 0; i < BAR_ITEM_STYLE_MAP.length; i++) { var oldName = BAR_ITEM_STYLE_MAP[i][1]; var newName = BAR_ITEM_STYLE_MAP[i][0]; if (itemStyle[oldName] != null) { itemStyle[newName] = itemStyle[oldName]; } } } } function compatPieLabel(option) { if (!option) { return; } if (option.alignTo === "edge" && option.margin != null && option.edgeDistance == null) { option.edgeDistance = option.margin; } } function compatSunburstState(option) { if (!option) { return; } if (option.downplay && !option.blur) { option.blur = option.downplay; } } function compatGraphFocus(option) { if (!option) { return; } if (option.focusNodeAdjacency != null) { option.emphasis = option.emphasis || {}; if (option.emphasis.focus == null) { option.emphasis.focus = "adjacency"; } } } function traverseTree(data, cb) { if (data) { for (var i = 0; i < data.length; i++) { cb(data[i]); data[i] && traverseTree(data[i].children, cb); } } } function globalBackwardCompat(option, isTheme) { globalCompatStyle(option, isTheme); option.series = normalizeToArray(option.series); each$f(option.series, function(seriesOpt) { if (!isObject$3(seriesOpt)) { return; } var seriesType2 = seriesOpt.type; if (seriesType2 === "line") { if (seriesOpt.clipOverflow != null) { seriesOpt.clip = seriesOpt.clipOverflow; } } else if (seriesType2 === "pie" || seriesType2 === "gauge") { if (seriesOpt.clockWise != null) { seriesOpt.clockwise = seriesOpt.clockWise; } compatPieLabel(seriesOpt.label); var data = seriesOpt.data; if (data && !isTypedArray(data)) { for (var i = 0; i < data.length; i++) { compatPieLabel(data[i]); } } if (seriesOpt.hoverOffset != null) { seriesOpt.emphasis = seriesOpt.emphasis || {}; if (seriesOpt.emphasis.scaleSize = null) { seriesOpt.emphasis.scaleSize = seriesOpt.hoverOffset; } } } else if (seriesType2 === "gauge") { var pointerColor = get(seriesOpt, "pointer.color"); pointerColor != null && set(seriesOpt, "itemStyle.color", pointerColor); } else if (seriesType2 === "bar") { compatBarItemStyle(seriesOpt); compatBarItemStyle(seriesOpt.backgroundStyle); compatBarItemStyle(seriesOpt.emphasis); var data = seriesOpt.data; if (data && !isTypedArray(data)) { for (var i = 0; i < data.length; i++) { if (typeof data[i] === "object") { compatBarItemStyle(data[i]); compatBarItemStyle(data[i] && data[i].emphasis); } } } } else if (seriesType2 === "sunburst") { var highlightPolicy = seriesOpt.highlightPolicy; if (highlightPolicy) { seriesOpt.emphasis = seriesOpt.emphasis || {}; if (!seriesOpt.emphasis.focus) { seriesOpt.emphasis.focus = highlightPolicy; } } compatSunburstState(seriesOpt); traverseTree(seriesOpt.data, compatSunburstState); } else if (seriesType2 === "graph" || seriesType2 === "sankey") { compatGraphFocus(seriesOpt); } else if (seriesType2 === "map") { if (seriesOpt.mapType && !seriesOpt.map) { seriesOpt.map = seriesOpt.mapType; } if (seriesOpt.mapLocation) { defaults(seriesOpt, seriesOpt.mapLocation); } } if (seriesOpt.hoverAnimation != null) { seriesOpt.emphasis = seriesOpt.emphasis || {}; if (seriesOpt.emphasis && seriesOpt.emphasis.scale == null) { seriesOpt.emphasis.scale = seriesOpt.hoverAnimation; } } compatLayoutProperties(seriesOpt); }); if (option.dataRange) { option.visualMap = option.dataRange; } each$f(COMPATITABLE_COMPONENTS, function(componentName) { var options = option[componentName]; if (options) { if (!isArray$1(options)) { options = [options]; } each$f(options, function(option2) { compatLayoutProperties(option2); }); } }); } function dataStack(ecModel) { var stackInfoMap = createHashMap(); ecModel.eachSeries(function(seriesModel) { var stack = seriesModel.get("stack"); if (stack) { var stackInfoList = stackInfoMap.get(stack) || stackInfoMap.set(stack, []); var data = seriesModel.getData(); var stackInfo = { // Used for calculate axis extent automatically. // TODO: Type getCalculationInfo return more specific type? stackResultDimension: data.getCalculationInfo("stackResultDimension"), stackedOverDimension: data.getCalculationInfo("stackedOverDimension"), stackedDimension: data.getCalculationInfo("stackedDimension"), stackedByDimension: data.getCalculationInfo("stackedByDimension"), isStackedByIndex: data.getCalculationInfo("isStackedByIndex"), data, seriesModel }; if (!stackInfo.stackedDimension || !(stackInfo.isStackedByIndex || stackInfo.stackedByDimension)) { return; } stackInfoList.length && data.setCalculationInfo("stackedOnSeries", stackInfoList[stackInfoList.length - 1].seriesModel); stackInfoList.push(stackInfo); } }); stackInfoMap.each(calculateStack); } function calculateStack(stackInfoList) { each$f(stackInfoList, function(targetStackInfo, idxInStack) { var resultVal = []; var resultNaN = [NaN, NaN]; var dims = [targetStackInfo.stackResultDimension, targetStackInfo.stackedOverDimension]; var targetData = targetStackInfo.data; var isStackedByIndex = targetStackInfo.isStackedByIndex; var stackStrategy = targetStackInfo.seriesModel.get("stackStrategy") || "samesign"; targetData.modify(dims, function(v0, v12, dataIndex) { var sum2 = targetData.get(targetStackInfo.stackedDimension, dataIndex); if (isNaN(sum2)) { return resultNaN; } var byValue; var stackedDataRawIndex; if (isStackedByIndex) { stackedDataRawIndex = targetData.getRawIndex(dataIndex); } else { byValue = targetData.get(targetStackInfo.stackedByDimension, dataIndex); } var stackedOver = NaN; for (var j = idxInStack - 1; j >= 0; j--) { var stackInfo = stackInfoList[j]; if (!isStackedByIndex) { stackedDataRawIndex = stackInfo.data.rawIndexOf(stackInfo.stackedByDimension, byValue); } if (stackedDataRawIndex >= 0) { var val = stackInfo.data.getByRawIndex(stackInfo.stackResultDimension, stackedDataRawIndex); if (stackStrategy === "all" || stackStrategy === "positive" && val > 0 || stackStrategy === "negative" && val < 0 || stackStrategy === "samesign" && sum2 >= 0 && val > 0 || stackStrategy === "samesign" && sum2 <= 0 && val < 0) { sum2 = addSafe(sum2, val); stackedOver = val; break; } } } resultVal[0] = sum2; resultVal[1] = stackedOver; return resultVal; }); }); } var SourceImpl = ( /** @class */ /* @__PURE__ */ (function() { function SourceImpl2(fields) { this.data = fields.data || (fields.sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS ? {} : []); this.sourceFormat = fields.sourceFormat || SOURCE_FORMAT_UNKNOWN; this.seriesLayoutBy = fields.seriesLayoutBy || SERIES_LAYOUT_BY_COLUMN; this.startIndex = fields.startIndex || 0; this.dimensionsDetectedCount = fields.dimensionsDetectedCount; this.metaRawOption = fields.metaRawOption; var dimensionsDefine = this.dimensionsDefine = fields.dimensionsDefine; if (dimensionsDefine) { for (var i = 0; i < dimensionsDefine.length; i++) { var dim = dimensionsDefine[i]; if (dim.type == null) { if (guessOrdinal(this, i) === BE_ORDINAL.Must) { dim.type = "ordinal"; } } } } } return SourceImpl2; })() ); function isSourceInstance(val) { return val instanceof SourceImpl; } function createSource(sourceData, thisMetaRawOption, sourceFormat) { sourceFormat = sourceFormat || detectSourceFormat(sourceData); var seriesLayoutBy = thisMetaRawOption.seriesLayoutBy; var determined = determineSourceDimensions(sourceData, sourceFormat, seriesLayoutBy, thisMetaRawOption.sourceHeader, thisMetaRawOption.dimensions); var source = new SourceImpl({ data: sourceData, sourceFormat, seriesLayoutBy, dimensionsDefine: determined.dimensionsDefine, startIndex: determined.startIndex, dimensionsDetectedCount: determined.dimensionsDetectedCount, metaRawOption: clone$1(thisMetaRawOption) }); return source; } function createSourceFromSeriesDataOption(data) { return new SourceImpl({ data, sourceFormat: isTypedArray(data) ? SOURCE_FORMAT_TYPED_ARRAY : SOURCE_FORMAT_ORIGINAL }); } function cloneSourceShallow(source) { return new SourceImpl({ data: source.data, sourceFormat: source.sourceFormat, seriesLayoutBy: source.seriesLayoutBy, dimensionsDefine: clone$1(source.dimensionsDefine), startIndex: source.startIndex, dimensionsDetectedCount: source.dimensionsDetectedCount }); } function detectSourceFormat(data) { var sourceFormat = SOURCE_FORMAT_UNKNOWN; if (isTypedArray(data)) { sourceFormat = SOURCE_FORMAT_TYPED_ARRAY; } else if (isArray$1(data)) { if (data.length === 0) { sourceFormat = SOURCE_FORMAT_ARRAY_ROWS; } for (var i = 0, len2 = data.length; i < len2; i++) { var item = data[i]; if (item == null) { continue; } else if (isArray$1(item) || isTypedArray(item)) { sourceFormat = SOURCE_FORMAT_ARRAY_ROWS; break; } else if (isObject$3(item)) { sourceFormat = SOURCE_FORMAT_OBJECT_ROWS; break; } } } else if (isObject$3(data)) { for (var key in data) { if (hasOwn(data, key) && isArrayLike(data[key])) { sourceFormat = SOURCE_FORMAT_KEYED_COLUMNS; break; } } } return sourceFormat; } function determineSourceDimensions(data, sourceFormat, seriesLayoutBy, sourceHeader, dimensionsDefine) { var dimensionsDetectedCount; var startIndex; if (!data) { return { dimensionsDefine: normalizeDimensionsOption(dimensionsDefine), startIndex, dimensionsDetectedCount }; } if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) { var dataArrayRows = data; if (sourceHeader === "auto" || sourceHeader == null) { arrayRowsTravelFirst(function(val) { if (val != null && val !== "-") { if (isString(val)) { startIndex == null && (startIndex = 1); } else { startIndex = 0; } } }, seriesLayoutBy, dataArrayRows, 10); } else { startIndex = isNumber(sourceHeader) ? sourceHeader : sourceHeader ? 1 : 0; } if (!dimensionsDefine && startIndex === 1) { dimensionsDefine = []; arrayRowsTravelFirst(function(val, index) { dimensionsDefine[index] = val != null ? val + "" : ""; }, seriesLayoutBy, dataArrayRows, Infinity); } dimensionsDetectedCount = dimensionsDefine ? dimensionsDefine.length : seriesLayoutBy === SERIES_LAYOUT_BY_ROW ? dataArrayRows.length : dataArrayRows[0] ? dataArrayRows[0].length : null; } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) { if (!dimensionsDefine) { dimensionsDefine = objectRowsCollectDimensions(data); } } else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) { if (!dimensionsDefine) { dimensionsDefine = []; each$f(data, function(colArr, key) { dimensionsDefine.push(key); }); } } else if (sourceFormat === SOURCE_FORMAT_ORIGINAL) { var value0 = getDataItemValue(data[0]); dimensionsDetectedCount = isArray$1(value0) && value0.length || 1; } else ; return { startIndex, dimensionsDefine: normalizeDimensionsOption(dimensionsDefine), dimensionsDetectedCount }; } function objectRowsCollectDimensions(data) { var firstIndex = 0; var obj; while (firstIndex < data.length && !(obj = data[firstIndex++])) { } if (obj) { return keys(obj); } } function normalizeDimensionsOption(dimensionsDefine) { if (!dimensionsDefine) { return; } var nameMap = createHashMap(); return map$1(dimensionsDefine, function(rawItem, index) { rawItem = isObject$3(rawItem) ? rawItem : { name: rawItem }; var item = { name: rawItem.name, displayName: rawItem.displayName, type: rawItem.type }; if (item.name == null) { return item; } item.name += ""; if (item.displayName == null) { item.displayName = item.name; } var exist = nameMap.get(item.name); if (!exist) { nameMap.set(item.name, { count: 1 }); } else { item.name += "-" + exist.count++; } return item; }); } function arrayRowsTravelFirst(cb, seriesLayoutBy, data, maxLoop) { if (seriesLayoutBy === SERIES_LAYOUT_BY_ROW) { for (var i = 0; i < data.length && i < maxLoop; i++) { cb(data[i] ? data[i][0] : null, i); } } else { var value0 = data[0] || []; for (var i = 0; i < value0.length && i < maxLoop; i++) { cb(value0[i], i); } } } function shouldRetrieveDataByName(source) { var sourceFormat = source.sourceFormat; return sourceFormat === SOURCE_FORMAT_OBJECT_ROWS || sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS; } var _a, _b, _c; var providerMethods; var mountMethods; var DefaultDataProvider = ( /** @class */ (function() { function DefaultDataProvider2(sourceParam, dimSize) { var source = !isSourceInstance(sourceParam) ? createSourceFromSeriesDataOption(sourceParam) : sourceParam; this._source = source; var data = this._data = source.data; if (source.sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) { this._offset = 0; this._dimSize = dimSize; this._data = data; } mountMethods(this, data, source); } DefaultDataProvider2.prototype.getSource = function() { return this._source; }; DefaultDataProvider2.prototype.count = function() { return 0; }; DefaultDataProvider2.prototype.getItem = function(idx, out) { return; }; DefaultDataProvider2.prototype.appendData = function(newData) { }; DefaultDataProvider2.prototype.clean = function() { }; DefaultDataProvider2.protoInitialize = (function() { var proto2 = DefaultDataProvider2.prototype; proto2.pure = false; proto2.persistent = true; })(); DefaultDataProvider2.internalField = (function() { var _a2; mountMethods = function(provider, data, source) { var sourceFormat = source.sourceFormat; var seriesLayoutBy = source.seriesLayoutBy; var startIndex = source.startIndex; var dimsDef = source.dimensionsDefine; var methods = providerMethods[getMethodMapKey(sourceFormat, seriesLayoutBy)]; extend(provider, methods); if (sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) { provider.getItem = getItemForTypedArray; provider.count = countForTypedArray; provider.fillStorage = fillStorageForTypedArray; } else { var rawItemGetter = getRawSourceItemGetter(sourceFormat, seriesLayoutBy); provider.getItem = bind$1(rawItemGetter, null, data, startIndex, dimsDef); var rawCounter = getRawSourceDataCounter(sourceFormat, seriesLayoutBy); provider.count = bind$1(rawCounter, null, data, startIndex, dimsDef); } }; var getItemForTypedArray = function(idx, out) { idx = idx - this._offset; out = out || []; var data = this._data; var dimSize = this._dimSize; var offset = dimSize * idx; for (var i = 0; i < dimSize; i++) { out[i] = data[offset + i]; } return out; }; var fillStorageForTypedArray = function(start, end, storage2, extent) { var data = this._data; var dimSize = this._dimSize; for (var dim = 0; dim < dimSize; dim++) { var dimExtent = extent[dim]; var min2 = dimExtent[0] == null ? Infinity : dimExtent[0]; var max2 = dimExtent[1] == null ? -Infinity : dimExtent[1]; var count2 = end - start; var arr = storage2[dim]; for (var i = 0; i < count2; i++) { var val = data[i * dimSize + dim]; arr[start + i] = val; val < min2 && (min2 = val); val > max2 && (max2 = val); } dimExtent[0] = min2; dimExtent[1] = max2; } }; var countForTypedArray = function() { return this._data ? this._data.length / this._dimSize : 0; }; providerMethods = (_a2 = {}, _a2[SOURCE_FORMAT_ARRAY_ROWS + "_" + SERIES_LAYOUT_BY_COLUMN] = { pure: true, appendData: appendDataSimply }, _a2[SOURCE_FORMAT_ARRAY_ROWS + "_" + SERIES_LAYOUT_BY_ROW] = { pure: true, appendData: function() { throw new Error('Do not support appendData when set seriesLayoutBy: "row".'); } }, _a2[SOURCE_FORMAT_OBJECT_ROWS] = { pure: true, appendData: appendDataSimply }, _a2[SOURCE_FORMAT_KEYED_COLUMNS] = { pure: true, appendData: function(newData) { var data = this._data; each$f(newData, function(newCol, key) { var oldCol = data[key] || (data[key] = []); for (var i = 0; i < (newCol || []).length; i++) { oldCol.push(newCol[i]); } }); } }, _a2[SOURCE_FORMAT_ORIGINAL] = { appendData: appendDataSimply }, _a2[SOURCE_FORMAT_TYPED_ARRAY] = { persistent: false, pure: true, appendData: function(newData) { this._data = newData; }, // Clean self if data is already used. clean: function() { this._offset += this.count(); this._data = null; } }, _a2); function appendDataSimply(newData) { for (var i = 0; i < newData.length; i++) { this._data.push(newData[i]); } } })(); return DefaultDataProvider2; })() ); var getItemSimply = function(rawData, startIndex, dimsDef, idx) { return rawData[idx]; }; var rawSourceItemGetterMap = (_a = {}, _a[SOURCE_FORMAT_ARRAY_ROWS + "_" + SERIES_LAYOUT_BY_COLUMN] = function(rawData, startIndex, dimsDef, idx) { return rawData[idx + startIndex]; }, _a[SOURCE_FORMAT_ARRAY_ROWS + "_" + SERIES_LAYOUT_BY_ROW] = function(rawData, startIndex, dimsDef, idx, out) { idx += startIndex; var item = out || []; var data = rawData; for (var i = 0; i < data.length; i++) { var row = data[i]; item[i] = row ? row[idx] : null; } return item; }, _a[SOURCE_FORMAT_OBJECT_ROWS] = getItemSimply, _a[SOURCE_FORMAT_KEYED_COLUMNS] = function(rawData, startIndex, dimsDef, idx, out) { var item = out || []; for (var i = 0; i < dimsDef.length; i++) { var dimName = dimsDef[i].name; var col = rawData[dimName]; item[i] = col ? col[idx] : null; } return item; }, _a[SOURCE_FORMAT_ORIGINAL] = getItemSimply, _a); function getRawSourceItemGetter(sourceFormat, seriesLayoutBy) { var method = rawSourceItemGetterMap[getMethodMapKey(sourceFormat, seriesLayoutBy)]; return method; } var countSimply = function(rawData, startIndex, dimsDef) { return rawData.length; }; var rawSourceDataCounterMap = (_b = {}, _b[SOURCE_FORMAT_ARRAY_ROWS + "_" + SERIES_LAYOUT_BY_COLUMN] = function(rawData, startIndex, dimsDef) { return Math.max(0, rawData.length - startIndex); }, _b[SOURCE_FORMAT_ARRAY_ROWS + "_" + SERIES_LAYOUT_BY_ROW] = function(rawData, startIndex, dimsDef) { var row = rawData[0]; return row ? Math.max(0, row.length - startIndex) : 0; }, _b[SOURCE_FORMAT_OBJECT_ROWS] = countSimply, _b[SOURCE_FORMAT_KEYED_COLUMNS] = function(rawData, startIndex, dimsDef) { var dimName = dimsDef[0].name; var col = rawData[dimName]; return col ? col.length : 0; }, _b[SOURCE_FORMAT_ORIGINAL] = countSimply, _b); function getRawSourceDataCounter(sourceFormat, seriesLayoutBy) { var method = rawSourceDataCounterMap[getMethodMapKey(sourceFormat, seriesLayoutBy)]; return method; } var getRawValueSimply = function(dataItem, dimIndex, property) { return dataItem[dimIndex]; }; var rawSourceValueGetterMap = (_c = {}, _c[SOURCE_FORMAT_ARRAY_ROWS] = getRawValueSimply, _c[SOURCE_FORMAT_OBJECT_ROWS] = function(dataItem, dimIndex, property) { return dataItem[property]; }, _c[SOURCE_FORMAT_KEYED_COLUMNS] = getRawValueSimply, _c[SOURCE_FORMAT_ORIGINAL] = function(dataItem, dimIndex, property) { var value = getDataItemValue(dataItem); return !(value instanceof Array) ? value : value[dimIndex]; }, _c[SOURCE_FORMAT_TYPED_ARRAY] = getRawValueSimply, _c); function getRawSourceValueGetter(sourceFormat) { var method = rawSourceValueGetterMap[sourceFormat]; return method; } function getMethodMapKey(sourceFormat, seriesLayoutBy) { return sourceFormat === SOURCE_FORMAT_ARRAY_ROWS ? sourceFormat + "_" + seriesLayoutBy : sourceFormat; } function retrieveRawValue(data, dataIndex, dim) { if (!data) { return; } var dataItem = data.getRawDataItem(dataIndex); if (dataItem == null) { return; } var store = data.getStore(); var sourceFormat = store.getSource().sourceFormat; if (dim != null) { var dimIndex = data.getDimensionIndex(dim); var property = store.getDimensionProperty(dimIndex); return getRawSourceValueGetter(sourceFormat)(dataItem, dimIndex, property); } else { var result = dataItem; if (sourceFormat === SOURCE_FORMAT_ORIGINAL) { result = getDataItemValue(dataItem); } return result; } } var DIMENSION_LABEL_REG = /\{@(.+?)\}/g; var DataFormatMixin = ( /** @class */ (function() { function DataFormatMixin2() { } DataFormatMixin2.prototype.getDataParams = function(dataIndex, dataType) { var data = this.getData(dataType); var rawValue = this.getRawValue(dataIndex, dataType); var rawDataIndex = data.getRawIndex(dataIndex); var name = data.getName(dataIndex); var itemOpt = data.getRawDataItem(dataIndex); var style = data.getItemVisual(dataIndex, "style"); var color = style && style[data.getItemVisual(dataIndex, "drawType") || "fill"]; var borderColor = style && style.stroke; var mainType = this.mainType; var isSeries2 = mainType === "series"; var userOutput = data.userOutput && data.userOutput.get(); return { componentType: mainType, componentSubType: this.subType, componentIndex: this.componentIndex, seriesType: isSeries2 ? this.subType : null, seriesIndex: this.seriesIndex, seriesId: isSeries2 ? this.id : null, seriesName: isSeries2 ? this.name : null, name, dataIndex: rawDataIndex, data: itemOpt, dataType, value: rawValue, color, borderColor, dimensionNames: userOutput ? userOutput.fullDimensions : null, encode: userOutput ? userOutput.encode : null, // Param name list for mapping `a`, `b`, `c`, `d`, `e` $vars: ["seriesName", "name", "value"] }; }; DataFormatMixin2.prototype.getFormattedLabel = function(dataIndex, status, dataType, labelDimIndex, formatter, extendParams) { status = status || "normal"; var data = this.getData(dataType); var params = this.getDataParams(dataIndex, dataType); if (extendParams) { params.value = extendParams.interpolatedValue; } if (labelDimIndex != null && isArray$1(params.value)) { params.value = params.value[labelDimIndex]; } if (!formatter) { var itemModel = data.getItemModel(dataIndex); formatter = itemModel.get(status === "normal" ? ["label", "formatter"] : [status, "label", "formatter"]); } if (isFunction(formatter)) { params.status = status; params.dimensionIndex = labelDimIndex; return formatter(params); } else if (isString(formatter)) { var str = formatTpl(formatter, params); return str.replace(DIMENSION_LABEL_REG, function(origin, dimStr) { var len2 = dimStr.length; var dimLoose = dimStr; if (dimLoose.charAt(0) === "[" && dimLoose.charAt(len2 - 1) === "]") { dimLoose = +dimLoose.slice(1, len2 - 1); } var val = retrieveRawValue(data, dataIndex, dimLoose); if (extendParams && isArray$1(extendParams.interpolatedValue)) { var dimIndex = data.getDimensionIndex(dimLoose); if (dimIndex >= 0) { val = extendParams.interpolatedValue[dimIndex]; } } return val != null ? val + "" : ""; }); } }; DataFormatMixin2.prototype.getRawValue = function(idx, dataType) { return retrieveRawValue(this.getData(dataType), idx); }; DataFormatMixin2.prototype.formatTooltip = function(dataIndex, multipleSeries, dataType) { return; }; return DataFormatMixin2; })() ); function normalizeTooltipFormatResult(result) { var markupText; var markupFragment; if (isObject$3(result)) { if (result.type) { markupFragment = result; } } else { markupText = result; } return { text: markupText, // markers: markers || markersExisting, frag: markupFragment }; } function createTask(define) { return new Task(define); } var Task = ( /** @class */ (function() { function Task2(define) { define = define || {}; this._reset = define.reset; this._plan = define.plan; this._count = define.count; this._onDirty = define.onDirty; this._dirty = true; } Task2.prototype.perform = function(performArgs) { var upTask = this._upstream; var skip = performArgs && performArgs.skip; if (this._dirty && upTask) { var context = this.context; context.data = context.outputData = upTask.context.outputData; } if (this.__pipeline) { this.__pipeline.currentTask = this; } var planResult; if (this._plan && !skip) { planResult = this._plan(this.context); } var lastModBy = normalizeModBy(this._modBy); var lastModDataCount = this._modDataCount || 0; var modBy = normalizeModBy(performArgs && performArgs.modBy); var modDataCount = performArgs && performArgs.modDataCount || 0; if (lastModBy !== modBy || lastModDataCount !== modDataCount) { planResult = "reset"; } function normalizeModBy(val) { !(val >= 1) && (val = 1); return val; } var forceFirstProgress; if (this._dirty || planResult === "reset") { this._dirty = false; forceFirstProgress = this._doReset(skip); } this._modBy = modBy; this._modDataCount = modDataCount; var step = performArgs && performArgs.step; if (upTask) { this._dueEnd = upTask._outputDueEnd; } else { this._dueEnd = this._count ? this._count(this.context) : Infinity; } if (this._progress) { var start = this._dueIndex; var end = Math.min(step != null ? this._dueIndex + step : Infinity, this._dueEnd); if (!skip && (forceFirstProgress || start < end)) { var progress = this._progress; if (isArray$1(progress)) { for (var i = 0; i < progress.length; i++) { this._doProgress(progress[i], start, end, modBy, modDataCount); } } else { this._doProgress(progress, start, end, modBy, modDataCount); } } this._dueIndex = end; var outputDueEnd = this._settedOutputEnd != null ? this._settedOutputEnd : end; this._outputDueEnd = outputDueEnd; } else { this._dueIndex = this._outputDueEnd = this._settedOutputEnd != null ? this._settedOutputEnd : this._dueEnd; } return this.unfinished(); }; Task2.prototype.dirty = function() { this._dirty = true; this._onDirty && this._onDirty(this.context); }; Task2.prototype._doProgress = function(progress, start, end, modBy, modDataCount) { iterator.reset(start, end, modBy, modDataCount); this._callingProgress = progress; this._callingProgress({ start, end, count: end - start, next: iterator.next }, this.context); }; Task2.prototype._doReset = function(skip) { this._dueIndex = this._outputDueEnd = this._dueEnd = 0; this._settedOutputEnd = null; var progress; var forceFirstProgress; if (!skip && this._reset) { progress = this._reset(this.context); if (progress && progress.progress) { forceFirstProgress = progress.forceFirstProgress; progress = progress.progress; } if (isArray$1(progress) && !progress.length) { progress = null; } } this._progress = progress; this._modBy = this._modDataCount = null; var downstream = this._downstream; downstream && downstream.dirty(); return forceFirstProgress; }; Task2.prototype.unfinished = function() { return this._progress && this._dueIndex < this._dueEnd; }; Task2.prototype.pipe = function(downTask) { if (this._downstream !== downTask || this._dirty) { this._downstream = downTask; downTask._upstream = this; downTask.dirty(); } }; Task2.prototype.dispose = function() { if (this._disposed) { return; } this._upstream && (this._upstream._downstream = null); this._downstream && (this._downstream._upstream = null); this._dirty = false; this._disposed = true; }; Task2.prototype.getUpstream = function() { return this._upstream; }; Task2.prototype.getDownstream = function() { return this._downstream; }; Task2.prototype.setOutputEnd = function(end) { this._outputDueEnd = this._settedOutputEnd = end; }; return Task2; })() ); var iterator = /* @__PURE__ */ (function() { var end; var current; var modBy; var modDataCount; var winCount; var it = { reset: function(s, e, sStep, sCount) { current = s; end = e; modBy = sStep; modDataCount = sCount; winCount = Math.ceil(modDataCount / modBy); it.next = modBy > 1 && modDataCount > 0 ? modNext : sequentialNext; } }; return it; function sequentialNext() { return current < end ? current++ : null; } function modNext() { var dataIndex = current % winCount * modBy + Math.ceil(current / winCount); var result = current >= end ? null : dataIndex < modDataCount ? dataIndex : current; current++; return result; } })(); function parseDataValue(value, opt) { var dimType = opt && opt.type; if (dimType === "ordinal") { return value; } if (dimType === "time" && !isNumber(value) && value != null && value !== "-") { value = +parseDate(value); } return value == null || value === "" ? NaN : Number(value); } var valueParserMap = createHashMap({ "number": function(val) { return parseFloat(val); }, "time": function(val) { return +parseDate(val); }, "trim": function(val) { return isString(val) ? trim$1(val) : val; } }); function getRawValueParser(type) { return valueParserMap.get(type); } var ORDER_COMPARISON_OP_MAP = { lt: function(lval, rval) { return lval < rval; }, lte: function(lval, rval) { return lval <= rval; }, gt: function(lval, rval) { return lval > rval; }, gte: function(lval, rval) { return lval >= rval; } }; var FilterOrderComparator = ( /** @class */ (function() { function FilterOrderComparator2(op, rval) { if (!isNumber(rval)) { var errMsg = ""; throwError(errMsg); } this._opFn = ORDER_COMPARISON_OP_MAP[op]; this._rvalFloat = numericToNumber(rval); } FilterOrderComparator2.prototype.evaluate = function(lval) { return isNumber(lval) ? this._opFn(lval, this._rvalFloat) : this._opFn(numericToNumber(lval), this._rvalFloat); }; return FilterOrderComparator2; })() ); var SortOrderComparator = ( /** @class */ (function() { function SortOrderComparator2(order, incomparable) { var isDesc = order === "desc"; this._resultLT = isDesc ? 1 : -1; if (incomparable == null) { incomparable = isDesc ? "min" : "max"; } this._incomparable = incomparable === "min" ? -Infinity : Infinity; } SortOrderComparator2.prototype.evaluate = function(lval, rval) { var lvalFloat = isNumber(lval) ? lval : numericToNumber(lval); var rvalFloat = isNumber(rval) ? rval : numericToNumber(rval); var lvalNotNumeric = isNaN(lvalFloat); var rvalNotNumeric = isNaN(rvalFloat); if (lvalNotNumeric) { lvalFloat = this._incomparable; } if (rvalNotNumeric) { rvalFloat = this._incomparable; } if (lvalNotNumeric && rvalNotNumeric) { var lvalIsStr = isString(lval); var rvalIsStr = isString(rval); if (lvalIsStr) { lvalFloat = rvalIsStr ? lval : 0; } if (rvalIsStr) { rvalFloat = lvalIsStr ? rval : 0; } } return lvalFloat < rvalFloat ? this._resultLT : lvalFloat > rvalFloat ? -this._resultLT : 0; }; return SortOrderComparator2; })() ); var FilterEqualityComparator = ( /** @class */ (function() { function FilterEqualityComparator2(isEq, rval) { this._rval = rval; this._isEQ = isEq; this._rvalTypeof = typeof rval; this._rvalFloat = numericToNumber(rval); } FilterEqualityComparator2.prototype.evaluate = function(lval) { var eqResult = lval === this._rval; if (!eqResult) { var lvalTypeof = typeof lval; if (lvalTypeof !== this._rvalTypeof && (lvalTypeof === "number" || this._rvalTypeof === "number")) { eqResult = numericToNumber(lval) === this._rvalFloat; } } return this._isEQ ? eqResult : !eqResult; }; return FilterEqualityComparator2; })() ); function createFilterComparator(op, rval) { return op === "eq" || op === "ne" ? new FilterEqualityComparator(op === "eq", rval) : hasOwn(ORDER_COMPARISON_OP_MAP, op) ? new FilterOrderComparator(op, rval) : null; } var ExternalSource = ( /** @class */ (function() { function ExternalSource2() { } ExternalSource2.prototype.getRawData = function() { throw new Error("not supported"); }; ExternalSource2.prototype.getRawDataItem = function(dataIndex) { throw new Error("not supported"); }; ExternalSource2.prototype.cloneRawData = function() { return; }; ExternalSource2.prototype.getDimensionInfo = function(dim) { return; }; ExternalSource2.prototype.cloneAllDimensionInfo = function() { return; }; ExternalSource2.prototype.count = function() { return; }; ExternalSource2.prototype.retrieveValue = function(dataIndex, dimIndex) { return; }; ExternalSource2.prototype.retrieveValueFromItem = function(dataItem, dimIndex) { return; }; ExternalSource2.prototype.convertValue = function(rawVal, dimInfo) { return parseDataValue(rawVal, dimInfo); }; return ExternalSource2; })() ); function createExternalSource(internalSource, externalTransform) { var extSource = new ExternalSource(); var data = internalSource.data; var sourceFormat = extSource.sourceFormat = internalSource.sourceFormat; var sourceHeaderCount = internalSource.startIndex; var errMsg = ""; if (internalSource.seriesLayoutBy !== SERIES_LAYOUT_BY_COLUMN) { throwError(errMsg); } var dimensions = []; var dimsByName = {}; var dimsDef = internalSource.dimensionsDefine; if (dimsDef) { each$f(dimsDef, function(dimDef, idx) { var name = dimDef.name; var dimDefExt = { index: idx, name, displayName: dimDef.displayName }; dimensions.push(dimDefExt); if (name != null) { var errMsg_1 = ""; if (hasOwn(dimsByName, name)) { throwError(errMsg_1); } dimsByName[name] = dimDefExt; } }); } else { for (var i = 0; i < internalSource.dimensionsDetectedCount || 0; i++) { dimensions.push({ index: i }); } } var rawItemGetter = getRawSourceItemGetter(sourceFormat, SERIES_LAYOUT_BY_COLUMN); if (externalTransform.__isBuiltIn) { extSource.getRawDataItem = function(dataIndex) { return rawItemGetter(data, sourceHeaderCount, dimensions, dataIndex); }; extSource.getRawData = bind$1(getRawData, null, internalSource); } extSource.cloneRawData = bind$1(cloneRawData, null, internalSource); var rawCounter = getRawSourceDataCounter(sourceFormat, SERIES_LAYOUT_BY_COLUMN); extSource.count = bind$1(rawCounter, null, data, sourceHeaderCount, dimensions); var rawValueGetter = getRawSourceValueGetter(sourceFormat); extSource.retrieveValue = function(dataIndex, dimIndex) { var rawItem = rawItemGetter(data, sourceHeaderCount, dimensions, dataIndex); return retrieveValueFromItem(rawItem, dimIndex); }; var retrieveValueFromItem = extSource.retrieveValueFromItem = function(dataItem, dimIndex) { if (dataItem == null) { return; } var dimDef = dimensions[dimIndex]; if (dimDef) { return rawValueGetter(dataItem, dimIndex, dimDef.name); } }; extSource.getDimensionInfo = bind$1(getDimensionInfo, null, dimensions, dimsByName); extSource.cloneAllDimensionInfo = bind$1(cloneAllDimensionInfo, null, dimensions); return extSource; } function getRawData(upstream) { var sourceFormat = upstream.sourceFormat; if (!isSupportedSourceFormat(sourceFormat)) { var errMsg = ""; throwError(errMsg); } return upstream.data; } function cloneRawData(upstream) { var sourceFormat = upstream.sourceFormat; var data = upstream.data; if (!isSupportedSourceFormat(sourceFormat)) { var errMsg = ""; throwError(errMsg); } if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) { var result = []; for (var i = 0, len2 = data.length; i < len2; i++) { result.push(data[i].slice()); } return result; } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) { var result = []; for (var i = 0, len2 = data.length; i < len2; i++) { result.push(extend({}, data[i])); } return result; } } function getDimensionInfo(dimensions, dimsByName, dim) { if (dim == null) { return; } if (isNumber(dim) || !isNaN(dim) && !hasOwn(dimsByName, dim)) { return dimensions[dim]; } else if (hasOwn(dimsByName, dim)) { return dimsByName[dim]; } } function cloneAllDimensionInfo(dimensions) { return clone$1(dimensions); } var externalTransformMap = createHashMap(); function registerExternalTransform(externalTransform) { externalTransform = clone$1(externalTransform); var type = externalTransform.type; var errMsg = ""; if (!type) { throwError(errMsg); } var typeParsed = type.split(":"); if (typeParsed.length !== 2) { throwError(errMsg); } var isBuiltIn = false; if (typeParsed[0] === "echarts") { type = typeParsed[1]; isBuiltIn = true; } externalTransform.__isBuiltIn = isBuiltIn; externalTransformMap.set(type, externalTransform); } function applyDataTransform(rawTransOption, sourceList, infoForPrint) { var pipedTransOption = normalizeToArray(rawTransOption); var pipeLen = pipedTransOption.length; var errMsg = ""; if (!pipeLen) { throwError(errMsg); } for (var i = 0, len2 = pipeLen; i < len2; i++) { var transOption = pipedTransOption[i]; sourceList = applySingleDataTransform(transOption, sourceList); if (i !== len2 - 1) { sourceList.length = Math.max(sourceList.length, 1); } } return sourceList; } function applySingleDataTransform(transOption, upSourceList, infoForPrint, pipeIndex) { var errMsg = ""; if (!upSourceList.length) { throwError(errMsg); } if (!isObject$3(transOption)) { throwError(errMsg); } var transType = transOption.type; var externalTransform = externalTransformMap.get(transType); if (!externalTransform) { throwError(errMsg); } var extUpSourceList = map$1(upSourceList, function(upSource) { return createExternalSource(upSource, externalTransform); }); var resultList = normalizeToArray(externalTransform.transform({ upstream: extUpSourceList[0], upstreamList: extUpSourceList, config: clone$1(transOption.config) })); return map$1(resultList, function(result, resultIndex) { var errMsg2 = ""; if (!isObject$3(result)) { throwError(errMsg2); } if (!result.data) { throwError(errMsg2); } var sourceFormat = detectSourceFormat(result.data); if (!isSupportedSourceFormat(sourceFormat)) { throwError(errMsg2); } var resultMetaRawOption; var firstUpSource = upSourceList[0]; if (firstUpSource && resultIndex === 0 && !result.dimensions) { var startIndex = firstUpSource.startIndex; if (startIndex) { result.data = firstUpSource.data.slice(0, startIndex).concat(result.data); } resultMetaRawOption = { seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN, sourceHeader: startIndex, dimensions: firstUpSource.metaRawOption.dimensions }; } else { resultMetaRawOption = { seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN, sourceHeader: 0, dimensions: result.dimensions }; } return createSource(result.data, resultMetaRawOption, null); }); } function isSupportedSourceFormat(sourceFormat) { return sourceFormat === SOURCE_FORMAT_ARRAY_ROWS || sourceFormat === SOURCE_FORMAT_OBJECT_ROWS; } var UNDEFINED = "undefined"; var CtorUint32Array = typeof Uint32Array === UNDEFINED ? Array : Uint32Array; var CtorUint16Array = typeof Uint16Array === UNDEFINED ? Array : Uint16Array; var CtorInt32Array$1 = typeof Int32Array === UNDEFINED ? Array : Int32Array; var CtorFloat64Array = typeof Float64Array === UNDEFINED ? Array : Float64Array; var dataCtors = { "float": CtorFloat64Array, "int": CtorInt32Array$1, // Ordinal data type can be string or int "ordinal": Array, "number": Array, "time": CtorFloat64Array }; var defaultDimValueGetters; function getIndicesCtor(rawCount) { return rawCount > 65535 ? CtorUint32Array : CtorUint16Array; } function getInitialExtent() { return [Infinity, -Infinity]; } function cloneChunk(originalChunk) { var Ctor = originalChunk.constructor; return Ctor === Array ? originalChunk.slice() : new Ctor(originalChunk); } function prepareStore(store, dimIdx, dimType, end, append) { var DataCtor = dataCtors[dimType || "float"]; if (append) { var oldStore = store[dimIdx]; var oldLen = oldStore && oldStore.length; if (!(oldLen === end)) { var newStore = new DataCtor(end); for (var j = 0; j < oldLen; j++) { newStore[j] = oldStore[j]; } store[dimIdx] = newStore; } } else { store[dimIdx] = new DataCtor(end); } } var DataStore = ( /** @class */ (function() { function DataStore2() { this._chunks = []; this._rawExtent = []; this._extent = []; this._count = 0; this._rawCount = 0; this._calcDimNameToIdx = createHashMap(); } DataStore2.prototype.initData = function(provider, inputDimensions, dimValueGetter) { this._provider = provider; this._chunks = []; this._indices = null; this.getRawIndex = this._getRawIdxIdentity; var source = provider.getSource(); var defaultGetter = this.defaultDimValueGetter = defaultDimValueGetters[source.sourceFormat]; this._dimValueGetter = dimValueGetter || defaultGetter; this._rawExtent = []; shouldRetrieveDataByName(source); this._dimensions = map$1(inputDimensions, function(dim) { return { // Only pick these two props. Not leak other properties like orderMeta. type: dim.type, property: dim.property }; }); this._initDataFromProvider(0, provider.count()); }; DataStore2.prototype.getProvider = function() { return this._provider; }; DataStore2.prototype.getSource = function() { return this._provider.getSource(); }; DataStore2.prototype.ensureCalculationDimension = function(dimName, type) { var calcDimNameToIdx = this._calcDimNameToIdx; var dimensions = this._dimensions; var calcDimIdx = calcDimNameToIdx.get(dimName); if (calcDimIdx != null) { if (dimensions[calcDimIdx].type === type) { return calcDimIdx; } } else { calcDimIdx = dimensions.length; } dimensions[calcDimIdx] = { type }; calcDimNameToIdx.set(dimName, calcDimIdx); this._chunks[calcDimIdx] = new dataCtors[type || "float"](this._rawCount); this._rawExtent[calcDimIdx] = getInitialExtent(); return calcDimIdx; }; DataStore2.prototype.collectOrdinalMeta = function(dimIdx, ordinalMeta) { var chunk = this._chunks[dimIdx]; var dim = this._dimensions[dimIdx]; var rawExtents = this._rawExtent; var offset = dim.ordinalOffset || 0; var len2 = chunk.length; if (offset === 0) { rawExtents[dimIdx] = getInitialExtent(); } var dimRawExtent = rawExtents[dimIdx]; for (var i = offset; i < len2; i++) { var val = chunk[i] = ordinalMeta.parseAndCollect(chunk[i]); if (!isNaN(val)) { dimRawExtent[0] = Math.min(val, dimRawExtent[0]); dimRawExtent[1] = Math.max(val, dimRawExtent[1]); } } dim.ordinalMeta = ordinalMeta; dim.ordinalOffset = len2; dim.type = "ordinal"; }; DataStore2.prototype.getOrdinalMeta = function(dimIdx) { var dimInfo = this._dimensions[dimIdx]; var ordinalMeta = dimInfo.ordinalMeta; return ordinalMeta; }; DataStore2.prototype.getDimensionProperty = function(dimIndex) { var item = this._dimensions[dimIndex]; return item && item.property; }; DataStore2.prototype.appendData = function(data) { var provider = this._provider; var start = this.count(); provider.appendData(data); var end = provider.count(); if (!provider.persistent) { end += start; } if (start < end) { this._initDataFromProvider(start, end, true); } return [start, end]; }; DataStore2.prototype.appendValues = function(values, minFillLen) { var chunks = this._chunks; var dimensions = this._dimensions; var dimLen = dimensions.length; var rawExtent = this._rawExtent; var start = this.count(); var end = start + Math.max(values.length, minFillLen || 0); for (var i = 0; i < dimLen; i++) { var dim = dimensions[i]; prepareStore(chunks, i, dim.type, end, true); } var emptyDataItem = []; for (var idx = start; idx < end; idx++) { var sourceIdx = idx - start; for (var dimIdx = 0; dimIdx < dimLen; dimIdx++) { var dim = dimensions[dimIdx]; var val = defaultDimValueGetters.arrayRows.call(this, values[sourceIdx] || emptyDataItem, dim.property, sourceIdx, dimIdx); chunks[dimIdx][idx] = val; var dimRawExtent = rawExtent[dimIdx]; val < dimRawExtent[0] && (dimRawExtent[0] = val); val > dimRawExtent[1] && (dimRawExtent[1] = val); } } this._rawCount = this._count = end; return { start, end }; }; DataStore2.prototype._initDataFromProvider = function(start, end, append) { var provider = this._provider; var chunks = this._chunks; var dimensions = this._dimensions; var dimLen = dimensions.length; var rawExtent = this._rawExtent; var dimNames = map$1(dimensions, function(dim2) { return dim2.property; }); for (var i = 0; i < dimLen; i++) { var dim = dimensions[i]; if (!rawExtent[i]) { rawExtent[i] = getInitialExtent(); } prepareStore(chunks, i, dim.type, end, append); } if (provider.fillStorage) { provider.fillStorage(start, end, chunks, rawExtent); } else { var dataItem = []; for (var idx = start; idx < end; idx++) { dataItem = provider.getItem(idx, dataItem); for (var dimIdx = 0; dimIdx < dimLen; dimIdx++) { var dimStorage = chunks[dimIdx]; var val = this._dimValueGetter(dataItem, dimNames[dimIdx], idx, dimIdx); dimStorage[idx] = val; var dimRawExtent = rawExtent[dimIdx]; val < dimRawExtent[0] && (dimRawExtent[0] = val); val > dimRawExtent[1] && (dimRawExtent[1] = val); } } } if (!provider.persistent && provider.clean) { provider.clean(); } this._rawCount = this._count = end; this._extent = []; }; DataStore2.prototype.count = function() { return this._count; }; DataStore2.prototype.get = function(dim, idx) { if (!(idx >= 0 && idx < this._count)) { return NaN; } var dimStore = this._chunks[dim]; return dimStore ? dimStore[this.getRawIndex(idx)] : NaN; }; DataStore2.prototype.getValues = function(dimensions, idx) { var values = []; var dimArr = []; if (idx == null) { idx = dimensions; dimensions = []; for (var i = 0; i < this._dimensions.length; i++) { dimArr.push(i); } } else { dimArr = dimensions; } for (var i = 0, len2 = dimArr.length; i < len2; i++) { values.push(this.get(dimArr[i], idx)); } return values; }; DataStore2.prototype.getByRawIndex = function(dim, rawIdx) { if (!(rawIdx >= 0 && rawIdx < this._rawCount)) { return NaN; } var dimStore = this._chunks[dim]; return dimStore ? dimStore[rawIdx] : NaN; }; DataStore2.prototype.getSum = function(dim) { var dimData = this._chunks[dim]; var sum2 = 0; if (dimData) { for (var i = 0, len2 = this.count(); i < len2; i++) { var value = this.get(dim, i); if (!isNaN(value)) { sum2 += value; } } } return sum2; }; DataStore2.prototype.getMedian = function(dim) { var dimDataArray = []; this.each([dim], function(val) { if (!isNaN(val)) { dimDataArray.push(val); } }); var sortedDimDataArray = dimDataArray.sort(function(a, b) { return a - b; }); var len2 = this.count(); return len2 === 0 ? 0 : len2 % 2 === 1 ? sortedDimDataArray[(len2 - 1) / 2] : (sortedDimDataArray[len2 / 2] + sortedDimDataArray[len2 / 2 - 1]) / 2; }; DataStore2.prototype.indexOfRawIndex = function(rawIndex) { if (rawIndex >= this._rawCount || rawIndex < 0) { return -1; } if (!this._indices) { return rawIndex; } var indices = this._indices; var rawDataIndex = indices[rawIndex]; if (rawDataIndex != null && rawDataIndex < this._count && rawDataIndex === rawIndex) { return rawIndex; } var left = 0; var right = this._count - 1; while (left <= right) { var mid = (left + right) / 2 | 0; if (indices[mid] < rawIndex) { left = mid + 1; } else if (indices[mid] > rawIndex) { right = mid - 1; } else { return mid; } } return -1; }; DataStore2.prototype.indicesOfNearest = function(dim, value, maxDistance) { var chunks = this._chunks; var dimData = chunks[dim]; var nearestIndices = []; if (!dimData) { return nearestIndices; } if (maxDistance == null) { maxDistance = Infinity; } var minDist = Infinity; var minDiff = -1; var nearestIndicesLen = 0; for (var i = 0, len2 = this.count(); i < len2; i++) { var dataIndex = this.getRawIndex(i); var diff = value - dimData[dataIndex]; var dist2 = Math.abs(diff); if (dist2 <= maxDistance) { if (dist2 < minDist || dist2 === minDist && diff >= 0 && minDiff < 0) { minDist = dist2; minDiff = diff; nearestIndicesLen = 0; } if (diff === minDiff) { nearestIndices[nearestIndicesLen++] = i; } } } nearestIndices.length = nearestIndicesLen; return nearestIndices; }; DataStore2.prototype.getIndices = function() { var newIndices; var indices = this._indices; if (indices) { var Ctor = indices.constructor; var thisCount = this._count; if (Ctor === Array) { newIndices = new Ctor(thisCount); for (var i = 0; i < thisCount; i++) { newIndices[i] = indices[i]; } } else { newIndices = new Ctor(indices.buffer, 0, thisCount); } } else { var Ctor = getIndicesCtor(this._rawCount); newIndices = new Ctor(this.count()); for (var i = 0; i < newIndices.length; i++) { newIndices[i] = i; } } return newIndices; }; DataStore2.prototype.filter = function(dims, cb) { if (!this._count) { return this; } var newStore = this.clone(); var count2 = newStore.count(); var Ctor = getIndicesCtor(newStore._rawCount); var newIndices = new Ctor(count2); var value = []; var dimSize = dims.length; var offset = 0; var dim0 = dims[0]; var chunks = newStore._chunks; for (var i = 0; i < count2; i++) { var keep = void 0; var rawIdx = newStore.getRawIndex(i); if (dimSize === 0) { keep = cb(i); } else if (dimSize === 1) { var val = chunks[dim0][rawIdx]; keep = cb(val, i); } else { var k = 0; for (; k < dimSize; k++) { value[k] = chunks[dims[k]][rawIdx]; } value[k] = i; keep = cb.apply(null, value); } if (keep) { newIndices[offset++] = rawIdx; } } if (offset < count2) { newStore._indices = newIndices; } newStore._count = offset; newStore._extent = []; newStore._updateGetRawIdx(); return newStore; }; DataStore2.prototype.selectRange = function(range) { var newStore = this.clone(); var len2 = newStore._count; if (!len2) { return this; } var dims = keys(range); var dimSize = dims.length; if (!dimSize) { return this; } var originalCount = newStore.count(); var Ctor = getIndicesCtor(newStore._rawCount); var newIndices = new Ctor(originalCount); var offset = 0; var dim0 = dims[0]; var min2 = range[dim0][0]; var max2 = range[dim0][1]; var storeArr = newStore._chunks; var quickFinished = false; if (!newStore._indices) { var idx = 0; if (dimSize === 1) { var dimStorage = storeArr[dims[0]]; for (var i = 0; i < len2; i++) { var val = dimStorage[i]; if (val >= min2 && val <= max2 || isNaN(val)) { newIndices[offset++] = idx; } idx++; } quickFinished = true; } else if (dimSize === 2) { var dimStorage = storeArr[dims[0]]; var dimStorage2 = storeArr[dims[1]]; var min22 = range[dims[1]][0]; var max22 = range[dims[1]][1]; for (var i = 0; i < len2; i++) { var val = dimStorage[i]; var val2 = dimStorage2[i]; if ((val >= min2 && val <= max2 || isNaN(val)) && (val2 >= min22 && val2 <= max22 || isNaN(val2))) { newIndices[offset++] = idx; } idx++; } quickFinished = true; } } if (!quickFinished) { if (dimSize === 1) { for (var i = 0; i < originalCount; i++) { var rawIndex = newStore.getRawIndex(i); var val = storeArr[dims[0]][rawIndex]; if (val >= min2 && val <= max2 || isNaN(val)) { newIndices[offset++] = rawIndex; } } } else { for (var i = 0; i < originalCount; i++) { var keep = true; var rawIndex = newStore.getRawIndex(i); for (var k = 0; k < dimSize; k++) { var dimk = dims[k]; var val = storeArr[dimk][rawIndex]; if (val < range[dimk][0] || val > range[dimk][1]) { keep = false; } } if (keep) { newIndices[offset++] = newStore.getRawIndex(i); } } } } if (offset < originalCount) { newStore._indices = newIndices; } newStore._count = offset; newStore._extent = []; newStore._updateGetRawIdx(); return newStore; }; DataStore2.prototype.map = function(dims, cb) { var target = this.clone(dims); this._updateDims(target, dims, cb); return target; }; DataStore2.prototype.modify = function(dims, cb) { this._updateDims(this, dims, cb); }; DataStore2.prototype._updateDims = function(target, dims, cb) { var targetChunks = target._chunks; var tmpRetValue = []; var dimSize = dims.length; var dataCount = target.count(); var values = []; var rawExtent = target._rawExtent; for (var i = 0; i < dims.length; i++) { rawExtent[dims[i]] = getInitialExtent(); } for (var dataIndex = 0; dataIndex < dataCount; dataIndex++) { var rawIndex = target.getRawIndex(dataIndex); for (var k = 0; k < dimSize; k++) { values[k] = targetChunks[dims[k]][rawIndex]; } values[dimSize] = dataIndex; var retValue = cb && cb.apply(null, values); if (retValue != null) { if (typeof retValue !== "object") { tmpRetValue[0] = retValue; retValue = tmpRetValue; } for (var i = 0; i < retValue.length; i++) { var dim = dims[i]; var val = retValue[i]; var rawExtentOnDim = rawExtent[dim]; var dimStore = targetChunks[dim]; if (dimStore) { dimStore[rawIndex] = val; } if (val < rawExtentOnDim[0]) { rawExtentOnDim[0] = val; } if (val > rawExtentOnDim[1]) { rawExtentOnDim[1] = val; } } } } }; DataStore2.prototype.lttbDownSample = function(valueDimension, rate) { var target = this.clone([valueDimension], true); var targetStorage = target._chunks; var dimStore = targetStorage[valueDimension]; var len2 = this.count(); var sampledIndex = 0; var frameSize = Math.floor(1 / rate); var currentRawIndex = this.getRawIndex(0); var maxArea; var area; var nextRawIndex; var newIndices = new (getIndicesCtor(this._rawCount))(Math.min((Math.ceil(len2 / frameSize) + 2) * 2, len2)); newIndices[sampledIndex++] = currentRawIndex; for (var i = 1; i < len2 - 1; i += frameSize) { var nextFrameStart = Math.min(i + frameSize, len2 - 1); var nextFrameEnd = Math.min(i + frameSize * 2, len2); var avgX = (nextFrameEnd + nextFrameStart) / 2; var avgY = 0; for (var idx = nextFrameStart; idx < nextFrameEnd; idx++) { var rawIndex = this.getRawIndex(idx); var y = dimStore[rawIndex]; if (isNaN(y)) { continue; } avgY += y; } avgY /= nextFrameEnd - nextFrameStart; var frameStart = i; var frameEnd = Math.min(i + frameSize, len2); var pointAX = i - 1; var pointAY = dimStore[currentRawIndex]; maxArea = -1; nextRawIndex = frameStart; var firstNaNIndex = -1; var countNaN = 0; for (var idx = frameStart; idx < frameEnd; idx++) { var rawIndex = this.getRawIndex(idx); var y = dimStore[rawIndex]; if (isNaN(y)) { countNaN++; if (firstNaNIndex < 0) { firstNaNIndex = rawIndex; } continue; } area = Math.abs((pointAX - avgX) * (y - pointAY) - (pointAX - idx) * (avgY - pointAY)); if (area > maxArea) { maxArea = area; nextRawIndex = rawIndex; } } if (countNaN > 0 && countNaN < frameEnd - frameStart) { newIndices[sampledIndex++] = Math.min(firstNaNIndex, nextRawIndex); nextRawIndex = Math.max(firstNaNIndex, nextRawIndex); } newIndices[sampledIndex++] = nextRawIndex; currentRawIndex = nextRawIndex; } newIndices[sampledIndex++] = this.getRawIndex(len2 - 1); target._count = sampledIndex; target._indices = newIndices; target.getRawIndex = this._getRawIdx; return target; }; DataStore2.prototype.minmaxDownSample = function(valueDimension, rate) { var target = this.clone([valueDimension], true); var targetStorage = target._chunks; var frameSize = Math.floor(1 / rate); var dimStore = targetStorage[valueDimension]; var len2 = this.count(); var newIndices = new (getIndicesCtor(this._rawCount))(Math.ceil(len2 / frameSize) * 2); var offset = 0; for (var i = 0; i < len2; i += frameSize) { var minIndex = i; var minValue = dimStore[this.getRawIndex(minIndex)]; var maxIndex = i; var maxValue = dimStore[this.getRawIndex(maxIndex)]; var thisFrameSize = frameSize; if (i + frameSize > len2) { thisFrameSize = len2 - i; } for (var k = 0; k < thisFrameSize; k++) { var rawIndex = this.getRawIndex(i + k); var value = dimStore[rawIndex]; if (value < minValue) { minValue = value; minIndex = i + k; } if (value > maxValue) { maxValue = value; maxIndex = i + k; } } var rawMinIndex = this.getRawIndex(minIndex); var rawMaxIndex = this.getRawIndex(maxIndex); if (minIndex < maxIndex) { newIndices[offset++] = rawMinIndex; newIndices[offset++] = rawMaxIndex; } else { newIndices[offset++] = rawMaxIndex; newIndices[offset++] = rawMinIndex; } } target._count = offset; target._indices = newIndices; target._updateGetRawIdx(); return target; }; DataStore2.prototype.downSample = function(dimension, rate, sampleValue, sampleIndex) { var target = this.clone([dimension], true); var targetStorage = target._chunks; var frameValues = []; var frameSize = Math.floor(1 / rate); var dimStore = targetStorage[dimension]; var len2 = this.count(); var rawExtentOnDim = target._rawExtent[dimension] = getInitialExtent(); var newIndices = new (getIndicesCtor(this._rawCount))(Math.ceil(len2 / frameSize)); var offset = 0; for (var i = 0; i < len2; i += frameSize) { if (frameSize > len2 - i) { frameSize = len2 - i; frameValues.length = frameSize; } for (var k = 0; k < frameSize; k++) { var dataIdx = this.getRawIndex(i + k); frameValues[k] = dimStore[dataIdx]; } var value = sampleValue(frameValues); var sampleFrameIdx = this.getRawIndex(Math.min(i + sampleIndex(frameValues, value) || 0, len2 - 1)); dimStore[sampleFrameIdx] = value; if (value < rawExtentOnDim[0]) { rawExtentOnDim[0] = value; } if (value > rawExtentOnDim[1]) { rawExtentOnDim[1] = value; } newIndices[offset++] = sampleFrameIdx; } target._count = offset; target._indices = newIndices; target._updateGetRawIdx(); return target; }; DataStore2.prototype.each = function(dims, cb) { if (!this._count) { return; } var dimSize = dims.length; var chunks = this._chunks; for (var i = 0, len2 = this.count(); i < len2; i++) { var rawIdx = this.getRawIndex(i); switch (dimSize) { case 0: cb(i); break; case 1: cb(chunks[dims[0]][rawIdx], i); break; case 2: cb(chunks[dims[0]][rawIdx], chunks[dims[1]][rawIdx], i); break; default: var k = 0; var value = []; for (; k < dimSize; k++) { value[k] = chunks[dims[k]][rawIdx]; } value[k] = i; cb.apply(null, value); } } }; DataStore2.prototype.getDataExtent = function(dim) { var dimData = this._chunks[dim]; var initialExtent = getInitialExtent(); if (!dimData) { return initialExtent; } var currEnd = this.count(); var useRaw = !this._indices; var dimExtent; if (useRaw) { return this._rawExtent[dim].slice(); } dimExtent = this._extent[dim]; if (dimExtent) { return dimExtent.slice(); } dimExtent = initialExtent; var min2 = dimExtent[0]; var max2 = dimExtent[1]; for (var i = 0; i < currEnd; i++) { var rawIdx = this.getRawIndex(i); var value = dimData[rawIdx]; value < min2 && (min2 = value); value > max2 && (max2 = value); } dimExtent = [min2, max2]; this._extent[dim] = dimExtent; return dimExtent; }; DataStore2.prototype.getRawDataItem = function(idx) { var rawIdx = this.getRawIndex(idx); if (!this._provider.persistent) { var val = []; var chunks = this._chunks; for (var i = 0; i < chunks.length; i++) { val.push(chunks[i][rawIdx]); } return val; } else { return this._provider.getItem(rawIdx); } }; DataStore2.prototype.clone = function(clonedDims, ignoreIndices) { var target = new DataStore2(); var chunks = this._chunks; var clonedDimsMap = clonedDims && reduce(clonedDims, function(obj, dimIdx) { obj[dimIdx] = true; return obj; }, {}); if (clonedDimsMap) { for (var i = 0; i < chunks.length; i++) { target._chunks[i] = !clonedDimsMap[i] ? chunks[i] : cloneChunk(chunks[i]); } } else { target._chunks = chunks; } this._copyCommonProps(target); if (!ignoreIndices) { target._indices = this._cloneIndices(); } target._updateGetRawIdx(); return target; }; DataStore2.prototype._copyCommonProps = function(target) { target._count = this._count; target._rawCount = this._rawCount; target._provider = this._provider; target._dimensions = this._dimensions; target._extent = clone$1(this._extent); target._rawExtent = clone$1(this._rawExtent); }; DataStore2.prototype._cloneIndices = function() { if (this._indices) { var Ctor = this._indices.constructor; var indices = void 0; if (Ctor === Array) { var thisCount = this._indices.length; indices = new Ctor(thisCount); for (var i = 0; i < thisCount; i++) { indices[i] = this._indices[i]; } } else { indices = new Ctor(this._indices); } return indices; } return null; }; DataStore2.prototype._getRawIdxIdentity = function(idx) { return idx; }; DataStore2.prototype._getRawIdx = function(idx) { if (idx < this._count && idx >= 0) { return this._indices[idx]; } return -1; }; DataStore2.prototype._updateGetRawIdx = function() { this.getRawIndex = this._indices ? this._getRawIdx : this._getRawIdxIdentity; }; DataStore2.internalField = (function() { function getDimValueSimply(dataItem, property, dataIndex, dimIndex) { return parseDataValue(dataItem[dimIndex], this._dimensions[dimIndex]); } defaultDimValueGetters = { arrayRows: getDimValueSimply, objectRows: function(dataItem, property, dataIndex, dimIndex) { return parseDataValue(dataItem[property], this._dimensions[dimIndex]); }, keyedColumns: getDimValueSimply, original: function(dataItem, property, dataIndex, dimIndex) { var value = dataItem && (dataItem.value == null ? dataItem : dataItem.value); return parseDataValue(value instanceof Array ? value[dimIndex] : value, this._dimensions[dimIndex]); }, typedArray: function(dataItem, property, dataIndex, dimIndex) { return dataItem[dimIndex]; } }; })(); return DataStore2; })() ); var SourceManager = ( /** @class */ (function() { function SourceManager2(sourceHost) { this._sourceList = []; this._storeList = []; this._upstreamSignList = []; this._versionSignBase = 0; this._dirty = true; this._sourceHost = sourceHost; } SourceManager2.prototype.dirty = function() { this._setLocalSource([], []); this._storeList = []; this._dirty = true; }; SourceManager2.prototype._setLocalSource = function(sourceList, upstreamSignList) { this._sourceList = sourceList; this._upstreamSignList = upstreamSignList; this._versionSignBase++; if (this._versionSignBase > 9e10) { this._versionSignBase = 0; } }; SourceManager2.prototype._getVersionSign = function() { return this._sourceHost.uid + "_" + this._versionSignBase; }; SourceManager2.prototype.prepareSource = function() { if (this._isDirty()) { this._createSource(); this._dirty = false; } }; SourceManager2.prototype._createSource = function() { this._setLocalSource([], []); var sourceHost = this._sourceHost; var upSourceMgrList = this._getUpstreamSourceManagers(); var hasUpstream = !!upSourceMgrList.length; var resultSourceList; var upstreamSignList; if (isSeries(sourceHost)) { var seriesModel = sourceHost; var data = void 0; var sourceFormat = void 0; var upSource = void 0; if (hasUpstream) { var upSourceMgr = upSourceMgrList[0]; upSourceMgr.prepareSource(); upSource = upSourceMgr.getSource(); data = upSource.data; sourceFormat = upSource.sourceFormat; upstreamSignList = [upSourceMgr._getVersionSign()]; } else { data = seriesModel.get("data", true); sourceFormat = isTypedArray(data) ? SOURCE_FORMAT_TYPED_ARRAY : SOURCE_FORMAT_ORIGINAL; upstreamSignList = []; } var newMetaRawOption = this._getSourceMetaRawOption() || {}; var upMetaRawOption = upSource && upSource.metaRawOption || {}; var seriesLayoutBy = retrieve2(newMetaRawOption.seriesLayoutBy, upMetaRawOption.seriesLayoutBy) || null; var sourceHeader = retrieve2(newMetaRawOption.sourceHeader, upMetaRawOption.sourceHeader); var dimensions = retrieve2(newMetaRawOption.dimensions, upMetaRawOption.dimensions); var needsCreateSource = seriesLayoutBy !== upMetaRawOption.seriesLayoutBy || !!sourceHeader !== !!upMetaRawOption.sourceHeader || dimensions; resultSourceList = needsCreateSource ? [createSource(data, { seriesLayoutBy, sourceHeader, dimensions }, sourceFormat)] : []; } else { var datasetModel = sourceHost; if (hasUpstream) { var result = this._applyTransform(upSourceMgrList); resultSourceList = result.sourceList; upstreamSignList = result.upstreamSignList; } else { var sourceData = datasetModel.get("source", true); resultSourceList = [createSource(sourceData, this._getSourceMetaRawOption(), null)]; upstreamSignList = []; } } this._setLocalSource(resultSourceList, upstreamSignList); }; SourceManager2.prototype._applyTransform = function(upMgrList) { var datasetModel = this._sourceHost; var transformOption = datasetModel.get("transform", true); var fromTransformResult = datasetModel.get("fromTransformResult", true); if (fromTransformResult != null) { var errMsg = ""; if (upMgrList.length !== 1) { doThrow(errMsg); } } var sourceList; var upSourceList = []; var upstreamSignList = []; each$f(upMgrList, function(upMgr) { upMgr.prepareSource(); var upSource = upMgr.getSource(fromTransformResult || 0); var errMsg2 = ""; if (fromTransformResult != null && !upSource) { doThrow(errMsg2); } upSourceList.push(upSource); upstreamSignList.push(upMgr._getVersionSign()); }); if (transformOption) { sourceList = applyDataTransform(transformOption, upSourceList, { datasetIndex: datasetModel.componentIndex }); } else if (fromTransformResult != null) { sourceList = [cloneSourceShallow(upSourceList[0])]; } return { sourceList, upstreamSignList }; }; SourceManager2.prototype._isDirty = function() { if (this._dirty) { return true; } var upSourceMgrList = this._getUpstreamSourceManagers(); for (var i = 0; i < upSourceMgrList.length; i++) { var upSrcMgr = upSourceMgrList[i]; if ( // Consider the case that there is ancestor diry, call it recursively. // The performance is probably not an issue because usually the chain is not long. upSrcMgr._isDirty() || this._upstreamSignList[i] !== upSrcMgr._getVersionSign() ) { return true; } } }; SourceManager2.prototype.getSource = function(sourceIndex) { sourceIndex = sourceIndex || 0; var source = this._sourceList[sourceIndex]; if (!source) { var upSourceMgrList = this._getUpstreamSourceManagers(); return upSourceMgrList[0] && upSourceMgrList[0].getSource(sourceIndex); } return source; }; SourceManager2.prototype.getSharedDataStore = function(seriesDimRequest) { var schema = seriesDimRequest.makeStoreSchema(); return this._innerGetDataStore(schema.dimensions, seriesDimRequest.source, schema.hash); }; SourceManager2.prototype._innerGetDataStore = function(storeDims, seriesSource, sourceReadKey) { var sourceIndex = 0; var storeList = this._storeList; var cachedStoreMap = storeList[sourceIndex]; if (!cachedStoreMap) { cachedStoreMap = storeList[sourceIndex] = {}; } var cachedStore = cachedStoreMap[sourceReadKey]; if (!cachedStore) { var upSourceMgr = this._getUpstreamSourceManagers()[0]; if (isSeries(this._sourceHost) && upSourceMgr) { cachedStore = upSourceMgr._innerGetDataStore(storeDims, seriesSource, sourceReadKey); } else { cachedStore = new DataStore(); cachedStore.initData(new DefaultDataProvider(seriesSource, storeDims.length), storeDims); } cachedStoreMap[sourceReadKey] = cachedStore; } return cachedStore; }; SourceManager2.prototype._getUpstreamSourceManagers = function() { var sourceHost = this._sourceHost; if (isSeries(sourceHost)) { var datasetModel = querySeriesUpstreamDatasetModel(sourceHost); return !datasetModel ? [] : [datasetModel.getSourceManager()]; } else { return map$1(queryDatasetUpstreamDatasetModels(sourceHost), function(datasetModel2) { return datasetModel2.getSourceManager(); }); } }; SourceManager2.prototype._getSourceMetaRawOption = function() { var sourceHost = this._sourceHost; var seriesLayoutBy; var sourceHeader; var dimensions; if (isSeries(sourceHost)) { seriesLayoutBy = sourceHost.get("seriesLayoutBy", true); sourceHeader = sourceHost.get("sourceHeader", true); dimensions = sourceHost.get("dimensions", true); } else if (!this._getUpstreamSourceManagers().length) { var model = sourceHost; seriesLayoutBy = model.get("seriesLayoutBy", true); sourceHeader = model.get("sourceHeader", true); dimensions = model.get("dimensions", true); } return { seriesLayoutBy, sourceHeader, dimensions }; }; return SourceManager2; })() ); function disableTransformOptionMerge(datasetModel) { var transformOption = datasetModel.option.transform; transformOption && setAsPrimitive(datasetModel.option.transform); } function isSeries(sourceHost) { return sourceHost.mainType === "series"; } function doThrow(errMsg) { throw new Error(errMsg); } var TOOLTIP_LINE_HEIGHT_CSS = "line-height:1"; function getTooltipLineHeight(textStyle) { var lineHeight = textStyle.lineHeight; if (lineHeight == null) { return TOOLTIP_LINE_HEIGHT_CSS; } else { return "line-height:" + encodeHTML(lineHeight + "") + "px"; } } function getTooltipTextStyle(textStyle, renderMode) { var nameFontColor = textStyle.color || "#6e7079"; var nameFontSize = textStyle.fontSize || 12; var nameFontWeight = textStyle.fontWeight || "400"; var valueFontColor = textStyle.color || "#464646"; var valueFontSize = textStyle.fontSize || 14; var valueFontWeight = textStyle.fontWeight || "900"; if (renderMode === "html") { return { // eslint-disable-next-line max-len nameStyle: "font-size:" + encodeHTML(nameFontSize + "") + "px;color:" + encodeHTML(nameFontColor) + ";font-weight:" + encodeHTML(nameFontWeight + ""), // eslint-disable-next-line max-len valueStyle: "font-size:" + encodeHTML(valueFontSize + "") + "px;color:" + encodeHTML(valueFontColor) + ";font-weight:" + encodeHTML(valueFontWeight + "") }; } else { return { nameStyle: { fontSize: nameFontSize, fill: nameFontColor, fontWeight: nameFontWeight }, valueStyle: { fontSize: valueFontSize, fill: valueFontColor, fontWeight: valueFontWeight } }; } } var HTML_GAPS = [0, 10, 20, 30]; var RICH_TEXT_GAPS = ["", "\n", "\n\n", "\n\n\n"]; function createTooltipMarkup(type, option) { option.type = type; return option; } function isSectionFragment(frag) { return frag.type === "section"; } function getBuilder(frag) { return isSectionFragment(frag) ? buildSection : buildNameValue; } function getBlockGapLevel(frag) { if (isSectionFragment(frag)) { var gapLevel_1 = 0; var subBlockLen = frag.blocks.length; var hasInnerGap_1 = subBlockLen > 1 || subBlockLen > 0 && !frag.noHeader; each$f(frag.blocks, function(subBlock) { var subGapLevel = getBlockGapLevel(subBlock); if (subGapLevel >= gapLevel_1) { gapLevel_1 = subGapLevel + +(hasInnerGap_1 && // 0 always can not be readable gap level. (!subGapLevel || isSectionFragment(subBlock) && !subBlock.noHeader)); } }); return gapLevel_1; } return 0; } function buildSection(ctx, fragment, topMarginForOuterGap, toolTipTextStyle) { var noHeader = fragment.noHeader; var gaps = getGap(getBlockGapLevel(fragment)); var subMarkupTextList = []; var subBlocks = fragment.blocks || []; assert(!subBlocks || isArray$1(subBlocks)); subBlocks = subBlocks || []; var orderMode = ctx.orderMode; if (fragment.sortBlocks && orderMode) { subBlocks = subBlocks.slice(); var orderMap = { valueAsc: "asc", valueDesc: "desc" }; if (hasOwn(orderMap, orderMode)) { var comparator_1 = new SortOrderComparator(orderMap[orderMode], null); subBlocks.sort(function(a, b) { return comparator_1.evaluate(a.sortParam, b.sortParam); }); } else if (orderMode === "seriesDesc") { subBlocks.reverse(); } } each$f(subBlocks, function(subBlock, idx) { var valueFormatter = fragment.valueFormatter; var subMarkupText2 = getBuilder(subBlock)( // Inherit valueFormatter valueFormatter ? extend(extend({}, ctx), { valueFormatter }) : ctx, subBlock, idx > 0 ? gaps.html : 0, toolTipTextStyle ); subMarkupText2 != null && subMarkupTextList.push(subMarkupText2); }); var subMarkupText = ctx.renderMode === "richText" ? subMarkupTextList.join(gaps.richText) : wrapBlockHTML(toolTipTextStyle, subMarkupTextList.join(""), noHeader ? topMarginForOuterGap : gaps.html); if (noHeader) { return subMarkupText; } var displayableHeader = makeValueReadable(fragment.header, "ordinal", ctx.useUTC); var nameStyle = getTooltipTextStyle(toolTipTextStyle, ctx.renderMode).nameStyle; var tooltipLineHeight = getTooltipLineHeight(toolTipTextStyle); if (ctx.renderMode === "richText") { return wrapInlineNameRichText(ctx, displayableHeader, nameStyle) + gaps.richText + subMarkupText; } else { return wrapBlockHTML(toolTipTextStyle, '
' + encodeHTML(displayableHeader) + "
" + subMarkupText, topMarginForOuterGap); } } function buildNameValue(ctx, fragment, topMarginForOuterGap, toolTipTextStyle) { var renderMode = ctx.renderMode; var noName = fragment.noName; var noValue = fragment.noValue; var noMarker = !fragment.markerType; var name = fragment.name; var useUTC = ctx.useUTC; var valueFormatter = fragment.valueFormatter || ctx.valueFormatter || function(value) { value = isArray$1(value) ? value : [value]; return map$1(value, function(val, idx) { return makeValueReadable(val, isArray$1(valueTypeOption) ? valueTypeOption[idx] : valueTypeOption, useUTC); }); }; if (noName && noValue) { return; } var markerStr = noMarker ? "" : ctx.markupStyleCreator.makeTooltipMarker(fragment.markerType, fragment.markerColor || "#333", renderMode); var readableName = noName ? "" : makeValueReadable(name, "ordinal", useUTC); var valueTypeOption = fragment.valueType; var readableValueList = noValue ? [] : valueFormatter(fragment.value, fragment.dataIndex); var valueAlignRight = !noMarker || !noName; var valueCloseToMarker = !noMarker && noName; var _a2 = getTooltipTextStyle(toolTipTextStyle, renderMode), nameStyle = _a2.nameStyle, valueStyle = _a2.valueStyle; return renderMode === "richText" ? (noMarker ? "" : markerStr) + (noName ? "" : wrapInlineNameRichText(ctx, readableName, nameStyle)) + (noValue ? "" : wrapInlineValueRichText(ctx, readableValueList, valueAlignRight, valueCloseToMarker, valueStyle)) : wrapBlockHTML(toolTipTextStyle, (noMarker ? "" : markerStr) + (noName ? "" : wrapInlineNameHTML(readableName, !noMarker, nameStyle)) + (noValue ? "" : wrapInlineValueHTML(readableValueList, valueAlignRight, valueCloseToMarker, valueStyle)), topMarginForOuterGap); } function buildTooltipMarkup(fragment, markupStyleCreator, renderMode, orderMode, useUTC, toolTipTextStyle) { if (!fragment) { return; } var builder = getBuilder(fragment); var ctx = { useUTC, renderMode, orderMode, markupStyleCreator, valueFormatter: fragment.valueFormatter }; return builder(ctx, fragment, 0, toolTipTextStyle); } function getGap(gapLevel) { return { html: HTML_GAPS[gapLevel], richText: RICH_TEXT_GAPS[gapLevel] }; } function wrapBlockHTML(textStyle, encodedContent, topGap) { var clearfix = '
'; var marginCSS = "margin: " + topGap + "px 0 0"; var tooltipLineHeight = getTooltipLineHeight(textStyle); return '
' + encodedContent + clearfix + "
"; } function wrapInlineNameHTML(name, leftHasMarker, style) { var marginCss = leftHasMarker ? "margin-left:2px" : ""; return '' + encodeHTML(name) + ""; } function wrapInlineValueHTML(valueList, alignRight, valueCloseToMarker, style) { var paddingStr = valueCloseToMarker ? "10px" : "20px"; var alignCSS = alignRight ? "float:right;margin-left:" + paddingStr : ""; valueList = isArray$1(valueList) ? valueList : [valueList]; return '' + map$1(valueList, function(value) { return encodeHTML(value); }).join("  ") + ""; } function wrapInlineNameRichText(ctx, name, style) { return ctx.markupStyleCreator.wrapRichTextStyle(name, style); } function wrapInlineValueRichText(ctx, values, alignRight, valueCloseToMarker, style) { var styles = [style]; var paddingLeft = valueCloseToMarker ? 10 : 20; alignRight && styles.push({ padding: [0, 0, 0, paddingLeft], align: "right" }); return ctx.markupStyleCreator.wrapRichTextStyle(isArray$1(values) ? values.join(" ") : values, styles); } function retrieveVisualColorForTooltipMarker(series, dataIndex) { var style = series.getData().getItemVisual(dataIndex, "style"); var color = style[series.visualDrawType]; return convertToColorString(color); } function getPaddingFromTooltipModel(model, renderMode) { var padding = model.get("padding"); return padding != null ? padding : renderMode === "richText" ? [8, 10] : 10; } var TooltipMarkupStyleCreator = ( /** @class */ (function() { function TooltipMarkupStyleCreator2() { this.richTextStyles = {}; this._nextStyleNameId = getRandomIdBase(); } TooltipMarkupStyleCreator2.prototype._generateStyleName = function() { return "__EC_aUTo_" + this._nextStyleNameId++; }; TooltipMarkupStyleCreator2.prototype.makeTooltipMarker = function(markerType, colorStr, renderMode) { var markerId = renderMode === "richText" ? this._generateStyleName() : null; var marker = getTooltipMarker({ color: colorStr, type: markerType, renderMode, markerId }); if (isString(marker)) { return marker; } else { this.richTextStyles[markerId] = marker.style; return marker.content; } }; TooltipMarkupStyleCreator2.prototype.wrapRichTextStyle = function(text, styles) { var finalStl = {}; if (isArray$1(styles)) { each$f(styles, function(stl) { return extend(finalStl, stl); }); } else { extend(finalStl, styles); } var styleName = this._generateStyleName(); this.richTextStyles[styleName] = finalStl; return "{" + styleName + "|" + text + "}"; }; return TooltipMarkupStyleCreator2; })() ); function defaultSeriesFormatTooltip(opt) { var series = opt.series; var dataIndex = opt.dataIndex; var multipleSeries = opt.multipleSeries; var data = series.getData(); var tooltipDims = data.mapDimensionsAll("defaultedTooltip"); var tooltipDimLen = tooltipDims.length; var value = series.getRawValue(dataIndex); var isValueArr = isArray$1(value); var markerColor = retrieveVisualColorForTooltipMarker(series, dataIndex); var inlineValue; var inlineValueType; var subBlocks; var sortParam; if (tooltipDimLen > 1 || isValueArr && !tooltipDimLen) { var formatArrResult = formatTooltipArrayValue(value, series, dataIndex, tooltipDims, markerColor); inlineValue = formatArrResult.inlineValues; inlineValueType = formatArrResult.inlineValueTypes; subBlocks = formatArrResult.blocks; sortParam = formatArrResult.inlineValues[0]; } else if (tooltipDimLen) { var dimInfo = data.getDimensionInfo(tooltipDims[0]); sortParam = inlineValue = retrieveRawValue(data, dataIndex, tooltipDims[0]); inlineValueType = dimInfo.type; } else { sortParam = inlineValue = isValueArr ? value[0] : value; } var seriesNameSpecified = isNameSpecified(series); var seriesName = seriesNameSpecified && series.name || ""; var itemName = data.getName(dataIndex); var inlineName = multipleSeries ? seriesName : itemName; return createTooltipMarkup("section", { header: seriesName, // When series name is not specified, do not show a header line with only '-'. // This case always happens in tooltip.trigger: 'item'. noHeader: multipleSeries || !seriesNameSpecified, sortParam, blocks: [createTooltipMarkup("nameValue", { markerType: "item", markerColor, // Do not mix display seriesName and itemName in one tooltip, // which might confuses users. name: inlineName, // name dimension might be auto assigned, where the name might // be not readable. So we check trim here. noName: !trim$1(inlineName), value: inlineValue, valueType: inlineValueType, dataIndex })].concat(subBlocks || []) }); } function formatTooltipArrayValue(value, series, dataIndex, tooltipDims, colorStr) { var data = series.getData(); var isValueMultipleLine = reduce(value, function(isValueMultipleLine2, val, idx) { var dimItem = data.getDimensionInfo(idx); return isValueMultipleLine2 = isValueMultipleLine2 || dimItem && dimItem.tooltip !== false && dimItem.displayName != null; }, false); var inlineValues = []; var inlineValueTypes = []; var blocks = []; tooltipDims.length ? each$f(tooltipDims, function(dim) { setEachItem(retrieveRawValue(data, dataIndex, dim), dim); }) : each$f(value, setEachItem); function setEachItem(val, dim) { var dimInfo = data.getDimensionInfo(dim); if (!dimInfo || dimInfo.otherDims.tooltip === false) { return; } if (isValueMultipleLine) { blocks.push(createTooltipMarkup("nameValue", { markerType: "subItem", markerColor: colorStr, name: dimInfo.displayName, value: val, valueType: dimInfo.type })); } else { inlineValues.push(val); inlineValueTypes.push(dimInfo.type); } } return { inlineValues, inlineValueTypes, blocks }; } var inner$k = makeInner(); function getSelectionKey(data, dataIndex) { return data.getName(dataIndex) || data.getId(dataIndex); } var SERIES_UNIVERSAL_TRANSITION_PROP = "__universalTransitionEnabled"; var SeriesModel = ( /** @class */ (function(_super) { __extends(SeriesModel2, _super); function SeriesModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this._selectedDataIndicesMap = {}; return _this; } SeriesModel2.prototype.init = function(option, parentModel, ecModel) { this.seriesIndex = this.componentIndex; this.dataTask = createTask({ count: dataTaskCount, reset: dataTaskReset }); this.dataTask.context = { model: this }; this.mergeDefaultAndTheme(option, ecModel); var sourceManager = inner$k(this).sourceManager = new SourceManager(this); sourceManager.prepareSource(); var data = this.getInitialData(option, ecModel); wrapData(data, this); this.dataTask.context.data = data; inner$k(this).dataBeforeProcessed = data; autoSeriesName(this); this._initSelectedMapFromData(data); }; SeriesModel2.prototype.mergeDefaultAndTheme = function(option, ecModel) { var layoutMode = fetchLayoutMode(this); var inputPositionParams = layoutMode ? getLayoutParams(option) : {}; var themeSubType = this.subType; if (ComponentModel.hasClass(themeSubType)) { themeSubType += "Series"; } merge(option, ecModel.getTheme().get(this.subType)); merge(option, this.getDefaultOption()); defaultEmphasis(option, "label", ["show"]); this.fillDataTextStyle(option.data); if (layoutMode) { mergeLayoutParam(option, inputPositionParams, layoutMode); } }; SeriesModel2.prototype.mergeOption = function(newSeriesOption, ecModel) { newSeriesOption = merge(this.option, newSeriesOption, true); this.fillDataTextStyle(newSeriesOption.data); var layoutMode = fetchLayoutMode(this); if (layoutMode) { mergeLayoutParam(this.option, newSeriesOption, layoutMode); } var sourceManager = inner$k(this).sourceManager; sourceManager.dirty(); sourceManager.prepareSource(); var data = this.getInitialData(newSeriesOption, ecModel); wrapData(data, this); this.dataTask.dirty(); this.dataTask.context.data = data; inner$k(this).dataBeforeProcessed = data; autoSeriesName(this); this._initSelectedMapFromData(data); }; SeriesModel2.prototype.fillDataTextStyle = function(data) { if (data && !isTypedArray(data)) { var props = ["show"]; for (var i = 0; i < data.length; i++) { if (data[i] && data[i].label) { defaultEmphasis(data[i], "label", props); } } } }; SeriesModel2.prototype.getInitialData = function(option, ecModel) { return; }; SeriesModel2.prototype.appendData = function(params) { var data = this.getRawData(); data.appendData(params.data); }; SeriesModel2.prototype.getData = function(dataType) { var task = getCurrentTask(this); if (task) { var data = task.context.data; return dataType == null || !data.getLinkedData ? data : data.getLinkedData(dataType); } else { return inner$k(this).data; } }; SeriesModel2.prototype.getAllData = function() { var mainData = this.getData(); return mainData && mainData.getLinkedDataAll ? mainData.getLinkedDataAll() : [{ data: mainData }]; }; SeriesModel2.prototype.setData = function(data) { var task = getCurrentTask(this); if (task) { var context = task.context; context.outputData = data; if (task !== this.dataTask) { context.data = data; } } inner$k(this).data = data; }; SeriesModel2.prototype.getEncode = function() { var encode = this.get("encode", true); if (encode) { return createHashMap(encode); } }; SeriesModel2.prototype.getSourceManager = function() { return inner$k(this).sourceManager; }; SeriesModel2.prototype.getSource = function() { return this.getSourceManager().getSource(); }; SeriesModel2.prototype.getRawData = function() { return inner$k(this).dataBeforeProcessed; }; SeriesModel2.prototype.getColorBy = function() { var colorBy = this.get("colorBy"); return colorBy || "series"; }; SeriesModel2.prototype.isColorBySeries = function() { return this.getColorBy() === "series"; }; SeriesModel2.prototype.getBaseAxis = function() { var coordSys = this.coordinateSystem; return coordSys && coordSys.getBaseAxis && coordSys.getBaseAxis(); }; SeriesModel2.prototype.formatTooltip = function(dataIndex, multipleSeries, dataType) { return defaultSeriesFormatTooltip({ series: this, dataIndex, multipleSeries }); }; SeriesModel2.prototype.isAnimationEnabled = function() { var ecModel = this.ecModel; if (env.node && !(ecModel && ecModel.ssr)) { return false; } var animationEnabled = this.getShallow("animation"); if (animationEnabled) { if (this.getData().count() > this.getShallow("animationThreshold")) { animationEnabled = false; } } return !!animationEnabled; }; SeriesModel2.prototype.restoreData = function() { this.dataTask.dirty(); }; SeriesModel2.prototype.getColorFromPalette = function(name, scope, requestColorNum) { var ecModel = this.ecModel; var color = PaletteMixin.prototype.getColorFromPalette.call(this, name, scope, requestColorNum); if (!color) { color = ecModel.getColorFromPalette(name, scope, requestColorNum); } return color; }; SeriesModel2.prototype.coordDimToDataDim = function(coordDim) { return this.getRawData().mapDimensionsAll(coordDim); }; SeriesModel2.prototype.getProgressive = function() { return this.get("progressive"); }; SeriesModel2.prototype.getProgressiveThreshold = function() { return this.get("progressiveThreshold"); }; SeriesModel2.prototype.select = function(innerDataIndices, dataType) { this._innerSelect(this.getData(dataType), innerDataIndices); }; SeriesModel2.prototype.unselect = function(innerDataIndices, dataType) { var selectedMap = this.option.selectedMap; if (!selectedMap) { return; } var selectedMode = this.option.selectedMode; var data = this.getData(dataType); if (selectedMode === "series" || selectedMap === "all") { this.option.selectedMap = {}; this._selectedDataIndicesMap = {}; return; } for (var i = 0; i < innerDataIndices.length; i++) { var dataIndex = innerDataIndices[i]; var nameOrId = getSelectionKey(data, dataIndex); selectedMap[nameOrId] = false; this._selectedDataIndicesMap[nameOrId] = -1; } }; SeriesModel2.prototype.toggleSelect = function(innerDataIndices, dataType) { var tmpArr2 = []; for (var i = 0; i < innerDataIndices.length; i++) { tmpArr2[0] = innerDataIndices[i]; this.isSelected(innerDataIndices[i], dataType) ? this.unselect(tmpArr2, dataType) : this.select(tmpArr2, dataType); } }; SeriesModel2.prototype.getSelectedDataIndices = function() { if (this.option.selectedMap === "all") { return [].slice.call(this.getData().getIndices()); } var selectedDataIndicesMap = this._selectedDataIndicesMap; var nameOrIds = keys(selectedDataIndicesMap); var dataIndices = []; for (var i = 0; i < nameOrIds.length; i++) { var dataIndex = selectedDataIndicesMap[nameOrIds[i]]; if (dataIndex >= 0) { dataIndices.push(dataIndex); } } return dataIndices; }; SeriesModel2.prototype.isSelected = function(dataIndex, dataType) { var selectedMap = this.option.selectedMap; if (!selectedMap) { return false; } var data = this.getData(dataType); return (selectedMap === "all" || selectedMap[getSelectionKey(data, dataIndex)]) && !data.getItemModel(dataIndex).get(["select", "disabled"]); }; SeriesModel2.prototype.isUniversalTransitionEnabled = function() { if (this[SERIES_UNIVERSAL_TRANSITION_PROP]) { return true; } var universalTransitionOpt = this.option.universalTransition; if (!universalTransitionOpt) { return false; } if (universalTransitionOpt === true) { return true; } return universalTransitionOpt && universalTransitionOpt.enabled; }; SeriesModel2.prototype._innerSelect = function(data, innerDataIndices) { var _a2, _b2; var option = this.option; var selectedMode = option.selectedMode; var len2 = innerDataIndices.length; if (!selectedMode || !len2) { return; } if (selectedMode === "series") { option.selectedMap = "all"; } else if (selectedMode === "multiple") { if (!isObject$3(option.selectedMap)) { option.selectedMap = {}; } var selectedMap = option.selectedMap; for (var i = 0; i < len2; i++) { var dataIndex = innerDataIndices[i]; var nameOrId = getSelectionKey(data, dataIndex); selectedMap[nameOrId] = true; this._selectedDataIndicesMap[nameOrId] = data.getRawIndex(dataIndex); } } else if (selectedMode === "single" || selectedMode === true) { var lastDataIndex = innerDataIndices[len2 - 1]; var nameOrId = getSelectionKey(data, lastDataIndex); option.selectedMap = (_a2 = {}, _a2[nameOrId] = true, _a2); this._selectedDataIndicesMap = (_b2 = {}, _b2[nameOrId] = data.getRawIndex(lastDataIndex), _b2); } }; SeriesModel2.prototype._initSelectedMapFromData = function(data) { if (this.option.selectedMap) { return; } var dataIndices = []; if (data.hasItemOption) { data.each(function(idx) { var rawItem = data.getRawDataItem(idx); if (rawItem && rawItem.selected) { dataIndices.push(idx); } }); } if (dataIndices.length > 0) { this._innerSelect(data, dataIndices); } }; SeriesModel2.registerClass = function(clz) { return ComponentModel.registerClass(clz); }; SeriesModel2.protoInitialize = (function() { var proto2 = SeriesModel2.prototype; proto2.type = "series.__base__"; proto2.seriesIndex = 0; proto2.ignoreStyleOnData = false; proto2.hasSymbolVisual = false; proto2.defaultSymbol = "circle"; proto2.visualStyleAccessPath = "itemStyle"; proto2.visualDrawType = "fill"; })(); return SeriesModel2; })(ComponentModel) ); mixin(SeriesModel, DataFormatMixin); mixin(SeriesModel, PaletteMixin); mountExtend(SeriesModel, ComponentModel); function autoSeriesName(seriesModel) { var name = seriesModel.name; if (!isNameSpecified(seriesModel)) { seriesModel.name = getSeriesAutoName(seriesModel) || name; } } function getSeriesAutoName(seriesModel) { var data = seriesModel.getRawData(); var dataDims = data.mapDimensionsAll("seriesName"); var nameArr = []; each$f(dataDims, function(dataDim) { var dimInfo = data.getDimensionInfo(dataDim); dimInfo.displayName && nameArr.push(dimInfo.displayName); }); return nameArr.join(" "); } function dataTaskCount(context) { return context.model.getRawData().count(); } function dataTaskReset(context) { var seriesModel = context.model; seriesModel.setData(seriesModel.getRawData().cloneShallow()); return dataTaskProgress; } function dataTaskProgress(param, context) { if (context.outputData && param.end > context.outputData.count()) { context.model.getRawData().cloneShallow(context.outputData); } } function wrapData(data, seriesModel) { each$f(concatArray(data.CHANGABLE_METHODS, data.DOWNSAMPLE_METHODS), function(methodName) { data.wrapMethod(methodName, curry$1(onDataChange, seriesModel)); }); } function onDataChange(seriesModel, newList) { var task = getCurrentTask(seriesModel); if (task) { task.setOutputEnd((newList || this).count()); } return newList; } function getCurrentTask(seriesModel) { var scheduler = (seriesModel.ecModel || {}).scheduler; var pipeline = scheduler && scheduler.getPipeline(seriesModel.uid); if (pipeline) { var task = pipeline.currentTask; if (task) { var agentStubMap = task.agentStubMap; if (agentStubMap) { task = agentStubMap.get(seriesModel.uid); } } return task; } } var ComponentView = ( /** @class */ (function() { function ComponentView2() { this.group = new Group$3(); this.uid = getUID("viewComponent"); } ComponentView2.prototype.init = function(ecModel, api) { }; ComponentView2.prototype.render = function(model, ecModel, api, payload) { }; ComponentView2.prototype.dispose = function(ecModel, api) { }; ComponentView2.prototype.updateView = function(model, ecModel, api, payload) { }; ComponentView2.prototype.updateLayout = function(model, ecModel, api, payload) { }; ComponentView2.prototype.updateVisual = function(model, ecModel, api, payload) { }; ComponentView2.prototype.toggleBlurSeries = function(seriesModels, isBlur, ecModel) { }; ComponentView2.prototype.eachRendered = function(cb) { var group = this.group; if (group) { group.traverse(cb); } }; return ComponentView2; })() ); enableClassExtend(ComponentView); enableClassManagement(ComponentView); function createRenderPlanner() { var inner2 = makeInner(); return function(seriesModel) { var fields = inner2(seriesModel); var pipelineContext = seriesModel.pipelineContext; var originalLarge = !!fields.large; var originalProgressive = !!fields.progressiveRender; var large = fields.large = !!(pipelineContext && pipelineContext.large); var progressive = fields.progressiveRender = !!(pipelineContext && pipelineContext.progressiveRender); return !!(originalLarge !== large || originalProgressive !== progressive) && "reset"; }; } var inner$j = makeInner(); var renderPlanner = createRenderPlanner(); var ChartView = ( /** @class */ (function() { function ChartView2() { this.group = new Group$3(); this.uid = getUID("viewChart"); this.renderTask = createTask({ plan: renderTaskPlan, reset: renderTaskReset }); this.renderTask.context = { view: this }; } ChartView2.prototype.init = function(ecModel, api) { }; ChartView2.prototype.render = function(seriesModel, ecModel, api, payload) { }; ChartView2.prototype.highlight = function(seriesModel, ecModel, api, payload) { var data = seriesModel.getData(payload && payload.dataType); if (!data) { return; } toggleHighlight(data, payload, "emphasis"); }; ChartView2.prototype.downplay = function(seriesModel, ecModel, api, payload) { var data = seriesModel.getData(payload && payload.dataType); if (!data) { return; } toggleHighlight(data, payload, "normal"); }; ChartView2.prototype.remove = function(ecModel, api) { this.group.removeAll(); }; ChartView2.prototype.dispose = function(ecModel, api) { }; ChartView2.prototype.updateView = function(seriesModel, ecModel, api, payload) { this.render(seriesModel, ecModel, api, payload); }; ChartView2.prototype.updateLayout = function(seriesModel, ecModel, api, payload) { this.render(seriesModel, ecModel, api, payload); }; ChartView2.prototype.updateVisual = function(seriesModel, ecModel, api, payload) { this.render(seriesModel, ecModel, api, payload); }; ChartView2.prototype.eachRendered = function(cb) { traverseElements(this.group, cb); }; ChartView2.markUpdateMethod = function(payload, methodName) { inner$j(payload).updateMethod = methodName; }; ChartView2.protoInitialize = (function() { var proto2 = ChartView2.prototype; proto2.type = "chart"; })(); return ChartView2; })() ); function elSetState(el, state, highlightDigit) { if (el && isHighDownDispatcher(el)) { (state === "emphasis" ? enterEmphasis : leaveEmphasis)(el, highlightDigit); } } function toggleHighlight(data, payload, state) { var dataIndex = queryDataIndex(data, payload); var highlightDigit = payload && payload.highlightKey != null ? getHighlightDigit(payload.highlightKey) : null; if (dataIndex != null) { each$f(normalizeToArray(dataIndex), function(dataIdx) { elSetState(data.getItemGraphicEl(dataIdx), state, highlightDigit); }); } else { data.eachItemGraphicEl(function(el) { elSetState(el, state, highlightDigit); }); } } enableClassExtend(ChartView); enableClassManagement(ChartView); function renderTaskPlan(context) { return renderPlanner(context.model); } function renderTaskReset(context) { var seriesModel = context.model; var ecModel = context.ecModel; var api = context.api; var payload = context.payload; var progressiveRender = seriesModel.pipelineContext.progressiveRender; var view = context.view; var updateMethod = payload && inner$j(payload).updateMethod; var methodName = progressiveRender ? "incrementalPrepareRender" : updateMethod && view[updateMethod] ? updateMethod : "render"; if (methodName !== "render") { view[methodName](seriesModel, ecModel, api, payload); } return progressMethodMap[methodName]; } var progressMethodMap = { incrementalPrepareRender: { progress: function(params, context) { context.view.incrementalRender(params, context.model, context.ecModel, context.api, context.payload); } }, render: { // Put view.render in `progress` to support appendData. But in this case // view.render should not be called in reset, otherwise it will be called // twise. Use `forceFirstProgress` to make sure that view.render is called // in any cases. forceFirstProgress: true, progress: function(params, context) { context.view.render(context.model, context.ecModel, context.api, context.payload); } } }; var ORIGIN_METHOD = "\0__throttleOriginMethod"; var RATE = "\0__throttleRate"; var THROTTLE_TYPE = "\0__throttleType"; function throttle(fn, delay, debounce) { var currCall; var lastCall = 0; var lastExec = 0; var timer = null; var diff; var scope; var args; var debounceNextCall; delay = delay || 0; function exec() { lastExec = (/* @__PURE__ */ new Date()).getTime(); timer = null; fn.apply(scope, args || []); } var cb = function() { var cbArgs = []; for (var _i = 0; _i < arguments.length; _i++) { cbArgs[_i] = arguments[_i]; } currCall = (/* @__PURE__ */ new Date()).getTime(); scope = this; args = cbArgs; var thisDelay = debounceNextCall || delay; var thisDebounce = debounceNextCall || debounce; debounceNextCall = null; diff = currCall - (thisDebounce ? lastCall : lastExec) - thisDelay; clearTimeout(timer); if (thisDebounce) { timer = setTimeout(exec, thisDelay); } else { if (diff >= 0) { exec(); } else { timer = setTimeout(exec, -diff); } } lastCall = currCall; }; cb.clear = function() { if (timer) { clearTimeout(timer); timer = null; } }; cb.debounceNextCall = function(debounceDelay) { debounceNextCall = debounceDelay; }; return cb; } function createOrUpdate(obj, fnAttr, rate, throttleType) { var fn = obj[fnAttr]; if (!fn) { return; } var originFn = fn[ORIGIN_METHOD] || fn; var lastThrottleType = fn[THROTTLE_TYPE]; var lastRate = fn[RATE]; if (lastRate !== rate || lastThrottleType !== throttleType) { if (rate == null || !throttleType) { return obj[fnAttr] = originFn; } fn = obj[fnAttr] = throttle(originFn, rate, throttleType === "debounce"); fn[ORIGIN_METHOD] = originFn; fn[THROTTLE_TYPE] = throttleType; fn[RATE] = rate; } return fn; } function clear$1(obj, fnAttr) { var fn = obj[fnAttr]; if (fn && fn[ORIGIN_METHOD]) { fn.clear && fn.clear(); obj[fnAttr] = fn[ORIGIN_METHOD]; } } var inner$i = makeInner(); var defaultStyleMappers = { itemStyle: makeStyleMapper(ITEM_STYLE_KEY_MAP, true), lineStyle: makeStyleMapper(LINE_STYLE_KEY_MAP, true) }; var defaultColorKey = { lineStyle: "stroke", itemStyle: "fill" }; function getStyleMapper(seriesModel, stylePath) { var styleMapper = seriesModel.visualStyleMapper || defaultStyleMappers[stylePath]; if (!styleMapper) { console.warn("Unknown style type '" + stylePath + "'."); return defaultStyleMappers.itemStyle; } return styleMapper; } function getDefaultColorKey(seriesModel, stylePath) { var colorKey = seriesModel.visualDrawType || defaultColorKey[stylePath]; if (!colorKey) { console.warn("Unknown style type '" + stylePath + "'."); return "fill"; } return colorKey; } var seriesStyleTask = { createOnAllSeries: true, performRawSeries: true, reset: function(seriesModel, ecModel) { var data = seriesModel.getData(); var stylePath = seriesModel.visualStyleAccessPath || "itemStyle"; var styleModel = seriesModel.getModel(stylePath); var getStyle = getStyleMapper(seriesModel, stylePath); var globalStyle = getStyle(styleModel); var decalOption = styleModel.getShallow("decal"); if (decalOption) { data.setVisual("decal", decalOption); decalOption.dirty = true; } var colorKey = getDefaultColorKey(seriesModel, stylePath); var color = globalStyle[colorKey]; var colorCallback = isFunction(color) ? color : null; var hasAutoColor = globalStyle.fill === "auto" || globalStyle.stroke === "auto"; if (!globalStyle[colorKey] || colorCallback || hasAutoColor) { var colorPalette2 = seriesModel.getColorFromPalette( // TODO series count changed. seriesModel.name, null, ecModel.getSeriesCount() ); if (!globalStyle[colorKey]) { globalStyle[colorKey] = colorPalette2; data.setVisual("colorFromPalette", true); } globalStyle.fill = globalStyle.fill === "auto" || isFunction(globalStyle.fill) ? colorPalette2 : globalStyle.fill; globalStyle.stroke = globalStyle.stroke === "auto" || isFunction(globalStyle.stroke) ? colorPalette2 : globalStyle.stroke; } data.setVisual("style", globalStyle); data.setVisual("drawType", colorKey); if (!ecModel.isSeriesFiltered(seriesModel) && colorCallback) { data.setVisual("colorFromPalette", false); return { dataEach: function(data2, idx) { var dataParams = seriesModel.getDataParams(idx); var itemStyle = extend({}, globalStyle); itemStyle[colorKey] = colorCallback(dataParams); data2.setItemVisual(idx, "style", itemStyle); } }; } } }; var sharedModel = new Model(); var dataStyleTask = { createOnAllSeries: true, performRawSeries: true, reset: function(seriesModel, ecModel) { if (seriesModel.ignoreStyleOnData || ecModel.isSeriesFiltered(seriesModel)) { return; } var data = seriesModel.getData(); var stylePath = seriesModel.visualStyleAccessPath || "itemStyle"; var getStyle = getStyleMapper(seriesModel, stylePath); var colorKey = data.getVisual("drawType"); return { dataEach: data.hasItemOption ? function(data2, idx) { var rawItem = data2.getRawDataItem(idx); if (rawItem && rawItem[stylePath]) { sharedModel.option = rawItem[stylePath]; var style = getStyle(sharedModel); var existsStyle = data2.ensureUniqueItemVisual(idx, "style"); extend(existsStyle, style); if (sharedModel.option.decal) { data2.setItemVisual(idx, "decal", sharedModel.option.decal); sharedModel.option.decal.dirty = true; } if (colorKey in style) { data2.setItemVisual(idx, "colorFromPalette", false); } } } : null }; } }; var dataColorPaletteTask = { performRawSeries: true, overallReset: function(ecModel) { var paletteScopeGroupByType = createHashMap(); ecModel.eachSeries(function(seriesModel) { var colorBy = seriesModel.getColorBy(); if (seriesModel.isColorBySeries()) { return; } var key = seriesModel.type + "-" + colorBy; var colorScope = paletteScopeGroupByType.get(key); if (!colorScope) { colorScope = {}; paletteScopeGroupByType.set(key, colorScope); } inner$i(seriesModel).scope = colorScope; }); ecModel.eachSeries(function(seriesModel) { if (seriesModel.isColorBySeries() || ecModel.isSeriesFiltered(seriesModel)) { return; } var dataAll = seriesModel.getRawData(); var idxMap = {}; var data = seriesModel.getData(); var colorScope = inner$i(seriesModel).scope; var stylePath = seriesModel.visualStyleAccessPath || "itemStyle"; var colorKey = getDefaultColorKey(seriesModel, stylePath); data.each(function(idx) { var rawIdx = data.getRawIndex(idx); idxMap[rawIdx] = idx; }); dataAll.each(function(rawIdx) { var idx = idxMap[rawIdx]; var fromPalette = data.getItemVisual(idx, "colorFromPalette"); if (fromPalette) { var itemStyle = data.ensureUniqueItemVisual(idx, "style"); var name_1 = dataAll.getName(rawIdx) || rawIdx + ""; var dataCount = dataAll.count(); itemStyle[colorKey] = seriesModel.getColorFromPalette(name_1, colorScope, dataCount); } }); }); } }; var PI$4 = Math.PI; function defaultLoading(api, opts) { opts = opts || {}; defaults(opts, { text: "loading", textColor: "#000", fontSize: 12, fontWeight: "normal", fontStyle: "normal", fontFamily: "sans-serif", maskColor: "rgba(255, 255, 255, 0.8)", showSpinner: true, color: "#5470c6", spinnerRadius: 10, lineWidth: 5, zlevel: 0 }); var group = new Group$3(); var mask = new Rect$2({ style: { fill: opts.maskColor }, zlevel: opts.zlevel, z: 1e4 }); group.add(mask); var textContent = new ZRText({ style: { text: opts.text, fill: opts.textColor, fontSize: opts.fontSize, fontWeight: opts.fontWeight, fontStyle: opts.fontStyle, fontFamily: opts.fontFamily }, zlevel: opts.zlevel, z: 10001 }); var labelRect = new Rect$2({ style: { fill: "none" }, textContent, textConfig: { position: "right", distance: 10 }, zlevel: opts.zlevel, z: 10001 }); group.add(labelRect); var arc; if (opts.showSpinner) { arc = new Arc({ shape: { startAngle: -PI$4 / 2, endAngle: -PI$4 / 2 + 0.1, r: opts.spinnerRadius }, style: { stroke: opts.color, lineCap: "round", lineWidth: opts.lineWidth }, zlevel: opts.zlevel, z: 10001 }); arc.animateShape(true).when(1e3, { endAngle: PI$4 * 3 / 2 }).start("circularInOut"); arc.animateShape(true).when(1e3, { startAngle: PI$4 * 3 / 2 }).delay(300).start("circularInOut"); group.add(arc); } group.resize = function() { var textWidth = textContent.getBoundingRect().width; var r = opts.showSpinner ? opts.spinnerRadius : 0; var cx = (api.getWidth() - r * 2 - (opts.showSpinner && textWidth ? 10 : 0) - textWidth) / 2 - (opts.showSpinner && textWidth ? 0 : 5 + textWidth / 2) + (opts.showSpinner ? 0 : textWidth / 2) + (textWidth ? 0 : r); var cy = api.getHeight() / 2; opts.showSpinner && arc.setShape({ cx, cy }); labelRect.setShape({ x: cx - r, y: cy - r, width: r * 2, height: r * 2 }); mask.setShape({ x: 0, y: 0, width: api.getWidth(), height: api.getHeight() }); }; group.resize(); return group; } var Scheduler = ( /** @class */ (function() { function Scheduler2(ecInstance, api, dataProcessorHandlers, visualHandlers) { this._stageTaskMap = createHashMap(); this.ecInstance = ecInstance; this.api = api; dataProcessorHandlers = this._dataProcessorHandlers = dataProcessorHandlers.slice(); visualHandlers = this._visualHandlers = visualHandlers.slice(); this._allHandlers = dataProcessorHandlers.concat(visualHandlers); } Scheduler2.prototype.restoreData = function(ecModel, payload) { ecModel.restoreData(payload); this._stageTaskMap.each(function(taskRecord) { var overallTask = taskRecord.overallTask; overallTask && overallTask.dirty(); }); }; Scheduler2.prototype.getPerformArgs = function(task, isBlock) { if (!task.__pipeline) { return; } var pipeline = this._pipelineMap.get(task.__pipeline.id); var pCtx = pipeline.context; var incremental = !isBlock && pipeline.progressiveEnabled && (!pCtx || pCtx.progressiveRender) && task.__idxInPipeline > pipeline.blockIndex; var step = incremental ? pipeline.step : null; var modDataCount = pCtx && pCtx.modDataCount; var modBy = modDataCount != null ? Math.ceil(modDataCount / step) : null; return { step, modBy, modDataCount }; }; Scheduler2.prototype.getPipeline = function(pipelineId) { return this._pipelineMap.get(pipelineId); }; Scheduler2.prototype.updateStreamModes = function(seriesModel, view) { var pipeline = this._pipelineMap.get(seriesModel.uid); var data = seriesModel.getData(); var dataLen = data.count(); var progressiveRender = pipeline.progressiveEnabled && view.incrementalPrepareRender && dataLen >= pipeline.threshold; var large = seriesModel.get("large") && dataLen >= seriesModel.get("largeThreshold"); var modDataCount = seriesModel.get("progressiveChunkMode") === "mod" ? dataLen : null; seriesModel.pipelineContext = pipeline.context = { progressiveRender, modDataCount, large }; }; Scheduler2.prototype.restorePipelines = function(ecModel) { var scheduler = this; var pipelineMap = scheduler._pipelineMap = createHashMap(); ecModel.eachSeries(function(seriesModel) { var progressive = seriesModel.getProgressive(); var pipelineId = seriesModel.uid; pipelineMap.set(pipelineId, { id: pipelineId, head: null, tail: null, threshold: seriesModel.getProgressiveThreshold(), progressiveEnabled: progressive && !(seriesModel.preventIncremental && seriesModel.preventIncremental()), blockIndex: -1, step: Math.round(progressive || 700), count: 0 }); scheduler._pipe(seriesModel, seriesModel.dataTask); }); }; Scheduler2.prototype.prepareStageTasks = function() { var stageTaskMap = this._stageTaskMap; var ecModel = this.api.getModel(); var api = this.api; each$f(this._allHandlers, function(handler) { var record = stageTaskMap.get(handler.uid) || stageTaskMap.set(handler.uid, {}); var errMsg = ""; assert(!(handler.reset && handler.overallReset), errMsg); handler.reset && this._createSeriesStageTask(handler, record, ecModel, api); handler.overallReset && this._createOverallStageTask(handler, record, ecModel, api); }, this); }; Scheduler2.prototype.prepareView = function(view, model, ecModel, api) { var renderTask = view.renderTask; var context = renderTask.context; context.model = model; context.ecModel = ecModel; context.api = api; renderTask.__block = !view.incrementalPrepareRender; this._pipe(model, renderTask); }; Scheduler2.prototype.performDataProcessorTasks = function(ecModel, payload) { this._performStageTasks(this._dataProcessorHandlers, ecModel, payload, { block: true }); }; Scheduler2.prototype.performVisualTasks = function(ecModel, payload, opt) { this._performStageTasks(this._visualHandlers, ecModel, payload, opt); }; Scheduler2.prototype._performStageTasks = function(stageHandlers, ecModel, payload, opt) { opt = opt || {}; var unfinished = false; var scheduler = this; each$f(stageHandlers, function(stageHandler, idx) { if (opt.visualType && opt.visualType !== stageHandler.visualType) { return; } var stageHandlerRecord = scheduler._stageTaskMap.get(stageHandler.uid); var seriesTaskMap = stageHandlerRecord.seriesTaskMap; var overallTask = stageHandlerRecord.overallTask; if (overallTask) { var overallNeedDirty_1; var agentStubMap = overallTask.agentStubMap; agentStubMap.each(function(stub) { if (needSetDirty(opt, stub)) { stub.dirty(); overallNeedDirty_1 = true; } }); overallNeedDirty_1 && overallTask.dirty(); scheduler.updatePayload(overallTask, payload); var performArgs_1 = scheduler.getPerformArgs(overallTask, opt.block); agentStubMap.each(function(stub) { stub.perform(performArgs_1); }); if (overallTask.perform(performArgs_1)) { unfinished = true; } } else if (seriesTaskMap) { seriesTaskMap.each(function(task, pipelineId) { if (needSetDirty(opt, task)) { task.dirty(); } var performArgs = scheduler.getPerformArgs(task, opt.block); performArgs.skip = !stageHandler.performRawSeries && ecModel.isSeriesFiltered(task.context.model); scheduler.updatePayload(task, payload); if (task.perform(performArgs)) { unfinished = true; } }); } }); function needSetDirty(opt2, task) { return opt2.setDirty && (!opt2.dirtyMap || opt2.dirtyMap.get(task.__pipeline.id)); } this.unfinished = unfinished || this.unfinished; }; Scheduler2.prototype.performSeriesTasks = function(ecModel) { var unfinished; ecModel.eachSeries(function(seriesModel) { unfinished = seriesModel.dataTask.perform() || unfinished; }); this.unfinished = unfinished || this.unfinished; }; Scheduler2.prototype.plan = function() { this._pipelineMap.each(function(pipeline) { var task = pipeline.tail; do { if (task.__block) { pipeline.blockIndex = task.__idxInPipeline; break; } task = task.getUpstream(); } while (task); }); }; Scheduler2.prototype.updatePayload = function(task, payload) { payload !== "remain" && (task.context.payload = payload); }; Scheduler2.prototype._createSeriesStageTask = function(stageHandler, stageHandlerRecord, ecModel, api) { var scheduler = this; var oldSeriesTaskMap = stageHandlerRecord.seriesTaskMap; var newSeriesTaskMap = stageHandlerRecord.seriesTaskMap = createHashMap(); var seriesType2 = stageHandler.seriesType; var getTargetSeries = stageHandler.getTargetSeries; if (stageHandler.createOnAllSeries) { ecModel.eachRawSeries(create2); } else if (seriesType2) { ecModel.eachRawSeriesByType(seriesType2, create2); } else if (getTargetSeries) { getTargetSeries(ecModel, api).each(create2); } function create2(seriesModel) { var pipelineId = seriesModel.uid; var task = newSeriesTaskMap.set(pipelineId, oldSeriesTaskMap && oldSeriesTaskMap.get(pipelineId) || createTask({ plan: seriesTaskPlan, reset: seriesTaskReset, count: seriesTaskCount })); task.context = { model: seriesModel, ecModel, api, // PENDING: `useClearVisual` not used? useClearVisual: stageHandler.isVisual && !stageHandler.isLayout, plan: stageHandler.plan, reset: stageHandler.reset, scheduler }; scheduler._pipe(seriesModel, task); } }; Scheduler2.prototype._createOverallStageTask = function(stageHandler, stageHandlerRecord, ecModel, api) { var scheduler = this; var overallTask = stageHandlerRecord.overallTask = stageHandlerRecord.overallTask || createTask({ reset: overallTaskReset }); overallTask.context = { ecModel, api, overallReset: stageHandler.overallReset, scheduler }; var oldAgentStubMap = overallTask.agentStubMap; var newAgentStubMap = overallTask.agentStubMap = createHashMap(); var seriesType2 = stageHandler.seriesType; var getTargetSeries = stageHandler.getTargetSeries; var overallProgress = true; var shouldOverallTaskDirty = false; var errMsg = ""; assert(!stageHandler.createOnAllSeries, errMsg); if (seriesType2) { ecModel.eachRawSeriesByType(seriesType2, createStub); } else if (getTargetSeries) { getTargetSeries(ecModel, api).each(createStub); } else { overallProgress = false; each$f(ecModel.getSeries(), createStub); } function createStub(seriesModel) { var pipelineId = seriesModel.uid; var stub = newAgentStubMap.set(pipelineId, oldAgentStubMap && oldAgentStubMap.get(pipelineId) || // When the result of `getTargetSeries` changed, the overallTask // should be set as dirty and re-performed. (shouldOverallTaskDirty = true, createTask({ reset: stubReset, onDirty: stubOnDirty }))); stub.context = { model: seriesModel, overallProgress // FIXME:TS never used, so comment it // modifyOutputEnd: modifyOutputEnd }; stub.agent = overallTask; stub.__block = overallProgress; scheduler._pipe(seriesModel, stub); } if (shouldOverallTaskDirty) { overallTask.dirty(); } }; Scheduler2.prototype._pipe = function(seriesModel, task) { var pipelineId = seriesModel.uid; var pipeline = this._pipelineMap.get(pipelineId); !pipeline.head && (pipeline.head = task); pipeline.tail && pipeline.tail.pipe(task); pipeline.tail = task; task.__idxInPipeline = pipeline.count++; task.__pipeline = pipeline; }; Scheduler2.wrapStageHandler = function(stageHandler, visualType) { if (isFunction(stageHandler)) { stageHandler = { overallReset: stageHandler, seriesType: detectSeriseType(stageHandler) }; } stageHandler.uid = getUID("stageHandler"); visualType && (stageHandler.visualType = visualType); return stageHandler; }; return Scheduler2; })() ); function overallTaskReset(context) { context.overallReset(context.ecModel, context.api, context.payload); } function stubReset(context) { return context.overallProgress && stubProgress; } function stubProgress() { this.agent.dirty(); this.getDownstream().dirty(); } function stubOnDirty() { this.agent && this.agent.dirty(); } function seriesTaskPlan(context) { return context.plan ? context.plan(context.model, context.ecModel, context.api, context.payload) : null; } function seriesTaskReset(context) { if (context.useClearVisual) { context.data.clearAllVisual(); } var resetDefines = context.resetDefines = normalizeToArray(context.reset(context.model, context.ecModel, context.api, context.payload)); return resetDefines.length > 1 ? map$1(resetDefines, function(v, idx) { return makeSeriesTaskProgress(idx); }) : singleSeriesTaskProgress; } var singleSeriesTaskProgress = makeSeriesTaskProgress(0); function makeSeriesTaskProgress(resetDefineIdx) { return function(params, context) { var data = context.data; var resetDefine = context.resetDefines[resetDefineIdx]; if (resetDefine && resetDefine.dataEach) { for (var i = params.start; i < params.end; i++) { resetDefine.dataEach(data, i); } } else if (resetDefine && resetDefine.progress) { resetDefine.progress(params, data); } }; } function seriesTaskCount(context) { return context.data.count(); } function detectSeriseType(legacyFunc) { seriesType = null; try { legacyFunc(ecModelMock, apiMock); } catch (e) { } return seriesType; } var ecModelMock = {}; var apiMock = {}; var seriesType; mockMethods(ecModelMock, GlobalModel); mockMethods(apiMock, ExtensionAPI); ecModelMock.eachSeriesByType = ecModelMock.eachRawSeriesByType = function(type) { seriesType = type; }; ecModelMock.eachComponent = function(cond) { if (cond.mainType === "series" && cond.subType) { seriesType = cond.subType; } }; function mockMethods(target, Clz) { for (var name_1 in Clz.prototype) { target[name_1] = noop; } } var colorAll = ["#37A2DA", "#32C5E9", "#67E0E3", "#9FE6B8", "#FFDB5C", "#ff9f7f", "#fb7293", "#E062AE", "#E690D1", "#e7bcf3", "#9d96f5", "#8378EA", "#96BFFF"]; const lightTheme = { color: colorAll, colorLayer: [["#37A2DA", "#ffd85c", "#fd7b5f"], ["#37A2DA", "#67E0E3", "#FFDB5C", "#ff9f7f", "#E062AE", "#9d96f5"], ["#37A2DA", "#32C5E9", "#9FE6B8", "#FFDB5C", "#ff9f7f", "#fb7293", "#e7bcf3", "#8378EA", "#96BFFF"], colorAll] }; var contrastColor = "#B9B8CE"; var backgroundColor = "#100C2A"; var axisCommon = function() { return { axisLine: { lineStyle: { color: contrastColor } }, splitLine: { lineStyle: { color: "#484753" } }, splitArea: { areaStyle: { color: ["rgba(255,255,255,0.02)", "rgba(255,255,255,0.05)"] } }, minorSplitLine: { lineStyle: { color: "#20203B" } } }; }; var colorPalette = ["#4992ff", "#7cffb2", "#fddd60", "#ff6e76", "#58d9f9", "#05c091", "#ff8a45", "#8d48e3", "#dd79ff"]; var theme = { darkMode: true, color: colorPalette, backgroundColor, axisPointer: { lineStyle: { color: "#817f91" }, crossStyle: { color: "#817f91" }, label: { // TODO Contrast of label backgorundColor color: "#fff" } }, legend: { textStyle: { color: contrastColor }, pageTextStyle: { color: contrastColor } }, textStyle: { color: contrastColor }, title: { textStyle: { color: "#EEF1FA" }, subtextStyle: { color: "#B9B8CE" } }, toolbox: { iconStyle: { borderColor: contrastColor } }, dataZoom: { borderColor: "#71708A", textStyle: { color: contrastColor }, brushStyle: { color: "rgba(135,163,206,0.3)" }, handleStyle: { color: "#353450", borderColor: "#C5CBE3" }, moveHandleStyle: { color: "#B0B6C3", opacity: 0.3 }, fillerColor: "rgba(135,163,206,0.2)", emphasis: { handleStyle: { borderColor: "#91B7F2", color: "#4D587D" }, moveHandleStyle: { color: "#636D9A", opacity: 0.7 } }, dataBackground: { lineStyle: { color: "#71708A", width: 1 }, areaStyle: { color: "#71708A" } }, selectedDataBackground: { lineStyle: { color: "#87A3CE" }, areaStyle: { color: "#87A3CE" } } }, visualMap: { textStyle: { color: contrastColor } }, timeline: { lineStyle: { color: contrastColor }, label: { color: contrastColor }, controlStyle: { color: contrastColor, borderColor: contrastColor } }, calendar: { itemStyle: { color: backgroundColor }, dayLabel: { color: contrastColor }, monthLabel: { color: contrastColor }, yearLabel: { color: contrastColor } }, timeAxis: axisCommon(), logAxis: axisCommon(), valueAxis: axisCommon(), categoryAxis: axisCommon(), line: { symbol: "circle" }, graph: { color: colorPalette }, gauge: { title: { color: contrastColor }, axisLine: { lineStyle: { color: [[1, "rgba(207,212,219,0.2)"]] } }, axisLabel: { color: contrastColor }, detail: { color: "#EEF1FA" } }, candlestick: { itemStyle: { color: "#f64e56", color0: "#54ea92", borderColor: "#f64e56", borderColor0: "#54ea92" // borderColor: '#ca2824', // borderColor0: '#09a443' } } }; theme.categoryAxis.splitLine.show = false; var ECEventProcessor = ( /** @class */ (function() { function ECEventProcessor2() { } ECEventProcessor2.prototype.normalizeQuery = function(query) { var cptQuery = {}; var dataQuery = {}; var otherQuery = {}; if (isString(query)) { var condCptType = parseClassType(query); cptQuery.mainType = condCptType.main || null; cptQuery.subType = condCptType.sub || null; } else { var suffixes_1 = ["Index", "Name", "Id"]; var dataKeys_1 = { name: 1, dataIndex: 1, dataType: 1 }; each$f(query, function(val, key) { var reserved = false; for (var i = 0; i < suffixes_1.length; i++) { var propSuffix = suffixes_1[i]; var suffixPos = key.lastIndexOf(propSuffix); if (suffixPos > 0 && suffixPos === key.length - propSuffix.length) { var mainType = key.slice(0, suffixPos); if (mainType !== "data") { cptQuery.mainType = mainType; cptQuery[propSuffix.toLowerCase()] = val; reserved = true; } } } if (dataKeys_1.hasOwnProperty(key)) { dataQuery[key] = val; reserved = true; } if (!reserved) { otherQuery[key] = val; } }); } return { cptQuery, dataQuery, otherQuery }; }; ECEventProcessor2.prototype.filter = function(eventType, query) { var eventInfo = this.eventInfo; if (!eventInfo) { return true; } var targetEl = eventInfo.targetEl; var packedEvent = eventInfo.packedEvent; var model = eventInfo.model; var view = eventInfo.view; if (!model || !view) { return true; } var cptQuery = query.cptQuery; var dataQuery = query.dataQuery; return check(cptQuery, model, "mainType") && check(cptQuery, model, "subType") && check(cptQuery, model, "index", "componentIndex") && check(cptQuery, model, "name") && check(cptQuery, model, "id") && check(dataQuery, packedEvent, "name") && check(dataQuery, packedEvent, "dataIndex") && check(dataQuery, packedEvent, "dataType") && (!view.filterForExposedEvent || view.filterForExposedEvent(eventType, query.otherQuery, targetEl, packedEvent)); function check(query2, host, prop, propOnHost) { return query2[prop] == null || host[propOnHost || prop] === query2[prop]; } }; ECEventProcessor2.prototype.afterTrigger = function() { this.eventInfo = null; }; return ECEventProcessor2; })() ); var SYMBOL_PROPS_WITH_CB = ["symbol", "symbolSize", "symbolRotate", "symbolOffset"]; var SYMBOL_PROPS = SYMBOL_PROPS_WITH_CB.concat(["symbolKeepAspect"]); var seriesSymbolTask = { createOnAllSeries: true, // For legend. performRawSeries: true, reset: function(seriesModel, ecModel) { var data = seriesModel.getData(); if (seriesModel.legendIcon) { data.setVisual("legendIcon", seriesModel.legendIcon); } if (!seriesModel.hasSymbolVisual) { return; } var symbolOptions = {}; var symbolOptionsCb = {}; var hasCallback = false; for (var i = 0; i < SYMBOL_PROPS_WITH_CB.length; i++) { var symbolPropName = SYMBOL_PROPS_WITH_CB[i]; var val = seriesModel.get(symbolPropName); if (isFunction(val)) { hasCallback = true; symbolOptionsCb[symbolPropName] = val; } else { symbolOptions[symbolPropName] = val; } } symbolOptions.symbol = symbolOptions.symbol || seriesModel.defaultSymbol; data.setVisual(extend({ legendIcon: seriesModel.legendIcon || symbolOptions.symbol, symbolKeepAspect: seriesModel.get("symbolKeepAspect") }, symbolOptions)); if (ecModel.isSeriesFiltered(seriesModel)) { return; } var symbolPropsCb = keys(symbolOptionsCb); function dataEach(data2, idx) { var rawValue = seriesModel.getRawValue(idx); var params = seriesModel.getDataParams(idx); for (var i2 = 0; i2 < symbolPropsCb.length; i2++) { var symbolPropName2 = symbolPropsCb[i2]; data2.setItemVisual(idx, symbolPropName2, symbolOptionsCb[symbolPropName2](rawValue, params)); } } return { dataEach: hasCallback ? dataEach : null }; } }; var dataSymbolTask = { createOnAllSeries: true, // For legend. performRawSeries: true, reset: function(seriesModel, ecModel) { if (!seriesModel.hasSymbolVisual) { return; } if (ecModel.isSeriesFiltered(seriesModel)) { return; } var data = seriesModel.getData(); function dataEach(data2, idx) { var itemModel = data2.getItemModel(idx); for (var i = 0; i < SYMBOL_PROPS.length; i++) { var symbolPropName = SYMBOL_PROPS[i]; var val = itemModel.getShallow(symbolPropName, true); if (val != null) { data2.setItemVisual(idx, symbolPropName, val); } } } return { dataEach: data.hasItemOption ? dataEach : null }; } }; function getItemVisualFromData(data, dataIndex, key) { switch (key) { case "color": var style = data.getItemVisual(dataIndex, "style"); return style[data.getVisual("drawType")]; case "opacity": return data.getItemVisual(dataIndex, "style").opacity; case "symbol": case "symbolSize": case "liftZ": return data.getItemVisual(dataIndex, key); } } function getVisualFromData(data, key) { switch (key) { case "color": var style = data.getVisual("style"); return style[data.getVisual("drawType")]; case "opacity": return data.getVisual("style").opacity; case "symbol": case "symbolSize": case "liftZ": return data.getVisual(key); } } function setItemVisualFromData(data, dataIndex, key, value) { switch (key) { case "color": var style = data.ensureUniqueItemVisual(dataIndex, "style"); style[data.getVisual("drawType")] = value; data.setItemVisual(dataIndex, "colorFromPalette", false); break; case "opacity": data.ensureUniqueItemVisual(dataIndex, "style").opacity = value; break; case "symbol": case "symbolSize": case "liftZ": data.setItemVisual(dataIndex, key, value); break; } } function createLegacyDataSelectAction(seriesType2, ecRegisterAction) { function getSeriesIndices(ecModel, payload) { var seriesIndices = []; ecModel.eachComponent({ mainType: "series", subType: seriesType2, query: payload }, function(seriesModel) { seriesIndices.push(seriesModel.seriesIndex); }); return seriesIndices; } each$f([[seriesType2 + "ToggleSelect", "toggleSelect"], [seriesType2 + "Select", "select"], [seriesType2 + "UnSelect", "unselect"]], function(eventsMap) { ecRegisterAction(eventsMap[0], function(payload, ecModel, api) { payload = extend({}, payload); api.dispatchAction(extend(payload, { type: eventsMap[1], seriesIndex: getSeriesIndices(ecModel, payload) })); }); }); } function handleSeriesLegacySelectEvents(type, eventPostfix, ecIns, ecModel, payload) { var legacyEventName = type + eventPostfix; if (!ecIns.isSilent(legacyEventName)) { ecModel.eachComponent({ mainType: "series", subType: "pie" }, function(seriesModel) { var seriesIndex = seriesModel.seriesIndex; var selectedMap = seriesModel.option.selectedMap; var selected = payload.selected; for (var i = 0; i < selected.length; i++) { if (selected[i].seriesIndex === seriesIndex) { var data = seriesModel.getData(); var dataIndex = queryDataIndex(data, payload.fromActionPayload); ecIns.trigger(legacyEventName, { type: legacyEventName, seriesId: seriesModel.id, name: isArray$1(dataIndex) ? data.getName(dataIndex[0]) : data.getName(dataIndex), selected: isString(selectedMap) ? selectedMap : extend({}, selectedMap) }); } } }); } } function handleLegacySelectEvents(messageCenter, ecIns, api) { messageCenter.on("selectchanged", function(params) { var ecModel = api.getModel(); if (params.isFromClick) { handleSeriesLegacySelectEvents("map", "selectchanged", ecIns, ecModel, params); handleSeriesLegacySelectEvents("pie", "selectchanged", ecIns, ecModel, params); } else if (params.fromAction === "select") { handleSeriesLegacySelectEvents("map", "selected", ecIns, ecModel, params); handleSeriesLegacySelectEvents("pie", "selected", ecIns, ecModel, params); } else if (params.fromAction === "unselect") { handleSeriesLegacySelectEvents("map", "unselected", ecIns, ecModel, params); handleSeriesLegacySelectEvents("pie", "unselected", ecIns, ecModel, params); } }); } function findEventDispatcher(target, det, returnFirstMatch) { var found; while (target) { if (det(target)) { found = target; if (returnFirstMatch) { break; } } target = target.__hostTarget || target.parent; } return found; } var Triangle = Path.extend({ type: "triangle", shape: { cx: 0, cy: 0, width: 0, height: 0 }, buildPath: function(path, shape) { var cx = shape.cx; var cy = shape.cy; var width = shape.width / 2; var height = shape.height / 2; path.moveTo(cx, cy - height); path.lineTo(cx + width, cy + height); path.lineTo(cx - width, cy + height); path.closePath(); } }); var Diamond = Path.extend({ type: "diamond", shape: { cx: 0, cy: 0, width: 0, height: 0 }, buildPath: function(path, shape) { var cx = shape.cx; var cy = shape.cy; var width = shape.width / 2; var height = shape.height / 2; path.moveTo(cx, cy - height); path.lineTo(cx + width, cy); path.lineTo(cx, cy + height); path.lineTo(cx - width, cy); path.closePath(); } }); var Pin = Path.extend({ type: "pin", shape: { // x, y on the cusp x: 0, y: 0, width: 0, height: 0 }, buildPath: function(path, shape) { var x = shape.x; var y = shape.y; var w = shape.width / 5 * 3; var h = Math.max(w, shape.height); var r = w / 2; var dy = r * r / (h - r); var cy = y - h + r + dy; var angle = Math.asin(dy / r); var dx = Math.cos(angle) * r; var tanX = Math.sin(angle); var tanY = Math.cos(angle); var cpLen = r * 0.6; var cpLen2 = r * 0.7; path.moveTo(x - dx, cy + dy); path.arc(x, cy, r, Math.PI - angle, Math.PI * 2 + angle); path.bezierCurveTo(x + dx - tanX * cpLen, cy + dy + tanY * cpLen, x, y - cpLen2, x, y); path.bezierCurveTo(x, y - cpLen2, x - dx + tanX * cpLen, cy + dy + tanY * cpLen, x - dx, cy + dy); path.closePath(); } }); var Arrow = Path.extend({ type: "arrow", shape: { x: 0, y: 0, width: 0, height: 0 }, buildPath: function(ctx, shape) { var height = shape.height; var width = shape.width; var x = shape.x; var y = shape.y; var dx = width / 3 * 2; ctx.moveTo(x, y); ctx.lineTo(x + dx, y + height); ctx.lineTo(x, y + height / 4 * 3); ctx.lineTo(x - dx, y + height); ctx.lineTo(x, y); ctx.closePath(); } }); var symbolCtors = { line: Line$1, rect: Rect$2, roundRect: Rect$2, square: Rect$2, circle: Circle, diamond: Diamond, pin: Pin, arrow: Arrow, triangle: Triangle }; var symbolShapeMakers = { line: function(x, y, w, h, shape) { shape.x1 = x; shape.y1 = y + h / 2; shape.x2 = x + w; shape.y2 = y + h / 2; }, rect: function(x, y, w, h, shape) { shape.x = x; shape.y = y; shape.width = w; shape.height = h; }, roundRect: function(x, y, w, h, shape) { shape.x = x; shape.y = y; shape.width = w; shape.height = h; shape.r = Math.min(w, h) / 4; }, square: function(x, y, w, h, shape) { var size = Math.min(w, h); shape.x = x; shape.y = y; shape.width = size; shape.height = size; }, circle: function(x, y, w, h, shape) { shape.cx = x + w / 2; shape.cy = y + h / 2; shape.r = Math.min(w, h) / 2; }, diamond: function(x, y, w, h, shape) { shape.cx = x + w / 2; shape.cy = y + h / 2; shape.width = w; shape.height = h; }, pin: function(x, y, w, h, shape) { shape.x = x + w / 2; shape.y = y + h / 2; shape.width = w; shape.height = h; }, arrow: function(x, y, w, h, shape) { shape.x = x + w / 2; shape.y = y + h / 2; shape.width = w; shape.height = h; }, triangle: function(x, y, w, h, shape) { shape.cx = x + w / 2; shape.cy = y + h / 2; shape.width = w; shape.height = h; } }; var symbolBuildProxies = {}; each$f(symbolCtors, function(Ctor, name) { symbolBuildProxies[name] = new Ctor(); }); var SymbolClz = Path.extend({ type: "symbol", shape: { symbolType: "", x: 0, y: 0, width: 0, height: 0 }, calculateTextPosition: function(out, config, rect) { var res = calculateTextPosition(out, config, rect); var shape = this.shape; if (shape && shape.symbolType === "pin" && config.position === "inside") { res.y = rect.y + rect.height * 0.4; } return res; }, buildPath: function(ctx, shape, inBundle) { var symbolType = shape.symbolType; if (symbolType !== "none") { var proxySymbol = symbolBuildProxies[symbolType]; if (!proxySymbol) { symbolType = "rect"; proxySymbol = symbolBuildProxies[symbolType]; } symbolShapeMakers[symbolType](shape.x, shape.y, shape.width, shape.height, proxySymbol.shape); proxySymbol.buildPath(ctx, proxySymbol.shape, inBundle); } } }); function symbolPathSetColor(color, innerColor2) { if (this.type !== "image") { var symbolStyle = this.style; if (this.__isEmptyBrush) { symbolStyle.stroke = color; symbolStyle.fill = innerColor2 || "#fff"; symbolStyle.lineWidth = 2; } else if (this.shape.symbolType === "line") { symbolStyle.stroke = color; } else { symbolStyle.fill = color; } this.markRedraw(); } } function createSymbol$1(symbolType, x, y, w, h, color, keepAspect) { var isEmpty = symbolType.indexOf("empty") === 0; if (isEmpty) { symbolType = symbolType.substr(5, 1).toLowerCase() + symbolType.substr(6); } var symbolPath; if (symbolType.indexOf("image://") === 0) { symbolPath = makeImage(symbolType.slice(8), new BoundingRect(x, y, w, h), keepAspect ? "center" : "cover"); } else if (symbolType.indexOf("path://") === 0) { symbolPath = makePath(symbolType.slice(7), {}, new BoundingRect(x, y, w, h), keepAspect ? "center" : "cover"); } else { symbolPath = new SymbolClz({ shape: { symbolType, x, y, width: w, height: h } }); } symbolPath.__isEmptyBrush = isEmpty; symbolPath.setColor = symbolPathSetColor; if (color) { symbolPath.setColor(color); } return symbolPath; } function normalizeSymbolSize(symbolSize) { if (!isArray$1(symbolSize)) { symbolSize = [+symbolSize, +symbolSize]; } return [symbolSize[0] || 0, symbolSize[1] || 0]; } function normalizeSymbolOffset(symbolOffset, symbolSize) { if (symbolOffset == null) { return; } if (!isArray$1(symbolOffset)) { symbolOffset = [symbolOffset, symbolOffset]; } return [parsePercent(symbolOffset[0], symbolSize[0]) || 0, parsePercent(retrieve2(symbolOffset[1], symbolOffset[0]), symbolSize[1]) || 0]; } var decalMap = new WeakMap(); var decalCache = new LRU(100); var decalKeys = ["symbol", "symbolSize", "symbolKeepAspect", "color", "backgroundColor", "dashArrayX", "dashArrayY", "maxTileWidth", "maxTileHeight"]; function createOrUpdatePatternFromDecal(decalObject, api) { if (decalObject === "none") { return null; } var dpr = api.getDevicePixelRatio(); var zr = api.getZr(); var isSVG = zr.painter.type === "svg"; if (decalObject.dirty) { decalMap["delete"](decalObject); } var oldPattern = decalMap.get(decalObject); if (oldPattern) { return oldPattern; } var decalOpt = defaults(decalObject, { symbol: "rect", symbolSize: 1, symbolKeepAspect: true, color: "rgba(0, 0, 0, 0.2)", backgroundColor: null, dashArrayX: 5, dashArrayY: 5, rotation: 0, maxTileWidth: 512, maxTileHeight: 512 }); if (decalOpt.backgroundColor === "none") { decalOpt.backgroundColor = null; } var pattern = { repeat: "repeat" }; setPatternnSource(pattern); pattern.rotation = decalOpt.rotation; pattern.scaleX = pattern.scaleY = isSVG ? 1 : 1 / dpr; decalMap.set(decalObject, pattern); decalObject.dirty = false; return pattern; function setPatternnSource(pattern2) { var keys2 = [dpr]; var isValidKey = true; for (var i = 0; i < decalKeys.length; ++i) { var value = decalOpt[decalKeys[i]]; if (value != null && !isArray$1(value) && !isString(value) && !isNumber(value) && typeof value !== "boolean") { isValidKey = false; break; } keys2.push(value); } var cacheKey; if (isValidKey) { cacheKey = keys2.join(",") + (isSVG ? "-svg" : ""); var cache = decalCache.get(cacheKey); if (cache) { isSVG ? pattern2.svgElement = cache : pattern2.image = cache; } } var dashArrayX = normalizeDashArrayX(decalOpt.dashArrayX); var dashArrayY = normalizeDashArrayY(decalOpt.dashArrayY); var symbolArray = normalizeSymbolArray(decalOpt.symbol); var lineBlockLengthsX = getLineBlockLengthX(dashArrayX); var lineBlockLengthY = getLineBlockLengthY(dashArrayY); var canvas = !isSVG && platformApi.createCanvas(); var svgRoot = isSVG && { tag: "g", attrs: {}, key: "dcl", children: [] }; var pSize = getPatternSize(); var ctx; if (canvas) { canvas.width = pSize.width * dpr; canvas.height = pSize.height * dpr; ctx = canvas.getContext("2d"); } brushDecal(); if (isValidKey) { decalCache.put(cacheKey, canvas || svgRoot); } pattern2.image = canvas; pattern2.svgElement = svgRoot; pattern2.svgWidth = pSize.width; pattern2.svgHeight = pSize.height; function getPatternSize() { var width = 1; for (var i2 = 0, xlen = lineBlockLengthsX.length; i2 < xlen; ++i2) { width = getLeastCommonMultiple(width, lineBlockLengthsX[i2]); } var symbolRepeats = 1; for (var i2 = 0, xlen = symbolArray.length; i2 < xlen; ++i2) { symbolRepeats = getLeastCommonMultiple(symbolRepeats, symbolArray[i2].length); } width *= symbolRepeats; var height = lineBlockLengthY * lineBlockLengthsX.length * symbolArray.length; return { width: Math.max(1, Math.min(width, decalOpt.maxTileWidth)), height: Math.max(1, Math.min(height, decalOpt.maxTileHeight)) }; } function brushDecal() { if (ctx) { ctx.clearRect(0, 0, canvas.width, canvas.height); if (decalOpt.backgroundColor) { ctx.fillStyle = decalOpt.backgroundColor; ctx.fillRect(0, 0, canvas.width, canvas.height); } } var ySum = 0; for (var i2 = 0; i2 < dashArrayY.length; ++i2) { ySum += dashArrayY[i2]; } if (ySum <= 0) { return; } var y = -lineBlockLengthY; var yId = 0; var yIdTotal = 0; var xId0 = 0; while (y < pSize.height) { if (yId % 2 === 0) { var symbolYId = yIdTotal / 2 % symbolArray.length; var x = 0; var xId1 = 0; var xId1Total = 0; while (x < pSize.width * 2) { var xSum = 0; for (var i2 = 0; i2 < dashArrayX[xId0].length; ++i2) { xSum += dashArrayX[xId0][i2]; } if (xSum <= 0) { break; } if (xId1 % 2 === 0) { var size = (1 - decalOpt.symbolSize) * 0.5; var left = x + dashArrayX[xId0][xId1] * size; var top_1 = y + dashArrayY[yId] * size; var width = dashArrayX[xId0][xId1] * decalOpt.symbolSize; var height = dashArrayY[yId] * decalOpt.symbolSize; var symbolXId = xId1Total / 2 % symbolArray[symbolYId].length; brushSymbol(left, top_1, width, height, symbolArray[symbolYId][symbolXId]); } x += dashArrayX[xId0][xId1]; ++xId1Total; ++xId1; if (xId1 === dashArrayX[xId0].length) { xId1 = 0; } } ++xId0; if (xId0 === dashArrayX.length) { xId0 = 0; } } y += dashArrayY[yId]; ++yIdTotal; ++yId; if (yId === dashArrayY.length) { yId = 0; } } function brushSymbol(x2, y2, width2, height2, symbolType) { var scale2 = isSVG ? 1 : dpr; var symbol = createSymbol$1(symbolType, x2 * scale2, y2 * scale2, width2 * scale2, height2 * scale2, decalOpt.color, decalOpt.symbolKeepAspect); if (isSVG) { var symbolVNode = zr.painter.renderOneToVNode(symbol); if (symbolVNode) { svgRoot.children.push(symbolVNode); } } else { brushSingle(ctx, symbol); } } } } } function normalizeSymbolArray(symbol) { if (!symbol || symbol.length === 0) { return [["rect"]]; } if (isString(symbol)) { return [[symbol]]; } var isAllString = true; for (var i = 0; i < symbol.length; ++i) { if (!isString(symbol[i])) { isAllString = false; break; } } if (isAllString) { return normalizeSymbolArray([symbol]); } var result = []; for (var i = 0; i < symbol.length; ++i) { if (isString(symbol[i])) { result.push([symbol[i]]); } else { result.push(symbol[i]); } } return result; } function normalizeDashArrayX(dash) { if (!dash || dash.length === 0) { return [[0, 0]]; } if (isNumber(dash)) { var dashValue = Math.ceil(dash); return [[dashValue, dashValue]]; } var isAllNumber = true; for (var i = 0; i < dash.length; ++i) { if (!isNumber(dash[i])) { isAllNumber = false; break; } } if (isAllNumber) { return normalizeDashArrayX([dash]); } var result = []; for (var i = 0; i < dash.length; ++i) { if (isNumber(dash[i])) { var dashValue = Math.ceil(dash[i]); result.push([dashValue, dashValue]); } else { var dashValue = map$1(dash[i], function(n) { return Math.ceil(n); }); if (dashValue.length % 2 === 1) { result.push(dashValue.concat(dashValue)); } else { result.push(dashValue); } } } return result; } function normalizeDashArrayY(dash) { if (!dash || typeof dash === "object" && dash.length === 0) { return [0, 0]; } if (isNumber(dash)) { var dashValue_1 = Math.ceil(dash); return [dashValue_1, dashValue_1]; } var dashValue = map$1(dash, function(n) { return Math.ceil(n); }); return dash.length % 2 ? dashValue.concat(dashValue) : dashValue; } function getLineBlockLengthX(dash) { return map$1(dash, function(line) { return getLineBlockLengthY(line); }); } function getLineBlockLengthY(dash) { var blockLength = 0; for (var i = 0; i < dash.length; ++i) { blockLength += dash[i]; } if (dash.length % 2 === 1) { return blockLength * 2; } return blockLength; } function decalVisual(ecModel, api) { ecModel.eachRawSeries(function(seriesModel) { if (ecModel.isSeriesFiltered(seriesModel)) { return; } var data = seriesModel.getData(); if (data.hasItemVisual()) { data.each(function(idx) { var decal2 = data.getItemVisual(idx, "decal"); if (decal2) { var itemStyle = data.ensureUniqueItemVisual(idx, "style"); itemStyle.decal = createOrUpdatePatternFromDecal(decal2, api); } }); } var decal = data.getVisual("decal"); if (decal) { var style = data.getVisual("style"); style.decal = createOrUpdatePatternFromDecal(decal, api); } }); } var lifecycle = new Eventful(); var implsStore = {}; function registerImpl(name, impl) { implsStore[name] = impl; } function getImpl(name) { return implsStore[name]; } var TEST_FRAME_REMAIN_TIME = 1; var PRIORITY_PROCESSOR_SERIES_FILTER = 800; var PRIORITY_PROCESSOR_DATASTACK = 900; var PRIORITY_PROCESSOR_FILTER = 1e3; var PRIORITY_PROCESSOR_DEFAULT = 2e3; var PRIORITY_PROCESSOR_STATISTIC = 5e3; var PRIORITY_VISUAL_LAYOUT = 1e3; var PRIORITY_VISUAL_PROGRESSIVE_LAYOUT = 1100; var PRIORITY_VISUAL_GLOBAL = 2e3; var PRIORITY_VISUAL_CHART = 3e3; var PRIORITY_VISUAL_COMPONENT = 4e3; var PRIORITY_VISUAL_CHART_DATA_CUSTOM = 4500; var PRIORITY_VISUAL_POST_CHART_LAYOUT = 4600; var PRIORITY_VISUAL_BRUSH = 5e3; var PRIORITY_VISUAL_ARIA = 6e3; var PRIORITY_VISUAL_DECAL = 7e3; var PRIORITY = { PROCESSOR: { FILTER: PRIORITY_PROCESSOR_FILTER, SERIES_FILTER: PRIORITY_PROCESSOR_SERIES_FILTER, STATISTIC: PRIORITY_PROCESSOR_STATISTIC }, VISUAL: { LAYOUT: PRIORITY_VISUAL_LAYOUT, PROGRESSIVE_LAYOUT: PRIORITY_VISUAL_PROGRESSIVE_LAYOUT, GLOBAL: PRIORITY_VISUAL_GLOBAL, CHART: PRIORITY_VISUAL_CHART, POST_CHART_LAYOUT: PRIORITY_VISUAL_POST_CHART_LAYOUT, COMPONENT: PRIORITY_VISUAL_COMPONENT, BRUSH: PRIORITY_VISUAL_BRUSH, CHART_ITEM: PRIORITY_VISUAL_CHART_DATA_CUSTOM, ARIA: PRIORITY_VISUAL_ARIA, DECAL: PRIORITY_VISUAL_DECAL } }; var IN_MAIN_PROCESS_KEY = "__flagInMainProcess"; var PENDING_UPDATE = "__pendingUpdate"; var STATUS_NEEDS_UPDATE_KEY = "__needsUpdateStatus"; var ACTION_REG = /^[a-zA-Z0-9_]+$/; var CONNECT_STATUS_KEY = "__connectUpdateStatus"; var CONNECT_STATUS_PENDING = 0; var CONNECT_STATUS_UPDATING = 1; var CONNECT_STATUS_UPDATED = 2; function createRegisterEventWithLowercaseECharts(method) { return function() { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } if (this.isDisposed()) { disposedWarning(this.id); return; } return toLowercaseNameAndCallEventful(this, method, args); }; } function createRegisterEventWithLowercaseMessageCenter(method) { return function() { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return toLowercaseNameAndCallEventful(this, method, args); }; } function toLowercaseNameAndCallEventful(host, method, args) { args[0] = args[0] && args[0].toLowerCase(); return Eventful.prototype[method].apply(host, args); } var MessageCenter = ( /** @class */ (function(_super) { __extends(MessageCenter2, _super); function MessageCenter2() { return _super !== null && _super.apply(this, arguments) || this; } return MessageCenter2; })(Eventful) ); var messageCenterProto = MessageCenter.prototype; messageCenterProto.on = createRegisterEventWithLowercaseMessageCenter("on"); messageCenterProto.off = createRegisterEventWithLowercaseMessageCenter("off"); var prepare; var prepareView; var updateDirectly; var updateMethods; var doConvertPixel; var updateStreamModes; var doDispatchAction; var flushPendingActions; var triggerUpdatedEvent; var bindRenderedEvent; var bindMouseEvent; var render; var renderComponents; var renderSeries; var createExtensionAPI; var enableConnect; var markStatusToUpdate; var applyChangedStates; var ECharts = ( /** @class */ (function(_super) { __extends(ECharts2, _super); function ECharts2(dom, theme2, opts) { var _this = _super.call(this, new ECEventProcessor()) || this; _this._chartsViews = []; _this._chartsMap = {}; _this._componentsViews = []; _this._componentsMap = {}; _this._pendingActions = []; opts = opts || {}; if (isString(theme2)) { theme2 = themeStorage[theme2]; } _this._dom = dom; var defaultRenderer = "canvas"; var defaultCoarsePointer = "auto"; var defaultUseDirtyRect = false; if (opts.ssr) { registerSSRDataGetter(function(el) { var ecData = getECData(el); var dataIndex = ecData.dataIndex; if (dataIndex == null) { return; } var hashMap = createHashMap(); hashMap.set("series_index", ecData.seriesIndex); hashMap.set("data_index", dataIndex); ecData.ssrType && hashMap.set("ssr_type", ecData.ssrType); return hashMap; }); } var zr = _this._zr = init$2(dom, { renderer: opts.renderer || defaultRenderer, devicePixelRatio: opts.devicePixelRatio, width: opts.width, height: opts.height, ssr: opts.ssr, useDirtyRect: retrieve2(opts.useDirtyRect, defaultUseDirtyRect), useCoarsePointer: retrieve2(opts.useCoarsePointer, defaultCoarsePointer), pointerSize: opts.pointerSize }); _this._ssr = opts.ssr; _this._throttledZrFlush = throttle(bind$1(zr.flush, zr), 17); theme2 = clone$1(theme2); theme2 && globalBackwardCompat(theme2, true); _this._theme = theme2; _this._locale = createLocaleObject(opts.locale || SYSTEM_LANG); _this._coordSysMgr = new CoordinateSystemManager(); var api = _this._api = createExtensionAPI(_this); function prioritySortFunc(a, b) { return a.__prio - b.__prio; } sort$2(visualFuncs, prioritySortFunc); sort$2(dataProcessorFuncs, prioritySortFunc); _this._scheduler = new Scheduler(_this, api, dataProcessorFuncs, visualFuncs); _this._messageCenter = new MessageCenter(); _this._initEvents(); _this.resize = bind$1(_this.resize, _this); zr.animation.on("frame", _this._onframe, _this); bindRenderedEvent(zr, _this); bindMouseEvent(zr, _this); setAsPrimitive(_this); return _this; } ECharts2.prototype._onframe = function() { if (this._disposed) { return; } applyChangedStates(this); var scheduler = this._scheduler; if (this[PENDING_UPDATE]) { var silent = this[PENDING_UPDATE].silent; this[IN_MAIN_PROCESS_KEY] = true; try { prepare(this); updateMethods.update.call(this, null, this[PENDING_UPDATE].updateParams); } catch (e) { this[IN_MAIN_PROCESS_KEY] = false; this[PENDING_UPDATE] = null; throw e; } this._zr.flush(); this[IN_MAIN_PROCESS_KEY] = false; this[PENDING_UPDATE] = null; flushPendingActions.call(this, silent); triggerUpdatedEvent.call(this, silent); } else if (scheduler.unfinished) { var remainTime = TEST_FRAME_REMAIN_TIME; var ecModel = this._model; var api = this._api; scheduler.unfinished = false; do { var startTime = +/* @__PURE__ */ new Date(); scheduler.performSeriesTasks(ecModel); scheduler.performDataProcessorTasks(ecModel); updateStreamModes(this, ecModel); scheduler.performVisualTasks(ecModel); renderSeries(this, this._model, api, "remain", {}); remainTime -= +/* @__PURE__ */ new Date() - startTime; } while (remainTime > 0 && scheduler.unfinished); if (!scheduler.unfinished) { this._zr.flush(); } } }; ECharts2.prototype.getDom = function() { return this._dom; }; ECharts2.prototype.getId = function() { return this.id; }; ECharts2.prototype.getZr = function() { return this._zr; }; ECharts2.prototype.isSSR = function() { return this._ssr; }; ECharts2.prototype.setOption = function(option, notMerge, lazyUpdate) { if (this[IN_MAIN_PROCESS_KEY]) { return; } if (this._disposed) { disposedWarning(this.id); return; } var silent; var replaceMerge; var transitionOpt; if (isObject$3(notMerge)) { lazyUpdate = notMerge.lazyUpdate; silent = notMerge.silent; replaceMerge = notMerge.replaceMerge; transitionOpt = notMerge.transition; notMerge = notMerge.notMerge; } this[IN_MAIN_PROCESS_KEY] = true; if (!this._model || notMerge) { var optionManager = new OptionManager(this._api); var theme2 = this._theme; var ecModel = this._model = new GlobalModel(); ecModel.scheduler = this._scheduler; ecModel.ssr = this._ssr; ecModel.init(null, null, null, theme2, this._locale, optionManager); } this._model.setOption(option, { replaceMerge }, optionPreprocessorFuncs); var updateParams = { seriesTransition: transitionOpt, optionChanged: true }; if (lazyUpdate) { this[PENDING_UPDATE] = { silent, updateParams }; this[IN_MAIN_PROCESS_KEY] = false; this.getZr().wakeUp(); } else { try { prepare(this); updateMethods.update.call(this, null, updateParams); } catch (e) { this[PENDING_UPDATE] = null; this[IN_MAIN_PROCESS_KEY] = false; throw e; } if (!this._ssr) { this._zr.flush(); } this[PENDING_UPDATE] = null; this[IN_MAIN_PROCESS_KEY] = false; flushPendingActions.call(this, silent); triggerUpdatedEvent.call(this, silent); } }; ECharts2.prototype.setTheme = function() { }; ECharts2.prototype.getModel = function() { return this._model; }; ECharts2.prototype.getOption = function() { return this._model && this._model.getOption(); }; ECharts2.prototype.getWidth = function() { return this._zr.getWidth(); }; ECharts2.prototype.getHeight = function() { return this._zr.getHeight(); }; ECharts2.prototype.getDevicePixelRatio = function() { return this._zr.painter.dpr || env.hasGlobalWindow && window.devicePixelRatio || 1; }; ECharts2.prototype.getRenderedCanvas = function(opts) { return this.renderToCanvas(opts); }; ECharts2.prototype.renderToCanvas = function(opts) { opts = opts || {}; var painter = this._zr.painter; return painter.getRenderedCanvas({ backgroundColor: opts.backgroundColor || this._model.get("backgroundColor"), pixelRatio: opts.pixelRatio || this.getDevicePixelRatio() }); }; ECharts2.prototype.renderToSVGString = function(opts) { opts = opts || {}; var painter = this._zr.painter; return painter.renderToString({ useViewBox: opts.useViewBox }); }; ECharts2.prototype.getSvgDataURL = function() { if (!env.svgSupported) { return; } var zr = this._zr; var list = zr.storage.getDisplayList(); each$f(list, function(el) { el.stopAnimation(null, true); }); return zr.painter.toDataURL(); }; ECharts2.prototype.getDataURL = function(opts) { if (this._disposed) { disposedWarning(this.id); return; } opts = opts || {}; var excludeComponents = opts.excludeComponents; var ecModel = this._model; var excludesComponentViews = []; var self = this; each$f(excludeComponents, function(componentType) { ecModel.eachComponent({ mainType: componentType }, function(component) { var view = self._componentsMap[component.__viewId]; if (!view.group.ignore) { excludesComponentViews.push(view); view.group.ignore = true; } }); }); var url = this._zr.painter.getType() === "svg" ? this.getSvgDataURL() : this.renderToCanvas(opts).toDataURL("image/" + (opts && opts.type || "png")); each$f(excludesComponentViews, function(view) { view.group.ignore = false; }); return url; }; ECharts2.prototype.getConnectedDataURL = function(opts) { if (this._disposed) { disposedWarning(this.id); return; } var isSvg = opts.type === "svg"; var groupId = this.group; var mathMin2 = Math.min; var mathMax2 = Math.max; var MAX_NUMBER = Infinity; if (connectedGroups[groupId]) { var left_1 = MAX_NUMBER; var top_1 = MAX_NUMBER; var right_1 = -MAX_NUMBER; var bottom_1 = -MAX_NUMBER; var canvasList_1 = []; var dpr_1 = opts && opts.pixelRatio || this.getDevicePixelRatio(); each$f(instances, function(chart, id) { if (chart.group === groupId) { var canvas = isSvg ? chart.getZr().painter.getSvgDom().innerHTML : chart.renderToCanvas(clone$1(opts)); var boundingRect = chart.getDom().getBoundingClientRect(); left_1 = mathMin2(boundingRect.left, left_1); top_1 = mathMin2(boundingRect.top, top_1); right_1 = mathMax2(boundingRect.right, right_1); bottom_1 = mathMax2(boundingRect.bottom, bottom_1); canvasList_1.push({ dom: canvas, left: boundingRect.left, top: boundingRect.top }); } }); left_1 *= dpr_1; top_1 *= dpr_1; right_1 *= dpr_1; bottom_1 *= dpr_1; var width = right_1 - left_1; var height = bottom_1 - top_1; var targetCanvas = platformApi.createCanvas(); var zr_1 = init$2(targetCanvas, { renderer: isSvg ? "svg" : "canvas" }); zr_1.resize({ width, height }); if (isSvg) { var content_1 = ""; each$f(canvasList_1, function(item) { var x = item.left - left_1; var y = item.top - top_1; content_1 += '' + item.dom + ""; }); zr_1.painter.getSvgRoot().innerHTML = content_1; if (opts.connectedBackgroundColor) { zr_1.painter.setBackgroundColor(opts.connectedBackgroundColor); } zr_1.refreshImmediately(); return zr_1.painter.toDataURL(); } else { if (opts.connectedBackgroundColor) { zr_1.add(new Rect$2({ shape: { x: 0, y: 0, width, height }, style: { fill: opts.connectedBackgroundColor } })); } each$f(canvasList_1, function(item) { var img = new ZRImage({ style: { x: item.left * dpr_1 - left_1, y: item.top * dpr_1 - top_1, image: item.dom } }); zr_1.add(img); }); zr_1.refreshImmediately(); return targetCanvas.toDataURL("image/" + (opts && opts.type || "png")); } } else { return this.getDataURL(opts); } }; ECharts2.prototype.convertToPixel = function(finder, value) { return doConvertPixel(this, "convertToPixel", finder, value); }; ECharts2.prototype.convertFromPixel = function(finder, value) { return doConvertPixel(this, "convertFromPixel", finder, value); }; ECharts2.prototype.containPixel = function(finder, value) { if (this._disposed) { disposedWarning(this.id); return; } var ecModel = this._model; var result; var findResult = parseFinder$1(ecModel, finder); each$f(findResult, function(models, key) { key.indexOf("Models") >= 0 && each$f(models, function(model) { var coordSys = model.coordinateSystem; if (coordSys && coordSys.containPoint) { result = result || !!coordSys.containPoint(value); } else if (key === "seriesModels") { var view = this._chartsMap[model.__viewId]; if (view && view.containPoint) { result = result || view.containPoint(value, model); } } else ; }, this); }, this); return !!result; }; ECharts2.prototype.getVisual = function(finder, visualType) { var ecModel = this._model; var parsedFinder = parseFinder$1(ecModel, finder, { defaultMainType: "series" }); var seriesModel = parsedFinder.seriesModel; var data = seriesModel.getData(); var dataIndexInside = parsedFinder.hasOwnProperty("dataIndexInside") ? parsedFinder.dataIndexInside : parsedFinder.hasOwnProperty("dataIndex") ? data.indexOfRawIndex(parsedFinder.dataIndex) : null; return dataIndexInside != null ? getItemVisualFromData(data, dataIndexInside, visualType) : getVisualFromData(data, visualType); }; ECharts2.prototype.getViewOfComponentModel = function(componentModel) { return this._componentsMap[componentModel.__viewId]; }; ECharts2.prototype.getViewOfSeriesModel = function(seriesModel) { return this._chartsMap[seriesModel.__viewId]; }; ECharts2.prototype._initEvents = function() { var _this = this; each$f(MOUSE_EVENT_NAMES, function(eveName) { var handler = function(e) { var ecModel = _this.getModel(); var el = e.target; var params; var isGlobalOut = eveName === "globalout"; if (isGlobalOut) { params = {}; } else { el && findEventDispatcher(el, function(parent) { var ecData = getECData(parent); if (ecData && ecData.dataIndex != null) { var dataModel = ecData.dataModel || ecModel.getSeriesByIndex(ecData.seriesIndex); params = dataModel && dataModel.getDataParams(ecData.dataIndex, ecData.dataType, el) || {}; return true; } else if (ecData.eventData) { params = extend({}, ecData.eventData); return true; } }, true); } if (params) { var componentType = params.componentType; var componentIndex = params.componentIndex; if (componentType === "markLine" || componentType === "markPoint" || componentType === "markArea") { componentType = "series"; componentIndex = params.seriesIndex; } var model = componentType && componentIndex != null && ecModel.getComponent(componentType, componentIndex); var view = model && _this[model.mainType === "series" ? "_chartsMap" : "_componentsMap"][model.__viewId]; params.event = e; params.type = eveName; _this._$eventProcessor.eventInfo = { targetEl: el, packedEvent: params, model, view }; _this.trigger(eveName, params); } }; handler.zrEventfulCallAtLast = true; _this._zr.on(eveName, handler, _this); }); each$f(eventActionMap, function(actionType, eventType) { _this._messageCenter.on(eventType, function(event) { this.trigger(eventType, event); }, _this); }); each$f(["selectchanged"], function(eventType) { _this._messageCenter.on(eventType, function(event) { this.trigger(eventType, event); }, _this); }); handleLegacySelectEvents(this._messageCenter, this, this._api); }; ECharts2.prototype.isDisposed = function() { return this._disposed; }; ECharts2.prototype.clear = function() { if (this._disposed) { disposedWarning(this.id); return; } this.setOption({ series: [] }, true); }; ECharts2.prototype.dispose = function() { if (this._disposed) { disposedWarning(this.id); return; } this._disposed = true; var dom = this.getDom(); if (dom) { setAttribute(this.getDom(), DOM_ATTRIBUTE_KEY, ""); } var chart = this; var api = chart._api; var ecModel = chart._model; each$f(chart._componentsViews, function(component) { component.dispose(ecModel, api); }); each$f(chart._chartsViews, function(chart2) { chart2.dispose(ecModel, api); }); chart._zr.dispose(); chart._dom = chart._model = chart._chartsMap = chart._componentsMap = chart._chartsViews = chart._componentsViews = chart._scheduler = chart._api = chart._zr = chart._throttledZrFlush = chart._theme = chart._coordSysMgr = chart._messageCenter = null; delete instances[chart.id]; }; ECharts2.prototype.resize = function(opts) { if (this[IN_MAIN_PROCESS_KEY]) { return; } if (this._disposed) { disposedWarning(this.id); return; } this._zr.resize(opts); var ecModel = this._model; this._loadingFX && this._loadingFX.resize(); if (!ecModel) { return; } var needPrepare = ecModel.resetOption("media"); var silent = opts && opts.silent; if (this[PENDING_UPDATE]) { if (silent == null) { silent = this[PENDING_UPDATE].silent; } needPrepare = true; this[PENDING_UPDATE] = null; } this[IN_MAIN_PROCESS_KEY] = true; try { needPrepare && prepare(this); updateMethods.update.call(this, { type: "resize", animation: extend({ // Disable animation duration: 0 }, opts && opts.animation) }); } catch (e) { this[IN_MAIN_PROCESS_KEY] = false; throw e; } this[IN_MAIN_PROCESS_KEY] = false; flushPendingActions.call(this, silent); triggerUpdatedEvent.call(this, silent); }; ECharts2.prototype.showLoading = function(name, cfg) { if (this._disposed) { disposedWarning(this.id); return; } if (isObject$3(name)) { cfg = name; name = ""; } name = name || "default"; this.hideLoading(); if (!loadingEffects[name]) { return; } var el = loadingEffects[name](this._api, cfg); var zr = this._zr; this._loadingFX = el; zr.add(el); }; ECharts2.prototype.hideLoading = function() { if (this._disposed) { disposedWarning(this.id); return; } this._loadingFX && this._zr.remove(this._loadingFX); this._loadingFX = null; }; ECharts2.prototype.makeActionFromEvent = function(eventObj) { var payload = extend({}, eventObj); payload.type = eventActionMap[eventObj.type]; return payload; }; ECharts2.prototype.dispatchAction = function(payload, opt) { if (this._disposed) { disposedWarning(this.id); return; } if (!isObject$3(opt)) { opt = { silent: !!opt }; } if (!actions[payload.type]) { return; } if (!this._model) { return; } if (this[IN_MAIN_PROCESS_KEY]) { this._pendingActions.push(payload); return; } var silent = opt.silent; doDispatchAction.call(this, payload, silent); var flush = opt.flush; if (flush) { this._zr.flush(); } else if (flush !== false && env.browser.weChat) { this._throttledZrFlush(); } flushPendingActions.call(this, silent); triggerUpdatedEvent.call(this, silent); }; ECharts2.prototype.updateLabelLayout = function() { lifecycle.trigger("series:layoutlabels", this._model, this._api, { // Not adding series labels. // TODO updatedSeries: [] }); }; ECharts2.prototype.appendData = function(params) { if (this._disposed) { disposedWarning(this.id); return; } var seriesIndex = params.seriesIndex; var ecModel = this.getModel(); var seriesModel = ecModel.getSeriesByIndex(seriesIndex); seriesModel.appendData(params); this._scheduler.unfinished = true; this.getZr().wakeUp(); }; ECharts2.internalField = (function() { prepare = function(ecIns) { var scheduler = ecIns._scheduler; scheduler.restorePipelines(ecIns._model); scheduler.prepareStageTasks(); prepareView(ecIns, true); prepareView(ecIns, false); scheduler.plan(); }; prepareView = function(ecIns, isComponent) { var ecModel = ecIns._model; var scheduler = ecIns._scheduler; var viewList = isComponent ? ecIns._componentsViews : ecIns._chartsViews; var viewMap = isComponent ? ecIns._componentsMap : ecIns._chartsMap; var zr = ecIns._zr; var api = ecIns._api; for (var i = 0; i < viewList.length; i++) { viewList[i].__alive = false; } isComponent ? ecModel.eachComponent(function(componentType, model) { componentType !== "series" && doPrepare(model); }) : ecModel.eachSeries(doPrepare); function doPrepare(model) { var requireNewView = model.__requireNewView; model.__requireNewView = false; var viewId = "_ec_" + model.id + "_" + model.type; var view2 = !requireNewView && viewMap[viewId]; if (!view2) { var classType = parseClassType(model.type); var Clazz = isComponent ? ComponentView.getClass(classType.main, classType.sub) : ( // FIXME:TS // (ChartView as ChartViewConstructor).getClass('series', classType.sub) // For backward compat, still support a chart type declared as only subType // like "liquidfill", but recommend "series.liquidfill" // But need a base class to make a type series. ChartView.getClass(classType.sub) ); view2 = new Clazz(); view2.init(ecModel, api); viewMap[viewId] = view2; viewList.push(view2); zr.add(view2.group); } model.__viewId = view2.__id = viewId; view2.__alive = true; view2.__model = model; view2.group.__ecComponentInfo = { mainType: model.mainType, index: model.componentIndex }; !isComponent && scheduler.prepareView(view2, model, ecModel, api); } for (var i = 0; i < viewList.length; ) { var view = viewList[i]; if (!view.__alive) { !isComponent && view.renderTask.dispose(); zr.remove(view.group); view.dispose(ecModel, api); viewList.splice(i, 1); if (viewMap[view.__id] === view) { delete viewMap[view.__id]; } view.__id = view.group.__ecComponentInfo = null; } else { i++; } } }; updateDirectly = function(ecIns, method, payload, mainType, subType) { var ecModel = ecIns._model; ecModel.setUpdatePayload(payload); if (!mainType) { each$f([].concat(ecIns._componentsViews).concat(ecIns._chartsViews), callView); return; } var query = {}; query[mainType + "Id"] = payload[mainType + "Id"]; query[mainType + "Index"] = payload[mainType + "Index"]; query[mainType + "Name"] = payload[mainType + "Name"]; var condition = { mainType, query }; subType && (condition.subType = subType); var excludeSeriesId = payload.excludeSeriesId; var excludeSeriesIdMap; if (excludeSeriesId != null) { excludeSeriesIdMap = createHashMap(); each$f(normalizeToArray(excludeSeriesId), function(id) { var modelId = convertOptionIdName(id, null); if (modelId != null) { excludeSeriesIdMap.set(modelId, true); } }); } ecModel && ecModel.eachComponent(condition, function(model) { var isExcluded = excludeSeriesIdMap && excludeSeriesIdMap.get(model.id) != null; if (isExcluded) { return; } if (isHighDownPayload(payload)) { if (model instanceof SeriesModel) { if (payload.type === HIGHLIGHT_ACTION_TYPE && !payload.notBlur && !model.get(["emphasis", "disabled"])) { blurSeriesFromHighlightPayload(model, payload, ecIns._api); } } else { var _a2 = findComponentHighDownDispatchers(model.mainType, model.componentIndex, payload.name, ecIns._api), focusSelf = _a2.focusSelf, dispatchers = _a2.dispatchers; if (payload.type === HIGHLIGHT_ACTION_TYPE && focusSelf && !payload.notBlur) { blurComponent(model.mainType, model.componentIndex, ecIns._api); } if (dispatchers) { each$f(dispatchers, function(dispatcher) { payload.type === HIGHLIGHT_ACTION_TYPE ? enterEmphasis(dispatcher) : leaveEmphasis(dispatcher); }); } } } else if (isSelectChangePayload(payload)) { if (model instanceof SeriesModel) { toggleSelectionFromPayload(model, payload, ecIns._api); updateSeriesElementSelection(model); markStatusToUpdate(ecIns); } } }, ecIns); ecModel && ecModel.eachComponent(condition, function(model) { var isExcluded = excludeSeriesIdMap && excludeSeriesIdMap.get(model.id) != null; if (isExcluded) { return; } callView(ecIns[mainType === "series" ? "_chartsMap" : "_componentsMap"][model.__viewId]); }, ecIns); function callView(view) { view && view.__alive && view[method] && view[method](view.__model, ecModel, ecIns._api, payload); } }; updateMethods = { prepareAndUpdate: function(payload) { prepare(this); updateMethods.update.call(this, payload, { // Needs to mark option changed if newOption is given. // It's from MagicType. // TODO If use a separate flag optionChanged in payload? optionChanged: payload.newOption != null }); }, update: function(payload, updateParams) { var ecModel = this._model; var api = this._api; var zr = this._zr; var coordSysMgr = this._coordSysMgr; var scheduler = this._scheduler; if (!ecModel) { return; } ecModel.setUpdatePayload(payload); scheduler.restoreData(ecModel, payload); scheduler.performSeriesTasks(ecModel); coordSysMgr.create(ecModel, api); scheduler.performDataProcessorTasks(ecModel, payload); updateStreamModes(this, ecModel); coordSysMgr.update(ecModel, api); clearColorPalette(ecModel); scheduler.performVisualTasks(ecModel, payload); render(this, ecModel, api, payload, updateParams); var backgroundColor2 = ecModel.get("backgroundColor") || "transparent"; var darkMode = ecModel.get("darkMode"); zr.setBackgroundColor(backgroundColor2); if (darkMode != null && darkMode !== "auto") { zr.setDarkMode(darkMode); } lifecycle.trigger("afterupdate", ecModel, api); }, updateTransform: function(payload) { var _this = this; var ecModel = this._model; var api = this._api; if (!ecModel) { return; } ecModel.setUpdatePayload(payload); var componentDirtyList = []; ecModel.eachComponent(function(componentType, componentModel) { if (componentType === "series") { return; } var componentView = _this.getViewOfComponentModel(componentModel); if (componentView && componentView.__alive) { if (componentView.updateTransform) { var result = componentView.updateTransform(componentModel, ecModel, api, payload); result && result.update && componentDirtyList.push(componentView); } else { componentDirtyList.push(componentView); } } }); var seriesDirtyMap = createHashMap(); ecModel.eachSeries(function(seriesModel) { var chartView = _this._chartsMap[seriesModel.__viewId]; if (chartView.updateTransform) { var result = chartView.updateTransform(seriesModel, ecModel, api, payload); result && result.update && seriesDirtyMap.set(seriesModel.uid, 1); } else { seriesDirtyMap.set(seriesModel.uid, 1); } }); clearColorPalette(ecModel); this._scheduler.performVisualTasks(ecModel, payload, { setDirty: true, dirtyMap: seriesDirtyMap }); renderSeries(this, ecModel, api, payload, {}, seriesDirtyMap); lifecycle.trigger("afterupdate", ecModel, api); }, updateView: function(payload) { var ecModel = this._model; if (!ecModel) { return; } ecModel.setUpdatePayload(payload); ChartView.markUpdateMethod(payload, "updateView"); clearColorPalette(ecModel); this._scheduler.performVisualTasks(ecModel, payload, { setDirty: true }); render(this, ecModel, this._api, payload, {}); lifecycle.trigger("afterupdate", ecModel, this._api); }, updateVisual: function(payload) { var _this = this; var ecModel = this._model; if (!ecModel) { return; } ecModel.setUpdatePayload(payload); ecModel.eachSeries(function(seriesModel) { seriesModel.getData().clearAllVisual(); }); ChartView.markUpdateMethod(payload, "updateVisual"); clearColorPalette(ecModel); this._scheduler.performVisualTasks(ecModel, payload, { visualType: "visual", setDirty: true }); ecModel.eachComponent(function(componentType, componentModel) { if (componentType !== "series") { var componentView = _this.getViewOfComponentModel(componentModel); componentView && componentView.__alive && componentView.updateVisual(componentModel, ecModel, _this._api, payload); } }); ecModel.eachSeries(function(seriesModel) { var chartView = _this._chartsMap[seriesModel.__viewId]; chartView.updateVisual(seriesModel, ecModel, _this._api, payload); }); lifecycle.trigger("afterupdate", ecModel, this._api); }, updateLayout: function(payload) { updateMethods.update.call(this, payload); } }; doConvertPixel = function(ecIns, methodName, finder, value) { if (ecIns._disposed) { disposedWarning(ecIns.id); return; } var ecModel = ecIns._model; var coordSysList = ecIns._coordSysMgr.getCoordinateSystems(); var result; var parsedFinder = parseFinder$1(ecModel, finder); for (var i = 0; i < coordSysList.length; i++) { var coordSys = coordSysList[i]; if (coordSys[methodName] && (result = coordSys[methodName](ecModel, parsedFinder, value)) != null) { return result; } } }; updateStreamModes = function(ecIns, ecModel) { var chartsMap = ecIns._chartsMap; var scheduler = ecIns._scheduler; ecModel.eachSeries(function(seriesModel) { scheduler.updateStreamModes(seriesModel, chartsMap[seriesModel.__viewId]); }); }; doDispatchAction = function(payload, silent) { var _this = this; var ecModel = this.getModel(); var payloadType = payload.type; var escapeConnect = payload.escapeConnect; var actionWrap = actions[payloadType]; var actionInfo2 = actionWrap.actionInfo; var cptTypeTmp = (actionInfo2.update || "update").split(":"); var updateMethod = cptTypeTmp.pop(); var cptType = cptTypeTmp[0] != null && parseClassType(cptTypeTmp[0]); this[IN_MAIN_PROCESS_KEY] = true; var payloads = [payload]; var batched = false; if (payload.batch) { batched = true; payloads = map$1(payload.batch, function(item) { item = defaults(extend({}, item), payload); item.batch = null; return item; }); } var eventObjBatch = []; var eventObj; var isSelectChange = isSelectChangePayload(payload); var isHighDown = isHighDownPayload(payload); if (isHighDown) { allLeaveBlur(this._api); } each$f(payloads, function(batchItem) { eventObj = actionWrap.action(batchItem, _this._model, _this._api); eventObj = eventObj || extend({}, batchItem); eventObj.type = actionInfo2.event || eventObj.type; eventObjBatch.push(eventObj); if (isHighDown) { var _a2 = preParseFinder(payload), queryOptionMap = _a2.queryOptionMap, mainTypeSpecified = _a2.mainTypeSpecified; var componentMainType = mainTypeSpecified ? queryOptionMap.keys()[0] : "series"; updateDirectly(_this, updateMethod, batchItem, componentMainType); markStatusToUpdate(_this); } else if (isSelectChange) { updateDirectly(_this, updateMethod, batchItem, "series"); markStatusToUpdate(_this); } else if (cptType) { updateDirectly(_this, updateMethod, batchItem, cptType.main, cptType.sub); } }); if (updateMethod !== "none" && !isHighDown && !isSelectChange && !cptType) { try { if (this[PENDING_UPDATE]) { prepare(this); updateMethods.update.call(this, payload); this[PENDING_UPDATE] = null; } else { updateMethods[updateMethod].call(this, payload); } } catch (e) { this[IN_MAIN_PROCESS_KEY] = false; throw e; } } if (batched) { eventObj = { type: actionInfo2.event || payloadType, escapeConnect, batch: eventObjBatch }; } else { eventObj = eventObjBatch[0]; } this[IN_MAIN_PROCESS_KEY] = false; if (!silent) { var messageCenter = this._messageCenter; messageCenter.trigger(eventObj.type, eventObj); if (isSelectChange) { var newObj = { type: "selectchanged", escapeConnect, selected: getAllSelectedIndices(ecModel), isFromClick: payload.isFromClick || false, fromAction: payload.type, fromActionPayload: payload }; messageCenter.trigger(newObj.type, newObj); } } }; flushPendingActions = function(silent) { var pendingActions = this._pendingActions; while (pendingActions.length) { var payload = pendingActions.shift(); doDispatchAction.call(this, payload, silent); } }; triggerUpdatedEvent = function(silent) { !silent && this.trigger("updated"); }; bindRenderedEvent = function(zr, ecIns) { zr.on("rendered", function(params) { ecIns.trigger("rendered", params); if ( // Although zr is dirty if initial animation is not finished // and this checking is called on frame, we also check // animation finished for robustness. zr.animation.isFinished() && !ecIns[PENDING_UPDATE] && !ecIns._scheduler.unfinished && !ecIns._pendingActions.length ) { ecIns.trigger("finished"); } }); }; bindMouseEvent = function(zr, ecIns) { zr.on("mouseover", function(e) { var el = e.target; var dispatcher = findEventDispatcher(el, isHighDownDispatcher); if (dispatcher) { handleGlobalMouseOverForHighDown(dispatcher, e, ecIns._api); markStatusToUpdate(ecIns); } }).on("mouseout", function(e) { var el = e.target; var dispatcher = findEventDispatcher(el, isHighDownDispatcher); if (dispatcher) { handleGlobalMouseOutForHighDown(dispatcher, e, ecIns._api); markStatusToUpdate(ecIns); } }).on("click", function(e) { var el = e.target; var dispatcher = findEventDispatcher(el, function(target) { return getECData(target).dataIndex != null; }, true); if (dispatcher) { var actionType = dispatcher.selected ? "unselect" : "select"; var ecData = getECData(dispatcher); ecIns._api.dispatchAction({ type: actionType, dataType: ecData.dataType, dataIndexInside: ecData.dataIndex, seriesIndex: ecData.seriesIndex, isFromClick: true }); } }); }; function clearColorPalette(ecModel) { ecModel.clearColorPalette(); ecModel.eachSeries(function(seriesModel) { seriesModel.clearColorPalette(); }); } function allocateZlevels(ecModel) { var componentZLevels = []; var seriesZLevels = []; var hasSeparateZLevel = false; ecModel.eachComponent(function(componentType, componentModel) { var zlevel = componentModel.get("zlevel") || 0; var z = componentModel.get("z") || 0; var zlevelKey = componentModel.getZLevelKey(); hasSeparateZLevel = hasSeparateZLevel || !!zlevelKey; (componentType === "series" ? seriesZLevels : componentZLevels).push({ zlevel, z, idx: componentModel.componentIndex, type: componentType, key: zlevelKey }); }); if (hasSeparateZLevel) { var zLevels = componentZLevels.concat(seriesZLevels); var lastSeriesZLevel_1; var lastSeriesKey_1; sort$2(zLevels, function(a, b) { if (a.zlevel === b.zlevel) { return a.z - b.z; } return a.zlevel - b.zlevel; }); each$f(zLevels, function(item) { var componentModel = ecModel.getComponent(item.type, item.idx); var zlevel = item.zlevel; var key = item.key; if (lastSeriesZLevel_1 != null) { zlevel = Math.max(lastSeriesZLevel_1, zlevel); } if (key) { if (zlevel === lastSeriesZLevel_1 && key !== lastSeriesKey_1) { zlevel++; } lastSeriesKey_1 = key; } else if (lastSeriesKey_1) { if (zlevel === lastSeriesZLevel_1) { zlevel++; } lastSeriesKey_1 = ""; } lastSeriesZLevel_1 = zlevel; componentModel.setZLevel(zlevel); }); } } render = function(ecIns, ecModel, api, payload, updateParams) { allocateZlevels(ecModel); renderComponents(ecIns, ecModel, api, payload, updateParams); each$f(ecIns._chartsViews, function(chart) { chart.__alive = false; }); renderSeries(ecIns, ecModel, api, payload, updateParams); each$f(ecIns._chartsViews, function(chart) { if (!chart.__alive) { chart.remove(ecModel, api); } }); }; renderComponents = function(ecIns, ecModel, api, payload, updateParams, dirtyList) { each$f(dirtyList || ecIns._componentsViews, function(componentView) { var componentModel = componentView.__model; clearStates(componentModel, componentView); componentView.render(componentModel, ecModel, api, payload); updateZ2(componentModel, componentView); updateStates(componentModel, componentView); }); }; renderSeries = function(ecIns, ecModel, api, payload, updateParams, dirtyMap) { var scheduler = ecIns._scheduler; updateParams = extend(updateParams || {}, { updatedSeries: ecModel.getSeries() }); lifecycle.trigger("series:beforeupdate", ecModel, api, updateParams); var unfinished = false; ecModel.eachSeries(function(seriesModel) { var chartView = ecIns._chartsMap[seriesModel.__viewId]; chartView.__alive = true; var renderTask = chartView.renderTask; scheduler.updatePayload(renderTask, payload); clearStates(seriesModel, chartView); if (dirtyMap && dirtyMap.get(seriesModel.uid)) { renderTask.dirty(); } if (renderTask.perform(scheduler.getPerformArgs(renderTask))) { unfinished = true; } chartView.group.silent = !!seriesModel.get("silent"); updateBlend(seriesModel, chartView); updateSeriesElementSelection(seriesModel); }); scheduler.unfinished = unfinished || scheduler.unfinished; lifecycle.trigger("series:layoutlabels", ecModel, api, updateParams); lifecycle.trigger("series:transition", ecModel, api, updateParams); ecModel.eachSeries(function(seriesModel) { var chartView = ecIns._chartsMap[seriesModel.__viewId]; updateZ2(seriesModel, chartView); updateStates(seriesModel, chartView); }); updateHoverLayerStatus(ecIns, ecModel); lifecycle.trigger("series:afterupdate", ecModel, api, updateParams); }; markStatusToUpdate = function(ecIns) { ecIns[STATUS_NEEDS_UPDATE_KEY] = true; ecIns.getZr().wakeUp(); }; applyChangedStates = function(ecIns) { if (!ecIns[STATUS_NEEDS_UPDATE_KEY]) { return; } ecIns.getZr().storage.traverse(function(el) { if (isElementRemoved(el)) { return; } applyElementStates(el); }); ecIns[STATUS_NEEDS_UPDATE_KEY] = false; }; function applyElementStates(el) { var newStates = []; var oldStates = el.currentStates; for (var i = 0; i < oldStates.length; i++) { var stateName = oldStates[i]; if (!(stateName === "emphasis" || stateName === "blur" || stateName === "select")) { newStates.push(stateName); } } if (el.selected && el.states.select) { newStates.push("select"); } if (el.hoverState === HOVER_STATE_EMPHASIS && el.states.emphasis) { newStates.push("emphasis"); } else if (el.hoverState === HOVER_STATE_BLUR && el.states.blur) { newStates.push("blur"); } el.useStates(newStates); } function updateHoverLayerStatus(ecIns, ecModel) { var zr = ecIns._zr; var storage2 = zr.storage; var elCount = 0; storage2.traverse(function(el) { if (!el.isGroup) { elCount++; } }); if (elCount > ecModel.get("hoverLayerThreshold") && !env.node && !env.worker) { ecModel.eachSeries(function(seriesModel) { if (seriesModel.preventUsingHoverLayer) { return; } var chartView = ecIns._chartsMap[seriesModel.__viewId]; if (chartView.__alive) { chartView.eachRendered(function(el) { if (el.states.emphasis) { el.states.emphasis.hoverLayer = true; } }); } }); } } function updateBlend(seriesModel, chartView) { var blendMode = seriesModel.get("blendMode") || null; chartView.eachRendered(function(el) { if (!el.isGroup) { el.style.blend = blendMode; } }); } function updateZ2(model, view) { if (model.preventAutoZ) { return; } var z = model.get("z") || 0; var zlevel = model.get("zlevel") || 0; view.eachRendered(function(el) { doUpdateZ(el, z, zlevel, -Infinity); return true; }); } function doUpdateZ(el, z, zlevel, maxZ2) { var label = el.getTextContent(); var labelLine = el.getTextGuideLine(); var isGroup = el.isGroup; if (isGroup) { var children = el.childrenRef(); for (var i = 0; i < children.length; i++) { maxZ2 = Math.max(doUpdateZ(children[i], z, zlevel, maxZ2), maxZ2); } } else { el.z = z; el.zlevel = zlevel; maxZ2 = Math.max(el.z2, maxZ2); } if (label) { label.z = z; label.zlevel = zlevel; isFinite(maxZ2) && (label.z2 = maxZ2 + 2); } if (labelLine) { var textGuideLineConfig = el.textGuideLineConfig; labelLine.z = z; labelLine.zlevel = zlevel; isFinite(maxZ2) && (labelLine.z2 = maxZ2 + (textGuideLineConfig && textGuideLineConfig.showAbove ? 1 : -1)); } return maxZ2; } function clearStates(model, view) { view.eachRendered(function(el) { if (isElementRemoved(el)) { return; } var textContent = el.getTextContent(); var textGuide = el.getTextGuideLine(); if (el.stateTransition) { el.stateTransition = null; } if (textContent && textContent.stateTransition) { textContent.stateTransition = null; } if (textGuide && textGuide.stateTransition) { textGuide.stateTransition = null; } if (el.hasState()) { el.prevStates = el.currentStates; el.clearStates(); } else if (el.prevStates) { el.prevStates = null; } }); } function updateStates(model, view) { var stateAnimationModel = model.getModel("stateAnimation"); var enableAnimation = model.isAnimationEnabled(); var duration = stateAnimationModel.get("duration"); var stateTransition = duration > 0 ? { duration, delay: stateAnimationModel.get("delay"), easing: stateAnimationModel.get("easing") // additive: stateAnimationModel.get('additive') } : null; view.eachRendered(function(el) { if (el.states && el.states.emphasis) { if (isElementRemoved(el)) { return; } if (el instanceof Path) { savePathStates(el); } if (el.__dirty) { var prevStates = el.prevStates; if (prevStates) { el.useStates(prevStates); } } if (enableAnimation) { el.stateTransition = stateTransition; var textContent = el.getTextContent(); var textGuide = el.getTextGuideLine(); if (textContent) { textContent.stateTransition = stateTransition; } if (textGuide) { textGuide.stateTransition = stateTransition; } } if (el.__dirty) { applyElementStates(el); } } }); } createExtensionAPI = function(ecIns) { return new /** @class */ ((function(_super2) { __extends(class_1, _super2); function class_1() { return _super2 !== null && _super2.apply(this, arguments) || this; } class_1.prototype.getCoordinateSystems = function() { return ecIns._coordSysMgr.getCoordinateSystems(); }; class_1.prototype.getComponentByElement = function(el) { while (el) { var modelInfo = el.__ecComponentInfo; if (modelInfo != null) { return ecIns._model.getComponent(modelInfo.mainType, modelInfo.index); } el = el.parent; } }; class_1.prototype.enterEmphasis = function(el, highlightDigit) { enterEmphasis(el, highlightDigit); markStatusToUpdate(ecIns); }; class_1.prototype.leaveEmphasis = function(el, highlightDigit) { leaveEmphasis(el, highlightDigit); markStatusToUpdate(ecIns); }; class_1.prototype.enterBlur = function(el) { enterBlur(el); markStatusToUpdate(ecIns); }; class_1.prototype.leaveBlur = function(el) { leaveBlur(el); markStatusToUpdate(ecIns); }; class_1.prototype.enterSelect = function(el) { enterSelect(el); markStatusToUpdate(ecIns); }; class_1.prototype.leaveSelect = function(el) { leaveSelect(el); markStatusToUpdate(ecIns); }; class_1.prototype.getModel = function() { return ecIns.getModel(); }; class_1.prototype.getViewOfComponentModel = function(componentModel) { return ecIns.getViewOfComponentModel(componentModel); }; class_1.prototype.getViewOfSeriesModel = function(seriesModel) { return ecIns.getViewOfSeriesModel(seriesModel); }; return class_1; })(ExtensionAPI))(ecIns); }; enableConnect = function(chart) { function updateConnectedChartsStatus(charts, status) { for (var i = 0; i < charts.length; i++) { var otherChart = charts[i]; otherChart[CONNECT_STATUS_KEY] = status; } } each$f(eventActionMap, function(actionType, eventType) { chart._messageCenter.on(eventType, function(event) { if (connectedGroups[chart.group] && chart[CONNECT_STATUS_KEY] !== CONNECT_STATUS_PENDING) { if (event && event.escapeConnect) { return; } var action_1 = chart.makeActionFromEvent(event); var otherCharts_1 = []; each$f(instances, function(otherChart) { if (otherChart !== chart && otherChart.group === chart.group) { otherCharts_1.push(otherChart); } }); updateConnectedChartsStatus(otherCharts_1, CONNECT_STATUS_PENDING); each$f(otherCharts_1, function(otherChart) { if (otherChart[CONNECT_STATUS_KEY] !== CONNECT_STATUS_UPDATING) { otherChart.dispatchAction(action_1); } }); updateConnectedChartsStatus(otherCharts_1, CONNECT_STATUS_UPDATED); } }); }); }; })(); return ECharts2; })(Eventful) ); var echartsProto = ECharts.prototype; echartsProto.on = createRegisterEventWithLowercaseECharts("on"); echartsProto.off = createRegisterEventWithLowercaseECharts("off"); echartsProto.one = function(eventName, cb, ctx) { var self = this; function wrapped() { var args2 = []; for (var _i = 0; _i < arguments.length; _i++) { args2[_i] = arguments[_i]; } cb && cb.apply && cb.apply(this, args2); self.off(eventName, wrapped); } this.on.call(this, eventName, wrapped, ctx); }; var MOUSE_EVENT_NAMES = ["click", "dblclick", "mouseover", "mouseout", "mousemove", "mousedown", "mouseup", "globalout", "contextmenu"]; function disposedWarning(id) { } var actions = {}; var eventActionMap = {}; var dataProcessorFuncs = []; var optionPreprocessorFuncs = []; var visualFuncs = []; var themeStorage = {}; var loadingEffects = {}; var instances = {}; var connectedGroups = {}; var idBase = +/* @__PURE__ */ new Date() - 0; var DOM_ATTRIBUTE_KEY = "_echarts_instance_"; function init$1(dom, theme2, opts) { { var existInstance = getInstanceByDom(dom); if (existInstance) { return existInstance; } } var chart = new ECharts(dom, theme2, opts); chart.id = "ec_" + idBase++; instances[chart.id] = chart; setAttribute(dom, DOM_ATTRIBUTE_KEY, chart.id); enableConnect(chart); lifecycle.trigger("afterinit", chart); return chart; } function getInstanceByDom(dom) { return instances[getAttribute(dom, DOM_ATTRIBUTE_KEY)]; } function registerTheme(name, theme2) { themeStorage[name] = theme2; } function registerPreprocessor(preprocessorFunc) { if (indexOf(optionPreprocessorFuncs, preprocessorFunc) < 0) { optionPreprocessorFuncs.push(preprocessorFunc); } } function registerProcessor(priority, processor) { normalizeRegister(dataProcessorFuncs, priority, processor, PRIORITY_PROCESSOR_DEFAULT); } function registerPostInit(postInitFunc) { registerUpdateLifecycle("afterinit", postInitFunc); } function registerPostUpdate(postUpdateFunc) { registerUpdateLifecycle("afterupdate", postUpdateFunc); } function registerUpdateLifecycle(name, cb) { lifecycle.on(name, cb); } function registerAction(actionInfo2, eventName, action) { if (isFunction(eventName)) { action = eventName; eventName = ""; } var actionType = isObject$3(actionInfo2) ? actionInfo2.type : [actionInfo2, actionInfo2 = { event: eventName }][0]; actionInfo2.event = (actionInfo2.event || actionType).toLowerCase(); eventName = actionInfo2.event; if (eventActionMap[eventName]) { return; } assert(ACTION_REG.test(actionType) && ACTION_REG.test(eventName)); if (!actions[actionType]) { actions[actionType] = { action, actionInfo: actionInfo2 }; } eventActionMap[eventName] = actionType; } function registerCoordinateSystem(type, coordSysCreator) { CoordinateSystemManager.register(type, coordSysCreator); } function registerLayout(priority, layoutTask) { normalizeRegister(visualFuncs, priority, layoutTask, PRIORITY_VISUAL_LAYOUT, "layout"); } function registerVisual(priority, visualTask) { normalizeRegister(visualFuncs, priority, visualTask, PRIORITY_VISUAL_CHART, "visual"); } var registeredTasks = []; function normalizeRegister(targetList, priority, fn, defaultPriority, visualType) { if (isFunction(priority) || isObject$3(priority)) { fn = priority; priority = defaultPriority; } if (indexOf(registeredTasks, fn) >= 0) { return; } registeredTasks.push(fn); var stageHandler = Scheduler.wrapStageHandler(fn, visualType); stageHandler.__prio = priority; stageHandler.__raw = fn; targetList.push(stageHandler); } function registerLoading(name, loadingFx) { loadingEffects[name] = loadingFx; } function registerMap$1(mapName, geoJson, specialAreas) { var registerMap2 = getImpl("registerMap"); registerMap2 && registerMap2(mapName, geoJson, specialAreas); } var registerTransform = registerExternalTransform; registerVisual(PRIORITY_VISUAL_GLOBAL, seriesStyleTask); registerVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataStyleTask); registerVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataColorPaletteTask); registerVisual(PRIORITY_VISUAL_GLOBAL, seriesSymbolTask); registerVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataSymbolTask); registerVisual(PRIORITY_VISUAL_DECAL, decalVisual); registerPreprocessor(globalBackwardCompat); registerProcessor(PRIORITY_PROCESSOR_DATASTACK, dataStack); registerLoading("default", defaultLoading); registerAction({ type: HIGHLIGHT_ACTION_TYPE, event: HIGHLIGHT_ACTION_TYPE, update: HIGHLIGHT_ACTION_TYPE }, noop); registerAction({ type: DOWNPLAY_ACTION_TYPE, event: DOWNPLAY_ACTION_TYPE, update: DOWNPLAY_ACTION_TYPE }, noop); registerAction({ type: SELECT_ACTION_TYPE, event: SELECT_ACTION_TYPE, update: SELECT_ACTION_TYPE }, noop); registerAction({ type: UNSELECT_ACTION_TYPE, event: UNSELECT_ACTION_TYPE, update: UNSELECT_ACTION_TYPE }, noop); registerAction({ type: TOGGLE_SELECT_ACTION_TYPE, event: TOGGLE_SELECT_ACTION_TYPE, update: TOGGLE_SELECT_ACTION_TYPE }, noop); registerTheme("light", lightTheme); registerTheme("dark", theme); function dataIndexMapValueLength(valNumOrArrLengthMoreThan2) { return valNumOrArrLengthMoreThan2 == null ? 0 : valNumOrArrLengthMoreThan2.length || 1; } function defaultKeyGetter(item) { return item; } var DataDiffer = ( /** @class */ (function() { function DataDiffer2(oldArr, newArr, oldKeyGetter, newKeyGetter, context, diffMode) { this._old = oldArr; this._new = newArr; this._oldKeyGetter = oldKeyGetter || defaultKeyGetter; this._newKeyGetter = newKeyGetter || defaultKeyGetter; this.context = context; this._diffModeMultiple = diffMode === "multiple"; } DataDiffer2.prototype.add = function(func) { this._add = func; return this; }; DataDiffer2.prototype.update = function(func) { this._update = func; return this; }; DataDiffer2.prototype.updateManyToOne = function(func) { this._updateManyToOne = func; return this; }; DataDiffer2.prototype.updateOneToMany = function(func) { this._updateOneToMany = func; return this; }; DataDiffer2.prototype.updateManyToMany = function(func) { this._updateManyToMany = func; return this; }; DataDiffer2.prototype.remove = function(func) { this._remove = func; return this; }; DataDiffer2.prototype.execute = function() { this[this._diffModeMultiple ? "_executeMultiple" : "_executeOneToOne"](); }; DataDiffer2.prototype._executeOneToOne = function() { var oldArr = this._old; var newArr = this._new; var newDataIndexMap = {}; var oldDataKeyArr = new Array(oldArr.length); var newDataKeyArr = new Array(newArr.length); this._initIndexMap(oldArr, null, oldDataKeyArr, "_oldKeyGetter"); this._initIndexMap(newArr, newDataIndexMap, newDataKeyArr, "_newKeyGetter"); for (var i = 0; i < oldArr.length; i++) { var oldKey = oldDataKeyArr[i]; var newIdxMapVal = newDataIndexMap[oldKey]; var newIdxMapValLen = dataIndexMapValueLength(newIdxMapVal); if (newIdxMapValLen > 1) { var newIdx = newIdxMapVal.shift(); if (newIdxMapVal.length === 1) { newDataIndexMap[oldKey] = newIdxMapVal[0]; } this._update && this._update(newIdx, i); } else if (newIdxMapValLen === 1) { newDataIndexMap[oldKey] = null; this._update && this._update(newIdxMapVal, i); } else { this._remove && this._remove(i); } } this._performRestAdd(newDataKeyArr, newDataIndexMap); }; DataDiffer2.prototype._executeMultiple = function() { var oldArr = this._old; var newArr = this._new; var oldDataIndexMap = {}; var newDataIndexMap = {}; var oldDataKeyArr = []; var newDataKeyArr = []; this._initIndexMap(oldArr, oldDataIndexMap, oldDataKeyArr, "_oldKeyGetter"); this._initIndexMap(newArr, newDataIndexMap, newDataKeyArr, "_newKeyGetter"); for (var i = 0; i < oldDataKeyArr.length; i++) { var oldKey = oldDataKeyArr[i]; var oldIdxMapVal = oldDataIndexMap[oldKey]; var newIdxMapVal = newDataIndexMap[oldKey]; var oldIdxMapValLen = dataIndexMapValueLength(oldIdxMapVal); var newIdxMapValLen = dataIndexMapValueLength(newIdxMapVal); if (oldIdxMapValLen > 1 && newIdxMapValLen === 1) { this._updateManyToOne && this._updateManyToOne(newIdxMapVal, oldIdxMapVal); newDataIndexMap[oldKey] = null; } else if (oldIdxMapValLen === 1 && newIdxMapValLen > 1) { this._updateOneToMany && this._updateOneToMany(newIdxMapVal, oldIdxMapVal); newDataIndexMap[oldKey] = null; } else if (oldIdxMapValLen === 1 && newIdxMapValLen === 1) { this._update && this._update(newIdxMapVal, oldIdxMapVal); newDataIndexMap[oldKey] = null; } else if (oldIdxMapValLen > 1 && newIdxMapValLen > 1) { this._updateManyToMany && this._updateManyToMany(newIdxMapVal, oldIdxMapVal); newDataIndexMap[oldKey] = null; } else if (oldIdxMapValLen > 1) { for (var i_1 = 0; i_1 < oldIdxMapValLen; i_1++) { this._remove && this._remove(oldIdxMapVal[i_1]); } } else { this._remove && this._remove(oldIdxMapVal); } } this._performRestAdd(newDataKeyArr, newDataIndexMap); }; DataDiffer2.prototype._performRestAdd = function(newDataKeyArr, newDataIndexMap) { for (var i = 0; i < newDataKeyArr.length; i++) { var newKey = newDataKeyArr[i]; var newIdxMapVal = newDataIndexMap[newKey]; var idxMapValLen = dataIndexMapValueLength(newIdxMapVal); if (idxMapValLen > 1) { for (var j = 0; j < idxMapValLen; j++) { this._add && this._add(newIdxMapVal[j]); } } else if (idxMapValLen === 1) { this._add && this._add(newIdxMapVal); } newDataIndexMap[newKey] = null; } }; DataDiffer2.prototype._initIndexMap = function(arr, map2, keyArr, keyGetterName) { var cbModeMultiple = this._diffModeMultiple; for (var i = 0; i < arr.length; i++) { var key = "_ec_" + this[keyGetterName](arr[i], i); if (!cbModeMultiple) { keyArr[i] = key; } if (!map2) { continue; } var idxMapVal = map2[key]; var idxMapValLen = dataIndexMapValueLength(idxMapVal); if (idxMapValLen === 0) { map2[key] = i; if (cbModeMultiple) { keyArr.push(key); } } else if (idxMapValLen === 1) { map2[key] = [idxMapVal, i]; } else { idxMapVal.push(i); } } }; return DataDiffer2; })() ); var DimensionUserOuput = ( /** @class */ (function() { function DimensionUserOuput2(encode, dimRequest) { this._encode = encode; this._schema = dimRequest; } DimensionUserOuput2.prototype.get = function() { return { // Do not generate full dimension name until fist used. fullDimensions: this._getFullDimensionNames(), encode: this._encode }; }; DimensionUserOuput2.prototype._getFullDimensionNames = function() { if (!this._cachedDimNames) { this._cachedDimNames = this._schema ? this._schema.makeOutputDimensionNames() : []; } return this._cachedDimNames; }; return DimensionUserOuput2; })() ); function summarizeDimensions(data, schema) { var summary = {}; var encode = summary.encode = {}; var notExtraCoordDimMap = createHashMap(); var defaultedLabel = []; var defaultedTooltip = []; var userOutputEncode = {}; each$f(data.dimensions, function(dimName) { var dimItem = data.getDimensionInfo(dimName); var coordDim = dimItem.coordDim; if (coordDim) { var coordDimIndex = dimItem.coordDimIndex; getOrCreateEncodeArr(encode, coordDim)[coordDimIndex] = dimName; if (!dimItem.isExtraCoord) { notExtraCoordDimMap.set(coordDim, 1); if (mayLabelDimType(dimItem.type)) { defaultedLabel[0] = dimName; } getOrCreateEncodeArr(userOutputEncode, coordDim)[coordDimIndex] = data.getDimensionIndex(dimItem.name); } if (dimItem.defaultTooltip) { defaultedTooltip.push(dimName); } } VISUAL_DIMENSIONS.each(function(v, otherDim) { var encodeArr = getOrCreateEncodeArr(encode, otherDim); var dimIndex = dimItem.otherDims[otherDim]; if (dimIndex != null && dimIndex !== false) { encodeArr[dimIndex] = dimItem.name; } }); }); var dataDimsOnCoord = []; var encodeFirstDimNotExtra = {}; notExtraCoordDimMap.each(function(v, coordDim) { var dimArr = encode[coordDim]; encodeFirstDimNotExtra[coordDim] = dimArr[0]; dataDimsOnCoord = dataDimsOnCoord.concat(dimArr); }); summary.dataDimsOnCoord = dataDimsOnCoord; summary.dataDimIndicesOnCoord = map$1(dataDimsOnCoord, function(dimName) { return data.getDimensionInfo(dimName).storeDimIndex; }); summary.encodeFirstDimNotExtra = encodeFirstDimNotExtra; var encodeLabel = encode.label; if (encodeLabel && encodeLabel.length) { defaultedLabel = encodeLabel.slice(); } var encodeTooltip = encode.tooltip; if (encodeTooltip && encodeTooltip.length) { defaultedTooltip = encodeTooltip.slice(); } else if (!defaultedTooltip.length) { defaultedTooltip = defaultedLabel.slice(); } encode.defaultedLabel = defaultedLabel; encode.defaultedTooltip = defaultedTooltip; summary.userOutput = new DimensionUserOuput(userOutputEncode, schema); return summary; } function getOrCreateEncodeArr(encode, dim) { if (!encode.hasOwnProperty(dim)) { encode[dim] = []; } return encode[dim]; } function getDimensionTypeByAxis(axisType) { return axisType === "category" ? "ordinal" : axisType === "time" ? "time" : "float"; } function mayLabelDimType(dimType) { return !(dimType === "ordinal" || dimType === "time"); } var SeriesDimensionDefine = ( /** @class */ /* @__PURE__ */ (function() { function SeriesDimensionDefine2(opt) { this.otherDims = {}; if (opt != null) { extend(this, opt); } } return SeriesDimensionDefine2; })() ); var inner$h = makeInner(); var dimTypeShort = { float: "f", int: "i", ordinal: "o", number: "n", time: "t" }; var SeriesDataSchema = ( /** @class */ (function() { function SeriesDataSchema2(opt) { this.dimensions = opt.dimensions; this._dimOmitted = opt.dimensionOmitted; this.source = opt.source; this._fullDimCount = opt.fullDimensionCount; this._updateDimOmitted(opt.dimensionOmitted); } SeriesDataSchema2.prototype.isDimensionOmitted = function() { return this._dimOmitted; }; SeriesDataSchema2.prototype._updateDimOmitted = function(dimensionOmitted) { this._dimOmitted = dimensionOmitted; if (!dimensionOmitted) { return; } if (!this._dimNameMap) { this._dimNameMap = ensureSourceDimNameMap(this.source); } }; SeriesDataSchema2.prototype.getSourceDimensionIndex = function(dimName) { return retrieve2(this._dimNameMap.get(dimName), -1); }; SeriesDataSchema2.prototype.getSourceDimension = function(dimIndex) { var dimensionsDefine = this.source.dimensionsDefine; if (dimensionsDefine) { return dimensionsDefine[dimIndex]; } }; SeriesDataSchema2.prototype.makeStoreSchema = function() { var dimCount = this._fullDimCount; var willRetrieveDataByName = shouldRetrieveDataByName(this.source); var makeHashStrict = !shouldOmitUnusedDimensions(dimCount); var dimHash = ""; var dims = []; for (var fullDimIdx = 0, seriesDimIdx = 0; fullDimIdx < dimCount; fullDimIdx++) { var property = void 0; var type = void 0; var ordinalMeta = void 0; var seriesDimDef = this.dimensions[seriesDimIdx]; if (seriesDimDef && seriesDimDef.storeDimIndex === fullDimIdx) { property = willRetrieveDataByName ? seriesDimDef.name : null; type = seriesDimDef.type; ordinalMeta = seriesDimDef.ordinalMeta; seriesDimIdx++; } else { var sourceDimDef = this.getSourceDimension(fullDimIdx); if (sourceDimDef) { property = willRetrieveDataByName ? sourceDimDef.name : null; type = sourceDimDef.type; } } dims.push({ property, type, ordinalMeta }); if (willRetrieveDataByName && property != null && (!seriesDimDef || !seriesDimDef.isCalculationCoord)) { dimHash += makeHashStrict ? property.replace(/\`/g, "`1").replace(/\$/g, "`2") : property; } dimHash += "$"; dimHash += dimTypeShort[type] || "f"; if (ordinalMeta) { dimHash += ordinalMeta.uid; } dimHash += "$"; } var source = this.source; var hash = [source.seriesLayoutBy, source.startIndex, dimHash].join("$$"); return { dimensions: dims, hash }; }; SeriesDataSchema2.prototype.makeOutputDimensionNames = function() { var result = []; for (var fullDimIdx = 0, seriesDimIdx = 0; fullDimIdx < this._fullDimCount; fullDimIdx++) { var name_1 = void 0; var seriesDimDef = this.dimensions[seriesDimIdx]; if (seriesDimDef && seriesDimDef.storeDimIndex === fullDimIdx) { if (!seriesDimDef.isCalculationCoord) { name_1 = seriesDimDef.name; } seriesDimIdx++; } else { var sourceDimDef = this.getSourceDimension(fullDimIdx); if (sourceDimDef) { name_1 = sourceDimDef.name; } } result.push(name_1); } return result; }; SeriesDataSchema2.prototype.appendCalculationDimension = function(dimDef) { this.dimensions.push(dimDef); dimDef.isCalculationCoord = true; this._fullDimCount++; this._updateDimOmitted(true); }; return SeriesDataSchema2; })() ); function isSeriesDataSchema(schema) { return schema instanceof SeriesDataSchema; } function createDimNameMap(dimsDef) { var dataDimNameMap = createHashMap(); for (var i = 0; i < (dimsDef || []).length; i++) { var dimDefItemRaw = dimsDef[i]; var userDimName = isObject$3(dimDefItemRaw) ? dimDefItemRaw.name : dimDefItemRaw; if (userDimName != null && dataDimNameMap.get(userDimName) == null) { dataDimNameMap.set(userDimName, i); } } return dataDimNameMap; } function ensureSourceDimNameMap(source) { var innerSource = inner$h(source); return innerSource.dimNameMap || (innerSource.dimNameMap = createDimNameMap(source.dimensionsDefine)); } function shouldOmitUnusedDimensions(dimCount) { return dimCount > 30; } var isObject$1 = isObject$3; var map = map$1; var CtorInt32Array = typeof Int32Array === "undefined" ? Array : Int32Array; var ID_PREFIX = "e\0\0"; var INDEX_NOT_FOUND = -1; var TRANSFERABLE_PROPERTIES = ["hasItemOption", "_nameList", "_idList", "_invertedIndicesMap", "_dimSummary", "userOutput", "_rawData", "_dimValueGetter", "_nameDimIdx", "_idDimIdx", "_nameRepeatCount"]; var CLONE_PROPERTIES = ["_approximateExtent"]; var prepareInvertedIndex; var getId; var getIdNameFromStore; var normalizeDimensions; var transferProperties; var cloneListForMapAndSample; var makeIdFromName; var SeriesData = ( /** @class */ (function() { function SeriesData2(dimensionsInput, hostModel) { this.type = "list"; this._dimOmitted = false; this._nameList = []; this._idList = []; this._visual = {}; this._layout = {}; this._itemVisuals = []; this._itemLayouts = []; this._graphicEls = []; this._approximateExtent = {}; this._calculationInfo = {}; this.hasItemOption = false; this.TRANSFERABLE_METHODS = ["cloneShallow", "downSample", "minmaxDownSample", "lttbDownSample", "map"]; this.CHANGABLE_METHODS = ["filterSelf", "selectRange"]; this.DOWNSAMPLE_METHODS = ["downSample", "minmaxDownSample", "lttbDownSample"]; var dimensions; var assignStoreDimIdx = false; if (isSeriesDataSchema(dimensionsInput)) { dimensions = dimensionsInput.dimensions; this._dimOmitted = dimensionsInput.isDimensionOmitted(); this._schema = dimensionsInput; } else { assignStoreDimIdx = true; dimensions = dimensionsInput; } dimensions = dimensions || ["x", "y"]; var dimensionInfos = {}; var dimensionNames = []; var invertedIndicesMap = {}; var needsHasOwn = false; var emptyObj = {}; for (var i = 0; i < dimensions.length; i++) { var dimInfoInput = dimensions[i]; var dimensionInfo = isString(dimInfoInput) ? new SeriesDimensionDefine({ name: dimInfoInput }) : !(dimInfoInput instanceof SeriesDimensionDefine) ? new SeriesDimensionDefine(dimInfoInput) : dimInfoInput; var dimensionName = dimensionInfo.name; dimensionInfo.type = dimensionInfo.type || "float"; if (!dimensionInfo.coordDim) { dimensionInfo.coordDim = dimensionName; dimensionInfo.coordDimIndex = 0; } var otherDims = dimensionInfo.otherDims = dimensionInfo.otherDims || {}; dimensionNames.push(dimensionName); dimensionInfos[dimensionName] = dimensionInfo; if (emptyObj[dimensionName] != null) { needsHasOwn = true; } if (dimensionInfo.createInvertedIndices) { invertedIndicesMap[dimensionName] = []; } if (otherDims.itemName === 0) { this._nameDimIdx = i; } if (otherDims.itemId === 0) { this._idDimIdx = i; } if (assignStoreDimIdx) { dimensionInfo.storeDimIndex = i; } } this.dimensions = dimensionNames; this._dimInfos = dimensionInfos; this._initGetDimensionInfo(needsHasOwn); this.hostModel = hostModel; this._invertedIndicesMap = invertedIndicesMap; if (this._dimOmitted) { var dimIdxToName_1 = this._dimIdxToName = createHashMap(); each$f(dimensionNames, function(dimName) { dimIdxToName_1.set(dimensionInfos[dimName].storeDimIndex, dimName); }); } } SeriesData2.prototype.getDimension = function(dim) { var dimIdx = this._recognizeDimIndex(dim); if (dimIdx == null) { return dim; } dimIdx = dim; if (!this._dimOmitted) { return this.dimensions[dimIdx]; } var dimName = this._dimIdxToName.get(dimIdx); if (dimName != null) { return dimName; } var sourceDimDef = this._schema.getSourceDimension(dimIdx); if (sourceDimDef) { return sourceDimDef.name; } }; SeriesData2.prototype.getDimensionIndex = function(dim) { var dimIdx = this._recognizeDimIndex(dim); if (dimIdx != null) { return dimIdx; } if (dim == null) { return -1; } var dimInfo = this._getDimInfo(dim); return dimInfo ? dimInfo.storeDimIndex : this._dimOmitted ? this._schema.getSourceDimensionIndex(dim) : -1; }; SeriesData2.prototype._recognizeDimIndex = function(dim) { if (isNumber(dim) || dim != null && !isNaN(dim) && !this._getDimInfo(dim) && (!this._dimOmitted || this._schema.getSourceDimensionIndex(dim) < 0)) { return +dim; } }; SeriesData2.prototype._getStoreDimIndex = function(dim) { var dimIdx = this.getDimensionIndex(dim); return dimIdx; }; SeriesData2.prototype.getDimensionInfo = function(dim) { return this._getDimInfo(this.getDimension(dim)); }; SeriesData2.prototype._initGetDimensionInfo = function(needsHasOwn) { var dimensionInfos = this._dimInfos; this._getDimInfo = needsHasOwn ? function(dimName) { return dimensionInfos.hasOwnProperty(dimName) ? dimensionInfos[dimName] : void 0; } : function(dimName) { return dimensionInfos[dimName]; }; }; SeriesData2.prototype.getDimensionsOnCoord = function() { return this._dimSummary.dataDimsOnCoord.slice(); }; SeriesData2.prototype.mapDimension = function(coordDim, idx) { var dimensionsSummary = this._dimSummary; if (idx == null) { return dimensionsSummary.encodeFirstDimNotExtra[coordDim]; } var dims = dimensionsSummary.encode[coordDim]; return dims ? dims[idx] : null; }; SeriesData2.prototype.mapDimensionsAll = function(coordDim) { var dimensionsSummary = this._dimSummary; var dims = dimensionsSummary.encode[coordDim]; return (dims || []).slice(); }; SeriesData2.prototype.getStore = function() { return this._store; }; SeriesData2.prototype.initData = function(data, nameList, dimValueGetter) { var _this = this; var store; if (data instanceof DataStore) { store = data; } if (!store) { var dimensions = this.dimensions; var provider = isSourceInstance(data) || isArrayLike(data) ? new DefaultDataProvider(data, dimensions.length) : data; store = new DataStore(); var dimensionInfos = map(dimensions, function(dimName) { return { type: _this._dimInfos[dimName].type, property: dimName }; }); store.initData(provider, dimensionInfos, dimValueGetter); } this._store = store; this._nameList = (nameList || []).slice(); this._idList = []; this._nameRepeatCount = {}; this._doInit(0, store.count()); this._dimSummary = summarizeDimensions(this, this._schema); this.userOutput = this._dimSummary.userOutput; }; SeriesData2.prototype.appendData = function(data) { var range = this._store.appendData(data); this._doInit(range[0], range[1]); }; SeriesData2.prototype.appendValues = function(values, names) { var _a2 = this._store.appendValues(values, names && names.length), start = _a2.start, end = _a2.end; var shouldMakeIdFromName = this._shouldMakeIdFromName(); this._updateOrdinalMeta(); if (names) { for (var idx = start; idx < end; idx++) { var sourceIdx = idx - start; this._nameList[idx] = names[sourceIdx]; if (shouldMakeIdFromName) { makeIdFromName(this, idx); } } } }; SeriesData2.prototype._updateOrdinalMeta = function() { var store = this._store; var dimensions = this.dimensions; for (var i = 0; i < dimensions.length; i++) { var dimInfo = this._dimInfos[dimensions[i]]; if (dimInfo.ordinalMeta) { store.collectOrdinalMeta(dimInfo.storeDimIndex, dimInfo.ordinalMeta); } } }; SeriesData2.prototype._shouldMakeIdFromName = function() { var provider = this._store.getProvider(); return this._idDimIdx == null && provider.getSource().sourceFormat !== SOURCE_FORMAT_TYPED_ARRAY && !provider.fillStorage; }; SeriesData2.prototype._doInit = function(start, end) { if (start >= end) { return; } var store = this._store; var provider = store.getProvider(); this._updateOrdinalMeta(); var nameList = this._nameList; var idList = this._idList; var sourceFormat = provider.getSource().sourceFormat; var isFormatOriginal = sourceFormat === SOURCE_FORMAT_ORIGINAL; if (isFormatOriginal && !provider.pure) { var sharedDataItem = []; for (var idx = start; idx < end; idx++) { var dataItem = provider.getItem(idx, sharedDataItem); if (!this.hasItemOption && isDataItemOption(dataItem)) { this.hasItemOption = true; } if (dataItem) { var itemName = dataItem.name; if (nameList[idx] == null && itemName != null) { nameList[idx] = convertOptionIdName(itemName, null); } var itemId = dataItem.id; if (idList[idx] == null && itemId != null) { idList[idx] = convertOptionIdName(itemId, null); } } } } if (this._shouldMakeIdFromName()) { for (var idx = start; idx < end; idx++) { makeIdFromName(this, idx); } } prepareInvertedIndex(this); }; SeriesData2.prototype.getApproximateExtent = function(dim) { return this._approximateExtent[dim] || this._store.getDataExtent(this._getStoreDimIndex(dim)); }; SeriesData2.prototype.setApproximateExtent = function(extent, dim) { dim = this.getDimension(dim); this._approximateExtent[dim] = extent.slice(); }; SeriesData2.prototype.getCalculationInfo = function(key) { return this._calculationInfo[key]; }; SeriesData2.prototype.setCalculationInfo = function(key, value) { isObject$1(key) ? extend(this._calculationInfo, key) : this._calculationInfo[key] = value; }; SeriesData2.prototype.getName = function(idx) { var rawIndex = this.getRawIndex(idx); var name = this._nameList[rawIndex]; if (name == null && this._nameDimIdx != null) { name = getIdNameFromStore(this, this._nameDimIdx, rawIndex); } if (name == null) { name = ""; } return name; }; SeriesData2.prototype._getCategory = function(dimIdx, idx) { var ordinal = this._store.get(dimIdx, idx); var ordinalMeta = this._store.getOrdinalMeta(dimIdx); if (ordinalMeta) { return ordinalMeta.categories[ordinal]; } return ordinal; }; SeriesData2.prototype.getId = function(idx) { return getId(this, this.getRawIndex(idx)); }; SeriesData2.prototype.count = function() { return this._store.count(); }; SeriesData2.prototype.get = function(dim, idx) { var store = this._store; var dimInfo = this._dimInfos[dim]; if (dimInfo) { return store.get(dimInfo.storeDimIndex, idx); } }; SeriesData2.prototype.getByRawIndex = function(dim, rawIdx) { var store = this._store; var dimInfo = this._dimInfos[dim]; if (dimInfo) { return store.getByRawIndex(dimInfo.storeDimIndex, rawIdx); } }; SeriesData2.prototype.getIndices = function() { return this._store.getIndices(); }; SeriesData2.prototype.getDataExtent = function(dim) { return this._store.getDataExtent(this._getStoreDimIndex(dim)); }; SeriesData2.prototype.getSum = function(dim) { return this._store.getSum(this._getStoreDimIndex(dim)); }; SeriesData2.prototype.getMedian = function(dim) { return this._store.getMedian(this._getStoreDimIndex(dim)); }; SeriesData2.prototype.getValues = function(dimensions, idx) { var _this = this; var store = this._store; return isArray$1(dimensions) ? store.getValues(map(dimensions, function(dim) { return _this._getStoreDimIndex(dim); }), idx) : store.getValues(dimensions); }; SeriesData2.prototype.hasValue = function(idx) { var dataDimIndicesOnCoord = this._dimSummary.dataDimIndicesOnCoord; for (var i = 0, len2 = dataDimIndicesOnCoord.length; i < len2; i++) { if (isNaN(this._store.get(dataDimIndicesOnCoord[i], idx))) { return false; } } return true; }; SeriesData2.prototype.indexOfName = function(name) { for (var i = 0, len2 = this._store.count(); i < len2; i++) { if (this.getName(i) === name) { return i; } } return -1; }; SeriesData2.prototype.getRawIndex = function(idx) { return this._store.getRawIndex(idx); }; SeriesData2.prototype.indexOfRawIndex = function(rawIndex) { return this._store.indexOfRawIndex(rawIndex); }; SeriesData2.prototype.rawIndexOf = function(dim, value) { var invertedIndices = dim && this._invertedIndicesMap[dim]; var rawIndex = invertedIndices && invertedIndices[value]; if (rawIndex == null || isNaN(rawIndex)) { return INDEX_NOT_FOUND; } return rawIndex; }; SeriesData2.prototype.indicesOfNearest = function(dim, value, maxDistance) { return this._store.indicesOfNearest(this._getStoreDimIndex(dim), value, maxDistance); }; SeriesData2.prototype.each = function(dims, cb, ctx) { if (isFunction(dims)) { ctx = cb; cb = dims; dims = []; } var fCtx = ctx || this; var dimIndices = map(normalizeDimensions(dims), this._getStoreDimIndex, this); this._store.each(dimIndices, fCtx ? bind$1(cb, fCtx) : cb); }; SeriesData2.prototype.filterSelf = function(dims, cb, ctx) { if (isFunction(dims)) { ctx = cb; cb = dims; dims = []; } var fCtx = ctx || this; var dimIndices = map(normalizeDimensions(dims), this._getStoreDimIndex, this); this._store = this._store.filter(dimIndices, fCtx ? bind$1(cb, fCtx) : cb); return this; }; SeriesData2.prototype.selectRange = function(range) { var _this = this; var innerRange = {}; var dims = keys(range); each$f(dims, function(dim) { var dimIdx = _this._getStoreDimIndex(dim); innerRange[dimIdx] = range[dim]; }); this._store = this._store.selectRange(innerRange); return this; }; SeriesData2.prototype.mapArray = function(dims, cb, ctx) { if (isFunction(dims)) { ctx = cb; cb = dims; dims = []; } ctx = ctx || this; var result = []; this.each(dims, function() { result.push(cb && cb.apply(this, arguments)); }, ctx); return result; }; SeriesData2.prototype.map = function(dims, cb, ctx, ctxCompat) { var fCtx = ctx || ctxCompat || this; var dimIndices = map(normalizeDimensions(dims), this._getStoreDimIndex, this); var list = cloneListForMapAndSample(this); list._store = this._store.map(dimIndices, fCtx ? bind$1(cb, fCtx) : cb); return list; }; SeriesData2.prototype.modify = function(dims, cb, ctx, ctxCompat) { var fCtx = ctx || ctxCompat || this; var dimIndices = map(normalizeDimensions(dims), this._getStoreDimIndex, this); this._store.modify(dimIndices, fCtx ? bind$1(cb, fCtx) : cb); }; SeriesData2.prototype.downSample = function(dimension, rate, sampleValue, sampleIndex) { var list = cloneListForMapAndSample(this); list._store = this._store.downSample(this._getStoreDimIndex(dimension), rate, sampleValue, sampleIndex); return list; }; SeriesData2.prototype.minmaxDownSample = function(valueDimension, rate) { var list = cloneListForMapAndSample(this); list._store = this._store.minmaxDownSample(this._getStoreDimIndex(valueDimension), rate); return list; }; SeriesData2.prototype.lttbDownSample = function(valueDimension, rate) { var list = cloneListForMapAndSample(this); list._store = this._store.lttbDownSample(this._getStoreDimIndex(valueDimension), rate); return list; }; SeriesData2.prototype.getRawDataItem = function(idx) { return this._store.getRawDataItem(idx); }; SeriesData2.prototype.getItemModel = function(idx) { var hostModel = this.hostModel; var dataItem = this.getRawDataItem(idx); return new Model(dataItem, hostModel, hostModel && hostModel.ecModel); }; SeriesData2.prototype.diff = function(otherList) { var thisList = this; return new DataDiffer(otherList ? otherList.getStore().getIndices() : [], this.getStore().getIndices(), function(idx) { return getId(otherList, idx); }, function(idx) { return getId(thisList, idx); }); }; SeriesData2.prototype.getVisual = function(key) { var visual = this._visual; return visual && visual[key]; }; SeriesData2.prototype.setVisual = function(kvObj, val) { this._visual = this._visual || {}; if (isObject$1(kvObj)) { extend(this._visual, kvObj); } else { this._visual[kvObj] = val; } }; SeriesData2.prototype.getItemVisual = function(idx, key) { var itemVisual = this._itemVisuals[idx]; var val = itemVisual && itemVisual[key]; if (val == null) { return this.getVisual(key); } return val; }; SeriesData2.prototype.hasItemVisual = function() { return this._itemVisuals.length > 0; }; SeriesData2.prototype.ensureUniqueItemVisual = function(idx, key) { var itemVisuals = this._itemVisuals; var itemVisual = itemVisuals[idx]; if (!itemVisual) { itemVisual = itemVisuals[idx] = {}; } var val = itemVisual[key]; if (val == null) { val = this.getVisual(key); if (isArray$1(val)) { val = val.slice(); } else if (isObject$1(val)) { val = extend({}, val); } itemVisual[key] = val; } return val; }; SeriesData2.prototype.setItemVisual = function(idx, key, value) { var itemVisual = this._itemVisuals[idx] || {}; this._itemVisuals[idx] = itemVisual; if (isObject$1(key)) { extend(itemVisual, key); } else { itemVisual[key] = value; } }; SeriesData2.prototype.clearAllVisual = function() { this._visual = {}; this._itemVisuals = []; }; SeriesData2.prototype.setLayout = function(key, val) { isObject$1(key) ? extend(this._layout, key) : this._layout[key] = val; }; SeriesData2.prototype.getLayout = function(key) { return this._layout[key]; }; SeriesData2.prototype.getItemLayout = function(idx) { return this._itemLayouts[idx]; }; SeriesData2.prototype.setItemLayout = function(idx, layout2, merge2) { this._itemLayouts[idx] = merge2 ? extend(this._itemLayouts[idx] || {}, layout2) : layout2; }; SeriesData2.prototype.clearItemLayouts = function() { this._itemLayouts.length = 0; }; SeriesData2.prototype.setItemGraphicEl = function(idx, el) { var seriesIndex = this.hostModel && this.hostModel.seriesIndex; setCommonECData(seriesIndex, this.dataType, idx, el); this._graphicEls[idx] = el; }; SeriesData2.prototype.getItemGraphicEl = function(idx) { return this._graphicEls[idx]; }; SeriesData2.prototype.eachItemGraphicEl = function(cb, context) { each$f(this._graphicEls, function(el, idx) { if (el) { cb && cb.call(context, el, idx); } }); }; SeriesData2.prototype.cloneShallow = function(list) { if (!list) { list = new SeriesData2(this._schema ? this._schema : map(this.dimensions, this._getDimInfo, this), this.hostModel); } transferProperties(list, this); list._store = this._store; return list; }; SeriesData2.prototype.wrapMethod = function(methodName, injectFunction) { var originalMethod = this[methodName]; if (!isFunction(originalMethod)) { return; } this.__wrappedMethods = this.__wrappedMethods || []; this.__wrappedMethods.push(methodName); this[methodName] = function() { var res = originalMethod.apply(this, arguments); return injectFunction.apply(this, [res].concat(slice(arguments))); }; }; SeriesData2.internalField = (function() { prepareInvertedIndex = function(data) { var invertedIndicesMap = data._invertedIndicesMap; each$f(invertedIndicesMap, function(invertedIndices, dim) { var dimInfo = data._dimInfos[dim]; var ordinalMeta = dimInfo.ordinalMeta; var store = data._store; if (ordinalMeta) { invertedIndices = invertedIndicesMap[dim] = new CtorInt32Array(ordinalMeta.categories.length); for (var i = 0; i < invertedIndices.length; i++) { invertedIndices[i] = INDEX_NOT_FOUND; } for (var i = 0; i < store.count(); i++) { invertedIndices[store.get(dimInfo.storeDimIndex, i)] = i; } } }); }; getIdNameFromStore = function(data, dimIdx, idx) { return convertOptionIdName(data._getCategory(dimIdx, idx), null); }; getId = function(data, rawIndex) { var id = data._idList[rawIndex]; if (id == null && data._idDimIdx != null) { id = getIdNameFromStore(data, data._idDimIdx, rawIndex); } if (id == null) { id = ID_PREFIX + rawIndex; } return id; }; normalizeDimensions = function(dimensions) { if (!isArray$1(dimensions)) { dimensions = dimensions != null ? [dimensions] : []; } return dimensions; }; cloneListForMapAndSample = function(original) { var list = new SeriesData2(original._schema ? original._schema : map(original.dimensions, original._getDimInfo, original), original.hostModel); transferProperties(list, original); return list; }; transferProperties = function(target, source) { each$f(TRANSFERABLE_PROPERTIES.concat(source.__wrappedMethods || []), function(propName) { if (source.hasOwnProperty(propName)) { target[propName] = source[propName]; } }); target.__wrappedMethods = source.__wrappedMethods; each$f(CLONE_PROPERTIES, function(propName) { target[propName] = clone$1(source[propName]); }); target._calculationInfo = extend({}, source._calculationInfo); }; makeIdFromName = function(data, idx) { var nameList = data._nameList; var idList = data._idList; var nameDimIdx = data._nameDimIdx; var idDimIdx = data._idDimIdx; var name = nameList[idx]; var id = idList[idx]; if (name == null && nameDimIdx != null) { nameList[idx] = name = getIdNameFromStore(data, nameDimIdx, idx); } if (id == null && idDimIdx != null) { idList[idx] = id = getIdNameFromStore(data, idDimIdx, idx); } if (id == null && name != null) { var nameRepeatCount = data._nameRepeatCount; var nmCnt = nameRepeatCount[name] = (nameRepeatCount[name] || 0) + 1; id = name; if (nmCnt > 1) { id += "__ec__" + nmCnt; } idList[idx] = id; } }; })(); return SeriesData2; })() ); function prepareSeriesDataSchema(source, opt) { if (!isSourceInstance(source)) { source = createSourceFromSeriesDataOption(source); } opt = opt || {}; var sysDims = opt.coordDimensions || []; var dimsDef = opt.dimensionsDefine || source.dimensionsDefine || []; var coordDimNameMap = createHashMap(); var resultList = []; var dimCount = getDimCount(source, sysDims, dimsDef, opt.dimensionsCount); var omitUnusedDimensions = opt.canOmitUnusedDimensions && shouldOmitUnusedDimensions(dimCount); var isUsingSourceDimensionsDef = dimsDef === source.dimensionsDefine; var dataDimNameMap = isUsingSourceDimensionsDef ? ensureSourceDimNameMap(source) : createDimNameMap(dimsDef); var encodeDef = opt.encodeDefine; if (!encodeDef && opt.encodeDefaulter) { encodeDef = opt.encodeDefaulter(source, dimCount); } var encodeDefMap = createHashMap(encodeDef); var indicesMap = new CtorInt32Array$1(dimCount); for (var i = 0; i < indicesMap.length; i++) { indicesMap[i] = -1; } function getResultItem(dimIdx) { var idx = indicesMap[dimIdx]; if (idx < 0) { var dimDefItemRaw = dimsDef[dimIdx]; var dimDefItem = isObject$3(dimDefItemRaw) ? dimDefItemRaw : { name: dimDefItemRaw }; var resultItem2 = new SeriesDimensionDefine(); var userDimName = dimDefItem.name; if (userDimName != null && dataDimNameMap.get(userDimName) != null) { resultItem2.name = resultItem2.displayName = userDimName; } dimDefItem.type != null && (resultItem2.type = dimDefItem.type); dimDefItem.displayName != null && (resultItem2.displayName = dimDefItem.displayName); var newIdx = resultList.length; indicesMap[dimIdx] = newIdx; resultItem2.storeDimIndex = dimIdx; resultList.push(resultItem2); return resultItem2; } return resultList[idx]; } if (!omitUnusedDimensions) { for (var i = 0; i < dimCount; i++) { getResultItem(i); } } encodeDefMap.each(function(dataDimsRaw, coordDim2) { var dataDims = normalizeToArray(dataDimsRaw).slice(); if (dataDims.length === 1 && !isString(dataDims[0]) && dataDims[0] < 0) { encodeDefMap.set(coordDim2, false); return; } var validDataDims = encodeDefMap.set(coordDim2, []); each$f(dataDims, function(resultDimIdxOrName, idx) { var resultDimIdx2 = isString(resultDimIdxOrName) ? dataDimNameMap.get(resultDimIdxOrName) : resultDimIdxOrName; if (resultDimIdx2 != null && resultDimIdx2 < dimCount) { validDataDims[idx] = resultDimIdx2; applyDim(getResultItem(resultDimIdx2), coordDim2, idx); } }); }); var availDimIdx = 0; each$f(sysDims, function(sysDimItemRaw) { var coordDim2; var sysDimItemDimsDef; var sysDimItemOtherDims; var sysDimItem; if (isString(sysDimItemRaw)) { coordDim2 = sysDimItemRaw; sysDimItem = {}; } else { sysDimItem = sysDimItemRaw; coordDim2 = sysDimItem.name; var ordinalMeta = sysDimItem.ordinalMeta; sysDimItem.ordinalMeta = null; sysDimItem = extend({}, sysDimItem); sysDimItem.ordinalMeta = ordinalMeta; sysDimItemDimsDef = sysDimItem.dimsDef; sysDimItemOtherDims = sysDimItem.otherDims; sysDimItem.name = sysDimItem.coordDim = sysDimItem.coordDimIndex = sysDimItem.dimsDef = sysDimItem.otherDims = null; } var dataDims = encodeDefMap.get(coordDim2); if (dataDims === false) { return; } dataDims = normalizeToArray(dataDims); if (!dataDims.length) { for (var i2 = 0; i2 < (sysDimItemDimsDef && sysDimItemDimsDef.length || 1); i2++) { while (availDimIdx < dimCount && getResultItem(availDimIdx).coordDim != null) { availDimIdx++; } availDimIdx < dimCount && dataDims.push(availDimIdx++); } } each$f(dataDims, function(resultDimIdx2, coordDimIndex) { var resultItem2 = getResultItem(resultDimIdx2); if (isUsingSourceDimensionsDef && sysDimItem.type != null) { resultItem2.type = sysDimItem.type; } applyDim(defaults(resultItem2, sysDimItem), coordDim2, coordDimIndex); if (resultItem2.name == null && sysDimItemDimsDef) { var sysDimItemDimsDefItem = sysDimItemDimsDef[coordDimIndex]; !isObject$3(sysDimItemDimsDefItem) && (sysDimItemDimsDefItem = { name: sysDimItemDimsDefItem }); resultItem2.name = resultItem2.displayName = sysDimItemDimsDefItem.name; resultItem2.defaultTooltip = sysDimItemDimsDefItem.defaultTooltip; } sysDimItemOtherDims && defaults(resultItem2.otherDims, sysDimItemOtherDims); }); }); function applyDim(resultItem2, coordDim2, coordDimIndex) { if (VISUAL_DIMENSIONS.get(coordDim2) != null) { resultItem2.otherDims[coordDim2] = coordDimIndex; } else { resultItem2.coordDim = coordDim2; resultItem2.coordDimIndex = coordDimIndex; coordDimNameMap.set(coordDim2, true); } } var generateCoord = opt.generateCoord; var generateCoordCount = opt.generateCoordCount; var fromZero = generateCoordCount != null; generateCoordCount = generateCoord ? generateCoordCount || 1 : 0; var extra = generateCoord || "value"; function ifNoNameFillWithCoordName(resultItem2) { if (resultItem2.name == null) { resultItem2.name = resultItem2.coordDim; } } if (!omitUnusedDimensions) { for (var resultDimIdx = 0; resultDimIdx < dimCount; resultDimIdx++) { var resultItem = getResultItem(resultDimIdx); var coordDim = resultItem.coordDim; if (coordDim == null) { resultItem.coordDim = genCoordDimName(extra, coordDimNameMap, fromZero); resultItem.coordDimIndex = 0; if (!generateCoord || generateCoordCount <= 0) { resultItem.isExtraCoord = true; } generateCoordCount--; } ifNoNameFillWithCoordName(resultItem); if (resultItem.type == null && (guessOrdinal(source, resultDimIdx) === BE_ORDINAL.Must || resultItem.isExtraCoord && (resultItem.otherDims.itemName != null || resultItem.otherDims.seriesName != null))) { resultItem.type = "ordinal"; } } } else { each$f(resultList, function(resultItem2) { ifNoNameFillWithCoordName(resultItem2); }); resultList.sort(function(item0, item1) { return item0.storeDimIndex - item1.storeDimIndex; }); } removeDuplication(resultList); return new SeriesDataSchema({ source, dimensions: resultList, fullDimensionCount: dimCount, dimensionOmitted: omitUnusedDimensions }); } function removeDuplication(result) { var duplicationMap = createHashMap(); for (var i = 0; i < result.length; i++) { var dim = result[i]; var dimOriginalName = dim.name; var count2 = duplicationMap.get(dimOriginalName) || 0; if (count2 > 0) { dim.name = dimOriginalName + (count2 - 1); } count2++; duplicationMap.set(dimOriginalName, count2); } } function getDimCount(source, sysDims, dimsDef, optDimCount) { var dimCount = Math.max(source.dimensionsDetectedCount || 1, sysDims.length, dimsDef.length, optDimCount || 0); each$f(sysDims, function(sysDimItem) { var sysDimItemDimsDef; if (isObject$3(sysDimItem) && (sysDimItemDimsDef = sysDimItem.dimsDef)) { dimCount = Math.max(dimCount, sysDimItemDimsDef.length); } }); return dimCount; } function genCoordDimName(name, map2, fromZero) { if (fromZero || map2.hasKey(name)) { var i = 0; while (map2.hasKey(name + i)) { i++; } name += i; } map2.set(name, true); return name; } var CoordSysInfo = ( /** @class */ /* @__PURE__ */ (function() { function CoordSysInfo2(coordSysName) { this.coordSysDims = []; this.axisMap = createHashMap(); this.categoryAxisMap = createHashMap(); this.coordSysName = coordSysName; } return CoordSysInfo2; })() ); function getCoordSysInfoBySeries(seriesModel) { var coordSysName = seriesModel.get("coordinateSystem"); var result = new CoordSysInfo(coordSysName); var fetch = fetchers[coordSysName]; if (fetch) { fetch(seriesModel, result, result.axisMap, result.categoryAxisMap); return result; } } var fetchers = { cartesian2d: function(seriesModel, result, axisMap, categoryAxisMap) { var xAxisModel = seriesModel.getReferringComponents("xAxis", SINGLE_REFERRING).models[0]; var yAxisModel = seriesModel.getReferringComponents("yAxis", SINGLE_REFERRING).models[0]; result.coordSysDims = ["x", "y"]; axisMap.set("x", xAxisModel); axisMap.set("y", yAxisModel); if (isCategory(xAxisModel)) { categoryAxisMap.set("x", xAxisModel); result.firstCategoryDimIndex = 0; } if (isCategory(yAxisModel)) { categoryAxisMap.set("y", yAxisModel); result.firstCategoryDimIndex == null && (result.firstCategoryDimIndex = 1); } }, singleAxis: function(seriesModel, result, axisMap, categoryAxisMap) { var singleAxisModel = seriesModel.getReferringComponents("singleAxis", SINGLE_REFERRING).models[0]; result.coordSysDims = ["single"]; axisMap.set("single", singleAxisModel); if (isCategory(singleAxisModel)) { categoryAxisMap.set("single", singleAxisModel); result.firstCategoryDimIndex = 0; } }, polar: function(seriesModel, result, axisMap, categoryAxisMap) { var polarModel = seriesModel.getReferringComponents("polar", SINGLE_REFERRING).models[0]; var radiusAxisModel = polarModel.findAxisModel("radiusAxis"); var angleAxisModel = polarModel.findAxisModel("angleAxis"); result.coordSysDims = ["radius", "angle"]; axisMap.set("radius", radiusAxisModel); axisMap.set("angle", angleAxisModel); if (isCategory(radiusAxisModel)) { categoryAxisMap.set("radius", radiusAxisModel); result.firstCategoryDimIndex = 0; } if (isCategory(angleAxisModel)) { categoryAxisMap.set("angle", angleAxisModel); result.firstCategoryDimIndex == null && (result.firstCategoryDimIndex = 1); } }, geo: function(seriesModel, result, axisMap, categoryAxisMap) { result.coordSysDims = ["lng", "lat"]; }, parallel: function(seriesModel, result, axisMap, categoryAxisMap) { var ecModel = seriesModel.ecModel; var parallelModel = ecModel.getComponent("parallel", seriesModel.get("parallelIndex")); var coordSysDims = result.coordSysDims = parallelModel.dimensions.slice(); each$f(parallelModel.parallelAxisIndex, function(axisIndex, index) { var axisModel = ecModel.getComponent("parallelAxis", axisIndex); var axisDim = coordSysDims[index]; axisMap.set(axisDim, axisModel); if (isCategory(axisModel)) { categoryAxisMap.set(axisDim, axisModel); if (result.firstCategoryDimIndex == null) { result.firstCategoryDimIndex = index; } } }); } }; function isCategory(axisModel) { return axisModel.get("type") === "category"; } function enableDataStack(seriesModel, dimensionsInput, opt) { opt = opt || {}; var byIndex = opt.byIndex; var stackedCoordDimension = opt.stackedCoordDimension; var dimensionDefineList; var schema; var store; if (isLegacyDimensionsInput(dimensionsInput)) { dimensionDefineList = dimensionsInput; } else { schema = dimensionsInput.schema; dimensionDefineList = schema.dimensions; store = dimensionsInput.store; } var mayStack = !!(seriesModel && seriesModel.get("stack")); var stackedByDimInfo; var stackedDimInfo; var stackResultDimension; var stackedOverDimension; each$f(dimensionDefineList, function(dimensionInfo, index) { if (isString(dimensionInfo)) { dimensionDefineList[index] = dimensionInfo = { name: dimensionInfo }; } if (mayStack && !dimensionInfo.isExtraCoord) { if (!byIndex && !stackedByDimInfo && dimensionInfo.ordinalMeta) { stackedByDimInfo = dimensionInfo; } if (!stackedDimInfo && dimensionInfo.type !== "ordinal" && dimensionInfo.type !== "time" && (!stackedCoordDimension || stackedCoordDimension === dimensionInfo.coordDim)) { stackedDimInfo = dimensionInfo; } } }); if (stackedDimInfo && !byIndex && !stackedByDimInfo) { byIndex = true; } if (stackedDimInfo) { stackResultDimension = "__\0ecstackresult_" + seriesModel.id; stackedOverDimension = "__\0ecstackedover_" + seriesModel.id; if (stackedByDimInfo) { stackedByDimInfo.createInvertedIndices = true; } var stackedDimCoordDim_1 = stackedDimInfo.coordDim; var stackedDimType = stackedDimInfo.type; var stackedDimCoordIndex_1 = 0; each$f(dimensionDefineList, function(dimensionInfo) { if (dimensionInfo.coordDim === stackedDimCoordDim_1) { stackedDimCoordIndex_1++; } }); var stackedOverDimensionDefine = { name: stackResultDimension, coordDim: stackedDimCoordDim_1, coordDimIndex: stackedDimCoordIndex_1, type: stackedDimType, isExtraCoord: true, isCalculationCoord: true, storeDimIndex: dimensionDefineList.length }; var stackResultDimensionDefine = { name: stackedOverDimension, // This dimension contains stack base (generally, 0), so do not set it as // `stackedDimCoordDim` to avoid extent calculation, consider log scale. coordDim: stackedOverDimension, coordDimIndex: stackedDimCoordIndex_1 + 1, type: stackedDimType, isExtraCoord: true, isCalculationCoord: true, storeDimIndex: dimensionDefineList.length + 1 }; if (schema) { if (store) { stackedOverDimensionDefine.storeDimIndex = store.ensureCalculationDimension(stackedOverDimension, stackedDimType); stackResultDimensionDefine.storeDimIndex = store.ensureCalculationDimension(stackResultDimension, stackedDimType); } schema.appendCalculationDimension(stackedOverDimensionDefine); schema.appendCalculationDimension(stackResultDimensionDefine); } else { dimensionDefineList.push(stackedOverDimensionDefine); dimensionDefineList.push(stackResultDimensionDefine); } } return { stackedDimension: stackedDimInfo && stackedDimInfo.name, stackedByDimension: stackedByDimInfo && stackedByDimInfo.name, isStackedByIndex: byIndex, stackedOverDimension, stackResultDimension }; } function isLegacyDimensionsInput(dimensionsInput) { return !isSeriesDataSchema(dimensionsInput.schema); } function isDimensionStacked(data, stackedDim) { return !!stackedDim && stackedDim === data.getCalculationInfo("stackedDimension"); } function getStackedDimension(data, targetDim) { return isDimensionStacked(data, targetDim) ? data.getCalculationInfo("stackResultDimension") : targetDim; } function getCoordSysDimDefs(seriesModel, coordSysInfo) { var coordSysName = seriesModel.get("coordinateSystem"); var registeredCoordSys = CoordinateSystemManager.get(coordSysName); var coordSysDimDefs; if (coordSysInfo && coordSysInfo.coordSysDims) { coordSysDimDefs = map$1(coordSysInfo.coordSysDims, function(dim) { var dimInfo = { name: dim }; var axisModel = coordSysInfo.axisMap.get(dim); if (axisModel) { var axisType = axisModel.get("type"); dimInfo.type = getDimensionTypeByAxis(axisType); } return dimInfo; }); } if (!coordSysDimDefs) { coordSysDimDefs = registeredCoordSys && (registeredCoordSys.getDimensionsInfo ? registeredCoordSys.getDimensionsInfo() : registeredCoordSys.dimensions.slice()) || ["x", "y"]; } return coordSysDimDefs; } function injectOrdinalMeta(dimInfoList, createInvertedIndices, coordSysInfo) { var firstCategoryDimIndex; var hasNameEncode; coordSysInfo && each$f(dimInfoList, function(dimInfo, dimIndex) { var coordDim = dimInfo.coordDim; var categoryAxisModel = coordSysInfo.categoryAxisMap.get(coordDim); if (categoryAxisModel) { if (firstCategoryDimIndex == null) { firstCategoryDimIndex = dimIndex; } dimInfo.ordinalMeta = categoryAxisModel.getOrdinalMeta(); if (createInvertedIndices) { dimInfo.createInvertedIndices = true; } } if (dimInfo.otherDims.itemName != null) { hasNameEncode = true; } }); if (!hasNameEncode && firstCategoryDimIndex != null) { dimInfoList[firstCategoryDimIndex].otherDims.itemName = 0; } return firstCategoryDimIndex; } function createSeriesData(sourceRaw, seriesModel, opt) { opt = opt || {}; var sourceManager = seriesModel.getSourceManager(); var source; var isOriginalSource = false; if (sourceRaw) { isOriginalSource = true; source = createSourceFromSeriesDataOption(sourceRaw); } else { source = sourceManager.getSource(); isOriginalSource = source.sourceFormat === SOURCE_FORMAT_ORIGINAL; } var coordSysInfo = getCoordSysInfoBySeries(seriesModel); var coordSysDimDefs = getCoordSysDimDefs(seriesModel, coordSysInfo); var useEncodeDefaulter = opt.useEncodeDefaulter; var encodeDefaulter = isFunction(useEncodeDefaulter) ? useEncodeDefaulter : useEncodeDefaulter ? curry$1(makeSeriesEncodeForAxisCoordSys, coordSysDimDefs, seriesModel) : null; var createDimensionOptions = { coordDimensions: coordSysDimDefs, generateCoord: opt.generateCoord, encodeDefine: seriesModel.getEncode(), encodeDefaulter, canOmitUnusedDimensions: !isOriginalSource }; var schema = prepareSeriesDataSchema(source, createDimensionOptions); var firstCategoryDimIndex = injectOrdinalMeta(schema.dimensions, opt.createInvertedIndices, coordSysInfo); var store = !isOriginalSource ? sourceManager.getSharedDataStore(schema) : null; var stackCalculationInfo = enableDataStack(seriesModel, { schema, store }); var data = new SeriesData(schema, seriesModel); data.setCalculationInfo(stackCalculationInfo); var dimValueGetter = firstCategoryDimIndex != null && isNeedCompleteOrdinalData(source) ? function(itemOpt, dimName, dataIndex, dimIndex) { return dimIndex === firstCategoryDimIndex ? dataIndex : this.defaultDimValueGetter(itemOpt, dimName, dataIndex, dimIndex); } : null; data.hasItemOption = false; data.initData( // Try to reuse the data store in sourceManager if using dataset. isOriginalSource ? source : store, null, dimValueGetter ); return data; } function isNeedCompleteOrdinalData(source) { if (source.sourceFormat === SOURCE_FORMAT_ORIGINAL) { var sampleItem = firstDataNotNull(source.data || []); return !isArray$1(getDataItemValue(sampleItem)); } } function firstDataNotNull(arr) { var i = 0; while (i < arr.length && arr[i] == null) { i++; } return arr[i]; } var Scale = ( /** @class */ (function() { function Scale2(setting) { this._setting = setting || {}; this._extent = [Infinity, -Infinity]; } Scale2.prototype.getSetting = function(name) { return this._setting[name]; }; Scale2.prototype.unionExtent = function(other) { var extent = this._extent; other[0] < extent[0] && (extent[0] = other[0]); other[1] > extent[1] && (extent[1] = other[1]); }; Scale2.prototype.unionExtentFromData = function(data, dim) { this.unionExtent(data.getApproximateExtent(dim)); }; Scale2.prototype.getExtent = function() { return this._extent.slice(); }; Scale2.prototype.setExtent = function(start, end) { var thisExtent = this._extent; if (!isNaN(start)) { thisExtent[0] = start; } if (!isNaN(end)) { thisExtent[1] = end; } }; Scale2.prototype.isInExtentRange = function(value) { return this._extent[0] <= value && this._extent[1] >= value; }; Scale2.prototype.isBlank = function() { return this._isBlank; }; Scale2.prototype.setBlank = function(isBlank) { this._isBlank = isBlank; }; return Scale2; })() ); enableClassManagement(Scale); var uidBase = 0; var OrdinalMeta = ( /** @class */ (function() { function OrdinalMeta2(opt) { this.categories = opt.categories || []; this._needCollect = opt.needCollect; this._deduplication = opt.deduplication; this.uid = ++uidBase; } OrdinalMeta2.createByAxisModel = function(axisModel) { var option = axisModel.option; var data = option.data; var categories = data && map$1(data, getName); return new OrdinalMeta2({ categories, needCollect: !categories, // deduplication is default in axis. deduplication: option.dedplication !== false }); }; OrdinalMeta2.prototype.getOrdinal = function(category) { return this._getOrCreateMap().get(category); }; OrdinalMeta2.prototype.parseAndCollect = function(category) { var index; var needCollect = this._needCollect; if (!isString(category) && !needCollect) { return category; } if (needCollect && !this._deduplication) { index = this.categories.length; this.categories[index] = category; return index; } var map2 = this._getOrCreateMap(); index = map2.get(category); if (index == null) { if (needCollect) { index = this.categories.length; this.categories[index] = category; map2.set(category, index); } else { index = NaN; } } return index; }; OrdinalMeta2.prototype._getOrCreateMap = function() { return this._map || (this._map = createHashMap(this.categories)); }; return OrdinalMeta2; })() ); function getName(obj) { if (isObject$3(obj) && obj.value != null) { return obj.value; } else { return obj + ""; } } function isIntervalOrLogScale(scale2) { return scale2.type === "interval" || scale2.type === "log"; } function intervalScaleNiceTicks(extent, splitNumber, minInterval, maxInterval) { var result = {}; var span = extent[1] - extent[0]; var interval = result.interval = nice(span / splitNumber); if (minInterval != null && interval < minInterval) { interval = result.interval = minInterval; } if (maxInterval != null && interval > maxInterval) { interval = result.interval = maxInterval; } var precision = result.intervalPrecision = getIntervalPrecision(interval); var niceTickExtent = result.niceTickExtent = [round$1(Math.ceil(extent[0] / interval) * interval, precision), round$1(Math.floor(extent[1] / interval) * interval, precision)]; fixExtent(niceTickExtent, extent); return result; } function increaseInterval(interval) { var exp10 = Math.pow(10, quantityExponent(interval)); var f = interval / exp10; if (!f) { f = 1; } else if (f === 2) { f = 3; } else if (f === 3) { f = 5; } else { f *= 2; } return round$1(f * exp10); } function getIntervalPrecision(interval) { return getPrecision(interval) + 2; } function clamp(niceTickExtent, idx, extent) { niceTickExtent[idx] = Math.max(Math.min(niceTickExtent[idx], extent[1]), extent[0]); } function fixExtent(niceTickExtent, extent) { !isFinite(niceTickExtent[0]) && (niceTickExtent[0] = extent[0]); !isFinite(niceTickExtent[1]) && (niceTickExtent[1] = extent[1]); clamp(niceTickExtent, 0, extent); clamp(niceTickExtent, 1, extent); if (niceTickExtent[0] > niceTickExtent[1]) { niceTickExtent[0] = niceTickExtent[1]; } } function contain(val, extent) { return val >= extent[0] && val <= extent[1]; } function normalize$2(val, extent) { if (extent[1] === extent[0]) { return 0.5; } return (val - extent[0]) / (extent[1] - extent[0]); } function scale(val, extent) { return val * (extent[1] - extent[0]) + extent[0]; } var OrdinalScale = ( /** @class */ (function(_super) { __extends(OrdinalScale2, _super); function OrdinalScale2(setting) { var _this = _super.call(this, setting) || this; _this.type = "ordinal"; var ordinalMeta = _this.getSetting("ordinalMeta"); if (!ordinalMeta) { ordinalMeta = new OrdinalMeta({}); } if (isArray$1(ordinalMeta)) { ordinalMeta = new OrdinalMeta({ categories: map$1(ordinalMeta, function(item) { return isObject$3(item) ? item.value : item; }) }); } _this._ordinalMeta = ordinalMeta; _this._extent = _this.getSetting("extent") || [0, ordinalMeta.categories.length - 1]; return _this; } OrdinalScale2.prototype.parse = function(val) { if (val == null) { return NaN; } return isString(val) ? this._ordinalMeta.getOrdinal(val) : Math.round(val); }; OrdinalScale2.prototype.contain = function(rank) { rank = this.parse(rank); return contain(rank, this._extent) && this._ordinalMeta.categories[rank] != null; }; OrdinalScale2.prototype.normalize = function(val) { val = this._getTickNumber(this.parse(val)); return normalize$2(val, this._extent); }; OrdinalScale2.prototype.scale = function(val) { val = Math.round(scale(val, this._extent)); return this.getRawOrdinalNumber(val); }; OrdinalScale2.prototype.getTicks = function() { var ticks = []; var extent = this._extent; var rank = extent[0]; while (rank <= extent[1]) { ticks.push({ value: rank }); rank++; } return ticks; }; OrdinalScale2.prototype.getMinorTicks = function(splitNumber) { return; }; OrdinalScale2.prototype.setSortInfo = function(info) { if (info == null) { this._ordinalNumbersByTick = this._ticksByOrdinalNumber = null; return; } var infoOrdinalNumbers = info.ordinalNumbers; var ordinalsByTick = this._ordinalNumbersByTick = []; var ticksByOrdinal = this._ticksByOrdinalNumber = []; var tickNum = 0; var allCategoryLen = this._ordinalMeta.categories.length; for (var len2 = Math.min(allCategoryLen, infoOrdinalNumbers.length); tickNum < len2; ++tickNum) { var ordinalNumber = infoOrdinalNumbers[tickNum]; ordinalsByTick[tickNum] = ordinalNumber; ticksByOrdinal[ordinalNumber] = tickNum; } var unusedOrdinal = 0; for (; tickNum < allCategoryLen; ++tickNum) { while (ticksByOrdinal[unusedOrdinal] != null) { unusedOrdinal++; } ordinalsByTick.push(unusedOrdinal); ticksByOrdinal[unusedOrdinal] = tickNum; } }; OrdinalScale2.prototype._getTickNumber = function(ordinal) { var ticksByOrdinalNumber = this._ticksByOrdinalNumber; return ticksByOrdinalNumber && ordinal >= 0 && ordinal < ticksByOrdinalNumber.length ? ticksByOrdinalNumber[ordinal] : ordinal; }; OrdinalScale2.prototype.getRawOrdinalNumber = function(tickNumber) { var ordinalNumbersByTick = this._ordinalNumbersByTick; return ordinalNumbersByTick && tickNumber >= 0 && tickNumber < ordinalNumbersByTick.length ? ordinalNumbersByTick[tickNumber] : tickNumber; }; OrdinalScale2.prototype.getLabel = function(tick) { if (!this.isBlank()) { var ordinalNumber = this.getRawOrdinalNumber(tick.value); var cateogry = this._ordinalMeta.categories[ordinalNumber]; return cateogry == null ? "" : cateogry + ""; } }; OrdinalScale2.prototype.count = function() { return this._extent[1] - this._extent[0] + 1; }; OrdinalScale2.prototype.unionExtentFromData = function(data, dim) { this.unionExtent(data.getApproximateExtent(dim)); }; OrdinalScale2.prototype.isInExtentRange = function(value) { value = this._getTickNumber(value); return this._extent[0] <= value && this._extent[1] >= value; }; OrdinalScale2.prototype.getOrdinalMeta = function() { return this._ordinalMeta; }; OrdinalScale2.prototype.calcNiceTicks = function() { }; OrdinalScale2.prototype.calcNiceExtent = function() { }; OrdinalScale2.type = "ordinal"; return OrdinalScale2; })(Scale) ); Scale.registerClass(OrdinalScale); var roundNumber = round$1; var IntervalScale = ( /** @class */ (function(_super) { __extends(IntervalScale2, _super); function IntervalScale2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = "interval"; _this._interval = 0; _this._intervalPrecision = 2; return _this; } IntervalScale2.prototype.parse = function(val) { return val; }; IntervalScale2.prototype.contain = function(val) { return contain(val, this._extent); }; IntervalScale2.prototype.normalize = function(val) { return normalize$2(val, this._extent); }; IntervalScale2.prototype.scale = function(val) { return scale(val, this._extent); }; IntervalScale2.prototype.setExtent = function(start, end) { var thisExtent = this._extent; if (!isNaN(start)) { thisExtent[0] = parseFloat(start); } if (!isNaN(end)) { thisExtent[1] = parseFloat(end); } }; IntervalScale2.prototype.unionExtent = function(other) { var extent = this._extent; other[0] < extent[0] && (extent[0] = other[0]); other[1] > extent[1] && (extent[1] = other[1]); this.setExtent(extent[0], extent[1]); }; IntervalScale2.prototype.getInterval = function() { return this._interval; }; IntervalScale2.prototype.setInterval = function(interval) { this._interval = interval; this._niceExtent = this._extent.slice(); this._intervalPrecision = getIntervalPrecision(interval); }; IntervalScale2.prototype.getTicks = function(expandToNicedExtent) { var interval = this._interval; var extent = this._extent; var niceTickExtent = this._niceExtent; var intervalPrecision = this._intervalPrecision; var ticks = []; if (!interval) { return ticks; } var safeLimit = 1e4; if (extent[0] < niceTickExtent[0]) { if (expandToNicedExtent) { ticks.push({ value: roundNumber(niceTickExtent[0] - interval, intervalPrecision) }); } else { ticks.push({ value: extent[0] }); } } var tick = niceTickExtent[0]; while (tick <= niceTickExtent[1]) { ticks.push({ value: tick }); tick = roundNumber(tick + interval, intervalPrecision); if (tick === ticks[ticks.length - 1].value) { break; } if (ticks.length > safeLimit) { return []; } } var lastNiceTick = ticks.length ? ticks[ticks.length - 1].value : niceTickExtent[1]; if (extent[1] > lastNiceTick) { if (expandToNicedExtent) { ticks.push({ value: roundNumber(lastNiceTick + interval, intervalPrecision) }); } else { ticks.push({ value: extent[1] }); } } return ticks; }; IntervalScale2.prototype.getMinorTicks = function(splitNumber) { var ticks = this.getTicks(true); var minorTicks = []; var extent = this.getExtent(); for (var i = 1; i < ticks.length; i++) { var nextTick = ticks[i]; var prevTick = ticks[i - 1]; var count2 = 0; var minorTicksGroup = []; var interval = nextTick.value - prevTick.value; var minorInterval = interval / splitNumber; while (count2 < splitNumber - 1) { var minorTick = roundNumber(prevTick.value + (count2 + 1) * minorInterval); if (minorTick > extent[0] && minorTick < extent[1]) { minorTicksGroup.push(minorTick); } count2++; } minorTicks.push(minorTicksGroup); } return minorTicks; }; IntervalScale2.prototype.getLabel = function(data, opt) { if (data == null) { return ""; } var precision = opt && opt.precision; if (precision == null) { precision = getPrecision(data.value) || 0; } else if (precision === "auto") { precision = this._intervalPrecision; } var dataNum = roundNumber(data.value, precision, true); return addCommas(dataNum); }; IntervalScale2.prototype.calcNiceTicks = function(splitNumber, minInterval, maxInterval) { splitNumber = splitNumber || 5; var extent = this._extent; var span = extent[1] - extent[0]; if (!isFinite(span)) { return; } if (span < 0) { span = -span; extent.reverse(); } var result = intervalScaleNiceTicks(extent, splitNumber, minInterval, maxInterval); this._intervalPrecision = result.intervalPrecision; this._interval = result.interval; this._niceExtent = result.niceTickExtent; }; IntervalScale2.prototype.calcNiceExtent = function(opt) { var extent = this._extent; if (extent[0] === extent[1]) { if (extent[0] !== 0) { var expandSize = Math.abs(extent[0]); if (!opt.fixMax) { extent[1] += expandSize / 2; extent[0] -= expandSize / 2; } else { extent[0] -= expandSize / 2; } } else { extent[1] = 1; } } var span = extent[1] - extent[0]; if (!isFinite(span)) { extent[0] = 0; extent[1] = 1; } this.calcNiceTicks(opt.splitNumber, opt.minInterval, opt.maxInterval); var interval = this._interval; if (!opt.fixMin) { extent[0] = roundNumber(Math.floor(extent[0] / interval) * interval); } if (!opt.fixMax) { extent[1] = roundNumber(Math.ceil(extent[1] / interval) * interval); } }; IntervalScale2.prototype.setNiceExtent = function(min2, max2) { this._niceExtent = [min2, max2]; }; IntervalScale2.type = "interval"; return IntervalScale2; })(Scale) ); Scale.registerClass(IntervalScale); var supportFloat32Array = typeof Float32Array !== "undefined"; var Float32ArrayCtor = !supportFloat32Array ? Array : Float32Array; function createFloat32Array(arg) { if (isArray$1(arg)) { return supportFloat32Array ? new Float32Array(arg) : arg; } return new Float32ArrayCtor(arg); } var STACK_PREFIX = "__ec_stack_"; function getSeriesStackId$1(seriesModel) { return seriesModel.get("stack") || STACK_PREFIX + seriesModel.seriesIndex; } function getAxisKey$1(axis) { return axis.dim + axis.index; } function getLayoutOnAxis(opt) { var params = []; var baseAxis = opt.axis; var axisKey = "axis0"; if (baseAxis.type !== "category") { return; } var bandWidth = baseAxis.getBandWidth(); for (var i = 0; i < opt.count || 0; i++) { params.push(defaults({ bandWidth, axisKey, stackId: STACK_PREFIX + i }, opt)); } var widthAndOffsets = doCalBarWidthAndOffset(params); var result = []; for (var i = 0; i < opt.count; i++) { var item = widthAndOffsets[axisKey][STACK_PREFIX + i]; item.offsetCenter = item.offset + item.width / 2; result.push(item); } return result; } function prepareLayoutBarSeries(seriesType2, ecModel) { var seriesModels = []; ecModel.eachSeriesByType(seriesType2, function(seriesModel) { if (isOnCartesian(seriesModel)) { seriesModels.push(seriesModel); } }); return seriesModels; } function getValueAxesMinGaps(barSeries) { var axisValues = {}; each$f(barSeries, function(seriesModel) { var cartesian = seriesModel.coordinateSystem; var baseAxis = cartesian.getBaseAxis(); if (baseAxis.type !== "time" && baseAxis.type !== "value") { return; } var data = seriesModel.getData(); var key2 = baseAxis.dim + "_" + baseAxis.index; var dimIdx = data.getDimensionIndex(data.mapDimension(baseAxis.dim)); var store = data.getStore(); for (var i = 0, cnt = store.count(); i < cnt; ++i) { var value = store.get(dimIdx, i); if (!axisValues[key2]) { axisValues[key2] = [value]; } else { axisValues[key2].push(value); } } }); var axisMinGaps = {}; for (var key in axisValues) { if (axisValues.hasOwnProperty(key)) { var valuesInAxis = axisValues[key]; if (valuesInAxis) { valuesInAxis.sort(function(a, b) { return a - b; }); var min2 = null; for (var j = 1; j < valuesInAxis.length; ++j) { var delta = valuesInAxis[j] - valuesInAxis[j - 1]; if (delta > 0) { min2 = min2 === null ? delta : Math.min(min2, delta); } } axisMinGaps[key] = min2; } } } return axisMinGaps; } function makeColumnLayout(barSeries) { var axisMinGaps = getValueAxesMinGaps(barSeries); var seriesInfoList = []; each$f(barSeries, function(seriesModel) { var cartesian = seriesModel.coordinateSystem; var baseAxis = cartesian.getBaseAxis(); var axisExtent = baseAxis.getExtent(); var bandWidth; if (baseAxis.type === "category") { bandWidth = baseAxis.getBandWidth(); } else if (baseAxis.type === "value" || baseAxis.type === "time") { var key = baseAxis.dim + "_" + baseAxis.index; var minGap = axisMinGaps[key]; var extentSpan = Math.abs(axisExtent[1] - axisExtent[0]); var scale2 = baseAxis.scale.getExtent(); var scaleSpan = Math.abs(scale2[1] - scale2[0]); bandWidth = minGap ? extentSpan / scaleSpan * minGap : extentSpan; } else { var data = seriesModel.getData(); bandWidth = Math.abs(axisExtent[1] - axisExtent[0]) / data.count(); } var barWidth = parsePercent(seriesModel.get("barWidth"), bandWidth); var barMaxWidth = parsePercent(seriesModel.get("barMaxWidth"), bandWidth); var barMinWidth = parsePercent( // barMinWidth by default is 0.5 / 1 in cartesian. Because in value axis, // the auto-calculated bar width might be less than 0.5 / 1. seriesModel.get("barMinWidth") || (isInLargeMode(seriesModel) ? 0.5 : 1), bandWidth ); var barGap = seriesModel.get("barGap"); var barCategoryGap = seriesModel.get("barCategoryGap"); seriesInfoList.push({ bandWidth, barWidth, barMaxWidth, barMinWidth, barGap, barCategoryGap, axisKey: getAxisKey$1(baseAxis), stackId: getSeriesStackId$1(seriesModel) }); }); return doCalBarWidthAndOffset(seriesInfoList); } function doCalBarWidthAndOffset(seriesInfoList) { var columnsMap = {}; each$f(seriesInfoList, function(seriesInfo, idx) { var axisKey = seriesInfo.axisKey; var bandWidth = seriesInfo.bandWidth; var columnsOnAxis = columnsMap[axisKey] || { bandWidth, remainedWidth: bandWidth, autoWidthCount: 0, categoryGap: null, gap: "20%", stacks: {} }; var stacks = columnsOnAxis.stacks; columnsMap[axisKey] = columnsOnAxis; var stackId = seriesInfo.stackId; if (!stacks[stackId]) { columnsOnAxis.autoWidthCount++; } stacks[stackId] = stacks[stackId] || { width: 0, maxWidth: 0 }; var barWidth = seriesInfo.barWidth; if (barWidth && !stacks[stackId].width) { stacks[stackId].width = barWidth; barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth); columnsOnAxis.remainedWidth -= barWidth; } var barMaxWidth = seriesInfo.barMaxWidth; barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth); var barMinWidth = seriesInfo.barMinWidth; barMinWidth && (stacks[stackId].minWidth = barMinWidth); var barGap = seriesInfo.barGap; barGap != null && (columnsOnAxis.gap = barGap); var barCategoryGap = seriesInfo.barCategoryGap; barCategoryGap != null && (columnsOnAxis.categoryGap = barCategoryGap); }); var result = {}; each$f(columnsMap, function(columnsOnAxis, coordSysName) { result[coordSysName] = {}; var stacks = columnsOnAxis.stacks; var bandWidth = columnsOnAxis.bandWidth; var categoryGapPercent = columnsOnAxis.categoryGap; if (categoryGapPercent == null) { var columnCount = keys(stacks).length; categoryGapPercent = Math.max(35 - columnCount * 4, 15) + "%"; } var categoryGap = parsePercent(categoryGapPercent, bandWidth); var barGapPercent = parsePercent(columnsOnAxis.gap, 1); var remainedWidth = columnsOnAxis.remainedWidth; var autoWidthCount = columnsOnAxis.autoWidthCount; var autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); autoWidth = Math.max(autoWidth, 0); each$f(stacks, function(column) { var maxWidth = column.maxWidth; var minWidth = column.minWidth; if (!column.width) { var finalWidth = autoWidth; if (maxWidth && maxWidth < finalWidth) { finalWidth = Math.min(maxWidth, remainedWidth); } if (minWidth && minWidth > finalWidth) { finalWidth = minWidth; } if (finalWidth !== autoWidth) { column.width = finalWidth; remainedWidth -= finalWidth + barGapPercent * finalWidth; autoWidthCount--; } } else { var finalWidth = column.width; if (maxWidth) { finalWidth = Math.min(finalWidth, maxWidth); } if (minWidth) { finalWidth = Math.max(finalWidth, minWidth); } column.width = finalWidth; remainedWidth -= finalWidth + barGapPercent * finalWidth; autoWidthCount--; } }); autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); autoWidth = Math.max(autoWidth, 0); var widthSum = 0; var lastColumn; each$f(stacks, function(column, idx) { if (!column.width) { column.width = autoWidth; } lastColumn = column; widthSum += column.width * (1 + barGapPercent); }); if (lastColumn) { widthSum -= lastColumn.width * barGapPercent; } var offset = -widthSum / 2; each$f(stacks, function(column, stackId) { result[coordSysName][stackId] = result[coordSysName][stackId] || { bandWidth, offset, width: column.width }; offset += column.width * (1 + barGapPercent); }); }); return result; } function retrieveColumnLayout(barWidthAndOffset, axis, seriesModel) { if (barWidthAndOffset && axis) { var result = barWidthAndOffset[getAxisKey$1(axis)]; return result; } } function layout$3(seriesType2, ecModel) { var seriesModels = prepareLayoutBarSeries(seriesType2, ecModel); var barWidthAndOffset = makeColumnLayout(seriesModels); each$f(seriesModels, function(seriesModel) { var data = seriesModel.getData(); var cartesian = seriesModel.coordinateSystem; var baseAxis = cartesian.getBaseAxis(); var stackId = getSeriesStackId$1(seriesModel); var columnLayoutInfo = barWidthAndOffset[getAxisKey$1(baseAxis)][stackId]; var columnOffset = columnLayoutInfo.offset; var columnWidth = columnLayoutInfo.width; data.setLayout({ bandWidth: columnLayoutInfo.bandWidth, offset: columnOffset, size: columnWidth }); }); } function createProgressiveLayout(seriesType2) { return { seriesType: seriesType2, plan: createRenderPlanner(), reset: function(seriesModel) { if (!isOnCartesian(seriesModel)) { return; } var data = seriesModel.getData(); var cartesian = seriesModel.coordinateSystem; var baseAxis = cartesian.getBaseAxis(); var valueAxis2 = cartesian.getOtherAxis(baseAxis); var valueDimIdx = data.getDimensionIndex(data.mapDimension(valueAxis2.dim)); var baseDimIdx = data.getDimensionIndex(data.mapDimension(baseAxis.dim)); var drawBackground = seriesModel.get("showBackground", true); var valueDim = data.mapDimension(valueAxis2.dim); var stackResultDim = data.getCalculationInfo("stackResultDimension"); var stacked = isDimensionStacked(data, valueDim) && !!data.getCalculationInfo("stackedOnSeries"); var isValueAxisH = valueAxis2.isHorizontal(); var valueAxisStart = getValueAxisStart(baseAxis, valueAxis2); var isLarge = isInLargeMode(seriesModel); var barMinHeight = seriesModel.get("barMinHeight") || 0; var stackedDimIdx = stackResultDim && data.getDimensionIndex(stackResultDim); var columnWidth = data.getLayout("size"); var columnOffset = data.getLayout("offset"); return { progress: function(params, data2) { var count2 = params.count; var largePoints = isLarge && createFloat32Array(count2 * 3); var largeBackgroundPoints = isLarge && drawBackground && createFloat32Array(count2 * 3); var largeDataIndices = isLarge && createFloat32Array(count2); var coordLayout = cartesian.master.getRect(); var bgSize = isValueAxisH ? coordLayout.width : coordLayout.height; var dataIndex; var store = data2.getStore(); var idxOffset = 0; while ((dataIndex = params.next()) != null) { var value = store.get(stacked ? stackedDimIdx : valueDimIdx, dataIndex); var baseValue = store.get(baseDimIdx, dataIndex); var baseCoord = valueAxisStart; var stackStartValue = void 0; if (stacked) { stackStartValue = +value - store.get(valueDimIdx, dataIndex); } var x = void 0; var y = void 0; var width = void 0; var height = void 0; if (isValueAxisH) { var coord = cartesian.dataToPoint([value, baseValue]); if (stacked) { var startCoord = cartesian.dataToPoint([stackStartValue, baseValue]); baseCoord = startCoord[0]; } x = baseCoord; y = coord[1] + columnOffset; width = coord[0] - baseCoord; height = columnWidth; if (Math.abs(width) < barMinHeight) { width = (width < 0 ? -1 : 1) * barMinHeight; } } else { var coord = cartesian.dataToPoint([baseValue, value]); if (stacked) { var startCoord = cartesian.dataToPoint([baseValue, stackStartValue]); baseCoord = startCoord[1]; } x = coord[0] + columnOffset; y = baseCoord; width = columnWidth; height = coord[1] - baseCoord; if (Math.abs(height) < barMinHeight) { height = (height <= 0 ? -1 : 1) * barMinHeight; } } if (!isLarge) { data2.setItemLayout(dataIndex, { x, y, width, height }); } else { largePoints[idxOffset] = x; largePoints[idxOffset + 1] = y; largePoints[idxOffset + 2] = isValueAxisH ? width : height; if (largeBackgroundPoints) { largeBackgroundPoints[idxOffset] = isValueAxisH ? coordLayout.x : x; largeBackgroundPoints[idxOffset + 1] = isValueAxisH ? y : coordLayout.y; largeBackgroundPoints[idxOffset + 2] = bgSize; } largeDataIndices[dataIndex] = dataIndex; } idxOffset += 3; } if (isLarge) { data2.setLayout({ largePoints, largeDataIndices, largeBackgroundPoints, valueAxisHorizontal: isValueAxisH }); } } }; } }; } function isOnCartesian(seriesModel) { return seriesModel.coordinateSystem && seriesModel.coordinateSystem.type === "cartesian2d"; } function isInLargeMode(seriesModel) { return seriesModel.pipelineContext && seriesModel.pipelineContext.large; } function getValueAxisStart(baseAxis, valueAxis2) { var startValue = valueAxis2.model.get("startValue"); if (!startValue) { startValue = 0; } return valueAxis2.toGlobalCoord(valueAxis2.dataToCoord(valueAxis2.type === "log" ? startValue > 0 ? startValue : 1 : startValue)); } var bisect = function(a, x, lo, hi) { while (lo < hi) { var mid = lo + hi >>> 1; if (a[mid][1] < x) { lo = mid + 1; } else { hi = mid; } } return lo; }; var TimeScale = ( /** @class */ (function(_super) { __extends(TimeScale2, _super); function TimeScale2(settings) { var _this = _super.call(this, settings) || this; _this.type = "time"; return _this; } TimeScale2.prototype.getLabel = function(tick) { var useUTC = this.getSetting("useUTC"); return format(tick.value, fullLeveledFormatter[getDefaultFormatPrecisionOfInterval(getPrimaryTimeUnit(this._minLevelUnit))] || fullLeveledFormatter.second, useUTC, this.getSetting("locale")); }; TimeScale2.prototype.getFormattedLabel = function(tick, idx, labelFormatter) { var isUTC = this.getSetting("useUTC"); var lang = this.getSetting("locale"); return leveledFormat(tick, idx, labelFormatter, lang, isUTC); }; TimeScale2.prototype.getTicks = function() { var interval = this._interval; var extent = this._extent; var ticks = []; if (!interval) { return ticks; } ticks.push({ value: extent[0], level: 0 }); var useUTC = this.getSetting("useUTC"); var innerTicks = getIntervalTicks(this._minLevelUnit, this._approxInterval, useUTC, extent); ticks = ticks.concat(innerTicks); ticks.push({ value: extent[1], level: 0 }); return ticks; }; TimeScale2.prototype.calcNiceExtent = function(opt) { var extent = this._extent; if (extent[0] === extent[1]) { extent[0] -= ONE_DAY; extent[1] += ONE_DAY; } if (extent[1] === -Infinity && extent[0] === Infinity) { var d = /* @__PURE__ */ new Date(); extent[1] = +new Date(d.getFullYear(), d.getMonth(), d.getDate()); extent[0] = extent[1] - ONE_DAY; } this.calcNiceTicks(opt.splitNumber, opt.minInterval, opt.maxInterval); }; TimeScale2.prototype.calcNiceTicks = function(approxTickNum, minInterval, maxInterval) { approxTickNum = approxTickNum || 10; var extent = this._extent; var span = extent[1] - extent[0]; this._approxInterval = span / approxTickNum; if (minInterval != null && this._approxInterval < minInterval) { this._approxInterval = minInterval; } if (maxInterval != null && this._approxInterval > maxInterval) { this._approxInterval = maxInterval; } var scaleIntervalsLen = scaleIntervals.length; var idx = Math.min(bisect(scaleIntervals, this._approxInterval, 0, scaleIntervalsLen), scaleIntervalsLen - 1); this._interval = scaleIntervals[idx][1]; this._minLevelUnit = scaleIntervals[Math.max(idx - 1, 0)][0]; }; TimeScale2.prototype.parse = function(val) { return isNumber(val) ? val : +parseDate(val); }; TimeScale2.prototype.contain = function(val) { return contain(this.parse(val), this._extent); }; TimeScale2.prototype.normalize = function(val) { return normalize$2(this.parse(val), this._extent); }; TimeScale2.prototype.scale = function(val) { return scale(val, this._extent); }; TimeScale2.type = "time"; return TimeScale2; })(IntervalScale) ); var scaleIntervals = [ // Format interval ["second", ONE_SECOND], ["minute", ONE_MINUTE], ["hour", ONE_HOUR], ["quarter-day", ONE_HOUR * 6], ["half-day", ONE_HOUR * 12], ["day", ONE_DAY * 1.2], ["half-week", ONE_DAY * 3.5], ["week", ONE_DAY * 7], ["month", ONE_DAY * 31], ["quarter", ONE_DAY * 95], ["half-year", ONE_YEAR / 2], ["year", ONE_YEAR] // 1Y ]; function isUnitValueSame(unit, valueA, valueB, isUTC) { var dateA = parseDate(valueA); var dateB = parseDate(valueB); var isSame = function(unit2) { return getUnitValue(dateA, unit2, isUTC) === getUnitValue(dateB, unit2, isUTC); }; var isSameYear = function() { return isSame("year"); }; var isSameMonth = function() { return isSameYear() && isSame("month"); }; var isSameDay = function() { return isSameMonth() && isSame("day"); }; var isSameHour = function() { return isSameDay() && isSame("hour"); }; var isSameMinute = function() { return isSameHour() && isSame("minute"); }; var isSameSecond = function() { return isSameMinute() && isSame("second"); }; var isSameMilliSecond = function() { return isSameSecond() && isSame("millisecond"); }; switch (unit) { case "year": return isSameYear(); case "month": return isSameMonth(); case "day": return isSameDay(); case "hour": return isSameHour(); case "minute": return isSameMinute(); case "second": return isSameSecond(); case "millisecond": return isSameMilliSecond(); } } function getDateInterval(approxInterval, daysInMonth) { approxInterval /= ONE_DAY; return approxInterval > 16 ? 16 : approxInterval > 7.5 ? 7 : approxInterval > 3.5 ? 4 : approxInterval > 1.5 ? 2 : 1; } function getMonthInterval(approxInterval) { var APPROX_ONE_MONTH = 30 * ONE_DAY; approxInterval /= APPROX_ONE_MONTH; return approxInterval > 6 ? 6 : approxInterval > 3 ? 3 : approxInterval > 2 ? 2 : 1; } function getHourInterval(approxInterval) { approxInterval /= ONE_HOUR; return approxInterval > 12 ? 12 : approxInterval > 6 ? 6 : approxInterval > 3.5 ? 4 : approxInterval > 2 ? 2 : 1; } function getMinutesAndSecondsInterval(approxInterval, isMinutes) { approxInterval /= isMinutes ? ONE_MINUTE : ONE_SECOND; return approxInterval > 30 ? 30 : approxInterval > 20 ? 20 : approxInterval > 15 ? 15 : approxInterval > 10 ? 10 : approxInterval > 5 ? 5 : approxInterval > 2 ? 2 : 1; } function getMillisecondsInterval(approxInterval) { return nice(approxInterval); } function getFirstTimestampOfUnit(date, unitName, isUTC) { var outDate = new Date(date); switch (getPrimaryTimeUnit(unitName)) { case "year": case "month": outDate[monthSetterName(isUTC)](0); case "day": outDate[dateSetterName(isUTC)](1); case "hour": outDate[hoursSetterName(isUTC)](0); case "minute": outDate[minutesSetterName(isUTC)](0); case "second": outDate[secondsSetterName(isUTC)](0); outDate[millisecondsSetterName(isUTC)](0); } return outDate.getTime(); } function getIntervalTicks(bottomUnitName, approxInterval, isUTC, extent) { var safeLimit = 1e4; var unitNames = timeUnits; var iter = 0; function addTicksInSpan(interval, minTimestamp, maxTimestamp, getMethodName, setMethodName, isDate, out) { var date = new Date(minTimestamp); var dateTime = minTimestamp; var d = date[getMethodName](); while (dateTime < maxTimestamp && dateTime <= extent[1]) { out.push({ value: dateTime }); d += interval; date[setMethodName](d); dateTime = date.getTime(); } out.push({ value: dateTime, notAdd: true }); } function addLevelTicks(unitName, lastLevelTicks, levelTicks2) { var newAddedTicks = []; var isFirstLevel = !lastLevelTicks.length; if (isUnitValueSame(getPrimaryTimeUnit(unitName), extent[0], extent[1], isUTC)) { return; } if (isFirstLevel) { lastLevelTicks = [{ // TODO Optimize. Not include so may ticks. value: getFirstTimestampOfUnit(new Date(extent[0]), unitName, isUTC) }, { value: extent[1] }]; } for (var i2 = 0; i2 < lastLevelTicks.length - 1; i2++) { var startTick = lastLevelTicks[i2].value; var endTick = lastLevelTicks[i2 + 1].value; if (startTick === endTick) { continue; } var interval = void 0; var getterName = void 0; var setterName = void 0; var isDate = false; switch (unitName) { case "year": interval = Math.max(1, Math.round(approxInterval / ONE_DAY / 365)); getterName = fullYearGetterName(isUTC); setterName = fullYearSetterName(isUTC); break; case "half-year": case "quarter": case "month": interval = getMonthInterval(approxInterval); getterName = monthGetterName(isUTC); setterName = monthSetterName(isUTC); break; case "week": // PENDING If week is added. Ignore day. case "half-week": case "day": interval = getDateInterval(approxInterval); getterName = dateGetterName(isUTC); setterName = dateSetterName(isUTC); isDate = true; break; case "half-day": case "quarter-day": case "hour": interval = getHourInterval(approxInterval); getterName = hoursGetterName(isUTC); setterName = hoursSetterName(isUTC); break; case "minute": interval = getMinutesAndSecondsInterval(approxInterval, true); getterName = minutesGetterName(isUTC); setterName = minutesSetterName(isUTC); break; case "second": interval = getMinutesAndSecondsInterval(approxInterval, false); getterName = secondsGetterName(isUTC); setterName = secondsSetterName(isUTC); break; case "millisecond": interval = getMillisecondsInterval(approxInterval); getterName = millisecondsGetterName(isUTC); setterName = millisecondsSetterName(isUTC); break; } addTicksInSpan(interval, startTick, endTick, getterName, setterName, isDate, newAddedTicks); if (unitName === "year" && levelTicks2.length > 1 && i2 === 0) { levelTicks2.unshift({ value: levelTicks2[0].value - interval }); } } for (var i2 = 0; i2 < newAddedTicks.length; i2++) { levelTicks2.push(newAddedTicks[i2]); } return newAddedTicks; } var levelsTicks = []; var currentLevelTicks = []; var tickCount = 0; var lastLevelTickCount = 0; for (var i = 0; i < unitNames.length && iter++ < safeLimit; ++i) { var primaryTimeUnit = getPrimaryTimeUnit(unitNames[i]); if (!isPrimaryTimeUnit(unitNames[i])) { continue; } addLevelTicks(unitNames[i], levelsTicks[levelsTicks.length - 1] || [], currentLevelTicks); var nextPrimaryTimeUnit = unitNames[i + 1] ? getPrimaryTimeUnit(unitNames[i + 1]) : null; if (primaryTimeUnit !== nextPrimaryTimeUnit) { if (currentLevelTicks.length) { lastLevelTickCount = tickCount; currentLevelTicks.sort(function(a, b) { return a.value - b.value; }); var levelTicksRemoveDuplicated = []; for (var i_1 = 0; i_1 < currentLevelTicks.length; ++i_1) { var tickValue = currentLevelTicks[i_1].value; if (i_1 === 0 || currentLevelTicks[i_1 - 1].value !== tickValue) { levelTicksRemoveDuplicated.push(currentLevelTicks[i_1]); if (tickValue >= extent[0] && tickValue <= extent[1]) { tickCount++; } } } var targetTickNum = (extent[1] - extent[0]) / approxInterval; if (tickCount > targetTickNum * 1.5 && lastLevelTickCount > targetTickNum / 1.5) { break; } levelsTicks.push(levelTicksRemoveDuplicated); if (tickCount > targetTickNum || bottomUnitName === unitNames[i]) { break; } } currentLevelTicks = []; } } var levelsTicksInExtent = filter(map$1(levelsTicks, function(levelTicks2) { return filter(levelTicks2, function(tick) { return tick.value >= extent[0] && tick.value <= extent[1] && !tick.notAdd; }); }), function(levelTicks2) { return levelTicks2.length > 0; }); var ticks = []; var maxLevel = levelsTicksInExtent.length - 1; for (var i = 0; i < levelsTicksInExtent.length; ++i) { var levelTicks = levelsTicksInExtent[i]; for (var k = 0; k < levelTicks.length; ++k) { ticks.push({ value: levelTicks[k].value, level: maxLevel - i }); } } ticks.sort(function(a, b) { return a.value - b.value; }); var result = []; for (var i = 0; i < ticks.length; ++i) { if (i === 0 || ticks[i].value !== ticks[i - 1].value) { result.push(ticks[i]); } } return result; } Scale.registerClass(TimeScale); var scaleProto = Scale.prototype; var intervalScaleProto = IntervalScale.prototype; var roundingErrorFix = round$1; var mathFloor$1 = Math.floor; var mathCeil$1 = Math.ceil; var mathPow$1 = Math.pow; var mathLog$1 = Math.log; var LogScale = ( /** @class */ (function(_super) { __extends(LogScale2, _super); function LogScale2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = "log"; _this.base = 10; _this._originalScale = new IntervalScale(); _this._interval = 0; return _this; } LogScale2.prototype.getTicks = function(expandToNicedExtent) { var originalScale = this._originalScale; var extent = this._extent; var originalExtent = originalScale.getExtent(); var ticks = intervalScaleProto.getTicks.call(this, expandToNicedExtent); return map$1(ticks, function(tick) { var val = tick.value; var powVal = round$1(mathPow$1(this.base, val)); powVal = val === extent[0] && this._fixMin ? fixRoundingError(powVal, originalExtent[0]) : powVal; powVal = val === extent[1] && this._fixMax ? fixRoundingError(powVal, originalExtent[1]) : powVal; return { value: powVal }; }, this); }; LogScale2.prototype.setExtent = function(start, end) { var base2 = mathLog$1(this.base); start = mathLog$1(Math.max(0, start)) / base2; end = mathLog$1(Math.max(0, end)) / base2; intervalScaleProto.setExtent.call(this, start, end); }; LogScale2.prototype.getExtent = function() { var base2 = this.base; var extent = scaleProto.getExtent.call(this); extent[0] = mathPow$1(base2, extent[0]); extent[1] = mathPow$1(base2, extent[1]); var originalScale = this._originalScale; var originalExtent = originalScale.getExtent(); this._fixMin && (extent[0] = fixRoundingError(extent[0], originalExtent[0])); this._fixMax && (extent[1] = fixRoundingError(extent[1], originalExtent[1])); return extent; }; LogScale2.prototype.unionExtent = function(extent) { this._originalScale.unionExtent(extent); var base2 = this.base; extent[0] = mathLog$1(extent[0]) / mathLog$1(base2); extent[1] = mathLog$1(extent[1]) / mathLog$1(base2); scaleProto.unionExtent.call(this, extent); }; LogScale2.prototype.unionExtentFromData = function(data, dim) { this.unionExtent(data.getApproximateExtent(dim)); }; LogScale2.prototype.calcNiceTicks = function(approxTickNum) { approxTickNum = approxTickNum || 10; var extent = this._extent; var span = extent[1] - extent[0]; if (span === Infinity || span <= 0) { return; } var interval = quantity(span); var err = approxTickNum / span * interval; if (err <= 0.5) { interval *= 10; } while (!isNaN(interval) && Math.abs(interval) < 1 && Math.abs(interval) > 0) { interval *= 10; } var niceExtent = [round$1(mathCeil$1(extent[0] / interval) * interval), round$1(mathFloor$1(extent[1] / interval) * interval)]; this._interval = interval; this._niceExtent = niceExtent; }; LogScale2.prototype.calcNiceExtent = function(opt) { intervalScaleProto.calcNiceExtent.call(this, opt); this._fixMin = opt.fixMin; this._fixMax = opt.fixMax; }; LogScale2.prototype.parse = function(val) { return val; }; LogScale2.prototype.contain = function(val) { val = mathLog$1(val) / mathLog$1(this.base); return contain(val, this._extent); }; LogScale2.prototype.normalize = function(val) { val = mathLog$1(val) / mathLog$1(this.base); return normalize$2(val, this._extent); }; LogScale2.prototype.scale = function(val) { val = scale(val, this._extent); return mathPow$1(this.base, val); }; LogScale2.type = "log"; return LogScale2; })(Scale) ); var proto = LogScale.prototype; proto.getMinorTicks = intervalScaleProto.getMinorTicks; proto.getLabel = intervalScaleProto.getLabel; function fixRoundingError(val, originalVal) { return roundingErrorFix(val, getPrecision(originalVal)); } Scale.registerClass(LogScale); var ScaleRawExtentInfo = ( /** @class */ (function() { function ScaleRawExtentInfo2(scale2, model, originalExtent) { this._prepareParams(scale2, model, originalExtent); } ScaleRawExtentInfo2.prototype._prepareParams = function(scale2, model, dataExtent) { if (dataExtent[1] < dataExtent[0]) { dataExtent = [NaN, NaN]; } this._dataMin = dataExtent[0]; this._dataMax = dataExtent[1]; var isOrdinal = this._isOrdinal = scale2.type === "ordinal"; this._needCrossZero = scale2.type === "interval" && model.getNeedCrossZero && model.getNeedCrossZero(); var axisMinValue = model.get("min", true); if (axisMinValue == null) { axisMinValue = model.get("startValue", true); } var modelMinRaw = this._modelMinRaw = axisMinValue; if (isFunction(modelMinRaw)) { this._modelMinNum = parseAxisModelMinMax(scale2, modelMinRaw({ min: dataExtent[0], max: dataExtent[1] })); } else if (modelMinRaw !== "dataMin") { this._modelMinNum = parseAxisModelMinMax(scale2, modelMinRaw); } var modelMaxRaw = this._modelMaxRaw = model.get("max", true); if (isFunction(modelMaxRaw)) { this._modelMaxNum = parseAxisModelMinMax(scale2, modelMaxRaw({ min: dataExtent[0], max: dataExtent[1] })); } else if (modelMaxRaw !== "dataMax") { this._modelMaxNum = parseAxisModelMinMax(scale2, modelMaxRaw); } if (isOrdinal) { this._axisDataLen = model.getCategories().length; } else { var boundaryGap = model.get("boundaryGap"); var boundaryGapArr = isArray$1(boundaryGap) ? boundaryGap : [boundaryGap || 0, boundaryGap || 0]; if (typeof boundaryGapArr[0] === "boolean" || typeof boundaryGapArr[1] === "boolean") { this._boundaryGapInner = [0, 0]; } else { this._boundaryGapInner = [parsePercent$1(boundaryGapArr[0], 1), parsePercent$1(boundaryGapArr[1], 1)]; } } }; ScaleRawExtentInfo2.prototype.calculate = function() { var isOrdinal = this._isOrdinal; var dataMin = this._dataMin; var dataMax = this._dataMax; var axisDataLen = this._axisDataLen; var boundaryGapInner = this._boundaryGapInner; var span = !isOrdinal ? dataMax - dataMin || Math.abs(dataMin) : null; var min2 = this._modelMinRaw === "dataMin" ? dataMin : this._modelMinNum; var max2 = this._modelMaxRaw === "dataMax" ? dataMax : this._modelMaxNum; var minFixed = min2 != null; var maxFixed = max2 != null; if (min2 == null) { min2 = isOrdinal ? axisDataLen ? 0 : NaN : dataMin - boundaryGapInner[0] * span; } if (max2 == null) { max2 = isOrdinal ? axisDataLen ? axisDataLen - 1 : NaN : dataMax + boundaryGapInner[1] * span; } (min2 == null || !isFinite(min2)) && (min2 = NaN); (max2 == null || !isFinite(max2)) && (max2 = NaN); var isBlank = eqNaN(min2) || eqNaN(max2) || isOrdinal && !axisDataLen; if (this._needCrossZero) { if (min2 > 0 && max2 > 0 && !minFixed) { min2 = 0; } if (min2 < 0 && max2 < 0 && !maxFixed) { max2 = 0; } } var determinedMin = this._determinedMin; var determinedMax = this._determinedMax; if (determinedMin != null) { min2 = determinedMin; minFixed = true; } if (determinedMax != null) { max2 = determinedMax; maxFixed = true; } return { min: min2, max: max2, minFixed, maxFixed, isBlank }; }; ScaleRawExtentInfo2.prototype.modifyDataMinMax = function(minMaxName, val) { this[DATA_MIN_MAX_ATTR[minMaxName]] = val; }; ScaleRawExtentInfo2.prototype.setDeterminedMinMax = function(minMaxName, val) { var attr = DETERMINED_MIN_MAX_ATTR[minMaxName]; this[attr] = val; }; ScaleRawExtentInfo2.prototype.freeze = function() { this.frozen = true; }; return ScaleRawExtentInfo2; })() ); var DETERMINED_MIN_MAX_ATTR = { min: "_determinedMin", max: "_determinedMax" }; var DATA_MIN_MAX_ATTR = { min: "_dataMin", max: "_dataMax" }; function ensureScaleRawExtentInfo(scale2, model, originalExtent) { var rawExtentInfo = scale2.rawExtentInfo; if (rawExtentInfo) { return rawExtentInfo; } rawExtentInfo = new ScaleRawExtentInfo(scale2, model, originalExtent); scale2.rawExtentInfo = rawExtentInfo; return rawExtentInfo; } function parseAxisModelMinMax(scale2, minMax) { return minMax == null ? null : eqNaN(minMax) ? NaN : scale2.parse(minMax); } function getScaleExtent(scale2, model) { var scaleType = scale2.type; var rawExtentResult = ensureScaleRawExtentInfo(scale2, model, scale2.getExtent()).calculate(); scale2.setBlank(rawExtentResult.isBlank); var min2 = rawExtentResult.min; var max2 = rawExtentResult.max; var ecModel = model.ecModel; if (ecModel && scaleType === "time") { var barSeriesModels = prepareLayoutBarSeries("bar", ecModel); var isBaseAxisAndHasBarSeries_1 = false; each$f(barSeriesModels, function(seriesModel) { isBaseAxisAndHasBarSeries_1 = isBaseAxisAndHasBarSeries_1 || seriesModel.getBaseAxis() === model.axis; }); if (isBaseAxisAndHasBarSeries_1) { var barWidthAndOffset = makeColumnLayout(barSeriesModels); var adjustedScale = adjustScaleForOverflow(min2, max2, model, barWidthAndOffset); min2 = adjustedScale.min; max2 = adjustedScale.max; } } return { extent: [min2, max2], // "fix" means "fixed", the value should not be // changed in the subsequent steps. fixMin: rawExtentResult.minFixed, fixMax: rawExtentResult.maxFixed }; } function adjustScaleForOverflow(min2, max2, model, barWidthAndOffset) { var axisExtent = model.axis.getExtent(); var axisLength = Math.abs(axisExtent[1] - axisExtent[0]); var barsOnCurrentAxis = retrieveColumnLayout(barWidthAndOffset, model.axis); if (barsOnCurrentAxis === void 0) { return { min: min2, max: max2 }; } var minOverflow = Infinity; each$f(barsOnCurrentAxis, function(item) { minOverflow = Math.min(item.offset, minOverflow); }); var maxOverflow = -Infinity; each$f(barsOnCurrentAxis, function(item) { maxOverflow = Math.max(item.offset + item.width, maxOverflow); }); minOverflow = Math.abs(minOverflow); maxOverflow = Math.abs(maxOverflow); var totalOverFlow = minOverflow + maxOverflow; var oldRange = max2 - min2; var oldRangePercentOfNew = 1 - (minOverflow + maxOverflow) / axisLength; var overflowBuffer = oldRange / oldRangePercentOfNew - oldRange; max2 += overflowBuffer * (maxOverflow / totalOverFlow); min2 -= overflowBuffer * (minOverflow / totalOverFlow); return { min: min2, max: max2 }; } function niceScaleExtent(scale2, inModel) { var model = inModel; var extentInfo = getScaleExtent(scale2, model); var extent = extentInfo.extent; var splitNumber = model.get("splitNumber"); if (scale2 instanceof LogScale) { scale2.base = model.get("logBase"); } var scaleType = scale2.type; var interval = model.get("interval"); var isIntervalOrTime = scaleType === "interval" || scaleType === "time"; scale2.setExtent(extent[0], extent[1]); scale2.calcNiceExtent({ splitNumber, fixMin: extentInfo.fixMin, fixMax: extentInfo.fixMax, minInterval: isIntervalOrTime ? model.get("minInterval") : null, maxInterval: isIntervalOrTime ? model.get("maxInterval") : null }); if (interval != null) { scale2.setInterval && scale2.setInterval(interval); } } function createScaleByModel$1(model, axisType) { axisType = axisType || model.get("type"); if (axisType) { switch (axisType) { // Buildin scale case "category": return new OrdinalScale({ ordinalMeta: model.getOrdinalMeta ? model.getOrdinalMeta() : model.getCategories(), extent: [Infinity, -Infinity] }); case "time": return new TimeScale({ locale: model.ecModel.getLocaleModel(), useUTC: model.ecModel.get("useUTC") }); default: return new (Scale.getClass(axisType) || IntervalScale)(); } } } function ifAxisCrossZero(axis) { var dataExtent = axis.scale.getExtent(); var min2 = dataExtent[0]; var max2 = dataExtent[1]; return !(min2 > 0 && max2 > 0 || min2 < 0 && max2 < 0); } function makeLabelFormatter(axis) { var labelFormatter = axis.getLabelModel().get("formatter"); var categoryTickStart = axis.type === "category" ? axis.scale.getExtent()[0] : null; if (axis.scale.type === "time") { return /* @__PURE__ */ (function(tpl) { return function(tick, idx) { return axis.scale.getFormattedLabel(tick, idx, tpl); }; })(labelFormatter); } else if (isString(labelFormatter)) { return /* @__PURE__ */ (function(tpl) { return function(tick) { var label = axis.scale.getLabel(tick); var text = tpl.replace("{value}", label != null ? label : ""); return text; }; })(labelFormatter); } else if (isFunction(labelFormatter)) { return /* @__PURE__ */ (function(cb) { return function(tick, idx) { if (categoryTickStart != null) { idx = tick.value - categoryTickStart; } return cb(getAxisRawValue(axis, tick), idx, tick.level != null ? { level: tick.level } : null); }; })(labelFormatter); } else { return function(tick) { return axis.scale.getLabel(tick); }; } } function getAxisRawValue(axis, tick) { return axis.type === "category" ? axis.scale.getLabel(tick) : tick.value; } function estimateLabelUnionRect(axis) { var axisModel = axis.model; var scale2 = axis.scale; if (!axisModel.get(["axisLabel", "show"]) || scale2.isBlank()) { return; } var realNumberScaleTicks; var tickCount; var categoryScaleExtent = scale2.getExtent(); if (scale2 instanceof OrdinalScale) { tickCount = scale2.count(); } else { realNumberScaleTicks = scale2.getTicks(); tickCount = realNumberScaleTicks.length; } var axisLabelModel = axis.getLabelModel(); var labelFormatter = makeLabelFormatter(axis); var rect; var step = 1; if (tickCount > 40) { step = Math.ceil(tickCount / 40); } for (var i = 0; i < tickCount; i += step) { var tick = realNumberScaleTicks ? realNumberScaleTicks[i] : { value: categoryScaleExtent[0] + i }; var label = labelFormatter(tick, i); var unrotatedSingleRect = axisLabelModel.getTextRect(label); var singleRect = rotateTextRect(unrotatedSingleRect, axisLabelModel.get("rotate") || 0); rect ? rect.union(singleRect) : rect = singleRect; } return rect; } function rotateTextRect(textRect, rotate2) { var rotateRadians = rotate2 * Math.PI / 180; var beforeWidth = textRect.width; var beforeHeight = textRect.height; var afterWidth = beforeWidth * Math.abs(Math.cos(rotateRadians)) + Math.abs(beforeHeight * Math.sin(rotateRadians)); var afterHeight = beforeWidth * Math.abs(Math.sin(rotateRadians)) + Math.abs(beforeHeight * Math.cos(rotateRadians)); var rotatedRect = new BoundingRect(textRect.x, textRect.y, afterWidth, afterHeight); return rotatedRect; } function getOptionCategoryInterval(model) { var interval = model.get("interval"); return interval == null ? "auto" : interval; } function shouldShowAllLabels(axis) { return axis.type === "category" && getOptionCategoryInterval(axis.getLabelModel()) === 0; } function getDataDimensionsOnAxis(data, axisDim) { var dataDimMap = {}; each$f(data.mapDimensionsAll(axisDim), function(dataDim) { dataDimMap[getStackedDimension(data, dataDim)] = true; }); return keys(dataDimMap); } function unionAxisExtentFromData(dataExtent, data, axisDim) { if (data) { each$f(getDataDimensionsOnAxis(data, axisDim), function(dim) { var seriesExtent = data.getApproximateExtent(dim); seriesExtent[0] < dataExtent[0] && (dataExtent[0] = seriesExtent[0]); seriesExtent[1] > dataExtent[1] && (dataExtent[1] = seriesExtent[1]); }); } } var AxisModelCommonMixin = ( /** @class */ (function() { function AxisModelCommonMixin2() { } AxisModelCommonMixin2.prototype.getNeedCrossZero = function() { var option = this.option; return !option.scale; }; AxisModelCommonMixin2.prototype.getCoordSysModel = function() { return; }; return AxisModelCommonMixin2; })() ); var extensions = []; var extensionRegisters = { registerPreprocessor, registerProcessor, registerPostInit, registerPostUpdate, registerUpdateLifecycle, registerAction, registerCoordinateSystem, registerLayout, registerVisual, registerTransform, registerLoading, registerMap: registerMap$1, registerImpl, PRIORITY, ComponentModel, ComponentView, SeriesModel, ChartView, // TODO Use ComponentModel and SeriesModel instead of Constructor registerComponentModel: function(ComponentModelClass) { ComponentModel.registerClass(ComponentModelClass); }, registerComponentView: function(ComponentViewClass) { ComponentView.registerClass(ComponentViewClass); }, registerSeriesModel: function(SeriesModelClass) { SeriesModel.registerClass(SeriesModelClass); }, registerChartView: function(ChartViewClass) { ChartView.registerClass(ChartViewClass); }, registerSubTypeDefaulter: function(componentType, defaulter) { ComponentModel.registerSubTypeDefaulter(componentType, defaulter); }, registerPainter: function(painterType, PainterCtor) { registerPainter(painterType, PainterCtor); } }; function use(ext) { if (isArray$1(ext)) { each$f(ext, function(singleExt) { use(singleExt); }); return; } if (indexOf(extensions, ext) >= 0) { return; } extensions.push(ext); if (isFunction(ext)) { ext = { install: ext }; } ext.install(extensionRegisters); } var TMP_TRANSFORM = []; function transformPoints(points2, transform2) { for (var p = 0; p < points2.length; p++) { applyTransform$1(points2[p], points2[p], transform2); } } function updateBBoxFromPoints(points2, min$1, max$1, projection) { for (var i = 0; i < points2.length; i++) { var p = points2[i]; if (projection) { p = projection.project(p); } if (p && isFinite(p[0]) && isFinite(p[1])) { min(min$1, min$1, p); max(max$1, max$1, p); } } } function centroid(points2) { var signedArea = 0; var cx = 0; var cy = 0; var len2 = points2.length; var x0 = points2[len2 - 1][0]; var y0 = points2[len2 - 1][1]; for (var i = 0; i < len2; i++) { var x1 = points2[i][0]; var y1 = points2[i][1]; var a = x0 * y1 - x1 * y0; signedArea += a; cx += (x0 + x1) * a; cy += (y0 + y1) * a; x0 = x1; y0 = y1; } return signedArea ? [cx / signedArea / 3, cy / signedArea / 3, signedArea] : [points2[0][0] || 0, points2[0][1] || 0]; } var Region = ( /** @class */ (function() { function Region2(name) { this.name = name; } Region2.prototype.setCenter = function(center2) { this._center = center2; }; Region2.prototype.getCenter = function() { var center2 = this._center; if (!center2) { center2 = this._center = this.calcCenter(); } return center2; }; return Region2; })() ); var GeoJSONPolygonGeometry = ( /** @class */ /* @__PURE__ */ (function() { function GeoJSONPolygonGeometry2(exterior, interiors) { this.type = "polygon"; this.exterior = exterior; this.interiors = interiors; } return GeoJSONPolygonGeometry2; })() ); var GeoJSONLineStringGeometry = ( /** @class */ /* @__PURE__ */ (function() { function GeoJSONLineStringGeometry2(points2) { this.type = "linestring"; this.points = points2; } return GeoJSONLineStringGeometry2; })() ); var GeoJSONRegion = ( /** @class */ (function(_super) { __extends(GeoJSONRegion2, _super); function GeoJSONRegion2(name, geometries, cp) { var _this = _super.call(this, name) || this; _this.type = "geoJSON"; _this.geometries = geometries; _this._center = cp && [cp[0], cp[1]]; return _this; } GeoJSONRegion2.prototype.calcCenter = function() { var geometries = this.geometries; var largestGeo; var largestGeoSize = 0; for (var i = 0; i < geometries.length; i++) { var geo = geometries[i]; var exterior = geo.exterior; var size = exterior && exterior.length; if (size > largestGeoSize) { largestGeo = geo; largestGeoSize = size; } } if (largestGeo) { return centroid(largestGeo.exterior); } var rect = this.getBoundingRect(); return [rect.x + rect.width / 2, rect.y + rect.height / 2]; }; GeoJSONRegion2.prototype.getBoundingRect = function(projection) { var rect = this._rect; if (rect && !projection) { return rect; } var min2 = [Infinity, Infinity]; var max2 = [-Infinity, -Infinity]; var geometries = this.geometries; each$f(geometries, function(geo) { if (geo.type === "polygon") { updateBBoxFromPoints(geo.exterior, min2, max2, projection); } else { each$f(geo.points, function(points2) { updateBBoxFromPoints(points2, min2, max2, projection); }); } }); if (!(isFinite(min2[0]) && isFinite(min2[1]) && isFinite(max2[0]) && isFinite(max2[1]))) { min2[0] = min2[1] = max2[0] = max2[1] = 0; } rect = new BoundingRect(min2[0], min2[1], max2[0] - min2[0], max2[1] - min2[1]); if (!projection) { this._rect = rect; } return rect; }; GeoJSONRegion2.prototype.contain = function(coord) { var rect = this.getBoundingRect(); var geometries = this.geometries; if (!rect.contain(coord[0], coord[1])) { return false; } loopGeo: for (var i = 0, len2 = geometries.length; i < len2; i++) { var geo = geometries[i]; if (geo.type !== "polygon") { continue; } var exterior = geo.exterior; var interiors = geo.interiors; if (contain$1(exterior, coord[0], coord[1])) { for (var k = 0; k < (interiors ? interiors.length : 0); k++) { if (contain$1(interiors[k], coord[0], coord[1])) { continue loopGeo; } } return true; } } return false; }; GeoJSONRegion2.prototype.transformTo = function(x, y, width, height) { var rect = this.getBoundingRect(); var aspect = rect.width / rect.height; if (!width) { width = aspect * height; } else if (!height) { height = width / aspect; } var target = new BoundingRect(x, y, width, height); var transform2 = rect.calculateTransform(target); var geometries = this.geometries; for (var i = 0; i < geometries.length; i++) { var geo = geometries[i]; if (geo.type === "polygon") { transformPoints(geo.exterior, transform2); each$f(geo.interiors, function(interior) { transformPoints(interior, transform2); }); } else { each$f(geo.points, function(points2) { transformPoints(points2, transform2); }); } } rect = this._rect; rect.copy(target); this._center = [rect.x + rect.width / 2, rect.y + rect.height / 2]; }; GeoJSONRegion2.prototype.cloneShallow = function(name) { name == null && (name = this.name); var newRegion = new GeoJSONRegion2(name, this.geometries, this._center); newRegion._rect = this._rect; newRegion.transformTo = null; return newRegion; }; return GeoJSONRegion2; })(Region) ); var GeoSVGRegion = ( /** @class */ (function(_super) { __extends(GeoSVGRegion2, _super); function GeoSVGRegion2(name, elOnlyForCalculate) { var _this = _super.call(this, name) || this; _this.type = "geoSVG"; _this._elOnlyForCalculate = elOnlyForCalculate; return _this; } GeoSVGRegion2.prototype.calcCenter = function() { var el = this._elOnlyForCalculate; var rect = el.getBoundingRect(); var center2 = [rect.x + rect.width / 2, rect.y + rect.height / 2]; var mat = identity(TMP_TRANSFORM); var target = el; while (target && !target.isGeoSVGGraphicRoot) { mul(mat, target.getLocalTransform(), mat); target = target.parent; } invert(mat, mat); applyTransform$1(center2, center2, mat); return center2; }; return GeoSVGRegion2; })(Region) ); function decode(json) { if (!json.UTF8Encoding) { return json; } var jsonCompressed = json; var encodeScale = jsonCompressed.UTF8Scale; if (encodeScale == null) { encodeScale = 1024; } var features2 = jsonCompressed.features; each$f(features2, function(feature) { var geometry = feature.geometry; var encodeOffsets = geometry.encodeOffsets; var coordinates = geometry.coordinates; if (!encodeOffsets) { return; } switch (geometry.type) { case "LineString": geometry.coordinates = decodeRing(coordinates, encodeOffsets, encodeScale); break; case "Polygon": decodeRings(coordinates, encodeOffsets, encodeScale); break; case "MultiLineString": decodeRings(coordinates, encodeOffsets, encodeScale); break; case "MultiPolygon": each$f(coordinates, function(rings, idx) { return decodeRings(rings, encodeOffsets[idx], encodeScale); }); } }); jsonCompressed.UTF8Encoding = false; return jsonCompressed; } function decodeRings(rings, encodeOffsets, encodeScale) { for (var c = 0; c < rings.length; c++) { rings[c] = decodeRing(rings[c], encodeOffsets[c], encodeScale); } } function decodeRing(coordinate, encodeOffsets, encodeScale) { var result = []; var prevX = encodeOffsets[0]; var prevY = encodeOffsets[1]; for (var i = 0; i < coordinate.length; i += 2) { var x = coordinate.charCodeAt(i) - 64; var y = coordinate.charCodeAt(i + 1) - 64; x = x >> 1 ^ -(x & 1); y = y >> 1 ^ -(y & 1); x += prevX; y += prevY; prevX = x; prevY = y; result.push([x / encodeScale, y / encodeScale]); } return result; } function parseGeoJSON(geoJson, nameProperty) { geoJson = decode(geoJson); return map$1(filter(geoJson.features, function(featureObj) { return featureObj.geometry && featureObj.properties && featureObj.geometry.coordinates.length > 0; }), function(featureObj) { var properties = featureObj.properties; var geo = featureObj.geometry; var geometries = []; switch (geo.type) { case "Polygon": var coordinates = geo.coordinates; geometries.push(new GeoJSONPolygonGeometry(coordinates[0], coordinates.slice(1))); break; case "MultiPolygon": each$f(geo.coordinates, function(item) { if (item[0]) { geometries.push(new GeoJSONPolygonGeometry(item[0], item.slice(1))); } }); break; case "LineString": geometries.push(new GeoJSONLineStringGeometry([geo.coordinates])); break; case "MultiLineString": geometries.push(new GeoJSONLineStringGeometry(geo.coordinates)); } var region = new GeoJSONRegion(properties[nameProperty || "name"], geometries, properties.cp); region.properties = properties; return region; }); } var inner$g = makeInner(); function tickValuesToNumbers(axis, values) { var nums = map$1(values, function(val) { return axis.scale.parse(val); }); if (axis.type === "time" && nums.length > 0) { nums.sort(); nums.unshift(nums[0]); nums.push(nums[nums.length - 1]); } return nums; } function createAxisLabels(axis) { var custom = axis.getLabelModel().get("customValues"); if (custom) { var labelFormatter_1 = makeLabelFormatter(axis); var extent_1 = axis.scale.getExtent(); var tickNumbers = tickValuesToNumbers(axis, custom); var ticks = filter(tickNumbers, function(val) { return val >= extent_1[0] && val <= extent_1[1]; }); return { labels: map$1(ticks, function(numval) { var tick = { value: numval }; return { formattedLabel: labelFormatter_1(tick), rawLabel: axis.scale.getLabel(tick), tickValue: numval }; }) }; } return axis.type === "category" ? makeCategoryLabels(axis) : makeRealNumberLabels(axis); } function createAxisTicks(axis, tickModel) { var custom = axis.getTickModel().get("customValues"); if (custom) { var extent_2 = axis.scale.getExtent(); var tickNumbers = tickValuesToNumbers(axis, custom); return { ticks: filter(tickNumbers, function(val) { return val >= extent_2[0] && val <= extent_2[1]; }) }; } return axis.type === "category" ? makeCategoryTicks(axis, tickModel) : { ticks: map$1(axis.scale.getTicks(), function(tick) { return tick.value; }) }; } function makeCategoryLabels(axis) { var labelModel = axis.getLabelModel(); var result = makeCategoryLabelsActually(axis, labelModel); return !labelModel.get("show") || axis.scale.isBlank() ? { labels: [], labelCategoryInterval: result.labelCategoryInterval } : result; } function makeCategoryLabelsActually(axis, labelModel) { var labelsCache = getListCache(axis, "labels"); var optionLabelInterval = getOptionCategoryInterval(labelModel); var result = listCacheGet(labelsCache, optionLabelInterval); if (result) { return result; } var labels; var numericLabelInterval; if (isFunction(optionLabelInterval)) { labels = makeLabelsByCustomizedCategoryInterval(axis, optionLabelInterval); } else { numericLabelInterval = optionLabelInterval === "auto" ? makeAutoCategoryInterval(axis) : optionLabelInterval; labels = makeLabelsByNumericCategoryInterval(axis, numericLabelInterval); } return listCacheSet(labelsCache, optionLabelInterval, { labels, labelCategoryInterval: numericLabelInterval }); } function makeCategoryTicks(axis, tickModel) { var ticksCache = getListCache(axis, "ticks"); var optionTickInterval = getOptionCategoryInterval(tickModel); var result = listCacheGet(ticksCache, optionTickInterval); if (result) { return result; } var ticks; var tickCategoryInterval; if (!tickModel.get("show") || axis.scale.isBlank()) { ticks = []; } if (isFunction(optionTickInterval)) { ticks = makeLabelsByCustomizedCategoryInterval(axis, optionTickInterval, true); } else if (optionTickInterval === "auto") { var labelsResult = makeCategoryLabelsActually(axis, axis.getLabelModel()); tickCategoryInterval = labelsResult.labelCategoryInterval; ticks = map$1(labelsResult.labels, function(labelItem) { return labelItem.tickValue; }); } else { tickCategoryInterval = optionTickInterval; ticks = makeLabelsByNumericCategoryInterval(axis, tickCategoryInterval, true); } return listCacheSet(ticksCache, optionTickInterval, { ticks, tickCategoryInterval }); } function makeRealNumberLabels(axis) { var ticks = axis.scale.getTicks(); var labelFormatter = makeLabelFormatter(axis); return { labels: map$1(ticks, function(tick, idx) { return { level: tick.level, formattedLabel: labelFormatter(tick, idx), rawLabel: axis.scale.getLabel(tick), tickValue: tick.value }; }) }; } function getListCache(axis, prop) { return inner$g(axis)[prop] || (inner$g(axis)[prop] = []); } function listCacheGet(cache, key) { for (var i = 0; i < cache.length; i++) { if (cache[i].key === key) { return cache[i].value; } } } function listCacheSet(cache, key, value) { cache.push({ key, value }); return value; } function makeAutoCategoryInterval(axis) { var result = inner$g(axis).autoInterval; return result != null ? result : inner$g(axis).autoInterval = axis.calculateCategoryInterval(); } function calculateCategoryInterval(axis) { var params = fetchAutoCategoryIntervalCalculationParams(axis); var labelFormatter = makeLabelFormatter(axis); var rotation = (params.axisRotate - params.labelRotate) / 180 * Math.PI; var ordinalScale = axis.scale; var ordinalExtent = ordinalScale.getExtent(); var tickCount = ordinalScale.count(); if (ordinalExtent[1] - ordinalExtent[0] < 1) { return 0; } var step = 1; if (tickCount > 40) { step = Math.max(1, Math.floor(tickCount / 40)); } var tickValue = ordinalExtent[0]; var unitSpan = axis.dataToCoord(tickValue + 1) - axis.dataToCoord(tickValue); var unitW = Math.abs(unitSpan * Math.cos(rotation)); var unitH = Math.abs(unitSpan * Math.sin(rotation)); var maxW = 0; var maxH = 0; for (; tickValue <= ordinalExtent[1]; tickValue += step) { var width = 0; var height = 0; var rect = getBoundingRect(labelFormatter({ value: tickValue }), params.font, "center", "top"); width = rect.width * 1.3; height = rect.height * 1.3; maxW = Math.max(maxW, width, 7); maxH = Math.max(maxH, height, 7); } var dw = maxW / unitW; var dh = maxH / unitH; isNaN(dw) && (dw = Infinity); isNaN(dh) && (dh = Infinity); var interval = Math.max(0, Math.floor(Math.min(dw, dh))); var cache = inner$g(axis.model); var axisExtent = axis.getExtent(); var lastAutoInterval = cache.lastAutoInterval; var lastTickCount = cache.lastTickCount; if (lastAutoInterval != null && lastTickCount != null && Math.abs(lastAutoInterval - interval) <= 1 && Math.abs(lastTickCount - tickCount) <= 1 && lastAutoInterval > interval && cache.axisExtent0 === axisExtent[0] && cache.axisExtent1 === axisExtent[1]) { interval = lastAutoInterval; } else { cache.lastTickCount = tickCount; cache.lastAutoInterval = interval; cache.axisExtent0 = axisExtent[0]; cache.axisExtent1 = axisExtent[1]; } return interval; } function fetchAutoCategoryIntervalCalculationParams(axis) { var labelModel = axis.getLabelModel(); return { axisRotate: axis.getRotate ? axis.getRotate() : axis.isHorizontal && !axis.isHorizontal() ? 90 : 0, labelRotate: labelModel.get("rotate") || 0, font: labelModel.getFont() }; } function makeLabelsByNumericCategoryInterval(axis, categoryInterval, onlyTick) { var labelFormatter = makeLabelFormatter(axis); var ordinalScale = axis.scale; var ordinalExtent = ordinalScale.getExtent(); var labelModel = axis.getLabelModel(); var result = []; var step = Math.max((categoryInterval || 0) + 1, 1); var startTick = ordinalExtent[0]; var tickCount = ordinalScale.count(); if (startTick !== 0 && step > 1 && tickCount / step > 2) { startTick = Math.round(Math.ceil(startTick / step) * step); } var showAllLabel = shouldShowAllLabels(axis); var includeMinLabel = labelModel.get("showMinLabel") || showAllLabel; var includeMaxLabel = labelModel.get("showMaxLabel") || showAllLabel; if (includeMinLabel && startTick !== ordinalExtent[0]) { addItem(ordinalExtent[0]); } var tickValue = startTick; for (; tickValue <= ordinalExtent[1]; tickValue += step) { addItem(tickValue); } if (includeMaxLabel && tickValue - step !== ordinalExtent[1]) { addItem(ordinalExtent[1]); } function addItem(tickValue2) { var tickObj = { value: tickValue2 }; result.push(onlyTick ? tickValue2 : { formattedLabel: labelFormatter(tickObj), rawLabel: ordinalScale.getLabel(tickObj), tickValue: tickValue2 }); } return result; } function makeLabelsByCustomizedCategoryInterval(axis, categoryInterval, onlyTick) { var ordinalScale = axis.scale; var labelFormatter = makeLabelFormatter(axis); var result = []; each$f(ordinalScale.getTicks(), function(tick) { var rawLabel = ordinalScale.getLabel(tick); var tickValue = tick.value; if (categoryInterval(tick.value, rawLabel)) { result.push(onlyTick ? tickValue : { formattedLabel: labelFormatter(tick), rawLabel, tickValue }); } }); return result; } var NORMALIZED_EXTENT = [0, 1]; var Axis = ( /** @class */ (function() { function Axis2(dim, scale2, extent) { this.onBand = false; this.inverse = false; this.dim = dim; this.scale = scale2; this._extent = extent || [0, 0]; } Axis2.prototype.contain = function(coord) { var extent = this._extent; var min2 = Math.min(extent[0], extent[1]); var max2 = Math.max(extent[0], extent[1]); return coord >= min2 && coord <= max2; }; Axis2.prototype.containData = function(data) { return this.scale.contain(data); }; Axis2.prototype.getExtent = function() { return this._extent.slice(); }; Axis2.prototype.getPixelPrecision = function(dataExtent) { return getPixelPrecision(dataExtent || this.scale.getExtent(), this._extent); }; Axis2.prototype.setExtent = function(start, end) { var extent = this._extent; extent[0] = start; extent[1] = end; }; Axis2.prototype.dataToCoord = function(data, clamp2) { var extent = this._extent; var scale2 = this.scale; data = scale2.normalize(data); if (this.onBand && scale2.type === "ordinal") { extent = extent.slice(); fixExtentWithBands(extent, scale2.count()); } return linearMap$2(data, NORMALIZED_EXTENT, extent, clamp2); }; Axis2.prototype.coordToData = function(coord, clamp2) { var extent = this._extent; var scale2 = this.scale; if (this.onBand && scale2.type === "ordinal") { extent = extent.slice(); fixExtentWithBands(extent, scale2.count()); } var t = linearMap$2(coord, extent, NORMALIZED_EXTENT, clamp2); return this.scale.scale(t); }; Axis2.prototype.pointToData = function(point, clamp2) { return; }; Axis2.prototype.getTicksCoords = function(opt) { opt = opt || {}; var tickModel = opt.tickModel || this.getTickModel(); var result = createAxisTicks(this, tickModel); var ticks = result.ticks; var ticksCoords = map$1(ticks, function(tickVal) { return { coord: this.dataToCoord(this.scale.type === "ordinal" ? this.scale.getRawOrdinalNumber(tickVal) : tickVal), tickValue: tickVal }; }, this); var alignWithLabel = tickModel.get("alignWithLabel"); fixOnBandTicksCoords(this, ticksCoords, alignWithLabel, opt.clamp); return ticksCoords; }; Axis2.prototype.getMinorTicksCoords = function() { if (this.scale.type === "ordinal") { return []; } var minorTickModel = this.model.getModel("minorTick"); var splitNumber = minorTickModel.get("splitNumber"); if (!(splitNumber > 0 && splitNumber < 100)) { splitNumber = 5; } var minorTicks = this.scale.getMinorTicks(splitNumber); var minorTicksCoords = map$1(minorTicks, function(minorTicksGroup) { return map$1(minorTicksGroup, function(minorTick) { return { coord: this.dataToCoord(minorTick), tickValue: minorTick }; }, this); }, this); return minorTicksCoords; }; Axis2.prototype.getViewLabels = function() { return createAxisLabels(this).labels; }; Axis2.prototype.getLabelModel = function() { return this.model.getModel("axisLabel"); }; Axis2.prototype.getTickModel = function() { return this.model.getModel("axisTick"); }; Axis2.prototype.getBandWidth = function() { var axisExtent = this._extent; var dataExtent = this.scale.getExtent(); var len2 = dataExtent[1] - dataExtent[0] + (this.onBand ? 1 : 0); len2 === 0 && (len2 = 1); var size = Math.abs(axisExtent[1] - axisExtent[0]); return Math.abs(size) / len2; }; Axis2.prototype.calculateCategoryInterval = function() { return calculateCategoryInterval(this); }; return Axis2; })() ); function fixExtentWithBands(extent, nTick) { var size = extent[1] - extent[0]; var len2 = nTick; var margin = size / len2 / 2; extent[0] += margin; extent[1] -= margin; } function fixOnBandTicksCoords(axis, ticksCoords, alignWithLabel, clamp2) { var ticksLen = ticksCoords.length; if (!axis.onBand || alignWithLabel || !ticksLen) { return; } var axisExtent = axis.getExtent(); var last; var diffSize; if (ticksLen === 1) { ticksCoords[0].coord = axisExtent[0]; last = ticksCoords[1] = { coord: axisExtent[1], tickValue: ticksCoords[0].tickValue }; } else { var crossLen = ticksCoords[ticksLen - 1].tickValue - ticksCoords[0].tickValue; var shift_1 = (ticksCoords[ticksLen - 1].coord - ticksCoords[0].coord) / crossLen; each$f(ticksCoords, function(ticksItem) { ticksItem.coord -= shift_1 / 2; }); var dataExtent = axis.scale.getExtent(); diffSize = 1 + dataExtent[1] - ticksCoords[ticksLen - 1].tickValue; last = { coord: ticksCoords[ticksLen - 1].coord + shift_1 * diffSize, tickValue: dataExtent[1] + 1 }; ticksCoords.push(last); } var inverse = axisExtent[0] > axisExtent[1]; if (littleThan2(ticksCoords[0].coord, axisExtent[0])) { clamp2 ? ticksCoords[0].coord = axisExtent[0] : ticksCoords.shift(); } if (clamp2 && littleThan2(axisExtent[0], ticksCoords[0].coord)) { ticksCoords.unshift({ coord: axisExtent[0] }); } if (littleThan2(axisExtent[1], last.coord)) { clamp2 ? last.coord = axisExtent[1] : ticksCoords.pop(); } if (clamp2 && littleThan2(last.coord, axisExtent[1])) { ticksCoords.push({ coord: axisExtent[1] }); } function littleThan2(a, b) { a = round$1(a); b = round$1(b); return inverse ? a > b : a < b; } } var PI2$1 = Math.PI * 2; var CMD = PathProxy.CMD; var DEFAULT_SEARCH_SPACE = ["top", "right", "bottom", "left"]; function getCandidateAnchor(pos, distance, rect, outPt, outDir) { var width = rect.width; var height = rect.height; switch (pos) { case "top": outPt.set(rect.x + width / 2, rect.y - distance); outDir.set(0, -1); break; case "bottom": outPt.set(rect.x + width / 2, rect.y + height + distance); outDir.set(0, 1); break; case "left": outPt.set(rect.x - distance, rect.y + height / 2); outDir.set(-1, 0); break; case "right": outPt.set(rect.x + width + distance, rect.y + height / 2); outDir.set(1, 0); break; } } function projectPointToArc(cx, cy, r, startAngle, endAngle, anticlockwise, x, y, out) { x -= cx; y -= cy; var d = Math.sqrt(x * x + y * y); x /= d; y /= d; var ox = x * r + cx; var oy = y * r + cy; if (Math.abs(startAngle - endAngle) % PI2$1 < 1e-4) { out[0] = ox; out[1] = oy; return d - r; } if (anticlockwise) { var tmp = startAngle; startAngle = normalizeRadian(endAngle); endAngle = normalizeRadian(tmp); } else { startAngle = normalizeRadian(startAngle); endAngle = normalizeRadian(endAngle); } if (startAngle > endAngle) { endAngle += PI2$1; } var angle = Math.atan2(y, x); if (angle < 0) { angle += PI2$1; } if (angle >= startAngle && angle <= endAngle || angle + PI2$1 >= startAngle && angle + PI2$1 <= endAngle) { out[0] = ox; out[1] = oy; return d - r; } var x1 = r * Math.cos(startAngle) + cx; var y1 = r * Math.sin(startAngle) + cy; var x2 = r * Math.cos(endAngle) + cx; var y2 = r * Math.sin(endAngle) + cy; var d1 = (x1 - x) * (x1 - x) + (y1 - y) * (y1 - y); var d2 = (x2 - x) * (x2 - x) + (y2 - y) * (y2 - y); if (d1 < d2) { out[0] = x1; out[1] = y1; return Math.sqrt(d1); } else { out[0] = x2; out[1] = y2; return Math.sqrt(d2); } } function projectPointToLine(x1, y1, x2, y2, x, y, out, limitToEnds) { var dx = x - x1; var dy = y - y1; var dx1 = x2 - x1; var dy1 = y2 - y1; var lineLen = Math.sqrt(dx1 * dx1 + dy1 * dy1); dx1 /= lineLen; dy1 /= lineLen; var projectedLen = dx * dx1 + dy * dy1; var t = projectedLen / lineLen; if (limitToEnds) { t = Math.min(Math.max(t, 0), 1); } t *= lineLen; var ox = out[0] = x1 + t * dx1; var oy = out[1] = y1 + t * dy1; return Math.sqrt((ox - x) * (ox - x) + (oy - y) * (oy - y)); } function projectPointToRect(x1, y1, width, height, x, y, out) { if (width < 0) { x1 = x1 + width; width = -width; } if (height < 0) { y1 = y1 + height; height = -height; } var x2 = x1 + width; var y2 = y1 + height; var ox = out[0] = Math.min(Math.max(x, x1), x2); var oy = out[1] = Math.min(Math.max(y, y1), y2); return Math.sqrt((ox - x) * (ox - x) + (oy - y) * (oy - y)); } var tmpPt = []; function nearestPointOnRect(pt, rect, out) { var dist2 = projectPointToRect(rect.x, rect.y, rect.width, rect.height, pt.x, pt.y, tmpPt); out.set(tmpPt[0], tmpPt[1]); return dist2; } function nearestPointOnPath(pt, path, out) { var xi = 0; var yi = 0; var x0 = 0; var y0 = 0; var x1; var y1; var minDist = Infinity; var data = path.data; var x = pt.x; var y = pt.y; for (var i = 0; i < data.length; ) { var cmd = data[i++]; if (i === 1) { xi = data[i]; yi = data[i + 1]; x0 = xi; y0 = yi; } var d = minDist; switch (cmd) { case CMD.M: x0 = data[i++]; y0 = data[i++]; xi = x0; yi = y0; break; case CMD.L: d = projectPointToLine(xi, yi, data[i], data[i + 1], x, y, tmpPt, true); xi = data[i++]; yi = data[i++]; break; case CMD.C: d = cubicProjectPoint(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], x, y, tmpPt); xi = data[i++]; yi = data[i++]; break; case CMD.Q: d = quadraticProjectPoint(xi, yi, data[i++], data[i++], data[i], data[i + 1], x, y, tmpPt); xi = data[i++]; yi = data[i++]; break; case CMD.A: var cx = data[i++]; var cy = data[i++]; var rx = data[i++]; var ry = data[i++]; var theta = data[i++]; var dTheta = data[i++]; i += 1; var anticlockwise = !!(1 - data[i++]); x1 = Math.cos(theta) * rx + cx; y1 = Math.sin(theta) * ry + cy; if (i <= 1) { x0 = x1; y0 = y1; } var _x = (x - cx) * ry / rx + cx; d = projectPointToArc(cx, cy, ry, theta, theta + dTheta, anticlockwise, _x, y, tmpPt); xi = Math.cos(theta + dTheta) * rx + cx; yi = Math.sin(theta + dTheta) * ry + cy; break; case CMD.R: x0 = xi = data[i++]; y0 = yi = data[i++]; var width = data[i++]; var height = data[i++]; d = projectPointToRect(x0, y0, width, height, x, y, tmpPt); break; case CMD.Z: d = projectPointToLine(xi, yi, x0, y0, x, y, tmpPt, true); xi = x0; yi = y0; break; } if (d < minDist) { minDist = d; out.set(tmpPt[0], tmpPt[1]); } } return minDist; } var pt0 = new Point(); var pt1 = new Point(); var pt2 = new Point(); var dir = new Point(); var dir2 = new Point(); function updateLabelLinePoints(target, labelLineModel) { if (!target) { return; } var labelLine = target.getTextGuideLine(); var label = target.getTextContent(); if (!(label && labelLine)) { return; } var labelGuideConfig = target.textGuideLineConfig || {}; var points2 = [[0, 0], [0, 0], [0, 0]]; var searchSpace = labelGuideConfig.candidates || DEFAULT_SEARCH_SPACE; var labelRect = label.getBoundingRect().clone(); labelRect.applyTransform(label.getComputedTransform()); var minDist = Infinity; var anchorPoint = labelGuideConfig.anchor; var targetTransform = target.getComputedTransform(); var targetInversedTransform = targetTransform && invert([], targetTransform); var len2 = labelLineModel.get("length2") || 0; if (anchorPoint) { pt2.copy(anchorPoint); } for (var i = 0; i < searchSpace.length; i++) { var candidate = searchSpace[i]; getCandidateAnchor(candidate, 0, labelRect, pt0, dir); Point.scaleAndAdd(pt1, pt0, dir, len2); pt1.transform(targetInversedTransform); var boundingRect = target.getBoundingRect(); var dist2 = anchorPoint ? anchorPoint.distance(pt1) : target instanceof Path ? nearestPointOnPath(pt1, target.path, pt2) : nearestPointOnRect(pt1, boundingRect, pt2); if (dist2 < minDist) { minDist = dist2; pt1.transform(targetTransform); pt2.transform(targetTransform); pt2.toArray(points2[0]); pt1.toArray(points2[1]); pt0.toArray(points2[2]); } } limitTurnAngle(points2, labelLineModel.get("minTurnAngle")); labelLine.setShape({ points: points2 }); } var tmpArr = []; var tmpProjPoint = new Point(); function limitTurnAngle(linePoints, minTurnAngle) { if (!(minTurnAngle <= 180 && minTurnAngle > 0)) { return; } minTurnAngle = minTurnAngle / 180 * Math.PI; pt0.fromArray(linePoints[0]); pt1.fromArray(linePoints[1]); pt2.fromArray(linePoints[2]); Point.sub(dir, pt0, pt1); Point.sub(dir2, pt2, pt1); var len1 = dir.len(); var len2 = dir2.len(); if (len1 < 1e-3 || len2 < 1e-3) { return; } dir.scale(1 / len1); dir2.scale(1 / len2); var angleCos = dir.dot(dir2); var minTurnAngleCos = Math.cos(minTurnAngle); if (minTurnAngleCos < angleCos) { var d = projectPointToLine(pt1.x, pt1.y, pt2.x, pt2.y, pt0.x, pt0.y, tmpArr, false); tmpProjPoint.fromArray(tmpArr); tmpProjPoint.scaleAndAdd(dir2, d / Math.tan(Math.PI - minTurnAngle)); var t = pt2.x !== pt1.x ? (tmpProjPoint.x - pt1.x) / (pt2.x - pt1.x) : (tmpProjPoint.y - pt1.y) / (pt2.y - pt1.y); if (isNaN(t)) { return; } if (t < 0) { Point.copy(tmpProjPoint, pt1); } else if (t > 1) { Point.copy(tmpProjPoint, pt2); } tmpProjPoint.toArray(linePoints[1]); } } function limitSurfaceAngle(linePoints, surfaceNormal, maxSurfaceAngle) { if (!(maxSurfaceAngle <= 180 && maxSurfaceAngle > 0)) { return; } maxSurfaceAngle = maxSurfaceAngle / 180 * Math.PI; pt0.fromArray(linePoints[0]); pt1.fromArray(linePoints[1]); pt2.fromArray(linePoints[2]); Point.sub(dir, pt1, pt0); Point.sub(dir2, pt2, pt1); var len1 = dir.len(); var len2 = dir2.len(); if (len1 < 1e-3 || len2 < 1e-3) { return; } dir.scale(1 / len1); dir2.scale(1 / len2); var angleCos = dir.dot(surfaceNormal); var maxSurfaceAngleCos = Math.cos(maxSurfaceAngle); if (angleCos < maxSurfaceAngleCos) { var d = projectPointToLine(pt1.x, pt1.y, pt2.x, pt2.y, pt0.x, pt0.y, tmpArr, false); tmpProjPoint.fromArray(tmpArr); var HALF_PI = Math.PI / 2; var angle2 = Math.acos(dir2.dot(surfaceNormal)); var newAngle = HALF_PI + angle2 - maxSurfaceAngle; if (newAngle >= HALF_PI) { Point.copy(tmpProjPoint, pt2); } else { tmpProjPoint.scaleAndAdd(dir2, d / Math.tan(Math.PI / 2 - newAngle)); var t = pt2.x !== pt1.x ? (tmpProjPoint.x - pt1.x) / (pt2.x - pt1.x) : (tmpProjPoint.y - pt1.y) / (pt2.y - pt1.y); if (isNaN(t)) { return; } if (t < 0) { Point.copy(tmpProjPoint, pt1); } else if (t > 1) { Point.copy(tmpProjPoint, pt2); } } tmpProjPoint.toArray(linePoints[1]); } } function setLabelLineState(labelLine, ignore, stateName, stateModel) { var isNormal = stateName === "normal"; var stateObj = isNormal ? labelLine : labelLine.ensureState(stateName); stateObj.ignore = ignore; var smooth = stateModel.get("smooth"); if (smooth && smooth === true) { smooth = 0.3; } stateObj.shape = stateObj.shape || {}; if (smooth > 0) { stateObj.shape.smooth = smooth; } var styleObj = stateModel.getModel("lineStyle").getLineStyle(); isNormal ? labelLine.useStyle(styleObj) : stateObj.style = styleObj; } function buildLabelLinePath(path, shape) { var smooth = shape.smooth; var points2 = shape.points; if (!points2) { return; } path.moveTo(points2[0][0], points2[0][1]); if (smooth > 0 && points2.length >= 3) { var len1 = dist(points2[0], points2[1]); var len2 = dist(points2[1], points2[2]); if (!len1 || !len2) { path.lineTo(points2[1][0], points2[1][1]); path.lineTo(points2[2][0], points2[2][1]); return; } var moveLen = Math.min(len1, len2) * smooth; var midPoint0 = lerp([], points2[1], points2[0], moveLen / len1); var midPoint2 = lerp([], points2[1], points2[2], moveLen / len2); var midPoint1 = lerp([], midPoint0, midPoint2, 0.5); path.bezierCurveTo(midPoint0[0], midPoint0[1], midPoint0[0], midPoint0[1], midPoint1[0], midPoint1[1]); path.bezierCurveTo(midPoint2[0], midPoint2[1], midPoint2[0], midPoint2[1], points2[2][0], points2[2][1]); } else { for (var i = 1; i < points2.length; i++) { path.lineTo(points2[i][0], points2[i][1]); } } } function setLabelLineStyle(targetEl, statesModels, defaultStyle) { var labelLine = targetEl.getTextGuideLine(); var label = targetEl.getTextContent(); if (!label) { if (labelLine) { targetEl.removeTextGuideLine(); } return; } var normalModel = statesModels.normal; var showNormal = normalModel.get("show"); var labelIgnoreNormal = label.ignore; for (var i = 0; i < DISPLAY_STATES.length; i++) { var stateName = DISPLAY_STATES[i]; var stateModel = statesModels[stateName]; var isNormal = stateName === "normal"; if (stateModel) { var stateShow = stateModel.get("show"); var isLabelIgnored = isNormal ? labelIgnoreNormal : retrieve2(label.states[stateName] && label.states[stateName].ignore, labelIgnoreNormal); if (isLabelIgnored || !retrieve2(stateShow, showNormal)) { var stateObj = isNormal ? labelLine : labelLine && labelLine.states[stateName]; if (stateObj) { stateObj.ignore = true; } if (!!labelLine) { setLabelLineState(labelLine, true, stateName, stateModel); } continue; } if (!labelLine) { labelLine = new Polyline$1(); targetEl.setTextGuideLine(labelLine); if (!isNormal && (labelIgnoreNormal || !showNormal)) { setLabelLineState(labelLine, true, "normal", statesModels.normal); } if (targetEl.stateProxy) { labelLine.stateProxy = targetEl.stateProxy; } } setLabelLineState(labelLine, false, stateName, stateModel); } } if (labelLine) { defaults(labelLine.style, defaultStyle); labelLine.style.fill = null; var showAbove = normalModel.get("showAbove"); var labelLineConfig = targetEl.textGuideLineConfig = targetEl.textGuideLineConfig || {}; labelLineConfig.showAbove = showAbove || false; labelLine.buildPath = buildLabelLinePath; } } function getLabelLineStatesModels(itemModel, labelLineName) { labelLineName = labelLineName || "labelLine"; var statesModels = { normal: itemModel.getModel(labelLineName) }; for (var i = 0; i < SPECIAL_STATES.length; i++) { var stateName = SPECIAL_STATES[i]; statesModels[stateName] = itemModel.getModel([stateName, labelLineName]); } return statesModels; } function prepareLayoutList(input) { var list = []; for (var i = 0; i < input.length; i++) { var rawItem = input[i]; if (rawItem.defaultAttr.ignore) { continue; } var label = rawItem.label; var transform2 = label.getComputedTransform(); var localRect = label.getBoundingRect(); var isAxisAligned = !transform2 || transform2[1] < 1e-5 && transform2[2] < 1e-5; var minMargin = label.style.margin || 0; var globalRect = localRect.clone(); globalRect.applyTransform(transform2); globalRect.x -= minMargin / 2; globalRect.y -= minMargin / 2; globalRect.width += minMargin; globalRect.height += minMargin; var obb = isAxisAligned ? new OrientedBoundingRect(localRect, transform2) : null; list.push({ label, labelLine: rawItem.labelLine, rect: globalRect, localRect, obb, priority: rawItem.priority, defaultAttr: rawItem.defaultAttr, layoutOption: rawItem.computedLayoutOption, axisAligned: isAxisAligned, transform: transform2 }); } return list; } function shiftLayout(list, xyDim, sizeDim, minBound, maxBound, balanceShift) { var len2 = list.length; if (len2 < 2) { return; } list.sort(function(a, b) { return a.rect[xyDim] - b.rect[xyDim]; }); var lastPos = 0; var delta; var adjusted = false; for (var i = 0; i < len2; i++) { var item = list[i]; var rect = item.rect; delta = rect[xyDim] - lastPos; if (delta < 0) { rect[xyDim] -= delta; item.label[xyDim] -= delta; adjusted = true; } lastPos = rect[xyDim] + rect[sizeDim]; } var first = list[0]; var last = list[len2 - 1]; var minGap; var maxGap; updateMinMaxGap(); minGap < 0 && squeezeGaps(-minGap, 0.8); maxGap < 0 && squeezeGaps(maxGap, 0.8); updateMinMaxGap(); takeBoundsGap(minGap, maxGap, 1); takeBoundsGap(maxGap, minGap, -1); updateMinMaxGap(); if (minGap < 0) { squeezeWhenBailout(-minGap); } if (maxGap < 0) { squeezeWhenBailout(maxGap); } function updateMinMaxGap() { minGap = first.rect[xyDim] - minBound; maxGap = maxBound - last.rect[xyDim] - last.rect[sizeDim]; } function takeBoundsGap(gapThisBound, gapOtherBound, moveDir) { if (gapThisBound < 0) { var moveFromMaxGap = Math.min(gapOtherBound, -gapThisBound); if (moveFromMaxGap > 0) { shiftList(moveFromMaxGap * moveDir, 0, len2); var remained = moveFromMaxGap + gapThisBound; if (remained < 0) { squeezeGaps(-remained * moveDir, 1); } } else { squeezeGaps(-gapThisBound * moveDir, 1); } } } function shiftList(delta2, start, end) { if (delta2 !== 0) { adjusted = true; } for (var i2 = start; i2 < end; i2++) { var item2 = list[i2]; var rect2 = item2.rect; rect2[xyDim] += delta2; item2.label[xyDim] += delta2; } } function squeezeGaps(delta2, maxSqeezePercent) { var gaps = []; var totalGaps = 0; for (var i2 = 1; i2 < len2; i2++) { var prevItemRect = list[i2 - 1].rect; var gap = Math.max(list[i2].rect[xyDim] - prevItemRect[xyDim] - prevItemRect[sizeDim], 0); gaps.push(gap); totalGaps += gap; } if (!totalGaps) { return; } var squeezePercent = Math.min(Math.abs(delta2) / totalGaps, maxSqeezePercent); if (delta2 > 0) { for (var i2 = 0; i2 < len2 - 1; i2++) { var movement = gaps[i2] * squeezePercent; shiftList(movement, 0, i2 + 1); } } else { for (var i2 = len2 - 1; i2 > 0; i2--) { var movement = gaps[i2 - 1] * squeezePercent; shiftList(-movement, i2, len2); } } } function squeezeWhenBailout(delta2) { var dir3 = delta2 < 0 ? -1 : 1; delta2 = Math.abs(delta2); var moveForEachLabel = Math.ceil(delta2 / (len2 - 1)); for (var i2 = 0; i2 < len2 - 1; i2++) { if (dir3 > 0) { shiftList(moveForEachLabel, 0, i2 + 1); } else { shiftList(-moveForEachLabel, len2 - i2 - 1, len2); } delta2 -= moveForEachLabel; if (delta2 <= 0) { return; } } } return adjusted; } function shiftLayoutOnX(list, leftBound, rightBound, balanceShift) { return shiftLayout(list, "x", "width", leftBound, rightBound); } function shiftLayoutOnY(list, topBound, bottomBound, balanceShift) { return shiftLayout(list, "y", "height", topBound, bottomBound); } function hideOverlap(labelList) { var displayedLabels = []; labelList.sort(function(a, b) { return b.priority - a.priority; }); var globalRect = new BoundingRect(0, 0, 0, 0); function hideEl(el) { if (!el.ignore) { var emphasisState = el.ensureState("emphasis"); if (emphasisState.ignore == null) { emphasisState.ignore = false; } } el.ignore = true; } for (var i = 0; i < labelList.length; i++) { var labelItem = labelList[i]; var isAxisAligned = labelItem.axisAligned; var localRect = labelItem.localRect; var transform2 = labelItem.transform; var label = labelItem.label; var labelLine = labelItem.labelLine; globalRect.copy(labelItem.rect); globalRect.width -= 0.1; globalRect.height -= 0.1; globalRect.x += 0.05; globalRect.y += 0.05; var obb = labelItem.obb; var overlapped = false; for (var j = 0; j < displayedLabels.length; j++) { var existsTextCfg = displayedLabels[j]; if (!globalRect.intersect(existsTextCfg.rect)) { continue; } if (isAxisAligned && existsTextCfg.axisAligned) { overlapped = true; break; } if (!existsTextCfg.obb) { existsTextCfg.obb = new OrientedBoundingRect(existsTextCfg.localRect, existsTextCfg.transform); } if (!obb) { obb = new OrientedBoundingRect(localRect, transform2); } if (obb.intersect(existsTextCfg.obb)) { overlapped = true; break; } } if (overlapped) { hideEl(label); labelLine && hideEl(labelLine); } else { label.attr("ignore", labelItem.defaultAttr.ignore); labelLine && labelLine.attr("ignore", labelItem.defaultAttr.labelGuideIgnore); displayedLabels.push(labelItem); } } } function cloneArr(points2) { if (points2) { var newPoints = []; for (var i = 0; i < points2.length; i++) { newPoints.push(points2[i].slice()); } return newPoints; } } function prepareLayoutCallbackParams(labelItem, hostEl) { var label = labelItem.label; var labelLine = hostEl && hostEl.getTextGuideLine(); return { dataIndex: labelItem.dataIndex, dataType: labelItem.dataType, seriesIndex: labelItem.seriesModel.seriesIndex, text: labelItem.label.style.text, rect: labelItem.hostRect, labelRect: labelItem.rect, // x: labelAttr.x, // y: labelAttr.y, align: label.style.align, verticalAlign: label.style.verticalAlign, labelLinePoints: cloneArr(labelLine && labelLine.shape.points) }; } var LABEL_OPTION_TO_STYLE_KEYS = ["align", "verticalAlign", "width", "height", "fontSize"]; var dummyTransformable = new Transformable(); var labelLayoutInnerStore = makeInner(); var labelLineAnimationStore = makeInner(); function extendWithKeys(target, source, keys2) { for (var i = 0; i < keys2.length; i++) { var key = keys2[i]; if (source[key] != null) { target[key] = source[key]; } } } var LABEL_LAYOUT_PROPS = ["x", "y", "rotation"]; var LabelManager = ( /** @class */ (function() { function LabelManager2() { this._labelList = []; this._chartViewList = []; } LabelManager2.prototype.clearLabels = function() { this._labelList = []; this._chartViewList = []; }; LabelManager2.prototype._addLabel = function(dataIndex, dataType, seriesModel, label, layoutOption) { var labelStyle = label.style; var hostEl = label.__hostTarget; var textConfig = hostEl.textConfig || {}; var labelTransform = label.getComputedTransform(); var labelRect = label.getBoundingRect().plain(); BoundingRect.applyTransform(labelRect, labelRect, labelTransform); if (labelTransform) { dummyTransformable.setLocalTransform(labelTransform); } else { dummyTransformable.x = dummyTransformable.y = dummyTransformable.rotation = dummyTransformable.originX = dummyTransformable.originY = 0; dummyTransformable.scaleX = dummyTransformable.scaleY = 1; } dummyTransformable.rotation = normalizeRadian(dummyTransformable.rotation); var host = label.__hostTarget; var hostRect; if (host) { hostRect = host.getBoundingRect().plain(); var transform2 = host.getComputedTransform(); BoundingRect.applyTransform(hostRect, hostRect, transform2); } var labelGuide = hostRect && host.getTextGuideLine(); this._labelList.push({ label, labelLine: labelGuide, seriesModel, dataIndex, dataType, layoutOption, computedLayoutOption: null, rect: labelRect, hostRect, // Label with lower priority will be hidden when overlapped // Use rect size as default priority priority: hostRect ? hostRect.width * hostRect.height : 0, // Save default label attributes. // For restore if developers want get back to default value in callback. defaultAttr: { ignore: label.ignore, labelGuideIgnore: labelGuide && labelGuide.ignore, x: dummyTransformable.x, y: dummyTransformable.y, scaleX: dummyTransformable.scaleX, scaleY: dummyTransformable.scaleY, rotation: dummyTransformable.rotation, style: { x: labelStyle.x, y: labelStyle.y, align: labelStyle.align, verticalAlign: labelStyle.verticalAlign, width: labelStyle.width, height: labelStyle.height, fontSize: labelStyle.fontSize }, cursor: label.cursor, attachedPos: textConfig.position, attachedRot: textConfig.rotation } }); }; LabelManager2.prototype.addLabelsOfSeries = function(chartView) { var _this = this; this._chartViewList.push(chartView); var seriesModel = chartView.__model; var layoutOption = seriesModel.get("labelLayout"); if (!(isFunction(layoutOption) || keys(layoutOption).length)) { return; } chartView.group.traverse(function(child) { if (child.ignore) { return true; } var textEl = child.getTextContent(); var ecData = getECData(child); if (textEl && !textEl.disableLabelLayout) { _this._addLabel(ecData.dataIndex, ecData.dataType, seriesModel, textEl, layoutOption); } }); }; LabelManager2.prototype.updateLayoutConfig = function(api) { var width = api.getWidth(); var height = api.getHeight(); function createDragHandler(el, labelLineModel) { return function() { updateLabelLinePoints(el, labelLineModel); }; } for (var i = 0; i < this._labelList.length; i++) { var labelItem = this._labelList[i]; var label = labelItem.label; var hostEl = label.__hostTarget; var defaultLabelAttr = labelItem.defaultAttr; var layoutOption = void 0; if (isFunction(labelItem.layoutOption)) { layoutOption = labelItem.layoutOption(prepareLayoutCallbackParams(labelItem, hostEl)); } else { layoutOption = labelItem.layoutOption; } layoutOption = layoutOption || {}; labelItem.computedLayoutOption = layoutOption; var degreeToRadian = Math.PI / 180; if (hostEl) { hostEl.setTextConfig({ // Force to set local false. local: false, // Ignore position and rotation config on the host el if x or y is changed. position: layoutOption.x != null || layoutOption.y != null ? null : defaultLabelAttr.attachedPos, // Ignore rotation config on the host el if rotation is changed. rotation: layoutOption.rotate != null ? layoutOption.rotate * degreeToRadian : defaultLabelAttr.attachedRot, offset: [layoutOption.dx || 0, layoutOption.dy || 0] }); } var needsUpdateLabelLine = false; if (layoutOption.x != null) { label.x = parsePercent(layoutOption.x, width); label.setStyle("x", 0); needsUpdateLabelLine = true; } else { label.x = defaultLabelAttr.x; label.setStyle("x", defaultLabelAttr.style.x); } if (layoutOption.y != null) { label.y = parsePercent(layoutOption.y, height); label.setStyle("y", 0); needsUpdateLabelLine = true; } else { label.y = defaultLabelAttr.y; label.setStyle("y", defaultLabelAttr.style.y); } if (layoutOption.labelLinePoints) { var guideLine = hostEl.getTextGuideLine(); if (guideLine) { guideLine.setShape({ points: layoutOption.labelLinePoints }); needsUpdateLabelLine = false; } } var labelLayoutStore = labelLayoutInnerStore(label); labelLayoutStore.needsUpdateLabelLine = needsUpdateLabelLine; label.rotation = layoutOption.rotate != null ? layoutOption.rotate * degreeToRadian : defaultLabelAttr.rotation; label.scaleX = defaultLabelAttr.scaleX; label.scaleY = defaultLabelAttr.scaleY; for (var k = 0; k < LABEL_OPTION_TO_STYLE_KEYS.length; k++) { var key = LABEL_OPTION_TO_STYLE_KEYS[k]; label.setStyle(key, layoutOption[key] != null ? layoutOption[key] : defaultLabelAttr.style[key]); } if (layoutOption.draggable) { label.draggable = true; label.cursor = "move"; if (hostEl) { var hostModel = labelItem.seriesModel; if (labelItem.dataIndex != null) { var data = labelItem.seriesModel.getData(labelItem.dataType); hostModel = data.getItemModel(labelItem.dataIndex); } label.on("drag", createDragHandler(hostEl, hostModel.getModel("labelLine"))); } } else { label.off("drag"); label.cursor = defaultLabelAttr.cursor; } } }; LabelManager2.prototype.layout = function(api) { var width = api.getWidth(); var height = api.getHeight(); var labelList = prepareLayoutList(this._labelList); var labelsNeedsAdjustOnX = filter(labelList, function(item) { return item.layoutOption.moveOverlap === "shiftX"; }); var labelsNeedsAdjustOnY = filter(labelList, function(item) { return item.layoutOption.moveOverlap === "shiftY"; }); shiftLayoutOnX(labelsNeedsAdjustOnX, 0, width); shiftLayoutOnY(labelsNeedsAdjustOnY, 0, height); var labelsNeedsHideOverlap = filter(labelList, function(item) { return item.layoutOption.hideOverlap; }); hideOverlap(labelsNeedsHideOverlap); }; LabelManager2.prototype.processLabelsOverall = function() { var _this = this; each$f(this._chartViewList, function(chartView) { var seriesModel = chartView.__model; var ignoreLabelLineUpdate = chartView.ignoreLabelLineUpdate; var animationEnabled = seriesModel.isAnimationEnabled(); chartView.group.traverse(function(child) { if (child.ignore && !child.forceLabelAnimation) { return true; } var needsUpdateLabelLine = !ignoreLabelLineUpdate; var label = child.getTextContent(); if (!needsUpdateLabelLine && label) { needsUpdateLabelLine = labelLayoutInnerStore(label).needsUpdateLabelLine; } if (needsUpdateLabelLine) { _this._updateLabelLine(child, seriesModel); } if (animationEnabled) { _this._animateLabels(child, seriesModel); } }); }); }; LabelManager2.prototype._updateLabelLine = function(el, seriesModel) { var textEl = el.getTextContent(); var ecData = getECData(el); var dataIndex = ecData.dataIndex; if (textEl && dataIndex != null) { var data = seriesModel.getData(ecData.dataType); var itemModel = data.getItemModel(dataIndex); var defaultStyle = {}; var visualStyle = data.getItemVisual(dataIndex, "style"); if (visualStyle) { var visualType = data.getVisual("drawType"); defaultStyle.stroke = visualStyle[visualType]; } var labelLineModel = itemModel.getModel("labelLine"); setLabelLineStyle(el, getLabelLineStatesModels(itemModel), defaultStyle); updateLabelLinePoints(el, labelLineModel); } }; LabelManager2.prototype._animateLabels = function(el, seriesModel) { var textEl = el.getTextContent(); var guideLine = el.getTextGuideLine(); if (textEl && (el.forceLabelAnimation || !textEl.ignore && !textEl.invisible && !el.disableLabelAnimation && !isElementRemoved(el))) { var layoutStore = labelLayoutInnerStore(textEl); var oldLayout = layoutStore.oldLayout; var ecData = getECData(el); var dataIndex = ecData.dataIndex; var newProps = { x: textEl.x, y: textEl.y, rotation: textEl.rotation }; var data = seriesModel.getData(ecData.dataType); if (!oldLayout) { textEl.attr(newProps); if (!labelInner(textEl).valueAnimation) { var oldOpacity = retrieve2(textEl.style.opacity, 1); textEl.style.opacity = 0; initProps(textEl, { style: { opacity: oldOpacity } }, seriesModel, dataIndex); } } else { textEl.attr(oldLayout); var prevStates = el.prevStates; if (prevStates) { if (indexOf(prevStates, "select") >= 0) { textEl.attr(layoutStore.oldLayoutSelect); } if (indexOf(prevStates, "emphasis") >= 0) { textEl.attr(layoutStore.oldLayoutEmphasis); } } updateProps$1(textEl, newProps, seriesModel, dataIndex); } layoutStore.oldLayout = newProps; if (textEl.states.select) { var layoutSelect = layoutStore.oldLayoutSelect = {}; extendWithKeys(layoutSelect, newProps, LABEL_LAYOUT_PROPS); extendWithKeys(layoutSelect, textEl.states.select, LABEL_LAYOUT_PROPS); } if (textEl.states.emphasis) { var layoutEmphasis = layoutStore.oldLayoutEmphasis = {}; extendWithKeys(layoutEmphasis, newProps, LABEL_LAYOUT_PROPS); extendWithKeys(layoutEmphasis, textEl.states.emphasis, LABEL_LAYOUT_PROPS); } animateLabelValue(textEl, dataIndex, data, seriesModel, seriesModel); } if (guideLine && !guideLine.ignore && !guideLine.invisible) { var layoutStore = labelLineAnimationStore(guideLine); var oldLayout = layoutStore.oldLayout; var newLayout = { points: guideLine.shape.points }; if (!oldLayout) { guideLine.setShape(newLayout); guideLine.style.strokePercent = 0; initProps(guideLine, { style: { strokePercent: 1 } }, seriesModel); } else { guideLine.attr({ shape: oldLayout }); updateProps$1(guideLine, { shape: newLayout }, seriesModel); } layoutStore.oldLayout = newLayout; } }; return LabelManager2; })() ); var getLabelManager = makeInner(); function installLabelLayout(registers) { registers.registerUpdateLifecycle("series:beforeupdate", function(ecModel, api, params) { var labelManager = getLabelManager(api).labelManager; if (!labelManager) { labelManager = getLabelManager(api).labelManager = new LabelManager(); } labelManager.clearLabels(); }); registers.registerUpdateLifecycle("series:layoutlabels", function(ecModel, api, params) { var labelManager = getLabelManager(api).labelManager; params.updatedSeries.forEach(function(series) { labelManager.addLabelsOfSeries(api.getViewOfSeriesModel(series)); }); labelManager.updateLayoutConfig(api); labelManager.layout(api); labelManager.processLabelsOverall(); }); } var LineSeriesModel = ( /** @class */ (function(_super) { __extends(LineSeriesModel2, _super); function LineSeriesModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = LineSeriesModel2.type; _this.hasSymbolVisual = true; return _this; } LineSeriesModel2.prototype.getInitialData = function(option) { return createSeriesData(null, this, { useEncodeDefaulter: true }); }; LineSeriesModel2.prototype.getLegendIcon = function(opt) { var group = new Group$3(); var line = createSymbol$1("line", 0, opt.itemHeight / 2, opt.itemWidth, 0, opt.lineStyle.stroke, false); group.add(line); line.setStyle(opt.lineStyle); var visualType = this.getData().getVisual("symbol"); var visualRotate = this.getData().getVisual("symbolRotate"); var symbolType = visualType === "none" ? "circle" : visualType; var size = opt.itemHeight * 0.8; var symbol = createSymbol$1(symbolType, (opt.itemWidth - size) / 2, (opt.itemHeight - size) / 2, size, size, opt.itemStyle.fill); group.add(symbol); symbol.setStyle(opt.itemStyle); var symbolRotate = opt.iconRotate === "inherit" ? visualRotate : opt.iconRotate || 0; symbol.rotation = symbolRotate * Math.PI / 180; symbol.setOrigin([opt.itemWidth / 2, opt.itemHeight / 2]); if (symbolType.indexOf("empty") > -1) { symbol.style.stroke = symbol.style.fill; symbol.style.fill = "#fff"; symbol.style.lineWidth = 2; } return group; }; LineSeriesModel2.type = "series.line"; LineSeriesModel2.dependencies = ["grid", "polar"]; LineSeriesModel2.defaultOption = { // zlevel: 0, z: 3, coordinateSystem: "cartesian2d", legendHoverLink: true, clip: true, label: { position: "top" }, // itemStyle: { // }, endLabel: { show: false, valueAnimation: true, distance: 8 }, lineStyle: { width: 2, type: "solid" }, emphasis: { scale: true }, // areaStyle: { // origin of areaStyle. Valid values: // `'auto'/null/undefined`: from axisLine to data // `'start'`: from min to data // `'end'`: from data to max // origin: 'auto' // }, // false, 'start', 'end', 'middle' step: false, // Disabled if step is true smooth: false, smoothMonotone: null, symbol: "emptyCircle", symbolSize: 4, symbolRotate: null, showSymbol: true, // `false`: follow the label interval strategy. // `true`: show all symbols. // `'auto'`: If possible, show all symbols, otherwise // follow the label interval strategy. showAllSymbol: "auto", // Whether to connect break point. connectNulls: false, // Sampling for large data. Can be: 'average', 'max', 'min', 'sum', 'lttb'. sampling: "none", animationEasing: "linear", // Disable progressive progressive: 0, hoverLayerThreshold: Infinity, universalTransition: { divideShape: "clone" }, triggerLineEvent: false }; return LineSeriesModel2; })(SeriesModel) ); function getDefaultLabel(data, dataIndex) { var labelDims = data.mapDimensionsAll("defaultedLabel"); var len2 = labelDims.length; if (len2 === 1) { var rawVal = retrieveRawValue(data, dataIndex, labelDims[0]); return rawVal != null ? rawVal + "" : null; } else if (len2) { var vals = []; for (var i = 0; i < labelDims.length; i++) { vals.push(retrieveRawValue(data, dataIndex, labelDims[i])); } return vals.join(" "); } } function getDefaultInterpolatedLabel(data, interpolatedValue) { var labelDims = data.mapDimensionsAll("defaultedLabel"); if (!isArray$1(interpolatedValue)) { return interpolatedValue + ""; } var vals = []; for (var i = 0; i < labelDims.length; i++) { var dimIndex = data.getDimensionIndex(labelDims[i]); if (dimIndex >= 0) { vals.push(interpolatedValue[dimIndex]); } } return vals.join(" "); } var Symbol$1 = ( /** @class */ (function(_super) { __extends(Symbol2, _super); function Symbol2(data, idx, seriesScope, opts) { var _this = _super.call(this) || this; _this.updateData(data, idx, seriesScope, opts); return _this; } Symbol2.prototype._createSymbol = function(symbolType, data, idx, symbolSize, keepAspect) { this.removeAll(); var symbolPath = createSymbol$1(symbolType, -1, -1, 2, 2, null, keepAspect); symbolPath.attr({ z2: 100, culling: true, scaleX: symbolSize[0] / 2, scaleY: symbolSize[1] / 2 }); symbolPath.drift = driftSymbol; this._symbolType = symbolType; this.add(symbolPath); }; Symbol2.prototype.stopSymbolAnimation = function(toLastFrame) { this.childAt(0).stopAnimation(null, toLastFrame); }; Symbol2.prototype.getSymbolType = function() { return this._symbolType; }; Symbol2.prototype.getSymbolPath = function() { return this.childAt(0); }; Symbol2.prototype.highlight = function() { enterEmphasis(this.childAt(0)); }; Symbol2.prototype.downplay = function() { leaveEmphasis(this.childAt(0)); }; Symbol2.prototype.setZ = function(zlevel, z) { var symbolPath = this.childAt(0); symbolPath.zlevel = zlevel; symbolPath.z = z; }; Symbol2.prototype.setDraggable = function(draggable, hasCursorOption) { var symbolPath = this.childAt(0); symbolPath.draggable = draggable; symbolPath.cursor = !hasCursorOption && draggable ? "move" : symbolPath.cursor; }; Symbol2.prototype.updateData = function(data, idx, seriesScope, opts) { this.silent = false; var symbolType = data.getItemVisual(idx, "symbol") || "circle"; var seriesModel = data.hostModel; var symbolSize = Symbol2.getSymbolSize(data, idx); var isInit = symbolType !== this._symbolType; var disableAnimation = opts && opts.disableAnimation; if (isInit) { var keepAspect = data.getItemVisual(idx, "symbolKeepAspect"); this._createSymbol(symbolType, data, idx, symbolSize, keepAspect); } else { var symbolPath = this.childAt(0); symbolPath.silent = false; var target = { scaleX: symbolSize[0] / 2, scaleY: symbolSize[1] / 2 }; disableAnimation ? symbolPath.attr(target) : updateProps$1(symbolPath, target, seriesModel, idx); saveOldStyle(symbolPath); } this._updateCommon(data, idx, symbolSize, seriesScope, opts); if (isInit) { var symbolPath = this.childAt(0); if (!disableAnimation) { var target = { scaleX: this._sizeX, scaleY: this._sizeY, style: { // Always fadeIn. Because it has fadeOut animation when symbol is removed.. opacity: symbolPath.style.opacity } }; symbolPath.scaleX = symbolPath.scaleY = 0; symbolPath.style.opacity = 0; initProps(symbolPath, target, seriesModel, idx); } } if (disableAnimation) { this.childAt(0).stopAnimation("leave"); } }; Symbol2.prototype._updateCommon = function(data, idx, symbolSize, seriesScope, opts) { var symbolPath = this.childAt(0); var seriesModel = data.hostModel; var emphasisItemStyle; var blurItemStyle; var selectItemStyle; var focus; var blurScope; var emphasisDisabled; var labelStatesModels; var hoverScale; var cursorStyle; if (seriesScope) { emphasisItemStyle = seriesScope.emphasisItemStyle; blurItemStyle = seriesScope.blurItemStyle; selectItemStyle = seriesScope.selectItemStyle; focus = seriesScope.focus; blurScope = seriesScope.blurScope; labelStatesModels = seriesScope.labelStatesModels; hoverScale = seriesScope.hoverScale; cursorStyle = seriesScope.cursorStyle; emphasisDisabled = seriesScope.emphasisDisabled; } if (!seriesScope || data.hasItemOption) { var itemModel = seriesScope && seriesScope.itemModel ? seriesScope.itemModel : data.getItemModel(idx); var emphasisModel = itemModel.getModel("emphasis"); emphasisItemStyle = emphasisModel.getModel("itemStyle").getItemStyle(); selectItemStyle = itemModel.getModel(["select", "itemStyle"]).getItemStyle(); blurItemStyle = itemModel.getModel(["blur", "itemStyle"]).getItemStyle(); focus = emphasisModel.get("focus"); blurScope = emphasisModel.get("blurScope"); emphasisDisabled = emphasisModel.get("disabled"); labelStatesModels = getLabelStatesModels(itemModel); hoverScale = emphasisModel.getShallow("scale"); cursorStyle = itemModel.getShallow("cursor"); } var symbolRotate = data.getItemVisual(idx, "symbolRotate"); symbolPath.attr("rotation", (symbolRotate || 0) * Math.PI / 180 || 0); var symbolOffset = normalizeSymbolOffset(data.getItemVisual(idx, "symbolOffset"), symbolSize); if (symbolOffset) { symbolPath.x = symbolOffset[0]; symbolPath.y = symbolOffset[1]; } cursorStyle && symbolPath.attr("cursor", cursorStyle); var symbolStyle = data.getItemVisual(idx, "style"); var visualColor = symbolStyle.fill; if (symbolPath instanceof ZRImage) { var pathStyle = symbolPath.style; symbolPath.useStyle(extend({ // TODO other properties like x, y ? image: pathStyle.image, x: pathStyle.x, y: pathStyle.y, width: pathStyle.width, height: pathStyle.height }, symbolStyle)); } else { if (symbolPath.__isEmptyBrush) { symbolPath.useStyle(extend({}, symbolStyle)); } else { symbolPath.useStyle(symbolStyle); } symbolPath.style.decal = null; symbolPath.setColor(visualColor, opts && opts.symbolInnerColor); symbolPath.style.strokeNoScale = true; } var liftZ = data.getItemVisual(idx, "liftZ"); var z2Origin = this._z2; if (liftZ != null) { if (z2Origin == null) { this._z2 = symbolPath.z2; symbolPath.z2 += liftZ; } } else if (z2Origin != null) { symbolPath.z2 = z2Origin; this._z2 = null; } var useNameLabel = opts && opts.useNameLabel; setLabelStyle(symbolPath, labelStatesModels, { labelFetcher: seriesModel, labelDataIndex: idx, defaultText: getLabelDefaultText, inheritColor: visualColor, defaultOpacity: symbolStyle.opacity }); function getLabelDefaultText(idx2) { return useNameLabel ? data.getName(idx2) : getDefaultLabel(data, idx2); } this._sizeX = symbolSize[0] / 2; this._sizeY = symbolSize[1] / 2; var emphasisState = symbolPath.ensureState("emphasis"); emphasisState.style = emphasisItemStyle; symbolPath.ensureState("select").style = selectItemStyle; symbolPath.ensureState("blur").style = blurItemStyle; var scaleRatio = hoverScale == null || hoverScale === true ? Math.max(1.1, 3 / this._sizeY) : isFinite(hoverScale) && hoverScale > 0 ? +hoverScale : 1; emphasisState.scaleX = this._sizeX * scaleRatio; emphasisState.scaleY = this._sizeY * scaleRatio; this.setSymbolScale(1); toggleHoverEmphasis(this, focus, blurScope, emphasisDisabled); }; Symbol2.prototype.setSymbolScale = function(scale2) { this.scaleX = this.scaleY = scale2; }; Symbol2.prototype.fadeOut = function(cb, seriesModel, opt) { var symbolPath = this.childAt(0); var dataIndex = getECData(this).dataIndex; var animationOpt = opt && opt.animation; this.silent = symbolPath.silent = true; if (opt && opt.fadeLabel) { var textContent = symbolPath.getTextContent(); if (textContent) { removeElement(textContent, { style: { opacity: 0 } }, seriesModel, { dataIndex, removeOpt: animationOpt, cb: function() { symbolPath.removeTextContent(); } }); } } else { symbolPath.removeTextContent(); } removeElement(symbolPath, { style: { opacity: 0 }, scaleX: 0, scaleY: 0 }, seriesModel, { dataIndex, cb, removeOpt: animationOpt }); }; Symbol2.getSymbolSize = function(data, idx) { return normalizeSymbolSize(data.getItemVisual(idx, "symbolSize")); }; return Symbol2; })(Group$3) ); function driftSymbol(dx, dy) { this.parent.drift(dx, dy); } function symbolNeedsDraw$1(data, point, idx, opt) { return point && !isNaN(point[0]) && !isNaN(point[1]) && !(opt.isIgnore && opt.isIgnore(idx)) && !(opt.clipShape && !opt.clipShape.contain(point[0], point[1])) && data.getItemVisual(idx, "symbol") !== "none"; } function normalizeUpdateOpt(opt) { if (opt != null && !isObject$3(opt)) { opt = { isIgnore: opt }; } return opt || {}; } function makeSeriesScope$2(data) { var seriesModel = data.hostModel; var emphasisModel = seriesModel.getModel("emphasis"); return { emphasisItemStyle: emphasisModel.getModel("itemStyle").getItemStyle(), blurItemStyle: seriesModel.getModel(["blur", "itemStyle"]).getItemStyle(), selectItemStyle: seriesModel.getModel(["select", "itemStyle"]).getItemStyle(), focus: emphasisModel.get("focus"), blurScope: emphasisModel.get("blurScope"), emphasisDisabled: emphasisModel.get("disabled"), hoverScale: emphasisModel.get("scale"), labelStatesModels: getLabelStatesModels(seriesModel), cursorStyle: seriesModel.get("cursor") }; } var SymbolDraw = ( /** @class */ (function() { function SymbolDraw2(SymbolCtor) { this.group = new Group$3(); this._SymbolCtor = SymbolCtor || Symbol$1; } SymbolDraw2.prototype.updateData = function(data, opt) { this._progressiveEls = null; opt = normalizeUpdateOpt(opt); var group = this.group; var seriesModel = data.hostModel; var oldData = this._data; var SymbolCtor = this._SymbolCtor; var disableAnimation = opt.disableAnimation; var seriesScope = makeSeriesScope$2(data); var symbolUpdateOpt = { disableAnimation }; var getSymbolPoint = opt.getSymbolPoint || function(idx) { return data.getItemLayout(idx); }; if (!oldData) { group.removeAll(); } data.diff(oldData).add(function(newIdx) { var point = getSymbolPoint(newIdx); if (symbolNeedsDraw$1(data, point, newIdx, opt)) { var symbolEl = new SymbolCtor(data, newIdx, seriesScope, symbolUpdateOpt); symbolEl.setPosition(point); data.setItemGraphicEl(newIdx, symbolEl); group.add(symbolEl); } }).update(function(newIdx, oldIdx) { var symbolEl = oldData.getItemGraphicEl(oldIdx); var point = getSymbolPoint(newIdx); if (!symbolNeedsDraw$1(data, point, newIdx, opt)) { group.remove(symbolEl); return; } var newSymbolType = data.getItemVisual(newIdx, "symbol") || "circle"; var oldSymbolType = symbolEl && symbolEl.getSymbolType && symbolEl.getSymbolType(); if (!symbolEl || oldSymbolType && oldSymbolType !== newSymbolType) { group.remove(symbolEl); symbolEl = new SymbolCtor(data, newIdx, seriesScope, symbolUpdateOpt); symbolEl.setPosition(point); } else { symbolEl.updateData(data, newIdx, seriesScope, symbolUpdateOpt); var target = { x: point[0], y: point[1] }; disableAnimation ? symbolEl.attr(target) : updateProps$1(symbolEl, target, seriesModel); } group.add(symbolEl); data.setItemGraphicEl(newIdx, symbolEl); }).remove(function(oldIdx) { var el = oldData.getItemGraphicEl(oldIdx); el && el.fadeOut(function() { group.remove(el); }, seriesModel); }).execute(); this._getSymbolPoint = getSymbolPoint; this._data = data; }; SymbolDraw2.prototype.updateLayout = function() { var _this = this; var data = this._data; if (data) { data.eachItemGraphicEl(function(el, idx) { var point = _this._getSymbolPoint(idx); el.setPosition(point); el.markRedraw(); }); } }; SymbolDraw2.prototype.incrementalPrepareUpdate = function(data) { this._seriesScope = makeSeriesScope$2(data); this._data = null; this.group.removeAll(); }; SymbolDraw2.prototype.incrementalUpdate = function(taskParams, data, opt) { this._progressiveEls = []; opt = normalizeUpdateOpt(opt); function updateIncrementalAndHover(el2) { if (!el2.isGroup) { el2.incremental = true; el2.ensureState("emphasis").hoverLayer = true; } } for (var idx = taskParams.start; idx < taskParams.end; idx++) { var point = data.getItemLayout(idx); if (symbolNeedsDraw$1(data, point, idx, opt)) { var el = new this._SymbolCtor(data, idx, this._seriesScope); el.traverse(updateIncrementalAndHover); el.setPosition(point); this.group.add(el); data.setItemGraphicEl(idx, el); this._progressiveEls.push(el); } } }; SymbolDraw2.prototype.eachRendered = function(cb) { traverseElements(this._progressiveEls || this.group, cb); }; SymbolDraw2.prototype.remove = function(enableAnimation) { var group = this.group; var data = this._data; if (data && enableAnimation) { data.eachItemGraphicEl(function(el) { el.fadeOut(function() { group.remove(el); }, data.hostModel); }); } else { group.removeAll(); } }; return SymbolDraw2; })() ); function prepareDataCoordInfo(coordSys, data, valueOrigin) { var baseAxis = coordSys.getBaseAxis(); var valueAxis2 = coordSys.getOtherAxis(baseAxis); var valueStart = getValueStart(valueAxis2, valueOrigin); var baseAxisDim = baseAxis.dim; var valueAxisDim = valueAxis2.dim; var valueDim = data.mapDimension(valueAxisDim); var baseDim = data.mapDimension(baseAxisDim); var baseDataOffset = valueAxisDim === "x" || valueAxisDim === "radius" ? 1 : 0; var dims = map$1(coordSys.dimensions, function(coordDim) { return data.mapDimension(coordDim); }); var stacked = false; var stackResultDim = data.getCalculationInfo("stackResultDimension"); if (isDimensionStacked( data, dims[0] /* , dims[1] */ )) { stacked = true; dims[0] = stackResultDim; } if (isDimensionStacked( data, dims[1] /* , dims[0] */ )) { stacked = true; dims[1] = stackResultDim; } return { dataDimsForPoint: dims, valueStart, valueAxisDim, baseAxisDim, stacked: !!stacked, valueDim, baseDim, baseDataOffset, stackedOverDimension: data.getCalculationInfo("stackedOverDimension") }; } function getValueStart(valueAxis2, valueOrigin) { var valueStart = 0; var extent = valueAxis2.scale.getExtent(); if (valueOrigin === "start") { valueStart = extent[0]; } else if (valueOrigin === "end") { valueStart = extent[1]; } else if (isNumber(valueOrigin) && !isNaN(valueOrigin)) { valueStart = valueOrigin; } else { if (extent[0] > 0) { valueStart = extent[0]; } else if (extent[1] < 0) { valueStart = extent[1]; } } return valueStart; } function getStackedOnPoint(dataCoordInfo, coordSys, data, idx) { var value = NaN; if (dataCoordInfo.stacked) { value = data.get(data.getCalculationInfo("stackedOverDimension"), idx); } if (isNaN(value)) { value = dataCoordInfo.valueStart; } var baseDataOffset = dataCoordInfo.baseDataOffset; var stackedData = []; stackedData[baseDataOffset] = data.get(dataCoordInfo.baseDim, idx); stackedData[1 - baseDataOffset] = value; return coordSys.dataToPoint(stackedData); } function diffData(oldData, newData) { var diffResult = []; newData.diff(oldData).add(function(idx) { diffResult.push({ cmd: "+", idx }); }).update(function(newIdx, oldIdx) { diffResult.push({ cmd: "=", idx: oldIdx, idx1: newIdx }); }).remove(function(idx) { diffResult.push({ cmd: "-", idx }); }).execute(); return diffResult; } function lineAnimationDiff(oldData, newData, oldStackedOnPoints, newStackedOnPoints, oldCoordSys, newCoordSys, oldValueOrigin, newValueOrigin) { var diff = diffData(oldData, newData); var currPoints = []; var nextPoints = []; var currStackedPoints = []; var nextStackedPoints = []; var status = []; var sortedIndices = []; var rawIndices = []; var newDataOldCoordInfo = prepareDataCoordInfo(oldCoordSys, newData, oldValueOrigin); var oldPoints = oldData.getLayout("points") || []; var newPoints = newData.getLayout("points") || []; for (var i = 0; i < diff.length; i++) { var diffItem = diff[i]; var pointAdded = true; var oldIdx2 = void 0; var newIdx2 = void 0; switch (diffItem.cmd) { case "=": oldIdx2 = diffItem.idx * 2; newIdx2 = diffItem.idx1 * 2; var currentX = oldPoints[oldIdx2]; var currentY = oldPoints[oldIdx2 + 1]; var nextX = newPoints[newIdx2]; var nextY = newPoints[newIdx2 + 1]; if (isNaN(currentX) || isNaN(currentY)) { currentX = nextX; currentY = nextY; } currPoints.push(currentX, currentY); nextPoints.push(nextX, nextY); currStackedPoints.push(oldStackedOnPoints[oldIdx2], oldStackedOnPoints[oldIdx2 + 1]); nextStackedPoints.push(newStackedOnPoints[newIdx2], newStackedOnPoints[newIdx2 + 1]); rawIndices.push(newData.getRawIndex(diffItem.idx1)); break; case "+": var newIdx = diffItem.idx; var newDataDimsForPoint = newDataOldCoordInfo.dataDimsForPoint; var oldPt = oldCoordSys.dataToPoint([newData.get(newDataDimsForPoint[0], newIdx), newData.get(newDataDimsForPoint[1], newIdx)]); newIdx2 = newIdx * 2; currPoints.push(oldPt[0], oldPt[1]); nextPoints.push(newPoints[newIdx2], newPoints[newIdx2 + 1]); var stackedOnPoint = getStackedOnPoint(newDataOldCoordInfo, oldCoordSys, newData, newIdx); currStackedPoints.push(stackedOnPoint[0], stackedOnPoint[1]); nextStackedPoints.push(newStackedOnPoints[newIdx2], newStackedOnPoints[newIdx2 + 1]); rawIndices.push(newData.getRawIndex(newIdx)); break; case "-": pointAdded = false; } if (pointAdded) { status.push(diffItem); sortedIndices.push(sortedIndices.length); } } sortedIndices.sort(function(a, b) { return rawIndices[a] - rawIndices[b]; }); var len2 = currPoints.length; var sortedCurrPoints = createFloat32Array(len2); var sortedNextPoints = createFloat32Array(len2); var sortedCurrStackedPoints = createFloat32Array(len2); var sortedNextStackedPoints = createFloat32Array(len2); var sortedStatus = []; for (var i = 0; i < sortedIndices.length; i++) { var idx = sortedIndices[i]; var i2 = i * 2; var idx2 = idx * 2; sortedCurrPoints[i2] = currPoints[idx2]; sortedCurrPoints[i2 + 1] = currPoints[idx2 + 1]; sortedNextPoints[i2] = nextPoints[idx2]; sortedNextPoints[i2 + 1] = nextPoints[idx2 + 1]; sortedCurrStackedPoints[i2] = currStackedPoints[idx2]; sortedCurrStackedPoints[i2 + 1] = currStackedPoints[idx2 + 1]; sortedNextStackedPoints[i2] = nextStackedPoints[idx2]; sortedNextStackedPoints[i2 + 1] = nextStackedPoints[idx2 + 1]; sortedStatus[i] = status[idx]; } return { current: sortedCurrPoints, next: sortedNextPoints, stackedOnCurrent: sortedCurrStackedPoints, stackedOnNext: sortedNextStackedPoints, status: sortedStatus }; } var mathMin$5 = Math.min; var mathMax$5 = Math.max; function isPointNull$1(x, y) { return isNaN(x) || isNaN(y); } function drawSegment(ctx, points2, start, segLen, allLen, dir3, smooth, smoothMonotone, connectNulls) { var prevX; var prevY; var cpx0; var cpy0; var cpx1; var cpy1; var idx = start; var k = 0; for (; k < segLen; k++) { var x = points2[idx * 2]; var y = points2[idx * 2 + 1]; if (idx >= allLen || idx < 0) { break; } if (isPointNull$1(x, y)) { if (connectNulls) { idx += dir3; continue; } break; } if (idx === start) { ctx[dir3 > 0 ? "moveTo" : "lineTo"](x, y); cpx0 = x; cpy0 = y; } else { var dx = x - prevX; var dy = y - prevY; if (dx * dx + dy * dy < 0.5) { idx += dir3; continue; } if (smooth > 0) { var nextIdx = idx + dir3; var nextX = points2[nextIdx * 2]; var nextY = points2[nextIdx * 2 + 1]; while (nextX === x && nextY === y && k < segLen) { k++; nextIdx += dir3; idx += dir3; nextX = points2[nextIdx * 2]; nextY = points2[nextIdx * 2 + 1]; x = points2[idx * 2]; y = points2[idx * 2 + 1]; dx = x - prevX; dy = y - prevY; } var tmpK = k + 1; if (connectNulls) { while (isPointNull$1(nextX, nextY) && tmpK < segLen) { tmpK++; nextIdx += dir3; nextX = points2[nextIdx * 2]; nextY = points2[nextIdx * 2 + 1]; } } var ratioNextSeg = 0.5; var vx = 0; var vy = 0; var nextCpx0 = void 0; var nextCpy0 = void 0; if (tmpK >= segLen || isPointNull$1(nextX, nextY)) { cpx1 = x; cpy1 = y; } else { vx = nextX - prevX; vy = nextY - prevY; var dx0 = x - prevX; var dx1 = nextX - x; var dy0 = y - prevY; var dy1 = nextY - y; var lenPrevSeg = void 0; var lenNextSeg = void 0; if (smoothMonotone === "x") { lenPrevSeg = Math.abs(dx0); lenNextSeg = Math.abs(dx1); var dir_1 = vx > 0 ? 1 : -1; cpx1 = x - dir_1 * lenPrevSeg * smooth; cpy1 = y; nextCpx0 = x + dir_1 * lenNextSeg * smooth; nextCpy0 = y; } else if (smoothMonotone === "y") { lenPrevSeg = Math.abs(dy0); lenNextSeg = Math.abs(dy1); var dir_2 = vy > 0 ? 1 : -1; cpx1 = x; cpy1 = y - dir_2 * lenPrevSeg * smooth; nextCpx0 = x; nextCpy0 = y + dir_2 * lenNextSeg * smooth; } else { lenPrevSeg = Math.sqrt(dx0 * dx0 + dy0 * dy0); lenNextSeg = Math.sqrt(dx1 * dx1 + dy1 * dy1); ratioNextSeg = lenNextSeg / (lenNextSeg + lenPrevSeg); cpx1 = x - vx * smooth * (1 - ratioNextSeg); cpy1 = y - vy * smooth * (1 - ratioNextSeg); nextCpx0 = x + vx * smooth * ratioNextSeg; nextCpy0 = y + vy * smooth * ratioNextSeg; nextCpx0 = mathMin$5(nextCpx0, mathMax$5(nextX, x)); nextCpy0 = mathMin$5(nextCpy0, mathMax$5(nextY, y)); nextCpx0 = mathMax$5(nextCpx0, mathMin$5(nextX, x)); nextCpy0 = mathMax$5(nextCpy0, mathMin$5(nextY, y)); vx = nextCpx0 - x; vy = nextCpy0 - y; cpx1 = x - vx * lenPrevSeg / lenNextSeg; cpy1 = y - vy * lenPrevSeg / lenNextSeg; cpx1 = mathMin$5(cpx1, mathMax$5(prevX, x)); cpy1 = mathMin$5(cpy1, mathMax$5(prevY, y)); cpx1 = mathMax$5(cpx1, mathMin$5(prevX, x)); cpy1 = mathMax$5(cpy1, mathMin$5(prevY, y)); vx = x - cpx1; vy = y - cpy1; nextCpx0 = x + vx * lenNextSeg / lenPrevSeg; nextCpy0 = y + vy * lenNextSeg / lenPrevSeg; } } ctx.bezierCurveTo(cpx0, cpy0, cpx1, cpy1, x, y); cpx0 = nextCpx0; cpy0 = nextCpy0; } else { ctx.lineTo(x, y); } } prevX = x; prevY = y; idx += dir3; } return k; } var ECPolylineShape = ( /** @class */ /* @__PURE__ */ (function() { function ECPolylineShape2() { this.smooth = 0; this.smoothConstraint = true; } return ECPolylineShape2; })() ); var ECPolyline = ( /** @class */ (function(_super) { __extends(ECPolyline2, _super); function ECPolyline2(opts) { var _this = _super.call(this, opts) || this; _this.type = "ec-polyline"; return _this; } ECPolyline2.prototype.getDefaultStyle = function() { return { stroke: "#000", fill: null }; }; ECPolyline2.prototype.getDefaultShape = function() { return new ECPolylineShape(); }; ECPolyline2.prototype.buildPath = function(ctx, shape) { var points2 = shape.points; var i = 0; var len2 = points2.length / 2; if (shape.connectNulls) { for (; len2 > 0; len2--) { if (!isPointNull$1(points2[len2 * 2 - 2], points2[len2 * 2 - 1])) { break; } } for (; i < len2; i++) { if (!isPointNull$1(points2[i * 2], points2[i * 2 + 1])) { break; } } } while (i < len2) { i += drawSegment(ctx, points2, i, len2, len2, 1, shape.smooth, shape.smoothMonotone, shape.connectNulls) + 1; } }; ECPolyline2.prototype.getPointOn = function(xOrY, dim) { if (!this.path) { this.createPathProxy(); this.buildPath(this.path, this.shape); } var path = this.path; var data = path.data; var CMD2 = PathProxy.CMD; var x0; var y0; var isDimX = dim === "x"; var roots = []; for (var i = 0; i < data.length; ) { var cmd = data[i++]; var x = void 0; var y = void 0; var x2 = void 0; var y2 = void 0; var x3 = void 0; var y3 = void 0; var t = void 0; switch (cmd) { case CMD2.M: x0 = data[i++]; y0 = data[i++]; break; case CMD2.L: x = data[i++]; y = data[i++]; t = isDimX ? (xOrY - x0) / (x - x0) : (xOrY - y0) / (y - y0); if (t <= 1 && t >= 0) { var val = isDimX ? (y - y0) * t + y0 : (x - x0) * t + x0; return isDimX ? [xOrY, val] : [val, xOrY]; } x0 = x; y0 = y; break; case CMD2.C: x = data[i++]; y = data[i++]; x2 = data[i++]; y2 = data[i++]; x3 = data[i++]; y3 = data[i++]; var nRoot = isDimX ? cubicRootAt(x0, x, x2, x3, xOrY, roots) : cubicRootAt(y0, y, y2, y3, xOrY, roots); if (nRoot > 0) { for (var i_1 = 0; i_1 < nRoot; i_1++) { var t_1 = roots[i_1]; if (t_1 <= 1 && t_1 >= 0) { var val = isDimX ? cubicAt(y0, y, y2, y3, t_1) : cubicAt(x0, x, x2, x3, t_1); return isDimX ? [xOrY, val] : [val, xOrY]; } } } x0 = x3; y0 = y3; break; } } }; return ECPolyline2; })(Path) ); var ECPolygonShape = ( /** @class */ (function(_super) { __extends(ECPolygonShape2, _super); function ECPolygonShape2() { return _super !== null && _super.apply(this, arguments) || this; } return ECPolygonShape2; })(ECPolylineShape) ); var ECPolygon = ( /** @class */ (function(_super) { __extends(ECPolygon2, _super); function ECPolygon2(opts) { var _this = _super.call(this, opts) || this; _this.type = "ec-polygon"; return _this; } ECPolygon2.prototype.getDefaultShape = function() { return new ECPolygonShape(); }; ECPolygon2.prototype.buildPath = function(ctx, shape) { var points2 = shape.points; var stackedOnPoints = shape.stackedOnPoints; var i = 0; var len2 = points2.length / 2; var smoothMonotone = shape.smoothMonotone; if (shape.connectNulls) { for (; len2 > 0; len2--) { if (!isPointNull$1(points2[len2 * 2 - 2], points2[len2 * 2 - 1])) { break; } } for (; i < len2; i++) { if (!isPointNull$1(points2[i * 2], points2[i * 2 + 1])) { break; } } } while (i < len2) { var k = drawSegment(ctx, points2, i, len2, len2, 1, shape.smooth, smoothMonotone, shape.connectNulls); drawSegment(ctx, stackedOnPoints, i + k - 1, k, len2, -1, shape.stackedOnSmooth, smoothMonotone, shape.connectNulls); i += k + 1; ctx.closePath(); } }; return ECPolygon2; })(Path) ); function createGridClipPath(cartesian, hasAnimation, seriesModel, done, during) { var rect = cartesian.getArea(); var x = rect.x; var y = rect.y; var width = rect.width; var height = rect.height; var lineWidth = seriesModel.get(["lineStyle", "width"]) || 0; x -= lineWidth / 2; y -= lineWidth / 2; width += lineWidth; height += lineWidth; width = Math.ceil(width); if (x !== Math.floor(x)) { x = Math.floor(x); width++; } var clipPath = new Rect$2({ shape: { x, y, width, height } }); if (hasAnimation) { var baseAxis = cartesian.getBaseAxis(); var isHorizontal = baseAxis.isHorizontal(); var isAxisInversed = baseAxis.inverse; if (isHorizontal) { if (isAxisInversed) { clipPath.shape.x += width; } clipPath.shape.width = 0; } else { if (!isAxisInversed) { clipPath.shape.y += height; } clipPath.shape.height = 0; } var duringCb = isFunction(during) ? function(percent) { during(percent, clipPath); } : null; initProps(clipPath, { shape: { width, height, x, y } }, seriesModel, null, done, duringCb); } return clipPath; } function createPolarClipPath(polar, hasAnimation, seriesModel) { var sectorArea = polar.getArea(); var r0 = round$1(sectorArea.r0, 1); var r = round$1(sectorArea.r, 1); var clipPath = new Sector({ shape: { cx: round$1(polar.cx, 1), cy: round$1(polar.cy, 1), r0, r, startAngle: sectorArea.startAngle, endAngle: sectorArea.endAngle, clockwise: sectorArea.clockwise } }); if (hasAnimation) { var isRadial = polar.getBaseAxis().dim === "angle"; if (isRadial) { clipPath.shape.endAngle = sectorArea.startAngle; } else { clipPath.shape.r = r0; } initProps(clipPath, { shape: { endAngle: sectorArea.endAngle, r } }, seriesModel); } return clipPath; } function createClipPath(coordSys, hasAnimation, seriesModel, done, during) { if (!coordSys) { return null; } else if (coordSys.type === "polar") { return createPolarClipPath(coordSys, hasAnimation, seriesModel); } else if (coordSys.type === "cartesian2d") { return createGridClipPath(coordSys, hasAnimation, seriesModel, done, during); } return null; } function isCoordinateSystemType(coordSys, type) { return coordSys.type === type; } function isPointsSame(points1, points2) { if (points1.length !== points2.length) { return; } for (var i = 0; i < points1.length; i++) { if (points1[i] !== points2[i]) { return; } } return true; } function bboxFromPoints(points2) { var minX = Infinity; var minY = Infinity; var maxX = -Infinity; var maxY = -Infinity; for (var i = 0; i < points2.length; ) { var x = points2[i++]; var y = points2[i++]; if (!isNaN(x)) { minX = Math.min(x, minX); maxX = Math.max(x, maxX); } if (!isNaN(y)) { minY = Math.min(y, minY); maxY = Math.max(y, maxY); } } return [[minX, minY], [maxX, maxY]]; } function getBoundingDiff(points1, points2) { var _a2 = bboxFromPoints(points1), min1 = _a2[0], max1 = _a2[1]; var _b2 = bboxFromPoints(points2), min2 = _b2[0], max2 = _b2[1]; return Math.max(Math.abs(min1[0] - min2[0]), Math.abs(min1[1] - min2[1]), Math.abs(max1[0] - max2[0]), Math.abs(max1[1] - max2[1])); } function getSmooth(smooth) { return isNumber(smooth) ? smooth : smooth ? 0.5 : 0; } function getStackedOnPoints(coordSys, data, dataCoordInfo) { if (!dataCoordInfo.valueDim) { return []; } var len2 = data.count(); var points2 = createFloat32Array(len2 * 2); for (var idx = 0; idx < len2; idx++) { var pt = getStackedOnPoint(dataCoordInfo, coordSys, data, idx); points2[idx * 2] = pt[0]; points2[idx * 2 + 1] = pt[1]; } return points2; } function turnPointsIntoStep(points2, basePoints, coordSys, stepTurnAt, connectNulls) { var baseAxis = coordSys.getBaseAxis(); var baseIndex = baseAxis.dim === "x" || baseAxis.dim === "radius" ? 0 : 1; var stepPoints = []; var i = 0; var stepPt = []; var pt = []; var nextPt = []; var filteredPoints = []; if (connectNulls) { for (i = 0; i < points2.length; i += 2) { var reference = basePoints || points2; if (!isNaN(reference[i]) && !isNaN(reference[i + 1])) { filteredPoints.push(points2[i], points2[i + 1]); } } points2 = filteredPoints; } for (i = 0; i < points2.length - 2; i += 2) { nextPt[0] = points2[i + 2]; nextPt[1] = points2[i + 3]; pt[0] = points2[i]; pt[1] = points2[i + 1]; stepPoints.push(pt[0], pt[1]); switch (stepTurnAt) { case "end": stepPt[baseIndex] = nextPt[baseIndex]; stepPt[1 - baseIndex] = pt[1 - baseIndex]; stepPoints.push(stepPt[0], stepPt[1]); break; case "middle": var middle = (pt[baseIndex] + nextPt[baseIndex]) / 2; var stepPt2 = []; stepPt[baseIndex] = stepPt2[baseIndex] = middle; stepPt[1 - baseIndex] = pt[1 - baseIndex]; stepPt2[1 - baseIndex] = nextPt[1 - baseIndex]; stepPoints.push(stepPt[0], stepPt[1]); stepPoints.push(stepPt2[0], stepPt2[1]); break; default: stepPt[baseIndex] = pt[baseIndex]; stepPt[1 - baseIndex] = nextPt[1 - baseIndex]; stepPoints.push(stepPt[0], stepPt[1]); } } stepPoints.push(points2[i++], points2[i++]); return stepPoints; } function clipColorStops(colorStops, maxSize) { var newColorStops = []; var len2 = colorStops.length; var prevOutOfRangeColorStop; var prevInRangeColorStop; function lerpStop(stop0, stop1, clippedCoord) { var coord0 = stop0.coord; var p = (clippedCoord - coord0) / (stop1.coord - coord0); var color = lerp$1(p, [stop0.color, stop1.color]); return { coord: clippedCoord, color }; } for (var i = 0; i < len2; i++) { var stop_1 = colorStops[i]; var coord = stop_1.coord; if (coord < 0) { prevOutOfRangeColorStop = stop_1; } else if (coord > maxSize) { if (prevInRangeColorStop) { newColorStops.push(lerpStop(prevInRangeColorStop, stop_1, maxSize)); } else if (prevOutOfRangeColorStop) { newColorStops.push(lerpStop(prevOutOfRangeColorStop, stop_1, 0), lerpStop(prevOutOfRangeColorStop, stop_1, maxSize)); } break; } else { if (prevOutOfRangeColorStop) { newColorStops.push(lerpStop(prevOutOfRangeColorStop, stop_1, 0)); prevOutOfRangeColorStop = null; } newColorStops.push(stop_1); prevInRangeColorStop = stop_1; } } return newColorStops; } function getVisualGradient(data, coordSys, api) { var visualMetaList = data.getVisual("visualMeta"); if (!visualMetaList || !visualMetaList.length || !data.count()) { return; } if (coordSys.type !== "cartesian2d") { return; } var coordDim; var visualMeta; for (var i = visualMetaList.length - 1; i >= 0; i--) { var dimInfo = data.getDimensionInfo(visualMetaList[i].dimension); coordDim = dimInfo && dimInfo.coordDim; if (coordDim === "x" || coordDim === "y") { visualMeta = visualMetaList[i]; break; } } if (!visualMeta) { return; } var axis = coordSys.getAxis(coordDim); var colorStops = map$1(visualMeta.stops, function(stop2) { return { coord: axis.toGlobalCoord(axis.dataToCoord(stop2.value)), color: stop2.color }; }); var stopLen = colorStops.length; var outerColors = visualMeta.outerColors.slice(); if (stopLen && colorStops[0].coord > colorStops[stopLen - 1].coord) { colorStops.reverse(); outerColors.reverse(); } var colorStopsInRange = clipColorStops(colorStops, coordDim === "x" ? api.getWidth() : api.getHeight()); var inRangeStopLen = colorStopsInRange.length; if (!inRangeStopLen && stopLen) { return colorStops[0].coord < 0 ? outerColors[1] ? outerColors[1] : colorStops[stopLen - 1].color : outerColors[0] ? outerColors[0] : colorStops[0].color; } var tinyExtent = 10; var minCoord = colorStopsInRange[0].coord - tinyExtent; var maxCoord = colorStopsInRange[inRangeStopLen - 1].coord + tinyExtent; var coordSpan = maxCoord - minCoord; if (coordSpan < 1e-3) { return "transparent"; } each$f(colorStopsInRange, function(stop2) { stop2.offset = (stop2.coord - minCoord) / coordSpan; }); colorStopsInRange.push({ // NOTE: inRangeStopLen may still be 0 if stoplen is zero. offset: inRangeStopLen ? colorStopsInRange[inRangeStopLen - 1].offset : 0.5, color: outerColors[1] || "transparent" }); colorStopsInRange.unshift({ offset: inRangeStopLen ? colorStopsInRange[0].offset : 0.5, color: outerColors[0] || "transparent" }); var gradient = new LinearGradient(0, 0, 0, 0, colorStopsInRange, true); gradient[coordDim] = minCoord; gradient[coordDim + "2"] = maxCoord; return gradient; } function getIsIgnoreFunc(seriesModel, data, coordSys) { var showAllSymbol = seriesModel.get("showAllSymbol"); var isAuto = showAllSymbol === "auto"; if (showAllSymbol && !isAuto) { return; } var categoryAxis2 = coordSys.getAxesByScale("ordinal")[0]; if (!categoryAxis2) { return; } if (isAuto && canShowAllSymbolForCategory(categoryAxis2, data)) { return; } var categoryDataDim = data.mapDimension(categoryAxis2.dim); var labelMap = {}; each$f(categoryAxis2.getViewLabels(), function(labelItem) { var ordinalNumber = categoryAxis2.scale.getRawOrdinalNumber(labelItem.tickValue); labelMap[ordinalNumber] = 1; }); return function(dataIndex) { return !labelMap.hasOwnProperty(data.get(categoryDataDim, dataIndex)); }; } function canShowAllSymbolForCategory(categoryAxis2, data) { var axisExtent = categoryAxis2.getExtent(); var availSize = Math.abs(axisExtent[1] - axisExtent[0]) / categoryAxis2.scale.count(); isNaN(availSize) && (availSize = 0); var dataLen = data.count(); var step = Math.max(1, Math.round(dataLen / 5)); for (var dataIndex = 0; dataIndex < dataLen; dataIndex += step) { if (Symbol$1.getSymbolSize( data, dataIndex // Only for cartesian, where `isHorizontal` exists. )[categoryAxis2.isHorizontal() ? 1 : 0] * 1.5 > availSize) { return false; } } return true; } function isPointNull(x, y) { return isNaN(x) || isNaN(y); } function getLastIndexNotNull(points2) { var len2 = points2.length / 2; for (; len2 > 0; len2--) { if (!isPointNull(points2[len2 * 2 - 2], points2[len2 * 2 - 1])) { break; } } return len2 - 1; } function getPointAtIndex(points2, idx) { return [points2[idx * 2], points2[idx * 2 + 1]]; } function getIndexRange(points2, xOrY, dim) { var len2 = points2.length / 2; var dimIdx = dim === "x" ? 0 : 1; var a; var b; var prevIndex = 0; var nextIndex = -1; for (var i = 0; i < len2; i++) { b = points2[i * 2 + dimIdx]; if (isNaN(b) || isNaN(points2[i * 2 + 1 - dimIdx])) { continue; } if (i === 0) { a = b; continue; } if (a <= xOrY && b >= xOrY || a >= xOrY && b <= xOrY) { nextIndex = i; break; } prevIndex = i; a = b; } return { range: [prevIndex, nextIndex], t: (xOrY - a) / (b - a) }; } function anyStateShowEndLabel(seriesModel) { if (seriesModel.get(["endLabel", "show"])) { return true; } for (var i = 0; i < SPECIAL_STATES.length; i++) { if (seriesModel.get([SPECIAL_STATES[i], "endLabel", "show"])) { return true; } } return false; } function createLineClipPath(lineView, coordSys, hasAnimation, seriesModel) { if (isCoordinateSystemType(coordSys, "cartesian2d")) { var endLabelModel_1 = seriesModel.getModel("endLabel"); var valueAnimation_1 = endLabelModel_1.get("valueAnimation"); var data_1 = seriesModel.getData(); var labelAnimationRecord_1 = { lastFrameIndex: 0 }; var during = anyStateShowEndLabel(seriesModel) ? function(percent, clipRect) { lineView._endLabelOnDuring(percent, clipRect, data_1, labelAnimationRecord_1, valueAnimation_1, endLabelModel_1, coordSys); } : null; var isHorizontal = coordSys.getBaseAxis().isHorizontal(); var clipPath = createGridClipPath(coordSys, hasAnimation, seriesModel, function() { var endLabel = lineView._endLabel; if (endLabel && hasAnimation) { if (labelAnimationRecord_1.originalX != null) { endLabel.attr({ x: labelAnimationRecord_1.originalX, y: labelAnimationRecord_1.originalY }); } } }, during); if (!seriesModel.get("clip", true)) { var rectShape = clipPath.shape; var expandSize = Math.max(rectShape.width, rectShape.height); if (isHorizontal) { rectShape.y -= expandSize; rectShape.height += expandSize * 2; } else { rectShape.x -= expandSize; rectShape.width += expandSize * 2; } } if (during) { during(1, clipPath); } return clipPath; } else { return createPolarClipPath(coordSys, hasAnimation, seriesModel); } } function getEndLabelStateSpecified(endLabelModel, coordSys) { var baseAxis = coordSys.getBaseAxis(); var isHorizontal = baseAxis.isHorizontal(); var isBaseInversed = baseAxis.inverse; var align = isHorizontal ? isBaseInversed ? "right" : "left" : "center"; var verticalAlign = isHorizontal ? "middle" : isBaseInversed ? "top" : "bottom"; return { normal: { align: endLabelModel.get("align") || align, verticalAlign: endLabelModel.get("verticalAlign") || verticalAlign } }; } var LineView = ( /** @class */ (function(_super) { __extends(LineView2, _super); function LineView2() { return _super !== null && _super.apply(this, arguments) || this; } LineView2.prototype.init = function() { var lineGroup = new Group$3(); var symbolDraw = new SymbolDraw(); this.group.add(symbolDraw.group); this._symbolDraw = symbolDraw; this._lineGroup = lineGroup; this._changePolyState = bind$1(this._changePolyState, this); }; LineView2.prototype.render = function(seriesModel, ecModel, api) { var coordSys = seriesModel.coordinateSystem; var group = this.group; var data = seriesModel.getData(); var lineStyleModel = seriesModel.getModel("lineStyle"); var areaStyleModel = seriesModel.getModel("areaStyle"); var points2 = data.getLayout("points") || []; var isCoordSysPolar = coordSys.type === "polar"; var prevCoordSys = this._coordSys; var symbolDraw = this._symbolDraw; var polyline = this._polyline; var polygon = this._polygon; var lineGroup = this._lineGroup; var hasAnimation = !ecModel.ssr && seriesModel.get("animation"); var isAreaChart = !areaStyleModel.isEmpty(); var valueOrigin = areaStyleModel.get("origin"); var dataCoordInfo = prepareDataCoordInfo(coordSys, data, valueOrigin); var stackedOnPoints = isAreaChart && getStackedOnPoints(coordSys, data, dataCoordInfo); var showSymbol = seriesModel.get("showSymbol"); var connectNulls = seriesModel.get("connectNulls"); var isIgnoreFunc = showSymbol && !isCoordSysPolar && getIsIgnoreFunc(seriesModel, data, coordSys); var oldData = this._data; oldData && oldData.eachItemGraphicEl(function(el, idx) { if (el.__temp) { group.remove(el); oldData.setItemGraphicEl(idx, null); } }); if (!showSymbol) { symbolDraw.remove(); } group.add(lineGroup); var step = !isCoordSysPolar ? seriesModel.get("step") : false; var clipShapeForSymbol; if (coordSys && coordSys.getArea && seriesModel.get("clip", true)) { clipShapeForSymbol = coordSys.getArea(); if (clipShapeForSymbol.width != null) { clipShapeForSymbol.x -= 0.1; clipShapeForSymbol.y -= 0.1; clipShapeForSymbol.width += 0.2; clipShapeForSymbol.height += 0.2; } else if (clipShapeForSymbol.r0) { clipShapeForSymbol.r0 -= 0.5; clipShapeForSymbol.r += 0.5; } } this._clipShapeForSymbol = clipShapeForSymbol; var visualColor = getVisualGradient(data, coordSys, api) || data.getVisual("style")[data.getVisual("drawType")]; if (!(polyline && prevCoordSys.type === coordSys.type && step === this._step)) { showSymbol && symbolDraw.updateData(data, { isIgnore: isIgnoreFunc, clipShape: clipShapeForSymbol, disableAnimation: true, getSymbolPoint: function(idx) { return [points2[idx * 2], points2[idx * 2 + 1]]; } }); hasAnimation && this._initSymbolLabelAnimation(data, coordSys, clipShapeForSymbol); if (step) { if (stackedOnPoints) { stackedOnPoints = turnPointsIntoStep(stackedOnPoints, points2, coordSys, step, connectNulls); } points2 = turnPointsIntoStep(points2, null, coordSys, step, connectNulls); } polyline = this._newPolyline(points2); if (isAreaChart) { polygon = this._newPolygon(points2, stackedOnPoints); } else if (polygon) { lineGroup.remove(polygon); polygon = this._polygon = null; } if (!isCoordSysPolar) { this._initOrUpdateEndLabel(seriesModel, coordSys, convertToColorString(visualColor)); } lineGroup.setClipPath(createLineClipPath(this, coordSys, true, seriesModel)); } else { if (isAreaChart && !polygon) { polygon = this._newPolygon(points2, stackedOnPoints); } else if (polygon && !isAreaChart) { lineGroup.remove(polygon); polygon = this._polygon = null; } if (!isCoordSysPolar) { this._initOrUpdateEndLabel(seriesModel, coordSys, convertToColorString(visualColor)); } var oldClipPath = lineGroup.getClipPath(); if (oldClipPath) { var newClipPath = createLineClipPath(this, coordSys, false, seriesModel); initProps(oldClipPath, { shape: newClipPath.shape }, seriesModel); } else { lineGroup.setClipPath(createLineClipPath(this, coordSys, true, seriesModel)); } showSymbol && symbolDraw.updateData(data, { isIgnore: isIgnoreFunc, clipShape: clipShapeForSymbol, disableAnimation: true, getSymbolPoint: function(idx) { return [points2[idx * 2], points2[idx * 2 + 1]]; } }); if (!isPointsSame(this._stackedOnPoints, stackedOnPoints) || !isPointsSame(this._points, points2)) { if (hasAnimation) { this._doUpdateAnimation(data, stackedOnPoints, coordSys, api, step, valueOrigin, connectNulls); } else { if (step) { if (stackedOnPoints) { stackedOnPoints = turnPointsIntoStep(stackedOnPoints, points2, coordSys, step, connectNulls); } points2 = turnPointsIntoStep(points2, null, coordSys, step, connectNulls); } polyline.setShape({ points: points2 }); polygon && polygon.setShape({ points: points2, stackedOnPoints }); } } } var emphasisModel = seriesModel.getModel("emphasis"); var focus = emphasisModel.get("focus"); var blurScope = emphasisModel.get("blurScope"); var emphasisDisabled = emphasisModel.get("disabled"); polyline.useStyle(defaults( // Use color in lineStyle first lineStyleModel.getLineStyle(), { fill: "none", stroke: visualColor, lineJoin: "bevel" } )); setStatesStylesFromModel(polyline, seriesModel, "lineStyle"); if (polyline.style.lineWidth > 0 && seriesModel.get(["emphasis", "lineStyle", "width"]) === "bolder") { var emphasisLineStyle = polyline.getState("emphasis").style; emphasisLineStyle.lineWidth = +polyline.style.lineWidth + 1; } getECData(polyline).seriesIndex = seriesModel.seriesIndex; toggleHoverEmphasis(polyline, focus, blurScope, emphasisDisabled); var smooth = getSmooth(seriesModel.get("smooth")); var smoothMonotone = seriesModel.get("smoothMonotone"); polyline.setShape({ smooth, smoothMonotone, connectNulls }); if (polygon) { var stackedOnSeries = data.getCalculationInfo("stackedOnSeries"); var stackedOnSmooth = 0; polygon.useStyle(defaults(areaStyleModel.getAreaStyle(), { fill: visualColor, opacity: 0.7, lineJoin: "bevel", decal: data.getVisual("style").decal })); if (stackedOnSeries) { stackedOnSmooth = getSmooth(stackedOnSeries.get("smooth")); } polygon.setShape({ smooth, stackedOnSmooth, smoothMonotone, connectNulls }); setStatesStylesFromModel(polygon, seriesModel, "areaStyle"); getECData(polygon).seriesIndex = seriesModel.seriesIndex; toggleHoverEmphasis(polygon, focus, blurScope, emphasisDisabled); } var changePolyState = this._changePolyState; data.eachItemGraphicEl(function(el) { el && (el.onHoverStateChange = changePolyState); }); this._polyline.onHoverStateChange = changePolyState; this._data = data; this._coordSys = coordSys; this._stackedOnPoints = stackedOnPoints; this._points = points2; this._step = step; this._valueOrigin = valueOrigin; if (seriesModel.get("triggerLineEvent")) { this.packEventData(seriesModel, polyline); polygon && this.packEventData(seriesModel, polygon); } }; LineView2.prototype.packEventData = function(seriesModel, el) { getECData(el).eventData = { componentType: "series", componentSubType: "line", componentIndex: seriesModel.componentIndex, seriesIndex: seriesModel.seriesIndex, seriesName: seriesModel.name, seriesType: "line" }; }; LineView2.prototype.highlight = function(seriesModel, ecModel, api, payload) { var data = seriesModel.getData(); var dataIndex = queryDataIndex(data, payload); this._changePolyState("emphasis"); if (!(dataIndex instanceof Array) && dataIndex != null && dataIndex >= 0) { var points2 = data.getLayout("points"); var symbol = data.getItemGraphicEl(dataIndex); if (!symbol) { var x = points2[dataIndex * 2]; var y = points2[dataIndex * 2 + 1]; if (isNaN(x) || isNaN(y)) { return; } if (this._clipShapeForSymbol && !this._clipShapeForSymbol.contain(x, y)) { return; } var zlevel = seriesModel.get("zlevel") || 0; var z = seriesModel.get("z") || 0; symbol = new Symbol$1(data, dataIndex); symbol.x = x; symbol.y = y; symbol.setZ(zlevel, z); var symbolLabel = symbol.getSymbolPath().getTextContent(); if (symbolLabel) { symbolLabel.zlevel = zlevel; symbolLabel.z = z; symbolLabel.z2 = this._polyline.z2 + 1; } symbol.__temp = true; data.setItemGraphicEl(dataIndex, symbol); symbol.stopSymbolAnimation(true); this.group.add(symbol); } symbol.highlight(); } else { ChartView.prototype.highlight.call(this, seriesModel, ecModel, api, payload); } }; LineView2.prototype.downplay = function(seriesModel, ecModel, api, payload) { var data = seriesModel.getData(); var dataIndex = queryDataIndex(data, payload); this._changePolyState("normal"); if (dataIndex != null && dataIndex >= 0) { var symbol = data.getItemGraphicEl(dataIndex); if (symbol) { if (symbol.__temp) { data.setItemGraphicEl(dataIndex, null); this.group.remove(symbol); } else { symbol.downplay(); } } } else { ChartView.prototype.downplay.call(this, seriesModel, ecModel, api, payload); } }; LineView2.prototype._changePolyState = function(toState) { var polygon = this._polygon; setStatesFlag(this._polyline, toState); polygon && setStatesFlag(polygon, toState); }; LineView2.prototype._newPolyline = function(points2) { var polyline = this._polyline; if (polyline) { this._lineGroup.remove(polyline); } polyline = new ECPolyline({ shape: { points: points2 }, segmentIgnoreThreshold: 2, z2: 10 }); this._lineGroup.add(polyline); this._polyline = polyline; return polyline; }; LineView2.prototype._newPolygon = function(points2, stackedOnPoints) { var polygon = this._polygon; if (polygon) { this._lineGroup.remove(polygon); } polygon = new ECPolygon({ shape: { points: points2, stackedOnPoints }, segmentIgnoreThreshold: 2 }); this._lineGroup.add(polygon); this._polygon = polygon; return polygon; }; LineView2.prototype._initSymbolLabelAnimation = function(data, coordSys, clipShape) { var isHorizontalOrRadial; var isCoordSysPolar; var baseAxis = coordSys.getBaseAxis(); var isAxisInverse = baseAxis.inverse; if (coordSys.type === "cartesian2d") { isHorizontalOrRadial = baseAxis.isHorizontal(); isCoordSysPolar = false; } else if (coordSys.type === "polar") { isHorizontalOrRadial = baseAxis.dim === "angle"; isCoordSysPolar = true; } var seriesModel = data.hostModel; var seriesDuration = seriesModel.get("animationDuration"); if (isFunction(seriesDuration)) { seriesDuration = seriesDuration(null); } var seriesDelay = seriesModel.get("animationDelay") || 0; var seriesDelayValue = isFunction(seriesDelay) ? seriesDelay(null) : seriesDelay; data.eachItemGraphicEl(function(symbol, idx) { var el = symbol; if (el) { var point = [symbol.x, symbol.y]; var start = void 0; var end = void 0; var current = void 0; if (clipShape) { if (isCoordSysPolar) { var polarClip = clipShape; var coord = coordSys.pointToCoord(point); if (isHorizontalOrRadial) { start = polarClip.startAngle; end = polarClip.endAngle; current = -coord[1] / 180 * Math.PI; } else { start = polarClip.r0; end = polarClip.r; current = coord[0]; } } else { var gridClip = clipShape; if (isHorizontalOrRadial) { start = gridClip.x; end = gridClip.x + gridClip.width; current = symbol.x; } else { start = gridClip.y + gridClip.height; end = gridClip.y; current = symbol.y; } } } var ratio = end === start ? 0 : (current - start) / (end - start); if (isAxisInverse) { ratio = 1 - ratio; } var delay = isFunction(seriesDelay) ? seriesDelay(idx) : seriesDuration * ratio + seriesDelayValue; var symbolPath = el.getSymbolPath(); var text = symbolPath.getTextContent(); el.attr({ scaleX: 0, scaleY: 0 }); el.animateTo({ scaleX: 1, scaleY: 1 }, { duration: 200, setToFinal: true, delay }); if (text) { text.animateFrom({ style: { opacity: 0 } }, { duration: 300, delay }); } symbolPath.disableLabelAnimation = true; } }); }; LineView2.prototype._initOrUpdateEndLabel = function(seriesModel, coordSys, inheritColor) { var endLabelModel = seriesModel.getModel("endLabel"); if (anyStateShowEndLabel(seriesModel)) { var data_2 = seriesModel.getData(); var polyline = this._polyline; var points2 = data_2.getLayout("points"); if (!points2) { polyline.removeTextContent(); this._endLabel = null; return; } var endLabel = this._endLabel; if (!endLabel) { endLabel = this._endLabel = new ZRText({ z2: 200 // should be higher than item symbol }); endLabel.ignoreClip = true; polyline.setTextContent(this._endLabel); polyline.disableLabelAnimation = true; } var dataIndex = getLastIndexNotNull(points2); if (dataIndex >= 0) { setLabelStyle(polyline, getLabelStatesModels(seriesModel, "endLabel"), { inheritColor, labelFetcher: seriesModel, labelDataIndex: dataIndex, defaultText: function(dataIndex2, opt, interpolatedValue) { return interpolatedValue != null ? getDefaultInterpolatedLabel(data_2, interpolatedValue) : getDefaultLabel(data_2, dataIndex2); }, enableTextSetter: true }, getEndLabelStateSpecified(endLabelModel, coordSys)); polyline.textConfig.position = null; } } else if (this._endLabel) { this._polyline.removeTextContent(); this._endLabel = null; } }; LineView2.prototype._endLabelOnDuring = function(percent, clipRect, data, animationRecord, valueAnimation, endLabelModel, coordSys) { var endLabel = this._endLabel; var polyline = this._polyline; if (endLabel) { if (percent < 1 && animationRecord.originalX == null) { animationRecord.originalX = endLabel.x; animationRecord.originalY = endLabel.y; } var points2 = data.getLayout("points"); var seriesModel = data.hostModel; var connectNulls = seriesModel.get("connectNulls"); var precision = endLabelModel.get("precision"); var distance = endLabelModel.get("distance") || 0; var baseAxis = coordSys.getBaseAxis(); var isHorizontal = baseAxis.isHorizontal(); var isBaseInversed = baseAxis.inverse; var clipShape = clipRect.shape; var xOrY = isBaseInversed ? isHorizontal ? clipShape.x : clipShape.y + clipShape.height : isHorizontal ? clipShape.x + clipShape.width : clipShape.y; var distanceX = (isHorizontal ? distance : 0) * (isBaseInversed ? -1 : 1); var distanceY = (isHorizontal ? 0 : -distance) * (isBaseInversed ? -1 : 1); var dim = isHorizontal ? "x" : "y"; var dataIndexRange = getIndexRange(points2, xOrY, dim); var indices = dataIndexRange.range; var diff = indices[1] - indices[0]; var value = void 0; if (diff >= 1) { if (diff > 1 && !connectNulls) { var pt = getPointAtIndex(points2, indices[0]); endLabel.attr({ x: pt[0] + distanceX, y: pt[1] + distanceY }); valueAnimation && (value = seriesModel.getRawValue(indices[0])); } else { var pt = polyline.getPointOn(xOrY, dim); pt && endLabel.attr({ x: pt[0] + distanceX, y: pt[1] + distanceY }); var startValue = seriesModel.getRawValue(indices[0]); var endValue = seriesModel.getRawValue(indices[1]); valueAnimation && (value = interpolateRawValues(data, precision, startValue, endValue, dataIndexRange.t)); } animationRecord.lastFrameIndex = indices[0]; } else { var idx = percent === 1 || animationRecord.lastFrameIndex > 0 ? indices[0] : 0; var pt = getPointAtIndex(points2, idx); valueAnimation && (value = seriesModel.getRawValue(idx)); endLabel.attr({ x: pt[0] + distanceX, y: pt[1] + distanceY }); } if (valueAnimation) { var inner2 = labelInner(endLabel); if (typeof inner2.setLabelText === "function") { inner2.setLabelText(value); } } } }; LineView2.prototype._doUpdateAnimation = function(data, stackedOnPoints, coordSys, api, step, valueOrigin, connectNulls) { var polyline = this._polyline; var polygon = this._polygon; var seriesModel = data.hostModel; var diff = lineAnimationDiff(this._data, data, this._stackedOnPoints, stackedOnPoints, this._coordSys, coordSys, this._valueOrigin); var current = diff.current; var stackedOnCurrent = diff.stackedOnCurrent; var next = diff.next; var stackedOnNext = diff.stackedOnNext; if (step) { stackedOnCurrent = turnPointsIntoStep(diff.stackedOnCurrent, diff.current, coordSys, step, connectNulls); current = turnPointsIntoStep(diff.current, null, coordSys, step, connectNulls); stackedOnNext = turnPointsIntoStep(diff.stackedOnNext, diff.next, coordSys, step, connectNulls); next = turnPointsIntoStep(diff.next, null, coordSys, step, connectNulls); } if (getBoundingDiff(current, next) > 3e3 || polygon && getBoundingDiff(stackedOnCurrent, stackedOnNext) > 3e3) { polyline.stopAnimation(); polyline.setShape({ points: next }); if (polygon) { polygon.stopAnimation(); polygon.setShape({ points: next, stackedOnPoints: stackedOnNext }); } return; } polyline.shape.__points = diff.current; polyline.shape.points = current; var target = { shape: { points: next } }; if (diff.current !== current) { target.shape.__points = diff.next; } polyline.stopAnimation(); updateProps$1(polyline, target, seriesModel); if (polygon) { polygon.setShape({ // Reuse the points with polyline. points: current, stackedOnPoints: stackedOnCurrent }); polygon.stopAnimation(); updateProps$1(polygon, { shape: { stackedOnPoints: stackedOnNext } }, seriesModel); if (polyline.shape.points !== polygon.shape.points) { polygon.shape.points = polyline.shape.points; } } var updatedDataInfo = []; var diffStatus = diff.status; for (var i = 0; i < diffStatus.length; i++) { var cmd = diffStatus[i].cmd; if (cmd === "=") { var el = data.getItemGraphicEl(diffStatus[i].idx1); if (el) { updatedDataInfo.push({ el, ptIdx: i // Index of points }); } } } if (polyline.animators && polyline.animators.length) { polyline.animators[0].during(function() { polygon && polygon.dirtyShape(); var points2 = polyline.shape.__points; for (var i2 = 0; i2 < updatedDataInfo.length; i2++) { var el2 = updatedDataInfo[i2].el; var offset = updatedDataInfo[i2].ptIdx * 2; el2.x = points2[offset]; el2.y = points2[offset + 1]; el2.markRedraw(); } }); } }; LineView2.prototype.remove = function(ecModel) { var group = this.group; var oldData = this._data; this._lineGroup.removeAll(); this._symbolDraw.remove(true); oldData && oldData.eachItemGraphicEl(function(el, idx) { if (el.__temp) { group.remove(el); oldData.setItemGraphicEl(idx, null); } }); this._polyline = this._polygon = this._coordSys = this._points = this._stackedOnPoints = this._endLabel = this._data = null; }; LineView2.type = "line"; return LineView2; })(ChartView) ); function pointsLayout(seriesType2, forceStoreInTypedArray) { return { seriesType: seriesType2, plan: createRenderPlanner(), reset: function(seriesModel) { var data = seriesModel.getData(); var coordSys = seriesModel.coordinateSystem; var pipelineContext = seriesModel.pipelineContext; var useTypedArray = forceStoreInTypedArray || pipelineContext.large; if (!coordSys) { return; } var dims = map$1(coordSys.dimensions, function(dim) { return data.mapDimension(dim); }).slice(0, 2); var dimLen = dims.length; var stackResultDim = data.getCalculationInfo("stackResultDimension"); if (isDimensionStacked(data, dims[0])) { dims[0] = stackResultDim; } if (isDimensionStacked(data, dims[1])) { dims[1] = stackResultDim; } var store = data.getStore(); var dimIdx0 = data.getDimensionIndex(dims[0]); var dimIdx1 = data.getDimensionIndex(dims[1]); return dimLen && { progress: function(params, data2) { var segCount = params.end - params.start; var points2 = useTypedArray && createFloat32Array(segCount * dimLen); var tmpIn = []; var tmpOut = []; for (var i = params.start, offset = 0; i < params.end; i++) { var point = void 0; if (dimLen === 1) { var x = store.get(dimIdx0, i); point = coordSys.dataToPoint(x, null, tmpOut); } else { tmpIn[0] = store.get(dimIdx0, i); tmpIn[1] = store.get(dimIdx1, i); point = coordSys.dataToPoint(tmpIn, null, tmpOut); } if (useTypedArray) { points2[offset++] = point[0]; points2[offset++] = point[1]; } else { data2.setItemLayout(i, point.slice()); } } useTypedArray && data2.setLayout("points", points2); } }; } }; } var samplers = { average: function(frame) { var sum2 = 0; var count2 = 0; for (var i = 0; i < frame.length; i++) { if (!isNaN(frame[i])) { sum2 += frame[i]; count2++; } } return count2 === 0 ? NaN : sum2 / count2; }, sum: function(frame) { var sum2 = 0; for (var i = 0; i < frame.length; i++) { sum2 += frame[i] || 0; } return sum2; }, max: function(frame) { var max2 = -Infinity; for (var i = 0; i < frame.length; i++) { frame[i] > max2 && (max2 = frame[i]); } return isFinite(max2) ? max2 : NaN; }, min: function(frame) { var min2 = Infinity; for (var i = 0; i < frame.length; i++) { frame[i] < min2 && (min2 = frame[i]); } return isFinite(min2) ? min2 : NaN; }, // TODO // Median nearest: function(frame) { return frame[0]; } }; var indexSampler = function(frame) { return Math.round(frame.length / 2); }; function dataSample(seriesType2) { return { seriesType: seriesType2, // FIXME:TS never used, so comment it // modifyOutputEnd: true, reset: function(seriesModel, ecModel, api) { var data = seriesModel.getData(); var sampling = seriesModel.get("sampling"); var coordSys = seriesModel.coordinateSystem; var count2 = data.count(); if (count2 > 10 && coordSys.type === "cartesian2d" && sampling) { var baseAxis = coordSys.getBaseAxis(); var valueAxis2 = coordSys.getOtherAxis(baseAxis); var extent = baseAxis.getExtent(); var dpr = api.getDevicePixelRatio(); var size = Math.abs(extent[1] - extent[0]) * (dpr || 1); var rate = Math.round(count2 / size); if (isFinite(rate) && rate > 1) { if (sampling === "lttb") { seriesModel.setData(data.lttbDownSample(data.mapDimension(valueAxis2.dim), 1 / rate)); } else if (sampling === "minmax") { seriesModel.setData(data.minmaxDownSample(data.mapDimension(valueAxis2.dim), 1 / rate)); } var sampler = void 0; if (isString(sampling)) { sampler = samplers[sampling]; } else if (isFunction(sampling)) { sampler = sampling; } if (sampler) { seriesModel.setData(data.downSample(data.mapDimension(valueAxis2.dim), 1 / rate, sampler, indexSampler)); } } } } }; } function install$S(registers) { registers.registerChartView(LineView); registers.registerSeriesModel(LineSeriesModel); registers.registerLayout(pointsLayout("line", true)); registers.registerVisual({ seriesType: "line", reset: function(seriesModel) { var data = seriesModel.getData(); var lineStyle = seriesModel.getModel("lineStyle").getLineStyle(); if (lineStyle && !lineStyle.stroke) { lineStyle.stroke = data.getVisual("style").fill; } data.setVisual("legendLineStyle", lineStyle); } }); registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, dataSample("line")); } var BaseBarSeriesModel = ( /** @class */ (function(_super) { __extends(BaseBarSeriesModel2, _super); function BaseBarSeriesModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = BaseBarSeriesModel2.type; return _this; } BaseBarSeriesModel2.prototype.getInitialData = function(option, ecModel) { return createSeriesData(null, this, { useEncodeDefaulter: true }); }; BaseBarSeriesModel2.prototype.getMarkerPosition = function(value, dims, startingAtTick) { var coordSys = this.coordinateSystem; if (coordSys && coordSys.clampData) { var clampData_1 = coordSys.clampData(value); var pt_1 = coordSys.dataToPoint(clampData_1); if (startingAtTick) { each$f(coordSys.getAxes(), function(axis, idx) { if (axis.type === "category" && dims != null) { var tickCoords = axis.getTicksCoords(); var alignTicksWithLabel = axis.getTickModel().get("alignWithLabel"); var targetTickId = clampData_1[idx]; var isEnd = dims[idx] === "x1" || dims[idx] === "y1"; if (isEnd && !alignTicksWithLabel) { targetTickId += 1; } if (tickCoords.length < 2) { return; } else if (tickCoords.length === 2) { pt_1[idx] = axis.toGlobalCoord(axis.getExtent()[isEnd ? 1 : 0]); return; } var leftCoord = void 0; var coord = void 0; var stepTickValue = 1; for (var i = 0; i < tickCoords.length; i++) { var tickCoord = tickCoords[i].coord; var tickValue = i === tickCoords.length - 1 ? tickCoords[i - 1].tickValue + stepTickValue : tickCoords[i].tickValue; if (tickValue === targetTickId) { coord = tickCoord; break; } else if (tickValue < targetTickId) { leftCoord = tickCoord; } else if (leftCoord != null && tickValue > targetTickId) { coord = (tickCoord + leftCoord) / 2; break; } if (i === 1) { stepTickValue = tickValue - tickCoords[0].tickValue; } } if (coord == null) { if (!leftCoord) { coord = tickCoords[0].coord; } else if (leftCoord) { coord = tickCoords[tickCoords.length - 1].coord; } } pt_1[idx] = axis.toGlobalCoord(coord); } }); } else { var data = this.getData(); var offset = data.getLayout("offset"); var size = data.getLayout("size"); var offsetIndex = coordSys.getBaseAxis().isHorizontal() ? 0 : 1; pt_1[offsetIndex] += offset + size / 2; } return pt_1; } return [NaN, NaN]; }; BaseBarSeriesModel2.type = "series.__base_bar__"; BaseBarSeriesModel2.defaultOption = { // zlevel: 0, z: 2, coordinateSystem: "cartesian2d", legendHoverLink: true, // stack: null // Cartesian coordinate system // xAxisIndex: 0, // yAxisIndex: 0, barMinHeight: 0, barMinAngle: 0, // cursor: null, large: false, largeThreshold: 400, progressive: 3e3, progressiveChunkMode: "mod" }; return BaseBarSeriesModel2; })(SeriesModel) ); SeriesModel.registerClass(BaseBarSeriesModel); var BarSeriesModel = ( /** @class */ (function(_super) { __extends(BarSeriesModel2, _super); function BarSeriesModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = BarSeriesModel2.type; return _this; } BarSeriesModel2.prototype.getInitialData = function() { return createSeriesData(null, this, { useEncodeDefaulter: true, createInvertedIndices: !!this.get("realtimeSort", true) || null }); }; BarSeriesModel2.prototype.getProgressive = function() { return this.get("large") ? this.get("progressive") : false; }; BarSeriesModel2.prototype.getProgressiveThreshold = function() { var progressiveThreshold = this.get("progressiveThreshold"); var largeThreshold = this.get("largeThreshold"); if (largeThreshold > progressiveThreshold) { progressiveThreshold = largeThreshold; } return progressiveThreshold; }; BarSeriesModel2.prototype.brushSelector = function(dataIndex, data, selectors) { return selectors.rect(data.getItemLayout(dataIndex)); }; BarSeriesModel2.type = "series.bar"; BarSeriesModel2.dependencies = ["grid", "polar"]; BarSeriesModel2.defaultOption = inheritDefaultOption(BaseBarSeriesModel.defaultOption, { // If clipped // Only available on cartesian2d clip: true, roundCap: false, showBackground: false, backgroundStyle: { color: "rgba(180, 180, 180, 0.2)", borderColor: null, borderWidth: 0, borderType: "solid", borderRadius: 0, shadowBlur: 0, shadowColor: null, shadowOffsetX: 0, shadowOffsetY: 0, opacity: 1 }, select: { itemStyle: { borderColor: "#212121" } }, realtimeSort: false }); return BarSeriesModel2; })(BaseBarSeriesModel) ); var SausageShape = ( /** @class */ /* @__PURE__ */ (function() { function SausageShape2() { this.cx = 0; this.cy = 0; this.r0 = 0; this.r = 0; this.startAngle = 0; this.endAngle = Math.PI * 2; this.clockwise = true; } return SausageShape2; })() ); var SausagePath = ( /** @class */ (function(_super) { __extends(SausagePath2, _super); function SausagePath2(opts) { var _this = _super.call(this, opts) || this; _this.type = "sausage"; return _this; } SausagePath2.prototype.getDefaultShape = function() { return new SausageShape(); }; SausagePath2.prototype.buildPath = function(ctx, shape) { var cx = shape.cx; var cy = shape.cy; var r0 = Math.max(shape.r0 || 0, 0); var r = Math.max(shape.r, 0); var dr = (r - r0) * 0.5; var rCenter = r0 + dr; var startAngle = shape.startAngle; var endAngle = shape.endAngle; var clockwise = shape.clockwise; var PI22 = Math.PI * 2; var lessThanCircle = clockwise ? endAngle - startAngle < PI22 : startAngle - endAngle < PI22; if (!lessThanCircle) { startAngle = endAngle - (clockwise ? PI22 : -PI22); } var unitStartX = Math.cos(startAngle); var unitStartY = Math.sin(startAngle); var unitEndX = Math.cos(endAngle); var unitEndY = Math.sin(endAngle); if (lessThanCircle) { ctx.moveTo(unitStartX * r0 + cx, unitStartY * r0 + cy); ctx.arc(unitStartX * rCenter + cx, unitStartY * rCenter + cy, dr, -Math.PI + startAngle, startAngle, !clockwise); } else { ctx.moveTo(unitStartX * r + cx, unitStartY * r + cy); } ctx.arc(cx, cy, r, startAngle, endAngle, !clockwise); ctx.arc(unitEndX * rCenter + cx, unitEndY * rCenter + cy, dr, endAngle - Math.PI * 2, endAngle - Math.PI, !clockwise); if (r0 !== 0) { ctx.arc(cx, cy, r0, endAngle, startAngle, clockwise); } }; return SausagePath2; })(Path) ); function createSectorCalculateTextPosition(positionMapping, opts) { opts = opts || {}; var isRoundCap = opts.isRoundCap; return function(out, opts2, boundingRect) { var textPosition = opts2.position; if (!textPosition || textPosition instanceof Array) { return calculateTextPosition(out, opts2, boundingRect); } var mappedSectorPosition = positionMapping(textPosition); var distance = opts2.distance != null ? opts2.distance : 5; var sector = this.shape; var cx = sector.cx; var cy = sector.cy; var r = sector.r; var r0 = sector.r0; var middleR = (r + r0) / 2; var startAngle = sector.startAngle; var endAngle = sector.endAngle; var middleAngle = (startAngle + endAngle) / 2; var extraDist = isRoundCap ? Math.abs(r - r0) / 2 : 0; var mathCos = Math.cos; var mathSin = Math.sin; var x = cx + r * mathCos(startAngle); var y = cy + r * mathSin(startAngle); var textAlign = "left"; var textVerticalAlign = "top"; switch (mappedSectorPosition) { case "startArc": x = cx + (r0 - distance) * mathCos(middleAngle); y = cy + (r0 - distance) * mathSin(middleAngle); textAlign = "center"; textVerticalAlign = "top"; break; case "insideStartArc": x = cx + (r0 + distance) * mathCos(middleAngle); y = cy + (r0 + distance) * mathSin(middleAngle); textAlign = "center"; textVerticalAlign = "bottom"; break; case "startAngle": x = cx + middleR * mathCos(startAngle) + adjustAngleDistanceX(startAngle, distance + extraDist, false); y = cy + middleR * mathSin(startAngle) + adjustAngleDistanceY(startAngle, distance + extraDist, false); textAlign = "right"; textVerticalAlign = "middle"; break; case "insideStartAngle": x = cx + middleR * mathCos(startAngle) + adjustAngleDistanceX(startAngle, -distance + extraDist, false); y = cy + middleR * mathSin(startAngle) + adjustAngleDistanceY(startAngle, -distance + extraDist, false); textAlign = "left"; textVerticalAlign = "middle"; break; case "middle": x = cx + middleR * mathCos(middleAngle); y = cy + middleR * mathSin(middleAngle); textAlign = "center"; textVerticalAlign = "middle"; break; case "endArc": x = cx + (r + distance) * mathCos(middleAngle); y = cy + (r + distance) * mathSin(middleAngle); textAlign = "center"; textVerticalAlign = "bottom"; break; case "insideEndArc": x = cx + (r - distance) * mathCos(middleAngle); y = cy + (r - distance) * mathSin(middleAngle); textAlign = "center"; textVerticalAlign = "top"; break; case "endAngle": x = cx + middleR * mathCos(endAngle) + adjustAngleDistanceX(endAngle, distance + extraDist, true); y = cy + middleR * mathSin(endAngle) + adjustAngleDistanceY(endAngle, distance + extraDist, true); textAlign = "left"; textVerticalAlign = "middle"; break; case "insideEndAngle": x = cx + middleR * mathCos(endAngle) + adjustAngleDistanceX(endAngle, -distance + extraDist, true); y = cy + middleR * mathSin(endAngle) + adjustAngleDistanceY(endAngle, -distance + extraDist, true); textAlign = "right"; textVerticalAlign = "middle"; break; default: return calculateTextPosition(out, opts2, boundingRect); } out = out || {}; out.x = x; out.y = y; out.align = textAlign; out.verticalAlign = textVerticalAlign; return out; }; } function setSectorTextRotation(sector, textPosition, positionMapping, rotateType) { if (isNumber(rotateType)) { sector.setTextConfig({ rotation: rotateType }); return; } else if (isArray$1(textPosition)) { sector.setTextConfig({ rotation: 0 }); return; } var shape = sector.shape; var startAngle = shape.clockwise ? shape.startAngle : shape.endAngle; var endAngle = shape.clockwise ? shape.endAngle : shape.startAngle; var middleAngle = (startAngle + endAngle) / 2; var anchorAngle; var mappedSectorPosition = positionMapping(textPosition); switch (mappedSectorPosition) { case "startArc": case "insideStartArc": case "middle": case "insideEndArc": case "endArc": anchorAngle = middleAngle; break; case "startAngle": case "insideStartAngle": anchorAngle = startAngle; break; case "endAngle": case "insideEndAngle": anchorAngle = endAngle; break; default: sector.setTextConfig({ rotation: 0 }); return; } var rotate2 = Math.PI * 1.5 - anchorAngle; if (mappedSectorPosition === "middle" && rotate2 > Math.PI / 2 && rotate2 < Math.PI * 1.5) { rotate2 -= Math.PI; } sector.setTextConfig({ rotation: rotate2 }); } function adjustAngleDistanceX(angle, distance, isEnd) { return distance * Math.sin(angle) * (isEnd ? -1 : 1); } function adjustAngleDistanceY(angle, distance, isEnd) { return distance * Math.cos(angle) * (isEnd ? 1 : -1); } function getSectorCornerRadius(model, shape, zeroIfNull) { var cornerRadius = model.get("borderRadius"); if (cornerRadius == null) { return zeroIfNull ? { cornerRadius: 0 } : null; } if (!isArray$1(cornerRadius)) { cornerRadius = [cornerRadius, cornerRadius, cornerRadius, cornerRadius]; } var dr = Math.abs(shape.r || 0 - shape.r0 || 0); return { cornerRadius: map$1(cornerRadius, function(cr) { return parsePercent$1(cr, dr); }) }; } var mathMax$4 = Math.max; var mathMin$4 = Math.min; function getClipArea(coord, data) { var coordSysClipArea = coord.getArea && coord.getArea(); if (isCoordinateSystemType(coord, "cartesian2d")) { var baseAxis = coord.getBaseAxis(); if (baseAxis.type !== "category" || !baseAxis.onBand) { var expandWidth = data.getLayout("bandWidth"); if (baseAxis.isHorizontal()) { coordSysClipArea.x -= expandWidth; coordSysClipArea.width += expandWidth * 2; } else { coordSysClipArea.y -= expandWidth; coordSysClipArea.height += expandWidth * 2; } } } return coordSysClipArea; } var BarView = ( /** @class */ (function(_super) { __extends(BarView2, _super); function BarView2() { var _this = _super.call(this) || this; _this.type = BarView2.type; _this._isFirstFrame = true; return _this; } BarView2.prototype.render = function(seriesModel, ecModel, api, payload) { this._model = seriesModel; this._removeOnRenderedListener(api); this._updateDrawMode(seriesModel); var coordinateSystemType = seriesModel.get("coordinateSystem"); if (coordinateSystemType === "cartesian2d" || coordinateSystemType === "polar") { this._progressiveEls = null; this._isLargeDraw ? this._renderLarge(seriesModel, ecModel, api) : this._renderNormal(seriesModel, ecModel, api, payload); } }; BarView2.prototype.incrementalPrepareRender = function(seriesModel) { this._clear(); this._updateDrawMode(seriesModel); this._updateLargeClip(seriesModel); }; BarView2.prototype.incrementalRender = function(params, seriesModel) { this._progressiveEls = []; this._incrementalRenderLarge(params, seriesModel); }; BarView2.prototype.eachRendered = function(cb) { traverseElements(this._progressiveEls || this.group, cb); }; BarView2.prototype._updateDrawMode = function(seriesModel) { var isLargeDraw = seriesModel.pipelineContext.large; if (this._isLargeDraw == null || isLargeDraw !== this._isLargeDraw) { this._isLargeDraw = isLargeDraw; this._clear(); } }; BarView2.prototype._renderNormal = function(seriesModel, ecModel, api, payload) { var group = this.group; var data = seriesModel.getData(); var oldData = this._data; var coord = seriesModel.coordinateSystem; var baseAxis = coord.getBaseAxis(); var isHorizontalOrRadial; if (coord.type === "cartesian2d") { isHorizontalOrRadial = baseAxis.isHorizontal(); } else if (coord.type === "polar") { isHorizontalOrRadial = baseAxis.dim === "angle"; } var animationModel = seriesModel.isAnimationEnabled() ? seriesModel : null; var realtimeSortCfg = shouldRealtimeSort(seriesModel, coord); if (realtimeSortCfg) { this._enableRealtimeSort(realtimeSortCfg, data, api); } var needsClip = seriesModel.get("clip", true) || realtimeSortCfg; var coordSysClipArea = getClipArea(coord, data); group.removeClipPath(); var roundCap = seriesModel.get("roundCap", true); var drawBackground = seriesModel.get("showBackground", true); var backgroundModel = seriesModel.getModel("backgroundStyle"); var barBorderRadius = backgroundModel.get("borderRadius") || 0; var bgEls = []; var oldBgEls = this._backgroundEls; var isInitSort = payload && payload.isInitSort; var isChangeOrder = payload && payload.type === "changeAxisOrder"; function createBackground(dataIndex) { var bgLayout = getLayout[coord.type](data, dataIndex); var bgEl = createBackgroundEl(coord, isHorizontalOrRadial, bgLayout); bgEl.useStyle(backgroundModel.getItemStyle()); if (coord.type === "cartesian2d") { bgEl.setShape("r", barBorderRadius); } else { bgEl.setShape("cornerRadius", barBorderRadius); } bgEls[dataIndex] = bgEl; return bgEl; } data.diff(oldData).add(function(dataIndex) { var itemModel = data.getItemModel(dataIndex); var layout2 = getLayout[coord.type](data, dataIndex, itemModel); if (drawBackground) { createBackground(dataIndex); } if (!data.hasValue(dataIndex) || !isValidLayout[coord.type](layout2)) { return; } var isClipped = false; if (needsClip) { isClipped = clip[coord.type](coordSysClipArea, layout2); } var el = elementCreator[coord.type](seriesModel, data, dataIndex, layout2, isHorizontalOrRadial, animationModel, baseAxis.model, false, roundCap); if (realtimeSortCfg) { el.forceLabelAnimation = true; } updateStyle(el, data, dataIndex, itemModel, layout2, seriesModel, isHorizontalOrRadial, coord.type === "polar"); if (isInitSort) { el.attr({ shape: layout2 }); } else if (realtimeSortCfg) { updateRealtimeAnimation(realtimeSortCfg, animationModel, el, layout2, dataIndex, isHorizontalOrRadial, false, false); } else { initProps(el, { shape: layout2 }, seriesModel, dataIndex); } data.setItemGraphicEl(dataIndex, el); group.add(el); el.ignore = isClipped; }).update(function(newIndex, oldIndex) { var itemModel = data.getItemModel(newIndex); var layout2 = getLayout[coord.type](data, newIndex, itemModel); if (drawBackground) { var bgEl = void 0; if (oldBgEls.length === 0) { bgEl = createBackground(oldIndex); } else { bgEl = oldBgEls[oldIndex]; bgEl.useStyle(backgroundModel.getItemStyle()); if (coord.type === "cartesian2d") { bgEl.setShape("r", barBorderRadius); } else { bgEl.setShape("cornerRadius", barBorderRadius); } bgEls[newIndex] = bgEl; } var bgLayout = getLayout[coord.type](data, newIndex); var shape = createBackgroundShape(isHorizontalOrRadial, bgLayout, coord); updateProps$1(bgEl, { shape }, animationModel, newIndex); } var el = oldData.getItemGraphicEl(oldIndex); if (!data.hasValue(newIndex) || !isValidLayout[coord.type](layout2)) { group.remove(el); return; } var isClipped = false; if (needsClip) { isClipped = clip[coord.type](coordSysClipArea, layout2); if (isClipped) { group.remove(el); } } if (!el) { el = elementCreator[coord.type](seriesModel, data, newIndex, layout2, isHorizontalOrRadial, animationModel, baseAxis.model, !!el, roundCap); } else { saveOldStyle(el); } if (realtimeSortCfg) { el.forceLabelAnimation = true; } if (isChangeOrder) { var textEl = el.getTextContent(); if (textEl) { var labelInnerStore = labelInner(textEl); if (labelInnerStore.prevValue != null) { labelInnerStore.prevValue = labelInnerStore.value; } } } else { updateStyle(el, data, newIndex, itemModel, layout2, seriesModel, isHorizontalOrRadial, coord.type === "polar"); } if (isInitSort) { el.attr({ shape: layout2 }); } else if (realtimeSortCfg) { updateRealtimeAnimation(realtimeSortCfg, animationModel, el, layout2, newIndex, isHorizontalOrRadial, true, isChangeOrder); } else { updateProps$1(el, { shape: layout2 }, seriesModel, newIndex, null); } data.setItemGraphicEl(newIndex, el); el.ignore = isClipped; group.add(el); }).remove(function(dataIndex) { var el = oldData.getItemGraphicEl(dataIndex); el && removeElementWithFadeOut(el, seriesModel, dataIndex); }).execute(); var bgGroup = this._backgroundGroup || (this._backgroundGroup = new Group$3()); bgGroup.removeAll(); for (var i = 0; i < bgEls.length; ++i) { bgGroup.add(bgEls[i]); } group.add(bgGroup); this._backgroundEls = bgEls; this._data = data; }; BarView2.prototype._renderLarge = function(seriesModel, ecModel, api) { this._clear(); createLarge$1(seriesModel, this.group); this._updateLargeClip(seriesModel); }; BarView2.prototype._incrementalRenderLarge = function(params, seriesModel) { this._removeBackground(); createLarge$1(seriesModel, this.group, this._progressiveEls, true); }; BarView2.prototype._updateLargeClip = function(seriesModel) { var clipPath = seriesModel.get("clip", true) && createClipPath(seriesModel.coordinateSystem, false, seriesModel); var group = this.group; if (clipPath) { group.setClipPath(clipPath); } else { group.removeClipPath(); } }; BarView2.prototype._enableRealtimeSort = function(realtimeSortCfg, data, api) { var _this = this; if (!data.count()) { return; } var baseAxis = realtimeSortCfg.baseAxis; if (this._isFirstFrame) { this._dispatchInitSort(data, realtimeSortCfg, api); this._isFirstFrame = false; } else { var orderMapping_1 = function(idx) { var el = data.getItemGraphicEl(idx); var shape = el && el.shape; return shape && // The result should be consistent with the initial sort by data value. // Do not support the case that both positive and negative exist. Math.abs(baseAxis.isHorizontal() ? shape.height : shape.width) || 0; }; this._onRendered = function() { _this._updateSortWithinSameData(data, orderMapping_1, baseAxis, api); }; api.getZr().on("rendered", this._onRendered); } }; BarView2.prototype._dataSort = function(data, baseAxis, orderMapping) { var info = []; data.each(data.mapDimension(baseAxis.dim), function(ordinalNumber, dataIdx) { var mappedValue = orderMapping(dataIdx); mappedValue = mappedValue == null ? NaN : mappedValue; info.push({ dataIndex: dataIdx, mappedValue, ordinalNumber }); }); info.sort(function(a, b) { return b.mappedValue - a.mappedValue; }); return { ordinalNumbers: map$1(info, function(item) { return item.ordinalNumber; }) }; }; BarView2.prototype._isOrderChangedWithinSameData = function(data, orderMapping, baseAxis) { var scale2 = baseAxis.scale; var ordinalDataDim = data.mapDimension(baseAxis.dim); var lastValue = Number.MAX_VALUE; for (var tickNum = 0, len2 = scale2.getOrdinalMeta().categories.length; tickNum < len2; ++tickNum) { var rawIdx = data.rawIndexOf(ordinalDataDim, scale2.getRawOrdinalNumber(tickNum)); var value = rawIdx < 0 ? Number.MIN_VALUE : orderMapping(data.indexOfRawIndex(rawIdx)); if (value > lastValue) { return true; } lastValue = value; } return false; }; BarView2.prototype._isOrderDifferentInView = function(orderInfo, baseAxis) { var scale2 = baseAxis.scale; var extent = scale2.getExtent(); var tickNum = Math.max(0, extent[0]); var tickMax = Math.min(extent[1], scale2.getOrdinalMeta().categories.length - 1); for (; tickNum <= tickMax; ++tickNum) { if (orderInfo.ordinalNumbers[tickNum] !== scale2.getRawOrdinalNumber(tickNum)) { return true; } } }; BarView2.prototype._updateSortWithinSameData = function(data, orderMapping, baseAxis, api) { if (!this._isOrderChangedWithinSameData(data, orderMapping, baseAxis)) { return; } var sortInfo = this._dataSort(data, baseAxis, orderMapping); if (this._isOrderDifferentInView(sortInfo, baseAxis)) { this._removeOnRenderedListener(api); api.dispatchAction({ type: "changeAxisOrder", componentType: baseAxis.dim + "Axis", axisId: baseAxis.index, sortInfo }); } }; BarView2.prototype._dispatchInitSort = function(data, realtimeSortCfg, api) { var baseAxis = realtimeSortCfg.baseAxis; var sortResult = this._dataSort(data, baseAxis, function(dataIdx) { return data.get(data.mapDimension(realtimeSortCfg.otherAxis.dim), dataIdx); }); api.dispatchAction({ type: "changeAxisOrder", componentType: baseAxis.dim + "Axis", isInitSort: true, axisId: baseAxis.index, sortInfo: sortResult }); }; BarView2.prototype.remove = function(ecModel, api) { this._clear(this._model); this._removeOnRenderedListener(api); }; BarView2.prototype.dispose = function(ecModel, api) { this._removeOnRenderedListener(api); }; BarView2.prototype._removeOnRenderedListener = function(api) { if (this._onRendered) { api.getZr().off("rendered", this._onRendered); this._onRendered = null; } }; BarView2.prototype._clear = function(model) { var group = this.group; var data = this._data; if (model && model.isAnimationEnabled() && data && !this._isLargeDraw) { this._removeBackground(); this._backgroundEls = []; data.eachItemGraphicEl(function(el) { removeElementWithFadeOut(el, model, getECData(el).dataIndex); }); } else { group.removeAll(); } this._data = null; this._isFirstFrame = true; }; BarView2.prototype._removeBackground = function() { this.group.remove(this._backgroundGroup); this._backgroundGroup = null; }; BarView2.type = "bar"; return BarView2; })(ChartView) ); var clip = { cartesian2d: function(coordSysBoundingRect, layout2) { var signWidth = layout2.width < 0 ? -1 : 1; var signHeight = layout2.height < 0 ? -1 : 1; if (signWidth < 0) { layout2.x += layout2.width; layout2.width = -layout2.width; } if (signHeight < 0) { layout2.y += layout2.height; layout2.height = -layout2.height; } var coordSysX2 = coordSysBoundingRect.x + coordSysBoundingRect.width; var coordSysY2 = coordSysBoundingRect.y + coordSysBoundingRect.height; var x = mathMax$4(layout2.x, coordSysBoundingRect.x); var x2 = mathMin$4(layout2.x + layout2.width, coordSysX2); var y = mathMax$4(layout2.y, coordSysBoundingRect.y); var y2 = mathMin$4(layout2.y + layout2.height, coordSysY2); var xClipped = x2 < x; var yClipped = y2 < y; layout2.x = xClipped && x > coordSysX2 ? x2 : x; layout2.y = yClipped && y > coordSysY2 ? y2 : y; layout2.width = xClipped ? 0 : x2 - x; layout2.height = yClipped ? 0 : y2 - y; if (signWidth < 0) { layout2.x += layout2.width; layout2.width = -layout2.width; } if (signHeight < 0) { layout2.y += layout2.height; layout2.height = -layout2.height; } return xClipped || yClipped; }, polar: function(coordSysClipArea, layout2) { var signR = layout2.r0 <= layout2.r ? 1 : -1; if (signR < 0) { var tmp = layout2.r; layout2.r = layout2.r0; layout2.r0 = tmp; } var r = mathMin$4(layout2.r, coordSysClipArea.r); var r0 = mathMax$4(layout2.r0, coordSysClipArea.r0); layout2.r = r; layout2.r0 = r0; var clipped = r - r0 < 0; if (signR < 0) { var tmp = layout2.r; layout2.r = layout2.r0; layout2.r0 = tmp; } return clipped; } }; var elementCreator = { cartesian2d: function(seriesModel, data, newIndex, layout2, isHorizontal, animationModel, axisModel, isUpdate, roundCap) { var rect = new Rect$2({ shape: extend({}, layout2), z2: 1 }); rect.__dataIndex = newIndex; rect.name = "item"; if (animationModel) { var rectShape = rect.shape; var animateProperty = isHorizontal ? "height" : "width"; rectShape[animateProperty] = 0; } return rect; }, polar: function(seriesModel, data, newIndex, layout2, isRadial, animationModel, axisModel, isUpdate, roundCap) { var ShapeClass = !isRadial && roundCap ? SausagePath : Sector; var sector = new ShapeClass({ shape: layout2, z2: 1 }); sector.name = "item"; var positionMap = createPolarPositionMapping(isRadial); sector.calculateTextPosition = createSectorCalculateTextPosition(positionMap, { isRoundCap: ShapeClass === SausagePath }); if (animationModel) { var sectorShape = sector.shape; var animateProperty = isRadial ? "r" : "endAngle"; var animateTarget = {}; sectorShape[animateProperty] = isRadial ? layout2.r0 : layout2.startAngle; animateTarget[animateProperty] = layout2[animateProperty]; (isUpdate ? updateProps$1 : initProps)(sector, { shape: animateTarget // __value: typeof dataValue === 'string' ? parseInt(dataValue, 10) : dataValue }, animationModel); } return sector; } }; function shouldRealtimeSort(seriesModel, coordSys) { var realtimeSortOption = seriesModel.get("realtimeSort", true); var baseAxis = coordSys.getBaseAxis(); if (realtimeSortOption && baseAxis.type === "category" && coordSys.type === "cartesian2d") { return { baseAxis, otherAxis: coordSys.getOtherAxis(baseAxis) }; } } function updateRealtimeAnimation(realtimeSortCfg, seriesAnimationModel, el, layout2, newIndex, isHorizontal, isUpdate, isChangeOrder) { var seriesTarget; var axisTarget; if (isHorizontal) { axisTarget = { x: layout2.x, width: layout2.width }; seriesTarget = { y: layout2.y, height: layout2.height }; } else { axisTarget = { y: layout2.y, height: layout2.height }; seriesTarget = { x: layout2.x, width: layout2.width }; } if (!isChangeOrder) { (isUpdate ? updateProps$1 : initProps)(el, { shape: seriesTarget }, seriesAnimationModel, newIndex, null); } var axisAnimationModel = seriesAnimationModel ? realtimeSortCfg.baseAxis.model : null; (isUpdate ? updateProps$1 : initProps)(el, { shape: axisTarget }, axisAnimationModel, newIndex); } function checkPropertiesNotValid(obj, props) { for (var i = 0; i < props.length; i++) { if (!isFinite(obj[props[i]])) { return true; } } return false; } var rectPropties = ["x", "y", "width", "height"]; var polarPropties = ["cx", "cy", "r", "startAngle", "endAngle"]; var isValidLayout = { cartesian2d: function(layout2) { return !checkPropertiesNotValid(layout2, rectPropties); }, polar: function(layout2) { return !checkPropertiesNotValid(layout2, polarPropties); } }; var getLayout = { // itemModel is only used to get borderWidth, which is not needed // when calculating bar background layout. cartesian2d: function(data, dataIndex, itemModel) { var layout2 = data.getItemLayout(dataIndex); var fixedLineWidth = itemModel ? getLineWidth(itemModel, layout2) : 0; var signX = layout2.width > 0 ? 1 : -1; var signY = layout2.height > 0 ? 1 : -1; return { x: layout2.x + signX * fixedLineWidth / 2, y: layout2.y + signY * fixedLineWidth / 2, width: layout2.width - signX * fixedLineWidth, height: layout2.height - signY * fixedLineWidth }; }, polar: function(data, dataIndex, itemModel) { var layout2 = data.getItemLayout(dataIndex); return { cx: layout2.cx, cy: layout2.cy, r0: layout2.r0, r: layout2.r, startAngle: layout2.startAngle, endAngle: layout2.endAngle, clockwise: layout2.clockwise }; } }; function isZeroOnPolar(layout2) { return layout2.startAngle != null && layout2.endAngle != null && layout2.startAngle === layout2.endAngle; } function createPolarPositionMapping(isRadial) { return /* @__PURE__ */ (function(isRadial2) { var arcOrAngle = isRadial2 ? "Arc" : "Angle"; return function(position2) { switch (position2) { case "start": case "insideStart": case "end": case "insideEnd": return position2 + arcOrAngle; default: return position2; } }; })(isRadial); } function updateStyle(el, data, dataIndex, itemModel, layout2, seriesModel, isHorizontalOrRadial, isPolar) { var style = data.getItemVisual(dataIndex, "style"); if (!isPolar) { var borderRadius = itemModel.get(["itemStyle", "borderRadius"]) || 0; el.setShape("r", borderRadius); } else if (!seriesModel.get("roundCap")) { var sectorShape = el.shape; var cornerRadius = getSectorCornerRadius(itemModel.getModel("itemStyle"), sectorShape, true); extend(sectorShape, cornerRadius); el.setShape(sectorShape); } el.useStyle(style); var cursorStyle = itemModel.getShallow("cursor"); cursorStyle && el.attr("cursor", cursorStyle); var labelPositionOutside = isPolar ? isHorizontalOrRadial ? layout2.r >= layout2.r0 ? "endArc" : "startArc" : layout2.endAngle >= layout2.startAngle ? "endAngle" : "startAngle" : isHorizontalOrRadial ? layout2.height >= 0 ? "bottom" : "top" : layout2.width >= 0 ? "right" : "left"; var labelStatesModels = getLabelStatesModels(itemModel); setLabelStyle(el, labelStatesModels, { labelFetcher: seriesModel, labelDataIndex: dataIndex, defaultText: getDefaultLabel(seriesModel.getData(), dataIndex), inheritColor: style.fill, defaultOpacity: style.opacity, defaultOutsidePosition: labelPositionOutside }); var label = el.getTextContent(); if (isPolar && label) { var position2 = itemModel.get(["label", "position"]); el.textConfig.inside = position2 === "middle" ? true : null; setSectorTextRotation(el, position2 === "outside" ? labelPositionOutside : position2, createPolarPositionMapping(isHorizontalOrRadial), itemModel.get(["label", "rotate"])); } setLabelValueAnimation(label, labelStatesModels, seriesModel.getRawValue(dataIndex), function(value) { return getDefaultInterpolatedLabel(data, value); }); var emphasisModel = itemModel.getModel(["emphasis"]); toggleHoverEmphasis(el, emphasisModel.get("focus"), emphasisModel.get("blurScope"), emphasisModel.get("disabled")); setStatesStylesFromModel(el, itemModel); if (isZeroOnPolar(layout2)) { el.style.fill = "none"; el.style.stroke = "none"; each$f(el.states, function(state) { if (state.style) { state.style.fill = state.style.stroke = "none"; } }); } } function getLineWidth(itemModel, rawLayout) { var borderColor = itemModel.get(["itemStyle", "borderColor"]); if (!borderColor || borderColor === "none") { return 0; } var lineWidth = itemModel.get(["itemStyle", "borderWidth"]) || 0; var width = isNaN(rawLayout.width) ? Number.MAX_VALUE : Math.abs(rawLayout.width); var height = isNaN(rawLayout.height) ? Number.MAX_VALUE : Math.abs(rawLayout.height); return Math.min(lineWidth, width, height); } var LagePathShape = ( /** @class */ /* @__PURE__ */ (function() { function LagePathShape2() { } return LagePathShape2; })() ); var LargePath = ( /** @class */ (function(_super) { __extends(LargePath2, _super); function LargePath2(opts) { var _this = _super.call(this, opts) || this; _this.type = "largeBar"; return _this; } LargePath2.prototype.getDefaultShape = function() { return new LagePathShape(); }; LargePath2.prototype.buildPath = function(ctx, shape) { var points2 = shape.points; var baseDimIdx = this.baseDimIdx; var valueDimIdx = 1 - this.baseDimIdx; var startPoint = []; var size = []; var barWidth = this.barWidth; for (var i = 0; i < points2.length; i += 3) { size[baseDimIdx] = barWidth; size[valueDimIdx] = points2[i + 2]; startPoint[baseDimIdx] = points2[i + baseDimIdx]; startPoint[valueDimIdx] = points2[i + valueDimIdx]; ctx.rect(startPoint[0], startPoint[1], size[0], size[1]); } }; return LargePath2; })(Path) ); function createLarge$1(seriesModel, group, progressiveEls, incremental) { var data = seriesModel.getData(); var baseDimIdx = data.getLayout("valueAxisHorizontal") ? 1 : 0; var largeDataIndices = data.getLayout("largeDataIndices"); var barWidth = data.getLayout("size"); var backgroundModel = seriesModel.getModel("backgroundStyle"); var bgPoints = data.getLayout("largeBackgroundPoints"); if (bgPoints) { var bgEl = new LargePath({ shape: { points: bgPoints }, incremental: !!incremental, silent: true, z2: 0 }); bgEl.baseDimIdx = baseDimIdx; bgEl.largeDataIndices = largeDataIndices; bgEl.barWidth = barWidth; bgEl.useStyle(backgroundModel.getItemStyle()); group.add(bgEl); progressiveEls && progressiveEls.push(bgEl); } var el = new LargePath({ shape: { points: data.getLayout("largePoints") }, incremental: !!incremental, ignoreCoarsePointer: true, z2: 1 }); el.baseDimIdx = baseDimIdx; el.largeDataIndices = largeDataIndices; el.barWidth = barWidth; group.add(el); el.useStyle(data.getVisual("style")); el.style.stroke = null; getECData(el).seriesIndex = seriesModel.seriesIndex; if (!seriesModel.get("silent")) { el.on("mousedown", largePathUpdateDataIndex); el.on("mousemove", largePathUpdateDataIndex); } progressiveEls && progressiveEls.push(el); } var largePathUpdateDataIndex = throttle(function(event) { var largePath = this; var dataIndex = largePathFindDataIndex(largePath, event.offsetX, event.offsetY); getECData(largePath).dataIndex = dataIndex >= 0 ? dataIndex : null; }, 30, false); function largePathFindDataIndex(largePath, x, y) { var baseDimIdx = largePath.baseDimIdx; var valueDimIdx = 1 - baseDimIdx; var points2 = largePath.shape.points; var largeDataIndices = largePath.largeDataIndices; var startPoint = []; var size = []; var barWidth = largePath.barWidth; for (var i = 0, len2 = points2.length / 3; i < len2; i++) { var ii = i * 3; size[baseDimIdx] = barWidth; size[valueDimIdx] = points2[ii + 2]; startPoint[baseDimIdx] = points2[ii + baseDimIdx]; startPoint[valueDimIdx] = points2[ii + valueDimIdx]; if (size[valueDimIdx] < 0) { startPoint[valueDimIdx] += size[valueDimIdx]; size[valueDimIdx] = -size[valueDimIdx]; } if (x >= startPoint[0] && x <= startPoint[0] + size[0] && y >= startPoint[1] && y <= startPoint[1] + size[1]) { return largeDataIndices[i]; } } return -1; } function createBackgroundShape(isHorizontalOrRadial, layout2, coord) { if (isCoordinateSystemType(coord, "cartesian2d")) { var rectShape = layout2; var coordLayout = coord.getArea(); return { x: isHorizontalOrRadial ? rectShape.x : coordLayout.x, y: isHorizontalOrRadial ? coordLayout.y : rectShape.y, width: isHorizontalOrRadial ? rectShape.width : coordLayout.width, height: isHorizontalOrRadial ? coordLayout.height : rectShape.height }; } else { var coordLayout = coord.getArea(); var sectorShape = layout2; return { cx: coordLayout.cx, cy: coordLayout.cy, r0: isHorizontalOrRadial ? coordLayout.r0 : sectorShape.r0, r: isHorizontalOrRadial ? coordLayout.r : sectorShape.r, startAngle: isHorizontalOrRadial ? sectorShape.startAngle : 0, endAngle: isHorizontalOrRadial ? sectorShape.endAngle : Math.PI * 2 }; } } function createBackgroundEl(coord, isHorizontalOrRadial, layout2) { var ElementClz = coord.type === "polar" ? Sector : Rect$2; return new ElementClz({ shape: createBackgroundShape(isHorizontalOrRadial, layout2, coord), silent: true, z2: 0 }); } function install$R(registers) { registers.registerChartView(BarView); registers.registerSeriesModel(BarSeriesModel); registers.registerLayout(registers.PRIORITY.VISUAL.LAYOUT, curry$1(layout$3, "bar")); registers.registerLayout(registers.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT, createProgressiveLayout("bar")); registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, dataSample("bar")); registers.registerAction({ type: "changeAxisOrder", event: "changeAxisOrder", update: "update" }, function(payload, ecModel) { var componentType = payload.componentType || "series"; ecModel.eachComponent({ mainType: componentType, query: payload }, function(componentModel) { if (payload.sortInfo) { componentModel.axis.setCategorySortInfo(payload.sortInfo); } }); }); } var PI2 = Math.PI * 2; var RADIAN$2 = Math.PI / 180; function getViewRect$5(seriesModel, api) { return getLayoutRect(seriesModel.getBoxLayoutParams(), { width: api.getWidth(), height: api.getHeight() }); } function getBasicPieLayout(seriesModel, api) { var viewRect = getViewRect$5(seriesModel, api); var center2 = seriesModel.get("center"); var radius = seriesModel.get("radius"); if (!isArray$1(radius)) { radius = [0, radius]; } var width = parsePercent(viewRect.width, api.getWidth()); var height = parsePercent(viewRect.height, api.getHeight()); var size = Math.min(width, height); var r0 = parsePercent(radius[0], size / 2); var r = parsePercent(radius[1], size / 2); var cx; var cy; var coordSys = seriesModel.coordinateSystem; if (coordSys) { var point = coordSys.dataToPoint(center2); cx = point[0] || 0; cy = point[1] || 0; } else { if (!isArray$1(center2)) { center2 = [center2, center2]; } cx = parsePercent(center2[0], width) + viewRect.x; cy = parsePercent(center2[1], height) + viewRect.y; } return { cx, cy, r0, r }; } function pieLayout(seriesType2, ecModel, api) { ecModel.eachSeriesByType(seriesType2, function(seriesModel) { var data = seriesModel.getData(); var valueDim = data.mapDimension("value"); var viewRect = getViewRect$5(seriesModel, api); var _a2 = getBasicPieLayout(seriesModel, api), cx = _a2.cx, cy = _a2.cy, r = _a2.r, r0 = _a2.r0; var startAngle = -seriesModel.get("startAngle") * RADIAN$2; var endAngle = seriesModel.get("endAngle"); var padAngle = seriesModel.get("padAngle") * RADIAN$2; endAngle = endAngle === "auto" ? startAngle - PI2 : -endAngle * RADIAN$2; var minAngle = seriesModel.get("minAngle") * RADIAN$2; var minAndPadAngle = minAngle + padAngle; var validDataCount = 0; data.each(valueDim, function(value) { !isNaN(value) && validDataCount++; }); var sum2 = data.getSum(valueDim); var unitRadian = Math.PI / (sum2 || validDataCount) * 2; var clockwise = seriesModel.get("clockwise"); var roseType = seriesModel.get("roseType"); var stillShowZeroSum = seriesModel.get("stillShowZeroSum"); var extent = data.getDataExtent(valueDim); extent[0] = 0; var dir3 = clockwise ? 1 : -1; var angles = [startAngle, endAngle]; var halfPadAngle = dir3 * padAngle / 2; normalizeArcAngles(angles, !clockwise); startAngle = angles[0], endAngle = angles[1]; var layoutData = getSeriesLayoutData(seriesModel); layoutData.startAngle = startAngle; layoutData.endAngle = endAngle; layoutData.clockwise = clockwise; var angleRange = Math.abs(endAngle - startAngle); var restAngle = angleRange; var valueSumLargerThanMinAngle = 0; var currentAngle = startAngle; data.setLayout({ viewRect, r }); data.each(valueDim, function(value, idx) { var angle; if (isNaN(value)) { data.setItemLayout(idx, { angle: NaN, startAngle: NaN, endAngle: NaN, clockwise, cx, cy, r0, r: roseType ? NaN : r }); return; } if (roseType !== "area") { angle = sum2 === 0 && stillShowZeroSum ? unitRadian : value * unitRadian; } else { angle = angleRange / validDataCount; } if (angle < minAndPadAngle) { angle = minAndPadAngle; restAngle -= minAndPadAngle; } else { valueSumLargerThanMinAngle += value; } var endAngle2 = currentAngle + dir3 * angle; var actualStartAngle = 0; var actualEndAngle = 0; if (padAngle > angle) { actualStartAngle = currentAngle + dir3 * angle / 2; actualEndAngle = actualStartAngle; } else { actualStartAngle = currentAngle + halfPadAngle; actualEndAngle = endAngle2 - halfPadAngle; } data.setItemLayout(idx, { angle, startAngle: actualStartAngle, endAngle: actualEndAngle, clockwise, cx, cy, r0, r: roseType ? linearMap$2(value, extent, [r0, r]) : r }); currentAngle = endAngle2; }); if (restAngle < PI2 && validDataCount) { if (restAngle <= 1e-3) { var angle_1 = angleRange / validDataCount; data.each(valueDim, function(value, idx) { if (!isNaN(value)) { var layout_1 = data.getItemLayout(idx); layout_1.angle = angle_1; var actualStartAngle = 0; var actualEndAngle = 0; if (angle_1 < padAngle) { actualStartAngle = startAngle + dir3 * (idx + 1 / 2) * angle_1; actualEndAngle = actualStartAngle; } else { actualStartAngle = startAngle + dir3 * idx * angle_1 + halfPadAngle; actualEndAngle = startAngle + dir3 * (idx + 1) * angle_1 - halfPadAngle; } layout_1.startAngle = actualStartAngle; layout_1.endAngle = actualEndAngle; } }); } else { unitRadian = restAngle / valueSumLargerThanMinAngle; currentAngle = startAngle; data.each(valueDim, function(value, idx) { if (!isNaN(value)) { var layout_2 = data.getItemLayout(idx); var angle = layout_2.angle === minAndPadAngle ? minAndPadAngle : value * unitRadian; var actualStartAngle = 0; var actualEndAngle = 0; if (angle < padAngle) { actualStartAngle = currentAngle + dir3 * angle / 2; actualEndAngle = actualStartAngle; } else { actualStartAngle = currentAngle + halfPadAngle; actualEndAngle = currentAngle + dir3 * angle - halfPadAngle; } layout_2.startAngle = actualStartAngle; layout_2.endAngle = actualEndAngle; currentAngle += dir3 * angle; } }); } } }); } var getSeriesLayoutData = makeInner(); function dataFilter$1(seriesType2) { return { seriesType: seriesType2, reset: function(seriesModel, ecModel) { var legendModels = ecModel.findComponents({ mainType: "legend" }); if (!legendModels || !legendModels.length) { return; } var data = seriesModel.getData(); data.filterSelf(function(idx) { var name = data.getName(idx); for (var i = 0; i < legendModels.length; i++) { if (!legendModels[i].isSelected(name)) { return false; } } return true; }); } }; } var RADIAN$1 = Math.PI / 180; function adjustSingleSide(list, cx, cy, r, dir3, viewWidth, viewHeight, viewLeft, viewTop, farthestX) { if (list.length < 2) { return; } function recalculateXOnSemiToAlignOnEllipseCurve(semi) { var rB = semi.rB; var rB2 = rB * rB; for (var i2 = 0; i2 < semi.list.length; i2++) { var item = semi.list[i2]; var dy = Math.abs(item.label.y - cy); var rA = r + item.len; var rA2 = rA * rA; var dx2 = Math.sqrt(Math.abs((1 - dy * dy / rB2) * rA2)); var newX = cx + (dx2 + item.len2) * dir3; var deltaX = newX - item.label.x; var newTargetWidth = item.targetTextWidth - deltaX * dir3; constrainTextWidth(item, newTargetWidth, true); item.label.x = newX; } } function recalculateX(items) { var topSemi = { list: [], maxY: 0 }; var bottomSemi = { list: [], maxY: 0 }; for (var i2 = 0; i2 < items.length; i2++) { if (items[i2].labelAlignTo !== "none") { continue; } var item = items[i2]; var semi = item.label.y > cy ? bottomSemi : topSemi; var dy = Math.abs(item.label.y - cy); if (dy >= semi.maxY) { var dx2 = item.label.x - cx - item.len2 * dir3; var rA = r + item.len; var rB = Math.abs(dx2) < rA ? Math.sqrt(dy * dy / (1 - dx2 * dx2 / rA / rA)) : rA; semi.rB = rB; semi.maxY = dy; } semi.list.push(item); } recalculateXOnSemiToAlignOnEllipseCurve(topSemi); recalculateXOnSemiToAlignOnEllipseCurve(bottomSemi); } var len2 = list.length; for (var i = 0; i < len2; i++) { if (list[i].position === "outer" && list[i].labelAlignTo === "labelLine") { var dx = list[i].label.x - farthestX; list[i].linePoints[1][0] += dx; list[i].label.x = farthestX; } } if (shiftLayoutOnY(list, viewTop, viewTop + viewHeight)) { recalculateX(list); } } function avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight, viewLeft, viewTop) { var leftList = []; var rightList = []; var leftmostX = Number.MAX_VALUE; var rightmostX = -Number.MAX_VALUE; for (var i = 0; i < labelLayoutList.length; i++) { var label = labelLayoutList[i].label; if (isPositionCenter(labelLayoutList[i])) { continue; } if (label.x < cx) { leftmostX = Math.min(leftmostX, label.x); leftList.push(labelLayoutList[i]); } else { rightmostX = Math.max(rightmostX, label.x); rightList.push(labelLayoutList[i]); } } for (var i = 0; i < labelLayoutList.length; i++) { var layout2 = labelLayoutList[i]; if (!isPositionCenter(layout2) && layout2.linePoints) { if (layout2.labelStyleWidth != null) { continue; } var label = layout2.label; var linePoints = layout2.linePoints; var targetTextWidth = void 0; if (layout2.labelAlignTo === "edge") { if (label.x < cx) { targetTextWidth = linePoints[2][0] - layout2.labelDistance - viewLeft - layout2.edgeDistance; } else { targetTextWidth = viewLeft + viewWidth - layout2.edgeDistance - linePoints[2][0] - layout2.labelDistance; } } else if (layout2.labelAlignTo === "labelLine") { if (label.x < cx) { targetTextWidth = leftmostX - viewLeft - layout2.bleedMargin; } else { targetTextWidth = viewLeft + viewWidth - rightmostX - layout2.bleedMargin; } } else { if (label.x < cx) { targetTextWidth = label.x - viewLeft - layout2.bleedMargin; } else { targetTextWidth = viewLeft + viewWidth - label.x - layout2.bleedMargin; } } layout2.targetTextWidth = targetTextWidth; constrainTextWidth(layout2, targetTextWidth); } } adjustSingleSide(rightList, cx, cy, r, 1, viewWidth, viewHeight, viewLeft, viewTop, rightmostX); adjustSingleSide(leftList, cx, cy, r, -1, viewWidth, viewHeight, viewLeft, viewTop, leftmostX); for (var i = 0; i < labelLayoutList.length; i++) { var layout2 = labelLayoutList[i]; if (!isPositionCenter(layout2) && layout2.linePoints) { var label = layout2.label; var linePoints = layout2.linePoints; var isAlignToEdge = layout2.labelAlignTo === "edge"; var padding = label.style.padding; var paddingH = padding ? padding[1] + padding[3] : 0; var extraPaddingH = label.style.backgroundColor ? 0 : paddingH; var realTextWidth = layout2.rect.width + extraPaddingH; var dist2 = linePoints[1][0] - linePoints[2][0]; if (isAlignToEdge) { if (label.x < cx) { linePoints[2][0] = viewLeft + layout2.edgeDistance + realTextWidth + layout2.labelDistance; } else { linePoints[2][0] = viewLeft + viewWidth - layout2.edgeDistance - realTextWidth - layout2.labelDistance; } } else { if (label.x < cx) { linePoints[2][0] = label.x + layout2.labelDistance; } else { linePoints[2][0] = label.x - layout2.labelDistance; } linePoints[1][0] = linePoints[2][0] + dist2; } linePoints[1][1] = linePoints[2][1] = label.y; } } } function constrainTextWidth(layout2, availableWidth, forceRecalculate) { if (forceRecalculate === void 0) { forceRecalculate = false; } if (layout2.labelStyleWidth != null) { return; } var label = layout2.label; var style = label.style; var textRect = layout2.rect; var bgColor = style.backgroundColor; var padding = style.padding; var paddingH = padding ? padding[1] + padding[3] : 0; var overflow = style.overflow; var oldOuterWidth = textRect.width + (bgColor ? 0 : paddingH); if (availableWidth < oldOuterWidth || forceRecalculate) { var oldHeight = textRect.height; if (overflow && overflow.match("break")) { label.setStyle("backgroundColor", null); label.setStyle("width", availableWidth - paddingH); var innerRect = label.getBoundingRect(); label.setStyle("width", Math.ceil(innerRect.width)); label.setStyle("backgroundColor", bgColor); } else { var availableInnerWidth = availableWidth - paddingH; var newWidth = availableWidth < oldOuterWidth ? availableInnerWidth : ( // Current available width is enough, but the text may have // already been wrapped with a smaller available width. forceRecalculate ? availableInnerWidth > layout2.unconstrainedWidth ? null : availableInnerWidth : null ); label.setStyle("width", newWidth); } var newRect = label.getBoundingRect(); textRect.width = newRect.width; var margin = (label.style.margin || 0) + 2.1; textRect.height = newRect.height + margin; textRect.y -= (textRect.height - oldHeight) / 2; } } function isPositionCenter(sectorShape) { return sectorShape.position === "center"; } function pieLabelLayout(seriesModel) { var data = seriesModel.getData(); var labelLayoutList = []; var cx; var cy; var hasLabelRotate = false; var minShowLabelRadian = (seriesModel.get("minShowLabelAngle") || 0) * RADIAN$1; var viewRect = data.getLayout("viewRect"); var r = data.getLayout("r"); var viewWidth = viewRect.width; var viewLeft = viewRect.x; var viewTop = viewRect.y; var viewHeight = viewRect.height; function setNotShow(el) { el.ignore = true; } function isLabelShown(label2) { if (!label2.ignore) { return true; } for (var key in label2.states) { if (label2.states[key].ignore === false) { return true; } } return false; } data.each(function(idx) { var sector = data.getItemGraphicEl(idx); var sectorShape = sector.shape; var label2 = sector.getTextContent(); var labelLine2 = sector.getTextGuideLine(); var itemModel = data.getItemModel(idx); var labelModel = itemModel.getModel("label"); var labelPosition = labelModel.get("position") || itemModel.get(["emphasis", "label", "position"]); var labelDistance = labelModel.get("distanceToLabelLine"); var labelAlignTo = labelModel.get("alignTo"); var edgeDistance = parsePercent(labelModel.get("edgeDistance"), viewWidth); var bleedMargin = labelModel.get("bleedMargin"); var labelLineModel = itemModel.getModel("labelLine"); var labelLineLen = labelLineModel.get("length"); labelLineLen = parsePercent(labelLineLen, viewWidth); var labelLineLen2 = labelLineModel.get("length2"); labelLineLen2 = parsePercent(labelLineLen2, viewWidth); if (Math.abs(sectorShape.endAngle - sectorShape.startAngle) < minShowLabelRadian) { each$f(label2.states, setNotShow); label2.ignore = true; if (labelLine2) { each$f(labelLine2.states, setNotShow); labelLine2.ignore = true; } return; } if (!isLabelShown(label2)) { return; } var midAngle = (sectorShape.startAngle + sectorShape.endAngle) / 2; var nx = Math.cos(midAngle); var ny = Math.sin(midAngle); var textX; var textY; var linePoints2; var textAlign; cx = sectorShape.cx; cy = sectorShape.cy; var isLabelInside = labelPosition === "inside" || labelPosition === "inner"; if (labelPosition === "center") { textX = sectorShape.cx; textY = sectorShape.cy; textAlign = "center"; } else { var x1 = (isLabelInside ? (sectorShape.r + sectorShape.r0) / 2 * nx : sectorShape.r * nx) + cx; var y1 = (isLabelInside ? (sectorShape.r + sectorShape.r0) / 2 * ny : sectorShape.r * ny) + cy; textX = x1 + nx * 3; textY = y1 + ny * 3; if (!isLabelInside) { var x2 = x1 + nx * (labelLineLen + r - sectorShape.r); var y2 = y1 + ny * (labelLineLen + r - sectorShape.r); var x3 = x2 + (nx < 0 ? -1 : 1) * labelLineLen2; var y3 = y2; if (labelAlignTo === "edge") { textX = nx < 0 ? viewLeft + edgeDistance : viewLeft + viewWidth - edgeDistance; } else { textX = x3 + (nx < 0 ? -labelDistance : labelDistance); } textY = y3; linePoints2 = [[x1, y1], [x2, y2], [x3, y3]]; } textAlign = isLabelInside ? "center" : labelAlignTo === "edge" ? nx > 0 ? "right" : "left" : nx > 0 ? "left" : "right"; } var PI3 = Math.PI; var labelRotate = 0; var rotate2 = labelModel.get("rotate"); if (isNumber(rotate2)) { labelRotate = rotate2 * (PI3 / 180); } else if (labelPosition === "center") { labelRotate = 0; } else if (rotate2 === "radial" || rotate2 === true) { var radialAngle = nx < 0 ? -midAngle + PI3 : -midAngle; labelRotate = radialAngle; } else if (rotate2 === "tangential" && labelPosition !== "outside" && labelPosition !== "outer") { var rad = Math.atan2(nx, ny); if (rad < 0) { rad = PI3 * 2 + rad; } var isDown = ny > 0; if (isDown) { rad = PI3 + rad; } labelRotate = rad - PI3; } hasLabelRotate = !!labelRotate; label2.x = textX; label2.y = textY; label2.rotation = labelRotate; label2.setStyle({ verticalAlign: "middle" }); if (!isLabelInside) { var textRect = label2.getBoundingRect().clone(); textRect.applyTransform(label2.getComputedTransform()); var margin = (label2.style.margin || 0) + 2.1; textRect.y -= margin / 2; textRect.height += margin; labelLayoutList.push({ label: label2, labelLine: labelLine2, position: labelPosition, len: labelLineLen, len2: labelLineLen2, minTurnAngle: labelLineModel.get("minTurnAngle"), maxSurfaceAngle: labelLineModel.get("maxSurfaceAngle"), surfaceNormal: new Point(nx, ny), linePoints: linePoints2, textAlign, labelDistance, labelAlignTo, edgeDistance, bleedMargin, rect: textRect, unconstrainedWidth: textRect.width, labelStyleWidth: label2.style.width }); } else { label2.setStyle({ align: textAlign }); var selectState2 = label2.states.select; if (selectState2) { selectState2.x += label2.x; selectState2.y += label2.y; } } sector.setTextConfig({ inside: isLabelInside }); }); if (!hasLabelRotate && seriesModel.get("avoidLabelOverlap")) { avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight, viewLeft, viewTop); } for (var i = 0; i < labelLayoutList.length; i++) { var layout2 = labelLayoutList[i]; var label = layout2.label; var labelLine = layout2.labelLine; var notShowLabel = isNaN(label.x) || isNaN(label.y); if (label) { label.setStyle({ align: layout2.textAlign }); if (notShowLabel) { each$f(label.states, setNotShow); label.ignore = true; } var selectState = label.states.select; if (selectState) { selectState.x += label.x; selectState.y += label.y; } } if (labelLine) { var linePoints = layout2.linePoints; if (notShowLabel || !linePoints) { each$f(labelLine.states, setNotShow); labelLine.ignore = true; } else { limitTurnAngle(linePoints, layout2.minTurnAngle); limitSurfaceAngle(linePoints, layout2.surfaceNormal, layout2.maxSurfaceAngle); labelLine.setShape({ points: linePoints }); label.__hostTarget.textGuideLineConfig = { anchor: new Point(linePoints[0][0], linePoints[0][1]) }; } } } } var PiePiece = ( /** @class */ (function(_super) { __extends(PiePiece2, _super); function PiePiece2(data, idx, startAngle) { var _this = _super.call(this) || this; _this.z2 = 2; var text = new ZRText(); _this.setTextContent(text); _this.updateData(data, idx, startAngle, true); return _this; } PiePiece2.prototype.updateData = function(data, idx, startAngle, firstCreate) { var sector = this; var seriesModel = data.hostModel; var itemModel = data.getItemModel(idx); var emphasisModel = itemModel.getModel("emphasis"); var layout2 = data.getItemLayout(idx); var sectorShape = extend(getSectorCornerRadius(itemModel.getModel("itemStyle"), layout2, true), layout2); if (isNaN(sectorShape.startAngle)) { sector.setShape(sectorShape); return; } if (firstCreate) { sector.setShape(sectorShape); var animationType = seriesModel.getShallow("animationType"); if (seriesModel.ecModel.ssr) { initProps(sector, { scaleX: 0, scaleY: 0 }, seriesModel, { dataIndex: idx, isFrom: true }); sector.originX = sectorShape.cx; sector.originY = sectorShape.cy; } else if (animationType === "scale") { sector.shape.r = layout2.r0; initProps(sector, { shape: { r: layout2.r } }, seriesModel, idx); } else { if (startAngle != null) { sector.setShape({ startAngle, endAngle: startAngle }); initProps(sector, { shape: { startAngle: layout2.startAngle, endAngle: layout2.endAngle } }, seriesModel, idx); } else { sector.shape.endAngle = layout2.startAngle; updateProps$1(sector, { shape: { endAngle: layout2.endAngle } }, seriesModel, idx); } } } else { saveOldStyle(sector); updateProps$1(sector, { shape: sectorShape }, seriesModel, idx); } sector.useStyle(data.getItemVisual(idx, "style")); setStatesStylesFromModel(sector, itemModel); var midAngle = (layout2.startAngle + layout2.endAngle) / 2; var offset = seriesModel.get("selectedOffset"); var dx = Math.cos(midAngle) * offset; var dy = Math.sin(midAngle) * offset; var cursorStyle = itemModel.getShallow("cursor"); cursorStyle && sector.attr("cursor", cursorStyle); this._updateLabel(seriesModel, data, idx); sector.ensureState("emphasis").shape = extend({ r: layout2.r + (emphasisModel.get("scale") ? emphasisModel.get("scaleSize") || 0 : 0) }, getSectorCornerRadius(emphasisModel.getModel("itemStyle"), layout2)); extend(sector.ensureState("select"), { x: dx, y: dy, shape: getSectorCornerRadius(itemModel.getModel(["select", "itemStyle"]), layout2) }); extend(sector.ensureState("blur"), { shape: getSectorCornerRadius(itemModel.getModel(["blur", "itemStyle"]), layout2) }); var labelLine = sector.getTextGuideLine(); var labelText = sector.getTextContent(); labelLine && extend(labelLine.ensureState("select"), { x: dx, y: dy }); extend(labelText.ensureState("select"), { x: dx, y: dy }); toggleHoverEmphasis(this, emphasisModel.get("focus"), emphasisModel.get("blurScope"), emphasisModel.get("disabled")); }; PiePiece2.prototype._updateLabel = function(seriesModel, data, idx) { var sector = this; var itemModel = data.getItemModel(idx); var labelLineModel = itemModel.getModel("labelLine"); var style = data.getItemVisual(idx, "style"); var visualColor = style && style.fill; var visualOpacity = style && style.opacity; setLabelStyle(sector, getLabelStatesModels(itemModel), { labelFetcher: data.hostModel, labelDataIndex: idx, inheritColor: visualColor, defaultOpacity: visualOpacity, defaultText: seriesModel.getFormattedLabel(idx, "normal") || data.getName(idx) }); var labelText = sector.getTextContent(); sector.setTextConfig({ // reset position, rotation position: null, rotation: null }); labelText.attr({ z2: 10 }); var labelPosition = seriesModel.get(["label", "position"]); if (labelPosition !== "outside" && labelPosition !== "outer") { sector.removeTextGuideLine(); } else { var polyline = this.getTextGuideLine(); if (!polyline) { polyline = new Polyline$1(); this.setTextGuideLine(polyline); } setLabelLineStyle(this, getLabelLineStatesModels(itemModel), { stroke: visualColor, opacity: retrieve3(labelLineModel.get(["lineStyle", "opacity"]), visualOpacity, 1) }); } }; return PiePiece2; })(Sector) ); var PieView = ( /** @class */ (function(_super) { __extends(PieView2, _super); function PieView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.ignoreLabelLineUpdate = true; return _this; } PieView2.prototype.render = function(seriesModel, ecModel, api, payload) { var data = seriesModel.getData(); var oldData = this._data; var group = this.group; var startAngle; if (!oldData && data.count() > 0) { var shape = data.getItemLayout(0); for (var s = 1; isNaN(shape && shape.startAngle) && s < data.count(); ++s) { shape = data.getItemLayout(s); } if (shape) { startAngle = shape.startAngle; } } if (this._emptyCircleSector) { group.remove(this._emptyCircleSector); } if (data.count() === 0 && seriesModel.get("showEmptyCircle")) { var layoutData = getSeriesLayoutData(seriesModel); var sector = new Sector({ shape: extend(getBasicPieLayout(seriesModel, api), layoutData) }); sector.useStyle(seriesModel.getModel("emptyCircleStyle").getItemStyle()); this._emptyCircleSector = sector; group.add(sector); } data.diff(oldData).add(function(idx) { var piePiece = new PiePiece(data, idx, startAngle); data.setItemGraphicEl(idx, piePiece); group.add(piePiece); }).update(function(newIdx, oldIdx) { var piePiece = oldData.getItemGraphicEl(oldIdx); piePiece.updateData(data, newIdx, startAngle); piePiece.off("click"); group.add(piePiece); data.setItemGraphicEl(newIdx, piePiece); }).remove(function(idx) { var piePiece = oldData.getItemGraphicEl(idx); removeElementWithFadeOut(piePiece, seriesModel, idx); }).execute(); pieLabelLayout(seriesModel); if (seriesModel.get("animationTypeUpdate") !== "expansion") { this._data = data; } }; PieView2.prototype.dispose = function() { }; PieView2.prototype.containPoint = function(point, seriesModel) { var data = seriesModel.getData(); var itemLayout = data.getItemLayout(0); if (itemLayout) { var dx = point[0] - itemLayout.cx; var dy = point[1] - itemLayout.cy; var radius = Math.sqrt(dx * dx + dy * dy); return radius <= itemLayout.r && radius >= itemLayout.r0; } }; PieView2.type = "pie"; return PieView2; })(ChartView) ); function createSeriesDataSimply(seriesModel, opt, nameList) { opt = isArray$1(opt) && { coordDimensions: opt } || extend({ encodeDefine: seriesModel.getEncode() }, opt); var source = seriesModel.getSource(); var dimensions = prepareSeriesDataSchema(source, opt).dimensions; var list = new SeriesData(dimensions, seriesModel); list.initData(source, nameList); return list; } var LegendVisualProvider = ( /** @class */ (function() { function LegendVisualProvider2(getDataWithEncodedVisual, getRawData2) { this._getDataWithEncodedVisual = getDataWithEncodedVisual; this._getRawData = getRawData2; } LegendVisualProvider2.prototype.getAllNames = function() { var rawData = this._getRawData(); return rawData.mapArray(rawData.getName); }; LegendVisualProvider2.prototype.containName = function(name) { var rawData = this._getRawData(); return rawData.indexOfName(name) >= 0; }; LegendVisualProvider2.prototype.indexOfName = function(name) { var dataWithEncodedVisual = this._getDataWithEncodedVisual(); return dataWithEncodedVisual.indexOfName(name); }; LegendVisualProvider2.prototype.getItemVisual = function(dataIndex, key) { var dataWithEncodedVisual = this._getDataWithEncodedVisual(); return dataWithEncodedVisual.getItemVisual(dataIndex, key); }; return LegendVisualProvider2; })() ); var innerData = makeInner(); var PieSeriesModel = ( /** @class */ (function(_super) { __extends(PieSeriesModel2, _super); function PieSeriesModel2() { return _super !== null && _super.apply(this, arguments) || this; } PieSeriesModel2.prototype.init = function(option) { _super.prototype.init.apply(this, arguments); this.legendVisualProvider = new LegendVisualProvider(bind$1(this.getData, this), bind$1(this.getRawData, this)); this._defaultLabelLine(option); }; PieSeriesModel2.prototype.mergeOption = function() { _super.prototype.mergeOption.apply(this, arguments); }; PieSeriesModel2.prototype.getInitialData = function() { return createSeriesDataSimply(this, { coordDimensions: ["value"], encodeDefaulter: curry$1(makeSeriesEncodeForNameBased, this) }); }; PieSeriesModel2.prototype.getDataParams = function(dataIndex) { var data = this.getData(); var dataInner = innerData(data); var seats = dataInner.seats; if (!seats) { var valueList_1 = []; data.each(data.mapDimension("value"), function(value) { valueList_1.push(value); }); seats = dataInner.seats = getPercentSeats(valueList_1, data.hostModel.get("percentPrecision")); } var params = _super.prototype.getDataParams.call(this, dataIndex); params.percent = seats[dataIndex] || 0; params.$vars.push("percent"); return params; }; PieSeriesModel2.prototype._defaultLabelLine = function(option) { defaultEmphasis(option, "labelLine", ["show"]); var labelLineNormalOpt = option.labelLine; var labelLineEmphasisOpt = option.emphasis.labelLine; labelLineNormalOpt.show = labelLineNormalOpt.show && option.label.show; labelLineEmphasisOpt.show = labelLineEmphasisOpt.show && option.emphasis.label.show; }; PieSeriesModel2.type = "series.pie"; PieSeriesModel2.defaultOption = { // zlevel: 0, z: 2, legendHoverLink: true, colorBy: "data", // 默认全局居中 center: ["50%", "50%"], radius: [0, "75%"], // 默认顺时针 clockwise: true, startAngle: 90, endAngle: "auto", padAngle: 0, // 最小角度改为0 minAngle: 0, // If the angle of a sector less than `minShowLabelAngle`, // the label will not be displayed. minShowLabelAngle: 0, // 选中时扇区偏移量 selectedOffset: 10, // 选择模式,默认关闭,可选single,multiple // selectedMode: false, // 南丁格尔玫瑰图模式,'radius'(半径) | 'area'(面积) // roseType: null, percentPrecision: 2, // If still show when all data zero. stillShowZeroSum: true, // cursor: null, left: 0, top: 0, right: 0, bottom: 0, width: null, height: null, label: { // color: 'inherit', // If rotate around circle rotate: 0, show: true, overflow: "truncate", // 'outer', 'inside', 'center' position: "outer", // 'none', 'labelLine', 'edge'. Works only when position is 'outer' alignTo: "none", // Closest distance between label and chart edge. // Works only position is 'outer' and alignTo is 'edge'. edgeDistance: "25%", // Works only position is 'outer' and alignTo is not 'edge'. bleedMargin: 10, // Distance between text and label line. distanceToLabelLine: 5 // formatter: 标签文本格式器,同 tooltip.formatter,不支持异步回调 // 默认使用全局文本样式,详见 textStyle // distance: 当position为inner时有效,为label位置到圆心的距离与圆半径(环状图为内外半径和)的比例系数 }, // Enabled when label.normal.position is 'outer' labelLine: { show: true, // 引导线两段中的第一段长度 length: 15, // 引导线两段中的第二段长度 length2: 15, smooth: false, minTurnAngle: 90, maxSurfaceAngle: 90, lineStyle: { // color: 各异, width: 1, type: "solid" } }, itemStyle: { borderWidth: 1, borderJoin: "round" }, showEmptyCircle: true, emptyCircleStyle: { color: "lightgray", opacity: 1 }, labelLayout: { // Hide the overlapped label. hideOverlap: true }, emphasis: { scale: true, scaleSize: 5 }, // If use strategy to avoid label overlapping avoidLabelOverlap: true, // Animation type. Valid values: expansion, scale animationType: "expansion", animationDuration: 1e3, // Animation type when update. Valid values: transition, expansion animationTypeUpdate: "transition", animationEasingUpdate: "cubicInOut", animationDurationUpdate: 500, animationEasing: "cubicInOut" }; return PieSeriesModel2; })(SeriesModel) ); function negativeDataFilter(seriesType2) { return { seriesType: seriesType2, reset: function(seriesModel, ecModel) { var data = seriesModel.getData(); data.filterSelf(function(idx) { var valueDim = data.mapDimension("value"); var curValue = data.get(valueDim, idx); if (isNumber(curValue) && !isNaN(curValue) && curValue < 0) { return false; } return true; }); } }; } function install$Q(registers) { registers.registerChartView(PieView); registers.registerSeriesModel(PieSeriesModel); createLegacyDataSelectAction("pie", registers.registerAction); registers.registerLayout(curry$1(pieLayout, "pie")); registers.registerProcessor(dataFilter$1("pie")); registers.registerProcessor(negativeDataFilter("pie")); } var ScatterSeriesModel = ( /** @class */ (function(_super) { __extends(ScatterSeriesModel2, _super); function ScatterSeriesModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = ScatterSeriesModel2.type; _this.hasSymbolVisual = true; return _this; } ScatterSeriesModel2.prototype.getInitialData = function(option, ecModel) { return createSeriesData(null, this, { useEncodeDefaulter: true }); }; ScatterSeriesModel2.prototype.getProgressive = function() { var progressive = this.option.progressive; if (progressive == null) { return this.option.large ? 5e3 : this.get("progressive"); } return progressive; }; ScatterSeriesModel2.prototype.getProgressiveThreshold = function() { var progressiveThreshold = this.option.progressiveThreshold; if (progressiveThreshold == null) { return this.option.large ? 1e4 : this.get("progressiveThreshold"); } return progressiveThreshold; }; ScatterSeriesModel2.prototype.brushSelector = function(dataIndex, data, selectors) { return selectors.point(data.getItemLayout(dataIndex)); }; ScatterSeriesModel2.prototype.getZLevelKey = function() { return this.getData().count() > this.getProgressiveThreshold() ? this.id : ""; }; ScatterSeriesModel2.type = "series.scatter"; ScatterSeriesModel2.dependencies = ["grid", "polar", "geo", "singleAxis", "calendar"]; ScatterSeriesModel2.defaultOption = { coordinateSystem: "cartesian2d", // zlevel: 0, z: 2, legendHoverLink: true, symbolSize: 10, // symbolRotate: null, // 图形旋转控制 large: false, // Available when large is true largeThreshold: 2e3, // cursor: null, itemStyle: { opacity: 0.8 // color: 各异 }, emphasis: { scale: true }, // If clip the overflow graphics // Works on cartesian / polar series clip: true, select: { itemStyle: { borderColor: "#212121" } }, universalTransition: { divideShape: "clone" } // progressive: null }; return ScatterSeriesModel2; })(SeriesModel) ); var BOOST_SIZE_THRESHOLD = 4; var LargeSymbolPathShape = ( /** @class */ /* @__PURE__ */ (function() { function LargeSymbolPathShape2() { } return LargeSymbolPathShape2; })() ); var LargeSymbolPath = ( /** @class */ (function(_super) { __extends(LargeSymbolPath2, _super); function LargeSymbolPath2(opts) { var _this = _super.call(this, opts) || this; _this._off = 0; _this.hoverDataIdx = -1; return _this; } LargeSymbolPath2.prototype.getDefaultShape = function() { return new LargeSymbolPathShape(); }; LargeSymbolPath2.prototype.reset = function() { this.notClear = false; this._off = 0; }; LargeSymbolPath2.prototype.buildPath = function(path, shape) { var points2 = shape.points; var size = shape.size; var symbolProxy = this.symbolProxy; var symbolProxyShape = symbolProxy.shape; var ctx = path.getContext ? path.getContext() : path; var canBoost = ctx && size[0] < BOOST_SIZE_THRESHOLD; var softClipShape = this.softClipShape; var i; if (canBoost) { this._ctx = ctx; return; } this._ctx = null; for (i = this._off; i < points2.length; ) { var x = points2[i++]; var y = points2[i++]; if (isNaN(x) || isNaN(y)) { continue; } if (softClipShape && !softClipShape.contain(x, y)) { continue; } symbolProxyShape.x = x - size[0] / 2; symbolProxyShape.y = y - size[1] / 2; symbolProxyShape.width = size[0]; symbolProxyShape.height = size[1]; symbolProxy.buildPath(path, symbolProxyShape, true); } if (this.incremental) { this._off = i; this.notClear = true; } }; LargeSymbolPath2.prototype.afterBrush = function() { var shape = this.shape; var points2 = shape.points; var size = shape.size; var ctx = this._ctx; var softClipShape = this.softClipShape; var i; if (!ctx) { return; } for (i = this._off; i < points2.length; ) { var x = points2[i++]; var y = points2[i++]; if (isNaN(x) || isNaN(y)) { continue; } if (softClipShape && !softClipShape.contain(x, y)) { continue; } ctx.fillRect(x - size[0] / 2, y - size[1] / 2, size[0], size[1]); } if (this.incremental) { this._off = i; this.notClear = true; } }; LargeSymbolPath2.prototype.findDataIndex = function(x, y) { var shape = this.shape; var points2 = shape.points; var size = shape.size; var w = Math.max(size[0], 4); var h = Math.max(size[1], 4); for (var idx = points2.length / 2 - 1; idx >= 0; idx--) { var i = idx * 2; var x0 = points2[i] - w / 2; var y0 = points2[i + 1] - h / 2; if (x >= x0 && y >= y0 && x <= x0 + w && y <= y0 + h) { return idx; } } return -1; }; LargeSymbolPath2.prototype.contain = function(x, y) { var localPos = this.transformCoordToLocal(x, y); var rect = this.getBoundingRect(); x = localPos[0]; y = localPos[1]; if (rect.contain(x, y)) { var dataIdx = this.hoverDataIdx = this.findDataIndex(x, y); return dataIdx >= 0; } this.hoverDataIdx = -1; return false; }; LargeSymbolPath2.prototype.getBoundingRect = function() { var rect = this._rect; if (!rect) { var shape = this.shape; var points2 = shape.points; var size = shape.size; var w = size[0]; var h = size[1]; var minX = Infinity; var minY = Infinity; var maxX = -Infinity; var maxY = -Infinity; for (var i = 0; i < points2.length; ) { var x = points2[i++]; var y = points2[i++]; minX = Math.min(x, minX); maxX = Math.max(x, maxX); minY = Math.min(y, minY); maxY = Math.max(y, maxY); } rect = this._rect = new BoundingRect(minX - w / 2, minY - h / 2, maxX - minX + w, maxY - minY + h); } return rect; }; return LargeSymbolPath2; })(Path) ); var LargeSymbolDraw = ( /** @class */ (function() { function LargeSymbolDraw2() { this.group = new Group$3(); } LargeSymbolDraw2.prototype.updateData = function(data, opt) { this._clear(); var symbolEl = this._create(); symbolEl.setShape({ points: data.getLayout("points") }); this._setCommon(symbolEl, data, opt); }; LargeSymbolDraw2.prototype.updateLayout = function(data) { var points2 = data.getLayout("points"); this.group.eachChild(function(child) { if (child.startIndex != null) { var len2 = (child.endIndex - child.startIndex) * 2; var byteOffset = child.startIndex * 4 * 2; points2 = new Float32Array(points2.buffer, byteOffset, len2); } child.setShape("points", points2); child.reset(); }); }; LargeSymbolDraw2.prototype.incrementalPrepareUpdate = function(data) { this._clear(); }; LargeSymbolDraw2.prototype.incrementalUpdate = function(taskParams, data, opt) { var lastAdded = this._newAdded[0]; var points2 = data.getLayout("points"); var oldPoints = lastAdded && lastAdded.shape.points; if (oldPoints && oldPoints.length < 2e4) { var oldLen = oldPoints.length; var newPoints = new Float32Array(oldLen + points2.length); newPoints.set(oldPoints); newPoints.set(points2, oldLen); lastAdded.endIndex = taskParams.end; lastAdded.setShape({ points: newPoints }); } else { this._newAdded = []; var symbolEl = this._create(); symbolEl.startIndex = taskParams.start; symbolEl.endIndex = taskParams.end; symbolEl.incremental = true; symbolEl.setShape({ points: points2 }); this._setCommon(symbolEl, data, opt); } }; LargeSymbolDraw2.prototype.eachRendered = function(cb) { this._newAdded[0] && cb(this._newAdded[0]); }; LargeSymbolDraw2.prototype._create = function() { var symbolEl = new LargeSymbolPath({ cursor: "default" }); symbolEl.ignoreCoarsePointer = true; this.group.add(symbolEl); this._newAdded.push(symbolEl); return symbolEl; }; LargeSymbolDraw2.prototype._setCommon = function(symbolEl, data, opt) { var hostModel = data.hostModel; opt = opt || {}; var size = data.getVisual("symbolSize"); symbolEl.setShape("size", size instanceof Array ? size : [size, size]); symbolEl.softClipShape = opt.clipShape || null; symbolEl.symbolProxy = createSymbol$1(data.getVisual("symbol"), 0, 0, 0, 0); symbolEl.setColor = symbolEl.symbolProxy.setColor; var extrudeShadow = symbolEl.shape.size[0] < BOOST_SIZE_THRESHOLD; symbolEl.useStyle( // Draw shadow when doing fillRect is extremely slow. hostModel.getModel("itemStyle").getItemStyle(extrudeShadow ? ["color", "shadowBlur", "shadowColor"] : ["color"]) ); var globalStyle = data.getVisual("style"); var visualColor = globalStyle && globalStyle.fill; if (visualColor) { symbolEl.setColor(visualColor); } var ecData = getECData(symbolEl); ecData.seriesIndex = hostModel.seriesIndex; symbolEl.on("mousemove", function(e) { ecData.dataIndex = null; var dataIndex = symbolEl.hoverDataIdx; if (dataIndex >= 0) { ecData.dataIndex = dataIndex + (symbolEl.startIndex || 0); } }); }; LargeSymbolDraw2.prototype.remove = function() { this._clear(); }; LargeSymbolDraw2.prototype._clear = function() { this._newAdded = []; this.group.removeAll(); }; return LargeSymbolDraw2; })() ); var ScatterView = ( /** @class */ (function(_super) { __extends(ScatterView2, _super); function ScatterView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = ScatterView2.type; return _this; } ScatterView2.prototype.render = function(seriesModel, ecModel, api) { var data = seriesModel.getData(); var symbolDraw = this._updateSymbolDraw(data, seriesModel); symbolDraw.updateData(data, { // TODO // If this parameter should be a shape or a bounding volume // shape will be more general. // But bounding volume like bounding rect will be much faster in the contain calculation clipShape: this._getClipShape(seriesModel) }); this._finished = true; }; ScatterView2.prototype.incrementalPrepareRender = function(seriesModel, ecModel, api) { var data = seriesModel.getData(); var symbolDraw = this._updateSymbolDraw(data, seriesModel); symbolDraw.incrementalPrepareUpdate(data); this._finished = false; }; ScatterView2.prototype.incrementalRender = function(taskParams, seriesModel, ecModel) { this._symbolDraw.incrementalUpdate(taskParams, seriesModel.getData(), { clipShape: this._getClipShape(seriesModel) }); this._finished = taskParams.end === seriesModel.getData().count(); }; ScatterView2.prototype.updateTransform = function(seriesModel, ecModel, api) { var data = seriesModel.getData(); this.group.dirty(); if (!this._finished || data.count() > 1e4) { return { update: true }; } else { var res = pointsLayout("").reset(seriesModel, ecModel, api); if (res.progress) { res.progress({ start: 0, end: data.count(), count: data.count() }, data); } this._symbolDraw.updateLayout(data); } }; ScatterView2.prototype.eachRendered = function(cb) { this._symbolDraw && this._symbolDraw.eachRendered(cb); }; ScatterView2.prototype._getClipShape = function(seriesModel) { if (!seriesModel.get("clip", true)) { return; } var coordSys = seriesModel.coordinateSystem; return coordSys && coordSys.getArea && coordSys.getArea(0.1); }; ScatterView2.prototype._updateSymbolDraw = function(data, seriesModel) { var symbolDraw = this._symbolDraw; var pipelineContext = seriesModel.pipelineContext; var isLargeDraw = pipelineContext.large; if (!symbolDraw || isLargeDraw !== this._isLargeDraw) { symbolDraw && symbolDraw.remove(); symbolDraw = this._symbolDraw = isLargeDraw ? new LargeSymbolDraw() : new SymbolDraw(); this._isLargeDraw = isLargeDraw; this.group.removeAll(); } this.group.add(symbolDraw.group); return symbolDraw; }; ScatterView2.prototype.remove = function(ecModel, api) { this._symbolDraw && this._symbolDraw.remove(true); this._symbolDraw = null; }; ScatterView2.prototype.dispose = function() { }; ScatterView2.type = "scatter"; return ScatterView2; })(ChartView) ); var GridModel = ( /** @class */ (function(_super) { __extends(GridModel2, _super); function GridModel2() { return _super !== null && _super.apply(this, arguments) || this; } GridModel2.type = "grid"; GridModel2.dependencies = ["xAxis", "yAxis"]; GridModel2.layoutMode = "box"; GridModel2.defaultOption = { show: false, // zlevel: 0, z: 0, left: "10%", top: 60, right: "10%", bottom: 70, // If grid size contain label containLabel: false, // width: {totalWidth} - left - right, // height: {totalHeight} - top - bottom, backgroundColor: "rgba(0,0,0,0)", borderWidth: 1, borderColor: "#ccc" }; return GridModel2; })(ComponentModel) ); var CartesianAxisModel = ( /** @class */ (function(_super) { __extends(CartesianAxisModel2, _super); function CartesianAxisModel2() { return _super !== null && _super.apply(this, arguments) || this; } CartesianAxisModel2.prototype.getCoordSysModel = function() { return this.getReferringComponents("grid", SINGLE_REFERRING).models[0]; }; CartesianAxisModel2.type = "cartesian2dAxis"; return CartesianAxisModel2; })(ComponentModel) ); mixin(CartesianAxisModel, AxisModelCommonMixin); var defaultOption$1 = { show: true, // zlevel: 0, z: 0, // Inverse the axis. inverse: false, // Axis name displayed. name: "", // 'start' | 'middle' | 'end' nameLocation: "end", // By degree. By default auto rotate by nameLocation. nameRotate: null, nameTruncate: { maxWidth: null, ellipsis: "...", placeholder: "." }, // Use global text style by default. nameTextStyle: {}, // The gap between axisName and axisLine. nameGap: 15, // Default `false` to support tooltip. silent: false, // Default `false` to avoid legacy user event listener fail. triggerEvent: false, tooltip: { show: false }, axisPointer: {}, axisLine: { show: true, onZero: true, onZeroAxisIndex: null, lineStyle: { color: "#6E7079", width: 1, type: "solid" }, // The arrow at both ends the the axis. symbol: ["none", "none"], symbolSize: [10, 15] }, axisTick: { show: true, // Whether axisTick is inside the grid or outside the grid. inside: false, // The length of axisTick. length: 5, lineStyle: { width: 1 } }, axisLabel: { show: true, // Whether axisLabel is inside the grid or outside the grid. inside: false, rotate: 0, // true | false | null/undefined (auto) showMinLabel: null, // true | false | null/undefined (auto) showMaxLabel: null, margin: 8, // formatter: null, fontSize: 12 }, splitLine: { show: true, showMinLine: true, showMaxLine: true, lineStyle: { color: ["#E0E6F1"], width: 1, type: "solid" } }, splitArea: { show: false, areaStyle: { color: ["rgba(250,250,250,0.2)", "rgba(210,219,238,0.2)"] } } }; var categoryAxis = merge({ // The gap at both ends of the axis. For categoryAxis, boolean. boundaryGap: true, // Set false to faster category collection. deduplication: null, // splitArea: { // show: false // }, splitLine: { show: false }, axisTick: { // If tick is align with label when boundaryGap is true alignWithLabel: false, interval: "auto" }, axisLabel: { interval: "auto" } }, defaultOption$1); var valueAxis = merge({ boundaryGap: [0, 0], axisLine: { // Not shown when other axis is categoryAxis in cartesian show: "auto" }, axisTick: { // Not shown when other axis is categoryAxis in cartesian show: "auto" }, // TODO // min/max: [30, datamin, 60] or [20, datamin] or [datamin, 60] splitNumber: 5, minorTick: { // Minor tick, not available for cateogry axis. show: false, // Split number of minor ticks. The value should be in range of (0, 100) splitNumber: 5, // Length of minor tick length: 3, // Line style lineStyle: { // Default to be same with axisTick } }, minorSplitLine: { show: false, lineStyle: { color: "#F4F7FD", width: 1 } } }, defaultOption$1); var timeAxis = merge({ splitNumber: 6, axisLabel: { // To eliminate labels that are not nice showMinLabel: false, showMaxLabel: false, rich: { primary: { fontWeight: "bold" } } }, splitLine: { show: false } }, valueAxis); var logAxis = defaults({ logBase: 10 }, valueAxis); const axisDefault = { category: categoryAxis, value: valueAxis, time: timeAxis, log: logAxis }; var AXIS_TYPES = { value: 1, category: 1, time: 1, log: 1 }; function axisModelCreator(registers, axisName, BaseAxisModelClass, extraDefaultOption) { each$f(AXIS_TYPES, function(v, axisType) { var defaultOption2 = merge(merge({}, axisDefault[axisType], true), extraDefaultOption, true); var AxisModel = ( /** @class */ (function(_super) { __extends(AxisModel2, _super); function AxisModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = axisName + "Axis." + axisType; return _this; } AxisModel2.prototype.mergeDefaultAndTheme = function(option, ecModel) { var layoutMode = fetchLayoutMode(this); var inputPositionParams = layoutMode ? getLayoutParams(option) : {}; var themeModel = ecModel.getTheme(); merge(option, themeModel.get(axisType + "Axis")); merge(option, this.getDefaultOption()); option.type = getAxisType(option); if (layoutMode) { mergeLayoutParam(option, inputPositionParams, layoutMode); } }; AxisModel2.prototype.optionUpdated = function() { var thisOption = this.option; if (thisOption.type === "category") { this.__ordinalMeta = OrdinalMeta.createByAxisModel(this); } }; AxisModel2.prototype.getCategories = function(rawData) { var option = this.option; if (option.type === "category") { if (rawData) { return option.data; } return this.__ordinalMeta.categories; } }; AxisModel2.prototype.getOrdinalMeta = function() { return this.__ordinalMeta; }; AxisModel2.type = axisName + "Axis." + axisType; AxisModel2.defaultOption = defaultOption2; return AxisModel2; })(BaseAxisModelClass) ); registers.registerComponentModel(AxisModel); }); registers.registerSubTypeDefaulter(axisName + "Axis", getAxisType); } function getAxisType(option) { return option.type || (option.data ? "category" : "value"); } var Cartesian = ( /** @class */ (function() { function Cartesian2(name) { this.type = "cartesian"; this._dimList = []; this._axes = {}; this.name = name || ""; } Cartesian2.prototype.getAxis = function(dim) { return this._axes[dim]; }; Cartesian2.prototype.getAxes = function() { return map$1(this._dimList, function(dim) { return this._axes[dim]; }, this); }; Cartesian2.prototype.getAxesByScale = function(scaleType) { scaleType = scaleType.toLowerCase(); return filter(this.getAxes(), function(axis) { return axis.scale.type === scaleType; }); }; Cartesian2.prototype.addAxis = function(axis) { var dim = axis.dim; this._axes[dim] = axis; this._dimList.push(dim); }; return Cartesian2; })() ); var cartesian2DDimensions = ["x", "y"]; function canCalculateAffineTransform(scale2) { return scale2.type === "interval" || scale2.type === "time"; } var Cartesian2D = ( /** @class */ (function(_super) { __extends(Cartesian2D2, _super); function Cartesian2D2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = "cartesian2d"; _this.dimensions = cartesian2DDimensions; return _this; } Cartesian2D2.prototype.calcAffineTransform = function() { this._transform = this._invTransform = null; var xAxisScale = this.getAxis("x").scale; var yAxisScale = this.getAxis("y").scale; if (!canCalculateAffineTransform(xAxisScale) || !canCalculateAffineTransform(yAxisScale)) { return; } var xScaleExtent = xAxisScale.getExtent(); var yScaleExtent = yAxisScale.getExtent(); var start = this.dataToPoint([xScaleExtent[0], yScaleExtent[0]]); var end = this.dataToPoint([xScaleExtent[1], yScaleExtent[1]]); var xScaleSpan = xScaleExtent[1] - xScaleExtent[0]; var yScaleSpan = yScaleExtent[1] - yScaleExtent[0]; if (!xScaleSpan || !yScaleSpan) { return; } var scaleX = (end[0] - start[0]) / xScaleSpan; var scaleY = (end[1] - start[1]) / yScaleSpan; var translateX = start[0] - xScaleExtent[0] * scaleX; var translateY = start[1] - yScaleExtent[0] * scaleY; var m = this._transform = [scaleX, 0, 0, scaleY, translateX, translateY]; this._invTransform = invert([], m); }; Cartesian2D2.prototype.getBaseAxis = function() { return this.getAxesByScale("ordinal")[0] || this.getAxesByScale("time")[0] || this.getAxis("x"); }; Cartesian2D2.prototype.containPoint = function(point) { var axisX = this.getAxis("x"); var axisY = this.getAxis("y"); return axisX.contain(axisX.toLocalCoord(point[0])) && axisY.contain(axisY.toLocalCoord(point[1])); }; Cartesian2D2.prototype.containData = function(data) { return this.getAxis("x").containData(data[0]) && this.getAxis("y").containData(data[1]); }; Cartesian2D2.prototype.containZone = function(data1, data2) { var zoneDiag1 = this.dataToPoint(data1); var zoneDiag2 = this.dataToPoint(data2); var area = this.getArea(); var zone = new BoundingRect(zoneDiag1[0], zoneDiag1[1], zoneDiag2[0] - zoneDiag1[0], zoneDiag2[1] - zoneDiag1[1]); return area.intersect(zone); }; Cartesian2D2.prototype.dataToPoint = function(data, clamp2, out) { out = out || []; var xVal = data[0]; var yVal = data[1]; if (this._transform && xVal != null && isFinite(xVal) && yVal != null && isFinite(yVal)) { return applyTransform$1(out, data, this._transform); } var xAxis = this.getAxis("x"); var yAxis = this.getAxis("y"); out[0] = xAxis.toGlobalCoord(xAxis.dataToCoord(xVal, clamp2)); out[1] = yAxis.toGlobalCoord(yAxis.dataToCoord(yVal, clamp2)); return out; }; Cartesian2D2.prototype.clampData = function(data, out) { var xScale = this.getAxis("x").scale; var yScale = this.getAxis("y").scale; var xAxisExtent = xScale.getExtent(); var yAxisExtent = yScale.getExtent(); var x = xScale.parse(data[0]); var y = yScale.parse(data[1]); out = out || []; out[0] = Math.min(Math.max(Math.min(xAxisExtent[0], xAxisExtent[1]), x), Math.max(xAxisExtent[0], xAxisExtent[1])); out[1] = Math.min(Math.max(Math.min(yAxisExtent[0], yAxisExtent[1]), y), Math.max(yAxisExtent[0], yAxisExtent[1])); return out; }; Cartesian2D2.prototype.pointToData = function(point, clamp2) { var out = []; if (this._invTransform) { return applyTransform$1(out, point, this._invTransform); } var xAxis = this.getAxis("x"); var yAxis = this.getAxis("y"); out[0] = xAxis.coordToData(xAxis.toLocalCoord(point[0]), clamp2); out[1] = yAxis.coordToData(yAxis.toLocalCoord(point[1]), clamp2); return out; }; Cartesian2D2.prototype.getOtherAxis = function(axis) { return this.getAxis(axis.dim === "x" ? "y" : "x"); }; Cartesian2D2.prototype.getArea = function(tolerance) { tolerance = tolerance || 0; var xExtent = this.getAxis("x").getGlobalExtent(); var yExtent = this.getAxis("y").getGlobalExtent(); var x = Math.min(xExtent[0], xExtent[1]) - tolerance; var y = Math.min(yExtent[0], yExtent[1]) - tolerance; var width = Math.max(xExtent[0], xExtent[1]) - x + tolerance; var height = Math.max(yExtent[0], yExtent[1]) - y + tolerance; return new BoundingRect(x, y, width, height); }; return Cartesian2D2; })(Cartesian) ); var Axis2D = ( /** @class */ (function(_super) { __extends(Axis2D2, _super); function Axis2D2(dim, scale2, coordExtent, axisType, position2) { var _this = _super.call(this, dim, scale2, coordExtent) || this; _this.index = 0; _this.type = axisType || "value"; _this.position = position2 || "bottom"; return _this; } Axis2D2.prototype.isHorizontal = function() { var position2 = this.position; return position2 === "top" || position2 === "bottom"; }; Axis2D2.prototype.getGlobalExtent = function(asc2) { var ret = this.getExtent(); ret[0] = this.toGlobalCoord(ret[0]); ret[1] = this.toGlobalCoord(ret[1]); asc2 && ret[0] > ret[1] && ret.reverse(); return ret; }; Axis2D2.prototype.pointToData = function(point, clamp2) { return this.coordToData(this.toLocalCoord(point[this.dim === "x" ? 0 : 1]), clamp2); }; Axis2D2.prototype.setCategorySortInfo = function(info) { if (this.type !== "category") { return false; } this.model.option.categorySortInfo = info; this.scale.setSortInfo(info); }; return Axis2D2; })(Axis) ); function layout$2(gridModel, axisModel, opt) { opt = opt || {}; var grid = gridModel.coordinateSystem; var axis = axisModel.axis; var layout2 = {}; var otherAxisOnZeroOf = axis.getAxesOnZeroOf()[0]; var rawAxisPosition = axis.position; var axisPosition = otherAxisOnZeroOf ? "onZero" : rawAxisPosition; var axisDim = axis.dim; var rect = grid.getRect(); var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height]; var idx = { left: 0, right: 1, top: 0, bottom: 1, onZero: 2 }; var axisOffset = axisModel.get("offset") || 0; var posBound = axisDim === "x" ? [rectBound[2] - axisOffset, rectBound[3] + axisOffset] : [rectBound[0] - axisOffset, rectBound[1] + axisOffset]; if (otherAxisOnZeroOf) { var onZeroCoord = otherAxisOnZeroOf.toGlobalCoord(otherAxisOnZeroOf.dataToCoord(0)); posBound[idx.onZero] = Math.max(Math.min(onZeroCoord, posBound[1]), posBound[0]); } layout2.position = [axisDim === "y" ? posBound[idx[axisPosition]] : rectBound[0], axisDim === "x" ? posBound[idx[axisPosition]] : rectBound[3]]; layout2.rotation = Math.PI / 2 * (axisDim === "x" ? 0 : 1); var dirMap = { top: -1, bottom: 1, left: -1, right: 1 }; layout2.labelDirection = layout2.tickDirection = layout2.nameDirection = dirMap[rawAxisPosition]; layout2.labelOffset = otherAxisOnZeroOf ? posBound[idx[rawAxisPosition]] - posBound[idx.onZero] : 0; if (axisModel.get(["axisTick", "inside"])) { layout2.tickDirection = -layout2.tickDirection; } if (retrieve(opt.labelInside, axisModel.get(["axisLabel", "inside"]))) { layout2.labelDirection = -layout2.labelDirection; } var labelRotate = axisModel.get(["axisLabel", "rotate"]); layout2.labelRotate = axisPosition === "top" ? -labelRotate : labelRotate; layout2.z2 = 1; return layout2; } function isCartesian2DSeries(seriesModel) { return seriesModel.get("coordinateSystem") === "cartesian2d"; } function findAxisModels(seriesModel) { var axisModelMap = { xAxisModel: null, yAxisModel: null }; each$f(axisModelMap, function(v, key) { var axisType = key.replace(/Model$/, ""); var axisModel = seriesModel.getReferringComponents(axisType, SINGLE_REFERRING).models[0]; axisModelMap[key] = axisModel; }); return axisModelMap; } var mathLog = Math.log; function alignScaleTicks(scale2, axisModel, alignToScale) { var intervalScaleProto2 = IntervalScale.prototype; var alignToTicks = intervalScaleProto2.getTicks.call(alignToScale); var alignToNicedTicks = intervalScaleProto2.getTicks.call(alignToScale, true); var alignToSplitNumber = alignToTicks.length - 1; var alignToInterval = intervalScaleProto2.getInterval.call(alignToScale); var scaleExtent = getScaleExtent(scale2, axisModel); var rawExtent = scaleExtent.extent; var isMinFixed = scaleExtent.fixMin; var isMaxFixed = scaleExtent.fixMax; if (scale2.type === "log") { var logBase = mathLog(scale2.base); rawExtent = [mathLog(rawExtent[0]) / logBase, mathLog(rawExtent[1]) / logBase]; } scale2.setExtent(rawExtent[0], rawExtent[1]); scale2.calcNiceExtent({ splitNumber: alignToSplitNumber, fixMin: isMinFixed, fixMax: isMaxFixed }); var extent = intervalScaleProto2.getExtent.call(scale2); if (isMinFixed) { rawExtent[0] = extent[0]; } if (isMaxFixed) { rawExtent[1] = extent[1]; } var interval = intervalScaleProto2.getInterval.call(scale2); var min2 = rawExtent[0]; var max2 = rawExtent[1]; if (isMinFixed && isMaxFixed) { interval = (max2 - min2) / alignToSplitNumber; } else if (isMinFixed) { max2 = rawExtent[0] + interval * alignToSplitNumber; while (max2 < rawExtent[1] && isFinite(max2) && isFinite(rawExtent[1])) { interval = increaseInterval(interval); max2 = rawExtent[0] + interval * alignToSplitNumber; } } else if (isMaxFixed) { min2 = rawExtent[1] - interval * alignToSplitNumber; while (min2 > rawExtent[0] && isFinite(min2) && isFinite(rawExtent[0])) { interval = increaseInterval(interval); min2 = rawExtent[1] - interval * alignToSplitNumber; } } else { var nicedSplitNumber = scale2.getTicks().length - 1; if (nicedSplitNumber > alignToSplitNumber) { interval = increaseInterval(interval); } var range = interval * alignToSplitNumber; max2 = Math.ceil(rawExtent[1] / interval) * interval; min2 = round$1(max2 - range); if (min2 < 0 && rawExtent[0] >= 0) { min2 = 0; max2 = round$1(range); } else if (max2 > 0 && rawExtent[1] <= 0) { max2 = 0; min2 = -round$1(range); } } var t0 = (alignToTicks[0].value - alignToNicedTicks[0].value) / alignToInterval; var t1 = (alignToTicks[alignToSplitNumber].value - alignToNicedTicks[alignToSplitNumber].value) / alignToInterval; intervalScaleProto2.setExtent.call(scale2, min2 + interval * t0, max2 + interval * t1); intervalScaleProto2.setInterval.call(scale2, interval); if (t0 || t1) { intervalScaleProto2.setNiceExtent.call(scale2, min2 + interval, max2 - interval); } } var Grid = ( /** @class */ (function() { function Grid2(gridModel, ecModel, api) { this.type = "grid"; this._coordsMap = {}; this._coordsList = []; this._axesMap = {}; this._axesList = []; this.axisPointerEnabled = true; this.dimensions = cartesian2DDimensions; this._initCartesian(gridModel, ecModel, api); this.model = gridModel; } Grid2.prototype.getRect = function() { return this._rect; }; Grid2.prototype.update = function(ecModel, api) { var axesMap = this._axesMap; this._updateScale(ecModel, this.model); function updateAxisTicks(axes) { var alignTo; var axesIndices = keys(axes); var len2 = axesIndices.length; if (!len2) { return; } var axisNeedsAlign = []; for (var i = len2 - 1; i >= 0; i--) { var idx = +axesIndices[i]; var axis = axes[idx]; var model = axis.model; var scale2 = axis.scale; if ( // Only value and log axis without interval support alignTicks. isIntervalOrLogScale(scale2) && model.get("alignTicks") && model.get("interval") == null ) { axisNeedsAlign.push(axis); } else { niceScaleExtent(scale2, model); if (isIntervalOrLogScale(scale2)) { alignTo = axis; } } } if (axisNeedsAlign.length) { if (!alignTo) { alignTo = axisNeedsAlign.pop(); niceScaleExtent(alignTo.scale, alignTo.model); } each$f(axisNeedsAlign, function(axis2) { alignScaleTicks(axis2.scale, axis2.model, alignTo.scale); }); } } updateAxisTicks(axesMap.x); updateAxisTicks(axesMap.y); var onZeroRecords = {}; each$f(axesMap.x, function(xAxis) { fixAxisOnZero(axesMap, "y", xAxis, onZeroRecords); }); each$f(axesMap.y, function(yAxis) { fixAxisOnZero(axesMap, "x", yAxis, onZeroRecords); }); this.resize(this.model, api); }; Grid2.prototype.resize = function(gridModel, api, ignoreContainLabel) { var boxLayoutParams = gridModel.getBoxLayoutParams(); var isContainLabel = !ignoreContainLabel && gridModel.get("containLabel"); var gridRect = getLayoutRect(boxLayoutParams, { width: api.getWidth(), height: api.getHeight() }); this._rect = gridRect; var axesList = this._axesList; adjustAxes(); if (isContainLabel) { each$f(axesList, function(axis) { if (!axis.model.get(["axisLabel", "inside"])) { var labelUnionRect = estimateLabelUnionRect(axis); if (labelUnionRect) { var dim = axis.isHorizontal() ? "height" : "width"; var margin = axis.model.get(["axisLabel", "margin"]); gridRect[dim] -= labelUnionRect[dim] + margin; if (axis.position === "top") { gridRect.y += labelUnionRect.height + margin; } else if (axis.position === "left") { gridRect.x += labelUnionRect.width + margin; } } } }); adjustAxes(); } each$f(this._coordsList, function(coord) { coord.calcAffineTransform(); }); function adjustAxes() { each$f(axesList, function(axis) { var isHorizontal = axis.isHorizontal(); var extent = isHorizontal ? [0, gridRect.width] : [0, gridRect.height]; var idx = axis.inverse ? 1 : 0; axis.setExtent(extent[idx], extent[1 - idx]); updateAxisTransform(axis, isHorizontal ? gridRect.x : gridRect.y); }); } }; Grid2.prototype.getAxis = function(dim, axisIndex) { var axesMapOnDim = this._axesMap[dim]; if (axesMapOnDim != null) { return axesMapOnDim[axisIndex || 0]; } }; Grid2.prototype.getAxes = function() { return this._axesList.slice(); }; Grid2.prototype.getCartesian = function(xAxisIndex, yAxisIndex) { if (xAxisIndex != null && yAxisIndex != null) { var key = "x" + xAxisIndex + "y" + yAxisIndex; return this._coordsMap[key]; } if (isObject$3(xAxisIndex)) { yAxisIndex = xAxisIndex.yAxisIndex; xAxisIndex = xAxisIndex.xAxisIndex; } for (var i = 0, coordList = this._coordsList; i < coordList.length; i++) { if (coordList[i].getAxis("x").index === xAxisIndex || coordList[i].getAxis("y").index === yAxisIndex) { return coordList[i]; } } }; Grid2.prototype.getCartesians = function() { return this._coordsList.slice(); }; Grid2.prototype.convertToPixel = function(ecModel, finder, value) { var target = this._findConvertTarget(finder); return target.cartesian ? target.cartesian.dataToPoint(value) : target.axis ? target.axis.toGlobalCoord(target.axis.dataToCoord(value)) : null; }; Grid2.prototype.convertFromPixel = function(ecModel, finder, value) { var target = this._findConvertTarget(finder); return target.cartesian ? target.cartesian.pointToData(value) : target.axis ? target.axis.coordToData(target.axis.toLocalCoord(value)) : null; }; Grid2.prototype._findConvertTarget = function(finder) { var seriesModel = finder.seriesModel; var xAxisModel = finder.xAxisModel || seriesModel && seriesModel.getReferringComponents("xAxis", SINGLE_REFERRING).models[0]; var yAxisModel = finder.yAxisModel || seriesModel && seriesModel.getReferringComponents("yAxis", SINGLE_REFERRING).models[0]; var gridModel = finder.gridModel; var coordsList = this._coordsList; var cartesian; var axis; if (seriesModel) { cartesian = seriesModel.coordinateSystem; indexOf(coordsList, cartesian) < 0 && (cartesian = null); } else if (xAxisModel && yAxisModel) { cartesian = this.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex); } else if (xAxisModel) { axis = this.getAxis("x", xAxisModel.componentIndex); } else if (yAxisModel) { axis = this.getAxis("y", yAxisModel.componentIndex); } else if (gridModel) { var grid = gridModel.coordinateSystem; if (grid === this) { cartesian = this._coordsList[0]; } } return { cartesian, axis }; }; Grid2.prototype.containPoint = function(point) { var coord = this._coordsList[0]; if (coord) { return coord.containPoint(point); } }; Grid2.prototype._initCartesian = function(gridModel, ecModel, api) { var _this = this; var grid = this; var axisPositionUsed = { left: false, right: false, top: false, bottom: false }; var axesMap = { x: {}, y: {} }; var axesCount = { x: 0, y: 0 }; ecModel.eachComponent("xAxis", createAxisCreator("x"), this); ecModel.eachComponent("yAxis", createAxisCreator("y"), this); if (!axesCount.x || !axesCount.y) { this._axesMap = {}; this._axesList = []; return; } this._axesMap = axesMap; each$f(axesMap.x, function(xAxis, xAxisIndex) { each$f(axesMap.y, function(yAxis, yAxisIndex) { var key = "x" + xAxisIndex + "y" + yAxisIndex; var cartesian = new Cartesian2D(key); cartesian.master = _this; cartesian.model = gridModel; _this._coordsMap[key] = cartesian; _this._coordsList.push(cartesian); cartesian.addAxis(xAxis); cartesian.addAxis(yAxis); }); }); function createAxisCreator(dimName) { return function(axisModel, idx) { if (!isAxisUsedInTheGrid(axisModel, gridModel)) { return; } var axisPosition = axisModel.get("position"); if (dimName === "x") { if (axisPosition !== "top" && axisPosition !== "bottom") { axisPosition = axisPositionUsed.bottom ? "top" : "bottom"; } } else { if (axisPosition !== "left" && axisPosition !== "right") { axisPosition = axisPositionUsed.left ? "right" : "left"; } } axisPositionUsed[axisPosition] = true; var axis = new Axis2D(dimName, createScaleByModel$1(axisModel), [0, 0], axisModel.get("type"), axisPosition); var isCategory2 = axis.type === "category"; axis.onBand = isCategory2 && axisModel.get("boundaryGap"); axis.inverse = axisModel.get("inverse"); axisModel.axis = axis; axis.model = axisModel; axis.grid = grid; axis.index = idx; grid._axesList.push(axis); axesMap[dimName][idx] = axis; axesCount[dimName]++; }; } }; Grid2.prototype._updateScale = function(ecModel, gridModel) { each$f(this._axesList, function(axis) { axis.scale.setExtent(Infinity, -Infinity); if (axis.type === "category") { var categorySortInfo = axis.model.get("categorySortInfo"); axis.scale.setSortInfo(categorySortInfo); } }); ecModel.eachSeries(function(seriesModel) { if (isCartesian2DSeries(seriesModel)) { var axesModelMap = findAxisModels(seriesModel); var xAxisModel = axesModelMap.xAxisModel; var yAxisModel = axesModelMap.yAxisModel; if (!isAxisUsedInTheGrid(xAxisModel, gridModel) || !isAxisUsedInTheGrid(yAxisModel, gridModel)) { return; } var cartesian = this.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex); var data = seriesModel.getData(); var xAxis = cartesian.getAxis("x"); var yAxis = cartesian.getAxis("y"); unionExtent(data, xAxis); unionExtent(data, yAxis); } }, this); function unionExtent(data, axis) { each$f(getDataDimensionsOnAxis(data, axis.dim), function(dim) { axis.scale.unionExtentFromData(data, dim); }); } }; Grid2.prototype.getTooltipAxes = function(dim) { var baseAxes = []; var otherAxes = []; each$f(this.getCartesians(), function(cartesian) { var baseAxis = dim != null && dim !== "auto" ? cartesian.getAxis(dim) : cartesian.getBaseAxis(); var otherAxis = cartesian.getOtherAxis(baseAxis); indexOf(baseAxes, baseAxis) < 0 && baseAxes.push(baseAxis); indexOf(otherAxes, otherAxis) < 0 && otherAxes.push(otherAxis); }); return { baseAxes, otherAxes }; }; Grid2.create = function(ecModel, api) { var grids = []; ecModel.eachComponent("grid", function(gridModel, idx) { var grid = new Grid2(gridModel, ecModel, api); grid.name = "grid_" + idx; grid.resize(gridModel, api, true); gridModel.coordinateSystem = grid; grids.push(grid); }); ecModel.eachSeries(function(seriesModel) { if (!isCartesian2DSeries(seriesModel)) { return; } var axesModelMap = findAxisModels(seriesModel); var xAxisModel = axesModelMap.xAxisModel; var yAxisModel = axesModelMap.yAxisModel; var gridModel = xAxisModel.getCoordSysModel(); var grid = gridModel.coordinateSystem; seriesModel.coordinateSystem = grid.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex); }); return grids; }; Grid2.dimensions = cartesian2DDimensions; return Grid2; })() ); function isAxisUsedInTheGrid(axisModel, gridModel) { return axisModel.getCoordSysModel() === gridModel; } function fixAxisOnZero(axesMap, otherAxisDim, axis, onZeroRecords) { axis.getAxesOnZeroOf = function() { return otherAxisOnZeroOf ? [otherAxisOnZeroOf] : []; }; var otherAxes = axesMap[otherAxisDim]; var otherAxisOnZeroOf; var axisModel = axis.model; var onZero = axisModel.get(["axisLine", "onZero"]); var onZeroAxisIndex = axisModel.get(["axisLine", "onZeroAxisIndex"]); if (!onZero) { return; } if (onZeroAxisIndex != null) { if (canOnZeroToAxis(otherAxes[onZeroAxisIndex])) { otherAxisOnZeroOf = otherAxes[onZeroAxisIndex]; } } else { for (var idx in otherAxes) { if (otherAxes.hasOwnProperty(idx) && canOnZeroToAxis(otherAxes[idx]) && !onZeroRecords[getOnZeroRecordKey(otherAxes[idx])]) { otherAxisOnZeroOf = otherAxes[idx]; break; } } } if (otherAxisOnZeroOf) { onZeroRecords[getOnZeroRecordKey(otherAxisOnZeroOf)] = true; } function getOnZeroRecordKey(axis2) { return axis2.dim + "_" + axis2.index; } } function canOnZeroToAxis(axis) { return axis && axis.type !== "category" && axis.type !== "time" && ifAxisCrossZero(axis); } function updateAxisTransform(axis, coordBase) { var axisExtent = axis.getExtent(); var axisExtentSum = axisExtent[0] + axisExtent[1]; axis.toGlobalCoord = axis.dim === "x" ? function(coord) { return coord + coordBase; } : function(coord) { return axisExtentSum - coord + coordBase; }; axis.toLocalCoord = axis.dim === "x" ? function(coord) { return coord - coordBase; } : function(coord) { return axisExtentSum - coord + coordBase; }; } var PI$3 = Math.PI; var AxisBuilder = ( /** @class */ (function() { function AxisBuilder2(axisModel, opt) { this.group = new Group$3(); this.opt = opt; this.axisModel = axisModel; defaults(opt, { labelOffset: 0, nameDirection: 1, tickDirection: 1, labelDirection: 1, silent: true, handleAutoShown: function() { return true; } }); var transformGroup = new Group$3({ x: opt.position[0], y: opt.position[1], rotation: opt.rotation }); transformGroup.updateTransform(); this._transformGroup = transformGroup; } AxisBuilder2.prototype.hasBuilder = function(name) { return !!builders[name]; }; AxisBuilder2.prototype.add = function(name) { builders[name](this.opt, this.axisModel, this.group, this._transformGroup); }; AxisBuilder2.prototype.getGroup = function() { return this.group; }; AxisBuilder2.innerTextLayout = function(axisRotation, textRotation, direction) { var rotationDiff = remRadian(textRotation - axisRotation); var textAlign; var textVerticalAlign; if (isRadianAroundZero(rotationDiff)) { textVerticalAlign = direction > 0 ? "top" : "bottom"; textAlign = "center"; } else if (isRadianAroundZero(rotationDiff - PI$3)) { textVerticalAlign = direction > 0 ? "bottom" : "top"; textAlign = "center"; } else { textVerticalAlign = "middle"; if (rotationDiff > 0 && rotationDiff < PI$3) { textAlign = direction > 0 ? "right" : "left"; } else { textAlign = direction > 0 ? "left" : "right"; } } return { rotation: rotationDiff, textAlign, textVerticalAlign }; }; AxisBuilder2.makeAxisEventDataBase = function(axisModel) { var eventData = { componentType: axisModel.mainType, componentIndex: axisModel.componentIndex }; eventData[axisModel.mainType + "Index"] = axisModel.componentIndex; return eventData; }; AxisBuilder2.isLabelSilent = function(axisModel) { var tooltipOpt = axisModel.get("tooltip"); return axisModel.get("silent") || !(axisModel.get("triggerEvent") || tooltipOpt && tooltipOpt.show); }; return AxisBuilder2; })() ); var builders = { axisLine: function(opt, axisModel, group, transformGroup) { var shown = axisModel.get(["axisLine", "show"]); if (shown === "auto" && opt.handleAutoShown) { shown = opt.handleAutoShown("axisLine"); } if (!shown) { return; } var extent = axisModel.axis.getExtent(); var matrix = transformGroup.transform; var pt12 = [extent[0], 0]; var pt22 = [extent[1], 0]; var inverse = pt12[0] > pt22[0]; if (matrix) { applyTransform$1(pt12, pt12, matrix); applyTransform$1(pt22, pt22, matrix); } var lineStyle = extend({ lineCap: "round" }, axisModel.getModel(["axisLine", "lineStyle"]).getLineStyle()); var line = new Line$1({ shape: { x1: pt12[0], y1: pt12[1], x2: pt22[0], y2: pt22[1] }, style: lineStyle, strokeContainThreshold: opt.strokeContainThreshold || 5, silent: true, z2: 1 }); subPixelOptimizeLine(line.shape, line.style.lineWidth); line.anid = "line"; group.add(line); var arrows = axisModel.get(["axisLine", "symbol"]); if (arrows != null) { var arrowSize = axisModel.get(["axisLine", "symbolSize"]); if (isString(arrows)) { arrows = [arrows, arrows]; } if (isString(arrowSize) || isNumber(arrowSize)) { arrowSize = [arrowSize, arrowSize]; } var arrowOffset = normalizeSymbolOffset(axisModel.get(["axisLine", "symbolOffset"]) || 0, arrowSize); var symbolWidth_1 = arrowSize[0]; var symbolHeight_1 = arrowSize[1]; each$f([{ rotate: opt.rotation + Math.PI / 2, offset: arrowOffset[0], r: 0 }, { rotate: opt.rotation - Math.PI / 2, offset: arrowOffset[1], r: Math.sqrt((pt12[0] - pt22[0]) * (pt12[0] - pt22[0]) + (pt12[1] - pt22[1]) * (pt12[1] - pt22[1])) }], function(point, index) { if (arrows[index] !== "none" && arrows[index] != null) { var symbol = createSymbol$1(arrows[index], -symbolWidth_1 / 2, -symbolHeight_1 / 2, symbolWidth_1, symbolHeight_1, lineStyle.stroke, true); var r = point.r + point.offset; var pt = inverse ? pt22 : pt12; symbol.attr({ rotation: point.rotate, x: pt[0] + r * Math.cos(opt.rotation), y: pt[1] - r * Math.sin(opt.rotation), silent: true, z2: 11 }); group.add(symbol); } }); } }, axisTickLabel: function(opt, axisModel, group, transformGroup) { var ticksEls = buildAxisMajorTicks(group, transformGroup, axisModel, opt); var labelEls = buildAxisLabel(group, transformGroup, axisModel, opt); fixMinMaxLabelShow(axisModel, labelEls, ticksEls); buildAxisMinorTicks(group, transformGroup, axisModel, opt.tickDirection); if (axisModel.get(["axisLabel", "hideOverlap"])) { var labelList = prepareLayoutList(map$1(labelEls, function(label) { return { label, priority: label.z2, defaultAttr: { ignore: label.ignore } }; })); hideOverlap(labelList); } }, axisName: function(opt, axisModel, group, transformGroup) { var name = retrieve(opt.axisName, axisModel.get("name")); if (!name) { return; } var nameLocation = axisModel.get("nameLocation"); var nameDirection = opt.nameDirection; var textStyleModel = axisModel.getModel("nameTextStyle"); var gap = axisModel.get("nameGap") || 0; var extent = axisModel.axis.getExtent(); var gapSignal = extent[0] > extent[1] ? -1 : 1; var pos = [ nameLocation === "start" ? extent[0] - gapSignal * gap : nameLocation === "end" ? extent[1] + gapSignal * gap : (extent[0] + extent[1]) / 2, // Reuse labelOffset. isNameLocationCenter(nameLocation) ? opt.labelOffset + nameDirection * gap : 0 ]; var labelLayout2; var nameRotation = axisModel.get("nameRotate"); if (nameRotation != null) { nameRotation = nameRotation * PI$3 / 180; } var axisNameAvailableWidth; if (isNameLocationCenter(nameLocation)) { labelLayout2 = AxisBuilder.innerTextLayout( opt.rotation, nameRotation != null ? nameRotation : opt.rotation, // Adapt to axis. nameDirection ); } else { labelLayout2 = endTextLayout(opt.rotation, nameLocation, nameRotation || 0, extent); axisNameAvailableWidth = opt.axisNameAvailableWidth; if (axisNameAvailableWidth != null) { axisNameAvailableWidth = Math.abs(axisNameAvailableWidth / Math.sin(labelLayout2.rotation)); !isFinite(axisNameAvailableWidth) && (axisNameAvailableWidth = null); } } var textFont = textStyleModel.getFont(); var truncateOpt = axisModel.get("nameTruncate", true) || {}; var ellipsis = truncateOpt.ellipsis; var maxWidth = retrieve(opt.nameTruncateMaxWidth, truncateOpt.maxWidth, axisNameAvailableWidth); var textEl = new ZRText({ x: pos[0], y: pos[1], rotation: labelLayout2.rotation, silent: AxisBuilder.isLabelSilent(axisModel), style: createTextStyle(textStyleModel, { text: name, font: textFont, overflow: "truncate", width: maxWidth, ellipsis, fill: textStyleModel.getTextColor() || axisModel.get(["axisLine", "lineStyle", "color"]), align: textStyleModel.get("align") || labelLayout2.textAlign, verticalAlign: textStyleModel.get("verticalAlign") || labelLayout2.textVerticalAlign }), z2: 1 }); setTooltipConfig({ el: textEl, componentModel: axisModel, itemName: name }); textEl.__fullText = name; textEl.anid = "name"; if (axisModel.get("triggerEvent")) { var eventData = AxisBuilder.makeAxisEventDataBase(axisModel); eventData.targetType = "axisName"; eventData.name = name; getECData(textEl).eventData = eventData; } transformGroup.add(textEl); textEl.updateTransform(); group.add(textEl); textEl.decomposeTransform(); } }; function endTextLayout(rotation, textPosition, textRotate, extent) { var rotationDiff = remRadian(textRotate - rotation); var textAlign; var textVerticalAlign; var inverse = extent[0] > extent[1]; var onLeft = textPosition === "start" && !inverse || textPosition !== "start" && inverse; if (isRadianAroundZero(rotationDiff - PI$3 / 2)) { textVerticalAlign = onLeft ? "bottom" : "top"; textAlign = "center"; } else if (isRadianAroundZero(rotationDiff - PI$3 * 1.5)) { textVerticalAlign = onLeft ? "top" : "bottom"; textAlign = "center"; } else { textVerticalAlign = "middle"; if (rotationDiff < PI$3 * 1.5 && rotationDiff > PI$3 / 2) { textAlign = onLeft ? "left" : "right"; } else { textAlign = onLeft ? "right" : "left"; } } return { rotation: rotationDiff, textAlign, textVerticalAlign }; } function fixMinMaxLabelShow(axisModel, labelEls, tickEls) { if (shouldShowAllLabels(axisModel.axis)) { return; } var showMinLabel = axisModel.get(["axisLabel", "showMinLabel"]); var showMaxLabel = axisModel.get(["axisLabel", "showMaxLabel"]); labelEls = labelEls || []; tickEls = tickEls || []; var firstLabel = labelEls[0]; var nextLabel = labelEls[1]; var lastLabel = labelEls[labelEls.length - 1]; var prevLabel = labelEls[labelEls.length - 2]; var firstTick = tickEls[0]; var nextTick = tickEls[1]; var lastTick = tickEls[tickEls.length - 1]; var prevTick = tickEls[tickEls.length - 2]; if (showMinLabel === false) { ignoreEl(firstLabel); ignoreEl(firstTick); } else if (isTwoLabelOverlapped(firstLabel, nextLabel)) { if (showMinLabel) { ignoreEl(nextLabel); ignoreEl(nextTick); } else { ignoreEl(firstLabel); ignoreEl(firstTick); } } if (showMaxLabel === false) { ignoreEl(lastLabel); ignoreEl(lastTick); } else if (isTwoLabelOverlapped(prevLabel, lastLabel)) { if (showMaxLabel) { ignoreEl(prevLabel); ignoreEl(prevTick); } else { ignoreEl(lastLabel); ignoreEl(lastTick); } } } function ignoreEl(el) { el && (el.ignore = true); } function isTwoLabelOverlapped(current, next) { var firstRect = current && current.getBoundingRect().clone(); var nextRect = next && next.getBoundingRect().clone(); if (!firstRect || !nextRect) { return; } var mRotationBack = identity([]); rotate(mRotationBack, mRotationBack, -current.rotation); firstRect.applyTransform(mul([], mRotationBack, current.getLocalTransform())); nextRect.applyTransform(mul([], mRotationBack, next.getLocalTransform())); return firstRect.intersect(nextRect); } function isNameLocationCenter(nameLocation) { return nameLocation === "middle" || nameLocation === "center"; } function createTicks(ticksCoords, tickTransform, tickEndCoord, tickLineStyle, anidPrefix) { var tickEls = []; var pt12 = []; var pt22 = []; for (var i = 0; i < ticksCoords.length; i++) { var tickCoord = ticksCoords[i].coord; pt12[0] = tickCoord; pt12[1] = 0; pt22[0] = tickCoord; pt22[1] = tickEndCoord; if (tickTransform) { applyTransform$1(pt12, pt12, tickTransform); applyTransform$1(pt22, pt22, tickTransform); } var tickEl = new Line$1({ shape: { x1: pt12[0], y1: pt12[1], x2: pt22[0], y2: pt22[1] }, style: tickLineStyle, z2: 2, autoBatch: true, silent: true }); subPixelOptimizeLine(tickEl.shape, tickEl.style.lineWidth); tickEl.anid = anidPrefix + "_" + ticksCoords[i].tickValue; tickEls.push(tickEl); } return tickEls; } function buildAxisMajorTicks(group, transformGroup, axisModel, opt) { var axis = axisModel.axis; var tickModel = axisModel.getModel("axisTick"); var shown = tickModel.get("show"); if (shown === "auto" && opt.handleAutoShown) { shown = opt.handleAutoShown("axisTick"); } if (!shown || axis.scale.isBlank()) { return; } var lineStyleModel = tickModel.getModel("lineStyle"); var tickEndCoord = opt.tickDirection * tickModel.get("length"); var ticksCoords = axis.getTicksCoords(); var ticksEls = createTicks(ticksCoords, transformGroup.transform, tickEndCoord, defaults(lineStyleModel.getLineStyle(), { stroke: axisModel.get(["axisLine", "lineStyle", "color"]) }), "ticks"); for (var i = 0; i < ticksEls.length; i++) { group.add(ticksEls[i]); } return ticksEls; } function buildAxisMinorTicks(group, transformGroup, axisModel, tickDirection) { var axis = axisModel.axis; var minorTickModel = axisModel.getModel("minorTick"); if (!minorTickModel.get("show") || axis.scale.isBlank()) { return; } var minorTicksCoords = axis.getMinorTicksCoords(); if (!minorTicksCoords.length) { return; } var lineStyleModel = minorTickModel.getModel("lineStyle"); var tickEndCoord = tickDirection * minorTickModel.get("length"); var minorTickLineStyle = defaults(lineStyleModel.getLineStyle(), defaults(axisModel.getModel("axisTick").getLineStyle(), { stroke: axisModel.get(["axisLine", "lineStyle", "color"]) })); for (var i = 0; i < minorTicksCoords.length; i++) { var minorTicksEls = createTicks(minorTicksCoords[i], transformGroup.transform, tickEndCoord, minorTickLineStyle, "minorticks_" + i); for (var k = 0; k < minorTicksEls.length; k++) { group.add(minorTicksEls[k]); } } } function buildAxisLabel(group, transformGroup, axisModel, opt) { var axis = axisModel.axis; var show = retrieve(opt.axisLabelShow, axisModel.get(["axisLabel", "show"])); if (!show || axis.scale.isBlank()) { return; } var labelModel = axisModel.getModel("axisLabel"); var labelMargin = labelModel.get("margin"); var labels = axis.getViewLabels(); var labelRotation = (retrieve(opt.labelRotate, labelModel.get("rotate")) || 0) * PI$3 / 180; var labelLayout2 = AxisBuilder.innerTextLayout(opt.rotation, labelRotation, opt.labelDirection); var rawCategoryData = axisModel.getCategories && axisModel.getCategories(true); var labelEls = []; var silent = AxisBuilder.isLabelSilent(axisModel); var triggerEvent = axisModel.get("triggerEvent"); each$f(labels, function(labelItem, index) { var tickValue = axis.scale.type === "ordinal" ? axis.scale.getRawOrdinalNumber(labelItem.tickValue) : labelItem.tickValue; var formattedLabel = labelItem.formattedLabel; var rawLabel = labelItem.rawLabel; var itemLabelModel = labelModel; if (rawCategoryData && rawCategoryData[tickValue]) { var rawCategoryItem = rawCategoryData[tickValue]; if (isObject$3(rawCategoryItem) && rawCategoryItem.textStyle) { itemLabelModel = new Model(rawCategoryItem.textStyle, labelModel, axisModel.ecModel); } } var textColor = itemLabelModel.getTextColor() || axisModel.get(["axisLine", "lineStyle", "color"]); var tickCoord = axis.dataToCoord(tickValue); var align = itemLabelModel.getShallow("align", true) || labelLayout2.textAlign; var alignMin = retrieve2(itemLabelModel.getShallow("alignMinLabel", true), align); var alignMax = retrieve2(itemLabelModel.getShallow("alignMaxLabel", true), align); var verticalAlign = itemLabelModel.getShallow("verticalAlign", true) || itemLabelModel.getShallow("baseline", true) || labelLayout2.textVerticalAlign; var verticalAlignMin = retrieve2(itemLabelModel.getShallow("verticalAlignMinLabel", true), verticalAlign); var verticalAlignMax = retrieve2(itemLabelModel.getShallow("verticalAlignMaxLabel", true), verticalAlign); var textEl = new ZRText({ x: tickCoord, y: opt.labelOffset + opt.labelDirection * labelMargin, rotation: labelLayout2.rotation, silent, z2: 10 + (labelItem.level || 0), style: createTextStyle(itemLabelModel, { text: formattedLabel, align: index === 0 ? alignMin : index === labels.length - 1 ? alignMax : align, verticalAlign: index === 0 ? verticalAlignMin : index === labels.length - 1 ? verticalAlignMax : verticalAlign, fill: isFunction(textColor) ? textColor( // (1) In category axis with data zoom, tick is not the original // index of axis.data. So tick should not be exposed to user // in category axis. // (2) Compatible with previous version, which always use formatted label as // input. But in interval scale the formatted label is like '223,445', which // maked user replace ','. So we modify it to return original val but remain // it as 'string' to avoid error in replacing. axis.type === "category" ? rawLabel : axis.type === "value" ? tickValue + "" : tickValue, index ) : textColor }) }); textEl.anid = "label_" + tickValue; setTooltipConfig({ el: textEl, componentModel: axisModel, itemName: formattedLabel, formatterParamsExtra: { isTruncated: function() { return textEl.isTruncated; }, value: rawLabel, tickIndex: index } }); if (triggerEvent) { var eventData = AxisBuilder.makeAxisEventDataBase(axisModel); eventData.targetType = "axisLabel"; eventData.value = rawLabel; eventData.tickIndex = index; if (axis.type === "category") { eventData.dataIndex = tickValue; } getECData(textEl).eventData = eventData; } transformGroup.add(textEl); textEl.updateTransform(); labelEls.push(textEl); group.add(textEl); textEl.decomposeTransform(); }); return labelEls; } function collect(ecModel, api) { var result = { /** * key: makeKey(axis.model) * value: { * axis, * coordSys, * axisPointerModel, * triggerTooltip, * triggerEmphasis, * involveSeries, * snap, * seriesModels, * seriesDataCount * } */ axesInfo: {}, seriesInvolved: false, /** * key: makeKey(coordSys.model) * value: Object: key makeKey(axis.model), value: axisInfo */ coordSysAxesInfo: {}, coordSysMap: {} }; collectAxesInfo(result, ecModel, api); result.seriesInvolved && collectSeriesInfo(result, ecModel); return result; } function collectAxesInfo(result, ecModel, api) { var globalTooltipModel = ecModel.getComponent("tooltip"); var globalAxisPointerModel = ecModel.getComponent("axisPointer"); var linksOption = globalAxisPointerModel.get("link", true) || []; var linkGroups = []; each$f(api.getCoordinateSystems(), function(coordSys) { if (!coordSys.axisPointerEnabled) { return; } var coordSysKey = makeKey(coordSys.model); var axesInfoInCoordSys = result.coordSysAxesInfo[coordSysKey] = {}; result.coordSysMap[coordSysKey] = coordSys; var coordSysModel = coordSys.model; var baseTooltipModel = coordSysModel.getModel("tooltip", globalTooltipModel); each$f(coordSys.getAxes(), curry$1(saveTooltipAxisInfo, false, null)); if (coordSys.getTooltipAxes && globalTooltipModel && baseTooltipModel.get("show")) { var triggerAxis = baseTooltipModel.get("trigger") === "axis"; var cross = baseTooltipModel.get(["axisPointer", "type"]) === "cross"; var tooltipAxes = coordSys.getTooltipAxes(baseTooltipModel.get(["axisPointer", "axis"])); if (triggerAxis || cross) { each$f(tooltipAxes.baseAxes, curry$1(saveTooltipAxisInfo, cross ? "cross" : true, triggerAxis)); } if (cross) { each$f(tooltipAxes.otherAxes, curry$1(saveTooltipAxisInfo, "cross", false)); } } function saveTooltipAxisInfo(fromTooltip, triggerTooltip, axis) { var axisPointerModel = axis.model.getModel("axisPointer", globalAxisPointerModel); var axisPointerShow = axisPointerModel.get("show"); if (!axisPointerShow || axisPointerShow === "auto" && !fromTooltip && !isHandleTrigger(axisPointerModel)) { return; } if (triggerTooltip == null) { triggerTooltip = axisPointerModel.get("triggerTooltip"); } axisPointerModel = fromTooltip ? makeAxisPointerModel(axis, baseTooltipModel, globalAxisPointerModel, ecModel, fromTooltip, triggerTooltip) : axisPointerModel; var snap = axisPointerModel.get("snap"); var triggerEmphasis = axisPointerModel.get("triggerEmphasis"); var axisKey = makeKey(axis.model); var involveSeries = triggerTooltip || snap || axis.type === "category"; var axisInfo = result.axesInfo[axisKey] = { key: axisKey, axis, coordSys, axisPointerModel, triggerTooltip, triggerEmphasis, involveSeries, snap, useHandle: isHandleTrigger(axisPointerModel), seriesModels: [], linkGroup: null }; axesInfoInCoordSys[axisKey] = axisInfo; result.seriesInvolved = result.seriesInvolved || involveSeries; var groupIndex = getLinkGroupIndex(linksOption, axis); if (groupIndex != null) { var linkGroup = linkGroups[groupIndex] || (linkGroups[groupIndex] = { axesInfo: {} }); linkGroup.axesInfo[axisKey] = axisInfo; linkGroup.mapper = linksOption[groupIndex].mapper; axisInfo.linkGroup = linkGroup; } } }); } function makeAxisPointerModel(axis, baseTooltipModel, globalAxisPointerModel, ecModel, fromTooltip, triggerTooltip) { var tooltipAxisPointerModel = baseTooltipModel.getModel("axisPointer"); var fields = ["type", "snap", "lineStyle", "shadowStyle", "label", "animation", "animationDurationUpdate", "animationEasingUpdate", "z"]; var volatileOption = {}; each$f(fields, function(field) { volatileOption[field] = clone$1(tooltipAxisPointerModel.get(field)); }); volatileOption.snap = axis.type !== "category" && !!triggerTooltip; if (tooltipAxisPointerModel.get("type") === "cross") { volatileOption.type = "line"; } var labelOption = volatileOption.label || (volatileOption.label = {}); labelOption.show == null && (labelOption.show = false); if (fromTooltip === "cross") { var tooltipAxisPointerLabelShow = tooltipAxisPointerModel.get(["label", "show"]); labelOption.show = tooltipAxisPointerLabelShow != null ? tooltipAxisPointerLabelShow : true; if (!triggerTooltip) { var crossStyle = volatileOption.lineStyle = tooltipAxisPointerModel.get("crossStyle"); crossStyle && defaults(labelOption, crossStyle.textStyle); } } return axis.model.getModel("axisPointer", new Model(volatileOption, globalAxisPointerModel, ecModel)); } function collectSeriesInfo(result, ecModel) { ecModel.eachSeries(function(seriesModel) { var coordSys = seriesModel.coordinateSystem; var seriesTooltipTrigger = seriesModel.get(["tooltip", "trigger"], true); var seriesTooltipShow = seriesModel.get(["tooltip", "show"], true); if (!coordSys || seriesTooltipTrigger === "none" || seriesTooltipTrigger === false || seriesTooltipTrigger === "item" || seriesTooltipShow === false || seriesModel.get(["axisPointer", "show"], true) === false) { return; } each$f(result.coordSysAxesInfo[makeKey(coordSys.model)], function(axisInfo) { var axis = axisInfo.axis; if (coordSys.getAxis(axis.dim) === axis) { axisInfo.seriesModels.push(seriesModel); axisInfo.seriesDataCount == null && (axisInfo.seriesDataCount = 0); axisInfo.seriesDataCount += seriesModel.getData().count(); } }); }); } function getLinkGroupIndex(linksOption, axis) { var axisModel = axis.model; var dim = axis.dim; for (var i = 0; i < linksOption.length; i++) { var linkOption = linksOption[i] || {}; if (checkPropInLink(linkOption[dim + "AxisId"], axisModel.id) || checkPropInLink(linkOption[dim + "AxisIndex"], axisModel.componentIndex) || checkPropInLink(linkOption[dim + "AxisName"], axisModel.name)) { return i; } } } function checkPropInLink(linkPropValue, axisPropValue) { return linkPropValue === "all" || isArray$1(linkPropValue) && indexOf(linkPropValue, axisPropValue) >= 0 || linkPropValue === axisPropValue; } function fixValue(axisModel) { var axisInfo = getAxisInfo$1(axisModel); if (!axisInfo) { return; } var axisPointerModel = axisInfo.axisPointerModel; var scale2 = axisInfo.axis.scale; var option = axisPointerModel.option; var status = axisPointerModel.get("status"); var value = axisPointerModel.get("value"); if (value != null) { value = scale2.parse(value); } var useHandle = isHandleTrigger(axisPointerModel); if (status == null) { option.status = useHandle ? "show" : "hide"; } var extent = scale2.getExtent().slice(); extent[0] > extent[1] && extent.reverse(); if ( // Pick a value on axis when initializing. value == null || value > extent[1] ) { value = extent[1]; } if (value < extent[0]) { value = extent[0]; } option.value = value; if (useHandle) { option.status = axisInfo.axis.scale.isBlank() ? "hide" : "show"; } } function getAxisInfo$1(axisModel) { var coordSysAxesInfo = (axisModel.ecModel.getComponent("axisPointer") || {}).coordSysAxesInfo; return coordSysAxesInfo && coordSysAxesInfo.axesInfo[makeKey(axisModel)]; } function getAxisPointerModel(axisModel) { var axisInfo = getAxisInfo$1(axisModel); return axisInfo && axisInfo.axisPointerModel; } function isHandleTrigger(axisPointerModel) { return !!axisPointerModel.get(["handle", "show"]); } function makeKey(model) { return model.type + "||" + model.id; } var axisPointerClazz = {}; var AxisView = ( /** @class */ (function(_super) { __extends(AxisView2, _super); function AxisView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = AxisView2.type; return _this; } AxisView2.prototype.render = function(axisModel, ecModel, api, payload) { this.axisPointerClass && fixValue(axisModel); _super.prototype.render.apply(this, arguments); this._doUpdateAxisPointerClass(axisModel, api, true); }; AxisView2.prototype.updateAxisPointer = function(axisModel, ecModel, api, payload) { this._doUpdateAxisPointerClass(axisModel, api, false); }; AxisView2.prototype.remove = function(ecModel, api) { var axisPointer = this._axisPointer; axisPointer && axisPointer.remove(api); }; AxisView2.prototype.dispose = function(ecModel, api) { this._disposeAxisPointer(api); _super.prototype.dispose.apply(this, arguments); }; AxisView2.prototype._doUpdateAxisPointerClass = function(axisModel, api, forceRender) { var Clazz = AxisView2.getAxisPointerClass(this.axisPointerClass); if (!Clazz) { return; } var axisPointerModel = getAxisPointerModel(axisModel); axisPointerModel ? (this._axisPointer || (this._axisPointer = new Clazz())).render(axisModel, axisPointerModel, api, forceRender) : this._disposeAxisPointer(api); }; AxisView2.prototype._disposeAxisPointer = function(api) { this._axisPointer && this._axisPointer.dispose(api); this._axisPointer = null; }; AxisView2.registerAxisPointerClass = function(type, clazz) { axisPointerClazz[type] = clazz; }; AxisView2.getAxisPointerClass = function(type) { return type && axisPointerClazz[type]; }; AxisView2.type = "axis"; return AxisView2; })(ComponentView) ); var inner$f = makeInner(); function rectCoordAxisBuildSplitArea(axisView, axisGroup, axisModel, gridModel) { var axis = axisModel.axis; if (axis.scale.isBlank()) { return; } var splitAreaModel = axisModel.getModel("splitArea"); var areaStyleModel = splitAreaModel.getModel("areaStyle"); var areaColors = areaStyleModel.get("color"); var gridRect = gridModel.coordinateSystem.getRect(); var ticksCoords = axis.getTicksCoords({ tickModel: splitAreaModel, clamp: true }); if (!ticksCoords.length) { return; } var areaColorsLen = areaColors.length; var lastSplitAreaColors = inner$f(axisView).splitAreaColors; var newSplitAreaColors = createHashMap(); var colorIndex = 0; if (lastSplitAreaColors) { for (var i = 0; i < ticksCoords.length; i++) { var cIndex = lastSplitAreaColors.get(ticksCoords[i].tickValue); if (cIndex != null) { colorIndex = (cIndex + (areaColorsLen - 1) * i) % areaColorsLen; break; } } } var prev = axis.toGlobalCoord(ticksCoords[0].coord); var areaStyle = areaStyleModel.getAreaStyle(); areaColors = isArray$1(areaColors) ? areaColors : [areaColors]; for (var i = 1; i < ticksCoords.length; i++) { var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord); var x = void 0; var y = void 0; var width = void 0; var height = void 0; if (axis.isHorizontal()) { x = prev; y = gridRect.y; width = tickCoord - x; height = gridRect.height; prev = x + width; } else { x = gridRect.x; y = prev; width = gridRect.width; height = tickCoord - y; prev = y + height; } var tickValue = ticksCoords[i - 1].tickValue; tickValue != null && newSplitAreaColors.set(tickValue, colorIndex); axisGroup.add(new Rect$2({ anid: tickValue != null ? "area_" + tickValue : null, shape: { x, y, width, height }, style: defaults({ fill: areaColors[colorIndex] }, areaStyle), autoBatch: true, silent: true })); colorIndex = (colorIndex + 1) % areaColorsLen; } inner$f(axisView).splitAreaColors = newSplitAreaColors; } function rectCoordAxisHandleRemove(axisView) { inner$f(axisView).splitAreaColors = null; } var axisBuilderAttrs$3 = ["axisLine", "axisTickLabel", "axisName"]; var selfBuilderAttrs$2 = ["splitArea", "splitLine", "minorSplitLine"]; var CartesianAxisView = ( /** @class */ (function(_super) { __extends(CartesianAxisView2, _super); function CartesianAxisView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = CartesianAxisView2.type; _this.axisPointerClass = "CartesianAxisPointer"; return _this; } CartesianAxisView2.prototype.render = function(axisModel, ecModel, api, payload) { this.group.removeAll(); var oldAxisGroup = this._axisGroup; this._axisGroup = new Group$3(); this.group.add(this._axisGroup); if (!axisModel.get("show")) { return; } var gridModel = axisModel.getCoordSysModel(); var layout2 = layout$2(gridModel, axisModel); var axisBuilder = new AxisBuilder(axisModel, extend({ handleAutoShown: function(elementType) { var cartesians = gridModel.coordinateSystem.getCartesians(); for (var i = 0; i < cartesians.length; i++) { if (isIntervalOrLogScale(cartesians[i].getOtherAxis(axisModel.axis).scale)) { return true; } } return false; } }, layout2)); each$f(axisBuilderAttrs$3, axisBuilder.add, axisBuilder); this._axisGroup.add(axisBuilder.getGroup()); each$f(selfBuilderAttrs$2, function(name) { if (axisModel.get([name, "show"])) { axisElementBuilders$2[name](this, this._axisGroup, axisModel, gridModel); } }, this); var isInitialSortFromBarRacing = payload && payload.type === "changeAxisOrder" && payload.isInitSort; if (!isInitialSortFromBarRacing) { groupTransition(oldAxisGroup, this._axisGroup, axisModel); } _super.prototype.render.call(this, axisModel, ecModel, api, payload); }; CartesianAxisView2.prototype.remove = function() { rectCoordAxisHandleRemove(this); }; CartesianAxisView2.type = "cartesianAxis"; return CartesianAxisView2; })(AxisView) ); var axisElementBuilders$2 = { splitLine: function(axisView, axisGroup, axisModel, gridModel) { var axis = axisModel.axis; if (axis.scale.isBlank()) { return; } var splitLineModel = axisModel.getModel("splitLine"); var lineStyleModel = splitLineModel.getModel("lineStyle"); var lineColors = lineStyleModel.get("color"); var showMinLine = splitLineModel.get("showMinLine") !== false; var showMaxLine = splitLineModel.get("showMaxLine") !== false; lineColors = isArray$1(lineColors) ? lineColors : [lineColors]; var gridRect = gridModel.coordinateSystem.getRect(); var isHorizontal = axis.isHorizontal(); var lineCount = 0; var ticksCoords = axis.getTicksCoords({ tickModel: splitLineModel }); var p1 = []; var p2 = []; var lineStyle = lineStyleModel.getLineStyle(); for (var i = 0; i < ticksCoords.length; i++) { var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord); if (i === 0 && !showMinLine || i === ticksCoords.length - 1 && !showMaxLine) { continue; } var tickValue = ticksCoords[i].tickValue; if (isHorizontal) { p1[0] = tickCoord; p1[1] = gridRect.y; p2[0] = tickCoord; p2[1] = gridRect.y + gridRect.height; } else { p1[0] = gridRect.x; p1[1] = tickCoord; p2[0] = gridRect.x + gridRect.width; p2[1] = tickCoord; } var colorIndex = lineCount++ % lineColors.length; var line = new Line$1({ anid: tickValue != null ? "line_" + tickValue : null, autoBatch: true, shape: { x1: p1[0], y1: p1[1], x2: p2[0], y2: p2[1] }, style: defaults({ stroke: lineColors[colorIndex] }, lineStyle), silent: true }); subPixelOptimizeLine(line.shape, lineStyle.lineWidth); axisGroup.add(line); } }, minorSplitLine: function(axisView, axisGroup, axisModel, gridModel) { var axis = axisModel.axis; var minorSplitLineModel = axisModel.getModel("minorSplitLine"); var lineStyleModel = minorSplitLineModel.getModel("lineStyle"); var gridRect = gridModel.coordinateSystem.getRect(); var isHorizontal = axis.isHorizontal(); var minorTicksCoords = axis.getMinorTicksCoords(); if (!minorTicksCoords.length) { return; } var p1 = []; var p2 = []; var lineStyle = lineStyleModel.getLineStyle(); for (var i = 0; i < minorTicksCoords.length; i++) { for (var k = 0; k < minorTicksCoords[i].length; k++) { var tickCoord = axis.toGlobalCoord(minorTicksCoords[i][k].coord); if (isHorizontal) { p1[0] = tickCoord; p1[1] = gridRect.y; p2[0] = tickCoord; p2[1] = gridRect.y + gridRect.height; } else { p1[0] = gridRect.x; p1[1] = tickCoord; p2[0] = gridRect.x + gridRect.width; p2[1] = tickCoord; } var line = new Line$1({ anid: "minor_line_" + minorTicksCoords[i][k].tickValue, autoBatch: true, shape: { x1: p1[0], y1: p1[1], x2: p2[0], y2: p2[1] }, style: lineStyle, silent: true }); subPixelOptimizeLine(line.shape, lineStyle.lineWidth); axisGroup.add(line); } } }, splitArea: function(axisView, axisGroup, axisModel, gridModel) { rectCoordAxisBuildSplitArea(axisView, axisGroup, axisModel, gridModel); } }; var CartesianXAxisView = ( /** @class */ (function(_super) { __extends(CartesianXAxisView2, _super); function CartesianXAxisView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = CartesianXAxisView2.type; return _this; } CartesianXAxisView2.type = "xAxis"; return CartesianXAxisView2; })(CartesianAxisView) ); var CartesianYAxisView = ( /** @class */ (function(_super) { __extends(CartesianYAxisView2, _super); function CartesianYAxisView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = CartesianXAxisView.type; return _this; } CartesianYAxisView2.type = "yAxis"; return CartesianYAxisView2; })(CartesianAxisView) ); var GridView = ( /** @class */ (function(_super) { __extends(GridView2, _super); function GridView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = "grid"; return _this; } GridView2.prototype.render = function(gridModel, ecModel) { this.group.removeAll(); if (gridModel.get("show")) { this.group.add(new Rect$2({ shape: gridModel.coordinateSystem.getRect(), style: defaults({ fill: gridModel.get("backgroundColor") }, gridModel.getItemStyle()), silent: true, z2: -1 })); } }; GridView2.type = "grid"; return GridView2; })(ComponentView) ); var extraOption = { // gridIndex: 0, // gridId: '', offset: 0 }; function install$P(registers) { registers.registerComponentView(GridView); registers.registerComponentModel(GridModel); registers.registerCoordinateSystem("cartesian2d", Grid); axisModelCreator(registers, "x", CartesianAxisModel, extraOption); axisModelCreator(registers, "y", CartesianAxisModel, extraOption); registers.registerComponentView(CartesianXAxisView); registers.registerComponentView(CartesianYAxisView); registers.registerPreprocessor(function(option) { if (option.xAxis && option.yAxis && !option.grid) { option.grid = {}; } }); } function install$O(registers) { use(install$P); registers.registerSeriesModel(ScatterSeriesModel); registers.registerChartView(ScatterView); registers.registerLayout(pointsLayout("scatter")); } function radarLayout(ecModel) { ecModel.eachSeriesByType("radar", function(seriesModel) { var data = seriesModel.getData(); var points2 = []; var coordSys = seriesModel.coordinateSystem; if (!coordSys) { return; } var axes = coordSys.getIndicatorAxes(); each$f(axes, function(axis, axisIndex) { data.each(data.mapDimension(axes[axisIndex].dim), function(val, dataIndex) { points2[dataIndex] = points2[dataIndex] || []; var point = coordSys.dataToPoint(val, axisIndex); points2[dataIndex][axisIndex] = isValidPoint(point) ? point : getValueMissingPoint(coordSys); }); }); data.each(function(idx) { var firstPoint = find(points2[idx], function(point) { return isValidPoint(point); }) || getValueMissingPoint(coordSys); points2[idx].push(firstPoint.slice()); data.setItemLayout(idx, points2[idx]); }); }); } function isValidPoint(point) { return !isNaN(point[0]) && !isNaN(point[1]); } function getValueMissingPoint(coordSys) { return [coordSys.cx, coordSys.cy]; } function radarBackwardCompat(option) { var polarOptArr = option.polar; if (polarOptArr) { if (!isArray$1(polarOptArr)) { polarOptArr = [polarOptArr]; } var polarNotRadar_1 = []; each$f(polarOptArr, function(polarOpt, idx) { if (polarOpt.indicator) { if (polarOpt.type && !polarOpt.shape) { polarOpt.shape = polarOpt.type; } option.radar = option.radar || []; if (!isArray$1(option.radar)) { option.radar = [option.radar]; } option.radar.push(polarOpt); } else { polarNotRadar_1.push(polarOpt); } }); option.polar = polarNotRadar_1; } each$f(option.series, function(seriesOpt) { if (seriesOpt && seriesOpt.type === "radar" && seriesOpt.polarIndex) { seriesOpt.radarIndex = seriesOpt.polarIndex; } }); } var RadarView$1 = ( /** @class */ (function(_super) { __extends(RadarView2, _super); function RadarView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = RadarView2.type; return _this; } RadarView2.prototype.render = function(seriesModel, ecModel, api) { var polar = seriesModel.coordinateSystem; var group = this.group; var data = seriesModel.getData(); var oldData = this._data; function createSymbol2(data2, idx) { var symbolType = data2.getItemVisual(idx, "symbol") || "circle"; if (symbolType === "none") { return; } var symbolSize = normalizeSymbolSize(data2.getItemVisual(idx, "symbolSize")); var symbolPath = createSymbol$1(symbolType, -1, -1, 2, 2); var symbolRotate = data2.getItemVisual(idx, "symbolRotate") || 0; symbolPath.attr({ style: { strokeNoScale: true }, z2: 100, scaleX: symbolSize[0] / 2, scaleY: symbolSize[1] / 2, rotation: symbolRotate * Math.PI / 180 || 0 }); return symbolPath; } function updateSymbols(oldPoints, newPoints, symbolGroup, data2, idx, isInit) { symbolGroup.removeAll(); for (var i = 0; i < newPoints.length - 1; i++) { var symbolPath = createSymbol2(data2, idx); if (symbolPath) { symbolPath.__dimIdx = i; if (oldPoints[i]) { symbolPath.setPosition(oldPoints[i]); graphic[isInit ? "initProps" : "updateProps"](symbolPath, { x: newPoints[i][0], y: newPoints[i][1] }, seriesModel, idx); } else { symbolPath.setPosition(newPoints[i]); } symbolGroup.add(symbolPath); } } } function getInitialPoints(points2) { return map$1(points2, function(pt) { return [polar.cx, polar.cy]; }); } data.diff(oldData).add(function(idx) { var points2 = data.getItemLayout(idx); if (!points2) { return; } var polygon = new Polygon(); var polyline = new Polyline$1(); var target = { shape: { points: points2 } }; polygon.shape.points = getInitialPoints(points2); polyline.shape.points = getInitialPoints(points2); initProps(polygon, target, seriesModel, idx); initProps(polyline, target, seriesModel, idx); var itemGroup = new Group$3(); var symbolGroup = new Group$3(); itemGroup.add(polyline); itemGroup.add(polygon); itemGroup.add(symbolGroup); updateSymbols(polyline.shape.points, points2, symbolGroup, data, idx, true); data.setItemGraphicEl(idx, itemGroup); }).update(function(newIdx, oldIdx) { var itemGroup = oldData.getItemGraphicEl(oldIdx); var polyline = itemGroup.childAt(0); var polygon = itemGroup.childAt(1); var symbolGroup = itemGroup.childAt(2); var target = { shape: { points: data.getItemLayout(newIdx) } }; if (!target.shape.points) { return; } updateSymbols(polyline.shape.points, target.shape.points, symbolGroup, data, newIdx, false); saveOldStyle(polygon); saveOldStyle(polyline); updateProps$1(polyline, target, seriesModel); updateProps$1(polygon, target, seriesModel); data.setItemGraphicEl(newIdx, itemGroup); }).remove(function(idx) { group.remove(oldData.getItemGraphicEl(idx)); }).execute(); data.eachItemGraphicEl(function(itemGroup, idx) { var itemModel = data.getItemModel(idx); var polyline = itemGroup.childAt(0); var polygon = itemGroup.childAt(1); var symbolGroup = itemGroup.childAt(2); var itemStyle = data.getItemVisual(idx, "style"); var color = itemStyle.fill; group.add(itemGroup); polyline.useStyle(defaults(itemModel.getModel("lineStyle").getLineStyle(), { fill: "none", stroke: color })); setStatesStylesFromModel(polyline, itemModel, "lineStyle"); setStatesStylesFromModel(polygon, itemModel, "areaStyle"); var areaStyleModel = itemModel.getModel("areaStyle"); var polygonIgnore = areaStyleModel.isEmpty() && areaStyleModel.parentModel.isEmpty(); polygon.ignore = polygonIgnore; each$f(["emphasis", "select", "blur"], function(stateName) { var stateModel = itemModel.getModel([stateName, "areaStyle"]); var stateIgnore = stateModel.isEmpty() && stateModel.parentModel.isEmpty(); polygon.ensureState(stateName).ignore = stateIgnore && polygonIgnore; }); polygon.useStyle(defaults(areaStyleModel.getAreaStyle(), { fill: color, opacity: 0.7, decal: itemStyle.decal })); var emphasisModel = itemModel.getModel("emphasis"); var itemHoverStyle = emphasisModel.getModel("itemStyle").getItemStyle(); symbolGroup.eachChild(function(symbolPath) { if (symbolPath instanceof ZRImage) { var pathStyle = symbolPath.style; symbolPath.useStyle(extend({ // TODO other properties like x, y ? image: pathStyle.image, x: pathStyle.x, y: pathStyle.y, width: pathStyle.width, height: pathStyle.height }, itemStyle)); } else { symbolPath.useStyle(itemStyle); symbolPath.setColor(color); symbolPath.style.strokeNoScale = true; } var pathEmphasisState = symbolPath.ensureState("emphasis"); pathEmphasisState.style = clone$1(itemHoverStyle); var defaultText = data.getStore().get(data.getDimensionIndex(symbolPath.__dimIdx), idx); (defaultText == null || isNaN(defaultText)) && (defaultText = ""); setLabelStyle(symbolPath, getLabelStatesModels(itemModel), { labelFetcher: data.hostModel, labelDataIndex: idx, labelDimIndex: symbolPath.__dimIdx, defaultText, inheritColor: color, defaultOpacity: itemStyle.opacity }); }); toggleHoverEmphasis(itemGroup, emphasisModel.get("focus"), emphasisModel.get("blurScope"), emphasisModel.get("disabled")); }); this._data = data; }; RadarView2.prototype.remove = function() { this.group.removeAll(); this._data = null; }; RadarView2.type = "radar"; return RadarView2; })(ChartView) ); var RadarSeriesModel = ( /** @class */ (function(_super) { __extends(RadarSeriesModel2, _super); function RadarSeriesModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = RadarSeriesModel2.type; _this.hasSymbolVisual = true; return _this; } RadarSeriesModel2.prototype.init = function(option) { _super.prototype.init.apply(this, arguments); this.legendVisualProvider = new LegendVisualProvider(bind$1(this.getData, this), bind$1(this.getRawData, this)); }; RadarSeriesModel2.prototype.getInitialData = function(option, ecModel) { return createSeriesDataSimply(this, { generateCoord: "indicator_", generateCoordCount: Infinity }); }; RadarSeriesModel2.prototype.formatTooltip = function(dataIndex, multipleSeries, dataType) { var data = this.getData(); var coordSys = this.coordinateSystem; var indicatorAxes = coordSys.getIndicatorAxes(); var name = this.getData().getName(dataIndex); var nameToDisplay = name === "" ? this.name : name; var markerColor = retrieveVisualColorForTooltipMarker(this, dataIndex); return createTooltipMarkup("section", { header: nameToDisplay, sortBlocks: true, blocks: map$1(indicatorAxes, function(axis) { var val = data.get(data.mapDimension(axis.dim), dataIndex); return createTooltipMarkup("nameValue", { markerType: "subItem", markerColor, name: axis.name, value: val, sortParam: val }); }) }); }; RadarSeriesModel2.prototype.getTooltipPosition = function(dataIndex) { if (dataIndex != null) { var data_1 = this.getData(); var coordSys = this.coordinateSystem; var values = data_1.getValues(map$1(coordSys.dimensions, function(dim) { return data_1.mapDimension(dim); }), dataIndex); for (var i = 0, len2 = values.length; i < len2; i++) { if (!isNaN(values[i])) { var indicatorAxes = coordSys.getIndicatorAxes(); return coordSys.coordToPoint(indicatorAxes[i].dataToCoord(values[i]), i); } } } }; RadarSeriesModel2.type = "series.radar"; RadarSeriesModel2.dependencies = ["radar"]; RadarSeriesModel2.defaultOption = { // zlevel: 0, z: 2, colorBy: "data", coordinateSystem: "radar", legendHoverLink: true, radarIndex: 0, lineStyle: { width: 2, type: "solid", join: "round" }, label: { position: "top" }, // areaStyle: { // }, // itemStyle: {} symbolSize: 8 // symbolRotate: null }; return RadarSeriesModel2; })(SeriesModel) ); var valueAxisDefault = axisDefault.value; function defaultsShow(opt, show) { return defaults({ show }, opt); } var RadarModel = ( /** @class */ (function(_super) { __extends(RadarModel2, _super); function RadarModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = RadarModel2.type; return _this; } RadarModel2.prototype.optionUpdated = function() { var boundaryGap = this.get("boundaryGap"); var splitNumber = this.get("splitNumber"); var scale2 = this.get("scale"); var axisLine = this.get("axisLine"); var axisTick = this.get("axisTick"); var axisLabel = this.get("axisLabel"); var nameTextStyle = this.get("axisName"); var showName = this.get(["axisName", "show"]); var nameFormatter = this.get(["axisName", "formatter"]); var nameGap = this.get("axisNameGap"); var triggerEvent = this.get("triggerEvent"); var indicatorModels = map$1(this.get("indicator") || [], function(indicatorOpt) { if (indicatorOpt.max != null && indicatorOpt.max > 0 && !indicatorOpt.min) { indicatorOpt.min = 0; } else if (indicatorOpt.min != null && indicatorOpt.min < 0 && !indicatorOpt.max) { indicatorOpt.max = 0; } var iNameTextStyle = nameTextStyle; if (indicatorOpt.color != null) { iNameTextStyle = defaults({ color: indicatorOpt.color }, nameTextStyle); } var innerIndicatorOpt = merge(clone$1(indicatorOpt), { boundaryGap, splitNumber, scale: scale2, axisLine, axisTick, // axisType: axisType, axisLabel, // Compatible with 2 and use text name: indicatorOpt.text, showName, nameLocation: "end", nameGap, // min: 0, nameTextStyle: iNameTextStyle, triggerEvent }, false); if (isString(nameFormatter)) { var indName = innerIndicatorOpt.name; innerIndicatorOpt.name = nameFormatter.replace("{value}", indName != null ? indName : ""); } else if (isFunction(nameFormatter)) { innerIndicatorOpt.name = nameFormatter(innerIndicatorOpt.name, innerIndicatorOpt); } var model = new Model(innerIndicatorOpt, null, this.ecModel); mixin(model, AxisModelCommonMixin.prototype); model.mainType = "radar"; model.componentIndex = this.componentIndex; return model; }, this); this._indicatorModels = indicatorModels; }; RadarModel2.prototype.getIndicatorModels = function() { return this._indicatorModels; }; RadarModel2.type = "radar"; RadarModel2.defaultOption = { // zlevel: 0, z: 0, center: ["50%", "50%"], radius: "75%", startAngle: 90, axisName: { show: true // formatter: null // textStyle: {} }, boundaryGap: [0, 0], splitNumber: 5, axisNameGap: 15, scale: false, // Polygon or circle shape: "polygon", axisLine: merge({ lineStyle: { color: "#bbb" } }, valueAxisDefault.axisLine), axisLabel: defaultsShow(valueAxisDefault.axisLabel, false), axisTick: defaultsShow(valueAxisDefault.axisTick, false), // axisType: 'value', splitLine: defaultsShow(valueAxisDefault.splitLine, true), splitArea: defaultsShow(valueAxisDefault.splitArea, true), // {text, min, max} indicator: [] }; return RadarModel2; })(ComponentModel) ); var axisBuilderAttrs$2 = ["axisLine", "axisTickLabel", "axisName"]; var RadarView = ( /** @class */ (function(_super) { __extends(RadarView2, _super); function RadarView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = RadarView2.type; return _this; } RadarView2.prototype.render = function(radarModel, ecModel, api) { var group = this.group; group.removeAll(); this._buildAxes(radarModel); this._buildSplitLineAndArea(radarModel); }; RadarView2.prototype._buildAxes = function(radarModel) { var radar = radarModel.coordinateSystem; var indicatorAxes = radar.getIndicatorAxes(); var axisBuilders = map$1(indicatorAxes, function(indicatorAxis) { var axisName = indicatorAxis.model.get("showName") ? indicatorAxis.name : ""; var axisBuilder = new AxisBuilder(indicatorAxis.model, { axisName, position: [radar.cx, radar.cy], rotation: indicatorAxis.angle, labelDirection: -1, tickDirection: -1, nameDirection: 1 }); return axisBuilder; }); each$f(axisBuilders, function(axisBuilder) { each$f(axisBuilderAttrs$2, axisBuilder.add, axisBuilder); this.group.add(axisBuilder.getGroup()); }, this); }; RadarView2.prototype._buildSplitLineAndArea = function(radarModel) { var radar = radarModel.coordinateSystem; var indicatorAxes = radar.getIndicatorAxes(); if (!indicatorAxes.length) { return; } var shape = radarModel.get("shape"); var splitLineModel = radarModel.getModel("splitLine"); var splitAreaModel = radarModel.getModel("splitArea"); var lineStyleModel = splitLineModel.getModel("lineStyle"); var areaStyleModel = splitAreaModel.getModel("areaStyle"); var showSplitLine = splitLineModel.get("show"); var showSplitArea = splitAreaModel.get("show"); var splitLineColors = lineStyleModel.get("color"); var splitAreaColors = areaStyleModel.get("color"); var splitLineColorsArr = isArray$1(splitLineColors) ? splitLineColors : [splitLineColors]; var splitAreaColorsArr = isArray$1(splitAreaColors) ? splitAreaColors : [splitAreaColors]; var splitLines = []; var splitAreas = []; function getColorIndex(areaOrLine, areaOrLineColorList, idx) { var colorIndex2 = idx % areaOrLineColorList.length; areaOrLine[colorIndex2] = areaOrLine[colorIndex2] || []; return colorIndex2; } if (shape === "circle") { var ticksRadius = indicatorAxes[0].getTicksCoords(); var cx = radar.cx; var cy = radar.cy; for (var i = 0; i < ticksRadius.length; i++) { if (showSplitLine) { var colorIndex = getColorIndex(splitLines, splitLineColorsArr, i); splitLines[colorIndex].push(new Circle({ shape: { cx, cy, r: ticksRadius[i].coord } })); } if (showSplitArea && i < ticksRadius.length - 1) { var colorIndex = getColorIndex(splitAreas, splitAreaColorsArr, i); splitAreas[colorIndex].push(new Ring({ shape: { cx, cy, r0: ticksRadius[i].coord, r: ticksRadius[i + 1].coord } })); } } } else { var realSplitNumber_1; var axesTicksPoints = map$1(indicatorAxes, function(indicatorAxis, idx) { var ticksCoords = indicatorAxis.getTicksCoords(); realSplitNumber_1 = realSplitNumber_1 == null ? ticksCoords.length - 1 : Math.min(ticksCoords.length - 1, realSplitNumber_1); return map$1(ticksCoords, function(tickCoord) { return radar.coordToPoint(tickCoord.coord, idx); }); }); var prevPoints = []; for (var i = 0; i <= realSplitNumber_1; i++) { var points2 = []; for (var j = 0; j < indicatorAxes.length; j++) { points2.push(axesTicksPoints[j][i]); } if (points2[0]) { points2.push(points2[0].slice()); } if (showSplitLine) { var colorIndex = getColorIndex(splitLines, splitLineColorsArr, i); splitLines[colorIndex].push(new Polyline$1({ shape: { points: points2 } })); } if (showSplitArea && prevPoints) { var colorIndex = getColorIndex(splitAreas, splitAreaColorsArr, i - 1); splitAreas[colorIndex].push(new Polygon({ shape: { points: points2.concat(prevPoints) } })); } prevPoints = points2.slice().reverse(); } } var lineStyle = lineStyleModel.getLineStyle(); var areaStyle = areaStyleModel.getAreaStyle(); each$f(splitAreas, function(splitAreas2, idx) { this.group.add(mergePath(splitAreas2, { style: defaults({ stroke: "none", fill: splitAreaColorsArr[idx % splitAreaColorsArr.length] }, areaStyle), silent: true })); }, this); each$f(splitLines, function(splitLines2, idx) { this.group.add(mergePath(splitLines2, { style: defaults({ fill: "none", stroke: splitLineColorsArr[idx % splitLineColorsArr.length] }, lineStyle), silent: true })); }, this); }; RadarView2.type = "radar"; return RadarView2; })(ComponentView) ); var IndicatorAxis = ( /** @class */ (function(_super) { __extends(IndicatorAxis2, _super); function IndicatorAxis2(dim, scale2, radiusExtent) { var _this = _super.call(this, dim, scale2, radiusExtent) || this; _this.type = "value"; _this.angle = 0; _this.name = ""; return _this; } return IndicatorAxis2; })(Axis) ); var Radar = ( /** @class */ (function() { function Radar2(radarModel, ecModel, api) { this.dimensions = []; this._model = radarModel; this._indicatorAxes = map$1(radarModel.getIndicatorModels(), function(indicatorModel, idx) { var dim = "indicator_" + idx; var indicatorAxis = new IndicatorAxis( dim, new IntervalScale() // (indicatorModel.get('axisType') === 'log') ? new LogScale() : new IntervalScale() ); indicatorAxis.name = indicatorModel.get("name"); indicatorAxis.model = indicatorModel; indicatorModel.axis = indicatorAxis; this.dimensions.push(dim); return indicatorAxis; }, this); this.resize(radarModel, api); } Radar2.prototype.getIndicatorAxes = function() { return this._indicatorAxes; }; Radar2.prototype.dataToPoint = function(value, indicatorIndex) { var indicatorAxis = this._indicatorAxes[indicatorIndex]; return this.coordToPoint(indicatorAxis.dataToCoord(value), indicatorIndex); }; Radar2.prototype.coordToPoint = function(coord, indicatorIndex) { var indicatorAxis = this._indicatorAxes[indicatorIndex]; var angle = indicatorAxis.angle; var x = this.cx + coord * Math.cos(angle); var y = this.cy - coord * Math.sin(angle); return [x, y]; }; Radar2.prototype.pointToData = function(pt) { var dx = pt[0] - this.cx; var dy = pt[1] - this.cy; var radius = Math.sqrt(dx * dx + dy * dy); dx /= radius; dy /= radius; var radian = Math.atan2(-dy, dx); var minRadianDiff = Infinity; var closestAxis; var closestAxisIdx = -1; for (var i = 0; i < this._indicatorAxes.length; i++) { var indicatorAxis = this._indicatorAxes[i]; var diff = Math.abs(radian - indicatorAxis.angle); if (diff < minRadianDiff) { closestAxis = indicatorAxis; closestAxisIdx = i; minRadianDiff = diff; } } return [closestAxisIdx, +(closestAxis && closestAxis.coordToData(radius))]; }; Radar2.prototype.resize = function(radarModel, api) { var center2 = radarModel.get("center"); var viewWidth = api.getWidth(); var viewHeight = api.getHeight(); var viewSize = Math.min(viewWidth, viewHeight) / 2; this.cx = parsePercent(center2[0], viewWidth); this.cy = parsePercent(center2[1], viewHeight); this.startAngle = radarModel.get("startAngle") * Math.PI / 180; var radius = radarModel.get("radius"); if (isString(radius) || isNumber(radius)) { radius = [0, radius]; } this.r0 = parsePercent(radius[0], viewSize); this.r = parsePercent(radius[1], viewSize); each$f(this._indicatorAxes, function(indicatorAxis, idx) { indicatorAxis.setExtent(this.r0, this.r); var angle = this.startAngle + idx * Math.PI * 2 / this._indicatorAxes.length; angle = Math.atan2(Math.sin(angle), Math.cos(angle)); indicatorAxis.angle = angle; }, this); }; Radar2.prototype.update = function(ecModel, api) { var indicatorAxes = this._indicatorAxes; var radarModel = this._model; each$f(indicatorAxes, function(indicatorAxis) { indicatorAxis.scale.setExtent(Infinity, -Infinity); }); ecModel.eachSeriesByType("radar", function(radarSeries, idx) { if (radarSeries.get("coordinateSystem") !== "radar" || ecModel.getComponent("radar", radarSeries.get("radarIndex")) !== radarModel) { return; } var data = radarSeries.getData(); each$f(indicatorAxes, function(indicatorAxis) { indicatorAxis.scale.unionExtentFromData(data, data.mapDimension(indicatorAxis.dim)); }); }, this); var splitNumber = radarModel.get("splitNumber"); var dummyScale = new IntervalScale(); dummyScale.setExtent(0, splitNumber); dummyScale.setInterval(1); each$f(indicatorAxes, function(indicatorAxis, idx) { alignScaleTicks(indicatorAxis.scale, indicatorAxis.model, dummyScale); }); }; Radar2.prototype.convertToPixel = function(ecModel, finder, value) { console.warn("Not implemented."); return null; }; Radar2.prototype.convertFromPixel = function(ecModel, finder, pixel) { console.warn("Not implemented."); return null; }; Radar2.prototype.containPoint = function(point) { console.warn("Not implemented."); return false; }; Radar2.create = function(ecModel, api) { var radarList = []; ecModel.eachComponent("radar", function(radarModel) { var radar = new Radar2(radarModel, ecModel, api); radarList.push(radar); radarModel.coordinateSystem = radar; }); ecModel.eachSeriesByType("radar", function(radarSeries) { if (radarSeries.get("coordinateSystem") === "radar") { radarSeries.coordinateSystem = radarList[radarSeries.get("radarIndex") || 0]; } }); return radarList; }; Radar2.dimensions = []; return Radar2; })() ); function install$N(registers) { registers.registerCoordinateSystem("radar", Radar); registers.registerComponentModel(RadarModel); registers.registerComponentView(RadarView); registers.registerVisual({ seriesType: "radar", reset: function(seriesModel) { var data = seriesModel.getData(); data.each(function(idx) { data.setItemVisual(idx, "legendIcon", "roundRect"); }); data.setVisual("legendIcon", "roundRect"); } }); } function install$M(registers) { use(install$N); registers.registerChartView(RadarView$1); registers.registerSeriesModel(RadarSeriesModel); registers.registerLayout(radarLayout); registers.registerProcessor(dataFilter$1("radar")); registers.registerPreprocessor(radarBackwardCompat); } var ATTR = "\0_ec_interaction_mutex"; function take(zr, resourceKey, userKey) { var store = getStore(zr); store[resourceKey] = userKey; } function release(zr, resourceKey, userKey) { var store = getStore(zr); var uKey = store[resourceKey]; if (uKey === userKey) { store[resourceKey] = null; } } function isTaken(zr, resourceKey) { return !!getStore(zr)[resourceKey]; } function getStore(zr) { return zr[ATTR] || (zr[ATTR] = {}); } registerAction({ type: "takeGlobalCursor", event: "globalCursorTaken", update: "update" }, noop); var RoamController = ( /** @class */ (function(_super) { __extends(RoamController2, _super); function RoamController2(zr) { var _this = _super.call(this) || this; _this._zr = zr; var mousedownHandler = bind$1(_this._mousedownHandler, _this); var mousemoveHandler = bind$1(_this._mousemoveHandler, _this); var mouseupHandler = bind$1(_this._mouseupHandler, _this); var mousewheelHandler = bind$1(_this._mousewheelHandler, _this); var pinchHandler = bind$1(_this._pinchHandler, _this); _this.enable = function(controlType, opt) { this.disable(); this._opt = defaults(clone$1(opt) || {}, { zoomOnMouseWheel: true, moveOnMouseMove: true, // By default, wheel do not trigger move. moveOnMouseWheel: false, preventDefaultMouseMove: true }); if (controlType == null) { controlType = true; } if (controlType === true || controlType === "move" || controlType === "pan") { zr.on("mousedown", mousedownHandler); zr.on("mousemove", mousemoveHandler); zr.on("mouseup", mouseupHandler); } if (controlType === true || controlType === "scale" || controlType === "zoom") { zr.on("mousewheel", mousewheelHandler); zr.on("pinch", pinchHandler); } }; _this.disable = function() { zr.off("mousedown", mousedownHandler); zr.off("mousemove", mousemoveHandler); zr.off("mouseup", mouseupHandler); zr.off("mousewheel", mousewheelHandler); zr.off("pinch", pinchHandler); }; return _this; } RoamController2.prototype.isDragging = function() { return this._dragging; }; RoamController2.prototype.isPinching = function() { return this._pinching; }; RoamController2.prototype.setPointerChecker = function(pointerChecker) { this.pointerChecker = pointerChecker; }; RoamController2.prototype.dispose = function() { this.disable(); }; RoamController2.prototype._mousedownHandler = function(e) { if (isMiddleOrRightButtonOnMouseUpDown(e)) { return; } var el = e.target; while (el) { if (el.draggable) { return; } el = el.__hostTarget || el.parent; } var x = e.offsetX; var y = e.offsetY; if (this.pointerChecker && this.pointerChecker(e, x, y)) { this._x = x; this._y = y; this._dragging = true; } }; RoamController2.prototype._mousemoveHandler = function(e) { if (!this._dragging || !isAvailableBehavior("moveOnMouseMove", e, this._opt) || e.gestureEvent === "pinch" || isTaken(this._zr, "globalPan")) { return; } var x = e.offsetX; var y = e.offsetY; var oldX = this._x; var oldY = this._y; var dx = x - oldX; var dy = y - oldY; this._x = x; this._y = y; this._opt.preventDefaultMouseMove && stop(e.event); trigger$1(this, "pan", "moveOnMouseMove", e, { dx, dy, oldX, oldY, newX: x, newY: y, isAvailableBehavior: null }); }; RoamController2.prototype._mouseupHandler = function(e) { if (!isMiddleOrRightButtonOnMouseUpDown(e)) { this._dragging = false; } }; RoamController2.prototype._mousewheelHandler = function(e) { var shouldZoom = isAvailableBehavior("zoomOnMouseWheel", e, this._opt); var shouldMove = isAvailableBehavior("moveOnMouseWheel", e, this._opt); var wheelDelta = e.wheelDelta; var absWheelDeltaDelta = Math.abs(wheelDelta); var originX = e.offsetX; var originY = e.offsetY; if (wheelDelta === 0 || !shouldZoom && !shouldMove) { return; } if (shouldZoom) { var factor = absWheelDeltaDelta > 3 ? 1.4 : absWheelDeltaDelta > 1 ? 1.2 : 1.1; var scale2 = wheelDelta > 0 ? factor : 1 / factor; checkPointerAndTrigger(this, "zoom", "zoomOnMouseWheel", e, { scale: scale2, originX, originY, isAvailableBehavior: null }); } if (shouldMove) { var absDelta = Math.abs(wheelDelta); var scrollDelta = (wheelDelta > 0 ? 1 : -1) * (absDelta > 3 ? 0.4 : absDelta > 1 ? 0.15 : 0.05); checkPointerAndTrigger(this, "scrollMove", "moveOnMouseWheel", e, { scrollDelta, originX, originY, isAvailableBehavior: null }); } }; RoamController2.prototype._pinchHandler = function(e) { if (isTaken(this._zr, "globalPan")) { return; } var scale2 = e.pinchScale > 1 ? 1.1 : 1 / 1.1; checkPointerAndTrigger(this, "zoom", null, e, { scale: scale2, originX: e.pinchX, originY: e.pinchY, isAvailableBehavior: null }); }; return RoamController2; })(Eventful) ); function checkPointerAndTrigger(controller, eventName, behaviorToCheck, e, contollerEvent) { if (controller.pointerChecker && controller.pointerChecker(e, contollerEvent.originX, contollerEvent.originY)) { stop(e.event); trigger$1(controller, eventName, behaviorToCheck, e, contollerEvent); } } function trigger$1(controller, eventName, behaviorToCheck, e, contollerEvent) { contollerEvent.isAvailableBehavior = bind$1(isAvailableBehavior, null, behaviorToCheck, e); controller.trigger(eventName, contollerEvent); } function isAvailableBehavior(behaviorToCheck, e, settings) { var setting = settings[behaviorToCheck]; return !behaviorToCheck || setting && (!isString(setting) || e.event[setting + "Key"]); } function updateViewOnPan(controllerHost, dx, dy) { var target = controllerHost.target; target.x += dx; target.y += dy; target.dirty(); } function updateViewOnZoom(controllerHost, zoomDelta, zoomX, zoomY) { var target = controllerHost.target; var zoomLimit = controllerHost.zoomLimit; var newZoom = controllerHost.zoom = controllerHost.zoom || 1; newZoom *= zoomDelta; if (zoomLimit) { var zoomMin = zoomLimit.min || 0; var zoomMax = zoomLimit.max || Infinity; newZoom = Math.max(Math.min(zoomMax, newZoom), zoomMin); } var zoomScale = newZoom / controllerHost.zoom; controllerHost.zoom = newZoom; target.x -= (zoomX - target.x) * (zoomScale - 1); target.y -= (zoomY - target.y) * (zoomScale - 1); target.scaleX *= zoomScale; target.scaleY *= zoomScale; target.dirty(); } var IRRELEVANT_EXCLUDES = { "axisPointer": 1, "tooltip": 1, "brush": 1 }; function onIrrelevantElement(e, api, targetCoordSysModel) { var model = api.getComponentByElement(e.topTarget); var coordSys = model && model.coordinateSystem; return model && model !== targetCoordSysModel && !IRRELEVANT_EXCLUDES.hasOwnProperty(model.mainType) && coordSys && coordSys.model !== targetCoordSysModel; } var REGION_AVAILABLE_SVG_TAG_MAP = createHashMap([ "rect", "circle", "line", "ellipse", "polygon", "polyline", "path", // are also enabled because some SVG might paint text itself, // but still need to trigger events or tooltip. "text", "tspan", // is also enabled because this case: if multiple tags share one name // and need label displayed, every tags will display the name, which is not // expected. So we can put them into a . Thereby only one label // displayed and located based on the bounding rect of the . "g" ]); var GeoSVGResource = ( /** @class */ (function() { function GeoSVGResource2(mapName, svg) { this.type = "geoSVG"; this._usedGraphicMap = createHashMap(); this._freedGraphics = []; this._mapName = mapName; this._parsedXML = parseXML(svg); } GeoSVGResource2.prototype.load = function() { var firstGraphic = this._firstGraphic; if (!firstGraphic) { firstGraphic = this._firstGraphic = this._buildGraphic(this._parsedXML); this._freedGraphics.push(firstGraphic); this._boundingRect = this._firstGraphic.boundingRect.clone(); var _a2 = createRegions(firstGraphic.named), regions = _a2.regions, regionsMap = _a2.regionsMap; this._regions = regions; this._regionsMap = regionsMap; } return { boundingRect: this._boundingRect, regions: this._regions, regionsMap: this._regionsMap }; }; GeoSVGResource2.prototype._buildGraphic = function(svgXML) { var result; var rootFromParse; try { result = svgXML && parseSVG(svgXML, { ignoreViewBox: true, ignoreRootClip: true }) || {}; rootFromParse = result.root; assert(rootFromParse != null); } catch (e) { throw new Error("Invalid svg format\n" + e.message); } var root = new Group$3(); root.add(rootFromParse); root.isGeoSVGGraphicRoot = true; var svgWidth = result.width; var svgHeight = result.height; var viewBoxRect = result.viewBoxRect; var boundingRect = this._boundingRect; if (!boundingRect) { var bRectX = void 0; var bRectY = void 0; var bRectWidth = void 0; var bRectHeight = void 0; if (svgWidth != null) { bRectX = 0; bRectWidth = svgWidth; } else if (viewBoxRect) { bRectX = viewBoxRect.x; bRectWidth = viewBoxRect.width; } if (svgHeight != null) { bRectY = 0; bRectHeight = svgHeight; } else if (viewBoxRect) { bRectY = viewBoxRect.y; bRectHeight = viewBoxRect.height; } if (bRectX == null || bRectY == null) { var calculatedBoundingRect = rootFromParse.getBoundingRect(); if (bRectX == null) { bRectX = calculatedBoundingRect.x; bRectWidth = calculatedBoundingRect.width; } if (bRectY == null) { bRectY = calculatedBoundingRect.y; bRectHeight = calculatedBoundingRect.height; } } boundingRect = this._boundingRect = new BoundingRect(bRectX, bRectY, bRectWidth, bRectHeight); } if (viewBoxRect) { var viewBoxTransform = makeViewBoxTransform(viewBoxRect, boundingRect); rootFromParse.scaleX = rootFromParse.scaleY = viewBoxTransform.scale; rootFromParse.x = viewBoxTransform.x; rootFromParse.y = viewBoxTransform.y; } root.setClipPath(new Rect$2({ shape: boundingRect.plain() })); var named = []; each$f(result.named, function(namedItem) { if (REGION_AVAILABLE_SVG_TAG_MAP.get(namedItem.svgNodeTagLower) != null) { named.push(namedItem); setSilent(namedItem.el); } }); return { root, boundingRect, named }; }; GeoSVGResource2.prototype.useGraphic = function(hostKey) { var usedRootMap = this._usedGraphicMap; var svgGraphic = usedRootMap.get(hostKey); if (svgGraphic) { return svgGraphic; } svgGraphic = this._freedGraphics.pop() || this._buildGraphic(this._parsedXML); usedRootMap.set(hostKey, svgGraphic); return svgGraphic; }; GeoSVGResource2.prototype.freeGraphic = function(hostKey) { var usedRootMap = this._usedGraphicMap; var svgGraphic = usedRootMap.get(hostKey); if (svgGraphic) { usedRootMap.removeKey(hostKey); this._freedGraphics.push(svgGraphic); } }; return GeoSVGResource2; })() ); function setSilent(el) { el.silent = false; if (el.isGroup) { el.traverse(function(child) { child.silent = false; }); } } function createRegions(named) { var regions = []; var regionsMap = createHashMap(); each$f(named, function(namedItem) { if (namedItem.namedFrom != null) { return; } var region = new GeoSVGRegion(namedItem.name, namedItem.el); regions.push(region); regionsMap.set(namedItem.name, region); }); return { regions, regionsMap }; } var geoCoord = [126, 25]; var nanhaiName = "南海诸岛"; var points$1 = [[[0, 3.5], [7, 11.2], [15, 11.9], [30, 7], [42, 0.7], [52, 0.7], [56, 7.7], [59, 0.7], [64, 0.7], [64, 0], [5, 0], [0, 3.5]], [[13, 16.1], [19, 14.7], [16, 21.7], [11, 23.1], [13, 16.1]], [[12, 32.2], [14, 38.5], [15, 38.5], [13, 32.2], [12, 32.2]], [[16, 47.6], [12, 53.2], [13, 53.2], [18, 47.6], [16, 47.6]], [[6, 64.4], [8, 70], [9, 70], [8, 64.4], [6, 64.4]], [[23, 82.6], [29, 79.8], [30, 79.8], [25, 82.6], [23, 82.6]], [[37, 70.7], [43, 62.3], [44, 62.3], [39, 70.7], [37, 70.7]], [[48, 51.1], [51, 45.5], [53, 45.5], [50, 51.1], [48, 51.1]], [[51, 35], [51, 28.7], [53, 28.7], [53, 35], [51, 35]], [[52, 22.4], [55, 17.5], [56, 17.5], [53, 22.4], [52, 22.4]], [[58, 12.6], [62, 7], [63, 7], [60, 12.6], [58, 12.6]], [[0, 3.5], [0, 93.1], [64, 93.1], [64, 0], [63, 0], [63, 92.4], [1, 92.4], [1, 3.5], [0, 3.5]]]; for (var i = 0; i < points$1.length; i++) { for (var k = 0; k < points$1[i].length; k++) { points$1[i][k][0] /= 10.5; points$1[i][k][1] /= -10.5 / 0.75; points$1[i][k][0] += geoCoord[0]; points$1[i][k][1] += geoCoord[1]; } } function fixNanhai(mapType, regions) { if (mapType === "china") { for (var i = 0; i < regions.length; i++) { if (regions[i].name === nanhaiName) { return; } } regions.push(new GeoJSONRegion(nanhaiName, map$1(points$1, function(exterior) { return { type: "polygon", exterior }; }), geoCoord)); } } var coordsOffsetMap = { "南海诸岛": [32, 80], // 全国 "广东": [0, -10], "香港": [10, 5], "澳门": [-10, 10], // '北京': [-10, 0], "天津": [5, 5] }; function fixTextCoords(mapType, region) { if (mapType === "china") { var coordFix = coordsOffsetMap[region.name]; if (coordFix) { var cp = region.getCenter(); cp[0] += coordFix[0] / 10.5; cp[1] += -coordFix[1] / (10.5 / 0.75); region.setCenter(cp); } } } var points = [[[123.45165252685547, 25.73527164402261], [123.49731445312499, 25.73527164402261], [123.49731445312499, 25.750734064600884], [123.45165252685547, 25.750734064600884], [123.45165252685547, 25.73527164402261]]]; function fixDiaoyuIsland(mapType, region) { if (mapType === "china" && region.name === "台湾") { region.geometries.push({ type: "polygon", exterior: points[0] }); } } var DEFAULT_NAME_PROPERTY = "name"; var GeoJSONResource = ( /** @class */ (function() { function GeoJSONResource2(mapName, geoJSON, specialAreas) { this.type = "geoJSON"; this._parsedMap = createHashMap(); this._mapName = mapName; this._specialAreas = specialAreas; this._geoJSON = parseInput(geoJSON); } GeoJSONResource2.prototype.load = function(nameMap, nameProperty) { nameProperty = nameProperty || DEFAULT_NAME_PROPERTY; var parsed = this._parsedMap.get(nameProperty); if (!parsed) { var rawRegions = this._parseToRegions(nameProperty); parsed = this._parsedMap.set(nameProperty, { regions: rawRegions, boundingRect: calculateBoundingRect(rawRegions) }); } var regionsMap = createHashMap(); var finalRegions = []; each$f(parsed.regions, function(region) { var regionName = region.name; if (nameMap && hasOwn(nameMap, regionName)) { region = region.cloneShallow(regionName = nameMap[regionName]); } finalRegions.push(region); regionsMap.set(regionName, region); }); return { regions: finalRegions, boundingRect: parsed.boundingRect || new BoundingRect(0, 0, 0, 0), regionsMap }; }; GeoJSONResource2.prototype._parseToRegions = function(nameProperty) { var mapName = this._mapName; var geoJSON = this._geoJSON; var rawRegions; try { rawRegions = geoJSON ? parseGeoJSON(geoJSON, nameProperty) : []; } catch (e) { throw new Error("Invalid geoJson format\n" + e.message); } fixNanhai(mapName, rawRegions); each$f(rawRegions, function(region) { var regionName = region.name; fixTextCoords(mapName, region); fixDiaoyuIsland(mapName, region); var specialArea = this._specialAreas && this._specialAreas[regionName]; if (specialArea) { region.transformTo(specialArea.left, specialArea.top, specialArea.width, specialArea.height); } }, this); return rawRegions; }; GeoJSONResource2.prototype.getMapForUser = function() { return { // For backward compatibility, use geoJson // PENDING: it has been returning them without clone. // do we need to avoid outsite modification? geoJson: this._geoJSON, geoJSON: this._geoJSON, specialAreas: this._specialAreas }; }; return GeoJSONResource2; })() ); function calculateBoundingRect(regions) { var rect; for (var i = 0; i < regions.length; i++) { var regionRect = regions[i].getBoundingRect(); rect = rect || regionRect.clone(); rect.union(regionRect); } return rect; } function parseInput(source) { return !isString(source) ? source : typeof JSON !== "undefined" && JSON.parse ? JSON.parse(source) : new Function("return (" + source + ");")(); } var storage = createHashMap(); const geoSourceManager = { /** * Compatible with previous `echarts.registerMap`. * * @usage * ```js * * echarts.registerMap('USA', geoJson, specialAreas); * * echarts.registerMap('USA', { * geoJson: geoJson, * specialAreas: {...} * }); * echarts.registerMap('USA', { * geoJSON: geoJson, * specialAreas: {...} * }); * * echarts.registerMap('airport', { * svg: svg * } * ``` * * Note: * Do not support that register multiple geoJSON or SVG * one map name. Because different geoJSON and SVG have * different unit. It's not easy to make sure how those * units are mapping/normalize. * If intending to use multiple geoJSON or SVG, we can * use multiple geo coordinate system. */ registerMap: function(mapName, rawDef, rawSpecialAreas) { if (rawDef.svg) { var resource = new GeoSVGResource(mapName, rawDef.svg); storage.set(mapName, resource); } else { var geoJSON = rawDef.geoJson || rawDef.geoJSON; if (geoJSON && !rawDef.features) { rawSpecialAreas = rawDef.specialAreas; } else { geoJSON = rawDef; } var resource = new GeoJSONResource(mapName, geoJSON, rawSpecialAreas); storage.set(mapName, resource); } }, getGeoResource: function(mapName) { return storage.get(mapName); }, /** * Only for exporting to users. * **MUST NOT** used internally. */ getMapForUser: function(mapName) { var resource = storage.get(mapName); return resource && resource.type === "geoJSON" && resource.getMapForUser(); }, load: function(mapName, nameMap, nameProperty) { var resource = storage.get(mapName); if (!resource) { return; } return resource.load(nameMap, nameProperty); } }; var OPTION_STYLE_ENABLED_TAGS = ["rect", "circle", "line", "ellipse", "polygon", "polyline", "path"]; var OPTION_STYLE_ENABLED_TAG_MAP = createHashMap(OPTION_STYLE_ENABLED_TAGS); var STATE_TRIGGER_TAG_MAP = createHashMap(OPTION_STYLE_ENABLED_TAGS.concat(["g"])); var LABEL_HOST_MAP = createHashMap(OPTION_STYLE_ENABLED_TAGS.concat(["g"])); var mapLabelRaw = makeInner(); function getFixedItemStyle(model) { var itemStyle = model.getItemStyle(); var areaColor = model.get("areaColor"); if (areaColor != null) { itemStyle.fill = areaColor; } return itemStyle; } function fixLineStyle(styleHost) { var style = styleHost.style; if (style) { style.stroke = style.stroke || style.fill; style.fill = null; } } var MapDraw = ( /** @class */ (function() { function MapDraw2(api) { var group = new Group$3(); this.uid = getUID("ec_map_draw"); this._controller = new RoamController(api.getZr()); this._controllerHost = { target: group }; this.group = group; group.add(this._regionsGroup = new Group$3()); group.add(this._svgGroup = new Group$3()); } MapDraw2.prototype.draw = function(mapOrGeoModel, ecModel, api, fromView, payload) { var isGeo = mapOrGeoModel.mainType === "geo"; var data = mapOrGeoModel.getData && mapOrGeoModel.getData(); isGeo && ecModel.eachComponent({ mainType: "series", subType: "map" }, function(mapSeries) { if (!data && mapSeries.getHostGeoModel() === mapOrGeoModel) { data = mapSeries.getData(); } }); var geo = mapOrGeoModel.coordinateSystem; var regionsGroup = this._regionsGroup; var group = this.group; var transformInfo = geo.getTransformInfo(); var transformInfoRaw = transformInfo.raw; var transformInfoRoam = transformInfo.roam; var isFirstDraw = !regionsGroup.childAt(0) || payload; if (isFirstDraw) { group.x = transformInfoRoam.x; group.y = transformInfoRoam.y; group.scaleX = transformInfoRoam.scaleX; group.scaleY = transformInfoRoam.scaleY; group.dirty(); } else { updateProps$1(group, transformInfoRoam, mapOrGeoModel); } var isVisualEncodedByVisualMap = data && data.getVisual("visualMeta") && data.getVisual("visualMeta").length > 0; var viewBuildCtx = { api, geo, mapOrGeoModel, data, isVisualEncodedByVisualMap, isGeo, transformInfoRaw }; if (geo.resourceType === "geoJSON") { this._buildGeoJSON(viewBuildCtx); } else if (geo.resourceType === "geoSVG") { this._buildSVG(viewBuildCtx); } this._updateController(mapOrGeoModel, ecModel, api); this._updateMapSelectHandler(mapOrGeoModel, regionsGroup, api, fromView); }; MapDraw2.prototype._buildGeoJSON = function(viewBuildCtx) { var regionsGroupByName = this._regionsGroupByName = createHashMap(); var regionsInfoByName = createHashMap(); var regionsGroup = this._regionsGroup; var transformInfoRaw = viewBuildCtx.transformInfoRaw; var mapOrGeoModel = viewBuildCtx.mapOrGeoModel; var data = viewBuildCtx.data; var projection = viewBuildCtx.geo.projection; var projectionStream = projection && projection.stream; function transformPoint(point, project) { if (project) { point = project(point); } return point && [point[0] * transformInfoRaw.scaleX + transformInfoRaw.x, point[1] * transformInfoRaw.scaleY + transformInfoRaw.y]; } function transformPolygonPoints(inPoints) { var outPoints = []; var project = !projectionStream && projection && projection.project; for (var i = 0; i < inPoints.length; ++i) { var newPt = transformPoint(inPoints[i], project); newPt && outPoints.push(newPt); } return outPoints; } function getPolyShape(points2) { return { shape: { points: transformPolygonPoints(points2) } }; } regionsGroup.removeAll(); each$f(viewBuildCtx.geo.regions, function(region) { var regionName = region.name; var regionGroup = regionsGroupByName.get(regionName); var _a2 = regionsInfoByName.get(regionName) || {}, dataIdx = _a2.dataIdx, regionModel = _a2.regionModel; if (!regionGroup) { regionGroup = regionsGroupByName.set(regionName, new Group$3()); regionsGroup.add(regionGroup); dataIdx = data ? data.indexOfName(regionName) : null; regionModel = viewBuildCtx.isGeo ? mapOrGeoModel.getRegionModel(regionName) : data ? data.getItemModel(dataIdx) : null; var silent = regionModel.get("silent", true); silent != null && (regionGroup.silent = silent); regionsInfoByName.set(regionName, { dataIdx, regionModel }); } var polygonSubpaths = []; var polylineSubpaths = []; each$f(region.geometries, function(geometry) { if (geometry.type === "polygon") { var polys = [geometry.exterior].concat(geometry.interiors || []); if (projectionStream) { polys = projectPolys(polys, projectionStream); } each$f(polys, function(poly) { polygonSubpaths.push(new Polygon(getPolyShape(poly))); }); } else { var points2 = geometry.points; if (projectionStream) { points2 = projectPolys(points2, projectionStream, true); } each$f(points2, function(points3) { polylineSubpaths.push(new Polyline$1(getPolyShape(points3))); }); } }); var centerPt = transformPoint(region.getCenter(), projection && projection.project); function createCompoundPath(subpaths, isLine) { if (!subpaths.length) { return; } var compoundPath = new CompoundPath({ culling: true, segmentIgnoreThreshold: 1, shape: { paths: subpaths } }); regionGroup.add(compoundPath); applyOptionStyleForRegion(viewBuildCtx, compoundPath, dataIdx, regionModel); resetLabelForRegion(viewBuildCtx, compoundPath, regionName, regionModel, mapOrGeoModel, dataIdx, centerPt); if (isLine) { fixLineStyle(compoundPath); each$f(compoundPath.states, fixLineStyle); } } createCompoundPath(polygonSubpaths); createCompoundPath(polylineSubpaths, true); }); regionsGroupByName.each(function(regionGroup, regionName) { var _a2 = regionsInfoByName.get(regionName), dataIdx = _a2.dataIdx, regionModel = _a2.regionModel; resetEventTriggerForRegion(viewBuildCtx, regionGroup, regionName, regionModel, mapOrGeoModel, dataIdx); resetTooltipForRegion(viewBuildCtx, regionGroup, regionName, regionModel, mapOrGeoModel); resetStateTriggerForRegion(viewBuildCtx, regionGroup, regionName, regionModel, mapOrGeoModel); }, this); }; MapDraw2.prototype._buildSVG = function(viewBuildCtx) { var mapName = viewBuildCtx.geo.map; var transformInfoRaw = viewBuildCtx.transformInfoRaw; this._svgGroup.x = transformInfoRaw.x; this._svgGroup.y = transformInfoRaw.y; this._svgGroup.scaleX = transformInfoRaw.scaleX; this._svgGroup.scaleY = transformInfoRaw.scaleY; if (this._svgResourceChanged(mapName)) { this._freeSVG(); this._useSVG(mapName); } var svgDispatcherMap = this._svgDispatcherMap = createHashMap(); var focusSelf = false; each$f(this._svgGraphicRecord.named, function(namedItem) { var regionName = namedItem.name; var mapOrGeoModel = viewBuildCtx.mapOrGeoModel; var data = viewBuildCtx.data; var svgNodeTagLower = namedItem.svgNodeTagLower; var el = namedItem.el; var dataIdx = data ? data.indexOfName(regionName) : null; var regionModel = mapOrGeoModel.getRegionModel(regionName); if (OPTION_STYLE_ENABLED_TAG_MAP.get(svgNodeTagLower) != null && el instanceof Displayable) { applyOptionStyleForRegion(viewBuildCtx, el, dataIdx, regionModel); } if (el instanceof Displayable) { el.culling = true; } var silent = regionModel.get("silent", true); silent != null && (el.silent = silent); el.z2EmphasisLift = 0; if (!namedItem.namedFrom) { if (LABEL_HOST_MAP.get(svgNodeTagLower) != null) { resetLabelForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel, dataIdx, null); } resetEventTriggerForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel, dataIdx); resetTooltipForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel); if (STATE_TRIGGER_TAG_MAP.get(svgNodeTagLower) != null) { var focus_1 = resetStateTriggerForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel); if (focus_1 === "self") { focusSelf = true; } var els = svgDispatcherMap.get(regionName) || svgDispatcherMap.set(regionName, []); els.push(el); } } }, this); this._enableBlurEntireSVG(focusSelf, viewBuildCtx); }; MapDraw2.prototype._enableBlurEntireSVG = function(focusSelf, viewBuildCtx) { if (focusSelf && viewBuildCtx.isGeo) { var blurStyle = viewBuildCtx.mapOrGeoModel.getModel(["blur", "itemStyle"]).getItemStyle(); var opacity_1 = blurStyle.opacity; this._svgGraphicRecord.root.traverse(function(el) { if (!el.isGroup) { setDefaultStateProxy(el); var style = el.ensureState("blur").style || {}; if (style.opacity == null && opacity_1 != null) { style.opacity = opacity_1; } el.ensureState("emphasis"); } }); } }; MapDraw2.prototype.remove = function() { this._regionsGroup.removeAll(); this._regionsGroupByName = null; this._svgGroup.removeAll(); this._freeSVG(); this._controller.dispose(); this._controllerHost = null; }; MapDraw2.prototype.findHighDownDispatchers = function(name, geoModel) { if (name == null) { return []; } var geo = geoModel.coordinateSystem; if (geo.resourceType === "geoJSON") { var regionsGroupByName = this._regionsGroupByName; if (regionsGroupByName) { var regionGroup = regionsGroupByName.get(name); return regionGroup ? [regionGroup] : []; } } else if (geo.resourceType === "geoSVG") { return this._svgDispatcherMap && this._svgDispatcherMap.get(name) || []; } }; MapDraw2.prototype._svgResourceChanged = function(mapName) { return this._svgMapName !== mapName; }; MapDraw2.prototype._useSVG = function(mapName) { var resource = geoSourceManager.getGeoResource(mapName); if (resource && resource.type === "geoSVG") { var svgGraphic = resource.useGraphic(this.uid); this._svgGroup.add(svgGraphic.root); this._svgGraphicRecord = svgGraphic; this._svgMapName = mapName; } }; MapDraw2.prototype._freeSVG = function() { var mapName = this._svgMapName; if (mapName == null) { return; } var resource = geoSourceManager.getGeoResource(mapName); if (resource && resource.type === "geoSVG") { resource.freeGraphic(this.uid); } this._svgGraphicRecord = null; this._svgDispatcherMap = null; this._svgGroup.removeAll(); this._svgMapName = null; }; MapDraw2.prototype._updateController = function(mapOrGeoModel, ecModel, api) { var geo = mapOrGeoModel.coordinateSystem; var controller = this._controller; var controllerHost = this._controllerHost; controllerHost.zoomLimit = mapOrGeoModel.get("scaleLimit"); controllerHost.zoom = geo.getZoom(); controller.enable(mapOrGeoModel.get("roam") || false); var mainType = mapOrGeoModel.mainType; function makeActionBase() { var action = { type: "geoRoam", componentType: mainType }; action[mainType + "Id"] = mapOrGeoModel.id; return action; } controller.off("pan").on("pan", function(e) { this._mouseDownFlag = false; updateViewOnPan(controllerHost, e.dx, e.dy); api.dispatchAction(extend(makeActionBase(), { dx: e.dx, dy: e.dy, animation: { duration: 0 } })); }, this); controller.off("zoom").on("zoom", function(e) { this._mouseDownFlag = false; updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY); api.dispatchAction(extend(makeActionBase(), { totalZoom: controllerHost.zoom, zoom: e.scale, originX: e.originX, originY: e.originY, animation: { duration: 0 } })); }, this); controller.setPointerChecker(function(e, x, y) { return geo.containPoint([x, y]) && !onIrrelevantElement(e, api, mapOrGeoModel); }); }; MapDraw2.prototype.resetForLabelLayout = function() { this.group.traverse(function(el) { var label = el.getTextContent(); if (label) { label.ignore = mapLabelRaw(label).ignore; } }); }; MapDraw2.prototype._updateMapSelectHandler = function(mapOrGeoModel, regionsGroup, api, fromView) { var mapDraw = this; regionsGroup.off("mousedown"); regionsGroup.off("click"); if (mapOrGeoModel.get("selectedMode")) { regionsGroup.on("mousedown", function() { mapDraw._mouseDownFlag = true; }); regionsGroup.on("click", function(e) { if (!mapDraw._mouseDownFlag) { return; } mapDraw._mouseDownFlag = false; }); } }; return MapDraw2; })() ); function applyOptionStyleForRegion(viewBuildCtx, el, dataIndex, regionModel) { var normalStyleModel = regionModel.getModel("itemStyle"); var emphasisStyleModel = regionModel.getModel(["emphasis", "itemStyle"]); var blurStyleModel = regionModel.getModel(["blur", "itemStyle"]); var selectStyleModel = regionModel.getModel(["select", "itemStyle"]); var normalStyle = getFixedItemStyle(normalStyleModel); var emphasisStyle = getFixedItemStyle(emphasisStyleModel); var selectStyle = getFixedItemStyle(selectStyleModel); var blurStyle = getFixedItemStyle(blurStyleModel); var data = viewBuildCtx.data; if (data) { var style = data.getItemVisual(dataIndex, "style"); var decal = data.getItemVisual(dataIndex, "decal"); if (viewBuildCtx.isVisualEncodedByVisualMap && style.fill) { normalStyle.fill = style.fill; } if (decal) { normalStyle.decal = createOrUpdatePatternFromDecal(decal, viewBuildCtx.api); } } el.setStyle(normalStyle); el.style.strokeNoScale = true; el.ensureState("emphasis").style = emphasisStyle; el.ensureState("select").style = selectStyle; el.ensureState("blur").style = blurStyle; setDefaultStateProxy(el); } function resetLabelForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel, dataIdx, labelXY) { var data = viewBuildCtx.data; var isGeo = viewBuildCtx.isGeo; var isDataNaN = data && isNaN(data.get(data.mapDimension("value"), dataIdx)); var itemLayout = data && data.getItemLayout(dataIdx); if (isGeo || isDataNaN || itemLayout && itemLayout.showLabel) { var query = !isGeo ? dataIdx : regionName; var labelFetcher = void 0; if (!data || dataIdx >= 0) { labelFetcher = mapOrGeoModel; } var specifiedTextOpt = labelXY ? { normal: { align: "center", verticalAlign: "middle" } } : null; setLabelStyle(el, getLabelStatesModels(regionModel), { labelFetcher, labelDataIndex: query, defaultText: regionName }, specifiedTextOpt); var textEl = el.getTextContent(); if (textEl) { mapLabelRaw(textEl).ignore = textEl.ignore; if (el.textConfig && labelXY) { var rect = el.getBoundingRect().clone(); el.textConfig.layoutRect = rect; el.textConfig.position = [(labelXY[0] - rect.x) / rect.width * 100 + "%", (labelXY[1] - rect.y) / rect.height * 100 + "%"]; } } el.disableLabelAnimation = true; } else { el.removeTextContent(); el.removeTextConfig(); el.disableLabelAnimation = null; } } function resetEventTriggerForRegion(viewBuildCtx, eventTrigger, regionName, regionModel, mapOrGeoModel, dataIdx) { if (viewBuildCtx.data) { viewBuildCtx.data.setItemGraphicEl(dataIdx, eventTrigger); } else { getECData(eventTrigger).eventData = { componentType: "geo", componentIndex: mapOrGeoModel.componentIndex, geoIndex: mapOrGeoModel.componentIndex, name: regionName, region: regionModel && regionModel.option || {} }; } } function resetTooltipForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel) { if (!viewBuildCtx.data) { setTooltipConfig({ el, componentModel: mapOrGeoModel, itemName: regionName, // @ts-ignore FIXME:TS fix the "compatible with each other"? itemTooltipOption: regionModel.get("tooltip") }); } } function resetStateTriggerForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel) { el.highDownSilentOnTouch = !!mapOrGeoModel.get("selectedMode"); var emphasisModel = regionModel.getModel("emphasis"); var focus = emphasisModel.get("focus"); toggleHoverEmphasis(el, focus, emphasisModel.get("blurScope"), emphasisModel.get("disabled")); if (viewBuildCtx.isGeo) { enableComponentHighDownFeatures(el, mapOrGeoModel, regionName); } return focus; } function projectPolys(rings, createStream, isLine) { var polygons = []; var curPoly; function startPolygon() { curPoly = []; } function endPolygon() { if (curPoly.length) { polygons.push(curPoly); curPoly = []; } } var stream = createStream({ polygonStart: startPolygon, polygonEnd: endPolygon, lineStart: startPolygon, lineEnd: endPolygon, point: function(x, y) { if (isFinite(x) && isFinite(y)) { curPoly.push([x, y]); } }, sphere: function() { } }); !isLine && stream.polygonStart(); each$f(rings, function(ring) { stream.lineStart(); for (var i = 0; i < ring.length; i++) { stream.point(ring[i][0], ring[i][1]); } stream.lineEnd(); }); !isLine && stream.polygonEnd(); return polygons; } var MapView = ( /** @class */ (function(_super) { __extends(MapView2, _super); function MapView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = MapView2.type; return _this; } MapView2.prototype.render = function(mapModel, ecModel, api, payload) { if (payload && payload.type === "mapToggleSelect" && payload.from === this.uid) { return; } var group = this.group; group.removeAll(); if (mapModel.getHostGeoModel()) { return; } if (this._mapDraw && payload && payload.type === "geoRoam") { this._mapDraw.resetForLabelLayout(); } if (!(payload && payload.type === "geoRoam" && payload.componentType === "series" && payload.seriesId === mapModel.id)) { if (mapModel.needsDrawMap) { var mapDraw = this._mapDraw || new MapDraw(api); group.add(mapDraw.group); mapDraw.draw(mapModel, ecModel, api, this, payload); this._mapDraw = mapDraw; } else { this._mapDraw && this._mapDraw.remove(); this._mapDraw = null; } } else { var mapDraw = this._mapDraw; mapDraw && group.add(mapDraw.group); } mapModel.get("showLegendSymbol") && ecModel.getComponent("legend") && this._renderSymbols(mapModel, ecModel, api); }; MapView2.prototype.remove = function() { this._mapDraw && this._mapDraw.remove(); this._mapDraw = null; this.group.removeAll(); }; MapView2.prototype.dispose = function() { this._mapDraw && this._mapDraw.remove(); this._mapDraw = null; }; MapView2.prototype._renderSymbols = function(mapModel, ecModel, api) { var originalData = mapModel.originalData; var group = this.group; originalData.each(originalData.mapDimension("value"), function(value, originalDataIndex) { if (isNaN(value)) { return; } var layout2 = originalData.getItemLayout(originalDataIndex); if (!layout2 || !layout2.point) { return; } var point = layout2.point; var offset = layout2.offset; var circle = new Circle({ style: { // Because the special of map draw. // Which needs statistic of multiple series and draw on one map. // And each series also need a symbol with legend color // // Layout and visual are put one the different data // TODO fill: mapModel.getData().getVisual("style").fill }, shape: { cx: point[0] + offset * 9, cy: point[1], r: 3 }, silent: true, // Do not overlap the first series, on which labels are displayed. z2: 8 + (!offset ? Z2_EMPHASIS_LIFT + 1 : 0) }); if (!offset) { var fullData = mapModel.mainSeries.getData(); var name_1 = originalData.getName(originalDataIndex); var fullIndex_1 = fullData.indexOfName(name_1); var itemModel = originalData.getItemModel(originalDataIndex); var labelModel = itemModel.getModel("label"); var regionGroup = fullData.getItemGraphicEl(fullIndex_1); setLabelStyle(circle, getLabelStatesModels(itemModel), { labelFetcher: { getFormattedLabel: function(idx, state) { return mapModel.getFormattedLabel(fullIndex_1, state); } }, defaultText: name_1 }); circle.disableLabelAnimation = true; if (!labelModel.get("position")) { circle.setTextConfig({ position: "bottom" }); } regionGroup.onHoverStateChange = function(toState) { setStatesFlag(circle, toState); }; } group.add(circle); }); }; MapView2.type = "map"; return MapView2; })(ChartView) ); var MapSeries = ( /** @class */ (function(_super) { __extends(MapSeries2, _super); function MapSeries2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = MapSeries2.type; _this.needsDrawMap = false; _this.seriesGroup = []; _this.getTooltipPosition = function(dataIndex) { if (dataIndex != null) { var name_1 = this.getData().getName(dataIndex); var geo = this.coordinateSystem; var region = geo.getRegion(name_1); return region && geo.dataToPoint(region.getCenter()); } }; return _this; } MapSeries2.prototype.getInitialData = function(option) { var data = createSeriesDataSimply(this, { coordDimensions: ["value"], encodeDefaulter: curry$1(makeSeriesEncodeForNameBased, this) }); var dataNameIndexMap = createHashMap(); var toAppendItems = []; for (var i = 0, len2 = data.count(); i < len2; i++) { var name_2 = data.getName(i); dataNameIndexMap.set(name_2, i); } var geoSource = geoSourceManager.load(this.getMapType(), this.option.nameMap, this.option.nameProperty); each$f(geoSource.regions, function(region) { var name = region.name; var dataNameIdx = dataNameIndexMap.get(name); var specifiedGeoJSONRegionStyle = region.properties && region.properties.echartsStyle; var dataItem; if (dataNameIdx == null) { dataItem = { name }; toAppendItems.push(dataItem); } else { dataItem = data.getRawDataItem(dataNameIdx); } specifiedGeoJSONRegionStyle && merge(dataItem, specifiedGeoJSONRegionStyle); }); data.appendData(toAppendItems); return data; }; MapSeries2.prototype.getHostGeoModel = function() { var geoIndex = this.option.geoIndex; return geoIndex != null ? this.ecModel.getComponent("geo", geoIndex) : null; }; MapSeries2.prototype.getMapType = function() { return (this.getHostGeoModel() || this).option.map; }; MapSeries2.prototype.getRawValue = function(dataIndex) { var data = this.getData(); return data.get(data.mapDimension("value"), dataIndex); }; MapSeries2.prototype.getRegionModel = function(regionName) { var data = this.getData(); return data.getItemModel(data.indexOfName(regionName)); }; MapSeries2.prototype.formatTooltip = function(dataIndex, multipleSeries, dataType) { var data = this.getData(); var value = this.getRawValue(dataIndex); var name = data.getName(dataIndex); var seriesGroup = this.seriesGroup; var seriesNames = []; for (var i = 0; i < seriesGroup.length; i++) { var otherIndex = seriesGroup[i].originalData.indexOfName(name); var valueDim = data.mapDimension("value"); if (!isNaN(seriesGroup[i].originalData.get(valueDim, otherIndex))) { seriesNames.push(seriesGroup[i].name); } } return createTooltipMarkup("section", { header: seriesNames.join(", "), noHeader: !seriesNames.length, blocks: [createTooltipMarkup("nameValue", { name, value })] }); }; MapSeries2.prototype.setZoom = function(zoom) { this.option.zoom = zoom; }; MapSeries2.prototype.setCenter = function(center2) { this.option.center = center2; }; MapSeries2.prototype.getLegendIcon = function(opt) { var iconType = opt.icon || "roundRect"; var icon = createSymbol$1(iconType, 0, 0, opt.itemWidth, opt.itemHeight, opt.itemStyle.fill); icon.setStyle(opt.itemStyle); icon.style.stroke = "none"; if (iconType.indexOf("empty") > -1) { icon.style.stroke = icon.style.fill; icon.style.fill = "#fff"; icon.style.lineWidth = 2; } return icon; }; MapSeries2.type = "series.map"; MapSeries2.dependencies = ["geo"]; MapSeries2.layoutMode = "box"; MapSeries2.defaultOption = { // 一级层叠 // zlevel: 0, // 二级层叠 z: 2, coordinateSystem: "geo", // map should be explicitly specified since ec3. map: "", // If `geoIndex` is not specified, a exclusive geo will be // created. Otherwise use the specified geo component, and // `map` and `mapType` are ignored. // geoIndex: 0, // 'center' | 'left' | 'right' | 'x%' | {number} left: "center", // 'center' | 'top' | 'bottom' | 'x%' | {number} top: "center", // right // bottom // width: // height // Aspect is width / height. Inited to be geoJson bbox aspect // This parameter is used for scale this aspect // Default value: // for geoSVG source: 1, // for geoJSON source: 0.75. aspectScale: null, // Layout with center and size // If you want to put map in a fixed size box with right aspect ratio // This two properties may be more convenient. // layoutCenter: [50%, 50%] // layoutSize: 100 showLegendSymbol: true, // Define left-top, right-bottom coords to control view // For example, [ [180, 90], [-180, -90] ], // higher priority than center and zoom boundingCoords: null, // Default on center of map center: null, zoom: 1, scaleLimit: null, selectedMode: true, label: { show: false, color: "#000" }, // scaleLimit: null, itemStyle: { borderWidth: 0.5, borderColor: "#444", areaColor: "#eee" }, emphasis: { label: { show: true, color: "rgb(100,0,0)" }, itemStyle: { areaColor: "rgba(255,215,0,0.8)" } }, select: { label: { show: true, color: "rgb(100,0,0)" }, itemStyle: { color: "rgba(255,215,0,0.8)" } }, nameProperty: "name" }; return MapSeries2; })(SeriesModel) ); function dataStatistics(datas, statisticType) { var dataNameMap = {}; each$f(datas, function(data) { data.each(data.mapDimension("value"), function(value, idx) { var mapKey = "ec-" + data.getName(idx); dataNameMap[mapKey] = dataNameMap[mapKey] || []; if (!isNaN(value)) { dataNameMap[mapKey].push(value); } }); }); return datas[0].map(datas[0].mapDimension("value"), function(value, idx) { var mapKey = "ec-" + datas[0].getName(idx); var sum2 = 0; var min2 = Infinity; var max2 = -Infinity; var len2 = dataNameMap[mapKey].length; for (var i = 0; i < len2; i++) { min2 = Math.min(min2, dataNameMap[mapKey][i]); max2 = Math.max(max2, dataNameMap[mapKey][i]); sum2 += dataNameMap[mapKey][i]; } var result; if (statisticType === "min") { result = min2; } else if (statisticType === "max") { result = max2; } else if (statisticType === "average") { result = sum2 / len2; } else { result = sum2; } return len2 === 0 ? NaN : result; }); } function mapDataStatistic(ecModel) { var seriesGroups = {}; ecModel.eachSeriesByType("map", function(seriesModel) { var hostGeoModel = seriesModel.getHostGeoModel(); var key = hostGeoModel ? "o" + hostGeoModel.id : "i" + seriesModel.getMapType(); (seriesGroups[key] = seriesGroups[key] || []).push(seriesModel); }); each$f(seriesGroups, function(seriesList, key) { var data = dataStatistics(map$1(seriesList, function(seriesModel) { return seriesModel.getData(); }), seriesList[0].get("mapValueCalculation")); for (var i = 0; i < seriesList.length; i++) { seriesList[i].originalData = seriesList[i].getData(); } for (var i = 0; i < seriesList.length; i++) { seriesList[i].seriesGroup = seriesList; seriesList[i].needsDrawMap = i === 0 && !seriesList[i].getHostGeoModel(); seriesList[i].setData(data.cloneShallow()); seriesList[i].mainSeries = seriesList[0]; } }); } function mapSymbolLayout(ecModel) { var processedMapType = {}; ecModel.eachSeriesByType("map", function(mapSeries) { var mapType = mapSeries.getMapType(); if (mapSeries.getHostGeoModel() || processedMapType[mapType]) { return; } var mapSymbolOffsets = {}; each$f(mapSeries.seriesGroup, function(subMapSeries) { var geo = subMapSeries.coordinateSystem; var data2 = subMapSeries.originalData; if (subMapSeries.get("showLegendSymbol") && ecModel.getComponent("legend")) { data2.each(data2.mapDimension("value"), function(value, idx) { var name = data2.getName(idx); var region = geo.getRegion(name); if (!region || isNaN(value)) { return; } var offset = mapSymbolOffsets[name] || 0; var point = geo.dataToPoint(region.getCenter()); mapSymbolOffsets[name] = offset + 1; data2.setItemLayout(idx, { point, offset }); }); } }); var data = mapSeries.getData(); data.each(function(idx) { var name = data.getName(idx); var layout2 = data.getItemLayout(idx) || {}; layout2.showLabel = !mapSymbolOffsets[name]; data.setItemLayout(idx, layout2); }); processedMapType[mapType] = true; }); } var v2ApplyTransform = applyTransform$1; var View = ( /** @class */ (function(_super) { __extends(View2, _super); function View2(name) { var _this = _super.call(this) || this; _this.type = "view"; _this.dimensions = ["x", "y"]; _this._roamTransformable = new Transformable(); _this._rawTransformable = new Transformable(); _this.name = name; return _this; } View2.prototype.setBoundingRect = function(x, y, width, height) { this._rect = new BoundingRect(x, y, width, height); return this._rect; }; View2.prototype.getBoundingRect = function() { return this._rect; }; View2.prototype.setViewRect = function(x, y, width, height) { this._transformTo(x, y, width, height); this._viewRect = new BoundingRect(x, y, width, height); }; View2.prototype._transformTo = function(x, y, width, height) { var rect = this.getBoundingRect(); var rawTransform = this._rawTransformable; rawTransform.transform = rect.calculateTransform(new BoundingRect(x, y, width, height)); var rawParent = rawTransform.parent; rawTransform.parent = null; rawTransform.decomposeTransform(); rawTransform.parent = rawParent; this._updateTransform(); }; View2.prototype.setCenter = function(centerCoord, api) { if (!centerCoord) { return; } this._center = [parsePercent(centerCoord[0], api.getWidth()), parsePercent(centerCoord[1], api.getHeight())]; this._updateCenterAndZoom(); }; View2.prototype.setZoom = function(zoom) { zoom = zoom || 1; var zoomLimit = this.zoomLimit; if (zoomLimit) { if (zoomLimit.max != null) { zoom = Math.min(zoomLimit.max, zoom); } if (zoomLimit.min != null) { zoom = Math.max(zoomLimit.min, zoom); } } this._zoom = zoom; this._updateCenterAndZoom(); }; View2.prototype.getDefaultCenter = function() { var rawRect = this.getBoundingRect(); var cx = rawRect.x + rawRect.width / 2; var cy = rawRect.y + rawRect.height / 2; return [cx, cy]; }; View2.prototype.getCenter = function() { return this._center || this.getDefaultCenter(); }; View2.prototype.getZoom = function() { return this._zoom || 1; }; View2.prototype.getRoamTransform = function() { return this._roamTransformable.getLocalTransform(); }; View2.prototype._updateCenterAndZoom = function() { var rawTransformMatrix = this._rawTransformable.getLocalTransform(); var roamTransform = this._roamTransformable; var defaultCenter = this.getDefaultCenter(); var center2 = this.getCenter(); var zoom = this.getZoom(); center2 = applyTransform$1([], center2, rawTransformMatrix); defaultCenter = applyTransform$1([], defaultCenter, rawTransformMatrix); roamTransform.originX = center2[0]; roamTransform.originY = center2[1]; roamTransform.x = defaultCenter[0] - center2[0]; roamTransform.y = defaultCenter[1] - center2[1]; roamTransform.scaleX = roamTransform.scaleY = zoom; this._updateTransform(); }; View2.prototype._updateTransform = function() { var roamTransformable = this._roamTransformable; var rawTransformable = this._rawTransformable; rawTransformable.parent = roamTransformable; roamTransformable.updateTransform(); rawTransformable.updateTransform(); copy(this.transform || (this.transform = []), rawTransformable.transform || create$1()); this._rawTransform = rawTransformable.getLocalTransform(); this.invTransform = this.invTransform || []; invert(this.invTransform, this.transform); this.decomposeTransform(); }; View2.prototype.getTransformInfo = function() { var rawTransformable = this._rawTransformable; var roamTransformable = this._roamTransformable; var dummyTransformable2 = new Transformable(); dummyTransformable2.transform = roamTransformable.transform; dummyTransformable2.decomposeTransform(); return { roam: { x: dummyTransformable2.x, y: dummyTransformable2.y, scaleX: dummyTransformable2.scaleX, scaleY: dummyTransformable2.scaleY }, raw: { x: rawTransformable.x, y: rawTransformable.y, scaleX: rawTransformable.scaleX, scaleY: rawTransformable.scaleY } }; }; View2.prototype.getViewRect = function() { return this._viewRect; }; View2.prototype.getViewRectAfterRoam = function() { var rect = this.getBoundingRect().clone(); rect.applyTransform(this.transform); return rect; }; View2.prototype.dataToPoint = function(data, noRoam, out) { var transform2 = noRoam ? this._rawTransform : this.transform; out = out || []; return transform2 ? v2ApplyTransform(out, data, transform2) : copy$1(out, data); }; View2.prototype.pointToData = function(point) { var invTransform = this.invTransform; return invTransform ? v2ApplyTransform([], point, invTransform) : [point[0], point[1]]; }; View2.prototype.convertToPixel = function(ecModel, finder, value) { var coordSys = getCoordSys$4(finder); return coordSys === this ? coordSys.dataToPoint(value) : null; }; View2.prototype.convertFromPixel = function(ecModel, finder, pixel) { var coordSys = getCoordSys$4(finder); return coordSys === this ? coordSys.pointToData(pixel) : null; }; View2.prototype.containPoint = function(point) { return this.getViewRectAfterRoam().contain(point[0], point[1]); }; View2.dimensions = ["x", "y"]; return View2; })(Transformable) ); function getCoordSys$4(finder) { var seriesModel = finder.seriesModel; return seriesModel ? seriesModel.coordinateSystem : null; } var GEO_DEFAULT_PARAMS = { "geoJSON": { aspectScale: 0.75, invertLongitute: true }, "geoSVG": { aspectScale: 1, invertLongitute: false } }; var geo2DDimensions = ["lng", "lat"]; var Geo = ( /** @class */ (function(_super) { __extends(Geo2, _super); function Geo2(name, map2, opt) { var _this = _super.call(this, name) || this; _this.dimensions = geo2DDimensions; _this.type = "geo"; _this._nameCoordMap = createHashMap(); _this.map = map2; var projection = opt.projection; var source = geoSourceManager.load(map2, opt.nameMap, opt.nameProperty); var resource = geoSourceManager.getGeoResource(map2); _this.resourceType = resource ? resource.type : null; var regions = _this.regions = source.regions; var defaultParams = GEO_DEFAULT_PARAMS[resource.type]; _this._regionsMap = source.regionsMap; _this.regions = source.regions; _this.projection = projection; var boundingRect; if (projection) { for (var i = 0; i < regions.length; i++) { var regionRect = regions[i].getBoundingRect(projection); boundingRect = boundingRect || regionRect.clone(); boundingRect.union(regionRect); } } else { boundingRect = source.boundingRect; } _this.setBoundingRect(boundingRect.x, boundingRect.y, boundingRect.width, boundingRect.height); _this.aspectScale = projection ? 1 : retrieve2(opt.aspectScale, defaultParams.aspectScale); _this._invertLongitute = projection ? false : defaultParams.invertLongitute; return _this; } Geo2.prototype._transformTo = function(x, y, width, height) { var rect = this.getBoundingRect(); var invertLongitute = this._invertLongitute; rect = rect.clone(); if (invertLongitute) { rect.y = -rect.y - rect.height; } var rawTransformable = this._rawTransformable; rawTransformable.transform = rect.calculateTransform(new BoundingRect(x, y, width, height)); var rawParent = rawTransformable.parent; rawTransformable.parent = null; rawTransformable.decomposeTransform(); rawTransformable.parent = rawParent; if (invertLongitute) { rawTransformable.scaleY = -rawTransformable.scaleY; } this._updateTransform(); }; Geo2.prototype.getRegion = function(name) { return this._regionsMap.get(name); }; Geo2.prototype.getRegionByCoord = function(coord) { var regions = this.regions; for (var i = 0; i < regions.length; i++) { var region = regions[i]; if (region.type === "geoJSON" && region.contain(coord)) { return regions[i]; } } }; Geo2.prototype.addGeoCoord = function(name, geoCoord2) { this._nameCoordMap.set(name, geoCoord2); }; Geo2.prototype.getGeoCoord = function(name) { var region = this._regionsMap.get(name); return this._nameCoordMap.get(name) || region && region.getCenter(); }; Geo2.prototype.dataToPoint = function(data, noRoam, out) { if (isString(data)) { data = this.getGeoCoord(data); } if (data) { var projection = this.projection; if (projection) { data = projection.project(data); } return data && this.projectedToPoint(data, noRoam, out); } }; Geo2.prototype.pointToData = function(point) { var projection = this.projection; if (projection) { point = projection.unproject(point); } return point && this.pointToProjected(point); }; Geo2.prototype.pointToProjected = function(point) { return _super.prototype.pointToData.call(this, point); }; Geo2.prototype.projectedToPoint = function(projected, noRoam, out) { return _super.prototype.dataToPoint.call(this, projected, noRoam, out); }; Geo2.prototype.convertToPixel = function(ecModel, finder, value) { var coordSys = getCoordSys$3(finder); return coordSys === this ? coordSys.dataToPoint(value) : null; }; Geo2.prototype.convertFromPixel = function(ecModel, finder, pixel) { var coordSys = getCoordSys$3(finder); return coordSys === this ? coordSys.pointToData(pixel) : null; }; return Geo2; })(View) ); mixin(Geo, View); function getCoordSys$3(finder) { var geoModel = finder.geoModel; var seriesModel = finder.seriesModel; return geoModel ? geoModel.coordinateSystem : seriesModel ? seriesModel.coordinateSystem || (seriesModel.getReferringComponents("geo", SINGLE_REFERRING).models[0] || {}).coordinateSystem : null; } function resizeGeo(geoModel, api) { var boundingCoords = geoModel.get("boundingCoords"); if (boundingCoords != null) { var leftTop_1 = boundingCoords[0]; var rightBottom_1 = boundingCoords[1]; if (!(isFinite(leftTop_1[0]) && isFinite(leftTop_1[1]) && isFinite(rightBottom_1[0]) && isFinite(rightBottom_1[1]))) ; else { var projection_1 = this.projection; if (projection_1) { var xMin = leftTop_1[0]; var yMin = leftTop_1[1]; var xMax = rightBottom_1[0]; var yMax = rightBottom_1[1]; leftTop_1 = [Infinity, Infinity]; rightBottom_1 = [-Infinity, -Infinity]; var sampleLine = function(x0, y0, x1, y1) { var dx = x1 - x0; var dy = y1 - y0; for (var i = 0; i <= 100; i++) { var p = i / 100; var pt = projection_1.project([x0 + dx * p, y0 + dy * p]); min(leftTop_1, leftTop_1, pt); max(rightBottom_1, rightBottom_1, pt); } }; sampleLine(xMin, yMin, xMax, yMin); sampleLine(xMax, yMin, xMax, yMax); sampleLine(xMax, yMax, xMin, yMax); sampleLine(xMin, yMax, xMax, yMin); } this.setBoundingRect(leftTop_1[0], leftTop_1[1], rightBottom_1[0] - leftTop_1[0], rightBottom_1[1] - leftTop_1[1]); } } var rect = this.getBoundingRect(); var centerOption = geoModel.get("layoutCenter"); var sizeOption = geoModel.get("layoutSize"); var viewWidth = api.getWidth(); var viewHeight = api.getHeight(); var aspect = rect.width / rect.height * this.aspectScale; var useCenterAndSize = false; var center2; var size; if (centerOption && sizeOption) { center2 = [parsePercent(centerOption[0], viewWidth), parsePercent(centerOption[1], viewHeight)]; size = parsePercent(sizeOption, Math.min(viewWidth, viewHeight)); if (!isNaN(center2[0]) && !isNaN(center2[1]) && !isNaN(size)) { useCenterAndSize = true; } } var viewRect; if (useCenterAndSize) { viewRect = {}; if (aspect > 1) { viewRect.width = size; viewRect.height = size / aspect; } else { viewRect.height = size; viewRect.width = size * aspect; } viewRect.y = center2[1] - viewRect.height / 2; viewRect.x = center2[0] - viewRect.width / 2; } else { var boxLayoutOption = geoModel.getBoxLayoutParams(); boxLayoutOption.aspect = aspect; viewRect = getLayoutRect(boxLayoutOption, { width: viewWidth, height: viewHeight }); } this.setViewRect(viewRect.x, viewRect.y, viewRect.width, viewRect.height); this.setCenter(geoModel.get("center"), api); this.setZoom(geoModel.get("zoom")); } function setGeoCoords(geo, model) { each$f(model.get("geoCoord"), function(geoCoord2, name) { geo.addGeoCoord(name, geoCoord2); }); } var GeoCreator = ( /** @class */ (function() { function GeoCreator2() { this.dimensions = geo2DDimensions; } GeoCreator2.prototype.create = function(ecModel, api) { var geoList = []; function getCommonGeoProperties(model) { return { nameProperty: model.get("nameProperty"), aspectScale: model.get("aspectScale"), projection: model.get("projection") }; } ecModel.eachComponent("geo", function(geoModel, idx) { var mapName = geoModel.get("map"); var geo = new Geo(mapName + idx, mapName, extend({ nameMap: geoModel.get("nameMap") }, getCommonGeoProperties(geoModel))); geo.zoomLimit = geoModel.get("scaleLimit"); geoList.push(geo); geoModel.coordinateSystem = geo; geo.model = geoModel; geo.resize = resizeGeo; geo.resize(geoModel, api); }); ecModel.eachSeries(function(seriesModel) { var coordSys = seriesModel.get("coordinateSystem"); if (coordSys === "geo") { var geoIndex = seriesModel.get("geoIndex") || 0; seriesModel.coordinateSystem = geoList[geoIndex]; } }); var mapModelGroupBySeries = {}; ecModel.eachSeriesByType("map", function(seriesModel) { if (!seriesModel.getHostGeoModel()) { var mapType = seriesModel.getMapType(); mapModelGroupBySeries[mapType] = mapModelGroupBySeries[mapType] || []; mapModelGroupBySeries[mapType].push(seriesModel); } }); each$f(mapModelGroupBySeries, function(mapSeries, mapType) { var nameMapList = map$1(mapSeries, function(singleMapSeries) { return singleMapSeries.get("nameMap"); }); var geo = new Geo(mapType, mapType, extend({ nameMap: mergeAll(nameMapList) }, getCommonGeoProperties(mapSeries[0]))); geo.zoomLimit = retrieve.apply(null, map$1(mapSeries, function(singleMapSeries) { return singleMapSeries.get("scaleLimit"); })); geoList.push(geo); geo.resize = resizeGeo; geo.resize(mapSeries[0], api); each$f(mapSeries, function(singleMapSeries) { singleMapSeries.coordinateSystem = geo; setGeoCoords(geo, singleMapSeries); }); }); return geoList; }; GeoCreator2.prototype.getFilledRegions = function(originRegionArr, mapName, nameMap, nameProperty) { var regionsArr = (originRegionArr || []).slice(); var dataNameMap = createHashMap(); for (var i = 0; i < regionsArr.length; i++) { dataNameMap.set(regionsArr[i].name, regionsArr[i]); } var source = geoSourceManager.load(mapName, nameMap, nameProperty); each$f(source.regions, function(region) { var name = region.name; var regionOption = dataNameMap.get(name); var specifiedGeoJSONRegionStyle = region.properties && region.properties.echartsStyle; if (!regionOption) { regionOption = { name }; regionsArr.push(regionOption); } specifiedGeoJSONRegionStyle && merge(regionOption, specifiedGeoJSONRegionStyle); }); return regionsArr; }; return GeoCreator2; })() ); var geoCreator = new GeoCreator(); var GeoModel = ( /** @class */ (function(_super) { __extends(GeoModel2, _super); function GeoModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = GeoModel2.type; return _this; } GeoModel2.prototype.init = function(option, parentModel, ecModel) { var source = geoSourceManager.getGeoResource(option.map); if (source && source.type === "geoJSON") { var itemStyle = option.itemStyle = option.itemStyle || {}; if (!("color" in itemStyle)) { itemStyle.color = "#eee"; } } this.mergeDefaultAndTheme(option, ecModel); defaultEmphasis(option, "label", ["show"]); }; GeoModel2.prototype.optionUpdated = function() { var _this = this; var option = this.option; option.regions = geoCreator.getFilledRegions(option.regions, option.map, option.nameMap, option.nameProperty); var selectedMap = {}; this._optionModelMap = reduce(option.regions || [], function(optionModelMap, regionOpt) { var regionName = regionOpt.name; if (regionName) { optionModelMap.set(regionName, new Model(regionOpt, _this, _this.ecModel)); if (regionOpt.selected) { selectedMap[regionName] = true; } } return optionModelMap; }, createHashMap()); if (!option.selectedMap) { option.selectedMap = selectedMap; } }; GeoModel2.prototype.getRegionModel = function(name) { return this._optionModelMap.get(name) || new Model(null, this, this.ecModel); }; GeoModel2.prototype.getFormattedLabel = function(name, status) { var regionModel = this.getRegionModel(name); var formatter = status === "normal" ? regionModel.get(["label", "formatter"]) : regionModel.get(["emphasis", "label", "formatter"]); var params = { name }; if (isFunction(formatter)) { params.status = status; return formatter(params); } else if (isString(formatter)) { return formatter.replace("{a}", name != null ? name : ""); } }; GeoModel2.prototype.setZoom = function(zoom) { this.option.zoom = zoom; }; GeoModel2.prototype.setCenter = function(center2) { this.option.center = center2; }; GeoModel2.prototype.select = function(name) { var option = this.option; var selectedMode = option.selectedMode; if (!selectedMode) { return; } if (selectedMode !== "multiple") { option.selectedMap = null; } var selectedMap = option.selectedMap || (option.selectedMap = {}); selectedMap[name] = true; }; GeoModel2.prototype.unSelect = function(name) { var selectedMap = this.option.selectedMap; if (selectedMap) { selectedMap[name] = false; } }; GeoModel2.prototype.toggleSelected = function(name) { this[this.isSelected(name) ? "unSelect" : "select"](name); }; GeoModel2.prototype.isSelected = function(name) { var selectedMap = this.option.selectedMap; return !!(selectedMap && selectedMap[name]); }; GeoModel2.type = "geo"; GeoModel2.layoutMode = "box"; GeoModel2.defaultOption = { // zlevel: 0, z: 0, show: true, left: "center", top: "center", // Default value: // for geoSVG source: 1, // for geoJSON source: 0.75. aspectScale: null, // /// Layout with center and size // If you want to put map in a fixed size box with right aspect ratio // This two properties may be more convenient // layoutCenter: [50%, 50%] // layoutSize: 100 silent: false, // Map type map: "", // Define left-top, right-bottom coords to control view // For example, [ [180, 90], [-180, -90] ] boundingCoords: null, // Default on center of map center: null, zoom: 1, scaleLimit: null, // selectedMode: false label: { show: false, color: "#000" }, itemStyle: { borderWidth: 0.5, borderColor: "#444" // Default color: // + geoJSON: #eee // + geoSVG: null (use SVG original `fill`) // color: '#eee' }, emphasis: { label: { show: true, color: "rgb(100,0,0)" }, itemStyle: { color: "rgba(255,215,0,0.8)" } }, select: { label: { show: true, color: "rgb(100,0,0)" }, itemStyle: { color: "rgba(255,215,0,0.8)" } }, regions: [] // tooltip: { // show: false // } }; return GeoModel2; })(ComponentModel) ); function getCenterCoord(view, point) { return view.pointToProjected ? view.pointToProjected(point) : view.pointToData(point); } function updateCenterAndZoom(view, payload, zoomLimit, api) { var previousZoom = view.getZoom(); var center2 = view.getCenter(); var zoom = payload.zoom; var point = view.projectedToPoint ? view.projectedToPoint(center2) : view.dataToPoint(center2); if (payload.dx != null && payload.dy != null) { point[0] -= payload.dx; point[1] -= payload.dy; view.setCenter(getCenterCoord(view, point), api); } if (zoom != null) { if (zoomLimit) { var zoomMin = zoomLimit.min || 0; var zoomMax = zoomLimit.max || Infinity; zoom = Math.max(Math.min(previousZoom * zoom, zoomMax), zoomMin) / previousZoom; } view.scaleX *= zoom; view.scaleY *= zoom; var fixX = (payload.originX - view.x) * (zoom - 1); var fixY = (payload.originY - view.y) * (zoom - 1); view.x -= fixX; view.y -= fixY; view.updateTransform(); view.setCenter(getCenterCoord(view, point), api); view.setZoom(zoom * previousZoom); } return { center: view.getCenter(), zoom: view.getZoom() }; } var GeoView = ( /** @class */ (function(_super) { __extends(GeoView2, _super); function GeoView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = GeoView2.type; _this.focusBlurEnabled = true; return _this; } GeoView2.prototype.init = function(ecModel, api) { this._api = api; }; GeoView2.prototype.render = function(geoModel, ecModel, api, payload) { this._model = geoModel; if (!geoModel.get("show")) { this._mapDraw && this._mapDraw.remove(); this._mapDraw = null; return; } if (!this._mapDraw) { this._mapDraw = new MapDraw(api); } var mapDraw = this._mapDraw; mapDraw.draw(geoModel, ecModel, api, this, payload); mapDraw.group.on("click", this._handleRegionClick, this); mapDraw.group.silent = geoModel.get("silent"); this.group.add(mapDraw.group); this.updateSelectStatus(geoModel, ecModel, api); }; GeoView2.prototype._handleRegionClick = function(e) { var eventData; findEventDispatcher(e.target, function(current) { return (eventData = getECData(current).eventData) != null; }, true); if (eventData) { this._api.dispatchAction({ type: "geoToggleSelect", geoId: this._model.id, name: eventData.name }); } }; GeoView2.prototype.updateSelectStatus = function(model, ecModel, api) { var _this = this; this._mapDraw.group.traverse(function(node) { var eventData = getECData(node).eventData; if (eventData) { _this._model.isSelected(eventData.name) ? api.enterSelect(node) : api.leaveSelect(node); return true; } }); }; GeoView2.prototype.findHighDownDispatchers = function(name) { return this._mapDraw && this._mapDraw.findHighDownDispatchers(name, this._model); }; GeoView2.prototype.dispose = function() { this._mapDraw && this._mapDraw.remove(); }; GeoView2.type = "geo"; return GeoView2; })(ComponentView) ); function registerMap(mapName, geoJson, specialAreas) { geoSourceManager.registerMap(mapName, geoJson, specialAreas); } function install$L(registers) { registers.registerCoordinateSystem("geo", geoCreator); registers.registerComponentModel(GeoModel); registers.registerComponentView(GeoView); registers.registerImpl("registerMap", registerMap); registers.registerImpl("getMap", function(mapName) { return geoSourceManager.getMapForUser(mapName); }); function makeAction(method, actionInfo2) { actionInfo2.update = "geo:updateSelectStatus"; registers.registerAction(actionInfo2, function(payload, ecModel) { var selected = {}; var allSelected = []; ecModel.eachComponent({ mainType: "geo", query: payload }, function(geoModel) { geoModel[method](payload.name); var geo = geoModel.coordinateSystem; each$f(geo.regions, function(region) { selected[region.name] = geoModel.isSelected(region.name) || false; }); var names = []; each$f(selected, function(v, name) { selected[name] && names.push(name); }); allSelected.push({ geoIndex: geoModel.componentIndex, // Use singular, the same naming convention as the event `selectchanged`. name: names }); }); return { selected, allSelected, name: payload.name }; }); } makeAction("toggleSelected", { type: "geoToggleSelect", event: "geoselectchanged" }); makeAction("select", { type: "geoSelect", event: "geoselected" }); makeAction("unSelect", { type: "geoUnSelect", event: "geounselected" }); registers.registerAction({ type: "geoRoam", event: "geoRoam", update: "updateTransform" }, function(payload, ecModel, api) { var componentType = payload.componentType || "series"; ecModel.eachComponent({ mainType: componentType, query: payload }, function(componentModel) { var geo = componentModel.coordinateSystem; if (geo.type !== "geo") { return; } var res = updateCenterAndZoom(geo, payload, componentModel.get("scaleLimit"), api); componentModel.setCenter && componentModel.setCenter(res.center); componentModel.setZoom && componentModel.setZoom(res.zoom); if (componentType === "series") { each$f(componentModel.seriesGroup, function(seriesModel) { seriesModel.setCenter(res.center); seriesModel.setZoom(res.zoom); }); } }); }); } function install$K(registers) { use(install$L); registers.registerChartView(MapView); registers.registerSeriesModel(MapSeries); registers.registerLayout(mapSymbolLayout); registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, mapDataStatistic); createLegacyDataSelectAction("map", registers.registerAction); } function init(inRoot) { var root = inRoot; root.hierNode = { defaultAncestor: null, ancestor: root, prelim: 0, modifier: 0, change: 0, shift: 0, i: 0, thread: null }; var nodes = [root]; var node; var children; while (node = nodes.pop()) { children = node.children; if (node.isExpand && children.length) { var n = children.length; for (var i = n - 1; i >= 0; i--) { var child = children[i]; child.hierNode = { defaultAncestor: null, ancestor: child, prelim: 0, modifier: 0, change: 0, shift: 0, i, thread: null }; nodes.push(child); } } } } function firstWalk(node, separation2) { var children = node.isExpand ? node.children : []; var siblings = node.parentNode.children; var subtreeW = node.hierNode.i ? siblings[node.hierNode.i - 1] : null; if (children.length) { executeShifts(node); var midPoint = (children[0].hierNode.prelim + children[children.length - 1].hierNode.prelim) / 2; if (subtreeW) { node.hierNode.prelim = subtreeW.hierNode.prelim + separation2(node, subtreeW); node.hierNode.modifier = node.hierNode.prelim - midPoint; } else { node.hierNode.prelim = midPoint; } } else if (subtreeW) { node.hierNode.prelim = subtreeW.hierNode.prelim + separation2(node, subtreeW); } node.parentNode.hierNode.defaultAncestor = apportion(node, subtreeW, node.parentNode.hierNode.defaultAncestor || siblings[0], separation2); } function secondWalk(node) { var nodeX = node.hierNode.prelim + node.parentNode.hierNode.modifier; node.setLayout({ x: nodeX }, true); node.hierNode.modifier += node.parentNode.hierNode.modifier; } function separation(cb) { return arguments.length ? cb : defaultSeparation; } function radialCoordinate(rad, r) { rad -= Math.PI / 2; return { x: r * Math.cos(rad), y: r * Math.sin(rad) }; } function getViewRect$4(seriesModel, api) { return getLayoutRect(seriesModel.getBoxLayoutParams(), { width: api.getWidth(), height: api.getHeight() }); } function executeShifts(node) { var children = node.children; var n = children.length; var shift = 0; var change = 0; while (--n >= 0) { var child = children[n]; child.hierNode.prelim += shift; child.hierNode.modifier += shift; change += child.hierNode.change; shift += child.hierNode.shift + change; } } function apportion(subtreeV, subtreeW, ancestor, separation2) { if (subtreeW) { var nodeOutRight = subtreeV; var nodeInRight = subtreeV; var nodeOutLeft = nodeInRight.parentNode.children[0]; var nodeInLeft = subtreeW; var sumOutRight = nodeOutRight.hierNode.modifier; var sumInRight = nodeInRight.hierNode.modifier; var sumOutLeft = nodeOutLeft.hierNode.modifier; var sumInLeft = nodeInLeft.hierNode.modifier; while (nodeInLeft = nextRight(nodeInLeft), nodeInRight = nextLeft(nodeInRight), nodeInLeft && nodeInRight) { nodeOutRight = nextRight(nodeOutRight); nodeOutLeft = nextLeft(nodeOutLeft); nodeOutRight.hierNode.ancestor = subtreeV; var shift = nodeInLeft.hierNode.prelim + sumInLeft - nodeInRight.hierNode.prelim - sumInRight + separation2(nodeInLeft, nodeInRight); if (shift > 0) { moveSubtree(nextAncestor(nodeInLeft, subtreeV, ancestor), subtreeV, shift); sumInRight += shift; sumOutRight += shift; } sumInLeft += nodeInLeft.hierNode.modifier; sumInRight += nodeInRight.hierNode.modifier; sumOutRight += nodeOutRight.hierNode.modifier; sumOutLeft += nodeOutLeft.hierNode.modifier; } if (nodeInLeft && !nextRight(nodeOutRight)) { nodeOutRight.hierNode.thread = nodeInLeft; nodeOutRight.hierNode.modifier += sumInLeft - sumOutRight; } if (nodeInRight && !nextLeft(nodeOutLeft)) { nodeOutLeft.hierNode.thread = nodeInRight; nodeOutLeft.hierNode.modifier += sumInRight - sumOutLeft; ancestor = subtreeV; } } return ancestor; } function nextRight(node) { var children = node.children; return children.length && node.isExpand ? children[children.length - 1] : node.hierNode.thread; } function nextLeft(node) { var children = node.children; return children.length && node.isExpand ? children[0] : node.hierNode.thread; } function nextAncestor(nodeInLeft, node, ancestor) { return nodeInLeft.hierNode.ancestor.parentNode === node.parentNode ? nodeInLeft.hierNode.ancestor : ancestor; } function moveSubtree(wl, wr, shift) { var change = shift / (wr.hierNode.i - wl.hierNode.i); wr.hierNode.change -= change; wr.hierNode.shift += shift; wr.hierNode.modifier += shift; wr.hierNode.prelim += shift; wl.hierNode.change += change; } function defaultSeparation(node1, node2) { return node1.parentNode === node2.parentNode ? 1 : 2; } var TreeEdgeShape = ( /** @class */ /* @__PURE__ */ (function() { function TreeEdgeShape2() { this.parentPoint = []; this.childPoints = []; } return TreeEdgeShape2; })() ); var TreePath = ( /** @class */ (function(_super) { __extends(TreePath2, _super); function TreePath2(opts) { return _super.call(this, opts) || this; } TreePath2.prototype.getDefaultStyle = function() { return { stroke: "#000", fill: null }; }; TreePath2.prototype.getDefaultShape = function() { return new TreeEdgeShape(); }; TreePath2.prototype.buildPath = function(ctx, shape) { var childPoints = shape.childPoints; var childLen = childPoints.length; var parentPoint = shape.parentPoint; var firstChildPos = childPoints[0]; var lastChildPos = childPoints[childLen - 1]; if (childLen === 1) { ctx.moveTo(parentPoint[0], parentPoint[1]); ctx.lineTo(firstChildPos[0], firstChildPos[1]); return; } var orient = shape.orient; var forkDim = orient === "TB" || orient === "BT" ? 0 : 1; var otherDim = 1 - forkDim; var forkPosition = parsePercent(shape.forkPosition, 1); var tmpPoint = []; tmpPoint[forkDim] = parentPoint[forkDim]; tmpPoint[otherDim] = parentPoint[otherDim] + (lastChildPos[otherDim] - parentPoint[otherDim]) * forkPosition; ctx.moveTo(parentPoint[0], parentPoint[1]); ctx.lineTo(tmpPoint[0], tmpPoint[1]); ctx.moveTo(firstChildPos[0], firstChildPos[1]); tmpPoint[forkDim] = firstChildPos[forkDim]; ctx.lineTo(tmpPoint[0], tmpPoint[1]); tmpPoint[forkDim] = lastChildPos[forkDim]; ctx.lineTo(tmpPoint[0], tmpPoint[1]); ctx.lineTo(lastChildPos[0], lastChildPos[1]); for (var i = 1; i < childLen - 1; i++) { var point = childPoints[i]; ctx.moveTo(point[0], point[1]); tmpPoint[forkDim] = point[forkDim]; ctx.lineTo(tmpPoint[0], tmpPoint[1]); } }; return TreePath2; })(Path) ); var TreeView = ( /** @class */ (function(_super) { __extends(TreeView2, _super); function TreeView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = TreeView2.type; _this._mainGroup = new Group$3(); return _this; } TreeView2.prototype.init = function(ecModel, api) { this._controller = new RoamController(api.getZr()); this._controllerHost = { target: this.group }; this.group.add(this._mainGroup); }; TreeView2.prototype.render = function(seriesModel, ecModel, api) { var data = seriesModel.getData(); var layoutInfo = seriesModel.layoutInfo; var group = this._mainGroup; var layout2 = seriesModel.get("layout"); if (layout2 === "radial") { group.x = layoutInfo.x + layoutInfo.width / 2; group.y = layoutInfo.y + layoutInfo.height / 2; } else { group.x = layoutInfo.x; group.y = layoutInfo.y; } this._updateViewCoordSys(seriesModel, api); this._updateController(seriesModel, ecModel, api); var oldData = this._data; data.diff(oldData).add(function(newIdx) { if (symbolNeedsDraw(data, newIdx)) { updateNode(data, newIdx, null, group, seriesModel); } }).update(function(newIdx, oldIdx) { var symbolEl = oldData.getItemGraphicEl(oldIdx); if (!symbolNeedsDraw(data, newIdx)) { symbolEl && removeNode(oldData, oldIdx, symbolEl, group, seriesModel); return; } updateNode(data, newIdx, symbolEl, group, seriesModel); }).remove(function(oldIdx) { var symbolEl = oldData.getItemGraphicEl(oldIdx); if (symbolEl) { removeNode(oldData, oldIdx, symbolEl, group, seriesModel); } }).execute(); this._nodeScaleRatio = seriesModel.get("nodeScaleRatio"); this._updateNodeAndLinkScale(seriesModel); if (seriesModel.get("expandAndCollapse") === true) { data.eachItemGraphicEl(function(el, dataIndex) { el.off("click").on("click", function() { api.dispatchAction({ type: "treeExpandAndCollapse", seriesId: seriesModel.id, dataIndex }); }); }); } this._data = data; }; TreeView2.prototype._updateViewCoordSys = function(seriesModel, api) { var data = seriesModel.getData(); var points2 = []; data.each(function(idx) { var layout2 = data.getItemLayout(idx); if (layout2 && !isNaN(layout2.x) && !isNaN(layout2.y)) { points2.push([+layout2.x, +layout2.y]); } }); var min2 = []; var max2 = []; fromPoints(points2, min2, max2); var oldMin = this._min; var oldMax = this._max; if (max2[0] - min2[0] === 0) { min2[0] = oldMin ? oldMin[0] : min2[0] - 1; max2[0] = oldMax ? oldMax[0] : max2[0] + 1; } if (max2[1] - min2[1] === 0) { min2[1] = oldMin ? oldMin[1] : min2[1] - 1; max2[1] = oldMax ? oldMax[1] : max2[1] + 1; } var viewCoordSys = seriesModel.coordinateSystem = new View(); viewCoordSys.zoomLimit = seriesModel.get("scaleLimit"); viewCoordSys.setBoundingRect(min2[0], min2[1], max2[0] - min2[0], max2[1] - min2[1]); viewCoordSys.setCenter(seriesModel.get("center"), api); viewCoordSys.setZoom(seriesModel.get("zoom")); this.group.attr({ x: viewCoordSys.x, y: viewCoordSys.y, scaleX: viewCoordSys.scaleX, scaleY: viewCoordSys.scaleY }); this._min = min2; this._max = max2; }; TreeView2.prototype._updateController = function(seriesModel, ecModel, api) { var _this = this; var controller = this._controller; var controllerHost = this._controllerHost; var group = this.group; controller.setPointerChecker(function(e, x, y) { var rect = group.getBoundingRect(); rect.applyTransform(group.transform); return rect.contain(x, y) && !onIrrelevantElement(e, api, seriesModel); }); controller.enable(seriesModel.get("roam")); controllerHost.zoomLimit = seriesModel.get("scaleLimit"); controllerHost.zoom = seriesModel.coordinateSystem.getZoom(); controller.off("pan").off("zoom").on("pan", function(e) { updateViewOnPan(controllerHost, e.dx, e.dy); api.dispatchAction({ seriesId: seriesModel.id, type: "treeRoam", dx: e.dx, dy: e.dy }); }).on("zoom", function(e) { updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY); api.dispatchAction({ seriesId: seriesModel.id, type: "treeRoam", zoom: e.scale, originX: e.originX, originY: e.originY }); _this._updateNodeAndLinkScale(seriesModel); api.updateLabelLayout(); }); }; TreeView2.prototype._updateNodeAndLinkScale = function(seriesModel) { var data = seriesModel.getData(); var nodeScale = this._getNodeGlobalScale(seriesModel); data.eachItemGraphicEl(function(el, idx) { el.setSymbolScale(nodeScale); }); }; TreeView2.prototype._getNodeGlobalScale = function(seriesModel) { var coordSys = seriesModel.coordinateSystem; if (coordSys.type !== "view") { return 1; } var nodeScaleRatio = this._nodeScaleRatio; var groupZoom = coordSys.scaleX || 1; var roamZoom = coordSys.getZoom(); var nodeScale = (roamZoom - 1) * nodeScaleRatio + 1; return nodeScale / groupZoom; }; TreeView2.prototype.dispose = function() { this._controller && this._controller.dispose(); this._controllerHost = null; }; TreeView2.prototype.remove = function() { this._mainGroup.removeAll(); this._data = null; }; TreeView2.type = "tree"; return TreeView2; })(ChartView) ); function symbolNeedsDraw(data, dataIndex) { var layout2 = data.getItemLayout(dataIndex); return layout2 && !isNaN(layout2.x) && !isNaN(layout2.y); } function updateNode(data, dataIndex, symbolEl, group, seriesModel) { var isInit = !symbolEl; var node = data.tree.getNodeByDataIndex(dataIndex); var itemModel = node.getModel(); var visualColor = node.getVisual("style").fill; var symbolInnerColor = node.isExpand === false && node.children.length !== 0 ? visualColor : "#fff"; var virtualRoot = data.tree.root; var source = node.parentNode === virtualRoot ? node : node.parentNode || node; var sourceSymbolEl = data.getItemGraphicEl(source.dataIndex); var sourceLayout = source.getLayout(); var sourceOldLayout = sourceSymbolEl ? { x: sourceSymbolEl.__oldX, y: sourceSymbolEl.__oldY, rawX: sourceSymbolEl.__radialOldRawX, rawY: sourceSymbolEl.__radialOldRawY } : sourceLayout; var targetLayout = node.getLayout(); if (isInit) { symbolEl = new Symbol$1(data, dataIndex, null, { symbolInnerColor, useNameLabel: true }); symbolEl.x = sourceOldLayout.x; symbolEl.y = sourceOldLayout.y; } else { symbolEl.updateData(data, dataIndex, null, { symbolInnerColor, useNameLabel: true }); } symbolEl.__radialOldRawX = symbolEl.__radialRawX; symbolEl.__radialOldRawY = symbolEl.__radialRawY; symbolEl.__radialRawX = targetLayout.rawX; symbolEl.__radialRawY = targetLayout.rawY; group.add(symbolEl); data.setItemGraphicEl(dataIndex, symbolEl); symbolEl.__oldX = symbolEl.x; symbolEl.__oldY = symbolEl.y; updateProps$1(symbolEl, { x: targetLayout.x, y: targetLayout.y }, seriesModel); var symbolPath = symbolEl.getSymbolPath(); if (seriesModel.get("layout") === "radial") { var realRoot = virtualRoot.children[0]; var rootLayout = realRoot.getLayout(); var length_1 = realRoot.children.length; var rad = void 0; var isLeft = void 0; if (targetLayout.x === rootLayout.x && node.isExpand === true && realRoot.children.length) { var center2 = { x: (realRoot.children[0].getLayout().x + realRoot.children[length_1 - 1].getLayout().x) / 2, y: (realRoot.children[0].getLayout().y + realRoot.children[length_1 - 1].getLayout().y) / 2 }; rad = Math.atan2(center2.y - rootLayout.y, center2.x - rootLayout.x); if (rad < 0) { rad = Math.PI * 2 + rad; } isLeft = center2.x < rootLayout.x; if (isLeft) { rad = rad - Math.PI; } } else { rad = Math.atan2(targetLayout.y - rootLayout.y, targetLayout.x - rootLayout.x); if (rad < 0) { rad = Math.PI * 2 + rad; } if (node.children.length === 0 || node.children.length !== 0 && node.isExpand === false) { isLeft = targetLayout.x < rootLayout.x; if (isLeft) { rad = rad - Math.PI; } } else { isLeft = targetLayout.x > rootLayout.x; if (!isLeft) { rad = rad - Math.PI; } } } var textPosition = isLeft ? "left" : "right"; var normalLabelModel = itemModel.getModel("label"); var rotate2 = normalLabelModel.get("rotate"); var labelRotateRadian = rotate2 * (Math.PI / 180); var textContent = symbolPath.getTextContent(); if (textContent) { symbolPath.setTextConfig({ position: normalLabelModel.get("position") || textPosition, rotation: rotate2 == null ? -rad : labelRotateRadian, origin: "center" }); textContent.setStyle("verticalAlign", "middle"); } } var focus = itemModel.get(["emphasis", "focus"]); var focusDataIndices = focus === "relative" ? concatArray(node.getAncestorsIndices(), node.getDescendantIndices()) : focus === "ancestor" ? node.getAncestorsIndices() : focus === "descendant" ? node.getDescendantIndices() : null; if (focusDataIndices) { getECData(symbolEl).focus = focusDataIndices; } drawEdge(seriesModel, node, virtualRoot, symbolEl, sourceOldLayout, sourceLayout, targetLayout, group); if (symbolEl.__edge) { symbolEl.onHoverStateChange = function(toState) { if (toState !== "blur") { var parentEl = node.parentNode && data.getItemGraphicEl(node.parentNode.dataIndex); if (!(parentEl && parentEl.hoverState === HOVER_STATE_BLUR)) { setStatesFlag(symbolEl.__edge, toState); } } }; } } function drawEdge(seriesModel, node, virtualRoot, symbolEl, sourceOldLayout, sourceLayout, targetLayout, group) { var itemModel = node.getModel(); var edgeShape = seriesModel.get("edgeShape"); var layout2 = seriesModel.get("layout"); var orient = seriesModel.getOrient(); var curvature = seriesModel.get(["lineStyle", "curveness"]); var edgeForkPosition = seriesModel.get("edgeForkPosition"); var lineStyle = itemModel.getModel("lineStyle").getLineStyle(); var edge = symbolEl.__edge; if (edgeShape === "curve") { if (node.parentNode && node.parentNode !== virtualRoot) { if (!edge) { edge = symbolEl.__edge = new BezierCurve({ shape: getEdgeShape(layout2, orient, curvature, sourceOldLayout, sourceOldLayout) }); } updateProps$1(edge, { shape: getEdgeShape(layout2, orient, curvature, sourceLayout, targetLayout) }, seriesModel); } } else if (edgeShape === "polyline") { if (layout2 === "orthogonal") { if (node !== virtualRoot && node.children && node.children.length !== 0 && node.isExpand === true) { var children = node.children; var childPoints = []; for (var i = 0; i < children.length; i++) { var childLayout = children[i].getLayout(); childPoints.push([childLayout.x, childLayout.y]); } if (!edge) { edge = symbolEl.__edge = new TreePath({ shape: { parentPoint: [targetLayout.x, targetLayout.y], childPoints: [[targetLayout.x, targetLayout.y]], orient, forkPosition: edgeForkPosition } }); } updateProps$1(edge, { shape: { parentPoint: [targetLayout.x, targetLayout.y], childPoints } }, seriesModel); } } } if (edge && !(edgeShape === "polyline" && !node.isExpand)) { edge.useStyle(defaults({ strokeNoScale: true, fill: null }, lineStyle)); setStatesStylesFromModel(edge, itemModel, "lineStyle"); setDefaultStateProxy(edge); group.add(edge); } } function removeNodeEdge(node, data, group, seriesModel, removeAnimationOpt) { var virtualRoot = data.tree.root; var _a2 = getSourceNode(virtualRoot, node), source = _a2.source, sourceLayout = _a2.sourceLayout; var symbolEl = data.getItemGraphicEl(node.dataIndex); if (!symbolEl) { return; } var sourceSymbolEl = data.getItemGraphicEl(source.dataIndex); var sourceEdge = sourceSymbolEl.__edge; var edge = symbolEl.__edge || (source.isExpand === false || source.children.length === 1 ? sourceEdge : void 0); var edgeShape = seriesModel.get("edgeShape"); var layoutOpt = seriesModel.get("layout"); var orient = seriesModel.get("orient"); var curvature = seriesModel.get(["lineStyle", "curveness"]); if (edge) { if (edgeShape === "curve") { removeElement(edge, { shape: getEdgeShape(layoutOpt, orient, curvature, sourceLayout, sourceLayout), style: { opacity: 0 } }, seriesModel, { cb: function() { group.remove(edge); }, removeOpt: removeAnimationOpt }); } else if (edgeShape === "polyline" && seriesModel.get("layout") === "orthogonal") { removeElement(edge, { shape: { parentPoint: [sourceLayout.x, sourceLayout.y], childPoints: [[sourceLayout.x, sourceLayout.y]] }, style: { opacity: 0 } }, seriesModel, { cb: function() { group.remove(edge); }, removeOpt: removeAnimationOpt }); } } } function getSourceNode(virtualRoot, node) { var source = node.parentNode === virtualRoot ? node : node.parentNode || node; var sourceLayout; while (sourceLayout = source.getLayout(), sourceLayout == null) { source = source.parentNode === virtualRoot ? source : source.parentNode || source; } return { source, sourceLayout }; } function removeNode(data, dataIndex, symbolEl, group, seriesModel) { var node = data.tree.getNodeByDataIndex(dataIndex); var virtualRoot = data.tree.root; var sourceLayout = getSourceNode(virtualRoot, node).sourceLayout; var removeAnimationOpt = { duration: seriesModel.get("animationDurationUpdate"), easing: seriesModel.get("animationEasingUpdate") }; removeElement(symbolEl, { x: sourceLayout.x + 1, y: sourceLayout.y + 1 }, seriesModel, { cb: function() { group.remove(symbolEl); data.setItemGraphicEl(dataIndex, null); }, removeOpt: removeAnimationOpt }); symbolEl.fadeOut(null, data.hostModel, { fadeLabel: true, animation: removeAnimationOpt }); node.children.forEach(function(childNode) { removeNodeEdge(childNode, data, group, seriesModel, removeAnimationOpt); }); removeNodeEdge(node, data, group, seriesModel, removeAnimationOpt); } function getEdgeShape(layoutOpt, orient, curvature, sourceLayout, targetLayout) { var cpx1; var cpy1; var cpx2; var cpy2; var x1; var x2; var y1; var y2; if (layoutOpt === "radial") { x1 = sourceLayout.rawX; y1 = sourceLayout.rawY; x2 = targetLayout.rawX; y2 = targetLayout.rawY; var radialCoor1 = radialCoordinate(x1, y1); var radialCoor2 = radialCoordinate(x1, y1 + (y2 - y1) * curvature); var radialCoor3 = radialCoordinate(x2, y2 + (y1 - y2) * curvature); var radialCoor4 = radialCoordinate(x2, y2); return { x1: radialCoor1.x || 0, y1: radialCoor1.y || 0, x2: radialCoor4.x || 0, y2: radialCoor4.y || 0, cpx1: radialCoor2.x || 0, cpy1: radialCoor2.y || 0, cpx2: radialCoor3.x || 0, cpy2: radialCoor3.y || 0 }; } else { x1 = sourceLayout.x; y1 = sourceLayout.y; x2 = targetLayout.x; y2 = targetLayout.y; if (orient === "LR" || orient === "RL") { cpx1 = x1 + (x2 - x1) * curvature; cpy1 = y1; cpx2 = x2 + (x1 - x2) * curvature; cpy2 = y2; } if (orient === "TB" || orient === "BT") { cpx1 = x1; cpy1 = y1 + (y2 - y1) * curvature; cpx2 = x2; cpy2 = y2 + (y1 - y2) * curvature; } } return { x1, y1, x2, y2, cpx1, cpy1, cpx2, cpy2 }; } var inner$e = makeInner(); function linkSeriesData(opt) { var mainData = opt.mainData; var datas = opt.datas; if (!datas) { datas = { main: mainData }; opt.datasAttr = { main: "data" }; } opt.datas = opt.mainData = null; linkAll(mainData, datas, opt); each$f(datas, function(data) { each$f(mainData.TRANSFERABLE_METHODS, function(methodName) { data.wrapMethod(methodName, curry$1(transferInjection, opt)); }); }); mainData.wrapMethod("cloneShallow", curry$1(cloneShallowInjection, opt)); each$f(mainData.CHANGABLE_METHODS, function(methodName) { mainData.wrapMethod(methodName, curry$1(changeInjection, opt)); }); assert(datas[mainData.dataType] === mainData); } function transferInjection(opt, res) { if (isMainData(this)) { var datas = extend({}, inner$e(this).datas); datas[this.dataType] = res; linkAll(res, datas, opt); } else { linkSingle(res, this.dataType, inner$e(this).mainData, opt); } return res; } function changeInjection(opt, res) { opt.struct && opt.struct.update(); return res; } function cloneShallowInjection(opt, res) { each$f(inner$e(res).datas, function(data, dataType) { data !== res && linkSingle(data.cloneShallow(), dataType, res, opt); }); return res; } function getLinkedData(dataType) { var mainData = inner$e(this).mainData; return dataType == null || mainData == null ? mainData : inner$e(mainData).datas[dataType]; } function getLinkedDataAll() { var mainData = inner$e(this).mainData; return mainData == null ? [{ data: mainData }] : map$1(keys(inner$e(mainData).datas), function(type) { return { type, data: inner$e(mainData).datas[type] }; }); } function isMainData(data) { return inner$e(data).mainData === data; } function linkAll(mainData, datas, opt) { inner$e(mainData).datas = {}; each$f(datas, function(data, dataType) { linkSingle(data, dataType, mainData, opt); }); } function linkSingle(data, dataType, mainData, opt) { inner$e(mainData).datas[dataType] = data; inner$e(data).mainData = mainData; data.dataType = dataType; if (opt.struct) { data[opt.structAttr] = opt.struct; opt.struct[opt.datasAttr[dataType]] = data; } data.getLinkedData = getLinkedData; data.getLinkedDataAll = getLinkedDataAll; } var TreeNode = ( /** @class */ (function() { function TreeNode2(name, hostTree) { this.depth = 0; this.height = 0; this.dataIndex = -1; this.children = []; this.viewChildren = []; this.isExpand = false; this.name = name || ""; this.hostTree = hostTree; } TreeNode2.prototype.isRemoved = function() { return this.dataIndex < 0; }; TreeNode2.prototype.eachNode = function(options, cb, context) { if (isFunction(options)) { context = cb; cb = options; options = null; } options = options || {}; if (isString(options)) { options = { order: options }; } var order = options.order || "preorder"; var children = this[options.attr || "children"]; var suppressVisitSub; order === "preorder" && (suppressVisitSub = cb.call(context, this)); for (var i = 0; !suppressVisitSub && i < children.length; i++) { children[i].eachNode(options, cb, context); } order === "postorder" && cb.call(context, this); }; TreeNode2.prototype.updateDepthAndHeight = function(depth) { var height = 0; this.depth = depth; for (var i = 0; i < this.children.length; i++) { var child = this.children[i]; child.updateDepthAndHeight(depth + 1); if (child.height > height) { height = child.height; } } this.height = height + 1; }; TreeNode2.prototype.getNodeById = function(id) { if (this.getId() === id) { return this; } for (var i = 0, children = this.children, len2 = children.length; i < len2; i++) { var res = children[i].getNodeById(id); if (res) { return res; } } }; TreeNode2.prototype.contains = function(node) { if (node === this) { return true; } for (var i = 0, children = this.children, len2 = children.length; i < len2; i++) { var res = children[i].contains(node); if (res) { return res; } } }; TreeNode2.prototype.getAncestors = function(includeSelf) { var ancestors = []; var node = includeSelf ? this : this.parentNode; while (node) { ancestors.push(node); node = node.parentNode; } ancestors.reverse(); return ancestors; }; TreeNode2.prototype.getAncestorsIndices = function() { var indices = []; var currNode = this; while (currNode) { indices.push(currNode.dataIndex); currNode = currNode.parentNode; } indices.reverse(); return indices; }; TreeNode2.prototype.getDescendantIndices = function() { var indices = []; this.eachNode(function(childNode) { indices.push(childNode.dataIndex); }); return indices; }; TreeNode2.prototype.getValue = function(dimension) { var data = this.hostTree.data; return data.getStore().get(data.getDimensionIndex(dimension || "value"), this.dataIndex); }; TreeNode2.prototype.setLayout = function(layout2, merge2) { this.dataIndex >= 0 && this.hostTree.data.setItemLayout(this.dataIndex, layout2, merge2); }; TreeNode2.prototype.getLayout = function() { return this.hostTree.data.getItemLayout(this.dataIndex); }; TreeNode2.prototype.getModel = function(path) { if (this.dataIndex < 0) { return; } var hostTree = this.hostTree; var itemModel = hostTree.data.getItemModel(this.dataIndex); return itemModel.getModel(path); }; TreeNode2.prototype.getLevelModel = function() { return (this.hostTree.levelModels || [])[this.depth]; }; TreeNode2.prototype.setVisual = function(key, value) { this.dataIndex >= 0 && this.hostTree.data.setItemVisual(this.dataIndex, key, value); }; TreeNode2.prototype.getVisual = function(key) { return this.hostTree.data.getItemVisual(this.dataIndex, key); }; TreeNode2.prototype.getRawIndex = function() { return this.hostTree.data.getRawIndex(this.dataIndex); }; TreeNode2.prototype.getId = function() { return this.hostTree.data.getId(this.dataIndex); }; TreeNode2.prototype.getChildIndex = function() { if (this.parentNode) { var children = this.parentNode.children; for (var i = 0; i < children.length; ++i) { if (children[i] === this) { return i; } } return -1; } return -1; }; TreeNode2.prototype.isAncestorOf = function(node) { var parent = node.parentNode; while (parent) { if (parent === this) { return true; } parent = parent.parentNode; } return false; }; TreeNode2.prototype.isDescendantOf = function(node) { return node !== this && node.isAncestorOf(this); }; return TreeNode2; })() ); var Tree = ( /** @class */ (function() { function Tree2(hostModel) { this.type = "tree"; this._nodes = []; this.hostModel = hostModel; } Tree2.prototype.eachNode = function(options, cb, context) { this.root.eachNode(options, cb, context); }; Tree2.prototype.getNodeByDataIndex = function(dataIndex) { var rawIndex = this.data.getRawIndex(dataIndex); return this._nodes[rawIndex]; }; Tree2.prototype.getNodeById = function(name) { return this.root.getNodeById(name); }; Tree2.prototype.update = function() { var data = this.data; var nodes = this._nodes; for (var i = 0, len2 = nodes.length; i < len2; i++) { nodes[i].dataIndex = -1; } for (var i = 0, len2 = data.count(); i < len2; i++) { nodes[data.getRawIndex(i)].dataIndex = i; } }; Tree2.prototype.clearLayouts = function() { this.data.clearItemLayouts(); }; Tree2.createTree = function(dataRoot, hostModel, beforeLink) { var tree = new Tree2(hostModel); var listData = []; var dimMax = 1; buildHierarchy(dataRoot); function buildHierarchy(dataNode, parentNode) { var value = dataNode.value; dimMax = Math.max(dimMax, isArray$1(value) ? value.length : 1); listData.push(dataNode); var node = new TreeNode(convertOptionIdName(dataNode.name, ""), tree); parentNode ? addChild(node, parentNode) : tree.root = node; tree._nodes.push(node); var children = dataNode.children; if (children) { for (var i = 0; i < children.length; i++) { buildHierarchy(children[i], node); } } } tree.root.updateDepthAndHeight(0); var dimensions = prepareSeriesDataSchema(listData, { coordDimensions: ["value"], dimensionsCount: dimMax }).dimensions; var list = new SeriesData(dimensions, hostModel); list.initData(listData); beforeLink && beforeLink(list); linkSeriesData({ mainData: list, struct: tree, structAttr: "tree" }); tree.update(); return tree; }; return Tree2; })() ); function addChild(child, node) { var children = node.children; if (child.parentNode === node) { return; } children.push(child); child.parentNode = node; } function retrieveTargetInfo(payload, validPayloadTypes, seriesModel) { if (payload && indexOf(validPayloadTypes, payload.type) >= 0) { var root = seriesModel.getData().tree.root; var targetNode = payload.targetNode; if (isString(targetNode)) { targetNode = root.getNodeById(targetNode); } if (targetNode && root.contains(targetNode)) { return { node: targetNode }; } var targetNodeId = payload.targetNodeId; if (targetNodeId != null && (targetNode = root.getNodeById(targetNodeId))) { return { node: targetNode }; } } } function getPathToRoot(node) { var path = []; while (node) { node = node.parentNode; node && path.push(node); } return path.reverse(); } function aboveViewRoot(viewRoot, node) { var viewPath = getPathToRoot(viewRoot); return indexOf(viewPath, node) >= 0; } function wrapTreePathInfo(node, seriesModel) { var treePathInfo = []; while (node) { var nodeDataIndex = node.dataIndex; treePathInfo.push({ name: node.name, dataIndex: nodeDataIndex, value: seriesModel.getRawValue(nodeDataIndex) }); node = node.parentNode; } treePathInfo.reverse(); return treePathInfo; } var TreeSeriesModel = ( /** @class */ (function(_super) { __extends(TreeSeriesModel2, _super); function TreeSeriesModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.hasSymbolVisual = true; _this.ignoreStyleOnData = true; return _this; } TreeSeriesModel2.prototype.getInitialData = function(option) { var root = { name: option.name, children: option.data }; var leaves = option.leaves || {}; var leavesModel = new Model(leaves, this, this.ecModel); var tree = Tree.createTree(root, this, beforeLink); function beforeLink(nodeData) { nodeData.wrapMethod("getItemModel", function(model, idx) { var node = tree.getNodeByDataIndex(idx); if (!(node && node.children.length && node.isExpand)) { model.parentModel = leavesModel; } return model; }); } var treeDepth = 0; tree.eachNode("preorder", function(node) { if (node.depth > treeDepth) { treeDepth = node.depth; } }); var expandAndCollapse = option.expandAndCollapse; var expandTreeDepth = expandAndCollapse && option.initialTreeDepth >= 0 ? option.initialTreeDepth : treeDepth; tree.root.eachNode("preorder", function(node) { var item = node.hostTree.data.getRawDataItem(node.dataIndex); node.isExpand = item && item.collapsed != null ? !item.collapsed : node.depth <= expandTreeDepth; }); return tree.data; }; TreeSeriesModel2.prototype.getOrient = function() { var orient = this.get("orient"); if (orient === "horizontal") { orient = "LR"; } else if (orient === "vertical") { orient = "TB"; } return orient; }; TreeSeriesModel2.prototype.setZoom = function(zoom) { this.option.zoom = zoom; }; TreeSeriesModel2.prototype.setCenter = function(center2) { this.option.center = center2; }; TreeSeriesModel2.prototype.formatTooltip = function(dataIndex, multipleSeries, dataType) { var tree = this.getData().tree; var realRoot = tree.root.children[0]; var node = tree.getNodeByDataIndex(dataIndex); var value = node.getValue(); var name = node.name; while (node && node !== realRoot) { name = node.parentNode.name + "." + name; node = node.parentNode; } return createTooltipMarkup("nameValue", { name, value, noValue: isNaN(value) || value == null }); }; TreeSeriesModel2.prototype.getDataParams = function(dataIndex) { var params = _super.prototype.getDataParams.apply(this, arguments); var node = this.getData().tree.getNodeByDataIndex(dataIndex); params.treeAncestors = wrapTreePathInfo(node, this); params.collapsed = !node.isExpand; return params; }; TreeSeriesModel2.type = "series.tree"; TreeSeriesModel2.layoutMode = "box"; TreeSeriesModel2.defaultOption = { // zlevel: 0, z: 2, coordinateSystem: "view", // the position of the whole view left: "12%", top: "12%", right: "12%", bottom: "12%", // the layout of the tree, two value can be selected, 'orthogonal' or 'radial' layout: "orthogonal", // value can be 'polyline' edgeShape: "curve", edgeForkPosition: "50%", // true | false | 'move' | 'scale', see module:component/helper/RoamController. roam: false, // Symbol size scale ratio in roam nodeScaleRatio: 0.4, // Default on center of graph center: null, zoom: 1, orient: "LR", symbol: "emptyCircle", symbolSize: 7, expandAndCollapse: true, initialTreeDepth: 2, lineStyle: { color: "#ccc", width: 1.5, curveness: 0.5 }, itemStyle: { color: "lightsteelblue", // borderColor: '#c23531', borderWidth: 1.5 }, label: { show: true }, animationEasing: "linear", animationDuration: 700, animationDurationUpdate: 500 }; return TreeSeriesModel2; })(SeriesModel) ); function eachAfter(root, callback, separation2) { var nodes = [root]; var next = []; var node; while (node = nodes.pop()) { next.push(node); if (node.isExpand) { var children = node.children; if (children.length) { for (var i = 0; i < children.length; i++) { nodes.push(children[i]); } } } } while (node = next.pop()) { callback(node, separation2); } } function eachBefore(root, callback) { var nodes = [root]; var node; while (node = nodes.pop()) { callback(node); if (node.isExpand) { var children = node.children; if (children.length) { for (var i = children.length - 1; i >= 0; i--) { nodes.push(children[i]); } } } } } function treeLayout(ecModel, api) { ecModel.eachSeriesByType("tree", function(seriesModel) { commonLayout(seriesModel, api); }); } function commonLayout(seriesModel, api) { var layoutInfo = getViewRect$4(seriesModel, api); seriesModel.layoutInfo = layoutInfo; var layout2 = seriesModel.get("layout"); var width = 0; var height = 0; var separation$1 = null; if (layout2 === "radial") { width = 2 * Math.PI; height = Math.min(layoutInfo.height, layoutInfo.width) / 2; separation$1 = separation(function(node1, node2) { return (node1.parentNode === node2.parentNode ? 1 : 2) / node1.depth; }); } else { width = layoutInfo.width; height = layoutInfo.height; separation$1 = separation(); } var virtualRoot = seriesModel.getData().tree.root; var realRoot = virtualRoot.children[0]; if (realRoot) { init(virtualRoot); eachAfter(realRoot, firstWalk, separation$1); virtualRoot.hierNode.modifier = -realRoot.hierNode.prelim; eachBefore(realRoot, secondWalk); var left_1 = realRoot; var right_1 = realRoot; var bottom_1 = realRoot; eachBefore(realRoot, function(node) { var x = node.getLayout().x; if (x < left_1.getLayout().x) { left_1 = node; } if (x > right_1.getLayout().x) { right_1 = node; } if (node.depth > bottom_1.depth) { bottom_1 = node; } }); var delta = left_1 === right_1 ? 1 : separation$1(left_1, right_1) / 2; var tx_1 = delta - left_1.getLayout().x; var kx_1 = 0; var ky_1 = 0; var coorX_1 = 0; var coorY_1 = 0; if (layout2 === "radial") { kx_1 = width / (right_1.getLayout().x + delta + tx_1); ky_1 = height / (bottom_1.depth - 1 || 1); eachBefore(realRoot, function(node) { coorX_1 = (node.getLayout().x + tx_1) * kx_1; coorY_1 = (node.depth - 1) * ky_1; var finalCoor = radialCoordinate(coorX_1, coorY_1); node.setLayout({ x: finalCoor.x, y: finalCoor.y, rawX: coorX_1, rawY: coorY_1 }, true); }); } else { var orient_1 = seriesModel.getOrient(); if (orient_1 === "RL" || orient_1 === "LR") { ky_1 = height / (right_1.getLayout().x + delta + tx_1); kx_1 = width / (bottom_1.depth - 1 || 1); eachBefore(realRoot, function(node) { coorY_1 = (node.getLayout().x + tx_1) * ky_1; coorX_1 = orient_1 === "LR" ? (node.depth - 1) * kx_1 : width - (node.depth - 1) * kx_1; node.setLayout({ x: coorX_1, y: coorY_1 }, true); }); } else if (orient_1 === "TB" || orient_1 === "BT") { kx_1 = width / (right_1.getLayout().x + delta + tx_1); ky_1 = height / (bottom_1.depth - 1 || 1); eachBefore(realRoot, function(node) { coorX_1 = (node.getLayout().x + tx_1) * kx_1; coorY_1 = orient_1 === "TB" ? (node.depth - 1) * ky_1 : height - (node.depth - 1) * ky_1; node.setLayout({ x: coorX_1, y: coorY_1 }, true); }); } } } } function treeVisual(ecModel) { ecModel.eachSeriesByType("tree", function(seriesModel) { var data = seriesModel.getData(); var tree = data.tree; tree.eachNode(function(node) { var model = node.getModel(); var style = model.getModel("itemStyle").getItemStyle(); var existsStyle = data.ensureUniqueItemVisual(node.dataIndex, "style"); extend(existsStyle, style); }); }); } function installTreeAction(registers) { registers.registerAction({ type: "treeExpandAndCollapse", event: "treeExpandAndCollapse", update: "update" }, function(payload, ecModel) { ecModel.eachComponent({ mainType: "series", subType: "tree", query: payload }, function(seriesModel) { var dataIndex = payload.dataIndex; var tree = seriesModel.getData().tree; var node = tree.getNodeByDataIndex(dataIndex); node.isExpand = !node.isExpand; }); }); registers.registerAction({ type: "treeRoam", event: "treeRoam", // Here we set 'none' instead of 'update', because roam action // just need to update the transform matrix without having to recalculate // the layout. So don't need to go through the whole update process, such // as 'dataPrcocess', 'coordSystemUpdate', 'layout' and so on. update: "none" }, function(payload, ecModel, api) { ecModel.eachComponent({ mainType: "series", subType: "tree", query: payload }, function(seriesModel) { var coordSys = seriesModel.coordinateSystem; var res = updateCenterAndZoom(coordSys, payload, void 0, api); seriesModel.setCenter && seriesModel.setCenter(res.center); seriesModel.setZoom && seriesModel.setZoom(res.zoom); }); }); } function install$J(registers) { registers.registerChartView(TreeView); registers.registerSeriesModel(TreeSeriesModel); registers.registerLayout(treeLayout); registers.registerVisual(treeVisual); installTreeAction(registers); } var actionTypes = ["treemapZoomToNode", "treemapRender", "treemapMove"]; function installTreemapAction(registers) { for (var i = 0; i < actionTypes.length; i++) { registers.registerAction({ type: actionTypes[i], update: "updateView" }, noop); } registers.registerAction({ type: "treemapRootToNode", update: "updateView" }, function(payload, ecModel) { ecModel.eachComponent({ mainType: "series", subType: "treemap", query: payload }, handleRootToNode); function handleRootToNode(model, index) { var types = ["treemapZoomToNode", "treemapRootToNode"]; var targetInfo = retrieveTargetInfo(payload, types, model); if (targetInfo) { var originViewRoot = model.getViewRoot(); if (originViewRoot) { payload.direction = aboveViewRoot(originViewRoot, targetInfo.node) ? "rollUp" : "drillDown"; } model.resetViewRoot(targetInfo.node); } } }); } function enableAriaDecalForTree(seriesModel) { var data = seriesModel.getData(); var tree = data.tree; var decalPaletteScope2 = {}; tree.eachNode(function(node) { var current = node; while (current && current.depth > 1) { current = current.parentNode; } var decal = getDecalFromPalette(seriesModel.ecModel, current.name || current.dataIndex + "", decalPaletteScope2); node.setVisual("decal", decal); }); } var TreemapSeriesModel = ( /** @class */ (function(_super) { __extends(TreemapSeriesModel2, _super); function TreemapSeriesModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = TreemapSeriesModel2.type; _this.preventUsingHoverLayer = true; return _this; } TreemapSeriesModel2.prototype.getInitialData = function(option, ecModel) { var root = { name: option.name, children: option.data }; completeTreeValue$1(root); var levels = option.levels || []; var designatedVisualItemStyle = this.designatedVisualItemStyle = {}; var designatedVisualModel = new Model({ itemStyle: designatedVisualItemStyle }, this, ecModel); levels = option.levels = setDefault(levels, ecModel); var levelModels = map$1(levels || [], function(levelDefine) { return new Model(levelDefine, designatedVisualModel, ecModel); }, this); var tree = Tree.createTree(root, this, beforeLink); function beforeLink(nodeData) { nodeData.wrapMethod("getItemModel", function(model, idx) { var node = tree.getNodeByDataIndex(idx); var levelModel = node ? levelModels[node.depth] : null; model.parentModel = levelModel || designatedVisualModel; return model; }); } return tree.data; }; TreemapSeriesModel2.prototype.optionUpdated = function() { this.resetViewRoot(); }; TreemapSeriesModel2.prototype.formatTooltip = function(dataIndex, multipleSeries, dataType) { var data = this.getData(); var value = this.getRawValue(dataIndex); var name = data.getName(dataIndex); return createTooltipMarkup("nameValue", { name, value }); }; TreemapSeriesModel2.prototype.getDataParams = function(dataIndex) { var params = _super.prototype.getDataParams.apply(this, arguments); var node = this.getData().tree.getNodeByDataIndex(dataIndex); params.treeAncestors = wrapTreePathInfo(node, this); params.treePathInfo = params.treeAncestors; return params; }; TreemapSeriesModel2.prototype.setLayoutInfo = function(layoutInfo) { this.layoutInfo = this.layoutInfo || {}; extend(this.layoutInfo, layoutInfo); }; TreemapSeriesModel2.prototype.mapIdToIndex = function(id) { var idIndexMap = this._idIndexMap; if (!idIndexMap) { idIndexMap = this._idIndexMap = createHashMap(); this._idIndexMapCount = 0; } var index = idIndexMap.get(id); if (index == null) { idIndexMap.set(id, index = this._idIndexMapCount++); } return index; }; TreemapSeriesModel2.prototype.getViewRoot = function() { return this._viewRoot; }; TreemapSeriesModel2.prototype.resetViewRoot = function(viewRoot) { viewRoot ? this._viewRoot = viewRoot : viewRoot = this._viewRoot; var root = this.getRawData().tree.root; if (!viewRoot || viewRoot !== root && !root.contains(viewRoot)) { this._viewRoot = root; } }; TreemapSeriesModel2.prototype.enableAriaDecal = function() { enableAriaDecalForTree(this); }; TreemapSeriesModel2.type = "series.treemap"; TreemapSeriesModel2.layoutMode = "box"; TreemapSeriesModel2.defaultOption = { // Disable progressive rendering progressive: 0, // size: ['80%', '80%'], // deprecated, compatible with ec2. left: "center", top: "middle", width: "80%", height: "80%", sort: true, clipWindow: "origin", squareRatio: 0.5 * (1 + Math.sqrt(5)), leafDepth: null, drillDownIcon: "▶", // to align specialized icon. ▷▶❒❐▼✚ zoomToNodeRatio: 0.32 * 0.32, scaleLimit: null, roam: true, nodeClick: "zoomToNode", animation: true, animationDurationUpdate: 900, animationEasing: "quinticInOut", breadcrumb: { show: true, height: 22, left: "center", top: "bottom", // right // bottom emptyItemWidth: 25, itemStyle: { color: "rgba(0,0,0,0.7)", textStyle: { color: "#fff" } }, emphasis: { itemStyle: { color: "rgba(0,0,0,0.9)" // '#5793f3', } } }, label: { show: true, // Do not use textDistance, for ellipsis rect just the same as treemap node rect. distance: 0, padding: 5, position: "inside", // formatter: null, color: "#fff", overflow: "truncate" // align // verticalAlign }, upperLabel: { show: false, position: [0, "50%"], height: 20, // formatter: null, // color: '#fff', overflow: "truncate", // align: null, verticalAlign: "middle" }, itemStyle: { color: null, colorAlpha: null, colorSaturation: null, borderWidth: 0, gapWidth: 0, borderColor: "#fff", borderColorSaturation: null // If specified, borderColor will be ineffective, and the // border color is evaluated by color of current node and // borderColorSaturation. }, emphasis: { upperLabel: { show: true, position: [0, "50%"], overflow: "truncate", verticalAlign: "middle" } }, visualDimension: 0, visualMin: null, visualMax: null, color: [], // level[n].color (if necessary). // + Specify color list of each level. level[0].color would be global // color list if not specified. (see method `setDefault`). // + But set as a empty array to forbid fetch color from global palette // when using nodeModel.get('color'), otherwise nodes on deep level // will always has color palette set and are not able to inherit color // from parent node. // + TreemapSeries.color can not be set as 'none', otherwise effect // legend color fetching (see seriesColor.js). colorAlpha: null, colorSaturation: null, colorMappingBy: "index", visibleMin: 10, // be rendered. Only works when sort is 'asc' or 'desc'. childrenVisibleMin: null, // grandchildren will not show. // Why grandchildren? If not grandchildren but children, // some siblings show children and some not, // the appearance may be mess and not consistent, levels: [] // Each item: { // visibleMin, itemStyle, visualDimension, label // } }; return TreemapSeriesModel2; })(SeriesModel) ); function completeTreeValue$1(dataNode) { var sum2 = 0; each$f(dataNode.children, function(child) { completeTreeValue$1(child); var childValue = child.value; isArray$1(childValue) && (childValue = childValue[0]); sum2 += childValue; }); var thisValue = dataNode.value; if (isArray$1(thisValue)) { thisValue = thisValue[0]; } if (thisValue == null || isNaN(thisValue)) { thisValue = sum2; } if (thisValue < 0) { thisValue = 0; } isArray$1(dataNode.value) ? dataNode.value[0] = thisValue : dataNode.value = thisValue; } function setDefault(levels, ecModel) { var globalColorList = normalizeToArray(ecModel.get("color")); var globalDecalList = normalizeToArray(ecModel.get(["aria", "decal", "decals"])); if (!globalColorList) { return; } levels = levels || []; var hasColorDefine; var hasDecalDefine; each$f(levels, function(levelDefine) { var model = new Model(levelDefine); var modelColor = model.get("color"); var modelDecal = model.get("decal"); if (model.get(["itemStyle", "color"]) || modelColor && modelColor !== "none") { hasColorDefine = true; } if (model.get(["itemStyle", "decal"]) || modelDecal && modelDecal !== "none") { hasDecalDefine = true; } }); var level0 = levels[0] || (levels[0] = {}); if (!hasColorDefine) { level0.color = globalColorList.slice(); } if (!hasDecalDefine && globalDecalList) { level0.decal = globalDecalList.slice(); } return levels; } var TEXT_PADDING = 8; var ITEM_GAP = 8; var ARRAY_LENGTH = 5; var Breadcrumb = ( /** @class */ (function() { function Breadcrumb2(containerGroup) { this.group = new Group$3(); containerGroup.add(this.group); } Breadcrumb2.prototype.render = function(seriesModel, api, targetNode, onSelect) { var model = seriesModel.getModel("breadcrumb"); var thisGroup = this.group; thisGroup.removeAll(); if (!model.get("show") || !targetNode) { return; } var normalStyleModel = model.getModel("itemStyle"); var emphasisModel = model.getModel("emphasis"); var textStyleModel = normalStyleModel.getModel("textStyle"); var emphasisTextStyleModel = emphasisModel.getModel(["itemStyle", "textStyle"]); var layoutParam = { pos: { left: model.get("left"), right: model.get("right"), top: model.get("top"), bottom: model.get("bottom") }, box: { width: api.getWidth(), height: api.getHeight() }, emptyItemWidth: model.get("emptyItemWidth"), totalWidth: 0, renderList: [] }; this._prepare(targetNode, layoutParam, textStyleModel); this._renderContent(seriesModel, layoutParam, normalStyleModel, emphasisModel, textStyleModel, emphasisTextStyleModel, onSelect); positionElement(thisGroup, layoutParam.pos, layoutParam.box); }; Breadcrumb2.prototype._prepare = function(targetNode, layoutParam, textStyleModel) { for (var node = targetNode; node; node = node.parentNode) { var text = convertOptionIdName(node.getModel().get("name"), ""); var textRect = textStyleModel.getTextRect(text); var itemWidth = Math.max(textRect.width + TEXT_PADDING * 2, layoutParam.emptyItemWidth); layoutParam.totalWidth += itemWidth + ITEM_GAP; layoutParam.renderList.push({ node, text, width: itemWidth }); } }; Breadcrumb2.prototype._renderContent = function(seriesModel, layoutParam, normalStyleModel, emphasisModel, textStyleModel, emphasisTextStyleModel, onSelect) { var lastX = 0; var emptyItemWidth = layoutParam.emptyItemWidth; var height = seriesModel.get(["breadcrumb", "height"]); var availableSize = getAvailableSize(layoutParam.pos, layoutParam.box); var totalWidth = layoutParam.totalWidth; var renderList = layoutParam.renderList; var emphasisItemStyle = emphasisModel.getModel("itemStyle").getItemStyle(); for (var i = renderList.length - 1; i >= 0; i--) { var item = renderList[i]; var itemNode = item.node; var itemWidth = item.width; var text = item.text; if (totalWidth > availableSize.width) { totalWidth -= itemWidth - emptyItemWidth; itemWidth = emptyItemWidth; text = null; } var el = new Polygon({ shape: { points: makeItemPoints(lastX, 0, itemWidth, height, i === renderList.length - 1, i === 0) }, style: defaults(normalStyleModel.getItemStyle(), { lineJoin: "bevel" }), textContent: new ZRText({ style: createTextStyle(textStyleModel, { text }) }), textConfig: { position: "inside" }, z2: Z2_EMPHASIS_LIFT * 1e4, onclick: curry$1(onSelect, itemNode) }); el.disableLabelAnimation = true; el.getTextContent().ensureState("emphasis").style = createTextStyle(emphasisTextStyleModel, { text }); el.ensureState("emphasis").style = emphasisItemStyle; toggleHoverEmphasis(el, emphasisModel.get("focus"), emphasisModel.get("blurScope"), emphasisModel.get("disabled")); this.group.add(el); packEventData(el, seriesModel, itemNode); lastX += itemWidth + ITEM_GAP; } }; Breadcrumb2.prototype.remove = function() { this.group.removeAll(); }; return Breadcrumb2; })() ); function makeItemPoints(x, y, itemWidth, itemHeight, head, tail) { var points2 = [[head ? x : x - ARRAY_LENGTH, y], [x + itemWidth, y], [x + itemWidth, y + itemHeight], [head ? x : x - ARRAY_LENGTH, y + itemHeight]]; !tail && points2.splice(2, 0, [x + itemWidth + ARRAY_LENGTH, y + itemHeight / 2]); !head && points2.push([x, y + itemHeight / 2]); return points2; } function packEventData(el, seriesModel, itemNode) { getECData(el).eventData = { componentType: "series", componentSubType: "treemap", componentIndex: seriesModel.componentIndex, seriesIndex: seriesModel.seriesIndex, seriesName: seriesModel.name, seriesType: "treemap", selfType: "breadcrumb", nodeData: { dataIndex: itemNode && itemNode.dataIndex, name: itemNode && itemNode.name }, treePathInfo: itemNode && wrapTreePathInfo(itemNode, seriesModel) }; } var AnimationWrap = ( /** @class */ (function() { function AnimationWrap2() { this._storage = []; this._elExistsMap = {}; } AnimationWrap2.prototype.add = function(el, target, duration, delay, easing) { if (this._elExistsMap[el.id]) { return false; } this._elExistsMap[el.id] = true; this._storage.push({ el, target, duration, delay, easing }); return true; }; AnimationWrap2.prototype.finished = function(callback) { this._finishedCallback = callback; return this; }; AnimationWrap2.prototype.start = function() { var _this = this; var count2 = this._storage.length; var checkTerminate = function() { count2--; if (count2 <= 0) { _this._storage.length = 0; _this._elExistsMap = {}; _this._finishedCallback && _this._finishedCallback(); } }; for (var i = 0, len2 = this._storage.length; i < len2; i++) { var item = this._storage[i]; item.el.animateTo(item.target, { duration: item.duration, delay: item.delay, easing: item.easing, setToFinal: true, done: checkTerminate, aborted: checkTerminate }); } return this; }; return AnimationWrap2; })() ); function createWrap() { return new AnimationWrap(); } var Group$2 = Group$3; var Rect$1 = Rect$2; var DRAG_THRESHOLD = 3; var PATH_LABEL_NOAMAL = "label"; var PATH_UPPERLABEL_NORMAL = "upperLabel"; var Z2_BASE = Z2_EMPHASIS_LIFT * 10; var Z2_BG = Z2_EMPHASIS_LIFT * 2; var Z2_CONTENT = Z2_EMPHASIS_LIFT * 3; var getStateItemStyle = makeStyleMapper([ ["fill", "color"], // `borderColor` and `borderWidth` has been occupied, // so use `stroke` to indicate the stroke of the rect. ["stroke", "strokeColor"], ["lineWidth", "strokeWidth"], ["shadowBlur"], ["shadowOffsetX"], ["shadowOffsetY"], ["shadowColor"] // Option decal is in `DecalObject` but style.decal is in `PatternObject`. // So do not transfer decal directly. ]); var getItemStyleNormal = function(model) { var itemStyle = getStateItemStyle(model); itemStyle.stroke = itemStyle.fill = itemStyle.lineWidth = null; return itemStyle; }; var inner$d = makeInner(); var TreemapView = ( /** @class */ (function(_super) { __extends(TreemapView2, _super); function TreemapView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = TreemapView2.type; _this._state = "ready"; _this._storage = createStorage(); return _this; } TreemapView2.prototype.render = function(seriesModel, ecModel, api, payload) { var models = ecModel.findComponents({ mainType: "series", subType: "treemap", query: payload }); if (indexOf(models, seriesModel) < 0) { return; } this.seriesModel = seriesModel; this.api = api; this.ecModel = ecModel; var types = ["treemapZoomToNode", "treemapRootToNode"]; var targetInfo = retrieveTargetInfo(payload, types, seriesModel); var payloadType = payload && payload.type; var layoutInfo = seriesModel.layoutInfo; var isInit = !this._oldTree; var thisStorage = this._storage; var reRoot = payloadType === "treemapRootToNode" && targetInfo && thisStorage ? { rootNodeGroup: thisStorage.nodeGroup[targetInfo.node.getRawIndex()], direction: payload.direction } : null; var containerGroup = this._giveContainerGroup(layoutInfo); var hasAnimation = seriesModel.get("animation"); var renderResult = this._doRender(containerGroup, seriesModel, reRoot); hasAnimation && !isInit && (!payloadType || payloadType === "treemapZoomToNode" || payloadType === "treemapRootToNode") ? this._doAnimation(containerGroup, renderResult, seriesModel, reRoot) : renderResult.renderFinally(); this._resetController(api); this._renderBreadcrumb(seriesModel, api, targetInfo); }; TreemapView2.prototype._giveContainerGroup = function(layoutInfo) { var containerGroup = this._containerGroup; if (!containerGroup) { containerGroup = this._containerGroup = new Group$2(); this._initEvents(containerGroup); this.group.add(containerGroup); } containerGroup.x = layoutInfo.x; containerGroup.y = layoutInfo.y; return containerGroup; }; TreemapView2.prototype._doRender = function(containerGroup, seriesModel, reRoot) { var thisTree = seriesModel.getData().tree; var oldTree = this._oldTree; var lastsForAnimation = createStorage(); var thisStorage = createStorage(); var oldStorage = this._storage; var willInvisibleEls = []; function doRenderNode(thisNode, oldNode, parentGroup, depth) { return renderNode(seriesModel, thisStorage, oldStorage, reRoot, lastsForAnimation, willInvisibleEls, thisNode, oldNode, parentGroup, depth); } dualTravel(thisTree.root ? [thisTree.root] : [], oldTree && oldTree.root ? [oldTree.root] : [], containerGroup, thisTree === oldTree || !oldTree, 0); var willDeleteEls = clearStorage(oldStorage); this._oldTree = thisTree; this._storage = thisStorage; if (this._controllerHost) { var _oldRootLayout = this.seriesModel.layoutInfo; var rootLayout = thisTree.root.getLayout(); if (rootLayout.width === _oldRootLayout.width && rootLayout.height === _oldRootLayout.height) { this._controllerHost.zoom = 1; } } return { lastsForAnimation, willDeleteEls, renderFinally }; function dualTravel(thisViewChildren, oldViewChildren, parentGroup, sameTree, depth) { if (sameTree) { oldViewChildren = thisViewChildren; each$f(thisViewChildren, function(child, index) { !child.isRemoved() && processNode(index, index); }); } else { new DataDiffer(oldViewChildren, thisViewChildren, getKey2, getKey2).add(processNode).update(processNode).remove(curry$1(processNode, null)).execute(); } function getKey2(node) { return node.getId(); } function processNode(newIndex, oldIndex) { var thisNode = newIndex != null ? thisViewChildren[newIndex] : null; var oldNode = oldIndex != null ? oldViewChildren[oldIndex] : null; var group = doRenderNode(thisNode, oldNode, parentGroup, depth); group && dualTravel(thisNode && thisNode.viewChildren || [], oldNode && oldNode.viewChildren || [], group, sameTree, depth + 1); } } function clearStorage(storage2) { var willDeleteEls2 = createStorage(); storage2 && each$f(storage2, function(store, storageName) { var delEls = willDeleteEls2[storageName]; each$f(store, function(el) { el && (delEls.push(el), inner$d(el).willDelete = true); }); }); return willDeleteEls2; } function renderFinally() { each$f(willDeleteEls, function(els) { each$f(els, function(el) { el.parent && el.parent.remove(el); }); }); each$f(willInvisibleEls, function(el) { el.invisible = true; el.dirty(); }); } }; TreemapView2.prototype._doAnimation = function(containerGroup, renderResult, seriesModel, reRoot) { var durationOption = seriesModel.get("animationDurationUpdate"); var easingOption = seriesModel.get("animationEasing"); var duration = (isFunction(durationOption) ? 0 : durationOption) || 0; var easing = (isFunction(easingOption) ? null : easingOption) || "cubicOut"; var animationWrap = createWrap(); each$f(renderResult.willDeleteEls, function(store, storageName) { each$f(store, function(el, rawIndex) { if (el.invisible) { return; } var parent = el.parent; var target; var innerStore = inner$d(parent); if (reRoot && reRoot.direction === "drillDown") { target = parent === reRoot.rootNodeGroup ? { shape: { x: 0, y: 0, width: innerStore.nodeWidth, height: innerStore.nodeHeight }, style: { opacity: 0 } } : { style: { opacity: 0 } }; } else { var targetX = 0; var targetY = 0; if (!innerStore.willDelete) { targetX = innerStore.nodeWidth / 2; targetY = innerStore.nodeHeight / 2; } target = storageName === "nodeGroup" ? { x: targetX, y: targetY, style: { opacity: 0 } } : { shape: { x: targetX, y: targetY, width: 0, height: 0 }, style: { opacity: 0 } }; } target && animationWrap.add(el, target, duration, 0, easing); }); }); each$f(this._storage, function(store, storageName) { each$f(store, function(el, rawIndex) { var last = renderResult.lastsForAnimation[storageName][rawIndex]; var target = {}; if (!last) { return; } if (el instanceof Group$3) { if (last.oldX != null) { target.x = el.x; target.y = el.y; el.x = last.oldX; el.y = last.oldY; } } else { if (last.oldShape) { target.shape = extend({}, el.shape); el.setShape(last.oldShape); } if (last.fadein) { el.setStyle("opacity", 0); target.style = { opacity: 1 }; } else if (el.style.opacity !== 1) { target.style = { opacity: 1 }; } } animationWrap.add(el, target, duration, 0, easing); }); }, this); this._state = "animating"; animationWrap.finished(bind$1(function() { this._state = "ready"; renderResult.renderFinally(); }, this)).start(); }; TreemapView2.prototype._resetController = function(api) { var controller = this._controller; var controllerHost = this._controllerHost; if (!controllerHost) { this._controllerHost = { target: this.group }; controllerHost = this._controllerHost; } if (!controller) { controller = this._controller = new RoamController(api.getZr()); controller.enable(this.seriesModel.get("roam")); controllerHost.zoomLimit = this.seriesModel.get("scaleLimit"); controllerHost.zoom = this.seriesModel.get("zoom"); controller.on("pan", bind$1(this._onPan, this)); controller.on("zoom", bind$1(this._onZoom, this)); } var rect = new BoundingRect(0, 0, api.getWidth(), api.getHeight()); controller.setPointerChecker(function(e, x, y) { return rect.contain(x, y); }); }; TreemapView2.prototype._clearController = function() { var controller = this._controller; this._controllerHost = null; if (controller) { controller.dispose(); controller = null; } }; TreemapView2.prototype._onPan = function(e) { if (this._state !== "animating" && (Math.abs(e.dx) > DRAG_THRESHOLD || Math.abs(e.dy) > DRAG_THRESHOLD)) { var root = this.seriesModel.getData().tree.root; if (!root) { return; } var rootLayout = root.getLayout(); if (!rootLayout) { return; } this.api.dispatchAction({ type: "treemapMove", from: this.uid, seriesId: this.seriesModel.id, rootRect: { x: rootLayout.x + e.dx, y: rootLayout.y + e.dy, width: rootLayout.width, height: rootLayout.height } }); } }; TreemapView2.prototype._onZoom = function(e) { var mouseX = e.originX; var mouseY = e.originY; var zoomDelta = e.scale; if (this._state !== "animating") { var root = this.seriesModel.getData().tree.root; if (!root) { return; } var rootLayout = root.getLayout(); if (!rootLayout) { return; } var rect = new BoundingRect(rootLayout.x, rootLayout.y, rootLayout.width, rootLayout.height); var zoomLimit = null; var _controllerHost = this._controllerHost; zoomLimit = _controllerHost.zoomLimit; var newZoom = _controllerHost.zoom = _controllerHost.zoom || 1; newZoom *= zoomDelta; if (zoomLimit) { var zoomMin = zoomLimit.min || 0; var zoomMax = zoomLimit.max || Infinity; newZoom = Math.max(Math.min(zoomMax, newZoom), zoomMin); } var zoomScale = newZoom / _controllerHost.zoom; _controllerHost.zoom = newZoom; var layoutInfo = this.seriesModel.layoutInfo; mouseX -= layoutInfo.x; mouseY -= layoutInfo.y; var m = create$1(); translate(m, m, [-mouseX, -mouseY]); scale$1(m, m, [zoomScale, zoomScale]); translate(m, m, [mouseX, mouseY]); rect.applyTransform(m); this.api.dispatchAction({ type: "treemapRender", from: this.uid, seriesId: this.seriesModel.id, rootRect: { x: rect.x, y: rect.y, width: rect.width, height: rect.height } }); } }; TreemapView2.prototype._initEvents = function(containerGroup) { var _this = this; containerGroup.on("click", function(e) { if (_this._state !== "ready") { return; } var nodeClick = _this.seriesModel.get("nodeClick", true); if (!nodeClick) { return; } var targetInfo = _this.findTarget(e.offsetX, e.offsetY); if (!targetInfo) { return; } var node = targetInfo.node; if (node.getLayout().isLeafRoot) { _this._rootToNode(targetInfo); } else { if (nodeClick === "zoomToNode") { _this._zoomToNode(targetInfo); } else if (nodeClick === "link") { var itemModel = node.hostTree.data.getItemModel(node.dataIndex); var link = itemModel.get("link", true); var linkTarget = itemModel.get("target", true) || "blank"; link && windowOpen(link, linkTarget); } } }, this); }; TreemapView2.prototype._renderBreadcrumb = function(seriesModel, api, targetInfo) { var _this = this; if (!targetInfo) { targetInfo = seriesModel.get("leafDepth", true) != null ? { node: seriesModel.getViewRoot() } : this.findTarget(api.getWidth() / 2, api.getHeight() / 2); if (!targetInfo) { targetInfo = { node: seriesModel.getData().tree.root }; } } (this._breadcrumb || (this._breadcrumb = new Breadcrumb(this.group))).render(seriesModel, api, targetInfo.node, function(node) { if (_this._state !== "animating") { aboveViewRoot(seriesModel.getViewRoot(), node) ? _this._rootToNode({ node }) : _this._zoomToNode({ node }); } }); }; TreemapView2.prototype.remove = function() { this._clearController(); this._containerGroup && this._containerGroup.removeAll(); this._storage = createStorage(); this._state = "ready"; this._breadcrumb && this._breadcrumb.remove(); }; TreemapView2.prototype.dispose = function() { this._clearController(); }; TreemapView2.prototype._zoomToNode = function(targetInfo) { this.api.dispatchAction({ type: "treemapZoomToNode", from: this.uid, seriesId: this.seriesModel.id, targetNode: targetInfo.node }); }; TreemapView2.prototype._rootToNode = function(targetInfo) { this.api.dispatchAction({ type: "treemapRootToNode", from: this.uid, seriesId: this.seriesModel.id, targetNode: targetInfo.node }); }; TreemapView2.prototype.findTarget = function(x, y) { var targetInfo; var viewRoot = this.seriesModel.getViewRoot(); viewRoot.eachNode({ attr: "viewChildren", order: "preorder" }, function(node) { var bgEl = this._storage.background[node.getRawIndex()]; if (bgEl) { var point = bgEl.transformCoordToLocal(x, y); var shape = bgEl.shape; if (shape.x <= point[0] && point[0] <= shape.x + shape.width && shape.y <= point[1] && point[1] <= shape.y + shape.height) { targetInfo = { node, offsetX: point[0], offsetY: point[1] }; } else { return false; } } }, this); return targetInfo; }; TreemapView2.type = "treemap"; return TreemapView2; })(ChartView) ); function createStorage() { return { nodeGroup: [], background: [], content: [] }; } function renderNode(seriesModel, thisStorage, oldStorage, reRoot, lastsForAnimation, willInvisibleEls, thisNode, oldNode, parentGroup, depth) { if (!thisNode) { return; } var thisLayout = thisNode.getLayout(); var data = seriesModel.getData(); var nodeModel = thisNode.getModel(); data.setItemGraphicEl(thisNode.dataIndex, null); if (!thisLayout || !thisLayout.isInView) { return; } var thisWidth = thisLayout.width; var thisHeight = thisLayout.height; var borderWidth = thisLayout.borderWidth; var thisInvisible = thisLayout.invisible; var thisRawIndex = thisNode.getRawIndex(); var oldRawIndex = oldNode && oldNode.getRawIndex(); var thisViewChildren = thisNode.viewChildren; var upperHeight = thisLayout.upperHeight; var isParent = thisViewChildren && thisViewChildren.length; var itemStyleNormalModel = nodeModel.getModel("itemStyle"); var itemStyleEmphasisModel = nodeModel.getModel(["emphasis", "itemStyle"]); var itemStyleBlurModel = nodeModel.getModel(["blur", "itemStyle"]); var itemStyleSelectModel = nodeModel.getModel(["select", "itemStyle"]); var borderRadius = itemStyleNormalModel.get("borderRadius") || 0; var group = giveGraphic("nodeGroup", Group$2); if (!group) { return; } parentGroup.add(group); group.x = thisLayout.x || 0; group.y = thisLayout.y || 0; group.markRedraw(); inner$d(group).nodeWidth = thisWidth; inner$d(group).nodeHeight = thisHeight; if (thisLayout.isAboveViewRoot) { return group; } var bg = giveGraphic("background", Rect$1, depth, Z2_BG); bg && renderBackground(group, bg, isParent && thisLayout.upperLabelHeight); var emphasisModel = nodeModel.getModel("emphasis"); var focus = emphasisModel.get("focus"); var blurScope = emphasisModel.get("blurScope"); var isDisabled = emphasisModel.get("disabled"); var focusOrIndices = focus === "ancestor" ? thisNode.getAncestorsIndices() : focus === "descendant" ? thisNode.getDescendantIndices() : focus; if (isParent) { if (isHighDownDispatcher(group)) { setAsHighDownDispatcher(group, false); } if (bg) { setAsHighDownDispatcher(bg, !isDisabled); data.setItemGraphicEl(thisNode.dataIndex, bg); enableHoverFocus(bg, focusOrIndices, blurScope); } } else { var content = giveGraphic("content", Rect$1, depth, Z2_CONTENT); content && renderContent(group, content); bg.disableMorphing = true; if (bg && isHighDownDispatcher(bg)) { setAsHighDownDispatcher(bg, false); } setAsHighDownDispatcher(group, !isDisabled); data.setItemGraphicEl(thisNode.dataIndex, group); var cursorStyle = nodeModel.getShallow("cursor"); cursorStyle && content.attr("cursor", cursorStyle); enableHoverFocus(group, focusOrIndices, blurScope); } return group; function renderBackground(group2, bg2, useUpperLabel) { var ecData = getECData(bg2); ecData.dataIndex = thisNode.dataIndex; ecData.seriesIndex = seriesModel.seriesIndex; bg2.setShape({ x: 0, y: 0, width: thisWidth, height: thisHeight, r: borderRadius }); if (thisInvisible) { processInvisible(bg2); } else { bg2.invisible = false; var style = thisNode.getVisual("style"); var visualBorderColor = style.stroke; var normalStyle = getItemStyleNormal(itemStyleNormalModel); normalStyle.fill = visualBorderColor; var emphasisStyle = getStateItemStyle(itemStyleEmphasisModel); emphasisStyle.fill = itemStyleEmphasisModel.get("borderColor"); var blurStyle = getStateItemStyle(itemStyleBlurModel); blurStyle.fill = itemStyleBlurModel.get("borderColor"); var selectStyle = getStateItemStyle(itemStyleSelectModel); selectStyle.fill = itemStyleSelectModel.get("borderColor"); if (useUpperLabel) { var upperLabelWidth = thisWidth - 2 * borderWidth; prepareText( // PENDING: convert ZRColor to ColorString for text. bg2, visualBorderColor, style.opacity, { x: borderWidth, y: 0, width: upperLabelWidth, height: upperHeight } ); } else { bg2.removeTextContent(); } bg2.setStyle(normalStyle); bg2.ensureState("emphasis").style = emphasisStyle; bg2.ensureState("blur").style = blurStyle; bg2.ensureState("select").style = selectStyle; setDefaultStateProxy(bg2); } group2.add(bg2); } function renderContent(group2, content2) { var ecData = getECData(content2); ecData.dataIndex = thisNode.dataIndex; ecData.seriesIndex = seriesModel.seriesIndex; var contentWidth = Math.max(thisWidth - 2 * borderWidth, 0); var contentHeight = Math.max(thisHeight - 2 * borderWidth, 0); content2.culling = true; content2.setShape({ x: borderWidth, y: borderWidth, width: contentWidth, height: contentHeight, r: borderRadius }); if (thisInvisible) { processInvisible(content2); } else { content2.invisible = false; var nodeStyle = thisNode.getVisual("style"); var visualColor = nodeStyle.fill; var normalStyle = getItemStyleNormal(itemStyleNormalModel); normalStyle.fill = visualColor; normalStyle.decal = nodeStyle.decal; var emphasisStyle = getStateItemStyle(itemStyleEmphasisModel); var blurStyle = getStateItemStyle(itemStyleBlurModel); var selectStyle = getStateItemStyle(itemStyleSelectModel); prepareText(content2, visualColor, nodeStyle.opacity, null); content2.setStyle(normalStyle); content2.ensureState("emphasis").style = emphasisStyle; content2.ensureState("blur").style = blurStyle; content2.ensureState("select").style = selectStyle; setDefaultStateProxy(content2); } group2.add(content2); } function processInvisible(element) { !element.invisible && willInvisibleEls.push(element); } function prepareText(rectEl, visualColor, visualOpacity, upperLabelRect) { var normalLabelModel = nodeModel.getModel(upperLabelRect ? PATH_UPPERLABEL_NORMAL : PATH_LABEL_NOAMAL); var defaultText = convertOptionIdName(nodeModel.get("name"), null); var isShow = normalLabelModel.getShallow("show"); setLabelStyle(rectEl, getLabelStatesModels(nodeModel, upperLabelRect ? PATH_UPPERLABEL_NORMAL : PATH_LABEL_NOAMAL), { defaultText: isShow ? defaultText : null, inheritColor: visualColor, defaultOpacity: visualOpacity, labelFetcher: seriesModel, labelDataIndex: thisNode.dataIndex }); var textEl = rectEl.getTextContent(); if (!textEl) { return; } var textStyle = textEl.style; var textPadding = normalizeCssArray$1(textStyle.padding || 0); if (upperLabelRect) { rectEl.setTextConfig({ layoutRect: upperLabelRect }); textEl.disableLabelLayout = true; } textEl.beforeUpdate = function() { var width = Math.max((upperLabelRect ? upperLabelRect.width : rectEl.shape.width) - textPadding[1] - textPadding[3], 0); var height = Math.max((upperLabelRect ? upperLabelRect.height : rectEl.shape.height) - textPadding[0] - textPadding[2], 0); if (textStyle.width !== width || textStyle.height !== height) { textEl.setStyle({ width, height }); } }; textStyle.truncateMinChar = 2; textStyle.lineOverflow = "truncate"; addDrillDownIcon(textStyle, upperLabelRect, thisLayout); var textEmphasisState = textEl.getState("emphasis"); addDrillDownIcon(textEmphasisState ? textEmphasisState.style : null, upperLabelRect, thisLayout); } function addDrillDownIcon(style, upperLabelRect, thisLayout2) { var text = style ? style.text : null; if (!upperLabelRect && thisLayout2.isLeafRoot && text != null) { var iconChar = seriesModel.get("drillDownIcon", true); style.text = iconChar ? iconChar + " " + text : text; } } function giveGraphic(storageName, Ctor, depth2, z) { var element = oldRawIndex != null && oldStorage[storageName][oldRawIndex]; var lasts = lastsForAnimation[storageName]; if (element) { oldStorage[storageName][oldRawIndex] = null; prepareAnimationWhenHasOld(lasts, element); } else if (!thisInvisible) { element = new Ctor(); if (element instanceof Displayable) { element.z2 = calculateZ2(depth2, z); } prepareAnimationWhenNoOld(lasts, element); } return thisStorage[storageName][thisRawIndex] = element; } function prepareAnimationWhenHasOld(lasts, element) { var lastCfg = lasts[thisRawIndex] = {}; if (element instanceof Group$2) { lastCfg.oldX = element.x; lastCfg.oldY = element.y; } else { lastCfg.oldShape = extend({}, element.shape); } } function prepareAnimationWhenNoOld(lasts, element) { var lastCfg = lasts[thisRawIndex] = {}; var parentNode = thisNode.parentNode; var isGroup = element instanceof Group$3; if (parentNode && (!reRoot || reRoot.direction === "drillDown")) { var parentOldX = 0; var parentOldY = 0; var parentOldBg = lastsForAnimation.background[parentNode.getRawIndex()]; if (!reRoot && parentOldBg && parentOldBg.oldShape) { parentOldX = parentOldBg.oldShape.width; parentOldY = parentOldBg.oldShape.height; } if (isGroup) { lastCfg.oldX = 0; lastCfg.oldY = parentOldY; } else { lastCfg.oldShape = { x: parentOldX, y: parentOldY, width: 0, height: 0 }; } } lastCfg.fadein = !isGroup; } } function calculateZ2(depth, z2InLevel) { return depth * Z2_BASE + z2InLevel; } var each$c = each$f; var isObject = isObject$3; var CATEGORY_DEFAULT_VISUAL_INDEX = -1; var VisualMapping = ( /** @class */ (function() { function VisualMapping2(option) { var mappingMethod = option.mappingMethod; var visualType = option.type; var thisOption = this.option = clone$1(option); this.type = visualType; this.mappingMethod = mappingMethod; this._normalizeData = normalizers[mappingMethod]; var visualHandler = VisualMapping2.visualHandlers[visualType]; this.applyVisual = visualHandler.applyVisual; this.getColorMapper = visualHandler.getColorMapper; this._normalizedToVisual = visualHandler._normalizedToVisual[mappingMethod]; if (mappingMethod === "piecewise") { normalizeVisualRange(thisOption); preprocessForPiecewise(thisOption); } else if (mappingMethod === "category") { thisOption.categories ? preprocessForSpecifiedCategory(thisOption) : normalizeVisualRange(thisOption, true); } else { assert(mappingMethod !== "linear" || thisOption.dataExtent); normalizeVisualRange(thisOption); } } VisualMapping2.prototype.mapValueToVisual = function(value) { var normalized = this._normalizeData(value); return this._normalizedToVisual(normalized, value); }; VisualMapping2.prototype.getNormalizer = function() { return bind$1(this._normalizeData, this); }; VisualMapping2.listVisualTypes = function() { return keys(VisualMapping2.visualHandlers); }; VisualMapping2.isValidType = function(visualType) { return VisualMapping2.visualHandlers.hasOwnProperty(visualType); }; VisualMapping2.eachVisual = function(visual, callback, context) { if (isObject$3(visual)) { each$f(visual, callback, context); } else { callback.call(context, visual); } }; VisualMapping2.mapVisual = function(visual, callback, context) { var isPrimary; var newVisual = isArray$1(visual) ? [] : isObject$3(visual) ? {} : (isPrimary = true, null); VisualMapping2.eachVisual(visual, function(v, key) { var newVal = callback.call(context, v, key); isPrimary ? newVisual = newVal : newVisual[key] = newVal; }); return newVisual; }; VisualMapping2.retrieveVisuals = function(obj) { var ret = {}; var hasVisual; obj && each$c(VisualMapping2.visualHandlers, function(h, visualType) { if (obj.hasOwnProperty(visualType)) { ret[visualType] = obj[visualType]; hasVisual = true; } }); return hasVisual ? ret : null; }; VisualMapping2.prepareVisualTypes = function(visualTypes) { if (isArray$1(visualTypes)) { visualTypes = visualTypes.slice(); } else if (isObject(visualTypes)) { var types_1 = []; each$c(visualTypes, function(item, type) { types_1.push(type); }); visualTypes = types_1; } else { return []; } visualTypes.sort(function(type1, type2) { return type2 === "color" && type1 !== "color" && type1.indexOf("color") === 0 ? 1 : -1; }); return visualTypes; }; VisualMapping2.dependsOn = function(visualType1, visualType2) { return visualType2 === "color" ? !!(visualType1 && visualType1.indexOf(visualType2) === 0) : visualType1 === visualType2; }; VisualMapping2.findPieceIndex = function(value, pieceList, findClosestWhenOutside) { var possibleI; var abs = Infinity; for (var i = 0, len2 = pieceList.length; i < len2; i++) { var pieceValue = pieceList[i].value; if (pieceValue != null) { if (pieceValue === value || isString(pieceValue) && pieceValue === value + "") { return i; } findClosestWhenOutside && updatePossible(pieceValue, i); } } for (var i = 0, len2 = pieceList.length; i < len2; i++) { var piece = pieceList[i]; var interval = piece.interval; var close_1 = piece.close; if (interval) { if (interval[0] === -Infinity) { if (littleThan(close_1[1], value, interval[1])) { return i; } } else if (interval[1] === Infinity) { if (littleThan(close_1[0], interval[0], value)) { return i; } } else if (littleThan(close_1[0], interval[0], value) && littleThan(close_1[1], value, interval[1])) { return i; } findClosestWhenOutside && updatePossible(interval[0], i); findClosestWhenOutside && updatePossible(interval[1], i); } } if (findClosestWhenOutside) { return value === Infinity ? pieceList.length - 1 : value === -Infinity ? 0 : possibleI; } function updatePossible(val, index) { var newAbs = Math.abs(val - value); if (newAbs < abs) { abs = newAbs; possibleI = index; } } }; VisualMapping2.visualHandlers = { color: { applyVisual: makeApplyVisual("color"), getColorMapper: function() { var thisOption = this.option; return bind$1(thisOption.mappingMethod === "category" ? function(value, isNormalized) { !isNormalized && (value = this._normalizeData(value)); return doMapCategory.call(this, value); } : function(value, isNormalized, out) { var returnRGBArray = !!out; !isNormalized && (value = this._normalizeData(value)); out = fastLerp(value, thisOption.parsedVisual, out); return returnRGBArray ? out : stringify(out, "rgba"); }, this); }, _normalizedToVisual: { linear: function(normalized) { return stringify(fastLerp(normalized, this.option.parsedVisual), "rgba"); }, category: doMapCategory, piecewise: function(normalized, value) { var result = getSpecifiedVisual.call(this, value); if (result == null) { result = stringify(fastLerp(normalized, this.option.parsedVisual), "rgba"); } return result; }, fixed: doMapFixed } }, colorHue: makePartialColorVisualHandler(function(color, value) { return modifyHSL(color, value); }), colorSaturation: makePartialColorVisualHandler(function(color, value) { return modifyHSL(color, null, value); }), colorLightness: makePartialColorVisualHandler(function(color, value) { return modifyHSL(color, null, null, value); }), colorAlpha: makePartialColorVisualHandler(function(color, value) { return modifyAlpha(color, value); }), decal: { applyVisual: makeApplyVisual("decal"), _normalizedToVisual: { linear: null, category: doMapCategory, piecewise: null, fixed: null } }, opacity: { applyVisual: makeApplyVisual("opacity"), _normalizedToVisual: createNormalizedToNumericVisual([0, 1]) }, liftZ: { applyVisual: makeApplyVisual("liftZ"), _normalizedToVisual: { linear: doMapFixed, category: doMapFixed, piecewise: doMapFixed, fixed: doMapFixed } }, symbol: { applyVisual: function(value, getter, setter) { var symbolCfg = this.mapValueToVisual(value); setter("symbol", symbolCfg); }, _normalizedToVisual: { linear: doMapToArray, category: doMapCategory, piecewise: function(normalized, value) { var result = getSpecifiedVisual.call(this, value); if (result == null) { result = doMapToArray.call(this, normalized); } return result; }, fixed: doMapFixed } }, symbolSize: { applyVisual: makeApplyVisual("symbolSize"), _normalizedToVisual: createNormalizedToNumericVisual([0, 1]) } }; return VisualMapping2; })() ); function preprocessForPiecewise(thisOption) { var pieceList = thisOption.pieceList; thisOption.hasSpecialVisual = false; each$f(pieceList, function(piece, index) { piece.originIndex = index; if (piece.visual != null) { thisOption.hasSpecialVisual = true; } }); } function preprocessForSpecifiedCategory(thisOption) { var categories = thisOption.categories; var categoryMap = thisOption.categoryMap = {}; var visual = thisOption.visual; each$c(categories, function(cate, index) { categoryMap[cate] = index; }); if (!isArray$1(visual)) { var visualArr_1 = []; if (isObject$3(visual)) { each$c(visual, function(v, cate) { var index = categoryMap[cate]; visualArr_1[index != null ? index : CATEGORY_DEFAULT_VISUAL_INDEX] = v; }); } else { visualArr_1[CATEGORY_DEFAULT_VISUAL_INDEX] = visual; } visual = setVisualToOption(thisOption, visualArr_1); } for (var i = categories.length - 1; i >= 0; i--) { if (visual[i] == null) { delete categoryMap[categories[i]]; categories.pop(); } } } function normalizeVisualRange(thisOption, isCategory2) { var visual = thisOption.visual; var visualArr = []; if (isObject$3(visual)) { each$c(visual, function(v) { visualArr.push(v); }); } else if (visual != null) { visualArr.push(visual); } var doNotNeedPair = { color: 1, symbol: 1 }; if (!isCategory2 && visualArr.length === 1 && !doNotNeedPair.hasOwnProperty(thisOption.type)) { visualArr[1] = visualArr[0]; } setVisualToOption(thisOption, visualArr); } function makePartialColorVisualHandler(applyValue) { return { applyVisual: function(value, getter, setter) { var colorChannel = this.mapValueToVisual(value); setter("color", applyValue(getter("color"), colorChannel)); }, _normalizedToVisual: createNormalizedToNumericVisual([0, 1]) }; } function doMapToArray(normalized) { var visual = this.option.visual; return visual[Math.round(linearMap$2(normalized, [0, 1], [0, visual.length - 1], true))] || {}; } function makeApplyVisual(visualType) { return function(value, getter, setter) { setter(visualType, this.mapValueToVisual(value)); }; } function doMapCategory(normalized) { var visual = this.option.visual; return visual[this.option.loop && normalized !== CATEGORY_DEFAULT_VISUAL_INDEX ? normalized % visual.length : normalized]; } function doMapFixed() { return this.option.visual[0]; } function createNormalizedToNumericVisual(sourceExtent) { return { linear: function(normalized) { return linearMap$2(normalized, sourceExtent, this.option.visual, true); }, category: doMapCategory, piecewise: function(normalized, value) { var result = getSpecifiedVisual.call(this, value); if (result == null) { result = linearMap$2(normalized, sourceExtent, this.option.visual, true); } return result; }, fixed: doMapFixed }; } function getSpecifiedVisual(value) { var thisOption = this.option; var pieceList = thisOption.pieceList; if (thisOption.hasSpecialVisual) { var pieceIndex = VisualMapping.findPieceIndex(value, pieceList); var piece = pieceList[pieceIndex]; if (piece && piece.visual) { return piece.visual[this.type]; } } } function setVisualToOption(thisOption, visualArr) { thisOption.visual = visualArr; if (thisOption.type === "color") { thisOption.parsedVisual = map$1(visualArr, function(item) { var color = parse(item); return color || [0, 0, 0, 1]; }); } return visualArr; } var normalizers = { linear: function(value) { return linearMap$2(value, this.option.dataExtent, [0, 1], true); }, piecewise: function(value) { var pieceList = this.option.pieceList; var pieceIndex = VisualMapping.findPieceIndex(value, pieceList, true); if (pieceIndex != null) { return linearMap$2(pieceIndex, [0, pieceList.length - 1], [0, 1], true); } }, category: function(value) { var index = this.option.categories ? this.option.categoryMap[value] : value; return index == null ? CATEGORY_DEFAULT_VISUAL_INDEX : index; }, fixed: noop }; function littleThan(close, a, b) { return close ? a <= b : a < b; } var ITEM_STYLE_NORMAL = "itemStyle"; var inner$c = makeInner(); const treemapVisual = { seriesType: "treemap", reset: function(seriesModel) { var tree = seriesModel.getData().tree; var root = tree.root; if (root.isRemoved()) { return; } travelTree( root, // Visual should calculate from tree root but not view root. {}, seriesModel.getViewRoot().getAncestors(), seriesModel ); } }; function travelTree(node, designatedVisual, viewRootAncestors, seriesModel) { var nodeModel = node.getModel(); var nodeLayout = node.getLayout(); var data = node.hostTree.data; if (!nodeLayout || nodeLayout.invisible || !nodeLayout.isInView) { return; } var nodeItemStyleModel = nodeModel.getModel(ITEM_STYLE_NORMAL); var visuals = buildVisuals(nodeItemStyleModel, designatedVisual, seriesModel); var existsStyle = data.ensureUniqueItemVisual(node.dataIndex, "style"); var borderColor = nodeItemStyleModel.get("borderColor"); var borderColorSaturation = nodeItemStyleModel.get("borderColorSaturation"); var thisNodeColor; if (borderColorSaturation != null) { thisNodeColor = calculateColor(visuals); borderColor = calculateBorderColor(borderColorSaturation, thisNodeColor); } existsStyle.stroke = borderColor; var viewChildren = node.viewChildren; if (!viewChildren || !viewChildren.length) { thisNodeColor = calculateColor(visuals); existsStyle.fill = thisNodeColor; } else { var mapping_1 = buildVisualMapping(node, nodeModel, nodeLayout, nodeItemStyleModel, visuals, viewChildren); each$f(viewChildren, function(child, index) { if (child.depth >= viewRootAncestors.length || child === viewRootAncestors[child.depth]) { var childVisual = mapVisual$1(nodeModel, visuals, child, index, mapping_1, seriesModel); travelTree(child, childVisual, viewRootAncestors, seriesModel); } }); } } function buildVisuals(nodeItemStyleModel, designatedVisual, seriesModel) { var visuals = extend({}, designatedVisual); var designatedVisualItemStyle = seriesModel.designatedVisualItemStyle; each$f(["color", "colorAlpha", "colorSaturation"], function(visualName) { designatedVisualItemStyle[visualName] = designatedVisual[visualName]; var val = nodeItemStyleModel.get(visualName); designatedVisualItemStyle[visualName] = null; val != null && (visuals[visualName] = val); }); return visuals; } function calculateColor(visuals) { var color = getValueVisualDefine(visuals, "color"); if (color) { var colorAlpha = getValueVisualDefine(visuals, "colorAlpha"); var colorSaturation = getValueVisualDefine(visuals, "colorSaturation"); if (colorSaturation) { color = modifyHSL(color, null, null, colorSaturation); } if (colorAlpha) { color = modifyAlpha(color, colorAlpha); } return color; } } function calculateBorderColor(borderColorSaturation, thisNodeColor) { return thisNodeColor != null ? modifyHSL(thisNodeColor, null, null, borderColorSaturation) : null; } function getValueVisualDefine(visuals, name) { var value = visuals[name]; if (value != null && value !== "none") { return value; } } function buildVisualMapping(node, nodeModel, nodeLayout, nodeItemStyleModel, visuals, viewChildren) { if (!viewChildren || !viewChildren.length) { return; } var rangeVisual = getRangeVisual(nodeModel, "color") || visuals.color != null && visuals.color !== "none" && (getRangeVisual(nodeModel, "colorAlpha") || getRangeVisual(nodeModel, "colorSaturation")); if (!rangeVisual) { return; } var visualMin = nodeModel.get("visualMin"); var visualMax = nodeModel.get("visualMax"); var dataExtent = nodeLayout.dataExtent.slice(); visualMin != null && visualMin < dataExtent[0] && (dataExtent[0] = visualMin); visualMax != null && visualMax > dataExtent[1] && (dataExtent[1] = visualMax); var colorMappingBy = nodeModel.get("colorMappingBy"); var opt = { type: rangeVisual.name, dataExtent, visual: rangeVisual.range }; if (opt.type === "color" && (colorMappingBy === "index" || colorMappingBy === "id")) { opt.mappingMethod = "category"; opt.loop = true; } else { opt.mappingMethod = "linear"; } var mapping = new VisualMapping(opt); inner$c(mapping).drColorMappingBy = colorMappingBy; return mapping; } function getRangeVisual(nodeModel, name) { var range = nodeModel.get(name); return isArray$1(range) && range.length ? { name, range } : null; } function mapVisual$1(nodeModel, visuals, child, index, mapping, seriesModel) { var childVisuals = extend({}, visuals); if (mapping) { var mappingType = mapping.type; var colorMappingBy = mappingType === "color" && inner$c(mapping).drColorMappingBy; var value = colorMappingBy === "index" ? index : colorMappingBy === "id" ? seriesModel.mapIdToIndex(child.getId()) : child.getValue(nodeModel.get("visualDimension")); childVisuals[mappingType] = mapping.mapValueToVisual(value); } return childVisuals; } var mathMax$3 = Math.max; var mathMin$3 = Math.min; var retrieveValue = retrieve; var each$b = each$f; var PATH_BORDER_WIDTH = ["itemStyle", "borderWidth"]; var PATH_GAP_WIDTH = ["itemStyle", "gapWidth"]; var PATH_UPPER_LABEL_SHOW = ["upperLabel", "show"]; var PATH_UPPER_LABEL_HEIGHT = ["upperLabel", "height"]; const treemapLayout = { seriesType: "treemap", reset: function(seriesModel, ecModel, api, payload) { var ecWidth = api.getWidth(); var ecHeight = api.getHeight(); var seriesOption = seriesModel.option; var layoutInfo = getLayoutRect(seriesModel.getBoxLayoutParams(), { width: api.getWidth(), height: api.getHeight() }); var size = seriesOption.size || []; var containerWidth = parsePercent(retrieveValue(layoutInfo.width, size[0]), ecWidth); var containerHeight = parsePercent(retrieveValue(layoutInfo.height, size[1]), ecHeight); var payloadType = payload && payload.type; var types = ["treemapZoomToNode", "treemapRootToNode"]; var targetInfo = retrieveTargetInfo(payload, types, seriesModel); var rootRect = payloadType === "treemapRender" || payloadType === "treemapMove" ? payload.rootRect : null; var viewRoot = seriesModel.getViewRoot(); var viewAbovePath = getPathToRoot(viewRoot); if (payloadType !== "treemapMove") { var rootSize = payloadType === "treemapZoomToNode" ? estimateRootSize(seriesModel, targetInfo, viewRoot, containerWidth, containerHeight) : rootRect ? [rootRect.width, rootRect.height] : [containerWidth, containerHeight]; var sort_1 = seriesOption.sort; if (sort_1 && sort_1 !== "asc" && sort_1 !== "desc") { sort_1 = "desc"; } var options = { squareRatio: seriesOption.squareRatio, sort: sort_1, leafDepth: seriesOption.leafDepth }; viewRoot.hostTree.clearLayouts(); var viewRootLayout_1 = { x: 0, y: 0, width: rootSize[0], height: rootSize[1], area: rootSize[0] * rootSize[1] }; viewRoot.setLayout(viewRootLayout_1); squarify(viewRoot, options, false, 0); viewRootLayout_1 = viewRoot.getLayout(); each$b(viewAbovePath, function(node, index) { var childValue = (viewAbovePath[index + 1] || viewRoot).getValue(); node.setLayout(extend({ dataExtent: [childValue, childValue], borderWidth: 0, upperHeight: 0 }, viewRootLayout_1)); }); } var treeRoot = seriesModel.getData().tree.root; treeRoot.setLayout(calculateRootPosition(layoutInfo, rootRect, targetInfo), true); seriesModel.setLayoutInfo(layoutInfo); prunning( treeRoot, // Transform to base element coordinate system. new BoundingRect(-layoutInfo.x, -layoutInfo.y, ecWidth, ecHeight), viewAbovePath, viewRoot, 0 ); } }; function squarify(node, options, hideChildren, depth) { var width; var height; if (node.isRemoved()) { return; } var thisLayout = node.getLayout(); width = thisLayout.width; height = thisLayout.height; var nodeModel = node.getModel(); var borderWidth = nodeModel.get(PATH_BORDER_WIDTH); var halfGapWidth = nodeModel.get(PATH_GAP_WIDTH) / 2; var upperLabelHeight = getUpperLabelHeight(nodeModel); var upperHeight = Math.max(borderWidth, upperLabelHeight); var layoutOffset = borderWidth - halfGapWidth; var layoutOffsetUpper = upperHeight - halfGapWidth; node.setLayout({ borderWidth, upperHeight, upperLabelHeight }, true); width = mathMax$3(width - 2 * layoutOffset, 0); height = mathMax$3(height - layoutOffset - layoutOffsetUpper, 0); var totalArea = width * height; var viewChildren = initChildren$1(node, nodeModel, totalArea, options, hideChildren, depth); if (!viewChildren.length) { return; } var rect = { x: layoutOffset, y: layoutOffsetUpper, width, height }; var rowFixedLength = mathMin$3(width, height); var best = Infinity; var row = []; row.area = 0; for (var i = 0, len2 = viewChildren.length; i < len2; ) { var child = viewChildren[i]; row.push(child); row.area += child.getLayout().area; var score = worst(row, rowFixedLength, options.squareRatio); if (score <= best) { i++; best = score; } else { row.area -= row.pop().getLayout().area; position(row, rowFixedLength, rect, halfGapWidth, false); rowFixedLength = mathMin$3(rect.width, rect.height); row.length = row.area = 0; best = Infinity; } } if (row.length) { position(row, rowFixedLength, rect, halfGapWidth, true); } if (!hideChildren) { var childrenVisibleMin = nodeModel.get("childrenVisibleMin"); if (childrenVisibleMin != null && totalArea < childrenVisibleMin) { hideChildren = true; } } for (var i = 0, len2 = viewChildren.length; i < len2; i++) { squarify(viewChildren[i], options, hideChildren, depth + 1); } } function initChildren$1(node, nodeModel, totalArea, options, hideChildren, depth) { var viewChildren = node.children || []; var orderBy = options.sort; orderBy !== "asc" && orderBy !== "desc" && (orderBy = null); var overLeafDepth = options.leafDepth != null && options.leafDepth <= depth; if (hideChildren && !overLeafDepth) { return node.viewChildren = []; } viewChildren = filter(viewChildren, function(child) { return !child.isRemoved(); }); sort$1(viewChildren, orderBy); var info = statistic(nodeModel, viewChildren, orderBy); if (info.sum === 0) { return node.viewChildren = []; } info.sum = filterByThreshold(nodeModel, totalArea, info.sum, orderBy, viewChildren); if (info.sum === 0) { return node.viewChildren = []; } for (var i = 0, len2 = viewChildren.length; i < len2; i++) { var area = viewChildren[i].getValue() / info.sum * totalArea; viewChildren[i].setLayout({ area }); } if (overLeafDepth) { viewChildren.length && node.setLayout({ isLeafRoot: true }, true); viewChildren.length = 0; } node.viewChildren = viewChildren; node.setLayout({ dataExtent: info.dataExtent }, true); return viewChildren; } function filterByThreshold(nodeModel, totalArea, sum2, orderBy, orderedChildren) { if (!orderBy) { return sum2; } var visibleMin = nodeModel.get("visibleMin"); var len2 = orderedChildren.length; var deletePoint = len2; for (var i = len2 - 1; i >= 0; i--) { var value = orderedChildren[orderBy === "asc" ? len2 - i - 1 : i].getValue(); if (value / sum2 * totalArea < visibleMin) { deletePoint = i; sum2 -= value; } } orderBy === "asc" ? orderedChildren.splice(0, len2 - deletePoint) : orderedChildren.splice(deletePoint, len2 - deletePoint); return sum2; } function sort$1(viewChildren, orderBy) { if (orderBy) { viewChildren.sort(function(a, b) { var diff = orderBy === "asc" ? a.getValue() - b.getValue() : b.getValue() - a.getValue(); return diff === 0 ? orderBy === "asc" ? a.dataIndex - b.dataIndex : b.dataIndex - a.dataIndex : diff; }); } return viewChildren; } function statistic(nodeModel, children, orderBy) { var sum2 = 0; for (var i = 0, len2 = children.length; i < len2; i++) { sum2 += children[i].getValue(); } var dimension = nodeModel.get("visualDimension"); var dataExtent; if (!children || !children.length) { dataExtent = [NaN, NaN]; } else if (dimension === "value" && orderBy) { dataExtent = [children[children.length - 1].getValue(), children[0].getValue()]; orderBy === "asc" && dataExtent.reverse(); } else { dataExtent = [Infinity, -Infinity]; each$b(children, function(child) { var value = child.getValue(dimension); value < dataExtent[0] && (dataExtent[0] = value); value > dataExtent[1] && (dataExtent[1] = value); }); } return { sum: sum2, dataExtent }; } function worst(row, rowFixedLength, ratio) { var areaMax = 0; var areaMin = Infinity; for (var i = 0, area = void 0, len2 = row.length; i < len2; i++) { area = row[i].getLayout().area; if (area) { area < areaMin && (areaMin = area); area > areaMax && (areaMax = area); } } var squareArea = row.area * row.area; var f = rowFixedLength * rowFixedLength * ratio; return squareArea ? mathMax$3(f * areaMax / squareArea, squareArea / (f * areaMin)) : Infinity; } function position(row, rowFixedLength, rect, halfGapWidth, flush) { var idx0WhenH = rowFixedLength === rect.width ? 0 : 1; var idx1WhenH = 1 - idx0WhenH; var xy = ["x", "y"]; var wh = ["width", "height"]; var last = rect[xy[idx0WhenH]]; var rowOtherLength = rowFixedLength ? row.area / rowFixedLength : 0; if (flush || rowOtherLength > rect[wh[idx1WhenH]]) { rowOtherLength = rect[wh[idx1WhenH]]; } for (var i = 0, rowLen = row.length; i < rowLen; i++) { var node = row[i]; var nodeLayout = {}; var step = rowOtherLength ? node.getLayout().area / rowOtherLength : 0; var wh1 = nodeLayout[wh[idx1WhenH]] = mathMax$3(rowOtherLength - 2 * halfGapWidth, 0); var remain = rect[xy[idx0WhenH]] + rect[wh[idx0WhenH]] - last; var modWH = i === rowLen - 1 || remain < step ? remain : step; var wh0 = nodeLayout[wh[idx0WhenH]] = mathMax$3(modWH - 2 * halfGapWidth, 0); nodeLayout[xy[idx1WhenH]] = rect[xy[idx1WhenH]] + mathMin$3(halfGapWidth, wh1 / 2); nodeLayout[xy[idx0WhenH]] = last + mathMin$3(halfGapWidth, wh0 / 2); last += modWH; node.setLayout(nodeLayout, true); } rect[xy[idx1WhenH]] += rowOtherLength; rect[wh[idx1WhenH]] -= rowOtherLength; } function estimateRootSize(seriesModel, targetInfo, viewRoot, containerWidth, containerHeight) { var currNode = (targetInfo || {}).node; var defaultSize = [containerWidth, containerHeight]; if (!currNode || currNode === viewRoot) { return defaultSize; } var parent; var viewArea = containerWidth * containerHeight; var area = viewArea * seriesModel.option.zoomToNodeRatio; while (parent = currNode.parentNode) { var sum2 = 0; var siblings = parent.children; for (var i = 0, len2 = siblings.length; i < len2; i++) { sum2 += siblings[i].getValue(); } var currNodeValue = currNode.getValue(); if (currNodeValue === 0) { return defaultSize; } area *= sum2 / currNodeValue; var parentModel = parent.getModel(); var borderWidth = parentModel.get(PATH_BORDER_WIDTH); var upperHeight = Math.max(borderWidth, getUpperLabelHeight(parentModel)); area += 4 * borderWidth * borderWidth + (3 * borderWidth + upperHeight) * Math.pow(area, 0.5); area > MAX_SAFE_INTEGER && (area = MAX_SAFE_INTEGER); currNode = parent; } area < viewArea && (area = viewArea); var scale2 = Math.pow(area / viewArea, 0.5); return [containerWidth * scale2, containerHeight * scale2]; } function calculateRootPosition(layoutInfo, rootRect, targetInfo) { if (rootRect) { return { x: rootRect.x, y: rootRect.y }; } var defaultPosition = { x: 0, y: 0 }; if (!targetInfo) { return defaultPosition; } var targetNode = targetInfo.node; var layout2 = targetNode.getLayout(); if (!layout2) { return defaultPosition; } var targetCenter = [layout2.width / 2, layout2.height / 2]; var node = targetNode; while (node) { var nodeLayout = node.getLayout(); targetCenter[0] += nodeLayout.x; targetCenter[1] += nodeLayout.y; node = node.parentNode; } return { x: layoutInfo.width / 2 - targetCenter[0], y: layoutInfo.height / 2 - targetCenter[1] }; } function prunning(node, clipRect, viewAbovePath, viewRoot, depth) { var nodeLayout = node.getLayout(); var nodeInViewAbovePath = viewAbovePath[depth]; var isAboveViewRoot = nodeInViewAbovePath && nodeInViewAbovePath === node; if (nodeInViewAbovePath && !isAboveViewRoot || depth === viewAbovePath.length && node !== viewRoot) { return; } node.setLayout({ // isInView means: viewRoot sub tree + viewAbovePath isInView: true, // invisible only means: outside view clip so that the node can not // see but still layout for animation preparation but not render. invisible: !isAboveViewRoot && !clipRect.intersect(nodeLayout), isAboveViewRoot }, true); var childClipRect = new BoundingRect(clipRect.x - nodeLayout.x, clipRect.y - nodeLayout.y, clipRect.width, clipRect.height); each$b(node.viewChildren || [], function(child) { prunning(child, childClipRect, viewAbovePath, viewRoot, depth + 1); }); } function getUpperLabelHeight(model) { return model.get(PATH_UPPER_LABEL_SHOW) ? model.get(PATH_UPPER_LABEL_HEIGHT) : 0; } function install$I(registers) { registers.registerSeriesModel(TreemapSeriesModel); registers.registerChartView(TreemapView); registers.registerVisual(treemapVisual); registers.registerLayout(treemapLayout); installTreemapAction(registers); } function categoryFilter(ecModel) { var legendModels = ecModel.findComponents({ mainType: "legend" }); if (!legendModels || !legendModels.length) { return; } ecModel.eachSeriesByType("graph", function(graphSeries) { var categoriesData = graphSeries.getCategoriesData(); var graph = graphSeries.getGraph(); var data = graph.data; var categoryNames = categoriesData.mapArray(categoriesData.getName); data.filterSelf(function(idx) { var model = data.getItemModel(idx); var category = model.getShallow("category"); if (category != null) { if (isNumber(category)) { category = categoryNames[category]; } for (var i = 0; i < legendModels.length; i++) { if (!legendModels[i].isSelected(category)) { return false; } } } return true; }); }); } function categoryVisual(ecModel) { var paletteScope = {}; ecModel.eachSeriesByType("graph", function(seriesModel) { var categoriesData = seriesModel.getCategoriesData(); var data = seriesModel.getData(); var categoryNameIdxMap = {}; categoriesData.each(function(idx) { var name = categoriesData.getName(idx); categoryNameIdxMap["ec-" + name] = idx; var itemModel = categoriesData.getItemModel(idx); var style = itemModel.getModel("itemStyle").getItemStyle(); if (!style.fill) { style.fill = seriesModel.getColorFromPalette(name, paletteScope); } categoriesData.setItemVisual(idx, "style", style); var symbolVisualList = ["symbol", "symbolSize", "symbolKeepAspect"]; for (var i = 0; i < symbolVisualList.length; i++) { var symbolVisual = itemModel.getShallow(symbolVisualList[i], true); if (symbolVisual != null) { categoriesData.setItemVisual(idx, symbolVisualList[i], symbolVisual); } } }); if (categoriesData.count()) { data.each(function(idx) { var model = data.getItemModel(idx); var categoryIdx = model.getShallow("category"); if (categoryIdx != null) { if (isString(categoryIdx)) { categoryIdx = categoryNameIdxMap["ec-" + categoryIdx]; } var categoryStyle = categoriesData.getItemVisual(categoryIdx, "style"); var style = data.ensureUniqueItemVisual(idx, "style"); extend(style, categoryStyle); var visualList = ["symbol", "symbolSize", "symbolKeepAspect"]; for (var i = 0; i < visualList.length; i++) { data.setItemVisual(idx, visualList[i], categoriesData.getItemVisual(categoryIdx, visualList[i])); } } }); } }); } function normalize$1(a) { if (!(a instanceof Array)) { a = [a, a]; } return a; } function graphEdgeVisual(ecModel) { ecModel.eachSeriesByType("graph", function(seriesModel) { var graph = seriesModel.getGraph(); var edgeData = seriesModel.getEdgeData(); var symbolType = normalize$1(seriesModel.get("edgeSymbol")); var symbolSize = normalize$1(seriesModel.get("edgeSymbolSize")); edgeData.setVisual("fromSymbol", symbolType && symbolType[0]); edgeData.setVisual("toSymbol", symbolType && symbolType[1]); edgeData.setVisual("fromSymbolSize", symbolSize && symbolSize[0]); edgeData.setVisual("toSymbolSize", symbolSize && symbolSize[1]); edgeData.setVisual("style", seriesModel.getModel("lineStyle").getLineStyle()); edgeData.each(function(idx) { var itemModel = edgeData.getItemModel(idx); var edge = graph.getEdgeByIndex(idx); var symbolType2 = normalize$1(itemModel.getShallow("symbol", true)); var symbolSize2 = normalize$1(itemModel.getShallow("symbolSize", true)); var style = itemModel.getModel("lineStyle").getLineStyle(); var existsStyle = edgeData.ensureUniqueItemVisual(idx, "style"); extend(existsStyle, style); switch (existsStyle.stroke) { case "source": { var nodeStyle = edge.node1.getVisual("style"); existsStyle.stroke = nodeStyle && nodeStyle.fill; break; } case "target": { var nodeStyle = edge.node2.getVisual("style"); existsStyle.stroke = nodeStyle && nodeStyle.fill; break; } } symbolType2[0] && edge.setVisual("fromSymbol", symbolType2[0]); symbolType2[1] && edge.setVisual("toSymbol", symbolType2[1]); symbolSize2[0] && edge.setVisual("fromSymbolSize", symbolSize2[0]); symbolSize2[1] && edge.setVisual("toSymbolSize", symbolSize2[1]); }); }); } var KEY_DELIMITER = "-->"; var getAutoCurvenessParams = function(seriesModel) { return seriesModel.get("autoCurveness") || null; }; var createCurveness = function(seriesModel, appendLength) { var autoCurvenessParmas = getAutoCurvenessParams(seriesModel); var length = 20; var curvenessList = []; if (isNumber(autoCurvenessParmas)) { length = autoCurvenessParmas; } else if (isArray$1(autoCurvenessParmas)) { seriesModel.__curvenessList = autoCurvenessParmas; return; } if (appendLength > length) { length = appendLength; } var len2 = length % 2 ? length + 2 : length + 3; curvenessList = []; for (var i = 0; i < len2; i++) { curvenessList.push((i % 2 ? i + 1 : i) / 10 * (i % 2 ? -1 : 1)); } seriesModel.__curvenessList = curvenessList; }; var getKeyOfEdges = function(n1, n2, seriesModel) { var source = [n1.id, n1.dataIndex].join("."); var target = [n2.id, n2.dataIndex].join("."); return [seriesModel.uid, source, target].join(KEY_DELIMITER); }; var getOppositeKey = function(key) { var keys2 = key.split(KEY_DELIMITER); return [keys2[0], keys2[2], keys2[1]].join(KEY_DELIMITER); }; var getEdgeFromMap = function(edge, seriesModel) { var key = getKeyOfEdges(edge.node1, edge.node2, seriesModel); return seriesModel.__edgeMap[key]; }; var getTotalLengthBetweenNodes = function(edge, seriesModel) { var len2 = getEdgeMapLengthWithKey(getKeyOfEdges(edge.node1, edge.node2, seriesModel), seriesModel); var lenV = getEdgeMapLengthWithKey(getKeyOfEdges(edge.node2, edge.node1, seriesModel), seriesModel); return len2 + lenV; }; var getEdgeMapLengthWithKey = function(key, seriesModel) { var edgeMap = seriesModel.__edgeMap; return edgeMap[key] ? edgeMap[key].length : 0; }; function initCurvenessList(seriesModel) { if (!getAutoCurvenessParams(seriesModel)) { return; } seriesModel.__curvenessList = []; seriesModel.__edgeMap = {}; createCurveness(seriesModel); } function createEdgeMapForCurveness(n1, n2, seriesModel, index) { if (!getAutoCurvenessParams(seriesModel)) { return; } var key = getKeyOfEdges(n1, n2, seriesModel); var edgeMap = seriesModel.__edgeMap; var oppositeEdges = edgeMap[getOppositeKey(key)]; if (edgeMap[key] && !oppositeEdges) { edgeMap[key].isForward = true; } else if (oppositeEdges && edgeMap[key]) { oppositeEdges.isForward = true; edgeMap[key].isForward = false; } edgeMap[key] = edgeMap[key] || []; edgeMap[key].push(index); } function getCurvenessForEdge(edge, seriesModel, index, needReverse) { var autoCurvenessParams = getAutoCurvenessParams(seriesModel); var isArrayParam = isArray$1(autoCurvenessParams); if (!autoCurvenessParams) { return null; } var edgeArray = getEdgeFromMap(edge, seriesModel); if (!edgeArray) { return null; } var edgeIndex = -1; for (var i = 0; i < edgeArray.length; i++) { if (edgeArray[i] === index) { edgeIndex = i; break; } } var totalLen = getTotalLengthBetweenNodes(edge, seriesModel); createCurveness(seriesModel, totalLen); edge.lineStyle = edge.lineStyle || {}; var curKey = getKeyOfEdges(edge.node1, edge.node2, seriesModel); var curvenessList = seriesModel.__curvenessList; var parityCorrection = isArrayParam ? 0 : totalLen % 2 ? 0 : 1; if (!edgeArray.isForward) { var oppositeKey = getOppositeKey(curKey); var len2 = getEdgeMapLengthWithKey(oppositeKey, seriesModel); var resValue = curvenessList[edgeIndex + len2 + parityCorrection]; if (needReverse) { if (isArrayParam) { if (autoCurvenessParams && autoCurvenessParams[0] === 0) { return (len2 + parityCorrection) % 2 ? resValue : -resValue; } else { return ((len2 % 2 ? 0 : 1) + parityCorrection) % 2 ? resValue : -resValue; } } else { return (len2 + parityCorrection) % 2 ? resValue : -resValue; } } else { return curvenessList[edgeIndex + len2 + parityCorrection]; } } else { return curvenessList[parityCorrection + edgeIndex]; } } function simpleLayout(seriesModel) { var coordSys = seriesModel.coordinateSystem; if (coordSys && coordSys.type !== "view") { return; } var graph = seriesModel.getGraph(); graph.eachNode(function(node) { var model = node.getModel(); node.setLayout([+model.get("x"), +model.get("y")]); }); simpleLayoutEdge(graph, seriesModel); } function simpleLayoutEdge(graph, seriesModel) { graph.eachEdge(function(edge, index) { var curveness = retrieve3(edge.getModel().get(["lineStyle", "curveness"]), -getCurvenessForEdge(edge, seriesModel, index, true), 0); var p1 = clone$2(edge.node1.getLayout()); var p2 = clone$2(edge.node2.getLayout()); var points2 = [p1, p2]; if (+curveness) { points2.push([(p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * curveness, (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * curveness]); } edge.setLayout(points2); }); } function graphSimpleLayout(ecModel, api) { ecModel.eachSeriesByType("graph", function(seriesModel) { var layout2 = seriesModel.get("layout"); var coordSys = seriesModel.coordinateSystem; if (coordSys && coordSys.type !== "view") { var data_1 = seriesModel.getData(); var dimensions_1 = []; each$f(coordSys.dimensions, function(coordDim) { dimensions_1 = dimensions_1.concat(data_1.mapDimensionsAll(coordDim)); }); for (var dataIndex = 0; dataIndex < data_1.count(); dataIndex++) { var value = []; var hasValue = false; for (var i = 0; i < dimensions_1.length; i++) { var val = data_1.get(dimensions_1[i], dataIndex); if (!isNaN(val)) { hasValue = true; } value.push(val); } if (hasValue) { data_1.setItemLayout(dataIndex, coordSys.dataToPoint(value)); } else { data_1.setItemLayout(dataIndex, [NaN, NaN]); } } simpleLayoutEdge(data_1.graph, seriesModel); } else if (!layout2 || layout2 === "none") { simpleLayout(seriesModel); } }); } function getNodeGlobalScale(seriesModel) { var coordSys = seriesModel.coordinateSystem; if (coordSys.type !== "view") { return 1; } var nodeScaleRatio = seriesModel.option.nodeScaleRatio; var groupZoom = coordSys.scaleX; var roamZoom = coordSys.getZoom(); var nodeScale = (roamZoom - 1) * nodeScaleRatio + 1; return nodeScale / groupZoom; } function getSymbolSize(node) { var symbolSize = node.getVisual("symbolSize"); if (symbolSize instanceof Array) { symbolSize = (symbolSize[0] + symbolSize[1]) / 2; } return +symbolSize; } var PI$2 = Math.PI; var _symbolRadiansHalf = []; function circularLayout(seriesModel, basedOn, draggingNode, pointer) { var coordSys = seriesModel.coordinateSystem; if (coordSys && coordSys.type !== "view") { return; } var rect = coordSys.getBoundingRect(); var nodeData = seriesModel.getData(); var graph = nodeData.graph; var cx = rect.width / 2 + rect.x; var cy = rect.height / 2 + rect.y; var r = Math.min(rect.width, rect.height) / 2; var count2 = nodeData.count(); nodeData.setLayout({ cx, cy }); if (!count2) { return; } if (draggingNode) { var _a2 = coordSys.pointToData(pointer), tempX = _a2[0], tempY = _a2[1]; var v = [tempX - cx, tempY - cy]; normalize$3(v, v); scale$2(v, v, r); draggingNode.setLayout([cx + v[0], cy + v[1]], true); var circularRotateLabel = seriesModel.get(["circular", "rotateLabel"]); rotateNodeLabel(draggingNode, circularRotateLabel, cx, cy); } _layoutNodesBasedOn[basedOn](seriesModel, graph, nodeData, r, cx, cy, count2); graph.eachEdge(function(edge, index) { var curveness = retrieve3(edge.getModel().get(["lineStyle", "curveness"]), getCurvenessForEdge(edge, seriesModel, index), 0); var p1 = clone$2(edge.node1.getLayout()); var p2 = clone$2(edge.node2.getLayout()); var cp1; var x12 = (p1[0] + p2[0]) / 2; var y12 = (p1[1] + p2[1]) / 2; if (+curveness) { curveness *= 3; cp1 = [cx * curveness + x12 * (1 - curveness), cy * curveness + y12 * (1 - curveness)]; } edge.setLayout([p1, p2, cp1]); }); } var _layoutNodesBasedOn = { value: function(seriesModel, graph, nodeData, r, cx, cy, count2) { var angle = 0; var sum2 = nodeData.getSum("value"); var unitAngle = Math.PI * 2 / (sum2 || count2); graph.eachNode(function(node) { var value = node.getValue("value"); var radianHalf = unitAngle * (sum2 ? value : 1) / 2; angle += radianHalf; node.setLayout([r * Math.cos(angle) + cx, r * Math.sin(angle) + cy]); angle += radianHalf; }); }, symbolSize: function(seriesModel, graph, nodeData, r, cx, cy, count2) { var sumRadian = 0; _symbolRadiansHalf.length = count2; var nodeScale = getNodeGlobalScale(seriesModel); graph.eachNode(function(node) { var symbolSize = getSymbolSize(node); isNaN(symbolSize) && (symbolSize = 2); symbolSize < 0 && (symbolSize = 0); symbolSize *= nodeScale; var symbolRadianHalf = Math.asin(symbolSize / 2 / r); isNaN(symbolRadianHalf) && (symbolRadianHalf = PI$2 / 2); _symbolRadiansHalf[node.dataIndex] = symbolRadianHalf; sumRadian += symbolRadianHalf * 2; }); var halfRemainRadian = (2 * PI$2 - sumRadian) / count2 / 2; var angle = 0; graph.eachNode(function(node) { var radianHalf = halfRemainRadian + _symbolRadiansHalf[node.dataIndex]; angle += radianHalf; (!node.getLayout() || !node.getLayout().fixed) && node.setLayout([r * Math.cos(angle) + cx, r * Math.sin(angle) + cy]); angle += radianHalf; }); } }; function rotateNodeLabel(node, circularRotateLabel, cx, cy) { var el = node.getGraphicEl(); if (!el) { return; } var nodeModel = node.getModel(); var labelRotate = nodeModel.get(["label", "rotate"]) || 0; var symbolPath = el.getSymbolPath(); if (circularRotateLabel) { var pos = node.getLayout(); var rad = Math.atan2(pos[1] - cy, pos[0] - cx); if (rad < 0) { rad = Math.PI * 2 + rad; } var isLeft = pos[0] < cx; if (isLeft) { rad = rad - Math.PI; } var textPosition = isLeft ? "left" : "right"; symbolPath.setTextConfig({ rotation: -rad, position: textPosition, origin: "center" }); var emphasisState = symbolPath.ensureState("emphasis"); extend(emphasisState.textConfig || (emphasisState.textConfig = {}), { position: textPosition }); } else { symbolPath.setTextConfig({ rotation: labelRotate *= Math.PI / 180 }); } } function graphCircularLayout(ecModel) { ecModel.eachSeriesByType("graph", function(seriesModel) { if (seriesModel.get("layout") === "circular") { circularLayout(seriesModel, "symbolSize"); } }); } var scaleAndAdd = scaleAndAdd$1; function forceLayout(inNodes, inEdges, opts) { var nodes = inNodes; var edges = inEdges; var rect = opts.rect; var width = rect.width; var height = rect.height; var center2 = [rect.x + width / 2, rect.y + height / 2]; var gravity = opts.gravity == null ? 0.1 : opts.gravity; for (var i = 0; i < nodes.length; i++) { var n = nodes[i]; if (!n.p) { n.p = create$2(width * (Math.random() - 0.5) + center2[0], height * (Math.random() - 0.5) + center2[1]); } n.pp = clone$2(n.p); n.edges = null; } var initialFriction = opts.friction == null ? 0.6 : opts.friction; var friction = initialFriction; var beforeStepCallback; var afterStepCallback; return { warmUp: function() { friction = initialFriction * 0.8; }, setFixed: function(idx) { nodes[idx].fixed = true; }, setUnfixed: function(idx) { nodes[idx].fixed = false; }, /** * Before step hook */ beforeStep: function(cb) { beforeStepCallback = cb; }, /** * After step hook */ afterStep: function(cb) { afterStepCallback = cb; }, /** * Some formulas were originally copied from "d3.js" * https://github.com/d3/d3/blob/b516d77fb8566b576088e73410437494717ada26/src/layout/force.js * with some modifications made for this project. * See the license statement at the head of this file. */ step: function(cb) { beforeStepCallback && beforeStepCallback(nodes, edges); var v12 = []; var nLen = nodes.length; for (var i2 = 0; i2 < edges.length; i2++) { var e = edges[i2]; if (e.ignoreForceLayout) { continue; } var n1 = e.n1; var n2 = e.n2; sub(v12, n2.p, n1.p); var d = len(v12) - e.d; var w = n2.w / (n1.w + n2.w); if (isNaN(w)) { w = 0; } normalize$3(v12, v12); !n1.fixed && scaleAndAdd(n1.p, n1.p, v12, w * d * friction); !n2.fixed && scaleAndAdd(n2.p, n2.p, v12, -(1 - w) * d * friction); } for (var i2 = 0; i2 < nLen; i2++) { var n3 = nodes[i2]; if (!n3.fixed) { sub(v12, center2, n3.p); scaleAndAdd(n3.p, n3.p, v12, gravity * friction); } } for (var i2 = 0; i2 < nLen; i2++) { var n1 = nodes[i2]; for (var j = i2 + 1; j < nLen; j++) { var n2 = nodes[j]; sub(v12, n2.p, n1.p); var d = len(v12); if (d === 0) { set$1(v12, Math.random() - 0.5, Math.random() - 0.5); d = 1; } var repFact = (n1.rep + n2.rep) / d / d; !n1.fixed && scaleAndAdd(n1.pp, n1.pp, v12, repFact); !n2.fixed && scaleAndAdd(n2.pp, n2.pp, v12, -repFact); } } var v = []; for (var i2 = 0; i2 < nLen; i2++) { var n3 = nodes[i2]; if (!n3.fixed) { sub(v, n3.p, n3.pp); scaleAndAdd(n3.p, n3.p, v, friction); copy$1(n3.pp, n3.p); } } friction = friction * 0.992; var finished = friction < 0.01; afterStepCallback && afterStepCallback(nodes, edges, finished); cb && cb(finished); } }; } function graphForceLayout(ecModel) { ecModel.eachSeriesByType("graph", function(graphSeries) { var coordSys = graphSeries.coordinateSystem; if (coordSys && coordSys.type !== "view") { return; } if (graphSeries.get("layout") === "force") { var preservedPoints_1 = graphSeries.preservedPoints || {}; var graph_1 = graphSeries.getGraph(); var nodeData_1 = graph_1.data; var edgeData = graph_1.edgeData; var forceModel = graphSeries.getModel("force"); var initLayout = forceModel.get("initLayout"); if (graphSeries.preservedPoints) { nodeData_1.each(function(idx) { var id = nodeData_1.getId(idx); nodeData_1.setItemLayout(idx, preservedPoints_1[id] || [NaN, NaN]); }); } else if (!initLayout || initLayout === "none") { simpleLayout(graphSeries); } else if (initLayout === "circular") { circularLayout(graphSeries, "value"); } var nodeDataExtent_1 = nodeData_1.getDataExtent("value"); var edgeDataExtent_1 = edgeData.getDataExtent("value"); var repulsion = forceModel.get("repulsion"); var edgeLength = forceModel.get("edgeLength"); var repulsionArr_1 = isArray$1(repulsion) ? repulsion : [repulsion, repulsion]; var edgeLengthArr_1 = isArray$1(edgeLength) ? edgeLength : [edgeLength, edgeLength]; edgeLengthArr_1 = [edgeLengthArr_1[1], edgeLengthArr_1[0]]; var nodes_1 = nodeData_1.mapArray("value", function(value, idx) { var point = nodeData_1.getItemLayout(idx); var rep = linearMap$2(value, nodeDataExtent_1, repulsionArr_1); if (isNaN(rep)) { rep = (repulsionArr_1[0] + repulsionArr_1[1]) / 2; } return { w: rep, rep, fixed: nodeData_1.getItemModel(idx).get("fixed"), p: !point || isNaN(point[0]) || isNaN(point[1]) ? null : point }; }); var edges = edgeData.mapArray("value", function(value, idx) { var edge = graph_1.getEdgeByIndex(idx); var d = linearMap$2(value, edgeDataExtent_1, edgeLengthArr_1); if (isNaN(d)) { d = (edgeLengthArr_1[0] + edgeLengthArr_1[1]) / 2; } var edgeModel = edge.getModel(); var curveness = retrieve3(edge.getModel().get(["lineStyle", "curveness"]), -getCurvenessForEdge(edge, graphSeries, idx, true), 0); return { n1: nodes_1[edge.node1.dataIndex], n2: nodes_1[edge.node2.dataIndex], d, curveness, ignoreForceLayout: edgeModel.get("ignoreForceLayout") }; }); var rect = coordSys.getBoundingRect(); var forceInstance = forceLayout(nodes_1, edges, { rect, gravity: forceModel.get("gravity"), friction: forceModel.get("friction") }); forceInstance.beforeStep(function(nodes, edges2) { for (var i = 0, l = nodes.length; i < l; i++) { if (nodes[i].fixed) { copy$1(nodes[i].p, graph_1.getNodeByIndex(i).getLayout()); } } }); forceInstance.afterStep(function(nodes, edges2, stopped) { for (var i = 0, l = nodes.length; i < l; i++) { if (!nodes[i].fixed) { graph_1.getNodeByIndex(i).setLayout(nodes[i].p); } preservedPoints_1[nodeData_1.getId(i)] = nodes[i].p; } for (var i = 0, l = edges2.length; i < l; i++) { var e = edges2[i]; var edge = graph_1.getEdgeByIndex(i); var p1 = e.n1.p; var p2 = e.n2.p; var points2 = edge.getLayout(); points2 = points2 ? points2.slice() : []; points2[0] = points2[0] || []; points2[1] = points2[1] || []; copy$1(points2[0], p1); copy$1(points2[1], p2); if (+e.curveness) { points2[2] = [(p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * e.curveness, (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * e.curveness]; } edge.setLayout(points2); } }); graphSeries.forceLayout = forceInstance; graphSeries.preservedPoints = preservedPoints_1; forceInstance.step(); } else { graphSeries.forceLayout = null; } }); } function getViewRect$3(seriesModel, api, aspect) { var option = extend(seriesModel.getBoxLayoutParams(), { aspect }); return getLayoutRect(option, { width: api.getWidth(), height: api.getHeight() }); } function createViewCoordSys(ecModel, api) { var viewList = []; ecModel.eachSeriesByType("graph", function(seriesModel) { var coordSysType = seriesModel.get("coordinateSystem"); if (!coordSysType || coordSysType === "view") { var data_1 = seriesModel.getData(); var positions = data_1.mapArray(function(idx) { var itemModel = data_1.getItemModel(idx); return [+itemModel.get("x"), +itemModel.get("y")]; }); var min2 = []; var max2 = []; fromPoints(positions, min2, max2); if (max2[0] - min2[0] === 0) { max2[0] += 1; min2[0] -= 1; } if (max2[1] - min2[1] === 0) { max2[1] += 1; min2[1] -= 1; } var aspect = (max2[0] - min2[0]) / (max2[1] - min2[1]); var viewRect = getViewRect$3(seriesModel, api, aspect); if (isNaN(aspect)) { min2 = [viewRect.x, viewRect.y]; max2 = [viewRect.x + viewRect.width, viewRect.y + viewRect.height]; } var bbWidth = max2[0] - min2[0]; var bbHeight = max2[1] - min2[1]; var viewWidth = viewRect.width; var viewHeight = viewRect.height; var viewCoordSys = seriesModel.coordinateSystem = new View(); viewCoordSys.zoomLimit = seriesModel.get("scaleLimit"); viewCoordSys.setBoundingRect(min2[0], min2[1], bbWidth, bbHeight); viewCoordSys.setViewRect(viewRect.x, viewRect.y, viewWidth, viewHeight); viewCoordSys.setCenter(seriesModel.get("center"), api); viewCoordSys.setZoom(seriesModel.get("zoom")); viewList.push(viewCoordSys); } }); return viewList; } var straightLineProto = Line$1.prototype; var bezierCurveProto = BezierCurve.prototype; var StraightLineShape = ( /** @class */ /* @__PURE__ */ (function() { function StraightLineShape2() { this.x1 = 0; this.y1 = 0; this.x2 = 0; this.y2 = 0; this.percent = 1; } return StraightLineShape2; })() ); (function(_super) { __extends(CurveShape, _super); function CurveShape() { return _super !== null && _super.apply(this, arguments) || this; } return CurveShape; })(StraightLineShape); function isStraightLine(shape) { return isNaN(+shape.cpx1) || isNaN(+shape.cpy1); } var ECLinePath = ( /** @class */ (function(_super) { __extends(ECLinePath2, _super); function ECLinePath2(opts) { var _this = _super.call(this, opts) || this; _this.type = "ec-line"; return _this; } ECLinePath2.prototype.getDefaultStyle = function() { return { stroke: "#000", fill: null }; }; ECLinePath2.prototype.getDefaultShape = function() { return new StraightLineShape(); }; ECLinePath2.prototype.buildPath = function(ctx, shape) { if (isStraightLine(shape)) { straightLineProto.buildPath.call(this, ctx, shape); } else { bezierCurveProto.buildPath.call(this, ctx, shape); } }; ECLinePath2.prototype.pointAt = function(t) { if (isStraightLine(this.shape)) { return straightLineProto.pointAt.call(this, t); } else { return bezierCurveProto.pointAt.call(this, t); } }; ECLinePath2.prototype.tangentAt = function(t) { var shape = this.shape; var p = isStraightLine(shape) ? [shape.x2 - shape.x1, shape.y2 - shape.y1] : bezierCurveProto.tangentAt.call(this, t); return normalize$3(p, p); }; return ECLinePath2; })(Path) ); var SYMBOL_CATEGORIES = ["fromSymbol", "toSymbol"]; function makeSymbolTypeKey(symbolCategory) { return "_" + symbolCategory + "Type"; } function makeSymbolTypeValue(name, lineData, idx) { var symbolType = lineData.getItemVisual(idx, name); if (!symbolType || symbolType === "none") { return symbolType; } var symbolSize = lineData.getItemVisual(idx, name + "Size"); var symbolRotate = lineData.getItemVisual(idx, name + "Rotate"); var symbolOffset = lineData.getItemVisual(idx, name + "Offset"); var symbolKeepAspect = lineData.getItemVisual(idx, name + "KeepAspect"); var symbolSizeArr = normalizeSymbolSize(symbolSize); var symbolOffsetArr = normalizeSymbolOffset(symbolOffset || 0, symbolSizeArr); return symbolType + symbolSizeArr + symbolOffsetArr + (symbolRotate || "") + (symbolKeepAspect || ""); } function createSymbol(name, lineData, idx) { var symbolType = lineData.getItemVisual(idx, name); if (!symbolType || symbolType === "none") { return; } var symbolSize = lineData.getItemVisual(idx, name + "Size"); var symbolRotate = lineData.getItemVisual(idx, name + "Rotate"); var symbolOffset = lineData.getItemVisual(idx, name + "Offset"); var symbolKeepAspect = lineData.getItemVisual(idx, name + "KeepAspect"); var symbolSizeArr = normalizeSymbolSize(symbolSize); var symbolOffsetArr = normalizeSymbolOffset(symbolOffset || 0, symbolSizeArr); var symbolPath = createSymbol$1(symbolType, -symbolSizeArr[0] / 2 + symbolOffsetArr[0], -symbolSizeArr[1] / 2 + symbolOffsetArr[1], symbolSizeArr[0], symbolSizeArr[1], null, symbolKeepAspect); symbolPath.__specifiedRotation = symbolRotate == null || isNaN(symbolRotate) ? void 0 : +symbolRotate * Math.PI / 180 || 0; symbolPath.name = name; return symbolPath; } function createLine(points2) { var line = new ECLinePath({ name: "line", subPixelOptimize: true }); setLinePoints(line.shape, points2); return line; } function setLinePoints(targetShape, points2) { targetShape.x1 = points2[0][0]; targetShape.y1 = points2[0][1]; targetShape.x2 = points2[1][0]; targetShape.y2 = points2[1][1]; targetShape.percent = 1; var cp1 = points2[2]; if (cp1) { targetShape.cpx1 = cp1[0]; targetShape.cpy1 = cp1[1]; } else { targetShape.cpx1 = NaN; targetShape.cpy1 = NaN; } } var Line = ( /** @class */ (function(_super) { __extends(Line2, _super); function Line2(lineData, idx, seriesScope) { var _this = _super.call(this) || this; _this._createLine(lineData, idx, seriesScope); return _this; } Line2.prototype._createLine = function(lineData, idx, seriesScope) { var seriesModel = lineData.hostModel; var linePoints = lineData.getItemLayout(idx); var line = createLine(linePoints); line.shape.percent = 0; initProps(line, { shape: { percent: 1 } }, seriesModel, idx); this.add(line); each$f(SYMBOL_CATEGORIES, function(symbolCategory) { var symbol = createSymbol(symbolCategory, lineData, idx); this.add(symbol); this[makeSymbolTypeKey(symbolCategory)] = makeSymbolTypeValue(symbolCategory, lineData, idx); }, this); this._updateCommonStl(lineData, idx, seriesScope); }; Line2.prototype.updateData = function(lineData, idx, seriesScope) { var seriesModel = lineData.hostModel; var line = this.childOfName("line"); var linePoints = lineData.getItemLayout(idx); var target = { shape: {} }; setLinePoints(target.shape, linePoints); updateProps$1(line, target, seriesModel, idx); each$f(SYMBOL_CATEGORIES, function(symbolCategory) { var symbolType = makeSymbolTypeValue(symbolCategory, lineData, idx); var key = makeSymbolTypeKey(symbolCategory); if (this[key] !== symbolType) { this.remove(this.childOfName(symbolCategory)); var symbol = createSymbol(symbolCategory, lineData, idx); this.add(symbol); } this[key] = symbolType; }, this); this._updateCommonStl(lineData, idx, seriesScope); }; Line2.prototype.getLinePath = function() { return this.childAt(0); }; Line2.prototype._updateCommonStl = function(lineData, idx, seriesScope) { var seriesModel = lineData.hostModel; var line = this.childOfName("line"); var emphasisLineStyle = seriesScope && seriesScope.emphasisLineStyle; var blurLineStyle = seriesScope && seriesScope.blurLineStyle; var selectLineStyle = seriesScope && seriesScope.selectLineStyle; var labelStatesModels = seriesScope && seriesScope.labelStatesModels; var emphasisDisabled = seriesScope && seriesScope.emphasisDisabled; var focus = seriesScope && seriesScope.focus; var blurScope = seriesScope && seriesScope.blurScope; if (!seriesScope || lineData.hasItemOption) { var itemModel = lineData.getItemModel(idx); var emphasisModel = itemModel.getModel("emphasis"); emphasisLineStyle = emphasisModel.getModel("lineStyle").getLineStyle(); blurLineStyle = itemModel.getModel(["blur", "lineStyle"]).getLineStyle(); selectLineStyle = itemModel.getModel(["select", "lineStyle"]).getLineStyle(); emphasisDisabled = emphasisModel.get("disabled"); focus = emphasisModel.get("focus"); blurScope = emphasisModel.get("blurScope"); labelStatesModels = getLabelStatesModels(itemModel); } var lineStyle = lineData.getItemVisual(idx, "style"); var visualColor = lineStyle.stroke; line.useStyle(lineStyle); line.style.fill = null; line.style.strokeNoScale = true; line.ensureState("emphasis").style = emphasisLineStyle; line.ensureState("blur").style = blurLineStyle; line.ensureState("select").style = selectLineStyle; each$f(SYMBOL_CATEGORIES, function(symbolCategory) { var symbol = this.childOfName(symbolCategory); if (symbol) { symbol.setColor(visualColor); symbol.style.opacity = lineStyle.opacity; for (var i = 0; i < SPECIAL_STATES.length; i++) { var stateName = SPECIAL_STATES[i]; var lineState = line.getState(stateName); if (lineState) { var lineStateStyle = lineState.style || {}; var state = symbol.ensureState(stateName); var stateStyle = state.style || (state.style = {}); if (lineStateStyle.stroke != null) { stateStyle[symbol.__isEmptyBrush ? "stroke" : "fill"] = lineStateStyle.stroke; } if (lineStateStyle.opacity != null) { stateStyle.opacity = lineStateStyle.opacity; } } } symbol.markRedraw(); } }, this); var rawVal = seriesModel.getRawValue(idx); setLabelStyle(this, labelStatesModels, { labelDataIndex: idx, labelFetcher: { getFormattedLabel: function(dataIndex, stateName) { return seriesModel.getFormattedLabel(dataIndex, stateName, lineData.dataType); } }, inheritColor: visualColor || "#000", defaultOpacity: lineStyle.opacity, defaultText: (rawVal == null ? lineData.getName(idx) : isFinite(rawVal) ? round$1(rawVal) : rawVal) + "" }); var label = this.getTextContent(); if (label) { var labelNormalModel = labelStatesModels.normal; label.__align = label.style.align; label.__verticalAlign = label.style.verticalAlign; label.__position = labelNormalModel.get("position") || "middle"; var distance = labelNormalModel.get("distance"); if (!isArray$1(distance)) { distance = [distance, distance]; } label.__labelDistance = distance; } this.setTextConfig({ position: null, local: true, inside: false // Can't be inside for stroke element. }); toggleHoverEmphasis(this, focus, blurScope, emphasisDisabled); }; Line2.prototype.highlight = function() { enterEmphasis(this); }; Line2.prototype.downplay = function() { leaveEmphasis(this); }; Line2.prototype.updateLayout = function(lineData, idx) { this.setLinePoints(lineData.getItemLayout(idx)); }; Line2.prototype.setLinePoints = function(points2) { var linePath = this.childOfName("line"); setLinePoints(linePath.shape, points2); linePath.dirty(); }; Line2.prototype.beforeUpdate = function() { var lineGroup = this; var symbolFrom = lineGroup.childOfName("fromSymbol"); var symbolTo = lineGroup.childOfName("toSymbol"); var label = lineGroup.getTextContent(); if (!symbolFrom && !symbolTo && (!label || label.ignore)) { return; } var invScale = 1; var parentNode = this.parent; while (parentNode) { if (parentNode.scaleX) { invScale /= parentNode.scaleX; } parentNode = parentNode.parent; } var line = lineGroup.childOfName("line"); if (!this.__dirty && !line.__dirty) { return; } var percent = line.shape.percent; var fromPos = line.pointAt(0); var toPos = line.pointAt(percent); var d = sub([], toPos, fromPos); normalize$3(d, d); function setSymbolRotation(symbol, percent2) { var specifiedRotation = symbol.__specifiedRotation; if (specifiedRotation == null) { var tangent2 = line.tangentAt(percent2); symbol.attr("rotation", (percent2 === 1 ? -1 : 1) * Math.PI / 2 - Math.atan2(tangent2[1], tangent2[0])); } else { symbol.attr("rotation", specifiedRotation); } } if (symbolFrom) { symbolFrom.setPosition(fromPos); setSymbolRotation(symbolFrom, 0); symbolFrom.scaleX = symbolFrom.scaleY = invScale * percent; symbolFrom.markRedraw(); } if (symbolTo) { symbolTo.setPosition(toPos); setSymbolRotation(symbolTo, 1); symbolTo.scaleX = symbolTo.scaleY = invScale * percent; symbolTo.markRedraw(); } if (label && !label.ignore) { label.x = label.y = 0; label.originX = label.originY = 0; var textAlign = void 0; var textVerticalAlign = void 0; var distance = label.__labelDistance; var distanceX = distance[0] * invScale; var distanceY = distance[1] * invScale; var halfPercent = percent / 2; var tangent = line.tangentAt(halfPercent); var n = [tangent[1], -tangent[0]]; var cp = line.pointAt(halfPercent); if (n[1] > 0) { n[0] = -n[0]; n[1] = -n[1]; } var dir3 = tangent[0] < 0 ? -1 : 1; if (label.__position !== "start" && label.__position !== "end") { var rotation = -Math.atan2(tangent[1], tangent[0]); if (toPos[0] < fromPos[0]) { rotation = Math.PI + rotation; } label.rotation = rotation; } var dy = void 0; switch (label.__position) { case "insideStartTop": case "insideMiddleTop": case "insideEndTop": case "middle": dy = -distanceY; textVerticalAlign = "bottom"; break; case "insideStartBottom": case "insideMiddleBottom": case "insideEndBottom": dy = distanceY; textVerticalAlign = "top"; break; default: dy = 0; textVerticalAlign = "middle"; } switch (label.__position) { case "end": label.x = d[0] * distanceX + toPos[0]; label.y = d[1] * distanceY + toPos[1]; textAlign = d[0] > 0.8 ? "left" : d[0] < -0.8 ? "right" : "center"; textVerticalAlign = d[1] > 0.8 ? "top" : d[1] < -0.8 ? "bottom" : "middle"; break; case "start": label.x = -d[0] * distanceX + fromPos[0]; label.y = -d[1] * distanceY + fromPos[1]; textAlign = d[0] > 0.8 ? "right" : d[0] < -0.8 ? "left" : "center"; textVerticalAlign = d[1] > 0.8 ? "bottom" : d[1] < -0.8 ? "top" : "middle"; break; case "insideStartTop": case "insideStart": case "insideStartBottom": label.x = distanceX * dir3 + fromPos[0]; label.y = fromPos[1] + dy; textAlign = tangent[0] < 0 ? "right" : "left"; label.originX = -distanceX * dir3; label.originY = -dy; break; case "insideMiddleTop": case "insideMiddle": case "insideMiddleBottom": case "middle": label.x = cp[0]; label.y = cp[1] + dy; textAlign = "center"; label.originY = -dy; break; case "insideEndTop": case "insideEnd": case "insideEndBottom": label.x = -distanceX * dir3 + toPos[0]; label.y = toPos[1] + dy; textAlign = tangent[0] >= 0 ? "right" : "left"; label.originX = distanceX * dir3; label.originY = -dy; break; } label.scaleX = label.scaleY = invScale; label.setStyle({ // Use the user specified text align and baseline first verticalAlign: label.__verticalAlign || textVerticalAlign, align: label.__align || textAlign }); } }; return Line2; })(Group$3) ); var LineDraw = ( /** @class */ (function() { function LineDraw2(LineCtor) { this.group = new Group$3(); this._LineCtor = LineCtor || Line; } LineDraw2.prototype.updateData = function(lineData) { var _this = this; this._progressiveEls = null; var lineDraw = this; var group = lineDraw.group; var oldLineData = lineDraw._lineData; lineDraw._lineData = lineData; if (!oldLineData) { group.removeAll(); } var seriesScope = makeSeriesScope$1(lineData); lineData.diff(oldLineData).add(function(idx) { _this._doAdd(lineData, idx, seriesScope); }).update(function(newIdx, oldIdx) { _this._doUpdate(oldLineData, lineData, oldIdx, newIdx, seriesScope); }).remove(function(idx) { group.remove(oldLineData.getItemGraphicEl(idx)); }).execute(); }; LineDraw2.prototype.updateLayout = function() { var lineData = this._lineData; if (!lineData) { return; } lineData.eachItemGraphicEl(function(el, idx) { el.updateLayout(lineData, idx); }, this); }; LineDraw2.prototype.incrementalPrepareUpdate = function(lineData) { this._seriesScope = makeSeriesScope$1(lineData); this._lineData = null; this.group.removeAll(); }; LineDraw2.prototype.incrementalUpdate = function(taskParams, lineData) { this._progressiveEls = []; function updateIncrementalAndHover(el2) { if (!el2.isGroup && !isEffectObject(el2)) { el2.incremental = true; el2.ensureState("emphasis").hoverLayer = true; } } for (var idx = taskParams.start; idx < taskParams.end; idx++) { var itemLayout = lineData.getItemLayout(idx); if (lineNeedsDraw(itemLayout)) { var el = new this._LineCtor(lineData, idx, this._seriesScope); el.traverse(updateIncrementalAndHover); this.group.add(el); lineData.setItemGraphicEl(idx, el); this._progressiveEls.push(el); } } }; LineDraw2.prototype.remove = function() { this.group.removeAll(); }; LineDraw2.prototype.eachRendered = function(cb) { traverseElements(this._progressiveEls || this.group, cb); }; LineDraw2.prototype._doAdd = function(lineData, idx, seriesScope) { var itemLayout = lineData.getItemLayout(idx); if (!lineNeedsDraw(itemLayout)) { return; } var el = new this._LineCtor(lineData, idx, seriesScope); lineData.setItemGraphicEl(idx, el); this.group.add(el); }; LineDraw2.prototype._doUpdate = function(oldLineData, newLineData, oldIdx, newIdx, seriesScope) { var itemEl = oldLineData.getItemGraphicEl(oldIdx); if (!lineNeedsDraw(newLineData.getItemLayout(newIdx))) { this.group.remove(itemEl); return; } if (!itemEl) { itemEl = new this._LineCtor(newLineData, newIdx, seriesScope); } else { itemEl.updateData(newLineData, newIdx, seriesScope); } newLineData.setItemGraphicEl(newIdx, itemEl); this.group.add(itemEl); }; return LineDraw2; })() ); function isEffectObject(el) { return el.animators && el.animators.length > 0; } function makeSeriesScope$1(lineData) { var hostModel = lineData.hostModel; var emphasisModel = hostModel.getModel("emphasis"); return { lineStyle: hostModel.getModel("lineStyle").getLineStyle(), emphasisLineStyle: emphasisModel.getModel(["lineStyle"]).getLineStyle(), blurLineStyle: hostModel.getModel(["blur", "lineStyle"]).getLineStyle(), selectLineStyle: hostModel.getModel(["select", "lineStyle"]).getLineStyle(), emphasisDisabled: emphasisModel.get("disabled"), blurScope: emphasisModel.get("blurScope"), focus: emphasisModel.get("focus"), labelStatesModels: getLabelStatesModels(hostModel) }; } function isPointNaN(pt) { return isNaN(pt[0]) || isNaN(pt[1]); } function lineNeedsDraw(pts) { return pts && !isPointNaN(pts[0]) && !isPointNaN(pts[1]); } var v1 = []; var v2 = []; var v3 = []; var quadraticAt = quadraticAt$1; var v2DistSquare = distSquare; var mathAbs = Math.abs; function intersectCurveCircle(curvePoints, center2, radius) { var p0 = curvePoints[0]; var p1 = curvePoints[1]; var p2 = curvePoints[2]; var d = Infinity; var t; var radiusSquare = radius * radius; var interval = 0.1; for (var _t = 0.1; _t <= 0.9; _t += 0.1) { v1[0] = quadraticAt(p0[0], p1[0], p2[0], _t); v1[1] = quadraticAt(p0[1], p1[1], p2[1], _t); var diff = mathAbs(v2DistSquare(v1, center2) - radiusSquare); if (diff < d) { d = diff; t = _t; } } for (var i = 0; i < 32; i++) { var next = t + interval; v2[0] = quadraticAt(p0[0], p1[0], p2[0], t); v2[1] = quadraticAt(p0[1], p1[1], p2[1], t); v3[0] = quadraticAt(p0[0], p1[0], p2[0], next); v3[1] = quadraticAt(p0[1], p1[1], p2[1], next); var diff = v2DistSquare(v2, center2) - radiusSquare; if (mathAbs(diff) < 0.01) { break; } var nextDiff = v2DistSquare(v3, center2) - radiusSquare; interval /= 2; if (diff < 0) { if (nextDiff >= 0) { t = t + interval; } else { t = t - interval; } } else { if (nextDiff >= 0) { t = t - interval; } else { t = t + interval; } } } return t; } function adjustEdge(graph, scale2) { var tmp0 = []; var quadraticSubdivide$1 = quadraticSubdivide; var pts = [[], [], []]; var pts2 = [[], []]; var v = []; scale2 /= 2; graph.eachEdge(function(edge, idx) { var linePoints = edge.getLayout(); var fromSymbol = edge.getVisual("fromSymbol"); var toSymbol = edge.getVisual("toSymbol"); if (!linePoints.__original) { linePoints.__original = [clone$2(linePoints[0]), clone$2(linePoints[1])]; if (linePoints[2]) { linePoints.__original.push(clone$2(linePoints[2])); } } var originalPoints = linePoints.__original; if (linePoints[2] != null) { copy$1(pts[0], originalPoints[0]); copy$1(pts[1], originalPoints[2]); copy$1(pts[2], originalPoints[1]); if (fromSymbol && fromSymbol !== "none") { var symbolSize = getSymbolSize(edge.node1); var t = intersectCurveCircle(pts, originalPoints[0], symbolSize * scale2); quadraticSubdivide$1(pts[0][0], pts[1][0], pts[2][0], t, tmp0); pts[0][0] = tmp0[3]; pts[1][0] = tmp0[4]; quadraticSubdivide$1(pts[0][1], pts[1][1], pts[2][1], t, tmp0); pts[0][1] = tmp0[3]; pts[1][1] = tmp0[4]; } if (toSymbol && toSymbol !== "none") { var symbolSize = getSymbolSize(edge.node2); var t = intersectCurveCircle(pts, originalPoints[1], symbolSize * scale2); quadraticSubdivide$1(pts[0][0], pts[1][0], pts[2][0], t, tmp0); pts[1][0] = tmp0[1]; pts[2][0] = tmp0[2]; quadraticSubdivide$1(pts[0][1], pts[1][1], pts[2][1], t, tmp0); pts[1][1] = tmp0[1]; pts[2][1] = tmp0[2]; } copy$1(linePoints[0], pts[0]); copy$1(linePoints[1], pts[2]); copy$1(linePoints[2], pts[1]); } else { copy$1(pts2[0], originalPoints[0]); copy$1(pts2[1], originalPoints[1]); sub(v, pts2[1], pts2[0]); normalize$3(v, v); if (fromSymbol && fromSymbol !== "none") { var symbolSize = getSymbolSize(edge.node1); scaleAndAdd$1(pts2[0], pts2[0], v, symbolSize * scale2); } if (toSymbol && toSymbol !== "none") { var symbolSize = getSymbolSize(edge.node2); scaleAndAdd$1(pts2[1], pts2[1], v, -symbolSize * scale2); } copy$1(linePoints[0], pts2[0]); copy$1(linePoints[1], pts2[1]); } }); } function isViewCoordSys(coordSys) { return coordSys.type === "view"; } var GraphView = ( /** @class */ (function(_super) { __extends(GraphView2, _super); function GraphView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = GraphView2.type; return _this; } GraphView2.prototype.init = function(ecModel, api) { var symbolDraw = new SymbolDraw(); var lineDraw = new LineDraw(); var group = this.group; this._controller = new RoamController(api.getZr()); this._controllerHost = { target: group }; group.add(symbolDraw.group); group.add(lineDraw.group); this._symbolDraw = symbolDraw; this._lineDraw = lineDraw; this._firstRender = true; }; GraphView2.prototype.render = function(seriesModel, ecModel, api) { var _this = this; var coordSys = seriesModel.coordinateSystem; this._model = seriesModel; var symbolDraw = this._symbolDraw; var lineDraw = this._lineDraw; var group = this.group; if (isViewCoordSys(coordSys)) { var groupNewProp = { x: coordSys.x, y: coordSys.y, scaleX: coordSys.scaleX, scaleY: coordSys.scaleY }; if (this._firstRender) { group.attr(groupNewProp); } else { updateProps$1(group, groupNewProp, seriesModel); } } adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel)); var data = seriesModel.getData(); symbolDraw.updateData(data); var edgeData = seriesModel.getEdgeData(); lineDraw.updateData(edgeData); this._updateNodeAndLinkScale(); this._updateController(seriesModel, ecModel, api); clearTimeout(this._layoutTimeout); var forceLayout2 = seriesModel.forceLayout; var layoutAnimation = seriesModel.get(["force", "layoutAnimation"]); if (forceLayout2) { this._startForceLayoutIteration(forceLayout2, layoutAnimation); } var layout2 = seriesModel.get("layout"); data.graph.eachNode(function(node) { var idx = node.dataIndex; var el = node.getGraphicEl(); var itemModel = node.getModel(); if (!el) { return; } el.off("drag").off("dragend"); var draggable = itemModel.get("draggable"); if (draggable) { el.on("drag", function(e) { switch (layout2) { case "force": forceLayout2.warmUp(); !_this._layouting && _this._startForceLayoutIteration(forceLayout2, layoutAnimation); forceLayout2.setFixed(idx); data.setItemLayout(idx, [el.x, el.y]); break; case "circular": data.setItemLayout(idx, [el.x, el.y]); node.setLayout({ fixed: true }, true); circularLayout(seriesModel, "symbolSize", node, [e.offsetX, e.offsetY]); _this.updateLayout(seriesModel); break; case "none": default: data.setItemLayout(idx, [el.x, el.y]); simpleLayoutEdge(seriesModel.getGraph(), seriesModel); _this.updateLayout(seriesModel); break; } }).on("dragend", function() { if (forceLayout2) { forceLayout2.setUnfixed(idx); } }); } el.setDraggable(draggable, !!itemModel.get("cursor")); var focus = itemModel.get(["emphasis", "focus"]); if (focus === "adjacency") { getECData(el).focus = node.getAdjacentDataIndices(); } }); data.graph.eachEdge(function(edge) { var el = edge.getGraphicEl(); var focus = edge.getModel().get(["emphasis", "focus"]); if (!el) { return; } if (focus === "adjacency") { getECData(el).focus = { edge: [edge.dataIndex], node: [edge.node1.dataIndex, edge.node2.dataIndex] }; } }); var circularRotateLabel = seriesModel.get("layout") === "circular" && seriesModel.get(["circular", "rotateLabel"]); var cx = data.getLayout("cx"); var cy = data.getLayout("cy"); data.graph.eachNode(function(node) { rotateNodeLabel(node, circularRotateLabel, cx, cy); }); this._firstRender = false; }; GraphView2.prototype.dispose = function() { this.remove(); this._controller && this._controller.dispose(); this._controllerHost = null; }; GraphView2.prototype._startForceLayoutIteration = function(forceLayout2, layoutAnimation) { var self = this; (function step() { forceLayout2.step(function(stopped) { self.updateLayout(self._model); (self._layouting = !stopped) && (layoutAnimation ? self._layoutTimeout = setTimeout(step, 16) : step()); }); })(); }; GraphView2.prototype._updateController = function(seriesModel, ecModel, api) { var _this = this; var controller = this._controller; var controllerHost = this._controllerHost; var group = this.group; controller.setPointerChecker(function(e, x, y) { var rect = group.getBoundingRect(); rect.applyTransform(group.transform); return rect.contain(x, y) && !onIrrelevantElement(e, api, seriesModel); }); if (!isViewCoordSys(seriesModel.coordinateSystem)) { controller.disable(); return; } controller.enable(seriesModel.get("roam")); controllerHost.zoomLimit = seriesModel.get("scaleLimit"); controllerHost.zoom = seriesModel.coordinateSystem.getZoom(); controller.off("pan").off("zoom").on("pan", function(e) { updateViewOnPan(controllerHost, e.dx, e.dy); api.dispatchAction({ seriesId: seriesModel.id, type: "graphRoam", dx: e.dx, dy: e.dy }); }).on("zoom", function(e) { updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY); api.dispatchAction({ seriesId: seriesModel.id, type: "graphRoam", zoom: e.scale, originX: e.originX, originY: e.originY }); _this._updateNodeAndLinkScale(); adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel)); _this._lineDraw.updateLayout(); api.updateLabelLayout(); }); }; GraphView2.prototype._updateNodeAndLinkScale = function() { var seriesModel = this._model; var data = seriesModel.getData(); var nodeScale = getNodeGlobalScale(seriesModel); data.eachItemGraphicEl(function(el, idx) { el && el.setSymbolScale(nodeScale); }); }; GraphView2.prototype.updateLayout = function(seriesModel) { adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel)); this._symbolDraw.updateLayout(); this._lineDraw.updateLayout(); }; GraphView2.prototype.remove = function() { clearTimeout(this._layoutTimeout); this._layouting = false; this._layoutTimeout = null; this._symbolDraw && this._symbolDraw.remove(); this._lineDraw && this._lineDraw.remove(); }; GraphView2.type = "graph"; return GraphView2; })(ChartView) ); function generateNodeKey(id) { return "_EC_" + id; } var Graph = ( /** @class */ (function() { function Graph2(directed) { this.type = "graph"; this.nodes = []; this.edges = []; this._nodesMap = {}; this._edgesMap = {}; this._directed = directed || false; } Graph2.prototype.isDirected = function() { return this._directed; }; Graph2.prototype.addNode = function(id, dataIndex) { id = id == null ? "" + dataIndex : "" + id; var nodesMap = this._nodesMap; if (nodesMap[generateNodeKey(id)]) { return; } var node = new GraphNode(id, dataIndex); node.hostGraph = this; this.nodes.push(node); nodesMap[generateNodeKey(id)] = node; return node; }; Graph2.prototype.getNodeByIndex = function(dataIndex) { var rawIdx = this.data.getRawIndex(dataIndex); return this.nodes[rawIdx]; }; Graph2.prototype.getNodeById = function(id) { return this._nodesMap[generateNodeKey(id)]; }; Graph2.prototype.addEdge = function(n1, n2, dataIndex) { var nodesMap = this._nodesMap; var edgesMap = this._edgesMap; if (isNumber(n1)) { n1 = this.nodes[n1]; } if (isNumber(n2)) { n2 = this.nodes[n2]; } if (!(n1 instanceof GraphNode)) { n1 = nodesMap[generateNodeKey(n1)]; } if (!(n2 instanceof GraphNode)) { n2 = nodesMap[generateNodeKey(n2)]; } if (!n1 || !n2) { return; } var key = n1.id + "-" + n2.id; var edge = new GraphEdge(n1, n2, dataIndex); edge.hostGraph = this; if (this._directed) { n1.outEdges.push(edge); n2.inEdges.push(edge); } n1.edges.push(edge); if (n1 !== n2) { n2.edges.push(edge); } this.edges.push(edge); edgesMap[key] = edge; return edge; }; Graph2.prototype.getEdgeByIndex = function(dataIndex) { var rawIdx = this.edgeData.getRawIndex(dataIndex); return this.edges[rawIdx]; }; Graph2.prototype.getEdge = function(n1, n2) { if (n1 instanceof GraphNode) { n1 = n1.id; } if (n2 instanceof GraphNode) { n2 = n2.id; } var edgesMap = this._edgesMap; if (this._directed) { return edgesMap[n1 + "-" + n2]; } else { return edgesMap[n1 + "-" + n2] || edgesMap[n2 + "-" + n1]; } }; Graph2.prototype.eachNode = function(cb, context) { var nodes = this.nodes; var len2 = nodes.length; for (var i = 0; i < len2; i++) { if (nodes[i].dataIndex >= 0) { cb.call(context, nodes[i], i); } } }; Graph2.prototype.eachEdge = function(cb, context) { var edges = this.edges; var len2 = edges.length; for (var i = 0; i < len2; i++) { if (edges[i].dataIndex >= 0 && edges[i].node1.dataIndex >= 0 && edges[i].node2.dataIndex >= 0) { cb.call(context, edges[i], i); } } }; Graph2.prototype.breadthFirstTraverse = function(cb, startNode, direction, context) { if (!(startNode instanceof GraphNode)) { startNode = this._nodesMap[generateNodeKey(startNode)]; } if (!startNode) { return; } var edgeType = direction === "out" ? "outEdges" : direction === "in" ? "inEdges" : "edges"; for (var i = 0; i < this.nodes.length; i++) { this.nodes[i].__visited = false; } if (cb.call(context, startNode, null)) { return; } var queue = [startNode]; while (queue.length) { var currentNode = queue.shift(); var edges = currentNode[edgeType]; for (var i = 0; i < edges.length; i++) { var e = edges[i]; var otherNode = e.node1 === currentNode ? e.node2 : e.node1; if (!otherNode.__visited) { if (cb.call(context, otherNode, currentNode)) { return; } queue.push(otherNode); otherNode.__visited = true; } } } }; Graph2.prototype.update = function() { var data = this.data; var edgeData = this.edgeData; var nodes = this.nodes; var edges = this.edges; for (var i = 0, len2 = nodes.length; i < len2; i++) { nodes[i].dataIndex = -1; } for (var i = 0, len2 = data.count(); i < len2; i++) { nodes[data.getRawIndex(i)].dataIndex = i; } edgeData.filterSelf(function(idx) { var edge = edges[edgeData.getRawIndex(idx)]; return edge.node1.dataIndex >= 0 && edge.node2.dataIndex >= 0; }); for (var i = 0, len2 = edges.length; i < len2; i++) { edges[i].dataIndex = -1; } for (var i = 0, len2 = edgeData.count(); i < len2; i++) { edges[edgeData.getRawIndex(i)].dataIndex = i; } }; Graph2.prototype.clone = function() { var graph = new Graph2(this._directed); var nodes = this.nodes; var edges = this.edges; for (var i = 0; i < nodes.length; i++) { graph.addNode(nodes[i].id, nodes[i].dataIndex); } for (var i = 0; i < edges.length; i++) { var e = edges[i]; graph.addEdge(e.node1.id, e.node2.id, e.dataIndex); } return graph; }; return Graph2; })() ); var GraphNode = ( /** @class */ (function() { function GraphNode2(id, dataIndex) { this.inEdges = []; this.outEdges = []; this.edges = []; this.dataIndex = -1; this.id = id == null ? "" : id; this.dataIndex = dataIndex == null ? -1 : dataIndex; } GraphNode2.prototype.degree = function() { return this.edges.length; }; GraphNode2.prototype.inDegree = function() { return this.inEdges.length; }; GraphNode2.prototype.outDegree = function() { return this.outEdges.length; }; GraphNode2.prototype.getModel = function(path) { if (this.dataIndex < 0) { return; } var graph = this.hostGraph; var itemModel = graph.data.getItemModel(this.dataIndex); return itemModel.getModel(path); }; GraphNode2.prototype.getAdjacentDataIndices = function() { var dataIndices = { edge: [], node: [] }; for (var i = 0; i < this.edges.length; i++) { var adjacentEdge = this.edges[i]; if (adjacentEdge.dataIndex < 0) { continue; } dataIndices.edge.push(adjacentEdge.dataIndex); dataIndices.node.push(adjacentEdge.node1.dataIndex, adjacentEdge.node2.dataIndex); } return dataIndices; }; GraphNode2.prototype.getTrajectoryDataIndices = function() { var connectedEdgesMap = createHashMap(); var connectedNodesMap = createHashMap(); for (var i = 0; i < this.edges.length; i++) { var adjacentEdge = this.edges[i]; if (adjacentEdge.dataIndex < 0) { continue; } connectedEdgesMap.set(adjacentEdge.dataIndex, true); var sourceNodesQueue = [adjacentEdge.node1]; var targetNodesQueue = [adjacentEdge.node2]; var nodeIteratorIndex = 0; while (nodeIteratorIndex < sourceNodesQueue.length) { var sourceNode = sourceNodesQueue[nodeIteratorIndex]; nodeIteratorIndex++; connectedNodesMap.set(sourceNode.dataIndex, true); for (var j = 0; j < sourceNode.inEdges.length; j++) { connectedEdgesMap.set(sourceNode.inEdges[j].dataIndex, true); sourceNodesQueue.push(sourceNode.inEdges[j].node1); } } nodeIteratorIndex = 0; while (nodeIteratorIndex < targetNodesQueue.length) { var targetNode = targetNodesQueue[nodeIteratorIndex]; nodeIteratorIndex++; connectedNodesMap.set(targetNode.dataIndex, true); for (var j = 0; j < targetNode.outEdges.length; j++) { connectedEdgesMap.set(targetNode.outEdges[j].dataIndex, true); targetNodesQueue.push(targetNode.outEdges[j].node2); } } } return { edge: connectedEdgesMap.keys(), node: connectedNodesMap.keys() }; }; return GraphNode2; })() ); var GraphEdge = ( /** @class */ (function() { function GraphEdge2(n1, n2, dataIndex) { this.dataIndex = -1; this.node1 = n1; this.node2 = n2; this.dataIndex = dataIndex == null ? -1 : dataIndex; } GraphEdge2.prototype.getModel = function(path) { if (this.dataIndex < 0) { return; } var graph = this.hostGraph; var itemModel = graph.edgeData.getItemModel(this.dataIndex); return itemModel.getModel(path); }; GraphEdge2.prototype.getAdjacentDataIndices = function() { return { edge: [this.dataIndex], node: [this.node1.dataIndex, this.node2.dataIndex] }; }; GraphEdge2.prototype.getTrajectoryDataIndices = function() { var connectedEdgesMap = createHashMap(); var connectedNodesMap = createHashMap(); connectedEdgesMap.set(this.dataIndex, true); var sourceNodes = [this.node1]; var targetNodes = [this.node2]; var nodeIteratorIndex = 0; while (nodeIteratorIndex < sourceNodes.length) { var sourceNode = sourceNodes[nodeIteratorIndex]; nodeIteratorIndex++; connectedNodesMap.set(sourceNode.dataIndex, true); for (var j = 0; j < sourceNode.inEdges.length; j++) { connectedEdgesMap.set(sourceNode.inEdges[j].dataIndex, true); sourceNodes.push(sourceNode.inEdges[j].node1); } } nodeIteratorIndex = 0; while (nodeIteratorIndex < targetNodes.length) { var targetNode = targetNodes[nodeIteratorIndex]; nodeIteratorIndex++; connectedNodesMap.set(targetNode.dataIndex, true); for (var j = 0; j < targetNode.outEdges.length; j++) { connectedEdgesMap.set(targetNode.outEdges[j].dataIndex, true); targetNodes.push(targetNode.outEdges[j].node2); } } return { edge: connectedEdgesMap.keys(), node: connectedNodesMap.keys() }; }; return GraphEdge2; })() ); function createGraphDataProxyMixin(hostName, dataName) { return { /** * @param Default 'value'. can be 'a', 'b', 'c', 'd', 'e'. */ getValue: function(dimension) { var data = this[hostName][dataName]; return data.getStore().get(data.getDimensionIndex(dimension || "value"), this.dataIndex); }, // TODO: TYPE stricter type. setVisual: function(key, value) { this.dataIndex >= 0 && this[hostName][dataName].setItemVisual(this.dataIndex, key, value); }, getVisual: function(key) { return this[hostName][dataName].getItemVisual(this.dataIndex, key); }, setLayout: function(layout2, merge2) { this.dataIndex >= 0 && this[hostName][dataName].setItemLayout(this.dataIndex, layout2, merge2); }, getLayout: function() { return this[hostName][dataName].getItemLayout(this.dataIndex); }, getGraphicEl: function() { return this[hostName][dataName].getItemGraphicEl(this.dataIndex); }, getRawIndex: function() { return this[hostName][dataName].getRawIndex(this.dataIndex); } }; } mixin(GraphNode, createGraphDataProxyMixin("hostGraph", "data")); mixin(GraphEdge, createGraphDataProxyMixin("hostGraph", "edgeData")); function createGraphFromNodeEdge(nodes, edges, seriesModel, directed, beforeLink) { var graph = new Graph(directed); for (var i = 0; i < nodes.length; i++) { graph.addNode(retrieve( // Id, name, dataIndex nodes[i].id, nodes[i].name, i ), i); } var linkNameList = []; var validEdges = []; var linkCount = 0; for (var i = 0; i < edges.length; i++) { var link = edges[i]; var source = link.source; var target = link.target; if (graph.addEdge(source, target, linkCount)) { validEdges.push(link); linkNameList.push(retrieve(convertOptionIdName(link.id, null), source + " > " + target)); linkCount++; } } var coordSys = seriesModel.get("coordinateSystem"); var nodeData; if (coordSys === "cartesian2d" || coordSys === "polar") { nodeData = createSeriesData(nodes, seriesModel); } else { var coordSysCtor = CoordinateSystemManager.get(coordSys); var coordDimensions = coordSysCtor ? coordSysCtor.dimensions || [] : []; if (indexOf(coordDimensions, "value") < 0) { coordDimensions.concat(["value"]); } var dimensions = prepareSeriesDataSchema(nodes, { coordDimensions, encodeDefine: seriesModel.getEncode() }).dimensions; nodeData = new SeriesData(dimensions, seriesModel); nodeData.initData(nodes); } var edgeData = new SeriesData(["value"], seriesModel); edgeData.initData(validEdges, linkNameList); beforeLink && beforeLink(nodeData, edgeData); linkSeriesData({ mainData: nodeData, struct: graph, structAttr: "graph", datas: { node: nodeData, edge: edgeData }, datasAttr: { node: "data", edge: "edgeData" } }); graph.update(); return graph; } var GraphSeriesModel = ( /** @class */ (function(_super) { __extends(GraphSeriesModel2, _super); function GraphSeriesModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = GraphSeriesModel2.type; _this.hasSymbolVisual = true; return _this; } GraphSeriesModel2.prototype.init = function(option) { _super.prototype.init.apply(this, arguments); var self = this; function getCategoriesData() { return self._categoriesData; } this.legendVisualProvider = new LegendVisualProvider(getCategoriesData, getCategoriesData); this.fillDataTextStyle(option.edges || option.links); this._updateCategoriesData(); }; GraphSeriesModel2.prototype.mergeOption = function(option) { _super.prototype.mergeOption.apply(this, arguments); this.fillDataTextStyle(option.edges || option.links); this._updateCategoriesData(); }; GraphSeriesModel2.prototype.mergeDefaultAndTheme = function(option) { _super.prototype.mergeDefaultAndTheme.apply(this, arguments); defaultEmphasis(option, "edgeLabel", ["show"]); }; GraphSeriesModel2.prototype.getInitialData = function(option, ecModel) { var edges = option.edges || option.links || []; var nodes = option.data || option.nodes || []; var self = this; if (nodes && edges) { initCurvenessList(this); var graph = createGraphFromNodeEdge(nodes, edges, this, true, beforeLink); each$f(graph.edges, function(edge) { createEdgeMapForCurveness(edge.node1, edge.node2, this, edge.dataIndex); }, this); return graph.data; } function beforeLink(nodeData, edgeData) { nodeData.wrapMethod("getItemModel", function(model) { var categoriesModels = self._categoriesModels; var categoryIdx = model.getShallow("category"); var categoryModel = categoriesModels[categoryIdx]; if (categoryModel) { categoryModel.parentModel = model.parentModel; model.parentModel = categoryModel; } return model; }); var oldGetModel = Model.prototype.getModel; function newGetModel(path, parentModel) { var model = oldGetModel.call(this, path, parentModel); model.resolveParentPath = resolveParentPath; return model; } edgeData.wrapMethod("getItemModel", function(model) { model.resolveParentPath = resolveParentPath; model.getModel = newGetModel; return model; }); function resolveParentPath(pathArr) { if (pathArr && (pathArr[0] === "label" || pathArr[1] === "label")) { var newPathArr = pathArr.slice(); if (pathArr[0] === "label") { newPathArr[0] = "edgeLabel"; } else if (pathArr[1] === "label") { newPathArr[1] = "edgeLabel"; } return newPathArr; } return pathArr; } } }; GraphSeriesModel2.prototype.getGraph = function() { return this.getData().graph; }; GraphSeriesModel2.prototype.getEdgeData = function() { return this.getGraph().edgeData; }; GraphSeriesModel2.prototype.getCategoriesData = function() { return this._categoriesData; }; GraphSeriesModel2.prototype.formatTooltip = function(dataIndex, multipleSeries, dataType) { if (dataType === "edge") { var nodeData = this.getData(); var params = this.getDataParams(dataIndex, dataType); var edge = nodeData.graph.getEdgeByIndex(dataIndex); var sourceName = nodeData.getName(edge.node1.dataIndex); var targetName = nodeData.getName(edge.node2.dataIndex); var nameArr = []; sourceName != null && nameArr.push(sourceName); targetName != null && nameArr.push(targetName); return createTooltipMarkup("nameValue", { name: nameArr.join(" > "), value: params.value, noValue: params.value == null }); } var nodeMarkup = defaultSeriesFormatTooltip({ series: this, dataIndex, multipleSeries }); return nodeMarkup; }; GraphSeriesModel2.prototype._updateCategoriesData = function() { var categories = map$1(this.option.categories || [], function(category) { return category.value != null ? category : extend({ value: 0 }, category); }); var categoriesData = new SeriesData(["value"], this); categoriesData.initData(categories); this._categoriesData = categoriesData; this._categoriesModels = categoriesData.mapArray(function(idx) { return categoriesData.getItemModel(idx); }); }; GraphSeriesModel2.prototype.setZoom = function(zoom) { this.option.zoom = zoom; }; GraphSeriesModel2.prototype.setCenter = function(center2) { this.option.center = center2; }; GraphSeriesModel2.prototype.isAnimationEnabled = function() { return _super.prototype.isAnimationEnabled.call(this) && !(this.get("layout") === "force" && this.get(["force", "layoutAnimation"])); }; GraphSeriesModel2.type = "series.graph"; GraphSeriesModel2.dependencies = ["grid", "polar", "geo", "singleAxis", "calendar"]; GraphSeriesModel2.defaultOption = { // zlevel: 0, z: 2, coordinateSystem: "view", // Default option for all coordinate systems // xAxisIndex: 0, // yAxisIndex: 0, // polarIndex: 0, // geoIndex: 0, legendHoverLink: true, layout: null, // Configuration of circular layout circular: { rotateLabel: false }, // Configuration of force directed layout force: { initLayout: null, // Node repulsion. Can be an array to represent range. repulsion: [0, 50], gravity: 0.1, // Initial friction friction: 0.6, // Edge length. Can be an array to represent range. edgeLength: 30, layoutAnimation: true }, left: "center", top: "center", // right: null, // bottom: null, // width: '80%', // height: '80%', symbol: "circle", symbolSize: 10, edgeSymbol: ["none", "none"], edgeSymbolSize: 10, edgeLabel: { position: "middle", distance: 5 }, draggable: false, roam: false, // Default on center of graph center: null, zoom: 1, // Symbol size scale ratio in roam nodeScaleRatio: 0.6, // cursor: null, // categories: [], // data: [] // Or // nodes: [] // // links: [] // Or // edges: [] label: { show: false, formatter: "{b}" }, itemStyle: {}, lineStyle: { color: "#aaa", width: 1, opacity: 0.5 }, emphasis: { scale: true, label: { show: true } }, select: { itemStyle: { borderColor: "#212121" } } }; return GraphSeriesModel2; })(SeriesModel) ); var actionInfo$1 = { type: "graphRoam", event: "graphRoam", update: "none" }; function install$H(registers) { registers.registerChartView(GraphView); registers.registerSeriesModel(GraphSeriesModel); registers.registerProcessor(categoryFilter); registers.registerVisual(categoryVisual); registers.registerVisual(graphEdgeVisual); registers.registerLayout(graphSimpleLayout); registers.registerLayout(registers.PRIORITY.VISUAL.POST_CHART_LAYOUT, graphCircularLayout); registers.registerLayout(graphForceLayout); registers.registerCoordinateSystem("graphView", { dimensions: View.dimensions, create: createViewCoordSys }); registers.registerAction({ type: "focusNodeAdjacency", event: "focusNodeAdjacency", update: "series:focusNodeAdjacency" }, noop); registers.registerAction({ type: "unfocusNodeAdjacency", event: "unfocusNodeAdjacency", update: "series:unfocusNodeAdjacency" }, noop); registers.registerAction(actionInfo$1, function(payload, ecModel, api) { ecModel.eachComponent({ mainType: "series", query: payload }, function(seriesModel) { var coordSys = seriesModel.coordinateSystem; var res = updateCenterAndZoom(coordSys, payload, void 0, api); seriesModel.setCenter && seriesModel.setCenter(res.center); seriesModel.setZoom && seriesModel.setZoom(res.zoom); }); }); } var PointerShape = ( /** @class */ /* @__PURE__ */ (function() { function PointerShape2() { this.angle = 0; this.width = 10; this.r = 10; this.x = 0; this.y = 0; } return PointerShape2; })() ); var PointerPath = ( /** @class */ (function(_super) { __extends(PointerPath2, _super); function PointerPath2(opts) { var _this = _super.call(this, opts) || this; _this.type = "pointer"; return _this; } PointerPath2.prototype.getDefaultShape = function() { return new PointerShape(); }; PointerPath2.prototype.buildPath = function(ctx, shape) { var mathCos = Math.cos; var mathSin = Math.sin; var r = shape.r; var width = shape.width; var angle = shape.angle; var x = shape.x - mathCos(angle) * width * (width >= r / 3 ? 1 : 2); var y = shape.y - mathSin(angle) * width * (width >= r / 3 ? 1 : 2); angle = shape.angle - Math.PI / 2; ctx.moveTo(x, y); ctx.lineTo(shape.x + mathCos(angle) * width, shape.y + mathSin(angle) * width); ctx.lineTo(shape.x + mathCos(shape.angle) * r, shape.y + mathSin(shape.angle) * r); ctx.lineTo(shape.x - mathCos(angle) * width, shape.y - mathSin(angle) * width); ctx.lineTo(x, y); }; return PointerPath2; })(Path) ); function parsePosition(seriesModel, api) { var center2 = seriesModel.get("center"); var width = api.getWidth(); var height = api.getHeight(); var size = Math.min(width, height); var cx = parsePercent(center2[0], api.getWidth()); var cy = parsePercent(center2[1], api.getHeight()); var r = parsePercent(seriesModel.get("radius"), size / 2); return { cx, cy, r }; } function formatLabel(value, labelFormatter) { var label = value == null ? "" : value + ""; if (labelFormatter) { if (isString(labelFormatter)) { label = labelFormatter.replace("{value}", label); } else if (isFunction(labelFormatter)) { label = labelFormatter(value); } } return label; } var GaugeView = ( /** @class */ (function(_super) { __extends(GaugeView2, _super); function GaugeView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = GaugeView2.type; return _this; } GaugeView2.prototype.render = function(seriesModel, ecModel, api) { this.group.removeAll(); var colorList = seriesModel.get(["axisLine", "lineStyle", "color"]); var posInfo = parsePosition(seriesModel, api); this._renderMain(seriesModel, ecModel, api, colorList, posInfo); this._data = seriesModel.getData(); }; GaugeView2.prototype.dispose = function() { }; GaugeView2.prototype._renderMain = function(seriesModel, ecModel, api, colorList, posInfo) { var group = this.group; var clockwise = seriesModel.get("clockwise"); var startAngle = -seriesModel.get("startAngle") / 180 * Math.PI; var endAngle = -seriesModel.get("endAngle") / 180 * Math.PI; var axisLineModel = seriesModel.getModel("axisLine"); var roundCap = axisLineModel.get("roundCap"); var MainPath = roundCap ? SausagePath : Sector; var showAxis = axisLineModel.get("show"); var lineStyleModel = axisLineModel.getModel("lineStyle"); var axisLineWidth = lineStyleModel.get("width"); var angles = [startAngle, endAngle]; normalizeArcAngles(angles, !clockwise); startAngle = angles[0]; endAngle = angles[1]; var angleRangeSpan = endAngle - startAngle; var prevEndAngle = startAngle; var sectors = []; for (var i = 0; showAxis && i < colorList.length; i++) { var percent = Math.min(Math.max(colorList[i][0], 0), 1); endAngle = startAngle + angleRangeSpan * percent; var sector = new MainPath({ shape: { startAngle: prevEndAngle, endAngle, cx: posInfo.cx, cy: posInfo.cy, clockwise, r0: posInfo.r - axisLineWidth, r: posInfo.r }, silent: true }); sector.setStyle({ fill: colorList[i][1] }); sector.setStyle(lineStyleModel.getLineStyle( // Because we use sector to simulate arc // so the properties for stroking are useless ["color", "width"] )); sectors.push(sector); prevEndAngle = endAngle; } sectors.reverse(); each$f(sectors, function(sector2) { return group.add(sector2); }); var getColor2 = function(percent2) { if (percent2 <= 0) { return colorList[0][1]; } var i2; for (i2 = 0; i2 < colorList.length; i2++) { if (colorList[i2][0] >= percent2 && (i2 === 0 ? 0 : colorList[i2 - 1][0]) < percent2) { return colorList[i2][1]; } } return colorList[i2 - 1][1]; }; this._renderTicks(seriesModel, ecModel, api, getColor2, posInfo, startAngle, endAngle, clockwise, axisLineWidth); this._renderTitleAndDetail(seriesModel, ecModel, api, getColor2, posInfo); this._renderAnchor(seriesModel, posInfo); this._renderPointer(seriesModel, ecModel, api, getColor2, posInfo, startAngle, endAngle, clockwise, axisLineWidth); }; GaugeView2.prototype._renderTicks = function(seriesModel, ecModel, api, getColor2, posInfo, startAngle, endAngle, clockwise, axisLineWidth) { var group = this.group; var cx = posInfo.cx; var cy = posInfo.cy; var r = posInfo.r; var minVal = +seriesModel.get("min"); var maxVal = +seriesModel.get("max"); var splitLineModel = seriesModel.getModel("splitLine"); var tickModel = seriesModel.getModel("axisTick"); var labelModel = seriesModel.getModel("axisLabel"); var splitNumber = seriesModel.get("splitNumber"); var subSplitNumber = tickModel.get("splitNumber"); var splitLineLen = parsePercent(splitLineModel.get("length"), r); var tickLen = parsePercent(tickModel.get("length"), r); var angle = startAngle; var step = (endAngle - startAngle) / splitNumber; var subStep = step / subSplitNumber; var splitLineStyle = splitLineModel.getModel("lineStyle").getLineStyle(); var tickLineStyle = tickModel.getModel("lineStyle").getLineStyle(); var splitLineDistance = splitLineModel.get("distance"); var unitX; var unitY; for (var i = 0; i <= splitNumber; i++) { unitX = Math.cos(angle); unitY = Math.sin(angle); if (splitLineModel.get("show")) { var distance = splitLineDistance ? splitLineDistance + axisLineWidth : axisLineWidth; var splitLine = new Line$1({ shape: { x1: unitX * (r - distance) + cx, y1: unitY * (r - distance) + cy, x2: unitX * (r - splitLineLen - distance) + cx, y2: unitY * (r - splitLineLen - distance) + cy }, style: splitLineStyle, silent: true }); if (splitLineStyle.stroke === "auto") { splitLine.setStyle({ stroke: getColor2(i / splitNumber) }); } group.add(splitLine); } if (labelModel.get("show")) { var distance = labelModel.get("distance") + splitLineDistance; var label = formatLabel(round$1(i / splitNumber * (maxVal - minVal) + minVal), labelModel.get("formatter")); var autoColor = getColor2(i / splitNumber); var textStyleX = unitX * (r - splitLineLen - distance) + cx; var textStyleY = unitY * (r - splitLineLen - distance) + cy; var rotateType = labelModel.get("rotate"); var rotate2 = 0; if (rotateType === "radial") { rotate2 = -angle + 2 * Math.PI; if (rotate2 > Math.PI / 2) { rotate2 += Math.PI; } } else if (rotateType === "tangential") { rotate2 = -angle - Math.PI / 2; } else if (isNumber(rotateType)) { rotate2 = rotateType * Math.PI / 180; } if (rotate2 === 0) { group.add(new ZRText({ style: createTextStyle(labelModel, { text: label, x: textStyleX, y: textStyleY, verticalAlign: unitY < -0.8 ? "top" : unitY > 0.8 ? "bottom" : "middle", align: unitX < -0.4 ? "left" : unitX > 0.4 ? "right" : "center" }, { inheritColor: autoColor }), silent: true })); } else { group.add(new ZRText({ style: createTextStyle(labelModel, { text: label, x: textStyleX, y: textStyleY, verticalAlign: "middle", align: "center" }, { inheritColor: autoColor }), silent: true, originX: textStyleX, originY: textStyleY, rotation: rotate2 })); } } if (tickModel.get("show") && i !== splitNumber) { var distance = tickModel.get("distance"); distance = distance ? distance + axisLineWidth : axisLineWidth; for (var j = 0; j <= subSplitNumber; j++) { unitX = Math.cos(angle); unitY = Math.sin(angle); var tickLine = new Line$1({ shape: { x1: unitX * (r - distance) + cx, y1: unitY * (r - distance) + cy, x2: unitX * (r - tickLen - distance) + cx, y2: unitY * (r - tickLen - distance) + cy }, silent: true, style: tickLineStyle }); if (tickLineStyle.stroke === "auto") { tickLine.setStyle({ stroke: getColor2((i + j / subSplitNumber) / splitNumber) }); } group.add(tickLine); angle += subStep; } angle -= subStep; } else { angle += step; } } }; GaugeView2.prototype._renderPointer = function(seriesModel, ecModel, api, getColor2, posInfo, startAngle, endAngle, clockwise, axisLineWidth) { var group = this.group; var oldData = this._data; var oldProgressData = this._progressEls; var progressList = []; var showPointer2 = seriesModel.get(["pointer", "show"]); var progressModel = seriesModel.getModel("progress"); var showProgress = progressModel.get("show"); var data = seriesModel.getData(); var valueDim = data.mapDimension("value"); var minVal = +seriesModel.get("min"); var maxVal = +seriesModel.get("max"); var valueExtent = [minVal, maxVal]; var angleExtent = [startAngle, endAngle]; function createPointer(idx, angle) { var itemModel = data.getItemModel(idx); var pointerModel = itemModel.getModel("pointer"); var pointerWidth = parsePercent(pointerModel.get("width"), posInfo.r); var pointerLength = parsePercent(pointerModel.get("length"), posInfo.r); var pointerStr = seriesModel.get(["pointer", "icon"]); var pointerOffset = pointerModel.get("offsetCenter"); var pointerOffsetX = parsePercent(pointerOffset[0], posInfo.r); var pointerOffsetY = parsePercent(pointerOffset[1], posInfo.r); var pointerKeepAspect = pointerModel.get("keepAspect"); var pointer; if (pointerStr) { pointer = createSymbol$1(pointerStr, pointerOffsetX - pointerWidth / 2, pointerOffsetY - pointerLength, pointerWidth, pointerLength, null, pointerKeepAspect); } else { pointer = new PointerPath({ shape: { angle: -Math.PI / 2, width: pointerWidth, r: pointerLength, x: pointerOffsetX, y: pointerOffsetY } }); } pointer.rotation = -(angle + Math.PI / 2); pointer.x = posInfo.cx; pointer.y = posInfo.cy; return pointer; } function createProgress(idx, endAngle2) { var roundCap = progressModel.get("roundCap"); var ProgressPath = roundCap ? SausagePath : Sector; var isOverlap = progressModel.get("overlap"); var progressWidth = isOverlap ? progressModel.get("width") : axisLineWidth / data.count(); var r0 = isOverlap ? posInfo.r - progressWidth : posInfo.r - (idx + 1) * progressWidth; var r = isOverlap ? posInfo.r : posInfo.r - idx * progressWidth; var progress = new ProgressPath({ shape: { startAngle, endAngle: endAngle2, cx: posInfo.cx, cy: posInfo.cy, clockwise, r0, r } }); isOverlap && (progress.z2 = linearMap$2(data.get(valueDim, idx), [minVal, maxVal], [100, 0], true)); return progress; } if (showProgress || showPointer2) { data.diff(oldData).add(function(idx) { var val = data.get(valueDim, idx); if (showPointer2) { var pointer = createPointer(idx, startAngle); initProps(pointer, { rotation: -((isNaN(+val) ? angleExtent[0] : linearMap$2(val, valueExtent, angleExtent, true)) + Math.PI / 2) }, seriesModel); group.add(pointer); data.setItemGraphicEl(idx, pointer); } if (showProgress) { var progress = createProgress(idx, startAngle); var isClip = progressModel.get("clip"); initProps(progress, { shape: { endAngle: linearMap$2(val, valueExtent, angleExtent, isClip) } }, seriesModel); group.add(progress); setCommonECData(seriesModel.seriesIndex, data.dataType, idx, progress); progressList[idx] = progress; } }).update(function(newIdx, oldIdx) { var val = data.get(valueDim, newIdx); if (showPointer2) { var previousPointer = oldData.getItemGraphicEl(oldIdx); var previousRotate = previousPointer ? previousPointer.rotation : startAngle; var pointer = createPointer(newIdx, previousRotate); pointer.rotation = previousRotate; updateProps$1(pointer, { rotation: -((isNaN(+val) ? angleExtent[0] : linearMap$2(val, valueExtent, angleExtent, true)) + Math.PI / 2) }, seriesModel); group.add(pointer); data.setItemGraphicEl(newIdx, pointer); } if (showProgress) { var previousProgress = oldProgressData[oldIdx]; var previousEndAngle = previousProgress ? previousProgress.shape.endAngle : startAngle; var progress = createProgress(newIdx, previousEndAngle); var isClip = progressModel.get("clip"); updateProps$1(progress, { shape: { endAngle: linearMap$2(val, valueExtent, angleExtent, isClip) } }, seriesModel); group.add(progress); setCommonECData(seriesModel.seriesIndex, data.dataType, newIdx, progress); progressList[newIdx] = progress; } }).execute(); data.each(function(idx) { var itemModel = data.getItemModel(idx); var emphasisModel = itemModel.getModel("emphasis"); var focus = emphasisModel.get("focus"); var blurScope = emphasisModel.get("blurScope"); var emphasisDisabled = emphasisModel.get("disabled"); if (showPointer2) { var pointer = data.getItemGraphicEl(idx); var symbolStyle = data.getItemVisual(idx, "style"); var visualColor = symbolStyle.fill; if (pointer instanceof ZRImage) { var pathStyle = pointer.style; pointer.useStyle(extend({ image: pathStyle.image, x: pathStyle.x, y: pathStyle.y, width: pathStyle.width, height: pathStyle.height }, symbolStyle)); } else { pointer.useStyle(symbolStyle); pointer.type !== "pointer" && pointer.setColor(visualColor); } pointer.setStyle(itemModel.getModel(["pointer", "itemStyle"]).getItemStyle()); if (pointer.style.fill === "auto") { pointer.setStyle("fill", getColor2(linearMap$2(data.get(valueDim, idx), valueExtent, [0, 1], true))); } pointer.z2EmphasisLift = 0; setStatesStylesFromModel(pointer, itemModel); toggleHoverEmphasis(pointer, focus, blurScope, emphasisDisabled); } if (showProgress) { var progress = progressList[idx]; progress.useStyle(data.getItemVisual(idx, "style")); progress.setStyle(itemModel.getModel(["progress", "itemStyle"]).getItemStyle()); progress.z2EmphasisLift = 0; setStatesStylesFromModel(progress, itemModel); toggleHoverEmphasis(progress, focus, blurScope, emphasisDisabled); } }); this._progressEls = progressList; } }; GaugeView2.prototype._renderAnchor = function(seriesModel, posInfo) { var anchorModel = seriesModel.getModel("anchor"); var showAnchor = anchorModel.get("show"); if (showAnchor) { var anchorSize = anchorModel.get("size"); var anchorType = anchorModel.get("icon"); var offsetCenter = anchorModel.get("offsetCenter"); var anchorKeepAspect = anchorModel.get("keepAspect"); var anchor = createSymbol$1(anchorType, posInfo.cx - anchorSize / 2 + parsePercent(offsetCenter[0], posInfo.r), posInfo.cy - anchorSize / 2 + parsePercent(offsetCenter[1], posInfo.r), anchorSize, anchorSize, null, anchorKeepAspect); anchor.z2 = anchorModel.get("showAbove") ? 1 : 0; anchor.setStyle(anchorModel.getModel("itemStyle").getItemStyle()); this.group.add(anchor); } }; GaugeView2.prototype._renderTitleAndDetail = function(seriesModel, ecModel, api, getColor2, posInfo) { var _this = this; var data = seriesModel.getData(); var valueDim = data.mapDimension("value"); var minVal = +seriesModel.get("min"); var maxVal = +seriesModel.get("max"); var contentGroup = new Group$3(); var newTitleEls = []; var newDetailEls = []; var hasAnimation = seriesModel.isAnimationEnabled(); var showPointerAbove = seriesModel.get(["pointer", "showAbove"]); data.diff(this._data).add(function(idx) { newTitleEls[idx] = new ZRText({ silent: true }); newDetailEls[idx] = new ZRText({ silent: true }); }).update(function(idx, oldIdx) { newTitleEls[idx] = _this._titleEls[oldIdx]; newDetailEls[idx] = _this._detailEls[oldIdx]; }).execute(); data.each(function(idx) { var itemModel = data.getItemModel(idx); var value = data.get(valueDim, idx); var itemGroup = new Group$3(); var autoColor = getColor2(linearMap$2(value, [minVal, maxVal], [0, 1], true)); var itemTitleModel = itemModel.getModel("title"); if (itemTitleModel.get("show")) { var titleOffsetCenter = itemTitleModel.get("offsetCenter"); var titleX = posInfo.cx + parsePercent(titleOffsetCenter[0], posInfo.r); var titleY = posInfo.cy + parsePercent(titleOffsetCenter[1], posInfo.r); var labelEl = newTitleEls[idx]; labelEl.attr({ z2: showPointerAbove ? 0 : 2, style: createTextStyle(itemTitleModel, { x: titleX, y: titleY, text: data.getName(idx), align: "center", verticalAlign: "middle" }, { inheritColor: autoColor }) }); itemGroup.add(labelEl); } var itemDetailModel = itemModel.getModel("detail"); if (itemDetailModel.get("show")) { var detailOffsetCenter = itemDetailModel.get("offsetCenter"); var detailX = posInfo.cx + parsePercent(detailOffsetCenter[0], posInfo.r); var detailY = posInfo.cy + parsePercent(detailOffsetCenter[1], posInfo.r); var width = parsePercent(itemDetailModel.get("width"), posInfo.r); var height = parsePercent(itemDetailModel.get("height"), posInfo.r); var detailColor = seriesModel.get(["progress", "show"]) ? data.getItemVisual(idx, "style").fill : autoColor; var labelEl = newDetailEls[idx]; var formatter_1 = itemDetailModel.get("formatter"); labelEl.attr({ z2: showPointerAbove ? 0 : 2, style: createTextStyle(itemDetailModel, { x: detailX, y: detailY, text: formatLabel(value, formatter_1), width: isNaN(width) ? null : width, height: isNaN(height) ? null : height, align: "center", verticalAlign: "middle" }, { inheritColor: detailColor }) }); setLabelValueAnimation(labelEl, { normal: itemDetailModel }, value, function(value2) { return formatLabel(value2, formatter_1); }); hasAnimation && animateLabelValue(labelEl, idx, data, seriesModel, { getFormattedLabel: function(labelDataIndex, status, dataType, labelDimIndex, fmt, extendParams) { return formatLabel(extendParams ? extendParams.interpolatedValue : value, formatter_1); } }); itemGroup.add(labelEl); } contentGroup.add(itemGroup); }); this.group.add(contentGroup); this._titleEls = newTitleEls; this._detailEls = newDetailEls; }; GaugeView2.type = "gauge"; return GaugeView2; })(ChartView) ); var GaugeSeriesModel = ( /** @class */ (function(_super) { __extends(GaugeSeriesModel2, _super); function GaugeSeriesModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = GaugeSeriesModel2.type; _this.visualStyleAccessPath = "itemStyle"; return _this; } GaugeSeriesModel2.prototype.getInitialData = function(option, ecModel) { return createSeriesDataSimply(this, ["value"]); }; GaugeSeriesModel2.type = "series.gauge"; GaugeSeriesModel2.defaultOption = { // zlevel: 0, z: 2, colorBy: "data", // 默认全局居中 center: ["50%", "50%"], legendHoverLink: true, radius: "75%", startAngle: 225, endAngle: -45, clockwise: true, // 最小值 min: 0, // 最大值 max: 100, // 分割段数,默认为10 splitNumber: 10, // 坐标轴线 axisLine: { // 默认显示,属性show控制显示与否 show: true, roundCap: false, lineStyle: { color: [[1, "#E6EBF8"]], width: 10 } }, // 坐标轴线 progress: { // 默认显示,属性show控制显示与否 show: false, overlap: true, width: 10, roundCap: false, clip: true }, // 分隔线 splitLine: { // 默认显示,属性show控制显示与否 show: true, // 属性length控制线长 length: 10, distance: 10, // 属性lineStyle(详见lineStyle)控制线条样式 lineStyle: { color: "#63677A", width: 3, type: "solid" } }, // 坐标轴小标记 axisTick: { // 属性show控制显示与否,默认不显示 show: true, // 每份split细分多少段 splitNumber: 5, // 属性length控制线长 length: 6, distance: 10, // 属性lineStyle控制线条样式 lineStyle: { color: "#63677A", width: 1, type: "solid" } }, axisLabel: { show: true, distance: 15, // formatter: null, color: "#464646", fontSize: 12, rotate: 0 }, pointer: { icon: null, offsetCenter: [0, 0], show: true, showAbove: true, length: "60%", width: 6, keepAspect: false }, anchor: { show: false, showAbove: false, size: 6, icon: "circle", offsetCenter: [0, 0], keepAspect: false, itemStyle: { color: "#fff", borderWidth: 0, borderColor: "#5470c6" } }, title: { show: true, // x, y,单位px offsetCenter: [0, "20%"], // 其余属性默认使用全局文本样式,详见TEXTSTYLE color: "#464646", fontSize: 16, valueAnimation: false }, detail: { show: true, backgroundColor: "rgba(0,0,0,0)", borderWidth: 0, borderColor: "#ccc", width: 100, height: null, padding: [5, 10], // x, y,单位px offsetCenter: [0, "40%"], // formatter: null, // 其余属性默认使用全局文本样式,详见TEXTSTYLE color: "#464646", fontSize: 30, fontWeight: "bold", lineHeight: 30, valueAnimation: false } }; return GaugeSeriesModel2; })(SeriesModel) ); function install$G(registers) { registers.registerChartView(GaugeView); registers.registerSeriesModel(GaugeSeriesModel); } var opacityAccessPath$1 = ["itemStyle", "opacity"]; var FunnelPiece = ( /** @class */ (function(_super) { __extends(FunnelPiece2, _super); function FunnelPiece2(data, idx) { var _this = _super.call(this) || this; var polygon = _this; var labelLine = new Polyline$1(); var text = new ZRText(); polygon.setTextContent(text); _this.setTextGuideLine(labelLine); _this.updateData(data, idx, true); return _this; } FunnelPiece2.prototype.updateData = function(data, idx, firstCreate) { var polygon = this; var seriesModel = data.hostModel; var itemModel = data.getItemModel(idx); var layout2 = data.getItemLayout(idx); var emphasisModel = itemModel.getModel("emphasis"); var opacity = itemModel.get(opacityAccessPath$1); opacity = opacity == null ? 1 : opacity; if (!firstCreate) { saveOldStyle(polygon); } polygon.useStyle(data.getItemVisual(idx, "style")); polygon.style.lineJoin = "round"; if (firstCreate) { polygon.setShape({ points: layout2.points }); polygon.style.opacity = 0; initProps(polygon, { style: { opacity } }, seriesModel, idx); } else { updateProps$1(polygon, { style: { opacity }, shape: { points: layout2.points } }, seriesModel, idx); } setStatesStylesFromModel(polygon, itemModel); this._updateLabel(data, idx); toggleHoverEmphasis(this, emphasisModel.get("focus"), emphasisModel.get("blurScope"), emphasisModel.get("disabled")); }; FunnelPiece2.prototype._updateLabel = function(data, idx) { var polygon = this; var labelLine = this.getTextGuideLine(); var labelText = polygon.getTextContent(); var seriesModel = data.hostModel; var itemModel = data.getItemModel(idx); var layout2 = data.getItemLayout(idx); var labelLayout2 = layout2.label; var style = data.getItemVisual(idx, "style"); var visualColor = style.fill; setLabelStyle( // position will not be used in setLabelStyle labelText, getLabelStatesModels(itemModel), { labelFetcher: data.hostModel, labelDataIndex: idx, defaultOpacity: style.opacity, defaultText: data.getName(idx) }, { normal: { align: labelLayout2.textAlign, verticalAlign: labelLayout2.verticalAlign } } ); polygon.setTextConfig({ local: true, inside: !!labelLayout2.inside, insideStroke: visualColor, // insideFill: 'auto', outsideFill: visualColor }); var linePoints = labelLayout2.linePoints; labelLine.setShape({ points: linePoints }); polygon.textGuideLineConfig = { anchor: linePoints ? new Point(linePoints[0][0], linePoints[0][1]) : null }; updateProps$1(labelText, { style: { x: labelLayout2.x, y: labelLayout2.y } }, seriesModel, idx); labelText.attr({ rotation: labelLayout2.rotation, originX: labelLayout2.x, originY: labelLayout2.y, z2: 10 }); setLabelLineStyle(polygon, getLabelLineStatesModels(itemModel), { // Default use item visual color stroke: visualColor }); }; return FunnelPiece2; })(Polygon) ); var FunnelView = ( /** @class */ (function(_super) { __extends(FunnelView2, _super); function FunnelView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = FunnelView2.type; _this.ignoreLabelLineUpdate = true; return _this; } FunnelView2.prototype.render = function(seriesModel, ecModel, api) { var data = seriesModel.getData(); var oldData = this._data; var group = this.group; data.diff(oldData).add(function(idx) { var funnelPiece = new FunnelPiece(data, idx); data.setItemGraphicEl(idx, funnelPiece); group.add(funnelPiece); }).update(function(newIdx, oldIdx) { var piece = oldData.getItemGraphicEl(oldIdx); piece.updateData(data, newIdx); group.add(piece); data.setItemGraphicEl(newIdx, piece); }).remove(function(idx) { var piece = oldData.getItemGraphicEl(idx); removeElementWithFadeOut(piece, seriesModel, idx); }).execute(); this._data = data; }; FunnelView2.prototype.remove = function() { this.group.removeAll(); this._data = null; }; FunnelView2.prototype.dispose = function() { }; FunnelView2.type = "funnel"; return FunnelView2; })(ChartView) ); var FunnelSeriesModel = ( /** @class */ (function(_super) { __extends(FunnelSeriesModel2, _super); function FunnelSeriesModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = FunnelSeriesModel2.type; return _this; } FunnelSeriesModel2.prototype.init = function(option) { _super.prototype.init.apply(this, arguments); this.legendVisualProvider = new LegendVisualProvider(bind$1(this.getData, this), bind$1(this.getRawData, this)); this._defaultLabelLine(option); }; FunnelSeriesModel2.prototype.getInitialData = function(option, ecModel) { return createSeriesDataSimply(this, { coordDimensions: ["value"], encodeDefaulter: curry$1(makeSeriesEncodeForNameBased, this) }); }; FunnelSeriesModel2.prototype._defaultLabelLine = function(option) { defaultEmphasis(option, "labelLine", ["show"]); var labelLineNormalOpt = option.labelLine; var labelLineEmphasisOpt = option.emphasis.labelLine; labelLineNormalOpt.show = labelLineNormalOpt.show && option.label.show; labelLineEmphasisOpt.show = labelLineEmphasisOpt.show && option.emphasis.label.show; }; FunnelSeriesModel2.prototype.getDataParams = function(dataIndex) { var data = this.getData(); var params = _super.prototype.getDataParams.call(this, dataIndex); var valueDim = data.mapDimension("value"); var sum2 = data.getSum(valueDim); params.percent = !sum2 ? 0 : +(data.get(valueDim, dataIndex) / sum2 * 100).toFixed(2); params.$vars.push("percent"); return params; }; FunnelSeriesModel2.type = "series.funnel"; FunnelSeriesModel2.defaultOption = { // zlevel: 0, // 一级层叠 z: 2, legendHoverLink: true, colorBy: "data", left: 80, top: 60, right: 80, bottom: 60, // width: {totalWidth} - left - right, // height: {totalHeight} - top - bottom, // 默认取数据最小最大值 // min: 0, // max: 100, minSize: "0%", maxSize: "100%", sort: "descending", orient: "vertical", gap: 0, funnelAlign: "center", label: { show: true, position: "outer" // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 }, labelLine: { show: true, length: 20, lineStyle: { // color: 各异, width: 1 } }, itemStyle: { // color: 各异, borderColor: "#fff", borderWidth: 1 }, emphasis: { label: { show: true } }, select: { itemStyle: { borderColor: "#212121" } } }; return FunnelSeriesModel2; })(SeriesModel) ); function getViewRect$2(seriesModel, api) { return getLayoutRect(seriesModel.getBoxLayoutParams(), { width: api.getWidth(), height: api.getHeight() }); } function getSortedIndices(data, sort2) { var valueDim = data.mapDimension("value"); var valueArr = data.mapArray(valueDim, function(val) { return val; }); var indices = []; var isAscending = sort2 === "ascending"; for (var i = 0, len2 = data.count(); i < len2; i++) { indices[i] = i; } if (isFunction(sort2)) { indices.sort(sort2); } else if (sort2 !== "none") { indices.sort(function(a, b) { return isAscending ? valueArr[a] - valueArr[b] : valueArr[b] - valueArr[a]; }); } return indices; } function labelLayout(data) { var seriesModel = data.hostModel; var orient = seriesModel.get("orient"); data.each(function(idx) { var itemModel = data.getItemModel(idx); var labelModel = itemModel.getModel("label"); var labelPosition = labelModel.get("position"); var labelLineModel = itemModel.getModel("labelLine"); var layout2 = data.getItemLayout(idx); var points2 = layout2.points; var isLabelInside = labelPosition === "inner" || labelPosition === "inside" || labelPosition === "center" || labelPosition === "insideLeft" || labelPosition === "insideRight"; var textAlign; var textX; var textY; var linePoints; if (isLabelInside) { if (labelPosition === "insideLeft") { textX = (points2[0][0] + points2[3][0]) / 2 + 5; textY = (points2[0][1] + points2[3][1]) / 2; textAlign = "left"; } else if (labelPosition === "insideRight") { textX = (points2[1][0] + points2[2][0]) / 2 - 5; textY = (points2[1][1] + points2[2][1]) / 2; textAlign = "right"; } else { textX = (points2[0][0] + points2[1][0] + points2[2][0] + points2[3][0]) / 4; textY = (points2[0][1] + points2[1][1] + points2[2][1] + points2[3][1]) / 4; textAlign = "center"; } linePoints = [[textX, textY], [textX, textY]]; } else { var x1 = void 0; var y1 = void 0; var x2 = void 0; var y2 = void 0; var labelLineLen = labelLineModel.get("length"); if (labelPosition === "left") { x1 = (points2[3][0] + points2[0][0]) / 2; y1 = (points2[3][1] + points2[0][1]) / 2; x2 = x1 - labelLineLen; textX = x2 - 5; textAlign = "right"; } else if (labelPosition === "right") { x1 = (points2[1][0] + points2[2][0]) / 2; y1 = (points2[1][1] + points2[2][1]) / 2; x2 = x1 + labelLineLen; textX = x2 + 5; textAlign = "left"; } else if (labelPosition === "top") { x1 = (points2[3][0] + points2[0][0]) / 2; y1 = (points2[3][1] + points2[0][1]) / 2; y2 = y1 - labelLineLen; textY = y2 - 5; textAlign = "center"; } else if (labelPosition === "bottom") { x1 = (points2[1][0] + points2[2][0]) / 2; y1 = (points2[1][1] + points2[2][1]) / 2; y2 = y1 + labelLineLen; textY = y2 + 5; textAlign = "center"; } else if (labelPosition === "rightTop") { x1 = orient === "horizontal" ? points2[3][0] : points2[1][0]; y1 = orient === "horizontal" ? points2[3][1] : points2[1][1]; if (orient === "horizontal") { y2 = y1 - labelLineLen; textY = y2 - 5; textAlign = "center"; } else { x2 = x1 + labelLineLen; textX = x2 + 5; textAlign = "top"; } } else if (labelPosition === "rightBottom") { x1 = points2[2][0]; y1 = points2[2][1]; if (orient === "horizontal") { y2 = y1 + labelLineLen; textY = y2 + 5; textAlign = "center"; } else { x2 = x1 + labelLineLen; textX = x2 + 5; textAlign = "bottom"; } } else if (labelPosition === "leftTop") { x1 = points2[0][0]; y1 = orient === "horizontal" ? points2[0][1] : points2[1][1]; if (orient === "horizontal") { y2 = y1 - labelLineLen; textY = y2 - 5; textAlign = "center"; } else { x2 = x1 - labelLineLen; textX = x2 - 5; textAlign = "right"; } } else if (labelPosition === "leftBottom") { x1 = orient === "horizontal" ? points2[1][0] : points2[3][0]; y1 = orient === "horizontal" ? points2[1][1] : points2[2][1]; if (orient === "horizontal") { y2 = y1 + labelLineLen; textY = y2 + 5; textAlign = "center"; } else { x2 = x1 - labelLineLen; textX = x2 - 5; textAlign = "right"; } } else { x1 = (points2[1][0] + points2[2][0]) / 2; y1 = (points2[1][1] + points2[2][1]) / 2; if (orient === "horizontal") { y2 = y1 + labelLineLen; textY = y2 + 5; textAlign = "center"; } else { x2 = x1 + labelLineLen; textX = x2 + 5; textAlign = "left"; } } if (orient === "horizontal") { x2 = x1; textX = x2; } else { y2 = y1; textY = y2; } linePoints = [[x1, y1], [x2, y2]]; } layout2.label = { linePoints, x: textX, y: textY, verticalAlign: "middle", textAlign, inside: isLabelInside }; }); } function funnelLayout(ecModel, api) { ecModel.eachSeriesByType("funnel", function(seriesModel) { var data = seriesModel.getData(); var valueDim = data.mapDimension("value"); var sort2 = seriesModel.get("sort"); var viewRect = getViewRect$2(seriesModel, api); var orient = seriesModel.get("orient"); var viewWidth = viewRect.width; var viewHeight = viewRect.height; var indices = getSortedIndices(data, sort2); var x = viewRect.x; var y = viewRect.y; var sizeExtent = orient === "horizontal" ? [parsePercent(seriesModel.get("minSize"), viewHeight), parsePercent(seriesModel.get("maxSize"), viewHeight)] : [parsePercent(seriesModel.get("minSize"), viewWidth), parsePercent(seriesModel.get("maxSize"), viewWidth)]; var dataExtent = data.getDataExtent(valueDim); var min2 = seriesModel.get("min"); var max2 = seriesModel.get("max"); if (min2 == null) { min2 = Math.min(dataExtent[0], 0); } if (max2 == null) { max2 = dataExtent[1]; } var funnelAlign = seriesModel.get("funnelAlign"); var gap = seriesModel.get("gap"); var viewSize = orient === "horizontal" ? viewWidth : viewHeight; var itemSize = (viewSize - gap * (data.count() - 1)) / data.count(); var getLinePoints = function(idx2, offset) { if (orient === "horizontal") { var val_1 = data.get(valueDim, idx2) || 0; var itemHeight = linearMap$2(val_1, [min2, max2], sizeExtent, true); var y0 = void 0; switch (funnelAlign) { case "top": y0 = y; break; case "center": y0 = y + (viewHeight - itemHeight) / 2; break; case "bottom": y0 = y + (viewHeight - itemHeight); break; } return [[offset, y0], [offset, y0 + itemHeight]]; } var val = data.get(valueDim, idx2) || 0; var itemWidth = linearMap$2(val, [min2, max2], sizeExtent, true); var x0; switch (funnelAlign) { case "left": x0 = x; break; case "center": x0 = x + (viewWidth - itemWidth) / 2; break; case "right": x0 = x + viewWidth - itemWidth; break; } return [[x0, offset], [x0 + itemWidth, offset]]; }; if (sort2 === "ascending") { itemSize = -itemSize; gap = -gap; if (orient === "horizontal") { x += viewWidth; } else { y += viewHeight; } indices = indices.reverse(); } for (var i = 0; i < indices.length; i++) { var idx = indices[i]; var nextIdx = indices[i + 1]; var itemModel = data.getItemModel(idx); if (orient === "horizontal") { var width = itemModel.get(["itemStyle", "width"]); if (width == null) { width = itemSize; } else { width = parsePercent(width, viewWidth); if (sort2 === "ascending") { width = -width; } } var start = getLinePoints(idx, x); var end = getLinePoints(nextIdx, x + width); x += width + gap; data.setItemLayout(idx, { points: start.concat(end.slice().reverse()) }); } else { var height = itemModel.get(["itemStyle", "height"]); if (height == null) { height = itemSize; } else { height = parsePercent(height, viewHeight); if (sort2 === "ascending") { height = -height; } } var start = getLinePoints(idx, y); var end = getLinePoints(nextIdx, y + height); y += height + gap; data.setItemLayout(idx, { points: start.concat(end.slice().reverse()) }); } } labelLayout(data); }); } function install$F(registers) { registers.registerChartView(FunnelView); registers.registerSeriesModel(FunnelSeriesModel); registers.registerLayout(funnelLayout); registers.registerProcessor(dataFilter$1("funnel")); } var DEFAULT_SMOOTH = 0.3; var ParallelView$1 = ( /** @class */ (function(_super) { __extends(ParallelView2, _super); function ParallelView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = ParallelView2.type; _this._dataGroup = new Group$3(); _this._initialized = false; return _this; } ParallelView2.prototype.init = function() { this.group.add(this._dataGroup); }; ParallelView2.prototype.render = function(seriesModel, ecModel, api, payload) { this._progressiveEls = null; var dataGroup = this._dataGroup; var data = seriesModel.getData(); var oldData = this._data; var coordSys = seriesModel.coordinateSystem; var dimensions = coordSys.dimensions; var seriesScope = makeSeriesScope(seriesModel); data.diff(oldData).add(add).update(update).remove(remove).execute(); function add(newDataIndex) { var line = addEl(data, dataGroup, newDataIndex, dimensions, coordSys); updateElCommon(line, data, newDataIndex, seriesScope); } function update(newDataIndex, oldDataIndex) { var line = oldData.getItemGraphicEl(oldDataIndex); var points2 = createLinePoints(data, newDataIndex, dimensions, coordSys); data.setItemGraphicEl(newDataIndex, line); updateProps$1(line, { shape: { points: points2 } }, seriesModel, newDataIndex); saveOldStyle(line); updateElCommon(line, data, newDataIndex, seriesScope); } function remove(oldDataIndex) { var line = oldData.getItemGraphicEl(oldDataIndex); dataGroup.remove(line); } if (!this._initialized) { this._initialized = true; var clipPath = createGridClipShape$2(coordSys, seriesModel, function() { setTimeout(function() { dataGroup.removeClipPath(); }); }); dataGroup.setClipPath(clipPath); } this._data = data; }; ParallelView2.prototype.incrementalPrepareRender = function(seriesModel, ecModel, api) { this._initialized = true; this._data = null; this._dataGroup.removeAll(); }; ParallelView2.prototype.incrementalRender = function(taskParams, seriesModel, ecModel) { var data = seriesModel.getData(); var coordSys = seriesModel.coordinateSystem; var dimensions = coordSys.dimensions; var seriesScope = makeSeriesScope(seriesModel); var progressiveEls = this._progressiveEls = []; for (var dataIndex = taskParams.start; dataIndex < taskParams.end; dataIndex++) { var line = addEl(data, this._dataGroup, dataIndex, dimensions, coordSys); line.incremental = true; updateElCommon(line, data, dataIndex, seriesScope); progressiveEls.push(line); } }; ParallelView2.prototype.remove = function() { this._dataGroup && this._dataGroup.removeAll(); this._data = null; }; ParallelView2.type = "parallel"; return ParallelView2; })(ChartView) ); function createGridClipShape$2(coordSys, seriesModel, cb) { var parallelModel = coordSys.model; var rect = coordSys.getRect(); var rectEl = new Rect$2({ shape: { x: rect.x, y: rect.y, width: rect.width, height: rect.height } }); var dim = parallelModel.get("layout") === "horizontal" ? "width" : "height"; rectEl.setShape(dim, 0); initProps(rectEl, { shape: { width: rect.width, height: rect.height } }, seriesModel, cb); return rectEl; } function createLinePoints(data, dataIndex, dimensions, coordSys) { var points2 = []; for (var i = 0; i < dimensions.length; i++) { var dimName = dimensions[i]; var value = data.get(data.mapDimension(dimName), dataIndex); if (!isEmptyValue(value, coordSys.getAxis(dimName).type)) { points2.push(coordSys.dataToPoint(value, dimName)); } } return points2; } function addEl(data, dataGroup, dataIndex, dimensions, coordSys) { var points2 = createLinePoints(data, dataIndex, dimensions, coordSys); var line = new Polyline$1({ shape: { points: points2 }, // silent: true, z2: 10 }); dataGroup.add(line); data.setItemGraphicEl(dataIndex, line); return line; } function makeSeriesScope(seriesModel) { var smooth = seriesModel.get("smooth", true); smooth === true && (smooth = DEFAULT_SMOOTH); smooth = numericToNumber(smooth); eqNaN(smooth) && (smooth = 0); return { smooth }; } function updateElCommon(el, data, dataIndex, seriesScope) { el.useStyle(data.getItemVisual(dataIndex, "style")); el.style.fill = null; el.setShape("smooth", seriesScope.smooth); var itemModel = data.getItemModel(dataIndex); var emphasisModel = itemModel.getModel("emphasis"); setStatesStylesFromModel(el, itemModel, "lineStyle"); toggleHoverEmphasis(el, emphasisModel.get("focus"), emphasisModel.get("blurScope"), emphasisModel.get("disabled")); } function isEmptyValue(val, axisType) { return axisType === "category" ? val == null : val == null || isNaN(val); } var ParallelSeriesModel = ( /** @class */ (function(_super) { __extends(ParallelSeriesModel2, _super); function ParallelSeriesModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = ParallelSeriesModel2.type; _this.visualStyleAccessPath = "lineStyle"; _this.visualDrawType = "stroke"; return _this; } ParallelSeriesModel2.prototype.getInitialData = function(option, ecModel) { return createSeriesData(null, this, { useEncodeDefaulter: bind$1(makeDefaultEncode, null, this) }); }; ParallelSeriesModel2.prototype.getRawIndicesByActiveState = function(activeState) { var coordSys = this.coordinateSystem; var data = this.getData(); var indices = []; coordSys.eachActiveState(data, function(theActiveState, dataIndex) { if (activeState === theActiveState) { indices.push(data.getRawIndex(dataIndex)); } }); return indices; }; ParallelSeriesModel2.type = "series.parallel"; ParallelSeriesModel2.dependencies = ["parallel"]; ParallelSeriesModel2.defaultOption = { // zlevel: 0, z: 2, coordinateSystem: "parallel", parallelIndex: 0, label: { show: false }, inactiveOpacity: 0.05, activeOpacity: 1, lineStyle: { width: 1, opacity: 0.45, type: "solid" }, emphasis: { label: { show: false } }, progressive: 500, smooth: false, animationEasing: "linear" }; return ParallelSeriesModel2; })(SeriesModel) ); function makeDefaultEncode(seriesModel) { var parallelModel = seriesModel.ecModel.getComponent("parallel", seriesModel.get("parallelIndex")); if (!parallelModel) { return; } var encodeDefine = {}; each$f(parallelModel.dimensions, function(axisDim) { var dataDimIndex = convertDimNameToNumber(axisDim); encodeDefine[axisDim] = dataDimIndex; }); return encodeDefine; } function convertDimNameToNumber(dimName) { return +dimName.replace("dim", ""); } var opacityAccessPath = ["lineStyle", "opacity"]; var parallelVisual = { seriesType: "parallel", reset: function(seriesModel, ecModel) { var coordSys = seriesModel.coordinateSystem; var opacityMap = { normal: seriesModel.get(["lineStyle", "opacity"]), active: seriesModel.get("activeOpacity"), inactive: seriesModel.get("inactiveOpacity") }; return { progress: function(params, data) { coordSys.eachActiveState(data, function(activeState, dataIndex) { var opacity = opacityMap[activeState]; if (activeState === "normal" && data.hasItemOption) { var itemOpacity = data.getItemModel(dataIndex).get(opacityAccessPath, true); itemOpacity != null && (opacity = itemOpacity); } var existsStyle = data.ensureUniqueItemVisual(dataIndex, "style"); existsStyle.opacity = opacity; }, params.start, params.end); } }; } }; function parallelPreprocessor(option) { createParallelIfNeeded(option); mergeAxisOptionFromParallel(option); } function createParallelIfNeeded(option) { if (option.parallel) { return; } var hasParallelSeries = false; each$f(option.series, function(seriesOpt) { if (seriesOpt && seriesOpt.type === "parallel") { hasParallelSeries = true; } }); if (hasParallelSeries) { option.parallel = [{}]; } } function mergeAxisOptionFromParallel(option) { var axes = normalizeToArray(option.parallelAxis); each$f(axes, function(axisOption) { if (!isObject$3(axisOption)) { return; } var parallelIndex = axisOption.parallelIndex || 0; var parallelOption = normalizeToArray(option.parallel)[parallelIndex]; if (parallelOption && parallelOption.parallelAxisDefault) { merge(axisOption, parallelOption.parallelAxisDefault, false); } }); } var CLICK_THRESHOLD = 5; var ParallelView = ( /** @class */ (function(_super) { __extends(ParallelView2, _super); function ParallelView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = ParallelView2.type; return _this; } ParallelView2.prototype.render = function(parallelModel, ecModel, api) { this._model = parallelModel; this._api = api; if (!this._handlers) { this._handlers = {}; each$f(handlers$1, function(handler, eventName) { api.getZr().on(eventName, this._handlers[eventName] = bind$1(handler, this)); }, this); } createOrUpdate(this, "_throttledDispatchExpand", parallelModel.get("axisExpandRate"), "fixRate"); }; ParallelView2.prototype.dispose = function(ecModel, api) { clear$1(this, "_throttledDispatchExpand"); each$f(this._handlers, function(handler, eventName) { api.getZr().off(eventName, handler); }); this._handlers = null; }; ParallelView2.prototype._throttledDispatchExpand = function(opt) { this._dispatchExpand(opt); }; ParallelView2.prototype._dispatchExpand = function(opt) { opt && this._api.dispatchAction(extend({ type: "parallelAxisExpand" }, opt)); }; ParallelView2.type = "parallel"; return ParallelView2; })(ComponentView) ); var handlers$1 = { mousedown: function(e) { if (checkTrigger(this, "click")) { this._mouseDownPoint = [e.offsetX, e.offsetY]; } }, mouseup: function(e) { var mouseDownPoint = this._mouseDownPoint; if (checkTrigger(this, "click") && mouseDownPoint) { var point = [e.offsetX, e.offsetY]; var dist2 = Math.pow(mouseDownPoint[0] - point[0], 2) + Math.pow(mouseDownPoint[1] - point[1], 2); if (dist2 > CLICK_THRESHOLD) { return; } var result = this._model.coordinateSystem.getSlidedAxisExpandWindow([e.offsetX, e.offsetY]); result.behavior !== "none" && this._dispatchExpand({ axisExpandWindow: result.axisExpandWindow }); } this._mouseDownPoint = null; }, mousemove: function(e) { if (this._mouseDownPoint || !checkTrigger(this, "mousemove")) { return; } var model = this._model; var result = model.coordinateSystem.getSlidedAxisExpandWindow([e.offsetX, e.offsetY]); var behavior = result.behavior; behavior === "jump" && this._throttledDispatchExpand.debounceNextCall(model.get("axisExpandDebounce")); this._throttledDispatchExpand(behavior === "none" ? null : { axisExpandWindow: result.axisExpandWindow, // Jumping uses animation, and sliding suppresses animation. animation: behavior === "jump" ? null : { duration: 0 // Disable animation. } }); } }; function checkTrigger(view, triggerOn) { var model = view._model; return model.get("axisExpandable") && model.get("axisExpandTriggerOn") === triggerOn; } var ParallelModel = ( /** @class */ (function(_super) { __extends(ParallelModel2, _super); function ParallelModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = ParallelModel2.type; return _this; } ParallelModel2.prototype.init = function() { _super.prototype.init.apply(this, arguments); this.mergeOption({}); }; ParallelModel2.prototype.mergeOption = function(newOption) { var thisOption = this.option; newOption && merge(thisOption, newOption, true); this._initDimensions(); }; ParallelModel2.prototype.contains = function(model, ecModel) { var parallelIndex = model.get("parallelIndex"); return parallelIndex != null && ecModel.getComponent("parallel", parallelIndex) === this; }; ParallelModel2.prototype.setAxisExpand = function(opt) { each$f(["axisExpandable", "axisExpandCenter", "axisExpandCount", "axisExpandWidth", "axisExpandWindow"], function(name) { if (opt.hasOwnProperty(name)) { this.option[name] = opt[name]; } }, this); }; ParallelModel2.prototype._initDimensions = function() { var dimensions = this.dimensions = []; var parallelAxisIndex = this.parallelAxisIndex = []; var axisModels = filter(this.ecModel.queryComponents({ mainType: "parallelAxis" }), function(axisModel) { return (axisModel.get("parallelIndex") || 0) === this.componentIndex; }, this); each$f(axisModels, function(axisModel) { dimensions.push("dim" + axisModel.get("dim")); parallelAxisIndex.push(axisModel.componentIndex); }); }; ParallelModel2.type = "parallel"; ParallelModel2.dependencies = ["parallelAxis"]; ParallelModel2.layoutMode = "box"; ParallelModel2.defaultOption = { // zlevel: 0, z: 0, left: 80, top: 60, right: 80, bottom: 60, // width: {totalWidth} - left - right, // height: {totalHeight} - top - bottom, layout: "horizontal", // FIXME // naming? axisExpandable: false, axisExpandCenter: null, axisExpandCount: 0, axisExpandWidth: 50, axisExpandRate: 17, axisExpandDebounce: 50, // [out, in, jumpTarget]. In percentage. If use [null, 0.05], null means full. // Do not doc to user until necessary. axisExpandSlideTriggerArea: [-0.15, 0.05, 0.4], axisExpandTriggerOn: "click", parallelAxisDefault: null }; return ParallelModel2; })(ComponentModel) ); var ParallelAxis = ( /** @class */ (function(_super) { __extends(ParallelAxis2, _super); function ParallelAxis2(dim, scale2, coordExtent, axisType, axisIndex) { var _this = _super.call(this, dim, scale2, coordExtent) || this; _this.type = axisType || "value"; _this.axisIndex = axisIndex; return _this; } ParallelAxis2.prototype.isHorizontal = function() { return this.coordinateSystem.getModel().get("layout") !== "horizontal"; }; return ParallelAxis2; })(Axis) ); function sliderMove(delta, handleEnds, extent, handleIndex, minSpan, maxSpan) { delta = delta || 0; var extentSpan = extent[1] - extent[0]; if (minSpan != null) { minSpan = restrict$1(minSpan, [0, extentSpan]); } if (maxSpan != null) { maxSpan = Math.max(maxSpan, minSpan != null ? minSpan : 0); } if (handleIndex === "all") { var handleSpan = Math.abs(handleEnds[1] - handleEnds[0]); handleSpan = restrict$1(handleSpan, [0, extentSpan]); minSpan = maxSpan = restrict$1(handleSpan, [minSpan, maxSpan]); handleIndex = 0; } handleEnds[0] = restrict$1(handleEnds[0], extent); handleEnds[1] = restrict$1(handleEnds[1], extent); var originalDistSign = getSpanSign(handleEnds, handleIndex); handleEnds[handleIndex] += delta; var extentMinSpan = minSpan || 0; var realExtent = extent.slice(); originalDistSign.sign < 0 ? realExtent[0] += extentMinSpan : realExtent[1] -= extentMinSpan; handleEnds[handleIndex] = restrict$1(handleEnds[handleIndex], realExtent); var currDistSign; currDistSign = getSpanSign(handleEnds, handleIndex); if (minSpan != null && (currDistSign.sign !== originalDistSign.sign || currDistSign.span < minSpan)) { handleEnds[1 - handleIndex] = handleEnds[handleIndex] + originalDistSign.sign * minSpan; } currDistSign = getSpanSign(handleEnds, handleIndex); if (maxSpan != null && currDistSign.span > maxSpan) { handleEnds[1 - handleIndex] = handleEnds[handleIndex] + currDistSign.sign * maxSpan; } return handleEnds; } function getSpanSign(handleEnds, handleIndex) { var dist2 = handleEnds[handleIndex] - handleEnds[1 - handleIndex]; return { span: Math.abs(dist2), sign: dist2 > 0 ? -1 : dist2 < 0 ? 1 : handleIndex ? -1 : 1 }; } function restrict$1(value, extend2) { return Math.min(extend2[1] != null ? extend2[1] : Infinity, Math.max(extend2[0] != null ? extend2[0] : -Infinity, value)); } var each$a = each$f; var mathMin$2 = Math.min; var mathMax$2 = Math.max; var mathFloor = Math.floor; var mathCeil = Math.ceil; var round = round$1; var PI$1 = Math.PI; var Parallel = ( /** @class */ (function() { function Parallel2(parallelModel, ecModel, api) { this.type = "parallel"; this._axesMap = createHashMap(); this._axesLayout = {}; this.dimensions = parallelModel.dimensions; this._model = parallelModel; this._init(parallelModel, ecModel, api); } Parallel2.prototype._init = function(parallelModel, ecModel, api) { var dimensions = parallelModel.dimensions; var parallelAxisIndex = parallelModel.parallelAxisIndex; each$a(dimensions, function(dim, idx) { var axisIndex = parallelAxisIndex[idx]; var axisModel = ecModel.getComponent("parallelAxis", axisIndex); var axis = this._axesMap.set(dim, new ParallelAxis(dim, createScaleByModel$1(axisModel), [0, 0], axisModel.get("type"), axisIndex)); var isCategory2 = axis.type === "category"; axis.onBand = isCategory2 && axisModel.get("boundaryGap"); axis.inverse = axisModel.get("inverse"); axisModel.axis = axis; axis.model = axisModel; axis.coordinateSystem = axisModel.coordinateSystem = this; }, this); }; Parallel2.prototype.update = function(ecModel, api) { this._updateAxesFromSeries(this._model, ecModel); }; Parallel2.prototype.containPoint = function(point) { var layoutInfo = this._makeLayoutInfo(); var axisBase = layoutInfo.axisBase; var layoutBase = layoutInfo.layoutBase; var pixelDimIndex = layoutInfo.pixelDimIndex; var pAxis = point[1 - pixelDimIndex]; var pLayout = point[pixelDimIndex]; return pAxis >= axisBase && pAxis <= axisBase + layoutInfo.axisLength && pLayout >= layoutBase && pLayout <= layoutBase + layoutInfo.layoutLength; }; Parallel2.prototype.getModel = function() { return this._model; }; Parallel2.prototype._updateAxesFromSeries = function(parallelModel, ecModel) { ecModel.eachSeries(function(seriesModel) { if (!parallelModel.contains(seriesModel, ecModel)) { return; } var data = seriesModel.getData(); each$a(this.dimensions, function(dim) { var axis = this._axesMap.get(dim); axis.scale.unionExtentFromData(data, data.mapDimension(dim)); niceScaleExtent(axis.scale, axis.model); }, this); }, this); }; Parallel2.prototype.resize = function(parallelModel, api) { this._rect = getLayoutRect(parallelModel.getBoxLayoutParams(), { width: api.getWidth(), height: api.getHeight() }); this._layoutAxes(); }; Parallel2.prototype.getRect = function() { return this._rect; }; Parallel2.prototype._makeLayoutInfo = function() { var parallelModel = this._model; var rect = this._rect; var xy = ["x", "y"]; var wh = ["width", "height"]; var layout2 = parallelModel.get("layout"); var pixelDimIndex = layout2 === "horizontal" ? 0 : 1; var layoutLength = rect[wh[pixelDimIndex]]; var layoutExtent = [0, layoutLength]; var axisCount = this.dimensions.length; var axisExpandWidth = restrict(parallelModel.get("axisExpandWidth"), layoutExtent); var axisExpandCount = restrict(parallelModel.get("axisExpandCount") || 0, [0, axisCount]); var axisExpandable = parallelModel.get("axisExpandable") && axisCount > 3 && axisCount > axisExpandCount && axisExpandCount > 1 && axisExpandWidth > 0 && layoutLength > 0; var axisExpandWindow = parallelModel.get("axisExpandWindow"); var winSize; if (!axisExpandWindow) { winSize = restrict(axisExpandWidth * (axisExpandCount - 1), layoutExtent); var axisExpandCenter = parallelModel.get("axisExpandCenter") || mathFloor(axisCount / 2); axisExpandWindow = [axisExpandWidth * axisExpandCenter - winSize / 2]; axisExpandWindow[1] = axisExpandWindow[0] + winSize; } else { winSize = restrict(axisExpandWindow[1] - axisExpandWindow[0], layoutExtent); axisExpandWindow[1] = axisExpandWindow[0] + winSize; } var axisCollapseWidth = (layoutLength - winSize) / (axisCount - axisExpandCount); axisCollapseWidth < 3 && (axisCollapseWidth = 0); var winInnerIndices = [mathFloor(round(axisExpandWindow[0] / axisExpandWidth, 1)) + 1, mathCeil(round(axisExpandWindow[1] / axisExpandWidth, 1)) - 1]; var axisExpandWindow0Pos = axisCollapseWidth / axisExpandWidth * axisExpandWindow[0]; return { layout: layout2, pixelDimIndex, layoutBase: rect[xy[pixelDimIndex]], layoutLength, axisBase: rect[xy[1 - pixelDimIndex]], axisLength: rect[wh[1 - pixelDimIndex]], axisExpandable, axisExpandWidth, axisCollapseWidth, axisExpandWindow, axisCount, winInnerIndices, axisExpandWindow0Pos }; }; Parallel2.prototype._layoutAxes = function() { var rect = this._rect; var axes = this._axesMap; var dimensions = this.dimensions; var layoutInfo = this._makeLayoutInfo(); var layout2 = layoutInfo.layout; axes.each(function(axis) { var axisExtent = [0, layoutInfo.axisLength]; var idx = axis.inverse ? 1 : 0; axis.setExtent(axisExtent[idx], axisExtent[1 - idx]); }); each$a(dimensions, function(dim, idx) { var posInfo = (layoutInfo.axisExpandable ? layoutAxisWithExpand : layoutAxisWithoutExpand)(idx, layoutInfo); var positionTable = { horizontal: { x: posInfo.position, y: layoutInfo.axisLength }, vertical: { x: 0, y: posInfo.position } }; var rotationTable = { horizontal: PI$1 / 2, vertical: 0 }; var position2 = [positionTable[layout2].x + rect.x, positionTable[layout2].y + rect.y]; var rotation = rotationTable[layout2]; var transform2 = create$1(); rotate(transform2, transform2, rotation); translate(transform2, transform2, position2); this._axesLayout[dim] = { position: position2, rotation, transform: transform2, axisNameAvailableWidth: posInfo.axisNameAvailableWidth, axisLabelShow: posInfo.axisLabelShow, nameTruncateMaxWidth: posInfo.nameTruncateMaxWidth, tickDirection: 1, labelDirection: 1 }; }, this); }; Parallel2.prototype.getAxis = function(dim) { return this._axesMap.get(dim); }; Parallel2.prototype.dataToPoint = function(value, dim) { return this.axisCoordToPoint(this._axesMap.get(dim).dataToCoord(value), dim); }; Parallel2.prototype.eachActiveState = function(data, callback, start, end) { start == null && (start = 0); end == null && (end = data.count()); var axesMap = this._axesMap; var dimensions = this.dimensions; var dataDimensions = []; var axisModels = []; each$f(dimensions, function(axisDim) { dataDimensions.push(data.mapDimension(axisDim)); axisModels.push(axesMap.get(axisDim).model); }); var hasActiveSet = this.hasAxisBrushed(); for (var dataIndex = start; dataIndex < end; dataIndex++) { var activeState = void 0; if (!hasActiveSet) { activeState = "normal"; } else { activeState = "active"; var values = data.getValues(dataDimensions, dataIndex); for (var j = 0, lenj = dimensions.length; j < lenj; j++) { var state = axisModels[j].getActiveState(values[j]); if (state === "inactive") { activeState = "inactive"; break; } } } callback(activeState, dataIndex); } }; Parallel2.prototype.hasAxisBrushed = function() { var dimensions = this.dimensions; var axesMap = this._axesMap; var hasActiveSet = false; for (var j = 0, lenj = dimensions.length; j < lenj; j++) { if (axesMap.get(dimensions[j]).model.getActiveState() !== "normal") { hasActiveSet = true; } } return hasActiveSet; }; Parallel2.prototype.axisCoordToPoint = function(coord, dim) { var axisLayout = this._axesLayout[dim]; return applyTransform([coord, 0], axisLayout.transform); }; Parallel2.prototype.getAxisLayout = function(dim) { return clone$1(this._axesLayout[dim]); }; Parallel2.prototype.getSlidedAxisExpandWindow = function(point) { var layoutInfo = this._makeLayoutInfo(); var pixelDimIndex = layoutInfo.pixelDimIndex; var axisExpandWindow = layoutInfo.axisExpandWindow.slice(); var winSize = axisExpandWindow[1] - axisExpandWindow[0]; var extent = [0, layoutInfo.axisExpandWidth * (layoutInfo.axisCount - 1)]; if (!this.containPoint(point)) { return { behavior: "none", axisExpandWindow }; } var pointCoord = point[pixelDimIndex] - layoutInfo.layoutBase - layoutInfo.axisExpandWindow0Pos; var delta; var behavior = "slide"; var axisCollapseWidth = layoutInfo.axisCollapseWidth; var triggerArea = this._model.get("axisExpandSlideTriggerArea"); var useJump = triggerArea[0] != null; if (axisCollapseWidth) { if (useJump && axisCollapseWidth && pointCoord < winSize * triggerArea[0]) { behavior = "jump"; delta = pointCoord - winSize * triggerArea[2]; } else if (useJump && axisCollapseWidth && pointCoord > winSize * (1 - triggerArea[0])) { behavior = "jump"; delta = pointCoord - winSize * (1 - triggerArea[2]); } else { (delta = pointCoord - winSize * triggerArea[1]) >= 0 && (delta = pointCoord - winSize * (1 - triggerArea[1])) <= 0 && (delta = 0); } delta *= layoutInfo.axisExpandWidth / axisCollapseWidth; delta ? sliderMove(delta, axisExpandWindow, extent, "all") : behavior = "none"; } else { var winSize2 = axisExpandWindow[1] - axisExpandWindow[0]; var pos = extent[1] * pointCoord / winSize2; axisExpandWindow = [mathMax$2(0, pos - winSize2 / 2)]; axisExpandWindow[1] = mathMin$2(extent[1], axisExpandWindow[0] + winSize2); axisExpandWindow[0] = axisExpandWindow[1] - winSize2; } return { axisExpandWindow, behavior }; }; return Parallel2; })() ); function restrict(len2, extent) { return mathMin$2(mathMax$2(len2, extent[0]), extent[1]); } function layoutAxisWithoutExpand(axisIndex, layoutInfo) { var step = layoutInfo.layoutLength / (layoutInfo.axisCount - 1); return { position: step * axisIndex, axisNameAvailableWidth: step, axisLabelShow: true }; } function layoutAxisWithExpand(axisIndex, layoutInfo) { var layoutLength = layoutInfo.layoutLength; var axisExpandWidth = layoutInfo.axisExpandWidth; var axisCount = layoutInfo.axisCount; var axisCollapseWidth = layoutInfo.axisCollapseWidth; var winInnerIndices = layoutInfo.winInnerIndices; var position2; var axisNameAvailableWidth = axisCollapseWidth; var axisLabelShow = false; var nameTruncateMaxWidth; if (axisIndex < winInnerIndices[0]) { position2 = axisIndex * axisCollapseWidth; nameTruncateMaxWidth = axisCollapseWidth; } else if (axisIndex <= winInnerIndices[1]) { position2 = layoutInfo.axisExpandWindow0Pos + axisIndex * axisExpandWidth - layoutInfo.axisExpandWindow[0]; axisNameAvailableWidth = axisExpandWidth; axisLabelShow = true; } else { position2 = layoutLength - (axisCount - 1 - axisIndex) * axisCollapseWidth; nameTruncateMaxWidth = axisCollapseWidth; } return { position: position2, axisNameAvailableWidth, axisLabelShow, nameTruncateMaxWidth }; } function createParallelCoordSys(ecModel, api) { var coordSysList = []; ecModel.eachComponent("parallel", function(parallelModel, idx) { var coordSys = new Parallel(parallelModel, ecModel, api); coordSys.name = "parallel_" + idx; coordSys.resize(parallelModel, api); parallelModel.coordinateSystem = coordSys; coordSys.model = parallelModel; coordSysList.push(coordSys); }); ecModel.eachSeries(function(seriesModel) { if (seriesModel.get("coordinateSystem") === "parallel") { var parallelModel = seriesModel.getReferringComponents("parallel", SINGLE_REFERRING).models[0]; seriesModel.coordinateSystem = parallelModel.coordinateSystem; } }); return coordSysList; } var parallelCoordSysCreator = { create: createParallelCoordSys }; var ParallelAxisModel = ( /** @class */ (function(_super) { __extends(ParallelAxisModel2, _super); function ParallelAxisModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = ParallelAxisModel2.type; _this.activeIntervals = []; return _this; } ParallelAxisModel2.prototype.getAreaSelectStyle = function() { return makeStyleMapper([ ["fill", "color"], ["lineWidth", "borderWidth"], ["stroke", "borderColor"], ["width", "width"], ["opacity", "opacity"] // Option decal is in `DecalObject` but style.decal is in `PatternObject`. // So do not transfer decal directly. ])(this.getModel("areaSelectStyle")); }; ParallelAxisModel2.prototype.setActiveIntervals = function(intervals) { var activeIntervals = this.activeIntervals = clone$1(intervals); if (activeIntervals) { for (var i = activeIntervals.length - 1; i >= 0; i--) { asc$2(activeIntervals[i]); } } }; ParallelAxisModel2.prototype.getActiveState = function(value) { var activeIntervals = this.activeIntervals; if (!activeIntervals.length) { return "normal"; } if (value == null || isNaN(+value)) { return "inactive"; } if (activeIntervals.length === 1) { var interval = activeIntervals[0]; if (interval[0] <= value && value <= interval[1]) { return "active"; } } else { for (var i = 0, len2 = activeIntervals.length; i < len2; i++) { if (activeIntervals[i][0] <= value && value <= activeIntervals[i][1]) { return "active"; } } } return "inactive"; }; return ParallelAxisModel2; })(ComponentModel) ); mixin(ParallelAxisModel, AxisModelCommonMixin); var BRUSH_PANEL_GLOBAL = true; var mathMin$1 = Math.min; var mathMax$1 = Math.max; var mathPow = Math.pow; var COVER_Z = 1e4; var UNSELECT_THRESHOLD = 6; var MIN_RESIZE_LINE_WIDTH = 6; var MUTEX_RESOURCE_KEY = "globalPan"; var DIRECTION_MAP = { w: [0, 0], e: [0, 1], n: [1, 0], s: [1, 1] }; var CURSOR_MAP = { w: "ew", e: "ew", n: "ns", s: "ns", ne: "nesw", sw: "nesw", nw: "nwse", se: "nwse" }; var DEFAULT_BRUSH_OPT = { brushStyle: { lineWidth: 2, stroke: "rgba(210,219,238,0.3)", fill: "#D2DBEE" }, transformable: true, brushMode: "single", removeOnClick: false }; var baseUID = 0; var BrushController = ( /** @class */ (function(_super) { __extends(BrushController2, _super); function BrushController2(zr) { var _this = _super.call(this) || this; _this._track = []; _this._covers = []; _this._handlers = {}; _this._zr = zr; _this.group = new Group$3(); _this._uid = "brushController_" + baseUID++; each$f(pointerHandlers, function(handler, eventName) { this._handlers[eventName] = bind$1(handler, this); }, _this); return _this; } BrushController2.prototype.enableBrush = function(brushOption) { this._brushType && this._doDisableBrush(); brushOption.brushType && this._doEnableBrush(brushOption); return this; }; BrushController2.prototype._doEnableBrush = function(brushOption) { var zr = this._zr; if (!this._enableGlobalPan) { take(zr, MUTEX_RESOURCE_KEY, this._uid); } each$f(this._handlers, function(handler, eventName) { zr.on(eventName, handler); }); this._brushType = brushOption.brushType; this._brushOption = merge(clone$1(DEFAULT_BRUSH_OPT), brushOption, true); }; BrushController2.prototype._doDisableBrush = function() { var zr = this._zr; release(zr, MUTEX_RESOURCE_KEY, this._uid); each$f(this._handlers, function(handler, eventName) { zr.off(eventName, handler); }); this._brushType = this._brushOption = null; }; BrushController2.prototype.setPanels = function(panelOpts) { if (panelOpts && panelOpts.length) { var panels_1 = this._panels = {}; each$f(panelOpts, function(panelOpts2) { panels_1[panelOpts2.panelId] = clone$1(panelOpts2); }); } else { this._panels = null; } return this; }; BrushController2.prototype.mount = function(opt) { opt = opt || {}; this._enableGlobalPan = opt.enableGlobalPan; var thisGroup = this.group; this._zr.add(thisGroup); thisGroup.attr({ x: opt.x || 0, y: opt.y || 0, rotation: opt.rotation || 0, scaleX: opt.scaleX || 1, scaleY: opt.scaleY || 1 }); this._transform = thisGroup.getLocalTransform(); return this; }; BrushController2.prototype.updateCovers = function(coverConfigList) { coverConfigList = map$1(coverConfigList, function(coverConfig) { return merge(clone$1(DEFAULT_BRUSH_OPT), coverConfig, true); }); var tmpIdPrefix = "\0-brush-index-"; var oldCovers = this._covers; var newCovers = this._covers = []; var controller = this; var creatingCover = this._creatingCover; new DataDiffer(oldCovers, coverConfigList, oldGetKey, getKey2).add(addOrUpdate).update(addOrUpdate).remove(remove).execute(); return this; function getKey2(brushOption, index) { return (brushOption.id != null ? brushOption.id : tmpIdPrefix + index) + "-" + brushOption.brushType; } function oldGetKey(cover, index) { return getKey2(cover.__brushOption, index); } function addOrUpdate(newIndex, oldIndex) { var newBrushInternal = coverConfigList[newIndex]; if (oldIndex != null && oldCovers[oldIndex] === creatingCover) { newCovers[newIndex] = oldCovers[oldIndex]; } else { var cover = newCovers[newIndex] = oldIndex != null ? (oldCovers[oldIndex].__brushOption = newBrushInternal, oldCovers[oldIndex]) : endCreating(controller, createCover(controller, newBrushInternal)); updateCoverAfterCreation(controller, cover); } } function remove(oldIndex) { if (oldCovers[oldIndex] !== creatingCover) { controller.group.remove(oldCovers[oldIndex]); } } }; BrushController2.prototype.unmount = function() { this.enableBrush(false); clearCovers(this); this._zr.remove(this.group); return this; }; BrushController2.prototype.dispose = function() { this.unmount(); this.off(); }; return BrushController2; })(Eventful) ); function createCover(controller, brushOption) { var cover = coverRenderers[brushOption.brushType].createCover(controller, brushOption); cover.__brushOption = brushOption; updateZ$1(cover, brushOption); controller.group.add(cover); return cover; } function endCreating(controller, creatingCover) { var coverRenderer = getCoverRenderer(creatingCover); if (coverRenderer.endCreating) { coverRenderer.endCreating(controller, creatingCover); updateZ$1(creatingCover, creatingCover.__brushOption); } return creatingCover; } function updateCoverShape(controller, cover) { var brushOption = cover.__brushOption; getCoverRenderer(cover).updateCoverShape(controller, cover, brushOption.range, brushOption); } function updateZ$1(cover, brushOption) { var z = brushOption.z; z == null && (z = COVER_Z); cover.traverse(function(el) { el.z = z; el.z2 = z; }); } function updateCoverAfterCreation(controller, cover) { getCoverRenderer(cover).updateCommon(controller, cover); updateCoverShape(controller, cover); } function getCoverRenderer(cover) { return coverRenderers[cover.__brushOption.brushType]; } function getPanelByPoint(controller, e, localCursorPoint) { var panels = controller._panels; if (!panels) { return BRUSH_PANEL_GLOBAL; } var panel; var transform2 = controller._transform; each$f(panels, function(pn) { pn.isTargetByCursor(e, localCursorPoint, transform2) && (panel = pn); }); return panel; } function getPanelByCover(controller, cover) { var panels = controller._panels; if (!panels) { return BRUSH_PANEL_GLOBAL; } var panelId = cover.__brushOption.panelId; return panelId != null ? panels[panelId] : BRUSH_PANEL_GLOBAL; } function clearCovers(controller) { var covers = controller._covers; var originalLength = covers.length; each$f(covers, function(cover) { controller.group.remove(cover); }, controller); covers.length = 0; return !!originalLength; } function trigger(controller, opt) { var areas = map$1(controller._covers, function(cover) { var brushOption = cover.__brushOption; var range = clone$1(brushOption.range); return { brushType: brushOption.brushType, panelId: brushOption.panelId, range }; }); controller.trigger("brush", { areas, isEnd: !!opt.isEnd, removeOnClick: !!opt.removeOnClick }); } function shouldShowCover(controller) { var track = controller._track; if (!track.length) { return false; } var p2 = track[track.length - 1]; var p1 = track[0]; var dx = p2[0] - p1[0]; var dy = p2[1] - p1[1]; var dist2 = mathPow(dx * dx + dy * dy, 0.5); return dist2 > UNSELECT_THRESHOLD; } function getTrackEnds(track) { var tail = track.length - 1; tail < 0 && (tail = 0); return [track[0], track[tail]]; } function createBaseRectCover(rectRangeConverter, controller, brushOption, edgeNameSequences) { var cover = new Group$3(); cover.add(new Rect$2({ name: "main", style: makeStyle(brushOption), silent: true, draggable: true, cursor: "move", drift: curry$1(driftRect, rectRangeConverter, controller, cover, ["n", "s", "w", "e"]), ondragend: curry$1(trigger, controller, { isEnd: true }) })); each$f(edgeNameSequences, function(nameSequence) { cover.add(new Rect$2({ name: nameSequence.join(""), style: { opacity: 0 }, draggable: true, silent: true, invisible: true, drift: curry$1(driftRect, rectRangeConverter, controller, cover, nameSequence), ondragend: curry$1(trigger, controller, { isEnd: true }) })); }); return cover; } function updateBaseRect(controller, cover, localRange, brushOption) { var lineWidth = brushOption.brushStyle.lineWidth || 0; var handleSize = mathMax$1(lineWidth, MIN_RESIZE_LINE_WIDTH); var x = localRange[0][0]; var y = localRange[1][0]; var xa = x - lineWidth / 2; var ya = y - lineWidth / 2; var x2 = localRange[0][1]; var y2 = localRange[1][1]; var x2a = x2 - handleSize + lineWidth / 2; var y2a = y2 - handleSize + lineWidth / 2; var width = x2 - x; var height = y2 - y; var widtha = width + lineWidth; var heighta = height + lineWidth; updateRectShape(controller, cover, "main", x, y, width, height); if (brushOption.transformable) { updateRectShape(controller, cover, "w", xa, ya, handleSize, heighta); updateRectShape(controller, cover, "e", x2a, ya, handleSize, heighta); updateRectShape(controller, cover, "n", xa, ya, widtha, handleSize); updateRectShape(controller, cover, "s", xa, y2a, widtha, handleSize); updateRectShape(controller, cover, "nw", xa, ya, handleSize, handleSize); updateRectShape(controller, cover, "ne", x2a, ya, handleSize, handleSize); updateRectShape(controller, cover, "sw", xa, y2a, handleSize, handleSize); updateRectShape(controller, cover, "se", x2a, y2a, handleSize, handleSize); } } function updateCommon$1(controller, cover) { var brushOption = cover.__brushOption; var transformable = brushOption.transformable; var mainEl = cover.childAt(0); mainEl.useStyle(makeStyle(brushOption)); mainEl.attr({ silent: !transformable, cursor: transformable ? "move" : "default" }); each$f([["w"], ["e"], ["n"], ["s"], ["s", "e"], ["s", "w"], ["n", "e"], ["n", "w"]], function(nameSequence) { var el = cover.childOfName(nameSequence.join("")); var globalDir = nameSequence.length === 1 ? getGlobalDirection1(controller, nameSequence[0]) : getGlobalDirection2(controller, nameSequence); el && el.attr({ silent: !transformable, invisible: !transformable, cursor: transformable ? CURSOR_MAP[globalDir] + "-resize" : null }); }); } function updateRectShape(controller, cover, name, x, y, w, h) { var el = cover.childOfName(name); el && el.setShape(pointsToRect(clipByPanel(controller, cover, [[x, y], [x + w, y + h]]))); } function makeStyle(brushOption) { return defaults({ strokeNoScale: true }, brushOption.brushStyle); } function formatRectRange(x, y, x2, y2) { var min2 = [mathMin$1(x, x2), mathMin$1(y, y2)]; var max2 = [mathMax$1(x, x2), mathMax$1(y, y2)]; return [ [min2[0], max2[0]], [min2[1], max2[1]] // y range ]; } function getTransform(controller) { return getTransform$1(controller.group); } function getGlobalDirection1(controller, localDirName) { var map2 = { w: "left", e: "right", n: "top", s: "bottom" }; var inverseMap = { left: "w", right: "e", top: "n", bottom: "s" }; var dir3 = transformDirection(map2[localDirName], getTransform(controller)); return inverseMap[dir3]; } function getGlobalDirection2(controller, localDirNameSeq) { var globalDir = [getGlobalDirection1(controller, localDirNameSeq[0]), getGlobalDirection1(controller, localDirNameSeq[1])]; (globalDir[0] === "e" || globalDir[0] === "w") && globalDir.reverse(); return globalDir.join(""); } function driftRect(rectRangeConverter, controller, cover, dirNameSequence, dx, dy) { var brushOption = cover.__brushOption; var rectRange = rectRangeConverter.toRectRange(brushOption.range); var localDelta = toLocalDelta(controller, dx, dy); each$f(dirNameSequence, function(dirName) { var ind = DIRECTION_MAP[dirName]; rectRange[ind[0]][ind[1]] += localDelta[ind[0]]; }); brushOption.range = rectRangeConverter.fromRectRange(formatRectRange(rectRange[0][0], rectRange[1][0], rectRange[0][1], rectRange[1][1])); updateCoverAfterCreation(controller, cover); trigger(controller, { isEnd: false }); } function driftPolygon(controller, cover, dx, dy) { var range = cover.__brushOption.range; var localDelta = toLocalDelta(controller, dx, dy); each$f(range, function(point) { point[0] += localDelta[0]; point[1] += localDelta[1]; }); updateCoverAfterCreation(controller, cover); trigger(controller, { isEnd: false }); } function toLocalDelta(controller, dx, dy) { var thisGroup = controller.group; var localD = thisGroup.transformCoordToLocal(dx, dy); var localZero = thisGroup.transformCoordToLocal(0, 0); return [localD[0] - localZero[0], localD[1] - localZero[1]]; } function clipByPanel(controller, cover, data) { var panel = getPanelByCover(controller, cover); return panel && panel !== BRUSH_PANEL_GLOBAL ? panel.clipPath(data, controller._transform) : clone$1(data); } function pointsToRect(points2) { var xmin = mathMin$1(points2[0][0], points2[1][0]); var ymin = mathMin$1(points2[0][1], points2[1][1]); var xmax = mathMax$1(points2[0][0], points2[1][0]); var ymax = mathMax$1(points2[0][1], points2[1][1]); return { x: xmin, y: ymin, width: xmax - xmin, height: ymax - ymin }; } function resetCursor(controller, e, localCursorPoint) { if ( // Check active !controller._brushType || isOutsideZrArea(controller, e.offsetX, e.offsetY) ) { return; } var zr = controller._zr; var covers = controller._covers; var currPanel = getPanelByPoint(controller, e, localCursorPoint); if (!controller._dragging) { for (var i = 0; i < covers.length; i++) { var brushOption = covers[i].__brushOption; if (currPanel && (currPanel === BRUSH_PANEL_GLOBAL || brushOption.panelId === currPanel.panelId) && coverRenderers[brushOption.brushType].contain(covers[i], localCursorPoint[0], localCursorPoint[1])) { return; } } } currPanel && zr.setCursorStyle("crosshair"); } function preventDefault(e) { var rawE = e.event; rawE.preventDefault && rawE.preventDefault(); } function mainShapeContain(cover, x, y) { return cover.childOfName("main").contain(x, y); } function updateCoverByMouse(controller, e, localCursorPoint, isEnd) { var creatingCover = controller._creatingCover; var panel = controller._creatingPanel; var thisBrushOption = controller._brushOption; var eventParams; controller._track.push(localCursorPoint.slice()); if (shouldShowCover(controller) || creatingCover) { if (panel && !creatingCover) { thisBrushOption.brushMode === "single" && clearCovers(controller); var brushOption = clone$1(thisBrushOption); brushOption.brushType = determineBrushType(brushOption.brushType, panel); brushOption.panelId = panel === BRUSH_PANEL_GLOBAL ? null : panel.panelId; creatingCover = controller._creatingCover = createCover(controller, brushOption); controller._covers.push(creatingCover); } if (creatingCover) { var coverRenderer = coverRenderers[determineBrushType(controller._brushType, panel)]; var coverBrushOption = creatingCover.__brushOption; coverBrushOption.range = coverRenderer.getCreatingRange(clipByPanel(controller, creatingCover, controller._track)); if (isEnd) { endCreating(controller, creatingCover); coverRenderer.updateCommon(controller, creatingCover); } updateCoverShape(controller, creatingCover); eventParams = { isEnd }; } } else if (isEnd && thisBrushOption.brushMode === "single" && thisBrushOption.removeOnClick) { if (getPanelByPoint(controller, e, localCursorPoint) && clearCovers(controller)) { eventParams = { isEnd, removeOnClick: true }; } } return eventParams; } function determineBrushType(brushType, panel) { if (brushType === "auto") { return panel.defaultBrushType; } return brushType; } var pointerHandlers = { mousedown: function(e) { if (this._dragging) { handleDragEnd(this, e); } else if (!e.target || !e.target.draggable) { preventDefault(e); var localCursorPoint = this.group.transformCoordToLocal(e.offsetX, e.offsetY); this._creatingCover = null; var panel = this._creatingPanel = getPanelByPoint(this, e, localCursorPoint); if (panel) { this._dragging = true; this._track = [localCursorPoint.slice()]; } } }, mousemove: function(e) { var x = e.offsetX; var y = e.offsetY; var localCursorPoint = this.group.transformCoordToLocal(x, y); resetCursor(this, e, localCursorPoint); if (this._dragging) { preventDefault(e); var eventParams = updateCoverByMouse(this, e, localCursorPoint, false); eventParams && trigger(this, eventParams); } }, mouseup: function(e) { handleDragEnd(this, e); } }; function handleDragEnd(controller, e) { if (controller._dragging) { preventDefault(e); var x = e.offsetX; var y = e.offsetY; var localCursorPoint = controller.group.transformCoordToLocal(x, y); var eventParams = updateCoverByMouse(controller, e, localCursorPoint, true); controller._dragging = false; controller._track = []; controller._creatingCover = null; eventParams && trigger(controller, eventParams); } } function isOutsideZrArea(controller, x, y) { var zr = controller._zr; return x < 0 || x > zr.getWidth() || y < 0 || y > zr.getHeight(); } var coverRenderers = { lineX: getLineRenderer(0), lineY: getLineRenderer(1), rect: { createCover: function(controller, brushOption) { function returnInput(range) { return range; } return createBaseRectCover({ toRectRange: returnInput, fromRectRange: returnInput }, controller, brushOption, [["w"], ["e"], ["n"], ["s"], ["s", "e"], ["s", "w"], ["n", "e"], ["n", "w"]]); }, getCreatingRange: function(localTrack) { var ends = getTrackEnds(localTrack); return formatRectRange(ends[1][0], ends[1][1], ends[0][0], ends[0][1]); }, updateCoverShape: function(controller, cover, localRange, brushOption) { updateBaseRect(controller, cover, localRange, brushOption); }, updateCommon: updateCommon$1, contain: mainShapeContain }, polygon: { createCover: function(controller, brushOption) { var cover = new Group$3(); cover.add(new Polyline$1({ name: "main", style: makeStyle(brushOption), silent: true })); return cover; }, getCreatingRange: function(localTrack) { return localTrack; }, endCreating: function(controller, cover) { cover.remove(cover.childAt(0)); cover.add(new Polygon({ name: "main", draggable: true, drift: curry$1(driftPolygon, controller, cover), ondragend: curry$1(trigger, controller, { isEnd: true }) })); }, updateCoverShape: function(controller, cover, localRange, brushOption) { cover.childAt(0).setShape({ points: clipByPanel(controller, cover, localRange) }); }, updateCommon: updateCommon$1, contain: mainShapeContain } }; function getLineRenderer(xyIndex) { return { createCover: function(controller, brushOption) { return createBaseRectCover({ toRectRange: function(range) { var rectRange = [range, [0, 100]]; xyIndex && rectRange.reverse(); return rectRange; }, fromRectRange: function(rectRange) { return rectRange[xyIndex]; } }, controller, brushOption, [[["w"], ["e"]], [["n"], ["s"]]][xyIndex]); }, getCreatingRange: function(localTrack) { var ends = getTrackEnds(localTrack); var min2 = mathMin$1(ends[0][xyIndex], ends[1][xyIndex]); var max2 = mathMax$1(ends[0][xyIndex], ends[1][xyIndex]); return [min2, max2]; }, updateCoverShape: function(controller, cover, localRange, brushOption) { var otherExtent; var panel = getPanelByCover(controller, cover); if (panel !== BRUSH_PANEL_GLOBAL && panel.getLinearBrushOtherExtent) { otherExtent = panel.getLinearBrushOtherExtent(xyIndex); } else { var zr = controller._zr; otherExtent = [0, [zr.getWidth(), zr.getHeight()][1 - xyIndex]]; } var rectRange = [localRange, otherExtent]; xyIndex && rectRange.reverse(); updateBaseRect(controller, cover, rectRange, brushOption); }, updateCommon: updateCommon$1, contain: mainShapeContain }; } function makeRectPanelClipPath(rect) { rect = normalizeRect(rect); return function(localPoints) { return clipPointsByRect(localPoints, rect); }; } function makeLinearBrushOtherExtent(rect, specifiedXYIndex) { rect = normalizeRect(rect); return function(xyIndex) { var idx = specifiedXYIndex != null ? specifiedXYIndex : xyIndex; var brushWidth = idx ? rect.width : rect.height; var base2 = idx ? rect.x : rect.y; return [base2, base2 + (brushWidth || 0)]; }; } function makeRectIsTargetByCursor(rect, api, targetModel) { var boundingRect = normalizeRect(rect); return function(e, localCursorPoint) { return boundingRect.contain(localCursorPoint[0], localCursorPoint[1]) && !onIrrelevantElement(e, api, targetModel); }; } function normalizeRect(rect) { return BoundingRect.create(rect); } var elementList$1 = ["axisLine", "axisTickLabel", "axisName"]; var ParallelAxisView = ( /** @class */ (function(_super) { __extends(ParallelAxisView2, _super); function ParallelAxisView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = ParallelAxisView2.type; return _this; } ParallelAxisView2.prototype.init = function(ecModel, api) { _super.prototype.init.apply(this, arguments); (this._brushController = new BrushController(api.getZr())).on("brush", bind$1(this._onBrush, this)); }; ParallelAxisView2.prototype.render = function(axisModel, ecModel, api, payload) { if (fromAxisAreaSelect(axisModel, ecModel, payload)) { return; } this.axisModel = axisModel; this.api = api; this.group.removeAll(); var oldAxisGroup = this._axisGroup; this._axisGroup = new Group$3(); this.group.add(this._axisGroup); if (!axisModel.get("show")) { return; } var coordSysModel = getCoordSysModel(axisModel, ecModel); var coordSys = coordSysModel.coordinateSystem; var areaSelectStyle = axisModel.getAreaSelectStyle(); var areaWidth = areaSelectStyle.width; var dim = axisModel.axis.dim; var axisLayout = coordSys.getAxisLayout(dim); var builderOpt = extend({ strokeContainThreshold: areaWidth }, axisLayout); var axisBuilder = new AxisBuilder(axisModel, builderOpt); each$f(elementList$1, axisBuilder.add, axisBuilder); this._axisGroup.add(axisBuilder.getGroup()); this._refreshBrushController(builderOpt, areaSelectStyle, axisModel, coordSysModel, areaWidth, api); groupTransition(oldAxisGroup, this._axisGroup, axisModel); }; ParallelAxisView2.prototype._refreshBrushController = function(builderOpt, areaSelectStyle, axisModel, coordSysModel, areaWidth, api) { var extent = axisModel.axis.getExtent(); var extentLen = extent[1] - extent[0]; var extra = Math.min(30, Math.abs(extentLen) * 0.1); var rect = BoundingRect.create({ x: extent[0], y: -areaWidth / 2, width: extentLen, height: areaWidth }); rect.x -= extra; rect.width += 2 * extra; this._brushController.mount({ enableGlobalPan: true, rotation: builderOpt.rotation, x: builderOpt.position[0], y: builderOpt.position[1] }).setPanels([{ panelId: "pl", clipPath: makeRectPanelClipPath(rect), isTargetByCursor: makeRectIsTargetByCursor(rect, api, coordSysModel), getLinearBrushOtherExtent: makeLinearBrushOtherExtent(rect, 0) }]).enableBrush({ brushType: "lineX", brushStyle: areaSelectStyle, removeOnClick: true }).updateCovers(getCoverInfoList(axisModel)); }; ParallelAxisView2.prototype._onBrush = function(eventParam) { var coverInfoList = eventParam.areas; var axisModel = this.axisModel; var axis = axisModel.axis; var intervals = map$1(coverInfoList, function(coverInfo) { return [axis.coordToData(coverInfo.range[0], true), axis.coordToData(coverInfo.range[1], true)]; }); if (!axisModel.option.realtime === eventParam.isEnd || eventParam.removeOnClick) { this.api.dispatchAction({ type: "axisAreaSelect", parallelAxisId: axisModel.id, intervals }); } }; ParallelAxisView2.prototype.dispose = function() { this._brushController.dispose(); }; ParallelAxisView2.type = "parallelAxis"; return ParallelAxisView2; })(ComponentView) ); function fromAxisAreaSelect(axisModel, ecModel, payload) { return payload && payload.type === "axisAreaSelect" && ecModel.findComponents({ mainType: "parallelAxis", query: payload })[0] === axisModel; } function getCoverInfoList(axisModel) { var axis = axisModel.axis; return map$1(axisModel.activeIntervals, function(interval) { return { brushType: "lineX", panelId: "pl", range: [axis.dataToCoord(interval[0], true), axis.dataToCoord(interval[1], true)] }; }); } function getCoordSysModel(axisModel, ecModel) { return ecModel.getComponent("parallel", axisModel.get("parallelIndex")); } var actionInfo = { type: "axisAreaSelect", event: "axisAreaSelected" // update: 'updateVisual' }; function installParallelActions(registers) { registers.registerAction(actionInfo, function(payload, ecModel) { ecModel.eachComponent({ mainType: "parallelAxis", query: payload }, function(parallelAxisModel) { parallelAxisModel.axis.model.setActiveIntervals(payload.intervals); }); }); registers.registerAction("parallelAxisExpand", function(payload, ecModel) { ecModel.eachComponent({ mainType: "parallel", query: payload }, function(parallelModel) { parallelModel.setAxisExpand(payload); }); }); } var defaultAxisOption = { type: "value", areaSelectStyle: { width: 20, borderWidth: 1, borderColor: "rgba(160,197,232)", color: "rgba(160,197,232)", opacity: 0.3 }, realtime: true, z: 10 }; function install$E(registers) { registers.registerComponentView(ParallelView); registers.registerComponentModel(ParallelModel); registers.registerCoordinateSystem("parallel", parallelCoordSysCreator); registers.registerPreprocessor(parallelPreprocessor); registers.registerComponentModel(ParallelAxisModel); registers.registerComponentView(ParallelAxisView); axisModelCreator(registers, "parallel", ParallelAxisModel, defaultAxisOption); installParallelActions(registers); } function install$D(registers) { use(install$E); registers.registerChartView(ParallelView$1); registers.registerSeriesModel(ParallelSeriesModel); registers.registerVisual(registers.PRIORITY.VISUAL.BRUSH, parallelVisual); } var SankeyPathShape = ( /** @class */ /* @__PURE__ */ (function() { function SankeyPathShape2() { this.x1 = 0; this.y1 = 0; this.x2 = 0; this.y2 = 0; this.cpx1 = 0; this.cpy1 = 0; this.cpx2 = 0; this.cpy2 = 0; this.extent = 0; } return SankeyPathShape2; })() ); var SankeyPath = ( /** @class */ (function(_super) { __extends(SankeyPath2, _super); function SankeyPath2(opts) { return _super.call(this, opts) || this; } SankeyPath2.prototype.getDefaultShape = function() { return new SankeyPathShape(); }; SankeyPath2.prototype.buildPath = function(ctx, shape) { var extent = shape.extent; ctx.moveTo(shape.x1, shape.y1); ctx.bezierCurveTo(shape.cpx1, shape.cpy1, shape.cpx2, shape.cpy2, shape.x2, shape.y2); if (shape.orient === "vertical") { ctx.lineTo(shape.x2 + extent, shape.y2); ctx.bezierCurveTo(shape.cpx2 + extent, shape.cpy2, shape.cpx1 + extent, shape.cpy1, shape.x1 + extent, shape.y1); } else { ctx.lineTo(shape.x2, shape.y2 + extent); ctx.bezierCurveTo(shape.cpx2, shape.cpy2 + extent, shape.cpx1, shape.cpy1 + extent, shape.x1, shape.y1 + extent); } ctx.closePath(); }; SankeyPath2.prototype.highlight = function() { enterEmphasis(this); }; SankeyPath2.prototype.downplay = function() { leaveEmphasis(this); }; return SankeyPath2; })(Path) ); var SankeyView = ( /** @class */ (function(_super) { __extends(SankeyView2, _super); function SankeyView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = SankeyView2.type; _this._focusAdjacencyDisabled = false; return _this; } SankeyView2.prototype.render = function(seriesModel, ecModel, api) { var sankeyView = this; var graph = seriesModel.getGraph(); var group = this.group; var layoutInfo = seriesModel.layoutInfo; var width = layoutInfo.width; var height = layoutInfo.height; var nodeData = seriesModel.getData(); var edgeData = seriesModel.getData("edge"); var orient = seriesModel.get("orient"); this._model = seriesModel; group.removeAll(); group.x = layoutInfo.x; group.y = layoutInfo.y; graph.eachEdge(function(edge) { var curve = new SankeyPath(); var ecData = getECData(curve); ecData.dataIndex = edge.dataIndex; ecData.seriesIndex = seriesModel.seriesIndex; ecData.dataType = "edge"; var edgeModel = edge.getModel(); var lineStyleModel = edgeModel.getModel("lineStyle"); var curvature = lineStyleModel.get("curveness"); var n1Layout = edge.node1.getLayout(); var node1Model = edge.node1.getModel(); var dragX1 = node1Model.get("localX"); var dragY1 = node1Model.get("localY"); var n2Layout = edge.node2.getLayout(); var node2Model = edge.node2.getModel(); var dragX2 = node2Model.get("localX"); var dragY2 = node2Model.get("localY"); var edgeLayout = edge.getLayout(); var x1; var y1; var x2; var y2; var cpx1; var cpy1; var cpx2; var cpy2; curve.shape.extent = Math.max(1, edgeLayout.dy); curve.shape.orient = orient; if (orient === "vertical") { x1 = (dragX1 != null ? dragX1 * width : n1Layout.x) + edgeLayout.sy; y1 = (dragY1 != null ? dragY1 * height : n1Layout.y) + n1Layout.dy; x2 = (dragX2 != null ? dragX2 * width : n2Layout.x) + edgeLayout.ty; y2 = dragY2 != null ? dragY2 * height : n2Layout.y; cpx1 = x1; cpy1 = y1 * (1 - curvature) + y2 * curvature; cpx2 = x2; cpy2 = y1 * curvature + y2 * (1 - curvature); } else { x1 = (dragX1 != null ? dragX1 * width : n1Layout.x) + n1Layout.dx; y1 = (dragY1 != null ? dragY1 * height : n1Layout.y) + edgeLayout.sy; x2 = dragX2 != null ? dragX2 * width : n2Layout.x; y2 = (dragY2 != null ? dragY2 * height : n2Layout.y) + edgeLayout.ty; cpx1 = x1 * (1 - curvature) + x2 * curvature; cpy1 = y1; cpx2 = x1 * curvature + x2 * (1 - curvature); cpy2 = y2; } curve.setShape({ x1, y1, x2, y2, cpx1, cpy1, cpx2, cpy2 }); curve.useStyle(lineStyleModel.getItemStyle()); applyCurveStyle(curve.style, orient, edge); var defaultEdgeLabelText = "" + edgeModel.get("value"); var edgeLabelStateModels = getLabelStatesModels(edgeModel, "edgeLabel"); setLabelStyle(curve, edgeLabelStateModels, { labelFetcher: { getFormattedLabel: function(dataIndex, stateName, dataType, labelDimIndex, formatter, extendParams) { return seriesModel.getFormattedLabel( dataIndex, stateName, "edge", labelDimIndex, // ensure edgeLabel formatter is provided // to prevent the inheritance from `label.formatter` of the series retrieve3(formatter, edgeLabelStateModels.normal && edgeLabelStateModels.normal.get("formatter"), defaultEdgeLabelText), extendParams ); } }, labelDataIndex: edge.dataIndex, defaultText: defaultEdgeLabelText }); curve.setTextConfig({ position: "inside" }); var emphasisModel = edgeModel.getModel("emphasis"); setStatesStylesFromModel(curve, edgeModel, "lineStyle", function(model) { var style = model.getItemStyle(); applyCurveStyle(style, orient, edge); return style; }); group.add(curve); edgeData.setItemGraphicEl(edge.dataIndex, curve); var focus = emphasisModel.get("focus"); toggleHoverEmphasis(curve, focus === "adjacency" ? edge.getAdjacentDataIndices() : focus === "trajectory" ? edge.getTrajectoryDataIndices() : focus, emphasisModel.get("blurScope"), emphasisModel.get("disabled")); }); graph.eachNode(function(node) { var layout2 = node.getLayout(); var itemModel = node.getModel(); var dragX = itemModel.get("localX"); var dragY = itemModel.get("localY"); var emphasisModel = itemModel.getModel("emphasis"); var borderRadius = itemModel.get(["itemStyle", "borderRadius"]) || 0; var rect = new Rect$2({ shape: { x: dragX != null ? dragX * width : layout2.x, y: dragY != null ? dragY * height : layout2.y, width: layout2.dx, height: layout2.dy, r: borderRadius }, style: itemModel.getModel("itemStyle").getItemStyle(), z2: 10 }); setLabelStyle(rect, getLabelStatesModels(itemModel), { labelFetcher: { getFormattedLabel: function(dataIndex, stateName) { return seriesModel.getFormattedLabel(dataIndex, stateName, "node"); } }, labelDataIndex: node.dataIndex, defaultText: node.id }); rect.disableLabelAnimation = true; rect.setStyle("fill", node.getVisual("color")); rect.setStyle("decal", node.getVisual("style").decal); setStatesStylesFromModel(rect, itemModel); group.add(rect); nodeData.setItemGraphicEl(node.dataIndex, rect); getECData(rect).dataType = "node"; var focus = emphasisModel.get("focus"); toggleHoverEmphasis(rect, focus === "adjacency" ? node.getAdjacentDataIndices() : focus === "trajectory" ? node.getTrajectoryDataIndices() : focus, emphasisModel.get("blurScope"), emphasisModel.get("disabled")); }); nodeData.eachItemGraphicEl(function(el, dataIndex) { var itemModel = nodeData.getItemModel(dataIndex); if (itemModel.get("draggable")) { el.drift = function(dx, dy) { sankeyView._focusAdjacencyDisabled = true; this.shape.x += dx; this.shape.y += dy; this.dirty(); api.dispatchAction({ type: "dragNode", seriesId: seriesModel.id, dataIndex: nodeData.getRawIndex(dataIndex), localX: this.shape.x / width, localY: this.shape.y / height }); }; el.ondragend = function() { sankeyView._focusAdjacencyDisabled = false; }; el.draggable = true; el.cursor = "move"; } }); if (!this._data && seriesModel.isAnimationEnabled()) { group.setClipPath(createGridClipShape$1(group.getBoundingRect(), seriesModel, function() { group.removeClipPath(); })); } this._data = seriesModel.getData(); }; SankeyView2.prototype.dispose = function() { }; SankeyView2.type = "sankey"; return SankeyView2; })(ChartView) ); function applyCurveStyle(curveProps, orient, edge) { switch (curveProps.fill) { case "source": curveProps.fill = edge.node1.getVisual("color"); curveProps.decal = edge.node1.getVisual("style").decal; break; case "target": curveProps.fill = edge.node2.getVisual("color"); curveProps.decal = edge.node2.getVisual("style").decal; break; case "gradient": var sourceColor = edge.node1.getVisual("color"); var targetColor = edge.node2.getVisual("color"); if (isString(sourceColor) && isString(targetColor)) { curveProps.fill = new LinearGradient(0, 0, +(orient === "horizontal"), +(orient === "vertical"), [{ color: sourceColor, offset: 0 }, { color: targetColor, offset: 1 }]); } } } function createGridClipShape$1(rect, seriesModel, cb) { var rectEl = new Rect$2({ shape: { x: rect.x - 10, y: rect.y - 10, width: 0, height: rect.height + 20 } }); initProps(rectEl, { shape: { width: rect.width + 20 } }, seriesModel, cb); return rectEl; } var SankeySeriesModel = ( /** @class */ (function(_super) { __extends(SankeySeriesModel2, _super); function SankeySeriesModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = SankeySeriesModel2.type; return _this; } SankeySeriesModel2.prototype.getInitialData = function(option, ecModel) { var links = option.edges || option.links || []; var nodes = option.data || option.nodes || []; var levels = option.levels || []; this.levelModels = []; var levelModels = this.levelModels; for (var i = 0; i < levels.length; i++) { if (levels[i].depth != null && levels[i].depth >= 0) { levelModels[levels[i].depth] = new Model(levels[i], this, ecModel); } } var graph = createGraphFromNodeEdge(nodes, links, this, true, beforeLink); return graph.data; function beforeLink(nodeData, edgeData) { nodeData.wrapMethod("getItemModel", function(model, idx) { var seriesModel = model.parentModel; var layout2 = seriesModel.getData().getItemLayout(idx); if (layout2) { var nodeDepth = layout2.depth; var levelModel = seriesModel.levelModels[nodeDepth]; if (levelModel) { model.parentModel = levelModel; } } return model; }); edgeData.wrapMethod("getItemModel", function(model, idx) { var seriesModel = model.parentModel; var edge = seriesModel.getGraph().getEdgeByIndex(idx); var layout2 = edge.node1.getLayout(); if (layout2) { var depth = layout2.depth; var levelModel = seriesModel.levelModels[depth]; if (levelModel) { model.parentModel = levelModel; } } return model; }); } }; SankeySeriesModel2.prototype.setNodePosition = function(dataIndex, localPosition) { var nodes = this.option.data || this.option.nodes; var dataItem = nodes[dataIndex]; dataItem.localX = localPosition[0]; dataItem.localY = localPosition[1]; }; SankeySeriesModel2.prototype.getGraph = function() { return this.getData().graph; }; SankeySeriesModel2.prototype.getEdgeData = function() { return this.getGraph().edgeData; }; SankeySeriesModel2.prototype.formatTooltip = function(dataIndex, multipleSeries, dataType) { function noValue(val) { return isNaN(val) || val == null; } if (dataType === "edge") { var params = this.getDataParams(dataIndex, dataType); var rawDataOpt = params.data; var edgeValue = params.value; var edgeName = rawDataOpt.source + " -- " + rawDataOpt.target; return createTooltipMarkup("nameValue", { name: edgeName, value: edgeValue, noValue: noValue(edgeValue) }); } else { var node = this.getGraph().getNodeByIndex(dataIndex); var value = node.getLayout().value; var name_1 = this.getDataParams(dataIndex, dataType).data.name; return createTooltipMarkup("nameValue", { name: name_1 != null ? name_1 + "" : null, value, noValue: noValue(value) }); } }; SankeySeriesModel2.prototype.optionUpdated = function() { }; SankeySeriesModel2.prototype.getDataParams = function(dataIndex, dataType) { var params = _super.prototype.getDataParams.call(this, dataIndex, dataType); if (params.value == null && dataType === "node") { var node = this.getGraph().getNodeByIndex(dataIndex); var nodeValue = node.getLayout().value; params.value = nodeValue; } return params; }; SankeySeriesModel2.type = "series.sankey"; SankeySeriesModel2.defaultOption = { // zlevel: 0, z: 2, coordinateSystem: "view", left: "5%", top: "5%", right: "20%", bottom: "5%", orient: "horizontal", nodeWidth: 20, nodeGap: 8, draggable: true, layoutIterations: 32, label: { show: true, position: "right", fontSize: 12 }, edgeLabel: { show: false, fontSize: 12 }, levels: [], nodeAlign: "justify", lineStyle: { color: "#314656", opacity: 0.2, curveness: 0.5 }, emphasis: { label: { show: true }, lineStyle: { opacity: 0.5 } }, select: { itemStyle: { borderColor: "#212121" } }, animationEasing: "linear", animationDuration: 1e3 }; return SankeySeriesModel2; })(SeriesModel) ); function sankeyLayout(ecModel, api) { ecModel.eachSeriesByType("sankey", function(seriesModel) { var nodeWidth = seriesModel.get("nodeWidth"); var nodeGap = seriesModel.get("nodeGap"); var layoutInfo = getViewRect$1(seriesModel, api); seriesModel.layoutInfo = layoutInfo; var width = layoutInfo.width; var height = layoutInfo.height; var graph = seriesModel.getGraph(); var nodes = graph.nodes; var edges = graph.edges; computeNodeValues(nodes); var filteredNodes = filter(nodes, function(node) { return node.getLayout().value === 0; }); var iterations = filteredNodes.length !== 0 ? 0 : seriesModel.get("layoutIterations"); var orient = seriesModel.get("orient"); var nodeAlign = seriesModel.get("nodeAlign"); layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations, orient, nodeAlign); }); } function getViewRect$1(seriesModel, api) { return getLayoutRect(seriesModel.getBoxLayoutParams(), { width: api.getWidth(), height: api.getHeight() }); } function layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations, orient, nodeAlign) { computeNodeBreadths(nodes, edges, nodeWidth, width, height, orient, nodeAlign); computeNodeDepths(nodes, edges, height, width, nodeGap, iterations, orient); computeEdgeDepths(nodes, orient); } function computeNodeValues(nodes) { each$f(nodes, function(node) { var value1 = sum(node.outEdges, getEdgeValue); var value2 = sum(node.inEdges, getEdgeValue); var nodeRawValue = node.getValue() || 0; var value = Math.max(value1, value2, nodeRawValue); node.setLayout({ value }, true); }); } function computeNodeBreadths(nodes, edges, nodeWidth, width, height, orient, nodeAlign) { var remainEdges = []; var indegreeArr = []; var zeroIndegrees = []; var nextTargetNode = []; var x = 0; for (var i = 0; i < edges.length; i++) { remainEdges[i] = 1; } for (var i = 0; i < nodes.length; i++) { indegreeArr[i] = nodes[i].inEdges.length; if (indegreeArr[i] === 0) { zeroIndegrees.push(nodes[i]); } } var maxNodeDepth = -1; while (zeroIndegrees.length) { for (var idx = 0; idx < zeroIndegrees.length; idx++) { var node = zeroIndegrees[idx]; var item = node.hostGraph.data.getRawDataItem(node.dataIndex); var isItemDepth = item.depth != null && item.depth >= 0; if (isItemDepth && item.depth > maxNodeDepth) { maxNodeDepth = item.depth; } node.setLayout({ depth: isItemDepth ? item.depth : x }, true); orient === "vertical" ? node.setLayout({ dy: nodeWidth }, true) : node.setLayout({ dx: nodeWidth }, true); for (var edgeIdx = 0; edgeIdx < node.outEdges.length; edgeIdx++) { var edge = node.outEdges[edgeIdx]; var indexEdge = edges.indexOf(edge); remainEdges[indexEdge] = 0; var targetNode = edge.node2; var nodeIndex = nodes.indexOf(targetNode); if (--indegreeArr[nodeIndex] === 0 && nextTargetNode.indexOf(targetNode) < 0) { nextTargetNode.push(targetNode); } } } ++x; zeroIndegrees = nextTargetNode; nextTargetNode = []; } for (var i = 0; i < remainEdges.length; i++) { if (remainEdges[i] === 1) { throw new Error("Sankey is a DAG, the original data has cycle!"); } } var maxDepth = maxNodeDepth > x - 1 ? maxNodeDepth : x - 1; if (nodeAlign && nodeAlign !== "left") { adjustNodeWithNodeAlign(nodes, nodeAlign, orient, maxDepth); } var kx = orient === "vertical" ? (height - nodeWidth) / maxDepth : (width - nodeWidth) / maxDepth; scaleNodeBreadths(nodes, kx, orient); } function isNodeDepth(node) { var item = node.hostGraph.data.getRawDataItem(node.dataIndex); return item.depth != null && item.depth >= 0; } function adjustNodeWithNodeAlign(nodes, nodeAlign, orient, maxDepth) { if (nodeAlign === "right") { var nextSourceNode = []; var remainNodes = nodes; var nodeHeight = 0; while (remainNodes.length) { for (var i = 0; i < remainNodes.length; i++) { var node = remainNodes[i]; node.setLayout({ skNodeHeight: nodeHeight }, true); for (var j = 0; j < node.inEdges.length; j++) { var edge = node.inEdges[j]; if (nextSourceNode.indexOf(edge.node1) < 0) { nextSourceNode.push(edge.node1); } } } remainNodes = nextSourceNode; nextSourceNode = []; ++nodeHeight; } each$f(nodes, function(node2) { if (!isNodeDepth(node2)) { node2.setLayout({ depth: Math.max(0, maxDepth - node2.getLayout().skNodeHeight) }, true); } }); } else if (nodeAlign === "justify") { moveSinksRight(nodes, maxDepth); } } function moveSinksRight(nodes, maxDepth) { each$f(nodes, function(node) { if (!isNodeDepth(node) && !node.outEdges.length) { node.setLayout({ depth: maxDepth }, true); } }); } function scaleNodeBreadths(nodes, kx, orient) { each$f(nodes, function(node) { var nodeDepth = node.getLayout().depth * kx; orient === "vertical" ? node.setLayout({ y: nodeDepth }, true) : node.setLayout({ x: nodeDepth }, true); }); } function computeNodeDepths(nodes, edges, height, width, nodeGap, iterations, orient) { var nodesByBreadth = prepareNodesByBreadth(nodes, orient); initializeNodeDepth(nodesByBreadth, edges, height, width, nodeGap, orient); resolveCollisions(nodesByBreadth, nodeGap, height, width, orient); for (var alpha = 1; iterations > 0; iterations--) { alpha *= 0.99; relaxRightToLeft(nodesByBreadth, alpha, orient); resolveCollisions(nodesByBreadth, nodeGap, height, width, orient); relaxLeftToRight(nodesByBreadth, alpha, orient); resolveCollisions(nodesByBreadth, nodeGap, height, width, orient); } } function prepareNodesByBreadth(nodes, orient) { var nodesByBreadth = []; var keyAttr = orient === "vertical" ? "y" : "x"; var groupResult = groupData(nodes, function(node) { return node.getLayout()[keyAttr]; }); groupResult.keys.sort(function(a, b) { return a - b; }); each$f(groupResult.keys, function(key) { nodesByBreadth.push(groupResult.buckets.get(key)); }); return nodesByBreadth; } function initializeNodeDepth(nodesByBreadth, edges, height, width, nodeGap, orient) { var minKy = Infinity; each$f(nodesByBreadth, function(nodes) { var n = nodes.length; var sum2 = 0; each$f(nodes, function(node) { sum2 += node.getLayout().value; }); var ky = orient === "vertical" ? (width - (n - 1) * nodeGap) / sum2 : (height - (n - 1) * nodeGap) / sum2; if (ky < minKy) { minKy = ky; } }); each$f(nodesByBreadth, function(nodes) { each$f(nodes, function(node, i) { var nodeDy = node.getLayout().value * minKy; if (orient === "vertical") { node.setLayout({ x: i }, true); node.setLayout({ dx: nodeDy }, true); } else { node.setLayout({ y: i }, true); node.setLayout({ dy: nodeDy }, true); } }); }); each$f(edges, function(edge) { var edgeDy = +edge.getValue() * minKy; edge.setLayout({ dy: edgeDy }, true); }); } function resolveCollisions(nodesByBreadth, nodeGap, height, width, orient) { var keyAttr = orient === "vertical" ? "x" : "y"; each$f(nodesByBreadth, function(nodes) { nodes.sort(function(a, b) { return a.getLayout()[keyAttr] - b.getLayout()[keyAttr]; }); var nodeX; var node; var dy; var y0 = 0; var n = nodes.length; var nodeDyAttr = orient === "vertical" ? "dx" : "dy"; for (var i = 0; i < n; i++) { node = nodes[i]; dy = y0 - node.getLayout()[keyAttr]; if (dy > 0) { nodeX = node.getLayout()[keyAttr] + dy; orient === "vertical" ? node.setLayout({ x: nodeX }, true) : node.setLayout({ y: nodeX }, true); } y0 = node.getLayout()[keyAttr] + node.getLayout()[nodeDyAttr] + nodeGap; } var viewWidth = orient === "vertical" ? width : height; dy = y0 - nodeGap - viewWidth; if (dy > 0) { nodeX = node.getLayout()[keyAttr] - dy; orient === "vertical" ? node.setLayout({ x: nodeX }, true) : node.setLayout({ y: nodeX }, true); y0 = nodeX; for (var i = n - 2; i >= 0; --i) { node = nodes[i]; dy = node.getLayout()[keyAttr] + node.getLayout()[nodeDyAttr] + nodeGap - y0; if (dy > 0) { nodeX = node.getLayout()[keyAttr] - dy; orient === "vertical" ? node.setLayout({ x: nodeX }, true) : node.setLayout({ y: nodeX }, true); } y0 = node.getLayout()[keyAttr]; } } }); } function relaxRightToLeft(nodesByBreadth, alpha, orient) { each$f(nodesByBreadth.slice().reverse(), function(nodes) { each$f(nodes, function(node) { if (node.outEdges.length) { var y = sum(node.outEdges, weightedTarget, orient) / sum(node.outEdges, getEdgeValue); if (isNaN(y)) { var len2 = node.outEdges.length; y = len2 ? sum(node.outEdges, centerTarget, orient) / len2 : 0; } if (orient === "vertical") { var nodeX = node.getLayout().x + (y - center(node, orient)) * alpha; node.setLayout({ x: nodeX }, true); } else { var nodeY = node.getLayout().y + (y - center(node, orient)) * alpha; node.setLayout({ y: nodeY }, true); } } }); }); } function weightedTarget(edge, orient) { return center(edge.node2, orient) * edge.getValue(); } function centerTarget(edge, orient) { return center(edge.node2, orient); } function weightedSource(edge, orient) { return center(edge.node1, orient) * edge.getValue(); } function centerSource(edge, orient) { return center(edge.node1, orient); } function center(node, orient) { return orient === "vertical" ? node.getLayout().x + node.getLayout().dx / 2 : node.getLayout().y + node.getLayout().dy / 2; } function getEdgeValue(edge) { return edge.getValue(); } function sum(array, cb, orient) { var sum2 = 0; var len2 = array.length; var i = -1; while (++i < len2) { var value = +cb(array[i], orient); if (!isNaN(value)) { sum2 += value; } } return sum2; } function relaxLeftToRight(nodesByBreadth, alpha, orient) { each$f(nodesByBreadth, function(nodes) { each$f(nodes, function(node) { if (node.inEdges.length) { var y = sum(node.inEdges, weightedSource, orient) / sum(node.inEdges, getEdgeValue); if (isNaN(y)) { var len2 = node.inEdges.length; y = len2 ? sum(node.inEdges, centerSource, orient) / len2 : 0; } if (orient === "vertical") { var nodeX = node.getLayout().x + (y - center(node, orient)) * alpha; node.setLayout({ x: nodeX }, true); } else { var nodeY = node.getLayout().y + (y - center(node, orient)) * alpha; node.setLayout({ y: nodeY }, true); } } }); }); } function computeEdgeDepths(nodes, orient) { var keyAttr = orient === "vertical" ? "x" : "y"; each$f(nodes, function(node) { node.outEdges.sort(function(a, b) { return a.node2.getLayout()[keyAttr] - b.node2.getLayout()[keyAttr]; }); node.inEdges.sort(function(a, b) { return a.node1.getLayout()[keyAttr] - b.node1.getLayout()[keyAttr]; }); }); each$f(nodes, function(node) { var sy = 0; var ty = 0; each$f(node.outEdges, function(edge) { edge.setLayout({ sy }, true); sy += edge.getLayout().dy; }); each$f(node.inEdges, function(edge) { edge.setLayout({ ty }, true); ty += edge.getLayout().dy; }); }); } function sankeyVisual(ecModel) { ecModel.eachSeriesByType("sankey", function(seriesModel) { var graph = seriesModel.getGraph(); var nodes = graph.nodes; var edges = graph.edges; if (nodes.length) { var minValue_1 = Infinity; var maxValue_1 = -Infinity; each$f(nodes, function(node) { var nodeValue = node.getLayout().value; if (nodeValue < minValue_1) { minValue_1 = nodeValue; } if (nodeValue > maxValue_1) { maxValue_1 = nodeValue; } }); each$f(nodes, function(node) { var mapping = new VisualMapping({ type: "color", mappingMethod: "linear", dataExtent: [minValue_1, maxValue_1], visual: seriesModel.get("color") }); var mapValueToColor = mapping.mapValueToVisual(node.getLayout().value); var customColor = node.getModel().get(["itemStyle", "color"]); if (customColor != null) { node.setVisual("color", customColor); node.setVisual("style", { fill: customColor }); } else { node.setVisual("color", mapValueToColor); node.setVisual("style", { fill: mapValueToColor }); } }); } if (edges.length) { each$f(edges, function(edge) { var edgeStyle = edge.getModel().get("lineStyle"); edge.setVisual("style", edgeStyle); }); } }); } function install$C(registers) { registers.registerChartView(SankeyView); registers.registerSeriesModel(SankeySeriesModel); registers.registerLayout(sankeyLayout); registers.registerVisual(sankeyVisual); registers.registerAction({ type: "dragNode", event: "dragnode", // here can only use 'update' now, other value is not support in echarts. update: "update" }, function(payload, ecModel) { ecModel.eachComponent({ mainType: "series", subType: "sankey", query: payload }, function(seriesModel) { seriesModel.setNodePosition(payload.dataIndex, [payload.localX, payload.localY]); }); }); } var WhiskerBoxCommonMixin = ( /** @class */ (function() { function WhiskerBoxCommonMixin2() { } WhiskerBoxCommonMixin2.prototype._hasEncodeRule = function(key) { var encodeRules = this.getEncode(); return encodeRules && encodeRules.get(key) != null; }; WhiskerBoxCommonMixin2.prototype.getInitialData = function(option, ecModel) { var ordinalMeta; var xAxisModel = ecModel.getComponent("xAxis", this.get("xAxisIndex")); var yAxisModel = ecModel.getComponent("yAxis", this.get("yAxisIndex")); var xAxisType = xAxisModel.get("type"); var yAxisType = yAxisModel.get("type"); var addOrdinal; if (xAxisType === "category") { option.layout = "horizontal"; ordinalMeta = xAxisModel.getOrdinalMeta(); addOrdinal = !this._hasEncodeRule("x"); } else if (yAxisType === "category") { option.layout = "vertical"; ordinalMeta = yAxisModel.getOrdinalMeta(); addOrdinal = !this._hasEncodeRule("y"); } else { option.layout = option.layout || "horizontal"; } var coordDims = ["x", "y"]; var baseAxisDimIndex = option.layout === "horizontal" ? 0 : 1; var baseAxisDim = this._baseAxisDim = coordDims[baseAxisDimIndex]; var otherAxisDim = coordDims[1 - baseAxisDimIndex]; var axisModels = [xAxisModel, yAxisModel]; var baseAxisType = axisModels[baseAxisDimIndex].get("type"); var otherAxisType = axisModels[1 - baseAxisDimIndex].get("type"); var data = option.data; if (data && addOrdinal) { var newOptionData_1 = []; each$f(data, function(item, index) { var newItem; if (isArray$1(item)) { newItem = item.slice(); item.unshift(index); } else if (isArray$1(item.value)) { newItem = extend({}, item); newItem.value = newItem.value.slice(); item.value.unshift(index); } else { newItem = item; } newOptionData_1.push(newItem); }); option.data = newOptionData_1; } var defaultValueDimensions = this.defaultValueDimensions; var coordDimensions = [{ name: baseAxisDim, type: getDimensionTypeByAxis(baseAxisType), ordinalMeta, otherDims: { tooltip: false, itemName: 0 }, dimsDef: ["base"] }, { name: otherAxisDim, type: getDimensionTypeByAxis(otherAxisType), dimsDef: defaultValueDimensions.slice() }]; return createSeriesDataSimply(this, { coordDimensions, dimensionsCount: defaultValueDimensions.length + 1, encodeDefaulter: curry$1(makeSeriesEncodeForAxisCoordSys, coordDimensions, this) }); }; WhiskerBoxCommonMixin2.prototype.getBaseAxis = function() { var dim = this._baseAxisDim; return this.ecModel.getComponent(dim + "Axis", this.get(dim + "AxisIndex")).axis; }; return WhiskerBoxCommonMixin2; })() ); var BoxplotSeriesModel = ( /** @class */ (function(_super) { __extends(BoxplotSeriesModel2, _super); function BoxplotSeriesModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = BoxplotSeriesModel2.type; _this.defaultValueDimensions = [{ name: "min", defaultTooltip: true }, { name: "Q1", defaultTooltip: true }, { name: "median", defaultTooltip: true }, { name: "Q3", defaultTooltip: true }, { name: "max", defaultTooltip: true }]; _this.visualDrawType = "stroke"; return _this; } BoxplotSeriesModel2.type = "series.boxplot"; BoxplotSeriesModel2.dependencies = ["xAxis", "yAxis", "grid"]; BoxplotSeriesModel2.defaultOption = { // zlevel: 0, z: 2, coordinateSystem: "cartesian2d", legendHoverLink: true, layout: null, boxWidth: [7, 50], itemStyle: { color: "#fff", borderWidth: 1 }, emphasis: { scale: true, itemStyle: { borderWidth: 2, shadowBlur: 5, shadowOffsetX: 1, shadowOffsetY: 1, shadowColor: "rgba(0,0,0,0.2)" } }, animationDuration: 800 }; return BoxplotSeriesModel2; })(SeriesModel) ); mixin(BoxplotSeriesModel, WhiskerBoxCommonMixin, true); var BoxplotView = ( /** @class */ (function(_super) { __extends(BoxplotView2, _super); function BoxplotView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = BoxplotView2.type; return _this; } BoxplotView2.prototype.render = function(seriesModel, ecModel, api) { var data = seriesModel.getData(); var group = this.group; var oldData = this._data; if (!this._data) { group.removeAll(); } var constDim = seriesModel.get("layout") === "horizontal" ? 1 : 0; data.diff(oldData).add(function(newIdx) { if (data.hasValue(newIdx)) { var itemLayout = data.getItemLayout(newIdx); var symbolEl = createNormalBox$1(itemLayout, data, newIdx, constDim, true); data.setItemGraphicEl(newIdx, symbolEl); group.add(symbolEl); } }).update(function(newIdx, oldIdx) { var symbolEl = oldData.getItemGraphicEl(oldIdx); if (!data.hasValue(newIdx)) { group.remove(symbolEl); return; } var itemLayout = data.getItemLayout(newIdx); if (!symbolEl) { symbolEl = createNormalBox$1(itemLayout, data, newIdx, constDim); } else { saveOldStyle(symbolEl); updateNormalBoxData(itemLayout, symbolEl, data, newIdx); } group.add(symbolEl); data.setItemGraphicEl(newIdx, symbolEl); }).remove(function(oldIdx) { var el = oldData.getItemGraphicEl(oldIdx); el && group.remove(el); }).execute(); this._data = data; }; BoxplotView2.prototype.remove = function(ecModel) { var group = this.group; var data = this._data; this._data = null; data && data.eachItemGraphicEl(function(el) { el && group.remove(el); }); }; BoxplotView2.type = "boxplot"; return BoxplotView2; })(ChartView) ); var BoxPathShape = ( /** @class */ /* @__PURE__ */ (function() { function BoxPathShape2() { } return BoxPathShape2; })() ); var BoxPath = ( /** @class */ (function(_super) { __extends(BoxPath2, _super); function BoxPath2(opts) { var _this = _super.call(this, opts) || this; _this.type = "boxplotBoxPath"; return _this; } BoxPath2.prototype.getDefaultShape = function() { return new BoxPathShape(); }; BoxPath2.prototype.buildPath = function(ctx, shape) { var ends = shape.points; var i = 0; ctx.moveTo(ends[i][0], ends[i][1]); i++; for (; i < 4; i++) { ctx.lineTo(ends[i][0], ends[i][1]); } ctx.closePath(); for (; i < ends.length; i++) { ctx.moveTo(ends[i][0], ends[i][1]); i++; ctx.lineTo(ends[i][0], ends[i][1]); } }; return BoxPath2; })(Path) ); function createNormalBox$1(itemLayout, data, dataIndex, constDim, isInit) { var ends = itemLayout.ends; var el = new BoxPath({ shape: { points: isInit ? transInit$1(ends, constDim, itemLayout) : ends } }); updateNormalBoxData(itemLayout, el, data, dataIndex, isInit); return el; } function updateNormalBoxData(itemLayout, el, data, dataIndex, isInit) { var seriesModel = data.hostModel; var updateMethod = graphic[isInit ? "initProps" : "updateProps"]; updateMethod(el, { shape: { points: itemLayout.ends } }, seriesModel, dataIndex); el.useStyle(data.getItemVisual(dataIndex, "style")); el.style.strokeNoScale = true; el.z2 = 100; var itemModel = data.getItemModel(dataIndex); var emphasisModel = itemModel.getModel("emphasis"); setStatesStylesFromModel(el, itemModel); toggleHoverEmphasis(el, emphasisModel.get("focus"), emphasisModel.get("blurScope"), emphasisModel.get("disabled")); } function transInit$1(points2, dim, itemLayout) { return map$1(points2, function(point) { point = point.slice(); point[dim] = itemLayout.initBaseline; return point; }); } var each$9 = each$f; function boxplotLayout(ecModel) { var groupResult = groupSeriesByAxis(ecModel); each$9(groupResult, function(groupItem) { var seriesModels = groupItem.seriesModels; if (!seriesModels.length) { return; } calculateBase(groupItem); each$9(seriesModels, function(seriesModel, idx) { layoutSingleSeries(seriesModel, groupItem.boxOffsetList[idx], groupItem.boxWidthList[idx]); }); }); } function groupSeriesByAxis(ecModel) { var result = []; var axisList = []; ecModel.eachSeriesByType("boxplot", function(seriesModel) { var baseAxis = seriesModel.getBaseAxis(); var idx = indexOf(axisList, baseAxis); if (idx < 0) { idx = axisList.length; axisList[idx] = baseAxis; result[idx] = { axis: baseAxis, seriesModels: [] }; } result[idx].seriesModels.push(seriesModel); }); return result; } function calculateBase(groupItem) { var baseAxis = groupItem.axis; var seriesModels = groupItem.seriesModels; var seriesCount = seriesModels.length; var boxWidthList = groupItem.boxWidthList = []; var boxOffsetList = groupItem.boxOffsetList = []; var boundList = []; var bandWidth; if (baseAxis.type === "category") { bandWidth = baseAxis.getBandWidth(); } else { var maxDataCount_1 = 0; each$9(seriesModels, function(seriesModel) { maxDataCount_1 = Math.max(maxDataCount_1, seriesModel.getData().count()); }); var extent = baseAxis.getExtent(); bandWidth = Math.abs(extent[1] - extent[0]) / maxDataCount_1; } each$9(seriesModels, function(seriesModel) { var boxWidthBound = seriesModel.get("boxWidth"); if (!isArray$1(boxWidthBound)) { boxWidthBound = [boxWidthBound, boxWidthBound]; } boundList.push([parsePercent(boxWidthBound[0], bandWidth) || 0, parsePercent(boxWidthBound[1], bandWidth) || 0]); }); var availableWidth = bandWidth * 0.8 - 2; var boxGap = availableWidth / seriesCount * 0.3; var boxWidth = (availableWidth - boxGap * (seriesCount - 1)) / seriesCount; var base2 = boxWidth / 2 - availableWidth / 2; each$9(seriesModels, function(seriesModel, idx) { boxOffsetList.push(base2); base2 += boxGap + boxWidth; boxWidthList.push(Math.min(Math.max(boxWidth, boundList[idx][0]), boundList[idx][1])); }); } function layoutSingleSeries(seriesModel, offset, boxWidth) { var coordSys = seriesModel.coordinateSystem; var data = seriesModel.getData(); var halfWidth = boxWidth / 2; var cDimIdx = seriesModel.get("layout") === "horizontal" ? 0 : 1; var vDimIdx = 1 - cDimIdx; var coordDims = ["x", "y"]; var cDim = data.mapDimension(coordDims[cDimIdx]); var vDims = data.mapDimensionsAll(coordDims[vDimIdx]); if (cDim == null || vDims.length < 5) { return; } for (var dataIndex = 0; dataIndex < data.count(); dataIndex++) { var axisDimVal = data.get(cDim, dataIndex); var median = getPoint(axisDimVal, vDims[2], dataIndex); var end1 = getPoint(axisDimVal, vDims[0], dataIndex); var end2 = getPoint(axisDimVal, vDims[1], dataIndex); var end4 = getPoint(axisDimVal, vDims[3], dataIndex); var end5 = getPoint(axisDimVal, vDims[4], dataIndex); var ends = []; addBodyEnd(ends, end2, false); addBodyEnd(ends, end4, true); ends.push(end1, end2, end5, end4); layEndLine(ends, end1); layEndLine(ends, end5); layEndLine(ends, median); data.setItemLayout(dataIndex, { initBaseline: median[vDimIdx], ends }); } function getPoint(axisDimVal2, dim, dataIndex2) { var val = data.get(dim, dataIndex2); var p = []; p[cDimIdx] = axisDimVal2; p[vDimIdx] = val; var point; if (isNaN(axisDimVal2) || isNaN(val)) { point = [NaN, NaN]; } else { point = coordSys.dataToPoint(p); point[cDimIdx] += offset; } return point; } function addBodyEnd(ends2, point, start) { var point1 = point.slice(); var point2 = point.slice(); point1[cDimIdx] += halfWidth; point2[cDimIdx] -= halfWidth; start ? ends2.push(point1, point2) : ends2.push(point2, point1); } function layEndLine(ends2, endCenter) { var from = endCenter.slice(); var to = endCenter.slice(); from[cDimIdx] -= halfWidth; to[cDimIdx] += halfWidth; ends2.push(from, to); } } function prepareBoxplotData(rawData, opt) { opt = opt || {}; var boxData = []; var outliers = []; var boundIQR = opt.boundIQR; var useExtreme = boundIQR === "none" || boundIQR === 0; for (var i = 0; i < rawData.length; i++) { var ascList = asc$2(rawData[i].slice()); var Q1 = quantile(ascList, 0.25); var Q2 = quantile(ascList, 0.5); var Q3 = quantile(ascList, 0.75); var min2 = ascList[0]; var max2 = ascList[ascList.length - 1]; var bound = (boundIQR == null ? 1.5 : boundIQR) * (Q3 - Q1); var low = useExtreme ? min2 : Math.max(min2, Q1 - bound); var high = useExtreme ? max2 : Math.min(max2, Q3 + bound); var itemNameFormatter = opt.itemNameFormatter; var itemName = isFunction(itemNameFormatter) ? itemNameFormatter({ value: i }) : isString(itemNameFormatter) ? itemNameFormatter.replace("{value}", i + "") : i + ""; boxData.push([itemName, low, Q1, Q2, Q3, high]); for (var j = 0; j < ascList.length; j++) { var dataItem = ascList[j]; if (dataItem < low || dataItem > high) { var outlier = [itemName, dataItem]; outliers.push(outlier); } } } return { boxData, outliers }; } var boxplotTransform = { type: "echarts:boxplot", transform: function transform(params) { var upstream = params.upstream; if (upstream.sourceFormat !== SOURCE_FORMAT_ARRAY_ROWS) { var errMsg = ""; throwError(errMsg); } var result = prepareBoxplotData(upstream.getRawData(), params.config); return [{ dimensions: ["ItemName", "Low", "Q1", "Q2", "Q3", "High"], data: result.boxData }, { data: result.outliers }]; } }; function install$B(registers) { registers.registerSeriesModel(BoxplotSeriesModel); registers.registerChartView(BoxplotView); registers.registerLayout(boxplotLayout); registers.registerTransform(boxplotTransform); } var positiveBorderColorQuery = ["itemStyle", "borderColor"]; var negativeBorderColorQuery = ["itemStyle", "borderColor0"]; var dojiBorderColorQuery = ["itemStyle", "borderColorDoji"]; var positiveColorQuery = ["itemStyle", "color"]; var negativeColorQuery = ["itemStyle", "color0"]; function getColor(sign, model) { return model.get(sign > 0 ? positiveColorQuery : negativeColorQuery); } function getBorderColor(sign, model) { return model.get(sign === 0 ? dojiBorderColorQuery : sign > 0 ? positiveBorderColorQuery : negativeBorderColorQuery); } var candlestickVisual = { seriesType: "candlestick", plan: createRenderPlanner(), // For legend. performRawSeries: true, reset: function(seriesModel, ecModel) { if (ecModel.isSeriesFiltered(seriesModel)) { return; } var isLargeRender = seriesModel.pipelineContext.large; return !isLargeRender && { progress: function(params, data) { var dataIndex; while ((dataIndex = params.next()) != null) { var itemModel = data.getItemModel(dataIndex); var sign = data.getItemLayout(dataIndex).sign; var style = itemModel.getItemStyle(); style.fill = getColor(sign, itemModel); style.stroke = getBorderColor(sign, itemModel) || style.fill; var existsStyle = data.ensureUniqueItemVisual(dataIndex, "style"); extend(existsStyle, style); } } }; } }; var SKIP_PROPS = ["color", "borderColor"]; var CandlestickView = ( /** @class */ (function(_super) { __extends(CandlestickView2, _super); function CandlestickView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = CandlestickView2.type; return _this; } CandlestickView2.prototype.render = function(seriesModel, ecModel, api) { this.group.removeClipPath(); this._progressiveEls = null; this._updateDrawMode(seriesModel); this._isLargeDraw ? this._renderLarge(seriesModel) : this._renderNormal(seriesModel); }; CandlestickView2.prototype.incrementalPrepareRender = function(seriesModel, ecModel, api) { this._clear(); this._updateDrawMode(seriesModel); }; CandlestickView2.prototype.incrementalRender = function(params, seriesModel, ecModel, api) { this._progressiveEls = []; this._isLargeDraw ? this._incrementalRenderLarge(params, seriesModel) : this._incrementalRenderNormal(params, seriesModel); }; CandlestickView2.prototype.eachRendered = function(cb) { traverseElements(this._progressiveEls || this.group, cb); }; CandlestickView2.prototype._updateDrawMode = function(seriesModel) { var isLargeDraw = seriesModel.pipelineContext.large; if (this._isLargeDraw == null || isLargeDraw !== this._isLargeDraw) { this._isLargeDraw = isLargeDraw; this._clear(); } }; CandlestickView2.prototype._renderNormal = function(seriesModel) { var data = seriesModel.getData(); var oldData = this._data; var group = this.group; var isSimpleBox = data.getLayout("isSimpleBox"); var needsClip = seriesModel.get("clip", true); var coord = seriesModel.coordinateSystem; var clipArea = coord.getArea && coord.getArea(); if (!this._data) { group.removeAll(); } data.diff(oldData).add(function(newIdx) { if (data.hasValue(newIdx)) { var itemLayout = data.getItemLayout(newIdx); if (needsClip && isNormalBoxClipped(clipArea, itemLayout)) { return; } var el = createNormalBox(itemLayout, newIdx, true); initProps(el, { shape: { points: itemLayout.ends } }, seriesModel, newIdx); setBoxCommon(el, data, newIdx, isSimpleBox); group.add(el); data.setItemGraphicEl(newIdx, el); } }).update(function(newIdx, oldIdx) { var el = oldData.getItemGraphicEl(oldIdx); if (!data.hasValue(newIdx)) { group.remove(el); return; } var itemLayout = data.getItemLayout(newIdx); if (needsClip && isNormalBoxClipped(clipArea, itemLayout)) { group.remove(el); return; } if (!el) { el = createNormalBox(itemLayout); } else { updateProps$1(el, { shape: { points: itemLayout.ends } }, seriesModel, newIdx); saveOldStyle(el); } setBoxCommon(el, data, newIdx, isSimpleBox); group.add(el); data.setItemGraphicEl(newIdx, el); }).remove(function(oldIdx) { var el = oldData.getItemGraphicEl(oldIdx); el && group.remove(el); }).execute(); this._data = data; }; CandlestickView2.prototype._renderLarge = function(seriesModel) { this._clear(); createLarge(seriesModel, this.group); var clipPath = seriesModel.get("clip", true) ? createClipPath(seriesModel.coordinateSystem, false, seriesModel) : null; if (clipPath) { this.group.setClipPath(clipPath); } else { this.group.removeClipPath(); } }; CandlestickView2.prototype._incrementalRenderNormal = function(params, seriesModel) { var data = seriesModel.getData(); var isSimpleBox = data.getLayout("isSimpleBox"); var dataIndex; while ((dataIndex = params.next()) != null) { var itemLayout = data.getItemLayout(dataIndex); var el = createNormalBox(itemLayout); setBoxCommon(el, data, dataIndex, isSimpleBox); el.incremental = true; this.group.add(el); this._progressiveEls.push(el); } }; CandlestickView2.prototype._incrementalRenderLarge = function(params, seriesModel) { createLarge(seriesModel, this.group, this._progressiveEls, true); }; CandlestickView2.prototype.remove = function(ecModel) { this._clear(); }; CandlestickView2.prototype._clear = function() { this.group.removeAll(); this._data = null; }; CandlestickView2.type = "candlestick"; return CandlestickView2; })(ChartView) ); var NormalBoxPathShape = ( /** @class */ /* @__PURE__ */ (function() { function NormalBoxPathShape2() { } return NormalBoxPathShape2; })() ); var NormalBoxPath = ( /** @class */ (function(_super) { __extends(NormalBoxPath2, _super); function NormalBoxPath2(opts) { var _this = _super.call(this, opts) || this; _this.type = "normalCandlestickBox"; return _this; } NormalBoxPath2.prototype.getDefaultShape = function() { return new NormalBoxPathShape(); }; NormalBoxPath2.prototype.buildPath = function(ctx, shape) { var ends = shape.points; if (this.__simpleBox) { ctx.moveTo(ends[4][0], ends[4][1]); ctx.lineTo(ends[6][0], ends[6][1]); } else { ctx.moveTo(ends[0][0], ends[0][1]); ctx.lineTo(ends[1][0], ends[1][1]); ctx.lineTo(ends[2][0], ends[2][1]); ctx.lineTo(ends[3][0], ends[3][1]); ctx.closePath(); ctx.moveTo(ends[4][0], ends[4][1]); ctx.lineTo(ends[5][0], ends[5][1]); ctx.moveTo(ends[6][0], ends[6][1]); ctx.lineTo(ends[7][0], ends[7][1]); } }; return NormalBoxPath2; })(Path) ); function createNormalBox(itemLayout, dataIndex, isInit) { var ends = itemLayout.ends; return new NormalBoxPath({ shape: { points: isInit ? transInit(ends, itemLayout) : ends }, z2: 100 }); } function isNormalBoxClipped(clipArea, itemLayout) { var clipped = true; for (var i = 0; i < itemLayout.ends.length; i++) { if (clipArea.contain(itemLayout.ends[i][0], itemLayout.ends[i][1])) { clipped = false; break; } } return clipped; } function setBoxCommon(el, data, dataIndex, isSimpleBox) { var itemModel = data.getItemModel(dataIndex); el.useStyle(data.getItemVisual(dataIndex, "style")); el.style.strokeNoScale = true; el.__simpleBox = isSimpleBox; setStatesStylesFromModel(el, itemModel); var sign = data.getItemLayout(dataIndex).sign; each$f(el.states, function(state, stateName) { var stateModel = itemModel.getModel(stateName); var color = getColor(sign, stateModel); var borderColor = getBorderColor(sign, stateModel) || color; var stateStyle = state.style || (state.style = {}); color && (stateStyle.fill = color); borderColor && (stateStyle.stroke = borderColor); }); var emphasisModel = itemModel.getModel("emphasis"); toggleHoverEmphasis(el, emphasisModel.get("focus"), emphasisModel.get("blurScope"), emphasisModel.get("disabled")); } function transInit(points2, itemLayout) { return map$1(points2, function(point) { point = point.slice(); point[1] = itemLayout.initBaseline; return point; }); } var LargeBoxPathShape = ( /** @class */ /* @__PURE__ */ (function() { function LargeBoxPathShape2() { } return LargeBoxPathShape2; })() ); var LargeBoxPath = ( /** @class */ (function(_super) { __extends(LargeBoxPath2, _super); function LargeBoxPath2(opts) { var _this = _super.call(this, opts) || this; _this.type = "largeCandlestickBox"; return _this; } LargeBoxPath2.prototype.getDefaultShape = function() { return new LargeBoxPathShape(); }; LargeBoxPath2.prototype.buildPath = function(ctx, shape) { var points2 = shape.points; for (var i = 0; i < points2.length; ) { if (this.__sign === points2[i++]) { var x = points2[i++]; ctx.moveTo(x, points2[i++]); ctx.lineTo(x, points2[i++]); } else { i += 3; } } }; return LargeBoxPath2; })(Path) ); function createLarge(seriesModel, group, progressiveEls, incremental) { var data = seriesModel.getData(); var largePoints = data.getLayout("largePoints"); var elP = new LargeBoxPath({ shape: { points: largePoints }, __sign: 1, ignoreCoarsePointer: true }); group.add(elP); var elN = new LargeBoxPath({ shape: { points: largePoints }, __sign: -1, ignoreCoarsePointer: true }); group.add(elN); var elDoji = new LargeBoxPath({ shape: { points: largePoints }, __sign: 0, ignoreCoarsePointer: true }); group.add(elDoji); setLargeStyle(1, elP, seriesModel); setLargeStyle(-1, elN, seriesModel); setLargeStyle(0, elDoji, seriesModel); if (incremental) { elP.incremental = true; elN.incremental = true; } if (progressiveEls) { progressiveEls.push(elP, elN); } } function setLargeStyle(sign, el, seriesModel, data) { var borderColor = getBorderColor(sign, seriesModel) || getColor(sign, seriesModel); var itemStyle = seriesModel.getModel("itemStyle").getItemStyle(SKIP_PROPS); el.useStyle(itemStyle); el.style.fill = null; el.style.stroke = borderColor; } var CandlestickSeriesModel = ( /** @class */ (function(_super) { __extends(CandlestickSeriesModel2, _super); function CandlestickSeriesModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = CandlestickSeriesModel2.type; _this.defaultValueDimensions = [{ name: "open", defaultTooltip: true }, { name: "close", defaultTooltip: true }, { name: "lowest", defaultTooltip: true }, { name: "highest", defaultTooltip: true }]; return _this; } CandlestickSeriesModel2.prototype.getShadowDim = function() { return "open"; }; CandlestickSeriesModel2.prototype.brushSelector = function(dataIndex, data, selectors) { var itemLayout = data.getItemLayout(dataIndex); return itemLayout && selectors.rect(itemLayout.brushRect); }; CandlestickSeriesModel2.type = "series.candlestick"; CandlestickSeriesModel2.dependencies = ["xAxis", "yAxis", "grid"]; CandlestickSeriesModel2.defaultOption = { // zlevel: 0, z: 2, coordinateSystem: "cartesian2d", legendHoverLink: true, // xAxisIndex: 0, // yAxisIndex: 0, layout: null, clip: true, itemStyle: { color: "#eb5454", color0: "#47b262", borderColor: "#eb5454", borderColor0: "#47b262", borderColorDoji: null, // borderColor: '#d24040', // borderColor0: '#398f4f', borderWidth: 1 }, emphasis: { itemStyle: { borderWidth: 2 } }, barMaxWidth: null, barMinWidth: null, barWidth: null, large: true, largeThreshold: 600, progressive: 3e3, progressiveThreshold: 1e4, progressiveChunkMode: "mod", animationEasing: "linear", animationDuration: 300 }; return CandlestickSeriesModel2; })(SeriesModel) ); mixin(CandlestickSeriesModel, WhiskerBoxCommonMixin, true); function candlestickPreprocessor(option) { if (!option || !isArray$1(option.series)) { return; } each$f(option.series, function(seriesItem) { if (isObject$3(seriesItem) && seriesItem.type === "k") { seriesItem.type = "candlestick"; } }); } var candlestickLayout = { seriesType: "candlestick", plan: createRenderPlanner(), reset: function(seriesModel) { var coordSys = seriesModel.coordinateSystem; var data = seriesModel.getData(); var candleWidth = calculateCandleWidth(seriesModel, data); var cDimIdx = 0; var vDimIdx = 1; var coordDims = ["x", "y"]; var cDimI = data.getDimensionIndex(data.mapDimension(coordDims[cDimIdx])); var vDimsI = map$1(data.mapDimensionsAll(coordDims[vDimIdx]), data.getDimensionIndex, data); var openDimI = vDimsI[0]; var closeDimI = vDimsI[1]; var lowestDimI = vDimsI[2]; var highestDimI = vDimsI[3]; data.setLayout({ candleWidth, // The value is experimented visually. isSimpleBox: candleWidth <= 1.3 }); if (cDimI < 0 || vDimsI.length < 4) { return; } return { progress: seriesModel.pipelineContext.large ? largeProgress : normalProgress }; function normalProgress(params, data2) { var dataIndex; var store = data2.getStore(); while ((dataIndex = params.next()) != null) { var axisDimVal = store.get(cDimI, dataIndex); var openVal = store.get(openDimI, dataIndex); var closeVal = store.get(closeDimI, dataIndex); var lowestVal = store.get(lowestDimI, dataIndex); var highestVal = store.get(highestDimI, dataIndex); var ocLow = Math.min(openVal, closeVal); var ocHigh = Math.max(openVal, closeVal); var ocLowPoint = getPoint(ocLow, axisDimVal); var ocHighPoint = getPoint(ocHigh, axisDimVal); var lowestPoint = getPoint(lowestVal, axisDimVal); var highestPoint = getPoint(highestVal, axisDimVal); var ends = []; addBodyEnd(ends, ocHighPoint, 0); addBodyEnd(ends, ocLowPoint, 1); ends.push(subPixelOptimizePoint(highestPoint), subPixelOptimizePoint(ocHighPoint), subPixelOptimizePoint(lowestPoint), subPixelOptimizePoint(ocLowPoint)); var itemModel = data2.getItemModel(dataIndex); var hasDojiColor = !!itemModel.get(["itemStyle", "borderColorDoji"]); data2.setItemLayout(dataIndex, { sign: getSign(store, dataIndex, openVal, closeVal, closeDimI, hasDojiColor), initBaseline: openVal > closeVal ? ocHighPoint[vDimIdx] : ocLowPoint[vDimIdx], ends, brushRect: makeBrushRect(lowestVal, highestVal, axisDimVal) }); } function getPoint(val, axisDimVal2) { var p = []; p[cDimIdx] = axisDimVal2; p[vDimIdx] = val; return isNaN(axisDimVal2) || isNaN(val) ? [NaN, NaN] : coordSys.dataToPoint(p); } function addBodyEnd(ends2, point, start) { var point1 = point.slice(); var point2 = point.slice(); point1[cDimIdx] = subPixelOptimize(point1[cDimIdx] + candleWidth / 2, 1, false); point2[cDimIdx] = subPixelOptimize(point2[cDimIdx] - candleWidth / 2, 1, true); start ? ends2.push(point1, point2) : ends2.push(point2, point1); } function makeBrushRect(lowestVal2, highestVal2, axisDimVal2) { var pmin = getPoint(lowestVal2, axisDimVal2); var pmax = getPoint(highestVal2, axisDimVal2); pmin[cDimIdx] -= candleWidth / 2; pmax[cDimIdx] -= candleWidth / 2; return { x: pmin[0], y: pmin[1], width: candleWidth, height: pmax[1] - pmin[1] }; } function subPixelOptimizePoint(point) { point[cDimIdx] = subPixelOptimize(point[cDimIdx], 1); return point; } } function largeProgress(params, data2) { var points2 = createFloat32Array(params.count * 4); var offset = 0; var point; var tmpIn = []; var tmpOut = []; var dataIndex; var store = data2.getStore(); var hasDojiColor = !!seriesModel.get(["itemStyle", "borderColorDoji"]); while ((dataIndex = params.next()) != null) { var axisDimVal = store.get(cDimI, dataIndex); var openVal = store.get(openDimI, dataIndex); var closeVal = store.get(closeDimI, dataIndex); var lowestVal = store.get(lowestDimI, dataIndex); var highestVal = store.get(highestDimI, dataIndex); if (isNaN(axisDimVal) || isNaN(lowestVal) || isNaN(highestVal)) { points2[offset++] = NaN; offset += 3; continue; } points2[offset++] = getSign(store, dataIndex, openVal, closeVal, closeDimI, hasDojiColor); tmpIn[cDimIdx] = axisDimVal; tmpIn[vDimIdx] = lowestVal; point = coordSys.dataToPoint(tmpIn, null, tmpOut); points2[offset++] = point ? point[0] : NaN; points2[offset++] = point ? point[1] : NaN; tmpIn[vDimIdx] = highestVal; point = coordSys.dataToPoint(tmpIn, null, tmpOut); points2[offset++] = point ? point[1] : NaN; } data2.setLayout("largePoints", points2); } } }; function getSign(store, dataIndex, openVal, closeVal, closeDimI, hasDojiColor) { var sign; if (openVal > closeVal) { sign = -1; } else if (openVal < closeVal) { sign = 1; } else { sign = hasDojiColor ? 0 : dataIndex > 0 ? store.get(closeDimI, dataIndex - 1) <= closeVal ? 1 : -1 : 1; } return sign; } function calculateCandleWidth(seriesModel, data) { var baseAxis = seriesModel.getBaseAxis(); var extent; var bandWidth = baseAxis.type === "category" ? baseAxis.getBandWidth() : (extent = baseAxis.getExtent(), Math.abs(extent[1] - extent[0]) / data.count()); var barMaxWidth = parsePercent(retrieve2(seriesModel.get("barMaxWidth"), bandWidth), bandWidth); var barMinWidth = parsePercent(retrieve2(seriesModel.get("barMinWidth"), 1), bandWidth); var barWidth = seriesModel.get("barWidth"); return barWidth != null ? parsePercent(barWidth, bandWidth) : Math.max(Math.min(bandWidth / 2, barMaxWidth), barMinWidth); } function install$A(registers) { registers.registerChartView(CandlestickView); registers.registerSeriesModel(CandlestickSeriesModel); registers.registerPreprocessor(candlestickPreprocessor); registers.registerVisual(candlestickVisual); registers.registerLayout(candlestickLayout); } function updateRipplePath(rippleGroup, effectCfg) { var color = effectCfg.rippleEffectColor || effectCfg.color; rippleGroup.eachChild(function(ripplePath) { ripplePath.attr({ z: effectCfg.z, zlevel: effectCfg.zlevel, style: { stroke: effectCfg.brushType === "stroke" ? color : null, fill: effectCfg.brushType === "fill" ? color : null } }); }); } var EffectSymbol = ( /** @class */ (function(_super) { __extends(EffectSymbol2, _super); function EffectSymbol2(data, idx) { var _this = _super.call(this) || this; var symbol = new Symbol$1(data, idx); var rippleGroup = new Group$3(); _this.add(symbol); _this.add(rippleGroup); _this.updateData(data, idx); return _this; } EffectSymbol2.prototype.stopEffectAnimation = function() { this.childAt(1).removeAll(); }; EffectSymbol2.prototype.startEffectAnimation = function(effectCfg) { var symbolType = effectCfg.symbolType; var color = effectCfg.color; var rippleNumber = effectCfg.rippleNumber; var rippleGroup = this.childAt(1); for (var i = 0; i < rippleNumber; i++) { var ripplePath = createSymbol$1(symbolType, -1, -1, 2, 2, color); ripplePath.attr({ style: { strokeNoScale: true }, z2: 99, silent: true, scaleX: 0.5, scaleY: 0.5 }); var delay = -i / rippleNumber * effectCfg.period + effectCfg.effectOffset; ripplePath.animate("", true).when(effectCfg.period, { scaleX: effectCfg.rippleScale / 2, scaleY: effectCfg.rippleScale / 2 }).delay(delay).start(); ripplePath.animateStyle(true).when(effectCfg.period, { opacity: 0 }).delay(delay).start(); rippleGroup.add(ripplePath); } updateRipplePath(rippleGroup, effectCfg); }; EffectSymbol2.prototype.updateEffectAnimation = function(effectCfg) { var oldEffectCfg = this._effectCfg; var rippleGroup = this.childAt(1); var DIFFICULT_PROPS = ["symbolType", "period", "rippleScale", "rippleNumber"]; for (var i = 0; i < DIFFICULT_PROPS.length; i++) { var propName = DIFFICULT_PROPS[i]; if (oldEffectCfg[propName] !== effectCfg[propName]) { this.stopEffectAnimation(); this.startEffectAnimation(effectCfg); return; } } updateRipplePath(rippleGroup, effectCfg); }; EffectSymbol2.prototype.highlight = function() { enterEmphasis(this); }; EffectSymbol2.prototype.downplay = function() { leaveEmphasis(this); }; EffectSymbol2.prototype.getSymbolType = function() { var symbol = this.childAt(0); return symbol && symbol.getSymbolType(); }; EffectSymbol2.prototype.updateData = function(data, idx) { var _this = this; var seriesModel = data.hostModel; this.childAt(0).updateData(data, idx); var rippleGroup = this.childAt(1); var itemModel = data.getItemModel(idx); var symbolType = data.getItemVisual(idx, "symbol"); var symbolSize = normalizeSymbolSize(data.getItemVisual(idx, "symbolSize")); var symbolStyle = data.getItemVisual(idx, "style"); var color = symbolStyle && symbolStyle.fill; var emphasisModel = itemModel.getModel("emphasis"); rippleGroup.setScale(symbolSize); rippleGroup.traverse(function(ripplePath) { ripplePath.setStyle("fill", color); }); var symbolOffset = normalizeSymbolOffset(data.getItemVisual(idx, "symbolOffset"), symbolSize); if (symbolOffset) { rippleGroup.x = symbolOffset[0]; rippleGroup.y = symbolOffset[1]; } var symbolRotate = data.getItemVisual(idx, "symbolRotate"); rippleGroup.rotation = (symbolRotate || 0) * Math.PI / 180 || 0; var effectCfg = {}; effectCfg.showEffectOn = seriesModel.get("showEffectOn"); effectCfg.rippleScale = itemModel.get(["rippleEffect", "scale"]); effectCfg.brushType = itemModel.get(["rippleEffect", "brushType"]); effectCfg.period = itemModel.get(["rippleEffect", "period"]) * 1e3; effectCfg.effectOffset = idx / data.count(); effectCfg.z = seriesModel.getShallow("z") || 0; effectCfg.zlevel = seriesModel.getShallow("zlevel") || 0; effectCfg.symbolType = symbolType; effectCfg.color = color; effectCfg.rippleEffectColor = itemModel.get(["rippleEffect", "color"]); effectCfg.rippleNumber = itemModel.get(["rippleEffect", "number"]); if (effectCfg.showEffectOn === "render") { this._effectCfg ? this.updateEffectAnimation(effectCfg) : this.startEffectAnimation(effectCfg); this._effectCfg = effectCfg; } else { this._effectCfg = null; this.stopEffectAnimation(); this.onHoverStateChange = function(toState) { if (toState === "emphasis") { if (effectCfg.showEffectOn !== "render") { _this.startEffectAnimation(effectCfg); } } else if (toState === "normal") { if (effectCfg.showEffectOn !== "render") { _this.stopEffectAnimation(); } } }; } this._effectCfg = effectCfg; toggleHoverEmphasis(this, emphasisModel.get("focus"), emphasisModel.get("blurScope"), emphasisModel.get("disabled")); }; EffectSymbol2.prototype.fadeOut = function(cb) { cb && cb(); }; return EffectSymbol2; })(Group$3) ); var EffectScatterView = ( /** @class */ (function(_super) { __extends(EffectScatterView2, _super); function EffectScatterView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = EffectScatterView2.type; return _this; } EffectScatterView2.prototype.init = function() { this._symbolDraw = new SymbolDraw(EffectSymbol); }; EffectScatterView2.prototype.render = function(seriesModel, ecModel, api) { var data = seriesModel.getData(); var effectSymbolDraw = this._symbolDraw; effectSymbolDraw.updateData(data, { clipShape: this._getClipShape(seriesModel) }); this.group.add(effectSymbolDraw.group); }; EffectScatterView2.prototype._getClipShape = function(seriesModel) { var coordSys = seriesModel.coordinateSystem; var clipArea = coordSys && coordSys.getArea && coordSys.getArea(); return seriesModel.get("clip", true) ? clipArea : null; }; EffectScatterView2.prototype.updateTransform = function(seriesModel, ecModel, api) { var data = seriesModel.getData(); this.group.dirty(); var res = pointsLayout("").reset(seriesModel, ecModel, api); if (res.progress) { res.progress({ start: 0, end: data.count(), count: data.count() }, data); } this._symbolDraw.updateLayout(); }; EffectScatterView2.prototype._updateGroupTransform = function(seriesModel) { var coordSys = seriesModel.coordinateSystem; if (coordSys && coordSys.getRoamTransform) { this.group.transform = clone$3(coordSys.getRoamTransform()); this.group.decomposeTransform(); } }; EffectScatterView2.prototype.remove = function(ecModel, api) { this._symbolDraw && this._symbolDraw.remove(true); }; EffectScatterView2.type = "effectScatter"; return EffectScatterView2; })(ChartView) ); var EffectScatterSeriesModel = ( /** @class */ (function(_super) { __extends(EffectScatterSeriesModel2, _super); function EffectScatterSeriesModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = EffectScatterSeriesModel2.type; _this.hasSymbolVisual = true; return _this; } EffectScatterSeriesModel2.prototype.getInitialData = function(option, ecModel) { return createSeriesData(null, this, { useEncodeDefaulter: true }); }; EffectScatterSeriesModel2.prototype.brushSelector = function(dataIndex, data, selectors) { return selectors.point(data.getItemLayout(dataIndex)); }; EffectScatterSeriesModel2.type = "series.effectScatter"; EffectScatterSeriesModel2.dependencies = ["grid", "polar"]; EffectScatterSeriesModel2.defaultOption = { coordinateSystem: "cartesian2d", // zlevel: 0, z: 2, legendHoverLink: true, effectType: "ripple", progressive: 0, // When to show the effect, option: 'render'|'emphasis' showEffectOn: "render", clip: true, // Ripple effect config rippleEffect: { period: 4, // Scale of ripple scale: 2.5, // Brush type can be fill or stroke brushType: "fill", // Ripple number number: 3 }, universalTransition: { divideShape: "clone" }, // Cartesian coordinate system // xAxisIndex: 0, // yAxisIndex: 0, // Polar coordinate system // polarIndex: 0, // Geo coordinate system // geoIndex: 0, // symbol: null, // 图形类型 symbolSize: 10 // 图形大小,半宽(半径)参数,当图形为方向或菱形则总宽度为symbolSize * 2 // symbolRotate: null, // 图形旋转控制 // itemStyle: { // opacity: 1 // } }; return EffectScatterSeriesModel2; })(SeriesModel) ); function install$z(registers) { registers.registerChartView(EffectScatterView); registers.registerSeriesModel(EffectScatterSeriesModel); registers.registerLayout(pointsLayout("effectScatter")); } var EffectLine = ( /** @class */ (function(_super) { __extends(EffectLine2, _super); function EffectLine2(lineData, idx, seriesScope) { var _this = _super.call(this) || this; _this.add(_this.createLine(lineData, idx, seriesScope)); _this._updateEffectSymbol(lineData, idx); return _this; } EffectLine2.prototype.createLine = function(lineData, idx, seriesScope) { return new Line(lineData, idx, seriesScope); }; EffectLine2.prototype._updateEffectSymbol = function(lineData, idx) { var itemModel = lineData.getItemModel(idx); var effectModel = itemModel.getModel("effect"); var size = effectModel.get("symbolSize"); var symbolType = effectModel.get("symbol"); if (!isArray$1(size)) { size = [size, size]; } var lineStyle = lineData.getItemVisual(idx, "style"); var color = effectModel.get("color") || lineStyle && lineStyle.stroke; var symbol = this.childAt(1); if (this._symbolType !== symbolType) { this.remove(symbol); symbol = createSymbol$1(symbolType, -0.5, -0.5, 1, 1, color); symbol.z2 = 100; symbol.culling = true; this.add(symbol); } if (!symbol) { return; } symbol.setStyle("shadowColor", color); symbol.setStyle(effectModel.getItemStyle(["color"])); symbol.scaleX = size[0]; symbol.scaleY = size[1]; symbol.setColor(color); this._symbolType = symbolType; this._symbolScale = size; this._updateEffectAnimation(lineData, effectModel, idx); }; EffectLine2.prototype._updateEffectAnimation = function(lineData, effectModel, idx) { var symbol = this.childAt(1); if (!symbol) { return; } var points2 = lineData.getItemLayout(idx); var period = effectModel.get("period") * 1e3; var loop = effectModel.get("loop"); var roundTrip = effectModel.get("roundTrip"); var constantSpeed = effectModel.get("constantSpeed"); var delayExpr = retrieve(effectModel.get("delay"), function(idx2) { return idx2 / lineData.count() * period / 3; }); symbol.ignore = true; this._updateAnimationPoints(symbol, points2); if (constantSpeed > 0) { period = this._getLineLength(symbol) / constantSpeed * 1e3; } if (period !== this._period || loop !== this._loop || roundTrip !== this._roundTrip) { symbol.stopAnimation(); var delayNum = void 0; if (isFunction(delayExpr)) { delayNum = delayExpr(idx); } else { delayNum = delayExpr; } if (symbol.__t > 0) { delayNum = -period * symbol.__t; } this._animateSymbol(symbol, period, delayNum, loop, roundTrip); } this._period = period; this._loop = loop; this._roundTrip = roundTrip; }; EffectLine2.prototype._animateSymbol = function(symbol, period, delayNum, loop, roundTrip) { if (period > 0) { symbol.__t = 0; var self_1 = this; var animator = symbol.animate("", loop).when(roundTrip ? period * 2 : period, { __t: roundTrip ? 2 : 1 }).delay(delayNum).during(function() { self_1._updateSymbolPosition(symbol); }); if (!loop) { animator.done(function() { self_1.remove(symbol); }); } animator.start(); } }; EffectLine2.prototype._getLineLength = function(symbol) { return dist(symbol.__p1, symbol.__cp1) + dist(symbol.__cp1, symbol.__p2); }; EffectLine2.prototype._updateAnimationPoints = function(symbol, points2) { symbol.__p1 = points2[0]; symbol.__p2 = points2[1]; symbol.__cp1 = points2[2] || [(points2[0][0] + points2[1][0]) / 2, (points2[0][1] + points2[1][1]) / 2]; }; EffectLine2.prototype.updateData = function(lineData, idx, seriesScope) { this.childAt(0).updateData(lineData, idx, seriesScope); this._updateEffectSymbol(lineData, idx); }; EffectLine2.prototype._updateSymbolPosition = function(symbol) { var p1 = symbol.__p1; var p2 = symbol.__p2; var cp1 = symbol.__cp1; var t = symbol.__t < 1 ? symbol.__t : 2 - symbol.__t; var pos = [symbol.x, symbol.y]; var lastPos = pos.slice(); var quadraticAt2 = quadraticAt$1; var quadraticDerivativeAt$1 = quadraticDerivativeAt; pos[0] = quadraticAt2(p1[0], cp1[0], p2[0], t); pos[1] = quadraticAt2(p1[1], cp1[1], p2[1], t); var tx = symbol.__t < 1 ? quadraticDerivativeAt$1(p1[0], cp1[0], p2[0], t) : quadraticDerivativeAt$1(p2[0], cp1[0], p1[0], 1 - t); var ty = symbol.__t < 1 ? quadraticDerivativeAt$1(p1[1], cp1[1], p2[1], t) : quadraticDerivativeAt$1(p2[1], cp1[1], p1[1], 1 - t); symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2; if (this._symbolType === "line" || this._symbolType === "rect" || this._symbolType === "roundRect") { if (symbol.__lastT !== void 0 && symbol.__lastT < symbol.__t) { symbol.scaleY = dist(lastPos, pos) * 1.05; if (t === 1) { pos[0] = lastPos[0] + (pos[0] - lastPos[0]) / 2; pos[1] = lastPos[1] + (pos[1] - lastPos[1]) / 2; } } else if (symbol.__lastT === 1) { symbol.scaleY = 2 * dist(p1, pos); } else { symbol.scaleY = this._symbolScale[1]; } } symbol.__lastT = symbol.__t; symbol.ignore = false; symbol.x = pos[0]; symbol.y = pos[1]; }; EffectLine2.prototype.updateLayout = function(lineData, idx) { this.childAt(0).updateLayout(lineData, idx); var effectModel = lineData.getItemModel(idx).getModel("effect"); this._updateEffectAnimation(lineData, effectModel, idx); }; return EffectLine2; })(Group$3) ); var Polyline = ( /** @class */ (function(_super) { __extends(Polyline2, _super); function Polyline2(lineData, idx, seriesScope) { var _this = _super.call(this) || this; _this._createPolyline(lineData, idx, seriesScope); return _this; } Polyline2.prototype._createPolyline = function(lineData, idx, seriesScope) { var points2 = lineData.getItemLayout(idx); var line = new Polyline$1({ shape: { points: points2 } }); this.add(line); this._updateCommonStl(lineData, idx, seriesScope); }; Polyline2.prototype.updateData = function(lineData, idx, seriesScope) { var seriesModel = lineData.hostModel; var line = this.childAt(0); var target = { shape: { points: lineData.getItemLayout(idx) } }; updateProps$1(line, target, seriesModel, idx); this._updateCommonStl(lineData, idx, seriesScope); }; Polyline2.prototype._updateCommonStl = function(lineData, idx, seriesScope) { var line = this.childAt(0); var itemModel = lineData.getItemModel(idx); var emphasisLineStyle = seriesScope && seriesScope.emphasisLineStyle; var focus = seriesScope && seriesScope.focus; var blurScope = seriesScope && seriesScope.blurScope; var emphasisDisabled = seriesScope && seriesScope.emphasisDisabled; if (!seriesScope || lineData.hasItemOption) { var emphasisModel = itemModel.getModel("emphasis"); emphasisLineStyle = emphasisModel.getModel("lineStyle").getLineStyle(); emphasisDisabled = emphasisModel.get("disabled"); focus = emphasisModel.get("focus"); blurScope = emphasisModel.get("blurScope"); } line.useStyle(lineData.getItemVisual(idx, "style")); line.style.fill = null; line.style.strokeNoScale = true; var lineEmphasisState = line.ensureState("emphasis"); lineEmphasisState.style = emphasisLineStyle; toggleHoverEmphasis(this, focus, blurScope, emphasisDisabled); }; Polyline2.prototype.updateLayout = function(lineData, idx) { var polyline = this.childAt(0); polyline.setShape("points", lineData.getItemLayout(idx)); }; return Polyline2; })(Group$3) ); var EffectPolyline = ( /** @class */ (function(_super) { __extends(EffectPolyline2, _super); function EffectPolyline2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this._lastFrame = 0; _this._lastFramePercent = 0; return _this; } EffectPolyline2.prototype.createLine = function(lineData, idx, seriesScope) { return new Polyline(lineData, idx, seriesScope); }; EffectPolyline2.prototype._updateAnimationPoints = function(symbol, points2) { this._points = points2; var accLenArr = [0]; var len2 = 0; for (var i = 1; i < points2.length; i++) { var p1 = points2[i - 1]; var p2 = points2[i]; len2 += dist(p1, p2); accLenArr.push(len2); } if (len2 === 0) { this._length = 0; return; } for (var i = 0; i < accLenArr.length; i++) { accLenArr[i] /= len2; } this._offsets = accLenArr; this._length = len2; }; EffectPolyline2.prototype._getLineLength = function() { return this._length; }; EffectPolyline2.prototype._updateSymbolPosition = function(symbol) { var t = symbol.__t < 1 ? symbol.__t : 2 - symbol.__t; var points2 = this._points; var offsets = this._offsets; var len2 = points2.length; if (!offsets) { return; } var lastFrame = this._lastFrame; var frame; if (t < this._lastFramePercent) { var start = Math.min(lastFrame + 1, len2 - 1); for (frame = start; frame >= 0; frame--) { if (offsets[frame] <= t) { break; } } frame = Math.min(frame, len2 - 2); } else { for (frame = lastFrame; frame < len2; frame++) { if (offsets[frame] > t) { break; } } frame = Math.min(frame - 1, len2 - 2); } var p = (t - offsets[frame]) / (offsets[frame + 1] - offsets[frame]); var p0 = points2[frame]; var p1 = points2[frame + 1]; symbol.x = p0[0] * (1 - p) + p * p1[0]; symbol.y = p0[1] * (1 - p) + p * p1[1]; var tx = symbol.__t < 1 ? p1[0] - p0[0] : p0[0] - p1[0]; var ty = symbol.__t < 1 ? p1[1] - p0[1] : p0[1] - p1[1]; symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2; this._lastFrame = frame; this._lastFramePercent = t; symbol.ignore = false; }; return EffectPolyline2; })(EffectLine) ); var LargeLinesPathShape = ( /** @class */ /* @__PURE__ */ (function() { function LargeLinesPathShape2() { this.polyline = false; this.curveness = 0; this.segs = []; } return LargeLinesPathShape2; })() ); var LargeLinesPath = ( /** @class */ (function(_super) { __extends(LargeLinesPath2, _super); function LargeLinesPath2(opts) { var _this = _super.call(this, opts) || this; _this._off = 0; _this.hoverDataIdx = -1; return _this; } LargeLinesPath2.prototype.reset = function() { this.notClear = false; this._off = 0; }; LargeLinesPath2.prototype.getDefaultStyle = function() { return { stroke: "#000", fill: null }; }; LargeLinesPath2.prototype.getDefaultShape = function() { return new LargeLinesPathShape(); }; LargeLinesPath2.prototype.buildPath = function(ctx, shape) { var segs = shape.segs; var curveness = shape.curveness; var i; if (shape.polyline) { for (i = this._off; i < segs.length; ) { var count2 = segs[i++]; if (count2 > 0) { ctx.moveTo(segs[i++], segs[i++]); for (var k = 1; k < count2; k++) { ctx.lineTo(segs[i++], segs[i++]); } } } } else { for (i = this._off; i < segs.length; ) { var x0 = segs[i++]; var y0 = segs[i++]; var x1 = segs[i++]; var y1 = segs[i++]; ctx.moveTo(x0, y0); if (curveness > 0) { var x2 = (x0 + x1) / 2 - (y0 - y1) * curveness; var y2 = (y0 + y1) / 2 - (x1 - x0) * curveness; ctx.quadraticCurveTo(x2, y2, x1, y1); } else { ctx.lineTo(x1, y1); } } } if (this.incremental) { this._off = i; this.notClear = true; } }; LargeLinesPath2.prototype.findDataIndex = function(x, y) { var shape = this.shape; var segs = shape.segs; var curveness = shape.curveness; var lineWidth = this.style.lineWidth; if (shape.polyline) { var dataIndex = 0; for (var i = 0; i < segs.length; ) { var count2 = segs[i++]; if (count2 > 0) { var x0 = segs[i++]; var y0 = segs[i++]; for (var k = 1; k < count2; k++) { var x1 = segs[i++]; var y1 = segs[i++]; if (containStroke(x0, y0, x1, y1, lineWidth, x, y)) { return dataIndex; } } } dataIndex++; } } else { var dataIndex = 0; for (var i = 0; i < segs.length; ) { var x0 = segs[i++]; var y0 = segs[i++]; var x1 = segs[i++]; var y1 = segs[i++]; if (curveness > 0) { var x2 = (x0 + x1) / 2 - (y0 - y1) * curveness; var y2 = (y0 + y1) / 2 - (x1 - x0) * curveness; if (containStroke$1(x0, y0, x2, y2, x1, y1, lineWidth, x, y)) { return dataIndex; } } else { if (containStroke(x0, y0, x1, y1, lineWidth, x, y)) { return dataIndex; } } dataIndex++; } } return -1; }; LargeLinesPath2.prototype.contain = function(x, y) { var localPos = this.transformCoordToLocal(x, y); var rect = this.getBoundingRect(); x = localPos[0]; y = localPos[1]; if (rect.contain(x, y)) { var dataIdx = this.hoverDataIdx = this.findDataIndex(x, y); return dataIdx >= 0; } this.hoverDataIdx = -1; return false; }; LargeLinesPath2.prototype.getBoundingRect = function() { var rect = this._rect; if (!rect) { var shape = this.shape; var points2 = shape.segs; var minX = Infinity; var minY = Infinity; var maxX = -Infinity; var maxY = -Infinity; for (var i = 0; i < points2.length; ) { var x = points2[i++]; var y = points2[i++]; minX = Math.min(x, minX); maxX = Math.max(x, maxX); minY = Math.min(y, minY); maxY = Math.max(y, maxY); } rect = this._rect = new BoundingRect(minX, minY, maxX, maxY); } return rect; }; return LargeLinesPath2; })(Path) ); var LargeLineDraw = ( /** @class */ (function() { function LargeLineDraw2() { this.group = new Group$3(); } LargeLineDraw2.prototype.updateData = function(data) { this._clear(); var lineEl = this._create(); lineEl.setShape({ segs: data.getLayout("linesPoints") }); this._setCommon(lineEl, data); }; LargeLineDraw2.prototype.incrementalPrepareUpdate = function(data) { this.group.removeAll(); this._clear(); }; LargeLineDraw2.prototype.incrementalUpdate = function(taskParams, data) { var lastAdded = this._newAdded[0]; var linePoints = data.getLayout("linesPoints"); var oldSegs = lastAdded && lastAdded.shape.segs; if (oldSegs && oldSegs.length < 2e4) { var oldLen = oldSegs.length; var newSegs = new Float32Array(oldLen + linePoints.length); newSegs.set(oldSegs); newSegs.set(linePoints, oldLen); lastAdded.setShape({ segs: newSegs }); } else { this._newAdded = []; var lineEl = this._create(); lineEl.incremental = true; lineEl.setShape({ segs: linePoints }); this._setCommon(lineEl, data); lineEl.__startIndex = taskParams.start; } }; LargeLineDraw2.prototype.remove = function() { this._clear(); }; LargeLineDraw2.prototype.eachRendered = function(cb) { this._newAdded[0] && cb(this._newAdded[0]); }; LargeLineDraw2.prototype._create = function() { var lineEl = new LargeLinesPath({ cursor: "default", ignoreCoarsePointer: true }); this._newAdded.push(lineEl); this.group.add(lineEl); return lineEl; }; LargeLineDraw2.prototype._setCommon = function(lineEl, data, isIncremental) { var hostModel = data.hostModel; lineEl.setShape({ polyline: hostModel.get("polyline"), curveness: hostModel.get(["lineStyle", "curveness"]) }); lineEl.useStyle(hostModel.getModel("lineStyle").getLineStyle()); lineEl.style.strokeNoScale = true; var style = data.getVisual("style"); if (style && style.stroke) { lineEl.setStyle("stroke", style.stroke); } lineEl.setStyle("fill", null); var ecData = getECData(lineEl); ecData.seriesIndex = hostModel.seriesIndex; lineEl.on("mousemove", function(e) { ecData.dataIndex = null; var dataIndex = lineEl.hoverDataIdx; if (dataIndex > 0) { ecData.dataIndex = dataIndex + lineEl.__startIndex; } }); }; LargeLineDraw2.prototype._clear = function() { this._newAdded = []; this.group.removeAll(); }; return LargeLineDraw2; })() ); var linesLayout = { seriesType: "lines", plan: createRenderPlanner(), reset: function(seriesModel) { var coordSys = seriesModel.coordinateSystem; if (!coordSys) { return; } var isPolyline = seriesModel.get("polyline"); var isLarge = seriesModel.pipelineContext.large; return { progress: function(params, lineData) { var lineCoords = []; if (isLarge) { var points2 = void 0; var segCount = params.end - params.start; if (isPolyline) { var totalCoordsCount = 0; for (var i = params.start; i < params.end; i++) { totalCoordsCount += seriesModel.getLineCoordsCount(i); } points2 = new Float32Array(segCount + totalCoordsCount * 2); } else { points2 = new Float32Array(segCount * 4); } var offset = 0; var pt = []; for (var i = params.start; i < params.end; i++) { var len2 = seriesModel.getLineCoords(i, lineCoords); if (isPolyline) { points2[offset++] = len2; } for (var k = 0; k < len2; k++) { pt = coordSys.dataToPoint(lineCoords[k], false, pt); points2[offset++] = pt[0]; points2[offset++] = pt[1]; } } lineData.setLayout("linesPoints", points2); } else { for (var i = params.start; i < params.end; i++) { var itemModel = lineData.getItemModel(i); var len2 = seriesModel.getLineCoords(i, lineCoords); var pts = []; if (isPolyline) { for (var j = 0; j < len2; j++) { pts.push(coordSys.dataToPoint(lineCoords[j])); } } else { pts[0] = coordSys.dataToPoint(lineCoords[0]); pts[1] = coordSys.dataToPoint(lineCoords[1]); var curveness = itemModel.get(["lineStyle", "curveness"]); if (+curveness) { pts[2] = [(pts[0][0] + pts[1][0]) / 2 - (pts[0][1] - pts[1][1]) * curveness, (pts[0][1] + pts[1][1]) / 2 - (pts[1][0] - pts[0][0]) * curveness]; } } lineData.setItemLayout(i, pts); } } } }; } }; var LinesView = ( /** @class */ (function(_super) { __extends(LinesView2, _super); function LinesView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = LinesView2.type; return _this; } LinesView2.prototype.render = function(seriesModel, ecModel, api) { var data = seriesModel.getData(); var lineDraw = this._updateLineDraw(data, seriesModel); var zlevel = seriesModel.get("zlevel"); var trailLength = seriesModel.get(["effect", "trailLength"]); var zr = api.getZr(); var isSvg = zr.painter.getType() === "svg"; if (!isSvg) { zr.painter.getLayer(zlevel).clear(true); } if (this._lastZlevel != null && !isSvg) { zr.configLayer(this._lastZlevel, { motionBlur: false }); } if (this._showEffect(seriesModel) && trailLength > 0) { if (!isSvg) { zr.configLayer(zlevel, { motionBlur: true, lastFrameAlpha: Math.max(Math.min(trailLength / 10 + 0.9, 1), 0) }); } } lineDraw.updateData(data); var clipPath = seriesModel.get("clip", true) && createClipPath(seriesModel.coordinateSystem, false, seriesModel); if (clipPath) { this.group.setClipPath(clipPath); } else { this.group.removeClipPath(); } this._lastZlevel = zlevel; this._finished = true; }; LinesView2.prototype.incrementalPrepareRender = function(seriesModel, ecModel, api) { var data = seriesModel.getData(); var lineDraw = this._updateLineDraw(data, seriesModel); lineDraw.incrementalPrepareUpdate(data); this._clearLayer(api); this._finished = false; }; LinesView2.prototype.incrementalRender = function(taskParams, seriesModel, ecModel) { this._lineDraw.incrementalUpdate(taskParams, seriesModel.getData()); this._finished = taskParams.end === seriesModel.getData().count(); }; LinesView2.prototype.eachRendered = function(cb) { this._lineDraw && this._lineDraw.eachRendered(cb); }; LinesView2.prototype.updateTransform = function(seriesModel, ecModel, api) { var data = seriesModel.getData(); var pipelineContext = seriesModel.pipelineContext; if (!this._finished || pipelineContext.large || pipelineContext.progressiveRender) { return { update: true }; } else { var res = linesLayout.reset(seriesModel, ecModel, api); if (res.progress) { res.progress({ start: 0, end: data.count(), count: data.count() }, data); } this._lineDraw.updateLayout(); this._clearLayer(api); } }; LinesView2.prototype._updateLineDraw = function(data, seriesModel) { var lineDraw = this._lineDraw; var hasEffect = this._showEffect(seriesModel); var isPolyline = !!seriesModel.get("polyline"); var pipelineContext = seriesModel.pipelineContext; var isLargeDraw = pipelineContext.large; if (!lineDraw || hasEffect !== this._hasEffet || isPolyline !== this._isPolyline || isLargeDraw !== this._isLargeDraw) { if (lineDraw) { lineDraw.remove(); } lineDraw = this._lineDraw = isLargeDraw ? new LargeLineDraw() : new LineDraw(isPolyline ? hasEffect ? EffectPolyline : Polyline : hasEffect ? EffectLine : Line); this._hasEffet = hasEffect; this._isPolyline = isPolyline; this._isLargeDraw = isLargeDraw; } this.group.add(lineDraw.group); return lineDraw; }; LinesView2.prototype._showEffect = function(seriesModel) { return !!seriesModel.get(["effect", "show"]); }; LinesView2.prototype._clearLayer = function(api) { var zr = api.getZr(); var isSvg = zr.painter.getType() === "svg"; if (!isSvg && this._lastZlevel != null) { zr.painter.getLayer(this._lastZlevel).clear(true); } }; LinesView2.prototype.remove = function(ecModel, api) { this._lineDraw && this._lineDraw.remove(); this._lineDraw = null; this._clearLayer(api); }; LinesView2.prototype.dispose = function(ecModel, api) { this.remove(ecModel, api); }; LinesView2.type = "lines"; return LinesView2; })(ChartView) ); var Uint32Arr = typeof Uint32Array === "undefined" ? Array : Uint32Array; var Float64Arr = typeof Float64Array === "undefined" ? Array : Float64Array; function compatEc2(seriesOpt) { var data = seriesOpt.data; if (data && data[0] && data[0][0] && data[0][0].coord) { seriesOpt.data = map$1(data, function(itemOpt) { var coords = [itemOpt[0].coord, itemOpt[1].coord]; var target = { coords }; if (itemOpt[0].name) { target.fromName = itemOpt[0].name; } if (itemOpt[1].name) { target.toName = itemOpt[1].name; } return mergeAll([target, itemOpt[0], itemOpt[1]]); }); } } var LinesSeriesModel = ( /** @class */ (function(_super) { __extends(LinesSeriesModel2, _super); function LinesSeriesModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = LinesSeriesModel2.type; _this.visualStyleAccessPath = "lineStyle"; _this.visualDrawType = "stroke"; return _this; } LinesSeriesModel2.prototype.init = function(option) { option.data = option.data || []; compatEc2(option); var result = this._processFlatCoordsArray(option.data); this._flatCoords = result.flatCoords; this._flatCoordsOffset = result.flatCoordsOffset; if (result.flatCoords) { option.data = new Float32Array(result.count); } _super.prototype.init.apply(this, arguments); }; LinesSeriesModel2.prototype.mergeOption = function(option) { compatEc2(option); if (option.data) { var result = this._processFlatCoordsArray(option.data); this._flatCoords = result.flatCoords; this._flatCoordsOffset = result.flatCoordsOffset; if (result.flatCoords) { option.data = new Float32Array(result.count); } } _super.prototype.mergeOption.apply(this, arguments); }; LinesSeriesModel2.prototype.appendData = function(params) { var result = this._processFlatCoordsArray(params.data); if (result.flatCoords) { if (!this._flatCoords) { this._flatCoords = result.flatCoords; this._flatCoordsOffset = result.flatCoordsOffset; } else { this._flatCoords = concatArray(this._flatCoords, result.flatCoords); this._flatCoordsOffset = concatArray(this._flatCoordsOffset, result.flatCoordsOffset); } params.data = new Float32Array(result.count); } this.getRawData().appendData(params.data); }; LinesSeriesModel2.prototype._getCoordsFromItemModel = function(idx) { var itemModel = this.getData().getItemModel(idx); var coords = itemModel.option instanceof Array ? itemModel.option : itemModel.getShallow("coords"); return coords; }; LinesSeriesModel2.prototype.getLineCoordsCount = function(idx) { if (this._flatCoordsOffset) { return this._flatCoordsOffset[idx * 2 + 1]; } else { return this._getCoordsFromItemModel(idx).length; } }; LinesSeriesModel2.prototype.getLineCoords = function(idx, out) { if (this._flatCoordsOffset) { var offset = this._flatCoordsOffset[idx * 2]; var len2 = this._flatCoordsOffset[idx * 2 + 1]; for (var i = 0; i < len2; i++) { out[i] = out[i] || []; out[i][0] = this._flatCoords[offset + i * 2]; out[i][1] = this._flatCoords[offset + i * 2 + 1]; } return len2; } else { var coords = this._getCoordsFromItemModel(idx); for (var i = 0; i < coords.length; i++) { out[i] = out[i] || []; out[i][0] = coords[i][0]; out[i][1] = coords[i][1]; } return coords.length; } }; LinesSeriesModel2.prototype._processFlatCoordsArray = function(data) { var startOffset = 0; if (this._flatCoords) { startOffset = this._flatCoords.length; } if (isNumber(data[0])) { var len2 = data.length; var coordsOffsetAndLenStorage = new Uint32Arr(len2); var coordsStorage = new Float64Arr(len2); var coordsCursor = 0; var offsetCursor = 0; var dataCount = 0; for (var i = 0; i < len2; ) { dataCount++; var count2 = data[i++]; coordsOffsetAndLenStorage[offsetCursor++] = coordsCursor + startOffset; coordsOffsetAndLenStorage[offsetCursor++] = count2; for (var k = 0; k < count2; k++) { var x = data[i++]; var y = data[i++]; coordsStorage[coordsCursor++] = x; coordsStorage[coordsCursor++] = y; } } return { flatCoordsOffset: new Uint32Array(coordsOffsetAndLenStorage.buffer, 0, offsetCursor), flatCoords: coordsStorage, count: dataCount }; } return { flatCoordsOffset: null, flatCoords: null, count: data.length }; }; LinesSeriesModel2.prototype.getInitialData = function(option, ecModel) { var lineData = new SeriesData(["value"], this); lineData.hasItemOption = false; lineData.initData(option.data, [], function(dataItem, dimName, dataIndex, dimIndex) { if (dataItem instanceof Array) { return NaN; } else { lineData.hasItemOption = true; var value = dataItem.value; if (value != null) { return value instanceof Array ? value[dimIndex] : value; } } }); return lineData; }; LinesSeriesModel2.prototype.formatTooltip = function(dataIndex, multipleSeries, dataType) { var data = this.getData(); var itemModel = data.getItemModel(dataIndex); var name = itemModel.get("name"); if (name) { return name; } var fromName = itemModel.get("fromName"); var toName = itemModel.get("toName"); var nameArr = []; fromName != null && nameArr.push(fromName); toName != null && nameArr.push(toName); return createTooltipMarkup("nameValue", { name: nameArr.join(" > ") }); }; LinesSeriesModel2.prototype.preventIncremental = function() { return !!this.get(["effect", "show"]); }; LinesSeriesModel2.prototype.getProgressive = function() { var progressive = this.option.progressive; if (progressive == null) { return this.option.large ? 1e4 : this.get("progressive"); } return progressive; }; LinesSeriesModel2.prototype.getProgressiveThreshold = function() { var progressiveThreshold = this.option.progressiveThreshold; if (progressiveThreshold == null) { return this.option.large ? 2e4 : this.get("progressiveThreshold"); } return progressiveThreshold; }; LinesSeriesModel2.prototype.getZLevelKey = function() { var effectModel = this.getModel("effect"); var trailLength = effectModel.get("trailLength"); return this.getData().count() > this.getProgressiveThreshold() ? this.id : effectModel.get("show") && trailLength > 0 ? trailLength + "" : ""; }; LinesSeriesModel2.type = "series.lines"; LinesSeriesModel2.dependencies = ["grid", "polar", "geo", "calendar"]; LinesSeriesModel2.defaultOption = { coordinateSystem: "geo", // zlevel: 0, z: 2, legendHoverLink: true, // Cartesian coordinate system xAxisIndex: 0, yAxisIndex: 0, symbol: ["none", "none"], symbolSize: [10, 10], // Geo coordinate system geoIndex: 0, effect: { show: false, period: 4, constantSpeed: 0, symbol: "circle", symbolSize: 3, loop: true, trailLength: 0.2 }, large: false, // Available when large is true largeThreshold: 2e3, polyline: false, clip: true, label: { show: false, position: "end" // distance: 5, // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 }, lineStyle: { opacity: 0.5 } }; return LinesSeriesModel2; })(SeriesModel) ); function normalize(a) { if (!(a instanceof Array)) { a = [a, a]; } return a; } var linesVisual = { seriesType: "lines", reset: function(seriesModel) { var symbolType = normalize(seriesModel.get("symbol")); var symbolSize = normalize(seriesModel.get("symbolSize")); var data = seriesModel.getData(); data.setVisual("fromSymbol", symbolType && symbolType[0]); data.setVisual("toSymbol", symbolType && symbolType[1]); data.setVisual("fromSymbolSize", symbolSize && symbolSize[0]); data.setVisual("toSymbolSize", symbolSize && symbolSize[1]); function dataEach(data2, idx) { var itemModel = data2.getItemModel(idx); var symbolType2 = normalize(itemModel.getShallow("symbol", true)); var symbolSize2 = normalize(itemModel.getShallow("symbolSize", true)); symbolType2[0] && data2.setItemVisual(idx, "fromSymbol", symbolType2[0]); symbolType2[1] && data2.setItemVisual(idx, "toSymbol", symbolType2[1]); symbolSize2[0] && data2.setItemVisual(idx, "fromSymbolSize", symbolSize2[0]); symbolSize2[1] && data2.setItemVisual(idx, "toSymbolSize", symbolSize2[1]); } return { dataEach: data.hasItemOption ? dataEach : null }; } }; function install$y(registers) { registers.registerChartView(LinesView); registers.registerSeriesModel(LinesSeriesModel); registers.registerLayout(linesLayout); registers.registerVisual(linesVisual); } var GRADIENT_LEVELS = 256; var HeatmapLayer = ( /** @class */ (function() { function HeatmapLayer2() { this.blurSize = 30; this.pointSize = 20; this.maxOpacity = 1; this.minOpacity = 0; this._gradientPixels = { inRange: null, outOfRange: null }; var canvas = platformApi.createCanvas(); this.canvas = canvas; } HeatmapLayer2.prototype.update = function(data, width, height, normalize2, colorFunc, isInRange) { var brush = this._getBrush(); var gradientInRange = this._getGradient(colorFunc, "inRange"); var gradientOutOfRange = this._getGradient(colorFunc, "outOfRange"); var r = this.pointSize + this.blurSize; var canvas = this.canvas; var ctx = canvas.getContext("2d"); var len2 = data.length; canvas.width = width; canvas.height = height; for (var i = 0; i < len2; ++i) { var p = data[i]; var x = p[0]; var y = p[1]; var value = p[2]; var alpha = normalize2(value); ctx.globalAlpha = alpha; ctx.drawImage(brush, x - r, y - r); } if (!canvas.width || !canvas.height) { return canvas; } var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); var pixels = imageData.data; var offset = 0; var pixelLen = pixels.length; var minOpacity = this.minOpacity; var maxOpacity = this.maxOpacity; var diffOpacity = maxOpacity - minOpacity; while (offset < pixelLen) { var alpha = pixels[offset + 3] / 256; var gradientOffset = Math.floor(alpha * (GRADIENT_LEVELS - 1)) * 4; if (alpha > 0) { var gradient = isInRange(alpha) ? gradientInRange : gradientOutOfRange; alpha > 0 && (alpha = alpha * diffOpacity + minOpacity); pixels[offset++] = gradient[gradientOffset]; pixels[offset++] = gradient[gradientOffset + 1]; pixels[offset++] = gradient[gradientOffset + 2]; pixels[offset++] = gradient[gradientOffset + 3] * alpha * 256; } else { offset += 4; } } ctx.putImageData(imageData, 0, 0); return canvas; }; HeatmapLayer2.prototype._getBrush = function() { var brushCanvas = this._brushCanvas || (this._brushCanvas = platformApi.createCanvas()); var r = this.pointSize + this.blurSize; var d = r * 2; brushCanvas.width = d; brushCanvas.height = d; var ctx = brushCanvas.getContext("2d"); ctx.clearRect(0, 0, d, d); ctx.shadowOffsetX = d; ctx.shadowBlur = this.blurSize; ctx.shadowColor = "#000"; ctx.beginPath(); ctx.arc(-r, r, this.pointSize, 0, Math.PI * 2, true); ctx.closePath(); ctx.fill(); return brushCanvas; }; HeatmapLayer2.prototype._getGradient = function(colorFunc, state) { var gradientPixels = this._gradientPixels; var pixelsSingleState = gradientPixels[state] || (gradientPixels[state] = new Uint8ClampedArray(256 * 4)); var color = [0, 0, 0, 0]; var off = 0; for (var i = 0; i < 256; i++) { colorFunc[state](i / 255, true, color); pixelsSingleState[off++] = color[0]; pixelsSingleState[off++] = color[1]; pixelsSingleState[off++] = color[2]; pixelsSingleState[off++] = color[3]; } return pixelsSingleState; }; return HeatmapLayer2; })() ); function getIsInPiecewiseRange(dataExtent, pieceList, selected) { var dataSpan = dataExtent[1] - dataExtent[0]; pieceList = map$1(pieceList, function(piece) { return { interval: [(piece.interval[0] - dataExtent[0]) / dataSpan, (piece.interval[1] - dataExtent[0]) / dataSpan] }; }); var len2 = pieceList.length; var lastIndex = 0; return function(val) { var i; for (i = lastIndex; i < len2; i++) { var interval = pieceList[i].interval; if (interval[0] <= val && val <= interval[1]) { lastIndex = i; break; } } if (i === len2) { for (i = lastIndex - 1; i >= 0; i--) { var interval = pieceList[i].interval; if (interval[0] <= val && val <= interval[1]) { lastIndex = i; break; } } } return i >= 0 && i < len2 && selected[i]; }; } function getIsInContinuousRange(dataExtent, range) { var dataSpan = dataExtent[1] - dataExtent[0]; range = [(range[0] - dataExtent[0]) / dataSpan, (range[1] - dataExtent[0]) / dataSpan]; return function(val) { return val >= range[0] && val <= range[1]; }; } function isGeoCoordSys(coordSys) { var dimensions = coordSys.dimensions; return dimensions[0] === "lng" && dimensions[1] === "lat"; } var HeatmapView = ( /** @class */ (function(_super) { __extends(HeatmapView2, _super); function HeatmapView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = HeatmapView2.type; return _this; } HeatmapView2.prototype.render = function(seriesModel, ecModel, api) { var visualMapOfThisSeries; ecModel.eachComponent("visualMap", function(visualMap) { visualMap.eachTargetSeries(function(targetSeries) { if (targetSeries === seriesModel) { visualMapOfThisSeries = visualMap; } }); }); this._progressiveEls = null; this.group.removeAll(); var coordSys = seriesModel.coordinateSystem; if (coordSys.type === "cartesian2d" || coordSys.type === "calendar") { this._renderOnCartesianAndCalendar(seriesModel, api, 0, seriesModel.getData().count()); } else if (isGeoCoordSys(coordSys)) { this._renderOnGeo(coordSys, seriesModel, visualMapOfThisSeries, api); } }; HeatmapView2.prototype.incrementalPrepareRender = function(seriesModel, ecModel, api) { this.group.removeAll(); }; HeatmapView2.prototype.incrementalRender = function(params, seriesModel, ecModel, api) { var coordSys = seriesModel.coordinateSystem; if (coordSys) { if (isGeoCoordSys(coordSys)) { this.render(seriesModel, ecModel, api); } else { this._progressiveEls = []; this._renderOnCartesianAndCalendar(seriesModel, api, params.start, params.end, true); } } }; HeatmapView2.prototype.eachRendered = function(cb) { traverseElements(this._progressiveEls || this.group, cb); }; HeatmapView2.prototype._renderOnCartesianAndCalendar = function(seriesModel, api, start, end, incremental) { var coordSys = seriesModel.coordinateSystem; var isCartesian2d = isCoordinateSystemType(coordSys, "cartesian2d"); var width; var height; var xAxisExtent; var yAxisExtent; if (isCartesian2d) { var xAxis = coordSys.getAxis("x"); var yAxis = coordSys.getAxis("y"); width = xAxis.getBandWidth() + 0.5; height = yAxis.getBandWidth() + 0.5; xAxisExtent = xAxis.scale.getExtent(); yAxisExtent = yAxis.scale.getExtent(); } var group = this.group; var data = seriesModel.getData(); var emphasisStyle = seriesModel.getModel(["emphasis", "itemStyle"]).getItemStyle(); var blurStyle = seriesModel.getModel(["blur", "itemStyle"]).getItemStyle(); var selectStyle = seriesModel.getModel(["select", "itemStyle"]).getItemStyle(); var borderRadius = seriesModel.get(["itemStyle", "borderRadius"]); var labelStatesModels = getLabelStatesModels(seriesModel); var emphasisModel = seriesModel.getModel("emphasis"); var focus = emphasisModel.get("focus"); var blurScope = emphasisModel.get("blurScope"); var emphasisDisabled = emphasisModel.get("disabled"); var dataDims = isCartesian2d ? [data.mapDimension("x"), data.mapDimension("y"), data.mapDimension("value")] : [data.mapDimension("time"), data.mapDimension("value")]; for (var idx = start; idx < end; idx++) { var rect = void 0; var style = data.getItemVisual(idx, "style"); if (isCartesian2d) { var dataDimX = data.get(dataDims[0], idx); var dataDimY = data.get(dataDims[1], idx); if (isNaN(data.get(dataDims[2], idx)) || isNaN(dataDimX) || isNaN(dataDimY) || dataDimX < xAxisExtent[0] || dataDimX > xAxisExtent[1] || dataDimY < yAxisExtent[0] || dataDimY > yAxisExtent[1]) { continue; } var point = coordSys.dataToPoint([dataDimX, dataDimY]); rect = new Rect$2({ shape: { x: point[0] - width / 2, y: point[1] - height / 2, width, height }, style }); } else { if (isNaN(data.get(dataDims[1], idx))) { continue; } rect = new Rect$2({ z2: 1, shape: coordSys.dataToRect([data.get(dataDims[0], idx)]).contentShape, style }); } if (data.hasItemOption) { var itemModel = data.getItemModel(idx); var emphasisModel_1 = itemModel.getModel("emphasis"); emphasisStyle = emphasisModel_1.getModel("itemStyle").getItemStyle(); blurStyle = itemModel.getModel(["blur", "itemStyle"]).getItemStyle(); selectStyle = itemModel.getModel(["select", "itemStyle"]).getItemStyle(); borderRadius = itemModel.get(["itemStyle", "borderRadius"]); focus = emphasisModel_1.get("focus"); blurScope = emphasisModel_1.get("blurScope"); emphasisDisabled = emphasisModel_1.get("disabled"); labelStatesModels = getLabelStatesModels(itemModel); } rect.shape.r = borderRadius; var rawValue = seriesModel.getRawValue(idx); var defaultText = "-"; if (rawValue && rawValue[2] != null) { defaultText = rawValue[2] + ""; } setLabelStyle(rect, labelStatesModels, { labelFetcher: seriesModel, labelDataIndex: idx, defaultOpacity: style.opacity, defaultText }); rect.ensureState("emphasis").style = emphasisStyle; rect.ensureState("blur").style = blurStyle; rect.ensureState("select").style = selectStyle; toggleHoverEmphasis(rect, focus, blurScope, emphasisDisabled); rect.incremental = incremental; if (incremental) { rect.states.emphasis.hoverLayer = true; } group.add(rect); data.setItemGraphicEl(idx, rect); if (this._progressiveEls) { this._progressiveEls.push(rect); } } }; HeatmapView2.prototype._renderOnGeo = function(geo, seriesModel, visualMapModel, api) { var inRangeVisuals = visualMapModel.targetVisuals.inRange; var outOfRangeVisuals = visualMapModel.targetVisuals.outOfRange; var data = seriesModel.getData(); var hmLayer = this._hmLayer || this._hmLayer || new HeatmapLayer(); hmLayer.blurSize = seriesModel.get("blurSize"); hmLayer.pointSize = seriesModel.get("pointSize"); hmLayer.minOpacity = seriesModel.get("minOpacity"); hmLayer.maxOpacity = seriesModel.get("maxOpacity"); var rect = geo.getViewRect().clone(); var roamTransform = geo.getRoamTransform(); rect.applyTransform(roamTransform); var x = Math.max(rect.x, 0); var y = Math.max(rect.y, 0); var x2 = Math.min(rect.width + rect.x, api.getWidth()); var y2 = Math.min(rect.height + rect.y, api.getHeight()); var width = x2 - x; var height = y2 - y; var dims = [data.mapDimension("lng"), data.mapDimension("lat"), data.mapDimension("value")]; var points2 = data.mapArray(dims, function(lng, lat, value) { var pt = geo.dataToPoint([lng, lat]); pt[0] -= x; pt[1] -= y; pt.push(value); return pt; }); var dataExtent = visualMapModel.getExtent(); var isInRange = visualMapModel.type === "visualMap.continuous" ? getIsInContinuousRange(dataExtent, visualMapModel.option.range) : getIsInPiecewiseRange(dataExtent, visualMapModel.getPieceList(), visualMapModel.option.selected); hmLayer.update(points2, width, height, inRangeVisuals.color.getNormalizer(), { inRange: inRangeVisuals.color.getColorMapper(), outOfRange: outOfRangeVisuals.color.getColorMapper() }, isInRange); var img = new ZRImage({ style: { width, height, x, y, image: hmLayer.canvas }, silent: true }); this.group.add(img); }; HeatmapView2.type = "heatmap"; return HeatmapView2; })(ChartView) ); var HeatmapSeriesModel = ( /** @class */ (function(_super) { __extends(HeatmapSeriesModel2, _super); function HeatmapSeriesModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = HeatmapSeriesModel2.type; return _this; } HeatmapSeriesModel2.prototype.getInitialData = function(option, ecModel) { return createSeriesData(null, this, { generateCoord: "value" }); }; HeatmapSeriesModel2.prototype.preventIncremental = function() { var coordSysCreator = CoordinateSystemManager.get(this.get("coordinateSystem")); if (coordSysCreator && coordSysCreator.dimensions) { return coordSysCreator.dimensions[0] === "lng" && coordSysCreator.dimensions[1] === "lat"; } }; HeatmapSeriesModel2.type = "series.heatmap"; HeatmapSeriesModel2.dependencies = ["grid", "geo", "calendar"]; HeatmapSeriesModel2.defaultOption = { coordinateSystem: "cartesian2d", // zlevel: 0, z: 2, // Cartesian coordinate system // xAxisIndex: 0, // yAxisIndex: 0, // Geo coordinate system geoIndex: 0, blurSize: 30, pointSize: 20, maxOpacity: 1, minOpacity: 0, select: { itemStyle: { borderColor: "#212121" } } }; return HeatmapSeriesModel2; })(SeriesModel) ); function install$x(registers) { registers.registerChartView(HeatmapView); registers.registerSeriesModel(HeatmapSeriesModel); } var BAR_BORDER_WIDTH_QUERY = ["itemStyle", "borderWidth"]; var LAYOUT_ATTRS = [{ xy: "x", wh: "width", index: 0, posDesc: ["left", "right"] }, { xy: "y", wh: "height", index: 1, posDesc: ["top", "bottom"] }]; var pathForLineWidth = new Circle(); var PictorialBarView = ( /** @class */ (function(_super) { __extends(PictorialBarView2, _super); function PictorialBarView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = PictorialBarView2.type; return _this; } PictorialBarView2.prototype.render = function(seriesModel, ecModel, api) { var group = this.group; var data = seriesModel.getData(); var oldData = this._data; var cartesian = seriesModel.coordinateSystem; var baseAxis = cartesian.getBaseAxis(); var isHorizontal = baseAxis.isHorizontal(); var coordSysRect = cartesian.master.getRect(); var opt = { ecSize: { width: api.getWidth(), height: api.getHeight() }, seriesModel, coordSys: cartesian, coordSysExtent: [[coordSysRect.x, coordSysRect.x + coordSysRect.width], [coordSysRect.y, coordSysRect.y + coordSysRect.height]], isHorizontal, valueDim: LAYOUT_ATTRS[+isHorizontal], categoryDim: LAYOUT_ATTRS[1 - +isHorizontal] }; data.diff(oldData).add(function(dataIndex) { if (!data.hasValue(dataIndex)) { return; } var itemModel = getItemModel(data, dataIndex); var symbolMeta = getSymbolMeta(data, dataIndex, itemModel, opt); var bar = createBar(data, opt, symbolMeta); data.setItemGraphicEl(dataIndex, bar); group.add(bar); updateCommon(bar, opt, symbolMeta); }).update(function(newIndex, oldIndex) { var bar = oldData.getItemGraphicEl(oldIndex); if (!data.hasValue(newIndex)) { group.remove(bar); return; } var itemModel = getItemModel(data, newIndex); var symbolMeta = getSymbolMeta(data, newIndex, itemModel, opt); var pictorialShapeStr = getShapeStr(data, symbolMeta); if (bar && pictorialShapeStr !== bar.__pictorialShapeStr) { group.remove(bar); data.setItemGraphicEl(newIndex, null); bar = null; } if (bar) { updateBar(bar, opt, symbolMeta); } else { bar = createBar(data, opt, symbolMeta, true); } data.setItemGraphicEl(newIndex, bar); bar.__pictorialSymbolMeta = symbolMeta; group.add(bar); updateCommon(bar, opt, symbolMeta); }).remove(function(dataIndex) { var bar = oldData.getItemGraphicEl(dataIndex); bar && removeBar(oldData, dataIndex, bar.__pictorialSymbolMeta.animationModel, bar); }).execute(); var clipPath = seriesModel.get("clip", true) ? createClipPath(seriesModel.coordinateSystem, false, seriesModel) : null; if (clipPath) { group.setClipPath(clipPath); } else { group.removeClipPath(); } this._data = data; return this.group; }; PictorialBarView2.prototype.remove = function(ecModel, api) { var group = this.group; var data = this._data; if (ecModel.get("animation")) { if (data) { data.eachItemGraphicEl(function(bar) { removeBar(data, getECData(bar).dataIndex, ecModel, bar); }); } } else { group.removeAll(); } }; PictorialBarView2.type = "pictorialBar"; return PictorialBarView2; })(ChartView) ); function getSymbolMeta(data, dataIndex, itemModel, opt) { var layout2 = data.getItemLayout(dataIndex); var symbolRepeat = itemModel.get("symbolRepeat"); var symbolClip = itemModel.get("symbolClip"); var symbolPosition = itemModel.get("symbolPosition") || "start"; var symbolRotate = itemModel.get("symbolRotate"); var rotation = (symbolRotate || 0) * Math.PI / 180 || 0; var symbolPatternSize = itemModel.get("symbolPatternSize") || 2; var isAnimationEnabled2 = itemModel.isAnimationEnabled(); var symbolMeta = { dataIndex, layout: layout2, itemModel, symbolType: data.getItemVisual(dataIndex, "symbol") || "circle", style: data.getItemVisual(dataIndex, "style"), symbolClip, symbolRepeat, symbolRepeatDirection: itemModel.get("symbolRepeatDirection"), symbolPatternSize, rotation, animationModel: isAnimationEnabled2 ? itemModel : null, hoverScale: isAnimationEnabled2 && itemModel.get(["emphasis", "scale"]), z2: itemModel.getShallow("z", true) || 0 }; prepareBarLength(itemModel, symbolRepeat, layout2, opt, symbolMeta); prepareSymbolSize(data, dataIndex, layout2, symbolRepeat, symbolClip, symbolMeta.boundingLength, symbolMeta.pxSign, symbolPatternSize, opt, symbolMeta); prepareLineWidth(itemModel, symbolMeta.symbolScale, rotation, opt, symbolMeta); var symbolSize = symbolMeta.symbolSize; var symbolOffset = normalizeSymbolOffset(itemModel.get("symbolOffset"), symbolSize); prepareLayoutInfo(itemModel, symbolSize, layout2, symbolRepeat, symbolClip, symbolOffset, symbolPosition, symbolMeta.valueLineWidth, symbolMeta.boundingLength, symbolMeta.repeatCutLength, opt, symbolMeta); return symbolMeta; } function prepareBarLength(itemModel, symbolRepeat, layout2, opt, outputSymbolMeta) { var valueDim = opt.valueDim; var symbolBoundingData = itemModel.get("symbolBoundingData"); var valueAxis2 = opt.coordSys.getOtherAxis(opt.coordSys.getBaseAxis()); var zeroPx = valueAxis2.toGlobalCoord(valueAxis2.dataToCoord(0)); var pxSignIdx = 1 - +(layout2[valueDim.wh] <= 0); var boundingLength; if (isArray$1(symbolBoundingData)) { var symbolBoundingExtent = [convertToCoordOnAxis(valueAxis2, symbolBoundingData[0]) - zeroPx, convertToCoordOnAxis(valueAxis2, symbolBoundingData[1]) - zeroPx]; symbolBoundingExtent[1] < symbolBoundingExtent[0] && symbolBoundingExtent.reverse(); boundingLength = symbolBoundingExtent[pxSignIdx]; } else if (symbolBoundingData != null) { boundingLength = convertToCoordOnAxis(valueAxis2, symbolBoundingData) - zeroPx; } else if (symbolRepeat) { boundingLength = opt.coordSysExtent[valueDim.index][pxSignIdx] - zeroPx; } else { boundingLength = layout2[valueDim.wh]; } outputSymbolMeta.boundingLength = boundingLength; if (symbolRepeat) { outputSymbolMeta.repeatCutLength = layout2[valueDim.wh]; } var isXAxis = valueDim.xy === "x"; var isInverse = valueAxis2.inverse; outputSymbolMeta.pxSign = isXAxis && !isInverse || !isXAxis && isInverse ? boundingLength >= 0 ? 1 : -1 : boundingLength > 0 ? 1 : -1; } function convertToCoordOnAxis(axis, value) { return axis.toGlobalCoord(axis.dataToCoord(axis.scale.parse(value))); } function prepareSymbolSize(data, dataIndex, layout2, symbolRepeat, symbolClip, boundingLength, pxSign, symbolPatternSize, opt, outputSymbolMeta) { var valueDim = opt.valueDim; var categoryDim = opt.categoryDim; var categorySize = Math.abs(layout2[categoryDim.wh]); var symbolSize = data.getItemVisual(dataIndex, "symbolSize"); var parsedSymbolSize; if (isArray$1(symbolSize)) { parsedSymbolSize = symbolSize.slice(); } else { if (symbolSize == null) { parsedSymbolSize = ["100%", "100%"]; } else { parsedSymbolSize = [symbolSize, symbolSize]; } } parsedSymbolSize[categoryDim.index] = parsePercent(parsedSymbolSize[categoryDim.index], categorySize); parsedSymbolSize[valueDim.index] = parsePercent(parsedSymbolSize[valueDim.index], symbolRepeat ? categorySize : Math.abs(boundingLength)); outputSymbolMeta.symbolSize = parsedSymbolSize; var symbolScale = outputSymbolMeta.symbolScale = [parsedSymbolSize[0] / symbolPatternSize, parsedSymbolSize[1] / symbolPatternSize]; symbolScale[valueDim.index] *= (opt.isHorizontal ? -1 : 1) * pxSign; } function prepareLineWidth(itemModel, symbolScale, rotation, opt, outputSymbolMeta) { var valueLineWidth = itemModel.get(BAR_BORDER_WIDTH_QUERY) || 0; if (valueLineWidth) { pathForLineWidth.attr({ scaleX: symbolScale[0], scaleY: symbolScale[1], rotation }); pathForLineWidth.updateTransform(); valueLineWidth /= pathForLineWidth.getLineScale(); valueLineWidth *= symbolScale[opt.valueDim.index]; } outputSymbolMeta.valueLineWidth = valueLineWidth || 0; } function prepareLayoutInfo(itemModel, symbolSize, layout2, symbolRepeat, symbolClip, symbolOffset, symbolPosition, valueLineWidth, boundingLength, repeatCutLength, opt, outputSymbolMeta) { var categoryDim = opt.categoryDim; var valueDim = opt.valueDim; var pxSign = outputSymbolMeta.pxSign; var unitLength = Math.max(symbolSize[valueDim.index] + valueLineWidth, 0); var pathLen = unitLength; if (symbolRepeat) { var absBoundingLength = Math.abs(boundingLength); var symbolMargin = retrieve(itemModel.get("symbolMargin"), "15%") + ""; var hasEndGap = false; if (symbolMargin.lastIndexOf("!") === symbolMargin.length - 1) { hasEndGap = true; symbolMargin = symbolMargin.slice(0, symbolMargin.length - 1); } var symbolMarginNumeric = parsePercent(symbolMargin, symbolSize[valueDim.index]); var uLenWithMargin = Math.max(unitLength + symbolMarginNumeric * 2, 0); var endFix = hasEndGap ? 0 : symbolMarginNumeric * 2; var repeatSpecified = isNumeric(symbolRepeat); var repeatTimes = repeatSpecified ? symbolRepeat : toIntTimes((absBoundingLength + endFix) / uLenWithMargin); var mDiff = absBoundingLength - repeatTimes * unitLength; symbolMarginNumeric = mDiff / 2 / (hasEndGap ? repeatTimes : Math.max(repeatTimes - 1, 1)); uLenWithMargin = unitLength + symbolMarginNumeric * 2; endFix = hasEndGap ? 0 : symbolMarginNumeric * 2; if (!repeatSpecified && symbolRepeat !== "fixed") { repeatTimes = repeatCutLength ? toIntTimes((Math.abs(repeatCutLength) + endFix) / uLenWithMargin) : 0; } pathLen = repeatTimes * uLenWithMargin - endFix; outputSymbolMeta.repeatTimes = repeatTimes; outputSymbolMeta.symbolMargin = symbolMarginNumeric; } var sizeFix = pxSign * (pathLen / 2); var pathPosition = outputSymbolMeta.pathPosition = []; pathPosition[categoryDim.index] = layout2[categoryDim.wh] / 2; pathPosition[valueDim.index] = symbolPosition === "start" ? sizeFix : symbolPosition === "end" ? boundingLength - sizeFix : boundingLength / 2; if (symbolOffset) { pathPosition[0] += symbolOffset[0]; pathPosition[1] += symbolOffset[1]; } var bundlePosition = outputSymbolMeta.bundlePosition = []; bundlePosition[categoryDim.index] = layout2[categoryDim.xy]; bundlePosition[valueDim.index] = layout2[valueDim.xy]; var barRectShape = outputSymbolMeta.barRectShape = extend({}, layout2); barRectShape[valueDim.wh] = pxSign * Math.max(Math.abs(layout2[valueDim.wh]), Math.abs(pathPosition[valueDim.index] + sizeFix)); barRectShape[categoryDim.wh] = layout2[categoryDim.wh]; var clipShape = outputSymbolMeta.clipShape = {}; clipShape[categoryDim.xy] = -layout2[categoryDim.xy]; clipShape[categoryDim.wh] = opt.ecSize[categoryDim.wh]; clipShape[valueDim.xy] = 0; clipShape[valueDim.wh] = layout2[valueDim.wh]; } function createPath(symbolMeta) { var symbolPatternSize = symbolMeta.symbolPatternSize; var path = createSymbol$1( // Consider texture img, make a big size. symbolMeta.symbolType, -symbolPatternSize / 2, -symbolPatternSize / 2, symbolPatternSize, symbolPatternSize ); path.attr({ culling: true }); path.type !== "image" && path.setStyle({ strokeNoScale: true }); return path; } function createOrUpdateRepeatSymbols(bar, opt, symbolMeta, isUpdate) { var bundle = bar.__pictorialBundle; var symbolSize = symbolMeta.symbolSize; var valueLineWidth = symbolMeta.valueLineWidth; var pathPosition = symbolMeta.pathPosition; var valueDim = opt.valueDim; var repeatTimes = symbolMeta.repeatTimes || 0; var index = 0; var unit = symbolSize[opt.valueDim.index] + valueLineWidth + symbolMeta.symbolMargin * 2; eachPath(bar, function(path2) { path2.__pictorialAnimationIndex = index; path2.__pictorialRepeatTimes = repeatTimes; if (index < repeatTimes) { updateAttr(path2, null, makeTarget(index), symbolMeta, isUpdate); } else { updateAttr(path2, null, { scaleX: 0, scaleY: 0 }, symbolMeta, isUpdate, function() { bundle.remove(path2); }); } index++; }); for (; index < repeatTimes; index++) { var path = createPath(symbolMeta); path.__pictorialAnimationIndex = index; path.__pictorialRepeatTimes = repeatTimes; bundle.add(path); var target = makeTarget(index); updateAttr(path, { x: target.x, y: target.y, scaleX: 0, scaleY: 0 }, { scaleX: target.scaleX, scaleY: target.scaleY, rotation: target.rotation }, symbolMeta, isUpdate); } function makeTarget(index2) { var position2 = pathPosition.slice(); var pxSign = symbolMeta.pxSign; var i = index2; if (symbolMeta.symbolRepeatDirection === "start" ? pxSign > 0 : pxSign < 0) { i = repeatTimes - 1 - index2; } position2[valueDim.index] = unit * (i - repeatTimes / 2 + 0.5) + pathPosition[valueDim.index]; return { x: position2[0], y: position2[1], scaleX: symbolMeta.symbolScale[0], scaleY: symbolMeta.symbolScale[1], rotation: symbolMeta.rotation }; } } function createOrUpdateSingleSymbol(bar, opt, symbolMeta, isUpdate) { var bundle = bar.__pictorialBundle; var mainPath = bar.__pictorialMainPath; if (!mainPath) { mainPath = bar.__pictorialMainPath = createPath(symbolMeta); bundle.add(mainPath); updateAttr(mainPath, { x: symbolMeta.pathPosition[0], y: symbolMeta.pathPosition[1], scaleX: 0, scaleY: 0, rotation: symbolMeta.rotation }, { scaleX: symbolMeta.symbolScale[0], scaleY: symbolMeta.symbolScale[1] }, symbolMeta, isUpdate); } else { updateAttr(mainPath, null, { x: symbolMeta.pathPosition[0], y: symbolMeta.pathPosition[1], scaleX: symbolMeta.symbolScale[0], scaleY: symbolMeta.symbolScale[1], rotation: symbolMeta.rotation }, symbolMeta, isUpdate); } } function createOrUpdateBarRect(bar, symbolMeta, isUpdate) { var rectShape = extend({}, symbolMeta.barRectShape); var barRect = bar.__pictorialBarRect; if (!barRect) { barRect = bar.__pictorialBarRect = new Rect$2({ z2: 2, shape: rectShape, silent: true, style: { stroke: "transparent", fill: "transparent", lineWidth: 0 } }); barRect.disableMorphing = true; bar.add(barRect); } else { updateAttr(barRect, null, { shape: rectShape }, symbolMeta, isUpdate); } } function createOrUpdateClip(bar, opt, symbolMeta, isUpdate) { if (symbolMeta.symbolClip) { var clipPath = bar.__pictorialClipPath; var clipShape = extend({}, symbolMeta.clipShape); var valueDim = opt.valueDim; var animationModel = symbolMeta.animationModel; var dataIndex = symbolMeta.dataIndex; if (clipPath) { updateProps$1(clipPath, { shape: clipShape }, animationModel, dataIndex); } else { clipShape[valueDim.wh] = 0; clipPath = new Rect$2({ shape: clipShape }); bar.__pictorialBundle.setClipPath(clipPath); bar.__pictorialClipPath = clipPath; var target = {}; target[valueDim.wh] = symbolMeta.clipShape[valueDim.wh]; graphic[isUpdate ? "updateProps" : "initProps"](clipPath, { shape: target }, animationModel, dataIndex); } } } function getItemModel(data, dataIndex) { var itemModel = data.getItemModel(dataIndex); itemModel.getAnimationDelayParams = getAnimationDelayParams; itemModel.isAnimationEnabled = isAnimationEnabled; return itemModel; } function getAnimationDelayParams(path) { return { index: path.__pictorialAnimationIndex, count: path.__pictorialRepeatTimes }; } function isAnimationEnabled() { return this.parentModel.isAnimationEnabled() && !!this.getShallow("animation"); } function createBar(data, opt, symbolMeta, isUpdate) { var bar = new Group$3(); var bundle = new Group$3(); bar.add(bundle); bar.__pictorialBundle = bundle; bundle.x = symbolMeta.bundlePosition[0]; bundle.y = symbolMeta.bundlePosition[1]; if (symbolMeta.symbolRepeat) { createOrUpdateRepeatSymbols(bar, opt, symbolMeta); } else { createOrUpdateSingleSymbol(bar, opt, symbolMeta); } createOrUpdateBarRect(bar, symbolMeta, isUpdate); createOrUpdateClip(bar, opt, symbolMeta, isUpdate); bar.__pictorialShapeStr = getShapeStr(data, symbolMeta); bar.__pictorialSymbolMeta = symbolMeta; return bar; } function updateBar(bar, opt, symbolMeta) { var animationModel = symbolMeta.animationModel; var dataIndex = symbolMeta.dataIndex; var bundle = bar.__pictorialBundle; updateProps$1(bundle, { x: symbolMeta.bundlePosition[0], y: symbolMeta.bundlePosition[1] }, animationModel, dataIndex); if (symbolMeta.symbolRepeat) { createOrUpdateRepeatSymbols(bar, opt, symbolMeta, true); } else { createOrUpdateSingleSymbol(bar, opt, symbolMeta, true); } createOrUpdateBarRect(bar, symbolMeta, true); createOrUpdateClip(bar, opt, symbolMeta, true); } function removeBar(data, dataIndex, animationModel, bar) { var labelRect = bar.__pictorialBarRect; labelRect && labelRect.removeTextContent(); var paths = []; eachPath(bar, function(path) { paths.push(path); }); bar.__pictorialMainPath && paths.push(bar.__pictorialMainPath); bar.__pictorialClipPath && (animationModel = null); each$f(paths, function(path) { removeElement(path, { scaleX: 0, scaleY: 0 }, animationModel, dataIndex, function() { bar.parent && bar.parent.remove(bar); }); }); data.setItemGraphicEl(dataIndex, null); } function getShapeStr(data, symbolMeta) { return [data.getItemVisual(symbolMeta.dataIndex, "symbol") || "none", !!symbolMeta.symbolRepeat, !!symbolMeta.symbolClip].join(":"); } function eachPath(bar, cb, context) { each$f(bar.__pictorialBundle.children(), function(el) { el !== bar.__pictorialBarRect && cb.call(context, el); }); } function updateAttr(el, immediateAttrs, animationAttrs, symbolMeta, isUpdate, cb) { immediateAttrs && el.attr(immediateAttrs); if (symbolMeta.symbolClip && !isUpdate) { animationAttrs && el.attr(animationAttrs); } else { animationAttrs && graphic[isUpdate ? "updateProps" : "initProps"](el, animationAttrs, symbolMeta.animationModel, symbolMeta.dataIndex, cb); } } function updateCommon(bar, opt, symbolMeta) { var dataIndex = symbolMeta.dataIndex; var itemModel = symbolMeta.itemModel; var emphasisModel = itemModel.getModel("emphasis"); var emphasisStyle = emphasisModel.getModel("itemStyle").getItemStyle(); var blurStyle = itemModel.getModel(["blur", "itemStyle"]).getItemStyle(); var selectStyle = itemModel.getModel(["select", "itemStyle"]).getItemStyle(); var cursorStyle = itemModel.getShallow("cursor"); var focus = emphasisModel.get("focus"); var blurScope = emphasisModel.get("blurScope"); var hoverScale = emphasisModel.get("scale"); eachPath(bar, function(path) { if (path instanceof ZRImage) { var pathStyle = path.style; path.useStyle(extend({ // TODO other properties like dx, dy ? image: pathStyle.image, x: pathStyle.x, y: pathStyle.y, width: pathStyle.width, height: pathStyle.height }, symbolMeta.style)); } else { path.useStyle(symbolMeta.style); } var emphasisState = path.ensureState("emphasis"); emphasisState.style = emphasisStyle; if (hoverScale) { emphasisState.scaleX = path.scaleX * 1.1; emphasisState.scaleY = path.scaleY * 1.1; } path.ensureState("blur").style = blurStyle; path.ensureState("select").style = selectStyle; cursorStyle && (path.cursor = cursorStyle); path.z2 = symbolMeta.z2; }); var barPositionOutside = opt.valueDim.posDesc[+(symbolMeta.boundingLength > 0)]; var barRect = bar.__pictorialBarRect; barRect.ignoreClip = true; setLabelStyle(barRect, getLabelStatesModels(itemModel), { labelFetcher: opt.seriesModel, labelDataIndex: dataIndex, defaultText: getDefaultLabel(opt.seriesModel.getData(), dataIndex), inheritColor: symbolMeta.style.fill, defaultOpacity: symbolMeta.style.opacity, defaultOutsidePosition: barPositionOutside }); toggleHoverEmphasis(bar, focus, blurScope, emphasisModel.get("disabled")); } function toIntTimes(times) { var roundedTimes = Math.round(times); return Math.abs(times - roundedTimes) < 1e-4 ? roundedTimes : Math.ceil(times); } var PictorialBarSeriesModel = ( /** @class */ (function(_super) { __extends(PictorialBarSeriesModel2, _super); function PictorialBarSeriesModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = PictorialBarSeriesModel2.type; _this.hasSymbolVisual = true; _this.defaultSymbol = "roundRect"; return _this; } PictorialBarSeriesModel2.prototype.getInitialData = function(option) { option.stack = null; return _super.prototype.getInitialData.apply(this, arguments); }; PictorialBarSeriesModel2.type = "series.pictorialBar"; PictorialBarSeriesModel2.dependencies = ["grid"]; PictorialBarSeriesModel2.defaultOption = inheritDefaultOption(BaseBarSeriesModel.defaultOption, { symbol: "circle", symbolSize: null, symbolRotate: null, symbolPosition: null, symbolOffset: null, symbolMargin: null, symbolRepeat: false, symbolRepeatDirection: "end", symbolClip: false, symbolBoundingData: null, symbolPatternSize: 400, barGap: "-100%", // Pictorial bar do not clip by default because in many cases // xAxis and yAxis are not displayed and it's expected not to clip clip: false, // z can be set in data item, which is z2 actually. // Disable progressive progressive: 0, emphasis: { // By default pictorialBar do not hover scale. Hover scale is not suitable // for the case that both has foreground and background. scale: false }, select: { itemStyle: { borderColor: "#212121" } } }); return PictorialBarSeriesModel2; })(BaseBarSeriesModel) ); function install$w(registers) { registers.registerChartView(PictorialBarView); registers.registerSeriesModel(PictorialBarSeriesModel); registers.registerLayout(registers.PRIORITY.VISUAL.LAYOUT, curry$1(layout$3, "pictorialBar")); registers.registerLayout(registers.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT, createProgressiveLayout("pictorialBar")); } var ThemeRiverView = ( /** @class */ (function(_super) { __extends(ThemeRiverView2, _super); function ThemeRiverView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = ThemeRiverView2.type; _this._layers = []; return _this; } ThemeRiverView2.prototype.render = function(seriesModel, ecModel, api) { var data = seriesModel.getData(); var self = this; var group = this.group; var layersSeries = seriesModel.getLayerSeries(); var layoutInfo = data.getLayout("layoutInfo"); var rect = layoutInfo.rect; var boundaryGap = layoutInfo.boundaryGap; group.x = 0; group.y = rect.y + boundaryGap[0]; function keyGetter(item) { return item.name; } var dataDiffer = new DataDiffer(this._layersSeries || [], layersSeries, keyGetter, keyGetter); var newLayersGroups = []; dataDiffer.add(bind$1(process, this, "add")).update(bind$1(process, this, "update")).remove(bind$1(process, this, "remove")).execute(); function process(status, idx, oldIdx) { var oldLayersGroups = self._layers; if (status === "remove") { group.remove(oldLayersGroups[idx]); return; } var points0 = []; var points1 = []; var style; var indices = layersSeries[idx].indices; var j = 0; for (; j < indices.length; j++) { var layout2 = data.getItemLayout(indices[j]); var x = layout2.x; var y0 = layout2.y0; var y = layout2.y; points0.push(x, y0); points1.push(x, y0 + y); style = data.getItemVisual(indices[j], "style"); } var polygon; var textLayout = data.getItemLayout(indices[0]); var labelModel = seriesModel.getModel("label"); var margin = labelModel.get("margin"); var emphasisModel = seriesModel.getModel("emphasis"); if (status === "add") { var layerGroup = newLayersGroups[idx] = new Group$3(); polygon = new ECPolygon({ shape: { points: points0, stackedOnPoints: points1, smooth: 0.4, stackedOnSmooth: 0.4, smoothConstraint: false }, z2: 0 }); layerGroup.add(polygon); group.add(layerGroup); if (seriesModel.isAnimationEnabled()) { polygon.setClipPath(createGridClipShape(polygon.getBoundingRect(), seriesModel, function() { polygon.removeClipPath(); })); } } else { var layerGroup = oldLayersGroups[oldIdx]; polygon = layerGroup.childAt(0); group.add(layerGroup); newLayersGroups[idx] = layerGroup; updateProps$1(polygon, { shape: { points: points0, stackedOnPoints: points1 } }, seriesModel); saveOldStyle(polygon); } setLabelStyle(polygon, getLabelStatesModels(seriesModel), { labelDataIndex: indices[j - 1], defaultText: data.getName(indices[j - 1]), inheritColor: style.fill }, { normal: { verticalAlign: "middle" // align: 'right' } }); polygon.setTextConfig({ position: null, local: true }); var labelEl = polygon.getTextContent(); if (labelEl) { labelEl.x = textLayout.x - margin; labelEl.y = textLayout.y0 + textLayout.y / 2; } polygon.useStyle(style); data.setItemGraphicEl(idx, polygon); setStatesStylesFromModel(polygon, seriesModel); toggleHoverEmphasis(polygon, emphasisModel.get("focus"), emphasisModel.get("blurScope"), emphasisModel.get("disabled")); } this._layersSeries = layersSeries; this._layers = newLayersGroups; }; ThemeRiverView2.type = "themeRiver"; return ThemeRiverView2; })(ChartView) ); function createGridClipShape(rect, seriesModel, cb) { var rectEl = new Rect$2({ shape: { x: rect.x - 10, y: rect.y - 10, width: 0, height: rect.height + 20 } }); initProps(rectEl, { shape: { x: rect.x - 50, width: rect.width + 100, height: rect.height + 20 } }, seriesModel, cb); return rectEl; } var DATA_NAME_INDEX = 2; var ThemeRiverSeriesModel = ( /** @class */ (function(_super) { __extends(ThemeRiverSeriesModel2, _super); function ThemeRiverSeriesModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = ThemeRiverSeriesModel2.type; return _this; } ThemeRiverSeriesModel2.prototype.init = function(option) { _super.prototype.init.apply(this, arguments); this.legendVisualProvider = new LegendVisualProvider(bind$1(this.getData, this), bind$1(this.getRawData, this)); }; ThemeRiverSeriesModel2.prototype.fixData = function(data) { var rawDataLength = data.length; var timeValueKeys = {}; var groupResult = groupData(data, function(item) { if (!timeValueKeys.hasOwnProperty(item[0] + "")) { timeValueKeys[item[0] + ""] = -1; } return item[2]; }); var layerData = []; groupResult.buckets.each(function(items, key) { layerData.push({ name: key, dataList: items }); }); var layerNum = layerData.length; for (var k = 0; k < layerNum; ++k) { var name_1 = layerData[k].name; for (var j = 0; j < layerData[k].dataList.length; ++j) { var timeValue = layerData[k].dataList[j][0] + ""; timeValueKeys[timeValue] = k; } for (var timeValue in timeValueKeys) { if (timeValueKeys.hasOwnProperty(timeValue) && timeValueKeys[timeValue] !== k) { timeValueKeys[timeValue] = k; data[rawDataLength] = [timeValue, 0, name_1]; rawDataLength++; } } } return data; }; ThemeRiverSeriesModel2.prototype.getInitialData = function(option, ecModel) { var singleAxisModel = this.getReferringComponents("singleAxis", SINGLE_REFERRING).models[0]; var axisType = singleAxisModel.get("type"); var filterData = filter(option.data, function(dataItem) { return dataItem[2] !== void 0; }); var data = this.fixData(filterData || []); var nameList = []; var nameMap = this.nameMap = createHashMap(); var count2 = 0; for (var i = 0; i < data.length; ++i) { nameList.push(data[i][DATA_NAME_INDEX]); if (!nameMap.get(data[i][DATA_NAME_INDEX])) { nameMap.set(data[i][DATA_NAME_INDEX], count2); count2++; } } var dimensions = prepareSeriesDataSchema(data, { coordDimensions: ["single"], dimensionsDefine: [{ name: "time", type: getDimensionTypeByAxis(axisType) }, { name: "value", type: "float" }, { name: "name", type: "ordinal" }], encodeDefine: { single: 0, value: 1, itemName: 2 } }).dimensions; var list = new SeriesData(dimensions, this); list.initData(data); return list; }; ThemeRiverSeriesModel2.prototype.getLayerSeries = function() { var data = this.getData(); var lenCount = data.count(); var indexArr = []; for (var i = 0; i < lenCount; ++i) { indexArr[i] = i; } var timeDim = data.mapDimension("single"); var groupResult = groupData(indexArr, function(index) { return data.get("name", index); }); var layerSeries = []; groupResult.buckets.each(function(items, key) { items.sort(function(index1, index2) { return data.get(timeDim, index1) - data.get(timeDim, index2); }); layerSeries.push({ name: key, indices: items }); }); return layerSeries; }; ThemeRiverSeriesModel2.prototype.getAxisTooltipData = function(dim, value, baseAxis) { if (!isArray$1(dim)) { dim = dim ? [dim] : []; } var data = this.getData(); var layerSeries = this.getLayerSeries(); var indices = []; var layerNum = layerSeries.length; var nestestValue; for (var i = 0; i < layerNum; ++i) { var minDist = Number.MAX_VALUE; var nearestIdx = -1; var pointNum = layerSeries[i].indices.length; for (var j = 0; j < pointNum; ++j) { var theValue = data.get(dim[0], layerSeries[i].indices[j]); var dist2 = Math.abs(theValue - value); if (dist2 <= minDist) { nestestValue = theValue; minDist = dist2; nearestIdx = layerSeries[i].indices[j]; } } indices.push(nearestIdx); } return { dataIndices: indices, nestestValue }; }; ThemeRiverSeriesModel2.prototype.formatTooltip = function(dataIndex, multipleSeries, dataType) { var data = this.getData(); var name = data.getName(dataIndex); var value = data.get(data.mapDimension("value"), dataIndex); return createTooltipMarkup("nameValue", { name, value }); }; ThemeRiverSeriesModel2.type = "series.themeRiver"; ThemeRiverSeriesModel2.dependencies = ["singleAxis"]; ThemeRiverSeriesModel2.defaultOption = { // zlevel: 0, z: 2, colorBy: "data", coordinateSystem: "singleAxis", // gap in axis's orthogonal orientation boundaryGap: ["10%", "10%"], // legendHoverLink: true, singleAxisIndex: 0, animationEasing: "linear", label: { margin: 4, show: true, position: "left", fontSize: 11 }, emphasis: { label: { show: true } } }; return ThemeRiverSeriesModel2; })(SeriesModel) ); function themeRiverLayout(ecModel, api) { ecModel.eachSeriesByType("themeRiver", function(seriesModel) { var data = seriesModel.getData(); var single = seriesModel.coordinateSystem; var layoutInfo = {}; var rect = single.getRect(); layoutInfo.rect = rect; var boundaryGap = seriesModel.get("boundaryGap"); var axis = single.getAxis(); layoutInfo.boundaryGap = boundaryGap; if (axis.orient === "horizontal") { boundaryGap[0] = parsePercent(boundaryGap[0], rect.height); boundaryGap[1] = parsePercent(boundaryGap[1], rect.height); var height = rect.height - boundaryGap[0] - boundaryGap[1]; doThemeRiverLayout(data, seriesModel, height); } else { boundaryGap[0] = parsePercent(boundaryGap[0], rect.width); boundaryGap[1] = parsePercent(boundaryGap[1], rect.width); var width = rect.width - boundaryGap[0] - boundaryGap[1]; doThemeRiverLayout(data, seriesModel, width); } data.setLayout("layoutInfo", layoutInfo); }); } function doThemeRiverLayout(data, seriesModel, height) { if (!data.count()) { return; } var coordSys = seriesModel.coordinateSystem; var layerSeries = seriesModel.getLayerSeries(); var timeDim = data.mapDimension("single"); var valueDim = data.mapDimension("value"); var layerPoints = map$1(layerSeries, function(singleLayer) { return map$1(singleLayer.indices, function(idx) { var pt = coordSys.dataToPoint(data.get(timeDim, idx)); pt[1] = data.get(valueDim, idx); return pt; }); }); var base2 = computeBaseline(layerPoints); var baseLine = base2.y0; var ky = height / base2.max; var n = layerSeries.length; var m = layerSeries[0].indices.length; var baseY0; for (var j = 0; j < m; ++j) { baseY0 = baseLine[j] * ky; data.setItemLayout(layerSeries[0].indices[j], { layerIndex: 0, x: layerPoints[0][j][0], y0: baseY0, y: layerPoints[0][j][1] * ky }); for (var i = 1; i < n; ++i) { baseY0 += layerPoints[i - 1][j][1] * ky; data.setItemLayout(layerSeries[i].indices[j], { layerIndex: i, x: layerPoints[i][j][0], y0: baseY0, y: layerPoints[i][j][1] * ky }); } } } function computeBaseline(data) { var layerNum = data.length; var pointNum = data[0].length; var sums = []; var y0 = []; var max2 = 0; for (var i = 0; i < pointNum; ++i) { var temp = 0; for (var j = 0; j < layerNum; ++j) { temp += data[j][i][1]; } if (temp > max2) { max2 = temp; } sums.push(temp); } for (var k = 0; k < pointNum; ++k) { y0[k] = (max2 - sums[k]) / 2; } max2 = 0; for (var l = 0; l < pointNum; ++l) { var sum2 = sums[l] + y0[l]; if (sum2 > max2) { max2 = sum2; } } return { y0, max: max2 }; } function install$v(registers) { registers.registerChartView(ThemeRiverView); registers.registerSeriesModel(ThemeRiverSeriesModel); registers.registerLayout(themeRiverLayout); registers.registerProcessor(dataFilter$1("themeRiver")); } var DEFAULT_SECTOR_Z = 2; var DEFAULT_TEXT_Z = 4; var SunburstPiece = ( /** @class */ (function(_super) { __extends(SunburstPiece2, _super); function SunburstPiece2(node, seriesModel, ecModel, api) { var _this = _super.call(this) || this; _this.z2 = DEFAULT_SECTOR_Z; _this.textConfig = { inside: true }; getECData(_this).seriesIndex = seriesModel.seriesIndex; var text = new ZRText({ z2: DEFAULT_TEXT_Z, silent: node.getModel().get(["label", "silent"]) }); _this.setTextContent(text); _this.updateData(true, node, seriesModel, ecModel, api); return _this; } SunburstPiece2.prototype.updateData = function(firstCreate, node, seriesModel, ecModel, api) { this.node = node; node.piece = this; seriesModel = seriesModel || this._seriesModel; ecModel = ecModel || this._ecModel; var sector = this; getECData(sector).dataIndex = node.dataIndex; var itemModel = node.getModel(); var emphasisModel = itemModel.getModel("emphasis"); var layout2 = node.getLayout(); var sectorShape = extend({}, layout2); sectorShape.label = null; var normalStyle = node.getVisual("style"); normalStyle.lineJoin = "bevel"; var decal = node.getVisual("decal"); if (decal) { normalStyle.decal = createOrUpdatePatternFromDecal(decal, api); } var cornerRadius = getSectorCornerRadius(itemModel.getModel("itemStyle"), sectorShape, true); extend(sectorShape, cornerRadius); each$f(SPECIAL_STATES, function(stateName) { var state = sector.ensureState(stateName); var itemStyleModel = itemModel.getModel([stateName, "itemStyle"]); state.style = itemStyleModel.getItemStyle(); var cornerRadius2 = getSectorCornerRadius(itemStyleModel, sectorShape); if (cornerRadius2) { state.shape = cornerRadius2; } }); if (firstCreate) { sector.setShape(sectorShape); sector.shape.r = layout2.r0; initProps(sector, { shape: { r: layout2.r } }, seriesModel, node.dataIndex); } else { updateProps$1(sector, { shape: sectorShape }, seriesModel); saveOldStyle(sector); } sector.useStyle(normalStyle); this._updateLabel(seriesModel); var cursorStyle = itemModel.getShallow("cursor"); cursorStyle && sector.attr("cursor", cursorStyle); this._seriesModel = seriesModel || this._seriesModel; this._ecModel = ecModel || this._ecModel; var focus = emphasisModel.get("focus"); var focusOrIndices = focus === "relative" ? concatArray(node.getAncestorsIndices(), node.getDescendantIndices()) : focus === "ancestor" ? node.getAncestorsIndices() : focus === "descendant" ? node.getDescendantIndices() : focus; toggleHoverEmphasis(this, focusOrIndices, emphasisModel.get("blurScope"), emphasisModel.get("disabled")); }; SunburstPiece2.prototype._updateLabel = function(seriesModel) { var _this = this; var itemModel = this.node.getModel(); var normalLabelModel = itemModel.getModel("label"); var layout2 = this.node.getLayout(); var angle = layout2.endAngle - layout2.startAngle; var midAngle = (layout2.startAngle + layout2.endAngle) / 2; var dx = Math.cos(midAngle); var dy = Math.sin(midAngle); var sector = this; var label = sector.getTextContent(); var dataIndex = this.node.dataIndex; var labelMinAngle = normalLabelModel.get("minAngle") / 180 * Math.PI; var isNormalShown = normalLabelModel.get("show") && !(labelMinAngle != null && Math.abs(angle) < labelMinAngle); label.ignore = !isNormalShown; each$f(DISPLAY_STATES, function(stateName) { var labelStateModel = stateName === "normal" ? itemModel.getModel("label") : itemModel.getModel([stateName, "label"]); var isNormal = stateName === "normal"; var state = isNormal ? label : label.ensureState(stateName); var text = seriesModel.getFormattedLabel(dataIndex, stateName); if (isNormal) { text = text || _this.node.name; } state.style = createTextStyle(labelStateModel, {}, null, stateName !== "normal", true); if (text) { state.style.text = text; } var isShown = labelStateModel.get("show"); if (isShown != null && !isNormal) { state.ignore = !isShown; } var labelPosition = getLabelAttr(labelStateModel, "position"); var sectorState = isNormal ? sector : sector.states[stateName]; var labelColor = sectorState.style.fill; sectorState.textConfig = { outsideFill: labelStateModel.get("color") === "inherit" ? labelColor : null, inside: labelPosition !== "outside" }; var r; var labelPadding = getLabelAttr(labelStateModel, "distance") || 0; var textAlign = getLabelAttr(labelStateModel, "align"); var rotateType = getLabelAttr(labelStateModel, "rotate"); var flipStartAngle = Math.PI * 0.5; var flipEndAngle = Math.PI * 1.5; var midAngleNormal = normalizeRadian(rotateType === "tangential" ? Math.PI / 2 - midAngle : midAngle); var needsFlip = midAngleNormal > flipStartAngle && !isRadianAroundZero(midAngleNormal - flipStartAngle) && midAngleNormal < flipEndAngle; if (labelPosition === "outside") { r = layout2.r + labelPadding; textAlign = needsFlip ? "right" : "left"; } else { if (!textAlign || textAlign === "center") { if (angle === 2 * Math.PI && layout2.r0 === 0) { r = 0; } else { r = (layout2.r + layout2.r0) / 2; } textAlign = "center"; } else if (textAlign === "left") { r = layout2.r0 + labelPadding; textAlign = needsFlip ? "right" : "left"; } else if (textAlign === "right") { r = layout2.r - labelPadding; textAlign = needsFlip ? "left" : "right"; } } state.style.align = textAlign; state.style.verticalAlign = getLabelAttr(labelStateModel, "verticalAlign") || "middle"; state.x = r * dx + layout2.cx; state.y = r * dy + layout2.cy; var rotate2 = 0; if (rotateType === "radial") { rotate2 = normalizeRadian(-midAngle) + (needsFlip ? Math.PI : 0); } else if (rotateType === "tangential") { rotate2 = normalizeRadian(Math.PI / 2 - midAngle) + (needsFlip ? Math.PI : 0); } else if (isNumber(rotateType)) { rotate2 = rotateType * Math.PI / 180; } state.rotation = normalizeRadian(rotate2); }); function getLabelAttr(model, name) { var stateAttr = model.get(name); if (stateAttr == null) { return normalLabelModel.get(name); } return stateAttr; } label.dirtyStyle(); }; return SunburstPiece2; })(Sector) ); var ROOT_TO_NODE_ACTION = "sunburstRootToNode"; var HIGHLIGHT_ACTION = "sunburstHighlight"; var UNHIGHLIGHT_ACTION = "sunburstUnhighlight"; function installSunburstAction(registers) { registers.registerAction({ type: ROOT_TO_NODE_ACTION, update: "updateView" }, function(payload, ecModel) { ecModel.eachComponent({ mainType: "series", subType: "sunburst", query: payload }, handleRootToNode); function handleRootToNode(model, index) { var targetInfo = retrieveTargetInfo(payload, [ROOT_TO_NODE_ACTION], model); if (targetInfo) { var originViewRoot = model.getViewRoot(); if (originViewRoot) { payload.direction = aboveViewRoot(originViewRoot, targetInfo.node) ? "rollUp" : "drillDown"; } model.resetViewRoot(targetInfo.node); } } }); registers.registerAction({ type: HIGHLIGHT_ACTION, update: "none" }, function(payload, ecModel, api) { payload = extend({}, payload); ecModel.eachComponent({ mainType: "series", subType: "sunburst", query: payload }, handleHighlight); function handleHighlight(model) { var targetInfo = retrieveTargetInfo(payload, [HIGHLIGHT_ACTION], model); if (targetInfo) { payload.dataIndex = targetInfo.node.dataIndex; } } api.dispatchAction(extend(payload, { type: "highlight" })); }); registers.registerAction({ type: UNHIGHLIGHT_ACTION, update: "updateView" }, function(payload, ecModel, api) { payload = extend({}, payload); api.dispatchAction(extend(payload, { type: "downplay" })); }); } var SunburstView = ( /** @class */ (function(_super) { __extends(SunburstView2, _super); function SunburstView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = SunburstView2.type; return _this; } SunburstView2.prototype.render = function(seriesModel, ecModel, api, payload) { var self = this; this.seriesModel = seriesModel; this.api = api; this.ecModel = ecModel; var data = seriesModel.getData(); var virtualRoot = data.tree.root; var newRoot = seriesModel.getViewRoot(); var group = this.group; var renderLabelForZeroData = seriesModel.get("renderLabelForZeroData"); var newChildren = []; newRoot.eachNode(function(node) { newChildren.push(node); }); var oldChildren = this._oldChildren || []; dualTravel(newChildren, oldChildren); renderRollUp(virtualRoot, newRoot); this._initEvents(); this._oldChildren = newChildren; function dualTravel(newChildren2, oldChildren2) { if (newChildren2.length === 0 && oldChildren2.length === 0) { return; } new DataDiffer(oldChildren2, newChildren2, getKey2, getKey2).add(processNode).update(processNode).remove(curry$1(processNode, null)).execute(); function getKey2(node) { return node.getId(); } function processNode(newIdx, oldIdx) { var newNode = newIdx == null ? null : newChildren2[newIdx]; var oldNode = oldIdx == null ? null : oldChildren2[oldIdx]; doRenderNode(newNode, oldNode); } } function doRenderNode(newNode, oldNode) { if (!renderLabelForZeroData && newNode && !newNode.getValue()) { newNode = null; } if (newNode !== virtualRoot && oldNode !== virtualRoot) { if (oldNode && oldNode.piece) { if (newNode) { oldNode.piece.updateData(false, newNode, seriesModel, ecModel, api); data.setItemGraphicEl(newNode.dataIndex, oldNode.piece); } else { removeNode2(oldNode); } } else if (newNode) { var piece = new SunburstPiece(newNode, seriesModel, ecModel, api); group.add(piece); data.setItemGraphicEl(newNode.dataIndex, piece); } } } function removeNode2(node) { if (!node) { return; } if (node.piece) { group.remove(node.piece); node.piece = null; } } function renderRollUp(virtualRoot2, viewRoot) { if (viewRoot.depth > 0) { if (self.virtualPiece) { self.virtualPiece.updateData(false, virtualRoot2, seriesModel, ecModel, api); } else { self.virtualPiece = new SunburstPiece(virtualRoot2, seriesModel, ecModel, api); group.add(self.virtualPiece); } viewRoot.piece.off("click"); self.virtualPiece.on("click", function(e) { self._rootToNode(viewRoot.parentNode); }); } else if (self.virtualPiece) { group.remove(self.virtualPiece); self.virtualPiece = null; } } }; SunburstView2.prototype._initEvents = function() { var _this = this; this.group.off("click"); this.group.on("click", function(e) { var targetFound = false; var viewRoot = _this.seriesModel.getViewRoot(); viewRoot.eachNode(function(node) { if (!targetFound && node.piece && node.piece === e.target) { var nodeClick = node.getModel().get("nodeClick"); if (nodeClick === "rootToNode") { _this._rootToNode(node); } else if (nodeClick === "link") { var itemModel = node.getModel(); var link = itemModel.get("link"); if (link) { var linkTarget = itemModel.get("target", true) || "_blank"; windowOpen(link, linkTarget); } } targetFound = true; } }); }); }; SunburstView2.prototype._rootToNode = function(node) { if (node !== this.seriesModel.getViewRoot()) { this.api.dispatchAction({ type: ROOT_TO_NODE_ACTION, from: this.uid, seriesId: this.seriesModel.id, targetNode: node }); } }; SunburstView2.prototype.containPoint = function(point, seriesModel) { var treeRoot = seriesModel.getData(); var itemLayout = treeRoot.getItemLayout(0); if (itemLayout) { var dx = point[0] - itemLayout.cx; var dy = point[1] - itemLayout.cy; var radius = Math.sqrt(dx * dx + dy * dy); return radius <= itemLayout.r && radius >= itemLayout.r0; } }; SunburstView2.type = "sunburst"; return SunburstView2; })(ChartView) ); var SunburstSeriesModel = ( /** @class */ (function(_super) { __extends(SunburstSeriesModel2, _super); function SunburstSeriesModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = SunburstSeriesModel2.type; _this.ignoreStyleOnData = true; return _this; } SunburstSeriesModel2.prototype.getInitialData = function(option, ecModel) { var root = { name: option.name, children: option.data }; completeTreeValue(root); var levelModels = this._levelModels = map$1(option.levels || [], function(levelDefine) { return new Model(levelDefine, this, ecModel); }, this); var tree = Tree.createTree(root, this, beforeLink); function beforeLink(nodeData) { nodeData.wrapMethod("getItemModel", function(model, idx) { var node = tree.getNodeByDataIndex(idx); var levelModel = levelModels[node.depth]; levelModel && (model.parentModel = levelModel); return model; }); } return tree.data; }; SunburstSeriesModel2.prototype.optionUpdated = function() { this.resetViewRoot(); }; SunburstSeriesModel2.prototype.getDataParams = function(dataIndex) { var params = _super.prototype.getDataParams.apply(this, arguments); var node = this.getData().tree.getNodeByDataIndex(dataIndex); params.treePathInfo = wrapTreePathInfo(node, this); return params; }; SunburstSeriesModel2.prototype.getLevelModel = function(node) { return this._levelModels && this._levelModels[node.depth]; }; SunburstSeriesModel2.prototype.getViewRoot = function() { return this._viewRoot; }; SunburstSeriesModel2.prototype.resetViewRoot = function(viewRoot) { viewRoot ? this._viewRoot = viewRoot : viewRoot = this._viewRoot; var root = this.getRawData().tree.root; if (!viewRoot || viewRoot !== root && !root.contains(viewRoot)) { this._viewRoot = root; } }; SunburstSeriesModel2.prototype.enableAriaDecal = function() { enableAriaDecalForTree(this); }; SunburstSeriesModel2.type = "series.sunburst"; SunburstSeriesModel2.defaultOption = { // zlevel: 0, z: 2, // 默认全局居中 center: ["50%", "50%"], radius: [0, "75%"], // 默认顺时针 clockwise: true, startAngle: 90, // 最小角度改为0 minAngle: 0, // If still show when all data zero. stillShowZeroSum: true, // 'rootToNode', 'link', or false nodeClick: "rootToNode", renderLabelForZeroData: false, label: { // could be: 'radial', 'tangential', or 'none' rotate: "radial", show: true, opacity: 1, // 'left' is for inner side of inside, and 'right' is for outer // side for inside align: "center", position: "inside", distance: 5, silent: true }, itemStyle: { borderWidth: 1, borderColor: "white", borderType: "solid", shadowBlur: 0, shadowColor: "rgba(0, 0, 0, 0.2)", shadowOffsetX: 0, shadowOffsetY: 0, opacity: 1 }, emphasis: { focus: "descendant" }, blur: { itemStyle: { opacity: 0.2 }, label: { opacity: 0.1 } }, // Animation type can be expansion, scale. animationType: "expansion", animationDuration: 1e3, animationDurationUpdate: 500, data: [], /** * Sort order. * * Valid values: 'desc', 'asc', null, or callback function. * 'desc' and 'asc' for descend and ascendant order; * null for not sorting; * example of callback function: * function(nodeA, nodeB) { * return nodeA.getValue() - nodeB.getValue(); * } */ sort: "desc" }; return SunburstSeriesModel2; })(SeriesModel) ); function completeTreeValue(dataNode) { var sum2 = 0; each$f(dataNode.children, function(child) { completeTreeValue(child); var childValue = child.value; isArray$1(childValue) && (childValue = childValue[0]); sum2 += childValue; }); var thisValue = dataNode.value; if (isArray$1(thisValue)) { thisValue = thisValue[0]; } if (thisValue == null || isNaN(thisValue)) { thisValue = sum2; } if (thisValue < 0) { thisValue = 0; } isArray$1(dataNode.value) ? dataNode.value[0] = thisValue : dataNode.value = thisValue; } var RADIAN = Math.PI / 180; function sunburstLayout(seriesType2, ecModel, api) { ecModel.eachSeriesByType(seriesType2, function(seriesModel) { var center2 = seriesModel.get("center"); var radius = seriesModel.get("radius"); if (!isArray$1(radius)) { radius = [0, radius]; } if (!isArray$1(center2)) { center2 = [center2, center2]; } var width = api.getWidth(); var height = api.getHeight(); var size = Math.min(width, height); var cx = parsePercent(center2[0], width); var cy = parsePercent(center2[1], height); var r0 = parsePercent(radius[0], size / 2); var r = parsePercent(radius[1], size / 2); var startAngle = -seriesModel.get("startAngle") * RADIAN; var minAngle = seriesModel.get("minAngle") * RADIAN; var virtualRoot = seriesModel.getData().tree.root; var treeRoot = seriesModel.getViewRoot(); var rootDepth = treeRoot.depth; var sort2 = seriesModel.get("sort"); if (sort2 != null) { initChildren(treeRoot, sort2); } var validDataCount = 0; each$f(treeRoot.children, function(child) { !isNaN(child.getValue()) && validDataCount++; }); var sum2 = treeRoot.getValue(); var unitRadian = Math.PI / (sum2 || validDataCount) * 2; var renderRollupNode = treeRoot.depth > 0; var levels = treeRoot.height - (renderRollupNode ? -1 : 1); var rPerLevel = (r - r0) / (levels || 1); var clockwise = seriesModel.get("clockwise"); var stillShowZeroSum = seriesModel.get("stillShowZeroSum"); var dir3 = clockwise ? 1 : -1; var renderNode2 = function(node, startAngle2) { if (!node) { return; } var endAngle = startAngle2; if (node !== virtualRoot) { var value = node.getValue(); var angle2 = sum2 === 0 && stillShowZeroSum ? unitRadian : value * unitRadian; if (angle2 < minAngle) { angle2 = minAngle; } endAngle = startAngle2 + dir3 * angle2; var depth = node.depth - rootDepth - (renderRollupNode ? -1 : 1); var rStart2 = r0 + rPerLevel * depth; var rEnd2 = r0 + rPerLevel * (depth + 1); var levelModel = seriesModel.getLevelModel(node); if (levelModel) { var r0_1 = levelModel.get("r0", true); var r_1 = levelModel.get("r", true); var radius_1 = levelModel.get("radius", true); if (radius_1 != null) { r0_1 = radius_1[0]; r_1 = radius_1[1]; } r0_1 != null && (rStart2 = parsePercent(r0_1, size / 2)); r_1 != null && (rEnd2 = parsePercent(r_1, size / 2)); } node.setLayout({ angle: angle2, startAngle: startAngle2, endAngle, clockwise, cx, cy, r0: rStart2, r: rEnd2 }); } if (node.children && node.children.length) { var siblingAngle_1 = 0; each$f(node.children, function(node2) { siblingAngle_1 += renderNode2(node2, startAngle2 + siblingAngle_1); }); } return endAngle - startAngle2; }; if (renderRollupNode) { var rStart = r0; var rEnd = r0 + rPerLevel; var angle = Math.PI * 2; virtualRoot.setLayout({ angle, startAngle, endAngle: startAngle + angle, clockwise, cx, cy, r0: rStart, r: rEnd }); } renderNode2(treeRoot, startAngle); }); } function initChildren(node, sortOrder) { var children = node.children || []; node.children = sort(children, sortOrder); if (children.length) { each$f(node.children, function(child) { initChildren(child, sortOrder); }); } } function sort(children, sortOrder) { if (isFunction(sortOrder)) { var sortTargets = map$1(children, function(child, idx) { var value = child.getValue(); return { params: { depth: child.depth, height: child.height, dataIndex: child.dataIndex, getValue: function() { return value; } }, index: idx }; }); sortTargets.sort(function(a, b) { return sortOrder(a.params, b.params); }); return map$1(sortTargets, function(target) { return children[target.index]; }); } else { var isAsc_1 = sortOrder === "asc"; return children.sort(function(a, b) { var diff = (a.getValue() - b.getValue()) * (isAsc_1 ? 1 : -1); return diff === 0 ? (a.dataIndex - b.dataIndex) * (isAsc_1 ? -1 : 1) : diff; }); } } function sunburstVisual(ecModel) { var paletteScope = {}; function pickColor(node, seriesModel, treeHeight) { var current = node; while (current && current.depth > 1) { current = current.parentNode; } var color = seriesModel.getColorFromPalette(current.name || current.dataIndex + "", paletteScope); if (node.depth > 1 && isString(color)) { color = lift(color, (node.depth - 1) / (treeHeight - 1) * 0.5); } return color; } ecModel.eachSeriesByType("sunburst", function(seriesModel) { var data = seriesModel.getData(); var tree = data.tree; tree.eachNode(function(node) { var model = node.getModel(); var style = model.getModel("itemStyle").getItemStyle(); if (!style.fill) { style.fill = pickColor(node, seriesModel, tree.root.height); } var existsStyle = data.ensureUniqueItemVisual(node.dataIndex, "style"); extend(existsStyle, style); }); }); } function install$u(registers) { registers.registerChartView(SunburstView); registers.registerSeriesModel(SunburstSeriesModel); registers.registerLayout(curry$1(sunburstLayout, "sunburst")); registers.registerProcessor(curry$1(dataFilter$1, "sunburst")); registers.registerVisual(sunburstVisual); installSunburstAction(registers); } var STYLE_VISUAL_TYPE = { color: "fill", borderColor: "stroke" }; var NON_STYLE_VISUAL_PROPS = { symbol: 1, symbolSize: 1, symbolKeepAspect: 1, legendIcon: 1, visualMeta: 1, liftZ: 1, decal: 1 }; var customInnerStore = makeInner(); var CustomSeriesModel = ( /** @class */ (function(_super) { __extends(CustomSeriesModel2, _super); function CustomSeriesModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = CustomSeriesModel2.type; return _this; } CustomSeriesModel2.prototype.optionUpdated = function() { this.currentZLevel = this.get("zlevel", true); this.currentZ = this.get("z", true); }; CustomSeriesModel2.prototype.getInitialData = function(option, ecModel) { return createSeriesData(null, this); }; CustomSeriesModel2.prototype.getDataParams = function(dataIndex, dataType, el) { var params = _super.prototype.getDataParams.call(this, dataIndex, dataType); el && (params.info = customInnerStore(el).info); return params; }; CustomSeriesModel2.type = "series.custom"; CustomSeriesModel2.dependencies = ["grid", "polar", "geo", "singleAxis", "calendar"]; CustomSeriesModel2.defaultOption = { coordinateSystem: "cartesian2d", // zlevel: 0, z: 2, legendHoverLink: true, // Custom series will not clip by default. // Some case will use custom series to draw label // For example https://echarts.apache.org/examples/en/editor.html?c=custom-gantt-flight clip: false // Cartesian coordinate system // xAxisIndex: 0, // yAxisIndex: 0, // Polar coordinate system // polarIndex: 0, // Geo coordinate system // geoIndex: 0, }; return CustomSeriesModel2; })(SeriesModel) ); function dataToCoordSize$3(dataSize, dataItem) { dataItem = dataItem || [0, 0]; return map$1(["x", "y"], function(dim, dimIdx) { var axis = this.getAxis(dim); var val = dataItem[dimIdx]; var halfSize = dataSize[dimIdx] / 2; return axis.type === "category" ? axis.getBandWidth() : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize)); }, this); } function cartesianPrepareCustom(coordSys) { var rect = coordSys.master.getRect(); return { coordSys: { // The name exposed to user is always 'cartesian2d' but not 'grid'. type: "cartesian2d", x: rect.x, y: rect.y, width: rect.width, height: rect.height }, api: { coord: function(data) { return coordSys.dataToPoint(data); }, size: bind$1(dataToCoordSize$3, coordSys) } }; } function dataToCoordSize$2(dataSize, dataItem) { dataItem = dataItem || [0, 0]; return map$1([0, 1], function(dimIdx) { var val = dataItem[dimIdx]; var halfSize = dataSize[dimIdx] / 2; var p1 = []; var p2 = []; p1[dimIdx] = val - halfSize; p2[dimIdx] = val + halfSize; p1[1 - dimIdx] = p2[1 - dimIdx] = dataItem[1 - dimIdx]; return Math.abs(this.dataToPoint(p1)[dimIdx] - this.dataToPoint(p2)[dimIdx]); }, this); } function geoPrepareCustom(coordSys) { var rect = coordSys.getBoundingRect(); return { coordSys: { type: "geo", x: rect.x, y: rect.y, width: rect.width, height: rect.height, zoom: coordSys.getZoom() }, api: { coord: function(data) { return coordSys.dataToPoint(data); }, size: bind$1(dataToCoordSize$2, coordSys) } }; } function dataToCoordSize$1(dataSize, dataItem) { var axis = this.getAxis(); var val = dataItem instanceof Array ? dataItem[0] : dataItem; var halfSize = (dataSize instanceof Array ? dataSize[0] : dataSize) / 2; return axis.type === "category" ? axis.getBandWidth() : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize)); } function singlePrepareCustom(coordSys) { var rect = coordSys.getRect(); return { coordSys: { type: "singleAxis", x: rect.x, y: rect.y, width: rect.width, height: rect.height }, api: { coord: function(val) { return coordSys.dataToPoint(val); }, size: bind$1(dataToCoordSize$1, coordSys) } }; } function dataToCoordSize(dataSize, dataItem) { dataItem = dataItem || [0, 0]; return map$1(["Radius", "Angle"], function(dim, dimIdx) { var getterName = "get" + dim + "Axis"; var axis = this[getterName](); var val = dataItem[dimIdx]; var halfSize = dataSize[dimIdx] / 2; var result = axis.type === "category" ? axis.getBandWidth() : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize)); if (dim === "Angle") { result = result * Math.PI / 180; } return result; }, this); } function polarPrepareCustom(coordSys) { var radiusAxis = coordSys.getRadiusAxis(); var angleAxis = coordSys.getAngleAxis(); var radius = radiusAxis.getExtent(); radius[0] > radius[1] && radius.reverse(); return { coordSys: { type: "polar", cx: coordSys.cx, cy: coordSys.cy, r: radius[1], r0: radius[0] }, api: { coord: function(data) { var radius2 = radiusAxis.dataToRadius(data[0]); var angle = angleAxis.dataToAngle(data[1]); var coord = coordSys.coordToPoint([radius2, angle]); coord.push(radius2, angle * Math.PI / 180); return coord; }, size: bind$1(dataToCoordSize, coordSys) } }; } function calendarPrepareCustom(coordSys) { var rect = coordSys.getRect(); var rangeInfo = coordSys.getRangeInfo(); return { coordSys: { type: "calendar", x: rect.x, y: rect.y, width: rect.width, height: rect.height, cellWidth: coordSys.getCellWidth(), cellHeight: coordSys.getCellHeight(), rangeInfo: { start: rangeInfo.start, end: rangeInfo.end, weeks: rangeInfo.weeks, dayCount: rangeInfo.allDay } }, api: { coord: function(data, clamp2) { return coordSys.dataToPoint(data, clamp2); } } }; } function isEC4CompatibleStyle(style, elType, hasOwnTextContentOption, hasOwnTextConfig) { return style && (style.legacy || style.legacy !== false && !hasOwnTextContentOption && !hasOwnTextConfig && elType !== "tspan" && (elType === "text" || hasOwn(style, "text"))); } function convertFromEC4CompatibleStyle(hostStyle, elType, isNormal) { var srcStyle = hostStyle; var textConfig; var textContent; var textContentStyle; if (elType === "text") { textContentStyle = srcStyle; } else { textContentStyle = {}; hasOwn(srcStyle, "text") && (textContentStyle.text = srcStyle.text); hasOwn(srcStyle, "rich") && (textContentStyle.rich = srcStyle.rich); hasOwn(srcStyle, "textFill") && (textContentStyle.fill = srcStyle.textFill); hasOwn(srcStyle, "textStroke") && (textContentStyle.stroke = srcStyle.textStroke); hasOwn(srcStyle, "fontFamily") && (textContentStyle.fontFamily = srcStyle.fontFamily); hasOwn(srcStyle, "fontSize") && (textContentStyle.fontSize = srcStyle.fontSize); hasOwn(srcStyle, "fontStyle") && (textContentStyle.fontStyle = srcStyle.fontStyle); hasOwn(srcStyle, "fontWeight") && (textContentStyle.fontWeight = srcStyle.fontWeight); textContent = { type: "text", style: textContentStyle, // ec4 does not support rectText trigger. // And when text position is different in normal and emphasis // => hover text trigger emphasis; // => text position changed, leave mouse pointer immediately; // That might cause incorrect state. silent: true }; textConfig = {}; var hasOwnPos = hasOwn(srcStyle, "textPosition"); if (isNormal) { textConfig.position = hasOwnPos ? srcStyle.textPosition : "inside"; } else { hasOwnPos && (textConfig.position = srcStyle.textPosition); } hasOwn(srcStyle, "textPosition") && (textConfig.position = srcStyle.textPosition); hasOwn(srcStyle, "textOffset") && (textConfig.offset = srcStyle.textOffset); hasOwn(srcStyle, "textRotation") && (textConfig.rotation = srcStyle.textRotation); hasOwn(srcStyle, "textDistance") && (textConfig.distance = srcStyle.textDistance); } convertEC4CompatibleRichItem(textContentStyle, hostStyle); each$f(textContentStyle.rich, function(richItem) { convertEC4CompatibleRichItem(richItem, richItem); }); return { textConfig, textContent }; } function convertEC4CompatibleRichItem(out, richItem) { if (!richItem) { return; } richItem.font = richItem.textFont || richItem.font; hasOwn(richItem, "textStrokeWidth") && (out.lineWidth = richItem.textStrokeWidth); hasOwn(richItem, "textAlign") && (out.align = richItem.textAlign); hasOwn(richItem, "textVerticalAlign") && (out.verticalAlign = richItem.textVerticalAlign); hasOwn(richItem, "textLineHeight") && (out.lineHeight = richItem.textLineHeight); hasOwn(richItem, "textWidth") && (out.width = richItem.textWidth); hasOwn(richItem, "textHeight") && (out.height = richItem.textHeight); hasOwn(richItem, "textBackgroundColor") && (out.backgroundColor = richItem.textBackgroundColor); hasOwn(richItem, "textPadding") && (out.padding = richItem.textPadding); hasOwn(richItem, "textBorderColor") && (out.borderColor = richItem.textBorderColor); hasOwn(richItem, "textBorderWidth") && (out.borderWidth = richItem.textBorderWidth); hasOwn(richItem, "textBorderRadius") && (out.borderRadius = richItem.textBorderRadius); hasOwn(richItem, "textBoxShadowColor") && (out.shadowColor = richItem.textBoxShadowColor); hasOwn(richItem, "textBoxShadowBlur") && (out.shadowBlur = richItem.textBoxShadowBlur); hasOwn(richItem, "textBoxShadowOffsetX") && (out.shadowOffsetX = richItem.textBoxShadowOffsetX); hasOwn(richItem, "textBoxShadowOffsetY") && (out.shadowOffsetY = richItem.textBoxShadowOffsetY); } function convertToEC4StyleForCustomSerise(itemStl, txStl, txCfg) { var out = itemStl; out.textPosition = out.textPosition || txCfg.position || "inside"; txCfg.offset != null && (out.textOffset = txCfg.offset); txCfg.rotation != null && (out.textRotation = txCfg.rotation); txCfg.distance != null && (out.textDistance = txCfg.distance); var isInside = out.textPosition.indexOf("inside") >= 0; var hostFill = itemStl.fill || "#000"; convertToEC4RichItem(out, txStl); var textFillNotSet = out.textFill == null; if (isInside) { if (textFillNotSet) { out.textFill = txCfg.insideFill || "#fff"; !out.textStroke && txCfg.insideStroke && (out.textStroke = txCfg.insideStroke); !out.textStroke && (out.textStroke = hostFill); out.textStrokeWidth == null && (out.textStrokeWidth = 2); } } else { if (textFillNotSet) { out.textFill = itemStl.fill || txCfg.outsideFill || "#000"; } !out.textStroke && txCfg.outsideStroke && (out.textStroke = txCfg.outsideStroke); } out.text = txStl.text; out.rich = txStl.rich; each$f(txStl.rich, function(richItem) { convertToEC4RichItem(richItem, richItem); }); return out; } function convertToEC4RichItem(out, richItem) { if (!richItem) { return; } hasOwn(richItem, "fill") && (out.textFill = richItem.fill); hasOwn(richItem, "stroke") && (out.textStroke = richItem.fill); hasOwn(richItem, "lineWidth") && (out.textStrokeWidth = richItem.lineWidth); hasOwn(richItem, "font") && (out.font = richItem.font); hasOwn(richItem, "fontStyle") && (out.fontStyle = richItem.fontStyle); hasOwn(richItem, "fontWeight") && (out.fontWeight = richItem.fontWeight); hasOwn(richItem, "fontSize") && (out.fontSize = richItem.fontSize); hasOwn(richItem, "fontFamily") && (out.fontFamily = richItem.fontFamily); hasOwn(richItem, "align") && (out.textAlign = richItem.align); hasOwn(richItem, "verticalAlign") && (out.textVerticalAlign = richItem.verticalAlign); hasOwn(richItem, "lineHeight") && (out.textLineHeight = richItem.lineHeight); hasOwn(richItem, "width") && (out.textWidth = richItem.width); hasOwn(richItem, "height") && (out.textHeight = richItem.height); hasOwn(richItem, "backgroundColor") && (out.textBackgroundColor = richItem.backgroundColor); hasOwn(richItem, "padding") && (out.textPadding = richItem.padding); hasOwn(richItem, "borderColor") && (out.textBorderColor = richItem.borderColor); hasOwn(richItem, "borderWidth") && (out.textBorderWidth = richItem.borderWidth); hasOwn(richItem, "borderRadius") && (out.textBorderRadius = richItem.borderRadius); hasOwn(richItem, "shadowColor") && (out.textBoxShadowColor = richItem.shadowColor); hasOwn(richItem, "shadowBlur") && (out.textBoxShadowBlur = richItem.shadowBlur); hasOwn(richItem, "shadowOffsetX") && (out.textBoxShadowOffsetX = richItem.shadowOffsetX); hasOwn(richItem, "shadowOffsetY") && (out.textBoxShadowOffsetY = richItem.shadowOffsetY); hasOwn(richItem, "textShadowColor") && (out.textShadowColor = richItem.textShadowColor); hasOwn(richItem, "textShadowBlur") && (out.textShadowBlur = richItem.textShadowBlur); hasOwn(richItem, "textShadowOffsetX") && (out.textShadowOffsetX = richItem.textShadowOffsetX); hasOwn(richItem, "textShadowOffsetY") && (out.textShadowOffsetY = richItem.textShadowOffsetY); } var LEGACY_TRANSFORM_PROPS_MAP = { position: ["x", "y"], scale: ["scaleX", "scaleY"], origin: ["originX", "originY"] }; var LEGACY_TRANSFORM_PROPS = keys(LEGACY_TRANSFORM_PROPS_MAP); reduce(TRANSFORMABLE_PROPS, function(obj, key) { obj[key] = 1; return obj; }, {}); TRANSFORMABLE_PROPS.join(", "); var ELEMENT_ANIMATABLE_PROPS = ["", "style", "shape", "extra"]; var transitionInnerStore = makeInner(); function getElementAnimationConfig(animationType, el, elOption, parentModel, dataIndex) { var animationProp = animationType + "Animation"; var config = getAnimationConfig(animationType, parentModel, dataIndex) || {}; var userDuring = transitionInnerStore(el).userDuring; if (config.duration > 0) { config.during = userDuring ? bind$1(duringCall, { el, userDuring }) : null; config.setToFinal = true; config.scope = animationType; } extend(config, elOption[animationProp]); return config; } function applyUpdateTransition(el, elOption, animatableModel, opts) { opts = opts || {}; var dataIndex = opts.dataIndex, isInit = opts.isInit, clearStyle = opts.clearStyle; var hasAnimation = animatableModel.isAnimationEnabled(); var store = transitionInnerStore(el); var styleOpt = elOption.style; store.userDuring = elOption.during; var transFromProps = {}; var propsToSet = {}; prepareTransformAllPropsFinal(el, elOption, propsToSet); prepareShapeOrExtraAllPropsFinal("shape", elOption, propsToSet); prepareShapeOrExtraAllPropsFinal("extra", elOption, propsToSet); if (!isInit && hasAnimation) { prepareTransformTransitionFrom(el, elOption, transFromProps); prepareShapeOrExtraTransitionFrom("shape", el, elOption, transFromProps); prepareShapeOrExtraTransitionFrom("extra", el, elOption, transFromProps); prepareStyleTransitionFrom(el, elOption, styleOpt, transFromProps); } propsToSet.style = styleOpt; applyPropsDirectly(el, propsToSet, clearStyle); applyMiscProps(el, elOption); if (hasAnimation) { if (isInit) { var enterFromProps_1 = {}; each$f(ELEMENT_ANIMATABLE_PROPS, function(propName) { var prop = propName ? elOption[propName] : elOption; if (prop && prop.enterFrom) { if (propName) { enterFromProps_1[propName] = enterFromProps_1[propName] || {}; } extend(propName ? enterFromProps_1[propName] : enterFromProps_1, prop.enterFrom); } }); var config = getElementAnimationConfig("enter", el, elOption, animatableModel, dataIndex); if (config.duration > 0) { el.animateFrom(enterFromProps_1, config); } } else { applyPropsTransition(el, elOption, dataIndex || 0, animatableModel, transFromProps); } } updateLeaveTo(el, elOption); styleOpt ? el.dirty() : el.markRedraw(); } function updateLeaveTo(el, elOption) { var leaveToProps = transitionInnerStore(el).leaveToProps; for (var i = 0; i < ELEMENT_ANIMATABLE_PROPS.length; i++) { var propName = ELEMENT_ANIMATABLE_PROPS[i]; var prop = propName ? elOption[propName] : elOption; if (prop && prop.leaveTo) { if (!leaveToProps) { leaveToProps = transitionInnerStore(el).leaveToProps = {}; } if (propName) { leaveToProps[propName] = leaveToProps[propName] || {}; } extend(propName ? leaveToProps[propName] : leaveToProps, prop.leaveTo); } } } function applyLeaveTransition(el, elOption, animatableModel, onRemove) { if (el) { var parent_1 = el.parent; var leaveToProps = transitionInnerStore(el).leaveToProps; if (leaveToProps) { var config = getElementAnimationConfig("update", el, elOption, animatableModel, 0); config.done = function() { parent_1.remove(el); }; el.animateTo(leaveToProps, config); } else { parent_1.remove(el); } } } function isTransitionAll(transition) { return transition === "all"; } function applyPropsDirectly(el, allPropsFinal, clearStyle) { var styleOpt = allPropsFinal.style; if (!el.isGroup && styleOpt) { if (clearStyle) { el.useStyle({}); var animators = el.animators; for (var i = 0; i < animators.length; i++) { var animator = animators[i]; if (animator.targetName === "style") { animator.changeTarget(el.style); } } } el.setStyle(styleOpt); } if (allPropsFinal) { allPropsFinal.style = null; allPropsFinal && el.attr(allPropsFinal); allPropsFinal.style = styleOpt; } } function applyPropsTransition(el, elOption, dataIndex, model, transFromProps) { if (transFromProps) { var config = getElementAnimationConfig("update", el, elOption, model, dataIndex); if (config.duration > 0) { el.animateFrom(transFromProps, config); } } } function applyMiscProps(el, elOption) { hasOwn(elOption, "silent") && (el.silent = elOption.silent); hasOwn(elOption, "ignore") && (el.ignore = elOption.ignore); if (el instanceof Displayable) { hasOwn(elOption, "invisible") && (el.invisible = elOption.invisible); } if (el instanceof Path) { hasOwn(elOption, "autoBatch") && (el.autoBatch = elOption.autoBatch); } } var tmpDuringScope = {}; var transitionDuringAPI = { // Usually other props do not need to be changed in animation during. setTransform: function(key, val) { tmpDuringScope.el[key] = val; return this; }, getTransform: function(key) { return tmpDuringScope.el[key]; }, setShape: function(key, val) { var el = tmpDuringScope.el; var shape = el.shape || (el.shape = {}); shape[key] = val; el.dirtyShape && el.dirtyShape(); return this; }, getShape: function(key) { var shape = tmpDuringScope.el.shape; if (shape) { return shape[key]; } }, setStyle: function(key, val) { var el = tmpDuringScope.el; var style = el.style; if (style) { style[key] = val; el.dirtyStyle && el.dirtyStyle(); } return this; }, getStyle: function(key) { var style = tmpDuringScope.el.style; if (style) { return style[key]; } }, setExtra: function(key, val) { var extra = tmpDuringScope.el.extra || (tmpDuringScope.el.extra = {}); extra[key] = val; return this; }, getExtra: function(key) { var extra = tmpDuringScope.el.extra; if (extra) { return extra[key]; } } }; function duringCall() { var scope = this; var el = scope.el; if (!el) { return; } var latestUserDuring = transitionInnerStore(el).userDuring; var scopeUserDuring = scope.userDuring; if (latestUserDuring !== scopeUserDuring) { scope.el = scope.userDuring = null; return; } tmpDuringScope.el = el; scopeUserDuring(transitionDuringAPI); } function prepareShapeOrExtraTransitionFrom(mainAttr, fromEl, elOption, transFromProps) { var attrOpt = elOption[mainAttr]; if (!attrOpt) { return; } var elPropsInAttr = fromEl[mainAttr]; var transFromPropsInAttr; if (elPropsInAttr) { var transition = elOption.transition; var attrTransition = attrOpt.transition; if (attrTransition) { !transFromPropsInAttr && (transFromPropsInAttr = transFromProps[mainAttr] = {}); if (isTransitionAll(attrTransition)) { extend(transFromPropsInAttr, elPropsInAttr); } else { var transitionKeys = normalizeToArray(attrTransition); for (var i = 0; i < transitionKeys.length; i++) { var key = transitionKeys[i]; var elVal = elPropsInAttr[key]; transFromPropsInAttr[key] = elVal; } } } else if (isTransitionAll(transition) || indexOf(transition, mainAttr) >= 0) { !transFromPropsInAttr && (transFromPropsInAttr = transFromProps[mainAttr] = {}); var elPropsInAttrKeys = keys(elPropsInAttr); for (var i = 0; i < elPropsInAttrKeys.length; i++) { var key = elPropsInAttrKeys[i]; var elVal = elPropsInAttr[key]; if (isNonStyleTransitionEnabled(attrOpt[key], elVal)) { transFromPropsInAttr[key] = elVal; } } } } } function prepareShapeOrExtraAllPropsFinal(mainAttr, elOption, allProps) { var attrOpt = elOption[mainAttr]; if (!attrOpt) { return; } var allPropsInAttr = allProps[mainAttr] = {}; var keysInAttr = keys(attrOpt); for (var i = 0; i < keysInAttr.length; i++) { var key = keysInAttr[i]; allPropsInAttr[key] = cloneValue(attrOpt[key]); } } function prepareTransformTransitionFrom(el, elOption, transFromProps) { var transition = elOption.transition; var transitionKeys = isTransitionAll(transition) ? TRANSFORMABLE_PROPS : normalizeToArray(transition || []); for (var i = 0; i < transitionKeys.length; i++) { var key = transitionKeys[i]; if (key === "style" || key === "shape" || key === "extra") { continue; } var elVal = el[key]; transFromProps[key] = elVal; } } function prepareTransformAllPropsFinal(el, elOption, allProps) { for (var i = 0; i < LEGACY_TRANSFORM_PROPS.length; i++) { var legacyName = LEGACY_TRANSFORM_PROPS[i]; var xyName = LEGACY_TRANSFORM_PROPS_MAP[legacyName]; var legacyArr = elOption[legacyName]; if (legacyArr) { allProps[xyName[0]] = legacyArr[0]; allProps[xyName[1]] = legacyArr[1]; } } for (var i = 0; i < TRANSFORMABLE_PROPS.length; i++) { var key = TRANSFORMABLE_PROPS[i]; if (elOption[key] != null) { allProps[key] = elOption[key]; } } } function prepareStyleTransitionFrom(fromEl, elOption, styleOpt, transFromProps) { if (!styleOpt) { return; } var fromElStyle = fromEl.style; var transFromStyleProps; if (fromElStyle) { var styleTransition = styleOpt.transition; var elTransition = elOption.transition; if (styleTransition && !isTransitionAll(styleTransition)) { var transitionKeys = normalizeToArray(styleTransition); !transFromStyleProps && (transFromStyleProps = transFromProps.style = {}); for (var i = 0; i < transitionKeys.length; i++) { var key = transitionKeys[i]; var elVal = fromElStyle[key]; transFromStyleProps[key] = elVal; } } else if (fromEl.getAnimationStyleProps && (isTransitionAll(elTransition) || isTransitionAll(styleTransition) || indexOf(elTransition, "style") >= 0)) { var animationProps = fromEl.getAnimationStyleProps(); var animationStyleProps = animationProps ? animationProps.style : null; if (animationStyleProps) { !transFromStyleProps && (transFromStyleProps = transFromProps.style = {}); var styleKeys = keys(styleOpt); for (var i = 0; i < styleKeys.length; i++) { var key = styleKeys[i]; if (animationStyleProps[key]) { var elVal = fromElStyle[key]; transFromStyleProps[key] = elVal; } } } } } } function isNonStyleTransitionEnabled(optVal, elVal) { return !isArrayLike(optVal) ? optVal != null && isFinite(optVal) : optVal !== elVal; } var getStateToRestore = makeInner(); var KEYFRAME_EXCLUDE_KEYS = ["percent", "easing", "shape", "style", "extra"]; function stopPreviousKeyframeAnimationAndRestore(el) { el.stopAnimation("keyframe"); el.attr(getStateToRestore(el)); } function applyKeyframeAnimation(el, animationOpts, animatableModel) { if (!animatableModel.isAnimationEnabled() || !animationOpts) { return; } if (isArray$1(animationOpts)) { each$f(animationOpts, function(singleAnimationOpts) { applyKeyframeAnimation(el, singleAnimationOpts, animatableModel); }); return; } var keyframes = animationOpts.keyframes; var duration = animationOpts.duration; if (animatableModel && duration == null) { var config = getAnimationConfig("enter", animatableModel, 0); duration = config && config.duration; } if (!keyframes || !duration) { return; } var stateToRestore = getStateToRestore(el); each$f(ELEMENT_ANIMATABLE_PROPS, function(targetPropName) { if (targetPropName && !el[targetPropName]) { return; } var animator; keyframes.sort(function(a, b) { return a.percent - b.percent; }); each$f(keyframes, function(kf) { var animators = el.animators; var kfValues = targetPropName ? kf[targetPropName] : kf; if (!kfValues) { return; } var propKeys = keys(kfValues); if (!targetPropName) { propKeys = filter(propKeys, function(key) { return indexOf(KEYFRAME_EXCLUDE_KEYS, key) < 0; }); } if (!propKeys.length) { return; } if (!animator) { animator = el.animate(targetPropName, animationOpts.loop, true); animator.scope = "keyframe"; } for (var i = 0; i < animators.length; i++) { if (animators[i] !== animator && animators[i].targetName === animator.targetName) { animators[i].stopTracks(propKeys); } } targetPropName && (stateToRestore[targetPropName] = stateToRestore[targetPropName] || {}); var savedTarget = targetPropName ? stateToRestore[targetPropName] : stateToRestore; each$f(propKeys, function(key) { savedTarget[key] = ((targetPropName ? el[targetPropName] : el) || {})[key]; }); animator.whenWithKeys(duration * kf.percent, kfValues, propKeys, kf.easing); }); if (!animator) { return; } animator.delay(animationOpts.delay || 0).duration(duration).start(animationOpts.easing); }); } var EMPHASIS = "emphasis"; var NORMAL = "normal"; var BLUR = "blur"; var SELECT = "select"; var STATES = [NORMAL, EMPHASIS, BLUR, SELECT]; var PATH_ITEM_STYLE = { normal: ["itemStyle"], emphasis: [EMPHASIS, "itemStyle"], blur: [BLUR, "itemStyle"], select: [SELECT, "itemStyle"] }; var PATH_LABEL = { normal: ["label"], emphasis: [EMPHASIS, "label"], blur: [BLUR, "label"], select: [SELECT, "label"] }; var DEFAULT_TRANSITION = ["x", "y"]; var GROUP_DIFF_PREFIX = "e\0\0"; var attachedTxInfoTmp = { normal: {}, emphasis: {}, blur: {}, select: {} }; var prepareCustoms = { cartesian2d: cartesianPrepareCustom, geo: geoPrepareCustom, single: singlePrepareCustom, polar: polarPrepareCustom, calendar: calendarPrepareCustom }; function isPath(el) { return el instanceof Path; } function isDisplayable(el) { return el instanceof Displayable; } function copyElement(sourceEl, targetEl) { targetEl.copyTransform(sourceEl); if (isDisplayable(targetEl) && isDisplayable(sourceEl)) { targetEl.setStyle(sourceEl.style); targetEl.z = sourceEl.z; targetEl.z2 = sourceEl.z2; targetEl.zlevel = sourceEl.zlevel; targetEl.invisible = sourceEl.invisible; targetEl.ignore = sourceEl.ignore; if (isPath(targetEl) && isPath(sourceEl)) { targetEl.setShape(sourceEl.shape); } } } var CustomChartView = ( /** @class */ (function(_super) { __extends(CustomChartView2, _super); function CustomChartView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = CustomChartView2.type; return _this; } CustomChartView2.prototype.render = function(customSeries, ecModel, api, payload) { this._progressiveEls = null; var oldData = this._data; var data = customSeries.getData(); var group = this.group; var renderItem = makeRenderItem(customSeries, data, ecModel, api); if (!oldData) { group.removeAll(); } data.diff(oldData).add(function(newIdx) { createOrUpdateItem(api, null, newIdx, renderItem(newIdx, payload), customSeries, group, data); }).remove(function(oldIdx) { var el = oldData.getItemGraphicEl(oldIdx); el && applyLeaveTransition(el, customInnerStore(el).option, customSeries); }).update(function(newIdx, oldIdx) { var oldEl = oldData.getItemGraphicEl(oldIdx); createOrUpdateItem(api, oldEl, newIdx, renderItem(newIdx, payload), customSeries, group, data); }).execute(); var clipPath = customSeries.get("clip", true) ? createClipPath(customSeries.coordinateSystem, false, customSeries) : null; if (clipPath) { group.setClipPath(clipPath); } else { group.removeClipPath(); } this._data = data; }; CustomChartView2.prototype.incrementalPrepareRender = function(customSeries, ecModel, api) { this.group.removeAll(); this._data = null; }; CustomChartView2.prototype.incrementalRender = function(params, customSeries, ecModel, api, payload) { var data = customSeries.getData(); var renderItem = makeRenderItem(customSeries, data, ecModel, api); var progressiveEls = this._progressiveEls = []; function setIncrementalAndHoverLayer(el2) { if (!el2.isGroup) { el2.incremental = true; el2.ensureState("emphasis").hoverLayer = true; } } for (var idx = params.start; idx < params.end; idx++) { var el = createOrUpdateItem(null, null, idx, renderItem(idx, payload), customSeries, this.group, data); if (el) { el.traverse(setIncrementalAndHoverLayer); progressiveEls.push(el); } } }; CustomChartView2.prototype.eachRendered = function(cb) { traverseElements(this._progressiveEls || this.group, cb); }; CustomChartView2.prototype.filterForExposedEvent = function(eventType, query, targetEl, packedEvent) { var elementName = query.element; if (elementName == null || targetEl.name === elementName) { return true; } while ((targetEl = targetEl.__hostTarget || targetEl.parent) && targetEl !== this.group) { if (targetEl.name === elementName) { return true; } } return false; }; CustomChartView2.type = "custom"; return CustomChartView2; })(ChartView) ); function createEl$1(elOption) { var graphicType = elOption.type; var el; if (graphicType === "path") { var shape = elOption.shape; var pathRect = shape.width != null && shape.height != null ? { x: shape.x || 0, y: shape.y || 0, width: shape.width, height: shape.height } : null; var pathData = getPathData(shape); el = makePath(pathData, null, pathRect, shape.layout || "center"); customInnerStore(el).customPathData = pathData; } else if (graphicType === "image") { el = new ZRImage({}); customInnerStore(el).customImagePath = elOption.style.image; } else if (graphicType === "text") { el = new ZRText({}); } else if (graphicType === "group") { el = new Group$3(); } else if (graphicType === "compoundPath") { throw new Error('"compoundPath" is not supported yet.'); } else { var Clz = getShapeClass(graphicType); if (!Clz) { var errMsg = ""; throwError(errMsg); } el = new Clz(); } customInnerStore(el).customGraphicType = graphicType; el.name = elOption.name; el.z2EmphasisLift = 1; el.z2SelectLift = 1; return el; } function updateElNormal(api, el, dataIndex, elOption, attachedTxInfo, seriesModel, isInit) { stopPreviousKeyframeAnimationAndRestore(el); var txCfgOpt = attachedTxInfo && attachedTxInfo.normal.cfg; if (txCfgOpt) { el.setTextConfig(txCfgOpt); } if (elOption && elOption.transition == null) { elOption.transition = DEFAULT_TRANSITION; } var styleOpt = elOption && elOption.style; if (styleOpt) { if (el.type === "text") { var textOptionStyle = styleOpt; hasOwn(textOptionStyle, "textFill") && (textOptionStyle.fill = textOptionStyle.textFill); hasOwn(textOptionStyle, "textStroke") && (textOptionStyle.stroke = textOptionStyle.textStroke); } var decalPattern = void 0; var decalObj = isPath(el) ? styleOpt.decal : null; if (api && decalObj) { decalObj.dirty = true; decalPattern = createOrUpdatePatternFromDecal(decalObj, api); } styleOpt.__decalPattern = decalPattern; } if (isDisplayable(el)) { if (styleOpt) { var decalPattern = styleOpt.__decalPattern; if (decalPattern) { styleOpt.decal = decalPattern; } } } applyUpdateTransition(el, elOption, seriesModel, { dataIndex, isInit, clearStyle: true }); applyKeyframeAnimation(el, elOption.keyframeAnimation, seriesModel); } function updateElOnState(state, el, elStateOpt, styleOpt, attachedTxInfo) { var elDisplayable = el.isGroup ? null : el; var txCfgOpt = attachedTxInfo && attachedTxInfo[state].cfg; if (elDisplayable) { var stateObj = elDisplayable.ensureState(state); if (styleOpt === false) { var existingEmphasisState = elDisplayable.getState(state); if (existingEmphasisState) { existingEmphasisState.style = null; } } else { stateObj.style = styleOpt || null; } if (txCfgOpt) { stateObj.textConfig = txCfgOpt; } setDefaultStateProxy(elDisplayable); } } function updateZ(el, elOption, seriesModel) { if (el.isGroup) { return; } var elDisplayable = el; var currentZ = seriesModel.currentZ; var currentZLevel = seriesModel.currentZLevel; elDisplayable.z = currentZ; elDisplayable.zlevel = currentZLevel; var optZ2 = elOption.z2; optZ2 != null && (elDisplayable.z2 = optZ2 || 0); for (var i = 0; i < STATES.length; i++) { updateZForEachState(elDisplayable, elOption, STATES[i]); } } function updateZForEachState(elDisplayable, elOption, state) { var isNormal = state === NORMAL; var elStateOpt = isNormal ? elOption : retrieveStateOption(elOption, state); var optZ2 = elStateOpt ? elStateOpt.z2 : null; var stateObj; if (optZ2 != null) { stateObj = isNormal ? elDisplayable : elDisplayable.ensureState(state); stateObj.z2 = optZ2 || 0; } } function makeRenderItem(customSeries, data, ecModel, api) { var renderItem = customSeries.get("renderItem"); var coordSys = customSeries.coordinateSystem; var prepareResult2 = {}; if (coordSys) { prepareResult2 = coordSys.prepareCustoms ? coordSys.prepareCustoms(coordSys) : prepareCustoms[coordSys.type](coordSys); } var userAPI = defaults({ getWidth: api.getWidth, getHeight: api.getHeight, getZr: api.getZr, getDevicePixelRatio: api.getDevicePixelRatio, value, style, ordinalRawValue, styleEmphasis, visual, barLayout, currentSeriesIndices, font }, prepareResult2.api || {}); var userParams = { // The life cycle of context: current round of rendering. // The global life cycle is probably not necessary, because // user can store global status by themselves. context: {}, seriesId: customSeries.id, seriesName: customSeries.name, seriesIndex: customSeries.seriesIndex, coordSys: prepareResult2.coordSys, dataInsideLength: data.count(), encode: wrapEncodeDef(customSeries.getData()) }; var currDataIndexInside; var currItemModel; var currItemStyleModels = {}; var currLabelModels = {}; var seriesItemStyleModels = {}; var seriesLabelModels = {}; for (var i = 0; i < STATES.length; i++) { var stateName = STATES[i]; seriesItemStyleModels[stateName] = customSeries.getModel(PATH_ITEM_STYLE[stateName]); seriesLabelModels[stateName] = customSeries.getModel(PATH_LABEL[stateName]); } function getItemModel2(dataIndexInside) { return dataIndexInside === currDataIndexInside ? currItemModel || (currItemModel = data.getItemModel(dataIndexInside)) : data.getItemModel(dataIndexInside); } function getItemStyleModel(dataIndexInside, state) { return !data.hasItemOption ? seriesItemStyleModels[state] : dataIndexInside === currDataIndexInside ? currItemStyleModels[state] || (currItemStyleModels[state] = getItemModel2(dataIndexInside).getModel(PATH_ITEM_STYLE[state])) : getItemModel2(dataIndexInside).getModel(PATH_ITEM_STYLE[state]); } function getLabelModel(dataIndexInside, state) { return !data.hasItemOption ? seriesLabelModels[state] : dataIndexInside === currDataIndexInside ? currLabelModels[state] || (currLabelModels[state] = getItemModel2(dataIndexInside).getModel(PATH_LABEL[state])) : getItemModel2(dataIndexInside).getModel(PATH_LABEL[state]); } return function(dataIndexInside, payload) { currDataIndexInside = dataIndexInside; currItemModel = null; currItemStyleModels = {}; currLabelModels = {}; return renderItem && renderItem(defaults({ dataIndexInside, dataIndex: data.getRawIndex(dataIndexInside), // Can be used for optimization when zoom or roam. actionType: payload ? payload.type : null }, userParams), userAPI); }; function value(dim, dataIndexInside) { dataIndexInside == null && (dataIndexInside = currDataIndexInside); return data.getStore().get(data.getDimensionIndex(dim || 0), dataIndexInside); } function ordinalRawValue(dim, dataIndexInside) { dataIndexInside == null && (dataIndexInside = currDataIndexInside); dim = dim || 0; var dimInfo = data.getDimensionInfo(dim); if (!dimInfo) { var dimIndex = data.getDimensionIndex(dim); return dimIndex >= 0 ? data.getStore().get(dimIndex, dataIndexInside) : void 0; } var val = data.get(dimInfo.name, dataIndexInside); var ordinalMeta = dimInfo && dimInfo.ordinalMeta; return ordinalMeta ? ordinalMeta.categories[val] : val; } function style(userProps, dataIndexInside) { dataIndexInside == null && (dataIndexInside = currDataIndexInside); var style2 = data.getItemVisual(dataIndexInside, "style"); var visualColor = style2 && style2.fill; var opacity = style2 && style2.opacity; var itemStyle = getItemStyleModel(dataIndexInside, NORMAL).getItemStyle(); visualColor != null && (itemStyle.fill = visualColor); opacity != null && (itemStyle.opacity = opacity); var opt = { inheritColor: isString(visualColor) ? visualColor : "#000" }; var labelModel = getLabelModel(dataIndexInside, NORMAL); var textStyle = createTextStyle(labelModel, null, opt, false, true); textStyle.text = labelModel.getShallow("show") ? retrieve2(customSeries.getFormattedLabel(dataIndexInside, NORMAL), getDefaultLabel(data, dataIndexInside)) : null; var textConfig = createTextConfig(labelModel, opt, false); preFetchFromExtra(userProps, itemStyle); itemStyle = convertToEC4StyleForCustomSerise(itemStyle, textStyle, textConfig); userProps && applyUserPropsAfter(itemStyle, userProps); itemStyle.legacy = true; return itemStyle; } function styleEmphasis(userProps, dataIndexInside) { dataIndexInside == null && (dataIndexInside = currDataIndexInside); var itemStyle = getItemStyleModel(dataIndexInside, EMPHASIS).getItemStyle(); var labelModel = getLabelModel(dataIndexInside, EMPHASIS); var textStyle = createTextStyle(labelModel, null, null, true, true); textStyle.text = labelModel.getShallow("show") ? retrieve3(customSeries.getFormattedLabel(dataIndexInside, EMPHASIS), customSeries.getFormattedLabel(dataIndexInside, NORMAL), getDefaultLabel(data, dataIndexInside)) : null; var textConfig = createTextConfig(labelModel, null, true); preFetchFromExtra(userProps, itemStyle); itemStyle = convertToEC4StyleForCustomSerise(itemStyle, textStyle, textConfig); userProps && applyUserPropsAfter(itemStyle, userProps); itemStyle.legacy = true; return itemStyle; } function applyUserPropsAfter(itemStyle, extra) { for (var key in extra) { if (hasOwn(extra, key)) { itemStyle[key] = extra[key]; } } } function preFetchFromExtra(extra, itemStyle) { if (extra) { extra.textFill && (itemStyle.textFill = extra.textFill); extra.textPosition && (itemStyle.textPosition = extra.textPosition); } } function visual(visualType, dataIndexInside) { dataIndexInside == null && (dataIndexInside = currDataIndexInside); if (hasOwn(STYLE_VISUAL_TYPE, visualType)) { var style_1 = data.getItemVisual(dataIndexInside, "style"); return style_1 ? style_1[STYLE_VISUAL_TYPE[visualType]] : null; } if (hasOwn(NON_STYLE_VISUAL_PROPS, visualType)) { return data.getItemVisual(dataIndexInside, visualType); } } function barLayout(opt) { if (coordSys.type === "cartesian2d") { var baseAxis = coordSys.getBaseAxis(); return getLayoutOnAxis(defaults({ axis: baseAxis }, opt)); } } function currentSeriesIndices() { return ecModel.getCurrentSeriesIndices(); } function font(opt) { return getFont(opt, ecModel); } } function wrapEncodeDef(data) { var encodeDef = {}; each$f(data.dimensions, function(dimName) { var dimInfo = data.getDimensionInfo(dimName); if (!dimInfo.isExtraCoord) { var coordDim = dimInfo.coordDim; var dataDims = encodeDef[coordDim] = encodeDef[coordDim] || []; dataDims[dimInfo.coordDimIndex] = data.getDimensionIndex(dimName); } }); return encodeDef; } function createOrUpdateItem(api, existsEl, dataIndex, elOption, seriesModel, group, data) { if (!elOption) { group.remove(existsEl); return; } var el = doCreateOrUpdateEl(api, existsEl, dataIndex, elOption, seriesModel, group); el && data.setItemGraphicEl(dataIndex, el); el && toggleHoverEmphasis(el, elOption.focus, elOption.blurScope, elOption.emphasisDisabled); return el; } function doCreateOrUpdateEl(api, existsEl, dataIndex, elOption, seriesModel, group) { var toBeReplacedIdx = -1; var oldEl = existsEl; if (existsEl && doesElNeedRecreate(existsEl, elOption, seriesModel)) { toBeReplacedIdx = indexOf(group.childrenRef(), existsEl); existsEl = null; } var isInit = !existsEl; var el = existsEl; if (!el) { el = createEl$1(elOption); if (oldEl) { copyElement(oldEl, el); } } else { el.clearStates(); } if (elOption.morph === false) { el.disableMorphing = true; } else if (el.disableMorphing) { el.disableMorphing = false; } attachedTxInfoTmp.normal.cfg = attachedTxInfoTmp.normal.conOpt = attachedTxInfoTmp.emphasis.cfg = attachedTxInfoTmp.emphasis.conOpt = attachedTxInfoTmp.blur.cfg = attachedTxInfoTmp.blur.conOpt = attachedTxInfoTmp.select.cfg = attachedTxInfoTmp.select.conOpt = null; attachedTxInfoTmp.isLegacy = false; doCreateOrUpdateAttachedTx(el, dataIndex, elOption, seriesModel, isInit, attachedTxInfoTmp); doCreateOrUpdateClipPath(el, dataIndex, elOption, seriesModel, isInit); updateElNormal(api, el, dataIndex, elOption, attachedTxInfoTmp, seriesModel, isInit); hasOwn(elOption, "info") && (customInnerStore(el).info = elOption.info); for (var i = 0; i < STATES.length; i++) { var stateName = STATES[i]; if (stateName !== NORMAL) { var otherStateOpt = retrieveStateOption(elOption, stateName); var otherStyleOpt = retrieveStyleOptionOnState(elOption, otherStateOpt, stateName); updateElOnState(stateName, el, otherStateOpt, otherStyleOpt, attachedTxInfoTmp); } } updateZ(el, elOption, seriesModel); if (elOption.type === "group") { mergeChildren(api, el, dataIndex, elOption, seriesModel); } if (toBeReplacedIdx >= 0) { group.replaceAt(el, toBeReplacedIdx); } else { group.add(el); } return el; } function doesElNeedRecreate(el, elOption, seriesModel) { var elInner = customInnerStore(el); var elOptionType = elOption.type; var elOptionShape = elOption.shape; var elOptionStyle = elOption.style; return ( // Always create new if universal transition is enabled. // Because we do transition after render. It needs to know what old element is. Replacement will loose it. seriesModel.isUniversalTransitionEnabled() || elOptionType != null && elOptionType !== elInner.customGraphicType || elOptionType === "path" && hasOwnPathData(elOptionShape) && getPathData(elOptionShape) !== elInner.customPathData || elOptionType === "image" && hasOwn(elOptionStyle, "image") && elOptionStyle.image !== elInner.customImagePath ); } function doCreateOrUpdateClipPath(el, dataIndex, elOption, seriesModel, isInit) { var clipPathOpt = elOption.clipPath; if (clipPathOpt === false) { if (el && el.getClipPath()) { el.removeClipPath(); } } else if (clipPathOpt) { var clipPath = el.getClipPath(); if (clipPath && doesElNeedRecreate(clipPath, clipPathOpt, seriesModel)) { clipPath = null; } if (!clipPath) { clipPath = createEl$1(clipPathOpt); el.setClipPath(clipPath); } updateElNormal(null, clipPath, dataIndex, clipPathOpt, null, seriesModel, isInit); } } function doCreateOrUpdateAttachedTx(el, dataIndex, elOption, seriesModel, isInit, attachedTxInfo) { if (el.isGroup) { return; } processTxInfo(elOption, null, attachedTxInfo); processTxInfo(elOption, EMPHASIS, attachedTxInfo); var txConOptNormal = attachedTxInfo.normal.conOpt; var txConOptEmphasis = attachedTxInfo.emphasis.conOpt; var txConOptBlur = attachedTxInfo.blur.conOpt; var txConOptSelect = attachedTxInfo.select.conOpt; if (txConOptNormal != null || txConOptEmphasis != null || txConOptSelect != null || txConOptBlur != null) { var textContent = el.getTextContent(); if (txConOptNormal === false) { textContent && el.removeTextContent(); } else { txConOptNormal = attachedTxInfo.normal.conOpt = txConOptNormal || { type: "text" }; if (!textContent) { textContent = createEl$1(txConOptNormal); el.setTextContent(textContent); } else { textContent.clearStates(); } updateElNormal(null, textContent, dataIndex, txConOptNormal, null, seriesModel, isInit); var txConStlOptNormal = txConOptNormal && txConOptNormal.style; for (var i = 0; i < STATES.length; i++) { var stateName = STATES[i]; if (stateName !== NORMAL) { var txConOptOtherState = attachedTxInfo[stateName].conOpt; updateElOnState(stateName, textContent, txConOptOtherState, retrieveStyleOptionOnState(txConOptNormal, txConOptOtherState, stateName), null); } } txConStlOptNormal ? textContent.dirty() : textContent.markRedraw(); } } } function processTxInfo(elOption, state, attachedTxInfo) { var stateOpt = !state ? elOption : retrieveStateOption(elOption, state); var styleOpt = !state ? elOption.style : retrieveStyleOptionOnState(elOption, stateOpt, EMPHASIS); var elType = elOption.type; var txCfg = stateOpt ? stateOpt.textConfig : null; var txConOptNormal = elOption.textContent; var txConOpt = !txConOptNormal ? null : !state ? txConOptNormal : retrieveStateOption(txConOptNormal, state); if (styleOpt && // Because emphasis style has little info to detect legacy, // if normal is legacy, emphasis is trade as legacy. (attachedTxInfo.isLegacy || isEC4CompatibleStyle(styleOpt, elType, !!txCfg, !!txConOpt))) { attachedTxInfo.isLegacy = true; var convertResult = convertFromEC4CompatibleStyle(styleOpt, elType, !state); if (!txCfg && convertResult.textConfig) { txCfg = convertResult.textConfig; } if (!txConOpt && convertResult.textContent) { txConOpt = convertResult.textContent; } } if (!state && txConOpt) { var txConOptNormal_1 = txConOpt; !txConOptNormal_1.type && (txConOptNormal_1.type = "text"); } var info = !state ? attachedTxInfo.normal : attachedTxInfo[state]; info.cfg = txCfg; info.conOpt = txConOpt; } function retrieveStateOption(elOption, state) { return !state ? elOption : elOption ? elOption[state] : null; } function retrieveStyleOptionOnState(stateOptionNormal, stateOption, state) { var style = stateOption && stateOption.style; if (style == null && state === EMPHASIS && stateOptionNormal) { style = stateOptionNormal.styleEmphasis; } return style; } function mergeChildren(api, el, dataIndex, elOption, seriesModel) { var newChildren = elOption.children; var newLen = newChildren ? newChildren.length : 0; var mergeChildren2 = elOption.$mergeChildren; var byName = mergeChildren2 === "byName" || elOption.diffChildrenByName; var notMerge = mergeChildren2 === false; if (!newLen && !byName && !notMerge) { return; } if (byName) { diffGroupChildren({ api, oldChildren: el.children() || [], newChildren: newChildren || [], dataIndex, seriesModel, group: el }); return; } notMerge && el.removeAll(); var index = 0; for (; index < newLen; index++) { var newChild = newChildren[index]; var oldChild = el.childAt(index); if (newChild) { if (newChild.ignore == null) { newChild.ignore = false; } doCreateOrUpdateEl(api, oldChild, dataIndex, newChild, seriesModel, el); } else { oldChild.ignore = true; } } for (var i = el.childCount() - 1; i >= index; i--) { var child = el.childAt(i); removeChildFromGroup(el, child, seriesModel); } } function removeChildFromGroup(group, child, seriesModel) { child && applyLeaveTransition(child, customInnerStore(group).option, seriesModel); } function diffGroupChildren(context) { new DataDiffer(context.oldChildren, context.newChildren, getKey, getKey, context).add(processAddUpdate).update(processAddUpdate).remove(processRemove).execute(); } function getKey(item, idx) { var name = item && item.name; return name != null ? name : GROUP_DIFF_PREFIX + idx; } function processAddUpdate(newIndex, oldIndex) { var context = this.context; var childOption = newIndex != null ? context.newChildren[newIndex] : null; var child = oldIndex != null ? context.oldChildren[oldIndex] : null; doCreateOrUpdateEl(context.api, child, context.dataIndex, childOption, context.seriesModel, context.group); } function processRemove(oldIndex) { var context = this.context; var child = context.oldChildren[oldIndex]; child && applyLeaveTransition(child, customInnerStore(child).option, context.seriesModel); } function getPathData(shape) { return shape && (shape.pathData || shape.d); } function hasOwnPathData(shape) { return shape && (hasOwn(shape, "pathData") || hasOwn(shape, "d")); } function install$t(registers) { registers.registerChartView(CustomChartView); registers.registerSeriesModel(CustomSeriesModel); } var inner$b = makeInner(); var clone = clone$1; var bind = bind$1; var BaseAxisPointer = ( /** @class */ (function() { function BaseAxisPointer2() { this._dragging = false; this.animationThreshold = 15; } BaseAxisPointer2.prototype.render = function(axisModel, axisPointerModel, api, forceRender) { var value = axisPointerModel.get("value"); var status = axisPointerModel.get("status"); this._axisModel = axisModel; this._axisPointerModel = axisPointerModel; this._api = api; if (!forceRender && this._lastValue === value && this._lastStatus === status) { return; } this._lastValue = value; this._lastStatus = status; var group = this._group; var handle = this._handle; if (!status || status === "hide") { group && group.hide(); handle && handle.hide(); return; } group && group.show(); handle && handle.show(); var elOption = {}; this.makeElOption(elOption, value, axisModel, axisPointerModel, api); var graphicKey = elOption.graphicKey; if (graphicKey !== this._lastGraphicKey) { this.clear(api); } this._lastGraphicKey = graphicKey; var moveAnimation = this._moveAnimation = this.determineAnimation(axisModel, axisPointerModel); if (!group) { group = this._group = new Group$3(); this.createPointerEl(group, elOption, axisModel, axisPointerModel); this.createLabelEl(group, elOption, axisModel, axisPointerModel); api.getZr().add(group); } else { var doUpdateProps = curry$1(updateProps, axisPointerModel, moveAnimation); this.updatePointerEl(group, elOption, doUpdateProps); this.updateLabelEl(group, elOption, doUpdateProps, axisPointerModel); } updateMandatoryProps(group, axisPointerModel, true); this._renderHandle(value); }; BaseAxisPointer2.prototype.remove = function(api) { this.clear(api); }; BaseAxisPointer2.prototype.dispose = function(api) { this.clear(api); }; BaseAxisPointer2.prototype.determineAnimation = function(axisModel, axisPointerModel) { var animation = axisPointerModel.get("animation"); var axis = axisModel.axis; var isCategoryAxis = axis.type === "category"; var useSnap = axisPointerModel.get("snap"); if (!useSnap && !isCategoryAxis) { return false; } if (animation === "auto" || animation == null) { var animationThreshold = this.animationThreshold; if (isCategoryAxis && axis.getBandWidth() > animationThreshold) { return true; } if (useSnap) { var seriesDataCount = getAxisInfo$1(axisModel).seriesDataCount; var axisExtent = axis.getExtent(); return Math.abs(axisExtent[0] - axisExtent[1]) / seriesDataCount > animationThreshold; } return false; } return animation === true; }; BaseAxisPointer2.prototype.makeElOption = function(elOption, value, axisModel, axisPointerModel, api) { }; BaseAxisPointer2.prototype.createPointerEl = function(group, elOption, axisModel, axisPointerModel) { var pointerOption = elOption.pointer; if (pointerOption) { var pointerEl = inner$b(group).pointerEl = new graphic[pointerOption.type](clone(elOption.pointer)); group.add(pointerEl); } }; BaseAxisPointer2.prototype.createLabelEl = function(group, elOption, axisModel, axisPointerModel) { if (elOption.label) { var labelEl = inner$b(group).labelEl = new ZRText(clone(elOption.label)); group.add(labelEl); updateLabelShowHide(labelEl, axisPointerModel); } }; BaseAxisPointer2.prototype.updatePointerEl = function(group, elOption, updateProps2) { var pointerEl = inner$b(group).pointerEl; if (pointerEl && elOption.pointer) { pointerEl.setStyle(elOption.pointer.style); updateProps2(pointerEl, { shape: elOption.pointer.shape }); } }; BaseAxisPointer2.prototype.updateLabelEl = function(group, elOption, updateProps2, axisPointerModel) { var labelEl = inner$b(group).labelEl; if (labelEl) { labelEl.setStyle(elOption.label.style); updateProps2(labelEl, { // Consider text length change in vertical axis, animation should // be used on shape, otherwise the effect will be weird. // TODOTODO // shape: elOption.label.shape, x: elOption.label.x, y: elOption.label.y }); updateLabelShowHide(labelEl, axisPointerModel); } }; BaseAxisPointer2.prototype._renderHandle = function(value) { if (this._dragging || !this.updateHandleTransform) { return; } var axisPointerModel = this._axisPointerModel; var zr = this._api.getZr(); var handle = this._handle; var handleModel = axisPointerModel.getModel("handle"); var status = axisPointerModel.get("status"); if (!handleModel.get("show") || !status || status === "hide") { handle && zr.remove(handle); this._handle = null; return; } var isInit; if (!this._handle) { isInit = true; handle = this._handle = createIcon(handleModel.get("icon"), { cursor: "move", draggable: true, onmousemove: function(e) { stop(e.event); }, onmousedown: bind(this._onHandleDragMove, this, 0, 0), drift: bind(this._onHandleDragMove, this), ondragend: bind(this._onHandleDragEnd, this) }); zr.add(handle); } updateMandatoryProps(handle, axisPointerModel, false); handle.setStyle(handleModel.getItemStyle(null, ["color", "borderColor", "borderWidth", "opacity", "shadowColor", "shadowBlur", "shadowOffsetX", "shadowOffsetY"])); var handleSize = handleModel.get("size"); if (!isArray$1(handleSize)) { handleSize = [handleSize, handleSize]; } handle.scaleX = handleSize[0] / 2; handle.scaleY = handleSize[1] / 2; createOrUpdate(this, "_doDispatchAxisPointer", handleModel.get("throttle") || 0, "fixRate"); this._moveHandleToValue(value, isInit); }; BaseAxisPointer2.prototype._moveHandleToValue = function(value, isInit) { updateProps(this._axisPointerModel, !isInit && this._moveAnimation, this._handle, getHandleTransProps(this.getHandleTransform(value, this._axisModel, this._axisPointerModel))); }; BaseAxisPointer2.prototype._onHandleDragMove = function(dx, dy) { var handle = this._handle; if (!handle) { return; } this._dragging = true; var trans = this.updateHandleTransform(getHandleTransProps(handle), [dx, dy], this._axisModel, this._axisPointerModel); this._payloadInfo = trans; handle.stopAnimation(); handle.attr(getHandleTransProps(trans)); inner$b(handle).lastProp = null; this._doDispatchAxisPointer(); }; BaseAxisPointer2.prototype._doDispatchAxisPointer = function() { var handle = this._handle; if (!handle) { return; } var payloadInfo = this._payloadInfo; var axisModel = this._axisModel; this._api.dispatchAction({ type: "updateAxisPointer", x: payloadInfo.cursorPoint[0], y: payloadInfo.cursorPoint[1], tooltipOption: payloadInfo.tooltipOption, axesInfo: [{ axisDim: axisModel.axis.dim, axisIndex: axisModel.componentIndex }] }); }; BaseAxisPointer2.prototype._onHandleDragEnd = function() { this._dragging = false; var handle = this._handle; if (!handle) { return; } var value = this._axisPointerModel.get("value"); this._moveHandleToValue(value); this._api.dispatchAction({ type: "hideTip" }); }; BaseAxisPointer2.prototype.clear = function(api) { this._lastValue = null; this._lastStatus = null; var zr = api.getZr(); var group = this._group; var handle = this._handle; if (zr && group) { this._lastGraphicKey = null; group && zr.remove(group); handle && zr.remove(handle); this._group = null; this._handle = null; this._payloadInfo = null; } clear$1(this, "_doDispatchAxisPointer"); }; BaseAxisPointer2.prototype.doClear = function() { }; BaseAxisPointer2.prototype.buildLabel = function(xy, wh, xDimIndex) { xDimIndex = xDimIndex || 0; return { x: xy[xDimIndex], y: xy[1 - xDimIndex], width: wh[xDimIndex], height: wh[1 - xDimIndex] }; }; return BaseAxisPointer2; })() ); function updateProps(animationModel, moveAnimation, el, props) { if (!propsEqual(inner$b(el).lastProp, props)) { inner$b(el).lastProp = props; moveAnimation ? updateProps$1(el, props, animationModel) : (el.stopAnimation(), el.attr(props)); } } function propsEqual(lastProps, newProps) { if (isObject$3(lastProps) && isObject$3(newProps)) { var equals_1 = true; each$f(newProps, function(item, key) { equals_1 = equals_1 && propsEqual(lastProps[key], item); }); return !!equals_1; } else { return lastProps === newProps; } } function updateLabelShowHide(labelEl, axisPointerModel) { labelEl[axisPointerModel.get(["label", "show"]) ? "show" : "hide"](); } function getHandleTransProps(trans) { return { x: trans.x || 0, y: trans.y || 0, rotation: trans.rotation || 0 }; } function updateMandatoryProps(group, axisPointerModel, silent) { var z = axisPointerModel.get("z"); var zlevel = axisPointerModel.get("zlevel"); group && group.traverse(function(el) { if (el.type !== "group") { z != null && (el.z = z); zlevel != null && (el.zlevel = zlevel); el.silent = silent; } }); } function buildElStyle(axisPointerModel) { var axisPointerType = axisPointerModel.get("type"); var styleModel = axisPointerModel.getModel(axisPointerType + "Style"); var style; if (axisPointerType === "line") { style = styleModel.getLineStyle(); style.fill = null; } else if (axisPointerType === "shadow") { style = styleModel.getAreaStyle(); style.stroke = null; } return style; } function buildLabelElOption(elOption, axisModel, axisPointerModel, api, labelPos) { var value = axisPointerModel.get("value"); var text = getValueLabel(value, axisModel.axis, axisModel.ecModel, axisPointerModel.get("seriesDataIndices"), { precision: axisPointerModel.get(["label", "precision"]), formatter: axisPointerModel.get(["label", "formatter"]) }); var labelModel = axisPointerModel.getModel("label"); var paddings = normalizeCssArray(labelModel.get("padding") || 0); var font = labelModel.getFont(); var textRect = getBoundingRect(text, font); var position2 = labelPos.position; var width = textRect.width + paddings[1] + paddings[3]; var height = textRect.height + paddings[0] + paddings[2]; var align = labelPos.align; align === "right" && (position2[0] -= width); align === "center" && (position2[0] -= width / 2); var verticalAlign = labelPos.verticalAlign; verticalAlign === "bottom" && (position2[1] -= height); verticalAlign === "middle" && (position2[1] -= height / 2); confineInContainer(position2, width, height, api); var bgColor = labelModel.get("backgroundColor"); if (!bgColor || bgColor === "auto") { bgColor = axisModel.get(["axisLine", "lineStyle", "color"]); } elOption.label = { // shape: {x: 0, y: 0, width: width, height: height, r: labelModel.get('borderRadius')}, x: position2[0], y: position2[1], style: createTextStyle(labelModel, { text, font, fill: labelModel.getTextColor(), padding: paddings, backgroundColor: bgColor }), // Label should be over axisPointer. z2: 10 }; } function confineInContainer(position2, width, height, api) { var viewWidth = api.getWidth(); var viewHeight = api.getHeight(); position2[0] = Math.min(position2[0] + width, viewWidth) - width; position2[1] = Math.min(position2[1] + height, viewHeight) - height; position2[0] = Math.max(position2[0], 0); position2[1] = Math.max(position2[1], 0); } function getValueLabel(value, axis, ecModel, seriesDataIndices, opt) { value = axis.scale.parse(value); var text = axis.scale.getLabel({ value }, { // If `precision` is set, width can be fixed (like '12.00500'), which // helps to debounce when when moving label. precision: opt.precision }); var formatter = opt.formatter; if (formatter) { var params_1 = { value: getAxisRawValue(axis, { value }), axisDimension: axis.dim, axisIndex: axis.index, seriesData: [] }; each$f(seriesDataIndices, function(idxItem) { var series = ecModel.getSeriesByIndex(idxItem.seriesIndex); var dataIndex = idxItem.dataIndexInside; var dataParams = series && series.getDataParams(dataIndex); dataParams && params_1.seriesData.push(dataParams); }); if (isString(formatter)) { text = formatter.replace("{value}", text); } else if (isFunction(formatter)) { text = formatter(params_1); } } return text; } function getTransformedPosition(axis, value, layoutInfo) { var transform2 = create$1(); rotate(transform2, transform2, layoutInfo.rotation); translate(transform2, transform2, layoutInfo.position); return applyTransform([axis.dataToCoord(value), (layoutInfo.labelOffset || 0) + (layoutInfo.labelDirection || 1) * (layoutInfo.labelMargin || 0)], transform2); } function buildCartesianSingleLabelElOption(value, elOption, layoutInfo, axisModel, axisPointerModel, api) { var textLayout = AxisBuilder.innerTextLayout(layoutInfo.rotation, 0, layoutInfo.labelDirection); layoutInfo.labelMargin = axisPointerModel.get(["label", "margin"]); buildLabelElOption(elOption, axisModel, axisPointerModel, api, { position: getTransformedPosition(axisModel.axis, value, layoutInfo), align: textLayout.textAlign, verticalAlign: textLayout.textVerticalAlign }); } function makeLineShape(p1, p2, xDimIndex) { xDimIndex = xDimIndex || 0; return { x1: p1[xDimIndex], y1: p1[1 - xDimIndex], x2: p2[xDimIndex], y2: p2[1 - xDimIndex] }; } function makeRectShape(xy, wh, xDimIndex) { xDimIndex = xDimIndex || 0; return { x: xy[xDimIndex], y: xy[1 - xDimIndex], width: wh[xDimIndex], height: wh[1 - xDimIndex] }; } function makeSectorShape(cx, cy, r0, r, startAngle, endAngle) { return { cx, cy, r0, r, startAngle, endAngle, clockwise: true }; } var CartesianAxisPointer = ( /** @class */ (function(_super) { __extends(CartesianAxisPointer2, _super); function CartesianAxisPointer2() { return _super !== null && _super.apply(this, arguments) || this; } CartesianAxisPointer2.prototype.makeElOption = function(elOption, value, axisModel, axisPointerModel, api) { var axis = axisModel.axis; var grid = axis.grid; var axisPointerType = axisPointerModel.get("type"); var otherExtent = getCartesian(grid, axis).getOtherAxis(axis).getGlobalExtent(); var pixelValue = axis.toGlobalCoord(axis.dataToCoord(value, true)); if (axisPointerType && axisPointerType !== "none") { var elStyle = buildElStyle(axisPointerModel); var pointerOption = pointerShapeBuilder$2[axisPointerType](axis, pixelValue, otherExtent); pointerOption.style = elStyle; elOption.graphicKey = pointerOption.type; elOption.pointer = pointerOption; } var layoutInfo = layout$2(grid.model, axisModel); buildCartesianSingleLabelElOption( // @ts-ignore value, elOption, layoutInfo, axisModel, axisPointerModel, api ); }; CartesianAxisPointer2.prototype.getHandleTransform = function(value, axisModel, axisPointerModel) { var layoutInfo = layout$2(axisModel.axis.grid.model, axisModel, { labelInside: false }); layoutInfo.labelMargin = axisPointerModel.get(["handle", "margin"]); var pos = getTransformedPosition(axisModel.axis, value, layoutInfo); return { x: pos[0], y: pos[1], rotation: layoutInfo.rotation + (layoutInfo.labelDirection < 0 ? Math.PI : 0) }; }; CartesianAxisPointer2.prototype.updateHandleTransform = function(transform2, delta, axisModel, axisPointerModel) { var axis = axisModel.axis; var grid = axis.grid; var axisExtent = axis.getGlobalExtent(true); var otherExtent = getCartesian(grid, axis).getOtherAxis(axis).getGlobalExtent(); var dimIndex = axis.dim === "x" ? 0 : 1; var currPosition = [transform2.x, transform2.y]; currPosition[dimIndex] += delta[dimIndex]; currPosition[dimIndex] = Math.min(axisExtent[1], currPosition[dimIndex]); currPosition[dimIndex] = Math.max(axisExtent[0], currPosition[dimIndex]); var cursorOtherValue = (otherExtent[1] + otherExtent[0]) / 2; var cursorPoint = [cursorOtherValue, cursorOtherValue]; cursorPoint[dimIndex] = currPosition[dimIndex]; var tooltipOptions = [{ verticalAlign: "middle" }, { align: "center" }]; return { x: currPosition[0], y: currPosition[1], rotation: transform2.rotation, cursorPoint, tooltipOption: tooltipOptions[dimIndex] }; }; return CartesianAxisPointer2; })(BaseAxisPointer) ); function getCartesian(grid, axis) { var opt = {}; opt[axis.dim + "AxisIndex"] = axis.index; return grid.getCartesian(opt); } var pointerShapeBuilder$2 = { line: function(axis, pixelValue, otherExtent) { var targetShape = makeLineShape([pixelValue, otherExtent[0]], [pixelValue, otherExtent[1]], getAxisDimIndex(axis)); return { type: "Line", subPixelOptimize: true, shape: targetShape }; }, shadow: function(axis, pixelValue, otherExtent) { var bandWidth = Math.max(1, axis.getBandWidth()); var span = otherExtent[1] - otherExtent[0]; return { type: "Rect", shape: makeRectShape([pixelValue - bandWidth / 2, otherExtent[0]], [bandWidth, span], getAxisDimIndex(axis)) }; } }; function getAxisDimIndex(axis) { return axis.dim === "x" ? 0 : 1; } var AxisPointerModel = ( /** @class */ (function(_super) { __extends(AxisPointerModel2, _super); function AxisPointerModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = AxisPointerModel2.type; return _this; } AxisPointerModel2.type = "axisPointer"; AxisPointerModel2.defaultOption = { // 'auto' means that show when triggered by tooltip or handle. show: "auto", // zlevel: 0, z: 50, type: "line", // axispointer triggered by tootip determine snap automatically, // see `modelHelper`. snap: false, triggerTooltip: true, triggerEmphasis: true, value: null, status: null, link: [], // Do not set 'auto' here, otherwise global animation: false // will not effect at this axispointer. animation: null, animationDurationUpdate: 200, lineStyle: { color: "#B9BEC9", width: 1, type: "dashed" }, shadowStyle: { color: "rgba(210,219,238,0.2)" }, label: { show: true, formatter: null, precision: "auto", margin: 3, color: "#fff", padding: [5, 7, 5, 7], backgroundColor: "auto", borderColor: null, borderWidth: 0, borderRadius: 3 }, handle: { show: false, // eslint-disable-next-line icon: "M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z", size: 45, // handle margin is from symbol center to axis, which is stable when circular move. margin: 50, // color: '#1b8bbd' // color: '#2f4554' color: "#333", shadowBlur: 3, shadowColor: "#aaa", shadowOffsetX: 0, shadowOffsetY: 2, // For mobile performance throttle: 40 } }; return AxisPointerModel2; })(ComponentModel) ); var inner$a = makeInner(); var each$8 = each$f; function register(key, api, handler) { if (env.node) { return; } var zr = api.getZr(); inner$a(zr).records || (inner$a(zr).records = {}); initGlobalListeners(zr, api); var record = inner$a(zr).records[key] || (inner$a(zr).records[key] = {}); record.handler = handler; } function initGlobalListeners(zr, api) { if (inner$a(zr).initialized) { return; } inner$a(zr).initialized = true; useHandler("click", curry$1(doEnter, "click")); useHandler("mousemove", curry$1(doEnter, "mousemove")); useHandler("globalout", onLeave); function useHandler(eventType, cb) { zr.on(eventType, function(e) { var dis = makeDispatchAction$1(api); each$8(inner$a(zr).records, function(record) { record && cb(record, e, dis.dispatchAction); }); dispatchTooltipFinally(dis.pendings, api); }); } } function dispatchTooltipFinally(pendings, api) { var showLen = pendings.showTip.length; var hideLen = pendings.hideTip.length; var actuallyPayload; if (showLen) { actuallyPayload = pendings.showTip[showLen - 1]; } else if (hideLen) { actuallyPayload = pendings.hideTip[hideLen - 1]; } if (actuallyPayload) { actuallyPayload.dispatchAction = null; api.dispatchAction(actuallyPayload); } } function onLeave(record, e, dispatchAction2) { record.handler("leave", null, dispatchAction2); } function doEnter(currTrigger, record, e, dispatchAction2) { record.handler(currTrigger, e, dispatchAction2); } function makeDispatchAction$1(api) { var pendings = { showTip: [], hideTip: [] }; var dispatchAction2 = function(payload) { var pendingList = pendings[payload.type]; if (pendingList) { pendingList.push(payload); } else { payload.dispatchAction = dispatchAction2; api.dispatchAction(payload); } }; return { dispatchAction: dispatchAction2, pendings }; } function unregister(key, api) { if (env.node) { return; } var zr = api.getZr(); var record = (inner$a(zr).records || {})[key]; if (record) { inner$a(zr).records[key] = null; } } var AxisPointerView = ( /** @class */ (function(_super) { __extends(AxisPointerView2, _super); function AxisPointerView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = AxisPointerView2.type; return _this; } AxisPointerView2.prototype.render = function(globalAxisPointerModel, ecModel, api) { var globalTooltipModel = ecModel.getComponent("tooltip"); var triggerOn = globalAxisPointerModel.get("triggerOn") || globalTooltipModel && globalTooltipModel.get("triggerOn") || "mousemove|click"; register("axisPointer", api, function(currTrigger, e, dispatchAction2) { if (triggerOn !== "none" && (currTrigger === "leave" || triggerOn.indexOf(currTrigger) >= 0)) { dispatchAction2({ type: "updateAxisPointer", currTrigger, x: e && e.offsetX, y: e && e.offsetY }); } }); }; AxisPointerView2.prototype.remove = function(ecModel, api) { unregister("axisPointer", api); }; AxisPointerView2.prototype.dispose = function(ecModel, api) { unregister("axisPointer", api); }; AxisPointerView2.type = "axisPointer"; return AxisPointerView2; })(ComponentView) ); function findPointFromSeries(finder, ecModel) { var point = []; var seriesIndex = finder.seriesIndex; var seriesModel; if (seriesIndex == null || !(seriesModel = ecModel.getSeriesByIndex(seriesIndex))) { return { point: [] }; } var data = seriesModel.getData(); var dataIndex = queryDataIndex(data, finder); if (dataIndex == null || dataIndex < 0 || isArray$1(dataIndex)) { return { point: [] }; } var el = data.getItemGraphicEl(dataIndex); var coordSys = seriesModel.coordinateSystem; if (seriesModel.getTooltipPosition) { point = seriesModel.getTooltipPosition(dataIndex) || []; } else if (coordSys && coordSys.dataToPoint) { if (finder.isStacked) { var baseAxis = coordSys.getBaseAxis(); var valueAxis2 = coordSys.getOtherAxis(baseAxis); var valueAxisDim = valueAxis2.dim; var baseAxisDim = baseAxis.dim; var baseDataOffset = valueAxisDim === "x" || valueAxisDim === "radius" ? 1 : 0; var baseDim = data.mapDimension(baseAxisDim); var stackedData = []; stackedData[baseDataOffset] = data.get(baseDim, dataIndex); stackedData[1 - baseDataOffset] = data.get(data.getCalculationInfo("stackResultDimension"), dataIndex); point = coordSys.dataToPoint(stackedData) || []; } else { point = coordSys.dataToPoint(data.getValues(map$1(coordSys.dimensions, function(dim) { return data.mapDimension(dim); }), dataIndex)) || []; } } else if (el) { var rect = el.getBoundingRect().clone(); rect.applyTransform(el.transform); point = [rect.x + rect.width / 2, rect.y + rect.height / 2]; } return { point, el }; } var inner$9 = makeInner(); function axisTrigger(payload, ecModel, api) { var currTrigger = payload.currTrigger; var point = [payload.x, payload.y]; var finder = payload; var dispatchAction2 = payload.dispatchAction || bind$1(api.dispatchAction, api); var coordSysAxesInfo = ecModel.getComponent("axisPointer").coordSysAxesInfo; if (!coordSysAxesInfo) { return; } if (illegalPoint(point)) { point = findPointFromSeries({ seriesIndex: finder.seriesIndex, // Do not use dataIndexInside from other ec instance. // FIXME: auto detect it? dataIndex: finder.dataIndex }, ecModel).point; } var isIllegalPoint = illegalPoint(point); var inputAxesInfo = finder.axesInfo; var axesInfo = coordSysAxesInfo.axesInfo; var shouldHide = currTrigger === "leave" || illegalPoint(point); var outputPayload = {}; var showValueMap = {}; var dataByCoordSys = { list: [], map: {} }; var updaters = { showPointer: curry$1(showPointer, showValueMap), showTooltip: curry$1(showTooltip, dataByCoordSys) }; each$f(coordSysAxesInfo.coordSysMap, function(coordSys, coordSysKey) { var coordSysContainsPoint = isIllegalPoint || coordSys.containPoint(point); each$f(coordSysAxesInfo.coordSysAxesInfo[coordSysKey], function(axisInfo, key) { var axis = axisInfo.axis; var inputAxisInfo = findInputAxisInfo(inputAxesInfo, axisInfo); if (!shouldHide && coordSysContainsPoint && (!inputAxesInfo || inputAxisInfo)) { var val = inputAxisInfo && inputAxisInfo.value; if (val == null && !isIllegalPoint) { val = axis.pointToData(point); } val != null && processOnAxis(axisInfo, val, updaters, false, outputPayload); } }); }); var linkTriggers = {}; each$f(axesInfo, function(tarAxisInfo, tarKey) { var linkGroup = tarAxisInfo.linkGroup; if (linkGroup && !showValueMap[tarKey]) { each$f(linkGroup.axesInfo, function(srcAxisInfo, srcKey) { var srcValItem = showValueMap[srcKey]; if (srcAxisInfo !== tarAxisInfo && srcValItem) { var val = srcValItem.value; linkGroup.mapper && (val = tarAxisInfo.axis.scale.parse(linkGroup.mapper(val, makeMapperParam(srcAxisInfo), makeMapperParam(tarAxisInfo)))); linkTriggers[tarAxisInfo.key] = val; } }); } }); each$f(linkTriggers, function(val, tarKey) { processOnAxis(axesInfo[tarKey], val, updaters, true, outputPayload); }); updateModelActually(showValueMap, axesInfo, outputPayload); dispatchTooltipActually(dataByCoordSys, point, payload, dispatchAction2); dispatchHighDownActually(axesInfo, dispatchAction2, api); return outputPayload; } function processOnAxis(axisInfo, newValue, updaters, noSnap, outputFinder) { var axis = axisInfo.axis; if (axis.scale.isBlank() || !axis.containData(newValue)) { return; } if (!axisInfo.involveSeries) { updaters.showPointer(axisInfo, newValue); return; } var payloadInfo = buildPayloadsBySeries(newValue, axisInfo); var payloadBatch = payloadInfo.payloadBatch; var snapToValue = payloadInfo.snapToValue; if (payloadBatch[0] && outputFinder.seriesIndex == null) { extend(outputFinder, payloadBatch[0]); } if (!noSnap && axisInfo.snap) { if (axis.containData(snapToValue) && snapToValue != null) { newValue = snapToValue; } } updaters.showPointer(axisInfo, newValue, payloadBatch); updaters.showTooltip(axisInfo, payloadInfo, snapToValue); } function buildPayloadsBySeries(value, axisInfo) { var axis = axisInfo.axis; var dim = axis.dim; var snapToValue = value; var payloadBatch = []; var minDist = Number.MAX_VALUE; var minDiff = -1; each$f(axisInfo.seriesModels, function(series, idx) { var dataDim = series.getData().mapDimensionsAll(dim); var seriesNestestValue; var dataIndices; if (series.getAxisTooltipData) { var result = series.getAxisTooltipData(dataDim, value, axis); dataIndices = result.dataIndices; seriesNestestValue = result.nestestValue; } else { dataIndices = series.getData().indicesOfNearest( dataDim[0], value, // Add a threshold to avoid find the wrong dataIndex // when data length is not same. // false, axis.type === "category" ? 0.5 : null ); if (!dataIndices.length) { return; } seriesNestestValue = series.getData().get(dataDim[0], dataIndices[0]); } if (seriesNestestValue == null || !isFinite(seriesNestestValue)) { return; } var diff = value - seriesNestestValue; var dist2 = Math.abs(diff); if (dist2 <= minDist) { if (dist2 < minDist || diff >= 0 && minDiff < 0) { minDist = dist2; minDiff = diff; snapToValue = seriesNestestValue; payloadBatch.length = 0; } each$f(dataIndices, function(dataIndex) { payloadBatch.push({ seriesIndex: series.seriesIndex, dataIndexInside: dataIndex, dataIndex: series.getData().getRawIndex(dataIndex) }); }); } }); return { payloadBatch, snapToValue }; } function showPointer(showValueMap, axisInfo, value, payloadBatch) { showValueMap[axisInfo.key] = { value, payloadBatch }; } function showTooltip(dataByCoordSys, axisInfo, payloadInfo, value) { var payloadBatch = payloadInfo.payloadBatch; var axis = axisInfo.axis; var axisModel = axis.model; var axisPointerModel = axisInfo.axisPointerModel; if (!axisInfo.triggerTooltip || !payloadBatch.length) { return; } var coordSysModel = axisInfo.coordSys.model; var coordSysKey = makeKey(coordSysModel); var coordSysItem = dataByCoordSys.map[coordSysKey]; if (!coordSysItem) { coordSysItem = dataByCoordSys.map[coordSysKey] = { coordSysId: coordSysModel.id, coordSysIndex: coordSysModel.componentIndex, coordSysType: coordSysModel.type, coordSysMainType: coordSysModel.mainType, dataByAxis: [] }; dataByCoordSys.list.push(coordSysItem); } coordSysItem.dataByAxis.push({ axisDim: axis.dim, axisIndex: axisModel.componentIndex, axisType: axisModel.type, axisId: axisModel.id, value, // Caustion: viewHelper.getValueLabel is actually on "view stage", which // depends that all models have been updated. So it should not be performed // here. Considering axisPointerModel used here is volatile, which is hard // to be retrieve in TooltipView, we prepare parameters here. valueLabelOpt: { precision: axisPointerModel.get(["label", "precision"]), formatter: axisPointerModel.get(["label", "formatter"]) }, seriesDataIndices: payloadBatch.slice() }); } function updateModelActually(showValueMap, axesInfo, outputPayload) { var outputAxesInfo = outputPayload.axesInfo = []; each$f(axesInfo, function(axisInfo, key) { var option = axisInfo.axisPointerModel.option; var valItem = showValueMap[key]; if (valItem) { !axisInfo.useHandle && (option.status = "show"); option.value = valItem.value; option.seriesDataIndices = (valItem.payloadBatch || []).slice(); } else { !axisInfo.useHandle && (option.status = "hide"); } option.status === "show" && outputAxesInfo.push({ axisDim: axisInfo.axis.dim, axisIndex: axisInfo.axis.model.componentIndex, value: option.value }); }); } function dispatchTooltipActually(dataByCoordSys, point, payload, dispatchAction2) { if (illegalPoint(point) || !dataByCoordSys.list.length) { dispatchAction2({ type: "hideTip" }); return; } var sampleItem = ((dataByCoordSys.list[0].dataByAxis[0] || {}).seriesDataIndices || [])[0] || {}; dispatchAction2({ type: "showTip", escapeConnect: true, x: point[0], y: point[1], tooltipOption: payload.tooltipOption, position: payload.position, dataIndexInside: sampleItem.dataIndexInside, dataIndex: sampleItem.dataIndex, seriesIndex: sampleItem.seriesIndex, dataByCoordSys: dataByCoordSys.list }); } function dispatchHighDownActually(axesInfo, dispatchAction2, api) { var zr = api.getZr(); var highDownKey = "axisPointerLastHighlights"; var lastHighlights = inner$9(zr)[highDownKey] || {}; var newHighlights = inner$9(zr)[highDownKey] = {}; each$f(axesInfo, function(axisInfo, key) { var option = axisInfo.axisPointerModel.option; option.status === "show" && axisInfo.triggerEmphasis && each$f(option.seriesDataIndices, function(batchItem) { var key2 = batchItem.seriesIndex + " | " + batchItem.dataIndex; newHighlights[key2] = batchItem; }); }); var toHighlight = []; var toDownplay = []; each$f(lastHighlights, function(batchItem, key) { !newHighlights[key] && toDownplay.push(batchItem); }); each$f(newHighlights, function(batchItem, key) { !lastHighlights[key] && toHighlight.push(batchItem); }); toDownplay.length && api.dispatchAction({ type: "downplay", escapeConnect: true, // Not blur others when highlight in axisPointer. notBlur: true, batch: toDownplay }); toHighlight.length && api.dispatchAction({ type: "highlight", escapeConnect: true, // Not blur others when highlight in axisPointer. notBlur: true, batch: toHighlight }); } function findInputAxisInfo(inputAxesInfo, axisInfo) { for (var i = 0; i < (inputAxesInfo || []).length; i++) { var inputAxisInfo = inputAxesInfo[i]; if (axisInfo.axis.dim === inputAxisInfo.axisDim && axisInfo.axis.model.componentIndex === inputAxisInfo.axisIndex) { return inputAxisInfo; } } } function makeMapperParam(axisInfo) { var axisModel = axisInfo.axis.model; var item = {}; var dim = item.axisDim = axisInfo.axis.dim; item.axisIndex = item[dim + "AxisIndex"] = axisModel.componentIndex; item.axisName = item[dim + "AxisName"] = axisModel.name; item.axisId = item[dim + "AxisId"] = axisModel.id; return item; } function illegalPoint(point) { return !point || point[0] == null || isNaN(point[0]) || point[1] == null || isNaN(point[1]); } function install$s(registers) { AxisView.registerAxisPointerClass("CartesianAxisPointer", CartesianAxisPointer); registers.registerComponentModel(AxisPointerModel); registers.registerComponentView(AxisPointerView); registers.registerPreprocessor(function(option) { if (option) { (!option.axisPointer || option.axisPointer.length === 0) && (option.axisPointer = {}); var link = option.axisPointer.link; if (link && !isArray$1(link)) { option.axisPointer.link = [link]; } } }); registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, function(ecModel, api) { ecModel.getComponent("axisPointer").coordSysAxesInfo = collect(ecModel, api); }); registers.registerAction({ type: "updateAxisPointer", event: "updateAxisPointer", update: ":updateAxisPointer" }, axisTrigger); } function install$r(registers) { use(install$P); use(install$s); } var PolarAxisPointer = ( /** @class */ (function(_super) { __extends(PolarAxisPointer2, _super); function PolarAxisPointer2() { return _super !== null && _super.apply(this, arguments) || this; } PolarAxisPointer2.prototype.makeElOption = function(elOption, value, axisModel, axisPointerModel, api) { var axis = axisModel.axis; if (axis.dim === "angle") { this.animationThreshold = Math.PI / 18; } var polar = axis.polar; var otherAxis = polar.getOtherAxis(axis); var otherExtent = otherAxis.getExtent(); var coordValue = axis.dataToCoord(value); var axisPointerType = axisPointerModel.get("type"); if (axisPointerType && axisPointerType !== "none") { var elStyle = buildElStyle(axisPointerModel); var pointerOption = pointerShapeBuilder$1[axisPointerType](axis, polar, coordValue, otherExtent); pointerOption.style = elStyle; elOption.graphicKey = pointerOption.type; elOption.pointer = pointerOption; } var labelMargin = axisPointerModel.get(["label", "margin"]); var labelPos = getLabelPosition(value, axisModel, axisPointerModel, polar, labelMargin); buildLabelElOption(elOption, axisModel, axisPointerModel, api, labelPos); }; return PolarAxisPointer2; })(BaseAxisPointer) ); function getLabelPosition(value, axisModel, axisPointerModel, polar, labelMargin) { var axis = axisModel.axis; var coord = axis.dataToCoord(value); var axisAngle = polar.getAngleAxis().getExtent()[0]; axisAngle = axisAngle / 180 * Math.PI; var radiusExtent = polar.getRadiusAxis().getExtent(); var position2; var align; var verticalAlign; if (axis.dim === "radius") { var transform2 = create$1(); rotate(transform2, transform2, axisAngle); translate(transform2, transform2, [polar.cx, polar.cy]); position2 = applyTransform([coord, -labelMargin], transform2); var labelRotation = axisModel.getModel("axisLabel").get("rotate") || 0; var labelLayout2 = AxisBuilder.innerTextLayout(axisAngle, labelRotation * Math.PI / 180, -1); align = labelLayout2.textAlign; verticalAlign = labelLayout2.textVerticalAlign; } else { var r = radiusExtent[1]; position2 = polar.coordToPoint([r + labelMargin, coord]); var cx = polar.cx; var cy = polar.cy; align = Math.abs(position2[0] - cx) / r < 0.3 ? "center" : position2[0] > cx ? "left" : "right"; verticalAlign = Math.abs(position2[1] - cy) / r < 0.3 ? "middle" : position2[1] > cy ? "top" : "bottom"; } return { position: position2, align, verticalAlign }; } var pointerShapeBuilder$1 = { line: function(axis, polar, coordValue, otherExtent) { return axis.dim === "angle" ? { type: "Line", shape: makeLineShape(polar.coordToPoint([otherExtent[0], coordValue]), polar.coordToPoint([otherExtent[1], coordValue])) } : { type: "Circle", shape: { cx: polar.cx, cy: polar.cy, r: coordValue } }; }, shadow: function(axis, polar, coordValue, otherExtent) { var bandWidth = Math.max(1, axis.getBandWidth()); var radian = Math.PI / 180; return axis.dim === "angle" ? { type: "Sector", shape: makeSectorShape( polar.cx, polar.cy, otherExtent[0], otherExtent[1], // In ECharts y is negative if angle is positive (-coordValue - bandWidth / 2) * radian, (-coordValue + bandWidth / 2) * radian ) } : { type: "Sector", shape: makeSectorShape(polar.cx, polar.cy, coordValue - bandWidth / 2, coordValue + bandWidth / 2, 0, Math.PI * 2) }; } }; var PolarModel = ( /** @class */ (function(_super) { __extends(PolarModel2, _super); function PolarModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = PolarModel2.type; return _this; } PolarModel2.prototype.findAxisModel = function(axisType) { var foundAxisModel; var ecModel = this.ecModel; ecModel.eachComponent(axisType, function(axisModel) { if (axisModel.getCoordSysModel() === this) { foundAxisModel = axisModel; } }, this); return foundAxisModel; }; PolarModel2.type = "polar"; PolarModel2.dependencies = ["radiusAxis", "angleAxis"]; PolarModel2.defaultOption = { // zlevel: 0, z: 0, center: ["50%", "50%"], radius: "80%" }; return PolarModel2; })(ComponentModel) ); var PolarAxisModel = ( /** @class */ (function(_super) { __extends(PolarAxisModel2, _super); function PolarAxisModel2() { return _super !== null && _super.apply(this, arguments) || this; } PolarAxisModel2.prototype.getCoordSysModel = function() { return this.getReferringComponents("polar", SINGLE_REFERRING).models[0]; }; PolarAxisModel2.type = "polarAxis"; return PolarAxisModel2; })(ComponentModel) ); mixin(PolarAxisModel, AxisModelCommonMixin); var AngleAxisModel = ( /** @class */ (function(_super) { __extends(AngleAxisModel2, _super); function AngleAxisModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = AngleAxisModel2.type; return _this; } AngleAxisModel2.type = "angleAxis"; return AngleAxisModel2; })(PolarAxisModel) ); var RadiusAxisModel = ( /** @class */ (function(_super) { __extends(RadiusAxisModel2, _super); function RadiusAxisModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = RadiusAxisModel2.type; return _this; } RadiusAxisModel2.type = "radiusAxis"; return RadiusAxisModel2; })(PolarAxisModel) ); var RadiusAxis = ( /** @class */ (function(_super) { __extends(RadiusAxis2, _super); function RadiusAxis2(scale2, radiusExtent) { return _super.call(this, "radius", scale2, radiusExtent) || this; } RadiusAxis2.prototype.pointToData = function(point, clamp2) { return this.polar.pointToData(point, clamp2)[this.dim === "radius" ? 0 : 1]; }; return RadiusAxis2; })(Axis) ); RadiusAxis.prototype.dataToRadius = Axis.prototype.dataToCoord; RadiusAxis.prototype.radiusToData = Axis.prototype.coordToData; var inner$8 = makeInner(); var AngleAxis = ( /** @class */ (function(_super) { __extends(AngleAxis2, _super); function AngleAxis2(scale2, angleExtent) { return _super.call(this, "angle", scale2, angleExtent || [0, 360]) || this; } AngleAxis2.prototype.pointToData = function(point, clamp2) { return this.polar.pointToData(point, clamp2)[this.dim === "radius" ? 0 : 1]; }; AngleAxis2.prototype.calculateCategoryInterval = function() { var axis = this; var labelModel = axis.getLabelModel(); var ordinalScale = axis.scale; var ordinalExtent = ordinalScale.getExtent(); var tickCount = ordinalScale.count(); if (ordinalExtent[1] - ordinalExtent[0] < 1) { return 0; } var tickValue = ordinalExtent[0]; var unitSpan = axis.dataToCoord(tickValue + 1) - axis.dataToCoord(tickValue); var unitH = Math.abs(unitSpan); var rect = getBoundingRect(tickValue == null ? "" : tickValue + "", labelModel.getFont(), "center", "top"); var maxH = Math.max(rect.height, 7); var dh = maxH / unitH; isNaN(dh) && (dh = Infinity); var interval = Math.max(0, Math.floor(dh)); var cache = inner$8(axis.model); var lastAutoInterval = cache.lastAutoInterval; var lastTickCount = cache.lastTickCount; if (lastAutoInterval != null && lastTickCount != null && Math.abs(lastAutoInterval - interval) <= 1 && Math.abs(lastTickCount - tickCount) <= 1 && lastAutoInterval > interval) { interval = lastAutoInterval; } else { cache.lastTickCount = tickCount; cache.lastAutoInterval = interval; } return interval; }; return AngleAxis2; })(Axis) ); AngleAxis.prototype.dataToAngle = Axis.prototype.dataToCoord; AngleAxis.prototype.angleToData = Axis.prototype.coordToData; var polarDimensions = ["radius", "angle"]; var Polar = ( /** @class */ (function() { function Polar2(name) { this.dimensions = polarDimensions; this.type = "polar"; this.cx = 0; this.cy = 0; this._radiusAxis = new RadiusAxis(); this._angleAxis = new AngleAxis(); this.axisPointerEnabled = true; this.name = name || ""; this._radiusAxis.polar = this._angleAxis.polar = this; } Polar2.prototype.containPoint = function(point) { var coord = this.pointToCoord(point); return this._radiusAxis.contain(coord[0]) && this._angleAxis.contain(coord[1]); }; Polar2.prototype.containData = function(data) { return this._radiusAxis.containData(data[0]) && this._angleAxis.containData(data[1]); }; Polar2.prototype.getAxis = function(dim) { var key = "_" + dim + "Axis"; return this[key]; }; Polar2.prototype.getAxes = function() { return [this._radiusAxis, this._angleAxis]; }; Polar2.prototype.getAxesByScale = function(scaleType) { var axes = []; var angleAxis = this._angleAxis; var radiusAxis = this._radiusAxis; angleAxis.scale.type === scaleType && axes.push(angleAxis); radiusAxis.scale.type === scaleType && axes.push(radiusAxis); return axes; }; Polar2.prototype.getAngleAxis = function() { return this._angleAxis; }; Polar2.prototype.getRadiusAxis = function() { return this._radiusAxis; }; Polar2.prototype.getOtherAxis = function(axis) { var angleAxis = this._angleAxis; return axis === angleAxis ? this._radiusAxis : angleAxis; }; Polar2.prototype.getBaseAxis = function() { return this.getAxesByScale("ordinal")[0] || this.getAxesByScale("time")[0] || this.getAngleAxis(); }; Polar2.prototype.getTooltipAxes = function(dim) { var baseAxis = dim != null && dim !== "auto" ? this.getAxis(dim) : this.getBaseAxis(); return { baseAxes: [baseAxis], otherAxes: [this.getOtherAxis(baseAxis)] }; }; Polar2.prototype.dataToPoint = function(data, clamp2) { return this.coordToPoint([this._radiusAxis.dataToRadius(data[0], clamp2), this._angleAxis.dataToAngle(data[1], clamp2)]); }; Polar2.prototype.pointToData = function(point, clamp2) { var coord = this.pointToCoord(point); return [this._radiusAxis.radiusToData(coord[0], clamp2), this._angleAxis.angleToData(coord[1], clamp2)]; }; Polar2.prototype.pointToCoord = function(point) { var dx = point[0] - this.cx; var dy = point[1] - this.cy; var angleAxis = this.getAngleAxis(); var extent = angleAxis.getExtent(); var minAngle = Math.min(extent[0], extent[1]); var maxAngle = Math.max(extent[0], extent[1]); angleAxis.inverse ? minAngle = maxAngle - 360 : maxAngle = minAngle + 360; var radius = Math.sqrt(dx * dx + dy * dy); dx /= radius; dy /= radius; var radian = Math.atan2(-dy, dx) / Math.PI * 180; var dir3 = radian < minAngle ? 1 : -1; while (radian < minAngle || radian > maxAngle) { radian += dir3 * 360; } return [radius, radian]; }; Polar2.prototype.coordToPoint = function(coord) { var radius = coord[0]; var radian = coord[1] / 180 * Math.PI; var x = Math.cos(radian) * radius + this.cx; var y = -Math.sin(radian) * radius + this.cy; return [x, y]; }; Polar2.prototype.getArea = function() { var angleAxis = this.getAngleAxis(); var radiusAxis = this.getRadiusAxis(); var radiusExtent = radiusAxis.getExtent().slice(); radiusExtent[0] > radiusExtent[1] && radiusExtent.reverse(); var angleExtent = angleAxis.getExtent(); var RADIAN2 = Math.PI / 180; var EPSILON = 1e-4; return { cx: this.cx, cy: this.cy, r0: radiusExtent[0], r: radiusExtent[1], startAngle: -angleExtent[0] * RADIAN2, endAngle: -angleExtent[1] * RADIAN2, clockwise: angleAxis.inverse, contain: function(x, y) { var dx = x - this.cx; var dy = y - this.cy; var d2 = dx * dx + dy * dy; var r = this.r; var r0 = this.r0; return r !== r0 && d2 - EPSILON <= r * r && d2 + EPSILON >= r0 * r0; } }; }; Polar2.prototype.convertToPixel = function(ecModel, finder, value) { var coordSys = getCoordSys$2(finder); return coordSys === this ? this.dataToPoint(value) : null; }; Polar2.prototype.convertFromPixel = function(ecModel, finder, pixel) { var coordSys = getCoordSys$2(finder); return coordSys === this ? this.pointToData(pixel) : null; }; return Polar2; })() ); function getCoordSys$2(finder) { var seriesModel = finder.seriesModel; var polarModel = finder.polarModel; return polarModel && polarModel.coordinateSystem || seriesModel && seriesModel.coordinateSystem; } function resizePolar(polar, polarModel, api) { var center2 = polarModel.get("center"); var width = api.getWidth(); var height = api.getHeight(); polar.cx = parsePercent(center2[0], width); polar.cy = parsePercent(center2[1], height); var radiusAxis = polar.getRadiusAxis(); var size = Math.min(width, height) / 2; var radius = polarModel.get("radius"); if (radius == null) { radius = [0, "100%"]; } else if (!isArray$1(radius)) { radius = [0, radius]; } var parsedRadius = [parsePercent(radius[0], size), parsePercent(radius[1], size)]; radiusAxis.inverse ? radiusAxis.setExtent(parsedRadius[1], parsedRadius[0]) : radiusAxis.setExtent(parsedRadius[0], parsedRadius[1]); } function updatePolarScale(ecModel, api) { var polar = this; var angleAxis = polar.getAngleAxis(); var radiusAxis = polar.getRadiusAxis(); angleAxis.scale.setExtent(Infinity, -Infinity); radiusAxis.scale.setExtent(Infinity, -Infinity); ecModel.eachSeries(function(seriesModel) { if (seriesModel.coordinateSystem === polar) { var data_1 = seriesModel.getData(); each$f(getDataDimensionsOnAxis(data_1, "radius"), function(dim) { radiusAxis.scale.unionExtentFromData(data_1, dim); }); each$f(getDataDimensionsOnAxis(data_1, "angle"), function(dim) { angleAxis.scale.unionExtentFromData(data_1, dim); }); } }); niceScaleExtent(angleAxis.scale, angleAxis.model); niceScaleExtent(radiusAxis.scale, radiusAxis.model); if (angleAxis.type === "category" && !angleAxis.onBand) { var extent = angleAxis.getExtent(); var diff = 360 / angleAxis.scale.count(); angleAxis.inverse ? extent[1] += diff : extent[1] -= diff; angleAxis.setExtent(extent[0], extent[1]); } } function isAngleAxisModel(axisModel) { return axisModel.mainType === "angleAxis"; } function setAxis(axis, axisModel) { var _a2; axis.type = axisModel.get("type"); axis.scale = createScaleByModel$1(axisModel); axis.onBand = axisModel.get("boundaryGap") && axis.type === "category"; axis.inverse = axisModel.get("inverse"); if (isAngleAxisModel(axisModel)) { axis.inverse = axis.inverse !== axisModel.get("clockwise"); var startAngle = axisModel.get("startAngle"); var endAngle = (_a2 = axisModel.get("endAngle")) !== null && _a2 !== void 0 ? _a2 : startAngle + (axis.inverse ? -360 : 360); axis.setExtent(startAngle, endAngle); } axisModel.axis = axis; axis.model = axisModel; } var polarCreator = { dimensions: polarDimensions, create: function(ecModel, api) { var polarList = []; ecModel.eachComponent("polar", function(polarModel, idx) { var polar = new Polar(idx + ""); polar.update = updatePolarScale; var radiusAxis = polar.getRadiusAxis(); var angleAxis = polar.getAngleAxis(); var radiusAxisModel = polarModel.findAxisModel("radiusAxis"); var angleAxisModel = polarModel.findAxisModel("angleAxis"); setAxis(radiusAxis, radiusAxisModel); setAxis(angleAxis, angleAxisModel); resizePolar(polar, polarModel, api); polarList.push(polar); polarModel.coordinateSystem = polar; polar.model = polarModel; }); ecModel.eachSeries(function(seriesModel) { if (seriesModel.get("coordinateSystem") === "polar") { var polarModel = seriesModel.getReferringComponents("polar", SINGLE_REFERRING).models[0]; seriesModel.coordinateSystem = polarModel.coordinateSystem; } }); return polarList; } }; var elementList = ["axisLine", "axisLabel", "axisTick", "minorTick", "splitLine", "minorSplitLine", "splitArea"]; function getAxisLineShape(polar, rExtent, angle) { rExtent[1] > rExtent[0] && (rExtent = rExtent.slice().reverse()); var start = polar.coordToPoint([rExtent[0], angle]); var end = polar.coordToPoint([rExtent[1], angle]); return { x1: start[0], y1: start[1], x2: end[0], y2: end[1] }; } function getRadiusIdx(polar) { var radiusAxis = polar.getRadiusAxis(); return radiusAxis.inverse ? 0 : 1; } function fixAngleOverlap(list) { var firstItem = list[0]; var lastItem = list[list.length - 1]; if (firstItem && lastItem && Math.abs(Math.abs(firstItem.coord - lastItem.coord) - 360) < 1e-4) { list.pop(); } } var AngleAxisView = ( /** @class */ (function(_super) { __extends(AngleAxisView2, _super); function AngleAxisView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = AngleAxisView2.type; _this.axisPointerClass = "PolarAxisPointer"; return _this; } AngleAxisView2.prototype.render = function(angleAxisModel, ecModel) { this.group.removeAll(); if (!angleAxisModel.get("show")) { return; } var angleAxis = angleAxisModel.axis; var polar = angleAxis.polar; var radiusExtent = polar.getRadiusAxis().getExtent(); var ticksAngles = angleAxis.getTicksCoords(); var minorTickAngles = angleAxis.getMinorTicksCoords(); var labels = map$1(angleAxis.getViewLabels(), function(labelItem) { labelItem = clone$1(labelItem); var scale2 = angleAxis.scale; var tickValue = scale2.type === "ordinal" ? scale2.getRawOrdinalNumber(labelItem.tickValue) : labelItem.tickValue; labelItem.coord = angleAxis.dataToCoord(tickValue); return labelItem; }); fixAngleOverlap(labels); fixAngleOverlap(ticksAngles); each$f(elementList, function(name) { if (angleAxisModel.get([name, "show"]) && (!angleAxis.scale.isBlank() || name === "axisLine")) { angelAxisElementsBuilders[name](this.group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent, labels); } }, this); }; AngleAxisView2.type = "angleAxis"; return AngleAxisView2; })(AxisView) ); var angelAxisElementsBuilders = { axisLine: function(group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { var lineStyleModel = angleAxisModel.getModel(["axisLine", "lineStyle"]); var angleAxis = polar.getAngleAxis(); var RADIAN2 = Math.PI / 180; var angleExtent = angleAxis.getExtent(); var rId = getRadiusIdx(polar); var r0Id = rId ? 0 : 1; var shape; var shapeType = Math.abs(angleExtent[1] - angleExtent[0]) === 360 ? "Circle" : "Arc"; if (radiusExtent[r0Id] === 0) { shape = new graphic[shapeType]({ shape: { cx: polar.cx, cy: polar.cy, r: radiusExtent[rId], startAngle: -angleExtent[0] * RADIAN2, endAngle: -angleExtent[1] * RADIAN2, clockwise: angleAxis.inverse }, style: lineStyleModel.getLineStyle(), z2: 1, silent: true }); } else { shape = new Ring({ shape: { cx: polar.cx, cy: polar.cy, r: radiusExtent[rId], r0: radiusExtent[r0Id] }, style: lineStyleModel.getLineStyle(), z2: 1, silent: true }); } shape.style.fill = null; group.add(shape); }, axisTick: function(group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { var tickModel = angleAxisModel.getModel("axisTick"); var tickLen = (tickModel.get("inside") ? -1 : 1) * tickModel.get("length"); var radius = radiusExtent[getRadiusIdx(polar)]; var lines = map$1(ticksAngles, function(tickAngleItem) { return new Line$1({ shape: getAxisLineShape(polar, [radius, radius + tickLen], tickAngleItem.coord) }); }); group.add(mergePath(lines, { style: defaults(tickModel.getModel("lineStyle").getLineStyle(), { stroke: angleAxisModel.get(["axisLine", "lineStyle", "color"]) }) })); }, minorTick: function(group, angleAxisModel, polar, tickAngles, minorTickAngles, radiusExtent) { if (!minorTickAngles.length) { return; } var tickModel = angleAxisModel.getModel("axisTick"); var minorTickModel = angleAxisModel.getModel("minorTick"); var tickLen = (tickModel.get("inside") ? -1 : 1) * minorTickModel.get("length"); var radius = radiusExtent[getRadiusIdx(polar)]; var lines = []; for (var i = 0; i < minorTickAngles.length; i++) { for (var k = 0; k < minorTickAngles[i].length; k++) { lines.push(new Line$1({ shape: getAxisLineShape(polar, [radius, radius + tickLen], minorTickAngles[i][k].coord) })); } } group.add(mergePath(lines, { style: defaults(minorTickModel.getModel("lineStyle").getLineStyle(), defaults(tickModel.getLineStyle(), { stroke: angleAxisModel.get(["axisLine", "lineStyle", "color"]) })) })); }, axisLabel: function(group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent, labels) { var rawCategoryData = angleAxisModel.getCategories(true); var commonLabelModel = angleAxisModel.getModel("axisLabel"); var labelMargin = commonLabelModel.get("margin"); var triggerEvent = angleAxisModel.get("triggerEvent"); each$f(labels, function(labelItem, idx) { var labelModel = commonLabelModel; var tickValue = labelItem.tickValue; var r = radiusExtent[getRadiusIdx(polar)]; var p = polar.coordToPoint([r + labelMargin, labelItem.coord]); var cx = polar.cx; var cy = polar.cy; var labelTextAlign = Math.abs(p[0] - cx) / r < 0.3 ? "center" : p[0] > cx ? "left" : "right"; var labelTextVerticalAlign = Math.abs(p[1] - cy) / r < 0.3 ? "middle" : p[1] > cy ? "top" : "bottom"; if (rawCategoryData && rawCategoryData[tickValue]) { var rawCategoryItem = rawCategoryData[tickValue]; if (isObject$3(rawCategoryItem) && rawCategoryItem.textStyle) { labelModel = new Model(rawCategoryItem.textStyle, commonLabelModel, commonLabelModel.ecModel); } } var textEl = new ZRText({ silent: AxisBuilder.isLabelSilent(angleAxisModel), style: createTextStyle(labelModel, { x: p[0], y: p[1], fill: labelModel.getTextColor() || angleAxisModel.get(["axisLine", "lineStyle", "color"]), text: labelItem.formattedLabel, align: labelTextAlign, verticalAlign: labelTextVerticalAlign }) }); group.add(textEl); if (triggerEvent) { var eventData = AxisBuilder.makeAxisEventDataBase(angleAxisModel); eventData.targetType = "axisLabel"; eventData.value = labelItem.rawLabel; getECData(textEl).eventData = eventData; } }, this); }, splitLine: function(group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { var splitLineModel = angleAxisModel.getModel("splitLine"); var lineStyleModel = splitLineModel.getModel("lineStyle"); var lineColors = lineStyleModel.get("color"); var lineCount = 0; lineColors = lineColors instanceof Array ? lineColors : [lineColors]; var splitLines = []; for (var i = 0; i < ticksAngles.length; i++) { var colorIndex = lineCount++ % lineColors.length; splitLines[colorIndex] = splitLines[colorIndex] || []; splitLines[colorIndex].push(new Line$1({ shape: getAxisLineShape(polar, radiusExtent, ticksAngles[i].coord) })); } for (var i = 0; i < splitLines.length; i++) { group.add(mergePath(splitLines[i], { style: defaults({ stroke: lineColors[i % lineColors.length] }, lineStyleModel.getLineStyle()), silent: true, z: angleAxisModel.get("z") })); } }, minorSplitLine: function(group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { if (!minorTickAngles.length) { return; } var minorSplitLineModel = angleAxisModel.getModel("minorSplitLine"); var lineStyleModel = minorSplitLineModel.getModel("lineStyle"); var lines = []; for (var i = 0; i < minorTickAngles.length; i++) { for (var k = 0; k < minorTickAngles[i].length; k++) { lines.push(new Line$1({ shape: getAxisLineShape(polar, radiusExtent, minorTickAngles[i][k].coord) })); } } group.add(mergePath(lines, { style: lineStyleModel.getLineStyle(), silent: true, z: angleAxisModel.get("z") })); }, splitArea: function(group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { if (!ticksAngles.length) { return; } var splitAreaModel = angleAxisModel.getModel("splitArea"); var areaStyleModel = splitAreaModel.getModel("areaStyle"); var areaColors = areaStyleModel.get("color"); var lineCount = 0; areaColors = areaColors instanceof Array ? areaColors : [areaColors]; var splitAreas = []; var RADIAN2 = Math.PI / 180; var prevAngle = -ticksAngles[0].coord * RADIAN2; var r0 = Math.min(radiusExtent[0], radiusExtent[1]); var r1 = Math.max(radiusExtent[0], radiusExtent[1]); var clockwise = angleAxisModel.get("clockwise"); for (var i = 1, len2 = ticksAngles.length; i <= len2; i++) { var coord = i === len2 ? ticksAngles[0].coord : ticksAngles[i].coord; var colorIndex = lineCount++ % areaColors.length; splitAreas[colorIndex] = splitAreas[colorIndex] || []; splitAreas[colorIndex].push(new Sector({ shape: { cx: polar.cx, cy: polar.cy, r0, r: r1, startAngle: prevAngle, endAngle: -coord * RADIAN2, clockwise }, silent: true })); prevAngle = -coord * RADIAN2; } for (var i = 0; i < splitAreas.length; i++) { group.add(mergePath(splitAreas[i], { style: defaults({ fill: areaColors[i % areaColors.length] }, areaStyleModel.getAreaStyle()), silent: true })); } } }; var axisBuilderAttrs$1 = ["axisLine", "axisTickLabel", "axisName"]; var selfBuilderAttrs$1 = ["splitLine", "splitArea", "minorSplitLine"]; var RadiusAxisView = ( /** @class */ (function(_super) { __extends(RadiusAxisView2, _super); function RadiusAxisView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = RadiusAxisView2.type; _this.axisPointerClass = "PolarAxisPointer"; return _this; } RadiusAxisView2.prototype.render = function(radiusAxisModel, ecModel) { this.group.removeAll(); if (!radiusAxisModel.get("show")) { return; } var oldAxisGroup = this._axisGroup; var newAxisGroup = this._axisGroup = new Group$3(); this.group.add(newAxisGroup); var radiusAxis = radiusAxisModel.axis; var polar = radiusAxis.polar; var angleAxis = polar.getAngleAxis(); var ticksCoords = radiusAxis.getTicksCoords(); var minorTicksCoords = radiusAxis.getMinorTicksCoords(); var axisAngle = angleAxis.getExtent()[0]; var radiusExtent = radiusAxis.getExtent(); var layout2 = layoutAxis(polar, radiusAxisModel, axisAngle); var axisBuilder = new AxisBuilder(radiusAxisModel, layout2); each$f(axisBuilderAttrs$1, axisBuilder.add, axisBuilder); newAxisGroup.add(axisBuilder.getGroup()); groupTransition(oldAxisGroup, newAxisGroup, radiusAxisModel); each$f(selfBuilderAttrs$1, function(name) { if (radiusAxisModel.get([name, "show"]) && !radiusAxis.scale.isBlank()) { axisElementBuilders$1[name](this.group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords, minorTicksCoords); } }, this); }; RadiusAxisView2.type = "radiusAxis"; return RadiusAxisView2; })(AxisView) ); var axisElementBuilders$1 = { splitLine: function(group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords) { var splitLineModel = radiusAxisModel.getModel("splitLine"); var lineStyleModel = splitLineModel.getModel("lineStyle"); var lineColors = lineStyleModel.get("color"); var lineCount = 0; var angleAxis = polar.getAngleAxis(); var RADIAN2 = Math.PI / 180; var angleExtent = angleAxis.getExtent(); var shapeType = Math.abs(angleExtent[1] - angleExtent[0]) === 360 ? "Circle" : "Arc"; lineColors = lineColors instanceof Array ? lineColors : [lineColors]; var splitLines = []; for (var i = 0; i < ticksCoords.length; i++) { var colorIndex = lineCount++ % lineColors.length; splitLines[colorIndex] = splitLines[colorIndex] || []; splitLines[colorIndex].push(new graphic[shapeType]({ shape: { cx: polar.cx, cy: polar.cy, // ensure circle radius >= 0 r: Math.max(ticksCoords[i].coord, 0), startAngle: -angleExtent[0] * RADIAN2, endAngle: -angleExtent[1] * RADIAN2, clockwise: angleAxis.inverse } })); } for (var i = 0; i < splitLines.length; i++) { group.add(mergePath(splitLines[i], { style: defaults({ stroke: lineColors[i % lineColors.length], fill: null }, lineStyleModel.getLineStyle()), silent: true })); } }, minorSplitLine: function(group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords, minorTicksCoords) { if (!minorTicksCoords.length) { return; } var minorSplitLineModel = radiusAxisModel.getModel("minorSplitLine"); var lineStyleModel = minorSplitLineModel.getModel("lineStyle"); var lines = []; for (var i = 0; i < minorTicksCoords.length; i++) { for (var k = 0; k < minorTicksCoords[i].length; k++) { lines.push(new Circle({ shape: { cx: polar.cx, cy: polar.cy, r: minorTicksCoords[i][k].coord } })); } } group.add(mergePath(lines, { style: defaults({ fill: null }, lineStyleModel.getLineStyle()), silent: true })); }, splitArea: function(group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords) { if (!ticksCoords.length) { return; } var splitAreaModel = radiusAxisModel.getModel("splitArea"); var areaStyleModel = splitAreaModel.getModel("areaStyle"); var areaColors = areaStyleModel.get("color"); var lineCount = 0; areaColors = areaColors instanceof Array ? areaColors : [areaColors]; var splitAreas = []; var prevRadius = ticksCoords[0].coord; for (var i = 1; i < ticksCoords.length; i++) { var colorIndex = lineCount++ % areaColors.length; splitAreas[colorIndex] = splitAreas[colorIndex] || []; splitAreas[colorIndex].push(new Sector({ shape: { cx: polar.cx, cy: polar.cy, r0: prevRadius, r: ticksCoords[i].coord, startAngle: 0, endAngle: Math.PI * 2 }, silent: true })); prevRadius = ticksCoords[i].coord; } for (var i = 0; i < splitAreas.length; i++) { group.add(mergePath(splitAreas[i], { style: defaults({ fill: areaColors[i % areaColors.length] }, areaStyleModel.getAreaStyle()), silent: true })); } } }; function layoutAxis(polar, radiusAxisModel, axisAngle) { return { position: [polar.cx, polar.cy], rotation: axisAngle / 180 * Math.PI, labelDirection: -1, tickDirection: -1, nameDirection: 1, labelRotate: radiusAxisModel.getModel("axisLabel").get("rotate"), // Over splitLine and splitArea z2: 1 }; } function getSeriesStackId(seriesModel) { return seriesModel.get("stack") || "__ec_stack_" + seriesModel.seriesIndex; } function getAxisKey(polar, axis) { return axis.dim + polar.model.componentIndex; } function barLayoutPolar(seriesType2, ecModel, api) { var lastStackCoords = {}; var barWidthAndOffset = calRadialBar(filter(ecModel.getSeriesByType(seriesType2), function(seriesModel) { return !ecModel.isSeriesFiltered(seriesModel) && seriesModel.coordinateSystem && seriesModel.coordinateSystem.type === "polar"; })); ecModel.eachSeriesByType(seriesType2, function(seriesModel) { if (seriesModel.coordinateSystem.type !== "polar") { return; } var data = seriesModel.getData(); var polar = seriesModel.coordinateSystem; var baseAxis = polar.getBaseAxis(); var axisKey = getAxisKey(polar, baseAxis); var stackId = getSeriesStackId(seriesModel); var columnLayoutInfo = barWidthAndOffset[axisKey][stackId]; var columnOffset = columnLayoutInfo.offset; var columnWidth = columnLayoutInfo.width; var valueAxis2 = polar.getOtherAxis(baseAxis); var cx = seriesModel.coordinateSystem.cx; var cy = seriesModel.coordinateSystem.cy; var barMinHeight = seriesModel.get("barMinHeight") || 0; var barMinAngle = seriesModel.get("barMinAngle") || 0; lastStackCoords[stackId] = lastStackCoords[stackId] || []; var valueDim = data.mapDimension(valueAxis2.dim); var baseDim = data.mapDimension(baseAxis.dim); var stacked = isDimensionStacked( data, valueDim /* , baseDim */ ); var clampLayout = baseAxis.dim !== "radius" || !seriesModel.get("roundCap", true); var valueAxisModel = valueAxis2.model; var startValue = valueAxisModel.get("startValue"); var valueAxisStart = valueAxis2.dataToCoord(startValue || 0); for (var idx = 0, len2 = data.count(); idx < len2; idx++) { var value = data.get(valueDim, idx); var baseValue = data.get(baseDim, idx); var sign = value >= 0 ? "p" : "n"; var baseCoord = valueAxisStart; if (stacked) { if (!lastStackCoords[stackId][baseValue]) { lastStackCoords[stackId][baseValue] = { p: valueAxisStart, n: valueAxisStart // Negative stack }; } baseCoord = lastStackCoords[stackId][baseValue][sign]; } var r0 = void 0; var r = void 0; var startAngle = void 0; var endAngle = void 0; if (valueAxis2.dim === "radius") { var radiusSpan = valueAxis2.dataToCoord(value) - valueAxisStart; var angle = baseAxis.dataToCoord(baseValue); if (Math.abs(radiusSpan) < barMinHeight) { radiusSpan = (radiusSpan < 0 ? -1 : 1) * barMinHeight; } r0 = baseCoord; r = baseCoord + radiusSpan; startAngle = angle - columnOffset; endAngle = startAngle - columnWidth; stacked && (lastStackCoords[stackId][baseValue][sign] = r); } else { var angleSpan = valueAxis2.dataToCoord(value, clampLayout) - valueAxisStart; var radius = baseAxis.dataToCoord(baseValue); if (Math.abs(angleSpan) < barMinAngle) { angleSpan = (angleSpan < 0 ? -1 : 1) * barMinAngle; } r0 = radius + columnOffset; r = r0 + columnWidth; startAngle = baseCoord; endAngle = baseCoord + angleSpan; stacked && (lastStackCoords[stackId][baseValue][sign] = endAngle); } data.setItemLayout(idx, { cx, cy, r0, r, // Consider that positive angle is anti-clockwise, // while positive radian of sector is clockwise startAngle: -startAngle * Math.PI / 180, endAngle: -endAngle * Math.PI / 180, /** * Keep the same logic with bar in catesion: use end value to * control direction. Notice that if clockwise is true (by * default), the sector will always draw clockwisely, no matter * whether endAngle is greater or less than startAngle. */ clockwise: startAngle >= endAngle }); } }); } function calRadialBar(barSeries) { var columnsMap = {}; each$f(barSeries, function(seriesModel, idx) { var data = seriesModel.getData(); var polar = seriesModel.coordinateSystem; var baseAxis = polar.getBaseAxis(); var axisKey = getAxisKey(polar, baseAxis); var axisExtent = baseAxis.getExtent(); var bandWidth = baseAxis.type === "category" ? baseAxis.getBandWidth() : Math.abs(axisExtent[1] - axisExtent[0]) / data.count(); var columnsOnAxis = columnsMap[axisKey] || { bandWidth, remainedWidth: bandWidth, autoWidthCount: 0, categoryGap: "20%", gap: "30%", stacks: {} }; var stacks = columnsOnAxis.stacks; columnsMap[axisKey] = columnsOnAxis; var stackId = getSeriesStackId(seriesModel); if (!stacks[stackId]) { columnsOnAxis.autoWidthCount++; } stacks[stackId] = stacks[stackId] || { width: 0, maxWidth: 0 }; var barWidth = parsePercent(seriesModel.get("barWidth"), bandWidth); var barMaxWidth = parsePercent(seriesModel.get("barMaxWidth"), bandWidth); var barGap = seriesModel.get("barGap"); var barCategoryGap = seriesModel.get("barCategoryGap"); if (barWidth && !stacks[stackId].width) { barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth); stacks[stackId].width = barWidth; columnsOnAxis.remainedWidth -= barWidth; } barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth); barGap != null && (columnsOnAxis.gap = barGap); barCategoryGap != null && (columnsOnAxis.categoryGap = barCategoryGap); }); var result = {}; each$f(columnsMap, function(columnsOnAxis, coordSysName) { result[coordSysName] = {}; var stacks = columnsOnAxis.stacks; var bandWidth = columnsOnAxis.bandWidth; var categoryGap = parsePercent(columnsOnAxis.categoryGap, bandWidth); var barGapPercent = parsePercent(columnsOnAxis.gap, 1); var remainedWidth = columnsOnAxis.remainedWidth; var autoWidthCount = columnsOnAxis.autoWidthCount; var autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); autoWidth = Math.max(autoWidth, 0); each$f(stacks, function(column, stack) { var maxWidth = column.maxWidth; if (maxWidth && maxWidth < autoWidth) { maxWidth = Math.min(maxWidth, remainedWidth); if (column.width) { maxWidth = Math.min(maxWidth, column.width); } remainedWidth -= maxWidth; column.width = maxWidth; autoWidthCount--; } }); autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); autoWidth = Math.max(autoWidth, 0); var widthSum = 0; var lastColumn; each$f(stacks, function(column, idx) { if (!column.width) { column.width = autoWidth; } lastColumn = column; widthSum += column.width * (1 + barGapPercent); }); if (lastColumn) { widthSum -= lastColumn.width * barGapPercent; } var offset = -widthSum / 2; each$f(stacks, function(column, stackId) { result[coordSysName][stackId] = result[coordSysName][stackId] || { offset, width: column.width }; offset += column.width * (1 + barGapPercent); }); }); return result; } var angleAxisExtraOption = { startAngle: 90, clockwise: true, splitNumber: 12, axisLabel: { rotate: 0 } }; var radiusAxisExtraOption = { splitNumber: 5 }; var PolarView = ( /** @class */ (function(_super) { __extends(PolarView2, _super); function PolarView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = PolarView2.type; return _this; } PolarView2.type = "polar"; return PolarView2; })(ComponentView) ); function install$q(registers) { use(install$s); AxisView.registerAxisPointerClass("PolarAxisPointer", PolarAxisPointer); registers.registerCoordinateSystem("polar", polarCreator); registers.registerComponentModel(PolarModel); registers.registerComponentView(PolarView); axisModelCreator(registers, "angle", AngleAxisModel, angleAxisExtraOption); axisModelCreator(registers, "radius", RadiusAxisModel, radiusAxisExtraOption); registers.registerComponentView(AngleAxisView); registers.registerComponentView(RadiusAxisView); registers.registerLayout(curry$1(barLayoutPolar, "bar")); } function layout$1(axisModel, opt) { opt = opt || {}; var single = axisModel.coordinateSystem; var axis = axisModel.axis; var layout2 = {}; var axisPosition = axis.position; var orient = axis.orient; var rect = single.getRect(); var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height]; var positionMap = { horizontal: { top: rectBound[2], bottom: rectBound[3] }, vertical: { left: rectBound[0], right: rectBound[1] } }; layout2.position = [orient === "vertical" ? positionMap.vertical[axisPosition] : rectBound[0], orient === "horizontal" ? positionMap.horizontal[axisPosition] : rectBound[3]]; var r = { horizontal: 0, vertical: 1 }; layout2.rotation = Math.PI / 2 * r[orient]; var directionMap = { top: -1, bottom: 1, right: 1, left: -1 }; layout2.labelDirection = layout2.tickDirection = layout2.nameDirection = directionMap[axisPosition]; if (axisModel.get(["axisTick", "inside"])) { layout2.tickDirection = -layout2.tickDirection; } if (retrieve(opt.labelInside, axisModel.get(["axisLabel", "inside"]))) { layout2.labelDirection = -layout2.labelDirection; } var labelRotation = opt.rotate; labelRotation == null && (labelRotation = axisModel.get(["axisLabel", "rotate"])); layout2.labelRotation = axisPosition === "top" ? -labelRotation : labelRotation; layout2.z2 = 1; return layout2; } var axisBuilderAttrs = ["axisLine", "axisTickLabel", "axisName"]; var selfBuilderAttrs = ["splitArea", "splitLine"]; var SingleAxisView = ( /** @class */ (function(_super) { __extends(SingleAxisView2, _super); function SingleAxisView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = SingleAxisView2.type; _this.axisPointerClass = "SingleAxisPointer"; return _this; } SingleAxisView2.prototype.render = function(axisModel, ecModel, api, payload) { var group = this.group; group.removeAll(); var oldAxisGroup = this._axisGroup; this._axisGroup = new Group$3(); var layout2 = layout$1(axisModel); var axisBuilder = new AxisBuilder(axisModel, layout2); each$f(axisBuilderAttrs, axisBuilder.add, axisBuilder); group.add(this._axisGroup); group.add(axisBuilder.getGroup()); each$f(selfBuilderAttrs, function(name) { if (axisModel.get([name, "show"])) { axisElementBuilders[name](this, this.group, this._axisGroup, axisModel); } }, this); groupTransition(oldAxisGroup, this._axisGroup, axisModel); _super.prototype.render.call(this, axisModel, ecModel, api, payload); }; SingleAxisView2.prototype.remove = function() { rectCoordAxisHandleRemove(this); }; SingleAxisView2.type = "singleAxis"; return SingleAxisView2; })(AxisView) ); var axisElementBuilders = { splitLine: function(axisView, group, axisGroup, axisModel) { var axis = axisModel.axis; if (axis.scale.isBlank()) { return; } var splitLineModel = axisModel.getModel("splitLine"); var lineStyleModel = splitLineModel.getModel("lineStyle"); var lineColors = lineStyleModel.get("color"); lineColors = lineColors instanceof Array ? lineColors : [lineColors]; var lineWidth = lineStyleModel.get("width"); var gridRect = axisModel.coordinateSystem.getRect(); var isHorizontal = axis.isHorizontal(); var splitLines = []; var lineCount = 0; var ticksCoords = axis.getTicksCoords({ tickModel: splitLineModel }); var p1 = []; var p2 = []; for (var i = 0; i < ticksCoords.length; ++i) { var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord); if (isHorizontal) { p1[0] = tickCoord; p1[1] = gridRect.y; p2[0] = tickCoord; p2[1] = gridRect.y + gridRect.height; } else { p1[0] = gridRect.x; p1[1] = tickCoord; p2[0] = gridRect.x + gridRect.width; p2[1] = tickCoord; } var line = new Line$1({ shape: { x1: p1[0], y1: p1[1], x2: p2[0], y2: p2[1] }, silent: true }); subPixelOptimizeLine(line.shape, lineWidth); var colorIndex = lineCount++ % lineColors.length; splitLines[colorIndex] = splitLines[colorIndex] || []; splitLines[colorIndex].push(line); } var lineStyle = lineStyleModel.getLineStyle(["color"]); for (var i = 0; i < splitLines.length; ++i) { group.add(mergePath(splitLines[i], { style: defaults({ stroke: lineColors[i % lineColors.length] }, lineStyle), silent: true })); } }, splitArea: function(axisView, group, axisGroup, axisModel) { rectCoordAxisBuildSplitArea(axisView, axisGroup, axisModel, axisModel); } }; var SingleAxisModel = ( /** @class */ (function(_super) { __extends(SingleAxisModel2, _super); function SingleAxisModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = SingleAxisModel2.type; return _this; } SingleAxisModel2.prototype.getCoordSysModel = function() { return this; }; SingleAxisModel2.type = "singleAxis"; SingleAxisModel2.layoutMode = "box"; SingleAxisModel2.defaultOption = { left: "5%", top: "5%", right: "5%", bottom: "5%", type: "value", position: "bottom", orient: "horizontal", axisLine: { show: true, lineStyle: { width: 1, type: "solid" } }, // Single coordinate system and single axis is the, // which is used as the parent tooltip model. // same model, so we set default tooltip show as true. tooltip: { show: true }, axisTick: { show: true, length: 6, lineStyle: { width: 1 } }, axisLabel: { show: true, interval: "auto" }, splitLine: { show: true, lineStyle: { type: "dashed", opacity: 0.2 } } }; return SingleAxisModel2; })(ComponentModel) ); mixin(SingleAxisModel, AxisModelCommonMixin.prototype); var SingleAxis = ( /** @class */ (function(_super) { __extends(SingleAxis2, _super); function SingleAxis2(dim, scale2, coordExtent, axisType, position2) { var _this = _super.call(this, dim, scale2, coordExtent) || this; _this.type = axisType || "value"; _this.position = position2 || "bottom"; return _this; } SingleAxis2.prototype.isHorizontal = function() { var position2 = this.position; return position2 === "top" || position2 === "bottom"; }; SingleAxis2.prototype.pointToData = function(point, clamp2) { return this.coordinateSystem.pointToData(point)[0]; }; return SingleAxis2; })(Axis) ); var singleDimensions = ["single"]; var Single = ( /** @class */ (function() { function Single2(axisModel, ecModel, api) { this.type = "single"; this.dimension = "single"; this.dimensions = singleDimensions; this.axisPointerEnabled = true; this.model = axisModel; this._init(axisModel, ecModel, api); } Single2.prototype._init = function(axisModel, ecModel, api) { var dim = this.dimension; var axis = new SingleAxis(dim, createScaleByModel$1(axisModel), [0, 0], axisModel.get("type"), axisModel.get("position")); var isCategory2 = axis.type === "category"; axis.onBand = isCategory2 && axisModel.get("boundaryGap"); axis.inverse = axisModel.get("inverse"); axis.orient = axisModel.get("orient"); axisModel.axis = axis; axis.model = axisModel; axis.coordinateSystem = this; this._axis = axis; }; Single2.prototype.update = function(ecModel, api) { ecModel.eachSeries(function(seriesModel) { if (seriesModel.coordinateSystem === this) { var data_1 = seriesModel.getData(); each$f(data_1.mapDimensionsAll(this.dimension), function(dim) { this._axis.scale.unionExtentFromData(data_1, dim); }, this); niceScaleExtent(this._axis.scale, this._axis.model); } }, this); }; Single2.prototype.resize = function(axisModel, api) { this._rect = getLayoutRect({ left: axisModel.get("left"), top: axisModel.get("top"), right: axisModel.get("right"), bottom: axisModel.get("bottom"), width: axisModel.get("width"), height: axisModel.get("height") }, { width: api.getWidth(), height: api.getHeight() }); this._adjustAxis(); }; Single2.prototype.getRect = function() { return this._rect; }; Single2.prototype._adjustAxis = function() { var rect = this._rect; var axis = this._axis; var isHorizontal = axis.isHorizontal(); var extent = isHorizontal ? [0, rect.width] : [0, rect.height]; var idx = axis.inverse ? 1 : 0; axis.setExtent(extent[idx], extent[1 - idx]); this._updateAxisTransform(axis, isHorizontal ? rect.x : rect.y); }; Single2.prototype._updateAxisTransform = function(axis, coordBase) { var axisExtent = axis.getExtent(); var extentSum = axisExtent[0] + axisExtent[1]; var isHorizontal = axis.isHorizontal(); axis.toGlobalCoord = isHorizontal ? function(coord) { return coord + coordBase; } : function(coord) { return extentSum - coord + coordBase; }; axis.toLocalCoord = isHorizontal ? function(coord) { return coord - coordBase; } : function(coord) { return extentSum - coord + coordBase; }; }; Single2.prototype.getAxis = function() { return this._axis; }; Single2.prototype.getBaseAxis = function() { return this._axis; }; Single2.prototype.getAxes = function() { return [this._axis]; }; Single2.prototype.getTooltipAxes = function() { return { baseAxes: [this.getAxis()], // Empty otherAxes otherAxes: [] }; }; Single2.prototype.containPoint = function(point) { var rect = this.getRect(); var axis = this.getAxis(); var orient = axis.orient; if (orient === "horizontal") { return axis.contain(axis.toLocalCoord(point[0])) && point[1] >= rect.y && point[1] <= rect.y + rect.height; } else { return axis.contain(axis.toLocalCoord(point[1])) && point[0] >= rect.y && point[0] <= rect.y + rect.height; } }; Single2.prototype.pointToData = function(point) { var axis = this.getAxis(); return [axis.coordToData(axis.toLocalCoord(point[axis.orient === "horizontal" ? 0 : 1]))]; }; Single2.prototype.dataToPoint = function(val) { var axis = this.getAxis(); var rect = this.getRect(); var pt = []; var idx = axis.orient === "horizontal" ? 0 : 1; if (val instanceof Array) { val = val[0]; } pt[idx] = axis.toGlobalCoord(axis.dataToCoord(+val)); pt[1 - idx] = idx === 0 ? rect.y + rect.height / 2 : rect.x + rect.width / 2; return pt; }; Single2.prototype.convertToPixel = function(ecModel, finder, value) { var coordSys = getCoordSys$1(finder); return coordSys === this ? this.dataToPoint(value) : null; }; Single2.prototype.convertFromPixel = function(ecModel, finder, pixel) { var coordSys = getCoordSys$1(finder); return coordSys === this ? this.pointToData(pixel) : null; }; return Single2; })() ); function getCoordSys$1(finder) { var seriesModel = finder.seriesModel; var singleModel = finder.singleAxisModel; return singleModel && singleModel.coordinateSystem || seriesModel && seriesModel.coordinateSystem; } function create(ecModel, api) { var singles = []; ecModel.eachComponent("singleAxis", function(axisModel, idx) { var single = new Single(axisModel, ecModel, api); single.name = "single_" + idx; single.resize(axisModel, api); axisModel.coordinateSystem = single; singles.push(single); }); ecModel.eachSeries(function(seriesModel) { if (seriesModel.get("coordinateSystem") === "singleAxis") { var singleAxisModel = seriesModel.getReferringComponents("singleAxis", SINGLE_REFERRING).models[0]; seriesModel.coordinateSystem = singleAxisModel && singleAxisModel.coordinateSystem; } }); return singles; } var singleCreator = { create, dimensions: singleDimensions }; var XY$1 = ["x", "y"]; var WH$1 = ["width", "height"]; var SingleAxisPointer = ( /** @class */ (function(_super) { __extends(SingleAxisPointer2, _super); function SingleAxisPointer2() { return _super !== null && _super.apply(this, arguments) || this; } SingleAxisPointer2.prototype.makeElOption = function(elOption, value, axisModel, axisPointerModel, api) { var axis = axisModel.axis; var coordSys = axis.coordinateSystem; var otherExtent = getGlobalExtent(coordSys, 1 - getPointDimIndex(axis)); var pixelValue = coordSys.dataToPoint(value)[0]; var axisPointerType = axisPointerModel.get("type"); if (axisPointerType && axisPointerType !== "none") { var elStyle = buildElStyle(axisPointerModel); var pointerOption = pointerShapeBuilder[axisPointerType](axis, pixelValue, otherExtent); pointerOption.style = elStyle; elOption.graphicKey = pointerOption.type; elOption.pointer = pointerOption; } var layoutInfo = layout$1(axisModel); buildCartesianSingleLabelElOption( // @ts-ignore value, elOption, layoutInfo, axisModel, axisPointerModel, api ); }; SingleAxisPointer2.prototype.getHandleTransform = function(value, axisModel, axisPointerModel) { var layoutInfo = layout$1(axisModel, { labelInside: false }); layoutInfo.labelMargin = axisPointerModel.get(["handle", "margin"]); var position2 = getTransformedPosition(axisModel.axis, value, layoutInfo); return { x: position2[0], y: position2[1], rotation: layoutInfo.rotation + (layoutInfo.labelDirection < 0 ? Math.PI : 0) }; }; SingleAxisPointer2.prototype.updateHandleTransform = function(transform2, delta, axisModel, axisPointerModel) { var axis = axisModel.axis; var coordSys = axis.coordinateSystem; var dimIndex = getPointDimIndex(axis); var axisExtent = getGlobalExtent(coordSys, dimIndex); var currPosition = [transform2.x, transform2.y]; currPosition[dimIndex] += delta[dimIndex]; currPosition[dimIndex] = Math.min(axisExtent[1], currPosition[dimIndex]); currPosition[dimIndex] = Math.max(axisExtent[0], currPosition[dimIndex]); var otherExtent = getGlobalExtent(coordSys, 1 - dimIndex); var cursorOtherValue = (otherExtent[1] + otherExtent[0]) / 2; var cursorPoint = [cursorOtherValue, cursorOtherValue]; cursorPoint[dimIndex] = currPosition[dimIndex]; return { x: currPosition[0], y: currPosition[1], rotation: transform2.rotation, cursorPoint, tooltipOption: { verticalAlign: "middle" } }; }; return SingleAxisPointer2; })(BaseAxisPointer) ); var pointerShapeBuilder = { line: function(axis, pixelValue, otherExtent) { var targetShape = makeLineShape([pixelValue, otherExtent[0]], [pixelValue, otherExtent[1]], getPointDimIndex(axis)); return { type: "Line", subPixelOptimize: true, shape: targetShape }; }, shadow: function(axis, pixelValue, otherExtent) { var bandWidth = axis.getBandWidth(); var span = otherExtent[1] - otherExtent[0]; return { type: "Rect", shape: makeRectShape([pixelValue - bandWidth / 2, otherExtent[0]], [bandWidth, span], getPointDimIndex(axis)) }; } }; function getPointDimIndex(axis) { return axis.isHorizontal() ? 0 : 1; } function getGlobalExtent(coordSys, dimIndex) { var rect = coordSys.getRect(); return [rect[XY$1[dimIndex]], rect[XY$1[dimIndex]] + rect[WH$1[dimIndex]]]; } var SingleView = ( /** @class */ (function(_super) { __extends(SingleView2, _super); function SingleView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = SingleView2.type; return _this; } SingleView2.type = "single"; return SingleView2; })(ComponentView) ); function install$p(registers) { use(install$s); AxisView.registerAxisPointerClass("SingleAxisPointer", SingleAxisPointer); registers.registerComponentView(SingleView); registers.registerComponentView(SingleAxisView); registers.registerComponentModel(SingleAxisModel); axisModelCreator(registers, "single", SingleAxisModel, SingleAxisModel.defaultOption); registers.registerCoordinateSystem("single", singleCreator); } var CalendarModel = ( /** @class */ (function(_super) { __extends(CalendarModel2, _super); function CalendarModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = CalendarModel2.type; return _this; } CalendarModel2.prototype.init = function(option, parentModel, ecModel) { var inputPositionParams = getLayoutParams(option); _super.prototype.init.apply(this, arguments); mergeAndNormalizeLayoutParams$1(option, inputPositionParams); }; CalendarModel2.prototype.mergeOption = function(option) { _super.prototype.mergeOption.apply(this, arguments); mergeAndNormalizeLayoutParams$1(this.option, option); }; CalendarModel2.prototype.getCellSize = function() { return this.option.cellSize; }; CalendarModel2.type = "calendar"; CalendarModel2.defaultOption = { // zlevel: 0, z: 2, left: 80, top: 60, cellSize: 20, // horizontal vertical orient: "horizontal", // month separate line style splitLine: { show: true, lineStyle: { color: "#000", width: 1, type: "solid" } }, // rect style temporarily unused emphasis itemStyle: { color: "#fff", borderWidth: 1, borderColor: "#ccc" }, // week text style dayLabel: { show: true, firstDay: 0, // start end position: "start", margin: "50%", color: "#000" }, // month text style monthLabel: { show: true, // start end position: "start", margin: 5, // center or left align: "center", formatter: null, color: "#000" }, // year text style yearLabel: { show: true, // top bottom left right position: null, margin: 30, formatter: null, color: "#ccc", fontFamily: "sans-serif", fontWeight: "bolder", fontSize: 20 } }; return CalendarModel2; })(ComponentModel) ); function mergeAndNormalizeLayoutParams$1(target, raw) { var cellSize = target.cellSize; var cellSizeArr; if (!isArray$1(cellSize)) { cellSizeArr = target.cellSize = [cellSize, cellSize]; } else { cellSizeArr = cellSize; } if (cellSizeArr.length === 1) { cellSizeArr[1] = cellSizeArr[0]; } var ignoreSize = map$1([0, 1], function(hvIdx) { if (sizeCalculable(raw, hvIdx)) { cellSizeArr[hvIdx] = "auto"; } return cellSizeArr[hvIdx] != null && cellSizeArr[hvIdx] !== "auto"; }); mergeLayoutParam(target, raw, { type: "box", ignoreSize }); } var CalendarView = ( /** @class */ (function(_super) { __extends(CalendarView2, _super); function CalendarView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = CalendarView2.type; return _this; } CalendarView2.prototype.render = function(calendarModel, ecModel, api) { var group = this.group; group.removeAll(); var coordSys = calendarModel.coordinateSystem; var rangeData = coordSys.getRangeInfo(); var orient = coordSys.getOrient(); var localeModel = ecModel.getLocaleModel(); this._renderDayRect(calendarModel, rangeData, group); this._renderLines(calendarModel, rangeData, orient, group); this._renderYearText(calendarModel, rangeData, orient, group); this._renderMonthText(calendarModel, localeModel, orient, group); this._renderWeekText(calendarModel, localeModel, rangeData, orient, group); }; CalendarView2.prototype._renderDayRect = function(calendarModel, rangeData, group) { var coordSys = calendarModel.coordinateSystem; var itemRectStyleModel = calendarModel.getModel("itemStyle").getItemStyle(); var sw = coordSys.getCellWidth(); var sh = coordSys.getCellHeight(); for (var i = rangeData.start.time; i <= rangeData.end.time; i = coordSys.getNextNDay(i, 1).time) { var point = coordSys.dataToRect([i], false).tl; var rect = new Rect$2({ shape: { x: point[0], y: point[1], width: sw, height: sh }, cursor: "default", style: itemRectStyleModel }); group.add(rect); } }; CalendarView2.prototype._renderLines = function(calendarModel, rangeData, orient, group) { var self = this; var coordSys = calendarModel.coordinateSystem; var lineStyleModel = calendarModel.getModel(["splitLine", "lineStyle"]).getLineStyle(); var show = calendarModel.get(["splitLine", "show"]); var lineWidth = lineStyleModel.lineWidth; this._tlpoints = []; this._blpoints = []; this._firstDayOfMonth = []; this._firstDayPoints = []; var firstDay = rangeData.start; for (var i = 0; firstDay.time <= rangeData.end.time; i++) { addPoints(firstDay.formatedDate); if (i === 0) { firstDay = coordSys.getDateInfo(rangeData.start.y + "-" + rangeData.start.m); } var date = firstDay.date; date.setMonth(date.getMonth() + 1); firstDay = coordSys.getDateInfo(date); } addPoints(coordSys.getNextNDay(rangeData.end.time, 1).formatedDate); function addPoints(date2) { self._firstDayOfMonth.push(coordSys.getDateInfo(date2)); self._firstDayPoints.push(coordSys.dataToRect([date2], false).tl); var points2 = self._getLinePointsOfOneWeek(calendarModel, date2, orient); self._tlpoints.push(points2[0]); self._blpoints.push(points2[points2.length - 1]); show && self._drawSplitline(points2, lineStyleModel, group); } show && this._drawSplitline(self._getEdgesPoints(self._tlpoints, lineWidth, orient), lineStyleModel, group); show && this._drawSplitline(self._getEdgesPoints(self._blpoints, lineWidth, orient), lineStyleModel, group); }; CalendarView2.prototype._getEdgesPoints = function(points2, lineWidth, orient) { var rs = [points2[0].slice(), points2[points2.length - 1].slice()]; var idx = orient === "horizontal" ? 0 : 1; rs[0][idx] = rs[0][idx] - lineWidth / 2; rs[1][idx] = rs[1][idx] + lineWidth / 2; return rs; }; CalendarView2.prototype._drawSplitline = function(points2, lineStyle, group) { var poyline = new Polyline$1({ z2: 20, shape: { points: points2 }, style: lineStyle }); group.add(poyline); }; CalendarView2.prototype._getLinePointsOfOneWeek = function(calendarModel, date, orient) { var coordSys = calendarModel.coordinateSystem; var parsedDate = coordSys.getDateInfo(date); var points2 = []; for (var i = 0; i < 7; i++) { var tmpD = coordSys.getNextNDay(parsedDate.time, i); var point = coordSys.dataToRect([tmpD.time], false); points2[2 * tmpD.day] = point.tl; points2[2 * tmpD.day + 1] = point[orient === "horizontal" ? "bl" : "tr"]; } return points2; }; CalendarView2.prototype._formatterLabel = function(formatter, params) { if (isString(formatter) && formatter) { return formatTplSimple(formatter, params); } if (isFunction(formatter)) { return formatter(params); } return params.nameMap; }; CalendarView2.prototype._yearTextPositionControl = function(textEl, point, orient, position2, margin) { var x = point[0]; var y = point[1]; var aligns = ["center", "bottom"]; if (position2 === "bottom") { y += margin; aligns = ["center", "top"]; } else if (position2 === "left") { x -= margin; } else if (position2 === "right") { x += margin; aligns = ["center", "top"]; } else { y -= margin; } var rotate2 = 0; if (position2 === "left" || position2 === "right") { rotate2 = Math.PI / 2; } return { rotation: rotate2, x, y, style: { align: aligns[0], verticalAlign: aligns[1] } }; }; CalendarView2.prototype._renderYearText = function(calendarModel, rangeData, orient, group) { var yearLabel = calendarModel.getModel("yearLabel"); if (!yearLabel.get("show")) { return; } var margin = yearLabel.get("margin"); var pos = yearLabel.get("position"); if (!pos) { pos = orient !== "horizontal" ? "top" : "left"; } var points2 = [this._tlpoints[this._tlpoints.length - 1], this._blpoints[0]]; var xc = (points2[0][0] + points2[1][0]) / 2; var yc = (points2[0][1] + points2[1][1]) / 2; var idx = orient === "horizontal" ? 0 : 1; var posPoints = { top: [xc, points2[idx][1]], bottom: [xc, points2[1 - idx][1]], left: [points2[1 - idx][0], yc], right: [points2[idx][0], yc] }; var name = rangeData.start.y; if (+rangeData.end.y > +rangeData.start.y) { name = name + "-" + rangeData.end.y; } var formatter = yearLabel.get("formatter"); var params = { start: rangeData.start.y, end: rangeData.end.y, nameMap: name }; var content = this._formatterLabel(formatter, params); var yearText = new ZRText({ z2: 30, style: createTextStyle(yearLabel, { text: content }), silent: yearLabel.get("silent") }); yearText.attr(this._yearTextPositionControl(yearText, posPoints[pos], orient, pos, margin)); group.add(yearText); }; CalendarView2.prototype._monthTextPositionControl = function(point, isCenter, orient, position2, margin) { var align = "left"; var vAlign = "top"; var x = point[0]; var y = point[1]; if (orient === "horizontal") { y = y + margin; if (isCenter) { align = "center"; } if (position2 === "start") { vAlign = "bottom"; } } else { x = x + margin; if (isCenter) { vAlign = "middle"; } if (position2 === "start") { align = "right"; } } return { x, y, align, verticalAlign: vAlign }; }; CalendarView2.prototype._renderMonthText = function(calendarModel, localeModel, orient, group) { var monthLabel = calendarModel.getModel("monthLabel"); if (!monthLabel.get("show")) { return; } var nameMap = monthLabel.get("nameMap"); var margin = monthLabel.get("margin"); var pos = monthLabel.get("position"); var align = monthLabel.get("align"); var termPoints = [this._tlpoints, this._blpoints]; if (!nameMap || isString(nameMap)) { if (nameMap) { localeModel = getLocaleModel(nameMap) || localeModel; } nameMap = localeModel.get(["time", "monthAbbr"]) || []; } var idx = pos === "start" ? 0 : 1; var axis = orient === "horizontal" ? 0 : 1; margin = pos === "start" ? -margin : margin; var isCenter = align === "center"; var labelSilent = monthLabel.get("silent"); for (var i = 0; i < termPoints[idx].length - 1; i++) { var tmp = termPoints[idx][i].slice(); var firstDay = this._firstDayOfMonth[i]; if (isCenter) { var firstDayPoints = this._firstDayPoints[i]; tmp[axis] = (firstDayPoints[axis] + termPoints[0][i + 1][axis]) / 2; } var formatter = monthLabel.get("formatter"); var name_1 = nameMap[+firstDay.m - 1]; var params = { yyyy: firstDay.y, yy: (firstDay.y + "").slice(2), MM: firstDay.m, M: +firstDay.m, nameMap: name_1 }; var content = this._formatterLabel(formatter, params); var monthText = new ZRText({ z2: 30, style: extend(createTextStyle(monthLabel, { text: content }), this._monthTextPositionControl(tmp, isCenter, orient, pos, margin)), silent: labelSilent }); group.add(monthText); } }; CalendarView2.prototype._weekTextPositionControl = function(point, orient, position2, margin, cellSize) { var align = "center"; var vAlign = "middle"; var x = point[0]; var y = point[1]; var isStart = position2 === "start"; if (orient === "horizontal") { x = x + margin + (isStart ? 1 : -1) * cellSize[0] / 2; align = isStart ? "right" : "left"; } else { y = y + margin + (isStart ? 1 : -1) * cellSize[1] / 2; vAlign = isStart ? "bottom" : "top"; } return { x, y, align, verticalAlign: vAlign }; }; CalendarView2.prototype._renderWeekText = function(calendarModel, localeModel, rangeData, orient, group) { var dayLabel = calendarModel.getModel("dayLabel"); if (!dayLabel.get("show")) { return; } var coordSys = calendarModel.coordinateSystem; var pos = dayLabel.get("position"); var nameMap = dayLabel.get("nameMap"); var margin = dayLabel.get("margin"); var firstDayOfWeek = coordSys.getFirstDayOfWeek(); if (!nameMap || isString(nameMap)) { if (nameMap) { localeModel = getLocaleModel(nameMap) || localeModel; } var dayOfWeekShort = localeModel.get(["time", "dayOfWeekShort"]); nameMap = dayOfWeekShort || map$1(localeModel.get(["time", "dayOfWeekAbbr"]), function(val) { return val[0]; }); } var start = coordSys.getNextNDay(rangeData.end.time, 7 - rangeData.lweek).time; var cellSize = [coordSys.getCellWidth(), coordSys.getCellHeight()]; margin = parsePercent(margin, Math.min(cellSize[1], cellSize[0])); if (pos === "start") { start = coordSys.getNextNDay(rangeData.start.time, -(7 + rangeData.fweek)).time; margin = -margin; } var labelSilent = dayLabel.get("silent"); for (var i = 0; i < 7; i++) { var tmpD = coordSys.getNextNDay(start, i); var point = coordSys.dataToRect([tmpD.time], false).center; var day = i; day = Math.abs((i + firstDayOfWeek) % 7); var weekText = new ZRText({ z2: 30, style: extend(createTextStyle(dayLabel, { text: nameMap[day] }), this._weekTextPositionControl(point, orient, pos, margin, cellSize)), silent: labelSilent }); group.add(weekText); } }; CalendarView2.type = "calendar"; return CalendarView2; })(ComponentView) ); var PROXIMATE_ONE_DAY = 864e5; var Calendar = ( /** @class */ (function() { function Calendar2(calendarModel, ecModel, api) { this.type = "calendar"; this.dimensions = Calendar2.dimensions; this.getDimensionsInfo = Calendar2.getDimensionsInfo; this._model = calendarModel; } Calendar2.getDimensionsInfo = function() { return [{ name: "time", type: "time" }, "value"]; }; Calendar2.prototype.getRangeInfo = function() { return this._rangeInfo; }; Calendar2.prototype.getModel = function() { return this._model; }; Calendar2.prototype.getRect = function() { return this._rect; }; Calendar2.prototype.getCellWidth = function() { return this._sw; }; Calendar2.prototype.getCellHeight = function() { return this._sh; }; Calendar2.prototype.getOrient = function() { return this._orient; }; Calendar2.prototype.getFirstDayOfWeek = function() { return this._firstDayOfWeek; }; Calendar2.prototype.getDateInfo = function(date) { date = parseDate(date); var y = date.getFullYear(); var m = date.getMonth() + 1; var mStr = m < 10 ? "0" + m : "" + m; var d = date.getDate(); var dStr = d < 10 ? "0" + d : "" + d; var day = date.getDay(); day = Math.abs((day + 7 - this.getFirstDayOfWeek()) % 7); return { y: y + "", m: mStr, d: dStr, day, time: date.getTime(), formatedDate: y + "-" + mStr + "-" + dStr, date }; }; Calendar2.prototype.getNextNDay = function(date, n) { n = n || 0; if (n === 0) { return this.getDateInfo(date); } date = new Date(this.getDateInfo(date).time); date.setDate(date.getDate() + n); return this.getDateInfo(date); }; Calendar2.prototype.update = function(ecModel, api) { this._firstDayOfWeek = +this._model.getModel("dayLabel").get("firstDay"); this._orient = this._model.get("orient"); this._lineWidth = this._model.getModel("itemStyle").getItemStyle().lineWidth || 0; this._rangeInfo = this._getRangeInfo(this._initRangeOption()); var weeks = this._rangeInfo.weeks || 1; var whNames = ["width", "height"]; var cellSize = this._model.getCellSize().slice(); var layoutParams = this._model.getBoxLayoutParams(); var cellNumbers = this._orient === "horizontal" ? [weeks, 7] : [7, weeks]; each$f([0, 1], function(idx) { if (cellSizeSpecified(cellSize, idx)) { layoutParams[whNames[idx]] = cellSize[idx] * cellNumbers[idx]; } }); var whGlobal = { width: api.getWidth(), height: api.getHeight() }; var calendarRect = this._rect = getLayoutRect(layoutParams, whGlobal); each$f([0, 1], function(idx) { if (!cellSizeSpecified(cellSize, idx)) { cellSize[idx] = calendarRect[whNames[idx]] / cellNumbers[idx]; } }); function cellSizeSpecified(cellSize2, idx) { return cellSize2[idx] != null && cellSize2[idx] !== "auto"; } this._sw = cellSize[0]; this._sh = cellSize[1]; }; Calendar2.prototype.dataToPoint = function(data, clamp2) { isArray$1(data) && (data = data[0]); clamp2 == null && (clamp2 = true); var dayInfo = this.getDateInfo(data); var range = this._rangeInfo; var date = dayInfo.formatedDate; if (clamp2 && !(dayInfo.time >= range.start.time && dayInfo.time < range.end.time + PROXIMATE_ONE_DAY)) { return [NaN, NaN]; } var week = dayInfo.day; var nthWeek = this._getRangeInfo([range.start.time, date]).nthWeek; if (this._orient === "vertical") { return [this._rect.x + week * this._sw + this._sw / 2, this._rect.y + nthWeek * this._sh + this._sh / 2]; } return [this._rect.x + nthWeek * this._sw + this._sw / 2, this._rect.y + week * this._sh + this._sh / 2]; }; Calendar2.prototype.pointToData = function(point) { var date = this.pointToDate(point); return date && date.time; }; Calendar2.prototype.dataToRect = function(data, clamp2) { var point = this.dataToPoint(data, clamp2); return { contentShape: { x: point[0] - (this._sw - this._lineWidth) / 2, y: point[1] - (this._sh - this._lineWidth) / 2, width: this._sw - this._lineWidth, height: this._sh - this._lineWidth }, center: point, tl: [point[0] - this._sw / 2, point[1] - this._sh / 2], tr: [point[0] + this._sw / 2, point[1] - this._sh / 2], br: [point[0] + this._sw / 2, point[1] + this._sh / 2], bl: [point[0] - this._sw / 2, point[1] + this._sh / 2] }; }; Calendar2.prototype.pointToDate = function(point) { var nthX = Math.floor((point[0] - this._rect.x) / this._sw) + 1; var nthY = Math.floor((point[1] - this._rect.y) / this._sh) + 1; var range = this._rangeInfo.range; if (this._orient === "vertical") { return this._getDateByWeeksAndDay(nthY, nthX - 1, range); } return this._getDateByWeeksAndDay(nthX, nthY - 1, range); }; Calendar2.prototype.convertToPixel = function(ecModel, finder, value) { var coordSys = getCoordSys(finder); return coordSys === this ? coordSys.dataToPoint(value) : null; }; Calendar2.prototype.convertFromPixel = function(ecModel, finder, pixel) { var coordSys = getCoordSys(finder); return coordSys === this ? coordSys.pointToData(pixel) : null; }; Calendar2.prototype.containPoint = function(point) { console.warn("Not implemented."); return false; }; Calendar2.prototype._initRangeOption = function() { var range = this._model.get("range"); var normalizedRange; if (isArray$1(range) && range.length === 1) { range = range[0]; } if (!isArray$1(range)) { var rangeStr = range.toString(); if (/^\d{4}$/.test(rangeStr)) { normalizedRange = [rangeStr + "-01-01", rangeStr + "-12-31"]; } if (/^\d{4}[\/|-]\d{1,2}$/.test(rangeStr)) { var start = this.getDateInfo(rangeStr); var firstDay = start.date; firstDay.setMonth(firstDay.getMonth() + 1); var end = this.getNextNDay(firstDay, -1); normalizedRange = [start.formatedDate, end.formatedDate]; } if (/^\d{4}[\/|-]\d{1,2}[\/|-]\d{1,2}$/.test(rangeStr)) { normalizedRange = [rangeStr, rangeStr]; } } else { normalizedRange = range; } if (!normalizedRange) { return range; } var tmp = this._getRangeInfo(normalizedRange); if (tmp.start.time > tmp.end.time) { normalizedRange.reverse(); } return normalizedRange; }; Calendar2.prototype._getRangeInfo = function(range) { var parsedRange = [this.getDateInfo(range[0]), this.getDateInfo(range[1])]; var reversed; if (parsedRange[0].time > parsedRange[1].time) { reversed = true; parsedRange.reverse(); } var allDay = Math.floor(parsedRange[1].time / PROXIMATE_ONE_DAY) - Math.floor(parsedRange[0].time / PROXIMATE_ONE_DAY) + 1; var date = new Date(parsedRange[0].time); var startDateNum = date.getDate(); var endDateNum = parsedRange[1].date.getDate(); date.setDate(startDateNum + allDay - 1); var dateNum = date.getDate(); if (dateNum !== endDateNum) { var sign = date.getTime() - parsedRange[1].time > 0 ? 1 : -1; while ((dateNum = date.getDate()) !== endDateNum && (date.getTime() - parsedRange[1].time) * sign > 0) { allDay -= sign; date.setDate(dateNum - sign); } } var weeks = Math.floor((allDay + parsedRange[0].day + 6) / 7); var nthWeek = reversed ? -weeks + 1 : weeks - 1; reversed && parsedRange.reverse(); return { range: [parsedRange[0].formatedDate, parsedRange[1].formatedDate], start: parsedRange[0], end: parsedRange[1], allDay, weeks, // From 0. nthWeek, fweek: parsedRange[0].day, lweek: parsedRange[1].day }; }; Calendar2.prototype._getDateByWeeksAndDay = function(nthWeek, day, range) { var rangeInfo = this._getRangeInfo(range); if (nthWeek > rangeInfo.weeks || nthWeek === 0 && day < rangeInfo.fweek || nthWeek === rangeInfo.weeks && day > rangeInfo.lweek) { return null; } var nthDay = (nthWeek - 1) * 7 - rangeInfo.fweek + day; var date = new Date(rangeInfo.start.time); date.setDate(+rangeInfo.start.d + nthDay); return this.getDateInfo(date); }; Calendar2.create = function(ecModel, api) { var calendarList = []; ecModel.eachComponent("calendar", function(calendarModel) { var calendar = new Calendar2(calendarModel); calendarList.push(calendar); calendarModel.coordinateSystem = calendar; }); ecModel.eachSeries(function(calendarSeries) { if (calendarSeries.get("coordinateSystem") === "calendar") { calendarSeries.coordinateSystem = calendarList[calendarSeries.get("calendarIndex") || 0]; } }); return calendarList; }; Calendar2.dimensions = ["time", "value"]; return Calendar2; })() ); function getCoordSys(finder) { var calendarModel = finder.calendarModel; var seriesModel = finder.seriesModel; var coordSys = calendarModel ? calendarModel.coordinateSystem : seriesModel ? seriesModel.coordinateSystem : null; return coordSys; } function install$o(registers) { registers.registerComponentModel(CalendarModel); registers.registerComponentView(CalendarView); registers.registerCoordinateSystem("calendar", Calendar); } function setKeyInfoToNewElOption(resultItem, newElOption) { var existElOption = resultItem.existing; newElOption.id = resultItem.keyInfo.id; !newElOption.type && existElOption && (newElOption.type = existElOption.type); if (newElOption.parentId == null) { var newElParentOption = newElOption.parentOption; if (newElParentOption) { newElOption.parentId = newElParentOption.id; } else if (existElOption) { newElOption.parentId = existElOption.parentId; } } newElOption.parentOption = null; } function isSetLoc(obj, props) { var isSet; each$f(props, function(prop) { obj[prop] != null && obj[prop] !== "auto" && (isSet = true); }); return isSet; } function mergeNewElOptionToExist(existList, index, newElOption) { var newElOptCopy = extend({}, newElOption); var existElOption = existList[index]; var $action = newElOption.$action || "merge"; if ($action === "merge") { if (existElOption) { merge(existElOption, newElOptCopy, true); mergeLayoutParam(existElOption, newElOptCopy, { ignoreSize: true }); copyLayoutParams(newElOption, existElOption); copyTransitionInfo(newElOption, existElOption); copyTransitionInfo(newElOption, existElOption, "shape"); copyTransitionInfo(newElOption, existElOption, "style"); copyTransitionInfo(newElOption, existElOption, "extra"); newElOption.clipPath = existElOption.clipPath; } else { existList[index] = newElOptCopy; } } else if ($action === "replace") { existList[index] = newElOptCopy; } else if ($action === "remove") { existElOption && (existList[index] = null); } } var TRANSITION_PROPS_TO_COPY = ["transition", "enterFrom", "leaveTo"]; var ROOT_TRANSITION_PROPS_TO_COPY = TRANSITION_PROPS_TO_COPY.concat(["enterAnimation", "updateAnimation", "leaveAnimation"]); function copyTransitionInfo(target, source, targetProp) { if (targetProp) { if (!target[targetProp] && source[targetProp]) { target[targetProp] = {}; } target = target[targetProp]; source = source[targetProp]; } if (!target || !source) { return; } var props = targetProp ? TRANSITION_PROPS_TO_COPY : ROOT_TRANSITION_PROPS_TO_COPY; for (var i = 0; i < props.length; i++) { var prop = props[i]; if (target[prop] == null && source[prop] != null) { target[prop] = source[prop]; } } } function setLayoutInfoToExist(existItem, newElOption) { if (!existItem) { return; } existItem.hv = newElOption.hv = [ // Rigid body, don't care about `width`. isSetLoc(newElOption, ["left", "right"]), // Rigid body, don't care about `height`. isSetLoc(newElOption, ["top", "bottom"]) ]; if (existItem.type === "group") { var existingGroupOpt = existItem; var newGroupOpt = newElOption; existingGroupOpt.width == null && (existingGroupOpt.width = newGroupOpt.width = 0); existingGroupOpt.height == null && (existingGroupOpt.height = newGroupOpt.height = 0); } } var GraphicComponentModel = ( /** @class */ (function(_super) { __extends(GraphicComponentModel2, _super); function GraphicComponentModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = GraphicComponentModel2.type; _this.preventAutoZ = true; return _this; } GraphicComponentModel2.prototype.mergeOption = function(option, ecModel) { var elements = this.option.elements; this.option.elements = null; _super.prototype.mergeOption.call(this, option, ecModel); this.option.elements = elements; }; GraphicComponentModel2.prototype.optionUpdated = function(newOption, isInit) { var thisOption = this.option; var newList = (isInit ? thisOption : newOption).elements; var existList = thisOption.elements = isInit ? [] : thisOption.elements; var flattenedList = []; this._flatten(newList, flattenedList, null); var mappingResult = mappingToExists(existList, flattenedList, "normalMerge"); var elOptionsToUpdate = this._elOptionsToUpdate = []; each$f(mappingResult, function(resultItem, index) { var newElOption = resultItem.newOption; if (!newElOption) { return; } elOptionsToUpdate.push(newElOption); setKeyInfoToNewElOption(resultItem, newElOption); mergeNewElOptionToExist(existList, index, newElOption); setLayoutInfoToExist(existList[index], newElOption); }, this); thisOption.elements = filter(existList, function(item) { item && delete item.$action; return item != null; }); }; GraphicComponentModel2.prototype._flatten = function(optionList, result, parentOption) { each$f(optionList, function(option) { if (!option) { return; } if (parentOption) { option.parentOption = parentOption; } result.push(option); var children = option.children; if (children && children.length) { this._flatten(children, result, option); } delete option.children; }, this); }; GraphicComponentModel2.prototype.useElOptionsToUpdate = function() { var els = this._elOptionsToUpdate; this._elOptionsToUpdate = null; return els; }; GraphicComponentModel2.type = "graphic"; GraphicComponentModel2.defaultOption = { elements: [] // parentId: null }; return GraphicComponentModel2; })(ComponentModel) ); var nonShapeGraphicElements = { // Reserved but not supported in graphic component. path: null, compoundPath: null, // Supported in graphic component. group: Group$3, image: ZRImage, text: ZRText }; var inner$7 = makeInner(); var GraphicComponentView = ( /** @class */ (function(_super) { __extends(GraphicComponentView2, _super); function GraphicComponentView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = GraphicComponentView2.type; return _this; } GraphicComponentView2.prototype.init = function() { this._elMap = createHashMap(); }; GraphicComponentView2.prototype.render = function(graphicModel, ecModel, api) { if (graphicModel !== this._lastGraphicModel) { this._clear(); } this._lastGraphicModel = graphicModel; this._updateElements(graphicModel); this._relocate(graphicModel, api); }; GraphicComponentView2.prototype._updateElements = function(graphicModel) { var elOptionsToUpdate = graphicModel.useElOptionsToUpdate(); if (!elOptionsToUpdate) { return; } var elMap = this._elMap; var rootGroup = this.group; var globalZ = graphicModel.get("z"); var globalZLevel = graphicModel.get("zlevel"); each$f(elOptionsToUpdate, function(elOption) { var id = convertOptionIdName(elOption.id, null); var elExisting = id != null ? elMap.get(id) : null; var parentId = convertOptionIdName(elOption.parentId, null); var targetElParent = parentId != null ? elMap.get(parentId) : rootGroup; var elType = elOption.type; var elOptionStyle = elOption.style; if (elType === "text" && elOptionStyle) { if (elOption.hv && elOption.hv[1]) { elOptionStyle.textVerticalAlign = elOptionStyle.textBaseline = elOptionStyle.verticalAlign = elOptionStyle.align = null; } } var textContentOption = elOption.textContent; var textConfig = elOption.textConfig; if (elOptionStyle && isEC4CompatibleStyle(elOptionStyle, elType, !!textConfig, !!textContentOption)) { var convertResult = convertFromEC4CompatibleStyle(elOptionStyle, elType, true); if (!textConfig && convertResult.textConfig) { textConfig = elOption.textConfig = convertResult.textConfig; } if (!textContentOption && convertResult.textContent) { textContentOption = convertResult.textContent; } } var elOptionCleaned = getCleanedElOption(elOption); var $action = elOption.$action || "merge"; var isMerge = $action === "merge"; var isReplace = $action === "replace"; if (isMerge) { var isInit = !elExisting; var el_1 = elExisting; if (isInit) { el_1 = createEl(id, targetElParent, elOption.type, elMap); } else { el_1 && (inner$7(el_1).isNew = false); stopPreviousKeyframeAnimationAndRestore(el_1); } if (el_1) { applyUpdateTransition(el_1, elOptionCleaned, graphicModel, { isInit }); updateCommonAttrs(el_1, elOption, globalZ, globalZLevel); } } else if (isReplace) { removeEl$1(elExisting, elOption, elMap, graphicModel); var el_2 = createEl(id, targetElParent, elOption.type, elMap); if (el_2) { applyUpdateTransition(el_2, elOptionCleaned, graphicModel, { isInit: true }); updateCommonAttrs(el_2, elOption, globalZ, globalZLevel); } } else if ($action === "remove") { updateLeaveTo(elExisting, elOption); removeEl$1(elExisting, elOption, elMap, graphicModel); } var el = elMap.get(id); if (el && textContentOption) { if (isMerge) { var textContentExisting = el.getTextContent(); textContentExisting ? textContentExisting.attr(textContentOption) : el.setTextContent(new ZRText(textContentOption)); } else if (isReplace) { el.setTextContent(new ZRText(textContentOption)); } } if (el) { var clipPathOption = elOption.clipPath; if (clipPathOption) { var clipPathType = clipPathOption.type; var clipPath = void 0; var isInit = false; if (isMerge) { var oldClipPath = el.getClipPath(); isInit = !oldClipPath || inner$7(oldClipPath).type !== clipPathType; clipPath = isInit ? newEl(clipPathType) : oldClipPath; } else if (isReplace) { isInit = true; clipPath = newEl(clipPathType); } el.setClipPath(clipPath); applyUpdateTransition(clipPath, clipPathOption, graphicModel, { isInit }); applyKeyframeAnimation(clipPath, clipPathOption.keyframeAnimation, graphicModel); } var elInner = inner$7(el); el.setTextConfig(textConfig); elInner.option = elOption; setEventData(el, graphicModel, elOption); setTooltipConfig({ el, componentModel: graphicModel, itemName: el.name, itemTooltipOption: elOption.tooltip }); applyKeyframeAnimation(el, elOption.keyframeAnimation, graphicModel); } }); }; GraphicComponentView2.prototype._relocate = function(graphicModel, api) { var elOptions = graphicModel.option.elements; var rootGroup = this.group; var elMap = this._elMap; var apiWidth = api.getWidth(); var apiHeight = api.getHeight(); var xy = ["x", "y"]; for (var i = 0; i < elOptions.length; i++) { var elOption = elOptions[i]; var id = convertOptionIdName(elOption.id, null); var el = id != null ? elMap.get(id) : null; if (!el || !el.isGroup) { continue; } var parentEl = el.parent; var isParentRoot = parentEl === rootGroup; var elInner = inner$7(el); var parentElInner = inner$7(parentEl); elInner.width = parsePercent(elInner.option.width, isParentRoot ? apiWidth : parentElInner.width) || 0; elInner.height = parsePercent(elInner.option.height, isParentRoot ? apiHeight : parentElInner.height) || 0; } for (var i = elOptions.length - 1; i >= 0; i--) { var elOption = elOptions[i]; var id = convertOptionIdName(elOption.id, null); var el = id != null ? elMap.get(id) : null; if (!el) { continue; } var parentEl = el.parent; var parentElInner = inner$7(parentEl); var containerInfo = parentEl === rootGroup ? { width: apiWidth, height: apiHeight } : { width: parentElInner.width, height: parentElInner.height }; var layoutPos = {}; var layouted = positionElement(el, elOption, containerInfo, null, { hv: elOption.hv, boundingMode: elOption.bounding }, layoutPos); if (!inner$7(el).isNew && layouted) { var transition = elOption.transition; var animatePos = {}; for (var k = 0; k < xy.length; k++) { var key = xy[k]; var val = layoutPos[key]; if (transition && (isTransitionAll(transition) || indexOf(transition, key) >= 0)) { animatePos[key] = val; } else { el[key] = val; } } updateProps$1(el, animatePos, graphicModel, 0); } else { el.attr(layoutPos); } } }; GraphicComponentView2.prototype._clear = function() { var _this = this; var elMap = this._elMap; elMap.each(function(el) { removeEl$1(el, inner$7(el).option, elMap, _this._lastGraphicModel); }); this._elMap = createHashMap(); }; GraphicComponentView2.prototype.dispose = function() { this._clear(); }; GraphicComponentView2.type = "graphic"; return GraphicComponentView2; })(ComponentView) ); function newEl(graphicType) { var Clz = hasOwn(nonShapeGraphicElements, graphicType) ? nonShapeGraphicElements[graphicType] : getShapeClass(graphicType); var el = new Clz({}); inner$7(el).type = graphicType; return el; } function createEl(id, targetElParent, graphicType, elMap) { var el = newEl(graphicType); targetElParent.add(el); elMap.set(id, el); inner$7(el).id = id; inner$7(el).isNew = true; return el; } function removeEl$1(elExisting, elOption, elMap, graphicModel) { var existElParent = elExisting && elExisting.parent; if (existElParent) { elExisting.type === "group" && elExisting.traverse(function(el) { removeEl$1(el, elOption, elMap, graphicModel); }); applyLeaveTransition(elExisting, elOption, graphicModel); elMap.removeKey(inner$7(elExisting).id); } } function updateCommonAttrs(el, elOption, defaultZ, defaultZlevel) { if (!el.isGroup) { each$f([ ["cursor", Displayable.prototype.cursor], // We should not support configure z and zlevel in the element level. // But seems we didn't limit it previously. So here still use it to avoid breaking. ["zlevel", defaultZlevel || 0], ["z", defaultZ || 0], // z2 must not be null/undefined, otherwise sort error may occur. ["z2", 0] ], function(item) { var prop = item[0]; if (hasOwn(elOption, prop)) { el[prop] = retrieve2(elOption[prop], item[1]); } else if (el[prop] == null) { el[prop] = item[1]; } }); } each$f(keys(elOption), function(key) { if (key.indexOf("on") === 0) { var val = elOption[key]; el[key] = isFunction(val) ? val : null; } }); if (hasOwn(elOption, "draggable")) { el.draggable = elOption.draggable; } elOption.name != null && (el.name = elOption.name); elOption.id != null && (el.id = elOption.id); } function getCleanedElOption(elOption) { elOption = extend({}, elOption); each$f(["id", "parentId", "$action", "hv", "bounding", "textContent", "clipPath"].concat(LOCATION_PARAMS), function(name) { delete elOption[name]; }); return elOption; } function setEventData(el, graphicModel, elOption) { var eventData = getECData(el).eventData; if (!el.silent && !el.ignore && !eventData) { eventData = getECData(el).eventData = { componentType: "graphic", componentIndex: graphicModel.componentIndex, name: el.name }; } if (eventData) { eventData.info = elOption.info; } } function install$n(registers) { registers.registerComponentModel(GraphicComponentModel); registers.registerComponentView(GraphicComponentView); registers.registerPreprocessor(function(option) { var graphicOption = option.graphic; if (isArray$1(graphicOption)) { if (!graphicOption[0] || !graphicOption[0].elements) { option.graphic = [{ elements: graphicOption }]; } else { option.graphic = [option.graphic[0]]; } } else if (graphicOption && !graphicOption.elements) { option.graphic = [{ elements: [graphicOption] }]; } }); } var DATA_ZOOM_AXIS_DIMENSIONS = ["x", "y", "radius", "angle", "single"]; var SERIES_COORDS = ["cartesian2d", "polar", "singleAxis"]; function isCoordSupported(seriesModel) { var coordType = seriesModel.get("coordinateSystem"); return indexOf(SERIES_COORDS, coordType) >= 0; } function getAxisMainType(axisDim) { return axisDim + "Axis"; } function findEffectedDataZooms(ecModel, payload) { var axisRecords = createHashMap(); var effectedModels = []; var effectedModelMap = createHashMap(); ecModel.eachComponent({ mainType: "dataZoom", query: payload }, function(dataZoomModel) { if (!effectedModelMap.get(dataZoomModel.uid)) { addToEffected(dataZoomModel); } }); var foundNewLink; do { foundNewLink = false; ecModel.eachComponent("dataZoom", processSingle); } while (foundNewLink); function processSingle(dataZoomModel) { if (!effectedModelMap.get(dataZoomModel.uid) && isLinked(dataZoomModel)) { addToEffected(dataZoomModel); foundNewLink = true; } } function addToEffected(dataZoom) { effectedModelMap.set(dataZoom.uid, true); effectedModels.push(dataZoom); markAxisControlled(dataZoom); } function isLinked(dataZoomModel) { var isLink = false; dataZoomModel.eachTargetAxis(function(axisDim, axisIndex) { var axisIdxArr = axisRecords.get(axisDim); if (axisIdxArr && axisIdxArr[axisIndex]) { isLink = true; } }); return isLink; } function markAxisControlled(dataZoomModel) { dataZoomModel.eachTargetAxis(function(axisDim, axisIndex) { (axisRecords.get(axisDim) || axisRecords.set(axisDim, []))[axisIndex] = true; }); } return effectedModels; } function collectReferCoordSysModelInfo(dataZoomModel) { var ecModel = dataZoomModel.ecModel; var coordSysInfoWrap = { infoList: [], infoMap: createHashMap() }; dataZoomModel.eachTargetAxis(function(axisDim, axisIndex) { var axisModel = ecModel.getComponent(getAxisMainType(axisDim), axisIndex); if (!axisModel) { return; } var coordSysModel = axisModel.getCoordSysModel(); if (!coordSysModel) { return; } var coordSysUid = coordSysModel.uid; var coordSysInfo = coordSysInfoWrap.infoMap.get(coordSysUid); if (!coordSysInfo) { coordSysInfo = { model: coordSysModel, axisModels: [] }; coordSysInfoWrap.infoList.push(coordSysInfo); coordSysInfoWrap.infoMap.set(coordSysUid, coordSysInfo); } coordSysInfo.axisModels.push(axisModel); }); return coordSysInfoWrap; } var DataZoomAxisInfo = ( /** @class */ (function() { function DataZoomAxisInfo2() { this.indexList = []; this.indexMap = []; } DataZoomAxisInfo2.prototype.add = function(axisCmptIdx) { if (!this.indexMap[axisCmptIdx]) { this.indexList.push(axisCmptIdx); this.indexMap[axisCmptIdx] = true; } }; return DataZoomAxisInfo2; })() ); var DataZoomModel = ( /** @class */ (function(_super) { __extends(DataZoomModel2, _super); function DataZoomModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = DataZoomModel2.type; _this._autoThrottle = true; _this._noTarget = true; _this._rangePropMode = ["percent", "percent"]; return _this; } DataZoomModel2.prototype.init = function(option, parentModel, ecModel) { var inputRawOption = retrieveRawOption(option); this.settledOption = inputRawOption; this.mergeDefaultAndTheme(option, ecModel); this._doInit(inputRawOption); }; DataZoomModel2.prototype.mergeOption = function(newOption) { var inputRawOption = retrieveRawOption(newOption); merge(this.option, newOption, true); merge(this.settledOption, inputRawOption, true); this._doInit(inputRawOption); }; DataZoomModel2.prototype._doInit = function(inputRawOption) { var thisOption = this.option; this._setDefaultThrottle(inputRawOption); this._updateRangeUse(inputRawOption); var settledOption = this.settledOption; each$f([["start", "startValue"], ["end", "endValue"]], function(names, index) { if (this._rangePropMode[index] === "value") { thisOption[names[0]] = settledOption[names[0]] = null; } }, this); this._resetTarget(); }; DataZoomModel2.prototype._resetTarget = function() { var optionOrient = this.get("orient", true); var targetAxisIndexMap = this._targetAxisInfoMap = createHashMap(); var hasAxisSpecified = this._fillSpecifiedTargetAxis(targetAxisIndexMap); if (hasAxisSpecified) { this._orient = optionOrient || this._makeAutoOrientByTargetAxis(); } else { this._orient = optionOrient || "horizontal"; this._fillAutoTargetAxisByOrient(targetAxisIndexMap, this._orient); } this._noTarget = true; targetAxisIndexMap.each(function(axisInfo) { if (axisInfo.indexList.length) { this._noTarget = false; } }, this); }; DataZoomModel2.prototype._fillSpecifiedTargetAxis = function(targetAxisIndexMap) { var hasAxisSpecified = false; each$f(DATA_ZOOM_AXIS_DIMENSIONS, function(axisDim) { var refering = this.getReferringComponents(getAxisMainType(axisDim), MULTIPLE_REFERRING); if (!refering.specified) { return; } hasAxisSpecified = true; var axisInfo = new DataZoomAxisInfo(); each$f(refering.models, function(axisModel) { axisInfo.add(axisModel.componentIndex); }); targetAxisIndexMap.set(axisDim, axisInfo); }, this); return hasAxisSpecified; }; DataZoomModel2.prototype._fillAutoTargetAxisByOrient = function(targetAxisIndexMap, orient) { var ecModel = this.ecModel; var needAuto = true; if (needAuto) { var axisDim = orient === "vertical" ? "y" : "x"; var axisModels = ecModel.findComponents({ mainType: axisDim + "Axis" }); setParallelAxis(axisModels, axisDim); } if (needAuto) { var axisModels = ecModel.findComponents({ mainType: "singleAxis", filter: function(axisModel) { return axisModel.get("orient", true) === orient; } }); setParallelAxis(axisModels, "single"); } function setParallelAxis(axisModels2, axisDim2) { var axisModel = axisModels2[0]; if (!axisModel) { return; } var axisInfo = new DataZoomAxisInfo(); axisInfo.add(axisModel.componentIndex); targetAxisIndexMap.set(axisDim2, axisInfo); needAuto = false; if (axisDim2 === "x" || axisDim2 === "y") { var gridModel_1 = axisModel.getReferringComponents("grid", SINGLE_REFERRING).models[0]; gridModel_1 && each$f(axisModels2, function(axModel) { if (axisModel.componentIndex !== axModel.componentIndex && gridModel_1 === axModel.getReferringComponents("grid", SINGLE_REFERRING).models[0]) { axisInfo.add(axModel.componentIndex); } }); } } if (needAuto) { each$f(DATA_ZOOM_AXIS_DIMENSIONS, function(axisDim2) { if (!needAuto) { return; } var axisModels2 = ecModel.findComponents({ mainType: getAxisMainType(axisDim2), filter: function(axisModel) { return axisModel.get("type", true) === "category"; } }); if (axisModels2[0]) { var axisInfo = new DataZoomAxisInfo(); axisInfo.add(axisModels2[0].componentIndex); targetAxisIndexMap.set(axisDim2, axisInfo); needAuto = false; } }, this); } }; DataZoomModel2.prototype._makeAutoOrientByTargetAxis = function() { var dim; this.eachTargetAxis(function(axisDim) { !dim && (dim = axisDim); }, this); return dim === "y" ? "vertical" : "horizontal"; }; DataZoomModel2.prototype._setDefaultThrottle = function(inputRawOption) { if (inputRawOption.hasOwnProperty("throttle")) { this._autoThrottle = false; } if (this._autoThrottle) { var globalOption = this.ecModel.option; this.option.throttle = globalOption.animation && globalOption.animationDurationUpdate > 0 ? 100 : 20; } }; DataZoomModel2.prototype._updateRangeUse = function(inputRawOption) { var rangePropMode = this._rangePropMode; var rangeModeInOption = this.get("rangeMode"); each$f([["start", "startValue"], ["end", "endValue"]], function(names, index) { var percentSpecified = inputRawOption[names[0]] != null; var valueSpecified = inputRawOption[names[1]] != null; if (percentSpecified && !valueSpecified) { rangePropMode[index] = "percent"; } else if (!percentSpecified && valueSpecified) { rangePropMode[index] = "value"; } else if (rangeModeInOption) { rangePropMode[index] = rangeModeInOption[index]; } else if (percentSpecified) { rangePropMode[index] = "percent"; } }); }; DataZoomModel2.prototype.noTarget = function() { return this._noTarget; }; DataZoomModel2.prototype.getFirstTargetAxisModel = function() { var firstAxisModel; this.eachTargetAxis(function(axisDim, axisIndex) { if (firstAxisModel == null) { firstAxisModel = this.ecModel.getComponent(getAxisMainType(axisDim), axisIndex); } }, this); return firstAxisModel; }; DataZoomModel2.prototype.eachTargetAxis = function(callback, context) { this._targetAxisInfoMap.each(function(axisInfo, axisDim) { each$f(axisInfo.indexList, function(axisIndex) { callback.call(context, axisDim, axisIndex); }); }); }; DataZoomModel2.prototype.getAxisProxy = function(axisDim, axisIndex) { var axisModel = this.getAxisModel(axisDim, axisIndex); if (axisModel) { return axisModel.__dzAxisProxy; } }; DataZoomModel2.prototype.getAxisModel = function(axisDim, axisIndex) { var axisInfo = this._targetAxisInfoMap.get(axisDim); if (axisInfo && axisInfo.indexMap[axisIndex]) { return this.ecModel.getComponent(getAxisMainType(axisDim), axisIndex); } }; DataZoomModel2.prototype.setRawRange = function(opt) { var thisOption = this.option; var settledOption = this.settledOption; each$f([["start", "startValue"], ["end", "endValue"]], function(names) { if (opt[names[0]] != null || opt[names[1]] != null) { thisOption[names[0]] = settledOption[names[0]] = opt[names[0]]; thisOption[names[1]] = settledOption[names[1]] = opt[names[1]]; } }, this); this._updateRangeUse(opt); }; DataZoomModel2.prototype.setCalculatedRange = function(opt) { var option = this.option; each$f(["start", "startValue", "end", "endValue"], function(name) { option[name] = opt[name]; }); }; DataZoomModel2.prototype.getPercentRange = function() { var axisProxy = this.findRepresentativeAxisProxy(); if (axisProxy) { return axisProxy.getDataPercentWindow(); } }; DataZoomModel2.prototype.getValueRange = function(axisDim, axisIndex) { if (axisDim == null && axisIndex == null) { var axisProxy = this.findRepresentativeAxisProxy(); if (axisProxy) { return axisProxy.getDataValueWindow(); } } else { return this.getAxisProxy(axisDim, axisIndex).getDataValueWindow(); } }; DataZoomModel2.prototype.findRepresentativeAxisProxy = function(axisModel) { if (axisModel) { return axisModel.__dzAxisProxy; } var firstProxy; var axisDimList = this._targetAxisInfoMap.keys(); for (var i = 0; i < axisDimList.length; i++) { var axisDim = axisDimList[i]; 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)) { return proxy; } if (!firstProxy) { firstProxy = proxy; } } } return firstProxy; }; DataZoomModel2.prototype.getRangePropMode = function() { return this._rangePropMode.slice(); }; DataZoomModel2.prototype.getOrient = function() { return this._orient; }; DataZoomModel2.type = "dataZoom"; DataZoomModel2.dependencies = ["xAxis", "yAxis", "radiusAxis", "angleAxis", "singleAxis", "series", "toolbox"]; DataZoomModel2.defaultOption = { // zlevel: 0, z: 4, filterMode: "filter", start: 0, end: 100 }; return DataZoomModel2; })(ComponentModel) ); function retrieveRawOption(option) { var ret = {}; each$f(["start", "end", "startValue", "endValue", "throttle"], function(name) { option.hasOwnProperty(name) && (ret[name] = option[name]); }); return ret; } var SelectDataZoomModel = ( /** @class */ (function(_super) { __extends(SelectDataZoomModel2, _super); function SelectDataZoomModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = SelectDataZoomModel2.type; return _this; } SelectDataZoomModel2.type = "dataZoom.select"; return SelectDataZoomModel2; })(DataZoomModel) ); var DataZoomView = ( /** @class */ (function(_super) { __extends(DataZoomView2, _super); function DataZoomView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = DataZoomView2.type; return _this; } DataZoomView2.prototype.render = function(dataZoomModel, ecModel, api, payload) { this.dataZoomModel = dataZoomModel; this.ecModel = ecModel; this.api = api; }; DataZoomView2.type = "dataZoom"; return DataZoomView2; })(ComponentView) ); var SelectDataZoomView = ( /** @class */ (function(_super) { __extends(SelectDataZoomView2, _super); function SelectDataZoomView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = SelectDataZoomView2.type; return _this; } SelectDataZoomView2.type = "dataZoom.select"; return SelectDataZoomView2; })(DataZoomView) ); var each$7 = each$f; var asc$1 = asc$2; var AxisProxy = ( /** @class */ (function() { function AxisProxy2(dimName, axisIndex, dataZoomModel, ecModel) { this._dimName = dimName; this._axisIndex = axisIndex; this.ecModel = ecModel; this._dataZoomModel = dataZoomModel; } AxisProxy2.prototype.hostedBy = function(dataZoomModel) { return this._dataZoomModel === dataZoomModel; }; AxisProxy2.prototype.getDataValueWindow = function() { return this._valueWindow.slice(); }; AxisProxy2.prototype.getDataPercentWindow = function() { return this._percentWindow.slice(); }; AxisProxy2.prototype.getTargetSeriesModels = function() { var seriesModels = []; this.ecModel.eachSeries(function(seriesModel) { if (isCoordSupported(seriesModel)) { var axisMainType = getAxisMainType(this._dimName); var axisModel = seriesModel.getReferringComponents(axisMainType, SINGLE_REFERRING).models[0]; if (axisModel && this._axisIndex === axisModel.componentIndex) { seriesModels.push(seriesModel); } } }, this); return seriesModels; }; AxisProxy2.prototype.getAxisModel = function() { return this.ecModel.getComponent(this._dimName + "Axis", this._axisIndex); }; AxisProxy2.prototype.getMinMaxSpan = function() { return clone$1(this._minMaxSpan); }; AxisProxy2.prototype.calculateDataWindow = function(opt) { var dataExtent = this._dataExtent; var axisModel = this.getAxisModel(); var scale2 = axisModel.axis.scale; var rangePropMode = this._dataZoomModel.getRangePropMode(); var percentExtent = [0, 100]; var percentWindow = []; var valueWindow = []; var hasPropModeValue; each$7(["start", "end"], function(prop, idx) { var boundPercent = opt[prop]; var boundValue = opt[prop + "Value"]; if (rangePropMode[idx] === "percent") { boundPercent == null && (boundPercent = percentExtent[idx]); boundValue = scale2.parse(linearMap$2(boundPercent, percentExtent, dataExtent)); } else { hasPropModeValue = true; boundValue = boundValue == null ? dataExtent[idx] : scale2.parse(boundValue); boundPercent = linearMap$2(boundValue, dataExtent, percentExtent); } valueWindow[idx] = boundValue == null || isNaN(boundValue) ? dataExtent[idx] : boundValue; percentWindow[idx] = boundPercent == null || isNaN(boundPercent) ? percentExtent[idx] : boundPercent; }); asc$1(valueWindow); asc$1(percentWindow); var spans = this._minMaxSpan; hasPropModeValue ? restrictSet(valueWindow, percentWindow, dataExtent, percentExtent, false) : restrictSet(percentWindow, valueWindow, percentExtent, dataExtent, true); function restrictSet(fromWindow, toWindow, fromExtent, toExtent, toValue) { var suffix = toValue ? "Span" : "ValueSpan"; sliderMove(0, fromWindow, fromExtent, "all", spans["min" + suffix], spans["max" + suffix]); for (var i = 0; i < 2; i++) { toWindow[i] = linearMap$2(fromWindow[i], fromExtent, toExtent, true); toValue && (toWindow[i] = scale2.parse(toWindow[i])); } } return { valueWindow, percentWindow }; }; AxisProxy2.prototype.reset = function(dataZoomModel) { if (dataZoomModel !== this._dataZoomModel) { return; } var targetSeries = this.getTargetSeriesModels(); this._dataExtent = calculateDataExtent(this, this._dimName, targetSeries); this._updateMinMaxSpan(); var dataWindow = this.calculateDataWindow(dataZoomModel.settledOption); this._valueWindow = dataWindow.valueWindow; this._percentWindow = dataWindow.percentWindow; this._setAxisModel(); }; AxisProxy2.prototype.filterData = function(dataZoomModel, api) { if (dataZoomModel !== this._dataZoomModel) { return; } var axisDim = this._dimName; var seriesModels = this.getTargetSeriesModels(); var filterMode = dataZoomModel.get("filterMode"); var valueWindow = this._valueWindow; if (filterMode === "none") { return; } each$7(seriesModels, function(seriesModel) { var seriesData = seriesModel.getData(); var dataDims = seriesData.mapDimensionsAll(axisDim); if (!dataDims.length) { return; } if (filterMode === "weakFilter") { var store_1 = seriesData.getStore(); var dataDimIndices_1 = map$1(dataDims, function(dim) { return seriesData.getDimensionIndex(dim); }, seriesData); seriesData.filterSelf(function(dataIndex) { var leftOut; var rightOut; var hasValue; for (var i = 0; i < dataDims.length; i++) { var value = store_1.get(dataDimIndices_1[i], dataIndex); var thisHasValue = !isNaN(value); var thisLeftOut = value < valueWindow[0]; var thisRightOut = value > valueWindow[1]; if (thisHasValue && !thisLeftOut && !thisRightOut) { return true; } thisHasValue && (hasValue = true); thisLeftOut && (leftOut = true); thisRightOut && (rightOut = true); } return hasValue && leftOut && rightOut; }); } else { each$7(dataDims, function(dim) { if (filterMode === "empty") { seriesModel.setData(seriesData = seriesData.map(dim, function(value) { return !isInWindow(value) ? NaN : value; })); } else { var range = {}; range[dim] = valueWindow; seriesData.selectRange(range); } }); } each$7(dataDims, function(dim) { seriesData.setApproximateExtent(valueWindow, dim); }); }); function isInWindow(value) { return value >= valueWindow[0] && value <= valueWindow[1]; } }; AxisProxy2.prototype._updateMinMaxSpan = function() { var minMaxSpan = this._minMaxSpan = {}; var dataZoomModel = this._dataZoomModel; var dataExtent = this._dataExtent; each$7(["min", "max"], function(minMax) { var percentSpan = dataZoomModel.get(minMax + "Span"); var valueSpan = dataZoomModel.get(minMax + "ValueSpan"); valueSpan != null && (valueSpan = this.getAxisModel().axis.scale.parse(valueSpan)); if (valueSpan != null) { percentSpan = linearMap$2(dataExtent[0] + valueSpan, dataExtent, [0, 100], true); } else if (percentSpan != null) { valueSpan = linearMap$2(percentSpan, [0, 100], dataExtent, true) - dataExtent[0]; } minMaxSpan[minMax + "Span"] = percentSpan; minMaxSpan[minMax + "ValueSpan"] = valueSpan; }, this); }; AxisProxy2.prototype._setAxisModel = function() { var axisModel = this.getAxisModel(); var percentWindow = this._percentWindow; var valueWindow = this._valueWindow; if (!percentWindow) { return; } var precision = getPixelPrecision(valueWindow, [0, 500]); precision = Math.min(precision, 20); var rawExtentInfo = axisModel.axis.scale.rawExtentInfo; if (percentWindow[0] !== 0) { rawExtentInfo.setDeterminedMinMax("min", +valueWindow[0].toFixed(precision)); } if (percentWindow[1] !== 100) { rawExtentInfo.setDeterminedMinMax("max", +valueWindow[1].toFixed(precision)); } rawExtentInfo.freeze(); }; return AxisProxy2; })() ); function calculateDataExtent(axisProxy, axisDim, seriesModels) { var dataExtent = [Infinity, -Infinity]; each$7(seriesModels, function(seriesModel) { unionAxisExtentFromData(dataExtent, seriesModel.getData(), axisDim); }); var axisModel = axisProxy.getAxisModel(); var rawExtentResult = ensureScaleRawExtentInfo(axisModel.axis.scale, axisModel, dataExtent).calculate(); return [rawExtentResult.min, rawExtentResult.max]; } var dataZoomProcessor = { // `dataZoomProcessor` will only be performed in needed series. Consider if // there is a line series and a pie series, it is better not to update the // line series if only pie series is needed to be updated. getTargetSeries: function(ecModel) { function eachAxisModel(cb) { ecModel.eachComponent("dataZoom", function(dataZoomModel) { dataZoomModel.eachTargetAxis(function(axisDim, axisIndex) { var axisModel = ecModel.getComponent(getAxisMainType(axisDim), axisIndex); cb(axisDim, axisIndex, axisModel, dataZoomModel); }); }); } eachAxisModel(function(axisDim, axisIndex, axisModel, dataZoomModel) { axisModel.__dzAxisProxy = null; }); var proxyList = []; eachAxisModel(function(axisDim, axisIndex, axisModel, dataZoomModel) { if (!axisModel.__dzAxisProxy) { axisModel.__dzAxisProxy = new AxisProxy(axisDim, axisIndex, dataZoomModel, ecModel); proxyList.push(axisModel.__dzAxisProxy); } }); var seriesModelMap = createHashMap(); each$f(proxyList, function(axisProxy) { each$f(axisProxy.getTargetSeriesModels(), function(seriesModel) { seriesModelMap.set(seriesModel.uid, seriesModel); }); }); return seriesModelMap; }, // Consider appendData, where filter should be performed. Because data process is // in block mode currently, it is not need to worry about that the overallProgress // execute every frame. overallReset: function(ecModel, api) { ecModel.eachComponent("dataZoom", function(dataZoomModel) { dataZoomModel.eachTargetAxis(function(axisDim, axisIndex) { dataZoomModel.getAxisProxy(axisDim, axisIndex).reset(dataZoomModel); }); dataZoomModel.eachTargetAxis(function(axisDim, axisIndex) { dataZoomModel.getAxisProxy(axisDim, axisIndex).filterData(dataZoomModel, api); }); }); ecModel.eachComponent("dataZoom", function(dataZoomModel) { var axisProxy = dataZoomModel.findRepresentativeAxisProxy(); if (axisProxy) { var percentRange = axisProxy.getDataPercentWindow(); var valueRange = axisProxy.getDataValueWindow(); dataZoomModel.setCalculatedRange({ start: percentRange[0], end: percentRange[1], startValue: valueRange[0], endValue: valueRange[1] }); } }); } }; function installDataZoomAction(registers) { registers.registerAction("dataZoom", function(payload, ecModel) { var effectedModels = findEffectedDataZooms(ecModel, payload); each$f(effectedModels, function(dataZoomModel) { dataZoomModel.setRawRange({ start: payload.start, end: payload.end, startValue: payload.startValue, endValue: payload.endValue }); }); }); } var installed$1 = false; function installCommon$1(registers) { if (installed$1) { return; } installed$1 = true; registers.registerProcessor(registers.PRIORITY.PROCESSOR.FILTER, dataZoomProcessor); installDataZoomAction(registers); registers.registerSubTypeDefaulter("dataZoom", function() { return "slider"; }); } function install$m(registers) { registers.registerComponentModel(SelectDataZoomModel); registers.registerComponentView(SelectDataZoomView); installCommon$1(registers); } var ToolboxFeature = ( /** @class */ /* @__PURE__ */ (function() { function ToolboxFeature2() { } return ToolboxFeature2; })() ); var features = {}; function registerFeature(name, ctor) { features[name] = ctor; } function getFeature(name) { return features[name]; } var ToolboxModel = ( /** @class */ (function(_super) { __extends(ToolboxModel2, _super); function ToolboxModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = ToolboxModel2.type; return _this; } ToolboxModel2.prototype.optionUpdated = function() { _super.prototype.optionUpdated.apply(this, arguments); var ecModel = this.ecModel; each$f(this.option.feature, function(featureOpt, featureName) { var Feature = getFeature(featureName); if (Feature) { if (Feature.getDefaultOption) { Feature.defaultOption = Feature.getDefaultOption(ecModel); } merge(featureOpt, Feature.defaultOption); } }); }; ToolboxModel2.type = "toolbox"; ToolboxModel2.layoutMode = { type: "box", ignoreSize: true }; ToolboxModel2.defaultOption = { show: true, z: 6, // zlevel: 0, orient: "horizontal", left: "right", top: "top", // right // bottom backgroundColor: "transparent", borderColor: "#ccc", borderRadius: 0, borderWidth: 0, padding: 5, itemSize: 15, itemGap: 8, showTitle: true, iconStyle: { borderColor: "#666", color: "none" }, emphasis: { iconStyle: { borderColor: "#3E98C5" } }, // textStyle: {}, // feature tooltip: { show: false, position: "bottom" } }; return ToolboxModel2; })(ComponentModel) ); function layout(group, componentModel, api) { var boxLayoutParams = componentModel.getBoxLayoutParams(); var padding = componentModel.get("padding"); var viewportSize = { width: api.getWidth(), height: api.getHeight() }; var rect = getLayoutRect(boxLayoutParams, viewportSize, padding); box(componentModel.get("orient"), group, componentModel.get("itemGap"), rect.width, rect.height); positionElement(group, boxLayoutParams, viewportSize, padding); } function makeBackground(rect, componentModel) { var padding = normalizeCssArray(componentModel.get("padding")); var style = componentModel.getItemStyle(["color", "opacity"]); style.fill = componentModel.get("backgroundColor"); rect = new Rect$2({ shape: { x: rect.x - padding[3], y: rect.y - padding[0], width: rect.width + padding[1] + padding[3], height: rect.height + padding[0] + padding[2], r: componentModel.get("borderRadius") }, style, silent: true, z2: -1 }); return rect; } var ToolboxView = ( /** @class */ (function(_super) { __extends(ToolboxView2, _super); function ToolboxView2() { return _super !== null && _super.apply(this, arguments) || this; } ToolboxView2.prototype.render = function(toolboxModel, ecModel, api, payload) { var group = this.group; group.removeAll(); if (!toolboxModel.get("show")) { return; } var itemSize = +toolboxModel.get("itemSize"); var isVertical = toolboxModel.get("orient") === "vertical"; var featureOpts = toolboxModel.get("feature") || {}; var features2 = this._features || (this._features = {}); var featureNames = []; each$f(featureOpts, function(opt, name) { featureNames.push(name); }); new DataDiffer(this._featureNames || [], featureNames).add(processFeature).update(processFeature).remove(curry$1(processFeature, null)).execute(); this._featureNames = featureNames; function processFeature(newIndex, oldIndex) { var featureName = featureNames[newIndex]; var oldName = featureNames[oldIndex]; var featureOpt = featureOpts[featureName]; var featureModel = new Model(featureOpt, toolboxModel, toolboxModel.ecModel); var feature; if (payload && payload.newTitle != null && payload.featureName === featureName) { featureOpt.title = payload.newTitle; } if (featureName && !oldName) { if (isUserFeatureName(featureName)) { feature = { onclick: featureModel.option.onclick, featureName }; } else { var Feature = getFeature(featureName); if (!Feature) { return; } feature = new Feature(); } features2[featureName] = feature; } else { feature = features2[oldName]; if (!feature) { return; } } feature.uid = getUID("toolbox-feature"); feature.model = featureModel; feature.ecModel = ecModel; feature.api = api; var isToolboxFeature = feature instanceof ToolboxFeature; if (!featureName && oldName) { isToolboxFeature && feature.dispose && feature.dispose(ecModel, api); return; } if (!featureModel.get("show") || isToolboxFeature && feature.unusable) { isToolboxFeature && feature.remove && feature.remove(ecModel, api); return; } createIconPaths(featureModel, feature, featureName); featureModel.setIconStatus = function(iconName, status) { var option = this.option; var iconPaths = this.iconPaths; option.iconStatus = option.iconStatus || {}; option.iconStatus[iconName] = status; if (iconPaths[iconName]) { (status === "emphasis" ? enterEmphasis : leaveEmphasis)(iconPaths[iconName]); } }; if (feature instanceof ToolboxFeature) { if (feature.render) { feature.render(featureModel, ecModel, api, payload); } } } function createIconPaths(featureModel, feature, featureName) { var iconStyleModel = featureModel.getModel("iconStyle"); var iconStyleEmphasisModel = featureModel.getModel(["emphasis", "iconStyle"]); var icons = feature instanceof ToolboxFeature && feature.getIcons ? feature.getIcons() : featureModel.get("icon"); var titles = featureModel.get("title") || {}; var iconsMap; var titlesMap; if (isString(icons)) { iconsMap = {}; iconsMap[featureName] = icons; } else { iconsMap = icons; } if (isString(titles)) { titlesMap = {}; titlesMap[featureName] = titles; } else { titlesMap = titles; } var iconPaths = featureModel.iconPaths = {}; each$f(iconsMap, function(iconStr, iconName) { var path = createIcon(iconStr, {}, { x: -itemSize / 2, y: -itemSize / 2, width: itemSize, height: itemSize }); path.setStyle(iconStyleModel.getItemStyle()); var pathEmphasisState = path.ensureState("emphasis"); pathEmphasisState.style = iconStyleEmphasisModel.getItemStyle(); var textContent = new ZRText({ style: { text: titlesMap[iconName], align: iconStyleEmphasisModel.get("textAlign"), borderRadius: iconStyleEmphasisModel.get("textBorderRadius"), padding: iconStyleEmphasisModel.get("textPadding"), fill: null, font: getFont({ fontStyle: iconStyleEmphasisModel.get("textFontStyle"), fontFamily: iconStyleEmphasisModel.get("textFontFamily"), fontSize: iconStyleEmphasisModel.get("textFontSize"), fontWeight: iconStyleEmphasisModel.get("textFontWeight") }, ecModel) }, ignore: true }); path.setTextContent(textContent); setTooltipConfig({ el: path, componentModel: toolboxModel, itemName: iconName, formatterParamsExtra: { title: titlesMap[iconName] } }); path.__title = titlesMap[iconName]; path.on("mouseover", function() { var hoverStyle = iconStyleEmphasisModel.getItemStyle(); var defaultTextPosition = isVertical ? toolboxModel.get("right") == null && toolboxModel.get("left") !== "right" ? "right" : "left" : toolboxModel.get("bottom") == null && toolboxModel.get("top") !== "bottom" ? "bottom" : "top"; textContent.setStyle({ fill: iconStyleEmphasisModel.get("textFill") || hoverStyle.fill || hoverStyle.stroke || "#000", backgroundColor: iconStyleEmphasisModel.get("textBackgroundColor") }); path.setTextConfig({ position: iconStyleEmphasisModel.get("textPosition") || defaultTextPosition }); textContent.ignore = !toolboxModel.get("showTitle"); api.enterEmphasis(this); }).on("mouseout", function() { if (featureModel.get(["iconStatus", iconName]) !== "emphasis") { api.leaveEmphasis(this); } textContent.hide(); }); (featureModel.get(["iconStatus", iconName]) === "emphasis" ? enterEmphasis : leaveEmphasis)(path); group.add(path); path.on("click", bind$1(feature.onclick, feature, ecModel, api, iconName)); iconPaths[iconName] = path; }); } layout(group, toolboxModel, api); group.add(makeBackground(group.getBoundingRect(), toolboxModel)); isVertical || group.eachChild(function(icon) { var titleText = icon.__title; var emphasisState = icon.ensureState("emphasis"); var emphasisTextConfig = emphasisState.textConfig || (emphasisState.textConfig = {}); var textContent = icon.getTextContent(); var emphasisTextState = textContent && textContent.ensureState("emphasis"); if (emphasisTextState && !isFunction(emphasisTextState) && titleText) { var emphasisTextStyle = emphasisTextState.style || (emphasisTextState.style = {}); var rect = getBoundingRect(titleText, ZRText.makeFont(emphasisTextStyle)); var offsetX = icon.x + group.x; var offsetY = icon.y + group.y + itemSize; var needPutOnTop = false; if (offsetY + rect.height > api.getHeight()) { emphasisTextConfig.position = "top"; needPutOnTop = true; } var topOffset = needPutOnTop ? -5 - rect.height : itemSize + 10; if (offsetX + rect.width / 2 > api.getWidth()) { emphasisTextConfig.position = ["100%", topOffset]; emphasisTextStyle.align = "right"; } else if (offsetX - rect.width / 2 < 0) { emphasisTextConfig.position = [0, topOffset]; emphasisTextStyle.align = "left"; } } }); }; ToolboxView2.prototype.updateView = function(toolboxModel, ecModel, api, payload) { each$f(this._features, function(feature) { feature instanceof ToolboxFeature && feature.updateView && feature.updateView(feature.model, ecModel, api, payload); }); }; ToolboxView2.prototype.remove = function(ecModel, api) { each$f(this._features, function(feature) { feature instanceof ToolboxFeature && feature.remove && feature.remove(ecModel, api); }); this.group.removeAll(); }; ToolboxView2.prototype.dispose = function(ecModel, api) { each$f(this._features, function(feature) { feature instanceof ToolboxFeature && feature.dispose && feature.dispose(ecModel, api); }); }; ToolboxView2.type = "toolbox"; return ToolboxView2; })(ComponentView) ); function isUserFeatureName(featureName) { return featureName.indexOf("my") === 0; } var SaveAsImage = ( /** @class */ (function(_super) { __extends(SaveAsImage2, _super); function SaveAsImage2() { return _super !== null && _super.apply(this, arguments) || this; } SaveAsImage2.prototype.onclick = function(ecModel, api) { var model = this.model; var title = model.get("name") || ecModel.get("title.0.text") || "echarts"; var isSvg = api.getZr().painter.getType() === "svg"; var type = isSvg ? "svg" : model.get("type", true) || "png"; var url = api.getConnectedDataURL({ type, backgroundColor: model.get("backgroundColor", true) || ecModel.get("backgroundColor") || "#fff", connectedBackgroundColor: model.get("connectedBackgroundColor"), excludeComponents: model.get("excludeComponents"), pixelRatio: model.get("pixelRatio") }); var browser = env.browser; if (typeof MouseEvent === "function" && (browser.newEdge || !browser.ie && !browser.edge)) { var $a = document.createElement("a"); $a.download = title + "." + type; $a.target = "_blank"; $a.href = url; var evt = new MouseEvent("click", { // some micro front-end framework, window maybe is a Proxy view: document.defaultView, bubbles: true, cancelable: false }); $a.dispatchEvent(evt); } else { if (window.navigator.msSaveOrOpenBlob || isSvg) { var parts = url.split(","); var base64Encoded = parts[0].indexOf("base64") > -1; var bstr = isSvg ? decodeURIComponent(parts[1]) : parts[1]; base64Encoded && (bstr = window.atob(bstr)); var filename = title + "." + type; if (window.navigator.msSaveOrOpenBlob) { var n = bstr.length; var u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } var blob = new Blob([u8arr]); window.navigator.msSaveOrOpenBlob(blob, filename); } else { var frame = document.createElement("iframe"); document.body.appendChild(frame); var cw = frame.contentWindow; var doc = cw.document; doc.open("image/svg+xml", "replace"); doc.write(bstr); doc.close(); cw.focus(); doc.execCommand("SaveAs", true, filename); document.body.removeChild(frame); } } else { var lang = model.get("lang"); var html = ''; var tab = window.open(); tab.document.write(html); tab.document.title = title; } } }; SaveAsImage2.getDefaultOption = function(ecModel) { var defaultOption2 = { show: true, icon: "M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0", title: ecModel.getLocaleModel().get(["toolbox", "saveAsImage", "title"]), type: "png", // Default use option.backgroundColor // backgroundColor: '#fff', connectedBackgroundColor: "#fff", name: "", excludeComponents: ["toolbox"], // use current pixel ratio of device by default // pixelRatio: 1, lang: ecModel.getLocaleModel().get(["toolbox", "saveAsImage", "lang"]) }; return defaultOption2; }; return SaveAsImage2; })(ToolboxFeature) ); var INNER_STACK_KEYWORD = "__ec_magicType_stack__"; var radioTypes = [["line", "bar"], ["stack"]]; var MagicType = ( /** @class */ (function(_super) { __extends(MagicType2, _super); function MagicType2() { return _super !== null && _super.apply(this, arguments) || this; } MagicType2.prototype.getIcons = function() { var model = this.model; var availableIcons = model.get("icon"); var icons = {}; each$f(model.get("type"), function(type) { if (availableIcons[type]) { icons[type] = availableIcons[type]; } }); return icons; }; MagicType2.getDefaultOption = function(ecModel) { var defaultOption2 = { show: true, type: [], // Icon group icon: { line: "M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4", bar: "M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7", // eslint-disable-next-line stack: "M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z" // jshint ignore:line }, // `line`, `bar`, `stack`, `tiled` title: ecModel.getLocaleModel().get(["toolbox", "magicType", "title"]), option: {}, seriesIndex: {} }; return defaultOption2; }; MagicType2.prototype.onclick = function(ecModel, api, type) { var model = this.model; var seriesIndex = model.get(["seriesIndex", type]); if (!seriesOptGenreator[type]) { return; } var newOption = { series: [] }; var generateNewSeriesTypes = function(seriesModel) { var seriesType2 = seriesModel.subType; var seriesId = seriesModel.id; var newSeriesOpt = seriesOptGenreator[type](seriesType2, seriesId, seriesModel, model); if (newSeriesOpt) { defaults(newSeriesOpt, seriesModel.option); newOption.series.push(newSeriesOpt); } var coordSys = seriesModel.coordinateSystem; if (coordSys && coordSys.type === "cartesian2d" && (type === "line" || type === "bar")) { var categoryAxis2 = coordSys.getAxesByScale("ordinal")[0]; if (categoryAxis2) { var axisDim = categoryAxis2.dim; var axisType = axisDim + "Axis"; var axisModel = seriesModel.getReferringComponents(axisType, SINGLE_REFERRING).models[0]; var axisIndex = axisModel.componentIndex; newOption[axisType] = newOption[axisType] || []; for (var i = 0; i <= axisIndex; i++) { newOption[axisType][axisIndex] = newOption[axisType][axisIndex] || {}; } newOption[axisType][axisIndex].boundaryGap = type === "bar"; } } }; each$f(radioTypes, function(radio) { if (indexOf(radio, type) >= 0) { each$f(radio, function(item) { model.setIconStatus(item, "normal"); }); } }); model.setIconStatus(type, "emphasis"); ecModel.eachComponent({ mainType: "series", query: seriesIndex == null ? null : { seriesIndex } }, generateNewSeriesTypes); var newTitle; var currentType = type; if (type === "stack") { newTitle = merge({ stack: model.option.title.tiled, tiled: model.option.title.stack }, model.option.title); if (model.get(["iconStatus", type]) !== "emphasis") { currentType = "tiled"; } } api.dispatchAction({ type: "changeMagicType", currentType, newOption, newTitle, featureName: "magicType" }); }; return MagicType2; })(ToolboxFeature) ); var seriesOptGenreator = { "line": function(seriesType2, seriesId, seriesModel, model) { if (seriesType2 === "bar") { return merge({ id: seriesId, type: "line", // Preserve data related option data: seriesModel.get("data"), stack: seriesModel.get("stack"), markPoint: seriesModel.get("markPoint"), markLine: seriesModel.get("markLine") }, model.get(["option", "line"]) || {}, true); } }, "bar": function(seriesType2, seriesId, seriesModel, model) { if (seriesType2 === "line") { return merge({ id: seriesId, type: "bar", // Preserve data related option data: seriesModel.get("data"), stack: seriesModel.get("stack"), markPoint: seriesModel.get("markPoint"), markLine: seriesModel.get("markLine") }, model.get(["option", "bar"]) || {}, true); } }, "stack": function(seriesType2, seriesId, seriesModel, model) { var isStack = seriesModel.get("stack") === INNER_STACK_KEYWORD; if (seriesType2 === "line" || seriesType2 === "bar") { model.setIconStatus("stack", isStack ? "normal" : "emphasis"); return merge({ id: seriesId, stack: isStack ? "" : INNER_STACK_KEYWORD }, model.get(["option", "stack"]) || {}, true); } } }; registerAction({ type: "changeMagicType", event: "magicTypeChanged", update: "prepareAndUpdate" }, function(payload, ecModel) { ecModel.mergeOption(payload.newOption); }); var BLOCK_SPLITER = new Array(60).join("-"); var ITEM_SPLITER = " "; function groupSeries(ecModel) { var seriesGroupByCategoryAxis = {}; var otherSeries = []; var meta = []; ecModel.eachRawSeries(function(seriesModel) { var coordSys = seriesModel.coordinateSystem; if (coordSys && (coordSys.type === "cartesian2d" || coordSys.type === "polar")) { var baseAxis = coordSys.getBaseAxis(); if (baseAxis.type === "category") { var key = baseAxis.dim + "_" + baseAxis.index; if (!seriesGroupByCategoryAxis[key]) { seriesGroupByCategoryAxis[key] = { categoryAxis: baseAxis, valueAxis: coordSys.getOtherAxis(baseAxis), series: [] }; meta.push({ axisDim: baseAxis.dim, axisIndex: baseAxis.index }); } seriesGroupByCategoryAxis[key].series.push(seriesModel); } else { otherSeries.push(seriesModel); } } else { otherSeries.push(seriesModel); } }); return { seriesGroupByCategoryAxis, other: otherSeries, meta }; } function assembleSeriesWithCategoryAxis(groups) { var tables = []; each$f(groups, function(group, key) { var categoryAxis2 = group.categoryAxis; var valueAxis2 = group.valueAxis; var valueAxisDim = valueAxis2.dim; var headers = [" "].concat(map$1(group.series, function(series) { return series.name; })); var columns = [categoryAxis2.model.getCategories()]; each$f(group.series, function(series) { var rawData = series.getRawData(); columns.push(series.getRawData().mapArray(rawData.mapDimension(valueAxisDim), function(val) { return val; })); }); var lines = [headers.join(ITEM_SPLITER)]; for (var i = 0; i < columns[0].length; i++) { var items = []; for (var j = 0; j < columns.length; j++) { items.push(columns[j][i]); } lines.push(items.join(ITEM_SPLITER)); } tables.push(lines.join("\n")); }); return tables.join("\n\n" + BLOCK_SPLITER + "\n\n"); } function assembleOtherSeries(series) { return map$1(series, function(series2) { var data = series2.getRawData(); var lines = [series2.name]; var vals = []; data.each(data.dimensions, function() { var argLen = arguments.length; var dataIndex = arguments[argLen - 1]; var name = data.getName(dataIndex); for (var i = 0; i < argLen - 1; i++) { vals[i] = arguments[i]; } lines.push((name ? name + ITEM_SPLITER : "") + vals.join(ITEM_SPLITER)); }); return lines.join("\n"); }).join("\n\n" + BLOCK_SPLITER + "\n\n"); } function getContentFromModel(ecModel) { var result = groupSeries(ecModel); return { value: filter([assembleSeriesWithCategoryAxis(result.seriesGroupByCategoryAxis), assembleOtherSeries(result.other)], function(str) { return !!str.replace(/[\n\t\s]/g, ""); }).join("\n\n" + BLOCK_SPLITER + "\n\n"), meta: result.meta }; } function trim(str) { return str.replace(/^\s\s*/, "").replace(/\s\s*$/, ""); } function isTSVFormat(block) { var firstLine = block.slice(0, block.indexOf("\n")); if (firstLine.indexOf(ITEM_SPLITER) >= 0) { return true; } } var itemSplitRegex = new RegExp("[" + ITEM_SPLITER + "]+", "g"); function parseTSVContents(tsv) { var tsvLines = tsv.split(/\n+/g); var headers = trim(tsvLines.shift()).split(itemSplitRegex); var categories = []; var series = map$1(headers, function(header) { return { name: header, data: [] }; }); for (var i = 0; i < tsvLines.length; i++) { var items = trim(tsvLines[i]).split(itemSplitRegex); categories.push(items.shift()); for (var j = 0; j < items.length; j++) { series[j] && (series[j].data[i] = items[j]); } } return { series, categories }; } function parseListContents(str) { var lines = str.split(/\n+/g); var seriesName = trim(lines.shift()); var data = []; for (var i = 0; i < lines.length; i++) { var line = trim(lines[i]); if (!line) { continue; } var items = line.split(itemSplitRegex); var name_1 = ""; var value = void 0; var hasName = false; if (isNaN(items[0])) { hasName = true; name_1 = items[0]; items = items.slice(1); data[i] = { name: name_1, value: [] }; value = data[i].value; } else { value = data[i] = []; } for (var j = 0; j < items.length; j++) { value.push(+items[j]); } if (value.length === 1) { hasName ? data[i].value = value[0] : data[i] = value[0]; } } return { name: seriesName, data }; } function parseContents(str, blockMetaList) { var blocks = str.split(new RegExp("\n*" + BLOCK_SPLITER + "\n*", "g")); var newOption = { series: [] }; each$f(blocks, function(block, idx) { if (isTSVFormat(block)) { var result = parseTSVContents(block); var blockMeta = blockMetaList[idx]; var axisKey = blockMeta.axisDim + "Axis"; if (blockMeta) { newOption[axisKey] = newOption[axisKey] || []; newOption[axisKey][blockMeta.axisIndex] = { data: result.categories }; newOption.series = newOption.series.concat(result.series); } } else { var result = parseListContents(block); newOption.series.push(result); } }); return newOption; } var DataView = ( /** @class */ (function(_super) { __extends(DataView2, _super); function DataView2() { return _super !== null && _super.apply(this, arguments) || this; } DataView2.prototype.onclick = function(ecModel, api) { setTimeout(function() { api.dispatchAction({ type: "hideTip" }); }); var container = api.getDom(); var model = this.model; if (this._dom) { container.removeChild(this._dom); } var root = document.createElement("div"); root.style.cssText = "position:absolute;top:0;bottom:0;left:0;right:0;padding:5px"; root.style.backgroundColor = model.get("backgroundColor") || "#fff"; var header = document.createElement("h4"); var lang = model.get("lang") || []; header.innerHTML = lang[0] || model.get("title"); header.style.cssText = "margin:10px 20px"; header.style.color = model.get("textColor"); var viewMain = document.createElement("div"); var textarea = document.createElement("textarea"); viewMain.style.cssText = "overflow:auto"; var optionToContent = model.get("optionToContent"); var contentToOption = model.get("contentToOption"); var result = getContentFromModel(ecModel); if (isFunction(optionToContent)) { var htmlOrDom = optionToContent(api.getOption()); if (isString(htmlOrDom)) { viewMain.innerHTML = htmlOrDom; } else if (isDom(htmlOrDom)) { viewMain.appendChild(htmlOrDom); } } else { textarea.readOnly = model.get("readOnly"); var style = textarea.style; style.cssText = "display:block;width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;resize:none;box-sizing:border-box;outline:none"; style.color = model.get("textColor"); style.borderColor = model.get("textareaBorderColor"); style.backgroundColor = model.get("textareaColor"); textarea.value = result.value; viewMain.appendChild(textarea); } var blockMetaList = result.meta; var buttonContainer = document.createElement("div"); buttonContainer.style.cssText = "position:absolute;bottom:5px;left:0;right:0"; var buttonStyle = "float:right;margin-right:20px;border:none;cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px"; var closeButton = document.createElement("div"); var refreshButton = document.createElement("div"); buttonStyle += ";background-color:" + model.get("buttonColor"); buttonStyle += ";color:" + model.get("buttonTextColor"); var self = this; function close() { container.removeChild(root); self._dom = null; } addEventListener(closeButton, "click", close); addEventListener(refreshButton, "click", function() { if (contentToOption == null && optionToContent != null || contentToOption != null && optionToContent == null) { close(); return; } var newOption; try { if (isFunction(contentToOption)) { newOption = contentToOption(viewMain, api.getOption()); } else { newOption = parseContents(textarea.value, blockMetaList); } } catch (e) { close(); throw new Error("Data view format error " + e); } if (newOption) { api.dispatchAction({ type: "changeDataView", newOption }); } close(); }); closeButton.innerHTML = lang[1]; refreshButton.innerHTML = lang[2]; refreshButton.style.cssText = closeButton.style.cssText = buttonStyle; !model.get("readOnly") && buttonContainer.appendChild(refreshButton); buttonContainer.appendChild(closeButton); root.appendChild(header); root.appendChild(viewMain); root.appendChild(buttonContainer); viewMain.style.height = container.clientHeight - 80 + "px"; container.appendChild(root); this._dom = root; }; DataView2.prototype.remove = function(ecModel, api) { this._dom && api.getDom().removeChild(this._dom); }; DataView2.prototype.dispose = function(ecModel, api) { this.remove(ecModel, api); }; DataView2.getDefaultOption = function(ecModel) { var defaultOption2 = { show: true, readOnly: false, optionToContent: null, contentToOption: null, // eslint-disable-next-line icon: "M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28", title: ecModel.getLocaleModel().get(["toolbox", "dataView", "title"]), lang: ecModel.getLocaleModel().get(["toolbox", "dataView", "lang"]), backgroundColor: "#fff", textColor: "#000", textareaColor: "#fff", textareaBorderColor: "#333", buttonColor: "#c23531", buttonTextColor: "#fff" }; return defaultOption2; }; return DataView2; })(ToolboxFeature) ); function tryMergeDataOption(newData, originalData) { return map$1(newData, function(newVal, idx) { var original = originalData && originalData[idx]; if (isObject$3(original) && !isArray$1(original)) { var newValIsObject = isObject$3(newVal) && !isArray$1(newVal); if (!newValIsObject) { newVal = { value: newVal }; } var shouldDeleteName = original.name != null && newVal.name == null; newVal = defaults(newVal, original); shouldDeleteName && delete newVal.name; return newVal; } else { return newVal; } }); } registerAction({ type: "changeDataView", event: "dataViewChanged", update: "prepareAndUpdate" }, function(payload, ecModel) { var newSeriesOptList = []; each$f(payload.newOption.series, function(seriesOpt) { var seriesModel = ecModel.getSeriesByName(seriesOpt.name)[0]; if (!seriesModel) { newSeriesOptList.push(extend({ // Default is scatter type: "scatter" }, seriesOpt)); } else { var originalData = seriesModel.get("data"); newSeriesOptList.push({ name: seriesOpt.name, data: tryMergeDataOption(seriesOpt.data, originalData) }); } }); ecModel.mergeOption(defaults({ series: newSeriesOptList }, payload.newOption)); }); var each$6 = each$f; var inner$6 = makeInner(); function push(ecModel, newSnapshot) { var storedSnapshots = getStoreSnapshots(ecModel); each$6(newSnapshot, function(batchItem, dataZoomId) { var i = storedSnapshots.length - 1; for (; i >= 0; i--) { var snapshot = storedSnapshots[i]; if (snapshot[dataZoomId]) { break; } } if (i < 0) { var dataZoomModel = ecModel.queryComponents({ mainType: "dataZoom", subType: "select", id: dataZoomId })[0]; if (dataZoomModel) { var percentRange = dataZoomModel.getPercentRange(); storedSnapshots[0][dataZoomId] = { dataZoomId, start: percentRange[0], end: percentRange[1] }; } } }); storedSnapshots.push(newSnapshot); } function pop(ecModel) { var storedSnapshots = getStoreSnapshots(ecModel); var head = storedSnapshots[storedSnapshots.length - 1]; storedSnapshots.length > 1 && storedSnapshots.pop(); var snapshot = {}; each$6(head, function(batchItem, dataZoomId) { for (var i = storedSnapshots.length - 1; i >= 0; i--) { batchItem = storedSnapshots[i][dataZoomId]; if (batchItem) { snapshot[dataZoomId] = batchItem; break; } } }); return snapshot; } function clear(ecModel) { inner$6(ecModel).snapshots = null; } function count(ecModel) { return getStoreSnapshots(ecModel).length; } function getStoreSnapshots(ecModel) { var store = inner$6(ecModel); if (!store.snapshots) { store.snapshots = [{}]; } return store.snapshots; } var RestoreOption = ( /** @class */ (function(_super) { __extends(RestoreOption2, _super); function RestoreOption2() { return _super !== null && _super.apply(this, arguments) || this; } RestoreOption2.prototype.onclick = function(ecModel, api) { clear(ecModel); api.dispatchAction({ type: "restore", from: this.uid }); }; RestoreOption2.getDefaultOption = function(ecModel) { var defaultOption2 = { show: true, // eslint-disable-next-line icon: "M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5", title: ecModel.getLocaleModel().get(["toolbox", "restore", "title"]) }; return defaultOption2; }; return RestoreOption2; })(ToolboxFeature) ); registerAction({ type: "restore", event: "restore", update: "prepareAndUpdate" }, function(payload, ecModel) { ecModel.resetOption("recreate"); }); var INCLUDE_FINDER_MAIN_TYPES = ["grid", "xAxis", "yAxis", "geo", "graph", "polar", "radiusAxis", "angleAxis", "bmap"]; var BrushTargetManager = ( /** @class */ (function() { function BrushTargetManager2(finder, ecModel, opt) { var _this = this; this._targetInfoList = []; var foundCpts = parseFinder(ecModel, finder); each$f(targetInfoBuilders, function(builder, type) { if (!opt || !opt.include || indexOf(opt.include, type) >= 0) { builder(foundCpts, _this._targetInfoList); } }); } BrushTargetManager2.prototype.setOutputRanges = function(areas, ecModel) { this.matchOutputRanges(areas, ecModel, function(area, coordRange, coordSys) { (area.coordRanges || (area.coordRanges = [])).push(coordRange); if (!area.coordRange) { area.coordRange = coordRange; var result = coordConvert[area.brushType](0, coordSys, coordRange); area.__rangeOffset = { offset: diffProcessor[area.brushType](result.values, area.range, [1, 1]), xyMinMax: result.xyMinMax }; } }); return areas; }; BrushTargetManager2.prototype.matchOutputRanges = function(areas, ecModel, cb) { each$f(areas, function(area) { var targetInfo = this.findTargetInfo(area, ecModel); if (targetInfo && targetInfo !== true) { each$f(targetInfo.coordSyses, function(coordSys) { var result = coordConvert[area.brushType](1, coordSys, area.range, true); cb(area, result.values, coordSys, ecModel); }); } }, this); }; BrushTargetManager2.prototype.setInputRanges = function(areas, ecModel) { each$f(areas, function(area) { var targetInfo = this.findTargetInfo(area, ecModel); area.range = area.range || []; if (targetInfo && targetInfo !== true) { area.panelId = targetInfo.panelId; var result = coordConvert[area.brushType](0, targetInfo.coordSys, area.coordRange); var rangeOffset = area.__rangeOffset; area.range = rangeOffset ? diffProcessor[area.brushType](result.values, rangeOffset.offset, getScales(result.xyMinMax, rangeOffset.xyMinMax)) : result.values; } }, this); }; BrushTargetManager2.prototype.makePanelOpts = function(api, getDefaultBrushType) { return map$1(this._targetInfoList, function(targetInfo) { var rect = targetInfo.getPanelRect(); return { panelId: targetInfo.panelId, defaultBrushType: getDefaultBrushType ? getDefaultBrushType(targetInfo) : null, clipPath: makeRectPanelClipPath(rect), isTargetByCursor: makeRectIsTargetByCursor(rect, api, targetInfo.coordSysModel), getLinearBrushOtherExtent: makeLinearBrushOtherExtent(rect) }; }); }; BrushTargetManager2.prototype.controlSeries = function(area, seriesModel, ecModel) { var targetInfo = this.findTargetInfo(area, ecModel); return targetInfo === true || targetInfo && indexOf(targetInfo.coordSyses, seriesModel.coordinateSystem) >= 0; }; BrushTargetManager2.prototype.findTargetInfo = function(area, ecModel) { var targetInfoList = this._targetInfoList; var foundCpts = parseFinder(ecModel, area); for (var i = 0; i < targetInfoList.length; i++) { var targetInfo = targetInfoList[i]; var areaPanelId = area.panelId; if (areaPanelId) { if (targetInfo.panelId === areaPanelId) { return targetInfo; } } else { for (var j = 0; j < targetInfoMatchers.length; j++) { if (targetInfoMatchers[j](foundCpts, targetInfo)) { return targetInfo; } } } } return true; }; return BrushTargetManager2; })() ); function formatMinMax(minMax) { minMax[0] > minMax[1] && minMax.reverse(); return minMax; } function parseFinder(ecModel, finder) { return parseFinder$1(ecModel, finder, { includeMainTypes: INCLUDE_FINDER_MAIN_TYPES }); } var targetInfoBuilders = { grid: function(foundCpts, targetInfoList) { var xAxisModels = foundCpts.xAxisModels; var yAxisModels = foundCpts.yAxisModels; var gridModels = foundCpts.gridModels; var gridModelMap = createHashMap(); var xAxesHas = {}; var yAxesHas = {}; if (!xAxisModels && !yAxisModels && !gridModels) { return; } each$f(xAxisModels, function(axisModel) { var gridModel = axisModel.axis.grid.model; gridModelMap.set(gridModel.id, gridModel); xAxesHas[gridModel.id] = true; }); each$f(yAxisModels, function(axisModel) { var gridModel = axisModel.axis.grid.model; gridModelMap.set(gridModel.id, gridModel); yAxesHas[gridModel.id] = true; }); each$f(gridModels, function(gridModel) { gridModelMap.set(gridModel.id, gridModel); xAxesHas[gridModel.id] = true; yAxesHas[gridModel.id] = true; }); gridModelMap.each(function(gridModel) { var grid = gridModel.coordinateSystem; var cartesians = []; each$f(grid.getCartesians(), function(cartesian, index) { if (indexOf(xAxisModels, cartesian.getAxis("x").model) >= 0 || indexOf(yAxisModels, cartesian.getAxis("y").model) >= 0) { cartesians.push(cartesian); } }); targetInfoList.push({ panelId: "grid--" + gridModel.id, gridModel, coordSysModel: gridModel, // Use the first one as the representitive coordSys. coordSys: cartesians[0], coordSyses: cartesians, getPanelRect: panelRectBuilders.grid, xAxisDeclared: xAxesHas[gridModel.id], yAxisDeclared: yAxesHas[gridModel.id] }); }); }, geo: function(foundCpts, targetInfoList) { each$f(foundCpts.geoModels, function(geoModel) { var coordSys = geoModel.coordinateSystem; targetInfoList.push({ panelId: "geo--" + geoModel.id, geoModel, coordSysModel: geoModel, coordSys, coordSyses: [coordSys], getPanelRect: panelRectBuilders.geo }); }); } }; var targetInfoMatchers = [ // grid function(foundCpts, targetInfo) { var xAxisModel = foundCpts.xAxisModel; var yAxisModel = foundCpts.yAxisModel; var gridModel = foundCpts.gridModel; !gridModel && xAxisModel && (gridModel = xAxisModel.axis.grid.model); !gridModel && yAxisModel && (gridModel = yAxisModel.axis.grid.model); return gridModel && gridModel === targetInfo.gridModel; }, // geo function(foundCpts, targetInfo) { var geoModel = foundCpts.geoModel; return geoModel && geoModel === targetInfo.geoModel; } ]; var panelRectBuilders = { grid: function() { return this.coordSys.master.getRect().clone(); }, geo: function() { var coordSys = this.coordSys; var rect = coordSys.getBoundingRect().clone(); rect.applyTransform(getTransform$1(coordSys)); return rect; } }; var coordConvert = { lineX: curry$1(axisConvert, 0), lineY: curry$1(axisConvert, 1), rect: function(to, coordSys, rangeOrCoordRange, clamp2) { var xminymin = to ? coordSys.pointToData([rangeOrCoordRange[0][0], rangeOrCoordRange[1][0]], clamp2) : coordSys.dataToPoint([rangeOrCoordRange[0][0], rangeOrCoordRange[1][0]], clamp2); var xmaxymax = to ? coordSys.pointToData([rangeOrCoordRange[0][1], rangeOrCoordRange[1][1]], clamp2) : coordSys.dataToPoint([rangeOrCoordRange[0][1], rangeOrCoordRange[1][1]], clamp2); var values = [formatMinMax([xminymin[0], xmaxymax[0]]), formatMinMax([xminymin[1], xmaxymax[1]])]; return { values, xyMinMax: values }; }, polygon: function(to, coordSys, rangeOrCoordRange, clamp2) { var xyMinMax = [[Infinity, -Infinity], [Infinity, -Infinity]]; var values = map$1(rangeOrCoordRange, function(item) { var p = to ? coordSys.pointToData(item, clamp2) : coordSys.dataToPoint(item, clamp2); xyMinMax[0][0] = Math.min(xyMinMax[0][0], p[0]); xyMinMax[1][0] = Math.min(xyMinMax[1][0], p[1]); xyMinMax[0][1] = Math.max(xyMinMax[0][1], p[0]); xyMinMax[1][1] = Math.max(xyMinMax[1][1], p[1]); return p; }); return { values, xyMinMax }; } }; function axisConvert(axisNameIndex, to, coordSys, rangeOrCoordRange) { var axis = coordSys.getAxis(["x", "y"][axisNameIndex]); var values = formatMinMax(map$1([0, 1], function(i) { return to ? axis.coordToData(axis.toLocalCoord(rangeOrCoordRange[i]), true) : axis.toGlobalCoord(axis.dataToCoord(rangeOrCoordRange[i])); })); var xyMinMax = []; xyMinMax[axisNameIndex] = values; xyMinMax[1 - axisNameIndex] = [NaN, NaN]; return { values, xyMinMax }; } var diffProcessor = { lineX: curry$1(axisDiffProcessor, 0), lineY: curry$1(axisDiffProcessor, 1), rect: function(values, refer, scales) { return [[values[0][0] - scales[0] * refer[0][0], values[0][1] - scales[0] * refer[0][1]], [values[1][0] - scales[1] * refer[1][0], values[1][1] - scales[1] * refer[1][1]]]; }, polygon: function(values, refer, scales) { return map$1(values, function(item, idx) { return [item[0] - scales[0] * refer[idx][0], item[1] - scales[1] * refer[idx][1]]; }); } }; function axisDiffProcessor(axisNameIndex, values, refer, scales) { return [values[0] - scales[axisNameIndex] * refer[0], values[1] - scales[axisNameIndex] * refer[1]]; } function getScales(xyMinMaxCurr, xyMinMaxOrigin) { var sizeCurr = getSize(xyMinMaxCurr); var sizeOrigin = getSize(xyMinMaxOrigin); var scales = [sizeCurr[0] / sizeOrigin[0], sizeCurr[1] / sizeOrigin[1]]; isNaN(scales[0]) && (scales[0] = 1); isNaN(scales[1]) && (scales[1] = 1); return scales; } function getSize(xyMinMax) { return xyMinMax ? [xyMinMax[0][1] - xyMinMax[0][0], xyMinMax[1][1] - xyMinMax[1][0]] : [NaN, NaN]; } var each$5 = each$f; var DATA_ZOOM_ID_BASE = makeInternalComponentId("toolbox-dataZoom_"); var DataZoomFeature = ( /** @class */ (function(_super) { __extends(DataZoomFeature2, _super); function DataZoomFeature2() { return _super !== null && _super.apply(this, arguments) || this; } DataZoomFeature2.prototype.render = function(featureModel, ecModel, api, payload) { if (!this._brushController) { this._brushController = new BrushController(api.getZr()); this._brushController.on("brush", bind$1(this._onBrush, this)).mount(); } updateZoomBtnStatus(featureModel, ecModel, this, payload, api); updateBackBtnStatus(featureModel, ecModel); }; DataZoomFeature2.prototype.onclick = function(ecModel, api, type) { handlers[type].call(this); }; DataZoomFeature2.prototype.remove = function(ecModel, api) { this._brushController && this._brushController.unmount(); }; DataZoomFeature2.prototype.dispose = function(ecModel, api) { this._brushController && this._brushController.dispose(); }; DataZoomFeature2.prototype._onBrush = function(eventParam) { var areas = eventParam.areas; if (!eventParam.isEnd || !areas.length) { return; } var snapshot = {}; var ecModel = this.ecModel; this._brushController.updateCovers([]); 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); } }); 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); 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, ecModel2) { var found; ecModel2.eachComponent({ mainType: "dataZoom", subType: "select" }, function(dzModel) { var has2 = dzModel.getAxisModel(dimName, axisModel.componentIndex); has2 && (found = dzModel); }); return found; } }; DataZoomFeature2.prototype._dispatchZoomAction = function(snapshot) { var batch = []; each$5(snapshot, function(batchItem, dataZoomId) { batch.push(clone$1(batchItem)); }); batch.length && this.api.dispatchAction({ type: "dataZoom", from: this.uid, batch }); }; DataZoomFeature2.getDefaultOption = function(ecModel) { var defaultOption2 = { 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 defaultOption2; }; return DataZoomFeature2; })(ToolboxFeature) ); var handlers = { zoom: function() { var nextActive = !this._isZoomActive; this.api.dispatchAction({ type: "takeGlobalCursor", key: "dataZoomSelect", dataZoomSelectActive: nextActive }); }, back: function() { this._dispatchZoomAction(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 (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", 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$1(ecModel, finder); each$5(finderResult.xAxisModels, function(axisModel) { return buildInternalOptions(axisModel, "xAxis", "xAxisIndex"); }); each$5(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; }); function install$l(registers) { registers.registerComponentModel(ToolboxModel); registers.registerComponentView(ToolboxView); registerFeature("saveAsImage", SaveAsImage); registerFeature("magicType", MagicType); registerFeature("dataView", DataView); registerFeature("dataZoom", DataZoomFeature); registerFeature("restore", RestoreOption); use(install$m); } var TooltipModel = ( /** @class */ (function(_super) { __extends(TooltipModel2, _super); function TooltipModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = TooltipModel2.type; return _this; } TooltipModel2.type = "tooltip"; TooltipModel2.dependencies = ["axisPointer"]; TooltipModel2.defaultOption = { // zlevel: 0, z: 60, show: true, // tooltip main content showContent: true, // 'trigger' only works on coordinate system. // 'item' | 'axis' | 'none' trigger: "item", // 'click' | 'mousemove' | 'none' triggerOn: "mousemove|click", alwaysShowContent: false, displayMode: "single", renderMode: "auto", // whether restraint content inside viewRect. // If renderMode: 'richText', default true. // If renderMode: 'html', defaut false (for backward compat). confine: null, showDelay: 0, hideDelay: 100, // Animation transition time, unit is second transitionDuration: 0.4, enterable: false, backgroundColor: "#fff", // box shadow shadowBlur: 10, shadowColor: "rgba(0, 0, 0, .2)", shadowOffsetX: 1, shadowOffsetY: 2, // tooltip border radius, unit is px, default is 4 borderRadius: 4, // tooltip border width, unit is px, default is 0 (no border) borderWidth: 1, // Tooltip inside padding, default is 5 for all direction // Array is allowed to set up, right, bottom, left, same with css // The default value: See `tooltip/tooltipMarkup.ts#getPaddingFromTooltipModel`. padding: null, // Extra css text extraCssText: "", // axis indicator, trigger by axis axisPointer: { // default is line // legal values: 'line' | 'shadow' | 'cross' type: "line", // Valid when type is line, appoint tooltip line locate on which line. Optional // legal values: 'x' | 'y' | 'angle' | 'radius' | 'auto' // default is 'auto', chose the axis which type is category. // for multiply y axis, cartesian coord chose x axis, polar chose angle axis axis: "auto", animation: "auto", animationDurationUpdate: 200, animationEasingUpdate: "exponentialOut", crossStyle: { color: "#999", width: 1, type: "dashed", // TODO formatter textStyle: {} } // lineStyle and shadowStyle should not be specified here, // otherwise it will always override those styles on option.axisPointer. }, textStyle: { color: "#666", fontSize: 14 } }; return TooltipModel2; })(ComponentModel) ); function shouldTooltipConfine(tooltipModel) { var confineOption = tooltipModel.get("confine"); return confineOption != null ? !!confineOption : tooltipModel.get("renderMode") === "richText"; } function testStyle(styleProps) { if (!env.domSupported) { return; } var style = document.documentElement.style; for (var i = 0, len2 = styleProps.length; i < len2; i++) { if (styleProps[i] in style) { return styleProps[i]; } } } var TRANSFORM_VENDOR = testStyle(["transform", "webkitTransform", "OTransform", "MozTransform", "msTransform"]); var TRANSITION_VENDOR = testStyle(["webkitTransition", "transition", "OTransition", "MozTransition", "msTransition"]); function toCSSVendorPrefix(styleVendor, styleProp) { if (!styleVendor) { return styleProp; } styleProp = toCamelCase(styleProp, true); var idx = styleVendor.indexOf(styleProp); styleVendor = idx === -1 ? styleProp : "-" + styleVendor.slice(0, idx) + "-" + styleProp; return styleVendor.toLowerCase(); } function getComputedStyle(el, style) { var stl = el.currentStyle || document.defaultView && document.defaultView.getComputedStyle(el); return stl ? stl[style] : null; } var CSS_TRANSITION_VENDOR = toCSSVendorPrefix(TRANSITION_VENDOR, "transition"); var CSS_TRANSFORM_VENDOR = toCSSVendorPrefix(TRANSFORM_VENDOR, "transform"); var gCssText = "position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;" + (env.transform3dSupported ? "will-change:transform;" : ""); function mirrorPos(pos) { pos = pos === "left" ? "right" : pos === "right" ? "left" : pos === "top" ? "bottom" : "top"; return pos; } function assembleArrow(tooltipModel, borderColor, arrowPosition) { if (!isString(arrowPosition) || arrowPosition === "inside") { return ""; } var backgroundColor2 = tooltipModel.get("backgroundColor"); var borderWidth = tooltipModel.get("borderWidth"); borderColor = convertToColorString(borderColor); var arrowPos = mirrorPos(arrowPosition); var arrowSize = Math.max(Math.round(borderWidth) * 1.5, 6); var positionStyle = ""; var transformStyle = CSS_TRANSFORM_VENDOR + ":"; var rotateDeg; if (indexOf(["left", "right"], arrowPos) > -1) { positionStyle += "top:50%"; transformStyle += "translateY(-50%) rotate(" + (rotateDeg = arrowPos === "left" ? -225 : -45) + "deg)"; } else { positionStyle += "left:50%"; transformStyle += "translateX(-50%) rotate(" + (rotateDeg = arrowPos === "top" ? 225 : 45) + "deg)"; } var rotateRadian = rotateDeg * Math.PI / 180; var arrowWH = arrowSize + borderWidth; var rotatedWH = arrowWH * Math.abs(Math.cos(rotateRadian)) + arrowWH * Math.abs(Math.sin(rotateRadian)); var arrowOffset = Math.round(((rotatedWH - Math.SQRT2 * borderWidth) / 2 + Math.SQRT2 * borderWidth - (rotatedWH - arrowWH) / 2) * 100) / 100; positionStyle += ";" + arrowPos + ":-" + arrowOffset + "px"; var borderStyle = borderColor + " solid " + borderWidth + "px;"; var styleCss = ["position:absolute;width:" + arrowSize + "px;height:" + arrowSize + "px;z-index:-1;", positionStyle + ";" + transformStyle + ";", "border-bottom:" + borderStyle, "border-right:" + borderStyle, "background-color:" + backgroundColor2 + ";"]; return '
'; } function assembleTransition(duration, onlyFade) { var transitionCurve = "cubic-bezier(0.23,1,0.32,1)"; var transitionOption = " " + duration / 2 + "s " + transitionCurve; var transitionText = "opacity" + transitionOption + ",visibility" + transitionOption; if (!onlyFade) { transitionOption = " " + duration + "s " + transitionCurve; transitionText += env.transformSupported ? "," + CSS_TRANSFORM_VENDOR + transitionOption : ",left" + transitionOption + ",top" + transitionOption; } return CSS_TRANSITION_VENDOR + ":" + transitionText; } function assembleTransform(x, y, toString) { var x0 = x.toFixed(0) + "px"; var y0 = y.toFixed(0) + "px"; if (!env.transformSupported) { return toString ? "top:" + y0 + ";left:" + x0 + ";" : [["top", y0], ["left", x0]]; } var is3d = env.transform3dSupported; var translate2 = "translate" + (is3d ? "3d" : "") + "(" + x0 + "," + y0 + (is3d ? ",0" : "") + ")"; return toString ? "top:0;left:0;" + CSS_TRANSFORM_VENDOR + ":" + translate2 + ";" : [["top", 0], ["left", 0], [TRANSFORM_VENDOR, translate2]]; } function assembleFont(textStyleModel) { var cssText = []; var fontSize = textStyleModel.get("fontSize"); var color = textStyleModel.getTextColor(); color && cssText.push("color:" + color); cssText.push("font:" + textStyleModel.getFont()); var lineHeight = retrieve2(textStyleModel.get("lineHeight"), Math.round(fontSize * 3 / 2)); fontSize && cssText.push("line-height:" + lineHeight + "px"); var shadowColor = textStyleModel.get("textShadowColor"); var shadowBlur = textStyleModel.get("textShadowBlur") || 0; var shadowOffsetX = textStyleModel.get("textShadowOffsetX") || 0; var shadowOffsetY = textStyleModel.get("textShadowOffsetY") || 0; shadowColor && shadowBlur && cssText.push("text-shadow:" + shadowOffsetX + "px " + shadowOffsetY + "px " + shadowBlur + "px " + shadowColor); each$f(["decoration", "align"], function(name) { var val = textStyleModel.get(name); val && cssText.push("text-" + name + ":" + val); }); return cssText.join(";"); } function assembleCssText(tooltipModel, enableTransition, onlyFade) { var cssText = []; var transitionDuration = tooltipModel.get("transitionDuration"); var backgroundColor2 = tooltipModel.get("backgroundColor"); var shadowBlur = tooltipModel.get("shadowBlur"); var shadowColor = tooltipModel.get("shadowColor"); var shadowOffsetX = tooltipModel.get("shadowOffsetX"); var shadowOffsetY = tooltipModel.get("shadowOffsetY"); var textStyleModel = tooltipModel.getModel("textStyle"); var padding = getPaddingFromTooltipModel(tooltipModel, "html"); var boxShadow = shadowOffsetX + "px " + shadowOffsetY + "px " + shadowBlur + "px " + shadowColor; cssText.push("box-shadow:" + boxShadow); enableTransition && transitionDuration && cssText.push(assembleTransition(transitionDuration, onlyFade)); if (backgroundColor2) { cssText.push("background-color:" + backgroundColor2); } each$f(["width", "color", "radius"], function(name) { var borderName = "border-" + name; var camelCase = toCamelCase(borderName); var val = tooltipModel.get(camelCase); val != null && cssText.push(borderName + ":" + val + (name === "color" ? "" : "px")); }); cssText.push(assembleFont(textStyleModel)); if (padding != null) { cssText.push("padding:" + normalizeCssArray(padding).join("px ") + "px"); } return cssText.join(";") + ";"; } function makeStyleCoord$1(out, zr, container, zrX, zrY) { var zrPainter = zr && zr.painter; if (container) { var zrViewportRoot = zrPainter && zrPainter.getViewportRoot(); if (zrViewportRoot) { transformLocalCoord(out, zrViewportRoot, container, zrX, zrY); } } else { out[0] = zrX; out[1] = zrY; var viewportRootOffset = zrPainter && zrPainter.getViewportRootOffset(); if (viewportRootOffset) { out[0] += viewportRootOffset.offsetLeft; out[1] += viewportRootOffset.offsetTop; } } out[2] = out[0] / zr.getWidth(); out[3] = out[1] / zr.getHeight(); } var TooltipHTMLContent = ( /** @class */ (function() { function TooltipHTMLContent2(api, opt) { this._show = false; this._styleCoord = [0, 0, 0, 0]; this._enterable = true; this._alwaysShowContent = false; this._firstShow = true; this._longHide = true; if (env.wxa) { return null; } var el = document.createElement("div"); el.domBelongToZr = true; this.el = el; var zr = this._zr = api.getZr(); var appendTo = opt.appendTo; var container = appendTo && (isString(appendTo) ? document.querySelector(appendTo) : isDom(appendTo) ? appendTo : isFunction(appendTo) && appendTo(api.getDom())); makeStyleCoord$1(this._styleCoord, zr, container, api.getWidth() / 2, api.getHeight() / 2); (container || api.getDom()).appendChild(el); this._api = api; this._container = container; var self = this; el.onmouseenter = function() { if (self._enterable) { clearTimeout(self._hideTimeout); self._show = true; } self._inContent = true; }; el.onmousemove = function(e) { e = e || window.event; if (!self._enterable) { var handler = zr.handler; var zrViewportRoot = zr.painter.getViewportRoot(); normalizeEvent(zrViewportRoot, e, true); handler.dispatch("mousemove", e); } }; el.onmouseleave = function() { self._inContent = false; if (self._enterable) { if (self._show) { self.hideLater(self._hideDelay); } } }; } TooltipHTMLContent2.prototype.update = function(tooltipModel) { if (!this._container) { var container = this._api.getDom(); var position2 = getComputedStyle(container, "position"); var domStyle = container.style; if (domStyle.position !== "absolute" && position2 !== "absolute") { domStyle.position = "relative"; } } var alwaysShowContent = tooltipModel.get("alwaysShowContent"); alwaysShowContent && this._moveIfResized(); this._alwaysShowContent = alwaysShowContent; this.el.className = tooltipModel.get("className") || ""; }; TooltipHTMLContent2.prototype.show = function(tooltipModel, nearPointColor) { clearTimeout(this._hideTimeout); clearTimeout(this._longHideTimeout); var el = this.el; var style = el.style; var styleCoord = this._styleCoord; if (!el.innerHTML) { style.display = "none"; } else { style.cssText = gCssText + assembleCssText(tooltipModel, !this._firstShow, this._longHide) + assembleTransform(styleCoord[0], styleCoord[1], true) + ("border-color:" + convertToColorString(nearPointColor) + ";") + (tooltipModel.get("extraCssText") || "") + (";pointer-events:" + (this._enterable ? "auto" : "none")); } this._show = true; this._firstShow = false; this._longHide = false; }; TooltipHTMLContent2.prototype.setContent = function(content, markers, tooltipModel, borderColor, arrowPosition) { var el = this.el; if (content == null) { el.innerHTML = ""; return; } var arrow = ""; if (isString(arrowPosition) && tooltipModel.get("trigger") === "item" && !shouldTooltipConfine(tooltipModel)) { arrow = assembleArrow(tooltipModel, borderColor, arrowPosition); } if (isString(content)) { el.innerHTML = content + arrow; } else if (content) { el.innerHTML = ""; if (!isArray$1(content)) { content = [content]; } for (var i = 0; i < content.length; i++) { if (isDom(content[i]) && content[i].parentNode !== el) { el.appendChild(content[i]); } } if (arrow && el.childNodes.length) { var arrowEl = document.createElement("div"); arrowEl.innerHTML = arrow; el.appendChild(arrowEl); } } }; TooltipHTMLContent2.prototype.setEnterable = function(enterable) { this._enterable = enterable; }; TooltipHTMLContent2.prototype.getSize = function() { var el = this.el; return el ? [el.offsetWidth, el.offsetHeight] : [0, 0]; }; TooltipHTMLContent2.prototype.moveTo = function(zrX, zrY) { if (!this.el) { return; } var styleCoord = this._styleCoord; makeStyleCoord$1(styleCoord, this._zr, this._container, zrX, zrY); if (styleCoord[0] != null && styleCoord[1] != null) { var style_1 = this.el.style; var transforms = assembleTransform(styleCoord[0], styleCoord[1]); each$f(transforms, function(transform2) { style_1[transform2[0]] = transform2[1]; }); } }; TooltipHTMLContent2.prototype._moveIfResized = function() { var ratioX = this._styleCoord[2]; var ratioY = this._styleCoord[3]; this.moveTo(ratioX * this._zr.getWidth(), ratioY * this._zr.getHeight()); }; TooltipHTMLContent2.prototype.hide = function() { var _this = this; var style = this.el.style; style.visibility = "hidden"; style.opacity = "0"; env.transform3dSupported && (style.willChange = ""); this._show = false; this._longHideTimeout = setTimeout(function() { return _this._longHide = true; }, 500); }; TooltipHTMLContent2.prototype.hideLater = function(time) { if (this._show && !(this._inContent && this._enterable) && !this._alwaysShowContent) { if (time) { this._hideDelay = time; this._show = false; this._hideTimeout = setTimeout(bind$1(this.hide, this), time); } else { this.hide(); } } }; TooltipHTMLContent2.prototype.isShow = function() { return this._show; }; TooltipHTMLContent2.prototype.dispose = function() { clearTimeout(this._hideTimeout); clearTimeout(this._longHideTimeout); var parentNode = this.el.parentNode; parentNode && parentNode.removeChild(this.el); this.el = this._container = null; }; return TooltipHTMLContent2; })() ); var TooltipRichContent = ( /** @class */ (function() { function TooltipRichContent2(api) { this._show = false; this._styleCoord = [0, 0, 0, 0]; this._alwaysShowContent = false; this._enterable = true; this._zr = api.getZr(); makeStyleCoord(this._styleCoord, this._zr, api.getWidth() / 2, api.getHeight() / 2); } TooltipRichContent2.prototype.update = function(tooltipModel) { var alwaysShowContent = tooltipModel.get("alwaysShowContent"); alwaysShowContent && this._moveIfResized(); this._alwaysShowContent = alwaysShowContent; }; TooltipRichContent2.prototype.show = function() { if (this._hideTimeout) { clearTimeout(this._hideTimeout); } this.el.show(); this._show = true; }; TooltipRichContent2.prototype.setContent = function(content, markupStyleCreator, tooltipModel, borderColor, arrowPosition) { var _this = this; if (isObject$3(content)) { throwError(""); } if (this.el) { this._zr.remove(this.el); } var textStyleModel = tooltipModel.getModel("textStyle"); this.el = new ZRText({ style: { rich: markupStyleCreator.richTextStyles, text: content, lineHeight: 22, borderWidth: 1, borderColor, textShadowColor: textStyleModel.get("textShadowColor"), fill: tooltipModel.get(["textStyle", "color"]), padding: getPaddingFromTooltipModel(tooltipModel, "richText"), verticalAlign: "top", align: "left" }, z: tooltipModel.get("z") }); each$f(["backgroundColor", "borderRadius", "shadowColor", "shadowBlur", "shadowOffsetX", "shadowOffsetY"], function(propName) { _this.el.style[propName] = tooltipModel.get(propName); }); each$f(["textShadowBlur", "textShadowOffsetX", "textShadowOffsetY"], function(propName) { _this.el.style[propName] = textStyleModel.get(propName) || 0; }); this._zr.add(this.el); var self = this; this.el.on("mouseover", function() { if (self._enterable) { clearTimeout(self._hideTimeout); self._show = true; } self._inContent = true; }); this.el.on("mouseout", function() { if (self._enterable) { if (self._show) { self.hideLater(self._hideDelay); } } self._inContent = false; }); }; TooltipRichContent2.prototype.setEnterable = function(enterable) { this._enterable = enterable; }; TooltipRichContent2.prototype.getSize = function() { var el = this.el; var bounding = this.el.getBoundingRect(); var shadowOuterSize = calcShadowOuterSize(el.style); return [bounding.width + shadowOuterSize.left + shadowOuterSize.right, bounding.height + shadowOuterSize.top + shadowOuterSize.bottom]; }; TooltipRichContent2.prototype.moveTo = function(x, y) { var el = this.el; if (el) { var styleCoord = this._styleCoord; makeStyleCoord(styleCoord, this._zr, x, y); x = styleCoord[0]; y = styleCoord[1]; var style = el.style; var borderWidth = mathMaxWith0(style.borderWidth || 0); var shadowOuterSize = calcShadowOuterSize(style); el.x = x + borderWidth + shadowOuterSize.left; el.y = y + borderWidth + shadowOuterSize.top; el.markRedraw(); } }; TooltipRichContent2.prototype._moveIfResized = function() { var ratioX = this._styleCoord[2]; var ratioY = this._styleCoord[3]; this.moveTo(ratioX * this._zr.getWidth(), ratioY * this._zr.getHeight()); }; TooltipRichContent2.prototype.hide = function() { if (this.el) { this.el.hide(); } this._show = false; }; TooltipRichContent2.prototype.hideLater = function(time) { if (this._show && !(this._inContent && this._enterable) && !this._alwaysShowContent) { if (time) { this._hideDelay = time; this._show = false; this._hideTimeout = setTimeout(bind$1(this.hide, this), time); } else { this.hide(); } } }; TooltipRichContent2.prototype.isShow = function() { return this._show; }; TooltipRichContent2.prototype.dispose = function() { this._zr.remove(this.el); }; return TooltipRichContent2; })() ); function mathMaxWith0(val) { return Math.max(0, val); } function calcShadowOuterSize(style) { var shadowBlur = mathMaxWith0(style.shadowBlur || 0); var shadowOffsetX = mathMaxWith0(style.shadowOffsetX || 0); var shadowOffsetY = mathMaxWith0(style.shadowOffsetY || 0); return { left: mathMaxWith0(shadowBlur - shadowOffsetX), right: mathMaxWith0(shadowBlur + shadowOffsetX), top: mathMaxWith0(shadowBlur - shadowOffsetY), bottom: mathMaxWith0(shadowBlur + shadowOffsetY) }; } function makeStyleCoord(out, zr, zrX, zrY) { out[0] = zrX; out[1] = zrY; out[2] = out[0] / zr.getWidth(); out[3] = out[1] / zr.getHeight(); } var proxyRect = new Rect$2({ shape: { x: -1, y: -1, width: 2, height: 2 } }); var TooltipView = ( /** @class */ (function(_super) { __extends(TooltipView2, _super); function TooltipView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = TooltipView2.type; return _this; } TooltipView2.prototype.init = function(ecModel, api) { if (env.node || !api.getDom()) { return; } var tooltipModel = ecModel.getComponent("tooltip"); var renderMode = this._renderMode = getTooltipRenderMode(tooltipModel.get("renderMode")); this._tooltipContent = renderMode === "richText" ? new TooltipRichContent(api) : new TooltipHTMLContent(api, { appendTo: tooltipModel.get("appendToBody", true) ? "body" : tooltipModel.get("appendTo", true) }); }; TooltipView2.prototype.render = function(tooltipModel, ecModel, api) { if (env.node || !api.getDom()) { return; } this.group.removeAll(); this._tooltipModel = tooltipModel; this._ecModel = ecModel; this._api = api; var tooltipContent = this._tooltipContent; tooltipContent.update(tooltipModel); tooltipContent.setEnterable(tooltipModel.get("enterable")); this._initGlobalListener(); this._keepShow(); if (this._renderMode !== "richText" && tooltipModel.get("transitionDuration")) { createOrUpdate(this, "_updatePosition", 50, "fixRate"); } else { clear$1(this, "_updatePosition"); } }; TooltipView2.prototype._initGlobalListener = function() { var tooltipModel = this._tooltipModel; var triggerOn = tooltipModel.get("triggerOn"); register("itemTooltip", this._api, bind$1(function(currTrigger, e, dispatchAction2) { if (triggerOn !== "none") { if (triggerOn.indexOf(currTrigger) >= 0) { this._tryShow(e, dispatchAction2); } else if (currTrigger === "leave") { this._hide(dispatchAction2); } } }, this)); }; TooltipView2.prototype._keepShow = function() { var tooltipModel = this._tooltipModel; var ecModel = this._ecModel; var api = this._api; var triggerOn = tooltipModel.get("triggerOn"); if (this._lastX != null && this._lastY != null && triggerOn !== "none" && triggerOn !== "click") { var self_1 = this; clearTimeout(this._refreshUpdateTimeout); this._refreshUpdateTimeout = setTimeout(function() { !api.isDisposed() && self_1.manuallyShowTip(tooltipModel, ecModel, api, { x: self_1._lastX, y: self_1._lastY, dataByCoordSys: self_1._lastDataByCoordSys }); }); } }; TooltipView2.prototype.manuallyShowTip = function(tooltipModel, ecModel, api, payload) { if (payload.from === this.uid || env.node || !api.getDom()) { return; } var dispatchAction2 = makeDispatchAction(payload, api); this._ticket = ""; var dataByCoordSys = payload.dataByCoordSys; var cmptRef = findComponentReference(payload, ecModel, api); if (cmptRef) { var rect = cmptRef.el.getBoundingRect().clone(); rect.applyTransform(cmptRef.el.transform); this._tryShow({ offsetX: rect.x + rect.width / 2, offsetY: rect.y + rect.height / 2, target: cmptRef.el, position: payload.position, // When manully trigger, the mouse is not on the el, so we'd better to // position tooltip on the bottom of the el and display arrow is possible. positionDefault: "bottom" }, dispatchAction2); } else if (payload.tooltip && payload.x != null && payload.y != null) { var el = proxyRect; el.x = payload.x; el.y = payload.y; el.update(); getECData(el).tooltipConfig = { name: null, option: payload.tooltip }; this._tryShow({ offsetX: payload.x, offsetY: payload.y, target: el }, dispatchAction2); } else if (dataByCoordSys) { this._tryShow({ offsetX: payload.x, offsetY: payload.y, position: payload.position, dataByCoordSys, tooltipOption: payload.tooltipOption }, dispatchAction2); } else if (payload.seriesIndex != null) { if (this._manuallyAxisShowTip(tooltipModel, ecModel, api, payload)) { return; } var pointInfo = findPointFromSeries(payload, ecModel); var cx = pointInfo.point[0]; var cy = pointInfo.point[1]; if (cx != null && cy != null) { this._tryShow({ offsetX: cx, offsetY: cy, target: pointInfo.el, position: payload.position, // When manully trigger, the mouse is not on the el, so we'd better to // position tooltip on the bottom of the el and display arrow is possible. positionDefault: "bottom" }, dispatchAction2); } } else if (payload.x != null && payload.y != null) { api.dispatchAction({ type: "updateAxisPointer", x: payload.x, y: payload.y }); this._tryShow({ offsetX: payload.x, offsetY: payload.y, position: payload.position, target: api.getZr().findHover(payload.x, payload.y).target }, dispatchAction2); } }; TooltipView2.prototype.manuallyHideTip = function(tooltipModel, ecModel, api, payload) { var tooltipContent = this._tooltipContent; if (this._tooltipModel) { tooltipContent.hideLater(this._tooltipModel.get("hideDelay")); } this._lastX = this._lastY = this._lastDataByCoordSys = null; if (payload.from !== this.uid) { this._hide(makeDispatchAction(payload, api)); } }; TooltipView2.prototype._manuallyAxisShowTip = function(tooltipModel, ecModel, api, payload) { var seriesIndex = payload.seriesIndex; var dataIndex = payload.dataIndex; var coordSysAxesInfo = ecModel.getComponent("axisPointer").coordSysAxesInfo; if (seriesIndex == null || dataIndex == null || coordSysAxesInfo == null) { return; } var seriesModel = ecModel.getSeriesByIndex(seriesIndex); if (!seriesModel) { return; } var data = seriesModel.getData(); var tooltipCascadedModel = buildTooltipModel([data.getItemModel(dataIndex), seriesModel, (seriesModel.coordinateSystem || {}).model], this._tooltipModel); if (tooltipCascadedModel.get("trigger") !== "axis") { return; } api.dispatchAction({ type: "updateAxisPointer", seriesIndex, dataIndex, position: payload.position }); return true; }; TooltipView2.prototype._tryShow = function(e, dispatchAction2) { var el = e.target; var tooltipModel = this._tooltipModel; if (!tooltipModel) { return; } this._lastX = e.offsetX; this._lastY = e.offsetY; var dataByCoordSys = e.dataByCoordSys; if (dataByCoordSys && dataByCoordSys.length) { this._showAxisTooltip(dataByCoordSys, e); } else if (el) { var ecData = getECData(el); if (ecData.ssrType === "legend") { return; } this._lastDataByCoordSys = null; var seriesDispatcher_1; var cmptDispatcher_1; findEventDispatcher(el, function(target) { if (getECData(target).dataIndex != null) { seriesDispatcher_1 = target; return true; } if (getECData(target).tooltipConfig != null) { cmptDispatcher_1 = target; return true; } }, true); if (seriesDispatcher_1) { this._showSeriesItemTooltip(e, seriesDispatcher_1, dispatchAction2); } else if (cmptDispatcher_1) { this._showComponentItemTooltip(e, cmptDispatcher_1, dispatchAction2); } else { this._hide(dispatchAction2); } } else { this._lastDataByCoordSys = null; this._hide(dispatchAction2); } }; TooltipView2.prototype._showOrMove = function(tooltipModel, cb) { var delay = tooltipModel.get("showDelay"); cb = bind$1(cb, this); clearTimeout(this._showTimout); delay > 0 ? this._showTimout = setTimeout(cb, delay) : cb(); }; TooltipView2.prototype._showAxisTooltip = function(dataByCoordSys, e) { var ecModel = this._ecModel; var globalTooltipModel = this._tooltipModel; var point = [e.offsetX, e.offsetY]; var singleTooltipModel = buildTooltipModel([e.tooltipOption], globalTooltipModel); var renderMode = this._renderMode; var cbParamsList = []; var articleMarkup = createTooltipMarkup("section", { blocks: [], noHeader: true }); var markupTextArrLegacy = []; var markupStyleCreator = new TooltipMarkupStyleCreator(); each$f(dataByCoordSys, function(itemCoordSys) { each$f(itemCoordSys.dataByAxis, function(axisItem) { var axisModel = ecModel.getComponent(axisItem.axisDim + "Axis", axisItem.axisIndex); var axisValue = axisItem.value; if (!axisModel || axisValue == null) { return; } var axisValueLabel = getValueLabel(axisValue, axisModel.axis, ecModel, axisItem.seriesDataIndices, axisItem.valueLabelOpt); var axisSectionMarkup = createTooltipMarkup("section", { header: axisValueLabel, noHeader: !trim$1(axisValueLabel), sortBlocks: true, blocks: [] }); articleMarkup.blocks.push(axisSectionMarkup); each$f(axisItem.seriesDataIndices, function(idxItem) { var series = ecModel.getSeriesByIndex(idxItem.seriesIndex); var dataIndex = idxItem.dataIndexInside; var cbParams = series.getDataParams(dataIndex); if (cbParams.dataIndex < 0) { return; } cbParams.axisDim = axisItem.axisDim; cbParams.axisIndex = axisItem.axisIndex; cbParams.axisType = axisItem.axisType; cbParams.axisId = axisItem.axisId; cbParams.axisValue = getAxisRawValue(axisModel.axis, { value: axisValue }); cbParams.axisValueLabel = axisValueLabel; cbParams.marker = markupStyleCreator.makeTooltipMarker("item", convertToColorString(cbParams.color), renderMode); var seriesTooltipResult = normalizeTooltipFormatResult(series.formatTooltip(dataIndex, true, null)); var frag = seriesTooltipResult.frag; if (frag) { var valueFormatter = buildTooltipModel([series], globalTooltipModel).get("valueFormatter"); axisSectionMarkup.blocks.push(valueFormatter ? extend({ valueFormatter }, frag) : frag); } if (seriesTooltipResult.text) { markupTextArrLegacy.push(seriesTooltipResult.text); } cbParamsList.push(cbParams); }); }); }); articleMarkup.blocks.reverse(); markupTextArrLegacy.reverse(); var positionExpr = e.position; var orderMode = singleTooltipModel.get("order"); var builtMarkupText = buildTooltipMarkup(articleMarkup, markupStyleCreator, renderMode, orderMode, ecModel.get("useUTC"), singleTooltipModel.get("textStyle")); builtMarkupText && markupTextArrLegacy.unshift(builtMarkupText); var blockBreak = renderMode === "richText" ? "\n\n" : "
"; var allMarkupText = markupTextArrLegacy.join(blockBreak); this._showOrMove(singleTooltipModel, function() { if (this._updateContentNotChangedOnAxis(dataByCoordSys, cbParamsList)) { this._updatePosition(singleTooltipModel, positionExpr, point[0], point[1], this._tooltipContent, cbParamsList); } else { this._showTooltipContent(singleTooltipModel, allMarkupText, cbParamsList, Math.random() + "", point[0], point[1], positionExpr, null, markupStyleCreator); } }); }; TooltipView2.prototype._showSeriesItemTooltip = function(e, dispatcher, dispatchAction2) { var ecModel = this._ecModel; var ecData = getECData(dispatcher); var seriesIndex = ecData.seriesIndex; var seriesModel = ecModel.getSeriesByIndex(seriesIndex); var dataModel = ecData.dataModel || seriesModel; var dataIndex = ecData.dataIndex; var dataType = ecData.dataType; var data = dataModel.getData(dataType); var renderMode = this._renderMode; var positionDefault = e.positionDefault; var tooltipModel = buildTooltipModel([data.getItemModel(dataIndex), dataModel, seriesModel && (seriesModel.coordinateSystem || {}).model], this._tooltipModel, positionDefault ? { position: positionDefault } : null); var tooltipTrigger = tooltipModel.get("trigger"); if (tooltipTrigger != null && tooltipTrigger !== "item") { return; } var params = dataModel.getDataParams(dataIndex, dataType); var markupStyleCreator = new TooltipMarkupStyleCreator(); params.marker = markupStyleCreator.makeTooltipMarker("item", convertToColorString(params.color), renderMode); var seriesTooltipResult = normalizeTooltipFormatResult(dataModel.formatTooltip(dataIndex, false, dataType)); var orderMode = tooltipModel.get("order"); var valueFormatter = tooltipModel.get("valueFormatter"); var frag = seriesTooltipResult.frag; var markupText = frag ? buildTooltipMarkup(valueFormatter ? extend({ valueFormatter }, frag) : frag, markupStyleCreator, renderMode, orderMode, ecModel.get("useUTC"), tooltipModel.get("textStyle")) : seriesTooltipResult.text; var asyncTicket = "item_" + dataModel.name + "_" + dataIndex; this._showOrMove(tooltipModel, function() { this._showTooltipContent(tooltipModel, markupText, params, asyncTicket, e.offsetX, e.offsetY, e.position, e.target, markupStyleCreator); }); dispatchAction2({ type: "showTip", dataIndexInside: dataIndex, dataIndex: data.getRawIndex(dataIndex), seriesIndex, from: this.uid }); }; TooltipView2.prototype._showComponentItemTooltip = function(e, el, dispatchAction2) { var isHTMLRenderMode = this._renderMode === "html"; var ecData = getECData(el); var tooltipConfig = ecData.tooltipConfig; var tooltipOpt = tooltipConfig.option || {}; var encodeHTMLContent = tooltipOpt.encodeHTMLContent; if (isString(tooltipOpt)) { var content = tooltipOpt; tooltipOpt = { content, // Fixed formatter formatter: content }; encodeHTMLContent = true; } if (encodeHTMLContent && isHTMLRenderMode && tooltipOpt.content) { tooltipOpt = clone$1(tooltipOpt); tooltipOpt.content = encodeHTML(tooltipOpt.content); } var tooltipModelCascade = [tooltipOpt]; var cmpt = this._ecModel.getComponent(ecData.componentMainType, ecData.componentIndex); if (cmpt) { tooltipModelCascade.push(cmpt); } tooltipModelCascade.push({ formatter: tooltipOpt.content }); var positionDefault = e.positionDefault; var subTooltipModel = buildTooltipModel(tooltipModelCascade, this._tooltipModel, positionDefault ? { position: positionDefault } : null); var defaultHtml = subTooltipModel.get("content"); var asyncTicket = Math.random() + ""; var markupStyleCreator = new TooltipMarkupStyleCreator(); this._showOrMove(subTooltipModel, function() { var formatterParams = clone$1(subTooltipModel.get("formatterParams") || {}); this._showTooltipContent(subTooltipModel, defaultHtml, formatterParams, asyncTicket, e.offsetX, e.offsetY, e.position, el, markupStyleCreator); }); dispatchAction2({ type: "showTip", from: this.uid }); }; TooltipView2.prototype._showTooltipContent = function(tooltipModel, defaultHtml, params, asyncTicket, x, y, positionExpr, el, markupStyleCreator) { this._ticket = ""; if (!tooltipModel.get("showContent") || !tooltipModel.get("show")) { return; } var tooltipContent = this._tooltipContent; tooltipContent.setEnterable(tooltipModel.get("enterable")); var formatter = tooltipModel.get("formatter"); positionExpr = positionExpr || tooltipModel.get("position"); var html = defaultHtml; var nearPoint = this._getNearestPoint([x, y], params, tooltipModel.get("trigger"), tooltipModel.get("borderColor")); var nearPointColor = nearPoint.color; if (formatter) { if (isString(formatter)) { var useUTC = tooltipModel.ecModel.get("useUTC"); var params0 = isArray$1(params) ? params[0] : params; var isTimeAxis = params0 && params0.axisType && params0.axisType.indexOf("time") >= 0; html = formatter; if (isTimeAxis) { html = format(params0.axisValue, html, useUTC); } html = formatTpl(html, params, true); } else if (isFunction(formatter)) { var callback = bind$1(function(cbTicket, html2) { if (cbTicket === this._ticket) { tooltipContent.setContent(html2, markupStyleCreator, tooltipModel, nearPointColor, positionExpr); this._updatePosition(tooltipModel, positionExpr, x, y, tooltipContent, params, el); } }, this); this._ticket = asyncTicket; html = formatter(params, asyncTicket, callback); } else { html = formatter; } } tooltipContent.setContent(html, markupStyleCreator, tooltipModel, nearPointColor, positionExpr); tooltipContent.show(tooltipModel, nearPointColor); this._updatePosition(tooltipModel, positionExpr, x, y, tooltipContent, params, el); }; TooltipView2.prototype._getNearestPoint = function(point, tooltipDataParams, trigger2, borderColor) { if (trigger2 === "axis" || isArray$1(tooltipDataParams)) { return { color: borderColor || (this._renderMode === "html" ? "#fff" : "none") }; } if (!isArray$1(tooltipDataParams)) { return { color: borderColor || tooltipDataParams.color || tooltipDataParams.borderColor }; } }; TooltipView2.prototype._updatePosition = function(tooltipModel, positionExpr, x, y, content, params, el) { var viewWidth = this._api.getWidth(); var viewHeight = this._api.getHeight(); positionExpr = positionExpr || tooltipModel.get("position"); var contentSize = content.getSize(); var align = tooltipModel.get("align"); var vAlign = tooltipModel.get("verticalAlign"); var rect = el && el.getBoundingRect().clone(); el && rect.applyTransform(el.transform); if (isFunction(positionExpr)) { positionExpr = positionExpr([x, y], params, content.el, rect, { viewSize: [viewWidth, viewHeight], contentSize: contentSize.slice() }); } if (isArray$1(positionExpr)) { x = parsePercent(positionExpr[0], viewWidth); y = parsePercent(positionExpr[1], viewHeight); } else if (isObject$3(positionExpr)) { var boxLayoutPosition = positionExpr; boxLayoutPosition.width = contentSize[0]; boxLayoutPosition.height = contentSize[1]; var layoutRect = getLayoutRect(boxLayoutPosition, { width: viewWidth, height: viewHeight }); x = layoutRect.x; y = layoutRect.y; align = null; vAlign = null; } else if (isString(positionExpr) && el) { var pos = calcTooltipPosition(positionExpr, rect, contentSize, tooltipModel.get("borderWidth")); x = pos[0]; y = pos[1]; } else { var pos = refixTooltipPosition(x, y, content, viewWidth, viewHeight, align ? null : 20, vAlign ? null : 20); x = pos[0]; y = pos[1]; } align && (x -= isCenterAlign(align) ? contentSize[0] / 2 : align === "right" ? contentSize[0] : 0); vAlign && (y -= isCenterAlign(vAlign) ? contentSize[1] / 2 : vAlign === "bottom" ? contentSize[1] : 0); if (shouldTooltipConfine(tooltipModel)) { var pos = confineTooltipPosition(x, y, content, viewWidth, viewHeight); x = pos[0]; y = pos[1]; } content.moveTo(x, y); }; TooltipView2.prototype._updateContentNotChangedOnAxis = function(dataByCoordSys, cbParamsList) { var lastCoordSys = this._lastDataByCoordSys; var lastCbParamsList = this._cbParamsList; var contentNotChanged = !!lastCoordSys && lastCoordSys.length === dataByCoordSys.length; contentNotChanged && each$f(lastCoordSys, function(lastItemCoordSys, indexCoordSys) { var lastDataByAxis = lastItemCoordSys.dataByAxis || []; var thisItemCoordSys = dataByCoordSys[indexCoordSys] || {}; var thisDataByAxis = thisItemCoordSys.dataByAxis || []; contentNotChanged = contentNotChanged && lastDataByAxis.length === thisDataByAxis.length; contentNotChanged && each$f(lastDataByAxis, function(lastItem, indexAxis) { var thisItem = thisDataByAxis[indexAxis] || {}; var lastIndices = lastItem.seriesDataIndices || []; var newIndices = thisItem.seriesDataIndices || []; contentNotChanged = contentNotChanged && lastItem.value === thisItem.value && lastItem.axisType === thisItem.axisType && lastItem.axisId === thisItem.axisId && lastIndices.length === newIndices.length; contentNotChanged && each$f(lastIndices, function(lastIdxItem, j) { var newIdxItem = newIndices[j]; contentNotChanged = contentNotChanged && lastIdxItem.seriesIndex === newIdxItem.seriesIndex && lastIdxItem.dataIndex === newIdxItem.dataIndex; }); lastCbParamsList && each$f(lastItem.seriesDataIndices, function(idxItem) { var seriesIdx = idxItem.seriesIndex; var cbParams = cbParamsList[seriesIdx]; var lastCbParams = lastCbParamsList[seriesIdx]; if (cbParams && lastCbParams && lastCbParams.data !== cbParams.data) { contentNotChanged = false; } }); }); }); this._lastDataByCoordSys = dataByCoordSys; this._cbParamsList = cbParamsList; return !!contentNotChanged; }; TooltipView2.prototype._hide = function(dispatchAction2) { this._lastDataByCoordSys = null; dispatchAction2({ type: "hideTip", from: this.uid }); }; TooltipView2.prototype.dispose = function(ecModel, api) { if (env.node || !api.getDom()) { return; } clear$1(this, "_updatePosition"); this._tooltipContent.dispose(); unregister("itemTooltip", api); }; TooltipView2.type = "tooltip"; return TooltipView2; })(ComponentView) ); function buildTooltipModel(modelCascade, globalTooltipModel, defaultTooltipOption) { var ecModel = globalTooltipModel.ecModel; var resultModel; if (defaultTooltipOption) { resultModel = new Model(defaultTooltipOption, ecModel, ecModel); resultModel = new Model(globalTooltipModel.option, resultModel, ecModel); } else { resultModel = globalTooltipModel; } for (var i = modelCascade.length - 1; i >= 0; i--) { var tooltipOpt = modelCascade[i]; if (tooltipOpt) { if (tooltipOpt instanceof Model) { tooltipOpt = tooltipOpt.get("tooltip", true); } if (isString(tooltipOpt)) { tooltipOpt = { formatter: tooltipOpt }; } if (tooltipOpt) { resultModel = new Model(tooltipOpt, resultModel, ecModel); } } } return resultModel; } function makeDispatchAction(payload, api) { return payload.dispatchAction || bind$1(api.dispatchAction, api); } function refixTooltipPosition(x, y, content, viewWidth, viewHeight, gapH, gapV) { var size = content.getSize(); var width = size[0]; var height = size[1]; if (gapH != null) { if (x + width + gapH + 2 > viewWidth) { x -= width + gapH; } else { x += gapH; } } if (gapV != null) { if (y + height + gapV > viewHeight) { y -= height + gapV; } else { y += gapV; } } return [x, y]; } function confineTooltipPosition(x, y, content, viewWidth, viewHeight) { var size = content.getSize(); var width = size[0]; var height = size[1]; x = Math.min(x + width, viewWidth) - width; y = Math.min(y + height, viewHeight) - height; x = Math.max(x, 0); y = Math.max(y, 0); return [x, y]; } function calcTooltipPosition(position2, rect, contentSize, borderWidth) { var domWidth = contentSize[0]; var domHeight = contentSize[1]; var offset = Math.ceil(Math.SQRT2 * borderWidth) + 8; var x = 0; var y = 0; var rectWidth = rect.width; var rectHeight = rect.height; switch (position2) { case "inside": x = rect.x + rectWidth / 2 - domWidth / 2; y = rect.y + rectHeight / 2 - domHeight / 2; break; case "top": x = rect.x + rectWidth / 2 - domWidth / 2; y = rect.y - domHeight - offset; break; case "bottom": x = rect.x + rectWidth / 2 - domWidth / 2; y = rect.y + rectHeight + offset; break; case "left": x = rect.x - domWidth - offset; y = rect.y + rectHeight / 2 - domHeight / 2; break; case "right": x = rect.x + rectWidth + offset; y = rect.y + rectHeight / 2 - domHeight / 2; } return [x, y]; } function isCenterAlign(align) { return align === "center" || align === "middle"; } function findComponentReference(payload, ecModel, api) { var queryOptionMap = preParseFinder(payload).queryOptionMap; var componentMainType = queryOptionMap.keys()[0]; if (!componentMainType || componentMainType === "series") { return; } var queryResult = queryReferringComponents(ecModel, componentMainType, queryOptionMap.get(componentMainType), { useDefault: false, enableAll: false, enableNone: false }); var model = queryResult.models[0]; if (!model) { return; } var view = api.getViewOfComponentModel(model); var el; view.group.traverse(function(subEl) { var tooltipConfig = getECData(subEl).tooltipConfig; if (tooltipConfig && tooltipConfig.name === payload.name) { el = subEl; return true; } }); if (el) { return { componentMainType, componentIndex: model.componentIndex, el }; } } function install$k(registers) { use(install$s); registers.registerComponentModel(TooltipModel); registers.registerComponentView(TooltipView); registers.registerAction({ type: "showTip", event: "showTip", update: "tooltip:manuallyShowTip" }, noop); registers.registerAction({ type: "hideTip", event: "hideTip", update: "tooltip:manuallyHideTip" }, noop); } var DEFAULT_TOOLBOX_BTNS = ["rect", "polygon", "keep", "clear"]; function brushPreprocessor(option, isNew) { var brushComponents = normalizeToArray(option ? option.brush : []); if (!brushComponents.length) { return; } var brushComponentSpecifiedBtns = []; each$f(brushComponents, function(brushOpt) { var tbs = brushOpt.hasOwnProperty("toolbox") ? brushOpt.toolbox : []; if (tbs instanceof Array) { brushComponentSpecifiedBtns = brushComponentSpecifiedBtns.concat(tbs); } }); var toolbox = option && option.toolbox; if (isArray$1(toolbox)) { toolbox = toolbox[0]; } if (!toolbox) { toolbox = { feature: {} }; option.toolbox = [toolbox]; } var toolboxFeature = toolbox.feature || (toolbox.feature = {}); var toolboxBrush = toolboxFeature.brush || (toolboxFeature.brush = {}); var brushTypes = toolboxBrush.type || (toolboxBrush.type = []); brushTypes.push.apply(brushTypes, brushComponentSpecifiedBtns); removeDuplicate(brushTypes); if (isNew && !brushTypes.length) { brushTypes.push.apply(brushTypes, DEFAULT_TOOLBOX_BTNS); } } function removeDuplicate(arr) { var map2 = {}; each$f(arr, function(val) { map2[val] = 1; }); arr.length = 0; each$f(map2, function(flag, val) { arr.push(val); }); } var each$4 = each$f; function hasKeys(obj) { if (obj) { for (var name_1 in obj) { if (obj.hasOwnProperty(name_1)) { return true; } } } } function createVisualMappings(option, stateList, supplementVisualOption) { var visualMappings = {}; each$4(stateList, function(state) { var mappings = visualMappings[state] = createMappings(); each$4(option[state], function(visualData, visualType) { if (!VisualMapping.isValidType(visualType)) { return; } var mappingOption = { type: visualType, visual: visualData }; supplementVisualOption && supplementVisualOption(mappingOption, state); mappings[visualType] = new VisualMapping(mappingOption); if (visualType === "opacity") { mappingOption = clone$1(mappingOption); mappingOption.type = "colorAlpha"; mappings.__hidden.__alphaForOpacity = new VisualMapping(mappingOption); } }); }); return visualMappings; function createMappings() { var Creater = function() { }; Creater.prototype.__hidden = Creater.prototype; var obj = new Creater(); return obj; } } function replaceVisualOption(thisOption, newOption, keys2) { var has2; each$f(keys2, function(key) { if (newOption.hasOwnProperty(key) && hasKeys(newOption[key])) { has2 = true; } }); has2 && each$f(keys2, function(key) { if (newOption.hasOwnProperty(key) && hasKeys(newOption[key])) { thisOption[key] = clone$1(newOption[key]); } else { delete thisOption[key]; } }); } function applyVisual(stateList, visualMappings, data, getValueState, scope, dimension) { var visualTypesMap = {}; each$f(stateList, function(state) { var visualTypes = VisualMapping.prepareVisualTypes(visualMappings[state]); visualTypesMap[state] = visualTypes; }); var dataIndex; function getVisual(key) { return getItemVisualFromData(data, dataIndex, key); } function setVisual(key, value) { setItemVisualFromData(data, dataIndex, key, value); } { data.each(eachItem); } function eachItem(valueOrIndex, index) { dataIndex = valueOrIndex; var rawDataItem = data.getRawDataItem(dataIndex); if (rawDataItem && rawDataItem.visualMap === false) { return; } var valueState = getValueState.call(scope, valueOrIndex); var mappings = visualMappings[valueState]; var visualTypes = visualTypesMap[valueState]; for (var i = 0, len2 = visualTypes.length; i < len2; i++) { var type = visualTypes[i]; mappings[type] && mappings[type].applyVisual(valueOrIndex, getVisual, setVisual); } } } function incrementalApplyVisual(stateList, visualMappings, getValueState, dim) { var visualTypesMap = {}; each$f(stateList, function(state) { var visualTypes = VisualMapping.prepareVisualTypes(visualMappings[state]); visualTypesMap[state] = visualTypes; }); return { progress: function progress(params, data) { var dimIndex; if (dim != null) { dimIndex = data.getDimensionIndex(dim); } function getVisual(key) { return getItemVisualFromData(data, dataIndex, key); } function setVisual(key, value2) { setItemVisualFromData(data, dataIndex, key, value2); } var dataIndex; var store = data.getStore(); while ((dataIndex = params.next()) != null) { var rawDataItem = data.getRawDataItem(dataIndex); if (rawDataItem && rawDataItem.visualMap === false) { continue; } var value = dim != null ? store.get(dimIndex, dataIndex) : dataIndex; var valueState = getValueState(value); var mappings = visualMappings[valueState]; var visualTypes = visualTypesMap[valueState]; for (var i = 0, len2 = visualTypes.length; i < len2; i++) { var type = visualTypes[i]; mappings[type] && mappings[type].applyVisual(value, getVisual, setVisual); } } } }; } function makeBrushCommonSelectorForSeries(area) { var brushType = area.brushType; var selectors = { point: function(itemLayout) { return selector[brushType].point(itemLayout, selectors, area); }, rect: function(itemLayout) { return selector[brushType].rect(itemLayout, selectors, area); } }; return selectors; } var selector = { lineX: getLineSelectors(0), lineY: getLineSelectors(1), rect: { point: function(itemLayout, selectors, area) { return itemLayout && area.boundingRect.contain(itemLayout[0], itemLayout[1]); }, rect: function(itemLayout, selectors, area) { return itemLayout && area.boundingRect.intersect(itemLayout); } }, polygon: { point: function(itemLayout, selectors, area) { return itemLayout && area.boundingRect.contain(itemLayout[0], itemLayout[1]) && contain$1(area.range, itemLayout[0], itemLayout[1]); }, rect: function(itemLayout, selectors, area) { var points2 = area.range; if (!itemLayout || points2.length <= 1) { return false; } var x = itemLayout.x; var y = itemLayout.y; var width = itemLayout.width; var height = itemLayout.height; var p = points2[0]; if (contain$1(points2, x, y) || contain$1(points2, x + width, y) || contain$1(points2, x, y + height) || contain$1(points2, x + width, y + height) || BoundingRect.create(itemLayout).contain(p[0], p[1]) || linePolygonIntersect(x, y, x + width, y, points2) || linePolygonIntersect(x, y, x, y + height, points2) || linePolygonIntersect(x + width, y, x + width, y + height, points2) || linePolygonIntersect(x, y + height, x + width, y + height, points2)) { return true; } } } }; function getLineSelectors(xyIndex) { var xy = ["x", "y"]; var wh = ["width", "height"]; return { point: function(itemLayout, selectors, area) { if (itemLayout) { var range = area.range; var p = itemLayout[xyIndex]; return inLineRange(p, range); } }, rect: function(itemLayout, selectors, area) { if (itemLayout) { var range = area.range; var layoutRange = [itemLayout[xy[xyIndex]], itemLayout[xy[xyIndex]] + itemLayout[wh[xyIndex]]]; layoutRange[1] < layoutRange[0] && layoutRange.reverse(); return inLineRange(layoutRange[0], range) || inLineRange(layoutRange[1], range) || inLineRange(range[0], layoutRange) || inLineRange(range[1], layoutRange); } } }; } function inLineRange(p, range) { return range[0] <= p && p <= range[1]; } var STATE_LIST = ["inBrush", "outOfBrush"]; var DISPATCH_METHOD = "__ecBrushSelect"; var DISPATCH_FLAG = "__ecInBrushSelectEvent"; function layoutCovers(ecModel) { ecModel.eachComponent({ mainType: "brush" }, function(brushModel) { var brushTargetManager = brushModel.brushTargetManager = new BrushTargetManager(brushModel.option, ecModel); brushTargetManager.setInputRanges(brushModel.areas, ecModel); }); } function brushVisual(ecModel, api, payload) { var brushSelected = []; var throttleType; var throttleDelay; ecModel.eachComponent({ mainType: "brush" }, function(brushModel) { payload && payload.type === "takeGlobalCursor" && brushModel.setBrushOption(payload.key === "brush" ? payload.brushOption : { brushType: false }); }); layoutCovers(ecModel); ecModel.eachComponent({ mainType: "brush" }, function(brushModel, brushIndex) { var thisBrushSelected = { brushId: brushModel.id, brushIndex, brushName: brushModel.name, areas: clone$1(brushModel.areas), selected: [] }; brushSelected.push(thisBrushSelected); var brushOption = brushModel.option; var brushLink = brushOption.brushLink; var linkedSeriesMap = []; var selectedDataIndexForLink = []; var rangeInfoBySeries = []; var hasBrushExists = false; if (!brushIndex) { throttleType = brushOption.throttleType; throttleDelay = brushOption.throttleDelay; } var areas = map$1(brushModel.areas, function(area) { var builder = boundingRectBuilders[area.brushType]; var selectableArea = defaults({ boundingRect: builder ? builder(area) : void 0 }, area); selectableArea.selectors = makeBrushCommonSelectorForSeries(selectableArea); return selectableArea; }); var visualMappings = createVisualMappings(brushModel.option, STATE_LIST, function(mappingOption) { mappingOption.mappingMethod = "fixed"; }); isArray$1(brushLink) && each$f(brushLink, function(seriesIndex) { linkedSeriesMap[seriesIndex] = 1; }); function linkOthers(seriesIndex) { return brushLink === "all" || !!linkedSeriesMap[seriesIndex]; } function brushed(rangeInfoList) { return !!rangeInfoList.length; } ecModel.eachSeries(function(seriesModel, seriesIndex) { var rangeInfoList = rangeInfoBySeries[seriesIndex] = []; seriesModel.subType === "parallel" ? stepAParallel(seriesModel, seriesIndex) : stepAOthers(seriesModel, seriesIndex, rangeInfoList); }); function stepAParallel(seriesModel, seriesIndex) { var coordSys = seriesModel.coordinateSystem; hasBrushExists = hasBrushExists || coordSys.hasAxisBrushed(); linkOthers(seriesIndex) && coordSys.eachActiveState(seriesModel.getData(), function(activeState, dataIndex) { activeState === "active" && (selectedDataIndexForLink[dataIndex] = 1); }); } function stepAOthers(seriesModel, seriesIndex, rangeInfoList) { if (!seriesModel.brushSelector || brushModelNotControll(brushModel, seriesIndex)) { return; } each$f(areas, function(area) { if (brushModel.brushTargetManager.controlSeries(area, seriesModel, ecModel)) { rangeInfoList.push(area); } hasBrushExists = hasBrushExists || brushed(rangeInfoList); }); if (linkOthers(seriesIndex) && brushed(rangeInfoList)) { var data_1 = seriesModel.getData(); data_1.each(function(dataIndex) { if (checkInRange(seriesModel, rangeInfoList, data_1, dataIndex)) { selectedDataIndexForLink[dataIndex] = 1; } }); } } ecModel.eachSeries(function(seriesModel, seriesIndex) { var seriesBrushSelected = { seriesId: seriesModel.id, seriesIndex, seriesName: seriesModel.name, dataIndex: [] }; thisBrushSelected.selected.push(seriesBrushSelected); var rangeInfoList = rangeInfoBySeries[seriesIndex]; var data = seriesModel.getData(); var getValueState = linkOthers(seriesIndex) ? function(dataIndex) { return selectedDataIndexForLink[dataIndex] ? (seriesBrushSelected.dataIndex.push(data.getRawIndex(dataIndex)), "inBrush") : "outOfBrush"; } : function(dataIndex) { return checkInRange(seriesModel, rangeInfoList, data, dataIndex) ? (seriesBrushSelected.dataIndex.push(data.getRawIndex(dataIndex)), "inBrush") : "outOfBrush"; }; (linkOthers(seriesIndex) ? hasBrushExists : brushed(rangeInfoList)) && applyVisual(STATE_LIST, visualMappings, data, getValueState); }); }); dispatchAction$1(api, throttleType, throttleDelay, brushSelected, payload); } function dispatchAction$1(api, throttleType, throttleDelay, brushSelected, payload) { if (!payload) { return; } var zr = api.getZr(); if (zr[DISPATCH_FLAG]) { return; } if (!zr[DISPATCH_METHOD]) { zr[DISPATCH_METHOD] = doDispatch; } var fn = createOrUpdate(zr, DISPATCH_METHOD, throttleDelay, throttleType); fn(api, brushSelected); } function doDispatch(api, brushSelected) { if (!api.isDisposed()) { var zr = api.getZr(); zr[DISPATCH_FLAG] = true; api.dispatchAction({ type: "brushSelect", batch: brushSelected }); zr[DISPATCH_FLAG] = false; } } function checkInRange(seriesModel, rangeInfoList, data, dataIndex) { for (var i = 0, len2 = rangeInfoList.length; i < len2; i++) { var area = rangeInfoList[i]; if (seriesModel.brushSelector(dataIndex, data, area.selectors, area)) { return true; } } } function brushModelNotControll(brushModel, seriesIndex) { var seriesIndices = brushModel.option.seriesIndex; return seriesIndices != null && seriesIndices !== "all" && (isArray$1(seriesIndices) ? indexOf(seriesIndices, seriesIndex) < 0 : seriesIndex !== seriesIndices); } var boundingRectBuilders = { rect: function(area) { return getBoundingRectFromMinMax(area.range); }, polygon: function(area) { var minMax; var range = area.range; for (var i = 0, len2 = range.length; i < len2; i++) { minMax = minMax || [[Infinity, -Infinity], [Infinity, -Infinity]]; var rg = range[i]; rg[0] < minMax[0][0] && (minMax[0][0] = rg[0]); rg[0] > minMax[0][1] && (minMax[0][1] = rg[0]); rg[1] < minMax[1][0] && (minMax[1][0] = rg[1]); rg[1] > minMax[1][1] && (minMax[1][1] = rg[1]); } return minMax && getBoundingRectFromMinMax(minMax); } }; function getBoundingRectFromMinMax(minMax) { return new BoundingRect(minMax[0][0], minMax[1][0], minMax[0][1] - minMax[0][0], minMax[1][1] - minMax[1][0]); } var BrushView = ( /** @class */ (function(_super) { __extends(BrushView2, _super); function BrushView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = BrushView2.type; return _this; } BrushView2.prototype.init = function(ecModel, api) { this.ecModel = ecModel; this.api = api; this.model; (this._brushController = new BrushController(api.getZr())).on("brush", bind$1(this._onBrush, this)).mount(); }; BrushView2.prototype.render = function(brushModel, ecModel, api, payload) { this.model = brushModel; this._updateController(brushModel, ecModel, api, payload); }; BrushView2.prototype.updateTransform = function(brushModel, ecModel, api, payload) { layoutCovers(ecModel); this._updateController(brushModel, ecModel, api, payload); }; BrushView2.prototype.updateVisual = function(brushModel, ecModel, api, payload) { this.updateTransform(brushModel, ecModel, api, payload); }; BrushView2.prototype.updateView = function(brushModel, ecModel, api, payload) { this._updateController(brushModel, ecModel, api, payload); }; BrushView2.prototype._updateController = function(brushModel, ecModel, api, payload) { (!payload || payload.$from !== brushModel.id) && this._brushController.setPanels(brushModel.brushTargetManager.makePanelOpts(api)).enableBrush(brushModel.brushOption).updateCovers(brushModel.areas.slice()); }; BrushView2.prototype.dispose = function() { this._brushController.dispose(); }; BrushView2.prototype._onBrush = function(eventParam) { var modelId = this.model.id; var areas = this.model.brushTargetManager.setOutputRanges(eventParam.areas, this.ecModel); (!eventParam.isEnd || eventParam.removeOnClick) && this.api.dispatchAction({ type: "brush", brushId: modelId, areas: clone$1(areas), $from: modelId }); eventParam.isEnd && this.api.dispatchAction({ type: "brushEnd", brushId: modelId, areas: clone$1(areas), $from: modelId }); }; BrushView2.type = "brush"; return BrushView2; })(ComponentView) ); var DEFAULT_OUT_OF_BRUSH_COLOR = "#ddd"; var BrushModel = ( /** @class */ (function(_super) { __extends(BrushModel2, _super); function BrushModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = BrushModel2.type; _this.areas = []; _this.brushOption = {}; return _this; } BrushModel2.prototype.optionUpdated = function(newOption, isInit) { var thisOption = this.option; !isInit && replaceVisualOption(thisOption, newOption, ["inBrush", "outOfBrush"]); var inBrush = thisOption.inBrush = thisOption.inBrush || {}; thisOption.outOfBrush = thisOption.outOfBrush || { color: DEFAULT_OUT_OF_BRUSH_COLOR }; if (!inBrush.hasOwnProperty("liftZ")) { inBrush.liftZ = 5; } }; BrushModel2.prototype.setAreas = function(areas) { if (!areas) { return; } this.areas = map$1(areas, function(area) { return generateBrushOption(this.option, area); }, this); }; BrushModel2.prototype.setBrushOption = function(brushOption) { this.brushOption = generateBrushOption(this.option, brushOption); this.brushType = this.brushOption.brushType; }; BrushModel2.type = "brush"; BrushModel2.dependencies = ["geo", "grid", "xAxis", "yAxis", "parallel", "series"]; BrushModel2.defaultOption = { seriesIndex: "all", brushType: "rect", brushMode: "single", transformable: true, brushStyle: { borderWidth: 1, color: "rgba(210,219,238,0.3)", borderColor: "#D2DBEE" }, throttleType: "fixRate", throttleDelay: 0, removeOnClick: true, z: 1e4 }; return BrushModel2; })(ComponentModel) ); function generateBrushOption(option, brushOption) { return merge({ brushType: option.brushType, brushMode: option.brushMode, transformable: option.transformable, brushStyle: new Model(option.brushStyle).getItemStyle(), removeOnClick: option.removeOnClick, z: option.z }, brushOption, true); } var ICON_TYPES = ["rect", "polygon", "lineX", "lineY", "keep", "clear"]; var BrushFeature = ( /** @class */ (function(_super) { __extends(BrushFeature2, _super); function BrushFeature2() { return _super !== null && _super.apply(this, arguments) || this; } BrushFeature2.prototype.render = function(featureModel, ecModel, api) { var brushType; var brushMode; var isBrushed; ecModel.eachComponent({ mainType: "brush" }, function(brushModel) { brushType = brushModel.brushType; brushMode = brushModel.brushOption.brushMode || "single"; isBrushed = isBrushed || !!brushModel.areas.length; }); this._brushType = brushType; this._brushMode = brushMode; each$f(featureModel.get("type", true), function(type) { featureModel.setIconStatus(type, (type === "keep" ? brushMode === "multiple" : type === "clear" ? isBrushed : type === brushType) ? "emphasis" : "normal"); }); }; BrushFeature2.prototype.updateView = function(featureModel, ecModel, api) { this.render(featureModel, ecModel, api); }; BrushFeature2.prototype.getIcons = function() { var model = this.model; var availableIcons = model.get("icon", true); var icons = {}; each$f(model.get("type", true), function(type) { if (availableIcons[type]) { icons[type] = availableIcons[type]; } }); return icons; }; BrushFeature2.prototype.onclick = function(ecModel, api, type) { var brushType = this._brushType; var brushMode = this._brushMode; if (type === "clear") { api.dispatchAction({ type: "axisAreaSelect", intervals: [] }); api.dispatchAction({ type: "brush", command: "clear", // Clear all areas of all brush components. areas: [] }); } else { api.dispatchAction({ type: "takeGlobalCursor", key: "brush", brushOption: { brushType: type === "keep" ? brushType : brushType === type ? false : type, brushMode: type === "keep" ? brushMode === "multiple" ? "single" : "multiple" : brushMode } }); } }; BrushFeature2.getDefaultOption = function(ecModel) { var defaultOption2 = { show: true, type: ICON_TYPES.slice(), icon: { /* eslint-disable */ rect: "M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13", polygon: "M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2", lineX: "M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4", lineY: "M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4", keep: "M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z", clear: "M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2" // jshint ignore:line /* eslint-enable */ }, // `rect`, `polygon`, `lineX`, `lineY`, `keep`, `clear` title: ecModel.getLocaleModel().get(["toolbox", "brush", "title"]) }; return defaultOption2; }; return BrushFeature2; })(ToolboxFeature) ); function install$j(registers) { registers.registerComponentView(BrushView); registers.registerComponentModel(BrushModel); registers.registerPreprocessor(brushPreprocessor); registers.registerVisual(registers.PRIORITY.VISUAL.BRUSH, brushVisual); registers.registerAction({ type: "brush", event: "brush", update: "updateVisual" }, function(payload, ecModel) { ecModel.eachComponent({ mainType: "brush", query: payload }, function(brushModel) { brushModel.setAreas(payload.areas); }); }); registers.registerAction({ type: "brushSelect", event: "brushSelected", update: "none" }, noop); registers.registerAction({ type: "brushEnd", event: "brushEnd", update: "none" }, noop); registerFeature("brush", BrushFeature); } var TitleModel = ( /** @class */ (function(_super) { __extends(TitleModel2, _super); function TitleModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = TitleModel2.type; _this.layoutMode = { type: "box", ignoreSize: true }; return _this; } TitleModel2.type = "title"; TitleModel2.defaultOption = { // zlevel: 0, z: 6, show: true, text: "", target: "blank", subtext: "", subtarget: "blank", left: 0, top: 0, backgroundColor: "rgba(0,0,0,0)", borderColor: "#ccc", borderWidth: 0, padding: 5, itemGap: 10, textStyle: { fontSize: 18, fontWeight: "bold", color: "#464646" }, subtextStyle: { fontSize: 12, color: "#6E7079" } }; return TitleModel2; })(ComponentModel) ); var TitleView = ( /** @class */ (function(_super) { __extends(TitleView2, _super); function TitleView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = TitleView2.type; return _this; } TitleView2.prototype.render = function(titleModel, ecModel, api) { this.group.removeAll(); if (!titleModel.get("show")) { return; } var group = this.group; var textStyleModel = titleModel.getModel("textStyle"); var subtextStyleModel = titleModel.getModel("subtextStyle"); var textAlign = titleModel.get("textAlign"); var textVerticalAlign = retrieve2(titleModel.get("textBaseline"), titleModel.get("textVerticalAlign")); var textEl = new ZRText({ style: createTextStyle(textStyleModel, { text: titleModel.get("text"), fill: textStyleModel.getTextColor() }, { disableBox: true }), z2: 10 }); var textRect = textEl.getBoundingRect(); var subText = titleModel.get("subtext"); var subTextEl = new ZRText({ style: createTextStyle(subtextStyleModel, { text: subText, fill: subtextStyleModel.getTextColor(), y: textRect.height + titleModel.get("itemGap"), verticalAlign: "top" }, { disableBox: true }), z2: 10 }); var link = titleModel.get("link"); var sublink = titleModel.get("sublink"); var triggerEvent = titleModel.get("triggerEvent", true); textEl.silent = !link && !triggerEvent; subTextEl.silent = !sublink && !triggerEvent; if (link) { textEl.on("click", function() { windowOpen(link, "_" + titleModel.get("target")); }); } if (sublink) { subTextEl.on("click", function() { windowOpen(sublink, "_" + titleModel.get("subtarget")); }); } getECData(textEl).eventData = getECData(subTextEl).eventData = triggerEvent ? { componentType: "title", componentIndex: titleModel.componentIndex } : null; group.add(textEl); subText && group.add(subTextEl); var groupRect = group.getBoundingRect(); var layoutOption = titleModel.getBoxLayoutParams(); layoutOption.width = groupRect.width; layoutOption.height = groupRect.height; var layoutRect = getLayoutRect(layoutOption, { width: api.getWidth(), height: api.getHeight() }, titleModel.get("padding")); if (!textAlign) { textAlign = titleModel.get("left") || titleModel.get("right"); if (textAlign === "middle") { textAlign = "center"; } if (textAlign === "right") { layoutRect.x += layoutRect.width; } else if (textAlign === "center") { layoutRect.x += layoutRect.width / 2; } } if (!textVerticalAlign) { textVerticalAlign = titleModel.get("top") || titleModel.get("bottom"); if (textVerticalAlign === "center") { textVerticalAlign = "middle"; } if (textVerticalAlign === "bottom") { layoutRect.y += layoutRect.height; } else if (textVerticalAlign === "middle") { layoutRect.y += layoutRect.height / 2; } textVerticalAlign = textVerticalAlign || "top"; } group.x = layoutRect.x; group.y = layoutRect.y; group.markRedraw(); var alignStyle = { align: textAlign, verticalAlign: textVerticalAlign }; textEl.setStyle(alignStyle); subTextEl.setStyle(alignStyle); groupRect = group.getBoundingRect(); var padding = layoutRect.margin; var style = titleModel.getItemStyle(["color", "opacity"]); style.fill = titleModel.get("backgroundColor"); var rect = new Rect$2({ shape: { x: groupRect.x - padding[3], y: groupRect.y - padding[0], width: groupRect.width + padding[1] + padding[3], height: groupRect.height + padding[0] + padding[2], r: titleModel.get("borderRadius") }, style, subPixelOptimize: true, silent: true }); group.add(rect); }; TitleView2.type = "title"; return TitleView2; })(ComponentView) ); function install$i(registers) { registers.registerComponentModel(TitleModel); registers.registerComponentView(TitleView); } var TimelineModel = ( /** @class */ (function(_super) { __extends(TimelineModel2, _super); function TimelineModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = TimelineModel2.type; _this.layoutMode = "box"; return _this; } TimelineModel2.prototype.init = function(option, parentModel, ecModel) { this.mergeDefaultAndTheme(option, ecModel); this._initData(); }; TimelineModel2.prototype.mergeOption = function(option) { _super.prototype.mergeOption.apply(this, arguments); this._initData(); }; TimelineModel2.prototype.setCurrentIndex = function(currentIndex) { if (currentIndex == null) { currentIndex = this.option.currentIndex; } var count2 = this._data.count(); if (this.option.loop) { currentIndex = (currentIndex % count2 + count2) % count2; } else { currentIndex >= count2 && (currentIndex = count2 - 1); currentIndex < 0 && (currentIndex = 0); } this.option.currentIndex = currentIndex; }; TimelineModel2.prototype.getCurrentIndex = function() { return this.option.currentIndex; }; TimelineModel2.prototype.isIndexMax = function() { return this.getCurrentIndex() >= this._data.count() - 1; }; TimelineModel2.prototype.setPlayState = function(state) { this.option.autoPlay = !!state; }; TimelineModel2.prototype.getPlayState = function() { return !!this.option.autoPlay; }; TimelineModel2.prototype._initData = function() { var thisOption = this.option; var dataArr = thisOption.data || []; var axisType = thisOption.axisType; var names = this._names = []; var processedDataArr; if (axisType === "category") { processedDataArr = []; each$f(dataArr, function(item, index) { var value = convertOptionIdName(getDataItemValue(item), ""); var newItem; if (isObject$3(item)) { newItem = clone$1(item); newItem.value = index; } else { newItem = index; } processedDataArr.push(newItem); names.push(value); }); } else { processedDataArr = dataArr; } var dimType = { category: "ordinal", time: "time", value: "number" }[axisType] || "number"; var data = this._data = new SeriesData([{ name: "value", type: dimType }], this); data.initData(processedDataArr, names); }; TimelineModel2.prototype.getData = function() { return this._data; }; TimelineModel2.prototype.getCategories = function() { if (this.get("axisType") === "category") { return this._names.slice(); } }; TimelineModel2.type = "timeline"; TimelineModel2.defaultOption = { // zlevel: 0, // 一级层叠 z: 4, show: true, axisType: "time", realtime: true, left: "20%", top: null, right: "20%", bottom: 0, width: null, height: 40, padding: 5, controlPosition: "left", autoPlay: false, rewind: false, loop: true, playInterval: 2e3, currentIndex: 0, itemStyle: {}, label: { color: "#000" }, data: [] }; return TimelineModel2; })(ComponentModel) ); var SliderTimelineModel = ( /** @class */ (function(_super) { __extends(SliderTimelineModel2, _super); function SliderTimelineModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = SliderTimelineModel2.type; return _this; } SliderTimelineModel2.type = "timeline.slider"; SliderTimelineModel2.defaultOption = inheritDefaultOption(TimelineModel.defaultOption, { backgroundColor: "rgba(0,0,0,0)", borderColor: "#ccc", borderWidth: 0, orient: "horizontal", inverse: false, tooltip: { trigger: "item" // data item may also have tootip attr. }, symbol: "circle", symbolSize: 12, lineStyle: { show: true, width: 2, color: "#DAE1F5" }, label: { position: "auto", // When using number, label position is not // restricted by viewRect. // positive: right/bottom, negative: left/top show: true, interval: "auto", rotate: 0, // formatter: null, // 其余属性默认使用全局文本样式,详见TEXTSTYLE color: "#A4B1D7" }, itemStyle: { color: "#A4B1D7", borderWidth: 1 }, checkpointStyle: { symbol: "circle", symbolSize: 15, color: "#316bf3", borderColor: "#fff", borderWidth: 2, shadowBlur: 2, shadowOffsetX: 1, shadowOffsetY: 1, shadowColor: "rgba(0, 0, 0, 0.3)", // borderColor: 'rgba(194,53,49, 0.5)', animation: true, animationDuration: 300, animationEasing: "quinticInOut" }, controlStyle: { show: true, showPlayBtn: true, showPrevBtn: true, showNextBtn: true, itemSize: 24, itemGap: 12, position: "left", playIcon: "path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z", stopIcon: "path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z", // eslint-disable-next-line max-len nextIcon: "M2,18.5A1.52,1.52,0,0,1,.92,18a1.49,1.49,0,0,1,0-2.12L7.81,9.36,1,3.11A1.5,1.5,0,1,1,3,.89l8,7.34a1.48,1.48,0,0,1,.49,1.09,1.51,1.51,0,0,1-.46,1.1L3,18.08A1.5,1.5,0,0,1,2,18.5Z", // eslint-disable-next-line max-len prevIcon: "M10,.5A1.52,1.52,0,0,1,11.08,1a1.49,1.49,0,0,1,0,2.12L4.19,9.64,11,15.89a1.5,1.5,0,1,1-2,2.22L1,10.77A1.48,1.48,0,0,1,.5,9.68,1.51,1.51,0,0,1,1,8.58L9,.92A1.5,1.5,0,0,1,10,.5Z", prevBtnSize: 18, nextBtnSize: 18, color: "#A4B1D7", borderColor: "#A4B1D7", borderWidth: 1 }, emphasis: { label: { show: true, // 其余属性默认使用全局文本样式,详见TEXTSTYLE color: "#6f778d" }, itemStyle: { color: "#316BF3" }, controlStyle: { color: "#316BF3", borderColor: "#316BF3", borderWidth: 2 } }, progress: { lineStyle: { color: "#316BF3" }, itemStyle: { color: "#316BF3" }, label: { color: "#6f778d" } }, data: [] }); return SliderTimelineModel2; })(TimelineModel) ); mixin(SliderTimelineModel, DataFormatMixin.prototype); var TimelineView = ( /** @class */ (function(_super) { __extends(TimelineView2, _super); function TimelineView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = TimelineView2.type; return _this; } TimelineView2.type = "timeline"; return TimelineView2; })(ComponentView) ); var TimelineAxis = ( /** @class */ (function(_super) { __extends(TimelineAxis2, _super); function TimelineAxis2(dim, scale2, coordExtent, axisType) { var _this = _super.call(this, dim, scale2, coordExtent) || this; _this.type = axisType || "value"; return _this; } TimelineAxis2.prototype.getLabelModel = function() { return this.model.getModel("label"); }; TimelineAxis2.prototype.isHorizontal = function() { return this.model.get("orient") === "horizontal"; }; return TimelineAxis2; })(Axis) ); var PI = Math.PI; var labelDataIndexStore = makeInner(); var SliderTimelineView = ( /** @class */ (function(_super) { __extends(SliderTimelineView2, _super); function SliderTimelineView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = SliderTimelineView2.type; return _this; } SliderTimelineView2.prototype.init = function(ecModel, api) { this.api = api; }; SliderTimelineView2.prototype.render = function(timelineModel, ecModel, api) { this.model = timelineModel; this.api = api; this.ecModel = ecModel; this.group.removeAll(); if (timelineModel.get("show", true)) { var layoutInfo_1 = this._layout(timelineModel, api); var mainGroup_1 = this._createGroup("_mainGroup"); var labelGroup = this._createGroup("_labelGroup"); var axis_1 = this._axis = this._createAxis(layoutInfo_1, timelineModel); timelineModel.formatTooltip = function(dataIndex) { var name = axis_1.scale.getLabel({ value: dataIndex }); return createTooltipMarkup("nameValue", { noName: true, value: name }); }; each$f(["AxisLine", "AxisTick", "Control", "CurrentPointer"], function(name) { this["_render" + name](layoutInfo_1, mainGroup_1, axis_1, timelineModel); }, this); this._renderAxisLabel(layoutInfo_1, labelGroup, axis_1, timelineModel); this._position(layoutInfo_1, timelineModel); } this._doPlayStop(); this._updateTicksStatus(); }; SliderTimelineView2.prototype.remove = function() { this._clearTimer(); this.group.removeAll(); }; SliderTimelineView2.prototype.dispose = function() { this._clearTimer(); }; SliderTimelineView2.prototype._layout = function(timelineModel, api) { var labelPosOpt = timelineModel.get(["label", "position"]); var orient = timelineModel.get("orient"); var viewRect = getViewRect(timelineModel, api); var parsedLabelPos; if (labelPosOpt == null || labelPosOpt === "auto") { parsedLabelPos = orient === "horizontal" ? viewRect.y + viewRect.height / 2 < api.getHeight() / 2 ? "-" : "+" : viewRect.x + viewRect.width / 2 < api.getWidth() / 2 ? "+" : "-"; } else if (isString(labelPosOpt)) { parsedLabelPos = { horizontal: { top: "-", bottom: "+" }, vertical: { left: "-", right: "+" } }[orient][labelPosOpt]; } else { parsedLabelPos = labelPosOpt; } var labelAlignMap = { horizontal: "center", vertical: parsedLabelPos >= 0 || parsedLabelPos === "+" ? "left" : "right" }; var labelBaselineMap = { horizontal: parsedLabelPos >= 0 || parsedLabelPos === "+" ? "top" : "bottom", vertical: "middle" }; var rotationMap = { horizontal: 0, vertical: PI / 2 }; var mainLength = orient === "vertical" ? viewRect.height : viewRect.width; var controlModel = timelineModel.getModel("controlStyle"); var showControl = controlModel.get("show", true); var controlSize = showControl ? controlModel.get("itemSize") : 0; var controlGap = showControl ? controlModel.get("itemGap") : 0; var sizePlusGap = controlSize + controlGap; var labelRotation = timelineModel.get(["label", "rotate"]) || 0; labelRotation = labelRotation * PI / 180; var playPosition; var prevBtnPosition; var nextBtnPosition; var controlPosition = controlModel.get("position", true); var showPlayBtn = showControl && controlModel.get("showPlayBtn", true); var showPrevBtn = showControl && controlModel.get("showPrevBtn", true); var showNextBtn = showControl && controlModel.get("showNextBtn", true); var xLeft = 0; var xRight = mainLength; if (controlPosition === "left" || controlPosition === "bottom") { showPlayBtn && (playPosition = [0, 0], xLeft += sizePlusGap); showPrevBtn && (prevBtnPosition = [xLeft, 0], xLeft += sizePlusGap); showNextBtn && (nextBtnPosition = [xRight - controlSize, 0], xRight -= sizePlusGap); } else { showPlayBtn && (playPosition = [xRight - controlSize, 0], xRight -= sizePlusGap); showPrevBtn && (prevBtnPosition = [0, 0], xLeft += sizePlusGap); showNextBtn && (nextBtnPosition = [xRight - controlSize, 0], xRight -= sizePlusGap); } var axisExtent = [xLeft, xRight]; if (timelineModel.get("inverse")) { axisExtent.reverse(); } return { viewRect, mainLength, orient, rotation: rotationMap[orient], labelRotation, labelPosOpt: parsedLabelPos, labelAlign: timelineModel.get(["label", "align"]) || labelAlignMap[orient], labelBaseline: timelineModel.get(["label", "verticalAlign"]) || timelineModel.get(["label", "baseline"]) || labelBaselineMap[orient], // Based on mainGroup. playPosition, prevBtnPosition, nextBtnPosition, axisExtent, controlSize, controlGap }; }; SliderTimelineView2.prototype._position = function(layoutInfo, timelineModel) { var mainGroup = this._mainGroup; var labelGroup = this._labelGroup; var viewRect = layoutInfo.viewRect; if (layoutInfo.orient === "vertical") { var m = create$1(); var rotateOriginX = viewRect.x; var rotateOriginY = viewRect.y + viewRect.height; translate(m, m, [-rotateOriginX, -rotateOriginY]); rotate(m, m, -PI / 2); translate(m, m, [rotateOriginX, rotateOriginY]); viewRect = viewRect.clone(); viewRect.applyTransform(m); } var viewBound = getBound(viewRect); var mainBound = getBound(mainGroup.getBoundingRect()); var labelBound = getBound(labelGroup.getBoundingRect()); var mainPosition = [mainGroup.x, mainGroup.y]; var labelsPosition = [labelGroup.x, labelGroup.y]; labelsPosition[0] = mainPosition[0] = viewBound[0][0]; var labelPosOpt = layoutInfo.labelPosOpt; if (labelPosOpt == null || isString(labelPosOpt)) { var mainBoundIdx = labelPosOpt === "+" ? 0 : 1; toBound(mainPosition, mainBound, viewBound, 1, mainBoundIdx); toBound(labelsPosition, labelBound, viewBound, 1, 1 - mainBoundIdx); } else { var mainBoundIdx = labelPosOpt >= 0 ? 0 : 1; toBound(mainPosition, mainBound, viewBound, 1, mainBoundIdx); labelsPosition[1] = mainPosition[1] + labelPosOpt; } mainGroup.setPosition(mainPosition); labelGroup.setPosition(labelsPosition); mainGroup.rotation = labelGroup.rotation = layoutInfo.rotation; setOrigin(mainGroup); setOrigin(labelGroup); function setOrigin(targetGroup) { targetGroup.originX = viewBound[0][0] - targetGroup.x; targetGroup.originY = viewBound[1][0] - targetGroup.y; } function getBound(rect) { return [[rect.x, rect.x + rect.width], [rect.y, rect.y + rect.height]]; } function toBound(fromPos, from, to, dimIdx, boundIdx) { fromPos[dimIdx] += to[dimIdx][boundIdx] - from[dimIdx][boundIdx]; } }; SliderTimelineView2.prototype._createAxis = function(layoutInfo, timelineModel) { var data = timelineModel.getData(); var axisType = timelineModel.get("axisType"); var scale2 = createScaleByModel(timelineModel, axisType); scale2.getTicks = function() { return data.mapArray(["value"], function(value) { return { value }; }); }; var dataExtent = data.getDataExtent("value"); scale2.setExtent(dataExtent[0], dataExtent[1]); scale2.calcNiceTicks(); var axis = new TimelineAxis("value", scale2, layoutInfo.axisExtent, axisType); axis.model = timelineModel; return axis; }; SliderTimelineView2.prototype._createGroup = function(key) { var newGroup = this[key] = new Group$3(); this.group.add(newGroup); return newGroup; }; SliderTimelineView2.prototype._renderAxisLine = function(layoutInfo, group, axis, timelineModel) { var axisExtent = axis.getExtent(); if (!timelineModel.get(["lineStyle", "show"])) { return; } var line = new Line$1({ shape: { x1: axisExtent[0], y1: 0, x2: axisExtent[1], y2: 0 }, style: extend({ lineCap: "round" }, timelineModel.getModel("lineStyle").getLineStyle()), silent: true, z2: 1 }); group.add(line); var progressLine = this._progressLine = new Line$1({ shape: { x1: axisExtent[0], x2: this._currentPointer ? this._currentPointer.x : axisExtent[0], y1: 0, y2: 0 }, style: defaults({ lineCap: "round", lineWidth: line.style.lineWidth }, timelineModel.getModel(["progress", "lineStyle"]).getLineStyle()), silent: true, z2: 1 }); group.add(progressLine); }; SliderTimelineView2.prototype._renderAxisTick = function(layoutInfo, group, axis, timelineModel) { var _this = this; var data = timelineModel.getData(); var ticks = axis.scale.getTicks(); this._tickSymbols = []; each$f(ticks, function(tick) { var tickCoord = axis.dataToCoord(tick.value); var itemModel = data.getItemModel(tick.value); var itemStyleModel = itemModel.getModel("itemStyle"); var hoverStyleModel = itemModel.getModel(["emphasis", "itemStyle"]); var progressStyleModel = itemModel.getModel(["progress", "itemStyle"]); var symbolOpt = { x: tickCoord, y: 0, onclick: bind$1(_this._changeTimeline, _this, tick.value) }; var el = giveSymbol(itemModel, itemStyleModel, group, symbolOpt); el.ensureState("emphasis").style = hoverStyleModel.getItemStyle(); el.ensureState("progress").style = progressStyleModel.getItemStyle(); enableHoverEmphasis(el); var ecData = getECData(el); if (itemModel.get("tooltip")) { ecData.dataIndex = tick.value; ecData.dataModel = timelineModel; } else { ecData.dataIndex = ecData.dataModel = null; } _this._tickSymbols.push(el); }); }; SliderTimelineView2.prototype._renderAxisLabel = function(layoutInfo, group, axis, timelineModel) { var _this = this; var labelModel = axis.getLabelModel(); if (!labelModel.get("show")) { return; } var data = timelineModel.getData(); var labels = axis.getViewLabels(); this._tickLabels = []; each$f(labels, function(labelItem) { var dataIndex = labelItem.tickValue; var itemModel = data.getItemModel(dataIndex); var normalLabelModel = itemModel.getModel("label"); var hoverLabelModel = itemModel.getModel(["emphasis", "label"]); var progressLabelModel = itemModel.getModel(["progress", "label"]); var tickCoord = axis.dataToCoord(labelItem.tickValue); var textEl = new ZRText({ x: tickCoord, y: 0, rotation: layoutInfo.labelRotation - layoutInfo.rotation, onclick: bind$1(_this._changeTimeline, _this, dataIndex), silent: false, style: createTextStyle(normalLabelModel, { text: labelItem.formattedLabel, align: layoutInfo.labelAlign, verticalAlign: layoutInfo.labelBaseline }) }); textEl.ensureState("emphasis").style = createTextStyle(hoverLabelModel); textEl.ensureState("progress").style = createTextStyle(progressLabelModel); group.add(textEl); enableHoverEmphasis(textEl); labelDataIndexStore(textEl).dataIndex = dataIndex; _this._tickLabels.push(textEl); }); }; SliderTimelineView2.prototype._renderControl = function(layoutInfo, group, axis, timelineModel) { var controlSize = layoutInfo.controlSize; var rotation = layoutInfo.rotation; var itemStyle = timelineModel.getModel("controlStyle").getItemStyle(); var hoverStyle = timelineModel.getModel(["emphasis", "controlStyle"]).getItemStyle(); var playState = timelineModel.getPlayState(); var inverse = timelineModel.get("inverse", true); makeBtn(layoutInfo.nextBtnPosition, "next", bind$1(this._changeTimeline, this, inverse ? "-" : "+")); makeBtn(layoutInfo.prevBtnPosition, "prev", bind$1(this._changeTimeline, this, inverse ? "+" : "-")); makeBtn(layoutInfo.playPosition, playState ? "stop" : "play", bind$1(this._handlePlayClick, this, !playState), true); function makeBtn(position2, iconName, onclick, willRotate) { if (!position2) { return; } var iconSize = parsePercent$1(retrieve2(timelineModel.get(["controlStyle", iconName + "BtnSize"]), controlSize), controlSize); var rect = [0, -iconSize / 2, iconSize, iconSize]; var btn = makeControlIcon(timelineModel, iconName + "Icon", rect, { x: position2[0], y: position2[1], originX: controlSize / 2, originY: 0, rotation: willRotate ? -rotation : 0, rectHover: true, style: itemStyle, onclick }); btn.ensureState("emphasis").style = hoverStyle; group.add(btn); enableHoverEmphasis(btn); } }; SliderTimelineView2.prototype._renderCurrentPointer = function(layoutInfo, group, axis, timelineModel) { var data = timelineModel.getData(); var currentIndex = timelineModel.getCurrentIndex(); var pointerModel = data.getItemModel(currentIndex).getModel("checkpointStyle"); var me = this; var callback = { onCreate: function(pointer) { pointer.draggable = true; pointer.drift = bind$1(me._handlePointerDrag, me); pointer.ondragend = bind$1(me._handlePointerDragend, me); pointerMoveTo(pointer, me._progressLine, currentIndex, axis, timelineModel, true); }, onUpdate: function(pointer) { pointerMoveTo(pointer, me._progressLine, currentIndex, axis, timelineModel); } }; this._currentPointer = giveSymbol(pointerModel, pointerModel, this._mainGroup, {}, this._currentPointer, callback); }; SliderTimelineView2.prototype._handlePlayClick = function(nextState) { this._clearTimer(); this.api.dispatchAction({ type: "timelinePlayChange", playState: nextState, from: this.uid }); }; SliderTimelineView2.prototype._handlePointerDrag = function(dx, dy, e) { this._clearTimer(); this._pointerChangeTimeline([e.offsetX, e.offsetY]); }; SliderTimelineView2.prototype._handlePointerDragend = function(e) { this._pointerChangeTimeline([e.offsetX, e.offsetY], true); }; SliderTimelineView2.prototype._pointerChangeTimeline = function(mousePos, trigger2) { var toCoord = this._toAxisCoord(mousePos)[0]; var axis = this._axis; var axisExtent = asc$2(axis.getExtent().slice()); toCoord > axisExtent[1] && (toCoord = axisExtent[1]); toCoord < axisExtent[0] && (toCoord = axisExtent[0]); this._currentPointer.x = toCoord; this._currentPointer.markRedraw(); var progressLine = this._progressLine; if (progressLine) { progressLine.shape.x2 = toCoord; progressLine.dirty(); } var targetDataIndex = this._findNearestTick(toCoord); var timelineModel = this.model; if (trigger2 || targetDataIndex !== timelineModel.getCurrentIndex() && timelineModel.get("realtime")) { this._changeTimeline(targetDataIndex); } }; SliderTimelineView2.prototype._doPlayStop = function() { var _this = this; this._clearTimer(); if (this.model.getPlayState()) { this._timer = setTimeout(function() { var timelineModel = _this.model; _this._changeTimeline(timelineModel.getCurrentIndex() + (timelineModel.get("rewind", true) ? -1 : 1)); }, this.model.get("playInterval")); } }; SliderTimelineView2.prototype._toAxisCoord = function(vertex) { var trans = this._mainGroup.getLocalTransform(); return applyTransform(vertex, trans, true); }; SliderTimelineView2.prototype._findNearestTick = function(axisCoord) { var data = this.model.getData(); var dist2 = Infinity; var targetDataIndex; var axis = this._axis; data.each(["value"], function(value, dataIndex) { var coord = axis.dataToCoord(value); var d = Math.abs(coord - axisCoord); if (d < dist2) { dist2 = d; targetDataIndex = dataIndex; } }); return targetDataIndex; }; SliderTimelineView2.prototype._clearTimer = function() { if (this._timer) { clearTimeout(this._timer); this._timer = null; } }; SliderTimelineView2.prototype._changeTimeline = function(nextIndex) { var currentIndex = this.model.getCurrentIndex(); if (nextIndex === "+") { nextIndex = currentIndex + 1; } else if (nextIndex === "-") { nextIndex = currentIndex - 1; } this.api.dispatchAction({ type: "timelineChange", currentIndex: nextIndex, from: this.uid }); }; SliderTimelineView2.prototype._updateTicksStatus = function() { var currentIndex = this.model.getCurrentIndex(); var tickSymbols = this._tickSymbols; var tickLabels = this._tickLabels; if (tickSymbols) { for (var i = 0; i < tickSymbols.length; i++) { tickSymbols && tickSymbols[i] && tickSymbols[i].toggleState("progress", i < currentIndex); } } if (tickLabels) { for (var i = 0; i < tickLabels.length; i++) { tickLabels && tickLabels[i] && tickLabels[i].toggleState("progress", labelDataIndexStore(tickLabels[i]).dataIndex <= currentIndex); } } }; SliderTimelineView2.type = "timeline.slider"; return SliderTimelineView2; })(TimelineView) ); function createScaleByModel(model, axisType) { axisType = axisType || model.get("type"); if (axisType) { switch (axisType) { // Buildin scale case "category": return new OrdinalScale({ ordinalMeta: model.getCategories(), extent: [Infinity, -Infinity] }); case "time": return new TimeScale({ locale: model.ecModel.getLocaleModel(), useUTC: model.ecModel.get("useUTC") }); default: return new IntervalScale(); } } } function getViewRect(model, api) { return getLayoutRect(model.getBoxLayoutParams(), { width: api.getWidth(), height: api.getHeight() }, model.get("padding")); } function makeControlIcon(timelineModel, objPath, rect, opts) { var style = opts.style; var icon = createIcon(timelineModel.get(["controlStyle", objPath]), opts || {}, new BoundingRect(rect[0], rect[1], rect[2], rect[3])); if (style) { icon.setStyle(style); } return icon; } function giveSymbol(hostModel, itemStyleModel, group, opt, symbol, callback) { var color = itemStyleModel.get("color"); if (!symbol) { var symbolType = hostModel.get("symbol"); symbol = createSymbol$1(symbolType, -1, -1, 2, 2, color); symbol.setStyle("strokeNoScale", true); group.add(symbol); callback && callback.onCreate(symbol); } else { symbol.setColor(color); group.add(symbol); callback && callback.onUpdate(symbol); } var itemStyle = itemStyleModel.getItemStyle(["color"]); symbol.setStyle(itemStyle); opt = merge({ rectHover: true, z2: 100 }, opt, true); var symbolSize = normalizeSymbolSize(hostModel.get("symbolSize")); opt.scaleX = symbolSize[0] / 2; opt.scaleY = symbolSize[1] / 2; var symbolOffset = normalizeSymbolOffset(hostModel.get("symbolOffset"), symbolSize); if (symbolOffset) { opt.x = (opt.x || 0) + symbolOffset[0]; opt.y = (opt.y || 0) + symbolOffset[1]; } var symbolRotate = hostModel.get("symbolRotate"); opt.rotation = (symbolRotate || 0) * Math.PI / 180 || 0; symbol.attr(opt); symbol.updateTransform(); return symbol; } function pointerMoveTo(pointer, progressLine, dataIndex, axis, timelineModel, noAnimation) { if (pointer.dragging) { return; } var pointerModel = timelineModel.getModel("checkpointStyle"); var toCoord = axis.dataToCoord(timelineModel.getData().get("value", dataIndex)); if (noAnimation || !pointerModel.get("animation", true)) { pointer.attr({ x: toCoord, y: 0 }); progressLine && progressLine.attr({ shape: { x2: toCoord } }); } else { var animationCfg = { duration: pointerModel.get("animationDuration", true), easing: pointerModel.get("animationEasing", true) }; pointer.stopAnimation(null, true); pointer.animateTo({ x: toCoord, y: 0 }, animationCfg); progressLine && progressLine.animateTo({ shape: { x2: toCoord } }, animationCfg); } } function installTimelineAction(registers) { registers.registerAction({ type: "timelineChange", event: "timelineChanged", update: "prepareAndUpdate" }, function(payload, ecModel, api) { var timelineModel = ecModel.getComponent("timeline"); if (timelineModel && payload.currentIndex != null) { timelineModel.setCurrentIndex(payload.currentIndex); if (!timelineModel.get("loop", true) && timelineModel.isIndexMax() && timelineModel.getPlayState()) { timelineModel.setPlayState(false); api.dispatchAction({ type: "timelinePlayChange", playState: false, from: payload.from }); } } ecModel.resetOption("timeline", { replaceMerge: timelineModel.get("replaceMerge", true) }); return defaults({ currentIndex: timelineModel.option.currentIndex }, payload); }); registers.registerAction({ type: "timelinePlayChange", event: "timelinePlayChanged", update: "update" }, function(payload, ecModel) { var timelineModel = ecModel.getComponent("timeline"); if (timelineModel && payload.playState != null) { timelineModel.setPlayState(payload.playState); } }); } function timelinePreprocessor(option) { var timelineOpt = option && option.timeline; if (!isArray$1(timelineOpt)) { timelineOpt = timelineOpt ? [timelineOpt] : []; } each$f(timelineOpt, function(opt) { if (!opt) { return; } compatibleEC2(opt); }); } function compatibleEC2(opt) { var type = opt.type; var ec2Types = { "number": "value", "time": "time" }; if (ec2Types[type]) { opt.axisType = ec2Types[type]; delete opt.type; } transferItem(opt); if (has$1(opt, "controlPosition")) { var controlStyle = opt.controlStyle || (opt.controlStyle = {}); if (!has$1(controlStyle, "position")) { controlStyle.position = opt.controlPosition; } if (controlStyle.position === "none" && !has$1(controlStyle, "show")) { controlStyle.show = false; delete controlStyle.position; } delete opt.controlPosition; } each$f(opt.data || [], function(dataItem) { if (isObject$3(dataItem) && !isArray$1(dataItem)) { if (!has$1(dataItem, "value") && has$1(dataItem, "name")) { dataItem.value = dataItem.name; } transferItem(dataItem); } }); } function transferItem(opt) { var itemStyle = opt.itemStyle || (opt.itemStyle = {}); var itemStyleEmphasis = itemStyle.emphasis || (itemStyle.emphasis = {}); var label = opt.label || opt.label || {}; var labelNormal = label.normal || (label.normal = {}); var excludeLabelAttr = { normal: 1, emphasis: 1 }; each$f(label, function(value, name) { if (!excludeLabelAttr[name] && !has$1(labelNormal, name)) { labelNormal[name] = value; } }); if (itemStyleEmphasis.label && !has$1(label, "emphasis")) { label.emphasis = itemStyleEmphasis.label; delete itemStyleEmphasis.label; } } function has$1(obj, attr) { return obj.hasOwnProperty(attr); } function install$h(registers) { registers.registerComponentModel(SliderTimelineModel); registers.registerComponentView(SliderTimelineView); registers.registerSubTypeDefaulter("timeline", function() { return "slider"; }); installTimelineAction(registers); registers.registerPreprocessor(timelinePreprocessor); } function checkMarkerInSeries(seriesOpts, markerType) { if (!seriesOpts) { return false; } var seriesOptArr = isArray$1(seriesOpts) ? seriesOpts : [seriesOpts]; for (var idx = 0; idx < seriesOptArr.length; idx++) { if (seriesOptArr[idx] && seriesOptArr[idx][markerType]) { return true; } } return false; } function fillLabel(opt) { defaultEmphasis(opt, "label", ["show"]); } var inner$5 = makeInner(); var MarkerModel = ( /** @class */ (function(_super) { __extends(MarkerModel2, _super); function MarkerModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = MarkerModel2.type; _this.createdBySelf = false; return _this; } MarkerModel2.prototype.init = function(option, parentModel, ecModel) { this.mergeDefaultAndTheme(option, ecModel); this._mergeOption(option, ecModel, false, true); }; MarkerModel2.prototype.isAnimationEnabled = function() { if (env.node) { return false; } var hostSeries = this.__hostSeries; return this.getShallow("animation") && hostSeries && hostSeries.isAnimationEnabled(); }; MarkerModel2.prototype.mergeOption = function(newOpt, ecModel) { this._mergeOption(newOpt, ecModel, false, false); }; MarkerModel2.prototype._mergeOption = function(newOpt, ecModel, createdBySelf, isInit) { var componentType = this.mainType; if (!createdBySelf) { ecModel.eachSeries(function(seriesModel) { var markerOpt = seriesModel.get(this.mainType, true); var markerModel = inner$5(seriesModel)[componentType]; if (!markerOpt || !markerOpt.data) { inner$5(seriesModel)[componentType] = null; return; } if (!markerModel) { if (isInit) { fillLabel(markerOpt); } each$f(markerOpt.data, function(item) { if (item instanceof Array) { fillLabel(item[0]); fillLabel(item[1]); } else { fillLabel(item); } }); markerModel = this.createMarkerModelFromSeries(markerOpt, this, ecModel); extend(markerModel, { mainType: this.mainType, // Use the same series index and name seriesIndex: seriesModel.seriesIndex, name: seriesModel.name, createdBySelf: true }); markerModel.__hostSeries = seriesModel; } else { markerModel._mergeOption(markerOpt, ecModel, true); } inner$5(seriesModel)[componentType] = markerModel; }, this); } }; MarkerModel2.prototype.formatTooltip = function(dataIndex, multipleSeries, dataType) { var data = this.getData(); var value = this.getRawValue(dataIndex); var itemName = data.getName(dataIndex); return createTooltipMarkup("section", { header: this.name, blocks: [createTooltipMarkup("nameValue", { name: itemName, value, noName: !itemName, noValue: value == null })] }); }; MarkerModel2.prototype.getData = function() { return this._data; }; MarkerModel2.prototype.setData = function(data) { this._data = data; }; MarkerModel2.prototype.getDataParams = function(dataIndex, dataType) { var params = DataFormatMixin.prototype.getDataParams.call(this, dataIndex, dataType); var hostSeries = this.__hostSeries; if (hostSeries) { params.seriesId = hostSeries.id; params.seriesName = hostSeries.name; params.seriesType = hostSeries.subType; } return params; }; MarkerModel2.getMarkerModelFromSeries = function(seriesModel, componentType) { return inner$5(seriesModel)[componentType]; }; MarkerModel2.type = "marker"; MarkerModel2.dependencies = ["series", "grid", "polar", "geo"]; return MarkerModel2; })(ComponentModel) ); mixin(MarkerModel, DataFormatMixin.prototype); var MarkPointModel = ( /** @class */ (function(_super) { __extends(MarkPointModel2, _super); function MarkPointModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = MarkPointModel2.type; return _this; } MarkPointModel2.prototype.createMarkerModelFromSeries = function(markerOpt, masterMarkerModel, ecModel) { return new MarkPointModel2(markerOpt, masterMarkerModel, ecModel); }; MarkPointModel2.type = "markPoint"; MarkPointModel2.defaultOption = { // zlevel: 0, z: 5, symbol: "pin", symbolSize: 50, // symbolRotate: 0, // symbolOffset: [0, 0] tooltip: { trigger: "item" }, label: { show: true, position: "inside" }, itemStyle: { borderWidth: 2 }, emphasis: { label: { show: true } } }; return MarkPointModel2; })(MarkerModel) ); function hasXOrY(item) { return !(isNaN(parseFloat(item.x)) && isNaN(parseFloat(item.y))); } function hasXAndY(item) { return !isNaN(parseFloat(item.x)) && !isNaN(parseFloat(item.y)); } function markerTypeCalculatorWithExtent(markerType, data, otherDataDim, targetDataDim, otherCoordIndex, targetCoordIndex) { var coordArr = []; var stacked = isDimensionStacked( data, targetDataDim /* , otherDataDim */ ); var calcDataDim = stacked ? data.getCalculationInfo("stackResultDimension") : targetDataDim; var value = numCalculate(data, calcDataDim, markerType); var dataIndex = data.indicesOfNearest(calcDataDim, value)[0]; coordArr[otherCoordIndex] = data.get(otherDataDim, dataIndex); coordArr[targetCoordIndex] = data.get(calcDataDim, dataIndex); var coordArrValue = data.get(targetDataDim, dataIndex); var precision = getPrecision(data.get(targetDataDim, dataIndex)); precision = Math.min(precision, 20); if (precision >= 0) { coordArr[targetCoordIndex] = +coordArr[targetCoordIndex].toFixed(precision); } return [coordArr, coordArrValue]; } var markerTypeCalculator = { min: curry$1(markerTypeCalculatorWithExtent, "min"), max: curry$1(markerTypeCalculatorWithExtent, "max"), average: curry$1(markerTypeCalculatorWithExtent, "average"), median: curry$1(markerTypeCalculatorWithExtent, "median") }; function dataTransform(seriesModel, item) { if (!item) { return; } var data = seriesModel.getData(); var coordSys = seriesModel.coordinateSystem; var dims = coordSys && coordSys.dimensions; if (!hasXAndY(item) && !isArray$1(item.coord) && isArray$1(dims)) { var axisInfo = getAxisInfo(item, data, coordSys, seriesModel); item = clone$1(item); if (item.type && markerTypeCalculator[item.type] && axisInfo.baseAxis && axisInfo.valueAxis) { var otherCoordIndex = indexOf(dims, axisInfo.baseAxis.dim); var targetCoordIndex = indexOf(dims, axisInfo.valueAxis.dim); var coordInfo = markerTypeCalculator[item.type](data, axisInfo.baseDataDim, axisInfo.valueDataDim, otherCoordIndex, targetCoordIndex); item.coord = coordInfo[0]; item.value = coordInfo[1]; } else { item.coord = [item.xAxis != null ? item.xAxis : item.radiusAxis, item.yAxis != null ? item.yAxis : item.angleAxis]; } } if (item.coord == null || !isArray$1(dims)) { item.coord = []; } else { var coord = item.coord; for (var i = 0; i < 2; i++) { if (markerTypeCalculator[coord[i]]) { coord[i] = numCalculate(data, data.mapDimension(dims[i]), coord[i]); } } } return item; } function getAxisInfo(item, data, coordSys, seriesModel) { var ret = {}; if (item.valueIndex != null || item.valueDim != null) { ret.valueDataDim = item.valueIndex != null ? data.getDimension(item.valueIndex) : item.valueDim; ret.valueAxis = coordSys.getAxis(dataDimToCoordDim(seriesModel, ret.valueDataDim)); ret.baseAxis = coordSys.getOtherAxis(ret.valueAxis); ret.baseDataDim = data.mapDimension(ret.baseAxis.dim); } else { ret.baseAxis = seriesModel.getBaseAxis(); ret.valueAxis = coordSys.getOtherAxis(ret.baseAxis); ret.baseDataDim = data.mapDimension(ret.baseAxis.dim); ret.valueDataDim = data.mapDimension(ret.valueAxis.dim); } return ret; } function dataDimToCoordDim(seriesModel, dataDim) { var dimItem = seriesModel.getData().getDimensionInfo(dataDim); return dimItem && dimItem.coordDim; } function dataFilter(coordSys, item) { return coordSys && coordSys.containData && item.coord && !hasXOrY(item) ? coordSys.containData(item.coord) : true; } function zoneFilter(coordSys, item1, item2) { return coordSys && coordSys.containZone && item1.coord && item2.coord && !hasXOrY(item1) && !hasXOrY(item2) ? coordSys.containZone(item1.coord, item2.coord) : true; } function createMarkerDimValueGetter(inCoordSys, dims) { return inCoordSys ? function(item, dimName, dataIndex, dimIndex) { var rawVal = dimIndex < 2 ? item.coord && item.coord[dimIndex] : item.value; return parseDataValue(rawVal, dims[dimIndex]); } : function(item, dimName, dataIndex, dimIndex) { return parseDataValue(item.value, dims[dimIndex]); }; } function numCalculate(data, valueDataDim, type) { if (type === "average") { var sum_1 = 0; var count_1 = 0; data.each(valueDataDim, function(val, idx) { if (!isNaN(val)) { sum_1 += val; count_1++; } }); return sum_1 / count_1; } else if (type === "median") { return data.getMedian(valueDataDim); } else { return data.getDataExtent(valueDataDim)[type === "max" ? 1 : 0]; } } var inner$4 = makeInner(); var MarkerView = ( /** @class */ (function(_super) { __extends(MarkerView2, _super); function MarkerView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = MarkerView2.type; return _this; } MarkerView2.prototype.init = function() { this.markerGroupMap = createHashMap(); }; MarkerView2.prototype.render = function(markerModel, ecModel, api) { var _this = this; var markerGroupMap = this.markerGroupMap; markerGroupMap.each(function(item) { inner$4(item).keep = false; }); ecModel.eachSeries(function(seriesModel) { var markerModel2 = MarkerModel.getMarkerModelFromSeries(seriesModel, _this.type); markerModel2 && _this.renderSeries(seriesModel, markerModel2, ecModel, api); }); markerGroupMap.each(function(item) { !inner$4(item).keep && _this.group.remove(item.group); }); }; MarkerView2.prototype.markKeep = function(drawGroup) { inner$4(drawGroup).keep = true; }; MarkerView2.prototype.toggleBlurSeries = function(seriesModelList, isBlur) { var _this = this; each$f(seriesModelList, function(seriesModel) { var markerModel = MarkerModel.getMarkerModelFromSeries(seriesModel, _this.type); if (markerModel) { var data = markerModel.getData(); data.eachItemGraphicEl(function(el) { if (el) { isBlur ? enterBlur(el) : leaveBlur(el); } }); } }); }; MarkerView2.type = "marker"; return MarkerView2; })(ComponentView) ); function updateMarkerLayout(mpData, seriesModel, api) { var coordSys = seriesModel.coordinateSystem; mpData.each(function(idx) { var itemModel = mpData.getItemModel(idx); var point; var xPx = parsePercent(itemModel.get("x"), api.getWidth()); var yPx = parsePercent(itemModel.get("y"), api.getHeight()); if (!isNaN(xPx) && !isNaN(yPx)) { point = [xPx, yPx]; } else if (seriesModel.getMarkerPosition) { point = seriesModel.getMarkerPosition(mpData.getValues(mpData.dimensions, idx)); } else if (coordSys) { var x = mpData.get(coordSys.dimensions[0], idx); var y = mpData.get(coordSys.dimensions[1], idx); point = coordSys.dataToPoint([x, y]); } if (!isNaN(xPx)) { point[0] = xPx; } if (!isNaN(yPx)) { point[1] = yPx; } mpData.setItemLayout(idx, point); }); } var MarkPointView = ( /** @class */ (function(_super) { __extends(MarkPointView2, _super); function MarkPointView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = MarkPointView2.type; return _this; } MarkPointView2.prototype.updateTransform = function(markPointModel, ecModel, api) { ecModel.eachSeries(function(seriesModel) { var mpModel = MarkerModel.getMarkerModelFromSeries(seriesModel, "markPoint"); if (mpModel) { updateMarkerLayout(mpModel.getData(), seriesModel, api); this.markerGroupMap.get(seriesModel.id).updateLayout(); } }, this); }; MarkPointView2.prototype.renderSeries = function(seriesModel, mpModel, ecModel, api) { var coordSys = seriesModel.coordinateSystem; var seriesId = seriesModel.id; var seriesData = seriesModel.getData(); var symbolDrawMap = this.markerGroupMap; var symbolDraw = symbolDrawMap.get(seriesId) || symbolDrawMap.set(seriesId, new SymbolDraw()); var mpData = createData(coordSys, seriesModel, mpModel); mpModel.setData(mpData); updateMarkerLayout(mpModel.getData(), seriesModel, api); mpData.each(function(idx) { var itemModel = mpData.getItemModel(idx); var symbol = itemModel.getShallow("symbol"); var symbolSize = itemModel.getShallow("symbolSize"); var symbolRotate = itemModel.getShallow("symbolRotate"); var symbolOffset = itemModel.getShallow("symbolOffset"); var symbolKeepAspect = itemModel.getShallow("symbolKeepAspect"); if (isFunction(symbol) || isFunction(symbolSize) || isFunction(symbolRotate) || isFunction(symbolOffset)) { var rawIdx = mpModel.getRawValue(idx); var dataParams = mpModel.getDataParams(idx); if (isFunction(symbol)) { symbol = symbol(rawIdx, dataParams); } if (isFunction(symbolSize)) { symbolSize = symbolSize(rawIdx, dataParams); } if (isFunction(symbolRotate)) { symbolRotate = symbolRotate(rawIdx, dataParams); } if (isFunction(symbolOffset)) { symbolOffset = symbolOffset(rawIdx, dataParams); } } var style = itemModel.getModel("itemStyle").getItemStyle(); var color = getVisualFromData(seriesData, "color"); if (!style.fill) { style.fill = color; } mpData.setItemVisual(idx, { symbol, symbolSize, symbolRotate, symbolOffset, symbolKeepAspect, style }); }); symbolDraw.updateData(mpData); this.group.add(symbolDraw.group); mpData.eachItemGraphicEl(function(el) { el.traverse(function(child) { getECData(child).dataModel = mpModel; }); }); this.markKeep(symbolDraw); symbolDraw.group.silent = mpModel.get("silent") || seriesModel.get("silent"); }; MarkPointView2.type = "markPoint"; return MarkPointView2; })(MarkerView) ); function createData(coordSys, seriesModel, mpModel) { var coordDimsInfos; if (coordSys) { coordDimsInfos = map$1(coordSys && coordSys.dimensions, function(coordDim) { var info = seriesModel.getData().getDimensionInfo(seriesModel.getData().mapDimension(coordDim)) || {}; return extend(extend({}, info), { name: coordDim, // DON'T use ordinalMeta to parse and collect ordinal. ordinalMeta: null }); }); } else { coordDimsInfos = [{ name: "value", type: "float" }]; } var mpData = new SeriesData(coordDimsInfos, mpModel); var dataOpt = map$1(mpModel.get("data"), curry$1(dataTransform, seriesModel)); if (coordSys) { dataOpt = filter(dataOpt, curry$1(dataFilter, coordSys)); } var dimValueGetter = createMarkerDimValueGetter(!!coordSys, coordDimsInfos); mpData.initData(dataOpt, null, dimValueGetter); return mpData; } function install$g(registers) { registers.registerComponentModel(MarkPointModel); registers.registerComponentView(MarkPointView); registers.registerPreprocessor(function(opt) { if (checkMarkerInSeries(opt.series, "markPoint")) { opt.markPoint = opt.markPoint || {}; } }); } var MarkLineModel = ( /** @class */ (function(_super) { __extends(MarkLineModel2, _super); function MarkLineModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = MarkLineModel2.type; return _this; } MarkLineModel2.prototype.createMarkerModelFromSeries = function(markerOpt, masterMarkerModel, ecModel) { return new MarkLineModel2(markerOpt, masterMarkerModel, ecModel); }; MarkLineModel2.type = "markLine"; MarkLineModel2.defaultOption = { // zlevel: 0, z: 5, symbol: ["circle", "arrow"], symbolSize: [8, 16], // symbolRotate: 0, symbolOffset: 0, precision: 2, tooltip: { trigger: "item" }, label: { show: true, position: "end", distance: 5 }, lineStyle: { type: "dashed" }, emphasis: { label: { show: true }, lineStyle: { width: 3 } }, animationEasing: "linear" }; return MarkLineModel2; })(MarkerModel) ); var inner$3 = makeInner(); var markLineTransform = function(seriesModel, coordSys, mlModel, item) { var data = seriesModel.getData(); var itemArray; if (!isArray$1(item)) { var mlType = item.type; if (mlType === "min" || mlType === "max" || mlType === "average" || mlType === "median" || item.xAxis != null || item.yAxis != null) { var valueAxis2 = void 0; var value = void 0; if (item.yAxis != null || item.xAxis != null) { valueAxis2 = coordSys.getAxis(item.yAxis != null ? "y" : "x"); value = retrieve(item.yAxis, item.xAxis); } else { var axisInfo = getAxisInfo(item, data, coordSys, seriesModel); valueAxis2 = axisInfo.valueAxis; var valueDataDim = getStackedDimension(data, axisInfo.valueDataDim); value = numCalculate(data, valueDataDim, mlType); } var valueIndex = valueAxis2.dim === "x" ? 0 : 1; var baseIndex = 1 - valueIndex; var mlFrom = clone$1(item); var mlTo = { coord: [] }; mlFrom.type = null; mlFrom.coord = []; mlFrom.coord[baseIndex] = -Infinity; mlTo.coord[baseIndex] = Infinity; var precision = mlModel.get("precision"); if (precision >= 0 && isNumber(value)) { value = +value.toFixed(Math.min(precision, 20)); } mlFrom.coord[valueIndex] = mlTo.coord[valueIndex] = value; itemArray = [mlFrom, mlTo, { type: mlType, valueIndex: item.valueIndex, // Force to use the value of calculated value. value }]; } else { itemArray = []; } } else { itemArray = item; } var normalizedItem = [dataTransform(seriesModel, itemArray[0]), dataTransform(seriesModel, itemArray[1]), extend({}, itemArray[2])]; normalizedItem[2].type = normalizedItem[2].type || null; merge(normalizedItem[2], normalizedItem[0]); merge(normalizedItem[2], normalizedItem[1]); return normalizedItem; }; function isInfinity$1(val) { return !isNaN(val) && !isFinite(val); } function ifMarkLineHasOnlyDim(dimIndex, fromCoord, toCoord, coordSys) { var otherDimIndex = 1 - dimIndex; var dimName = coordSys.dimensions[dimIndex]; return isInfinity$1(fromCoord[otherDimIndex]) && isInfinity$1(toCoord[otherDimIndex]) && fromCoord[dimIndex] === toCoord[dimIndex] && coordSys.getAxis(dimName).containData(fromCoord[dimIndex]); } function markLineFilter(coordSys, item) { if (coordSys.type === "cartesian2d") { var fromCoord = item[0].coord; var toCoord = item[1].coord; if (fromCoord && toCoord && (ifMarkLineHasOnlyDim(1, fromCoord, toCoord, coordSys) || ifMarkLineHasOnlyDim(0, fromCoord, toCoord, coordSys))) { return true; } } return dataFilter(coordSys, item[0]) && dataFilter(coordSys, item[1]); } function updateSingleMarkerEndLayout(data, idx, isFrom, seriesModel, api) { var coordSys = seriesModel.coordinateSystem; var itemModel = data.getItemModel(idx); var point; var xPx = parsePercent(itemModel.get("x"), api.getWidth()); var yPx = parsePercent(itemModel.get("y"), api.getHeight()); if (!isNaN(xPx) && !isNaN(yPx)) { point = [xPx, yPx]; } else { if (seriesModel.getMarkerPosition) { point = seriesModel.getMarkerPosition(data.getValues(data.dimensions, idx)); } else { var dims = coordSys.dimensions; var x = data.get(dims[0], idx); var y = data.get(dims[1], idx); point = coordSys.dataToPoint([x, y]); } if (isCoordinateSystemType(coordSys, "cartesian2d")) { var xAxis = coordSys.getAxis("x"); var yAxis = coordSys.getAxis("y"); var dims = coordSys.dimensions; if (isInfinity$1(data.get(dims[0], idx))) { point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[isFrom ? 0 : 1]); } else if (isInfinity$1(data.get(dims[1], idx))) { point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[isFrom ? 0 : 1]); } } if (!isNaN(xPx)) { point[0] = xPx; } if (!isNaN(yPx)) { point[1] = yPx; } } data.setItemLayout(idx, point); } var MarkLineView = ( /** @class */ (function(_super) { __extends(MarkLineView2, _super); function MarkLineView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = MarkLineView2.type; return _this; } MarkLineView2.prototype.updateTransform = function(markLineModel, ecModel, api) { ecModel.eachSeries(function(seriesModel) { var mlModel = MarkerModel.getMarkerModelFromSeries(seriesModel, "markLine"); if (mlModel) { var mlData_1 = mlModel.getData(); var fromData_1 = inner$3(mlModel).from; var toData_1 = inner$3(mlModel).to; fromData_1.each(function(idx) { updateSingleMarkerEndLayout(fromData_1, idx, true, seriesModel, api); updateSingleMarkerEndLayout(toData_1, idx, false, seriesModel, api); }); mlData_1.each(function(idx) { mlData_1.setItemLayout(idx, [fromData_1.getItemLayout(idx), toData_1.getItemLayout(idx)]); }); this.markerGroupMap.get(seriesModel.id).updateLayout(); } }, this); }; MarkLineView2.prototype.renderSeries = function(seriesModel, mlModel, ecModel, api) { var coordSys = seriesModel.coordinateSystem; var seriesId = seriesModel.id; var seriesData = seriesModel.getData(); var lineDrawMap = this.markerGroupMap; var lineDraw = lineDrawMap.get(seriesId) || lineDrawMap.set(seriesId, new LineDraw()); this.group.add(lineDraw.group); var mlData = createList$1(coordSys, seriesModel, mlModel); var fromData = mlData.from; var toData = mlData.to; var lineData = mlData.line; inner$3(mlModel).from = fromData; inner$3(mlModel).to = toData; mlModel.setData(lineData); var symbolType = mlModel.get("symbol"); var symbolSize = mlModel.get("symbolSize"); var symbolRotate = mlModel.get("symbolRotate"); var symbolOffset = mlModel.get("symbolOffset"); if (!isArray$1(symbolType)) { symbolType = [symbolType, symbolType]; } if (!isArray$1(symbolSize)) { symbolSize = [symbolSize, symbolSize]; } if (!isArray$1(symbolRotate)) { symbolRotate = [symbolRotate, symbolRotate]; } if (!isArray$1(symbolOffset)) { symbolOffset = [symbolOffset, symbolOffset]; } mlData.from.each(function(idx) { updateDataVisualAndLayout(fromData, idx, true); updateDataVisualAndLayout(toData, idx, false); }); lineData.each(function(idx) { var lineStyle = lineData.getItemModel(idx).getModel("lineStyle").getLineStyle(); lineData.setItemLayout(idx, [fromData.getItemLayout(idx), toData.getItemLayout(idx)]); if (lineStyle.stroke == null) { lineStyle.stroke = fromData.getItemVisual(idx, "style").fill; } lineData.setItemVisual(idx, { fromSymbolKeepAspect: fromData.getItemVisual(idx, "symbolKeepAspect"), fromSymbolOffset: fromData.getItemVisual(idx, "symbolOffset"), fromSymbolRotate: fromData.getItemVisual(idx, "symbolRotate"), fromSymbolSize: fromData.getItemVisual(idx, "symbolSize"), fromSymbol: fromData.getItemVisual(idx, "symbol"), toSymbolKeepAspect: toData.getItemVisual(idx, "symbolKeepAspect"), toSymbolOffset: toData.getItemVisual(idx, "symbolOffset"), toSymbolRotate: toData.getItemVisual(idx, "symbolRotate"), toSymbolSize: toData.getItemVisual(idx, "symbolSize"), toSymbol: toData.getItemVisual(idx, "symbol"), style: lineStyle }); }); lineDraw.updateData(lineData); mlData.line.eachItemGraphicEl(function(el) { getECData(el).dataModel = mlModel; el.traverse(function(child) { getECData(child).dataModel = mlModel; }); }); function updateDataVisualAndLayout(data, idx, isFrom) { var itemModel = data.getItemModel(idx); updateSingleMarkerEndLayout(data, idx, isFrom, seriesModel, api); var style = itemModel.getModel("itemStyle").getItemStyle(); if (style.fill == null) { style.fill = getVisualFromData(seriesData, "color"); } data.setItemVisual(idx, { symbolKeepAspect: itemModel.get("symbolKeepAspect"), // `0` should be considered as a valid value, so use `retrieve2` instead of `||` symbolOffset: retrieve2(itemModel.get("symbolOffset", true), symbolOffset[isFrom ? 0 : 1]), symbolRotate: retrieve2(itemModel.get("symbolRotate", true), symbolRotate[isFrom ? 0 : 1]), // TODO: when 2d array is supported, it should ignore parent symbolSize: retrieve2(itemModel.get("symbolSize"), symbolSize[isFrom ? 0 : 1]), symbol: retrieve2(itemModel.get("symbol", true), symbolType[isFrom ? 0 : 1]), style }); } this.markKeep(lineDraw); lineDraw.group.silent = mlModel.get("silent") || seriesModel.get("silent"); }; MarkLineView2.type = "markLine"; return MarkLineView2; })(MarkerView) ); function createList$1(coordSys, seriesModel, mlModel) { var coordDimsInfos; if (coordSys) { coordDimsInfos = map$1(coordSys && coordSys.dimensions, function(coordDim) { var info = seriesModel.getData().getDimensionInfo(seriesModel.getData().mapDimension(coordDim)) || {}; return extend(extend({}, info), { name: coordDim, // DON'T use ordinalMeta to parse and collect ordinal. ordinalMeta: null }); }); } else { coordDimsInfos = [{ name: "value", type: "float" }]; } var fromData = new SeriesData(coordDimsInfos, mlModel); var toData = new SeriesData(coordDimsInfos, mlModel); var lineData = new SeriesData([], mlModel); var optData = map$1(mlModel.get("data"), curry$1(markLineTransform, seriesModel, coordSys, mlModel)); if (coordSys) { optData = filter(optData, curry$1(markLineFilter, coordSys)); } var dimValueGetter = createMarkerDimValueGetter(!!coordSys, coordDimsInfos); fromData.initData(map$1(optData, function(item) { return item[0]; }), null, dimValueGetter); toData.initData(map$1(optData, function(item) { return item[1]; }), null, dimValueGetter); lineData.initData(map$1(optData, function(item) { return item[2]; })); lineData.hasItemOption = true; return { from: fromData, to: toData, line: lineData }; } function install$f(registers) { registers.registerComponentModel(MarkLineModel); registers.registerComponentView(MarkLineView); registers.registerPreprocessor(function(opt) { if (checkMarkerInSeries(opt.series, "markLine")) { opt.markLine = opt.markLine || {}; } }); } var MarkAreaModel = ( /** @class */ (function(_super) { __extends(MarkAreaModel2, _super); function MarkAreaModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = MarkAreaModel2.type; return _this; } MarkAreaModel2.prototype.createMarkerModelFromSeries = function(markerOpt, masterMarkerModel, ecModel) { return new MarkAreaModel2(markerOpt, masterMarkerModel, ecModel); }; MarkAreaModel2.type = "markArea"; MarkAreaModel2.defaultOption = { // zlevel: 0, // PENDING z: 1, tooltip: { trigger: "item" }, // markArea should fixed on the coordinate system animation: false, label: { show: true, position: "top" }, itemStyle: { // color and borderColor default to use color from series // color: 'auto' // borderColor: 'auto' borderWidth: 0 }, emphasis: { label: { show: true, position: "top" } } }; return MarkAreaModel2; })(MarkerModel) ); var inner$2 = makeInner(); var markAreaTransform = function(seriesModel, coordSys, maModel, item) { var item0 = item[0]; var item1 = item[1]; if (!item0 || !item1) { return; } var lt = dataTransform(seriesModel, item0); var rb = dataTransform(seriesModel, item1); var ltCoord = lt.coord; var rbCoord = rb.coord; ltCoord[0] = retrieve(ltCoord[0], -Infinity); ltCoord[1] = retrieve(ltCoord[1], -Infinity); rbCoord[0] = retrieve(rbCoord[0], Infinity); rbCoord[1] = retrieve(rbCoord[1], Infinity); var result = mergeAll([{}, lt, rb]); result.coord = [lt.coord, rb.coord]; result.x0 = lt.x; result.y0 = lt.y; result.x1 = rb.x; result.y1 = rb.y; return result; }; function isInfinity(val) { return !isNaN(val) && !isFinite(val); } function ifMarkAreaHasOnlyDim(dimIndex, fromCoord, toCoord, coordSys) { var otherDimIndex = 1 - dimIndex; return isInfinity(fromCoord[otherDimIndex]) && isInfinity(toCoord[otherDimIndex]); } function markAreaFilter(coordSys, item) { var fromCoord = item.coord[0]; var toCoord = item.coord[1]; var item0 = { coord: fromCoord, x: item.x0, y: item.y0 }; var item1 = { coord: toCoord, x: item.x1, y: item.y1 }; if (isCoordinateSystemType(coordSys, "cartesian2d")) { if (fromCoord && toCoord && (ifMarkAreaHasOnlyDim(1, fromCoord, toCoord) || ifMarkAreaHasOnlyDim(0, fromCoord, toCoord))) { return true; } return zoneFilter(coordSys, item0, item1); } return dataFilter(coordSys, item0) || dataFilter(coordSys, item1); } function getSingleMarkerEndPoint(data, idx, dims, seriesModel, api) { var coordSys = seriesModel.coordinateSystem; var itemModel = data.getItemModel(idx); var point; var xPx = parsePercent(itemModel.get(dims[0]), api.getWidth()); var yPx = parsePercent(itemModel.get(dims[1]), api.getHeight()); if (!isNaN(xPx) && !isNaN(yPx)) { point = [xPx, yPx]; } else { if (seriesModel.getMarkerPosition) { var pointValue0 = data.getValues(["x0", "y0"], idx); var pointValue1 = data.getValues(["x1", "y1"], idx); var clampPointValue0 = coordSys.clampData(pointValue0); var clampPointValue1 = coordSys.clampData(pointValue1); var pointValue = []; if (dims[0] === "x0") { pointValue[0] = clampPointValue0[0] > clampPointValue1[0] ? pointValue1[0] : pointValue0[0]; } else { pointValue[0] = clampPointValue0[0] > clampPointValue1[0] ? pointValue0[0] : pointValue1[0]; } if (dims[1] === "y0") { pointValue[1] = clampPointValue0[1] > clampPointValue1[1] ? pointValue1[1] : pointValue0[1]; } else { pointValue[1] = clampPointValue0[1] > clampPointValue1[1] ? pointValue0[1] : pointValue1[1]; } point = seriesModel.getMarkerPosition(pointValue, dims, true); } else { var x = data.get(dims[0], idx); var y = data.get(dims[1], idx); var pt = [x, y]; coordSys.clampData && coordSys.clampData(pt, pt); point = coordSys.dataToPoint(pt, true); } if (isCoordinateSystemType(coordSys, "cartesian2d")) { var xAxis = coordSys.getAxis("x"); var yAxis = coordSys.getAxis("y"); var x = data.get(dims[0], idx); var y = data.get(dims[1], idx); if (isInfinity(x)) { point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[dims[0] === "x0" ? 0 : 1]); } else if (isInfinity(y)) { point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[dims[1] === "y0" ? 0 : 1]); } } if (!isNaN(xPx)) { point[0] = xPx; } if (!isNaN(yPx)) { point[1] = yPx; } } return point; } var dimPermutations = [["x0", "y0"], ["x1", "y0"], ["x1", "y1"], ["x0", "y1"]]; var MarkAreaView = ( /** @class */ (function(_super) { __extends(MarkAreaView2, _super); function MarkAreaView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = MarkAreaView2.type; return _this; } MarkAreaView2.prototype.updateTransform = function(markAreaModel, ecModel, api) { ecModel.eachSeries(function(seriesModel) { var maModel = MarkerModel.getMarkerModelFromSeries(seriesModel, "markArea"); if (maModel) { var areaData_1 = maModel.getData(); areaData_1.each(function(idx) { var points2 = map$1(dimPermutations, function(dim) { return getSingleMarkerEndPoint(areaData_1, idx, dim, seriesModel, api); }); areaData_1.setItemLayout(idx, points2); var el = areaData_1.getItemGraphicEl(idx); el.setShape("points", points2); }); } }, this); }; MarkAreaView2.prototype.renderSeries = function(seriesModel, maModel, ecModel, api) { var coordSys = seriesModel.coordinateSystem; var seriesId = seriesModel.id; var seriesData = seriesModel.getData(); var areaGroupMap = this.markerGroupMap; var polygonGroup = areaGroupMap.get(seriesId) || areaGroupMap.set(seriesId, { group: new Group$3() }); this.group.add(polygonGroup.group); this.markKeep(polygonGroup); var areaData = createList(coordSys, seriesModel, maModel); maModel.setData(areaData); areaData.each(function(idx) { var points2 = map$1(dimPermutations, function(dim) { return getSingleMarkerEndPoint(areaData, idx, dim, seriesModel, api); }); var xAxisScale = coordSys.getAxis("x").scale; var yAxisScale = coordSys.getAxis("y").scale; var xAxisExtent = xAxisScale.getExtent(); var yAxisExtent = yAxisScale.getExtent(); var xPointExtent = [xAxisScale.parse(areaData.get("x0", idx)), xAxisScale.parse(areaData.get("x1", idx))]; var yPointExtent = [yAxisScale.parse(areaData.get("y0", idx)), yAxisScale.parse(areaData.get("y1", idx))]; asc$2(xPointExtent); asc$2(yPointExtent); var overlapped = !(xAxisExtent[0] > xPointExtent[1] || xAxisExtent[1] < xPointExtent[0] || yAxisExtent[0] > yPointExtent[1] || yAxisExtent[1] < yPointExtent[0]); var allClipped = !overlapped; areaData.setItemLayout(idx, { points: points2, allClipped }); var style = areaData.getItemModel(idx).getModel("itemStyle").getItemStyle(); var color = getVisualFromData(seriesData, "color"); if (!style.fill) { style.fill = color; if (isString(style.fill)) { style.fill = modifyAlpha(style.fill, 0.4); } } if (!style.stroke) { style.stroke = color; } areaData.setItemVisual(idx, "style", style); }); areaData.diff(inner$2(polygonGroup).data).add(function(idx) { var layout2 = areaData.getItemLayout(idx); if (!layout2.allClipped) { var polygon = new Polygon({ shape: { points: layout2.points } }); areaData.setItemGraphicEl(idx, polygon); polygonGroup.group.add(polygon); } }).update(function(newIdx, oldIdx) { var polygon = inner$2(polygonGroup).data.getItemGraphicEl(oldIdx); var layout2 = areaData.getItemLayout(newIdx); if (!layout2.allClipped) { if (polygon) { updateProps$1(polygon, { shape: { points: layout2.points } }, maModel, newIdx); } else { polygon = new Polygon({ shape: { points: layout2.points } }); } areaData.setItemGraphicEl(newIdx, polygon); polygonGroup.group.add(polygon); } else if (polygon) { polygonGroup.group.remove(polygon); } }).remove(function(idx) { var polygon = inner$2(polygonGroup).data.getItemGraphicEl(idx); polygonGroup.group.remove(polygon); }).execute(); areaData.eachItemGraphicEl(function(polygon, idx) { var itemModel = areaData.getItemModel(idx); var style = areaData.getItemVisual(idx, "style"); polygon.useStyle(areaData.getItemVisual(idx, "style")); setLabelStyle(polygon, getLabelStatesModels(itemModel), { labelFetcher: maModel, labelDataIndex: idx, defaultText: areaData.getName(idx) || "", inheritColor: isString(style.fill) ? modifyAlpha(style.fill, 1) : "#000" }); setStatesStylesFromModel(polygon, itemModel); toggleHoverEmphasis(polygon, null, null, itemModel.get(["emphasis", "disabled"])); getECData(polygon).dataModel = maModel; }); inner$2(polygonGroup).data = areaData; polygonGroup.group.silent = maModel.get("silent") || seriesModel.get("silent"); }; MarkAreaView2.type = "markArea"; return MarkAreaView2; })(MarkerView) ); function createList(coordSys, seriesModel, maModel) { var areaData; var dataDims; var dims = ["x0", "y0", "x1", "y1"]; if (coordSys) { var coordDimsInfos_1 = map$1(coordSys && coordSys.dimensions, function(coordDim) { var data = seriesModel.getData(); var info = data.getDimensionInfo(data.mapDimension(coordDim)) || {}; return extend(extend({}, info), { name: coordDim, // DON'T use ordinalMeta to parse and collect ordinal. ordinalMeta: null }); }); dataDims = map$1(dims, function(dim, idx) { return { name: dim, type: coordDimsInfos_1[idx % 2].type }; }); areaData = new SeriesData(dataDims, maModel); } else { dataDims = [{ name: "value", type: "float" }]; areaData = new SeriesData(dataDims, maModel); } var optData = map$1(maModel.get("data"), curry$1(markAreaTransform, seriesModel, coordSys, maModel)); if (coordSys) { optData = filter(optData, curry$1(markAreaFilter, coordSys)); } var dimValueGetter = coordSys ? function(item, dimName, dataIndex, dimIndex) { var rawVal = item.coord[Math.floor(dimIndex / 2)][dimIndex % 2]; return parseDataValue(rawVal, dataDims[dimIndex]); } : function(item, dimName, dataIndex, dimIndex) { return parseDataValue(item.value, dataDims[dimIndex]); }; areaData.initData(optData, null, dimValueGetter); areaData.hasItemOption = true; return areaData; } function install$e(registers) { registers.registerComponentModel(MarkAreaModel); registers.registerComponentView(MarkAreaView); registers.registerPreprocessor(function(opt) { if (checkMarkerInSeries(opt.series, "markArea")) { opt.markArea = opt.markArea || {}; } }); } var getDefaultSelectorOptions = function(ecModel, type) { if (type === "all") { return { type: "all", title: ecModel.getLocaleModel().get(["legend", "selector", "all"]) }; } else if (type === "inverse") { return { type: "inverse", title: ecModel.getLocaleModel().get(["legend", "selector", "inverse"]) }; } }; var LegendModel = ( /** @class */ (function(_super) { __extends(LegendModel2, _super); function LegendModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = LegendModel2.type; _this.layoutMode = { type: "box", // legend.width/height are maxWidth/maxHeight actually, // whereas real width/height is calculated by its content. // (Setting {left: 10, right: 10} does not make sense). // So consider the case: // `setOption({legend: {left: 10});` // then `setOption({legend: {right: 10});` // The previous `left` should be cleared by setting `ignoreSize`. ignoreSize: true }; return _this; } LegendModel2.prototype.init = function(option, parentModel, ecModel) { this.mergeDefaultAndTheme(option, ecModel); option.selected = option.selected || {}; this._updateSelector(option); }; LegendModel2.prototype.mergeOption = function(option, ecModel) { _super.prototype.mergeOption.call(this, option, ecModel); this._updateSelector(option); }; LegendModel2.prototype._updateSelector = function(option) { var selector2 = option.selector; var ecModel = this.ecModel; if (selector2 === true) { selector2 = option.selector = ["all", "inverse"]; } if (isArray$1(selector2)) { each$f(selector2, function(item, index) { isString(item) && (item = { type: item }); selector2[index] = merge(item, getDefaultSelectorOptions(ecModel, item.type)); }); } }; LegendModel2.prototype.optionUpdated = function() { this._updateData(this.ecModel); var legendData = this._data; if (legendData[0] && this.get("selectedMode") === "single") { var hasSelected = false; for (var i = 0; i < legendData.length; i++) { var name_1 = legendData[i].get("name"); if (this.isSelected(name_1)) { this.select(name_1); hasSelected = true; break; } } !hasSelected && this.select(legendData[0].get("name")); } }; LegendModel2.prototype._updateData = function(ecModel) { var potentialData = []; var availableNames = []; ecModel.eachRawSeries(function(seriesModel) { var seriesName = seriesModel.name; availableNames.push(seriesName); var isPotential; if (seriesModel.legendVisualProvider) { var provider = seriesModel.legendVisualProvider; var names = provider.getAllNames(); if (!ecModel.isSeriesFiltered(seriesModel)) { availableNames = availableNames.concat(names); } if (names.length) { potentialData = potentialData.concat(names); } else { isPotential = true; } } else { isPotential = true; } if (isPotential && isNameSpecified(seriesModel)) { potentialData.push(seriesModel.name); } }); this._availableNames = availableNames; var rawData = this.get("data") || potentialData; var legendNameMap = createHashMap(); var legendData = map$1(rawData, function(dataItem) { if (isString(dataItem) || isNumber(dataItem)) { dataItem = { name: dataItem }; } if (legendNameMap.get(dataItem.name)) { return null; } legendNameMap.set(dataItem.name, true); return new Model(dataItem, this, this.ecModel); }, this); this._data = filter(legendData, function(item) { return !!item; }); }; LegendModel2.prototype.getData = function() { return this._data; }; LegendModel2.prototype.select = function(name) { var selected = this.option.selected; var selectedMode = this.get("selectedMode"); if (selectedMode === "single") { var data = this._data; each$f(data, function(dataItem) { selected[dataItem.get("name")] = false; }); } selected[name] = true; }; LegendModel2.prototype.unSelect = function(name) { if (this.get("selectedMode") !== "single") { this.option.selected[name] = false; } }; LegendModel2.prototype.toggleSelected = function(name) { var selected = this.option.selected; if (!selected.hasOwnProperty(name)) { selected[name] = true; } this[selected[name] ? "unSelect" : "select"](name); }; LegendModel2.prototype.allSelect = function() { var data = this._data; var selected = this.option.selected; each$f(data, function(dataItem) { selected[dataItem.get("name", true)] = true; }); }; LegendModel2.prototype.inverseSelect = function() { var data = this._data; var selected = this.option.selected; each$f(data, function(dataItem) { var name = dataItem.get("name", true); if (!selected.hasOwnProperty(name)) { selected[name] = true; } selected[name] = !selected[name]; }); }; LegendModel2.prototype.isSelected = function(name) { var selected = this.option.selected; return !(selected.hasOwnProperty(name) && !selected[name]) && indexOf(this._availableNames, name) >= 0; }; LegendModel2.prototype.getOrient = function() { return this.get("orient") === "vertical" ? { index: 1, name: "vertical" } : { index: 0, name: "horizontal" }; }; LegendModel2.type = "legend.plain"; LegendModel2.dependencies = ["series"]; LegendModel2.defaultOption = { // zlevel: 0, z: 4, show: true, orient: "horizontal", left: "center", // right: 'center', top: 0, // bottom: null, align: "auto", backgroundColor: "rgba(0,0,0,0)", borderColor: "#ccc", borderRadius: 0, borderWidth: 0, padding: 5, itemGap: 10, itemWidth: 25, itemHeight: 14, symbolRotate: "inherit", symbolKeepAspect: true, inactiveColor: "#ccc", inactiveBorderColor: "#ccc", inactiveBorderWidth: "auto", itemStyle: { color: "inherit", opacity: "inherit", borderColor: "inherit", borderWidth: "auto", borderCap: "inherit", borderJoin: "inherit", borderDashOffset: "inherit", borderMiterLimit: "inherit" }, lineStyle: { width: "auto", color: "inherit", inactiveColor: "#ccc", inactiveWidth: 2, opacity: "inherit", type: "inherit", cap: "inherit", join: "inherit", dashOffset: "inherit", miterLimit: "inherit" }, textStyle: { color: "#333" }, selectedMode: true, selector: false, selectorLabel: { show: true, borderRadius: 10, padding: [3, 5, 3, 5], fontSize: 12, fontFamily: "sans-serif", color: "#666", borderWidth: 1, borderColor: "#666" }, emphasis: { selectorLabel: { show: true, color: "#eee", backgroundColor: "#666" } }, selectorPosition: "auto", selectorItemGap: 7, selectorButtonGap: 10, tooltip: { show: false } }; return LegendModel2; })(ComponentModel) ); var curry = curry$1; var each$3 = each$f; var Group$1 = Group$3; var LegendView = ( /** @class */ (function(_super) { __extends(LegendView2, _super); function LegendView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = LegendView2.type; _this.newlineDisabled = false; return _this; } LegendView2.prototype.init = function() { this.group.add(this._contentGroup = new Group$1()); this.group.add(this._selectorGroup = new Group$1()); this._isFirstRender = true; }; LegendView2.prototype.getContentGroup = function() { return this._contentGroup; }; LegendView2.prototype.getSelectorGroup = function() { return this._selectorGroup; }; LegendView2.prototype.render = function(legendModel, ecModel, api) { var isFirstRender = this._isFirstRender; this._isFirstRender = false; this.resetInner(); if (!legendModel.get("show", true)) { return; } var itemAlign = legendModel.get("align"); var orient = legendModel.get("orient"); if (!itemAlign || itemAlign === "auto") { itemAlign = legendModel.get("left") === "right" && orient === "vertical" ? "right" : "left"; } var selector2 = legendModel.get("selector", true); var selectorPosition = legendModel.get("selectorPosition", true); if (selector2 && (!selectorPosition || selectorPosition === "auto")) { selectorPosition = orient === "horizontal" ? "end" : "start"; } this.renderInner(itemAlign, legendModel, ecModel, api, selector2, orient, selectorPosition); var positionInfo = legendModel.getBoxLayoutParams(); var viewportSize = { width: api.getWidth(), height: api.getHeight() }; var padding = legendModel.get("padding"); var maxSize = getLayoutRect(positionInfo, viewportSize, padding); var mainRect = this.layoutInner(legendModel, itemAlign, maxSize, isFirstRender, selector2, selectorPosition); var layoutRect = getLayoutRect(defaults({ width: mainRect.width, height: mainRect.height }, positionInfo), viewportSize, padding); this.group.x = layoutRect.x - mainRect.x; this.group.y = layoutRect.y - mainRect.y; this.group.markRedraw(); this.group.add(this._backgroundEl = makeBackground(mainRect, legendModel)); }; LegendView2.prototype.resetInner = function() { this.getContentGroup().removeAll(); this._backgroundEl && this.group.remove(this._backgroundEl); this.getSelectorGroup().removeAll(); }; LegendView2.prototype.renderInner = function(itemAlign, legendModel, ecModel, api, selector2, orient, selectorPosition) { var contentGroup = this.getContentGroup(); var legendDrawnMap = createHashMap(); var selectMode = legendModel.get("selectedMode"); var excludeSeriesId = []; ecModel.eachRawSeries(function(seriesModel) { !seriesModel.get("legendHoverLink") && excludeSeriesId.push(seriesModel.id); }); each$3(legendModel.getData(), function(legendItemModel, dataIndex) { var name = legendItemModel.get("name"); if (!this.newlineDisabled && (name === "" || name === "\n")) { var g = new Group$1(); g.newline = true; contentGroup.add(g); return; } var seriesModel = ecModel.getSeriesByName(name)[0]; if (legendDrawnMap.get(name)) { return; } if (seriesModel) { var data = seriesModel.getData(); var lineVisualStyle = data.getVisual("legendLineStyle") || {}; var legendIcon = data.getVisual("legendIcon"); var style = data.getVisual("style"); var itemGroup = this._createItem(seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, lineVisualStyle, style, legendIcon, selectMode, api); itemGroup.on("click", curry(dispatchSelectAction, name, null, api, excludeSeriesId)).on("mouseover", curry(dispatchHighlightAction, seriesModel.name, null, api, excludeSeriesId)).on("mouseout", curry(dispatchDownplayAction, seriesModel.name, null, api, excludeSeriesId)); if (ecModel.ssr) { itemGroup.eachChild(function(child) { var ecData = getECData(child); ecData.seriesIndex = seriesModel.seriesIndex; ecData.dataIndex = dataIndex; ecData.ssrType = "legend"; }); } legendDrawnMap.set(name, true); } else { ecModel.eachRawSeries(function(seriesModel2) { if (legendDrawnMap.get(name)) { return; } if (seriesModel2.legendVisualProvider) { var provider = seriesModel2.legendVisualProvider; if (!provider.containName(name)) { return; } var idx = provider.indexOfName(name); var style2 = provider.getItemVisual(idx, "style"); var legendIcon2 = provider.getItemVisual(idx, "legendIcon"); var colorArr = parse(style2.fill); if (colorArr && colorArr[3] === 0) { colorArr[3] = 0.2; style2 = extend(extend({}, style2), { fill: stringify(colorArr, "rgba") }); } var itemGroup2 = this._createItem(seriesModel2, name, dataIndex, legendItemModel, legendModel, itemAlign, {}, style2, legendIcon2, selectMode, api); itemGroup2.on("click", curry(dispatchSelectAction, null, name, api, excludeSeriesId)).on("mouseover", curry(dispatchHighlightAction, null, name, api, excludeSeriesId)).on("mouseout", curry(dispatchDownplayAction, null, name, api, excludeSeriesId)); if (ecModel.ssr) { itemGroup2.eachChild(function(child) { var ecData = getECData(child); ecData.seriesIndex = seriesModel2.seriesIndex; ecData.dataIndex = dataIndex; ecData.ssrType = "legend"; }); } legendDrawnMap.set(name, true); } }, this); } }, this); if (selector2) { this._createSelector(selector2, legendModel, api, orient, selectorPosition); } }; LegendView2.prototype._createSelector = function(selector2, legendModel, api, orient, selectorPosition) { var selectorGroup = this.getSelectorGroup(); each$3(selector2, function createSelectorButton(selectorItem) { var type = selectorItem.type; var labelText = new ZRText({ style: { x: 0, y: 0, align: "center", verticalAlign: "middle" }, onclick: function() { api.dispatchAction({ type: type === "all" ? "legendAllSelect" : "legendInverseSelect", legendId: legendModel.id }); } }); selectorGroup.add(labelText); var labelModel = legendModel.getModel("selectorLabel"); var emphasisLabelModel = legendModel.getModel(["emphasis", "selectorLabel"]); setLabelStyle(labelText, { normal: labelModel, emphasis: emphasisLabelModel }, { defaultText: selectorItem.title }); enableHoverEmphasis(labelText); }); }; LegendView2.prototype._createItem = function(seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, lineVisualStyle, itemVisualStyle, legendIcon, selectMode, api) { var drawType = seriesModel.visualDrawType; var itemWidth = legendModel.get("itemWidth"); var itemHeight = legendModel.get("itemHeight"); var isSelected = legendModel.isSelected(name); var iconRotate = legendItemModel.get("symbolRotate"); var symbolKeepAspect = legendItemModel.get("symbolKeepAspect"); var legendIconType = legendItemModel.get("icon"); legendIcon = legendIconType || legendIcon || "roundRect"; var style = getLegendStyle(legendIcon, legendItemModel, lineVisualStyle, itemVisualStyle, drawType, isSelected, api); var itemGroup = new Group$1(); var textStyleModel = legendItemModel.getModel("textStyle"); if (isFunction(seriesModel.getLegendIcon) && (!legendIconType || legendIconType === "inherit")) { itemGroup.add(seriesModel.getLegendIcon({ itemWidth, itemHeight, icon: legendIcon, iconRotate, itemStyle: style.itemStyle, lineStyle: style.lineStyle, symbolKeepAspect })); } else { var rotate2 = legendIconType === "inherit" && seriesModel.getData().getVisual("symbol") ? iconRotate === "inherit" ? seriesModel.getData().getVisual("symbolRotate") : iconRotate : 0; itemGroup.add(getDefaultLegendIcon({ itemWidth, itemHeight, icon: legendIcon, iconRotate: rotate2, itemStyle: style.itemStyle, symbolKeepAspect })); } var textX = itemAlign === "left" ? itemWidth + 5 : -5; var textAlign = itemAlign; var formatter = legendModel.get("formatter"); var content = name; if (isString(formatter) && formatter) { content = formatter.replace("{name}", name != null ? name : ""); } else if (isFunction(formatter)) { content = formatter(name); } var textColor = isSelected ? textStyleModel.getTextColor() : legendItemModel.get("inactiveColor"); itemGroup.add(new ZRText({ style: createTextStyle(textStyleModel, { text: content, x: textX, y: itemHeight / 2, fill: textColor, align: textAlign, verticalAlign: "middle" }, { inheritColor: textColor }) })); var hitRect = new Rect$2({ shape: itemGroup.getBoundingRect(), style: { // Cannot use 'invisible' because SVG SSR will miss the node fill: "transparent" } }); var tooltipModel = legendItemModel.getModel("tooltip"); if (tooltipModel.get("show")) { setTooltipConfig({ el: hitRect, componentModel: legendModel, itemName: name, itemTooltipOption: tooltipModel.option }); } itemGroup.add(hitRect); itemGroup.eachChild(function(child) { child.silent = true; }); hitRect.silent = !selectMode; this.getContentGroup().add(itemGroup); enableHoverEmphasis(itemGroup); itemGroup.__legendDataIndex = dataIndex; return itemGroup; }; LegendView2.prototype.layoutInner = function(legendModel, itemAlign, maxSize, isFirstRender, selector2, selectorPosition) { var contentGroup = this.getContentGroup(); var selectorGroup = this.getSelectorGroup(); box(legendModel.get("orient"), contentGroup, legendModel.get("itemGap"), maxSize.width, maxSize.height); var contentRect = contentGroup.getBoundingRect(); var contentPos = [-contentRect.x, -contentRect.y]; selectorGroup.markRedraw(); contentGroup.markRedraw(); if (selector2) { box( // Buttons in selectorGroup always layout horizontally "horizontal", selectorGroup, legendModel.get("selectorItemGap", true) ); var selectorRect = selectorGroup.getBoundingRect(); var selectorPos = [-selectorRect.x, -selectorRect.y]; var selectorButtonGap = legendModel.get("selectorButtonGap", true); var orientIdx = legendModel.getOrient().index; var wh = orientIdx === 0 ? "width" : "height"; var hw = orientIdx === 0 ? "height" : "width"; var yx = orientIdx === 0 ? "y" : "x"; if (selectorPosition === "end") { selectorPos[orientIdx] += contentRect[wh] + selectorButtonGap; } else { contentPos[orientIdx] += selectorRect[wh] + selectorButtonGap; } selectorPos[1 - orientIdx] += contentRect[hw] / 2 - selectorRect[hw] / 2; selectorGroup.x = selectorPos[0]; selectorGroup.y = selectorPos[1]; contentGroup.x = contentPos[0]; contentGroup.y = contentPos[1]; var mainRect = { x: 0, y: 0 }; mainRect[wh] = contentRect[wh] + selectorButtonGap + selectorRect[wh]; mainRect[hw] = Math.max(contentRect[hw], selectorRect[hw]); mainRect[yx] = Math.min(0, selectorRect[yx] + selectorPos[1 - orientIdx]); return mainRect; } else { contentGroup.x = contentPos[0]; contentGroup.y = contentPos[1]; return this.group.getBoundingRect(); } }; LegendView2.prototype.remove = function() { this.getContentGroup().removeAll(); this._isFirstRender = true; }; LegendView2.type = "legend.plain"; return LegendView2; })(ComponentView) ); function getLegendStyle(iconType, legendItemModel, lineVisualStyle, itemVisualStyle, drawType, isSelected, api) { function handleCommonProps(style, visualStyle) { if (style.lineWidth === "auto") { style.lineWidth = visualStyle.lineWidth > 0 ? 2 : 0; } each$3(style, function(propVal, propName) { style[propName] === "inherit" && (style[propName] = visualStyle[propName]); }); } var itemStyleModel = legendItemModel.getModel("itemStyle"); var itemStyle = itemStyleModel.getItemStyle(); var iconBrushType = iconType.lastIndexOf("empty", 0) === 0 ? "fill" : "stroke"; var decalStyle = itemStyleModel.getShallow("decal"); itemStyle.decal = !decalStyle || decalStyle === "inherit" ? itemVisualStyle.decal : createOrUpdatePatternFromDecal(decalStyle, api); if (itemStyle.fill === "inherit") { itemStyle.fill = itemVisualStyle[drawType]; } if (itemStyle.stroke === "inherit") { itemStyle.stroke = itemVisualStyle[iconBrushType]; } if (itemStyle.opacity === "inherit") { itemStyle.opacity = (drawType === "fill" ? itemVisualStyle : lineVisualStyle).opacity; } handleCommonProps(itemStyle, itemVisualStyle); var legendLineModel = legendItemModel.getModel("lineStyle"); var lineStyle = legendLineModel.getLineStyle(); handleCommonProps(lineStyle, lineVisualStyle); itemStyle.fill === "auto" && (itemStyle.fill = itemVisualStyle.fill); itemStyle.stroke === "auto" && (itemStyle.stroke = itemVisualStyle.fill); lineStyle.stroke === "auto" && (lineStyle.stroke = itemVisualStyle.fill); if (!isSelected) { var borderWidth = legendItemModel.get("inactiveBorderWidth"); var visualHasBorder = itemStyle[iconBrushType]; itemStyle.lineWidth = borderWidth === "auto" ? itemVisualStyle.lineWidth > 0 && visualHasBorder ? 2 : 0 : itemStyle.lineWidth; itemStyle.fill = legendItemModel.get("inactiveColor"); itemStyle.stroke = legendItemModel.get("inactiveBorderColor"); lineStyle.stroke = legendLineModel.get("inactiveColor"); lineStyle.lineWidth = legendLineModel.get("inactiveWidth"); } return { itemStyle, lineStyle }; } function getDefaultLegendIcon(opt) { var symboType = opt.icon || "roundRect"; var icon = createSymbol$1(symboType, 0, 0, opt.itemWidth, opt.itemHeight, opt.itemStyle.fill, opt.symbolKeepAspect); icon.setStyle(opt.itemStyle); icon.rotation = (opt.iconRotate || 0) * Math.PI / 180; icon.setOrigin([opt.itemWidth / 2, opt.itemHeight / 2]); if (symboType.indexOf("empty") > -1) { icon.style.stroke = icon.style.fill; icon.style.fill = "#fff"; icon.style.lineWidth = 2; } return icon; } function dispatchSelectAction(seriesName, dataName, api, excludeSeriesId) { dispatchDownplayAction(seriesName, dataName, api, excludeSeriesId); api.dispatchAction({ type: "legendToggleSelect", name: seriesName != null ? seriesName : dataName }); dispatchHighlightAction(seriesName, dataName, api, excludeSeriesId); } function isUseHoverLayer(api) { var list = api.getZr().storage.getDisplayList(); var emphasisState; var i = 0; var len2 = list.length; while (i < len2 && !(emphasisState = list[i].states.emphasis)) { i++; } return emphasisState && emphasisState.hoverLayer; } function dispatchHighlightAction(seriesName, dataName, api, excludeSeriesId) { if (!isUseHoverLayer(api)) { api.dispatchAction({ type: "highlight", seriesName, name: dataName, excludeSeriesId }); } } function dispatchDownplayAction(seriesName, dataName, api, excludeSeriesId) { if (!isUseHoverLayer(api)) { api.dispatchAction({ type: "downplay", seriesName, name: dataName, excludeSeriesId }); } } function legendFilter(ecModel) { var legendModels = ecModel.findComponents({ mainType: "legend" }); if (legendModels && legendModels.length) { ecModel.filterSeries(function(series) { for (var i = 0; i < legendModels.length; i++) { if (!legendModels[i].isSelected(series.name)) { return false; } } return true; }); } } function legendSelectActionHandler(methodName, payload, ecModel) { var isAllSelect = methodName === "allSelect" || methodName === "inverseSelect"; var selectedMap = {}; var actionLegendIndices = []; ecModel.eachComponent({ mainType: "legend", query: payload }, function(legendModel) { if (isAllSelect) { legendModel[methodName](); } else { legendModel[methodName](payload.name); } makeSelectedMap(legendModel, selectedMap); actionLegendIndices.push(legendModel.componentIndex); }); var allSelectedMap = {}; ecModel.eachComponent("legend", function(legendModel) { each$f(selectedMap, function(isSelected, name) { legendModel[isSelected ? "select" : "unSelect"](name); }); makeSelectedMap(legendModel, allSelectedMap); }); return isAllSelect ? { selected: allSelectedMap, // return legendIndex array to tell the developers which legends are allSelect / inverseSelect legendIndex: actionLegendIndices } : { name: payload.name, selected: allSelectedMap }; } function makeSelectedMap(legendModel, out) { var selectedMap = out || {}; each$f(legendModel.getData(), function(model) { var name = model.get("name"); if (name === "\n" || name === "") { return; } var isItemSelected = legendModel.isSelected(name); if (hasOwn(selectedMap, name)) { selectedMap[name] = selectedMap[name] && isItemSelected; } else { selectedMap[name] = isItemSelected; } }); return selectedMap; } function installLegendAction(registers) { registers.registerAction("legendToggleSelect", "legendselectchanged", curry$1(legendSelectActionHandler, "toggleSelected")); registers.registerAction("legendAllSelect", "legendselectall", curry$1(legendSelectActionHandler, "allSelect")); registers.registerAction("legendInverseSelect", "legendinverseselect", curry$1(legendSelectActionHandler, "inverseSelect")); registers.registerAction("legendSelect", "legendselected", curry$1(legendSelectActionHandler, "select")); registers.registerAction("legendUnSelect", "legendunselected", curry$1(legendSelectActionHandler, "unSelect")); } function install$d(registers) { registers.registerComponentModel(LegendModel); registers.registerComponentView(LegendView); registers.registerProcessor(registers.PRIORITY.PROCESSOR.SERIES_FILTER, legendFilter); registers.registerSubTypeDefaulter("legend", function() { return "plain"; }); installLegendAction(registers); } var ScrollableLegendModel = ( /** @class */ (function(_super) { __extends(ScrollableLegendModel2, _super); function ScrollableLegendModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = ScrollableLegendModel2.type; return _this; } ScrollableLegendModel2.prototype.setScrollDataIndex = function(scrollDataIndex) { this.option.scrollDataIndex = scrollDataIndex; }; ScrollableLegendModel2.prototype.init = function(option, parentModel, ecModel) { var inputPositionParams = getLayoutParams(option); _super.prototype.init.call(this, option, parentModel, ecModel); mergeAndNormalizeLayoutParams(this, option, inputPositionParams); }; ScrollableLegendModel2.prototype.mergeOption = function(option, ecModel) { _super.prototype.mergeOption.call(this, option, ecModel); mergeAndNormalizeLayoutParams(this, this.option, option); }; ScrollableLegendModel2.type = "legend.scroll"; ScrollableLegendModel2.defaultOption = inheritDefaultOption(LegendModel.defaultOption, { scrollDataIndex: 0, pageButtonItemGap: 5, pageButtonGap: null, pageButtonPosition: "end", pageFormatter: "{current}/{total}", pageIcons: { horizontal: ["M0,0L12,-10L12,10z", "M0,0L-12,-10L-12,10z"], vertical: ["M0,0L20,0L10,-20z", "M0,0L20,0L10,20z"] }, pageIconColor: "#2f4554", pageIconInactiveColor: "#aaa", pageIconSize: 15, pageTextStyle: { color: "#333" }, animationDurationUpdate: 800 }); return ScrollableLegendModel2; })(LegendModel) ); function mergeAndNormalizeLayoutParams(legendModel, target, raw) { var orient = legendModel.getOrient(); var ignoreSize = [1, 1]; ignoreSize[orient.index] = 0; mergeLayoutParam(target, raw, { type: "box", ignoreSize: !!ignoreSize }); } var Group = Group$3; var WH = ["width", "height"]; var XY = ["x", "y"]; var ScrollableLegendView = ( /** @class */ (function(_super) { __extends(ScrollableLegendView2, _super); function ScrollableLegendView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = ScrollableLegendView2.type; _this.newlineDisabled = true; _this._currentIndex = 0; return _this; } ScrollableLegendView2.prototype.init = function() { _super.prototype.init.call(this); this.group.add(this._containerGroup = new Group()); this._containerGroup.add(this.getContentGroup()); this.group.add(this._controllerGroup = new Group()); }; ScrollableLegendView2.prototype.resetInner = function() { _super.prototype.resetInner.call(this); this._controllerGroup.removeAll(); this._containerGroup.removeClipPath(); this._containerGroup.__rectSize = null; }; ScrollableLegendView2.prototype.renderInner = function(itemAlign, legendModel, ecModel, api, selector2, orient, selectorPosition) { var self = this; _super.prototype.renderInner.call(this, itemAlign, legendModel, ecModel, api, selector2, orient, selectorPosition); var controllerGroup = this._controllerGroup; var pageIconSize = legendModel.get("pageIconSize", true); var pageIconSizeArr = isArray$1(pageIconSize) ? pageIconSize : [pageIconSize, pageIconSize]; createPageButton("pagePrev", 0); var pageTextStyleModel = legendModel.getModel("pageTextStyle"); controllerGroup.add(new ZRText({ name: "pageText", style: { // Placeholder to calculate a proper layout. text: "xx/xx", fill: pageTextStyleModel.getTextColor(), font: pageTextStyleModel.getFont(), verticalAlign: "middle", align: "center" }, silent: true })); createPageButton("pageNext", 1); function createPageButton(name, iconIdx) { var pageDataIndexName = name + "DataIndex"; var icon = createIcon(legendModel.get("pageIcons", true)[legendModel.getOrient().name][iconIdx], { // Buttons will be created in each render, so we do not need // to worry about avoiding using legendModel kept in scope. onclick: bind$1(self._pageGo, self, pageDataIndexName, legendModel, api) }, { x: -pageIconSizeArr[0] / 2, y: -pageIconSizeArr[1] / 2, width: pageIconSizeArr[0], height: pageIconSizeArr[1] }); icon.name = name; controllerGroup.add(icon); } }; ScrollableLegendView2.prototype.layoutInner = function(legendModel, itemAlign, maxSize, isFirstRender, selector2, selectorPosition) { var selectorGroup = this.getSelectorGroup(); var orientIdx = legendModel.getOrient().index; var wh = WH[orientIdx]; var xy = XY[orientIdx]; var hw = WH[1 - orientIdx]; var yx = XY[1 - orientIdx]; selector2 && box( // Buttons in selectorGroup always layout horizontally "horizontal", selectorGroup, legendModel.get("selectorItemGap", true) ); var selectorButtonGap = legendModel.get("selectorButtonGap", true); var selectorRect = selectorGroup.getBoundingRect(); var selectorPos = [-selectorRect.x, -selectorRect.y]; var processMaxSize = clone$1(maxSize); selector2 && (processMaxSize[wh] = maxSize[wh] - selectorRect[wh] - selectorButtonGap); var mainRect = this._layoutContentAndController(legendModel, isFirstRender, processMaxSize, orientIdx, wh, hw, yx, xy); if (selector2) { if (selectorPosition === "end") { selectorPos[orientIdx] += mainRect[wh] + selectorButtonGap; } else { var offset = selectorRect[wh] + selectorButtonGap; selectorPos[orientIdx] -= offset; mainRect[xy] -= offset; } mainRect[wh] += selectorRect[wh] + selectorButtonGap; selectorPos[1 - orientIdx] += mainRect[yx] + mainRect[hw] / 2 - selectorRect[hw] / 2; mainRect[hw] = Math.max(mainRect[hw], selectorRect[hw]); mainRect[yx] = Math.min(mainRect[yx], selectorRect[yx] + selectorPos[1 - orientIdx]); selectorGroup.x = selectorPos[0]; selectorGroup.y = selectorPos[1]; selectorGroup.markRedraw(); } return mainRect; }; ScrollableLegendView2.prototype._layoutContentAndController = function(legendModel, isFirstRender, maxSize, orientIdx, wh, hw, yx, xy) { var contentGroup = this.getContentGroup(); var containerGroup = this._containerGroup; var controllerGroup = this._controllerGroup; box(legendModel.get("orient"), contentGroup, legendModel.get("itemGap"), !orientIdx ? null : maxSize.width, orientIdx ? null : maxSize.height); box( // Buttons in controller are layout always horizontally. "horizontal", controllerGroup, legendModel.get("pageButtonItemGap", true) ); var contentRect = contentGroup.getBoundingRect(); var controllerRect = controllerGroup.getBoundingRect(); var showController = this._showController = contentRect[wh] > maxSize[wh]; var contentPos = [-contentRect.x, -contentRect.y]; if (!isFirstRender) { contentPos[orientIdx] = contentGroup[xy]; } var containerPos = [0, 0]; var controllerPos = [-controllerRect.x, -controllerRect.y]; var pageButtonGap = retrieve2(legendModel.get("pageButtonGap", true), legendModel.get("itemGap", true)); if (showController) { var pageButtonPosition = legendModel.get("pageButtonPosition", true); if (pageButtonPosition === "end") { controllerPos[orientIdx] += maxSize[wh] - controllerRect[wh]; } else { containerPos[orientIdx] += controllerRect[wh] + pageButtonGap; } } controllerPos[1 - orientIdx] += contentRect[hw] / 2 - controllerRect[hw] / 2; contentGroup.setPosition(contentPos); containerGroup.setPosition(containerPos); controllerGroup.setPosition(controllerPos); var mainRect = { x: 0, y: 0 }; mainRect[wh] = showController ? maxSize[wh] : contentRect[wh]; mainRect[hw] = Math.max(contentRect[hw], controllerRect[hw]); mainRect[yx] = Math.min(0, controllerRect[yx] + controllerPos[1 - orientIdx]); containerGroup.__rectSize = maxSize[wh]; if (showController) { var clipShape = { x: 0, y: 0 }; clipShape[wh] = Math.max(maxSize[wh] - controllerRect[wh] - pageButtonGap, 0); clipShape[hw] = mainRect[hw]; containerGroup.setClipPath(new Rect$2({ shape: clipShape })); containerGroup.__rectSize = clipShape[wh]; } else { controllerGroup.eachChild(function(child) { child.attr({ invisible: true, silent: true }); }); } var pageInfo = this._getPageInfo(legendModel); pageInfo.pageIndex != null && updateProps$1( contentGroup, { x: pageInfo.contentPosition[0], y: pageInfo.contentPosition[1] }, // When switch from "show controller" to "not show controller", view should be // updated immediately without animation, otherwise causes weird effect. showController ? legendModel : null ); this._updatePageInfoView(legendModel, pageInfo); return mainRect; }; ScrollableLegendView2.prototype._pageGo = function(to, legendModel, api) { var scrollDataIndex = this._getPageInfo(legendModel)[to]; scrollDataIndex != null && api.dispatchAction({ type: "legendScroll", scrollDataIndex, legendId: legendModel.id }); }; ScrollableLegendView2.prototype._updatePageInfoView = function(legendModel, pageInfo) { var controllerGroup = this._controllerGroup; each$f(["pagePrev", "pageNext"], function(name) { var key = name + "DataIndex"; var canJump = pageInfo[key] != null; var icon = controllerGroup.childOfName(name); if (icon) { icon.setStyle("fill", canJump ? legendModel.get("pageIconColor", true) : legendModel.get("pageIconInactiveColor", true)); icon.cursor = canJump ? "pointer" : "default"; } }); var pageText = controllerGroup.childOfName("pageText"); var pageFormatter = legendModel.get("pageFormatter"); var pageIndex = pageInfo.pageIndex; var current = pageIndex != null ? pageIndex + 1 : 0; var total = pageInfo.pageCount; pageText && pageFormatter && pageText.setStyle("text", isString(pageFormatter) ? pageFormatter.replace("{current}", current == null ? "" : current + "").replace("{total}", total == null ? "" : total + "") : pageFormatter({ current, total })); }; ScrollableLegendView2.prototype._getPageInfo = function(legendModel) { var scrollDataIndex = legendModel.get("scrollDataIndex", true); var contentGroup = this.getContentGroup(); var containerRectSize = this._containerGroup.__rectSize; var orientIdx = legendModel.getOrient().index; var wh = WH[orientIdx]; var xy = XY[orientIdx]; var targetItemIndex = this._findTargetItemIndex(scrollDataIndex); var children = contentGroup.children(); var targetItem = children[targetItemIndex]; var itemCount = children.length; var pCount = !itemCount ? 0 : 1; var result = { contentPosition: [contentGroup.x, contentGroup.y], pageCount: pCount, pageIndex: pCount - 1, pagePrevDataIndex: null, pageNextDataIndex: null }; if (!targetItem) { return result; } var targetItemInfo = getItemInfo(targetItem); result.contentPosition[orientIdx] = -targetItemInfo.s; for (var i = targetItemIndex + 1, winStartItemInfo = targetItemInfo, winEndItemInfo = targetItemInfo, currItemInfo = null; i <= itemCount; ++i) { currItemInfo = getItemInfo(children[i]); if ( // Half of the last item is out of the window. !currItemInfo && winEndItemInfo.e > winStartItemInfo.s + containerRectSize || currItemInfo && !intersect(currItemInfo, winStartItemInfo.s) ) { if (winEndItemInfo.i > winStartItemInfo.i) { winStartItemInfo = winEndItemInfo; } else { winStartItemInfo = currItemInfo; } if (winStartItemInfo) { if (result.pageNextDataIndex == null) { result.pageNextDataIndex = winStartItemInfo.i; } ++result.pageCount; } } winEndItemInfo = currItemInfo; } for (var i = targetItemIndex - 1, winStartItemInfo = targetItemInfo, winEndItemInfo = targetItemInfo, currItemInfo = null; i >= -1; --i) { currItemInfo = getItemInfo(children[i]); if ( // If the the end item does not intersect with the window started // from the current item, a page can be settled. (!currItemInfo || !intersect(winEndItemInfo, currItemInfo.s)) && winStartItemInfo.i < winEndItemInfo.i ) { winEndItemInfo = winStartItemInfo; if (result.pagePrevDataIndex == null) { result.pagePrevDataIndex = winStartItemInfo.i; } ++result.pageCount; ++result.pageIndex; } winStartItemInfo = currItemInfo; } return result; function getItemInfo(el) { if (el) { var itemRect = el.getBoundingRect(); var start = itemRect[xy] + el[xy]; return { s: start, e: start + itemRect[wh], i: el.__legendDataIndex }; } } function intersect(itemInfo, winStart) { return itemInfo.e >= winStart && itemInfo.s <= winStart + containerRectSize; } }; ScrollableLegendView2.prototype._findTargetItemIndex = function(targetDataIndex) { if (!this._showController) { return 0; } var index; var contentGroup = this.getContentGroup(); var defaultIndex; contentGroup.eachChild(function(child, idx) { var legendDataIdx = child.__legendDataIndex; if (defaultIndex == null && legendDataIdx != null) { defaultIndex = idx; } if (legendDataIdx === targetDataIndex) { index = idx; } }); return index != null ? index : defaultIndex; }; ScrollableLegendView2.type = "legend.scroll"; return ScrollableLegendView2; })(LegendView) ); function installScrollableLegendAction(registers) { registers.registerAction("legendScroll", "legendscroll", function(payload, ecModel) { var scrollDataIndex = payload.scrollDataIndex; scrollDataIndex != null && ecModel.eachComponent({ mainType: "legend", subType: "scroll", query: payload }, function(legendModel) { legendModel.setScrollDataIndex(scrollDataIndex); }); }); } function install$c(registers) { use(install$d); registers.registerComponentModel(ScrollableLegendModel); registers.registerComponentView(ScrollableLegendView); installScrollableLegendAction(registers); } function install$b(registers) { use(install$d); use(install$c); } var InsideZoomModel = ( /** @class */ (function(_super) { __extends(InsideZoomModel2, _super); function InsideZoomModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = InsideZoomModel2.type; return _this; } InsideZoomModel2.type = "dataZoom.inside"; InsideZoomModel2.defaultOption = inheritDefaultOption(DataZoomModel.defaultOption, { disabled: false, zoomLock: false, zoomOnMouseWheel: true, moveOnMouseMove: true, moveOnMouseWheel: false, preventDefaultMouseMove: true }); return InsideZoomModel2; })(DataZoomModel) ); var inner$1 = makeInner(); function setViewInfoToCoordSysRecord(api, dataZoomModel, getRange) { inner$1(api).coordSysRecordMap.each(function(coordSysRecord) { var dzInfo = coordSysRecord.dataZoomInfoMap.get(dataZoomModel.uid); if (dzInfo) { dzInfo.getRange = getRange; } }); } function disposeCoordSysRecordIfNeeded(api, dataZoomModel) { var coordSysRecordMap = inner$1(api).coordSysRecordMap; var coordSysKeyArr = coordSysRecordMap.keys(); for (var i = 0; i < coordSysKeyArr.length; i++) { var coordSysKey = coordSysKeyArr[i]; var coordSysRecord = coordSysRecordMap.get(coordSysKey); var dataZoomInfoMap = coordSysRecord.dataZoomInfoMap; if (dataZoomInfoMap) { var dzUid = dataZoomModel.uid; var dzInfo = dataZoomInfoMap.get(dzUid); if (dzInfo) { dataZoomInfoMap.removeKey(dzUid); if (!dataZoomInfoMap.keys().length) { disposeCoordSysRecord(coordSysRecordMap, coordSysRecord); } } } } } function disposeCoordSysRecord(coordSysRecordMap, coordSysRecord) { if (coordSysRecord) { coordSysRecordMap.removeKey(coordSysRecord.model.uid); var controller = coordSysRecord.controller; controller && controller.dispose(); } } function createCoordSysRecord(api, coordSysModel) { var coordSysRecord = { model: coordSysModel, containsPoint: curry$1(containsPoint, coordSysModel), dispatchAction: curry$1(dispatchAction, api), dataZoomInfoMap: null, controller: null }; var controller = coordSysRecord.controller = new RoamController(api.getZr()); each$f(["pan", "zoom", "scrollMove"], function(eventName) { controller.on(eventName, function(event) { var batch = []; coordSysRecord.dataZoomInfoMap.each(function(dzInfo) { if (!event.isAvailableBehavior(dzInfo.model.option)) { return; } var method = (dzInfo.getRange || {})[eventName]; var range = method && method(dzInfo.dzReferCoordSysInfo, coordSysRecord.model.mainType, coordSysRecord.controller, event); !dzInfo.model.get("disabled", true) && range && batch.push({ dataZoomId: dzInfo.model.id, start: range[0], end: range[1] }); }); batch.length && coordSysRecord.dispatchAction(batch); }); }); return coordSysRecord; } function dispatchAction(api, batch) { if (!api.isDisposed()) { api.dispatchAction({ type: "dataZoom", animation: { easing: "cubicOut", duration: 100 }, batch }); } } function containsPoint(coordSysModel, e, x, y) { return coordSysModel.coordinateSystem.containPoint([x, y]); } function mergeControllerParams(dataZoomInfoMap) { var controlType; var prefix = "type_"; var typePriority = { "type_true": 2, "type_move": 1, "type_false": 0, "type_undefined": -1 }; var preventDefaultMouseMove = true; dataZoomInfoMap.each(function(dataZoomInfo) { var dataZoomModel = dataZoomInfo.model; var oneType = dataZoomModel.get("disabled", true) ? false : dataZoomModel.get("zoomLock", true) ? "move" : true; if (typePriority[prefix + oneType] > typePriority[prefix + controlType]) { controlType = oneType; } preventDefaultMouseMove = preventDefaultMouseMove && dataZoomModel.get("preventDefaultMouseMove", true); }); return { controlType, opt: { // RoamController will enable all of these functionalities, // and the final behavior is determined by its event listener // provided by each inside zoom. zoomOnMouseWheel: true, moveOnMouseMove: true, moveOnMouseWheel: true, preventDefaultMouseMove: !!preventDefaultMouseMove } }; } function installDataZoomRoamProcessor(registers) { registers.registerProcessor(registers.PRIORITY.PROCESSOR.FILTER, function(ecModel, api) { var apiInner = inner$1(api); var coordSysRecordMap = apiInner.coordSysRecordMap || (apiInner.coordSysRecordMap = createHashMap()); coordSysRecordMap.each(function(coordSysRecord) { coordSysRecord.dataZoomInfoMap = null; }); ecModel.eachComponent({ mainType: "dataZoom", subType: "inside" }, function(dataZoomModel) { var dzReferCoordSysWrap = collectReferCoordSysModelInfo(dataZoomModel); each$f(dzReferCoordSysWrap.infoList, function(dzCoordSysInfo) { var coordSysUid = dzCoordSysInfo.model.uid; var coordSysRecord = coordSysRecordMap.get(coordSysUid) || coordSysRecordMap.set(coordSysUid, createCoordSysRecord(api, dzCoordSysInfo.model)); var dataZoomInfoMap = coordSysRecord.dataZoomInfoMap || (coordSysRecord.dataZoomInfoMap = createHashMap()); dataZoomInfoMap.set(dataZoomModel.uid, { dzReferCoordSysInfo: dzCoordSysInfo, model: dataZoomModel, getRange: null }); }); }); coordSysRecordMap.each(function(coordSysRecord) { var controller = coordSysRecord.controller; var firstDzInfo; var dataZoomInfoMap = coordSysRecord.dataZoomInfoMap; if (dataZoomInfoMap) { var firstDzKey = dataZoomInfoMap.keys()[0]; if (firstDzKey != null) { firstDzInfo = dataZoomInfoMap.get(firstDzKey); } } if (!firstDzInfo) { disposeCoordSysRecord(coordSysRecordMap, coordSysRecord); return; } var controllerParams = mergeControllerParams(dataZoomInfoMap); controller.enable(controllerParams.controlType, controllerParams.opt); controller.setPointerChecker(coordSysRecord.containsPoint); createOrUpdate(coordSysRecord, "dispatchAction", firstDzInfo.model.get("throttle", true), "fixRate"); }); }); } var InsideZoomView = ( /** @class */ (function(_super) { __extends(InsideZoomView2, _super); function InsideZoomView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = "dataZoom.inside"; return _this; } InsideZoomView2.prototype.render = function(dataZoomModel, ecModel, api) { _super.prototype.render.apply(this, arguments); if (dataZoomModel.noTarget()) { this._clear(); return; } this.range = dataZoomModel.getPercentRange(); setViewInfoToCoordSysRecord(api, dataZoomModel, { pan: bind$1(getRangeHandlers.pan, this), zoom: bind$1(getRangeHandlers.zoom, this), scrollMove: bind$1(getRangeHandlers.scrollMove, this) }); }; InsideZoomView2.prototype.dispose = function() { this._clear(); _super.prototype.dispose.apply(this, arguments); }; InsideZoomView2.prototype._clear = function() { disposeCoordSysRecordIfNeeded(this.api, this.dataZoomModel); this.range = null; }; InsideZoomView2.type = "dataZoom.inside"; return InsideZoomView2; })(DataZoomView) ); var getRangeHandlers = { zoom: function(coordSysInfo, coordSysMainType, controller, e) { var lastRange = this.range; var range = lastRange.slice(); var axisModel = coordSysInfo.axisModels[0]; if (!axisModel) { return; } var directionInfo = getDirectionInfo[coordSysMainType](null, [e.originX, e.originY], axisModel, controller, coordSysInfo); var percentPoint = (directionInfo.signal > 0 ? directionInfo.pixelStart + directionInfo.pixelLength - directionInfo.pixel : directionInfo.pixel - directionInfo.pixelStart) / directionInfo.pixelLength * (range[1] - range[0]) + range[0]; var scale2 = Math.max(1 / e.scale, 0); range[0] = (range[0] - percentPoint) * scale2 + percentPoint; range[1] = (range[1] - percentPoint) * scale2 + percentPoint; 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; } }, pan: makeMover(function(range, axisModel, coordSysInfo, coordSysMainType, controller, e) { var directionInfo = getDirectionInfo[coordSysMainType]([e.oldX, e.oldY], [e.newX, e.newY], axisModel, controller, coordSysInfo); return directionInfo.signal * (range[1] - range[0]) * directionInfo.pixel / directionInfo.pixelLength; }), scrollMove: makeMover(function(range, axisModel, coordSysInfo, coordSysMainType, controller, e) { var directionInfo = getDirectionInfo[coordSysMainType]([0, 0], [e.scrollDelta, e.scrollDelta], axisModel, controller, coordSysInfo); return directionInfo.signal * (range[1] - range[0]) * e.scrollDelta; }) }; function makeMover(getPercentDelta) { return function(coordSysInfo, coordSysMainType, controller, e) { var lastRange = this.range; var range = lastRange.slice(); var axisModel = coordSysInfo.axisModels[0]; if (!axisModel) { return; } var percentDelta = getPercentDelta(range, axisModel, coordSysInfo, coordSysMainType, controller, e); sliderMove(percentDelta, range, [0, 100], "all"); this.range = range; if (lastRange[0] !== range[0] || lastRange[1] !== range[1]) { return range; } }; } var getDirectionInfo = { grid: function(oldPoint, newPoint, axisModel, controller, coordSysInfo) { var axis = axisModel.axis; var ret = {}; var rect = coordSysInfo.model.coordinateSystem.getRect(); oldPoint = oldPoint || [0, 0]; if (axis.dim === "x") { ret.pixel = newPoint[0] - oldPoint[0]; ret.pixelLength = rect.width; ret.pixelStart = rect.x; ret.signal = axis.inverse ? 1 : -1; } else { ret.pixel = newPoint[1] - oldPoint[1]; ret.pixelLength = rect.height; ret.pixelStart = rect.y; ret.signal = axis.inverse ? -1 : 1; } return ret; }, polar: function(oldPoint, newPoint, axisModel, controller, coordSysInfo) { var axis = axisModel.axis; var ret = {}; var polar = coordSysInfo.model.coordinateSystem; var radiusExtent = polar.getRadiusAxis().getExtent(); var angleExtent = polar.getAngleAxis().getExtent(); oldPoint = oldPoint ? polar.pointToCoord(oldPoint) : [0, 0]; newPoint = polar.pointToCoord(newPoint); if (axisModel.mainType === "radiusAxis") { ret.pixel = newPoint[0] - oldPoint[0]; ret.pixelLength = radiusExtent[1] - radiusExtent[0]; ret.pixelStart = radiusExtent[0]; ret.signal = axis.inverse ? 1 : -1; } else { ret.pixel = newPoint[1] - oldPoint[1]; ret.pixelLength = angleExtent[1] - angleExtent[0]; ret.pixelStart = angleExtent[0]; ret.signal = axis.inverse ? -1 : 1; } return ret; }, singleAxis: function(oldPoint, newPoint, axisModel, controller, coordSysInfo) { var axis = axisModel.axis; var rect = coordSysInfo.model.coordinateSystem.getRect(); var ret = {}; oldPoint = oldPoint || [0, 0]; if (axis.orient === "horizontal") { ret.pixel = newPoint[0] - oldPoint[0]; ret.pixelLength = rect.width; ret.pixelStart = rect.x; ret.signal = axis.inverse ? 1 : -1; } else { ret.pixel = newPoint[1] - oldPoint[1]; ret.pixelLength = rect.height; ret.pixelStart = rect.y; ret.signal = axis.inverse ? -1 : 1; } return ret; } }; function install$a(registers) { installCommon$1(registers); registers.registerComponentModel(InsideZoomModel); registers.registerComponentView(InsideZoomView); installDataZoomRoamProcessor(registers); } var SliderZoomModel = ( /** @class */ (function(_super) { __extends(SliderZoomModel2, _super); function SliderZoomModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = SliderZoomModel2.type; return _this; } SliderZoomModel2.type = "dataZoom.slider"; SliderZoomModel2.layoutMode = "box"; SliderZoomModel2.defaultOption = inheritDefaultOption(DataZoomModel.defaultOption, { show: true, // deault value can only be drived in view stage. right: "ph", top: "ph", width: "ph", height: "ph", left: null, bottom: null, borderColor: "#d2dbee", borderRadius: 3, backgroundColor: "rgba(47,69,84,0)", // dataBackgroundColor: '#ddd', dataBackground: { lineStyle: { color: "#d2dbee", width: 0.5 }, areaStyle: { color: "#d2dbee", opacity: 0.2 } }, selectedDataBackground: { lineStyle: { color: "#8fb0f7", width: 0.5 }, areaStyle: { color: "#8fb0f7", opacity: 0.2 } }, // Color of selected window. fillerColor: "rgba(135,175,274,0.2)", handleIcon: "path://M-9.35,34.56V42m0-40V9.5m-2,0h4a2,2,0,0,1,2,2v21a2,2,0,0,1-2,2h-4a2,2,0,0,1-2-2v-21A2,2,0,0,1-11.35,9.5Z", // Percent of the slider height handleSize: "100%", handleStyle: { color: "#fff", borderColor: "#ACB8D1" }, moveHandleSize: 7, moveHandleIcon: "path://M-320.9-50L-320.9-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-348-41-339-50-320.9-50z M-212.3-50L-212.3-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-239.4-41-230.4-50-212.3-50z M-103.7-50L-103.7-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-130.9-41-121.8-50-103.7-50z", moveHandleStyle: { color: "#D2DBEE", opacity: 0.7 }, showDetail: true, showDataShadow: "auto", realtime: true, zoomLock: false, textStyle: { color: "#6E7079" }, brushSelect: true, brushStyle: { color: "rgba(135,175,274,0.15)" }, emphasis: { handleLabel: { show: true }, handleStyle: { borderColor: "#8FB0F7" }, moveHandleStyle: { color: "#8FB0F7" } } }); return SliderZoomModel2; })(DataZoomModel) ); var Rect = Rect$2; var DEFAULT_LOCATION_EDGE_GAP = 7; var DEFAULT_FRAME_BORDER_WIDTH = 1; var DEFAULT_FILLER_SIZE = 30; 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 REALTIME_ANIMATION_CONFIG = { easing: "cubicOut", duration: 100, delay: 0 }; var SliderZoomView = ( /** @class */ (function(_super) { __extends(SliderZoomView2, _super); function SliderZoomView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = SliderZoomView2.type; _this._displayables = {}; return _this; } SliderZoomView2.prototype.init = function(ecModel, api) { this.api = api; this._onBrush = bind$1(this._onBrush, this); this._onBrushEnd = bind$1(this._onBrushEnd, this); }; SliderZoomView2.prototype.render = function(dataZoomModel, ecModel, api, payload) { _super.prototype.render.apply(this, arguments); createOrUpdate(this, "_dispatchZoomAction", dataZoomModel.get("throttle"), "fixRate"); this._orient = dataZoomModel.getOrient(); if (dataZoomModel.get("show") === false) { this.group.removeAll(); return; } if (dataZoomModel.noTarget()) { this._clear(); this.group.removeAll(); return; } if (!payload || payload.type !== "dataZoom" || payload.from !== this.uid) { this._buildView(); } this._updateView(); }; SliderZoomView2.prototype.dispose = function() { this._clear(); _super.prototype.dispose.apply(this, arguments); }; SliderZoomView2.prototype._clear = function() { clear$1(this, "_dispatchZoomAction"); var zr = this.api.getZr(); zr.off("mousemove", this._onBrush); zr.off("mouseup", this._onBrushEnd); }; SliderZoomView2.prototype._buildView = function() { var thisGroup = this.group; thisGroup.removeAll(); this._brushing = false; this._displayables.brushRect = null; this._resetLocation(); this._resetInterval(); var barGroup = this._displayables.sliderGroup = new Group$3(); this._renderBackground(); this._renderHandle(); this._renderDataShadow(); thisGroup.add(barGroup); this._positionGroup(); }; SliderZoomView2.prototype._resetLocation = function() { var dataZoomModel = this.dataZoomModel; var api = this.api; var showMoveHandle = dataZoomModel.get("brushSelect"); var moveHandleSize = showMoveHandle ? DEFAULT_MOVE_HANDLE_SIZE : 0; var coordRect = this._findCoordRect(); var ecSize = { width: api.getWidth(), height: api.getHeight() }; var positionInfo = this._orient === HORIZONTAL ? { // Why using 'right', because right should be used in vertical, // and it is better to be consistent for dealing with position param merge. right: ecSize.width - coordRect.x - coordRect.width, top: ecSize.height - DEFAULT_FILLER_SIZE - DEFAULT_LOCATION_EDGE_GAP - moveHandleSize, width: coordRect.width, height: DEFAULT_FILLER_SIZE } : { right: DEFAULT_LOCATION_EDGE_GAP, top: coordRect.y, width: DEFAULT_FILLER_SIZE, height: coordRect.height }; var layoutParams = getLayoutParams(dataZoomModel.option); each$f(["right", "top", "width", "height"], function(name) { if (layoutParams[name] === "ph") { layoutParams[name] = positionInfo[name]; } }); var layoutRect = getLayoutRect(layoutParams, ecSize); this._location = { x: layoutRect.x, y: layoutRect.y }; this._size = [layoutRect.width, layoutRect.height]; this._orient === VERTICAL && this._size.reverse(); }; SliderZoomView2.prototype._positionGroup = function() { var thisGroup = this.group; var location = this._location; var orient = this._orient; var targetAxisModel = this.dataZoomModel.getFirstTargetAxisModel(); var inverse = targetAxisModel && targetAxisModel.get("inverse"); var sliderGroup = this._displayables.sliderGroup; var otherAxisInverse = (this._dataShadowInfo || {}).otherAxisInverse; sliderGroup.attr(orient === HORIZONTAL && !inverse ? { scaleY: otherAxisInverse ? 1 : -1, scaleX: 1 } : orient === HORIZONTAL && inverse ? { scaleY: otherAxisInverse ? 1 : -1, scaleX: -1 } : orient === VERTICAL && !inverse ? { scaleY: otherAxisInverse ? -1 : 1, scaleX: 1, rotation: Math.PI / 2 } : { scaleY: otherAxisInverse ? -1 : 1, scaleX: -1, rotation: Math.PI / 2 }); var rect = thisGroup.getBoundingRect([sliderGroup]); thisGroup.x = location.x - rect.x; thisGroup.y = location.y - rect.y; thisGroup.markRedraw(); }; SliderZoomView2.prototype._getViewExtent = function() { return [0, this._size[0]]; }; SliderZoomView2.prototype._renderBackground = function() { var dataZoomModel = this.dataZoomModel; var size = this._size; var barGroup = this._displayables.sliderGroup; var brushSelect = dataZoomModel.get("brushSelect"); barGroup.add(new Rect({ silent: true, shape: { x: 0, y: 0, width: size[0], height: size[1] }, style: { fill: dataZoomModel.get("backgroundColor") }, z2: -40 })); var clickPanel = new Rect({ shape: { x: 0, y: 0, width: size[0], height: size[1] }, style: { fill: "transparent" }, z2: 0, onclick: bind$1(this._onClickPanel, this) }); var zr = this.api.getZr(); if (brushSelect) { clickPanel.on("mousedown", this._onBrushStart, this); clickPanel.cursor = "crosshair"; zr.on("mousemove", this._onBrush); zr.on("mouseup", this._onBrushEnd); } else { zr.off("mousemove", this._onBrush); zr.off("mouseup", this._onBrushEnd); } barGroup.add(clickPanel); }; SliderZoomView2.prototype._renderDataShadow = function() { var info = this._dataShadowInfo = this._prepareDataShadowInfo(); this._displayables.dataShadowSegs = []; if (!info) { return; } var size = this._size; var oldSize = this._shadowSize || []; var seriesModel = info.series; var data = seriesModel.getRawData(); var candlestickDim = seriesModel.getShadowDim && seriesModel.getShadowDim(); var otherDim = candlestickDim && data.getDimensionInfo(candlestickDim) ? seriesModel.getShadowDim() : info.otherDim; if (otherDim == null) { return; } var polygonPts = this._shadowPolygonPts; var polylinePts = this._shadowPolylinePts; if (data !== this._shadowData || otherDim !== this._shadowDim || size[0] !== oldSize[0] || size[1] !== oldSize[1]) { var otherDataExtent_1 = data.getDataExtent(otherDim); var otherOffset = (otherDataExtent_1[1] - otherDataExtent_1[0]) * 0.3; otherDataExtent_1 = [otherDataExtent_1[0] - otherOffset, otherDataExtent_1[1] + otherOffset]; var otherShadowExtent_1 = [0, size[1]]; var thisShadowExtent = [0, size[0]]; var areaPoints_1 = [[size[0], 0], [0, 0]]; var linePoints_1 = []; var step_1 = thisShadowExtent[1] / (data.count() - 1); var thisCoord_1 = 0; var stride_1 = Math.round(data.count() / size[0]); var lastIsEmpty_1; data.each([otherDim], function(value, index) { if (stride_1 > 0 && index % stride_1) { thisCoord_1 += step_1; return; } var isEmpty = value == null || isNaN(value) || value === ""; var otherCoord = isEmpty ? 0 : linearMap$2(value, otherDataExtent_1, otherShadowExtent_1, true); if (isEmpty && !lastIsEmpty_1 && index) { areaPoints_1.push([areaPoints_1[areaPoints_1.length - 1][0], 0]); linePoints_1.push([linePoints_1[linePoints_1.length - 1][0], 0]); } else if (!isEmpty && lastIsEmpty_1) { areaPoints_1.push([thisCoord_1, 0]); linePoints_1.push([thisCoord_1, 0]); } areaPoints_1.push([thisCoord_1, otherCoord]); linePoints_1.push([thisCoord_1, otherCoord]); thisCoord_1 += step_1; lastIsEmpty_1 = isEmpty; }); polygonPts = this._shadowPolygonPts = areaPoints_1; polylinePts = this._shadowPolylinePts = linePoints_1; } this._shadowData = data; this._shadowDim = otherDim; this._shadowSize = [size[0], size[1]]; var dataZoomModel = this.dataZoomModel; function createDataShadowGroup(isSelectedArea) { var model = dataZoomModel.getModel(isSelectedArea ? "selectedDataBackground" : "dataBackground"); var group2 = new Group$3(); var polygon = new Polygon({ shape: { points: polygonPts }, segmentIgnoreThreshold: 1, style: model.getModel("areaStyle").getAreaStyle(), silent: true, z2: -20 }); var polyline = new Polyline$1({ shape: { points: polylinePts }, segmentIgnoreThreshold: 1, style: model.getModel("lineStyle").getLineStyle(), silent: true, z2: -19 }); group2.add(polygon); group2.add(polyline); return group2; } for (var i = 0; i < 3; i++) { var group = createDataShadowGroup(i === 1); this._displayables.sliderGroup.add(group); this._displayables.dataShadowSegs.push(group); } }; SliderZoomView2.prototype._prepareDataShadowInfo = function() { var dataZoomModel = this.dataZoomModel; var showDataShadow = dataZoomModel.get("showDataShadow"); if (showDataShadow === false) { return; } var result; var ecModel = this.ecModel; dataZoomModel.eachTargetAxis(function(axisDim, axisIndex) { var seriesModels = dataZoomModel.getAxisProxy(axisDim, axisIndex).getTargetSeriesModels(); each$f(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, series: seriesModel, thisDim: axisDim, otherDim, otherAxisInverse }; }, this); }, this); return result; }; SliderZoomView2.prototype._renderHandle = function() { var thisGroup = this.group; var displayables = this._displayables; var handles = displayables.handles = [null, null]; var handleLabels = displayables.handleLabels = [null, null]; var sliderGroup = this._displayables.sliderGroup; var size = this._size; var dataZoomModel = this.dataZoomModel; var api = this.api; var borderRadius = dataZoomModel.get("borderRadius") || 0; var brushSelect = dataZoomModel.get("brushSelect"); var filler = displayables.filler = new Rect({ silent: brushSelect, style: { fill: dataZoomModel.get("fillerColor") }, textConfig: { position: "inside" } }); sliderGroup.add(filler); sliderGroup.add(new Rect({ silent: true, subPixelOptimize: true, shape: { x: 0, y: 0, width: size[0], height: size[1], r: borderRadius }, style: { // deprecated option stroke: dataZoomModel.get("dataBackgroundColor") || dataZoomModel.get("borderColor"), lineWidth: DEFAULT_FRAME_BORDER_WIDTH, fill: "rgba(0,0,0,0)" } })); each$f([0, 1], function(handleIndex) { var iconStr = dataZoomModel.get("handleIcon"); if (!symbolBuildProxies[iconStr] && iconStr.indexOf("path://") < 0 && iconStr.indexOf("image://") < 0) { iconStr = "path://" + iconStr; } var path = createSymbol$1(iconStr, -1, 0, 2, 2, null, true); path.attr({ cursor: getCursor$1(this._orient), draggable: true, drift: bind$1(this._onDragMove, this, handleIndex), ondragend: bind$1(this._onDragEnd, this), onmouseover: bind$1(this._showDataInfo, this, true), onmouseout: bind$1(this._showDataInfo, this, false), z2: 5 }); var bRect = path.getBoundingRect(); var handleSize = dataZoomModel.get("handleSize"); this._handleHeight = parsePercent(handleSize, this._size[1]); this._handleWidth = bRect.width / bRect.height * this._handleHeight; path.setStyle(dataZoomModel.getModel("handleStyle").getItemStyle()); path.style.strokeNoScale = true; path.rectHover = true; path.ensureState("emphasis").style = dataZoomModel.getModel(["emphasis", "handleStyle"]).getItemStyle(); enableHoverEmphasis(path); var handleColor = dataZoomModel.get("handleColor"); if (handleColor != null) { path.style.fill = handleColor; } sliderGroup.add(handles[handleIndex] = path); var textStyleModel = dataZoomModel.getModel("textStyle"); var handleLabel = dataZoomModel.get("handleLabel") || {}; var handleLabelShow = handleLabel.show || false; thisGroup.add(handleLabels[handleIndex] = new ZRText({ silent: true, invisible: !handleLabelShow, style: createTextStyle(textStyleModel, { x: 0, y: 0, text: "", verticalAlign: "middle", align: "center", fill: textStyleModel.getTextColor(), font: textStyleModel.getFont() }), z2: 10 })); }, this); var actualMoveZone = filler; if (brushSelect) { var moveHandleHeight = parsePercent(dataZoomModel.get("moveHandleSize"), size[1]); var moveHandle_1 = displayables.moveHandle = new Rect$2({ style: dataZoomModel.getModel("moveHandleStyle").getItemStyle(), silent: true, shape: { r: [0, 0, 2, 2], y: size[1] - 0.5, height: moveHandleHeight } }); var iconSize = moveHandleHeight * 0.8; var moveHandleIcon = displayables.moveHandleIcon = createSymbol$1(dataZoomModel.get("moveHandleIcon"), -iconSize / 2, -iconSize / 2, iconSize, iconSize, "#fff", true); moveHandleIcon.silent = true; moveHandleIcon.y = size[1] + moveHandleHeight / 2 - 0.5; moveHandle_1.ensureState("emphasis").style = dataZoomModel.getModel(["emphasis", "moveHandleStyle"]).getItemStyle(); var moveZoneExpandSize = Math.min(size[1] / 2, Math.max(moveHandleHeight, 10)); actualMoveZone = displayables.moveZone = new Rect$2({ invisible: true, shape: { y: size[1] - moveZoneExpandSize, height: moveHandleHeight + moveZoneExpandSize } }); actualMoveZone.on("mouseover", function() { api.enterEmphasis(moveHandle_1); }).on("mouseout", function() { api.leaveEmphasis(moveHandle_1); }); sliderGroup.add(moveHandle_1); sliderGroup.add(moveHandleIcon); sliderGroup.add(actualMoveZone); } actualMoveZone.attr({ draggable: true, cursor: getCursor$1(this._orient), drift: bind$1(this._onDragMove, this, "all"), ondragstart: bind$1(this._showDataInfo, this, true), ondragend: bind$1(this._onDragEnd, this), onmouseover: bind$1(this._showDataInfo, this, true), onmouseout: bind$1(this._showDataInfo, this, false) }); }; SliderZoomView2.prototype._resetInterval = function() { var range = this._range = this.dataZoomModel.getPercentRange(); var viewExtent = this._getViewExtent(); this._handleEnds = [linearMap$2(range[0], [0, 100], viewExtent, true), linearMap$2(range[1], [0, 100], viewExtent, true)]; }; SliderZoomView2.prototype._updateInterval = function(handleIndex, delta) { 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$2(minMaxSpan.minSpan, percentExtent, viewExtend, true) : null, minMaxSpan.maxSpan != null ? linearMap$2(minMaxSpan.maxSpan, percentExtent, viewExtend, true) : null); var lastRange = this._range; var range = this._range = asc$2([linearMap$2(handleEnds[0], viewExtend, percentExtent, true), linearMap$2(handleEnds[1], viewExtend, percentExtent, true)]); return !lastRange || lastRange[0] !== range[0] || lastRange[1] !== range[1]; }; SliderZoomView2.prototype._updateView = function(nonRealtime) { var displaybles = this._displayables; var handleEnds = this._handleEnds; var handleInterval = asc$2(handleEnds.slice()); var size = this._size; each$f([0, 1], function(handleIndex) { var handle = displaybles.handles[handleIndex]; var handleHeight = this._handleHeight; handle.attr({ scaleX: handleHeight / 2, scaleY: handleHeight / 2, // This is a trick, by adding an extra tiny offset to let the default handle's end point align to the drag window. // NOTE: It may affect some custom shapes a bit. But we prefer to have better result by default. x: handleEnds[handleIndex] + (handleIndex ? -1 : 1), y: size[1] / 2 - handleHeight / 2 }); }, this); displaybles.filler.setShape({ x: handleInterval[0], y: 0, width: handleInterval[1] - handleInterval[0], height: size[1] }); var viewExtent = { x: handleInterval[0], width: handleInterval[1] - handleInterval[0] }; if (displaybles.moveHandle) { displaybles.moveHandle.setShape(viewExtent); displaybles.moveZone.setShape(viewExtent); displaybles.moveZone.getBoundingRect(); displaybles.moveHandleIcon && displaybles.moveHandleIcon.attr("x", viewExtent.x + viewExtent.width / 2); } var dataShadowSegs = displaybles.dataShadowSegs; var segIntervals = [0, handleInterval[0], handleInterval[1], size[0]]; for (var i = 0; i < dataShadowSegs.length; i++) { var segGroup = dataShadowSegs[i]; var clipPath = segGroup.getClipPath(); if (!clipPath) { clipPath = new Rect$2(); segGroup.setClipPath(clipPath); } clipPath.setShape({ x: segIntervals[i], y: 0, width: segIntervals[i + 1] - segIntervals[i], height: size[1] }); } this._updateDataInfo(nonRealtime); }; SliderZoomView2.prototype._updateDataInfo = function(nonRealtime) { var dataZoomModel = this.dataZoomModel; var displaybles = this._displayables; var handleLabels = displaybles.handleLabels; var orient = this._orient; var labelTexts = ["", ""]; if (dataZoomModel.get("showDetail")) { var axisProxy = dataZoomModel.findRepresentativeAxisProxy(); if (axisProxy) { var axis = axisProxy.getAxisModel().axis; var range = this._range; var dataInterval = nonRealtime ? axisProxy.calculateDataWindow({ start: range[0], end: range[1] }).valueWindow : axisProxy.getDataValueWindow(); labelTexts = [this._formatLabel(dataInterval[0], axis), this._formatLabel(dataInterval[1], axis)]; } } var orderedHandleEnds = asc$2(this._handleEnds.slice()); setLabel.call(this, 0); setLabel.call(this, 1); function setLabel(handleIndex) { var barTransform = getTransform$1(displaybles.handles[handleIndex].parent, this.group); var direction = transformDirection(handleIndex === 0 ? "right" : "left", barTransform); var offset = this._handleWidth / 2 + LABEL_GAP; var textPoint = applyTransform([orderedHandleEnds[handleIndex] + (handleIndex === 0 ? -offset : offset), this._size[1] / 2], barTransform); handleLabels[handleIndex].setStyle({ x: textPoint[0], y: textPoint[1], verticalAlign: orient === HORIZONTAL ? "middle" : direction, align: orient === HORIZONTAL ? direction : "center", text: labelTexts[handleIndex] }); } }; SliderZoomView2.prototype._formatLabel = function(value, axis) { var dataZoomModel = this.dataZoomModel; var labelFormatter = dataZoomModel.get("labelFormatter"); var labelPrecision = dataZoomModel.get("labelPrecision"); if (labelPrecision == null || labelPrecision === "auto") { labelPrecision = axis.getPixelPrecision(); } var valueStr = value == null || isNaN(value) ? "" : axis.type === "category" || axis.type === "time" ? axis.scale.getLabel({ value: Math.round(value) }) : value.toFixed(Math.min(labelPrecision, 20)); return isFunction(labelFormatter) ? labelFormatter(value, valueStr) : isString(labelFormatter) ? labelFormatter.replace("{value}", valueStr) : valueStr; }; SliderZoomView2.prototype._showDataInfo = function(isEmphasis) { var handleLabel = this.dataZoomModel.get("handleLabel") || {}; var normalShow = handleLabel.show || false; var emphasisHandleLabel = this.dataZoomModel.getModel(["emphasis", "handleLabel"]); var emphasisShow = emphasisHandleLabel.get("show") || false; var toShow = isEmphasis || this._dragging ? emphasisShow : normalShow; var displayables = this._displayables; var handleLabels = displayables.handleLabels; handleLabels[0].attr("invisible", !toShow); handleLabels[1].attr("invisible", !toShow); displayables.moveHandle && this.api[toShow ? "enterEmphasis" : "leaveEmphasis"](displayables.moveHandle, 1); }; SliderZoomView2.prototype._onDragMove = function(handleIndex, dx, dy, event) { this._dragging = true; stop(event.event); var barTransform = this._displayables.sliderGroup.getLocalTransform(); var vertex = applyTransform([dx, dy], barTransform, true); var changed = this._updateInterval(handleIndex, vertex[0]); var realtime = this.dataZoomModel.get("realtime"); this._updateView(!realtime); changed && realtime && this._dispatchZoomAction(true); }; SliderZoomView2.prototype._onDragEnd = function() { this._dragging = false; this._showDataInfo(false); var realtime = this.dataZoomModel.get("realtime"); !realtime && this._dispatchZoomAction(false); }; SliderZoomView2.prototype._onClickPanel = function(e) { var size = this._size; var localPoint = this._displayables.sliderGroup.transformCoordToLocal(e.offsetX, e.offsetY); if (localPoint[0] < 0 || localPoint[0] > size[0] || localPoint[1] < 0 || localPoint[1] > size[1]) { return; } var handleEnds = this._handleEnds; var center2 = (handleEnds[0] + handleEnds[1]) / 2; var changed = this._updateInterval("all", localPoint[0] - center2); this._updateView(); changed && this._dispatchZoomAction(false); }; SliderZoomView2.prototype._onBrushStart = function(e) { var x = e.offsetX; var y = e.offsetY; this._brushStart = new Point(x, y); this._brushing = true; this._brushStartTime = +/* @__PURE__ */ new Date(); }; SliderZoomView2.prototype._onBrushEnd = function(e) { if (!this._brushing) { return; } var brushRect = this._displayables.brushRect; this._brushing = false; if (!brushRect) { return; } brushRect.attr("ignore", true); var brushShape = brushRect.shape; var brushEndTime = +/* @__PURE__ */ new Date(); if (brushEndTime - this._brushStartTime < 200 && Math.abs(brushShape.width) < 5) { return; } var viewExtend = this._getViewExtent(); var percentExtent = [0, 100]; this._range = asc$2([linearMap$2(brushShape.x, viewExtend, percentExtent, true), linearMap$2(brushShape.x + brushShape.width, viewExtend, percentExtent, true)]); this._handleEnds = [brushShape.x, brushShape.x + brushShape.width]; this._updateView(); this._dispatchZoomAction(false); }; SliderZoomView2.prototype._onBrush = function(e) { if (this._brushing) { stop(e.event); this._updateBrushRect(e.offsetX, e.offsetY); } }; SliderZoomView2.prototype._updateBrushRect = function(mouseX, mouseY) { var displayables = this._displayables; var dataZoomModel = this.dataZoomModel; var brushRect = displayables.brushRect; if (!brushRect) { brushRect = displayables.brushRect = new Rect({ silent: true, style: dataZoomModel.getModel("brushStyle").getItemStyle() }); displayables.sliderGroup.add(brushRect); } brushRect.attr("ignore", false); var brushStart = this._brushStart; var sliderGroup = this._displayables.sliderGroup; var endPoint = sliderGroup.transformCoordToLocal(mouseX, mouseY); var startPoint = sliderGroup.transformCoordToLocal(brushStart.x, brushStart.y); var size = this._size; endPoint[0] = Math.max(Math.min(size[0], endPoint[0]), 0); brushRect.setShape({ x: startPoint[0], y: 0, width: endPoint[0] - startPoint[0], height: size[1] }); }; SliderZoomView2.prototype._dispatchZoomAction = function(realtime) { var range = this._range; this.api.dispatchAction({ type: "dataZoom", from: this.uid, dataZoomId: this.dataZoomModel.id, animation: realtime ? REALTIME_ANIMATION_CONFIG : null, start: range[0], end: range[1] }); }; SliderZoomView2.prototype._findCoordRect = function() { var rect; var coordSysInfoList = collectReferCoordSysModelInfo(this.dataZoomModel).infoList; if (!rect && coordSysInfoList.length) { var coordSys = coordSysInfoList[0].model.coordinateSystem; rect = coordSys.getRect && coordSys.getRect(); } if (!rect) { var width = this.api.getWidth(); var height = this.api.getHeight(); rect = { x: width * 0.2, y: height * 0.2, width: width * 0.6, height: height * 0.6 }; } return rect; }; SliderZoomView2.type = "dataZoom.slider"; return SliderZoomView2; })(DataZoomView) ); function getOtherDim(thisDim) { var map2 = { x: "y", y: "x", radius: "angle", angle: "radius" }; return map2[thisDim]; } function getCursor$1(orient) { return orient === "vertical" ? "ns-resize" : "ew-resize"; } function install$9(registers) { registers.registerComponentModel(SliderZoomModel); registers.registerComponentView(SliderZoomView); installCommon$1(registers); } function install$8(registers) { use(install$a); use(install$9); } var visualDefault = { /** * @public */ get: function(visualType, key, isCategory2) { var value = clone$1((defaultOption[visualType] || {})[key]); return isCategory2 ? isArray$1(value) ? value[value.length - 1] : value : value; } }; var defaultOption = { color: { active: ["#006edd", "#e0ffff"], inactive: ["rgba(0,0,0,0)"] }, colorHue: { active: [0, 360], inactive: [0, 0] }, colorSaturation: { active: [0.3, 1], inactive: [0, 0] }, colorLightness: { active: [0.9, 0.5], inactive: [0, 0] }, colorAlpha: { active: [0.3, 1], inactive: [0, 0] }, opacity: { active: [0.3, 1], inactive: [0, 0] }, symbol: { active: ["circle", "roundRect", "diamond"], inactive: ["none"] }, symbolSize: { active: [10, 50], inactive: [0, 0] } }; var mapVisual = VisualMapping.mapVisual; var eachVisual = VisualMapping.eachVisual; var isArray = isArray$1; var each$2 = each$f; var asc = asc$2; var linearMap$1 = linearMap$2; var VisualMapModel = ( /** @class */ (function(_super) { __extends(VisualMapModel2, _super); function VisualMapModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = VisualMapModel2.type; _this.stateList = ["inRange", "outOfRange"]; _this.replacableOptionKeys = ["inRange", "outOfRange", "target", "controller", "color"]; _this.layoutMode = { type: "box", ignoreSize: true }; _this.dataBound = [-Infinity, Infinity]; _this.targetVisuals = {}; _this.controllerVisuals = {}; return _this; } VisualMapModel2.prototype.init = function(option, parentModel, ecModel) { this.mergeDefaultAndTheme(option, ecModel); }; VisualMapModel2.prototype.optionUpdated = function(newOption, isInit) { var thisOption = this.option; !isInit && replaceVisualOption(thisOption, newOption, this.replacableOptionKeys); this.textStyleModel = this.getModel("textStyle"); this.resetItemSize(); this.completeVisualOption(); }; VisualMapModel2.prototype.resetVisual = function(supplementVisualOption) { var stateList = this.stateList; supplementVisualOption = bind$1(supplementVisualOption, this); this.controllerVisuals = createVisualMappings(this.option.controller, stateList, supplementVisualOption); this.targetVisuals = createVisualMappings(this.option.target, stateList, supplementVisualOption); }; VisualMapModel2.prototype.getItemSymbol = function() { return null; }; VisualMapModel2.prototype.getTargetSeriesIndices = function() { var optionSeriesIndex = this.option.seriesIndex; var seriesIndices = []; if (optionSeriesIndex == null || optionSeriesIndex === "all") { this.ecModel.eachSeries(function(seriesModel, index) { seriesIndices.push(index); }); } else { seriesIndices = normalizeToArray(optionSeriesIndex); } return seriesIndices; }; VisualMapModel2.prototype.eachTargetSeries = function(callback, context) { each$f(this.getTargetSeriesIndices(), function(seriesIndex) { var seriesModel = this.ecModel.getSeriesByIndex(seriesIndex); if (seriesModel) { callback.call(context, seriesModel); } }, this); }; VisualMapModel2.prototype.isTargetSeries = function(seriesModel) { var is = false; this.eachTargetSeries(function(model) { model === seriesModel && (is = true); }); return is; }; VisualMapModel2.prototype.formatValueText = function(value, isCategory2, edgeSymbols) { var option = this.option; var precision = option.precision; var dataBound = this.dataBound; var formatter = option.formatter; var isMinMax; edgeSymbols = edgeSymbols || ["<", ">"]; if (isArray$1(value)) { value = value.slice(); isMinMax = true; } var textValue = isCategory2 ? value : isMinMax ? [toFixed(value[0]), toFixed(value[1])] : toFixed(value); if (isString(formatter)) { return formatter.replace("{value}", isMinMax ? textValue[0] : textValue).replace("{value2}", isMinMax ? textValue[1] : textValue); } else if (isFunction(formatter)) { return isMinMax ? formatter(value[0], value[1]) : formatter(value); } if (isMinMax) { if (value[0] === dataBound[0]) { return edgeSymbols[0] + " " + textValue[1]; } else if (value[1] === dataBound[1]) { return edgeSymbols[1] + " " + textValue[0]; } else { return textValue[0] + " - " + textValue[1]; } } else { return textValue; } function toFixed(val) { return val === dataBound[0] ? "min" : val === dataBound[1] ? "max" : (+val).toFixed(Math.min(precision, 20)); } }; VisualMapModel2.prototype.resetExtent = function() { var thisOption = this.option; var extent = asc([thisOption.min, thisOption.max]); this._dataExtent = extent; }; VisualMapModel2.prototype.getDataDimensionIndex = function(data) { var optDim = this.option.dimension; if (optDim != null) { return data.getDimensionIndex(optDim); } var dimNames = data.dimensions; for (var i = dimNames.length - 1; i >= 0; i--) { var dimName = dimNames[i]; var dimInfo = data.getDimensionInfo(dimName); if (!dimInfo.isCalculationCoord) { return dimInfo.storeDimIndex; } } }; VisualMapModel2.prototype.getExtent = function() { return this._dataExtent.slice(); }; VisualMapModel2.prototype.completeVisualOption = function() { var ecModel = this.ecModel; var thisOption = this.option; var base2 = { inRange: thisOption.inRange, outOfRange: thisOption.outOfRange }; var target = thisOption.target || (thisOption.target = {}); var controller = thisOption.controller || (thisOption.controller = {}); merge(target, base2); merge(controller, base2); var isCategory2 = this.isCategory(); completeSingle.call(this, target); completeSingle.call(this, controller); completeInactive.call(this, target, "inRange", "outOfRange"); completeController.call(this, controller); function completeSingle(base3) { if (isArray(thisOption.color) && !base3.inRange) { base3.inRange = { color: thisOption.color.slice().reverse() }; } base3.inRange = base3.inRange || { color: ecModel.get("gradientColor") }; } function completeInactive(base3, stateExist, stateAbsent) { var optExist = base3[stateExist]; var optAbsent = base3[stateAbsent]; if (optExist && !optAbsent) { optAbsent = base3[stateAbsent] = {}; each$2(optExist, function(visualData, visualType) { if (!VisualMapping.isValidType(visualType)) { return; } var defa = visualDefault.get(visualType, "inactive", isCategory2); if (defa != null) { optAbsent[visualType] = defa; if (visualType === "color" && !optAbsent.hasOwnProperty("opacity") && !optAbsent.hasOwnProperty("colorAlpha")) { optAbsent.opacity = [0, 0]; } } }); } } function completeController(controller2) { var symbolExists = (controller2.inRange || {}).symbol || (controller2.outOfRange || {}).symbol; var symbolSizeExists = (controller2.inRange || {}).symbolSize || (controller2.outOfRange || {}).symbolSize; var inactiveColor = this.get("inactiveColor"); var itemSymbol = this.getItemSymbol(); var defaultSymbol = itemSymbol || "roundRect"; each$2(this.stateList, function(state) { var itemSize = this.itemSize; var visuals = controller2[state]; if (!visuals) { visuals = controller2[state] = { color: isCategory2 ? inactiveColor : [inactiveColor] }; } if (visuals.symbol == null) { visuals.symbol = symbolExists && clone$1(symbolExists) || (isCategory2 ? defaultSymbol : [defaultSymbol]); } if (visuals.symbolSize == null) { visuals.symbolSize = symbolSizeExists && clone$1(symbolSizeExists) || (isCategory2 ? itemSize[0] : [itemSize[0], itemSize[0]]); } visuals.symbol = mapVisual(visuals.symbol, function(symbol) { return symbol === "none" ? defaultSymbol : symbol; }); var symbolSize = visuals.symbolSize; if (symbolSize != null) { var max_1 = -Infinity; eachVisual(symbolSize, function(value) { value > max_1 && (max_1 = value); }); visuals.symbolSize = mapVisual(symbolSize, function(value) { return linearMap$1(value, [0, max_1], [0, itemSize[0]], true); }); } }, this); } }; VisualMapModel2.prototype.resetItemSize = function() { this.itemSize = [parseFloat(this.get("itemWidth")), parseFloat(this.get("itemHeight"))]; }; VisualMapModel2.prototype.isCategory = function() { return !!this.option.categories; }; VisualMapModel2.prototype.setSelected = function(selected) { }; VisualMapModel2.prototype.getSelected = function() { return null; }; VisualMapModel2.prototype.getValueState = function(value) { return null; }; VisualMapModel2.prototype.getVisualMeta = function(getColorVisual2) { return null; }; VisualMapModel2.type = "visualMap"; VisualMapModel2.dependencies = ["series"]; VisualMapModel2.defaultOption = { show: true, // zlevel: 0, z: 4, seriesIndex: "all", min: 0, max: 200, left: 0, right: null, top: null, bottom: 0, itemWidth: null, itemHeight: null, inverse: false, orient: "vertical", backgroundColor: "rgba(0,0,0,0)", borderColor: "#ccc", contentColor: "#5793f3", inactiveColor: "#aaa", borderWidth: 0, padding: 5, // 接受数组分别设定上右下左边距,同css textGap: 10, precision: 0, textStyle: { color: "#333" // 值域文字颜色 } }; return VisualMapModel2; })(ComponentModel) ); var DEFAULT_BAR_BOUND = [20, 140]; var ContinuousModel = ( /** @class */ (function(_super) { __extends(ContinuousModel2, _super); function ContinuousModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = ContinuousModel2.type; return _this; } ContinuousModel2.prototype.optionUpdated = function(newOption, isInit) { _super.prototype.optionUpdated.apply(this, arguments); this.resetExtent(); this.resetVisual(function(mappingOption) { mappingOption.mappingMethod = "linear"; mappingOption.dataExtent = this.getExtent(); }); this._resetRange(); }; ContinuousModel2.prototype.resetItemSize = function() { _super.prototype.resetItemSize.apply(this, arguments); var itemSize = this.itemSize; (itemSize[0] == null || isNaN(itemSize[0])) && (itemSize[0] = DEFAULT_BAR_BOUND[0]); (itemSize[1] == null || isNaN(itemSize[1])) && (itemSize[1] = DEFAULT_BAR_BOUND[1]); }; ContinuousModel2.prototype._resetRange = function() { var dataExtent = this.getExtent(); var range = this.option.range; if (!range || range.auto) { dataExtent.auto = 1; this.option.range = dataExtent; } else if (isArray$1(range)) { if (range[0] > range[1]) { range.reverse(); } range[0] = Math.max(range[0], dataExtent[0]); range[1] = Math.min(range[1], dataExtent[1]); } }; ContinuousModel2.prototype.completeVisualOption = function() { _super.prototype.completeVisualOption.apply(this, arguments); each$f(this.stateList, function(state) { var symbolSize = this.option.controller[state].symbolSize; if (symbolSize && symbolSize[0] !== symbolSize[1]) { symbolSize[0] = symbolSize[1] / 3; } }, this); }; ContinuousModel2.prototype.setSelected = function(selected) { this.option.range = selected.slice(); this._resetRange(); }; ContinuousModel2.prototype.getSelected = function() { var dataExtent = this.getExtent(); var dataInterval = asc$2((this.get("range") || []).slice()); dataInterval[0] > dataExtent[1] && (dataInterval[0] = dataExtent[1]); dataInterval[1] > dataExtent[1] && (dataInterval[1] = dataExtent[1]); dataInterval[0] < dataExtent[0] && (dataInterval[0] = dataExtent[0]); dataInterval[1] < dataExtent[0] && (dataInterval[1] = dataExtent[0]); return dataInterval; }; ContinuousModel2.prototype.getValueState = function(value) { var range = this.option.range; var dataExtent = this.getExtent(); return (range[0] <= dataExtent[0] || range[0] <= value) && (range[1] >= dataExtent[1] || value <= range[1]) ? "inRange" : "outOfRange"; }; ContinuousModel2.prototype.findTargetDataIndices = function(range) { var result = []; this.eachTargetSeries(function(seriesModel) { var dataIndices = []; var data = seriesModel.getData(); data.each(this.getDataDimensionIndex(data), function(value, dataIndex) { range[0] <= value && value <= range[1] && dataIndices.push(dataIndex); }, this); result.push({ seriesId: seriesModel.id, dataIndex: dataIndices }); }, this); return result; }; ContinuousModel2.prototype.getVisualMeta = function(getColorVisual2) { var oVals = getColorStopValues(this, "outOfRange", this.getExtent()); var iVals = getColorStopValues(this, "inRange", this.option.range.slice()); var stops = []; function setStop(value, valueState) { stops.push({ value, color: getColorVisual2(value, valueState) }); } var iIdx = 0; var oIdx = 0; var iLen = iVals.length; var oLen = oVals.length; for (; oIdx < oLen && (!iVals.length || oVals[oIdx] <= iVals[0]); oIdx++) { if (oVals[oIdx] < iVals[iIdx]) { setStop(oVals[oIdx], "outOfRange"); } } for (var first = 1; iIdx < iLen; iIdx++, first = 0) { first && stops.length && setStop(iVals[iIdx], "outOfRange"); setStop(iVals[iIdx], "inRange"); } for (var first = 1; oIdx < oLen; oIdx++) { if (!iVals.length || iVals[iVals.length - 1] < oVals[oIdx]) { if (first) { stops.length && setStop(stops[stops.length - 1].value, "outOfRange"); first = 0; } setStop(oVals[oIdx], "outOfRange"); } } var stopsLen = stops.length; return { stops, outerColors: [stopsLen ? stops[0].color : "transparent", stopsLen ? stops[stopsLen - 1].color : "transparent"] }; }; ContinuousModel2.type = "visualMap.continuous"; ContinuousModel2.defaultOption = inheritDefaultOption(VisualMapModel.defaultOption, { align: "auto", calculable: false, hoverLink: true, realtime: true, handleIcon: "path://M-11.39,9.77h0a3.5,3.5,0,0,1-3.5,3.5h-22a3.5,3.5,0,0,1-3.5-3.5h0a3.5,3.5,0,0,1,3.5-3.5h22A3.5,3.5,0,0,1-11.39,9.77Z", handleSize: "120%", handleStyle: { borderColor: "#fff", borderWidth: 1 }, indicatorIcon: "circle", indicatorSize: "50%", indicatorStyle: { borderColor: "#fff", borderWidth: 2, shadowBlur: 2, shadowOffsetX: 1, shadowOffsetY: 1, shadowColor: "rgba(0,0,0,0.2)" } // emphasis: { // handleStyle: { // shadowBlur: 3, // shadowOffsetX: 1, // shadowOffsetY: 1, // shadowColor: 'rgba(0,0,0,0.2)' // } // } }); return ContinuousModel2; })(VisualMapModel) ); function getColorStopValues(visualMapModel, valueState, dataExtent) { if (dataExtent[0] === dataExtent[1]) { return dataExtent.slice(); } var count2 = 200; var step = (dataExtent[1] - dataExtent[0]) / count2; var value = dataExtent[0]; var stopValues = []; for (var i = 0; i <= count2 && value < dataExtent[1]; i++) { stopValues.push(value); value += step; } stopValues.push(dataExtent[1]); return stopValues; } var VisualMapView = ( /** @class */ (function(_super) { __extends(VisualMapView2, _super); function VisualMapView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = VisualMapView2.type; _this.autoPositionValues = { left: 1, right: 1, top: 1, bottom: 1 }; return _this; } VisualMapView2.prototype.init = function(ecModel, api) { this.ecModel = ecModel; this.api = api; }; VisualMapView2.prototype.render = function(visualMapModel, ecModel, api, payload) { this.visualMapModel = visualMapModel; if (visualMapModel.get("show") === false) { this.group.removeAll(); return; } this.doRender(visualMapModel, ecModel, api, payload); }; VisualMapView2.prototype.renderBackground = function(group) { var visualMapModel = this.visualMapModel; var padding = normalizeCssArray(visualMapModel.get("padding") || 0); var rect = group.getBoundingRect(); group.add(new Rect$2({ z2: -1, silent: true, shape: { x: rect.x - padding[3], y: rect.y - padding[0], width: rect.width + padding[3] + padding[1], height: rect.height + padding[0] + padding[2] }, style: { fill: visualMapModel.get("backgroundColor"), stroke: visualMapModel.get("borderColor"), lineWidth: visualMapModel.get("borderWidth") } })); }; VisualMapView2.prototype.getControllerVisual = function(targetValue, visualCluster, opts) { opts = opts || {}; var forceState = opts.forceState; var visualMapModel = this.visualMapModel; var visualObj = {}; if (visualCluster === "color") { var defaultColor = visualMapModel.get("contentColor"); visualObj.color = defaultColor; } function getter(key) { return visualObj[key]; } function setter(key, value) { visualObj[key] = value; } var mappings = visualMapModel.controllerVisuals[forceState || visualMapModel.getValueState(targetValue)]; var visualTypes = VisualMapping.prepareVisualTypes(mappings); each$f(visualTypes, function(type) { var visualMapping = mappings[type]; if (opts.convertOpacityToAlpha && type === "opacity") { type = "colorAlpha"; visualMapping = mappings.__alphaForOpacity; } if (VisualMapping.dependsOn(type, visualCluster)) { visualMapping && visualMapping.applyVisual(targetValue, getter, setter); } }); return visualObj[visualCluster]; }; VisualMapView2.prototype.positionGroup = function(group) { var model = this.visualMapModel; var api = this.api; positionElement(group, model.getBoxLayoutParams(), { width: api.getWidth(), height: api.getHeight() }); }; VisualMapView2.prototype.doRender = function(visualMapModel, ecModel, api, payload) { }; VisualMapView2.type = "visualMap"; return VisualMapView2; })(ComponentView) ); var paramsSet = [["left", "right", "width"], ["top", "bottom", "height"]]; function getItemAlign(visualMapModel, api, itemSize) { var modelOption = visualMapModel.option; var itemAlign = modelOption.align; if (itemAlign != null && itemAlign !== "auto") { return itemAlign; } var ecSize = { width: api.getWidth(), height: api.getHeight() }; var realIndex = modelOption.orient === "horizontal" ? 1 : 0; var reals = paramsSet[realIndex]; var fakeValue = [0, null, 10]; var layoutInput = {}; for (var i = 0; i < 3; i++) { layoutInput[paramsSet[1 - realIndex][i]] = fakeValue[i]; layoutInput[reals[i]] = i === 2 ? itemSize[0] : modelOption[reals[i]]; } var rParam = [["x", "width", 3], ["y", "height", 0]][realIndex]; var rect = getLayoutRect(layoutInput, ecSize, modelOption.padding); return reals[(rect.margin[rParam[2]] || 0) + rect[rParam[0]] + rect[rParam[1]] * 0.5 < ecSize[rParam[1]] * 0.5 ? 0 : 1]; } function makeHighDownBatch(batch, visualMapModel) { each$f(batch || [], function(batchItem) { if (batchItem.dataIndex != null) { batchItem.dataIndexInside = batchItem.dataIndex; batchItem.dataIndex = null; } batchItem.highlightKey = "visualMap" + (visualMapModel ? visualMapModel.componentIndex : ""); }); return batch; } var linearMap = linearMap$2; var each$1 = each$f; var mathMin = Math.min; var mathMax = Math.max; var HOVER_LINK_SIZE = 12; var HOVER_LINK_OUT = 6; var ContinuousView = ( /** @class */ (function(_super) { __extends(ContinuousView2, _super); function ContinuousView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = ContinuousView2.type; _this._shapes = {}; _this._dataInterval = []; _this._handleEnds = []; _this._hoverLinkDataIndices = []; return _this; } ContinuousView2.prototype.init = function(ecModel, api) { _super.prototype.init.call(this, ecModel, api); this._hoverLinkFromSeriesMouseOver = bind$1(this._hoverLinkFromSeriesMouseOver, this); this._hideIndicator = bind$1(this._hideIndicator, this); }; ContinuousView2.prototype.doRender = function(visualMapModel, ecModel, api, payload) { if (!payload || payload.type !== "selectDataRange" || payload.from !== this.uid) { this._buildView(); } }; ContinuousView2.prototype._buildView = function() { this.group.removeAll(); var visualMapModel = this.visualMapModel; var thisGroup = this.group; this._orient = visualMapModel.get("orient"); this._useHandle = visualMapModel.get("calculable"); this._resetInterval(); this._renderBar(thisGroup); var dataRangeText = visualMapModel.get("text"); this._renderEndsText(thisGroup, dataRangeText, 0); this._renderEndsText(thisGroup, dataRangeText, 1); this._updateView(true); this.renderBackground(thisGroup); this._updateView(); this._enableHoverLinkToSeries(); this._enableHoverLinkFromSeries(); this.positionGroup(thisGroup); }; ContinuousView2.prototype._renderEndsText = function(group, dataRangeText, endsIndex) { if (!dataRangeText) { return; } var text = dataRangeText[1 - endsIndex]; text = text != null ? text + "" : ""; var visualMapModel = this.visualMapModel; var textGap = visualMapModel.get("textGap"); var itemSize = visualMapModel.itemSize; var barGroup = this._shapes.mainGroup; var position2 = this._applyTransform([itemSize[0] / 2, endsIndex === 0 ? -textGap : itemSize[1] + textGap], barGroup); var align = this._applyTransform(endsIndex === 0 ? "bottom" : "top", barGroup); var orient = this._orient; var textStyleModel = this.visualMapModel.textStyleModel; this.group.add(new ZRText({ style: createTextStyle(textStyleModel, { x: position2[0], y: position2[1], verticalAlign: orient === "horizontal" ? "middle" : align, align: orient === "horizontal" ? align : "center", text }) })); }; ContinuousView2.prototype._renderBar = function(targetGroup) { var visualMapModel = this.visualMapModel; var shapes = this._shapes; var itemSize = visualMapModel.itemSize; var orient = this._orient; var useHandle = this._useHandle; var itemAlign = getItemAlign(visualMapModel, this.api, itemSize); var mainGroup = shapes.mainGroup = this._createBarGroup(itemAlign); var gradientBarGroup = new Group$3(); mainGroup.add(gradientBarGroup); gradientBarGroup.add(shapes.outOfRange = createPolygon()); gradientBarGroup.add(shapes.inRange = createPolygon(null, useHandle ? getCursor(this._orient) : null, bind$1(this._dragHandle, this, "all", false), bind$1(this._dragHandle, this, "all", true))); gradientBarGroup.setClipPath(new Rect$2({ shape: { x: 0, y: 0, width: itemSize[0], height: itemSize[1], r: 3 } })); var textRect = visualMapModel.textStyleModel.getTextRect("国"); var textSize = mathMax(textRect.width, textRect.height); if (useHandle) { shapes.handleThumbs = []; shapes.handleLabels = []; shapes.handleLabelPoints = []; this._createHandle(visualMapModel, mainGroup, 0, itemSize, textSize, orient); this._createHandle(visualMapModel, mainGroup, 1, itemSize, textSize, orient); } this._createIndicator(visualMapModel, mainGroup, itemSize, textSize, orient); targetGroup.add(mainGroup); }; ContinuousView2.prototype._createHandle = function(visualMapModel, mainGroup, handleIndex, itemSize, textSize, orient) { var onDrift = bind$1(this._dragHandle, this, handleIndex, false); var onDragEnd = bind$1(this._dragHandle, this, handleIndex, true); var handleSize = parsePercent$1(visualMapModel.get("handleSize"), itemSize[0]); var handleThumb = createSymbol$1(visualMapModel.get("handleIcon"), -handleSize / 2, -handleSize / 2, handleSize, handleSize, null, true); var cursor = getCursor(this._orient); handleThumb.attr({ cursor, draggable: true, drift: onDrift, ondragend: onDragEnd, onmousemove: function(e) { stop(e.event); } }); handleThumb.x = itemSize[0] / 2; handleThumb.useStyle(visualMapModel.getModel("handleStyle").getItemStyle()); handleThumb.setStyle({ strokeNoScale: true, strokeFirst: true }); handleThumb.style.lineWidth *= 2; handleThumb.ensureState("emphasis").style = visualMapModel.getModel(["emphasis", "handleStyle"]).getItemStyle(); setAsHighDownDispatcher(handleThumb, true); mainGroup.add(handleThumb); var textStyleModel = this.visualMapModel.textStyleModel; var handleLabel = new ZRText({ cursor, draggable: true, drift: onDrift, onmousemove: function(e) { stop(e.event); }, ondragend: onDragEnd, style: createTextStyle(textStyleModel, { x: 0, y: 0, text: "" }) }); handleLabel.ensureState("blur").style = { opacity: 0.1 }; handleLabel.stateTransition = { duration: 200 }; this.group.add(handleLabel); var handleLabelPoint = [handleSize, 0]; var shapes = this._shapes; shapes.handleThumbs[handleIndex] = handleThumb; shapes.handleLabelPoints[handleIndex] = handleLabelPoint; shapes.handleLabels[handleIndex] = handleLabel; }; ContinuousView2.prototype._createIndicator = function(visualMapModel, mainGroup, itemSize, textSize, orient) { var scale2 = parsePercent$1(visualMapModel.get("indicatorSize"), itemSize[0]); var indicator = createSymbol$1(visualMapModel.get("indicatorIcon"), -scale2 / 2, -scale2 / 2, scale2, scale2, null, true); indicator.attr({ cursor: "move", invisible: true, silent: true, x: itemSize[0] / 2 }); var indicatorStyle = visualMapModel.getModel("indicatorStyle").getItemStyle(); if (indicator instanceof ZRImage) { var pathStyle = indicator.style; indicator.useStyle(extend({ // TODO other properties like x, y ? image: pathStyle.image, x: pathStyle.x, y: pathStyle.y, width: pathStyle.width, height: pathStyle.height }, indicatorStyle)); } else { indicator.useStyle(indicatorStyle); } mainGroup.add(indicator); var textStyleModel = this.visualMapModel.textStyleModel; var indicatorLabel = new ZRText({ silent: true, invisible: true, style: createTextStyle(textStyleModel, { x: 0, y: 0, text: "" }) }); this.group.add(indicatorLabel); var indicatorLabelPoint = [(orient === "horizontal" ? textSize / 2 : HOVER_LINK_OUT) + itemSize[0] / 2, 0]; var shapes = this._shapes; shapes.indicator = indicator; shapes.indicatorLabel = indicatorLabel; shapes.indicatorLabelPoint = indicatorLabelPoint; this._firstShowIndicator = true; }; ContinuousView2.prototype._dragHandle = function(handleIndex, isEnd, dx, dy) { if (!this._useHandle) { return; } this._dragging = !isEnd; if (!isEnd) { var vertex = this._applyTransform([dx, dy], this._shapes.mainGroup, true); this._updateInterval(handleIndex, vertex[1]); this._hideIndicator(); this._updateView(); } if (isEnd === !this.visualMapModel.get("realtime")) { this.api.dispatchAction({ type: "selectDataRange", from: this.uid, visualMapId: this.visualMapModel.id, selected: this._dataInterval.slice() }); } if (isEnd) { !this._hovering && this._clearHoverLinkToSeries(); } else if (useHoverLinkOnHandle(this.visualMapModel)) { this._doHoverLinkToSeries(this._handleEnds[handleIndex], false); } }; ContinuousView2.prototype._resetInterval = function() { var visualMapModel = this.visualMapModel; var dataInterval = this._dataInterval = visualMapModel.getSelected(); var dataExtent = visualMapModel.getExtent(); var sizeExtent = [0, visualMapModel.itemSize[1]]; this._handleEnds = [linearMap(dataInterval[0], dataExtent, sizeExtent, true), linearMap(dataInterval[1], dataExtent, sizeExtent, true)]; }; ContinuousView2.prototype._updateInterval = function(handleIndex, delta) { delta = delta || 0; var visualMapModel = this.visualMapModel; var handleEnds = this._handleEnds; var sizeExtent = [0, visualMapModel.itemSize[1]]; sliderMove( delta, handleEnds, sizeExtent, handleIndex, // cross is forbidden 0 ); var dataExtent = visualMapModel.getExtent(); this._dataInterval = [linearMap(handleEnds[0], sizeExtent, dataExtent, true), linearMap(handleEnds[1], sizeExtent, dataExtent, true)]; }; ContinuousView2.prototype._updateView = function(forSketch) { var visualMapModel = this.visualMapModel; var dataExtent = visualMapModel.getExtent(); var shapes = this._shapes; var outOfRangeHandleEnds = [0, visualMapModel.itemSize[1]]; var inRangeHandleEnds = forSketch ? outOfRangeHandleEnds : this._handleEnds; var visualInRange = this._createBarVisual(this._dataInterval, dataExtent, inRangeHandleEnds, "inRange"); var visualOutOfRange = this._createBarVisual(dataExtent, dataExtent, outOfRangeHandleEnds, "outOfRange"); shapes.inRange.setStyle({ fill: visualInRange.barColor // opacity: visualInRange.opacity }).setShape("points", visualInRange.barPoints); shapes.outOfRange.setStyle({ fill: visualOutOfRange.barColor // opacity: visualOutOfRange.opacity }).setShape("points", visualOutOfRange.barPoints); this._updateHandle(inRangeHandleEnds, visualInRange); }; ContinuousView2.prototype._createBarVisual = function(dataInterval, dataExtent, handleEnds, forceState) { var opts = { forceState, convertOpacityToAlpha: true }; var colorStops = this._makeColorGradient(dataInterval, opts); var symbolSizes = [this.getControllerVisual(dataInterval[0], "symbolSize", opts), this.getControllerVisual(dataInterval[1], "symbolSize", opts)]; var barPoints = this._createBarPoints(handleEnds, symbolSizes); return { barColor: new LinearGradient(0, 0, 0, 1, colorStops), barPoints, handlesColor: [colorStops[0].color, colorStops[colorStops.length - 1].color] }; }; ContinuousView2.prototype._makeColorGradient = function(dataInterval, opts) { var sampleNumber = 100; var colorStops = []; var step = (dataInterval[1] - dataInterval[0]) / sampleNumber; colorStops.push({ color: this.getControllerVisual(dataInterval[0], "color", opts), offset: 0 }); for (var i = 1; i < sampleNumber; i++) { var currValue = dataInterval[0] + step * i; if (currValue > dataInterval[1]) { break; } colorStops.push({ color: this.getControllerVisual(currValue, "color", opts), offset: i / sampleNumber }); } colorStops.push({ color: this.getControllerVisual(dataInterval[1], "color", opts), offset: 1 }); return colorStops; }; ContinuousView2.prototype._createBarPoints = function(handleEnds, symbolSizes) { var itemSize = this.visualMapModel.itemSize; return [[itemSize[0] - symbolSizes[0], handleEnds[0]], [itemSize[0], handleEnds[0]], [itemSize[0], handleEnds[1]], [itemSize[0] - symbolSizes[1], handleEnds[1]]]; }; ContinuousView2.prototype._createBarGroup = function(itemAlign) { var orient = this._orient; var inverse = this.visualMapModel.get("inverse"); return new Group$3(orient === "horizontal" && !inverse ? { scaleX: itemAlign === "bottom" ? 1 : -1, rotation: Math.PI / 2 } : orient === "horizontal" && inverse ? { scaleX: itemAlign === "bottom" ? -1 : 1, rotation: -Math.PI / 2 } : orient === "vertical" && !inverse ? { scaleX: itemAlign === "left" ? 1 : -1, scaleY: -1 } : { scaleX: itemAlign === "left" ? 1 : -1 }); }; ContinuousView2.prototype._updateHandle = function(handleEnds, visualInRange) { if (!this._useHandle) { return; } var shapes = this._shapes; var visualMapModel = this.visualMapModel; var handleThumbs = shapes.handleThumbs; var handleLabels = shapes.handleLabels; var itemSize = visualMapModel.itemSize; var dataExtent = visualMapModel.getExtent(); var align = this._applyTransform("left", shapes.mainGroup); each$1([0, 1], function(handleIndex) { var handleThumb = handleThumbs[handleIndex]; handleThumb.setStyle("fill", visualInRange.handlesColor[handleIndex]); handleThumb.y = handleEnds[handleIndex]; var val = linearMap(handleEnds[handleIndex], [0, itemSize[1]], dataExtent, true); var symbolSize = this.getControllerVisual(val, "symbolSize"); handleThumb.scaleX = handleThumb.scaleY = symbolSize / itemSize[0]; handleThumb.x = itemSize[0] - symbolSize / 2; var textPoint = applyTransform(shapes.handleLabelPoints[handleIndex], getTransform$1(handleThumb, this.group)); if (this._orient === "horizontal") { var minimumOffset = align === "left" || align === "top" ? (itemSize[0] - symbolSize) / 2 : (itemSize[0] - symbolSize) / -2; textPoint[1] += minimumOffset; } handleLabels[handleIndex].setStyle({ x: textPoint[0], y: textPoint[1], text: visualMapModel.formatValueText(this._dataInterval[handleIndex]), verticalAlign: "middle", align: this._orient === "vertical" ? this._applyTransform("left", shapes.mainGroup) : "center" }); }, this); }; ContinuousView2.prototype._showIndicator = function(cursorValue, textValue, rangeSymbol, halfHoverLinkSize) { var visualMapModel = this.visualMapModel; var dataExtent = visualMapModel.getExtent(); var itemSize = visualMapModel.itemSize; var sizeExtent = [0, itemSize[1]]; var shapes = this._shapes; var indicator = shapes.indicator; if (!indicator) { return; } indicator.attr("invisible", false); var opts = { convertOpacityToAlpha: true }; var color = this.getControllerVisual(cursorValue, "color", opts); var symbolSize = this.getControllerVisual(cursorValue, "symbolSize"); var y = linearMap(cursorValue, dataExtent, sizeExtent, true); var x = itemSize[0] - symbolSize / 2; var oldIndicatorPos = { x: indicator.x, y: indicator.y }; indicator.y = y; indicator.x = x; var textPoint = applyTransform(shapes.indicatorLabelPoint, getTransform$1(indicator, this.group)); var indicatorLabel = shapes.indicatorLabel; indicatorLabel.attr("invisible", false); var align = this._applyTransform("left", shapes.mainGroup); var orient = this._orient; var isHorizontal = orient === "horizontal"; indicatorLabel.setStyle({ text: (rangeSymbol ? rangeSymbol : "") + visualMapModel.formatValueText(textValue), verticalAlign: isHorizontal ? align : "middle", align: isHorizontal ? "center" : align }); var indicatorNewProps = { x, y, style: { fill: color } }; var labelNewProps = { style: { x: textPoint[0], y: textPoint[1] } }; if (visualMapModel.ecModel.isAnimationEnabled() && !this._firstShowIndicator) { var animationCfg = { duration: 100, easing: "cubicInOut", additive: true }; indicator.x = oldIndicatorPos.x; indicator.y = oldIndicatorPos.y; indicator.animateTo(indicatorNewProps, animationCfg); indicatorLabel.animateTo(labelNewProps, animationCfg); } else { indicator.attr(indicatorNewProps); indicatorLabel.attr(labelNewProps); } this._firstShowIndicator = false; var handleLabels = this._shapes.handleLabels; if (handleLabels) { for (var i = 0; i < handleLabels.length; i++) { this.api.enterBlur(handleLabels[i]); } } }; ContinuousView2.prototype._enableHoverLinkToSeries = function() { var self = this; this._shapes.mainGroup.on("mousemove", function(e) { self._hovering = true; if (!self._dragging) { var itemSize = self.visualMapModel.itemSize; var pos = self._applyTransform([e.offsetX, e.offsetY], self._shapes.mainGroup, true, true); pos[1] = mathMin(mathMax(0, pos[1]), itemSize[1]); self._doHoverLinkToSeries(pos[1], 0 <= pos[0] && pos[0] <= itemSize[0]); } }).on("mouseout", function() { self._hovering = false; !self._dragging && self._clearHoverLinkToSeries(); }); }; ContinuousView2.prototype._enableHoverLinkFromSeries = function() { var zr = this.api.getZr(); if (this.visualMapModel.option.hoverLink) { zr.on("mouseover", this._hoverLinkFromSeriesMouseOver, this); zr.on("mouseout", this._hideIndicator, this); } else { this._clearHoverLinkFromSeries(); } }; ContinuousView2.prototype._doHoverLinkToSeries = function(cursorPos, hoverOnBar) { var visualMapModel = this.visualMapModel; var itemSize = visualMapModel.itemSize; if (!visualMapModel.option.hoverLink) { return; } var sizeExtent = [0, itemSize[1]]; var dataExtent = visualMapModel.getExtent(); cursorPos = mathMin(mathMax(sizeExtent[0], cursorPos), sizeExtent[1]); var halfHoverLinkSize = getHalfHoverLinkSize(visualMapModel, dataExtent, sizeExtent); var hoverRange = [cursorPos - halfHoverLinkSize, cursorPos + halfHoverLinkSize]; var cursorValue = linearMap(cursorPos, sizeExtent, dataExtent, true); var valueRange = [linearMap(hoverRange[0], sizeExtent, dataExtent, true), linearMap(hoverRange[1], sizeExtent, dataExtent, true)]; hoverRange[0] < sizeExtent[0] && (valueRange[0] = -Infinity); hoverRange[1] > sizeExtent[1] && (valueRange[1] = Infinity); if (hoverOnBar) { if (valueRange[0] === -Infinity) { this._showIndicator(cursorValue, valueRange[1], "< ", halfHoverLinkSize); } else if (valueRange[1] === Infinity) { this._showIndicator(cursorValue, valueRange[0], "> ", halfHoverLinkSize); } else { this._showIndicator(cursorValue, cursorValue, "≈ ", halfHoverLinkSize); } } var oldBatch = this._hoverLinkDataIndices; var newBatch = []; if (hoverOnBar || useHoverLinkOnHandle(visualMapModel)) { newBatch = this._hoverLinkDataIndices = visualMapModel.findTargetDataIndices(valueRange); } var resultBatches = compressBatches(oldBatch, newBatch); this._dispatchHighDown("downplay", makeHighDownBatch(resultBatches[0], visualMapModel)); this._dispatchHighDown("highlight", makeHighDownBatch(resultBatches[1], visualMapModel)); }; ContinuousView2.prototype._hoverLinkFromSeriesMouseOver = function(e) { var ecData; findEventDispatcher(e.target, function(target) { var currECData = getECData(target); if (currECData.dataIndex != null) { ecData = currECData; return true; } }, true); if (!ecData) { return; } var dataModel = this.ecModel.getSeriesByIndex(ecData.seriesIndex); var visualMapModel = this.visualMapModel; if (!visualMapModel.isTargetSeries(dataModel)) { return; } var data = dataModel.getData(ecData.dataType); var value = data.getStore().get(visualMapModel.getDataDimensionIndex(data), ecData.dataIndex); if (!isNaN(value)) { this._showIndicator(value, value); } }; ContinuousView2.prototype._hideIndicator = function() { var shapes = this._shapes; shapes.indicator && shapes.indicator.attr("invisible", true); shapes.indicatorLabel && shapes.indicatorLabel.attr("invisible", true); var handleLabels = this._shapes.handleLabels; if (handleLabels) { for (var i = 0; i < handleLabels.length; i++) { this.api.leaveBlur(handleLabels[i]); } } }; ContinuousView2.prototype._clearHoverLinkToSeries = function() { this._hideIndicator(); var indices = this._hoverLinkDataIndices; this._dispatchHighDown("downplay", makeHighDownBatch(indices, this.visualMapModel)); indices.length = 0; }; ContinuousView2.prototype._clearHoverLinkFromSeries = function() { this._hideIndicator(); var zr = this.api.getZr(); zr.off("mouseover", this._hoverLinkFromSeriesMouseOver); zr.off("mouseout", this._hideIndicator); }; ContinuousView2.prototype._applyTransform = function(vertex, element, inverse, global) { var transform2 = getTransform$1(element, global ? null : this.group); return isArray$1(vertex) ? applyTransform(vertex, transform2, inverse) : transformDirection(vertex, transform2, inverse); }; ContinuousView2.prototype._dispatchHighDown = function(type, batch) { batch && batch.length && this.api.dispatchAction({ type, batch }); }; ContinuousView2.prototype.dispose = function() { this._clearHoverLinkFromSeries(); this._clearHoverLinkToSeries(); }; ContinuousView2.type = "visualMap.continuous"; return ContinuousView2; })(VisualMapView) ); function createPolygon(points2, cursor, onDrift, onDragEnd) { return new Polygon({ shape: { points: points2 }, draggable: !!onDrift, cursor, drift: onDrift, onmousemove: function(e) { stop(e.event); }, ondragend: onDragEnd }); } function getHalfHoverLinkSize(visualMapModel, dataExtent, sizeExtent) { var halfHoverLinkSize = HOVER_LINK_SIZE / 2; var hoverLinkDataSize = visualMapModel.get("hoverLinkDataSize"); if (hoverLinkDataSize) { halfHoverLinkSize = linearMap(hoverLinkDataSize, dataExtent, sizeExtent, true) / 2; } return halfHoverLinkSize; } function useHoverLinkOnHandle(visualMapModel) { var hoverLinkOnHandle = visualMapModel.get("hoverLinkOnHandle"); return !!(hoverLinkOnHandle == null ? visualMapModel.get("realtime") : hoverLinkOnHandle); } function getCursor(orient) { return orient === "vertical" ? "ns-resize" : "ew-resize"; } var visualMapActionInfo = { type: "selectDataRange", event: "dataRangeSelected", // FIXME use updateView appears wrong update: "update" }; var visualMapActionHander = function(payload, ecModel) { ecModel.eachComponent({ mainType: "visualMap", query: payload }, function(model) { model.setSelected(payload.selected); }); }; var visualMapEncodingHandlers = [ { createOnAllSeries: true, reset: function(seriesModel, ecModel) { var resetDefines = []; ecModel.eachComponent("visualMap", function(visualMapModel) { var pipelineContext = seriesModel.pipelineContext; if (!visualMapModel.isTargetSeries(seriesModel) || pipelineContext && pipelineContext.large) { return; } resetDefines.push(incrementalApplyVisual(visualMapModel.stateList, visualMapModel.targetVisuals, bind$1(visualMapModel.getValueState, visualMapModel), visualMapModel.getDataDimensionIndex(seriesModel.getData()))); }); return resetDefines; } }, // Only support color. { createOnAllSeries: true, reset: function(seriesModel, ecModel) { var data = seriesModel.getData(); var visualMetaList = []; ecModel.eachComponent("visualMap", function(visualMapModel) { if (visualMapModel.isTargetSeries(seriesModel)) { var visualMeta = visualMapModel.getVisualMeta(bind$1(getColorVisual, null, seriesModel, visualMapModel)) || { stops: [], outerColors: [] }; var dimIdx = visualMapModel.getDataDimensionIndex(data); if (dimIdx >= 0) { visualMeta.dimension = dimIdx; visualMetaList.push(visualMeta); } } }); seriesModel.getData().setVisual("visualMeta", visualMetaList); } } ]; function getColorVisual(seriesModel, visualMapModel, value, valueState) { var mappings = visualMapModel.targetVisuals[valueState]; var visualTypes = VisualMapping.prepareVisualTypes(mappings); var resultVisual = { color: getVisualFromData(seriesModel.getData(), "color") // default color. }; for (var i = 0, len2 = visualTypes.length; i < len2; i++) { var type = visualTypes[i]; var mapping = mappings[type === "opacity" ? "__alphaForOpacity" : type]; mapping && mapping.applyVisual(value, getVisual, setVisual); } return resultVisual.color; function getVisual(key) { return resultVisual[key]; } function setVisual(key, value2) { resultVisual[key] = value2; } } var each = each$f; function visualMapPreprocessor(option) { var visualMap = option && option.visualMap; if (!isArray$1(visualMap)) { visualMap = visualMap ? [visualMap] : []; } each(visualMap, function(opt) { if (!opt) { return; } if (has(opt, "splitList") && !has(opt, "pieces")) { opt.pieces = opt.splitList; delete opt.splitList; } var pieces = opt.pieces; if (pieces && isArray$1(pieces)) { each(pieces, function(piece) { if (isObject$3(piece)) { if (has(piece, "start") && !has(piece, "min")) { piece.min = piece.start; } if (has(piece, "end") && !has(piece, "max")) { piece.max = piece.end; } } }); } }); } function has(obj, name) { return obj && obj.hasOwnProperty && obj.hasOwnProperty(name); } var installed = false; function installCommon(registers) { if (installed) { return; } installed = true; registers.registerSubTypeDefaulter("visualMap", function(option) { return !option.categories && (!(option.pieces ? option.pieces.length > 0 : option.splitNumber > 0) || option.calculable) ? "continuous" : "piecewise"; }); registers.registerAction(visualMapActionInfo, visualMapActionHander); each$f(visualMapEncodingHandlers, function(handler) { registers.registerVisual(registers.PRIORITY.VISUAL.COMPONENT, handler); }); registers.registerPreprocessor(visualMapPreprocessor); } function install$7(registers) { registers.registerComponentModel(ContinuousModel); registers.registerComponentView(ContinuousView); installCommon(registers); } var PiecewiseModel = ( /** @class */ (function(_super) { __extends(PiecewiseModel2, _super); function PiecewiseModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = PiecewiseModel2.type; _this._pieceList = []; return _this; } PiecewiseModel2.prototype.optionUpdated = function(newOption, isInit) { _super.prototype.optionUpdated.apply(this, arguments); this.resetExtent(); var mode = this._mode = this._determineMode(); this._pieceList = []; resetMethods[this._mode].call(this, this._pieceList); this._resetSelected(newOption, isInit); var categories = this.option.categories; this.resetVisual(function(mappingOption, state) { if (mode === "categories") { mappingOption.mappingMethod = "category"; mappingOption.categories = clone$1(categories); } else { mappingOption.dataExtent = this.getExtent(); mappingOption.mappingMethod = "piecewise"; mappingOption.pieceList = map$1(this._pieceList, function(piece) { piece = clone$1(piece); if (state !== "inRange") { piece.visual = null; } return piece; }); } }); }; PiecewiseModel2.prototype.completeVisualOption = function() { var option = this.option; var visualTypesInPieces = {}; var visualTypes = VisualMapping.listVisualTypes(); var isCategory2 = this.isCategory(); each$f(option.pieces, function(piece) { each$f(visualTypes, function(visualType) { if (piece.hasOwnProperty(visualType)) { visualTypesInPieces[visualType] = 1; } }); }); each$f(visualTypesInPieces, function(v, visualType) { var exists = false; each$f(this.stateList, function(state) { exists = exists || has2(option, state, visualType) || has2(option.target, state, visualType); }, this); !exists && each$f(this.stateList, function(state) { (option[state] || (option[state] = {}))[visualType] = visualDefault.get(visualType, state === "inRange" ? "active" : "inactive", isCategory2); }); }, this); function has2(obj, state, visualType) { return obj && obj[state] && obj[state].hasOwnProperty(visualType); } _super.prototype.completeVisualOption.apply(this, arguments); }; PiecewiseModel2.prototype._resetSelected = function(newOption, isInit) { var thisOption = this.option; var pieceList = this._pieceList; var selected = (isInit ? thisOption : newOption).selected || {}; thisOption.selected = selected; each$f(pieceList, function(piece, index) { var key = this.getSelectedMapKey(piece); if (!selected.hasOwnProperty(key)) { selected[key] = true; } }, this); if (thisOption.selectedMode === "single") { var hasSel_1 = false; each$f(pieceList, function(piece, index) { var key = this.getSelectedMapKey(piece); if (selected[key]) { hasSel_1 ? selected[key] = false : hasSel_1 = true; } }, this); } }; PiecewiseModel2.prototype.getItemSymbol = function() { return this.get("itemSymbol"); }; PiecewiseModel2.prototype.getSelectedMapKey = function(piece) { return this._mode === "categories" ? piece.value + "" : piece.index + ""; }; PiecewiseModel2.prototype.getPieceList = function() { return this._pieceList; }; PiecewiseModel2.prototype._determineMode = function() { var option = this.option; return option.pieces && option.pieces.length > 0 ? "pieces" : this.option.categories ? "categories" : "splitNumber"; }; PiecewiseModel2.prototype.setSelected = function(selected) { this.option.selected = clone$1(selected); }; PiecewiseModel2.prototype.getValueState = function(value) { var index = VisualMapping.findPieceIndex(value, this._pieceList); return index != null ? this.option.selected[this.getSelectedMapKey(this._pieceList[index])] ? "inRange" : "outOfRange" : "outOfRange"; }; PiecewiseModel2.prototype.findTargetDataIndices = function(pieceIndex) { var result = []; var pieceList = this._pieceList; this.eachTargetSeries(function(seriesModel) { var dataIndices = []; var data = seriesModel.getData(); data.each(this.getDataDimensionIndex(data), function(value, dataIndex) { var pIdx = VisualMapping.findPieceIndex(value, pieceList); pIdx === pieceIndex && dataIndices.push(dataIndex); }, this); result.push({ seriesId: seriesModel.id, dataIndex: dataIndices }); }, this); return result; }; PiecewiseModel2.prototype.getRepresentValue = function(piece) { var representValue; if (this.isCategory()) { representValue = piece.value; } else { if (piece.value != null) { representValue = piece.value; } else { var pieceInterval = piece.interval || []; representValue = pieceInterval[0] === -Infinity && pieceInterval[1] === Infinity ? 0 : (pieceInterval[0] + pieceInterval[1]) / 2; } } return representValue; }; PiecewiseModel2.prototype.getVisualMeta = function(getColorVisual2) { if (this.isCategory()) { return; } var stops = []; var outerColors = ["", ""]; var visualMapModel = this; function setStop(interval, valueState) { var representValue = visualMapModel.getRepresentValue({ interval }); if (!valueState) { valueState = visualMapModel.getValueState(representValue); } var color = getColorVisual2(representValue, valueState); if (interval[0] === -Infinity) { outerColors[0] = color; } else if (interval[1] === Infinity) { outerColors[1] = color; } else { stops.push({ value: interval[0], color }, { value: interval[1], color }); } } var pieceList = this._pieceList.slice(); if (!pieceList.length) { pieceList.push({ interval: [-Infinity, Infinity] }); } else { var edge = pieceList[0].interval[0]; edge !== -Infinity && pieceList.unshift({ interval: [-Infinity, edge] }); edge = pieceList[pieceList.length - 1].interval[1]; edge !== Infinity && pieceList.push({ interval: [edge, Infinity] }); } var curr = -Infinity; each$f(pieceList, function(piece) { var interval = piece.interval; if (interval) { interval[0] > curr && setStop([curr, interval[0]], "outOfRange"); setStop(interval.slice()); curr = interval[1]; } }, this); return { stops, outerColors }; }; PiecewiseModel2.type = "visualMap.piecewise"; PiecewiseModel2.defaultOption = inheritDefaultOption(VisualMapModel.defaultOption, { selected: null, minOpen: false, maxOpen: false, align: "auto", itemWidth: 20, itemHeight: 14, itemSymbol: "roundRect", pieces: null, categories: null, splitNumber: 5, selectedMode: "multiple", itemGap: 10, hoverLink: true // Enable hover highlight. }); return PiecewiseModel2; })(VisualMapModel) ); var resetMethods = { splitNumber: function(outPieceList) { var thisOption = this.option; var precision = Math.min(thisOption.precision, 20); var dataExtent = this.getExtent(); var splitNumber = thisOption.splitNumber; splitNumber = Math.max(parseInt(splitNumber, 10), 1); thisOption.splitNumber = splitNumber; var splitStep = (dataExtent[1] - dataExtent[0]) / splitNumber; while (+splitStep.toFixed(precision) !== splitStep && precision < 5) { precision++; } thisOption.precision = precision; splitStep = +splitStep.toFixed(precision); if (thisOption.minOpen) { outPieceList.push({ interval: [-Infinity, dataExtent[0]], close: [0, 0] }); } for (var index = 0, curr = dataExtent[0]; index < splitNumber; curr += splitStep, index++) { var max2 = index === splitNumber - 1 ? dataExtent[1] : curr + splitStep; outPieceList.push({ interval: [curr, max2], close: [1, 1] }); } if (thisOption.maxOpen) { outPieceList.push({ interval: [dataExtent[1], Infinity], close: [0, 0] }); } reformIntervals(outPieceList); each$f(outPieceList, function(piece, index2) { piece.index = index2; piece.text = this.formatValueText(piece.interval); }, this); }, categories: function(outPieceList) { var thisOption = this.option; each$f(thisOption.categories, function(cate) { outPieceList.push({ text: this.formatValueText(cate, true), value: cate }); }, this); normalizeReverse(thisOption, outPieceList); }, pieces: function(outPieceList) { var thisOption = this.option; each$f(thisOption.pieces, function(pieceListItem, index) { if (!isObject$3(pieceListItem)) { pieceListItem = { value: pieceListItem }; } var item = { text: "", index }; if (pieceListItem.label != null) { item.text = pieceListItem.label; } if (pieceListItem.hasOwnProperty("value")) { var value = item.value = pieceListItem.value; item.interval = [value, value]; item.close = [1, 1]; } else { var interval = item.interval = []; var close_1 = item.close = [0, 0]; var closeList = [1, 0, 1]; var infinityList = [-Infinity, Infinity]; var useMinMax = []; for (var lg = 0; lg < 2; lg++) { var names = [["gte", "gt", "min"], ["lte", "lt", "max"]][lg]; for (var i = 0; i < 3 && interval[lg] == null; i++) { interval[lg] = pieceListItem[names[i]]; close_1[lg] = closeList[i]; useMinMax[lg] = i === 2; } interval[lg] == null && (interval[lg] = infinityList[lg]); } useMinMax[0] && interval[1] === Infinity && (close_1[0] = 0); useMinMax[1] && interval[0] === -Infinity && (close_1[1] = 0); if (interval[0] === interval[1] && close_1[0] && close_1[1]) { item.value = interval[0]; } } item.visual = VisualMapping.retrieveVisuals(pieceListItem); outPieceList.push(item); }, this); normalizeReverse(thisOption, outPieceList); reformIntervals(outPieceList); each$f(outPieceList, function(piece) { var close = piece.close; var edgeSymbols = [["<", "≤"][close[1]], [">", "≥"][close[0]]]; piece.text = piece.text || this.formatValueText(piece.value != null ? piece.value : piece.interval, false, edgeSymbols); }, this); } }; function normalizeReverse(thisOption, pieceList) { var inverse = thisOption.inverse; if (thisOption.orient === "vertical" ? !inverse : inverse) { pieceList.reverse(); } } var PiecewiseVisualMapView = ( /** @class */ (function(_super) { __extends(PiecewiseVisualMapView2, _super); function PiecewiseVisualMapView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = PiecewiseVisualMapView2.type; return _this; } PiecewiseVisualMapView2.prototype.doRender = function() { var thisGroup = this.group; thisGroup.removeAll(); var visualMapModel = this.visualMapModel; var textGap = visualMapModel.get("textGap"); var textStyleModel = visualMapModel.textStyleModel; var textFont = textStyleModel.getFont(); var textFill = textStyleModel.getTextColor(); var itemAlign = this._getItemAlign(); var itemSize = visualMapModel.itemSize; var viewData = this._getViewData(); var endsText = viewData.endsText; var showLabel = retrieve(visualMapModel.get("showLabel", true), !endsText); var silent = !visualMapModel.get("selectedMode"); endsText && this._renderEndsText(thisGroup, endsText[0], itemSize, showLabel, itemAlign); each$f(viewData.viewPieceList, function(item) { var piece = item.piece; var itemGroup = new Group$3(); itemGroup.onclick = bind$1(this._onItemClick, this, piece); this._enableHoverLink(itemGroup, item.indexInModelPieceList); var representValue = visualMapModel.getRepresentValue(piece); this._createItemSymbol(itemGroup, representValue, [0, 0, itemSize[0], itemSize[1]], silent); if (showLabel) { var visualState = this.visualMapModel.getValueState(representValue); itemGroup.add(new ZRText({ style: { x: itemAlign === "right" ? -textGap : itemSize[0] + textGap, y: itemSize[1] / 2, text: piece.text, verticalAlign: "middle", align: itemAlign, font: textFont, fill: textFill, opacity: visualState === "outOfRange" ? 0.5 : 1 }, silent })); } thisGroup.add(itemGroup); }, this); endsText && this._renderEndsText(thisGroup, endsText[1], itemSize, showLabel, itemAlign); box(visualMapModel.get("orient"), thisGroup, visualMapModel.get("itemGap")); this.renderBackground(thisGroup); this.positionGroup(thisGroup); }; PiecewiseVisualMapView2.prototype._enableHoverLink = function(itemGroup, pieceIndex) { var _this = this; itemGroup.on("mouseover", function() { return onHoverLink("highlight"); }).on("mouseout", function() { return onHoverLink("downplay"); }); var onHoverLink = function(method) { var visualMapModel = _this.visualMapModel; visualMapModel.option.hoverLink && _this.api.dispatchAction({ type: method, batch: makeHighDownBatch(visualMapModel.findTargetDataIndices(pieceIndex), visualMapModel) }); }; }; PiecewiseVisualMapView2.prototype._getItemAlign = function() { var visualMapModel = this.visualMapModel; var modelOption = visualMapModel.option; if (modelOption.orient === "vertical") { return getItemAlign(visualMapModel, this.api, visualMapModel.itemSize); } else { var align = modelOption.align; if (!align || align === "auto") { align = "left"; } return align; } }; PiecewiseVisualMapView2.prototype._renderEndsText = function(group, text, itemSize, showLabel, itemAlign) { if (!text) { return; } var itemGroup = new Group$3(); var textStyleModel = this.visualMapModel.textStyleModel; itemGroup.add(new ZRText({ style: createTextStyle(textStyleModel, { x: showLabel ? itemAlign === "right" ? itemSize[0] : 0 : itemSize[0] / 2, y: itemSize[1] / 2, verticalAlign: "middle", align: showLabel ? itemAlign : "center", text }) })); group.add(itemGroup); }; PiecewiseVisualMapView2.prototype._getViewData = function() { var visualMapModel = this.visualMapModel; var viewPieceList = map$1(visualMapModel.getPieceList(), function(piece, index) { return { piece, indexInModelPieceList: index }; }); var endsText = visualMapModel.get("text"); var orient = visualMapModel.get("orient"); var inverse = visualMapModel.get("inverse"); if (orient === "horizontal" ? inverse : !inverse) { viewPieceList.reverse(); } else if (endsText) { endsText = endsText.slice().reverse(); } return { viewPieceList, endsText }; }; PiecewiseVisualMapView2.prototype._createItemSymbol = function(group, representValue, shapeParam, silent) { var itemSymbol = createSymbol$1( // symbol will be string this.getControllerVisual(representValue, "symbol"), shapeParam[0], shapeParam[1], shapeParam[2], shapeParam[3], // color will be string this.getControllerVisual(representValue, "color") ); itemSymbol.silent = silent; group.add(itemSymbol); }; PiecewiseVisualMapView2.prototype._onItemClick = function(piece) { var visualMapModel = this.visualMapModel; var option = visualMapModel.option; var selectedMode = option.selectedMode; if (!selectedMode) { return; } var selected = clone$1(option.selected); var newKey = visualMapModel.getSelectedMapKey(piece); if (selectedMode === "single" || selectedMode === true) { selected[newKey] = true; each$f(selected, function(o, key) { selected[key] = key === newKey; }); } else { selected[newKey] = !selected[newKey]; } this.api.dispatchAction({ type: "selectDataRange", from: this.uid, visualMapId: this.visualMapModel.id, selected }); }; PiecewiseVisualMapView2.type = "visualMap.piecewise"; return PiecewiseVisualMapView2; })(VisualMapView) ); function install$6(registers) { registers.registerComponentModel(PiecewiseModel); registers.registerComponentView(PiecewiseVisualMapView); installCommon(registers); } function install$5(registers) { use(install$7); use(install$6); } var DEFAULT_OPTION = { label: { enabled: true }, decal: { show: false } }; var inner = makeInner(); var decalPaletteScope = {}; function ariaVisual(ecModel, api) { var ariaModel = ecModel.getModel("aria"); if (!ariaModel.get("enabled")) { return; } var defaultOption2 = clone$1(DEFAULT_OPTION); merge(defaultOption2.label, ecModel.getLocaleModel().get("aria"), false); merge(ariaModel.option, defaultOption2, false); setDecal(); setLabel(); function setDecal() { var decalModel = ariaModel.getModel("decal"); var useDecal = decalModel.get("show"); if (useDecal) { var paletteScopeGroupByType_1 = createHashMap(); ecModel.eachSeries(function(seriesModel) { if (seriesModel.isColorBySeries()) { return; } var decalScope = paletteScopeGroupByType_1.get(seriesModel.type); if (!decalScope) { decalScope = {}; paletteScopeGroupByType_1.set(seriesModel.type, decalScope); } inner(seriesModel).scope = decalScope; }); ecModel.eachRawSeries(function(seriesModel) { if (ecModel.isSeriesFiltered(seriesModel)) { return; } if (isFunction(seriesModel.enableAriaDecal)) { seriesModel.enableAriaDecal(); return; } var data = seriesModel.getData(); if (!seriesModel.isColorBySeries()) { var dataAll_1 = seriesModel.getRawData(); var idxMap_1 = {}; var decalScope_1 = inner(seriesModel).scope; data.each(function(idx) { var rawIdx = data.getRawIndex(idx); idxMap_1[rawIdx] = idx; }); var dataCount_1 = dataAll_1.count(); dataAll_1.each(function(rawIdx) { var idx = idxMap_1[rawIdx]; var name = dataAll_1.getName(rawIdx) || rawIdx + ""; var paletteDecal2 = getDecalFromPalette(seriesModel.ecModel, name, decalScope_1, dataCount_1); var specifiedDecal2 = data.getItemVisual(idx, "decal"); data.setItemVisual(idx, "decal", mergeDecal(specifiedDecal2, paletteDecal2)); }); } else { var paletteDecal = getDecalFromPalette(seriesModel.ecModel, seriesModel.name, decalPaletteScope, ecModel.getSeriesCount()); var specifiedDecal = data.getVisual("decal"); data.setVisual("decal", mergeDecal(specifiedDecal, paletteDecal)); } function mergeDecal(specifiedDecal2, paletteDecal2) { var resultDecal = specifiedDecal2 ? extend(extend({}, paletteDecal2), specifiedDecal2) : paletteDecal2; resultDecal.dirty = true; return resultDecal; } }); } } function setLabel() { var dom = api.getZr().dom; if (!dom) { return; } var labelLocale = ecModel.getLocaleModel().get("aria"); var labelModel = ariaModel.getModel("label"); labelModel.option = defaults(labelModel.option, labelLocale); if (!labelModel.get("enabled")) { return; } dom.setAttribute("role", "img"); if (labelModel.get("description")) { dom.setAttribute("aria-label", labelModel.get("description")); return; } var seriesCnt = ecModel.getSeriesCount(); var maxDataCnt = labelModel.get(["data", "maxCount"]) || 10; var maxSeriesCnt = labelModel.get(["series", "maxCount"]) || 10; var displaySeriesCnt = Math.min(seriesCnt, maxSeriesCnt); var ariaLabel; if (seriesCnt < 1) { return; } else { var title = getTitle(); if (title) { var withTitle = labelModel.get(["general", "withTitle"]); ariaLabel = replace(withTitle, { title }); } else { ariaLabel = labelModel.get(["general", "withoutTitle"]); } var seriesLabels_1 = []; var prefix = seriesCnt > 1 ? labelModel.get(["series", "multiple", "prefix"]) : labelModel.get(["series", "single", "prefix"]); ariaLabel += replace(prefix, { seriesCount: seriesCnt }); ecModel.eachSeries(function(seriesModel, idx) { if (idx < displaySeriesCnt) { var seriesLabel = void 0; var seriesName = seriesModel.get("name"); var withName = seriesName ? "withName" : "withoutName"; seriesLabel = seriesCnt > 1 ? labelModel.get(["series", "multiple", withName]) : labelModel.get(["series", "single", withName]); seriesLabel = replace(seriesLabel, { seriesId: seriesModel.seriesIndex, seriesName: seriesModel.get("name"), seriesType: getSeriesTypeName(seriesModel.subType) }); var data = seriesModel.getData(); if (data.count() > maxDataCnt) { var partialLabel = labelModel.get(["data", "partialData"]); seriesLabel += replace(partialLabel, { displayCnt: maxDataCnt }); } else { seriesLabel += labelModel.get(["data", "allData"]); } var middleSeparator_1 = labelModel.get(["data", "separator", "middle"]); var endSeparator_1 = labelModel.get(["data", "separator", "end"]); var excludeDimensionId_1 = labelModel.get(["data", "excludeDimensionId"]); var dataLabels = []; for (var i = 0; i < data.count(); i++) { if (i < maxDataCnt) { var name_1 = data.getName(i); var value = !excludeDimensionId_1 ? data.getValues(i) : filter(data.getValues(i), function(v, j) { return indexOf(excludeDimensionId_1, j) === -1; }); var dataLabel = labelModel.get(["data", name_1 ? "withName" : "withoutName"]); dataLabels.push(replace(dataLabel, { name: name_1, value: value.join(middleSeparator_1) })); } } seriesLabel += dataLabels.join(middleSeparator_1) + endSeparator_1; seriesLabels_1.push(seriesLabel); } }); var separatorModel = labelModel.getModel(["series", "multiple", "separator"]); var middleSeparator = separatorModel.get("middle"); var endSeparator = separatorModel.get("end"); ariaLabel += seriesLabels_1.join(middleSeparator) + endSeparator; dom.setAttribute("aria-label", ariaLabel); } } function replace(str, keyValues) { if (!isString(str)) { return str; } var result = str; each$f(keyValues, function(value, key) { result = result.replace(new RegExp("\\{\\s*" + key + "\\s*\\}", "g"), value); }); return result; } function getTitle() { var title = ecModel.get("title"); if (title && title.length) { title = title[0]; } return title && title.text; } function getSeriesTypeName(type) { var typeNames = ecModel.getLocaleModel().get(["series", "typeNames"]); return typeNames[type] || typeNames.chart; } } function ariaPreprocessor(option) { if (!option || !option.aria) { return; } var aria = option.aria; if (aria.show != null) { aria.enabled = aria.show; } aria.label = aria.label || {}; each$f(["description", "general", "series", "data"], function(name) { if (aria[name] != null) { aria.label[name] = aria[name]; } }); } function install$4(registers) { registers.registerPreprocessor(ariaPreprocessor); registers.registerVisual(registers.PRIORITY.VISUAL.ARIA, ariaVisual); } var RELATIONAL_EXPRESSION_OP_ALIAS_MAP = { value: "eq", // PENDING: not good for literal semantic? "<": "lt", "<=": "lte", ">": "gt", ">=": "gte", "=": "eq", "!=": "ne", "<>": "ne" // Might be misleading for sake of the difference between '==' and '===', // so don't support them. // '==': 'eq', // '===': 'seq', // '!==': 'sne' // PENDING: Whether support some common alias "ge", "le", "neq"? // ge: 'gte', // le: 'lte', // neq: 'ne', }; var RegExpEvaluator = ( /** @class */ (function() { function RegExpEvaluator2(rVal) { var condValue = this._condVal = isString(rVal) ? new RegExp(rVal) : isRegExp(rVal) ? rVal : null; if (condValue == null) { var errMsg = ""; throwError(errMsg); } } RegExpEvaluator2.prototype.evaluate = function(lVal) { var type = typeof lVal; return isString(type) ? this._condVal.test(lVal) : isNumber(type) ? this._condVal.test(lVal + "") : false; }; return RegExpEvaluator2; })() ); var ConstConditionInternal = ( /** @class */ (function() { function ConstConditionInternal2() { } ConstConditionInternal2.prototype.evaluate = function() { return this.value; }; return ConstConditionInternal2; })() ); var AndConditionInternal = ( /** @class */ (function() { function AndConditionInternal2() { } AndConditionInternal2.prototype.evaluate = function() { var children = this.children; for (var i = 0; i < children.length; i++) { if (!children[i].evaluate()) { return false; } } return true; }; return AndConditionInternal2; })() ); var OrConditionInternal = ( /** @class */ (function() { function OrConditionInternal2() { } OrConditionInternal2.prototype.evaluate = function() { var children = this.children; for (var i = 0; i < children.length; i++) { if (children[i].evaluate()) { return true; } } return false; }; return OrConditionInternal2; })() ); var NotConditionInternal = ( /** @class */ (function() { function NotConditionInternal2() { } NotConditionInternal2.prototype.evaluate = function() { return !this.child.evaluate(); }; return NotConditionInternal2; })() ); var RelationalConditionInternal = ( /** @class */ (function() { function RelationalConditionInternal2() { } RelationalConditionInternal2.prototype.evaluate = function() { var needParse = !!this.valueParser; var getValue = this.getValue; var tarValRaw = getValue(this.valueGetterParam); var tarValParsed = needParse ? this.valueParser(tarValRaw) : null; for (var i = 0; i < this.subCondList.length; i++) { if (!this.subCondList[i].evaluate(needParse ? tarValParsed : tarValRaw)) { return false; } } return true; }; return RelationalConditionInternal2; })() ); function parseOption(exprOption, getters) { if (exprOption === true || exprOption === false) { var cond = new ConstConditionInternal(); cond.value = exprOption; return cond; } var errMsg = ""; if (!isObjectNotArray(exprOption)) { throwError(errMsg); } if (exprOption.and) { return parseAndOrOption("and", exprOption, getters); } else if (exprOption.or) { return parseAndOrOption("or", exprOption, getters); } else if (exprOption.not) { return parseNotOption(exprOption, getters); } return parseRelationalOption(exprOption, getters); } function parseAndOrOption(op, exprOption, getters) { var subOptionArr = exprOption[op]; var errMsg = ""; if (!isArray$1(subOptionArr)) { throwError(errMsg); } if (!subOptionArr.length) { throwError(errMsg); } var cond = op === "and" ? new AndConditionInternal() : new OrConditionInternal(); cond.children = map$1(subOptionArr, function(subOption) { return parseOption(subOption, getters); }); if (!cond.children.length) { throwError(errMsg); } return cond; } function parseNotOption(exprOption, getters) { var subOption = exprOption.not; var errMsg = ""; if (!isObjectNotArray(subOption)) { throwError(errMsg); } var cond = new NotConditionInternal(); cond.child = parseOption(subOption, getters); if (!cond.child) { throwError(errMsg); } return cond; } function parseRelationalOption(exprOption, getters) { var errMsg = ""; var valueGetterParam = getters.prepareGetValue(exprOption); var subCondList = []; var exprKeys = keys(exprOption); var parserName = exprOption.parser; var valueParser = parserName ? getRawValueParser(parserName) : null; for (var i = 0; i < exprKeys.length; i++) { var keyRaw = exprKeys[i]; if (keyRaw === "parser" || getters.valueGetterAttrMap.get(keyRaw)) { continue; } var op = hasOwn(RELATIONAL_EXPRESSION_OP_ALIAS_MAP, keyRaw) ? RELATIONAL_EXPRESSION_OP_ALIAS_MAP[keyRaw] : keyRaw; var condValueRaw = exprOption[keyRaw]; var condValueParsed = valueParser ? valueParser(condValueRaw) : condValueRaw; var evaluator = createFilterComparator(op, condValueParsed) || op === "reg" && new RegExpEvaluator(condValueParsed); if (!evaluator) { throwError(errMsg); } subCondList.push(evaluator); } if (!subCondList.length) { throwError(errMsg); } var cond = new RelationalConditionInternal(); cond.valueGetterParam = valueGetterParam; cond.valueParser = valueParser; cond.getValue = getters.getValue; cond.subCondList = subCondList; return cond; } function isObjectNotArray(val) { return isObject$3(val) && !isArrayLike(val); } var ConditionalExpressionParsed = ( /** @class */ (function() { function ConditionalExpressionParsed2(exprOption, getters) { this._cond = parseOption(exprOption, getters); } ConditionalExpressionParsed2.prototype.evaluate = function() { return this._cond.evaluate(); }; return ConditionalExpressionParsed2; })() ); function parseConditionalExpression(exprOption, getters) { return new ConditionalExpressionParsed(exprOption, getters); } var filterTransform = { type: "echarts:filter", // PENDING: enhance to filter by index rather than create new data transform: function(params) { var upstream = params.upstream; var rawItem; var condition = parseConditionalExpression(params.config, { valueGetterAttrMap: createHashMap({ dimension: true }), prepareGetValue: function(exprOption) { var errMsg = ""; var dimLoose = exprOption.dimension; if (!hasOwn(exprOption, "dimension")) { throwError(errMsg); } var dimInfo = upstream.getDimensionInfo(dimLoose); if (!dimInfo) { throwError(errMsg); } return { dimIdx: dimInfo.index }; }, getValue: function(param) { return upstream.retrieveValueFromItem(rawItem, param.dimIdx); } }); var resultData = []; for (var i = 0, len2 = upstream.count(); i < len2; i++) { rawItem = upstream.getRawDataItem(i); if (condition.evaluate()) { resultData.push(rawItem); } } return { data: resultData }; } }; var sortTransform = { type: "echarts:sort", transform: function(params) { var upstream = params.upstream; var config = params.config; var errMsg = ""; var orderExprList = normalizeToArray(config); if (!orderExprList.length) { throwError(errMsg); } var orderDefList = []; each$f(orderExprList, function(orderExpr) { var dimLoose = orderExpr.dimension; var order = orderExpr.order; var parserName = orderExpr.parser; var incomparable = orderExpr.incomparable; if (dimLoose == null) { throwError(errMsg); } if (order !== "asc" && order !== "desc") { throwError(errMsg); } if (incomparable && incomparable !== "min" && incomparable !== "max") { var errMsg_1 = ""; throwError(errMsg_1); } if (order !== "asc" && order !== "desc") { var errMsg_2 = ""; throwError(errMsg_2); } var dimInfo = upstream.getDimensionInfo(dimLoose); if (!dimInfo) { throwError(errMsg); } var parser = parserName ? getRawValueParser(parserName) : null; if (parserName && !parser) { throwError(errMsg); } orderDefList.push({ dimIdx: dimInfo.index, parser, comparator: new SortOrderComparator(order, incomparable) }); }); var sourceFormat = upstream.sourceFormat; if (sourceFormat !== SOURCE_FORMAT_ARRAY_ROWS && sourceFormat !== SOURCE_FORMAT_OBJECT_ROWS) { throwError(errMsg); } var resultData = []; for (var i = 0, len2 = upstream.count(); i < len2; i++) { resultData.push(upstream.getRawDataItem(i)); } resultData.sort(function(item0, item1) { for (var i2 = 0; i2 < orderDefList.length; i2++) { var orderDef = orderDefList[i2]; var val0 = upstream.retrieveValueFromItem(item0, orderDef.dimIdx); var val1 = upstream.retrieveValueFromItem(item1, orderDef.dimIdx); if (orderDef.parser) { val0 = orderDef.parser(val0); val1 = orderDef.parser(val1); } var result = orderDef.comparator.evaluate(val0, val1); if (result !== 0) { return result; } } return 0; }); return { data: resultData }; } }; function install$3(registers) { registers.registerTransform(filterTransform); registers.registerTransform(sortTransform); } var DatasetModel = ( /** @class */ (function(_super) { __extends(DatasetModel2, _super); function DatasetModel2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = "dataset"; return _this; } DatasetModel2.prototype.init = function(option, parentModel, ecModel) { _super.prototype.init.call(this, option, parentModel, ecModel); this._sourceManager = new SourceManager(this); disableTransformOptionMerge(this); }; DatasetModel2.prototype.mergeOption = function(newOption, ecModel) { _super.prototype.mergeOption.call(this, newOption, ecModel); disableTransformOptionMerge(this); }; DatasetModel2.prototype.optionUpdated = function() { this._sourceManager.dirty(); }; DatasetModel2.prototype.getSourceManager = function() { return this._sourceManager; }; DatasetModel2.type = "dataset"; DatasetModel2.defaultOption = { seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN }; return DatasetModel2; })(ComponentModel) ); var DatasetView = ( /** @class */ (function(_super) { __extends(DatasetView2, _super); function DatasetView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = "dataset"; return _this; } DatasetView2.type = "dataset"; return DatasetView2; })(ComponentView) ); function install$2(registers) { registers.registerComponentModel(DatasetModel); registers.registerComponentView(DatasetView); } function install$1(registers) { registers.registerPainter("svg", SVGPainter); } function install(registers) { registers.registerPainter("canvas", CanvasPainter); } function isMultiple(elements) { return isArray$1(elements[0]); } function prepareMorphBatches(one, many) { var batches = []; var batchCount = one.length; for (var i = 0; i < batchCount; i++) { batches.push({ one: one[i], many: [] }); } for (var i = 0; i < many.length; i++) { var len2 = many[i].length; var k = void 0; for (k = 0; k < len2; k++) { batches[k % batchCount].many.push(many[i][k]); } } var off = 0; for (var i = batchCount - 1; i >= 0; i--) { if (!batches[i].many.length) { var moveFrom = batches[off].many; if (moveFrom.length <= 1) { if (off) { off = 0; } else { return batches; } } var len2 = moveFrom.length; var mid = Math.ceil(len2 / 2); batches[i].many = moveFrom.slice(mid, len2); batches[off].many = moveFrom.slice(0, mid); off++; } } return batches; } var pathDividers = { clone: function(params) { var ret = []; var approxOpacity = 1 - Math.pow(1 - params.path.style.opacity, 1 / params.count); for (var i = 0; i < params.count; i++) { var cloned = clonePath(params.path); cloned.setStyle("opacity", approxOpacity); ret.push(cloned); } return ret; }, // Use the default divider split: null }; function applyMorphAnimation(from, to, divideShape, seriesModel, dataIndex, animateOtherProps) { if (!from.length || !to.length) { return; } var updateAnimationCfg = getAnimationConfig("update", seriesModel, dataIndex); if (!(updateAnimationCfg && updateAnimationCfg.duration > 0)) { return; } var animationDelay = seriesModel.getModel("universalTransition").get("delay"); var animationCfg = Object.assign({ // Need to setToFinal so the further calculation based on the style can be correct. // Like emphasis color. setToFinal: true }, updateAnimationCfg); var many; var one; if (isMultiple(from)) { many = from; one = to; } if (isMultiple(to)) { many = to; one = from; } function morphOneBatch(batch, fromIsMany2, animateIndex2, animateCount2, forceManyOne) { var batchMany = batch.many; var batchOne = batch.one; if (batchMany.length === 1 && !forceManyOne) { var batchFrom = fromIsMany2 ? batchMany[0] : batchOne; var batchTo = fromIsMany2 ? batchOne : batchMany[0]; if (isCombineMorphing(batchFrom)) { morphOneBatch({ many: [batchFrom], one: batchTo }, true, animateIndex2, animateCount2, true); } else { var individualAnimationCfg = animationDelay ? defaults({ delay: animationDelay(animateIndex2, animateCount2) }, animationCfg) : animationCfg; morphPath(batchFrom, batchTo, individualAnimationCfg); animateOtherProps(batchFrom, batchTo, batchFrom, batchTo, individualAnimationCfg); } } else { var separateAnimationCfg = defaults({ dividePath: pathDividers[divideShape], individualDelay: animationDelay && function(idx, count3, fromPath, toPath) { return animationDelay(idx + animateIndex2, animateCount2); } }, animationCfg); var _a2 = fromIsMany2 ? combineMorph(batchMany, batchOne, separateAnimationCfg) : separateMorph(batchOne, batchMany, separateAnimationCfg), fromIndividuals = _a2.fromIndividuals, toIndividuals = _a2.toIndividuals; var count2 = fromIndividuals.length; for (var k = 0; k < count2; k++) { var individualAnimationCfg = animationDelay ? defaults({ delay: animationDelay(k, count2) }, animationCfg) : animationCfg; animateOtherProps(fromIndividuals[k], toIndividuals[k], fromIsMany2 ? batchMany[k] : batch.one, fromIsMany2 ? batch.one : batchMany[k], individualAnimationCfg); } } } var fromIsMany = many ? many === from : from.length > to.length; var morphBatches = many ? prepareMorphBatches(one, many) : prepareMorphBatches(fromIsMany ? to : from, [fromIsMany ? from : to]); var animateCount = 0; for (var i = 0; i < morphBatches.length; i++) { animateCount += morphBatches[i].many.length; } var animateIndex = 0; for (var i = 0; i < morphBatches.length; i++) { morphOneBatch(morphBatches[i], fromIsMany, animateIndex, animateCount); animateIndex += morphBatches[i].many.length; } } function getPathList(elements) { if (!elements) { return []; } if (isArray$1(elements)) { var pathList_1 = []; for (var i = 0; i < elements.length; i++) { pathList_1.push(getPathList(elements[i])); } return pathList_1; } var pathList = []; elements.traverse(function(el) { if (el instanceof Path && !el.disableMorphing && !el.invisible && !el.ignore) { pathList.push(el); } }); return pathList; } var DATA_COUNT_THRESHOLD = 1e4; var TRANSITION_NONE = 0; var TRANSITION_P2C = 1; var TRANSITION_C2P = 2; var getUniversalTransitionGlobalStore = makeInner(); function getDimension(data, visualDimension) { var dimensions = data.dimensions; for (var i = 0; i < dimensions.length; i++) { var dimInfo = data.getDimensionInfo(dimensions[i]); if (dimInfo && dimInfo.otherDims[visualDimension] === 0) { return dimensions[i]; } } } function getValueByDimension(data, dataIndex, dimension) { var dimInfo = data.getDimensionInfo(dimension); var dimOrdinalMeta = dimInfo && dimInfo.ordinalMeta; if (dimInfo) { var value = data.get(dimInfo.name, dataIndex); if (dimOrdinalMeta) { return dimOrdinalMeta.categories[value] || value + ""; } return value + ""; } } function getGroupId(data, dataIndex, dataGroupId, isChild) { var visualDimension = isChild ? "itemChildGroupId" : "itemGroupId"; var groupIdDim = getDimension(data, visualDimension); if (groupIdDim) { var groupId = getValueByDimension(data, dataIndex, groupIdDim); return groupId; } var rawDataItem = data.getRawDataItem(dataIndex); var property = isChild ? "childGroupId" : "groupId"; if (rawDataItem && rawDataItem[property]) { return rawDataItem[property] + ""; } if (isChild) { return; } return dataGroupId || data.getId(dataIndex); } function flattenDataDiffItems(list) { var items = []; each$f(list, function(seriesInfo) { var data = seriesInfo.data; var dataGroupId = seriesInfo.dataGroupId; if (data.count() > DATA_COUNT_THRESHOLD) { return; } var indices = data.getIndices(); for (var dataIndex = 0; dataIndex < indices.length; dataIndex++) { items.push({ data, groupId: getGroupId(data, dataIndex, dataGroupId, false), childGroupId: getGroupId(data, dataIndex, dataGroupId, true), divide: seriesInfo.divide, dataIndex }); } }); return items; } function fadeInElement(newEl2, newSeries, newIndex) { newEl2.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 len2 = oldDiffItems.length; if (len2 !== newDiffItems.length) { return false; } for (var i = 0; i < len2; 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); } } var hasMorphAnimation = false; var direction = TRANSITION_NONE; var oldGroupIds = createHashMap(); var oldChildGroupIds = createHashMap(); oldDiffItems.forEach(function(item) { item.groupId && oldGroupIds.set(item.groupId, true); item.childGroupId && oldChildGroupIds.set(item.childGroupId, true); }); for (var i = 0; i < newDiffItems.length; i++) { var newGroupId = newDiffItems[i].groupId; if (oldChildGroupIds.get(newGroupId)) { direction = TRANSITION_P2C; break; } var newChildGroupId = newDiffItems[i].childGroupId; if (newChildGroupId && oldGroupIds.get(newChildGroupId)) { direction = TRANSITION_C2P; break; } } function createKeyGetter(isOld, onlyGetId) { return function(diffItem) { var data = diffItem.data; var dataIndex = diffItem.dataIndex; if (onlyGetId) { return data.getId(dataIndex); } if (isOld) { return direction === TRANSITION_P2C ? diffItem.childGroupId : diffItem.groupId; } else { return direction === TRANSITION_C2P ? diffItem.childGroupId : diffItem.groupId; } }; } 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 newEl2 = newItem2.data.getItemGraphicEl(newItem2.dataIndex); if (oldEl === newEl2) { newEl2 && animateElementStyles(newEl2, newItem2.dataIndex, newSeries); return; } if ( // We can't use the elements that already being morphed oldEl && isElementStillInChart[oldEl.id] ) { return; } if (newEl2) { stopAnimation(newEl2); if (oldEl) { stopAnimation(oldEl); removeEl(oldEl); hasMorphAnimation = true; applyMorphAnimation(getPathList(oldEl), getPathList(newEl2), newItem2.divide, newSeries, newIndex, updateMorphingPathProps); } else { fadeInElement(newEl2, 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 newEl2 = newData.getItemGraphicEl(newItem2.dataIndex); var oldElsList = filter(map$1(oldIndices, function(idx) { return oldDiffItems[idx].data.getItemGraphicEl(oldDiffItems[idx].dataIndex); }), function(oldEl) { return oldEl && oldEl !== newEl2 && !isElementStillInChart[oldEl.id]; }); if (newEl2) { stopAnimation(newEl2); if (oldElsList.length) { each$f(oldElsList, function(oldEl) { stopAnimation(oldEl); removeEl(oldEl); }); hasMorphAnimation = true; applyMorphAnimation(getPathList(oldElsList), getPathList(newEl2), newItem2.divide, newSeries, newIndex, updateMorphingPathProps); } else { fadeInElement(newEl2, 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$1(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$f(newElsList, function(newEl2) { return stopAnimation(newEl2); }); if (oldEl) { stopAnimation(oldEl); removeEl(oldEl); hasMorphAnimation = true; applyMorphAnimation( getPathList(oldEl), getPathList(newElsList), oldItem.divide, // Use divide on old. newSeris, newIndices[0], updateMorphingPathProps ); } else { each$f(newElsList, function(newEl2) { return fadeInElement(newEl2, 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$f(newList, function(_a2) { var data = _a2.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$1(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$f(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$1(transitionKey)) { each$f(transitionKey, function(key) { oldDataMapForSplit.set(key, { key: transitionKeyStr, dataGroupId: oldDataGroupId, data: oldData }); }); } }); each$f(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$1(transitionKey)) { var oldSeries_1 = []; each$f(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$f(normalizeToArray(transitionOpt.from), function(finder) { var idx = querySeries(globalStore.oldSeries, finder); if (idx >= 0) { from.push({ dataGroupId: globalStore.oldDataGroupIds[idx], data: globalStore.oldData[idx], // TODO can specify divideShape in transition. divide: getDivideShapeFromData(globalStore.oldData[idx]), groupIdDim: finder.dimension }); } }); each$f(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), groupIdDim: 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$f(normalizeToArray(params.seriesTransition), function(transOpt) { each$f(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$f(normalizeToArray(transitionOpt), function(opt) { transitionSeriesFromOpt(opt, globalStore, params, api); }); } else { var updateBatches_1 = findTransitionSeriesBatches(globalStore, params); each$f(updateBatches_1.keys(), function(key) { var batch = updateBatches_1.get(key); transitionBetween(batch.oldSeries, batch.newSeries, api); }); } each$f(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); } } }); } use([install]); use([install$1]); use([install$S, install$R, install$Q, install$O, install$M, install$K, install$J, install$I, install$H, install$G, install$F, install$D, install$C, install$B, install$A, install$z, install$y, install$x, install$w, install$v, install$u, install$t]); use(install$r); use(install$q); use(install$L); use(install$p); use(install$E); use(install$o); use(install$n); use(install$l); use(install$k); use(install$s); use(install$j); use(install$i); use(install$h); use(install$g); use(install$f); use(install$e); use(install$b); use(install$8); use(install$a); use(install$9); use(install$5); use(install$7); use(install$6); use(install$4); use(install$3); use(install$2); use(installUniversalTransition); use(installLabelLayout); export { install$M as a, install as b, install$R as c, install$S as d, install$Q as e, install$r as f, install$k as g, install$b as h, init$1 as i, use as u };