From 69cba312f9d4f65722d9caf84efc15c85b4622a7 Mon Sep 17 00:00:00 2001 From: Dan Gowans Date: Fri, 28 Jun 2024 14:19:25 -0400 Subject: [PATCH] fix broken ical export --- handlers/api-get/milestoneICS.js | 18 ++++++++++-------- handlers/api-get/milestoneICS.ts | 24 ++++++++++++++---------- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/handlers/api-get/milestoneICS.js b/handlers/api-get/milestoneICS.js index 4ee9ec9b..b562c17f 100644 --- a/handlers/api-get/milestoneICS.js +++ b/handlers/api-get/milestoneICS.js @@ -76,7 +76,7 @@ function buildEventDescriptionHTML_occupancies(request, milestone) { `; for (const occupant of occupancy.lotOccupancyOccupants ?? []) { - descriptionHTML += `${escapeHTML(occupant.lotOccupantType)}: ${escapeHTML(occupant.occupantName ?? '')} ${escapeHTML(occupant.occupantFamilyName ?? '')}
`; + descriptionHTML += `${escapeHTML(occupant.lotOccupantType ?? '')}: ${escapeHTML(occupant.occupantName ?? '')} ${escapeHTML(occupant.occupantFamilyName ?? '')}
`; } descriptionHTML += ''; } @@ -155,7 +155,7 @@ function buildEventDescriptionHTML(request, milestone) { function buildEventCategoryList(milestone) { const categories = []; if (milestone.workOrderMilestoneTypeId) { - categories.push(milestone.workOrderMilestoneType, milestone.workOrderType ?? ''); + categories.push(milestone.workOrderMilestoneType ?? '', milestone.workOrderType ?? ''); } if (milestone.workOrderMilestoneCompletionDate) { categories.push('Completed'); @@ -200,7 +200,7 @@ export default async function handler(request, response) { }); if (request.query.workOrderId && workOrderMilestones.length > 0) { calendar.name(`Work Order #${workOrderMilestones[0].workOrderNumber}`); - calendar.url(`${urlRoot}/workOrders/${workOrderMilestones[0].workOrderId.toString()}`); + calendar.url(`${urlRoot}/workOrders/${workOrderMilestones[0].workOrderId?.toString()}`); } calendar.prodId({ company: calendarCompany, @@ -221,9 +221,9 @@ export default async function handler(request, response) { // Create event const eventData = { start: milestoneDate, - created: new Date(milestone.recordCreate_timeMillis), - stamp: new Date(milestone.recordCreate_timeMillis), - lastModified: new Date(Math.max(milestone.recordUpdate_timeMillis, milestone.workOrderRecordUpdate_timeMillis)), + created: new Date(milestone.recordCreate_timeMillis ?? 0), + stamp: new Date(milestone.recordCreate_timeMillis ?? 0), + lastModified: new Date(Math.max(milestone.recordUpdate_timeMillis ?? 0, milestone.workOrderRecordUpdate_timeMillis ?? 0)), allDay: !milestone.workOrderMilestoneTime, summary, url: workOrderUrl @@ -275,10 +275,12 @@ export default async function handler(request, response) { } else { calendarEvent.organizer({ - name: milestone.recordCreate_userName, + name: milestone.recordCreate_userName ?? '', email: getConfigProperty('settings.workOrders.calendarEmailAddress') }); } } - calendar.serve(response); + response.setHeader('Content-Disposition', `inline; filename=calendar.ics`); + response.setHeader('Content-Type', 'text/calendar; charset=utf-8'); + response.send(calendar.toString()); } diff --git a/handlers/api-get/milestoneICS.ts b/handlers/api-get/milestoneICS.ts index 69e72162..e0d550b7 100644 --- a/handlers/api-get/milestoneICS.ts +++ b/handlers/api-get/milestoneICS.ts @@ -115,7 +115,7 @@ function buildEventDescriptionHTML_occupancies( for (const occupant of occupancy.lotOccupancyOccupants ?? []) { descriptionHTML += `${escapeHTML( - occupant.lotOccupantType! + occupant.lotOccupantType ?? '' )}: ${escapeHTML(occupant.occupantName ?? '')} ${escapeHTML( occupant.occupantFamilyName ?? '' )}
` @@ -196,7 +196,7 @@ function buildEventDescriptionHTML_prints( if (printConfig) { descriptionHTML += `

${escapeHTML(printConfig.title)}
- ${urlRoot}/print/${printName}/?workOrderId=${milestone.workOrderId!.toString()} + ${urlRoot}/print/${printName}/?workOrderId=${milestone.workOrderId.toString()}

` } } @@ -229,7 +229,7 @@ function buildEventCategoryList(milestone: WorkOrderMilestone): string[] { if (milestone.workOrderMilestoneTypeId) { categories.push( - milestone.workOrderMilestoneType!, + milestone.workOrderMilestoneType ?? '', milestone.workOrderType ?? '' ) } @@ -292,7 +292,7 @@ export default async function handler( if (request.query.workOrderId && workOrderMilestones.length > 0) { calendar.name(`Work Order #${workOrderMilestones[0].workOrderNumber}`) calendar.url( - `${urlRoot}/workOrders/${workOrderMilestones[0].workOrderId!.toString()}` + `${urlRoot}/workOrders/${workOrderMilestones[0].workOrderId?.toString()}` ) } @@ -330,12 +330,12 @@ export default async function handler( // Create event const eventData: ICalEventData = { start: milestoneDate, - created: new Date(milestone.recordCreate_timeMillis!), - stamp: new Date(milestone.recordCreate_timeMillis!), + created: new Date(milestone.recordCreate_timeMillis ?? 0), + stamp: new Date(milestone.recordCreate_timeMillis ?? 0), lastModified: new Date( Math.max( - milestone.recordUpdate_timeMillis!, - milestone.workOrderRecordUpdate_timeMillis! + milestone.recordUpdate_timeMillis ?? 0, + milestone.workOrderRecordUpdate_timeMillis ?? 0 ) ), allDay: !milestone.workOrderMilestoneTime, @@ -403,11 +403,15 @@ export default async function handler( } } else { calendarEvent.organizer({ - name: milestone.recordCreate_userName!, + name: milestone.recordCreate_userName ?? '', email: getConfigProperty('settings.workOrders.calendarEmailAddress') }) } } - calendar.serve(response) + response.setHeader('Content-Disposition', `inline; filename=calendar.ics`) + + response.setHeader('Content-Type', 'text/calendar; charset=utf-8') + + response.send(calendar.toString()) }