routie dev init since i didn't adhere to any proper guidance up until now
This commit is contained in:
+108
@@ -0,0 +1,108 @@
|
||||
// Types
|
||||
import { getTimestampIdentifier } from "../util/timestamp.js";
|
||||
const MILLIS_IN_DAY = 86400000;
|
||||
export function getVisuals(events, minStart = 0) {
|
||||
const visuals = events.map(event => ({
|
||||
event,
|
||||
columnCount: 0,
|
||||
column: 0,
|
||||
left: 0,
|
||||
width: 100
|
||||
}));
|
||||
visuals.sort((a, b) => {
|
||||
return Math.max(minStart, a.event.startTimestampIdentifier) - Math.max(minStart, b.event.startTimestampIdentifier) || b.event.endTimestampIdentifier - a.event.endTimestampIdentifier;
|
||||
});
|
||||
return visuals;
|
||||
}
|
||||
export function hasOverlap(s0, e0, s1, e1, exclude = true) {
|
||||
return exclude ? !(s0 >= e1 || e0 <= s1) : !(s0 > e1 || e0 < s1);
|
||||
}
|
||||
export function setColumnCount(groups) {
|
||||
groups.forEach(group => {
|
||||
group.visuals.forEach(groupVisual => {
|
||||
groupVisual.columnCount = groups.length;
|
||||
});
|
||||
});
|
||||
}
|
||||
export function getRange(event) {
|
||||
return [event.startTimestampIdentifier, event.endTimestampIdentifier];
|
||||
}
|
||||
export function getDayRange(event) {
|
||||
return [event.startIdentifier, event.endIdentifier];
|
||||
}
|
||||
export function getNormalizedRange(event, dayStart) {
|
||||
return [Math.max(dayStart, event.startTimestampIdentifier), Math.min(dayStart + MILLIS_IN_DAY, event.endTimestampIdentifier)];
|
||||
}
|
||||
export function getOpenGroup(groups, start, end, timed) {
|
||||
for (let i = 0; i < groups.length; i++) {
|
||||
const group = groups[i];
|
||||
let intersected = false;
|
||||
if (hasOverlap(start, end, group.start, group.end, timed)) {
|
||||
for (let k = 0; k < group.visuals.length; k++) {
|
||||
const groupVisual = group.visuals[k];
|
||||
const [groupStart, groupEnd] = timed ? getRange(groupVisual.event) : getDayRange(groupVisual.event);
|
||||
if (hasOverlap(start, end, groupStart, groupEnd, timed)) {
|
||||
intersected = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!intersected) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
export function getOverlapGroupHandler(firstWeekday) {
|
||||
const handler = {
|
||||
groups: [],
|
||||
min: -1,
|
||||
max: -1,
|
||||
reset: () => {
|
||||
handler.groups = [];
|
||||
handler.min = handler.max = -1;
|
||||
},
|
||||
getVisuals: (day, dayEvents, timed, reset = false) => {
|
||||
if (day.weekday === firstWeekday || reset) {
|
||||
handler.reset();
|
||||
}
|
||||
const dayStart = getTimestampIdentifier(day);
|
||||
const visuals = getVisuals(dayEvents, dayStart);
|
||||
visuals.forEach(visual => {
|
||||
const [start, end] = timed ? getRange(visual.event) : getDayRange(visual.event);
|
||||
if (handler.groups.length > 0 && !hasOverlap(start, end, handler.min, handler.max, timed)) {
|
||||
setColumnCount(handler.groups);
|
||||
handler.reset();
|
||||
}
|
||||
let targetGroup = getOpenGroup(handler.groups, start, end, timed);
|
||||
if (targetGroup === -1) {
|
||||
targetGroup = handler.groups.length;
|
||||
handler.groups.push({
|
||||
start,
|
||||
end,
|
||||
visuals: []
|
||||
});
|
||||
}
|
||||
const target = handler.groups[targetGroup];
|
||||
target.visuals.push(visual);
|
||||
target.start = Math.min(target.start, start);
|
||||
target.end = Math.max(target.end, end);
|
||||
visual.column = targetGroup;
|
||||
if (handler.min === -1) {
|
||||
handler.min = start;
|
||||
handler.max = end;
|
||||
} else {
|
||||
handler.min = Math.min(handler.min, start);
|
||||
handler.max = Math.max(handler.max, end);
|
||||
}
|
||||
});
|
||||
setColumnCount(handler.groups);
|
||||
if (timed) {
|
||||
handler.reset();
|
||||
}
|
||||
return visuals;
|
||||
}
|
||||
};
|
||||
return handler;
|
||||
}
|
||||
//# sourceMappingURL=common.js.map
|
||||
Reference in New Issue
Block a user