Skip to content

Commit

Permalink
fix bug with daygrid event positioning
Browse files Browse the repository at this point in the history
  • Loading branch information
arshaw committed May 19, 2020
1 parent 0cd006b commit be10c8e
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 14 deletions.
38 changes: 38 additions & 0 deletions packages/__tests__/src/event-render/dayGrid-events.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { DayGridViewWrapper } from '../lib/wrappers/DayGridViewWrapper'
import { rectsIntersect } from '../lib/geom'


describe('dayGrid advanced event rendering', function() {

// https://github.com/fullcalendar/fullcalendar/issues/5408
it('renders without intersecting', function() {
let calendar = initCalendar({
initialView: 'dayGridMonth',
initialDate: '2020-05-01',
events: [
{ start: '2020-05-02', end: '2020-05-04', title: 'event a' },
{ start: '2020-05-02', end: '2020-05-04', title: 'event b' },
{ start: '2020-05-03', end: '2020-05-05', title: 'event c' },
{ start: '2020-05-04', title: 'event d' },
{ start: '2020-05-04', title: 'event e' }
]
})

let viewWrapper = new DayGridViewWrapper(calendar)
let eventEls = viewWrapper.dayGrid.getEventEls()
let rects = eventEls.map((el) => el.getBoundingClientRect())
let intersects = false

for (let i = 0; i < rects.length; i++) {
for (let j = i + 1; j < rects.length; j++) {
if (rectsIntersect(rects[i], rects[j])) {
console.log('rect intersection', eventEls[i], eventEls[j])
intersects = true
}
}
}

expect(intersects).toBe(false)
})

})
4 changes: 4 additions & 0 deletions packages/__tests__/src/lib/geom.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ export function intersectRects(rect0, rect1) {
)
}

export function rectsIntersect(rect0, rect1) {
return rect0.left < rect1.right && rect0.right > rect1.left && rect0.top < rect1.bottom && rect0.bottom > rect1.top
}

export function joinRects(rect1, rect2) {
return {
left: Math.min(rect1.left, rect2.left),
Expand Down
24 changes: 10 additions & 14 deletions packages/daygrid/src/event-placement.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,18 +36,11 @@ export function computeFgSegPlacement( // for one row. TODO: print mode?

segs = sortEventSegs(segs, eventOrderSpecs) as TableSeg[]

// TODO: try all seg placements and choose the topmost! dont quit after first
// SOLUTION: when placed, insert into colPlacements
for (let seg of segs) {
let { instanceId } = seg.eventRange.instance
let eventHeight = eventHeights[instanceId]

placeSeg(seg, eventHeight || 0)
}

// sort. for dayMaxEvents and segTops computation
for (let placements of colPlacements) {
placements.sort(cmpPlacements) // sorts in-place
placeSeg(seg, eventHeight || 0) // will keep colPlacements sorted by top
}

if (dayMaxEvents === true || dayMaxEventRows === true) {
Expand Down Expand Up @@ -116,7 +109,15 @@ export function computeFgSegPlacement( // for one row. TODO: print mode?
function tryPlaceSegAt(seg, segHeight, top) {
if (canPlaceSegAt(seg, segHeight, top)) {
for (let col = seg.firstCol; col <= seg.lastCol; col++) {
colPlacements[col].push({
let placements = colPlacements[col]
let insertionIndex = 0
while (
insertionIndex < placements.length &&
top > placements[insertionIndex].top
) {
insertionIndex++
}
placements.splice(insertionIndex, 0, { // will keep it sorted by top
seg,
top,
bottom: top + segHeight
Expand Down Expand Up @@ -182,11 +183,6 @@ function extractAllColSegs(oneColPlacements: TableSegPlacement[], col: number) {
}


function cmpPlacements(placement0, placement1) {
return placement0.top - placement1.top
}


function limitByMaxHeight(hiddenCnts, segIsHidden, colPlacements, maxContentHeight) {
limitEvents(hiddenCnts, segIsHidden, colPlacements, true, (placement) => {
return placement.bottom <= maxContentHeight
Expand Down

0 comments on commit be10c8e

Please sign in to comment.