Skip to content

Commit ab4b073

Browse files
author
mup
committed
Adds three days view to Calendar
This commits creates a new view to Calendar, adding three day view and change the icon for Week View, making it easier to recognize both views.
1 parent dbbf01a commit ab4b073

File tree

11 files changed

+202
-42
lines changed

11 files changed

+202
-42
lines changed

src/calendar-app/calendar/gui/CalendarGuiUtils.ts

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,19 @@ function weekTitle(date: Date, weekStart: WeekStart): string {
122122
}
123123
}
124124

125+
function shortWeekTitle(date: Date, weekStart: WeekStart): string {
126+
const lastDate = incrementDate(new Date(date), 2)
127+
128+
if (date.getMonth() !== lastDate.getMonth()) {
129+
if (date.getFullYear() !== lastDate.getFullYear()) {
130+
return `${lang.formats.monthShortWithFullYear.format(date)} - ${lang.formats.monthShortWithFullYear.format(lastDate)}`
131+
}
132+
return `${lang.formats.monthShort.format(date)} - ${lang.formats.monthShort.format(lastDate)} ${lang.formats.yearNumeric.format(date)}`
133+
} else {
134+
return `${lang.formats.monthLong.format(date)} ${lang.formats.yearNumeric.format(date)}`
135+
}
136+
}
137+
125138
export function getNextFourteenDays(startOfToday: Date): Array<Date> {
126139
let calculationDate = new Date(startOfToday)
127140
const days: Date[] = []
@@ -183,6 +196,12 @@ export function calendarNavConfiguration(
183196
forward: renderCalendarSwitchRightButton("nextDay_label", onForward),
184197
title: titleType === "short" ? formatMonthWithFullYear(date) : formatDateWithWeekday(date),
185198
}
199+
case CalendarViewType.THREE_DAY:
200+
return {
201+
back: renderCalendarSwitchLeftButton("prevThreeDays_label", onBack),
202+
forward: renderCalendarSwitchRightButton("nextThreeDays_label", onForward),
203+
title: shortWeekTitle(date, weekStart),
204+
}
186205
}
187206
}
188207

