Skip to content

Commit 728e578

Browse files
musalesebastienlevertMnickii
authored
fix: correctly render date times based on user time and preferred timezone (#1515)
* Change ms value for setHours in agenda date property * Set hours to 24 and assume the default values of the others * WIP: add timezone offset * Use a local ISO 8601 string for dates * Remove unnecessary console text * Remove the timezone offsets to use UTC by default * Change to const for un-reassigned variables * Change wording of dateToLocalISO return value * Display the time from the server as it is in the string * Update packages/mgt-components/src/components/mgt-agenda/mgt-agenda.ts Co-authored-by: Sébastien Levert <[email protected]> * Fix prettier issues generated from upstream code changes * fix: set start date hours to 12AM * fix: remove local ISO time conversion * fix: retain hours as interpreted from date attribute * refactor: remove unused code blocks * fix: stop sending the preferred-timezone header Instead, use the preferred-timezone value on the client with the toLocale* date api. This localizes the date and time string on the client side. The dates are all by default in UTC * fix: add a Z in UTC time strings This fixes the offset issue * fix: add a Z in UTC time strings This fixes the offset issue * refactor: use timeStyle and dateStyle to customize format output Co-authored-by: Sébastien Levert <[email protected]> Co-authored-by: Nickii Miaro <[email protected]>
1 parent 37d1add commit 728e578

File tree

2 files changed

+17
-61
lines changed

2 files changed

+17
-61
lines changed

packages/mgt-components/src/components/mgt-agenda/mgt-agenda.graph.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,11 @@ import * as MicrosoftGraph from '@microsoft/microsoft-graph-types';
1818
* @returns {(Promise<Event[]>)}
1919
* @memberof Graph
2020
*/
21-
export function getEventsPageIterator(
21+
export async function getEventsPageIterator(
2222
graph: IGraph,
2323
startDateTime: Date,
2424
endDateTime: Date,
25-
groupId?: string,
26-
preferredTimezone?: string
25+
groupId?: string
2726
): Promise<GraphPageIterator<MicrosoftGraph.Event>> {
2827
const scopes = 'calendars.read';
2928

@@ -42,9 +41,5 @@ export function getEventsPageIterator(
4241

4342
let request = graph.api(uri).middlewareOptions(prepScopes(scopes)).orderby('start/dateTime');
4443

45-
if (preferredTimezone) {
46-
request = request.header('Prefer', `outlook.timezone="${preferredTimezone}"`);
47-
}
48-
4944
return GraphPageIterator.create<MicrosoftGraph.Event>(graph, request);
5045
}

packages/mgt-components/src/components/mgt-agenda/mgt-agenda.ts

Lines changed: 15 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,6 @@ export class MgtAgenda extends MgtTemplatedComponent {
353353
<div class="event-other-container">${this.renderOther(event)}</div>
354354
</div>
355355
`;
356-
// <div class="event-duration">${this.getEventDuration(event)}</div>
357356
}
358357

359358
/**
@@ -460,8 +459,10 @@ export class MgtAgenda extends MgtTemplatedComponent {
460459
const grouped = {};
461460

462461
events.forEach(event => {
463-
var eventDate = new Date(event.start.dateTime);
464-
var dateString = eventDate.toISOString().replace('Z', '');
462+
let dateString = event?.start?.dateTime;
463+
if (event.end.timeZone === 'UTC') {
464+
dateString += 'Z';
465+
}
465466

466467
const header = this.getDateHeaderFromDateTimeString(dateString);
467468
grouped[header] = grouped[header] || [];
@@ -574,16 +575,12 @@ export class MgtAgenda extends MgtTemplatedComponent {
574575
query = this.eventQuery;
575576
}
576577

577-
let request = await graph.api(query);
578+
let request = graph.api(query);
578579

579580
if (scope) {
580581
request = request.middlewareOptions(prepScopes(scope));
581582
}
582583

583-
if (this.preferredTimezone) {
584-
request = request.header('Prefer', `outlook.timezone="${this.preferredTimezone}"`);
585-
}
586-
587584
const results = await request.get();
588585

589586
if (results && results.value) {
@@ -593,12 +590,11 @@ export class MgtAgenda extends MgtTemplatedComponent {
593590
} catch (e) {}
594591
} else {
595592
const start = this.date ? new Date(this.date) : new Date();
596-
start.setHours(0, 0, 0, 0);
597593
const end = new Date(start.getTime());
598594
end.setDate(start.getDate() + this.days);
599-
try {
600-
const iterator = await getEventsPageIterator(graph, start, end, this.groupId, this.preferredTimezone);
601595

596+
try {
597+
const iterator = await getEventsPageIterator(graph, start, end, this.groupId);
602598
if (iterator && iterator.value) {
603599
events = iterator.value;
604600

@@ -617,52 +613,17 @@ export class MgtAgenda extends MgtTemplatedComponent {
617613
}
618614

619615
private prettyPrintTimeFromDateTime(date: Date) {
620-
let hours = date.getHours();
621-
const minutes = date.getMinutes();
622-
const ampm = hours >= 12 ? 'PM' : 'AM';
623-
hours = hours % 12;
624-
hours = hours ? hours : 12;
625-
const minutesStr = minutes < 10 ? '0' + minutes : minutes;
626-
return `${hours}:${minutesStr} ${ampm}`;
616+
return date.toLocaleTimeString(navigator.language, {
617+
timeStyle: 'short',
618+
timeZone: this.preferredTimezone
619+
});
627620
}
628621

629622
private getDateHeaderFromDateTimeString(dateTimeString: string) {
630623
const date = new Date(dateTimeString);
631-
date.setMinutes(date.getMinutes() - date.getTimezoneOffset());
632-
633-
const dayIndex = date.getDay();
634-
const monthIndex = date.getMonth();
635-
const day = date.getDate();
636-
const year = date.getFullYear();
637-
638-
return `${getDayOfWeekString(dayIndex)}, ${getMonthString(monthIndex)} ${day}, ${year}`;
639-
}
640-
641-
private getEventDuration(event: MicrosoftGraph.Event) {
642-
let dtStart = new Date(event.start.dateTime);
643-
const dtEnd = new Date(event.end.dateTime);
644-
const dtNow = new Date();
645-
let result: string = '';
646-
647-
if (dtNow > dtStart) {
648-
dtStart = dtNow;
649-
}
650-
651-
const diff = dtEnd.getTime() - dtStart.getTime();
652-
const durationMinutes = Math.round(diff / 60000);
653-
654-
if (durationMinutes > 1440 || event.isAllDay) {
655-
result = Math.ceil(durationMinutes / 1440) + 'd';
656-
} else if (durationMinutes > 60) {
657-
result = Math.round(durationMinutes / 60) + 'h';
658-
const leftoverMinutes = durationMinutes % 60;
659-
if (leftoverMinutes) {
660-
result += leftoverMinutes + 'm';
661-
}
662-
} else {
663-
result = durationMinutes + 'm';
664-
}
665-
666-
return result;
624+
return date.toLocaleDateString(navigator.language, {
625+
dateStyle: 'full',
626+
timeZone: this.preferredTimezone
627+
});
667628
}
668629
}

0 commit comments

Comments
 (0)