|
|
@@ -1,17 +1,30 @@
|
|
|
|
|
|
-var EventDateProfile = Class.extend(EventStartEndMixin, {
|
|
|
+/*
|
|
|
+Meant to be immutable
|
|
|
+*/
|
|
|
+var EventDateProfile = Class.extend({
|
|
|
+
|
|
|
+ start: null,
|
|
|
+ end: null,
|
|
|
+ unzonedRange: null,
|
|
|
|
|
|
|
|
|
- constructor: function(start, end) {
|
|
|
+ constructor: function(start, end, calendar) {
|
|
|
this.start = start;
|
|
|
- this.end = end;
|
|
|
+ this.end = end || null;
|
|
|
+ this.unzonedRange = this.buildUnzonedRange(calendar);
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+ isAllDay: function() {
|
|
|
+ return !(this.start.hasTime() || (this.end && this.end.hasTime()));
|
|
|
},
|
|
|
|
|
|
|
|
|
/*
|
|
|
Needs a Calendar object
|
|
|
*/
|
|
|
- buildRange: function(calendar) {
|
|
|
+ buildUnzonedRange: function(calendar) {
|
|
|
var startMs = this.start.clone().stripZone().valueOf();
|
|
|
var endMs = this.getEnd(calendar).stripZone().valueOf();
|
|
|
|
|
|
@@ -36,20 +49,44 @@ var EventDateProfile = Class.extend(EventStartEndMixin, {
|
|
|
|
|
|
|
|
|
/*
|
|
|
-Needs a Calendar object
|
|
|
-TODO: this seems like repeat code :(
|
|
|
+Needs an EventSource object
|
|
|
*/
|
|
|
-EventDateProfile.parse = function(rawProps, calendar) {
|
|
|
- var start = calendar.moment(rawProps.start);
|
|
|
- var end = rawProps.end ? calendar.moment(rawProps.end) : null;
|
|
|
+EventDateProfile.parse = function(rawProps, source) {
|
|
|
+ var startInput = rawProps.start || rawProps.date;
|
|
|
+ var endInput = rawProps.end;
|
|
|
+
|
|
|
+ if (!startInput) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ var calendar = source.calendar;
|
|
|
+ var start = calendar.moment(startInput);
|
|
|
+ var end = endInput ? calendar.moment(endInput) : null;
|
|
|
+ var forcedAllDay = rawProps.allDay;
|
|
|
+ var forceEventDuration = calendar.opt('forceEventDuration');
|
|
|
|
|
|
- if (rawProps.allDay === true) {
|
|
|
+ if (!start.isValid()) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (end && (!end.isValid() || !end.isAfter(start))) {
|
|
|
+ end = null;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (forcedAllDay == null) {
|
|
|
+ forcedAllDay = source.allDayDefault;
|
|
|
+ if (forcedAllDay == null) {
|
|
|
+ forcedAllDay = calendar.opt('allDayDefault');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (forcedAllDay === true) {
|
|
|
start.stripTime();
|
|
|
if (end) {
|
|
|
end.stripTime();
|
|
|
}
|
|
|
}
|
|
|
- else if (rawProps.allDay === false) {
|
|
|
+ else if (forcedAllDay === false) {
|
|
|
if (!start.hasTime()) {
|
|
|
start.time(0);
|
|
|
}
|
|
|
@@ -58,6 +95,9 @@ EventDateProfile.parse = function(rawProps, calendar) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (!end && forceEventDuration) {
|
|
|
+ end = calendar.getDefaultEventEnd(!start.hasTime(), start);
|
|
|
+ }
|
|
|
|
|
|
- return new EventDateProfile(start, end);
|
|
|
+ return new EventDateProfile(start, end, calendar);
|
|
|
};
|