Adam Shaw vor 7 Jahren
Ursprung
Commit
7d705db74d

+ 1 - 1
src/Constraints.ts

@@ -298,7 +298,7 @@ export default class Constraints {
     return [
       new ComponentFootprint(
         new UnzonedRange(startMeta ? startMeta.marker : null, endMeta ? endMeta.marker : null),
-        (startMeta && startMeta.isTimeUnspecified || (endMeta && endMeta.isTimeUnspecified)) // isAllDay
+        (startMeta && startMeta.isTimeUnspecified) && (!endMeta || endMeta.isTimeUnspecified) // isAllDay
       )
     ]
   }

+ 2 - 6
src/OptionsManager.ts

@@ -1,8 +1,8 @@
 import { assignTo } from './util/object'
 import { firstDefined } from './util/misc'
 import { globalDefaults, rtlDefaults, mergeOptions } from './options'
-import { localeOptionHash } from './locale'
 import Model from './common/Model'
+import { getLocale } from './datelib/locale'
 
 
 export default class OptionsManager extends Model {
@@ -76,11 +76,7 @@ export default class OptionsManager extends Model {
       this.dynamicOverrides.locale,
       this.overrides.locale
     )
-    localeDefaults = localeOptionHash[locale]
-    if (!localeDefaults) { // explicit locale option not given or invalid?
-      locale = globalDefaults.locale
-      localeDefaults = localeOptionHash[locale] || {}
-    }
+    localeDefaults = getLocale(locale) // TODO: not efficient bc calendar already queries this
 
     isRTL = firstDefined( // based on options computed so far, is direction RTL?
       this.dynamicOverrides.isRTL,

+ 4 - 3
src/View.ts

@@ -9,7 +9,7 @@ import InteractiveDateComponent from './component/InteractiveDateComponent'
 import GlobalEmitter from './common/GlobalEmitter'
 import UnzonedRange from './models/UnzonedRange'
 import EventInstance from './models/event/EventInstance'
-import { DateMarker, addDays, addMs, diffDays } from './datelib/marker'
+import { DateMarker, addDays, addMs, diffWholeDays } from './datelib/marker'
 import { createDuration } from './datelib/duration'
 import { createFormatter } from './datelib/formatting'
 
@@ -201,7 +201,7 @@ export default abstract class View extends InteractiveDateComponent {
     } else if (currentRangeUnit === 'month') {
       return { year: 'numeric', month: 'long' } // like "September 2014"
     } else {
-      let days = diffDays(
+      let days = diffWholeDays(
         dateProfile.currentUnzonedRange.start,
         dateProfile.currentUnzonedRange.end
       )
@@ -646,12 +646,13 @@ export default abstract class View extends InteractiveDateComponent {
 
   // Triggers external-drop handlers that have subscribed via the API
   triggerExternalDrop(singleEventDef, isEvent, el, ev) {
+    const dateEnv = this.calendar.dateEnv
 
     // trigger 'drop' regardless of whether element represents an event
     this.publiclyTrigger('drop', {
       context: el,
       args: [
-        singleEventDef.dateProfile.start,
+        dateEnv.toDate(singleEventDef.dateProfile.start),
         ev,
         this
       ]

+ 5 - 3
src/basic/DayGrid.ts

@@ -115,6 +115,7 @@ export default class DayGrid extends InteractiveDateComponent {
   // Renders the rows and columns into the component's `this.el`, which should already be assigned.
   renderGrid() {
     let view = this.view
+    const dateEnv = view.calendar.dateEnv
     let rowCnt = this.rowCnt
     let colCnt = this.colCnt
     let html = ''
@@ -148,7 +149,7 @@ export default class DayGrid extends InteractiveDateComponent {
         this.publiclyTrigger('dayRender', {
           context: view,
           args: [
-            this.getCellDate(row, col),
+            dateEnv.toDate(this.getCellDate(row, col)),
             this.getCellEl(row, col),
             view
           ]
@@ -262,7 +263,7 @@ export default class DayGrid extends InteractiveDateComponent {
         ) +
       '>'
 
-    if (this.cellWeekNumbersVisible && (date.day() === weekCalcFirstDow)) {
+    if (this.cellWeekNumbersVisible && (date.getUTCDay() === weekCalcFirstDow)) {
       html += view.buildGotoAnchorHtml(
         { date: date, type: 'week' },
         { 'class': 'fc-week-number' },
@@ -600,6 +601,7 @@ export default class DayGrid extends InteractiveDateComponent {
   // Responsible for attaching click handler as well.
   renderMoreLink(row, col, hiddenSegs) {
     let view = this.view
+    const dateEnv = view.calendar.dateEnv
 
     let a = createElement('a', { className: 'fc-more' })
     a.innerText = this.getMoreLinkText(hiddenSegs.length)
@@ -620,7 +622,7 @@ export default class DayGrid extends InteractiveDateComponent {
           context: view,
           args: [
             {
-              date: date,
+              date: dateEnv.toDate(date),
               dayEl: dayEl,
               moreEl: moreEl,
               segs: reslicedAllSegs,

+ 1 - 0
src/component/DateComponent.ts

@@ -763,6 +763,7 @@ export default abstract class DateComponent extends Component {
 
 
   // Compute the number of the give units in the "current" range.
+  // Won't go more precise than days.
   // Will return `0` if there's not a clean whole interval.
   currentRangeAs(unit) {
     const dateEnv = this._getCalendar().dateEnv

+ 1 - 1
src/component/DayTableMixin.ts

@@ -417,7 +417,7 @@ export default class DayTableMixin extends Mixin implements DayTableInterface {
 
     return '<td class="' + classes.join(' ') + '"' +
       (isDateValid ?
-        ' data-date="' + dateEnv.formatIso(date, { omitTime: true }) + '"' : // if date has a time, won't format it
+        ' data-date="' + dateEnv.formatIso(date, { omitTime: true }) + '"' :
         '') +
       (otherAttrs ?
         ' ' + otherAttrs :

+ 3 - 3
src/component/interactions/DateSelecting.ts

@@ -136,17 +136,17 @@ export default class DateSelecting extends Interaction {
   // TODO: do this separation of concerns (combining VS validation) for event dnd/resize too.
   // Assumes both footprints are non-open-ended.
   computeSelectionFootprint(footprint0, footprint1) {
-    let ms = [
+    let markers = [
       footprint0.unzonedRange.start,
       footprint0.unzonedRange.end,
       footprint1.unzonedRange.start,
       footprint1.unzonedRange.end
     ]
 
-    ms.sort(compareNumbers)
+    markers.sort(compareNumbers)
 
     return new ComponentFootprint(
-      new UnzonedRange(ms[0], ms[3]),
+      new UnzonedRange(markers[0], markers[3]),
       footprint0.isAllDay
     )
   }

+ 1 - 2
src/datelib/env.ts

@@ -1,6 +1,5 @@
 import {
-  DateMarker,
-  addDays, addMs,
+  DateMarker, addMs,
   diffHours, diffMinutes, diffSeconds, diffWholeWeeks, diffWholeDays,
   startOfDay, startOfHour, startOfMinute, startOfSecond,
   weekOfYear, arrayToUtcDate, dateToUtcArray, dateToLocalArray, arrayToLocalDate, timeAsMs

+ 0 - 4
src/exports.ts

@@ -70,10 +70,6 @@ export {
   computeHeightAndMargins
 } from './util/dom-geom'
 
-export {
-  locale
-} from './locale'
-
 export { default as EmitterMixin, EmitterInterface } from './common/EmitterMixin'
 export { default as ListenerMixin, ListenerInterface } from './common/ListenerMixin'
 export { default as Model } from './common/Model'

+ 0 - 27
src/locale.ts

@@ -1,27 +0,0 @@
-import * as exportHooks from './exports'
-import { mergeOptions, globalDefaults } from './options'
-
-export const localeOptionHash = {};
-(exportHooks as any).locales = localeOptionHash
-
-
-// Sets FullCalendar-specific translations. Will set the locales as the global default.
-export function locale(localeCode, newFcOptions) {
-  let fcOptions
-
-  // get the FullCalendar internal option hash for this locale. create if necessary
-  fcOptions = localeOptionHash[localeCode] || (localeOptionHash[localeCode] = {})
-
-  // provided new options for this locales? merge them in
-  if (newFcOptions) {
-    fcOptions = localeOptionHash[localeCode] = mergeOptions([ fcOptions, newFcOptions ])
-  }
-
-  // set it as the default locale for FullCalendar
-  globalDefaults.locale = localeCode
-}
-
-
-// Initialize English by forcing computation of moment-derived options.
-// Also, sets it as the default.
-locale('en', {})

+ 1 - 1
src/models/UnzonedRange.ts

@@ -68,7 +68,7 @@ export default class UnzonedRange {
     let newRange = null
 
     if (otherRange.start != null) {
-      if (start === null) {
+      if (start == null) {
         start = otherRange.start
       } else {
         start = new Date(Math.max(start.valueOf(), otherRange.start.valueOf()))

+ 4 - 0
src/models/event/EventDateProfile.ts

@@ -49,6 +49,10 @@ export default class EventDateProfile {
       return false
     }
 
+    if (endMarker && endMarker <= startMarker) {
+      return false
+    }
+
     if (forcedAllDay == null) {
       forcedAllDay = source.allDayDefault
       if (forcedAllDay == null) {

+ 5 - 5
src/models/event/EventDefDateMutation.ts

@@ -1,7 +1,7 @@
 import Calendar from '../../Calendar'
 import EventDateProfile from './EventDateProfile'
 import { startOfDay, diffWholeDays, diffDayAndTime } from '../../datelib/marker'
-import { Duration, diffDurations } from '../../datelib/duration'
+import { Duration, createDuration, diffDurations } from '../../datelib/duration'
 
 export default class EventDefDateMutation {
 
@@ -29,13 +29,13 @@ export default class EventDefDateMutation {
     // subtracts the dates in the appropriate way, returning a duration
     function diffDates(date0, date1) {
       if (largeUnit === 'year') {
-        return dateEnv.diffWholeYears(date0, date1)
+        return createDuration(dateEnv.diffWholeYears(date0, date1), 'year')
       } else if (largeUnit === 'month') {
-        return dateEnv.diffWholeMonths(date0, date1)
+        return createDuration(dateEnv.diffWholeMonths(date0, date1), 'month')
       } else if (dateProfile1.isAllDay) {
-        return diffWholeDays(date0, date1)
+        return createDuration(diffWholeDays(date0, date1), 'day')
       } else {
-        return diffDayAndTime(date0, date1)
+        return diffDayAndTime(date0, date1) // returns a duration
       }
     }
 

+ 1 - 1
src/models/event/EventDefParser.ts

@@ -6,7 +6,7 @@ import { createDuration } from '../../datelib/duration'
 export default {
 
   parse: function(eventInput, source) {
-    let startTime, endTime
+    let startTime, endTime // for testing if given object is a duration
 
     if (typeof eventInput.start !== 'number') { // because numbers should be parsed as dates
       startTime = createDuration(eventInput.start)

+ 2 - 2
src/models/event/RecurringEventDef.ts

@@ -36,7 +36,7 @@ export default class RecurringEventDef extends EventDef {
         if (this.startTime) {
           instanceStart = dateEnv.add(dateMarker, this.startTime)
         } else {
-          instanceStart = null
+          instanceStart = dateMarker
         }
 
         if (this.endTime) {
@@ -53,7 +53,7 @@ export default class RecurringEventDef extends EventDef {
         )
       }
 
-      dateMarker = dateEnv.add(dateMarker, ONE_DAY) // wish we didnt have to recreate each time
+      dateMarker = dateEnv.add(dateMarker, ONE_DAY)
     }
 
     return instances