Skip to content

Commit f526e23

Browse files
committed
[added] onSelecting callback
closes jquense#46
1 parent 18c0234 commit f526e23

File tree

2 files changed

+36
-7
lines changed

2 files changed

+36
-7
lines changed

src/Calendar.jsx

+11
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,17 @@ let Calendar = React.createClass({
101101
*/
102102
onSelectEvent: PropTypes.func,
103103

104+
/**
105+
* Callback fired when dragging a selection in the Time views.
106+
*
107+
* Returning `false` from the handler will prevent a selection.
108+
*
109+
* ```js
110+
* function ({ start: Date, end: Date }) : boolean
111+
* ```
112+
*/
113+
onSelecting: PropTypes.func,
114+
104115
/**
105116
* An array of built-in view names to allow the calendar to display.
106117
*

src/DaySlot.jsx

+25-7
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ let DaySlot = React.createClass({
5151
selectable: React.PropTypes.bool,
5252
eventOffset: React.PropTypes.number,
5353

54+
onSelecting: React.PropTypes.func,
5455
onSelectSlot: React.PropTypes.func.isRequired,
5556
onSelectEvent: React.PropTypes.func.isRequired
5657
},
@@ -193,6 +194,24 @@ let DaySlot = React.createClass({
193194
let node = findDOMNode(this);
194195
let selector = this._selector = new Selection(()=> findDOMNode(this))
195196

197+
let maybeSelect = (box) => {
198+
let onSelecting = this.props.onSelecting
199+
let current = this.state || {};
200+
let state = selectionState(box);
201+
let { startDate: start, endDate: end } = state;
202+
203+
if (onSelecting) {
204+
if (
205+
(dates.eq(current.startDate, start, 'minutes') &&
206+
dates.eq(current.endDate, end, 'minutes')) ||
207+
onSelecting({ start, end }) === false
208+
)
209+
return
210+
}
211+
212+
this.setState(state)
213+
}
214+
196215
let selectionState = ({ x, y }) => {
197216
let { step, min, max } = this.props;
198217
let { top, bottom } = getBoundsForNode(node)
@@ -225,11 +244,8 @@ let DaySlot = React.createClass({
225244
}
226245
}
227246

228-
selector.on('selecting',
229-
box => this.setState(selectionState(box)))
230-
231-
selector.on('selectStart',
232-
box => this.setState(selectionState(box)))
247+
selector.on('selecting', maybeSelect)
248+
selector.on('selectStart', maybeSelect)
233249

234250
selector
235251
.on('click', ({ x, y }) => {
@@ -242,8 +258,10 @@ let DaySlot = React.createClass({
242258

243259
selector
244260
.on('select', () => {
245-
this._selectSlot(this.state)
246-
this.setState({ selecting: false })
261+
if (this.state.selecting) {
262+
this._selectSlot(this.state)
263+
this.setState({ selecting: false })
264+
}
247265
})
248266
},
249267

0 commit comments

Comments
 (0)