support work order calendar
parent
0143823358
commit
b4058c5257
|
|
@ -12,16 +12,27 @@ export const handler = (request, response) => {
|
||||||
? ""
|
? ""
|
||||||
: ":" + configFunctions.getProperty("application.httpPort")) +
|
: ":" + configFunctions.getProperty("application.httpPort")) +
|
||||||
configFunctions.getProperty("reverseProxy.urlPrefix");
|
configFunctions.getProperty("reverseProxy.urlPrefix");
|
||||||
const workOrderMilestones = getWorkOrderMilestones({
|
const workOrderMilestoneFilters = {
|
||||||
workOrderMilestoneDateFilter: "recent",
|
|
||||||
workOrderTypeIds: request.query.workOrderTypeIds,
|
workOrderTypeIds: request.query.workOrderTypeIds,
|
||||||
workOrderMilestoneTypeIds: request.query
|
workOrderMilestoneTypeIds: request.query
|
||||||
.workOrderMilestoneTypeIds
|
.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({
|
const calendar = ical({
|
||||||
name: "Work Order Milestone Calendar",
|
name: "Work Order Milestone Calendar",
|
||||||
url: urlRoot + "/workOrders"
|
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({
|
calendar.prodId({
|
||||||
company: "cityssm.github.io",
|
company: "cityssm.github.io",
|
||||||
product: configFunctions.getProperty("application.applicationName")
|
product: configFunctions.getProperty("application.applicationName")
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,12 @@
|
||||||
|
|
||||||
import ical, { ICalEventData, ICalEventStatus } from "ical-generator";
|
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 type { RequestHandler } from "express";
|
||||||
import { dateIntegerToString } from "@cityssm/expressjs-server-js/dateTimeFns.js";
|
|
||||||
|
|
||||||
import * as configFunctions from "../../helpers/functions.config.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("application.httpPort")) +
|
||||||
configFunctions.getProperty("reverseProxy.urlPrefix");
|
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(
|
const workOrderMilestones = getWorkOrderMilestones(
|
||||||
{
|
workOrderMilestoneFilters,
|
||||||
workOrderMilestoneDateFilter: "recent",
|
|
||||||
workOrderTypeIds: request.query.workOrderTypeIds as string,
|
|
||||||
workOrderMilestoneTypeIds: request.query
|
|
||||||
.workOrderMilestoneTypeIds as string
|
|
||||||
},
|
|
||||||
{ includeWorkOrders: true, orderBy: "date" }
|
{ includeWorkOrders: true, orderBy: "date" }
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -42,6 +52,11 @@ export const handler: RequestHandler = (request, response) => {
|
||||||
url: urlRoot + "/workOrders"
|
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({
|
calendar.prodId({
|
||||||
company: "cityssm.github.io",
|
company: "cityssm.github.io",
|
||||||
product: configFunctions.getProperty("application.applicationName")
|
product: configFunctions.getProperty("application.applicationName")
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import sqlite from "better-sqlite3";
|
import sqlite from "better-sqlite3";
|
||||||
import type * as recordTypes from "../../types/recordTypes";
|
import type * as recordTypes from "../../types/recordTypes";
|
||||||
interface WorkOrderMilestoneFilters {
|
export interface WorkOrderMilestoneFilters {
|
||||||
workOrderId?: number | string;
|
workOrderId?: number | string;
|
||||||
workOrderMilestoneDateFilter?: "upcomingMissed" | "recent" | "date";
|
workOrderMilestoneDateFilter?: "upcomingMissed" | "recent" | "date";
|
||||||
workOrderMilestoneDateString?: string;
|
workOrderMilestoneDateString?: string;
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ import * as configFunctions from "../functions.config.js";
|
||||||
|
|
||||||
import type * as recordTypes from "../../types/recordTypes";
|
import type * as recordTypes from "../../types/recordTypes";
|
||||||
|
|
||||||
interface WorkOrderMilestoneFilters {
|
export interface WorkOrderMilestoneFilters {
|
||||||
workOrderId?: number | string;
|
workOrderId?: number | string;
|
||||||
workOrderMilestoneDateFilter?: "upcomingMissed" | "recent" | "date";
|
workOrderMilestoneDateFilter?: "upcomingMissed" | "recent" | "date";
|
||||||
workOrderMilestoneDateString?: string;
|
workOrderMilestoneDateString?: string;
|
||||||
|
|
|
||||||
|
|
@ -27,8 +27,14 @@
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<div class="panel" id="panel--icsFilters">
|
<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="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="columns">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<label class="label" for="icsFilters--workOrderTypeIds">Work Order Types</label>
|
<label class="label" for="icsFilters--workOrderTypeIds">Work Order Types</label>
|
||||||
|
|
|
||||||
|
|
@ -214,7 +214,34 @@
|
||||||
<% if (workOrder.workOrderMilestones.length > 0) { %>
|
<% if (workOrder.workOrderMilestones.length > 0) { %>
|
||||||
<div class="column is-4">
|
<div class="column is-4">
|
||||||
<div class="panel">
|
<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) { %>
|
<% for (const milestone of workOrder.workOrderMilestones) { %>
|
||||||
<div class="panel-block is-block">
|
<div class="panel-block is-block">
|
||||||
<div class="columns">
|
<div class="columns">
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue