From 64b84cc38517d9e8fc47afb191d479e42404c38b Mon Sep 17 00:00:00 2001 From: Adam Shaw Date: Tue, 9 Nov 2010 22:54:41 -0800 Subject: [PATCH] resize event to different week (issue 308), necessary event rendering refactoring --- src/agenda/AgendaEventRenderer.js | 3 +- src/agenda/AgendaView.js | 11 +- src/basic/BasicEventRenderer.js | 3 +- src/basic/BasicView.js | 13 +- src/common/DayEventRenderer.js | 389 ++++++++++++++++++++++-------- src/common/View.js | 2 +- src/common/common.css | 2 +- 7 files changed, 315 insertions(+), 108 deletions(-) diff --git a/src/agenda/AgendaEventRenderer.js b/src/agenda/AgendaEventRenderer.js index eeb48c6..de82183 100644 --- a/src/agenda/AgendaEventRenderer.js +++ b/src/agenda/AgendaEventRenderer.js @@ -5,6 +5,7 @@ function AgendaEventRenderer() { // exports t.renderEvents = renderEvents; + t.compileDaySegs = compileDaySegs; // for DayEventRenderer t.clearEvents = clearEvents; t.slotSegHtml = slotSegHtml; t.bindDaySeg = bindDaySeg; @@ -296,7 +297,7 @@ function AgendaEventRenderer() { if (event.editable || event.editable === undefined && opt('editable')) { draggableDayEvent(event, eventElement, seg.isStart); if (seg.isEnd) { - resizableDayEvent(event, eventElement, getColWidth()); + resizableDayEvent(event, eventElement, seg); } } } diff --git a/src/agenda/AgendaView.js b/src/agenda/AgendaView.js index 3210216..ec2998f 100644 --- a/src/agenda/AgendaView.js +++ b/src/agenda/AgendaView.js @@ -30,6 +30,7 @@ function AgendaView(element, calendar, viewName) { t.defaultEventEnd = defaultEventEnd; t.timePosition = timePosition; t.dayOfWeekCol = dayOfWeekCol; + t.dateCell = dateCell; t.cellDate = cellDate; t.cellIsAllDay = cellIsAllDay; t.allDayTR = allDayTR; @@ -493,7 +494,15 @@ function AgendaView(element, calendar, viewName) { function dayOfWeekCol(dayOfWeek) { - return ((dayOfWeek - Math.max(firstDay,nwe)+colCnt) % colCnt)*dis+dit; + return ((dayOfWeek - Math.max(firstDay, nwe) + colCnt) % colCnt)*dis+dit; + } + + + function dateCell(date) { + return { + row: Math.floor(dayDiff(date, t.visStart) / 7), + col: dayOfWeekCol(date.getDay()) + }; } diff --git a/src/basic/BasicEventRenderer.js b/src/basic/BasicEventRenderer.js index b0cbfe0..8855189 100644 --- a/src/basic/BasicEventRenderer.js +++ b/src/basic/BasicEventRenderer.js @@ -5,6 +5,7 @@ function BasicEventRenderer() { // exports t.renderEvents = renderEvents; + t.compileDaySegs = compileSegs; // for DayEventRenderer t.clearEvents = clearEvents; t.bindDaySeg = bindDaySeg; @@ -79,7 +80,7 @@ function BasicEventRenderer() { if (event.editable || event.editable === undefined && opt('editable')) { draggableDayEvent(event, eventElement); if (seg.isEnd) { - resizableDayEvent(event, eventElement); + resizableDayEvent(event, eventElement, seg); } } } diff --git a/src/basic/BasicView.js b/src/basic/BasicView.js index 38117c2..fd82cb8 100644 --- a/src/basic/BasicView.js +++ b/src/basic/BasicView.js @@ -25,6 +25,7 @@ function BasicView(element, calendar, viewName) { t.colContentLeft = colContentLeft; t.colContentRight = colContentRight; t.dayOfWeekCol = dayOfWeekCol; + t.dateCell = dateCell; t.cellDate = cellDate; t.cellIsAllDay = function() { return true }; t.allDayTR = allDayTR; @@ -335,7 +336,7 @@ function BasicView(element, calendar, viewName) { function renderSelection(startDate, endDate, allDay) { - renderDayOverlay(startDate, addDays(cloneDate(endDate), 1), true); + renderDayOverlay(startDate, addDays(cloneDate(endDate), 1), true); // rebuild every time??? } @@ -427,7 +428,15 @@ function BasicView(element, calendar, viewName) { function dayOfWeekCol(dayOfWeek) { - return (dayOfWeek - Math.max(firstDay,nwe)+colCnt) % colCnt; + return (dayOfWeek - Math.max(firstDay, nwe) + colCnt) % colCnt; + } + + + function dateCell(date) { + return { + row: Math.floor(dayDiff(date, t.visStart) / 7), + col: dayOfWeekCol(date.getDay())*dis + dit + }; } diff --git a/src/common/DayEventRenderer.js b/src/common/DayEventRenderer.js index 61ce7f0..0e59827 100644 --- a/src/common/DayEventRenderer.js +++ b/src/common/DayEventRenderer.js @@ -11,6 +11,7 @@ function DayEventRenderer() { // imports var opt = t.opt; var trigger = t.trigger; + var eventEnd = t.eventEnd; var reportEventElement = t.reportEventElement; var showEvents = t.showEvents; var hideEvents = t.hideEvents; @@ -23,40 +24,102 @@ function DayEventRenderer() { var colContentLeft = t.colContentLeft; var colContentRight = t.colContentRight; var dayOfWeekCol = t.dayOfWeekCol; + var dateCell = t.dateCell; + var compileDaySegs = t.compileDaySegs; var getDaySegmentContainer = t.getDaySegmentContainer; var bindDaySeg = t.bindDaySeg; //TODO: streamline this var formatDates = t.calendar.formatDates; + var renderDayOverlay = t.renderDayOverlay; + var clearOverlays = t.clearOverlays; + var clearSelection = t.clearSelection; /* Rendering -----------------------------------------------------------------------------*/ - - + + function renderDaySegs(segs, modifiedEventId) { - - var rtl=opt('isRTL'), - i, segCnt=segs.length, seg, - event, - className, - left, right, - html='', - eventElements, - eventElement, - triggerRes, - hsideCache={}, - vmarginCache={}, - key, val, - rowI, top, levelI, levelHeight, - rowDivs=[], - rowDivTops=[], - bounds = allDayBounds(), - minLeft = bounds.left, - maxLeft = bounds.right, - rowCnt = getRowCnt(), - colCnt = getColCnt(), - segmentContainer = getDaySegmentContainer(); - + var segmentContainer = getDaySegmentContainer(); + var rowDivs; + var rowCnt; + var i; + var rowI; + var top; + var levelI; + var levelHeight; + var segCnt = segs.length; + var seg; + segmentContainer[0].innerHTML = daySegHTML(segs); // faster than .html() + daySegElementResolve(segs, segmentContainer.children()); + daySegElementReport(segs); + daySegHandlers(segs, segmentContainer, modifiedEventId); + daySegCalcHSides(segs); + daySegSetWidths(segs); + daySegCalcHeights(segs); + rowDivs = getRowDivs(); + rowCnt = rowDivs.length; + // set row heights, calculate event tops (in relation to row top) + for (i=0, rowI=0; rowI"); + var elements; + var segmentContainer = getDaySegmentContainer(); + var i; + var segCnt = segs.length; + var element; + tempContainer[0].innerHTML = daySegHTML(segs); // faster than .html() + elements = tempContainer.children(); + segmentContainer.append(elements); + daySegElementResolve(segs, elements); + daySegCalcHSides(segs); + daySegSetWidths(segs); + daySegCalcHeights(segs); + daySegSetTops(segs, getRowTops(getRowDivs())); + elements = []; + for (i=0; i" + htmlEscape(event.title) + "" + "" + - ((event.editable || event.editable === undefined && opt('editable')) && !opt('disableResizing') && $.fn.resizable ? + (seg.isEnd && (event.editable || event.editable === undefined && opt('editable')) && !opt('disableResizing') && $.fn.resizable ? "
" : '') + ""; seg.left = left; seg.outerWidth = right - left; } - segmentContainer[0].innerHTML = html; // faster than html() - eventElements = segmentContainer.children(); + return html; + } - // retrieve elements, run through eventRender callback, bind handlers + + function daySegElementResolve(segs, elements) { // sets seg.element + var i; + var segCnt = segs.length; + var seg; + var event; + var element; + var triggerRes; for (i=0; i div') // optimal selector? - .height(top + levelHeight); } + } - // calculate row tops - for (rowI=0; rowI div'); // optimal selector? } + return rowDivs; + } - // set event tops + + function getRowTops(rowDivs) { + var i; + var rowCnt = rowDivs.length; + var tops = []; + for (i=0; i