@@ -255,7 +274,8 @@ export const SELECTED_DATE_INDICATOR_THICKNESS = 4
255274
export function getIconForViewType(viewType: CalendarViewType): AllIcons {
256275
const lookupTable: Record<CalendarViewType, AllIcons> = {
257276
[CalendarViewType.DAY]: Icons.TableSingle,
258-
[CalendarViewType.WEEK]: Icons.TableColumns,
277+
[CalendarViewType.THREE_DAY]: Icons.TableColumns,
278+
[CalendarViewType.WEEK]: Icons.Week,
259279
[CalendarViewType.MONTH]: Icons.Table,
260280
[CalendarViewType.AGENDA]: Icons.ListUnordered,
261281
}
@@ -926,6 +946,10 @@ export function daysHaveEvents(eventsOnDays: EventsOnDays): boolean {
926946
return eventsOnDays.shortEventsPerDay.some(isNotEmpty) || isNotEmpty(eventsOnDays.longEvents)
927947
}
928948

949+
export function daysHaveAllDayEvents(eventsOnDays: EventsOnDays): boolean {
950+
return isNotEmpty(eventsOnDays.longEvents)
951+
}
952+
929953
/**
930954
* A handler for `onwheel` to move to a forwards or previous view based on mouse wheel movement
931955
* @returns a function to be used by `onwheel`

src/calendar-app/calendar/view/CalendarDesktopToolbar.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,11 @@ export class CalendarDesktopToolbar implements Component<CalendarDesktopToolbarA
5454
label: "day_label",
5555
value: CalendarViewType.DAY,
5656
},
57+
{
58+
icon: getIconForViewType(CalendarViewType.THREE_DAY),
59+
label: "threeDays_label",
60+
value: CalendarViewType.THREE_DAY,
61+
},
5762
{
5863
icon: getIconForViewType(CalendarViewType.WEEK),
5964
label: "week_label",

src/calendar-app/calendar/view/CalendarMobileHeader.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,10 @@ export class CalendarMobileHeader implements Component<CalendarMobileHeaderAttrs
142142
name: "day_label",
143143
value: CalendarViewType.DAY,
144144
},
145+
{
146+
name: "threeDays_label",
147+
value: CalendarViewType.THREE_DAY,
148+
},
145149
{
146150
name: "week_label",
147151
value: CalendarViewType.WEEK,

src/calendar-app/calendar/view/CalendarView.ts

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,7 @@ export class CalendarView extends BaseTopLevelView implements TopLevelView<Calen
301301
scrollPosition: this.viewModel.getScrollPosition(),
302302
onScrollPositionChange: (newPosition: number) => this.viewModel.setScrollPosition(newPosition),
303303
onViewChanged: (vnode) => this.viewModel.setViewParameters(vnode.dom as HTMLElement),
304+
currentViewType: this.currentViewType,
304305
}),
305306
floatingActionButton: this.renderFab.bind(this),
306307
})
@@ -334,6 +335,41 @@ export class CalendarView extends BaseTopLevelView implements TopLevelView<Calen
334335
scrollPosition: this.viewModel.getScrollPosition(),
335336
onScrollPositionChange: (newPosition: number) => this.viewModel.setScrollPosition(newPosition),
336337
onViewChanged: (vnode) => this.viewModel.setViewParameters(vnode.dom as HTMLElement),
338+
currentViewType: this.currentViewType,
339+
}),
340+
floatingActionButton: this.renderFab.bind(this),
341+
})
342+
343+
case CalendarViewType.THREE_DAY:
344+
return m(BackgroundColumnLayout, {
345+
backgroundColor: theme.navigation_bg,
346+
desktopToolbar: () => this.renderDesktopToolbar(),
347+
mobileHeader: () => this.renderMobileHeader(attrs.header),
348+
columnLayout: m(MultiDayCalendarView, {
349+
temporaryEvents: this.viewModel.temporaryEvents,
350+
getEventsOnDays: this.viewModel.getEventsOnDaysToRender.bind(this.viewModel),
351+
daysInPeriod: 3,
352+
onEventClicked: (event, domEvent) => this.onEventSelected(event, domEvent, this.htmlSanitizer),
353+
onEventKeyDown: this.handleEventKeyDown(),
354+
onNewEvent: (date) => {
355+
this.createNewEventDialog(date)
356+
},
357+
selectedDate: this.viewModel.selectedDate(),
358+
onDateSelected: (date, viewType) => {
359+
this.viewModel.selectedDate(date)
360+
this.setUrl(viewType ?? CalendarViewType.THREE_DAY, date)
361+
},
362+
startOfTheWeek: downcast(locator.logins.getUserController().userSettingsGroupRoot.startOfTheWeek),
363+
groupColors: this.viewModel.calendarColors,
364+
onChangeViewPeriod: (next) => this.viewPeriod(CalendarViewType.THREE_DAY, next),
365+
dragHandlerCallbacks: this.viewModel,
366+
isDaySelectorExpanded: this.viewModel.isDaySelectorExpanded(),
367+
weekIndicator: calendarWeek(this.viewModel.selectedDate(), this.viewModel.weekStart),
368+
selectedTime: this.viewModel.selectedTime,
369+
scrollPosition: this.viewModel.getScrollPosition(),
370+
onScrollPositionChange: (newPosition: number) => this.viewModel.setScrollPosition(newPosition),
371+
onViewChanged: (vnode) => this.viewModel.setViewParameters(vnode.dom as HTMLElement),
372+
currentViewType: this.currentViewType,
337373
}),
338374
floatingActionButton: this.renderFab.bind(this),
339375
})
@@ -472,11 +508,12 @@ export class CalendarView extends BaseTopLevelView implements TopLevelView<Calen
472508
}
473509

474510
private renderMobileHeader(header: AppHeaderAttrs) {
511+
const isExpandable = !styles.isDesktopLayout() && this.currentViewType !== CalendarViewType.MONTH && this.currentViewType !== CalendarViewType.THREE_DAY
475512
return m(CalendarMobileHeader, {
476513
...header,
477514
viewType: this.currentViewType,
478515
viewSlider: this.viewSlider,
479-
showExpandIcon: !styles.isDesktopLayout() && this.currentViewType !== CalendarViewType.MONTH,
516+
showExpandIcon: isExpandable,
480517
isDaySelectorExpanded: this.viewModel.isDaySelectorExpanded(),
481518
navConfiguration: calendarNavConfiguration(
482519
this.currentViewType,
@@ -498,7 +535,7 @@ export class CalendarView extends BaseTopLevelView implements TopLevelView<Calen
498535
return
499536
}
500537

501-
if (!styles.isDesktopLayout() && this.currentViewType !== CalendarViewType.MONTH) {
538+
if (isExpandable) {
502539
if (this.viewModel.isDaySelectorExpanded()) {
503540
this.viewModel.setDaySelectorExpanded(false)
504541
}
@@ -543,6 +580,11 @@ export class CalendarView extends BaseTopLevelView implements TopLevelView<Calen
543580
},
544581
{
545582
key: Keys.THREE,
583+
exec: () => this.setUrl(CalendarViewType.THREE_DAY, this.viewModel.selectedDate()),
584+
help: "switchAgendaView_action",
585+
},
586+
{
587+
key: Keys.FOUR,
546588
exec: () => this.setUrl(CalendarViewType.AGENDA, this.viewModel.selectedDate()),
547589
help: "switchAgendaView_action",
548590
},
@@ -653,7 +695,12 @@ export class CalendarView extends BaseTopLevelView implements TopLevelView<Calen
653695
}
654696
unit = "week"
655697
break
656-
698+
case CalendarViewType.THREE_DAY:
699+
duration = {
700+
day: 3,
701+
}
702+
unit = "day"
703+
break
657704
case CalendarViewType.DAY:
658705
duration = {
659706
day: 1,
@@ -1096,7 +1143,6 @@ export class CalendarView extends BaseTopLevelView implements TopLevelView<Calen
10961143
this.setUrl(this.currentViewType, this.viewModel.selectedDate(), true)
10971144
} else {
10981145
this.currentViewType = CalendarViewTypeByValue[args.view as CalendarViewType] ? args.view : CalendarViewType.MONTH
1099-
11001146
const urlDateParam = args.date
11011147

11021148
if (urlDateParam) {

0 commit comments

Comments
 (0)