Skip to content

Commit fbee6fb

Browse files
committed
Fix overlap event spacing logic
1 parent 936d687 commit fbee6fb

File tree

3 files changed

+74
-11
lines changed

3 files changed

+74
-11
lines changed

example/src/screens/timelineCalendar.tsx

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,25 +21,46 @@ const EVENTS: TimelineEventProps[] = [
2121
title: 'Merge Request to React Native Calendars',
2222
summary: 'Merge Timeline Calendar to React Native Calendars'
2323
},
24+
{
25+
start: `${getDate()} 01:15:00`,
26+
end: `${getDate()} 02:30:00`,
27+
title: 'Meeting A',
28+
summary: 'Summary for meeting A',
29+
color: '#e6add8'
30+
},
2431
{
2532
start: `${getDate()} 01:30:00`,
2633
end: `${getDate()} 02:30:00`,
27-
title: 'Dr. Mariana Joseph',
28-
summary: '3412 Piedmont Rd NE, GA 3032',
34+
title: 'Meeting B',
35+
summary: 'Summary for meeting B',
2936
color: '#e6add8'
3037
},
3138
{
3239
start: `${getDate()} 01:45:00`,
3340
end: `${getDate()} 02:45:00`,
34-
title: 'Dr. Mariana Joseph',
35-
summary: '3412 Piedmont Rd NE, GA 3032',
41+
title: 'Meeting C',
42+
summary: 'Summary for meeting C',
3643
color: '#e6add8'
3744
},
3845
{
3946
start: `${getDate()} 02:40:00`,
4047
end: `${getDate()} 03:10:00`,
41-
title: 'Dr. Mariana Joseph',
42-
summary: '3412 Piedmont Rd NE, GA 3032',
48+
title: 'Meeting D',
49+
summary: 'Summary for meeting D',
50+
color: '#e6add8'
51+
},
52+
{
53+
start: `${getDate()} 02:50:00`,
54+
end: `${getDate()} 03:20:00`,
55+
title: 'Meeting E',
56+
summary: 'Summary for meeting E',
57+
color: '#e6add8'
58+
},
59+
{
60+
start: `${getDate()} 04:30:00`,
61+
end: `${getDate()} 05:30:00`,
62+
title: 'Meeting F',
63+
summary: 'Summary for meeting F',
4364
color: '#e6add8'
4465
},
4566
{
@@ -203,7 +224,7 @@ export default class TimelineCalendarScreen extends Component {
203224
// scrollToFirst: true,
204225
// start: 0,
205226
// end: 24,
206-
// eventRightSpacing: 4
227+
eventRightSpacing: 4
207228
};
208229

209230
render() {

src/timeline/Packer.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,11 @@ function packOverlappingEventGroup(
6060
column.forEach(event => {
6161
const columnSpan = calcColumnSpan(event, columnIndex, columns);
6262
const eventLeft = (columnIndex / columns.length) * screenWidth;
63-
const eventWidth = screenWidth * (columnSpan / columns.length) - eventBlockRightMargin;
63+
let eventWidth = screenWidth * (columnSpan / columns.length);
64+
65+
if (columnIndex + columnSpan <= columns.length -1) {
66+
eventWidth -= eventBlockRightMargin;
67+
}
6468

6569
calculatedEvents.push(buildEvent(event, eventLeft, eventWidth, populateOptions));
6670
});

src/timeline/__tests__/Packer.spec.js

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import _ from 'lodash';
12
import uut from '../Packer';
23

34
describe('Timeline Packer utils', () => {
@@ -40,18 +41,55 @@ describe('Timeline Packer utils', () => {
4041
const packedEvents = uut(events, {screenWidth: 300, dayStart: 0});
4142
expect(packedEvents[0].width).toBe(90); // event 1
4243
expect(packedEvents[1].width).toBe(90); // event 3
43-
expect(packedEvents[2].width).toBe(90); // event 2
44+
expect(packedEvents[2].width).toBe(100); // event 2
4445
});
4546

4647
it('should set event block width based on overlaps of 2 events', () => {
4748
const packedEvents = uut([events[0], events[1]], {screenWidth: 300, dayStart: 0});
4849
expect(packedEvents[0].width).toBe(140); // event 1
49-
expect(packedEvents[1].width).toBe(140); // event 2
50+
expect(packedEvents[1].width).toBe(150); // event 2
5051
});
5152

5253
it('should set event block width when there is not overlaps', () => {
5354
const packedEvents = uut([events[0]], {screenWidth: 300, dayStart: 0});
54-
expect(packedEvents[0].width).toBe(290); // event 1
55+
expect(packedEvents[0].width).toBe(300); // event 1
56+
});
57+
58+
it('should handle a complex case of overlapping events', () => {
59+
const overlappingEvents = [
60+
{
61+
start: `2017-09-06 01:15:00`,
62+
end: `2017-09-06 02:30:00`
63+
},
64+
{
65+
start: `2017-09-06 01:30:00`,
66+
end: `2017-09-06 02:30:00`
67+
},
68+
{
69+
start: `2017-09-06 01:45:00`,
70+
end: `2017-09-06 02:45:00`
71+
},
72+
{
73+
start: `2017-09-06 02:40:00`,
74+
end: `2017-09-06 03:10:00`
75+
},
76+
{
77+
start: `2017-09-06 02:50:00`,
78+
end: `2017-09-06 03:20:00`
79+
},
80+
{
81+
start: `2017-09-06 04:30:00`,
82+
end: `2017-09-06 05:30:00`
83+
}
84+
];
85+
let packedEvents = uut(overlappingEvents, {screenWidth: 300, dayStart: 0, eventRightSpacing: 10});
86+
packedEvents = _.sortBy(packedEvents, 'index');
87+
expect(packedEvents[0].width).toBe(90);
88+
expect(packedEvents[1].width).toBe(90);
89+
expect(packedEvents[2].width).toBe(100);
90+
expect(packedEvents[3].width).toBe(90);
91+
expect(packedEvents[4].width).toBe(200);
92+
expect(packedEvents[5].width).toBe(300);
5593
});
5694
});
5795

0 commit comments

Comments
 (0)