Skip to content

Commit 0d5df79

Browse files
committed
[changed] "show more" behavior is cleaner
1 parent 329dda4 commit 0d5df79

File tree

5 files changed

+235
-129
lines changed

5 files changed

+235
-129
lines changed

src/EventEndingRow.jsx

+94
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import React from 'react';
2+
import EventRowMixin from './EventRowMixin';
3+
import { eventLevels } from './utils/eventLevels';
4+
import message from './utils/messages';
5+
import range from 'lodash/utility/range';
6+
7+
let isSegmentInSlot = (seg, slot) => seg.left <= slot && seg.right >= slot;
8+
let eventsInSlot = (segments, slot) => segments.filter(seg => isSegmentInSlot(seg, slot)).length
9+
10+
let EventRow = React.createClass({
11+
12+
displayName: 'EventRow',
13+
14+
propTypes: {
15+
segments: React.PropTypes.array,
16+
slots: React.PropTypes.number
17+
},
18+
19+
mixins: [ EventRowMixin ],
20+
21+
render(){
22+
let { segments, slots: slotCount } = this.props;
23+
let rowSegments = eventLevels(segments).levels[0];
24+
25+
let current = 1
26+
, lastEnd = 1
27+
, row = [];
28+
29+
while (current <= slotCount){
30+
let key = '_lvl_' + current;
31+
32+
let { event, left, right, span } = rowSegments
33+
.filter(seg => isSegmentInSlot(seg, current))[0] || {} //eslint-disable-line
34+
35+
if (!event) {
36+
current++
37+
continue;
38+
}
39+
40+
if (this.canRenderSlotEvent(left, span)) {
41+
let gap = left - lastEnd;
42+
let content = this.renderEvent(event)
43+
44+
if (gap)
45+
row.push(this.renderSpan(gap, key + '_gap'))
46+
47+
row.push(
48+
this.renderSpan(span, key, content)
49+
)
50+
51+
lastEnd = current = (right + 1);
52+
}
53+
else {
54+
row.push(this.renderSpan(1, key, this.renderShowMore(segments, current)))
55+
current++;
56+
}
57+
}
58+
59+
return (
60+
<div className='rbc-row'>
61+
{ row }
62+
</div>
63+
)
64+
},
65+
66+
canRenderSlotEvent(slot, span){
67+
let { segments } = this.props;
68+
69+
return range(slot, slot + span).every(s => {
70+
let count = eventsInSlot(segments, s)
71+
72+
return count === 1
73+
})
74+
},
75+
76+
renderShowMore(segments, slot) {
77+
let messages = message(this.props.messages)
78+
let count = eventsInSlot(segments, slot)
79+
80+
return count
81+
? (
82+
<a
83+
key={'sm_' + slot}
84+
href='#'
85+
className={'rbc-show-more'}
86+
onClick={this.props.onShowMore.bind(null, slot)}
87+
>
88+
{messages.showMore(count)}
89+
</a>
90+
) : false
91+
}
92+
});
93+
94+
export default EventRow

src/EventRow.jsx

+7-65
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,19 @@
11
import React from 'react';
2-
import { findDOMNode } from 'react-dom';
3-
import EventCell from './EventCell';
4-
import getHeight from 'dom-helpers/query/height';
5-
import { accessor } from './utils/propTypes';
6-
import { segStyle } from './utils/eventLevels';
7-
import { isSelected } from './utils/selection';
8-
9-
let propTypes = {
10-
segments: React.PropTypes.array,
11-
end: React.PropTypes.instanceOf(Date),
12-
start: React.PropTypes.instanceOf(Date),
13-
14-
titleAccessor: accessor,
15-
allDayAccessor: accessor,
16-
startAccessor: accessor,
17-
endAccessor: accessor,
18-
19-
onEventClick: React.PropTypes.func
20-
};
2+
import EventRowMixin from './EventRowMixin';
213

224

