feat: add calendar subscription token functionality and ICS generation
- Introduced a new database model for calendar subscription tokens, allowing users to generate unique tokens for accessing their personal calendar. - Implemented API endpoint to return ICS files containing only the subscribing user's duties, enhancing user experience with personalized calendar access. - Added utility functions for generating ICS files from user duties, ensuring proper formatting and timezone handling. - Updated command handlers to support the new calendar link feature, providing users with easy access to their personal calendar subscriptions. - Included unit tests for the new functionality, ensuring reliability and correctness of token generation and ICS file creation.
This commit is contained in:
@@ -91,25 +91,27 @@ export function buildDayDetailContent(dateKey, duties, eventSummaries) {
|
||||
}
|
||||
|
||||
if (unavailableList.length > 0) {
|
||||
const uniqueUnavailable = [...new Set(unavailableList.map((d) => d.full_name || "").filter(Boolean))];
|
||||
html +=
|
||||
'<section class="day-detail-section day-detail-section--unavailable">' +
|
||||
'<h3 class="day-detail-section-title">' +
|
||||
escapeHtml(t(lang, "event_type.unavailable")) +
|
||||
"</h3><ul class=\"day-detail-list\">";
|
||||
unavailableList.forEach((d) => {
|
||||
html += "<li>" + escapeHtml(d.full_name || "") + "</li>";
|
||||
uniqueUnavailable.forEach((name) => {
|
||||
html += "<li>" + escapeHtml(name) + "</li>";
|
||||
});
|
||||
html += "</ul></section>";
|
||||
}
|
||||
|
||||
if (vacationList.length > 0) {
|
||||
const uniqueVacation = [...new Set(vacationList.map((d) => d.full_name || "").filter(Boolean))];
|
||||
html +=
|
||||
'<section class="day-detail-section day-detail-section--vacation">' +
|
||||
'<h3 class="day-detail-section-title">' +
|
||||
escapeHtml(t(lang, "event_type.vacation")) +
|
||||
"</h3><ul class=\"day-detail-list\">";
|
||||
vacationList.forEach((d) => {
|
||||
html += "<li>" + escapeHtml(d.full_name || "") + "</li>";
|
||||
uniqueVacation.forEach((name) => {
|
||||
html += "<li>" + escapeHtml(name) + "</li>";
|
||||
});
|
||||
html += "</ul></section>";
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user