diff --git a/src/EventManager.js b/src/EventManager.js index 91726b2..1a49b72 100644 --- a/src/EventManager.js +++ b/src/EventManager.js @@ -515,13 +515,13 @@ function EventManager(options) { // assumed to be a calendar out.className = []; } -// if (event.resources) { -// if (typeof event.resources == 'string') { -// event.resources = event.resources.split(/\s+/); -// } -// }else{ -// event.resources = []; -// } + if (out.resources) { + if (typeof out.resources == 'string') { + out.resources = out.resources.split(/\s+/); + } + }else{ + out.resources = []; + } out.allDay = allDay; out.start = start; diff --git a/src/common/DayEventRenderer.js b/src/common/DayEventRenderer.js index 356bea2..61120a8 100644 --- a/src/common/DayEventRenderer.js +++ b/src/common/DayEventRenderer.js @@ -166,60 +166,44 @@ function DayEventRenderer() { // Generate an array of "segments" for all events. function buildSegments(events) { - // var resources = t.getResources(); - - // if (typeof resources === 'undefined'){ - // return buildSegmentsTEMP(events); // TEMP! - // } else { - // var segments = []; - // for (var i=0; i= 0) { - // resourceEvents.push(events[i]) - // } - // } - // return resourceEvents; - // } - - // // Generate an array of "segments" for all events. - // function buildSegmentsTEMP(events) { + var resources = t.getResources; var segments = []; - for (var i=0; i= 0) { + resourceEvents.push(events[i]) + } + } + return resourceEvents; + } + // Generate an array of segments for a single event. // A "segment" is the same data structure that View.rangeToSegments produces, // with the addition of the `event` property being set to reference the original event. function buildSegmentsForEvent(event) { //, col) { var segments = rangeToSegments(event.start, getEventEnd(event)); for (var i=0; i start && eventStart < end) { - if (eventStart < start) { - segStart = start.clone(); + + // get dates, make copies, then strip zone to normalize + eventStart = event.start.clone().stripZone(); + eventEnd = getEventEnd(event).stripZone(); + + if (eventEnd > rangeStart && eventStart < rangeEnd) { + + if (eventStart < rangeStart) { + segStart = rangeStart.clone(); isStart = false; - }else{ + } + else { segStart = eventStart; isStart = true; } - if (eventEnd > end) { - segEnd = end.clone(); + + if (eventEnd > rangeEnd) { + segEnd = rangeEnd.clone(); isEnd = false; - }else{ + } + else { segEnd = eventEnd; isEnd = true; } + segs.push({ event: event, start: segStart, end: segEnd, isStart: isStart, - isEnd: isEnd, - msLength: segEnd - segStart + isEnd: isEnd }); } } - return segs.sort(segmentCompare); + + return segs.sort(compareSlotSegs); } - function eventsForResource(resource, events) { - var resourceEvents = []; - for (var i = 0; i < events.length; i++) { - if (events[i].resources && $.inArray(resource.id, events[i].resources) >= 0) { - resourceEvents.push(events[i]); - } - } - return resourceEvents; - } + // function eventsForResource(resource, events) { + // var resourceEvents = []; + // for (var i = 0; i < events.length; i++) { + // if (events[i].resources && $.inArray(resource.id, events[i].resources) >= 0) { + // resourceEvents.push(events[i]); + // } + // } + // return resourceEvents; + // } - function slotEventEnd(event) { - if (event.end) { - return event.end.clone(); - }else{ - return event.start.clone().add('m', opt('defaultEventMinutes')); - } - } + // function slotEventEnd(event) { + // if (event.end) { + // return event.end.clone(); + // }else{ + // return event.start.clone().add('m', opt('defaultEventMinutes')); + // } + // } // renders events in the 'time slots' at the bottom @@ -405,75 +408,98 @@ function ResourceEventRenderer() { var revert; var allDay = true; var dayDelta; + var hoverListener = getHoverListener(); var colWidth = getColWidth(); + var minTime = getMinTime(); var slotDuration = getSlotDuration(); var slotHeight = getSlotHeight(); + var snapDuration = getSnapDuration(); var snapHeight = getSnapHeight(); - var snapMinutes = getSnapMinutes(); - var minMinute = getMinMinute(); + eventElement.draggable({ opacity: opt('dragOpacity', 'month'), // use whatever the month view was using revertDuration: opt('dragRevertDuration'), start: function(ev, ui) { - trigger('eventDragStart', eventElement, event, ev, ui); + + trigger('eventDragStart', eventElement[0], event, ev, ui); hideEvents(event, eventElement); origWidth = eventElement.width(); + hoverListener.start(function(cell, origCell) { clearOverlays(); if (cell) { revert = false; + var origDate = cellToDate(0, origCell.col); var date = cellToDate(0, cell.col); dayDelta = date.diff(origDate, 'days'); - if (!cell.row) { - // on full-days + + if (!cell.row) { // on full-days + renderDayOverlay( - event.start.clone().add('d', dayDelta), - getEventEnd(event).add('d', dayDelta) + event.start.clone().add('days', dayDelta), + getEventEnd(event).add('days', dayDelta) ); + resetElement(); - }else{ - // mouse is over bottom slots + } + else { // mouse is over bottom slots + if (isStart) { if (allDay) { // convert event to temporary slot-event eventElement.width(colWidth - 10); // don't use entire width setOuterHeight(eventElement, calendar.defaultTimedEventDuration / slotDuration * slotHeight); // the default height - eventElement.draggable('option', 'grid', [colWidth, 1]); + eventElement.draggable('option', 'grid', [ colWidth, 1 ]); allDay = false; } - }else{ + } + else { revert = true; } } + revert = revert || (allDay && !dayDelta); - }else{ + } + else { resetElement(); revert = true; } + eventElement.draggable('option', 'revert', revert); + }, ev, 'drag'); }, stop: function(ev, ui) { hoverListener.stop(); clearOverlays(); - trigger('eventDragStop', eventElement, event, ev, ui); - if (revert) { - // hasn't moved or is out of bounds (draggable has already reverted) + trigger('eventDragStop', eventElement[0], event, ev, ui); + + if (revert) { // hasn't moved or is out of bounds (draggable has already reverted) + resetElement(); eventElement.css('filter', ''); // clear IE opacity side-effects showEvents(event, eventElement); - }else{ - // changed! - var minuteDelta = 0; + } + else { // changed! + + var eventStart = event.start.clone().add('days', dayDelta); // already assumed to have a stripped time + var snapTime; + var snapIndex; if (!allDay) { - minuteDelta = Math.round((eventElement.offset().top - getSlotContainer().offset().top) / snapHeight) * - snapMinutes + - minMinute - - (event.start.getHours() * 60 + event.start.getMinutes()); + snapIndex = Math.round((eventElement.offset().top - getSlotContainer().offset().top) / snapHeight); // why not use ui.offset.top? + snapTime = moment.duration(minTime + snapIndex * snapDuration); + eventStart = calendar.rezoneDate(eventStart.clone().time(snapTime)); } - eventDrop(this, event, dayDelta, minuteDelta, allDay, ev, ui); + + eventDrop( + eventElement[0], + event, + eventStart, + ev, + ui + ); } } }); @@ -496,7 +522,7 @@ function ResourceEventRenderer() { var colCnt = getColCnt(); var colWidth = getColWidth(); var snapHeight = getSnapHeight(); - var snapMinutes = getSnapMinutes(); + var snapDuration = getSnapDuration(); // states var origPosition; // original position of the element, not the mouse @@ -506,7 +532,10 @@ function ResourceEventRenderer() { var colDelta, prevColDelta; var dayDelta; // derived from colDelta var resourceDelta; // derived from colDelta - var minuteDelta, prevMinuteDelta; + var snapDelta, prevSnapDelta; // the number of snaps away from the original position + + // newly computed + var eventStart, eventEnd; eventElement.draggable({ scroll: false, @@ -516,7 +545,7 @@ function ResourceEventRenderer() { revertDuration: opt('dragRevertDuration'), start: function(ev, ui) { - trigger('eventDragStart', eventElement, event, ev, ui); + trigger('eventDragStart', eventElement[0], event, ev, ui); hideEvents(event, eventElement); coordinateGrid.build(); @@ -528,9 +557,11 @@ function ResourceEventRenderer() { isAllDay = prevIsAllDay = getIsCellAllDay(origCell); colDelta = prevColDelta = 0; dayDelta = 0; - resourceDelta = 0; - minuteDelta = prevMinuteDelta = 0; + resourceDelta = 0; + snapDelta = prevSnapDelta = 0; + eventStart = null; + eventEnd = null; }, drag: function(ev, ui) { @@ -555,14 +586,13 @@ function ResourceEventRenderer() { //var col = origCell.col + colDelta; //col = Math.max(0, col); //col = Math.min(colCnt-1, col); - //var date = cellToDate(0, col); //dayDelta = 0; //dayDiff(date, origDate); - resourceDelta = colDelta; + resourceDelta = colDelta; } // calculate minute delta (only if over slots) if (!isAllDay) { - minuteDelta = Math.round((ui.position.top - origPosition.top) / snapHeight) * snapMinutes; + snapDelta = Math.round((ui.position.top - origPosition.top) / snapHeight); } } @@ -571,16 +601,26 @@ function ResourceEventRenderer() { isInBounds != prevIsInBounds || isAllDay != prevIsAllDay || colDelta != prevColDelta || - minuteDelta != prevMinuteDelta + snapDelta != prevSnapDelta ) { + // compute new dates + if (isAllDay) { + eventStart = event.start.clone().stripTime().add('days', dayDelta); + eventEnd = eventStart.clone().add(calendar.defaultAllDayEventDuration); + } + else { + eventStart = event.start.clone().add(snapDelta * snapDuration).add('days', dayDelta); + eventEnd = getEventEnd(event).add(snapDelta * snapDuration).add('days', dayDelta); + } + updateUI(); // update previous states for next time prevIsInBounds = isInBounds; prevIsAllDay = isAllDay; prevColDelta = colDelta; - prevMinuteDelta = minuteDelta; + prevSnapDelta = snapDelta; } // if out-of-bounds, revert when done, and vice versa. @@ -592,10 +632,15 @@ function ResourceEventRenderer() { clearOverlays(); trigger('eventDragStop', eventElement, event, ev, ui); - //if (isInBounds && (isAllDay || dayDelta || minuteDelta)) { // changed! - if (isInBounds && (isAllDay || resourceDelta || minuteDelta)) { // changed! - event.resources = resources()[origCell.col + resourceDelta].id; - eventDrop(this, event, dayDelta, isAllDay ? 0 : minuteDelta, isAllDay, ev, ui); + if (isInBounds && (isAllDay || resourceDelta || snapDelta)) { // changed! + event.resources = resources()[origCell.col + resourceDelta].id; + eventDrop( + eventElement[0], + event, + eventStart, + ev, + ui + ); } else { // either no change or out-of-bounds (draggable has already reverted) @@ -604,7 +649,7 @@ function ResourceEventRenderer() { isAllDay = false; colDelta = 0; dayDelta = 0; - minuteDelta = 0; + snapDelta = 0; updateUI(); eventElement.css('filter', ''); // clear IE opacity side-effects @@ -625,13 +670,10 @@ function ResourceEventRenderer() { if (isAllDay) { timeElement.hide(); eventElement.draggable('option', 'grid', null); // disable grid snapping - renderDayOverlay( - event.start.clone().add('d', dayDelta), - getEventEnd(event).add('d', dayDelta) - ); + renderDayOverlay(eventStart, eventEnd); } else { - updateTimeText(minuteDelta); + updateTimeText(); timeElement.css('display', ''); // show() was causing display=inline eventElement.draggable('option', 'grid', [colWidth, snapHeight]); // re-enable grid snapping } @@ -659,7 +701,9 @@ function ResourceEventRenderer() { function resizableSlotEvent(event, eventElement, timeElement) { var snapDelta, prevSnapDelta; var snapHeight = getSnapHeight(); - var snapMinutes = getSnapMinutes(); + var snapDuration = getSnapDuration(); + var eventEnd; + eventElement.resizable({ handles: { s: '.ui-resizable-handle' @@ -668,28 +712,36 @@ function ResourceEventRenderer() { start: function(ev, ui) { snapDelta = prevSnapDelta = 0; hideEvents(event, eventElement); - trigger('eventResizeStart', this, event, ev, ui); + trigger('eventResizeStart', eventElement[0], event, ev, ui); }, resize: function(ev, ui) { // don't rely on ui.size.height, doesn't take grid into account snapDelta = Math.round((Math.max(snapHeight, eventElement.height()) - ui.originalSize.height) / snapHeight); if (snapDelta != prevSnapDelta) { - timeElement.text( - formatDates( - event.start, - (!snapDelta && !event.end) ? null : // no change, so don't display time range - eventEnd(event).add('m', snapMinutes*snapDelta), - opt('timeFormat') - ) - ); + eventEnd = getEventEnd(event).add(snapDuration * snapDelta); + var text; + if (snapDelta) { // has there been a change? + text = t.getEventTimeText(event.start, eventEnd); + } + else { + text = t.getEventTimeText(event); // the original time text + } + timeElement.text(text); prevSnapDelta = snapDelta; } }, stop: function(ev, ui) { trigger('eventResizeStop', this, event, ev, ui); if (snapDelta) { - eventResize(this, event, 0, snapMinutes*snapDelta, ev, ui); - }else{ + eventResize( + eventElement[0], + event, + eventEnd, + ev, + ui + ); + } + else { showEvents(event, eventElement); // BUG: if event was really short, need to put title back in span } @@ -702,62 +754,204 @@ function ResourceEventRenderer() { -/* Agenda Event Segment Utilities ------------------------------------------------------------------------------*/ -// TODO: maybe somehow consolidate this with DayEventRenderer's segment system +// /* Agenda Event Segment Utilities +// -----------------------------------------------------------------------------*/ +// // Sets the seg.backwardCoord and seg.forwardCoord on each segment and returns a new +// // list in the order they should be placed into the DOM (an implicit z-index). +// function placeSlotSegs(segs) { +// var levels = buildSlotSegLevels(segs); +// var level0 = levels[0]; +// var i; + +// computeForwardSlotSegs(levels); + +// if (level0) { + +// for (i=0; i0; i--) { - level = levels[i]; - for (j=0; j seg2.start && seg1.start < seg2.end; -} +// // Figure out which path forward (via seg.forwardSegs) results in the longest path until +// // the furthest edge is reached. The number of segments in this path will be seg.forwardPressure +// function computeSlotSegPressures(seg) { +// var forwardSegs = seg.forwardSegs; +// var forwardPressure = 0; +// var i, forwardSeg; +// if (seg.forwardPressure === undefined) { // not already computed + +// 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/resource/ResourceView.js b/src/resource/ResourceView.js index e0c0755..4d246b0 100644 --- a/src/resource/ResourceView.js +++ b/src/resource/ResourceView.js @@ -47,16 +47,50 @@ function ResourceView(element, calendar, viewName) { // exports + // t.renderResource = renderResource; + // t.setWidth = setWidth; + // t.setHeight = setHeight; + // t.afterRender = afterRender; + // t.computeDateTop = computeDateTop; + // //t.defaultEventEnd = defaultEventEnd; + // //t.timePosition = timePosition; + // t.getIsCellAllDay = getIsCellAllDay; + // t.allDayRow = function() { return allDayRow; }; // badly named + // //t.allDayRow = getAllDayRow; + // t.getCoordinateGrid = function() { return coordinateGrid; }; // specifically for AgendaEventRenderer + // t.getHoverListener = function() { return hoverListener; }; + // t.colLeft = colLeft; + // t.colRight = colRight; + // t.colContentLeft = colContentLeft; + // t.colContentRight = colContentRight; + // t.getDaySegmentContainer = function() { return daySegmentContainer; }; + // t.getSlotSegmentContainer = function() { return slotSegmentContainer; }; + // // t.getMinMinute = function() { return minMinute; }; + // // t.getMaxMinute = function() { return maxMinute; }; + // t.getMinTime = function() { return minTime; }; + // t.getMaxTime = function() { return maxTime; }; + + // t.getSlotContainer = function() { return slotContainer; }; + // t.getRowCnt = function() { return 1; }; + // t.getColCnt = function() { return colCnt; }; + // t.getColWidth = function() { return colWidth; }; + // t.getSnapHeight = function() { return snapHeight; }; + // t.getSnapMinutes = function() { return snapMinutes; }; + // t.defaultSelectionEnd = defaultSelectionEnd; + // t.renderDayOverlay = renderDayOverlay; + // t.renderSelection = renderSelection; + // t.clearSelection = clearSelection; + // t.reportDayClick = reportDayClick; // selection mousedown hack + // t.dragStart = dragStart; + // t.dragStop = dragStop; + //t.renderAgenda = renderAgenda; t.renderResource = renderResource; t.setWidth = setWidth; t.setHeight = setHeight; t.afterRender = afterRender; t.computeDateTop = computeDateTop; - //t.defaultEventEnd = defaultEventEnd; - //t.timePosition = timePosition; t.getIsCellAllDay = getIsCellAllDay; t.allDayRow = function() { return allDayRow; }; // badly named - //t.allDayRow = getAllDayRow; t.getCoordinateGrid = function() { return coordinateGrid; }; // specifically for AgendaEventRenderer t.getHoverListener = function() { return hoverListener; }; t.colLeft = colLeft; @@ -65,14 +99,16 @@ function ResourceView(element, calendar, viewName) { t.colContentRight = colContentRight; t.getDaySegmentContainer = function() { return daySegmentContainer; }; t.getSlotSegmentContainer = function() { return slotSegmentContainer; }; - t.getMinMinute = function() { return minMinute; }; - t.getMaxMinute = function() { return maxMinute; }; t.getSlotContainer = function() { return slotContainer; }; t.getRowCnt = function() { return 1; }; t.getColCnt = function() { return colCnt; }; t.getColWidth = function() { return colWidth; }; t.getSnapHeight = function() { return snapHeight; }; - t.getSnapMinutes = function() { return snapMinutes; }; + t.getSnapDuration = function() { return snapDuration; }; + t.getSlotHeight = function() { return slotHeight; }; + t.getSlotDuration = function() { return slotDuration; }; + t.getMinTime = function() { return minTime; }; + t.getMaxTime = function() { return maxTime; }; t.defaultSelectionEnd = defaultSelectionEnd; t.renderDayOverlay = renderDayOverlay; t.renderSelection = renderSelection; @@ -93,11 +129,29 @@ function ResourceView(element, calendar, viewName) { var clearOverlays = t.clearOverlays; var reportSelection = t.reportSelection; var unselect = t.unselect; + //var daySelectionMousedown = t.daySelectionMousedown; // overridden var slotSegHtml = t.slotSegHtml; var cellToDate = t.cellToDate; var dateToCell = t.dateToCell; - // var rangeToSegments = t.rangeToSegments; + var rangeToSegments = t.rangeToSegments; var formatDate = calendar.formatDate; + var calculateWeekNumber = calendar.calculateWeekNumber; + + // View.call(t, element, calendar, viewName); + // OverlayManager.call(t); + // SelectionManager.call(t); + // ResourceEventRenderer.call(t); + // var opt = t.opt; + // var trigger = t.trigger; + // var renderOverlay = t.renderOverlay; + // var clearOverlays = t.clearOverlays; + // var reportSelection = t.reportSelection; + // var unselect = t.unselect; + // var slotSegHtml = t.slotSegHtml; + // var cellToDate = t.cellToDate; + // var dateToCell = t.dateToCell; + // // var rangeToSegments = t.rangeToSegments; + // var formatDate = calendar.formatDate; // locals @@ -119,7 +173,6 @@ function ResourceView(element, calendar, viewName) { var slotContainer; var slotSegmentContainer; var slotTable; - var slotTableFirstInner; var selectionHelper; var viewWidth; @@ -127,9 +180,11 @@ function ResourceView(element, calendar, viewName) { var axisWidth; var colWidth; var gutterWidth; + + var slotDuration; var slotHeight; // TODO: what if slotHeight changes? (see issue 650) - var snapMinutes; + var snapDuration; var snapRatio; // ratio of number of "selection" slots to normal slots. (ex: 1, 2, 4) var snapHeight; // holds the pixel hight of a "selection" slot @@ -140,16 +195,62 @@ function ResourceView(element, calendar, viewName) { var colPositions; var colContentPositions; var slotTopCache = {}; - var slotDuration; + var tm; var rtl; - var minMinute, maxMinute; + var minTime; + var maxTime; var colFormat; - var showWeekNumbers; - var weekNumberTitle; - var weekNumberFormat; var resources = t.getResources; + // var dayTable; + // var dayHead; + // var dayHeadCells; + // var dayBody; + // var dayBodyCells; + // var dayBodyCellInners; + // var dayBodyCellContentInners; + // var dayBodyFirstCell; + // var dayBodyFirstCellStretcher; + // var slotLayer; + // var daySegmentContainer; + // var allDayTable; + // var allDayRow; + // var slotScroller; + // var slotContainer; + // var slotSegmentContainer; + // var slotTable; + // var slotTableFirstInner; + // var selectionHelper; + + // var viewWidth; + // var viewHeight; + // var axisWidth; + // var colWidth; + // var gutterWidth; + // var slotHeight; // TODO: what if slotHeight changes? (see issue 650) + // var snapMinutes; + // var snapRatio; // ratio of number of "selection" slots to normal slots. (ex: 1, 2, 4) + // var snapHeight; // holds the pixel hight of a "selection" slot + + // var colCnt; + // var slotCnt; + // var coordinateGrid; + // var hoverListener; + // var colPositions; + // var colContentPositions; + // var slotTopCache = {}; + // var slotDuration; + // var tm; + // var rtl; + // var minMinute, maxMinute; + // var colFormat; + // var showWeekNumbers; + // var weekNumberTitle; + // var weekNumberFormat; + // var resources = t.getResources; + // var minTime; + // var maxTime; /* Rendering -----------------------------------------------------------------------------*/ @@ -158,8 +259,8 @@ function ResourceView(element, calendar, viewName) { disableTextSelection(element.addClass('fc-agenda')); - function renderResource(c) { - colCnt = c; + function renderResource(resourceColumnsCnt) { + colCnt = resourceColumnsCnt; updateOptions(); if (!dayTable) { // first time rendering? @@ -178,22 +279,10 @@ function ResourceView(element, calendar, viewName) { minTime = moment.duration(opt('minTime')); maxTime = moment.duration(opt('maxTime')); - minMinute = moment.duration(opt('minTime')); - maxMinute = moment.duration(opt('maxTime')); - + slotDuration = moment.duration(opt('slotDuration')); - - // week # options. (TODO: bad, logic also in other views) - showWeekNumbers = opt('weekNumbers'); - weekNumberTitle = opt('weekNumberTitle'); - if (opt('weekNumberCalculation') != 'iso') { - weekNumberFormat = "w"; - } - else { - weekNumberFormat = "W"; - } - - snapMinutes = opt('snapMinutes') || opt('slotMinutes'); + snapDuration = opt('snapDuration'); + snapDuration = snapDuration ? moment.duration(snapDuration) : slotDuration; } @@ -203,13 +292,13 @@ function ResourceView(element, calendar, viewName) { function buildSkeleton() { + var s; var headerClass = tm + "-widget-header"; var contentClass = tm + "-widget-content"; - var s; - var minutes; var slotTime; var slotDate; - var slotNormal = opt('slotMinutes') % 15 === 0; + var minutes; + var slotNormal = slotDuration.asMinutes() % 15 === 0; buildDayTable(); @@ -271,9 +360,9 @@ function ResourceView(element, calendar, viewName) { "" + ""; - slotTime = moment.duration(+minMinute); + slotTime = moment.duration(+minTime); // i wish there was .clone() for durations slotCnt = 0; - while (slotTime < maxMinute) { + while (slotTime < maxTime) { slotDate = t.start.clone().time(slotTime); // will be in UTC but that's good. to avoid DST issues minutes = slotDate.minutes(); s += @@ -295,9 +384,10 @@ function ResourceView(element, calendar, viewName) { s += "" + "
"; + // slotTable = $(s).appendTo(slotContainer); + // slotTableFirstInner = slotTable.find('div:first'); slotTable = $(s).appendTo(slotContainer); - slotTableFirstInner = slotTable.find('div:first'); - + slotBind(slotTable.find('td')); } @@ -354,13 +444,14 @@ function ResourceView(element, calendar, viewName) { "" + ""; - if (showWeekNumbers) { - weekText = formatDate(date, weekNumberFormat); + if (opt('weekNumbers')) { + date = cellToDate(0, 0); + weekText = calculateWeekNumber(date); if (rtl) { - weekText += weekNumberTitle; + weekText += opt('weekNumberTitle'); } else { - weekText = weekNumberTitle + weekText; + weekText = opt('weekNumberTitle') + weekText; } html += "" + @@ -372,16 +463,18 @@ function ResourceView(element, calendar, viewName) { } for (col=0; col" + - htmlEscape(resources()[col].name) + - ""; + var classNames = [ // added + 'fc-col' + col, + resource.className instanceof Array ? resource.className.join(' ') : resource.className, + headerClass + ]; + + html += + "" + + htmlEscape(resource.name) + + ""; } html += @@ -412,12 +505,12 @@ function ResourceView(element, calendar, viewName) { cellsHTML = ''; for (col=0; col= 0) { - d.add('m', minMinute + slotIndex * snapMinutes); + + if (snapIndex >= 0) { + date.time(moment.duration(minTime + snapIndex * snapDuration)); + date = calendar.rezoneDate(date); } - return d; + + return date; } + function computeDateTop(date, startOfDayDate) { return computeTimeTop( @@ -863,8 +997,8 @@ function ResourceView(element, calendar, viewName) { col = col || dateToCell(startDate).col; if (col >= 0 && col < colCnt) { // only works when times are on same day var rect = coordinateGrid.rect(0, col, 0, col, slotContainer); // only for horizontal coords - var top = timePosition(startDate, startDate); - var bottom = timePosition(startDate, endDate); + var top = computeDateTop(startDate, startDate); + var bottom = computeDateTop(startDate, endDate); if (bottom > top) { // protect against selections that are entirely before or after visible range rect.top = top; rect.height = bottom - top; @@ -962,11 +1096,11 @@ function ResourceView(element, calendar, viewName) { var d2 = realCellToDate(cell); dates = [ d1, - d1.clone().add('m', snapMinutes), // calculate minutes depending on selection slot minutes + d1.clone().add(snapDuration), // calculate minutes depending on selection slot minutes d2, - d2.clone().add('m', snapMinutes) + d2.clone().add(snapDuration) ].sort(dateCompare); - renderSlotSelection(dates[0], dates[3], cell.col); + renderSlotSelection(dates[0], dates[3], cell.col); // updated }else{ dates = null; } @@ -977,7 +1111,7 @@ function ResourceView(element, calendar, viewName) { if (+dates[0] == +dates[1]) { reportDayClick(dates[0], false, ev); } - ev.data = resources()[col]; + ev.data = resources()[col]; // added reportSelection(dates[0], dates[3], false, ev); } }); diff --git a/tests/resourceDayView.html b/tests/resourceDayView.html index 84381e9..e157660 100644 --- a/tests/resourceDayView.html +++ b/tests/resourceDayView.html @@ -1,235 +1,200 @@ - - - - + + + -

+

+ + + + + + + + + + + +
+ + + + + + +
+ + + + + + + + +
+ + + + + + + + + +

- - - - - - - + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + \ No newline at end of file