devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
347 lines (345 loc) • 12.4 kB
JavaScript
/**
* DevExtreme (cjs/ui/scheduler/header/utils.js)
* Version: 22.1.9
* Build date: Tue Apr 18 2023
*
* Copyright (c) 2012 - 2023 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
"use strict";
exports.validateViews = exports.nextWeek = exports.isOneView = exports.getViewType = exports.getViewText = exports.getViewName = exports.getStep = exports.getNextIntervalDate = exports.getCaption = exports.formatViews = void 0;
var _date = _interopRequireDefault(require("../../../core/utils/date"));
var _date2 = _interopRequireDefault(require("../../../localization/date"));
var _message = _interopRequireDefault(require("../../../localization/message"));
var _inflector = require("../../../core/utils/inflector");
var _type = require("../../../core/utils/type");
var _errors = _interopRequireDefault(require("../../../core/errors"));
var _constants = require("../constants");
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
}
}
var DAY_FORMAT = "d";
var DAYS_IN_WORK_WEEK = 5;
var getPeriodStart = _date.default.correctDateWithUnitBeginning,
getWeekStart = _date.default.getFirstWeekDate,
getLastMonthDay = _date.default.getLastMonthDay,
addDateInterval = _date.default.addDateInterval;
var formatDate = _date2.default.format;
var MS_DURATION = {
milliseconds: 1
};
var DAY_DURATION = {
days: 1
};
var WEEK_DURATION = {
days: 7
};
var SATURDAY_INDEX = 6;
var SUNDAY_INDEX = 0;
var subMS = function(date) {
return addDateInterval(date, MS_DURATION, -1)
};
var addMS = function(date) {
return addDateInterval(date, MS_DURATION, 1)
};
var nextDay = function(date) {
return addDateInterval(date, DAY_DURATION, 1)
};
var nextWeek = function(date) {
return addDateInterval(date, WEEK_DURATION, 1)
};
exports.nextWeek = nextWeek;
var nextMonth = function(date) {
var days = getLastMonthDay(date);
return addDateInterval(date, {
days: days
}, 1)
};
var isWeekend = function(date) {
return date.getDay() === SATURDAY_INDEX || date.getDay() === SUNDAY_INDEX
};
var getWorkWeekStart = function(firstDayOfWeek) {
var date = new Date(firstDayOfWeek);
while (isWeekend(date)) {
date = nextDay(date)
}
return date
};
var getDateAfterWorkWeek = function(workWeekStart) {
var date = new Date(workWeekStart);
var workDaysCount = 0;
while (workDaysCount < DAYS_IN_WORK_WEEK) {
if (!isWeekend(date)) {
workDaysCount++
}
date = nextDay(date)
}
return date
};
var nextAgendaStart = function(date, agendaDuration) {
return addDateInterval(date, {
days: agendaDuration
}, 1)
};
var getInterval = function(options) {
var startDate = getIntervalStartDate(options);
var endDate = getIntervalEndDate(startDate, options);
return {
startDate: startDate,
endDate: endDate
}
};
var getIntervalStartDate = function(options) {
var date = options.date,
step = options.step,
firstDayOfWeek = options.firstDayOfWeek;
switch (step) {
case "day":
case "week":
case "month":
return getPeriodStart(date, step, false, firstDayOfWeek);
case "workWeek":
var firstWeekDay = getWeekStart(date, firstDayOfWeek);
return getWorkWeekStart(firstWeekDay);
case "agenda":
return new Date(date)
}
};
var getIntervalEndDate = function(startDate, options) {
var intervalCount = options.intervalCount,
step = options.step,
agendaDuration = options.agendaDuration;
var periodStartDate;
var periodEndDate;
var nextPeriodStartDate = new Date(startDate);
for (var i = 0; i < intervalCount; i++) {
periodStartDate = nextPeriodStartDate;
periodEndDate = getPeriodEndDate(periodStartDate, step, agendaDuration);
nextPeriodStartDate = getNextPeriodStartDate(periodEndDate, step)
}
return periodEndDate
};
var getPeriodEndDate = function(currentPeriodStartDate, step, agendaDuration) {
var date;
switch (step) {
case "day":
date = nextDay(currentPeriodStartDate);
break;
case "week":
date = nextWeek(currentPeriodStartDate);
break;
case "month":
date = nextMonth(currentPeriodStartDate);
break;
case "workWeek":
date = getDateAfterWorkWeek(currentPeriodStartDate);
break;
case "agenda":
date = nextAgendaStart(currentPeriodStartDate, agendaDuration)
}
return subMS(date)
};
var getNextPeriodStartDate = function(currentPeriodEndDate, step) {
var date = addMS(currentPeriodEndDate);
if ("workWeek" === step) {
while (isWeekend(date)) {
date = nextDay(date)
}
}
return date
};
var getNextIntervalDate = function(options, direction) {
var date = options.date,
step = options.step,
intervalCount = options.intervalCount,
agendaDuration = options.agendaDuration;
var dayDuration;
switch (step) {
case "day":
dayDuration = 1 * intervalCount;
break;
case "week":
case "workWeek":
dayDuration = 7 * intervalCount;
break;
case "agenda":
dayDuration = agendaDuration;
break;
case "month":
return getNextMonthDate(date, intervalCount, direction)
}
return addDateInterval(date, {
days: dayDuration
}, direction)
};
exports.getNextIntervalDate = getNextIntervalDate;
var getNextMonthDate = function(date, intervalCount, direction) {
var currentDate = date.getDate();
var currentMonthFirstDate = new Date(new Date(date.getTime()).setDate(1));
var thatMonthFirstDate = new Date(currentMonthFirstDate.setMonth(currentMonthFirstDate.getMonth() + intervalCount * direction));
var thatMonthDuration = getLastMonthDay(thatMonthFirstDate);
var minDate = currentDate < thatMonthDuration ? currentDate : thatMonthDuration;
var currentMonthMinDate = new Date(new Date(date.getTime()).setDate(minDate));
var thatMonthMinDate = new Date(currentMonthMinDate.setMonth(currentMonthMinDate.getMonth() + intervalCount * direction));
return thatMonthMinDate
};
var getDateMonthFormatter = function(isShort) {
var monthType = isShort ? "abbreviated" : "wide";
var months = _date2.default.getMonthNames(monthType);
return function(date) {
var day = formatDate(date, "day");
var month = months[date.getMonth()];
return "".concat(day, " ").concat(month)
}
};
var formatMonthYear = function(date) {
var months = _date2.default.getMonthNames("abbreviated");
var month = months[date.getMonth()];
var year = formatDate(date, "year");
return "".concat(month, " ").concat(year)
};
var getDateMonthYearFormatter = function(isShort) {
return function(date) {
var dateMonthFormat = getDateMonthFormatter(isShort);
var dateMonth = dateMonthFormat(date);
var year = formatDate(date, "year");
return "".concat(dateMonth, " ").concat(year)
}
};
var getDifferentYearCaption = function(startDate, endDate) {
var firstDateText = formatDate(startDate, getDateMonthYearFormatter(true));
var lastDateDateText = formatDate(endDate, getDateMonthYearFormatter(true));
return "".concat(firstDateText, "-").concat(lastDateDateText)
};
var getSameYearCaption = function(startDate, endDate, isShort) {
var isDifferentMonthDates = startDate.getMonth() !== endDate.getMonth();
var useShortFormat = isDifferentMonthDates || isShort;
var firstDateFormat = isDifferentMonthDates ? getDateMonthFormatter(useShortFormat) : DAY_FORMAT;
var firstDateText = formatDate(startDate, firstDateFormat);
var lastDateText = formatDate(endDate, getDateMonthYearFormatter(useShortFormat));
return "".concat(firstDateText, "-").concat(lastDateText)
};
var getSameDateCaption = function(date, step, isShort) {
var useShortFormat = "agenda" === step ? isShort : false;
var dateMonthFormat = getDateMonthFormatter(useShortFormat);
var dateMonth = dateMonthFormat(date);
var year = formatDate(date, "year");
return "".concat(dateMonth, " ").concat(year)
};
var formatCaptionByMonths = function(startDate, endDate, isShort) {
var isDifferentYears = startDate.getFullYear() !== endDate.getFullYear();
if (isDifferentYears) {
return getDifferentYearCaption(startDate, endDate)
}
return getSameYearCaption(startDate, endDate, isShort)
};
var formatMonthViewCaption = function(startDate, endDate) {
if (_date.default.sameMonth(startDate, endDate)) {
return formatDate(startDate, "monthandyear")
}
var isSameYear = _date.default.sameYear(startDate, endDate);
var firstDateText = isSameYear ? _date2.default.getMonthNames("abbreviated")[startDate.getMonth()] : formatMonthYear(startDate);
var lastDateText = formatMonthYear(endDate);
return "".concat(firstDateText, "-").concat(lastDateText)
};
var getCaptionText = function(startDate, endDate, isShort, step) {
if (_date.default.sameDate(startDate, endDate)) {
return getSameDateCaption(startDate, step, isShort)
}
if ("month" === step) {
return formatMonthViewCaption(startDate, endDate)
}
return formatCaptionByMonths(startDate, endDate, isShort)
};
var getCaption = function(options, isShort, customizationFunction) {
var _getInterval = getInterval(options),
startDate = _getInterval.startDate,
endDate = _getInterval.endDate;
var text = getCaptionText(startDate, endDate, isShort, options.step);
if ((0, _type.isFunction)(customizationFunction)) {
text = customizationFunction({
startDate: startDate,
endDate: endDate,
text: text
})
}
return {
startDate: startDate,
endDate: endDate,
text: text
}
};
exports.getCaption = getCaption;
var STEP_MAP = {
day: "day",
week: "week",
workWeek: "workWeek",
month: "month",
timelineDay: "day",
timelineWeek: "week",
timelineWorkWeek: "workWeek",
timelineMonth: "month",
agenda: "agenda"
};
var getStep = function(view) {
return STEP_MAP[getViewType(view)]
};
exports.getStep = getStep;
var getViewType = function(view) {
if ((0, _type.isObject)(view) && view.type) {
return view.type
}
return view
};
exports.getViewType = getViewType;
var getViewName = function(view) {
if ((0, _type.isObject)(view)) {
return view.name ? view.name : view.type
}
return view
};
exports.getViewName = getViewName;
var getViewText = function(view) {
if (view.name) {
return view.name
}
var viewName = (0, _inflector.camelize)(view.type || view, true);
return _message.default.format("dxScheduler-switcher" + viewName)
};
exports.getViewText = getViewText;
var isValidView = function(view) {
return Object.values(_constants.VIEWS).includes(view)
};
var validateViews = function(views) {
views.forEach((function(view) {
var viewType = getViewType(view);
if (!isValidView(viewType)) {
_errors.default.log("W0008", viewType)
}
}))
};
exports.validateViews = validateViews;
var formatViews = function(views) {
validateViews(views);
return views.map((function(view) {
var text = getViewText(view);
var type = getViewType(view);
var name = getViewName(view);
return {
text: text,
name: name,
view: {
text: text,
type: type,
name: name
}
}
}))
};
exports.formatViews = formatViews;
var isOneView = function(views, selectedView) {
return 1 === views.length && views[0].name === selectedView
};
exports.isOneView = isOneView;