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())
}