diff options
Diffstat (limited to '')
-rw-r--r-- | comm/calendar/base/content/calendar-views.js | 286 |
1 files changed, 286 insertions, 0 deletions
diff --git a/comm/calendar/base/content/calendar-views.js b/comm/calendar/base/content/calendar-views.js new file mode 100644 index 0000000000..6d5e7faa3f --- /dev/null +++ b/comm/calendar/base/content/calendar-views.js @@ -0,0 +1,286 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* global MozElements, MozXULElement */ + +"use strict"; + +// The calendar view class hierarchy. +// +// CalendarFilteredViewMixin +// | +// CalendarBaseView +// / \ +// CalendarMultidayBaseView CalendarMonthBaseView +// / \ / \ +// CalendarDayView CalendarWeekView CalendarMultiweekView CalendarMonthView + +// Wrap in a block to prevent leaking to window scope. +{ + var { cal } = ChromeUtils.import("resource:///modules/calendar/calUtils.jsm"); + + /** + * The calendar view for viewing a single day. + * + * @augments {MozElements.CalendarMultidayBaseView} + * @implements {calICalendarView} + */ + class CalendarDayView extends MozElements.CalendarMultidayBaseView { + get observerID() { + return "day-view-observer"; + } + + get supportsWorkdaysOnly() { + return false; + } + + goToDay(date) { + if (!date) { + this.relayout(); + return; + } + const timezoneDate = date.getInTimezone(this.timezone); + this.setDateRange(timezoneDate, timezoneDate); + this.selectedDay = timezoneDate; + } + + moveView(number) { + if (number) { + const currentDay = this.startDay.clone(); + currentDay.day += number; + this.goToDay(currentDay); + } else { + this.goToDay(cal.dtz.now()); + } + } + } + + MozXULElement.implementCustomInterface(CalendarDayView, [Ci.calICalendarView]); + + customElements.define("calendar-day-view", CalendarDayView); + + /** + * The calendar view for viewing a single week. + * + * @augments {MozElements.CalendarMultidayBaseView} + * @implements {calICalendarView} + */ + class CalendarWeekView extends MozElements.CalendarMultidayBaseView { + get observerID() { + return "week-view-observer"; + } + + goToDay(date) { + this.displayDaysOff = !this.mWorkdaysOnly; + + if (!date) { + this.relayout(); + return; + } + date = date.getInTimezone(this.timezone); + const weekStart = cal.weekInfoService.getStartOfWeek(date); + const weekEnd = weekStart.clone(); + weekEnd.day += 6; + this.setDateRange(weekStart, weekEnd); + this.selectedDay = date; + } + + moveView(number) { + if (number) { + const date = this.selectedDay.clone(); + date.day += 7 * number; + this.goToDay(date); + } else { + this.goToDay(cal.dtz.now()); + } + } + } + + MozXULElement.implementCustomInterface(CalendarWeekView, [Ci.calICalendarView]); + + customElements.define("calendar-week-view", CalendarWeekView); + + /** + * The calendar view for viewing multiple weeks. + * + * @augments {MozElements.CalendarMonthBaseView} + * @implements {calICalendarView} + */ + class CalendarMultiweekView extends MozElements.CalendarMonthBaseView { + connectedCallback() { + if (this.delayConnectedCallback() || this.hasConnected) { + return; + } + // this.hasConnected is set to true via super.connectedCallback. + super.connectedCallback(); + + this.mWeeksInView = Services.prefs.getIntPref("calendar.weeks.inview", 4); + } + + set weeksInView(weeks) { + this.mWeeksInView = weeks; + Services.prefs.setIntPref("calendar.weeks.inview", Number(weeks)); + this.refreshView(); + } + + get weeksInView() { + return this.mWeeksInView; + } + + get supportsZoom() { + return true; + } + + get observerID() { + return "multiweek-view-observer"; + } + + zoomIn(level = 1) { + const visibleWeeks = level + Services.prefs.getIntPref("calendar.weeks.inview", 4); + + Services.prefs.setIntPref("calendar.weeks.inview", Math.min(visibleWeeks, 6)); + } + + zoomOut(level = 1) { + const visibleWeeks = level + Services.prefs.getIntPref("calendar.weeks.inview", 4); + + Services.prefs.setIntPref("calendar.weeks.inview", Math.max(visibleWeeks, 2)); + } + + zoomReset() { + Services.prefs.setIntPref("calendar.view.visiblehours", 4); + } + + goToDay(date) { + this.showFullMonth = false; + this.displayDaysOff = !this.mWorkdaysOnly; + + // If date is null it means that only a refresh is needed + // without changing the start and end of the view. + if (date) { + date = date.getInTimezone(this.timezone); + + // Get the first date that should be shown. This is the + // start of the week of the day that we're centering around + // adjusted for the day the week starts on and the number + // of previous weeks we're supposed to display. + const dayStart = cal.weekInfoService.getStartOfWeek(date); + dayStart.day -= 7 * Services.prefs.getIntPref("calendar.previousweeks.inview", 0); + + // The last day we're supposed to show. + const dayEnd = dayStart.clone(); + dayEnd.day += 7 * this.mWeeksInView - 1; + this.setDateRange(dayStart, dayEnd); + this.selectedDay = date; + } else { + this.relayout(); + } + } + + moveView(weeksToMove) { + if (weeksToMove) { + const date = this.startDay.clone(); + const savedSelectedDay = this.selectedDay.clone(); + // weeksToMove only corresponds to the number of weeks to move + // make sure to compensate for previous weeks in view too. + const prevWeeks = Services.prefs.getIntPref("calendar.previousweeks.inview", 4); + date.day += 7 * (weeksToMove + prevWeeks); + this.goToDay(date); + savedSelectedDay.day += 7 * weeksToMove; + this.selectedDay = savedSelectedDay; + } else { + const date = cal.dtz.now(); + this.goToDay(date); + this.selectedDay = date; + } + } + } + + MozXULElement.implementCustomInterface(CalendarMultiweekView, [Ci.calICalendarView]); + + customElements.define("calendar-multiweek-view", CalendarMultiweekView); + + /** + * The calendar view for viewing a single month. + * + * @augments {MozElements.CalendarMonthBaseView} + * @implements {calICalendarView} + */ + class CalendarMonthView extends MozElements.CalendarMonthBaseView { + connectedCallback() { + if (this.delayConnectedCallback() || this.hasConnected) { + return; + } + // this.hasConnected is set to true via super.connectedCallback. + super.connectedCallback(); + } + + // calICalendarView Methods and Properties. + + get observerID() { + return "month-view-observer"; + } + + goToDay(date) { + this.displayDaysOff = !this.mWorkdaysOnly; + + this.showDate(date ? date.getInTimezone(this.timezone) : null); + if (!date) { + this.setDateBoxRelations(); + } + } + + getRangeDescription() { + const monthName = cal.l10n.formatMonth( + this.rangeStartDate.month + 1, + "calendar", + "monthInYear" + ); + + return cal.l10n.getCalString("monthInYear", [monthName, this.rangeStartDate.year]); + } + + moveView(number) { + const dates = this.getDateList(); + this.displayDaysOff = !this.mWorkdaysOnly; + + if (number) { + // The first few dates in this list are likely in the month + // prior to the one actually being shown (since the month + // probably doesn't start on a Sunday). The 7th item must + // be in correct month though. + const date = dates[6].clone(); + + date.month += number; + // Store selected day before we move. + const oldSelectedDay = this.selectedDay; + + this.goToDay(date); + + // Most of the time we want to select the date with the + // same day number in the next month. + const newSelectedDay = oldSelectedDay.clone(); + newSelectedDay.month += number; + + // Correct for accidental rollover into the next month. + if ((newSelectedDay.month - number + 12) % 12 != oldSelectedDay.month) { + newSelectedDay.month -= 1; + newSelectedDay.day = newSelectedDay.endOfMonth.day; + } + + this.selectedDay = newSelectedDay; + } else { + const date = cal.dtz.now(); + this.goToDay(date); + this.selectedDay = date; + } + } + + // End calICalendarView Methods and Properties. + } + + MozXULElement.implementCustomInterface(CalendarMonthView, [Ci.calICalendarView]); + + customElements.define("calendar-month-view", CalendarMonthView); +} |