@devexpress/dx-chart-core
Advanced tools
Comparing version 1.11.0-alpha.1 to 1.11.0-beta.1
/** | ||
* Bundle of @devexpress/dx-chart-core | ||
* Generated: 2019-03-13 | ||
* Version: 1.11.0-alpha.1 | ||
* Generated: 2019-04-24 | ||
* Version: 1.11.0-beta.1 | ||
* License: https://js.devexpress.com/Licensing | ||
@@ -38,2 +38,25 @@ */ | ||
function __read(o, n) { | ||
var m = typeof Symbol === "function" && o[Symbol.iterator]; | ||
if (!m) return o; | ||
var i = m.call(o), r, ar = [], e; | ||
try { | ||
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); | ||
} | ||
catch (error) { e = { error: error }; } | ||
finally { | ||
try { | ||
if (r && !r.done && (m = i["return"])) m.call(i); | ||
} | ||
finally { if (e) throw e.error; } | ||
} | ||
return ar; | ||
} | ||
function __spread() { | ||
for (var ar = [], i = 0; i < arguments.length; i++) | ||
ar = ar.concat(__read(arguments[i])); | ||
return ar; | ||
} | ||
/** @internal */ | ||
@@ -79,4 +102,14 @@ var HORIZONTAL = 'horizontal'; | ||
/** @internal */ | ||
var fixOffset = function (scale) { | ||
var offset = getWidth(scale) / 2; | ||
return offset > 0 ? function (value) { return scale(value) + offset; } : scale; | ||
}; | ||
/** @internal */ | ||
var getValueDomainName = function (name) { return name || VALUE_DOMAIN; }; | ||
var floatsEqual = function (a, b) { return Math.abs(a - b) < Number.EPSILON; }; | ||
/** @internal */ | ||
var rangesEqual = function (r1, r2) { | ||
return floatsEqual(r1[0], r2[0]) && floatsEqual(r1[1], r2[1]); | ||
}; | ||
/** @internal */ | ||
var makeScale = function (_a, range) { | ||
@@ -89,9 +122,175 @@ var factory = _a.factory, domain = _a.domain; | ||
// are encapsulated in this utility file. | ||
// | ||
/** @internal */ | ||
var scaleBounds = function (scale, bounds) { return ([scale(bounds[0]), scale(bounds[1]) + getWidth(scale)]); }; | ||
var scaleBounds = function (scale, bounds) { | ||
// There is an issue - when range is "inverted" values are scaled incorrectly. | ||
// scaleBand().domain(['a', 'b', 'c']).range([0, 60])('b') === 20 | ||
// scaleBand().domain(['a', 'b', 'c']).range([60, 0])('b') === 20 (should be 40) | ||
// Because of it bounds for reversed band scale are scaled wrong. | ||
// Fixing it would introduce an utility "scale" function and complicates the code. | ||
// Since for now we do not have "reversed" band scales the issue is left as-is. | ||
if (scale.bandwidth) { | ||
var cleanScale = scale.copy().paddingInner(0).paddingOuter(0); | ||
return [cleanScale(bounds[0]), cleanScale(bounds[1]) + cleanScale.bandwidth()]; | ||
} | ||
return bounds.map(scale); | ||
}; | ||
// Because of "scaleBands" issue moving and growing for "reversed" band scales | ||
// are not supported now. | ||
var moveLinearScaleBounds = function (scale, bounds, delta) { | ||
var fullRange = scale.range(); | ||
var sign = Math.sign(fullRange[1] - fullRange[0]); | ||
var range = scaleBounds(scale, bounds); | ||
var r0 = range[0] + delta; | ||
var r1 = range[1] + delta; | ||
// Check if new range is outside of the left border. | ||
if (Math.sign(r0 - fullRange[0]) !== sign) { | ||
r0 = fullRange[0]; | ||
r1 = r0 + range[1] - range[0]; | ||
} | ||
// Check if new range is outside of the right border. | ||
if (Math.sign(fullRange[1] - r1) !== sign) { | ||
r1 = fullRange[1]; | ||
r0 = r1 - range[1] + range[0]; | ||
} | ||
var newBounds = [scale.invert(r0), scale.invert(r1)]; | ||
return rangesEqual(bounds, newBounds) ? bounds : newBounds; | ||
}; | ||
// This is pointer "delta" processing specific for "band" scale. | ||
// If pointer delta is significantly smaller than band size (0.3) then movement should be skipped | ||
// and current delta should be added to a next one (from a new "move" event). | ||
// Now there is no code that accumulates deltas. | ||
// In order to allow band scrolling at least somehow the following is applied - if pointer delta | ||
// is at least greater than 30 pixel then minimal movement is performed. | ||
// TODO: Make proper delta accumulation! | ||
var adjustBandScaleMoveStep = function (delta, step) { | ||
var ratio = Math.abs(delta / step); | ||
var sign = Math.sign(delta / step); | ||
if (ratio >= 0.5) { | ||
return sign * Math.round(ratio); | ||
} | ||
if (ratio >= 0.3) { | ||
return sign; | ||
} | ||
if (Math.abs(delta) > 30) { | ||
return sign; | ||
} | ||
return 0; | ||
}; | ||
// Band case is processed separately to preserve categories amount in the bounds range. | ||
// If common inversion mechanism is used start and end bounds cannot be inverted independently | ||
// because of rounding issues which may add or remove categories to the new bounds. | ||
var moveBandScaleBounds = function (scale, bounds, delta) { | ||
var domain = scale.domain(); | ||
var fullRange = scale.range(); | ||
var step = (fullRange[1] - fullRange[0]) / domain.length; | ||
var rangeStep = adjustBandScaleMoveStep(delta, step); | ||
if (rangeStep === 0) { | ||
return bounds; | ||
} | ||
var range = scaleBounds(scale, bounds); | ||
var range0 = Math.round((range[0] - fullRange[0]) / step); | ||
var range1 = range0 + Math.round((range[1] - range[0]) / step) - 1; | ||
var new0 = range0 + rangeStep; | ||
var new1 = range1 + rangeStep; | ||
if (new0 < 0) { | ||
new0 = 0; | ||
new1 = new0 + range1 - range0; | ||
} | ||
if (new1 > domain.length - 1) { | ||
new1 = domain.length - 1; | ||
new0 = new1 - range1 + range0; | ||
} | ||
if (new0 === range0 || new1 === range1) { | ||
return bounds; | ||
} | ||
return [domain[new0], domain[new1]]; | ||
}; | ||
/** @internal */ | ||
var fixOffset = function (scale) { | ||
var offset = getWidth(scale) / 2; | ||
return offset > 0 ? function (value) { return scale(value) + offset; } : scale; | ||
var moveBounds = function (scale, bounds, delta) { return ((scale.bandwidth ? moveBandScaleBounds : moveLinearScaleBounds)(scale, bounds, delta)); }; | ||
var growLinearScaleBounds = function (scale, bounds, delta, anchor) { | ||
var fullRange = scale.range(); | ||
var sign = Math.sign(fullRange[1] - fullRange[0]); | ||
var range = scaleBounds(scale, bounds); | ||
var t = Math.abs((anchor - range[0]) / (range[1] - range[0])); | ||
var r0 = range[0] + sign * delta * 2 * t; | ||
var r1 = range[1] - sign * delta * 2 * (1 - t); | ||
// Check if new range is outside of the left border. | ||
if (Math.sign(r0 - fullRange[0]) !== sign) { | ||
r0 = fullRange[0]; | ||
} | ||
// Check if new range is outside of the right border. | ||
if (Math.sign(fullRange[1] - r1) !== sign) { | ||
r1 = fullRange[1]; | ||
} | ||
var minRangeThreshold = (fullRange[1] - fullRange[0]) / 100; | ||
// Check if new range is too small. | ||
if (Math.sign(r1 - r0) !== sign || Math.abs(r1 - r0) < Math.abs(minRangeThreshold)) { | ||
r0 = anchor - minRangeThreshold / 2; | ||
r1 = anchor + minRangeThreshold / 2; | ||
} | ||
var newBounds = [scale.invert(r0), scale.invert(r1)]; | ||
return rangesEqual(bounds, newBounds) ? bounds : newBounds; | ||
}; | ||
var growBandScaleBounds = function (scale, bounds, delta, anchor) { | ||
var domain = scale.domain(); | ||
var fullRange = scale.range(); | ||
var step = (fullRange[1] - fullRange[0]) / domain.length; | ||
var range = scaleBounds(scale, bounds); | ||
var range0 = Math.round((range[0] - fullRange[0]) / step); | ||
var range1 = range0 + Math.round((range[1] - range[0]) / step) - 1; | ||
// Let it be always 1 for now. | ||
var rangeStep = Math.sign(delta); | ||
if ((rangeStep === 0) || | ||
(rangeStep > 0 && range0 === range1) || | ||
(rangeStep < 0 && range0 === 0 && range1 === domain.length - 1)) { | ||
return bounds; | ||
} | ||
var t = Math.abs((anchor - range[0]) / (range[1] - range[0])); | ||
var new0 = range0 + Math.round(rangeStep * 2 * t); | ||
var new1 = range1 - Math.round(rangeStep * 2 * (1 - t)); | ||
if (new0 < 0) { | ||
new0 = 0; | ||
} | ||
if (new1 > domain.length - 1) { | ||
new1 = domain.length - 1; | ||
} | ||
if (new0 > new1) { | ||
if (t <= 0.5) { | ||
new1 = new0; | ||
} | ||
else { | ||
new0 = new1; | ||
} | ||
} | ||
if (new0 === range0 && new1 === range1) { | ||
return bounds; | ||
} | ||
return [domain[new0], domain[new1]]; | ||
}; | ||
// "scaleBounds" would be a better name but "scale" is already occupied. | ||
/** @internal */ | ||
var growBounds = function (scale, bounds, delta, anchor) { return ((scale.bandwidth ? growBandScaleBounds : growLinearScaleBounds)(scale, bounds, delta, anchor)); }; | ||
var invertLinearScaleBounds = function (scale, range) { | ||
var fullRange = scale.range(); | ||
var match = Math.sign(fullRange[1] - fullRange[0]) === Math.sign(range[1] - range[0]); | ||
return [ | ||
scale.invert(range[match ? 0 : 1]), | ||
scale.invert(range[match ? 1 : 0]), | ||
]; | ||
}; | ||
var matchPointToBand = function (domain, range, p) { | ||
var i = Math.floor(domain.length * (p - range[0]) / (range[1] - range[0])); | ||
return domain[Math.min(i, domain.length - 1)]; | ||
}; | ||
var invertBandScaleBounds = function (scale, range) { | ||
var domain = scale.domain(); | ||
var fullRange = scale.range(); | ||
return [ | ||
matchPointToBand(domain, fullRange, range[0]), | ||
matchPointToBand(domain, fullRange, range[1]), | ||
]; | ||
}; | ||
/** @internal */ | ||
var invertBoundsRange = function (scale, range) { return ((scale.bandwidth ? invertBandScaleBounds : invertLinearScaleBounds)(scale, range)); }; | ||
@@ -118,10 +317,8 @@ var _a; | ||
}; | ||
var floatsEqual = function (a, b) { return Math.abs(a - b) < Number.EPSILON; }; | ||
var mergeContinuousDomains = function (domain, items) { | ||
var newDomain = extent(domain.concat(items)); | ||
return floatsEqual(newDomain[0], domain[0]) && floatsEqual(newDomain[1], domain[1]) | ||
? domain : newDomain; | ||
var newDomain = extent(__spread(domain, items)); | ||
return rangesEqual(newDomain, domain) ? domain : newDomain; | ||
}; | ||
var mergeDiscreteDomains = function (domain, items) { | ||
var newDomain = Array.from(new Set(domain.concat(items))); | ||
var newDomain = Array.from(new Set(__spread(domain, items))); | ||
return newDomain.length === domain.length ? domain : newDomain; | ||
@@ -149,3 +346,3 @@ }; | ||
var items = series.points.map(getValue); | ||
return series.getPointTransformer.isStartedFromZero ? [0].concat(items) : items; | ||
return series.getPointTransformer.isStartedFromZero ? __spread([0], items) : items; | ||
}; | ||
@@ -198,10 +395,11 @@ var updateDomain = function (domain, series, getItem, getDomainItems) { return updateDomainItems(updateDomainFactory(domain, series, getItem), getDomainItems(series)); }; | ||
var getTicks = function (scale) { return (scale.ticks ? scale.ticks() : scale.domain()); }; | ||
var createTicks = function (scale, callback) { | ||
var getTicks = function (scale, count) { return (scale.ticks ? scale.ticks(count) : scale.domain()); }; | ||
var createTicks = function (scale, count, callback) { | ||
var fixedScale = fixOffset(scale); | ||
return getTicks(scale).map(function (tick, index) { return callback(fixedScale(tick), String(index), tick); }); | ||
return getTicks(scale, count) | ||
.map(function (tick, index) { return callback(fixedScale(tick), String(index), tick); }); | ||
}; | ||
var getFormat = function (scale, tickFormat) { | ||
var getFormat = function (scale, count, tickFormat) { | ||
if (scale.tickFormat) { | ||
return tickFormat ? tickFormat(scale) : scale.tickFormat(); | ||
return tickFormat ? tickFormat(scale, count) : scale.tickFormat(count); | ||
} | ||
@@ -232,9 +430,17 @@ return function (tick) { return tick; }; | ||
}; | ||
// Constant is selected to preserve original behavior described in | ||
// https://github.com/d3/d3-scale#continuous_ticks. | ||
var DEFAULT_TICK_COUNT = 10; | ||
var getTickCount = function (scaleRange, paneSize) { | ||
var rangeToPaneRatio = Math.abs(scaleRange[0] - scaleRange[1]) / paneSize || 1; | ||
return Math.round(DEFAULT_TICK_COUNT * rangeToPaneRatio); | ||
}; | ||
/** @internal */ | ||
var axisCoordinates = function (_a) { | ||
var scaleName = _a.scaleName, scale = _a.scale, position = _a.position, tickSize = _a.tickSize, tickFormat = _a.tickFormat, indentFromAxis = _a.indentFromAxis; | ||
var scaleName = _a.scaleName, scale = _a.scale, position = _a.position, tickSize = _a.tickSize, tickFormat = _a.tickFormat, indentFromAxis = _a.indentFromAxis, paneSize = _a.paneSize; | ||
var isHor = isHorizontal(scaleName); | ||
var options = (isHor ? createHorizontalOptions : createVerticalOptions)(position, tickSize, indentFromAxis); | ||
var formatTick = getFormat(scale, tickFormat); | ||
var ticks = createTicks(scale, function (coordinates, key, tick) { return (__assign({ key: key, x1: coordinates, x2: coordinates, y1: coordinates, y2: coordinates, xText: coordinates, yText: coordinates, text: formatTick(tick) }, options)); }); | ||
var tickCount = getTickCount(scale.range(), paneSize[1 - Number(isHor)]); | ||
var formatTick = getFormat(scale, tickCount, tickFormat); | ||
var ticks = createTicks(scale, tickCount, function (coordinates, key, tick) { return (__assign({ key: key, x1: coordinates, x2: coordinates, y1: coordinates, y2: coordinates, xText: coordinates, yText: coordinates, text: formatTick(tick) }, options)); }); | ||
return { | ||
@@ -248,3 +454,3 @@ ticks: ticks, | ||
var createTickFilter = function (_a) { | ||
var width = _a[0], height = _a[1]; | ||
var _b = __read(_a, 2), width = _b[0], height = _b[1]; | ||
return (width > 0 | ||
@@ -258,6 +464,7 @@ ? function (tick) { return tick.x1 >= 0 && tick.x1 <= width; } | ||
var getGridCoordinates = function (_a) { | ||
var scaleName = _a.scaleName, scale = _a.scale; | ||
var scaleName = _a.scaleName, scale = _a.scale, paneSize = _a.paneSize; | ||
var isHor = isHorizontal(scaleName); | ||
var tickCount = getTickCount(scale.range(), paneSize[1 - Number(isHor)]); | ||
var options = isHor ? horizontalGridOptions : verticalGridOptions; | ||
return createTicks(scale, function (coordinates, key) { return (__assign({ key: key, x: coordinates, y: coordinates, dx: 0, dy: 0 }, options)); }); | ||
return createTicks(scale, tickCount, function (coordinates, key) { return (__assign({ key: key, x: coordinates, y: coordinates, dx: 0, dy: 0 }, options)); }); | ||
}; | ||
@@ -294,4 +501,4 @@ | ||
var argumentScale = _a.argumentScale, valueScale = _a.valueScale, points = _a.points; | ||
var x = Math.max.apply(Math, argumentScale.range()) / 2; | ||
var y = Math.max.apply(Math, valueScale.range()) / 2; | ||
var x = Math.max.apply(Math, __spread(argumentScale.range())) / 2; | ||
var y = Math.max.apply(Math, __spread(valueScale.range())) / 2; | ||
var maxRadius = Math.min(x, y); | ||
@@ -322,3 +529,3 @@ var pieData = pie().sort(null).value(function (d) { return d.value; })(points); | ||
} | ||
return getLinePointTransformer.apply(void 0, args); | ||
return getLinePointTransformer.apply(void 0, __spread(args)); | ||
}; | ||
@@ -434,3 +641,3 @@ /** @internal */ | ||
var seriesColor = props.color || palette[index % palette.length]; | ||
return series.concat([__assign({}, props, { index: index, name: getUniqueName(series, props.name), points: createPoints(props, data, __assign({}, restProps, { color: seriesColor }), palette), color: seriesColor })]); | ||
return __spread(series, [__assign({}, props, { index: index, name: getUniqueName(series, props.name), points: createPoints(props, data, __assign({}, restProps, { color: seriesColor }), palette), color: seriesColor })]); | ||
}; | ||
@@ -503,3 +710,3 @@ // TODO: Memoization is much needed here by the same reason as in "createPoints". | ||
var points = series.points.map(function (point) { | ||
var _a = dataItems[point.index], value0 = _a[0], value = _a[1]; | ||
var _a = __read(dataItems[point.index], 2), value0 = _a[0], value = _a[1]; | ||
return __assign({}, point, { value: value, value0: value0 }); | ||
@@ -644,2 +851,3 @@ }); | ||
}; | ||
var getDefaultScatterAnimationOptions = function () { return '1.6s'; }; | ||
/** @internal */ | ||
@@ -662,3 +870,3 @@ var getAreaAnimationStyle = function (scales) { | ||
var getScatterAnimationStyle = function () { | ||
var options = getDefaultAreaAnimationOptions(); | ||
var options = getDefaultScatterAnimationOptions(); | ||
return { | ||
@@ -705,5 +913,7 @@ animation: getScatterAnimationName() + " " + options, | ||
/** @internal */ | ||
var getRootOffset = function (root) { | ||
var _a = root.getBoundingClientRect(), left = _a.left, top = _a.top; | ||
var pageXOffset = window.pageXOffset, pageYOffset = window.pageYOffset; | ||
var getOffset = function (element) { | ||
var _a = element.getBoundingClientRect(), left = _a.left, top = _a.top; | ||
// Safer way to get window. | ||
var defaultView = element.ownerDocument.defaultView; | ||
var _b = defaultView, pageXOffset = _b.pageXOffset, pageYOffset = _b.pageYOffset; | ||
return [left + pageXOffset, top + pageYOffset]; | ||
@@ -733,8 +943,12 @@ }; | ||
// so *rootRef.current* can be accessed. | ||
var offset = getRootOffset(rootRef.current); | ||
var offset = getOffset(rootRef.current); | ||
// *getBoundingClientRect* of a real html element is affected by window scrolling. | ||
// *popper.js* subscribes "html -> getBoundingClientRect -> (left, top)" from | ||
// "reference -> getBoundingClientRect" - so here it is added. | ||
var htmlRect = rootRef.current.ownerDocument.documentElement.getBoundingClientRect(); | ||
return { | ||
left: rect[0] + offset[0], | ||
top: rect[1] + offset[1], | ||
right: rect[2] + offset[0], | ||
bottom: rect[3] + offset[1], | ||
left: rect[0] + offset[0] + htmlRect.left, | ||
top: rect[1] + offset[1] + htmlRect.top, | ||
right: rect[2] + offset[0] + htmlRect.left, | ||
bottom: rect[3] + offset[1] + htmlRect.top, | ||
width: 0, | ||
@@ -751,15 +965,11 @@ height: 0, | ||
// TODO: Copypaste! | ||
var floatsEqual$1 = function (a, b) { return Math.abs(a - b) < Number.EPSILON; }; | ||
// Given original scale | ||
// f(domain) = range | ||
// f(subDomain) = subRange | ||
// Find extended scale | ||
// g(domain) = extendedRange | ||
// g(subDomain) = range | ||
// Original "range" is linearly extended so that | ||
// extendedRange : range === range : subRange | ||
// y = p * x + q | ||
// subRange = p * range + q => p, q | ||
// range = p * extendedRange + q => extendedRange | ||
var getArgumentBounds = function (viewport) { return (viewport && viewport.argumentStart !== undefined && viewport.argumentEnd !== undefined | ||
? [viewport.argumentStart, viewport.argumentEnd] : null); }; | ||
var getValueBounds = function (viewport) { return (viewport && viewport.valueStart !== undefined && viewport.valueEnd !== undefined | ||
? [viewport.valueStart, viewport.valueEnd] : null); }; | ||
var getValueScaleName = function (viewport) { return (getValueDomainName(viewport && viewport.scaleName)); }; | ||
var getDefaultBounds = function (scale) { | ||
var domain = scale.domain(); | ||
return [domain[0], domain[domain.length - 1]]; | ||
}; | ||
var proportionallyExtendRange = function (range, subRange) { | ||
@@ -776,6 +986,3 @@ var p = (subRange[0] - subRange[1]) / (range[0] - range[1]); | ||
var subRange = scaleBounds(scale, bounds); | ||
if (floatsEqual$1(subRange[0], range[0]) && floatsEqual$1(subRange[1], range[1])) { | ||
return range; | ||
} | ||
return proportionallyExtendRange(range, subRange); | ||
return rangesEqual(subRange, range) ? range : proportionallyExtendRange(range, subRange); | ||
}; | ||
@@ -789,13 +996,64 @@ var update = function (ranges, changes, key, domain, bounds) { | ||
/** @internal */ | ||
var adjustLayout = function (domains, ranges, _a) { | ||
var argumentBounds = _a.argumentBounds, scaleName = _a.scaleName, valueBounds = _a.valueBounds; | ||
var adjustLayout = function (domains, ranges, viewport) { | ||
var changes = {}; | ||
var argumentBounds = getArgumentBounds(viewport); | ||
if (argumentBounds) { | ||
update(ranges, changes, ARGUMENT_DOMAIN, domains[ARGUMENT_DOMAIN], argumentBounds); | ||
} | ||
var valueBounds = getValueBounds(viewport); | ||
if (valueBounds) { | ||
update(ranges, changes, VALUE_DOMAIN, domains[getValueDomainName(scaleName)], valueBounds); | ||
update(ranges, changes, VALUE_DOMAIN, domains[getValueScaleName(viewport)], valueBounds); | ||
} | ||
return Object.keys(changes).length ? __assign({}, ranges, changes) : ranges; | ||
}; | ||
var boundsForScale = function (name, scales, currentBounds, interaction, type, delta, anchor, range) { | ||
if (interaction !== type && interaction !== 'both') { | ||
return null; | ||
} | ||
var scale = scales[name]; | ||
var bounds = currentBounds || getDefaultBounds(scale); | ||
var newBounds; | ||
if (type === 'pan') { | ||
newBounds = moveBounds(scale, bounds, delta); | ||
} | ||
else if (type === 'zoom') { | ||
newBounds = range ? invertBoundsRange(scale, range) : growBounds(scale, bounds, delta, anchor); | ||
} | ||
return newBounds !== bounds ? newBounds : null; | ||
}; | ||
/** @internal */ | ||
var getViewport = function (scales, interactions, type, deltas, anchors, ranges, viewport, onViewportChange) { | ||
var changes = {}; | ||
var argumentBounds = boundsForScale(ARGUMENT_DOMAIN, scales, getArgumentBounds(viewport), interactions[0], type, deltas ? deltas[0] : 0, anchors ? anchors[0] : 0, ranges ? ranges[0] : undefined); | ||
var valueBounds = boundsForScale(getValueScaleName(viewport), scales, getValueBounds(viewport), interactions[1], type, deltas ? deltas[1] : 0, anchors ? anchors[1] : 0, ranges ? ranges[1] : undefined); | ||
if (argumentBounds) { | ||
changes.argumentStart = argumentBounds[0]; | ||
changes.argumentEnd = argumentBounds[1]; | ||
} | ||
if (valueBounds) { | ||
changes.valueStart = valueBounds[0]; | ||
changes.valueEnd = valueBounds[1]; | ||
} | ||
if (Object.keys(changes).length) { | ||
var newViewport = __assign({}, viewport, changes); | ||
if (onViewportChange) { | ||
onViewportChange(newViewport); | ||
} | ||
return { viewport: newViewport }; | ||
} | ||
return null; | ||
}; | ||
/** @internal */ | ||
var getDeltaForTouches = function (touches) { | ||
var deltaX = touches[0].pageX - touches[1].pageX; | ||
var deltaY = touches[0].pageY - touches[1].pageY; | ||
var delta = Math.sqrt(deltaX * deltaX + deltaY * deltaY); | ||
var center = [ | ||
(touches[0].pageX + touches[1].pageX) / 2, | ||
(touches[0].pageY + touches[1].pageY) / 2, | ||
]; | ||
return { delta: delta, center: center }; | ||
}; | ||
/** @internal */ | ||
var isKeyPressed = function (event, key) { return event[key + "Key"]; }; | ||
@@ -820,3 +1078,3 @@ var getSegmentLength = function (dx, dy) { return Math.sqrt(dx * dx + dy * dy); }; | ||
return function (_a) { | ||
var x = _a[0], y = _a[1]; | ||
var _b = __read(_a, 2), x = _b[0], y = _b[1]; | ||
return ctx.isPointInPath(x, y); | ||
@@ -828,3 +1086,3 @@ }; | ||
var getContinuousPointDistance = function (_a, _b) { | ||
var px = _a[0], py = _a[1]; | ||
var _c = __read(_a, 2), px = _c[0], py = _c[1]; | ||
var x = _b.x, y = _b.y; | ||
@@ -900,4 +1158,4 @@ return getSegmentLength(px - x, py - y); | ||
var createBarHitTester = createPointsEnumeratingHitTesterCreator(function (_a, point) { | ||
var px = _a[0], py = _a[1]; | ||
var _b = point, x = _b.x, y = _b.y, y1 = _b.y1, barWidth = _b.barWidth, maxBarWidth = _b.maxBarWidth; | ||
var _b = __read(_a, 2), px = _b[0], py = _b[1]; | ||
var _c = point, x = _c.x, y = _c.y, y1 = _c.y1, barWidth = _c.barWidth, maxBarWidth = _c.maxBarWidth; | ||
var xCenter = x; | ||
@@ -911,4 +1169,4 @@ var yCenter = (y + y1) / 2; | ||
var createScatterHitTester = createPointsEnumeratingHitTesterCreator(function (_a, obj) { | ||
var px = _a[0], py = _a[1]; | ||
var _b = obj, x = _b.x, y = _b.y, point = _b.point; | ||
var _b = __read(_a, 2), px = _b[0], py = _b[1]; | ||
var _c = obj, x = _c.x, y = _c.y, point = _c.point; | ||
var distance = getSegmentLength(px - x, py - y); | ||
@@ -924,4 +1182,4 @@ return distance <= point.size / 2 ? { distance: distance } : null; | ||
var createPieHitTester = createPointsEnumeratingHitTesterCreator(function (_a, point) { | ||
var px = _a[0], py = _a[1]; | ||
var _b = point, x = _b.x, y = _b.y, innerRadius = _b.innerRadius, outerRadius = _b.outerRadius, startAngle = _b.startAngle, maxRadius = _b.maxRadius, endAngle = _b.endAngle; | ||
var _b = __read(_a, 2), px = _b[0], py = _b[1]; | ||
var _c = point, x = _c.x, y = _c.y, innerRadius = _c.innerRadius, outerRadius = _c.outerRadius, startAngle = _c.startAngle, maxRadius = _c.maxRadius, endAngle = _c.endAngle; | ||
var inner = innerRadius * maxRadius; | ||
@@ -989,6 +1247,6 @@ var outer = outerRadius * maxRadius; | ||
var getEventCoords = function (e) { | ||
var offset = getRootOffset(e.currentTarget); | ||
var offset = getOffset(e.currentTarget); | ||
return [ | ||
e.clientX - offset[0], | ||
e.clientY - offset[1], | ||
e.pageX - offset[0], | ||
e.pageY - offset[1], | ||
]; | ||
@@ -1023,5 +1281,5 @@ }; | ||
if (status) { | ||
targets.push.apply(targets, status.points.map(function (point) { return ({ | ||
targets.push.apply(targets, __spread(status.points.map(function (point) { return ({ | ||
series: series, order: order, point: point.index, distance: point.distance, | ||
}); })); | ||
}); }))); | ||
} | ||
@@ -1067,3 +1325,3 @@ }); | ||
export { defaultDomains, addDomain, updateDomainItems, extendDomains, buildScales, bBoxes, getRanges, axisCoordinates, createTickFilter, getGridCoordinates, dArea, dLine, dSpline, getPiePointTransformer, getLinePointTransformer, getScatterPointTransformer, getAreaPointTransformer, getBarPointTransformer, findSeriesByName, dBar, dSymbol, dPie, addSeries, scaleSeriesPoints, getStackedSeries, getStackedDomains, getAreaAnimationStyle, getPieAnimationStyle, getScatterAnimationStyle, buildAnimatedStyleGetter, getParameters, createReference, processHandleTooltip, adjustLayout, createAreaHitTester, createLineHitTester, createSplineHitTester, createBarHitTester, createScatterHitTester, createPieHitTester, changeSeriesState, scaleLinear, scaleBand, isHorizontal, getWidth, getValueDomainName, makeScale, scaleBounds, fixOffset, getLegendItems, buildEventHandlers, processPointerMove, HORIZONTAL, VERTICAL, TOP, BOTTOM, LEFT, RIGHT, MIDDLE, END, START, LINEAR, BAND, ARGUMENT_DOMAIN, VALUE_DOMAIN, HOVERED, SELECTED }; | ||
export { defaultDomains, addDomain, updateDomainItems, extendDomains, buildScales, bBoxes, getRanges, axisCoordinates, createTickFilter, getGridCoordinates, dArea, dLine, dSpline, getPiePointTransformer, getLinePointTransformer, getScatterPointTransformer, getAreaPointTransformer, getBarPointTransformer, findSeriesByName, dBar, dSymbol, dPie, addSeries, scaleSeriesPoints, getStackedSeries, getStackedDomains, getAreaAnimationStyle, getPieAnimationStyle, getScatterAnimationStyle, buildAnimatedStyleGetter, getParameters, createReference, processHandleTooltip, adjustLayout, getViewport, getDeltaForTouches, isKeyPressed, createAreaHitTester, createLineHitTester, createSplineHitTester, createBarHitTester, createScatterHitTester, createPieHitTester, changeSeriesState, scaleLinear, scaleBand, isHorizontal, getWidth, fixOffset, getValueDomainName, rangesEqual, makeScale, scaleBounds, moveBounds, growBounds, invertBoundsRange, getLegendItems, buildEventHandlers, processPointerMove, getOffset, HORIZONTAL, VERTICAL, TOP, BOTTOM, LEFT, RIGHT, MIDDLE, END, START, LINEAR, BAND, ARGUMENT_DOMAIN, VALUE_DOMAIN, HOVERED, SELECTED }; | ||
//# sourceMappingURL=dx-chart-core.es.js.map |
/** | ||
* Bundle of @devexpress/dx-chart-core | ||
* Generated: 2019-03-13 | ||
* Version: 1.11.0-alpha.1 | ||
* Generated: 2019-04-24 | ||
* Version: 1.11.0-beta.1 | ||
* License: https://js.devexpress.com/Licensing | ||
@@ -40,2 +40,25 @@ */ | ||
function __read(o, n) { | ||
var m = typeof Symbol === "function" && o[Symbol.iterator]; | ||
if (!m) return o; | ||
var i = m.call(o), r, ar = [], e; | ||
try { | ||
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); | ||
} | ||
catch (error) { e = { error: error }; } | ||
finally { | ||
try { | ||
if (r && !r.done && (m = i["return"])) m.call(i); | ||
} | ||
finally { if (e) throw e.error; } | ||
} | ||
return ar; | ||
} | ||
function __spread() { | ||
for (var ar = [], i = 0; i < arguments.length; i++) | ||
ar = ar.concat(__read(arguments[i])); | ||
return ar; | ||
} | ||
/** @internal */ | ||
@@ -81,4 +104,14 @@ var HORIZONTAL = 'horizontal'; | ||
/** @internal */ | ||
var fixOffset = function (scale) { | ||
var offset = getWidth(scale) / 2; | ||
return offset > 0 ? function (value) { return scale(value) + offset; } : scale; | ||
}; | ||
/** @internal */ | ||
var getValueDomainName = function (name) { return name || VALUE_DOMAIN; }; | ||
var floatsEqual = function (a, b) { return Math.abs(a - b) < Number.EPSILON; }; | ||
/** @internal */ | ||
var rangesEqual = function (r1, r2) { | ||
return floatsEqual(r1[0], r2[0]) && floatsEqual(r1[1], r2[1]); | ||
}; | ||
/** @internal */ | ||
var makeScale = function (_a, range) { | ||
@@ -91,9 +124,175 @@ var factory = _a.factory, domain = _a.domain; | ||
// are encapsulated in this utility file. | ||
// | ||
/** @internal */ | ||
var scaleBounds = function (scale, bounds) { return ([scale(bounds[0]), scale(bounds[1]) + getWidth(scale)]); }; | ||
var scaleBounds = function (scale, bounds) { | ||
// There is an issue - when range is "inverted" values are scaled incorrectly. | ||
// scaleBand().domain(['a', 'b', 'c']).range([0, 60])('b') === 20 | ||
// scaleBand().domain(['a', 'b', 'c']).range([60, 0])('b') === 20 (should be 40) | ||
// Because of it bounds for reversed band scale are scaled wrong. | ||
// Fixing it would introduce an utility "scale" function and complicates the code. | ||
// Since for now we do not have "reversed" band scales the issue is left as-is. | ||
if (scale.bandwidth) { | ||
var cleanScale = scale.copy().paddingInner(0).paddingOuter(0); | ||
return [cleanScale(bounds[0]), cleanScale(bounds[1]) + cleanScale.bandwidth()]; | ||
} | ||
return bounds.map(scale); | ||
}; | ||
// Because of "scaleBands" issue moving and growing for "reversed" band scales | ||
// are not supported now. | ||
var moveLinearScaleBounds = function (scale, bounds, delta) { | ||
var fullRange = scale.range(); | ||
var sign = Math.sign(fullRange[1] - fullRange[0]); | ||
var range = scaleBounds(scale, bounds); | ||
var r0 = range[0] + delta; | ||
var r1 = range[1] + delta; | ||
// Check if new range is outside of the left border. | ||
if (Math.sign(r0 - fullRange[0]) !== sign) { | ||
r0 = fullRange[0]; | ||
r1 = r0 + range[1] - range[0]; | ||
} | ||
// Check if new range is outside of the right border. | ||
if (Math.sign(fullRange[1] - r1) !== sign) { | ||
r1 = fullRange[1]; | ||
r0 = r1 - range[1] + range[0]; | ||
} | ||
var newBounds = [scale.invert(r0), scale.invert(r1)]; | ||
return rangesEqual(bounds, newBounds) ? bounds : newBounds; | ||
}; | ||
// This is pointer "delta" processing specific for "band" scale. | ||
// If pointer delta is significantly smaller than band size (0.3) then movement should be skipped | ||
// and current delta should be added to a next one (from a new "move" event). | ||
// Now there is no code that accumulates deltas. | ||
// In order to allow band scrolling at least somehow the following is applied - if pointer delta | ||
// is at least greater than 30 pixel then minimal movement is performed. | ||
// TODO: Make proper delta accumulation! | ||
var adjustBandScaleMoveStep = function (delta, step) { | ||
var ratio = Math.abs(delta / step); | ||
var sign = Math.sign(delta / step); | ||
if (ratio >= 0.5) { | ||
return sign * Math.round(ratio); | ||
} | ||
if (ratio >= 0.3) { | ||
return sign; | ||
} | ||
if (Math.abs(delta) > 30) { | ||
return sign; | ||
} | ||
return 0; | ||
}; | ||
// Band case is processed separately to preserve categories amount in the bounds range. | ||
// If common inversion mechanism is used start and end bounds cannot be inverted independently | ||
// because of rounding issues which may add or remove categories to the new bounds. | ||
var moveBandScaleBounds = function (scale, bounds, delta) { | ||
var domain = scale.domain(); | ||
var fullRange = scale.range(); | ||
var step = (fullRange[1] - fullRange[0]) / domain.length; | ||
var rangeStep = adjustBandScaleMoveStep(delta, step); | ||
if (rangeStep === 0) { | ||
return bounds; | ||
} | ||
var range = scaleBounds(scale, bounds); | ||
var range0 = Math.round((range[0] - fullRange[0]) / step); | ||
var range1 = range0 + Math.round((range[1] - range[0]) / step) - 1; | ||
var new0 = range0 + rangeStep; | ||
var new1 = range1 + rangeStep; | ||
if (new0 < 0) { | ||
new0 = 0; | ||
new1 = new0 + range1 - range0; | ||
} | ||
if (new1 > domain.length - 1) { | ||
new1 = domain.length - 1; | ||
new0 = new1 - range1 + range0; | ||
} | ||
if (new0 === range0 || new1 === range1) { | ||
return bounds; | ||
} | ||
return [domain[new0], domain[new1]]; | ||
}; | ||
/** @internal */ | ||
var fixOffset = function (scale) { | ||
var offset = getWidth(scale) / 2; | ||
return offset > 0 ? function (value) { return scale(value) + offset; } : scale; | ||
var moveBounds = function (scale, bounds, delta) { return ((scale.bandwidth ? moveBandScaleBounds : moveLinearScaleBounds)(scale, bounds, delta)); }; | ||
var growLinearScaleBounds = function (scale, bounds, delta, anchor) { | ||
var fullRange = scale.range(); | ||
var sign = Math.sign(fullRange[1] - fullRange[0]); | ||
var range = scaleBounds(scale, bounds); | ||
var t = Math.abs((anchor - range[0]) / (range[1] - range[0])); | ||
var r0 = range[0] + sign * delta * 2 * t; | ||
var r1 = range[1] - sign * delta * 2 * (1 - t); | ||
// Check if new range is outside of the left border. | ||
if (Math.sign(r0 - fullRange[0]) !== sign) { | ||
r0 = fullRange[0]; | ||
} | ||
// Check if new range is outside of the right border. | ||
if (Math.sign(fullRange[1] - r1) !== sign) { | ||
r1 = fullRange[1]; | ||
} | ||
var minRangeThreshold = (fullRange[1] - fullRange[0]) / 100; | ||
// Check if new range is too small. | ||
if (Math.sign(r1 - r0) !== sign || Math.abs(r1 - r0) < Math.abs(minRangeThreshold)) { | ||
r0 = anchor - minRangeThreshold / 2; | ||
r1 = anchor + minRangeThreshold / 2; | ||
} | ||
var newBounds = [scale.invert(r0), scale.invert(r1)]; | ||
return rangesEqual(bounds, newBounds) ? bounds : newBounds; | ||
}; | ||
var growBandScaleBounds = function (scale, bounds, delta, anchor) { | ||
var domain = scale.domain(); | ||
var fullRange = scale.range(); | ||
var step = (fullRange[1] - fullRange[0]) / domain.length; | ||
var range = scaleBounds(scale, bounds); | ||
var range0 = Math.round((range[0] - fullRange[0]) / step); | ||
var range1 = range0 + Math.round((range[1] - range[0]) / step) - 1; | ||
// Let it be always 1 for now. | ||
var rangeStep = Math.sign(delta); | ||
if ((rangeStep === 0) || | ||
(rangeStep > 0 && range0 === range1) || | ||
(rangeStep < 0 && range0 === 0 && range1 === domain.length - 1)) { | ||
return bounds; | ||
} | ||
var t = Math.abs((anchor - range[0]) / (range[1] - range[0])); | ||
var new0 = range0 + Math.round(rangeStep * 2 * t); | ||
var new1 = range1 - Math.round(rangeStep * 2 * (1 - t)); | ||
if (new0 < 0) { | ||
new0 = 0; | ||
} | ||
if (new1 > domain.length - 1) { | ||
new1 = domain.length - 1; | ||
} | ||
if (new0 > new1) { | ||
if (t <= 0.5) { | ||
new1 = new0; | ||
} | ||
else { | ||
new0 = new1; | ||
} | ||
} | ||
if (new0 === range0 && new1 === range1) { | ||
return bounds; | ||
} | ||
return [domain[new0], domain[new1]]; | ||
}; | ||
// "scaleBounds" would be a better name but "scale" is already occupied. | ||
/** @internal */ | ||
var growBounds = function (scale, bounds, delta, anchor) { return ((scale.bandwidth ? growBandScaleBounds : growLinearScaleBounds)(scale, bounds, delta, anchor)); }; | ||
var invertLinearScaleBounds = function (scale, range) { | ||
var fullRange = scale.range(); | ||
var match = Math.sign(fullRange[1] - fullRange[0]) === Math.sign(range[1] - range[0]); | ||
return [ | ||
scale.invert(range[match ? 0 : 1]), | ||
scale.invert(range[match ? 1 : 0]), | ||
]; | ||
}; | ||
var matchPointToBand = function (domain, range, p) { | ||
var i = Math.floor(domain.length * (p - range[0]) / (range[1] - range[0])); | ||
return domain[Math.min(i, domain.length - 1)]; | ||
}; | ||
var invertBandScaleBounds = function (scale, range) { | ||
var domain = scale.domain(); | ||
var fullRange = scale.range(); | ||
return [ | ||
matchPointToBand(domain, fullRange, range[0]), | ||
matchPointToBand(domain, fullRange, range[1]), | ||
]; | ||
}; | ||
/** @internal */ | ||
var invertBoundsRange = function (scale, range) { return ((scale.bandwidth ? invertBandScaleBounds : invertLinearScaleBounds)(scale, range)); }; | ||
@@ -120,10 +319,8 @@ var _a; | ||
}; | ||
var floatsEqual = function (a, b) { return Math.abs(a - b) < Number.EPSILON; }; | ||
var mergeContinuousDomains = function (domain, items) { | ||
var newDomain = d3Array.extent(domain.concat(items)); | ||
return floatsEqual(newDomain[0], domain[0]) && floatsEqual(newDomain[1], domain[1]) | ||
? domain : newDomain; | ||
var newDomain = d3Array.extent(__spread(domain, items)); | ||
return rangesEqual(newDomain, domain) ? domain : newDomain; | ||
}; | ||
var mergeDiscreteDomains = function (domain, items) { | ||
var newDomain = Array.from(new Set(domain.concat(items))); | ||
var newDomain = Array.from(new Set(__spread(domain, items))); | ||
return newDomain.length === domain.length ? domain : newDomain; | ||
@@ -151,3 +348,3 @@ }; | ||
var items = series.points.map(getValue); | ||
return series.getPointTransformer.isStartedFromZero ? [0].concat(items) : items; | ||
return series.getPointTransformer.isStartedFromZero ? __spread([0], items) : items; | ||
}; | ||
@@ -200,10 +397,11 @@ var updateDomain = function (domain, series, getItem, getDomainItems) { return updateDomainItems(updateDomainFactory(domain, series, getItem), getDomainItems(series)); }; | ||
var getTicks = function (scale) { return (scale.ticks ? scale.ticks() : scale.domain()); }; | ||
var createTicks = function (scale, callback) { | ||
var getTicks = function (scale, count) { return (scale.ticks ? scale.ticks(count) : scale.domain()); }; | ||
var createTicks = function (scale, count, callback) { | ||
var fixedScale = fixOffset(scale); | ||
return getTicks(scale).map(function (tick, index) { return callback(fixedScale(tick), String(index), tick); }); | ||
return getTicks(scale, count) | ||
.map(function (tick, index) { return callback(fixedScale(tick), String(index), tick); }); | ||
}; | ||
var getFormat = function (scale, tickFormat) { | ||
var getFormat = function (scale, count, tickFormat) { | ||
if (scale.tickFormat) { | ||
return tickFormat ? tickFormat(scale) : scale.tickFormat(); | ||
return tickFormat ? tickFormat(scale, count) : scale.tickFormat(count); | ||
} | ||
@@ -234,9 +432,17 @@ return function (tick) { return tick; }; | ||
}; | ||
// Constant is selected to preserve original behavior described in | ||
// https://github.com/d3/d3-scale#continuous_ticks. | ||
var DEFAULT_TICK_COUNT = 10; | ||
var getTickCount = function (scaleRange, paneSize) { | ||
var rangeToPaneRatio = Math.abs(scaleRange[0] - scaleRange[1]) / paneSize || 1; | ||
return Math.round(DEFAULT_TICK_COUNT * rangeToPaneRatio); | ||
}; | ||
/** @internal */ | ||
var axisCoordinates = function (_a) { | ||
var scaleName = _a.scaleName, scale = _a.scale, position = _a.position, tickSize = _a.tickSize, tickFormat = _a.tickFormat, indentFromAxis = _a.indentFromAxis; | ||
var scaleName = _a.scaleName, scale = _a.scale, position = _a.position, tickSize = _a.tickSize, tickFormat = _a.tickFormat, indentFromAxis = _a.indentFromAxis, paneSize = _a.paneSize; | ||
var isHor = isHorizontal(scaleName); | ||
var options = (isHor ? createHorizontalOptions : createVerticalOptions)(position, tickSize, indentFromAxis); | ||
var formatTick = getFormat(scale, tickFormat); | ||
var ticks = createTicks(scale, function (coordinates, key, tick) { return (__assign({ key: key, x1: coordinates, x2: coordinates, y1: coordinates, y2: coordinates, xText: coordinates, yText: coordinates, text: formatTick(tick) }, options)); }); | ||
var tickCount = getTickCount(scale.range(), paneSize[1 - Number(isHor)]); | ||
var formatTick = getFormat(scale, tickCount, tickFormat); | ||
var ticks = createTicks(scale, tickCount, function (coordinates, key, tick) { return (__assign({ key: key, x1: coordinates, x2: coordinates, y1: coordinates, y2: coordinates, xText: coordinates, yText: coordinates, text: formatTick(tick) }, options)); }); | ||
return { | ||
@@ -250,3 +456,3 @@ ticks: ticks, | ||
var createTickFilter = function (_a) { | ||
var width = _a[0], height = _a[1]; | ||
var _b = __read(_a, 2), width = _b[0], height = _b[1]; | ||
return (width > 0 | ||
@@ -260,6 +466,7 @@ ? function (tick) { return tick.x1 >= 0 && tick.x1 <= width; } | ||
var getGridCoordinates = function (_a) { | ||
var scaleName = _a.scaleName, scale = _a.scale; | ||
var scaleName = _a.scaleName, scale = _a.scale, paneSize = _a.paneSize; | ||
var isHor = isHorizontal(scaleName); | ||
var tickCount = getTickCount(scale.range(), paneSize[1 - Number(isHor)]); | ||
var options = isHor ? horizontalGridOptions : verticalGridOptions; | ||
return createTicks(scale, function (coordinates, key) { return (__assign({ key: key, x: coordinates, y: coordinates, dx: 0, dy: 0 }, options)); }); | ||
return createTicks(scale, tickCount, function (coordinates, key) { return (__assign({ key: key, x: coordinates, y: coordinates, dx: 0, dy: 0 }, options)); }); | ||
}; | ||
@@ -296,4 +503,4 @@ | ||
var argumentScale = _a.argumentScale, valueScale = _a.valueScale, points = _a.points; | ||
var x = Math.max.apply(Math, argumentScale.range()) / 2; | ||
var y = Math.max.apply(Math, valueScale.range()) / 2; | ||
var x = Math.max.apply(Math, __spread(argumentScale.range())) / 2; | ||
var y = Math.max.apply(Math, __spread(valueScale.range())) / 2; | ||
var maxRadius = Math.min(x, y); | ||
@@ -324,3 +531,3 @@ var pieData = d3Shape.pie().sort(null).value(function (d) { return d.value; })(points); | ||
} | ||
return getLinePointTransformer.apply(void 0, args); | ||
return getLinePointTransformer.apply(void 0, __spread(args)); | ||
}; | ||
@@ -436,3 +643,3 @@ /** @internal */ | ||
var seriesColor = props.color || palette[index % palette.length]; | ||
return series.concat([__assign({}, props, { index: index, name: getUniqueName(series, props.name), points: createPoints(props, data, __assign({}, restProps, { color: seriesColor }), palette), color: seriesColor })]); | ||
return __spread(series, [__assign({}, props, { index: index, name: getUniqueName(series, props.name), points: createPoints(props, data, __assign({}, restProps, { color: seriesColor }), palette), color: seriesColor })]); | ||
}; | ||
@@ -505,3 +712,3 @@ // TODO: Memoization is much needed here by the same reason as in "createPoints". | ||
var points = series.points.map(function (point) { | ||
var _a = dataItems[point.index], value0 = _a[0], value = _a[1]; | ||
var _a = __read(dataItems[point.index], 2), value0 = _a[0], value = _a[1]; | ||
return __assign({}, point, { value: value, value0: value0 }); | ||
@@ -646,2 +853,3 @@ }); | ||
}; | ||
var getDefaultScatterAnimationOptions = function () { return '1.6s'; }; | ||
/** @internal */ | ||
@@ -664,3 +872,3 @@ var getAreaAnimationStyle = function (scales) { | ||
var getScatterAnimationStyle = function () { | ||
var options = getDefaultAreaAnimationOptions(); | ||
var options = getDefaultScatterAnimationOptions(); | ||
return { | ||
@@ -707,5 +915,7 @@ animation: getScatterAnimationName() + " " + options, | ||
/** @internal */ | ||
var getRootOffset = function (root) { | ||
var _a = root.getBoundingClientRect(), left = _a.left, top = _a.top; | ||
var pageXOffset = window.pageXOffset, pageYOffset = window.pageYOffset; | ||
var getOffset = function (element) { | ||
var _a = element.getBoundingClientRect(), left = _a.left, top = _a.top; | ||
// Safer way to get window. | ||
var defaultView = element.ownerDocument.defaultView; | ||
var _b = defaultView, pageXOffset = _b.pageXOffset, pageYOffset = _b.pageYOffset; | ||
return [left + pageXOffset, top + pageYOffset]; | ||
@@ -735,8 +945,12 @@ }; | ||
// so *rootRef.current* can be accessed. | ||
var offset = getRootOffset(rootRef.current); | ||
var offset = getOffset(rootRef.current); | ||
// *getBoundingClientRect* of a real html element is affected by window scrolling. | ||
// *popper.js* subscribes "html -> getBoundingClientRect -> (left, top)" from | ||
// "reference -> getBoundingClientRect" - so here it is added. | ||
var htmlRect = rootRef.current.ownerDocument.documentElement.getBoundingClientRect(); | ||
return { | ||
left: rect[0] + offset[0], | ||
top: rect[1] + offset[1], | ||
right: rect[2] + offset[0], | ||
bottom: rect[3] + offset[1], | ||
left: rect[0] + offset[0] + htmlRect.left, | ||
top: rect[1] + offset[1] + htmlRect.top, | ||
right: rect[2] + offset[0] + htmlRect.left, | ||
bottom: rect[3] + offset[1] + htmlRect.top, | ||
width: 0, | ||
@@ -753,15 +967,11 @@ height: 0, | ||
// TODO: Copypaste! | ||
var floatsEqual$1 = function (a, b) { return Math.abs(a - b) < Number.EPSILON; }; | ||
// Given original scale | ||
// f(domain) = range | ||
// f(subDomain) = subRange | ||
// Find extended scale | ||
// g(domain) = extendedRange | ||
// g(subDomain) = range | ||
// Original "range" is linearly extended so that | ||
// extendedRange : range === range : subRange | ||
// y = p * x + q | ||
// subRange = p * range + q => p, q | ||
// range = p * extendedRange + q => extendedRange | ||
var getArgumentBounds = function (viewport) { return (viewport && viewport.argumentStart !== undefined && viewport.argumentEnd !== undefined | ||
? [viewport.argumentStart, viewport.argumentEnd] : null); }; | ||
var getValueBounds = function (viewport) { return (viewport && viewport.valueStart !== undefined && viewport.valueEnd !== undefined | ||
? [viewport.valueStart, viewport.valueEnd] : null); }; | ||
var getValueScaleName = function (viewport) { return (getValueDomainName(viewport && viewport.scaleName)); }; | ||
var getDefaultBounds = function (scale) { | ||
var domain = scale.domain(); | ||
return [domain[0], domain[domain.length - 1]]; | ||
}; | ||
var proportionallyExtendRange = function (range, subRange) { | ||
@@ -778,6 +988,3 @@ var p = (subRange[0] - subRange[1]) / (range[0] - range[1]); | ||
var subRange = scaleBounds(scale, bounds); | ||
if (floatsEqual$1(subRange[0], range[0]) && floatsEqual$1(subRange[1], range[1])) { | ||
return range; | ||
} | ||
return proportionallyExtendRange(range, subRange); | ||
return rangesEqual(subRange, range) ? range : proportionallyExtendRange(range, subRange); | ||
}; | ||
@@ -791,13 +998,64 @@ var update = function (ranges, changes, key, domain, bounds) { | ||
/** @internal */ | ||
var adjustLayout = function (domains, ranges, _a) { | ||
var argumentBounds = _a.argumentBounds, scaleName = _a.scaleName, valueBounds = _a.valueBounds; | ||
var adjustLayout = function (domains, ranges, viewport) { | ||
var changes = {}; | ||
var argumentBounds = getArgumentBounds(viewport); | ||
if (argumentBounds) { | ||
update(ranges, changes, ARGUMENT_DOMAIN, domains[ARGUMENT_DOMAIN], argumentBounds); | ||
} | ||
var valueBounds = getValueBounds(viewport); | ||
if (valueBounds) { | ||
update(ranges, changes, VALUE_DOMAIN, domains[getValueDomainName(scaleName)], valueBounds); | ||
update(ranges, changes, VALUE_DOMAIN, domains[getValueScaleName(viewport)], valueBounds); | ||
} | ||
return Object.keys(changes).length ? __assign({}, ranges, changes) : ranges; | ||
}; | ||
var boundsForScale = function (name, scales, currentBounds, interaction, type, delta, anchor, range) { | ||
if (interaction !== type && interaction !== 'both') { | ||
return null; | ||
} | ||
var scale = scales[name]; | ||
var bounds = currentBounds || getDefaultBounds(scale); | ||
var newBounds; | ||
if (type === 'pan') { | ||
newBounds = moveBounds(scale, bounds, delta); | ||
} | ||
else if (type === 'zoom') { | ||
newBounds = range ? invertBoundsRange(scale, range) : growBounds(scale, bounds, delta, anchor); | ||
} | ||
return newBounds !== bounds ? newBounds : null; | ||
}; | ||
/** @internal */ | ||
var getViewport = function (scales, interactions, type, deltas, anchors, ranges, viewport, onViewportChange) { | ||
var changes = {}; | ||
var argumentBounds = boundsForScale(ARGUMENT_DOMAIN, scales, getArgumentBounds(viewport), interactions[0], type, deltas ? deltas[0] : 0, anchors ? anchors[0] : 0, ranges ? ranges[0] : undefined); | ||
var valueBounds = boundsForScale(getValueScaleName(viewport), scales, getValueBounds(viewport), interactions[1], type, deltas ? deltas[1] : 0, anchors ? anchors[1] : 0, ranges ? ranges[1] : undefined); | ||
if (argumentBounds) { | ||
changes.argumentStart = argumentBounds[0]; | ||
changes.argumentEnd = argumentBounds[1]; | ||
} | ||
if (valueBounds) { | ||
changes.valueStart = valueBounds[0]; | ||
changes.valueEnd = valueBounds[1]; | ||
} | ||
if (Object.keys(changes).length) { | ||
var newViewport = __assign({}, viewport, changes); | ||
if (onViewportChange) { | ||
onViewportChange(newViewport); | ||
} | ||
return { viewport: newViewport }; | ||
} | ||
return null; | ||
}; | ||
/** @internal */ | ||
var getDeltaForTouches = function (touches) { | ||
var deltaX = touches[0].pageX - touches[1].pageX; | ||
var deltaY = touches[0].pageY - touches[1].pageY; | ||
var delta = Math.sqrt(deltaX * deltaX + deltaY * deltaY); | ||
var center = [ | ||
(touches[0].pageX + touches[1].pageX) / 2, | ||
(touches[0].pageY + touches[1].pageY) / 2, | ||
]; | ||
return { delta: delta, center: center }; | ||
}; | ||
/** @internal */ | ||
var isKeyPressed = function (event, key) { return event[key + "Key"]; }; | ||
@@ -822,3 +1080,3 @@ var getSegmentLength = function (dx, dy) { return Math.sqrt(dx * dx + dy * dy); }; | ||
return function (_a) { | ||
var x = _a[0], y = _a[1]; | ||
var _b = __read(_a, 2), x = _b[0], y = _b[1]; | ||
return ctx.isPointInPath(x, y); | ||
@@ -830,3 +1088,3 @@ }; | ||
var getContinuousPointDistance = function (_a, _b) { | ||
var px = _a[0], py = _a[1]; | ||
var _c = __read(_a, 2), px = _c[0], py = _c[1]; | ||
var x = _b.x, y = _b.y; | ||
@@ -902,4 +1160,4 @@ return getSegmentLength(px - x, py - y); | ||
var createBarHitTester = createPointsEnumeratingHitTesterCreator(function (_a, point) { | ||
var px = _a[0], py = _a[1]; | ||
var _b = point, x = _b.x, y = _b.y, y1 = _b.y1, barWidth = _b.barWidth, maxBarWidth = _b.maxBarWidth; | ||
var _b = __read(_a, 2), px = _b[0], py = _b[1]; | ||
var _c = point, x = _c.x, y = _c.y, y1 = _c.y1, barWidth = _c.barWidth, maxBarWidth = _c.maxBarWidth; | ||
var xCenter = x; | ||
@@ -913,4 +1171,4 @@ var yCenter = (y + y1) / 2; | ||
var createScatterHitTester = createPointsEnumeratingHitTesterCreator(function (_a, obj) { | ||
var px = _a[0], py = _a[1]; | ||
var _b = obj, x = _b.x, y = _b.y, point = _b.point; | ||
var _b = __read(_a, 2), px = _b[0], py = _b[1]; | ||
var _c = obj, x = _c.x, y = _c.y, point = _c.point; | ||
var distance = getSegmentLength(px - x, py - y); | ||
@@ -926,4 +1184,4 @@ return distance <= point.size / 2 ? { distance: distance } : null; | ||
var createPieHitTester = createPointsEnumeratingHitTesterCreator(function (_a, point) { | ||
var px = _a[0], py = _a[1]; | ||
var _b = point, x = _b.x, y = _b.y, innerRadius = _b.innerRadius, outerRadius = _b.outerRadius, startAngle = _b.startAngle, maxRadius = _b.maxRadius, endAngle = _b.endAngle; | ||
var _b = __read(_a, 2), px = _b[0], py = _b[1]; | ||
var _c = point, x = _c.x, y = _c.y, innerRadius = _c.innerRadius, outerRadius = _c.outerRadius, startAngle = _c.startAngle, maxRadius = _c.maxRadius, endAngle = _c.endAngle; | ||
var inner = innerRadius * maxRadius; | ||
@@ -991,6 +1249,6 @@ var outer = outerRadius * maxRadius; | ||
var getEventCoords = function (e) { | ||
var offset = getRootOffset(e.currentTarget); | ||
var offset = getOffset(e.currentTarget); | ||
return [ | ||
e.clientX - offset[0], | ||
e.clientY - offset[1], | ||
e.pageX - offset[0], | ||
e.pageY - offset[1], | ||
]; | ||
@@ -1025,5 +1283,5 @@ }; | ||
if (status) { | ||
targets.push.apply(targets, status.points.map(function (point) { return ({ | ||
targets.push.apply(targets, __spread(status.points.map(function (point) { return ({ | ||
series: series, order: order, point: point.index, distance: point.distance, | ||
}); })); | ||
}); }))); | ||
} | ||
@@ -1103,2 +1361,5 @@ }); | ||
exports.adjustLayout = adjustLayout; | ||
exports.getViewport = getViewport; | ||
exports.getDeltaForTouches = getDeltaForTouches; | ||
exports.isKeyPressed = isKeyPressed; | ||
exports.createAreaHitTester = createAreaHitTester; | ||
@@ -1115,9 +1376,14 @@ exports.createLineHitTester = createLineHitTester; | ||
exports.getWidth = getWidth; | ||
exports.fixOffset = fixOffset; | ||
exports.getValueDomainName = getValueDomainName; | ||
exports.rangesEqual = rangesEqual; | ||
exports.makeScale = makeScale; | ||
exports.scaleBounds = scaleBounds; | ||
exports.fixOffset = fixOffset; | ||
exports.moveBounds = moveBounds; | ||
exports.growBounds = growBounds; | ||
exports.invertBoundsRange = invertBoundsRange; | ||
exports.getLegendItems = getLegendItems; | ||
exports.buildEventHandlers = buildEventHandlers; | ||
exports.processPointerMove = processPointerMove; | ||
exports.getOffset = getOffset; | ||
exports.HORIZONTAL = HORIZONTAL; | ||
@@ -1124,0 +1390,0 @@ exports.VERTICAL = VERTICAL; |
{ | ||
"name": "@devexpress/dx-chart-core", | ||
"version": "1.11.0-alpha.1", | ||
"version": "1.11.0-beta.1", | ||
"description": "Core library for the DevExtreme Reactive Chart component", | ||
@@ -39,3 +39,3 @@ "author": { | ||
"lint": "tslint -p tsconfig.lint.json", | ||
"lint:fix": "yarn run lint -- --fix" | ||
"lint:fix": "yarn lint -- --fix" | ||
}, | ||
@@ -63,3 +63,3 @@ "devDependencies": { | ||
}, | ||
"gitHead": "04937befc4fe9c5e329039533983c956deb78390" | ||
"gitHead": "972b9b88a1e51db0c0c8c30a009407b2d35a7a4f" | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
335557
2634