react-big-calendar
Version:
Calendar! with events
169 lines (163 loc) • 7.46 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.DateLocalizer = void 0;
exports.mergeWithDefaults = mergeWithDefaults;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _invariant = _interopRequireDefault(require("invariant"));
var _dates = require("./utils/dates");
var localePropType = _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.func]);
function _format(localizer, formatter, value, format, culture) {
var result = typeof format === 'function' ? format(value, culture, localizer) : formatter.call(localizer, value, format, culture);
(0, _invariant.default)(result == null || typeof result === 'string', '`localizer format(..)` must return a string, null, or undefined');
return result;
}
/**
* This date conversion was moved out of TimeSlots.js, to
* allow for localizer override
* @param {Date} dt - The date to start from
* @param {Number} minutesFromMidnight
* @param {Number} offset
* @returns {Date}
*/
function getSlotDate(dt, minutesFromMidnight, offset) {
return new Date(dt.getFullYear(), dt.getMonth(), dt.getDate(), 0, minutesFromMidnight + offset, 0, 0);
}
function getDstOffset(start, end) {
return start.getTimezoneOffset() - end.getTimezoneOffset();
}
// if the start is on a DST-changing day but *after* the moment of DST
// transition we need to add those extra minutes to our minutesFromMidnight
function getTotalMin(start, end) {
return (0, _dates.diff)(start, end, 'minutes') + getDstOffset(start, end);
}
function getMinutesFromMidnight(start) {
var daystart = (0, _dates.startOf)(start, 'day');
return (0, _dates.diff)(daystart, start, 'minutes') + getDstOffset(daystart, start);
}
// These two are used by DateSlotMetrics
function continuesPrior(start, first) {
return (0, _dates.lt)(start, first, 'day');
}
function continuesAfter(start, end, last) {
var singleDayDuration = (0, _dates.eq)(start, end, 'minutes');
return singleDayDuration ? (0, _dates.gte)(end, last, 'minutes') : (0, _dates.gt)(end, last, 'minutes');
}
function daySpan(start, end) {
return (0, _dates.duration)(start, end, 'day');
}
// These two are used by eventLevels
function sortEvents(_ref) {
var _ref$evtA = _ref.evtA,
aStart = _ref$evtA.start,
aEnd = _ref$evtA.end,
aAllDay = _ref$evtA.allDay,
_ref$evtB = _ref.evtB,
bStart = _ref$evtB.start,
bEnd = _ref$evtB.end,
bAllDay = _ref$evtB.allDay;
var startSort = +(0, _dates.startOf)(aStart, 'day') - +(0, _dates.startOf)(bStart, 'day');
var durA = daySpan(aStart, aEnd);
var durB = daySpan(bStart, bEnd);
return startSort ||
// sort by start Day first
durB - durA ||
// events spanning multiple days go first
!!bAllDay - !!aAllDay ||
// then allDay single day events
+aStart - +bStart ||
// then sort by start time
+aEnd - +bEnd // then sort by end time
;
}
function inEventRange(_ref2) {
var _ref2$event = _ref2.event,
start = _ref2$event.start,
end = _ref2$event.end,
_ref2$range = _ref2.range,
rangeStart = _ref2$range.start,
rangeEnd = _ref2$range.end;
var eStart = (0, _dates.startOf)(start, 'day');
var startsBeforeEnd = (0, _dates.lte)(eStart, rangeEnd, 'day');
// when the event is zero duration we need to handle a bit differently
var sameMin = (0, _dates.neq)(eStart, end, 'minutes');
var endsAfterStart = sameMin ? (0, _dates.gt)(end, rangeStart, 'minutes') : (0, _dates.gte)(end, rangeStart, 'minutes');
return startsBeforeEnd && endsAfterStart;
}
// other localizers treats 'day' and 'date' equality very differently, so we
// abstract the change the 'localizer.eq(date1, date2, 'day') into this
// new method, where they can be treated correctly by the localizer overrides
function isSameDate(date1, date2) {
return (0, _dates.eq)(date1, date2, 'day');
}
function startAndEndAreDateOnly(start, end) {
return (0, _dates.isJustDate)(start) && (0, _dates.isJustDate)(end);
}
var DateLocalizer = exports.DateLocalizer = /*#__PURE__*/(0, _createClass2.default)(function DateLocalizer(spec) {
var _this = this;
(0, _classCallCheck2.default)(this, DateLocalizer);
(0, _invariant.default)(typeof spec.format === 'function', 'date localizer `format(..)` must be a function');
(0, _invariant.default)(typeof spec.firstOfWeek === 'function', 'date localizer `firstOfWeek(..)` must be a function');
this.propType = spec.propType || localePropType;
this.formats = spec.formats;
this.format = function () {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _format.apply(void 0, [_this, spec.format].concat(args));
};
// These date arithmetic methods can be overriden by the localizer
this.startOfWeek = spec.firstOfWeek;
this.merge = spec.merge || _dates.merge;
this.inRange = spec.inRange || _dates.inRange;
this.lt = spec.lt || _dates.lt;
this.lte = spec.lte || _dates.lte;
this.gt = spec.gt || _dates.gt;
this.gte = spec.gte || _dates.gte;
this.eq = spec.eq || _dates.eq;
this.neq = spec.neq || _dates.neq;
this.startOf = spec.startOf || _dates.startOf;
this.endOf = spec.endOf || _dates.endOf;
this.add = spec.add || _dates.add;
this.range = spec.range || _dates.range;
this.diff = spec.diff || _dates.diff;
this.ceil = spec.ceil || _dates.ceil;
this.min = spec.min || _dates.min;
this.max = spec.max || _dates.max;
this.minutes = spec.minutes || _dates.minutes;
this.daySpan = spec.daySpan || daySpan;
this.firstVisibleDay = spec.firstVisibleDay || _dates.firstVisibleDay;
this.lastVisibleDay = spec.lastVisibleDay || _dates.lastVisibleDay;
this.visibleDays = spec.visibleDays || _dates.visibleDays;
this.getSlotDate = spec.getSlotDate || getSlotDate;
this.getTimezoneOffset = spec.getTimezoneOffset || function (value) {
return value.getTimezoneOffset();
};
this.getDstOffset = spec.getDstOffset || getDstOffset;
this.getTotalMin = spec.getTotalMin || getTotalMin;
this.getMinutesFromMidnight = spec.getMinutesFromMidnight || getMinutesFromMidnight;
this.continuesPrior = spec.continuesPrior || continuesPrior;
this.continuesAfter = spec.continuesAfter || continuesAfter;
this.sortEvents = spec.sortEvents || sortEvents;
this.inEventRange = spec.inEventRange || inEventRange;
this.isSameDate = spec.isSameDate || isSameDate;
this.startAndEndAreDateOnly = spec.startAndEndAreDateOnly || startAndEndAreDateOnly;
this.segmentOffset = spec.browserTZOffset ? spec.browserTZOffset() : 0;
});
function mergeWithDefaults(localizer, culture, formatOverrides, messages) {
var formats = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, localizer.formats), formatOverrides);
return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, localizer), {}, {
messages: messages,
startOfWeek: function startOfWeek() {
return localizer.startOfWeek(culture);
},
format: function format(value, _format2) {
return localizer.format(value, formats[_format2] || _format2, culture);
}
});
}