235
let EventRow = React.createClass({
246

257
displayName: 'EventRow',
268

27-
propTypes,
28-
29-
getDefaultProps() {
30-
return {
31-
segments: [],
32-
selected: [],
33-
slots: 7
34-
};
9+
propTypes: {
10+
segments: React.PropTypes.array
3511
},
3612

13+
mixins: [EventRowMixin],
14+
3715
render(){
38-
let { segments, start, end } = this.props;
16+
let { segments } = this.props;
3917

4018
let lastEnd = 1;
4119

@@ -46,7 +24,7 @@ let EventRow = React.createClass({
4624
let key = '_lvl_' + li;
4725
let gap = left - lastEnd;
4826

49-
let content = this.renderEvent(event, start, end)
27+
let content = this.renderEvent(event)
5028

5129
if (gap)
5230
row.push(this.renderSpan(gap, key + '_gap'))
@@ -62,42 +40,6 @@ let EventRow = React.createClass({
6240
}
6341
</div>
6442
)
65-
},
66-
67-
renderEvent(event, start, end, props = {}){
68-
let {
69-
eventPropGetter, selected, startAccessor, endAccessor
70-
, titleAccessor, eventComponent, onSelect } = this.props;
71-
72-
73-
return (
74-
<EventCell
75-
event={event}
76-
eventPropGetter={eventPropGetter}
77-
onSelect={onSelect}
78-
selected={isSelected(event, selected)}
79-
startAccessor={startAccessor}
80-
endAccessor={endAccessor}
81-
titleAccessor={titleAccessor}
82-
slotStart={start}
83-
slotEnd={end}
84-
component={eventComponent}
85-
/>
86-
)
87-
},
88-
89-
renderSpan(len, key, content = ' '){
90-
let { slots } = this.props;
91-
92-
return (
93-
<div key={key} className='rbc-row-segment' style={segStyle(Math.abs(len), slots)}>
94-
{content}
95-
</div>
96-
)
97-
},
98-
99-
getRowHeight(){
100-
getHeight(findDOMNode(this))
10143
}
10244
});
10345

src/EventRowMixin.js

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import React, { PropTypes } from 'react';
2+
import { findDOMNode } from 'react-dom';
3+
import EventCell from './EventCell';
4+
import getHeight from 'dom-helpers/query/height';
5+
import { accessor, elementType } from './utils/propTypes';
6+
import { segStyle } from './utils/eventLevels';
7+
import { isSelected } from './utils/selection';
8+
9+
10+
export default {
11+
propType: {
12+
slots: PropTypes.number.isRequired,
13+
end: PropTypes.instanceOf(Date),
14+
start: PropTypes.instanceOf(Date),
15+
16+
selected: PropTypes.array,
17+
eventPropGetter: PropTypes.func,
18+
titleAccessor: accessor,
19+
allDayAccessor: accessor,
20+
startAccessor: accessor,
21+
endAccessor: accessor,
22+
23+
eventComponent: elementType,
24+
onSelect: React.PropTypes.func
25+
},
26+
27+
getDefaultProps() {
28+
return {
29+
segments: [],
30+
selected: [],
31+
slots: 7
32+
}
33+
},
34+
35+
renderEvent(event){
36+
let {
37+
eventPropGetter, selected, start, end
38+
, startAccessor, endAccessor, titleAccessor
39+
, allDayAccessor, eventComponent, onSelect } = this.props;
40+
41+
return (
42+
<EventCell
43+
event={event}
44+
eventPropGetter={eventPropGetter}
45+
onSelect={onSelect}
46+
selected={isSelected(event, selected)}
47+
startAccessor={startAccessor}
48+
endAccessor={endAccessor}
49+
titleAccessor={titleAccessor}
50+
allDayAccessor={allDayAccessor}
51+
slotStart={start}
52+
slotEnd={end}
53+
component={eventComponent}
54+
/>
55+
)
56+
},
57+
58+
renderSpan(len, key, content = ' '){
59+
let { slots } = this.props;
60+
61+
return (
62+
<div key={key} className='rbc-row-segment' style={segStyle(Math.abs(len), slots)}>
63+
{content}
64+
</div>
65+
)
66+
},
67+
68+
getRowHeight(){
69+
getHeight(findDOMNode(this))
70+
}
71+
}

0 commit comments

Comments
 (0)