From 038593d5f6dd030edaaa8e533e5f16e9b039ba7a Mon Sep 17 00:00:00 2001 From: Adam Shaw Date: Sat, 31 Aug 2013 17:25:11 -0700 Subject: [PATCH] new algorithm for laying out agenda events. slotEventOverlap option --- src/agenda/AgendaEventRenderer.js | 336 +++++++++++++++++++++--------- src/agenda/AgendaView.js | 3 +- src/common/DayEventRenderer.js | 13 +- src/common/View.js | 25 --- tests/slot_event_overlap.html | 193 +++++++++++++++++ tests/slot_event_overlap.json | 102 +++++++++ 6 files changed, 551 insertions(+), 121 deletions(-) create mode 100644 tests/slot_event_overlap.html create mode 100644 tests/slot_event_overlap.json diff --git a/src/agenda/AgendaEventRenderer.js b/src/agenda/AgendaEventRenderer.js index 867e03c..3105b3d 100644 --- a/src/agenda/AgendaEventRenderer.js +++ b/src/agenda/AgendaEventRenderer.js @@ -28,7 +28,6 @@ function AgendaEventRenderer() { var colContentLeft = t.colContentLeft; var colContentRight = t.colContentRight; var cellToDate = t.cellToDate; - var segmentCompare = t.segmentCompare; var getColCnt = t.getColCnt; var getColWidth = t.getColWidth; var getSnapHeight = t.getSnapHeight; @@ -89,35 +88,32 @@ function AgendaEventRenderer() { maxMinute = getMaxMinute(), d, visEventEnds = $.map(events, slotEventEnd), - i, col, - j, level, - k, seg, + i, + j, seg, + colSegs, segs = []; + for (i=0; i0; i--) { +// For every segment, figure out the other segments that are in subsequent +// levels that also occupy the same vertical space. Accumulate in seg.forwardSegs +function computeForwardSlotSegs(levels) { + var i, level; + var j, seg; + var k; + + for (i=0; i seg2.start && seg1.start < seg2.end; } + +// A cmp function for determining which forward segment to rely on more when computing coordinates. +function compareForwardSlotSegs(seg1, seg2) { + // put higher-pressure first + return seg2.forwardPressure - seg1.forwardPressure || + // put segments that are closer to initial edge first (and favor ones with no coords yet) + (seg1.backwardCoord || 0) - (seg2.backwardCoord || 0) || + // do normal sorting... + compareSlotSegs(seg1, seg2); +} + + +// A cmp function for determining which segment should be closer to the initial edge +// (the left edge on a left-to-right calendar). +function compareSlotSegs(seg1, seg2) { + return seg1.start - seg2.start || // earlier start time goes first + (seg2.end - seg2.start) - (seg1.end - seg1.start) || // tie? longer-duration goes first + (seg1.event.title || '').localeCompare(seg2.event.title); // tie? alphabetically by title +} + diff --git a/src/agenda/AgendaView.js b/src/agenda/AgendaView.js index 54e7aed..54a631a 100644 --- a/src/agenda/AgendaView.js +++ b/src/agenda/AgendaView.js @@ -13,7 +13,8 @@ setDefaults({ agenda: .5 }, minTime: 0, - maxTime: 24 + maxTime: 24, + slotEventOverlap: true }); diff --git a/src/common/DayEventRenderer.js b/src/common/DayEventRenderer.js index 1eafcde..2286a9e 100644 --- a/src/common/DayEventRenderer.js +++ b/src/common/DayEventRenderer.js @@ -37,7 +37,6 @@ function DayEventRenderer() { var clearSelection = t.clearSelection; var getHoverListener = t.getHoverListener; var rangeToSegments = t.rangeToSegments; - var segmentCompare = t.segmentCompare; var cellToDate = t.cellToDate; var cellToCellOffset = t.cellToCellOffset; var cellOffsetToDayOffset = t.cellOffsetToDayOffset; @@ -485,7 +484,7 @@ function DayEventRenderer() { // Give preference to elements with certain criteria, so they have // a chance to be closer to the top. - segments.sort(segmentCompare); + segments.sort(compareDaySegments); var subrows = []; for (var i=0; i + + + + + + + + + + + + +

Default:

+
+ +

No overlap:

+
+ +

RTL:

+
+ +

RTL, no overlap:

+
+ + + diff --git a/tests/slot_event_overlap.json b/tests/slot_event_overlap.json new file mode 100644 index 0000000..af99810 --- /dev/null +++ b/tests/slot_event_overlap.json @@ -0,0 +1,102 @@ +[ + { + "title": "1", + "start": "2013-07-31T00:30", + "end": "2013-07-31T02:30", + "allDay": false + }, + { + "title": "2", + "start": "2013-07-31T00:30", + "end": "2013-07-31T02:30", + "allDay": false + }, + { + "title": "3", + "start": "2013-07-31T02:30", + "end": "2013-07-31T04:30", + "allDay": false + }, + { + "title": "4", + "start": "2013-07-31T02:30", + "end": "2013-07-31T04:30", + "allDay": false + }, + { + "title": "5", + "start": "2013-07-31T02:30", + "end": "2013-07-31T04:30", + "allDay": false + }, + { + "title": "6", + "start": "2013-07-31T01:00", + "end": "2013-07-31T03:00", + "allDay": false + }, + { + "title": "7", + "start": "2013-07-31T01:30", + "end": "2013-07-31T03:30", + "allDay": false + }, + { + "title": "8", + "start": "2013-07-31T02:50", + "end": "2013-07-31T04:50", + "allDay": false + }, + { + "title": "9", + "start": "2013-07-31T04:30", + "end": "2013-07-31T09:00", + "allDay": false + }, + { + "title": "10", + "start": "2013-07-31T02:00", + "end": "2013-07-31T04:05", + "allDay": false + }, + { + "title": "11", + "start": "2013-07-31T02:50", + "end": "2013-07-31T04:50", + "allDay": false + }, + { + "title": "12", + "start": "2013-07-31T02:50", + "end": "2013-07-31T04:50", + "allDay": false + }, + { + "title": "13", + "start": "2013-07-31T04:00", + "end": "2013-07-31T06:00", + "allDay": false, + "className": "equalwidth1" + }, + { + "title": "14", + "start": "2013-07-31T04:10", + "end": "2013-07-31T06:09", + "allDay": false, + "className": "equalwidth1" + }, + { + "title": "15", + "start": "2013-07-31T06:30", + "end": "2013-07-31T08:30", + "allDay": false, + "className": "equalwidth2" + }, + { + "title": "16", + "start": "2013-07-31T06:30", + "end": "2013-07-31T08:30", + "allDay": false, + "className": "equalwidth2" + } +] \ No newline at end of file