Skip to content

Commit 0e3b325

Browse files
committed
Support passing Timeline rightEdgeSpacing
1 parent 4d91d31 commit 0e3b325

File tree

5 files changed

+49
-21
lines changed

5 files changed

+49
-21
lines changed

example/src/screens/timelineCalendar.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,8 @@ export default class TimelineCalendarScreen extends Component {
224224
// scrollToFirst: true,
225225
// start: 0,
226226
// end: 24,
227-
overlapEventsSpacing: 8
227+
overlapEventsSpacing: 8,
228+
rightEdgeSpacing: 24,
228229
};
229230

230231
render() {

src/timeline/Packer.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@ interface PopulateOptions {
99
dayStart?: number;
1010
hourBlockHeight?: number;
1111
overlapEventsSpacing?: number;
12+
rightEdgeSpacing?: number;
1213
}
1314

1415
export const HOUR_BLOCK_HEIGHT = 100;
1516
const OVERLAP_EVENTS_SPACINGS = 10;
17+
const RIGHT_EDGE_SPACING = 10;
1618

1719
function buildEvent(event: Event & {index: number}, left: number, width: number, {dayStart = 0, hourBlockHeight = HOUR_BLOCK_HEIGHT}: PopulateOptions): PackedEvent {
1820
const startTime = new XDate(event.start);
@@ -55,12 +57,13 @@ function packOverlappingEventGroup(
5557
calculatedEvents: PackedEvent[],
5658
populateOptions: PopulateOptions
5759
) {
58-
const {screenWidth = constants.screenWidth, overlapEventsSpacing = OVERLAP_EVENTS_SPACINGS} = populateOptions;
60+
const {screenWidth = constants.screenWidth, rightEdgeSpacing = RIGHT_EDGE_SPACING, overlapEventsSpacing = OVERLAP_EVENTS_SPACINGS} = populateOptions;
5961
columns.forEach((column, columnIndex) => {
6062
column.forEach(event => {
63+
const totalWidth = screenWidth - rightEdgeSpacing;
6164
const columnSpan = calcColumnSpan(event, columnIndex, columns);
62-
const eventLeft = (columnIndex / columns.length) * screenWidth;
63-
let eventWidth = screenWidth * (columnSpan / columns.length);
65+
const eventLeft = (columnIndex / columns.length) * totalWidth;
66+
let eventWidth = totalWidth * (columnSpan / columns.length);
6467

6568
if (columnIndex + columnSpan <= columns.length -1) {
6669
eventWidth -= overlapEventsSpacing;

src/timeline/Timeline.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ export interface TimelineProps {
8787
* Spacing between overlapping events
8888
*/
8989
overlapEventsSpacing?: number;
90+
/**
91+
* Spacing to keep at the right edge (for background press)
92+
*/
93+
rightEdgeSpacing?: number;
9094
}
9195

9296
const Timeline = (props: TimelineProps) => {
@@ -108,6 +112,7 @@ const Timeline = (props: TimelineProps) => {
108112
scrollOffset,
109113
onChangeOffset,
110114
overlapEventsSpacing,
115+
rightEdgeSpacing,
111116
eventTapped
112117
} = props;
113118

@@ -119,7 +124,7 @@ const Timeline = (props: TimelineProps) => {
119124

120125
const packedEvents = useMemo(() => {
121126
const width = constants.screenWidth - HOURS_SIDEBAR_WIDTH;
122-
return populateEvents(events, {screenWidth: width, dayStart: start, overlapEventsSpacing});
127+
return populateEvents(events, {screenWidth: width, dayStart: start, overlapEventsSpacing, rightEdgeSpacing});
123128
}, [events, start]);
124129

125130
useEffect(() => {

src/timeline/__tests__/Packer.spec.js

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,21 +38,26 @@ describe('Timeline Packer utils', () => {
3838
});
3939

4040
it('should set event block width based on overlaps of 3 events', () => {
41-
const packedEvents = uut(events, {screenWidth: 300, dayStart: 0});
41+
const packedEvents = uut(events, {screenWidth: 310, dayStart: 0, rightEdgeSpacing: 10, overlapEventsSpacing: 10});
4242
expect(packedEvents[0].width).toBe(90); // event 1
4343
expect(packedEvents[1].width).toBe(90); // event 3
4444
expect(packedEvents[2].width).toBe(100); // event 2
4545
});
4646

4747
it('should set event block width based on overlaps of 2 events', () => {
48-
const packedEvents = uut([events[0], events[1]], {screenWidth: 300, dayStart: 0});
49-
expect(packedEvents[0].width).toBe(140); // event 1
50-
expect(packedEvents[1].width).toBe(150); // event 2
48+
const packedEvents = uut([events[0], events[1]], {
49+
screenWidth: 300,
50+
dayStart: 0,
51+
overlapEventsSpacing: 10,
52+
rightEdgeSpacing: 10
53+
});
54+
expect(packedEvents[0].width).toBe(135); // event 1
55+
expect(packedEvents[1].width).toBe(145); // event 2
5156
});
5257

5358
it('should set event block width when there is not overlaps', () => {
5459
const packedEvents = uut([events[0]], {screenWidth: 300, dayStart: 0});
55-
expect(packedEvents[0].width).toBe(300); // event 1
60+
expect(packedEvents[0].width).toBe(290); // event 1
5661
});
5762

5863
it('should handle a complex case of overlapping events', () => {
@@ -82,7 +87,7 @@ describe('Timeline Packer utils', () => {
8287
end: `2017-09-06 05:30:00`
8388
}
8489
];
85-
let packedEvents = uut(overlappingEvents, {screenWidth: 300, dayStart: 0, overlapEventsSpacing: 4});
90+
let packedEvents = uut(overlappingEvents, {screenWidth: 310, dayStart: 0, overlapEventsSpacing: 4});
8691
packedEvents = _.sortBy(packedEvents, 'index');
8792
expect(packedEvents[0].width).toBe(96);
8893
expect(packedEvents[1].width).toBe(96);
@@ -102,16 +107,21 @@ describe('Timeline Packer utils', () => {
102107
});
103108

104109
it('should set left position base when the 3 events overlap', () => {
105-
const packedEvents = uut(events, {screenWidth: 300, dayStart: 0});
110+
const packedEvents = uut(events, {screenWidth: 300, dayStart: 0, overlapEventsSpacing: 10, rightEdgeSpacing: 10});
106111
expect(packedEvents[0].left).toBe(0); // event 1
107-
expect(packedEvents[1].left).toBe(100); // event 3
108-
expect(packedEvents[2].left).toBe(200); // event 2
112+
expect(packedEvents[1].left).toBeCloseTo(96.666); // event 3
113+
expect(packedEvents[2].left).toBeCloseTo(193.333); // event 2
109114
});
110115

111116
it('should set left position base when the 2 events overlap', () => {
112-
const packedEvents = uut([events[0], events[1]], {screenWidth: 300, dayStart: 0});
117+
const packedEvents = uut([events[0], events[1]], {
118+
screenWidth: 300,
119+
dayStart: 0,
120+
overlapEventsSpacing: 10,
121+
rightEdgeSpacing: 10
122+
});
113123
expect(packedEvents[0].left).toBe(0); // event 1
114-
expect(packedEvents[1].left).toBe(150); // event 3
124+
expect(packedEvents[1].left).toBe(145); // event 3
115125
});
116126
});
117127
});

src/timeline/timeline.api.json

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
{
22
"name": "Timeline",
33
"description": "Timeline component",
4-
"images": [
5-
],
4+
"images": [],
65
"extends": ["ScrollView"],
7-
"extendsLink": [
8-
"https://reactnative.dev/docs/scrollview"
9-
],
6+
"extendsLink": ["https://reactnative.dev/docs/scrollview"],
107
"example": "https://github.com/wix/react-native-calendars/blob/master/example/src/screens/timelineCalendar.tsx",
118
"props": [
129
{
@@ -66,6 +63,18 @@
6663
"type": "boolean",
6764
"description": "Whether to use 24 hours format for the timeline hours",
6865
"default": "true"
66+
},
67+
{
68+
"name": "overlapEventsSpacing",
69+
"type": "number",
70+
"description": "Spacing between overlapping events",
71+
"default": "10"
72+
},
73+
{
74+
"name": "rightEdgeSpacing",
75+
"type": "number",
76+
"description": "Spacing to keep at the right edge (for background press)",
77+
"default": "10"
6978
}
7079
]
7180
}

0 commit comments

Comments
 (0)