169 lines
7.3 KiB
JavaScript
169 lines
7.3 KiB
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);
|
|
}
|
|
});
|
|
} |