@openui5/sap.m
Version:
OpenUI5 UI Library sap.m
273 lines (227 loc) • 9.61 kB
JavaScript
/*!
* OpenUI5
* (c) Copyright 2026 SAP SE or an SAP affiliate company.
* Licensed under the Apache License, Version 2.0 - see LICENSE.txt.
*/
sap.ui.define([
'sap/ui/base/EventProvider',
'sap/ui/unified/calendar/CalendarUtils',
'sap/ui/unified/calendar/CalendarDate',
'sap/ui/core/date/UI5Date',
'sap/ui/unified/library'
],
function(
EventProvider,
CalendarUtils,
CalendarDate,
UI5Date,
unifiedLibrary
) {
"use strict";
var Periods = unifiedLibrary.CalendarIntervalType;
/**
* Creates a <code>sap.m.delegate.DateNavigation</code> delegate that can navigate through dates.
*
* @extends sap.ui.base.EventProvider
* @constructor
* @private
* @alias sap.m.delegate.DateNavigation
* @version 1.71
* @author SAP SE
*/
var DateNavigation = EventProvider.extend("sap.m.delegate.DateNavigation", /** @lends sap.m.delegate.DateNavigation.prototype */ {
constructor: function() {
EventProvider.apply(this, arguments);
this._unit = Periods.Day;
this._start = UI5Date.getInstance();
this._step = 1;
this._calendarWeekNumbering = undefined;
}
});
/**
* 24 hours as milliseconds.
* @type {int}
* @private
*/
DateNavigation.HOURS24 = 1000 * 3600 * 24;
DateNavigation.prototype.setUnit = function(sPeriodUnit) {
this._unit = sPeriodUnit;
};
DateNavigation.prototype.setStart = function(oDate) {
this._start = oDate;
};
DateNavigation.prototype.setStep = function(iStep) {
this._step = iStep;
};
DateNavigation.prototype.setCurrent = function(oDate) {
this._current = oDate;
};
DateNavigation.prototype.setWeekConfiguration = function(oWeekConfig) {
this._weekConfiguration = oWeekConfig;
};
DateNavigation.prototype.getUnit = function() {
return this._unit;
};
DateNavigation.prototype.getStart = function() {
return this._start;
};
DateNavigation.prototype.getStep = function() {
return this._step;
};
DateNavigation.prototype.getCurrent = function() {
return this._current;
};
DateNavigation.prototype.getWeekConfiguration = function() {
return this._weekConfiguration;
};
DateNavigation.prototype.getEnd = function(calendarType) {
var oCalEnd = CalendarUtils._createUniversalUTCDate(this.getStart(), calendarType, true);
switch (this.getUnit()) {
case Periods.Day:
case Periods.Week:
oCalEnd.setUTCDate(oCalEnd.getUTCDate() + this.getStep() - 1);
break;
case Periods.OneMonth:
case "OneMonth":
oCalEnd.setUTCMonth(oCalEnd.getUTCMonth() + 1, 1);
oCalEnd.setUTCDate(oCalEnd.getUTCDate() - 1, 1);
break;
case Periods.Hour:
oCalEnd.setUTCHours(oCalEnd.getUTCHours() + this.getStep() - 1);
break;
case Periods.Month:
oCalEnd.setUTCMonth(oCalEnd.getUTCMonth() + this.getStep() - 1, 1);
break;
default:
break;
}
return CalendarUtils._createLocalDate(oCalEnd, true);
};
DateNavigation.prototype.next = function(calendarType) {
var oNewCalStart = CalendarUtils._createUniversalUTCDate(this.getStart(), calendarType, true);
var oNewCalCurrent = this.getCurrent() ? CalendarUtils._createUniversalUTCDate(this.getCurrent(), calendarType, true) : CalendarUtils._createUniversalUTCDate(this.getStart(), calendarType, true);
switch (this.getUnit()) {
case Periods.Hour:
oNewCalCurrent.setUTCHours(oNewCalCurrent.getUTCHours() + this.getStep());
this.setCurrent(CalendarUtils._createLocalDate(oNewCalCurrent, true));
oNewCalStart.setUTCHours(oNewCalStart.getUTCHours() + this.getStep());
this.setStart(CalendarUtils._createLocalDate(oNewCalStart, true));
break;
case Periods.Week:
case Periods.Day:
oNewCalCurrent.setUTCDate(oNewCalCurrent.getUTCDate() + this.getStep());
this.setCurrent(CalendarUtils._createLocalDate(oNewCalCurrent, true));
oNewCalStart.setUTCDate(oNewCalStart.getUTCDate() + this.getStep());
this.setStart(CalendarUtils._createLocalDate(oNewCalStart, true));
break;
case Periods.Month:
oNewCalCurrent.setUTCMonth(oNewCalCurrent.getUTCMonth() + this.getStep(), 1);
this.setCurrent(CalendarUtils._createLocalDate(oNewCalCurrent, true));
oNewCalStart.setUTCMonth(oNewCalStart.getUTCMonth() + this.getStep(), 1);
this.setStart(CalendarUtils._createLocalDate(oNewCalStart, true));
break;
case Periods.OneMonth:
case "OneMonth":
oNewCalCurrent.setUTCMonth(oNewCalCurrent.getUTCMonth() + 1, 1);
this.setCurrent(CalendarUtils._createLocalDate(oNewCalCurrent, true));
oNewCalStart.setUTCMonth(oNewCalStart.getUTCMonth() + 1, 1);
this.setStart(CalendarUtils._createLocalDate(oNewCalStart, true));
break;
default:
break;
}
};
DateNavigation.prototype.previous = function(calendarType) {
var oNewCalStart = CalendarUtils._createUniversalUTCDate(this.getStart(), calendarType, true);
var oNewCalCurrent = this.getCurrent() ? CalendarUtils._createUniversalUTCDate(this.getCurrent(), calendarType, true) : CalendarUtils._createUniversalUTCDate(this.getStart(), calendarType, true);
switch (this.getUnit()) {
case Periods.Hour:
oNewCalCurrent.setUTCHours(oNewCalCurrent.getUTCHours() - this.getStep());
this.setCurrent(CalendarUtils._createLocalDate(oNewCalCurrent, true));
oNewCalStart.setUTCHours(oNewCalStart.getUTCHours() - this.getStep());
this.setStart(CalendarUtils._createLocalDate(oNewCalStart, true));
break;
case Periods.Week:
case Periods.Day:
oNewCalCurrent.setUTCDate(oNewCalCurrent.getUTCDate() - this.getStep());
this.setCurrent(CalendarUtils._createLocalDate(oNewCalCurrent, true));
oNewCalStart.setUTCDate(oNewCalStart.getUTCDate() - this.getStep());
this.setStart(CalendarUtils._createLocalDate(oNewCalStart, true));
break;
case Periods.Month:
oNewCalCurrent.setUTCMonth(oNewCalCurrent.getUTCMonth() - this.getStep(), 1);
this.setCurrent(CalendarUtils._createLocalDate(oNewCalCurrent, true));
oNewCalStart.setUTCMonth(oNewCalStart.getUTCMonth() - this.getStep(), 1);
this.setStart(CalendarUtils._createLocalDate(oNewCalStart, true));
break;
case Periods.OneMonth:
case "OneMonth":
oNewCalCurrent.setUTCMonth(oNewCalCurrent.getUTCMonth() - 1, 1);
this.setCurrent(CalendarUtils._createLocalDate(oNewCalCurrent, true));
oNewCalStart.setUTCMonth(oNewCalStart.getUTCMonth() - 1, 1);
this.setStart(CalendarUtils._createLocalDate(oNewCalStart, true));
break;
default:
break;
}
};
DateNavigation.prototype.toDate = function(oToDate, calendarType) {
var oNewCalStart,
oCalEnd,
iHoursOffset,
oNewCurrent = CalendarUtils._createUniversalUTCDate(oToDate, calendarType, true),
oNewUTCCurrent = CalendarUtils._createUTCDate(oToDate, true);
this.setCurrent(oToDate);
switch (this.getUnit()) {
case Periods.OneMonth:
case "OneMonth":
if (CalendarUtils.monthsDiffer(this.getStart(), oToDate)) {
var oFirstMonthCalDate = CalendarUtils._getFirstDateOfMonth(CalendarDate.fromLocalJSDate(oToDate));
this.setStart(oFirstMonthCalDate.toLocalJSDate());
}
break;
case Periods.Day:
oCalEnd = CalendarUtils._createUniversalUTCDate(this.getStart(), calendarType, true);
oCalEnd.setUTCDate(oCalEnd.getUTCDate() + this.getStep());
if (oToDate.valueOf() >= oCalEnd.valueOf()) {
iHoursOffset = 1 + Math.ceil((oToDate.valueOf() - oCalEnd.valueOf()) / (DateNavigation.HOURS24));
oNewCalStart = CalendarUtils._createUniversalUTCDate(this.getStart(), calendarType, true);
oNewCalStart.setUTCDate(oNewCalStart.getUTCDate() + iHoursOffset);
this.setStart(CalendarUtils._createLocalDate(oNewCalStart, true));
} else if (oToDate.valueOf() < this.getStart().valueOf()) {
oNewCalStart = CalendarUtils._createUniversalUTCDate(oToDate, calendarType, true);
this.setStart(CalendarUtils._createLocalDate(oNewCalStart, true));
}
break;
case Periods.Month:
oCalEnd = CalendarUtils._createUniversalUTCDate(this.getStart(), calendarType, true);
oCalEnd.setUTCMonth(oCalEnd.getUTCMonth() + this.getStep(), 1);
if (oNewCurrent.getTime() >= oCalEnd.valueOf()) {
iHoursOffset = 1 + CalendarUtils._monthsBetween(oToDate, CalendarUtils._createLocalDate(oCalEnd, true));
oNewCalStart = CalendarUtils._createUniversalUTCDate(this.getStart(), calendarType, true);
oNewCalStart.setUTCMonth(oNewCalStart.getUTCMonth() + iHoursOffset, 1);
this.setStart(CalendarUtils._createLocalDate(oNewCalStart, true));
} else if (oToDate.valueOf() < this.getStart().valueOf()) {
oNewCalStart = CalendarUtils._createUniversalUTCDate(oToDate, calendarType, true);
this.setStart(CalendarUtils._createLocalDate(oNewCalStart, true));
}
break;
case Periods.Week:
var oToCalDateFirstWeekDate = CalendarUtils.getFirstDateOfWeek(oNewUTCCurrent, this.getWeekConfiguration());
if (this.getStart().valueOf() !== oToCalDateFirstWeekDate.valueOf()) {
this.setStart(CalendarUtils._createLocalDate(oToCalDateFirstWeekDate, true));
}
break;
case Periods.Hour:
oCalEnd = this.getEnd();
var oCalutcEnd = CalendarUtils._createUniversalUTCDate(oCalEnd, calendarType, true);
if (oNewCurrent.getTime() < CalendarUtils._createUniversalUTCDate(this.getStart(), calendarType, true).getTime() || oNewCurrent.getTime() > oCalutcEnd.getTime()) {
this.setStart(oToDate);
}
break;
default:
break;
}
};
return DateNavigation;
});