forked from wix/react-native-calendars
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPacker.js
105 lines (85 loc) Β· 2.36 KB
/
Packer.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// @flow
import XDate from 'xdate';
const offset = 100;
function buildEvent(column, left, width, dayStart) {
const startTime = XDate(column.start);
const endTime = column.end ? XDate(column.end) : XDate(startTime).addHours(1);
const dayStartTime = XDate(dayStart).clearTime();
column.top = startTime.diffHours(dayStartTime) * offset;
column.height = endTime.diffHours(startTime) * offset;
column.width = width;
column.left = left;
return column;
}
function collision(a, b) {
return a.end > b.start && a.start < b.end;
}
function expand(ev, column, columns) {
let colSpan = 1;
for (let i = column + 1; i < columns.length; i++) {
let col = columns[i];
for (let j = 0; j < col.length; j++) {
let ev1 = col[j];
if (collision(ev, ev1)) {
return colSpan;
}
}
colSpan++;
}
return colSpan;
}
function pack(columns, width, calculatedEvents, dayStart) {
let colLength = columns.length;
for (let i = 0; i < colLength; i++) {
let col = columns[i];
for (let j = 0; j < col.length; j++) {
const colSpan = expand(col[j], i, columns);
const L = (i / colLength) * width;
const W = (width * colSpan) / colLength - 10;
calculatedEvents.push(buildEvent(col[j], L, W, dayStart));
}
}
}
function populateEvents(events, screenWidth, dayStart) {
let lastEnd;
let columns;
let calculatedEvents = [];
events = events
.map((ev, index) => ({...ev, index: index}))
.sort(function (a, b) {
if (a.start < b.start) return -1;
if (a.start > b.start) return 1;
if (a.end < b.end) return -1;
if (a.end > b.end) return 1;
return 0;
});
columns = [];
lastEnd = null;
events.forEach(function (ev) {
if (lastEnd !== null && ev.start >= lastEnd) {
pack(columns, screenWidth, calculatedEvents, dayStart);
columns = [];
lastEnd = null;
}
let placed = false;
for (let i = 0; i < columns.length; i++) {
let col = columns[i];
if (!collision(col[col.length - 1], ev)) {
col.push(ev);
placed = true;
break;
}
}
if (!placed) {
columns.push([ev]);
}
if (lastEnd === null || ev.end > lastEnd) {
lastEnd = ev.end;
}
});
if (columns.length > 0) {
pack(columns, screenWidth, calculatedEvents, dayStart);
}
return calculatedEvents;
}
export default populateEvents;