From b4058c5257b2040fea23fcd172e1f85760978a76 Mon Sep 17 00:00:00 2001 From: Dan Gowans Date: Fri, 16 Sep 2022 15:06:11 -0400 Subject: [PATCH] support work order calendar --- handlers/api-get/milestoneICS.js | 17 ++++++++-- handlers/api-get/milestoneICS.ts | 31 ++++++++++++++----- .../getWorkOrderMilestones.d.ts | 2 +- .../lotOccupancyDB/getWorkOrderMilestones.ts | 2 +- views/workOrder-outlook.ejs | 8 ++++- views/workOrder-view.ejs | 29 ++++++++++++++++- 6 files changed, 74 insertions(+), 15 deletions(-) diff --git a/handlers/api-get/milestoneICS.js b/handlers/api-get/milestoneICS.js index 40f57764..c58ba596 100644 --- a/handlers/api-get/milestoneICS.js +++ b/handlers/api-get/milestoneICS.js @@ -12,16 +12,27 @@ export const handler = (request, response) => { ? "" : ":" + configFunctions.getProperty("application.httpPort")) + configFunctions.getProperty("reverseProxy.urlPrefix"); - const workOrderMilestones = getWorkOrderMilestones({ - workOrderMilestoneDateFilter: "recent", + const workOrderMilestoneFilters = { workOrderTypeIds: request.query.workOrderTypeIds, workOrderMilestoneTypeIds: request.query .workOrderMilestoneTypeIds - }, { includeWorkOrders: true, orderBy: "date" }); + }; + if (request.query.workOrderId) { + workOrderMilestoneFilters.workOrderId = request.query + .workOrderId; + } + else { + workOrderMilestoneFilters.workOrderMilestoneDateFilter = "recent"; + } + const workOrderMilestones = getWorkOrderMilestones(workOrderMilestoneFilters, { includeWorkOrders: true, orderBy: "date" }); const calendar = ical({ name: "Work Order Milestone Calendar", url: urlRoot + "/workOrders" }); + if (request.query.workOrderId && workOrderMilestones.length > 0) { + calendar.name("Work Order #" + workOrderMilestones[0].workOrder.workOrderNumber); + calendar.url(urlRoot + "/workOrders/" + workOrderMilestones[0].workOrderId); + } calendar.prodId({ company: "cityssm.github.io", product: configFunctions.getProperty("application.applicationName") diff --git a/handlers/api-get/milestoneICS.ts b/handlers/api-get/milestoneICS.ts index bfc2e4ad..24f7f7fb 100644 --- a/handlers/api-get/milestoneICS.ts +++ b/handlers/api-get/milestoneICS.ts @@ -2,10 +2,12 @@ import ical, { ICalEventData, ICalEventStatus } from "ical-generator"; -import { getWorkOrderMilestones } from "../../helpers/lotOccupancyDB/getWorkOrderMilestones.js"; +import { + getWorkOrderMilestones, + WorkOrderMilestoneFilters +} from "../../helpers/lotOccupancyDB/getWorkOrderMilestones.js"; import type { RequestHandler } from "express"; -import { dateIntegerToString } from "@cityssm/expressjs-server-js/dateTimeFns.js"; import * as configFunctions from "../../helpers/functions.config.js"; @@ -27,13 +29,21 @@ export const handler: RequestHandler = (request, response) => { : ":" + configFunctions.getProperty("application.httpPort")) + configFunctions.getProperty("reverseProxy.urlPrefix"); + const workOrderMilestoneFilters: WorkOrderMilestoneFilters = { + workOrderTypeIds: request.query.workOrderTypeIds as string, + workOrderMilestoneTypeIds: request.query + .workOrderMilestoneTypeIds as string + }; + + if (request.query.workOrderId) { + workOrderMilestoneFilters.workOrderId = request.query + .workOrderId as string; + } else { + workOrderMilestoneFilters.workOrderMilestoneDateFilter = "recent"; + } + const workOrderMilestones = getWorkOrderMilestones( - { - workOrderMilestoneDateFilter: "recent", - workOrderTypeIds: request.query.workOrderTypeIds as string, - workOrderMilestoneTypeIds: request.query - .workOrderMilestoneTypeIds as string - }, + workOrderMilestoneFilters, { includeWorkOrders: true, orderBy: "date" } ); @@ -42,6 +52,11 @@ export const handler: RequestHandler = (request, response) => { url: urlRoot + "/workOrders" }); + if (request.query.workOrderId && workOrderMilestones.length > 0) { + calendar.name("Work Order #" + workOrderMilestones[0].workOrder.workOrderNumber); + calendar.url(urlRoot + "/workOrders/" + workOrderMilestones[0].workOrderId); + } + calendar.prodId({ company: "cityssm.github.io", product: configFunctions.getProperty("application.applicationName") diff --git a/helpers/lotOccupancyDB/getWorkOrderMilestones.d.ts b/helpers/lotOccupancyDB/getWorkOrderMilestones.d.ts index 4581b0aa..ae85bfea 100644 --- a/helpers/lotOccupancyDB/getWorkOrderMilestones.d.ts +++ b/helpers/lotOccupancyDB/getWorkOrderMilestones.d.ts @@ -1,6 +1,6 @@ import sqlite from "better-sqlite3"; import type * as recordTypes from "../../types/recordTypes"; -interface WorkOrderMilestoneFilters { +export interface WorkOrderMilestoneFilters { workOrderId?: number | string; workOrderMilestoneDateFilter?: "upcomingMissed" | "recent" | "date"; workOrderMilestoneDateString?: string; diff --git a/helpers/lotOccupancyDB/getWorkOrderMilestones.ts b/helpers/lotOccupancyDB/getWorkOrderMilestones.ts index 6fd7d6b1..a1d6fb28 100644 --- a/helpers/lotOccupancyDB/getWorkOrderMilestones.ts +++ b/helpers/lotOccupancyDB/getWorkOrderMilestones.ts @@ -15,7 +15,7 @@ import * as configFunctions from "../functions.config.js"; import type * as recordTypes from "../../types/recordTypes"; -interface WorkOrderMilestoneFilters { +export interface WorkOrderMilestoneFilters { workOrderId?: number | string; workOrderMilestoneDateFilter?: "upcomingMissed" | "recent" | "date"; workOrderMilestoneDateString?: string; diff --git a/views/workOrder-outlook.ejs b/views/workOrder-outlook.ejs index 7d4170f2..8147e1f4 100644 --- a/views/workOrder-outlook.ejs +++ b/views/workOrder-outlook.ejs @@ -27,8 +27,14 @@
-

Outlook Calendar (ICS) Integration

+

Work Order Milestone Calendar (ICS)

+
+

+ Recent milestones can be exported in the iCalendar format. + They can then imported into Outlook as Internet calendars that can be regularly refreshed. +

+
diff --git a/views/workOrder-view.ejs b/views/workOrder-view.ejs index fbf5fada..709523ca 100644 --- a/views/workOrder-view.ejs +++ b/views/workOrder-view.ejs @@ -214,7 +214,34 @@ <% if (workOrder.workOrderMilestones.length > 0) { %>
-

Milestones

+
+
+
+
+

Milestones

+
+
+
+
+ +
+
+
+
<% for (const milestone of workOrder.workOrderMilestones) { %>