diff --git a/src/lib/Timeline.js b/src/lib/Timeline.js index 1355f110a..f2f0b7a09 100644 --- a/src/lib/Timeline.js +++ b/src/lib/Timeline.js @@ -512,20 +512,43 @@ export default class ReactCalendarTimeline extends Component { onScroll = scrollX => { const width = this.state.width - + const zoom = this.state.visibleTimeEnd - this.state.visibleTimeStart const canvasTimeStart = this.state.canvasTimeStart + const newVsibleTimeStart = canvasTimeStart + zoom * scrollX / width - const zoom = this.state.visibleTimeEnd - this.state.visibleTimeStart + let newScrollX = scrollX + + // prevent touchpad scroll to the value less then visibleTimeStart and more then visibleTimeEnd including zoom value - const visibleTimeStart = canvasTimeStart + zoom * scrollX / width + let defaultVisibleTimeStart = this.props.defaultTimeStart.valueOf(); + let defaultVisibleTimeEnd = this.props.defaultTimeEnd.valueOf(); + + if (this.props.visibleTimeStart && this.props.visibleTimeEnd) { + if (newVsibleTimeStart < this.props.visibleTimeStart) { + newScrollX = this.scrollHeaderRef.scrollLeft + } else if (newVsibleTimeStart + zoom > this.props.visibleTimeEnd) { + newScrollX = this.scrollHeaderRef.scrollLeft + } + } else if (defaultVisibleTimeStart && defaultVisibleTimeEnd) { + if (newVsibleTimeStart < defaultVisibleTimeStart) { + newScrollX = this.scrollHeaderRef.scrollLeft + } else if (newVsibleTimeStart + zoom > defaultVisibleTimeEnd) { + newScrollX = this.scrollHeaderRef.scrollLeft + } + } + + if (newScrollX !== scrollX) { + this.scrollHeaderRef.scrollLeft = newScrollX + this.scrollComponent.scrollLeft = newScrollX + } if ( - this.state.visibleTimeStart !== visibleTimeStart || - this.state.visibleTimeEnd !== visibleTimeStart + zoom + this.state.visibleTimeStart !== newVsibleTimeStart || + this.state.visibleTimeEnd !== newVsibleTimeStart + zoom ) { this.props.onTimeChange( - visibleTimeStart, - visibleTimeStart + zoom, + newVsibleTimeStart, + newVsibleTimeStart + zoom, this.updateScrollCanvas, this.getTimelineUnit() )