support work order calendar

deepsource-autofix-76c6eb20
Dan Gowans 2022-09-16 15:06:11 -04:00
parent 0143823358
commit b4058c5257
6 changed files with 74 additions and 15 deletions

View File

@ -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")

View File

@ -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 workOrderMilestones = getWorkOrderMilestones(
{
workOrderMilestoneDateFilter: "recent",
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(
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")

View File

@ -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;

View File

@ -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;

View File

@ -27,8 +27,14 @@
</h1>
<div class="panel" id="panel--icsFilters">
<h2 class="panel-heading">Outlook Calendar (ICS) Integration</h2>
<h2 class="panel-heading">Work Order Milestone Calendar (ICS)</h2>
<div class="panel-block is-block">
<div class="message is-info">
<p class="message-body">
Recent milestones can be exported in the iCalendar format.
They can then imported into Outlook as Internet calendars that can be regularly refreshed.
</p>
</div>
<div class="columns">
<div class="column">
<label class="label" for="icsFilters--workOrderTypeIds">Work Order Types</label>

View File

@ -214,7 +214,34 @@
<% if (workOrder.workOrderMilestones.length > 0) { %>
<div class="column is-4">
<div class="panel">
<h2 class="panel-heading">Milestones</h2>
<div class="panel-heading">
<div class="level">
<div class="level-left">
<div class="level-item">
<h2 class="title is-5 has-text-weight-bold">Milestones</h2>
</div>
</div>
<div class="level-right">
<div class="level-item">
<div class="dropdown is-right has-text-weight-normal">
<div class="dropdown-trigger">
<button class="button" type="button" aria-label="Options">
<i class="fas fa-ellipsis-v" aria-hidden="true"></i>
</button>
</div>
<div class="dropdown-menu">
<div class="dropdown-content">
<a class="dropdown-item" href="<%= urlPrefix %>/api/<%= user.userProperties.apiKey %>/milestoneICS/?workOrderId=<%= workOrder.workOrderId %>">
<span class="icon is-small"><i class="fas fa-calendar" aria-hidden="true"></i></span>
<span>Download iCalendar</span>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<% for (const milestone of workOrder.workOrderMilestones) { %>
<div class="panel-block is-block">
<div class="columns">