Skip to content

Commit d1c5085

Browse files
authored
fix: calendar auto scroll while dragging event at top/bottom edge (jquense#2230)
Closes jquense#2231
1 parent 0918777 commit d1c5085

File tree

1 file changed

+35
-2
lines changed

1 file changed

+35
-2
lines changed

src/addons/dragAndDrop/EventContainerWrapper.js

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import PropTypes from 'prop-types'
22
import React from 'react'
33
import { DnDContext } from './DnDContext'
4+
import { scrollParent, scrollTop } from 'dom-helpers'
5+
import qsa from 'dom-helpers/cjs/querySelectorAll'
46

57
import Selection, {
68
getBoundsForNode,
@@ -124,13 +126,38 @@ class EventContainerWrapper extends React.Component {
124126
})
125127
}
126128

129+
updateParentScroll = (parent, node) => {
130+
setTimeout(() => {
131+
const draggedEl = qsa(node, '.rbc-addons-dnd-drag-preview')[0]
132+
if (draggedEl) {
133+
if (draggedEl.offsetTop < parent.scrollTop) {
134+
scrollTop(parent, Math.max(draggedEl.offsetTop, 0))
135+
} else if (
136+
draggedEl.offsetTop + draggedEl.offsetHeight >
137+
parent.scrollTop + parent.clientHeight
138+
) {
139+
scrollTop(
140+
parent,
141+
Math.min(
142+
draggedEl.offsetTop -
143+
parent.offsetHeight +
144+
draggedEl.offsetHeight,
145+
parent.scrollHeight
146+
)
147+
)
148+
}
149+
}
150+
})
151+
}
152+
127153
_selectable = () => {
128154
let wrapper = this.ref.current
129155
let node = wrapper.children[0]
130156
let isBeingDragged = false
131157
let selector = (this._selector = new Selection(() =>
132158
wrapper.closest('.rbc-time-view')
133159
))
160+
let parent = scrollParent(wrapper)
134161

135162
selector.on('beforeSelect', (point) => {
136163
const { dragAndDropAction } = this.context.draggable
@@ -156,8 +183,14 @@ class EventContainerWrapper extends React.Component {
156183
const bounds = getBoundsForNode(node)
157184
const { dragAndDropAction } = this.context.draggable
158185

159-
if (dragAndDropAction.action === 'move') this.handleMove(box, bounds)
160-
if (dragAndDropAction.action === 'resize') this.handleResize(box, bounds)
186+
if (dragAndDropAction.action === 'move') {
187+
this.updateParentScroll(parent, node)
188+
this.handleMove(box, bounds)
189+
}
190+
if (dragAndDropAction.action === 'resize') {
191+
this.updateParentScroll(parent, node)
192+
this.handleResize(box, bounds)
193+
}
161194
})
162195

163196
selector.on('dropFromOutside', (point) => {

0 commit comments

Comments
 (0)