development
- close work order - delete work order - milestone calendardeepsource-autofix-76c6eb20
parent
754cf80a36
commit
f4a6e14dba
1
app.js
1
app.js
|
|
@ -60,6 +60,7 @@ app.use(urlPrefix + "/lib/fa", express.static(path.join("node_modules", "@fortaw
|
||||||
app.use(urlPrefix + "/lib/cityssm-bulma-webapp-js", express.static(path.join("node_modules", "@cityssm", "bulma-webapp-js")));
|
app.use(urlPrefix + "/lib/cityssm-bulma-webapp-js", express.static(path.join("node_modules", "@cityssm", "bulma-webapp-js")));
|
||||||
app.use(urlPrefix + "/lib/cityssm-bulma-js", express.static(path.join("node_modules", "@cityssm", "bulma-js", "dist")));
|
app.use(urlPrefix + "/lib/cityssm-bulma-js", express.static(path.join("node_modules", "@cityssm", "bulma-js", "dist")));
|
||||||
app.use(urlPrefix + "/lib/leaflet", express.static(path.join("node_modules", "leaflet", "dist")));
|
app.use(urlPrefix + "/lib/leaflet", express.static(path.join("node_modules", "leaflet", "dist")));
|
||||||
|
app.use(urlPrefix + "/lib/randomcolor", express.static(path.join("node_modules", "randomcolor")));
|
||||||
const sessionCookieName = configFunctions.getProperty("session.cookieName");
|
const sessionCookieName = configFunctions.getProperty("session.cookieName");
|
||||||
const FileStoreSession = FileStore(session);
|
const FileStoreSession = FileStore(session);
|
||||||
app.use(session({
|
app.use(session({
|
||||||
|
|
|
||||||
5
app.ts
5
app.ts
|
|
@ -122,6 +122,11 @@ app.use(
|
||||||
express.static(path.join("node_modules", "leaflet", "dist"))
|
express.static(path.join("node_modules", "leaflet", "dist"))
|
||||||
);
|
);
|
||||||
|
|
||||||
|
app.use(
|
||||||
|
urlPrefix + "/lib/randomcolor",
|
||||||
|
express.static(path.join("node_modules", "randomcolor"))
|
||||||
|
);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SESSION MANAGEMENT
|
* SESSION MANAGEMENT
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,9 @@ config.settings.lot = {
|
||||||
config.settings.lotOccupancy.occupantCityDefault = "Sault Ste. Marie";
|
config.settings.lotOccupancy.occupantCityDefault = "Sault Ste. Marie";
|
||||||
config.settings.map.mapCityDefault = "Sault Ste. Marie";
|
config.settings.map.mapCityDefault = "Sault Ste. Marie";
|
||||||
config.settings.workOrders = {
|
config.settings.workOrders = {
|
||||||
workOrderNumberLength: 6
|
workOrderNumberLength: 6,
|
||||||
|
workOrderMilestoneDateRecentBeforeDays: 7,
|
||||||
|
workOrderMilestoneDateRecentAfterDays: 30
|
||||||
};
|
};
|
||||||
config.aliases.externalReceiptNumber = "GP Receipt Number";
|
config.aliases.externalReceiptNumber = "GP Receipt Number";
|
||||||
export default config;
|
export default config;
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,9 @@ config.settings.lotOccupancy.occupantCityDefault = "Sault Ste. Marie";
|
||||||
config.settings.map.mapCityDefault = "Sault Ste. Marie";
|
config.settings.map.mapCityDefault = "Sault Ste. Marie";
|
||||||
|
|
||||||
config.settings.workOrders = {
|
config.settings.workOrders = {
|
||||||
workOrderNumberLength: 6
|
workOrderNumberLength: 6,
|
||||||
|
workOrderMilestoneDateRecentBeforeDays: 7,
|
||||||
|
workOrderMilestoneDateRecentAfterDays: 30
|
||||||
};
|
};
|
||||||
|
|
||||||
config.aliases.externalReceiptNumber = "GP Receipt Number";
|
config.aliases.externalReceiptNumber = "GP Receipt Number";
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,11 @@ import { getLotStatuses, getWorkOrderMilestoneTypes, getWorkOrderTypes } from ".
|
||||||
import * as configFunctions from "../../helpers/functions.config.js";
|
import * as configFunctions from "../../helpers/functions.config.js";
|
||||||
import { getWorkOrder } from "../../helpers/lotOccupancyDB/getWorkOrder.js";
|
import { getWorkOrder } from "../../helpers/lotOccupancyDB/getWorkOrder.js";
|
||||||
export const handler = (request, response) => {
|
export const handler = (request, response) => {
|
||||||
const workOrder = getWorkOrder(request.params.workOrderId);
|
const workOrder = getWorkOrder(request.params.workOrderId, {
|
||||||
|
includeLotsAndLotOccupancies: true,
|
||||||
|
includeComments: true,
|
||||||
|
includeMilestones: true
|
||||||
|
});
|
||||||
if (!workOrder) {
|
if (!workOrder) {
|
||||||
return response.redirect(configFunctions.getProperty("reverseProxy.urlPrefix") +
|
return response.redirect(configFunctions.getProperty("reverseProxy.urlPrefix") +
|
||||||
"/workOrders/?error=workOrderIdNotFound");
|
"/workOrders/?error=workOrderIdNotFound");
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,11 @@ import * as configFunctions from "../../helpers/functions.config.js";
|
||||||
import { getWorkOrder } from "../../helpers/lotOccupancyDB/getWorkOrder.js";
|
import { getWorkOrder } from "../../helpers/lotOccupancyDB/getWorkOrder.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = (request, response) => {
|
export const handler: RequestHandler = (request, response) => {
|
||||||
const workOrder = getWorkOrder(request.params.workOrderId);
|
const workOrder = getWorkOrder(request.params.workOrderId, {
|
||||||
|
includeLotsAndLotOccupancies: true,
|
||||||
|
includeComments: true,
|
||||||
|
includeMilestones: true
|
||||||
|
});
|
||||||
|
|
||||||
if (!workOrder) {
|
if (!workOrder) {
|
||||||
return response.redirect(
|
return response.redirect(
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,11 @@
|
||||||
import * as configFunctions from "../../helpers/functions.config.js";
|
import * as configFunctions from "../../helpers/functions.config.js";
|
||||||
import { getWorkOrder } from "../../helpers/lotOccupancyDB/getWorkOrder.js";
|
import { getWorkOrder } from "../../helpers/lotOccupancyDB/getWorkOrder.js";
|
||||||
export const handler = (request, response) => {
|
export const handler = (request, response) => {
|
||||||
const workOrder = getWorkOrder(request.params.workOrderId);
|
const workOrder = getWorkOrder(request.params.workOrderId, {
|
||||||
|
includeLotsAndLotOccupancies: true,
|
||||||
|
includeComments: true,
|
||||||
|
includeMilestones: true
|
||||||
|
});
|
||||||
if (!workOrder) {
|
if (!workOrder) {
|
||||||
return response.redirect(configFunctions.getProperty("reverseProxy.urlPrefix") +
|
return response.redirect(configFunctions.getProperty("reverseProxy.urlPrefix") +
|
||||||
"/workOrders/?error=workOrderIdNotFound");
|
"/workOrders/?error=workOrderIdNotFound");
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,11 @@ import * as configFunctions from "../../helpers/functions.config.js";
|
||||||
import { getWorkOrder } from "../../helpers/lotOccupancyDB/getWorkOrder.js";
|
import { getWorkOrder } from "../../helpers/lotOccupancyDB/getWorkOrder.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = (request, response) => {
|
export const handler: RequestHandler = (request, response) => {
|
||||||
const workOrder = getWorkOrder(request.params.workOrderId);
|
const workOrder = getWorkOrder(request.params.workOrderId, {
|
||||||
|
includeLotsAndLotOccupancies: true,
|
||||||
|
includeComments: true,
|
||||||
|
includeMilestones: true
|
||||||
|
});
|
||||||
|
|
||||||
if (!workOrder) {
|
if (!workOrder) {
|
||||||
return response.redirect(
|
return response.redirect(
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@ export const handler = async (request, response) => {
|
||||||
const success = addWorkOrderMilestone(request.body, request.session);
|
const success = addWorkOrderMilestone(request.body, request.session);
|
||||||
const workOrderMilestones = getWorkOrderMilestones({
|
const workOrderMilestones = getWorkOrderMilestones({
|
||||||
workOrderId: request.body.workOrderId
|
workOrderId: request.body.workOrderId
|
||||||
|
}, {
|
||||||
|
orderBy: "completion"
|
||||||
});
|
});
|
||||||
response.json({
|
response.json({
|
||||||
success,
|
success,
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,14 @@ import { getWorkOrderMilestones } from "../../helpers/lotOccupancyDB/getWorkOrde
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
const success = addWorkOrderMilestone(request.body, request.session);
|
const success = addWorkOrderMilestone(request.body, request.session);
|
||||||
|
|
||||||
const workOrderMilestones = getWorkOrderMilestones({
|
const workOrderMilestones = getWorkOrderMilestones(
|
||||||
workOrderId: request.body.workOrderId
|
{
|
||||||
});
|
workOrderId: request.body.workOrderId
|
||||||
|
},
|
||||||
|
{
|
||||||
|
orderBy: "completion"
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
response.json({
|
response.json({
|
||||||
success,
|
success,
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
import type { RequestHandler } from "express";
|
||||||
|
export declare const handler: RequestHandler;
|
||||||
|
export default handler;
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
import { closeWorkOrder } from "../../helpers/lotOccupancyDB/closeWorkOrder.js";
|
||||||
|
export const handler = async (request, response) => {
|
||||||
|
const success = closeWorkOrder(request.body, request.session);
|
||||||
|
response.json({
|
||||||
|
success
|
||||||
|
});
|
||||||
|
};
|
||||||
|
export default handler;
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
|
import { closeWorkOrder } from "../../helpers/lotOccupancyDB/closeWorkOrder.js";
|
||||||
|
|
||||||
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
const success = closeWorkOrder(
|
||||||
|
request.body,
|
||||||
|
request.session
|
||||||
|
);
|
||||||
|
|
||||||
|
response.json({
|
||||||
|
success
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export default handler;
|
||||||
|
|
@ -6,6 +6,8 @@ export const handler = async (request, response) => {
|
||||||
}, request.session);
|
}, request.session);
|
||||||
const workOrderMilestones = getWorkOrderMilestones({
|
const workOrderMilestones = getWorkOrderMilestones({
|
||||||
workOrderId: request.body.workOrderId
|
workOrderId: request.body.workOrderId
|
||||||
|
}, {
|
||||||
|
orderBy: "completion"
|
||||||
});
|
});
|
||||||
response.json({
|
response.json({
|
||||||
success,
|
success,
|
||||||
|
|
|
||||||
|
|
@ -12,9 +12,14 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
request.session
|
request.session
|
||||||
);
|
);
|
||||||
|
|
||||||
const workOrderMilestones = getWorkOrderMilestones({
|
const workOrderMilestones = getWorkOrderMilestones(
|
||||||
workOrderId: request.body.workOrderId
|
{
|
||||||
});
|
workOrderId: request.body.workOrderId
|
||||||
|
},
|
||||||
|
{
|
||||||
|
orderBy: "completion"
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
response.json({
|
response.json({
|
||||||
success,
|
success,
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
import type { RequestHandler } from "express";
|
||||||
|
export declare const handler: RequestHandler;
|
||||||
|
export default handler;
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
import { deleteWorkOrder } from "../../helpers/lotOccupancyDB/deleteWorkOrder.js";
|
||||||
|
export const handler = async (request, response) => {
|
||||||
|
const success = deleteWorkOrder(request.body.workOrderId, request.session);
|
||||||
|
response.json({
|
||||||
|
success
|
||||||
|
});
|
||||||
|
};
|
||||||
|
export default handler;
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
|
import { deleteWorkOrder } from "../../helpers/lotOccupancyDB/deleteWorkOrder.js";
|
||||||
|
|
||||||
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
const success = deleteWorkOrder(request.body.workOrderId, request.session);
|
||||||
|
|
||||||
|
response.json({
|
||||||
|
success
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export default handler;
|
||||||
|
|
@ -4,6 +4,8 @@ export const handler = async (request, response) => {
|
||||||
const success = deleteWorkOrderMilestone(request.body.workOrderMilestoneId, request.session);
|
const success = deleteWorkOrderMilestone(request.body.workOrderMilestoneId, request.session);
|
||||||
const workOrderMilestones = getWorkOrderMilestones({
|
const workOrderMilestones = getWorkOrderMilestones({
|
||||||
workOrderId: request.body.workOrderId
|
workOrderId: request.body.workOrderId
|
||||||
|
}, {
|
||||||
|
orderBy: "completion"
|
||||||
});
|
});
|
||||||
response.json({
|
response.json({
|
||||||
success,
|
success,
|
||||||
|
|
|
||||||
|
|
@ -10,9 +10,14 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
request.session
|
request.session
|
||||||
);
|
);
|
||||||
|
|
||||||
const workOrderMilestones = getWorkOrderMilestones({
|
const workOrderMilestones = getWorkOrderMilestones(
|
||||||
workOrderId: request.body.workOrderId
|
{
|
||||||
});
|
workOrderId: request.body.workOrderId
|
||||||
|
},
|
||||||
|
{
|
||||||
|
orderBy: "completion"
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
response.json({
|
response.json({
|
||||||
success,
|
success,
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
import type { RequestHandler } from "express";
|
||||||
|
export declare const handler: RequestHandler;
|
||||||
|
export default handler;
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
import { getWorkOrderMilestones } from "../../helpers/lotOccupancyDB/getWorkOrderMilestones.js";
|
||||||
|
export const handler = async (request, response) => {
|
||||||
|
const workOrderMilestones = getWorkOrderMilestones(request.body, {
|
||||||
|
includeWorkOrders: true,
|
||||||
|
orderBy: "date"
|
||||||
|
});
|
||||||
|
response.json({
|
||||||
|
workOrderMilestones
|
||||||
|
});
|
||||||
|
};
|
||||||
|
export default handler;
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
|
import { getWorkOrderMilestones } from "../../helpers/lotOccupancyDB/getWorkOrderMilestones.js";
|
||||||
|
|
||||||
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
const workOrderMilestones = getWorkOrderMilestones(request.body, {
|
||||||
|
includeWorkOrders: true,
|
||||||
|
orderBy: "date"
|
||||||
|
});
|
||||||
|
|
||||||
|
response.json({
|
||||||
|
workOrderMilestones
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export default handler;
|
||||||
|
|
@ -4,6 +4,8 @@ export const handler = async (request, response) => {
|
||||||
const success = reopenWorkOrderMilestone(request.body.workOrderMilestoneId, request.session);
|
const success = reopenWorkOrderMilestone(request.body.workOrderMilestoneId, request.session);
|
||||||
const workOrderMilestones = getWorkOrderMilestones({
|
const workOrderMilestones = getWorkOrderMilestones({
|
||||||
workOrderId: request.body.workOrderId
|
workOrderId: request.body.workOrderId
|
||||||
|
}, {
|
||||||
|
orderBy: "completion"
|
||||||
});
|
});
|
||||||
response.json({
|
response.json({
|
||||||
success,
|
success,
|
||||||
|
|
|
||||||
|
|
@ -10,9 +10,14 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
request.session
|
request.session
|
||||||
);
|
);
|
||||||
|
|
||||||
const workOrderMilestones = getWorkOrderMilestones({
|
const workOrderMilestones = getWorkOrderMilestones(
|
||||||
workOrderId: request.body.workOrderId
|
{
|
||||||
});
|
workOrderId: request.body.workOrderId
|
||||||
|
},
|
||||||
|
{
|
||||||
|
orderBy: "completion"
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
response.json({
|
response.json({
|
||||||
success,
|
success,
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@ export const handler = async (request, response) => {
|
||||||
const success = updateWorkOrderMilestone(request.body, request.session);
|
const success = updateWorkOrderMilestone(request.body, request.session);
|
||||||
const workOrderMilestones = getWorkOrderMilestones({
|
const workOrderMilestones = getWorkOrderMilestones({
|
||||||
workOrderId: request.body.workOrderId
|
workOrderId: request.body.workOrderId
|
||||||
|
}, {
|
||||||
|
orderBy: "completion"
|
||||||
});
|
});
|
||||||
response.json({
|
response.json({
|
||||||
success,
|
success,
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,14 @@ import { getWorkOrderMilestones } from "../../helpers/lotOccupancyDB/getWorkOrde
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
const success = updateWorkOrderMilestone(request.body, request.session);
|
const success = updateWorkOrderMilestone(request.body, request.session);
|
||||||
|
|
||||||
const workOrderMilestones = getWorkOrderMilestones({
|
const workOrderMilestones = getWorkOrderMilestones(
|
||||||
workOrderId: request.body.workOrderId
|
{
|
||||||
});
|
workOrderId: request.body.workOrderId
|
||||||
|
},
|
||||||
|
{
|
||||||
|
orderBy: "completion"
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
response.json({
|
response.json({
|
||||||
success,
|
success,
|
||||||
|
|
|
||||||
|
|
@ -33,4 +33,6 @@ export declare function getProperty(propertyName: "settings.lotOccupancy.occupan
|
||||||
export declare function getProperty(propertyName: "settings.lotOccupancy.occupantProvinceDefault"): string;
|
export declare function getProperty(propertyName: "settings.lotOccupancy.occupantProvinceDefault"): string;
|
||||||
export declare function getProperty(propertyName: "settings.fees.taxPercentageDefault"): number;
|
export declare function getProperty(propertyName: "settings.fees.taxPercentageDefault"): number;
|
||||||
export declare function getProperty(propertyName: "settings.workOrders.workOrderNumberLength"): number;
|
export declare function getProperty(propertyName: "settings.workOrders.workOrderNumberLength"): number;
|
||||||
|
export declare function getProperty(propertyName: "settings.workOrders.workOrderMilestoneDateRecentBeforeDays"): number;
|
||||||
|
export declare function getProperty(propertyName: "settings.workOrders.workOrderMilestoneDateRecentAfterDays"): number;
|
||||||
export declare const keepAliveMillis: number;
|
export declare const keepAliveMillis: number;
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,8 @@ configFallbackValues.set("settings.lotOccupancy.occupantCityDefault", "");
|
||||||
configFallbackValues.set("settings.lotOccupancy.occupantProvinceDefault", "");
|
configFallbackValues.set("settings.lotOccupancy.occupantProvinceDefault", "");
|
||||||
configFallbackValues.set("settings.fees.taxPercentageDefault", 0);
|
configFallbackValues.set("settings.fees.taxPercentageDefault", 0);
|
||||||
configFallbackValues.set("settings.workOrders.workOrderNumberLength", 6);
|
configFallbackValues.set("settings.workOrders.workOrderNumberLength", 6);
|
||||||
|
configFallbackValues.set("settings.workOrders.workOrderMilestoneDateRecentBeforeDays", 5);
|
||||||
|
configFallbackValues.set("settings.workOrders.workOrderMilestoneDateRecentAfterDays", 60);
|
||||||
export function getProperty(propertyName) {
|
export function getProperty(propertyName) {
|
||||||
const propertyNameSplit = propertyName.split(".");
|
const propertyNameSplit = propertyName.split(".");
|
||||||
let currentObject = config;
|
let currentObject = config;
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,14 @@ configFallbackValues.set("settings.lotOccupancy.occupantProvinceDefault", "");
|
||||||
configFallbackValues.set("settings.fees.taxPercentageDefault", 0);
|
configFallbackValues.set("settings.fees.taxPercentageDefault", 0);
|
||||||
|
|
||||||
configFallbackValues.set("settings.workOrders.workOrderNumberLength", 6);
|
configFallbackValues.set("settings.workOrders.workOrderNumberLength", 6);
|
||||||
|
configFallbackValues.set(
|
||||||
|
"settings.workOrders.workOrderMilestoneDateRecentBeforeDays",
|
||||||
|
5
|
||||||
|
);
|
||||||
|
configFallbackValues.set(
|
||||||
|
"settings.workOrders.workOrderMilestoneDateRecentAfterDays",
|
||||||
|
60
|
||||||
|
);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up function overloads
|
* Set up function overloads
|
||||||
|
|
@ -148,6 +156,14 @@ export function getProperty(
|
||||||
propertyName: "settings.workOrders.workOrderNumberLength"
|
propertyName: "settings.workOrders.workOrderNumberLength"
|
||||||
): number;
|
): number;
|
||||||
|
|
||||||
|
export function getProperty(
|
||||||
|
propertyName: "settings.workOrders.workOrderMilestoneDateRecentBeforeDays"
|
||||||
|
): number;
|
||||||
|
|
||||||
|
export function getProperty(
|
||||||
|
propertyName: "settings.workOrders.workOrderMilestoneDateRecentAfterDays"
|
||||||
|
): number;
|
||||||
|
|
||||||
export function getProperty(propertyName: string): unknown {
|
export function getProperty(propertyName: string): unknown {
|
||||||
const propertyNameSplit = propertyName.split(".");
|
const propertyNameSplit = propertyName.split(".");
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,5 +3,5 @@ interface AddWorkOrderForm {
|
||||||
workOrderId: number | string;
|
workOrderId: number | string;
|
||||||
workOrderCloseDateString?: string;
|
workOrderCloseDateString?: string;
|
||||||
}
|
}
|
||||||
export declare const closeWorkOrder: (workOrderForm: AddWorkOrderForm, requestSession: recordTypes.PartialSession) => number;
|
export declare const closeWorkOrder: (workOrderForm: AddWorkOrderForm, requestSession: recordTypes.PartialSession) => boolean;
|
||||||
export default closeWorkOrder;
|
export default closeWorkOrder;
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,6 @@ export const closeWorkOrder = (workOrderForm, requestSession) => {
|
||||||
? dateStringToInteger(workOrderForm.workOrderCloseDateString)
|
? dateStringToInteger(workOrderForm.workOrderCloseDateString)
|
||||||
: dateToInteger(new Date()), requestSession.user.userName, rightNow.getTime(), workOrderForm.workOrderId);
|
: dateToInteger(new Date()), requestSession.user.userName, rightNow.getTime(), workOrderForm.workOrderId);
|
||||||
database.close();
|
database.close();
|
||||||
return result.lastInsertRowid;
|
return result.changes > 0;
|
||||||
};
|
};
|
||||||
export default closeWorkOrder;
|
export default closeWorkOrder;
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ interface AddWorkOrderForm {
|
||||||
export const closeWorkOrder = (
|
export const closeWorkOrder = (
|
||||||
workOrderForm: AddWorkOrderForm,
|
workOrderForm: AddWorkOrderForm,
|
||||||
requestSession: recordTypes.PartialSession
|
requestSession: recordTypes.PartialSession
|
||||||
): number => {
|
): boolean => {
|
||||||
const database = sqlite(databasePath);
|
const database = sqlite(databasePath);
|
||||||
|
|
||||||
const rightNow = new Date();
|
const rightNow = new Date();
|
||||||
|
|
@ -41,7 +41,7 @@ export const closeWorkOrder = (
|
||||||
|
|
||||||
database.close();
|
database.close();
|
||||||
|
|
||||||
return result.lastInsertRowid as number;
|
return result.changes > 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default closeWorkOrder;
|
export default closeWorkOrder;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
import type * as recordTypes from "../../types/recordTypes";
|
||||||
|
export declare const deleteWorkOrder: (workOrderId: number | string, requestSession: recordTypes.PartialSession) => boolean;
|
||||||
|
export default deleteWorkOrder;
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
import sqlite from "better-sqlite3";
|
||||||
|
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
|
||||||
|
export const deleteWorkOrder = (workOrderId, requestSession) => {
|
||||||
|
const database = sqlite(databasePath);
|
||||||
|
const rightNowMillis = Date.now();
|
||||||
|
const result = database
|
||||||
|
.prepare("update WorkOrders" +
|
||||||
|
" set recordDelete_userName = ?," +
|
||||||
|
" recordDelete_timeMillis = ?" +
|
||||||
|
" where workOrderId = ?")
|
||||||
|
.run(requestSession.user.userName, rightNowMillis, workOrderId);
|
||||||
|
database.close();
|
||||||
|
return result.changes > 0;
|
||||||
|
};
|
||||||
|
export default deleteWorkOrder;
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
import sqlite from "better-sqlite3";
|
||||||
|
|
||||||
|
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
|
||||||
|
|
||||||
|
import type * as recordTypes from "../../types/recordTypes";
|
||||||
|
|
||||||
|
export const deleteWorkOrder = (
|
||||||
|
workOrderId: number | string,
|
||||||
|
requestSession: recordTypes.PartialSession
|
||||||
|
): boolean => {
|
||||||
|
const database = sqlite(databasePath);
|
||||||
|
|
||||||
|
const rightNowMillis = Date.now();
|
||||||
|
|
||||||
|
const result = database
|
||||||
|
.prepare(
|
||||||
|
"update WorkOrders" +
|
||||||
|
" set recordDelete_userName = ?," +
|
||||||
|
" recordDelete_timeMillis = ?" +
|
||||||
|
" where workOrderId = ?"
|
||||||
|
)
|
||||||
|
.run(requestSession.user.userName, rightNowMillis, workOrderId);
|
||||||
|
|
||||||
|
database.close();
|
||||||
|
|
||||||
|
return result.changes > 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default deleteWorkOrder;
|
||||||
|
|
@ -1,4 +1,10 @@
|
||||||
|
import sqlite from "better-sqlite3";
|
||||||
import type * as recordTypes from "../../types/recordTypes";
|
import type * as recordTypes from "../../types/recordTypes";
|
||||||
|
interface WorkOrderOptions {
|
||||||
|
includeLotsAndLotOccupancies: boolean;
|
||||||
|
includeComments: boolean;
|
||||||
|
includeMilestones: boolean;
|
||||||
|
}
|
||||||
export declare const getWorkOrderByWorkOrderNumber: (workOrderNumber: string) => recordTypes.WorkOrder;
|
export declare const getWorkOrderByWorkOrderNumber: (workOrderNumber: string) => recordTypes.WorkOrder;
|
||||||
export declare const getWorkOrder: (workOrderId: number | string) => recordTypes.WorkOrder;
|
export declare const getWorkOrder: (workOrderId: number | string, options: WorkOrderOptions, connectedDatabase?: sqlite.Database) => recordTypes.WorkOrder;
|
||||||
export default getWorkOrder;
|
export default getWorkOrder;
|
||||||
|
|
|
||||||
|
|
@ -13,40 +13,56 @@ const baseSQL = "select w.workOrderId," +
|
||||||
" from WorkOrders w" +
|
" from WorkOrders w" +
|
||||||
" left join WorkOrderTypes t on w.workOrderTypeId = t.workOrderTypeId" +
|
" left join WorkOrderTypes t on w.workOrderTypeId = t.workOrderTypeId" +
|
||||||
" where w.recordDelete_timeMillis is null";
|
" where w.recordDelete_timeMillis is null";
|
||||||
const _getWorkOrder = (sql, workOrderId_or_workOrderNumber) => {
|
const _getWorkOrder = (sql, workOrderId_or_workOrderNumber, options, connectedDatabase) => {
|
||||||
const database = sqlite(databasePath, {
|
const database = connectedDatabase ||
|
||||||
readonly: true
|
sqlite(databasePath, {
|
||||||
});
|
readonly: true
|
||||||
|
});
|
||||||
database.function("userFn_dateIntegerToString", dateIntegerToString);
|
database.function("userFn_dateIntegerToString", dateIntegerToString);
|
||||||
const workOrder = database
|
const workOrder = database
|
||||||
.prepare(sql)
|
.prepare(sql)
|
||||||
.get(workOrderId_or_workOrderNumber);
|
.get(workOrderId_or_workOrderNumber);
|
||||||
if (workOrder) {
|
if (workOrder) {
|
||||||
workOrder.workOrderLots = getLots({
|
if (options.includeLotsAndLotOccupancies) {
|
||||||
workOrderId: workOrder.workOrderId
|
workOrder.workOrderLots = getLots({
|
||||||
}, {
|
workOrderId: workOrder.workOrderId
|
||||||
limit: -1,
|
}, {
|
||||||
offset: 0
|
limit: -1,
|
||||||
}, database).lots;
|
offset: 0
|
||||||
workOrder.workOrderLotOccupancies = getLotOccupancies({
|
}, database).lots;
|
||||||
workOrderId: workOrder.workOrderId
|
workOrder.workOrderLotOccupancies = getLotOccupancies({
|
||||||
}, {
|
workOrderId: workOrder.workOrderId
|
||||||
limit: -1,
|
}, {
|
||||||
offset: 0,
|
limit: -1,
|
||||||
includeOccupants: true
|
offset: 0,
|
||||||
}, database).lotOccupancies;
|
includeOccupants: true
|
||||||
workOrder.workOrderComments = getWorkOrderComments(workOrder.workOrderId, database);
|
}, database).lotOccupancies;
|
||||||
workOrder.workOrderMilestones = getWorkOrderMilestones({
|
}
|
||||||
workOrderId: workOrder.workOrderId
|
if (options.includeComments) {
|
||||||
}, database);
|
workOrder.workOrderComments = getWorkOrderComments(workOrder.workOrderId, database);
|
||||||
|
}
|
||||||
|
if (options.includeMilestones) {
|
||||||
|
workOrder.workOrderMilestones = getWorkOrderMilestones({
|
||||||
|
workOrderId: workOrder.workOrderId
|
||||||
|
}, {
|
||||||
|
includeWorkOrders: false,
|
||||||
|
orderBy: "completion"
|
||||||
|
}, database);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!connectedDatabase) {
|
||||||
|
database.close();
|
||||||
}
|
}
|
||||||
database.close();
|
|
||||||
return workOrder;
|
return workOrder;
|
||||||
};
|
};
|
||||||
export const getWorkOrderByWorkOrderNumber = (workOrderNumber) => {
|
export const getWorkOrderByWorkOrderNumber = (workOrderNumber) => {
|
||||||
return _getWorkOrder(baseSQL + " and w.workOrderNumber = ?", workOrderNumber);
|
return _getWorkOrder(baseSQL + " and w.workOrderNumber = ?", workOrderNumber, {
|
||||||
|
includeLotsAndLotOccupancies: true,
|
||||||
|
includeComments: true,
|
||||||
|
includeMilestones: true
|
||||||
|
});
|
||||||
};
|
};
|
||||||
export const getWorkOrder = (workOrderId) => {
|
export const getWorkOrder = (workOrderId, options, connectedDatabase) => {
|
||||||
return _getWorkOrder(baseSQL + " and w.workOrderId = ?", workOrderId);
|
return _getWorkOrder(baseSQL + " and w.workOrderId = ?", workOrderId, options, connectedDatabase);
|
||||||
};
|
};
|
||||||
export default getWorkOrder;
|
export default getWorkOrder;
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,12 @@ import { getWorkOrderMilestones } from "./getWorkOrderMilestones.js";
|
||||||
|
|
||||||
import type * as recordTypes from "../../types/recordTypes";
|
import type * as recordTypes from "../../types/recordTypes";
|
||||||
|
|
||||||
|
interface WorkOrderOptions {
|
||||||
|
includeLotsAndLotOccupancies: boolean;
|
||||||
|
includeComments: boolean;
|
||||||
|
includeMilestones: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
const baseSQL =
|
const baseSQL =
|
||||||
"select w.workOrderId," +
|
"select w.workOrderId," +
|
||||||
" w.workOrderTypeId, t.workOrderType," +
|
" w.workOrderTypeId, t.workOrderType," +
|
||||||
|
|
@ -26,11 +32,15 @@ const baseSQL =
|
||||||
|
|
||||||
const _getWorkOrder = (
|
const _getWorkOrder = (
|
||||||
sql: string,
|
sql: string,
|
||||||
workOrderId_or_workOrderNumber: number | string
|
workOrderId_or_workOrderNumber: number | string,
|
||||||
|
options: WorkOrderOptions,
|
||||||
|
connectedDatabase?: sqlite.Database
|
||||||
): recordTypes.WorkOrder => {
|
): recordTypes.WorkOrder => {
|
||||||
const database = sqlite(databasePath, {
|
const database =
|
||||||
readonly: true
|
connectedDatabase ||
|
||||||
});
|
sqlite(databasePath, {
|
||||||
|
readonly: true
|
||||||
|
});
|
||||||
|
|
||||||
database.function("userFn_dateIntegerToString", dateIntegerToString);
|
database.function("userFn_dateIntegerToString", dateIntegerToString);
|
||||||
|
|
||||||
|
|
@ -39,43 +49,55 @@ const _getWorkOrder = (
|
||||||
.get(workOrderId_or_workOrderNumber);
|
.get(workOrderId_or_workOrderNumber);
|
||||||
|
|
||||||
if (workOrder) {
|
if (workOrder) {
|
||||||
workOrder.workOrderLots = getLots(
|
if (options.includeLotsAndLotOccupancies) {
|
||||||
{
|
workOrder.workOrderLots = getLots(
|
||||||
workOrderId: workOrder.workOrderId
|
{
|
||||||
},
|
workOrderId: workOrder.workOrderId
|
||||||
{
|
},
|
||||||
limit: -1,
|
{
|
||||||
offset: 0
|
limit: -1,
|
||||||
},
|
offset: 0
|
||||||
database
|
},
|
||||||
).lots;
|
database
|
||||||
|
).lots;
|
||||||
|
|
||||||
workOrder.workOrderLotOccupancies = getLotOccupancies(
|
workOrder.workOrderLotOccupancies = getLotOccupancies(
|
||||||
{
|
{
|
||||||
workOrderId: workOrder.workOrderId
|
workOrderId: workOrder.workOrderId
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
limit: -1,
|
limit: -1,
|
||||||
offset: 0,
|
offset: 0,
|
||||||
includeOccupants: true
|
includeOccupants: true
|
||||||
},
|
},
|
||||||
database
|
database
|
||||||
).lotOccupancies;
|
).lotOccupancies;
|
||||||
|
}
|
||||||
|
|
||||||
workOrder.workOrderComments = getWorkOrderComments(
|
if (options.includeComments) {
|
||||||
workOrder.workOrderId,
|
workOrder.workOrderComments = getWorkOrderComments(
|
||||||
database
|
workOrder.workOrderId,
|
||||||
);
|
database
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
workOrder.workOrderMilestones = getWorkOrderMilestones(
|
if (options.includeMilestones) {
|
||||||
{
|
workOrder.workOrderMilestones = getWorkOrderMilestones(
|
||||||
workOrderId: workOrder.workOrderId
|
{
|
||||||
},
|
workOrderId: workOrder.workOrderId
|
||||||
database
|
},
|
||||||
);
|
{
|
||||||
|
includeWorkOrders: false,
|
||||||
|
orderBy: "completion"
|
||||||
|
},
|
||||||
|
database
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
database.close();
|
if (!connectedDatabase) {
|
||||||
|
database.close();
|
||||||
|
}
|
||||||
|
|
||||||
return workOrder;
|
return workOrder;
|
||||||
};
|
};
|
||||||
|
|
@ -85,14 +107,26 @@ export const getWorkOrderByWorkOrderNumber = (
|
||||||
): recordTypes.WorkOrder => {
|
): recordTypes.WorkOrder => {
|
||||||
return _getWorkOrder(
|
return _getWorkOrder(
|
||||||
baseSQL + " and w.workOrderNumber = ?",
|
baseSQL + " and w.workOrderNumber = ?",
|
||||||
workOrderNumber
|
workOrderNumber,
|
||||||
|
{
|
||||||
|
includeLotsAndLotOccupancies: true,
|
||||||
|
includeComments: true,
|
||||||
|
includeMilestones: true
|
||||||
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getWorkOrder = (
|
export const getWorkOrder = (
|
||||||
workOrderId: number | string
|
workOrderId: number | string,
|
||||||
|
options: WorkOrderOptions,
|
||||||
|
connectedDatabase?: sqlite.Database
|
||||||
): recordTypes.WorkOrder => {
|
): recordTypes.WorkOrder => {
|
||||||
return _getWorkOrder(baseSQL + " and w.workOrderId = ?", workOrderId);
|
return _getWorkOrder(
|
||||||
|
baseSQL + " and w.workOrderId = ?",
|
||||||
|
workOrderId,
|
||||||
|
options,
|
||||||
|
connectedDatabase
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default getWorkOrder;
|
export default getWorkOrder;
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,12 @@ import sqlite from "better-sqlite3";
|
||||||
import type * as recordTypes from "../../types/recordTypes";
|
import type * as recordTypes from "../../types/recordTypes";
|
||||||
interface WorkOrderMilestoneFilters {
|
interface WorkOrderMilestoneFilters {
|
||||||
workOrderId?: number | string;
|
workOrderId?: number | string;
|
||||||
|
workOrderMilestoneDateFilter?: "upcomingMissed" | "recent" | "date";
|
||||||
|
workOrderMilestoneDateString?: string;
|
||||||
}
|
}
|
||||||
export declare const getWorkOrderMilestones: (filters: WorkOrderMilestoneFilters, connectedDatabase?: sqlite.Database) => recordTypes.WorkOrderMilestone[];
|
interface WorkOrderMilestoneOptions {
|
||||||
|
includeWorkOrders?: boolean;
|
||||||
|
orderBy: "completion" | "date";
|
||||||
|
}
|
||||||
|
export declare const getWorkOrderMilestones: (filters: WorkOrderMilestoneFilters, options: WorkOrderMilestoneOptions, connectedDatabase?: sqlite.Database) => recordTypes.WorkOrderMilestone[];
|
||||||
export default getWorkOrderMilestones;
|
export default getWorkOrderMilestones;
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,9 @@
|
||||||
import sqlite from "better-sqlite3";
|
import sqlite from "better-sqlite3";
|
||||||
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
|
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
|
||||||
import { dateIntegerToString, timeIntegerToString } from "@cityssm/expressjs-server-js/dateTimeFns.js";
|
import { getWorkOrder } from "./getWorkOrder.js";
|
||||||
export const getWorkOrderMilestones = (filters, connectedDatabase) => {
|
import { dateIntegerToString, dateStringToInteger, dateToInteger, timeIntegerToString } from "@cityssm/expressjs-server-js/dateTimeFns.js";
|
||||||
|
import * as configFunctions from "../functions.config.js";
|
||||||
|
export const getWorkOrderMilestones = (filters, options, connectedDatabase) => {
|
||||||
const database = connectedDatabase ||
|
const database = connectedDatabase ||
|
||||||
sqlite(databasePath, {
|
sqlite(databasePath, {
|
||||||
readonly: true
|
readonly: true
|
||||||
|
|
@ -14,9 +16,48 @@ export const getWorkOrderMilestones = (filters, connectedDatabase) => {
|
||||||
sqlWhereClause += " and m.workOrderId = ?";
|
sqlWhereClause += " and m.workOrderId = ?";
|
||||||
sqlParameters.push(filters.workOrderId);
|
sqlParameters.push(filters.workOrderId);
|
||||||
}
|
}
|
||||||
|
const date = new Date();
|
||||||
|
const currentDateNumber = dateToInteger(date);
|
||||||
|
date.setDate(date.getDate() -
|
||||||
|
configFunctions.getProperty("settings.workOrders.workOrderMilestoneDateRecentBeforeDays"));
|
||||||
|
const recentBeforeDateNumber = dateToInteger(date);
|
||||||
|
date.setDate(date.getDate() +
|
||||||
|
configFunctions.getProperty("settings.workOrders.workOrderMilestoneDateRecentBeforeDays") +
|
||||||
|
configFunctions.getProperty("settings.workOrders.workOrderMilestoneDateRecentAfterDays"));
|
||||||
|
const recentAfterDateNumber = dateToInteger(date);
|
||||||
|
switch (filters.workOrderMilestoneDateFilter) {
|
||||||
|
case "upcomingMissed":
|
||||||
|
sqlWhereClause +=
|
||||||
|
" and (m.workOrderMilestoneCompletionDate is null or m.workOrderMilestoneDate >= ?)";
|
||||||
|
sqlParameters.push(currentDateNumber);
|
||||||
|
break;
|
||||||
|
case "recent":
|
||||||
|
sqlWhereClause +=
|
||||||
|
" and m.workOrderMilestoneDate >= ? and m.workOrderMilestoneDate <= ?";
|
||||||
|
sqlParameters.push(recentBeforeDateNumber, recentAfterDateNumber);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (filters.workOrderMilestoneDateString) {
|
||||||
|
sqlWhereClause += " and m.workOrderMilestoneDate = ?";
|
||||||
|
sqlParameters.push(dateStringToInteger(filters.workOrderMilestoneDateString));
|
||||||
|
}
|
||||||
|
let orderByClause = "";
|
||||||
|
switch (options.orderBy) {
|
||||||
|
case "completion":
|
||||||
|
orderByClause =
|
||||||
|
" order by" +
|
||||||
|
" m.workOrderMilestoneCompletionDate, m.workOrderMilestoneCompletionTime," +
|
||||||
|
" m.workOrderMilestoneDate, case when m.workOrderMilestoneTime = 0 then 9999 else m.workOrderMilestoneTime end," +
|
||||||
|
" t.orderNumber, m.workOrderMilestoneId";
|
||||||
|
break;
|
||||||
|
case "date":
|
||||||
|
orderByClause =
|
||||||
|
" order by m.workOrderMilestoneDate, case when m.workOrderMilestoneTime = 0 then 9999 else m.workOrderMilestoneTime end," +
|
||||||
|
" t.orderNumber, m.workOrderId, m.workOrderMilestoneId";
|
||||||
|
}
|
||||||
const workOrderMilestones = database
|
const workOrderMilestones = database
|
||||||
.prepare("select m.workOrderMilestoneId," +
|
.prepare("select m.workOrderId, m.workOrderMilestoneId," +
|
||||||
" m.workOrderMilestoneTypeId, t.workORderMilestoneType," +
|
" m.workOrderMilestoneTypeId, t.workOrderMilestoneType," +
|
||||||
" m.workOrderMilestoneDate, userFn_dateIntegerToString(m.workOrderMilestoneDate) as workOrderMilestoneDateString," +
|
" m.workOrderMilestoneDate, userFn_dateIntegerToString(m.workOrderMilestoneDate) as workOrderMilestoneDateString," +
|
||||||
" m.workOrderMilestoneTime, userFn_timeIntegerToString(m.workOrderMilestoneTime) as workOrderMilestoneTimeString," +
|
" m.workOrderMilestoneTime, userFn_timeIntegerToString(m.workOrderMilestoneTime) as workOrderMilestoneTimeString," +
|
||||||
" m.workOrderMilestoneDescription," +
|
" m.workOrderMilestoneDescription," +
|
||||||
|
|
@ -26,11 +67,17 @@ export const getWorkOrderMilestones = (filters, connectedDatabase) => {
|
||||||
" from WorkOrderMilestones m" +
|
" from WorkOrderMilestones m" +
|
||||||
" left join WorkOrderMilestoneTypes t on m.workOrderMilestoneTypeId = t.workOrderMilestoneTypeId" +
|
" left join WorkOrderMilestoneTypes t on m.workOrderMilestoneTypeId = t.workOrderMilestoneTypeId" +
|
||||||
sqlWhereClause +
|
sqlWhereClause +
|
||||||
" order by" +
|
orderByClause)
|
||||||
" m.workOrderMilestoneCompletionDate, m.workOrderMilestoneCompletionTime," +
|
|
||||||
" m.workOrderMilestoneDate, case when m.workOrderMilestoneTime = 0 then 9999 else m.workOrderMilestoneTime end," +
|
|
||||||
" t.orderNumber, m.workOrderMilestoneId")
|
|
||||||
.all(sqlParameters);
|
.all(sqlParameters);
|
||||||
|
if (options.includeWorkOrders) {
|
||||||
|
for (const workOrderMilestone of workOrderMilestones) {
|
||||||
|
workOrderMilestone.workOrder = getWorkOrder(workOrderMilestone.workOrderId, {
|
||||||
|
includeLotsAndLotOccupancies: true,
|
||||||
|
includeComments: false,
|
||||||
|
includeMilestones: false
|
||||||
|
}, database);
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!connectedDatabase) {
|
if (!connectedDatabase) {
|
||||||
database.close();
|
database.close();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,19 +2,33 @@ import sqlite from "better-sqlite3";
|
||||||
|
|
||||||
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
|
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
|
||||||
|
|
||||||
|
import { getWorkOrder } from "./getWorkOrder.js";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
dateIntegerToString,
|
dateIntegerToString,
|
||||||
|
dateStringToInteger,
|
||||||
|
dateToInteger,
|
||||||
timeIntegerToString
|
timeIntegerToString
|
||||||
} from "@cityssm/expressjs-server-js/dateTimeFns.js";
|
} from "@cityssm/expressjs-server-js/dateTimeFns.js";
|
||||||
|
|
||||||
|
import * as configFunctions from "../functions.config.js";
|
||||||
|
|
||||||
import type * as recordTypes from "../../types/recordTypes";
|
import type * as recordTypes from "../../types/recordTypes";
|
||||||
|
|
||||||
interface WorkOrderMilestoneFilters {
|
interface WorkOrderMilestoneFilters {
|
||||||
workOrderId?: number | string;
|
workOrderId?: number | string;
|
||||||
|
workOrderMilestoneDateFilter?: "upcomingMissed" | "recent" | "date";
|
||||||
|
workOrderMilestoneDateString?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface WorkOrderMilestoneOptions {
|
||||||
|
includeWorkOrders?: boolean;
|
||||||
|
orderBy: "completion" | "date";
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getWorkOrderMilestones = (
|
export const getWorkOrderMilestones = (
|
||||||
filters: WorkOrderMilestoneFilters,
|
filters: WorkOrderMilestoneFilters,
|
||||||
|
options: WorkOrderMilestoneOptions,
|
||||||
connectedDatabase?: sqlite.Database
|
connectedDatabase?: sqlite.Database
|
||||||
): recordTypes.WorkOrderMilestone[] => {
|
): recordTypes.WorkOrderMilestone[] => {
|
||||||
const database =
|
const database =
|
||||||
|
|
@ -26,6 +40,8 @@ export const getWorkOrderMilestones = (
|
||||||
database.function("userFn_dateIntegerToString", dateIntegerToString);
|
database.function("userFn_dateIntegerToString", dateIntegerToString);
|
||||||
database.function("userFn_timeIntegerToString", timeIntegerToString);
|
database.function("userFn_timeIntegerToString", timeIntegerToString);
|
||||||
|
|
||||||
|
// Filters
|
||||||
|
|
||||||
let sqlWhereClause = " where m.recordDelete_timeMillis is null";
|
let sqlWhereClause = " where m.recordDelete_timeMillis is null";
|
||||||
const sqlParameters = [];
|
const sqlParameters = [];
|
||||||
|
|
||||||
|
|
@ -34,10 +50,76 @@ export const getWorkOrderMilestones = (
|
||||||
sqlParameters.push(filters.workOrderId);
|
sqlParameters.push(filters.workOrderId);
|
||||||
}
|
}
|
||||||
|
|
||||||
const workOrderMilestones = database
|
const date = new Date();
|
||||||
|
const currentDateNumber = dateToInteger(date);
|
||||||
|
|
||||||
|
date.setDate(
|
||||||
|
date.getDate() -
|
||||||
|
configFunctions.getProperty(
|
||||||
|
"settings.workOrders.workOrderMilestoneDateRecentBeforeDays"
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
const recentBeforeDateNumber = dateToInteger(date);
|
||||||
|
|
||||||
|
date.setDate(
|
||||||
|
date.getDate() +
|
||||||
|
configFunctions.getProperty(
|
||||||
|
"settings.workOrders.workOrderMilestoneDateRecentBeforeDays"
|
||||||
|
) +
|
||||||
|
configFunctions.getProperty(
|
||||||
|
"settings.workOrders.workOrderMilestoneDateRecentAfterDays"
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
const recentAfterDateNumber = dateToInteger(date);
|
||||||
|
|
||||||
|
switch (filters.workOrderMilestoneDateFilter) {
|
||||||
|
case "upcomingMissed":
|
||||||
|
sqlWhereClause +=
|
||||||
|
" and (m.workOrderMilestoneCompletionDate is null or m.workOrderMilestoneDate >= ?)";
|
||||||
|
sqlParameters.push(currentDateNumber);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "recent":
|
||||||
|
sqlWhereClause +=
|
||||||
|
" and m.workOrderMilestoneDate >= ? and m.workOrderMilestoneDate <= ?";
|
||||||
|
sqlParameters.push(recentBeforeDateNumber, recentAfterDateNumber);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filters.workOrderMilestoneDateString) {
|
||||||
|
sqlWhereClause += " and m.workOrderMilestoneDate = ?";
|
||||||
|
sqlParameters.push(
|
||||||
|
dateStringToInteger(filters.workOrderMilestoneDateString)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Order By
|
||||||
|
|
||||||
|
let orderByClause = "";
|
||||||
|
|
||||||
|
switch (options.orderBy) {
|
||||||
|
case "completion":
|
||||||
|
orderByClause =
|
||||||
|
" order by" +
|
||||||
|
" m.workOrderMilestoneCompletionDate, m.workOrderMilestoneCompletionTime," +
|
||||||
|
" m.workOrderMilestoneDate, case when m.workOrderMilestoneTime = 0 then 9999 else m.workOrderMilestoneTime end," +
|
||||||
|
" t.orderNumber, m.workOrderMilestoneId";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "date":
|
||||||
|
orderByClause =
|
||||||
|
" order by m.workOrderMilestoneDate, case when m.workOrderMilestoneTime = 0 then 9999 else m.workOrderMilestoneTime end," +
|
||||||
|
" t.orderNumber, m.workOrderId, m.workOrderMilestoneId";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Query
|
||||||
|
|
||||||
|
const workOrderMilestones: recordTypes.WorkOrderMilestone[] = database
|
||||||
.prepare(
|
.prepare(
|
||||||
"select m.workOrderMilestoneId," +
|
"select m.workOrderId, m.workOrderMilestoneId," +
|
||||||
" m.workOrderMilestoneTypeId, t.workORderMilestoneType," +
|
" m.workOrderMilestoneTypeId, t.workOrderMilestoneType," +
|
||||||
" m.workOrderMilestoneDate, userFn_dateIntegerToString(m.workOrderMilestoneDate) as workOrderMilestoneDateString," +
|
" m.workOrderMilestoneDate, userFn_dateIntegerToString(m.workOrderMilestoneDate) as workOrderMilestoneDateString," +
|
||||||
" m.workOrderMilestoneTime, userFn_timeIntegerToString(m.workOrderMilestoneTime) as workOrderMilestoneTimeString," +
|
" m.workOrderMilestoneTime, userFn_timeIntegerToString(m.workOrderMilestoneTime) as workOrderMilestoneTimeString," +
|
||||||
" m.workOrderMilestoneDescription," +
|
" m.workOrderMilestoneDescription," +
|
||||||
|
|
@ -47,13 +129,24 @@ export const getWorkOrderMilestones = (
|
||||||
" from WorkOrderMilestones m" +
|
" from WorkOrderMilestones m" +
|
||||||
" left join WorkOrderMilestoneTypes t on m.workOrderMilestoneTypeId = t.workOrderMilestoneTypeId" +
|
" left join WorkOrderMilestoneTypes t on m.workOrderMilestoneTypeId = t.workOrderMilestoneTypeId" +
|
||||||
sqlWhereClause +
|
sqlWhereClause +
|
||||||
" order by" +
|
orderByClause
|
||||||
" m.workOrderMilestoneCompletionDate, m.workOrderMilestoneCompletionTime," +
|
|
||||||
" m.workOrderMilestoneDate, case when m.workOrderMilestoneTime = 0 then 9999 else m.workOrderMilestoneTime end," +
|
|
||||||
" t.orderNumber, m.workOrderMilestoneId"
|
|
||||||
)
|
)
|
||||||
.all(sqlParameters);
|
.all(sqlParameters);
|
||||||
|
|
||||||
|
if (options.includeWorkOrders) {
|
||||||
|
for (const workOrderMilestone of workOrderMilestones) {
|
||||||
|
workOrderMilestone.workOrder = getWorkOrder(
|
||||||
|
workOrderMilestone.workOrderId,
|
||||||
|
{
|
||||||
|
includeLotsAndLotOccupancies: true,
|
||||||
|
includeComments: false,
|
||||||
|
includeMilestones: false
|
||||||
|
},
|
||||||
|
database
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!connectedDatabase) {
|
if (!connectedDatabase) {
|
||||||
database.close();
|
database.close();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@
|
||||||
"@cityssm/date-diff": "^2.2.3",
|
"@cityssm/date-diff": "^2.2.3",
|
||||||
"@cityssm/expressjs-server-js": "^2.3.2",
|
"@cityssm/expressjs-server-js": "^2.3.2",
|
||||||
"@fortawesome/fontawesome-free": "^5.15.4",
|
"@fortawesome/fontawesome-free": "^5.15.4",
|
||||||
|
"@types/randomcolor": "^0.5.6",
|
||||||
"activedirectory2": "^2.1.0",
|
"activedirectory2": "^2.1.0",
|
||||||
"better-sqlite3": "^7.6.2",
|
"better-sqlite3": "^7.6.2",
|
||||||
"camelcase": "^7.0.0",
|
"camelcase": "^7.0.0",
|
||||||
|
|
@ -30,6 +31,7 @@
|
||||||
"http-errors": "^2.0.0",
|
"http-errors": "^2.0.0",
|
||||||
"leaflet": "^1.8.0",
|
"leaflet": "^1.8.0",
|
||||||
"papaparse": "^5.3.2",
|
"papaparse": "^5.3.2",
|
||||||
|
"randomcolor": "^0.6.2",
|
||||||
"session-file-store": "^1.5.0"
|
"session-file-store": "^1.5.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|
@ -1165,6 +1167,11 @@
|
||||||
"integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==",
|
"integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/randomcolor": {
|
||||||
|
"version": "0.5.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/randomcolor/-/randomcolor-0.5.6.tgz",
|
||||||
|
"integrity": "sha512-lKkW8DGUQpZldTrwa+HM5rY+7eTyaHOMTsnj9ewt7AAwXuMPwBmkLlfh8+SXdgOhBW9iNI4x4zRjQ/TQZkdycQ=="
|
||||||
|
},
|
||||||
"node_modules/@types/range-parser": {
|
"node_modules/@types/range-parser": {
|
||||||
"version": "1.2.4",
|
"version": "1.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
|
"resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
|
||||||
|
|
@ -9141,6 +9148,11 @@
|
||||||
"url": "https://github.com/sponsors/sindresorhus"
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/randomcolor": {
|
||||||
|
"version": "0.6.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/randomcolor/-/randomcolor-0.6.2.tgz",
|
||||||
|
"integrity": "sha512-Mn6TbyYpFgwFuQ8KJKqf3bqqY9O1y37/0jgSK/61PUxV4QfIMv0+K2ioq8DfOjkBslcjwSzRfIDEXfzA9aCx7A=="
|
||||||
|
},
|
||||||
"node_modules/range-parser": {
|
"node_modules/range-parser": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
|
||||||
|
|
@ -12856,6 +12868,11 @@
|
||||||
"integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==",
|
"integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"@types/randomcolor": {
|
||||||
|
"version": "0.5.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/randomcolor/-/randomcolor-0.5.6.tgz",
|
||||||
|
"integrity": "sha512-lKkW8DGUQpZldTrwa+HM5rY+7eTyaHOMTsnj9ewt7AAwXuMPwBmkLlfh8+SXdgOhBW9iNI4x4zRjQ/TQZkdycQ=="
|
||||||
|
},
|
||||||
"@types/range-parser": {
|
"@types/range-parser": {
|
||||||
"version": "1.2.4",
|
"version": "1.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
|
"resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
|
||||||
|
|
@ -18967,6 +18984,11 @@
|
||||||
"resolved": "https://registry.npmjs.org/random-item/-/random-item-4.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/random-item/-/random-item-4.0.1.tgz",
|
||||||
"integrity": "sha512-52SyTkFhFm6YP6MN9U5+txr8lBN5/fE2+xjzp1snaDzDNHN8a6Lu/G9fSc3gvD1+bmT+kIS7A0EP9QJQgRBfsg=="
|
"integrity": "sha512-52SyTkFhFm6YP6MN9U5+txr8lBN5/fE2+xjzp1snaDzDNHN8a6Lu/G9fSc3gvD1+bmT+kIS7A0EP9QJQgRBfsg=="
|
||||||
},
|
},
|
||||||
|
"randomcolor": {
|
||||||
|
"version": "0.6.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/randomcolor/-/randomcolor-0.6.2.tgz",
|
||||||
|
"integrity": "sha512-Mn6TbyYpFgwFuQ8KJKqf3bqqY9O1y37/0jgSK/61PUxV4QfIMv0+K2ioq8DfOjkBslcjwSzRfIDEXfzA9aCx7A=="
|
||||||
|
},
|
||||||
"range-parser": {
|
"range-parser": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,7 @@
|
||||||
"@cityssm/date-diff": "^2.2.3",
|
"@cityssm/date-diff": "^2.2.3",
|
||||||
"@cityssm/expressjs-server-js": "^2.3.2",
|
"@cityssm/expressjs-server-js": "^2.3.2",
|
||||||
"@fortawesome/fontawesome-free": "^5.15.4",
|
"@fortawesome/fontawesome-free": "^5.15.4",
|
||||||
|
"@types/randomcolor": "^0.5.6",
|
||||||
"activedirectory2": "^2.1.0",
|
"activedirectory2": "^2.1.0",
|
||||||
"better-sqlite3": "^7.6.2",
|
"better-sqlite3": "^7.6.2",
|
||||||
"camelcase": "^7.0.0",
|
"camelcase": "^7.0.0",
|
||||||
|
|
@ -54,6 +55,7 @@
|
||||||
"http-errors": "^2.0.0",
|
"http-errors": "^2.0.0",
|
||||||
"leaflet": "^1.8.0",
|
"leaflet": "^1.8.0",
|
||||||
"papaparse": "^5.3.2",
|
"papaparse": "^5.3.2",
|
||||||
|
"randomcolor": "^0.6.2",
|
||||||
"session-file-store": "^1.5.0"
|
"session-file-store": "^1.5.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|
|
||||||
|
|
@ -72,10 +72,24 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
const hues = ["red", "green", "orange", "blue", "pink", "yellow", "purple"];
|
||||||
|
const luminosity = ["bright", "light", "dark"];
|
||||||
|
const getRandomColor = (seedString) => {
|
||||||
|
let actualSeedString = seedString;
|
||||||
|
if (actualSeedString.length < 2) {
|
||||||
|
actualSeedString = actualSeedString + "a1";
|
||||||
|
}
|
||||||
|
return exports.randomColor({
|
||||||
|
seed: actualSeedString + actualSeedString,
|
||||||
|
hue: hues[actualSeedString.codePointAt(actualSeedString.length - 1) % hues.length],
|
||||||
|
luminosity: luminosity[actualSeedString.codePointAt(actualSeedString.length - 2) % luminosity.length]
|
||||||
|
});
|
||||||
|
};
|
||||||
const los = {
|
const los = {
|
||||||
highlightMap,
|
highlightMap,
|
||||||
initializeUnlockFieldButtons,
|
initializeUnlockFieldButtons,
|
||||||
populateAliases
|
populateAliases,
|
||||||
|
getRandomColor
|
||||||
};
|
};
|
||||||
exports.los = los;
|
exports.los = los;
|
||||||
})();
|
})();
|
||||||
|
|
|
||||||
|
|
@ -118,10 +118,29 @@ import type * as globalTypes from "../types/globalTypes";
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const hues = ["red", "green", "orange", "blue", "pink", "yellow", "purple"];
|
||||||
|
const luminosity = ["bright", "light", "dark"];
|
||||||
|
|
||||||
|
const getRandomColor = (seedString: string) => {
|
||||||
|
|
||||||
|
let actualSeedString = seedString;
|
||||||
|
|
||||||
|
if (actualSeedString.length < 2) {
|
||||||
|
actualSeedString = actualSeedString + "a1";
|
||||||
|
}
|
||||||
|
|
||||||
|
return exports.randomColor({
|
||||||
|
seed: actualSeedString + actualSeedString,
|
||||||
|
hue: hues[actualSeedString.codePointAt(actualSeedString.length - 1) % hues.length],
|
||||||
|
luminosity: luminosity[actualSeedString.codePointAt(actualSeedString.length - 2) % luminosity.length]
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
const los: globalTypes.LOS = {
|
const los: globalTypes.LOS = {
|
||||||
highlightMap,
|
highlightMap,
|
||||||
initializeUnlockFieldButtons,
|
initializeUnlockFieldButtons,
|
||||||
populateAliases
|
populateAliases,
|
||||||
|
getRandomColor
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.los = los;
|
exports.los = los;
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,85 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
let workOrderMilestones;
|
||||||
|
if (!isCreate) {
|
||||||
|
const doClose = () => {
|
||||||
|
cityssm.postJSON(urlPrefix + "/workOrders/doCloseWorkOrder", {
|
||||||
|
workOrderId
|
||||||
|
}, (responseJSON) => {
|
||||||
|
if (responseJSON.success) {
|
||||||
|
window.location.href =
|
||||||
|
urlPrefix + "/workOrders/" + workOrderId;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
bulmaJS.alert({
|
||||||
|
title: "Error Closing Work Order",
|
||||||
|
message: responseJSON.errorMessage,
|
||||||
|
contextualColorName: "danger"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
document
|
||||||
|
.querySelector("#button--closeWorkOrder")
|
||||||
|
.addEventListener("click", () => {
|
||||||
|
const hasOpenMilestones = workOrderMilestones.some((milestone) => {
|
||||||
|
return !milestone.workOrderMilestoneCompletionDate;
|
||||||
|
});
|
||||||
|
if (hasOpenMilestones) {
|
||||||
|
bulmaJS.confirm({
|
||||||
|
title: "Close Work Order with Outstanding Milestones",
|
||||||
|
message: "Are you sure you want to close this work order with outstanding milestones?",
|
||||||
|
contextualColorName: "danger",
|
||||||
|
okButton: {
|
||||||
|
text: "Yes, Close Work Order",
|
||||||
|
callbackFunction: doClose
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
bulmaJS.confirm({
|
||||||
|
title: "Close Work Order",
|
||||||
|
message: "Are you sure you want to close this work order?",
|
||||||
|
contextualColorName: "info",
|
||||||
|
okButton: {
|
||||||
|
text: "Yes, Close Work Order",
|
||||||
|
callbackFunction: doClose
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const doDelete = () => {
|
||||||
|
cityssm.postJSON(urlPrefix + "/workOrders/doDeleteWorkOrder", {
|
||||||
|
workOrderId
|
||||||
|
}, (responseJSON) => {
|
||||||
|
if (responseJSON.success) {
|
||||||
|
window.location.href = urlPrefix + "/workOrders";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
bulmaJS.alert({
|
||||||
|
title: "Error Deleting Work Order",
|
||||||
|
message: responseJSON.errorMessage,
|
||||||
|
contextualColorName: "danger"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
document
|
||||||
|
.querySelector("#button--deleteWorkOrder")
|
||||||
|
.addEventListener("click", (clickEvent) => {
|
||||||
|
clickEvent.preventDefault();
|
||||||
|
bulmaJS.confirm({
|
||||||
|
title: "Delete Work Order",
|
||||||
|
message: "Are you sure you want to delete this work order?",
|
||||||
|
contextualColorName: "warning",
|
||||||
|
okButton: {
|
||||||
|
text: "Yes, Delete Work Order",
|
||||||
|
callbackFunction: doDelete
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
if (!isCreate) {
|
if (!isCreate) {
|
||||||
let workOrderLots = exports.workOrderLots;
|
let workOrderLots = exports.workOrderLots;
|
||||||
delete exports.workOrderLots;
|
delete exports.workOrderLots;
|
||||||
|
|
@ -593,7 +672,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (!isCreate) {
|
if (!isCreate) {
|
||||||
let workOrderMilestones = exports.workOrderMilestones;
|
workOrderMilestones =
|
||||||
|
exports.workOrderMilestones;
|
||||||
delete exports.workOrderMilestones;
|
delete exports.workOrderMilestones;
|
||||||
const processMilestoneResponse = (responseJSON) => {
|
const processMilestoneResponse = (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
|
|
@ -723,7 +803,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
milestoneTypeElement.append(optionElement);
|
milestoneTypeElement.append(optionElement);
|
||||||
}
|
}
|
||||||
modalElement.querySelector("#milestoneEdit--workOrderMilestoneDateString").value = workOrderMilestone.workOrderMilestoneDateString;
|
modalElement.querySelector("#milestoneEdit--workOrderMilestoneDateString").value = workOrderMilestone.workOrderMilestoneDateString;
|
||||||
modalElement.querySelector("#milestoneEdit--workOrderMilestoneTimeString").value = workOrderMilestone.workOrderMilestoneTimeString;
|
if (workOrderMilestone.workOrderMilestoneTime) {
|
||||||
|
modalElement.querySelector("#milestoneEdit--workOrderMilestoneTimeString").value =
|
||||||
|
workOrderMilestone.workOrderMilestoneTimeString;
|
||||||
|
}
|
||||||
modalElement.querySelector("#milestoneEdit--workOrderMilestoneDescription").value = workOrderMilestone.workOrderMilestoneDescription;
|
modalElement.querySelector("#milestoneEdit--workOrderMilestoneDescription").value = workOrderMilestone.workOrderMilestoneDescription;
|
||||||
},
|
},
|
||||||
onshown: (modalElement, closeModalFunction) => {
|
onshown: (modalElement, closeModalFunction) => {
|
||||||
|
|
@ -832,15 +915,33 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
document
|
document
|
||||||
.querySelector("#button--addMilestone")
|
.querySelector("#button--addMilestone")
|
||||||
.addEventListener("click", () => {
|
.addEventListener("click", () => {
|
||||||
|
let addModalElement;
|
||||||
let addCloseModalFunction;
|
let addCloseModalFunction;
|
||||||
const doAdd = (submitEvent) => {
|
const doAdd = (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(urlPrefix + "/workOrders/doAddWorkOrderMilestone", submitEvent.currentTarget, (responseJSON) => {
|
const currentDateString = cityssm.dateToString(new Date());
|
||||||
processMilestoneResponse(responseJSON);
|
const _doAdd = () => {
|
||||||
if (responseJSON.success) {
|
cityssm.postJSON(urlPrefix + "/workOrders/doAddWorkOrderMilestone", submitEvent.currentTarget, (responseJSON) => {
|
||||||
addCloseModalFunction();
|
processMilestoneResponse(responseJSON);
|
||||||
}
|
if (responseJSON.success) {
|
||||||
});
|
addCloseModalFunction();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
if (addModalElement.querySelector("#milestoneAdd--workOrderMilestoneDateString").value < currentDateString) {
|
||||||
|
bulmaJS.confirm({
|
||||||
|
title: "Milestone Date in the Past",
|
||||||
|
message: "Are you sure you want to create a milestone with a date in the past?",
|
||||||
|
contextualColorName: "warning",
|
||||||
|
okButton: {
|
||||||
|
text: "Yes, Create a Past Milestone",
|
||||||
|
callbackFunction: _doAdd
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
_doAdd();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
cityssm.openHtmlModal("workOrder-addMilestone", {
|
cityssm.openHtmlModal("workOrder-addMilestone", {
|
||||||
onshow: (modalElement) => {
|
onshow: (modalElement) => {
|
||||||
|
|
@ -857,6 +958,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
modalElement.querySelector("#milestoneAdd--workOrderMilestoneDateString").valueAsDate = new Date();
|
modalElement.querySelector("#milestoneAdd--workOrderMilestoneDateString").valueAsDate = new Date();
|
||||||
},
|
},
|
||||||
onshown: (modalElement, closeModalFunction) => {
|
onshown: (modalElement, closeModalFunction) => {
|
||||||
|
addModalElement = modalElement;
|
||||||
addCloseModalFunction = closeModalFunction;
|
addCloseModalFunction = closeModalFunction;
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
modalElement
|
modalElement
|
||||||
|
|
|
||||||
|
|
@ -65,6 +65,105 @@ declare const bulmaJS: BulmaJS;
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Work Order Options
|
||||||
|
*/
|
||||||
|
|
||||||
|
let workOrderMilestones: recordTypes.WorkOrderMilestone[];
|
||||||
|
|
||||||
|
if (!isCreate) {
|
||||||
|
const doClose = () => {
|
||||||
|
cityssm.postJSON(
|
||||||
|
urlPrefix + "/workOrders/doCloseWorkOrder",
|
||||||
|
{
|
||||||
|
workOrderId
|
||||||
|
},
|
||||||
|
(responseJSON: { success: boolean; errorMessage?: string }) => {
|
||||||
|
if (responseJSON.success) {
|
||||||
|
window.location.href =
|
||||||
|
urlPrefix + "/workOrders/" + workOrderId;
|
||||||
|
} else {
|
||||||
|
bulmaJS.alert({
|
||||||
|
title: "Error Closing Work Order",
|
||||||
|
message: responseJSON.errorMessage,
|
||||||
|
contextualColorName: "danger"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
document
|
||||||
|
.querySelector("#button--closeWorkOrder")
|
||||||
|
.addEventListener("click", () => {
|
||||||
|
const hasOpenMilestones = workOrderMilestones.some(
|
||||||
|
(milestone) => {
|
||||||
|
return !milestone.workOrderMilestoneCompletionDate;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
if (hasOpenMilestones) {
|
||||||
|
bulmaJS.confirm({
|
||||||
|
title: "Close Work Order with Outstanding Milestones",
|
||||||
|
message:
|
||||||
|
"Are you sure you want to close this work order with outstanding milestones?",
|
||||||
|
contextualColorName: "danger",
|
||||||
|
okButton: {
|
||||||
|
text: "Yes, Close Work Order",
|
||||||
|
callbackFunction: doClose
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
bulmaJS.confirm({
|
||||||
|
title: "Close Work Order",
|
||||||
|
message:
|
||||||
|
"Are you sure you want to close this work order?",
|
||||||
|
contextualColorName: "info",
|
||||||
|
okButton: {
|
||||||
|
text: "Yes, Close Work Order",
|
||||||
|
callbackFunction: doClose
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const doDelete = () => {
|
||||||
|
cityssm.postJSON(
|
||||||
|
urlPrefix + "/workOrders/doDeleteWorkOrder",
|
||||||
|
{
|
||||||
|
workOrderId
|
||||||
|
},
|
||||||
|
(responseJSON: { success: boolean; errorMessage?: string }) => {
|
||||||
|
if (responseJSON.success) {
|
||||||
|
window.location.href = urlPrefix + "/workOrders";
|
||||||
|
} else {
|
||||||
|
bulmaJS.alert({
|
||||||
|
title: "Error Deleting Work Order",
|
||||||
|
message: responseJSON.errorMessage,
|
||||||
|
contextualColorName: "danger"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
document
|
||||||
|
.querySelector("#button--deleteWorkOrder")
|
||||||
|
.addEventListener("click", (clickEvent: Event) => {
|
||||||
|
clickEvent.preventDefault();
|
||||||
|
|
||||||
|
bulmaJS.confirm({
|
||||||
|
title: "Delete Work Order",
|
||||||
|
message: "Are you sure you want to delete this work order?",
|
||||||
|
contextualColorName: "warning",
|
||||||
|
okButton: {
|
||||||
|
text: "Yes, Delete Work Order",
|
||||||
|
callbackFunction: doDelete
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Related Lots
|
* Related Lots
|
||||||
*/
|
*/
|
||||||
|
|
@ -843,7 +942,7 @@ declare const bulmaJS: BulmaJS;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!isCreate) {
|
if (!isCreate) {
|
||||||
let workOrderMilestones =
|
workOrderMilestones =
|
||||||
exports.workOrderMilestones as recordTypes.WorkOrderMilestone[];
|
exports.workOrderMilestones as recordTypes.WorkOrderMilestone[];
|
||||||
delete exports.workOrderMilestones;
|
delete exports.workOrderMilestones;
|
||||||
|
|
||||||
|
|
@ -1079,11 +1178,15 @@ declare const bulmaJS: BulmaJS;
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value = workOrderMilestone.workOrderMilestoneDateString;
|
).value = workOrderMilestone.workOrderMilestoneDateString;
|
||||||
|
|
||||||
(
|
if (workOrderMilestone.workOrderMilestoneTime) {
|
||||||
modalElement.querySelector(
|
(
|
||||||
"#milestoneEdit--workOrderMilestoneTimeString"
|
modalElement.querySelector(
|
||||||
) as HTMLInputElement
|
"#milestoneEdit--workOrderMilestoneTimeString"
|
||||||
).value = workOrderMilestone.workOrderMilestoneTimeString;
|
) as HTMLInputElement
|
||||||
|
).value =
|
||||||
|
workOrderMilestone.workOrderMilestoneTimeString;
|
||||||
|
}
|
||||||
|
|
||||||
(
|
(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#milestoneEdit--workOrderMilestoneDescription"
|
"#milestoneEdit--workOrderMilestoneDescription"
|
||||||
|
|
@ -1219,26 +1322,52 @@ declare const bulmaJS: BulmaJS;
|
||||||
document
|
document
|
||||||
.querySelector("#button--addMilestone")
|
.querySelector("#button--addMilestone")
|
||||||
.addEventListener("click", () => {
|
.addEventListener("click", () => {
|
||||||
|
let addModalElement: HTMLElement;
|
||||||
let addCloseModalFunction: () => void;
|
let addCloseModalFunction: () => void;
|
||||||
|
|
||||||
const doAdd = (submitEvent: SubmitEvent) => {
|
const doAdd = (submitEvent: SubmitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
|
|
||||||
cityssm.postJSON(
|
const currentDateString = cityssm.dateToString(new Date());
|
||||||
urlPrefix + "/workOrders/doAddWorkOrderMilestone",
|
|
||||||
submitEvent.currentTarget,
|
|
||||||
(responseJSON: {
|
|
||||||
success: boolean;
|
|
||||||
errorMessage?: string;
|
|
||||||
workOrderMilestones?: recordTypes.WorkOrderMilestone[];
|
|
||||||
}) => {
|
|
||||||
processMilestoneResponse(responseJSON);
|
|
||||||
|
|
||||||
if (responseJSON.success) {
|
const _doAdd = () => {
|
||||||
addCloseModalFunction();
|
cityssm.postJSON(
|
||||||
|
urlPrefix + "/workOrders/doAddWorkOrderMilestone",
|
||||||
|
submitEvent.currentTarget,
|
||||||
|
(responseJSON: {
|
||||||
|
success: boolean;
|
||||||
|
errorMessage?: string;
|
||||||
|
workOrderMilestones?: recordTypes.WorkOrderMilestone[];
|
||||||
|
}) => {
|
||||||
|
processMilestoneResponse(responseJSON);
|
||||||
|
|
||||||
|
if (responseJSON.success) {
|
||||||
|
addCloseModalFunction();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
);
|
};
|
||||||
|
|
||||||
|
if (
|
||||||
|
(
|
||||||
|
addModalElement.querySelector(
|
||||||
|
"#milestoneAdd--workOrderMilestoneDateString"
|
||||||
|
) as HTMLInputElement
|
||||||
|
).value < currentDateString
|
||||||
|
) {
|
||||||
|
bulmaJS.confirm({
|
||||||
|
title: "Milestone Date in the Past",
|
||||||
|
message:
|
||||||
|
"Are you sure you want to create a milestone with a date in the past?",
|
||||||
|
contextualColorName: "warning",
|
||||||
|
okButton: {
|
||||||
|
text: "Yes, Create a Past Milestone",
|
||||||
|
callbackFunction: _doAdd
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
_doAdd();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
cityssm.openHtmlModal("workOrder-addMilestone", {
|
cityssm.openHtmlModal("workOrder-addMilestone", {
|
||||||
|
|
@ -1272,8 +1401,11 @@ declare const bulmaJS: BulmaJS;
|
||||||
).valueAsDate = new Date();
|
).valueAsDate = new Date();
|
||||||
},
|
},
|
||||||
onshown: (modalElement, closeModalFunction) => {
|
onshown: (modalElement, closeModalFunction) => {
|
||||||
|
addModalElement = modalElement;
|
||||||
addCloseModalFunction = closeModalFunction;
|
addCloseModalFunction = closeModalFunction;
|
||||||
|
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
|
|
||||||
modalElement
|
modalElement
|
||||||
.querySelector("form")
|
.querySelector("form")
|
||||||
.addEventListener("submit", doAdd);
|
.addEventListener("submit", doAdd);
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,121 @@
|
||||||
"use strict";
|
"use strict";
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
(() => {
|
(() => {
|
||||||
|
const los = exports.los;
|
||||||
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
||||||
const workOrderSearchFiltersFormElement = document.querySelector("#form--searchFilters");
|
const workOrderSearchFiltersFormElement = document.querySelector("#form--searchFilters");
|
||||||
const workOrderMilestoneDateFilterElement = workOrderSearchFiltersFormElement.querySelector("#searchFilter--workOrderMilestoneDateFilter");
|
const workOrderMilestoneDateFilterElement = workOrderSearchFiltersFormElement.querySelector("#searchFilter--workOrderMilestoneDateFilter");
|
||||||
const workOrderMilestoneDateStringElement = workOrderSearchFiltersFormElement.querySelector("#searchFilter--workOrderMilestoneDateString");
|
const workOrderMilestoneDateStringElement = workOrderSearchFiltersFormElement.querySelector("#searchFilter--workOrderMilestoneDateString");
|
||||||
|
const milestoneCalendarContainerElement = document.querySelector("#container--milestoneCalendar");
|
||||||
const renderMilestones = (workOrderMilestones) => {
|
const renderMilestones = (workOrderMilestones) => {
|
||||||
|
if (workOrderMilestones.length === 0) {
|
||||||
|
milestoneCalendarContainerElement.innerHTML =
|
||||||
|
'<div class="message is-info">' +
|
||||||
|
'<p class="message-body">There are no milestones that meet the search criteria.</p>' +
|
||||||
|
"</div>";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
milestoneCalendarContainerElement.innerHTML = "";
|
||||||
|
let currentDate = cityssm.dateToString(new Date());
|
||||||
|
let currentPanelElement;
|
||||||
|
let currentPanelDateString = "";
|
||||||
|
for (const milestone of workOrderMilestones) {
|
||||||
|
if (currentPanelDateString !== milestone.workOrderMilestoneDateString) {
|
||||||
|
if (currentPanelElement) {
|
||||||
|
milestoneCalendarContainerElement.append(currentPanelElement);
|
||||||
|
}
|
||||||
|
currentPanelElement = document.createElement("div");
|
||||||
|
currentPanelElement.className = "panel";
|
||||||
|
currentPanelElement.innerHTML =
|
||||||
|
'<h2 class="panel-heading">' +
|
||||||
|
milestone.workOrderMilestoneDateString +
|
||||||
|
"</h2>";
|
||||||
|
currentPanelDateString = milestone.workOrderMilestoneDateString;
|
||||||
|
}
|
||||||
|
const panelBlockElement = document.createElement("div");
|
||||||
|
panelBlockElement.className = "panel-block is-block";
|
||||||
|
if (!milestone.workOrderMilestoneCompletionDate && milestone.workOrderMilestoneDateString < currentDate) {
|
||||||
|
panelBlockElement.classList.add("has-background-warning-light");
|
||||||
|
}
|
||||||
|
let lotOccupancyHTML = "";
|
||||||
|
for (const lot of milestone.workOrder.workOrderLots) {
|
||||||
|
lotOccupancyHTML +=
|
||||||
|
'<i class="fas fa-vector-square" aria-label="' +
|
||||||
|
cityssm.escapeHTML(exports.aliases.lot) +
|
||||||
|
'"></i> ' +
|
||||||
|
cityssm.escapeHTML(lot.lotName) +
|
||||||
|
"<br />";
|
||||||
|
}
|
||||||
|
for (const lotOccupancy of milestone.workOrder
|
||||||
|
.workOrderLotOccupancies) {
|
||||||
|
if (lotOccupancy.lotOccupancyOccupants.length > 0) {
|
||||||
|
lotOccupancyHTML +=
|
||||||
|
'<i class="fas fa-user" aria-label="' +
|
||||||
|
cityssm.escapeHTML(exports.aliases.lotOccupancy) +
|
||||||
|
'"></i> ' +
|
||||||
|
cityssm.escapeHTML(lotOccupancy.lotOccupancyOccupants[0].occupantName) +
|
||||||
|
"<br />";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
panelBlockElement.innerHTML =
|
||||||
|
'<div class="columns">' +
|
||||||
|
('<div class="column is-narrow">' +
|
||||||
|
'<span class="icon is-small">' +
|
||||||
|
(milestone.workOrderMilestoneCompletionDate
|
||||||
|
? '<i class="fas fa-check" aria-label="Completed"></i>'
|
||||||
|
: '<i class="far fa-square has-text-grey" aria-label="Incomplete"></i>') +
|
||||||
|
"</span>" +
|
||||||
|
"</div>") +
|
||||||
|
('<div class="column">' +
|
||||||
|
(milestone.workOrderMilestoneTime === 0
|
||||||
|
? ""
|
||||||
|
: milestone.workOrderMilestoneTimeString + "<br />") +
|
||||||
|
(milestone.workOrderMilestoneTypeId
|
||||||
|
? "<strong>" +
|
||||||
|
cityssm.escapeHTML(milestone.workOrderMilestoneType) +
|
||||||
|
"</strong><br />"
|
||||||
|
: "") +
|
||||||
|
'<span class="is-size-7">' +
|
||||||
|
cityssm.escapeHTML(milestone.workOrderMilestoneDescription) +
|
||||||
|
"</span>" +
|
||||||
|
"</div>") +
|
||||||
|
('<div class="column">' +
|
||||||
|
"<i class=\"fas fa-circle\" style=\"color:" + los.getRandomColor(milestone.workOrder.workOrderNumber) + "\" aria-hidden=\"true\"></i>" +
|
||||||
|
' <a class="has-text-weight-bold" href="' +
|
||||||
|
urlPrefix +
|
||||||
|
"/workOrders/" +
|
||||||
|
milestone.workOrderId +
|
||||||
|
'">' +
|
||||||
|
cityssm.escapeHTML(milestone.workOrder.workOrderNumber) +
|
||||||
|
"</a><br />" +
|
||||||
|
'<span class="is-size-7">' +
|
||||||
|
cityssm.escapeHTML(milestone.workOrder.workOrderDescription) +
|
||||||
|
"</span>" +
|
||||||
|
"</div>") +
|
||||||
|
('<div class="column is-size-7">' +
|
||||||
|
lotOccupancyHTML +
|
||||||
|
"</div>") +
|
||||||
|
"</div>";
|
||||||
|
currentPanelElement.append(panelBlockElement);
|
||||||
|
}
|
||||||
|
milestoneCalendarContainerElement.append(currentPanelElement);
|
||||||
};
|
};
|
||||||
const getMilestones = (event) => {
|
const getMilestones = (event) => {
|
||||||
if (event) {
|
if (event) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
}
|
}
|
||||||
|
milestoneCalendarContainerElement.innerHTML =
|
||||||
|
'<div class="has-text-grey has-text-centered">' +
|
||||||
|
'<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />' +
|
||||||
|
"Loading Milestones..." +
|
||||||
|
"</div>";
|
||||||
cityssm.postJSON(urlPrefix + "/workOrders/doGetWorkOrderMilestones", workOrderSearchFiltersFormElement, (responseJSON) => {
|
cityssm.postJSON(urlPrefix + "/workOrders/doGetWorkOrderMilestones", workOrderSearchFiltersFormElement, (responseJSON) => {
|
||||||
renderMilestones(responseJSON.workOrderMilestones);
|
renderMilestones(responseJSON.workOrderMilestones);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
workOrderMilestoneDateFilterElement.addEventListener("change", () => {
|
workOrderMilestoneDateFilterElement.addEventListener("change", () => {
|
||||||
workOrderMilestoneDateStringElement.disabled = (workOrderMilestoneDateFilterElement.value !== "date");
|
workOrderMilestoneDateStringElement.disabled =
|
||||||
|
workOrderMilestoneDateFilterElement.value !== "date";
|
||||||
getMilestones();
|
getMilestones();
|
||||||
});
|
});
|
||||||
workOrderMilestoneDateStringElement.addEventListener("change", getMilestones);
|
workOrderMilestoneDateStringElement.addEventListener("change", getMilestones);
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,152 @@
|
||||||
/* eslint-disable unicorn/prefer-module */
|
/* eslint-disable unicorn/prefer-module */
|
||||||
|
|
||||||
import type * as recordTypes from "../types/recordTypes";
|
import type * as recordTypes from "../types/recordTypes";
|
||||||
|
import type * as globalTypes from "../types/globalTypes";
|
||||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal;
|
||||||
|
|
||||||
(() => {
|
(() => {
|
||||||
|
const los = exports.los as globalTypes.LOS;
|
||||||
|
|
||||||
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
||||||
|
|
||||||
const workOrderSearchFiltersFormElement = document.querySelector("#form--searchFilters") as HTMLFormElement;
|
const workOrderSearchFiltersFormElement = document.querySelector(
|
||||||
|
"#form--searchFilters"
|
||||||
|
) as HTMLFormElement;
|
||||||
|
|
||||||
const workOrderMilestoneDateFilterElement = workOrderSearchFiltersFormElement.querySelector("#searchFilter--workOrderMilestoneDateFilter") as HTMLSelectElement;
|
const workOrderMilestoneDateFilterElement =
|
||||||
const workOrderMilestoneDateStringElement = workOrderSearchFiltersFormElement.querySelector("#searchFilter--workOrderMilestoneDateString") as HTMLInputElement;
|
workOrderSearchFiltersFormElement.querySelector(
|
||||||
|
"#searchFilter--workOrderMilestoneDateFilter"
|
||||||
|
) as HTMLSelectElement;
|
||||||
|
|
||||||
const renderMilestones = (workOrderMilestones: recordTypes.WorkOrderMilestone[]) => {
|
const workOrderMilestoneDateStringElement =
|
||||||
|
workOrderSearchFiltersFormElement.querySelector(
|
||||||
|
"#searchFilter--workOrderMilestoneDateString"
|
||||||
|
) as HTMLInputElement;
|
||||||
|
|
||||||
|
const milestoneCalendarContainerElement = document.querySelector(
|
||||||
|
"#container--milestoneCalendar"
|
||||||
|
) as HTMLElement;
|
||||||
|
|
||||||
|
const renderMilestones = (
|
||||||
|
workOrderMilestones: recordTypes.WorkOrderMilestone[]
|
||||||
|
) => {
|
||||||
|
if (workOrderMilestones.length === 0) {
|
||||||
|
milestoneCalendarContainerElement.innerHTML =
|
||||||
|
'<div class="message is-info">' +
|
||||||
|
'<p class="message-body">There are no milestones that meet the search criteria.</p>' +
|
||||||
|
"</div>";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
milestoneCalendarContainerElement.innerHTML = "";
|
||||||
|
|
||||||
|
let currentDate = cityssm.dateToString(new Date());
|
||||||
|
|
||||||
|
let currentPanelElement: HTMLElement;
|
||||||
|
let currentPanelDateString = "";
|
||||||
|
|
||||||
|
for (const milestone of workOrderMilestones) {
|
||||||
|
if (currentPanelDateString !== milestone.workOrderMilestoneDateString) {
|
||||||
|
if (currentPanelElement) {
|
||||||
|
milestoneCalendarContainerElement.append(
|
||||||
|
currentPanelElement
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
currentPanelElement = document.createElement("div");
|
||||||
|
currentPanelElement.className = "panel";
|
||||||
|
|
||||||
|
currentPanelElement.innerHTML =
|
||||||
|
'<h2 class="panel-heading">' +
|
||||||
|
milestone.workOrderMilestoneDateString +
|
||||||
|
"</h2>";
|
||||||
|
|
||||||
|
currentPanelDateString = milestone.workOrderMilestoneDateString;
|
||||||
|
}
|
||||||
|
|
||||||
|
const panelBlockElement = document.createElement("div");
|
||||||
|
|
||||||
|
panelBlockElement.className = "panel-block is-block";
|
||||||
|
|
||||||
|
if (!milestone.workOrderMilestoneCompletionDate && milestone.workOrderMilestoneDateString < currentDate) {
|
||||||
|
panelBlockElement.classList.add("has-background-warning-light");
|
||||||
|
}
|
||||||
|
|
||||||
|
let lotOccupancyHTML = "";
|
||||||
|
|
||||||
|
for (const lot of milestone.workOrder.workOrderLots) {
|
||||||
|
lotOccupancyHTML +=
|
||||||
|
'<i class="fas fa-vector-square" aria-label="' +
|
||||||
|
cityssm.escapeHTML(exports.aliases.lot) +
|
||||||
|
'"></i> ' +
|
||||||
|
cityssm.escapeHTML(lot.lotName) +
|
||||||
|
"<br />";
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const lotOccupancy of milestone.workOrder
|
||||||
|
.workOrderLotOccupancies) {
|
||||||
|
if (lotOccupancy.lotOccupancyOccupants.length > 0) {
|
||||||
|
lotOccupancyHTML +=
|
||||||
|
'<i class="fas fa-user" aria-label="' +
|
||||||
|
cityssm.escapeHTML(exports.aliases.lotOccupancy) +
|
||||||
|
'"></i> ' +
|
||||||
|
cityssm.escapeHTML(
|
||||||
|
lotOccupancy.lotOccupancyOccupants[0].occupantName
|
||||||
|
) +
|
||||||
|
"<br />";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
panelBlockElement.innerHTML =
|
||||||
|
'<div class="columns">' +
|
||||||
|
('<div class="column is-narrow">' +
|
||||||
|
'<span class="icon is-small">' +
|
||||||
|
(milestone.workOrderMilestoneCompletionDate
|
||||||
|
? '<i class="fas fa-check" aria-label="Completed"></i>'
|
||||||
|
: '<i class="far fa-square has-text-grey" aria-label="Incomplete"></i>') +
|
||||||
|
"</span>" +
|
||||||
|
"</div>") +
|
||||||
|
('<div class="column">' +
|
||||||
|
(milestone.workOrderMilestoneTime === 0
|
||||||
|
? ""
|
||||||
|
: milestone.workOrderMilestoneTimeString + "<br />") +
|
||||||
|
(milestone.workOrderMilestoneTypeId
|
||||||
|
? "<strong>" +
|
||||||
|
cityssm.escapeHTML(milestone.workOrderMilestoneType) +
|
||||||
|
"</strong><br />"
|
||||||
|
: "") +
|
||||||
|
'<span class="is-size-7">' +
|
||||||
|
cityssm.escapeHTML(
|
||||||
|
milestone.workOrderMilestoneDescription
|
||||||
|
) +
|
||||||
|
"</span>" +
|
||||||
|
"</div>") +
|
||||||
|
('<div class="column">' +
|
||||||
|
"<i class=\"fas fa-circle\" style=\"color:" + los.getRandomColor(milestone.workOrder.workOrderNumber) + "\" aria-hidden=\"true\"></i>" +
|
||||||
|
' <a class="has-text-weight-bold" href="' +
|
||||||
|
urlPrefix +
|
||||||
|
"/workOrders/" +
|
||||||
|
milestone.workOrderId +
|
||||||
|
'">' +
|
||||||
|
cityssm.escapeHTML(milestone.workOrder.workOrderNumber) +
|
||||||
|
"</a><br />" +
|
||||||
|
'<span class="is-size-7">' +
|
||||||
|
cityssm.escapeHTML(
|
||||||
|
milestone.workOrder.workOrderDescription
|
||||||
|
) +
|
||||||
|
"</span>" +
|
||||||
|
"</div>") +
|
||||||
|
('<div class="column is-size-7">' +
|
||||||
|
lotOccupancyHTML +
|
||||||
|
"</div>") +
|
||||||
|
"</div>";
|
||||||
|
|
||||||
|
currentPanelElement.append(panelBlockElement);
|
||||||
|
}
|
||||||
|
|
||||||
|
milestoneCalendarContainerElement.append(currentPanelElement);
|
||||||
};
|
};
|
||||||
|
|
||||||
const getMilestones = (event?: Event) => {
|
const getMilestones = (event?: Event) => {
|
||||||
|
|
@ -23,20 +154,34 @@ declare const cityssm: cityssmGlobal;
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
cityssm.postJSON(urlPrefix + "/workOrders/doGetWorkOrderMilestones",
|
milestoneCalendarContainerElement.innerHTML =
|
||||||
workOrderSearchFiltersFormElement,
|
'<div class="has-text-grey has-text-centered">' +
|
||||||
(responseJSON: {workOrderMilestones: recordTypes.WorkOrderMilestone[]}) => {
|
'<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />' +
|
||||||
renderMilestones(responseJSON.workOrderMilestones);
|
"Loading Milestones..." +
|
||||||
})
|
"</div>";
|
||||||
} ;
|
|
||||||
|
cityssm.postJSON(
|
||||||
|
urlPrefix + "/workOrders/doGetWorkOrderMilestones",
|
||||||
|
workOrderSearchFiltersFormElement,
|
||||||
|
(responseJSON: {
|
||||||
|
workOrderMilestones: recordTypes.WorkOrderMilestone[];
|
||||||
|
}) => {
|
||||||
|
renderMilestones(responseJSON.workOrderMilestones);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
workOrderMilestoneDateFilterElement.addEventListener("change", () => {
|
workOrderMilestoneDateFilterElement.addEventListener("change", () => {
|
||||||
workOrderMilestoneDateStringElement.disabled = (workOrderMilestoneDateFilterElement.value !== "date");
|
workOrderMilestoneDateStringElement.disabled =
|
||||||
|
workOrderMilestoneDateFilterElement.value !== "date";
|
||||||
getMilestones();
|
getMilestones();
|
||||||
});
|
});
|
||||||
|
|
||||||
workOrderMilestoneDateStringElement.addEventListener("change", getMilestones);
|
workOrderMilestoneDateStringElement.addEventListener(
|
||||||
|
"change",
|
||||||
|
getMilestones
|
||||||
|
);
|
||||||
workOrderSearchFiltersFormElement.addEventListener("submit", getMilestones);
|
workOrderSearchFiltersFormElement.addEventListener("submit", getMilestones);
|
||||||
|
|
||||||
getMilestones();
|
getMilestones();
|
||||||
})();
|
})();
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=e=>{const t=e.currentTarget.closest(".field").querySelector("input, select");if("INPUT"===t.tagName)t.readOnly=!1;else{const e=t.querySelectorAll("option");for(const t of e)t.disabled=!1}t.focus()},t={highlightMap:(e,t,s)=>{let o,a=t;for(;!(o=e.querySelector("#"+a))&&a.includes("-");)a=a.slice(0,Math.max(0,a.lastIndexOf("-")));if(o){o.style.fill=null,o.classList.add("highlight","is-"+s);const e=o.querySelectorAll("path");for(const t of e)t.style.fill=null}},initializeUnlockFieldButtons:t=>{const s=t.querySelectorAll(".is-unlock-field-button");for(const t of s)t.addEventListener("click",e)},populateAliases:e=>{const t=e.querySelectorAll(".alias");for(const e of t)switch(e.dataset.alias){case"Lot":e.textContent=exports.aliases.lot;break;case"lot":e.textContent=exports.aliases.lot.toLowerCase();break;case"Occupancy":e.textContent=exports.aliases.occupancy;break;case"occupancy":e.textContent=exports.aliases.occupancy.toLowerCase();break;case"Occupant":e.textContent=exports.aliases.occupant;break;case"occupant":e.textContent=exports.aliases.occupant.toLowerCase();break;case"ExternalReceiptNumber":e.textContent=exports.aliases.externalReceiptNumber}}};exports.los=t})();
|
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=e=>{const t=e.currentTarget.closest(".field").querySelector("input, select");if("INPUT"===t.tagName)t.readOnly=!1;else{const e=t.querySelectorAll("option");for(const t of e)t.disabled=!1}t.focus()},t=["red","green","orange","blue","pink","yellow","purple"],o=["bright","light","dark"],l={highlightMap:(e,t,o)=>{let l,s=t;for(;!(l=e.querySelector("#"+s))&&s.includes("-");)s=s.slice(0,Math.max(0,s.lastIndexOf("-")));if(l){l.style.fill=null,l.classList.add("highlight","is-"+o);const e=l.querySelectorAll("path");for(const t of e)t.style.fill=null}},initializeUnlockFieldButtons:t=>{const o=t.querySelectorAll(".is-unlock-field-button");for(const t of o)t.addEventListener("click",e)},populateAliases:e=>{const t=e.querySelectorAll(".alias");for(const e of t)switch(e.dataset.alias){case"Lot":e.textContent=exports.aliases.lot;break;case"lot":e.textContent=exports.aliases.lot.toLowerCase();break;case"Occupancy":e.textContent=exports.aliases.occupancy;break;case"occupancy":e.textContent=exports.aliases.occupancy.toLowerCase();break;case"Occupant":e.textContent=exports.aliases.occupant;break;case"occupant":e.textContent=exports.aliases.occupant.toLowerCase();break;case"ExternalReceiptNumber":e.textContent=exports.aliases.externalReceiptNumber}},getRandomColor:e=>{let l=e;return l.length<2&&(l+="a1"),exports.randomColor({seed:l+l,hue:t[l.codePointAt(l.length-1)%t.length],luminosity:o[l.codePointAt(l.length-2)%o.length]})}};exports.los=l})();
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -1 +1 @@
|
||||||
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=document.querySelector("main").dataset.urlPrefix,r=document.querySelector("#form--searchFilters"),t=r.querySelector("#searchFilter--workOrderMilestoneDateFilter"),s=r.querySelector("#searchFilter--workOrderMilestoneDateString"),o=t=>{t&&t.preventDefault(),cityssm.postJSON(e+"/workOrders/doGetWorkOrderMilestones",r,e=>{e.workOrderMilestones})};t.addEventListener("change",()=>{s.disabled="date"!==t.value,o()}),s.addEventListener("change",o),r.addEventListener("submit",o),o()})();
|
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=exports.los,r=document.querySelector("main").dataset.urlPrefix,s=document.querySelector("#form--searchFilters"),a=s.querySelector("#searchFilter--workOrderMilestoneDateFilter"),t=s.querySelector("#searchFilter--workOrderMilestoneDateString"),i=document.querySelector("#container--milestoneCalendar"),o=a=>{a&&a.preventDefault(),i.innerHTML='<div class="has-text-grey has-text-centered"><i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />Loading Milestones...</div>',cityssm.postJSON(r+"/workOrders/doGetWorkOrderMilestones",s,s=>{(s=>{if(0===s.length)return void(i.innerHTML='<div class="message is-info"><p class="message-body">There are no milestones that meet the search criteria.</p></div>');i.innerHTML="";let a,t=cityssm.dateToString(new Date),o="";for(const n of s){o!==n.workOrderMilestoneDateString&&(a&&i.append(a),(a=document.createElement("div")).className="panel",a.innerHTML='<h2 class="panel-heading">'+n.workOrderMilestoneDateString+"</h2>",o=n.workOrderMilestoneDateString);const s=document.createElement("div");s.className="panel-block is-block",!n.workOrderMilestoneCompletionDate&&n.workOrderMilestoneDateString<t&&s.classList.add("has-background-warning-light");let c="";for(const e of n.workOrder.workOrderLots)c+='<i class="fas fa-vector-square" aria-label="'+cityssm.escapeHTML(exports.aliases.lot)+'"></i> '+cityssm.escapeHTML(e.lotName)+"<br />";for(const e of n.workOrder.workOrderLotOccupancies)e.lotOccupancyOccupants.length>0&&(c+='<i class="fas fa-user" aria-label="'+cityssm.escapeHTML(exports.aliases.lotOccupancy)+'"></i> '+cityssm.escapeHTML(e.lotOccupancyOccupants[0].occupantName)+"<br />");s.innerHTML='<div class="columns"><div class="column is-narrow"><span class="icon is-small">'+(n.workOrderMilestoneCompletionDate?'<i class="fas fa-check" aria-label="Completed"></i>':'<i class="far fa-square has-text-grey" aria-label="Incomplete"></i>')+'</span></div><div class="column">'+(0===n.workOrderMilestoneTime?"":n.workOrderMilestoneTimeString+"<br />")+(n.workOrderMilestoneTypeId?"<strong>"+cityssm.escapeHTML(n.workOrderMilestoneType)+"</strong><br />":"")+'<span class="is-size-7">'+cityssm.escapeHTML(n.workOrderMilestoneDescription)+'</span></div><div class="column"><i class="fas fa-circle" style="color:'+e.getRandomColor(n.workOrder.workOrderNumber)+'" aria-hidden="true"></i> <a class="has-text-weight-bold" href="'+r+"/workOrders/"+n.workOrderId+'">'+cityssm.escapeHTML(n.workOrder.workOrderNumber)+'</a><br /><span class="is-size-7">'+cityssm.escapeHTML(n.workOrder.workOrderDescription)+'</span></div><div class="column is-size-7">'+c+"</div></div>",a.append(s)}i.append(a)})(s.workOrderMilestones)})};a.addEventListener("change",()=>{t.disabled="date"!==a.value,o()}),t.addEventListener("change",o),s.addEventListener("submit",o),o()})();
|
||||||
|
|
@ -3,12 +3,15 @@ import * as permissionHandlers from "../handlers/permissions.js";
|
||||||
import handler_search from "../handlers/workOrders-get/search.js";
|
import handler_search from "../handlers/workOrders-get/search.js";
|
||||||
import handler_doSearchWorkOrders from "../handlers/workOrders-post/doSearchWorkOrders.js";
|
import handler_doSearchWorkOrders from "../handlers/workOrders-post/doSearchWorkOrders.js";
|
||||||
import handler_milestoneCalendar from "../handlers/workOrders-get/milestoneCalendar.js";
|
import handler_milestoneCalendar from "../handlers/workOrders-get/milestoneCalendar.js";
|
||||||
|
import handler_doGetWorkOrderMilestones from "../handlers/workOrders-post/doGetWorkOrderMilestones.js";
|
||||||
import handler_view from "../handlers/workOrders-get/view.js";
|
import handler_view from "../handlers/workOrders-get/view.js";
|
||||||
import handler_doReopenWorkOrder from "../handlers/workOrders-post/doReopenWorkOrder.js";
|
import handler_doReopenWorkOrder from "../handlers/workOrders-post/doReopenWorkOrder.js";
|
||||||
import handler_new from "../handlers/workOrders-get/new.js";
|
import handler_new from "../handlers/workOrders-get/new.js";
|
||||||
import handler_doCreateWorkOrder from "../handlers/workOrders-post/doCreateWorkOrder.js";
|
import handler_doCreateWorkOrder from "../handlers/workOrders-post/doCreateWorkOrder.js";
|
||||||
import handler_edit from "../handlers/workOrders-get/edit.js";
|
import handler_edit from "../handlers/workOrders-get/edit.js";
|
||||||
import handler_doUpdateWorkOrder from "../handlers/workOrders-post/doUpdateWorkOrder.js";
|
import handler_doUpdateWorkOrder from "../handlers/workOrders-post/doUpdateWorkOrder.js";
|
||||||
|
import handler_doCloseWorkOrder from "../handlers/workOrders-post/doCloseWorkOrder.js";
|
||||||
|
import handler_doDeleteWorkOrder from "../handlers/workOrders-post/doDeleteWorkOrder.js";
|
||||||
import handler_doAddWorkOrderLotOccupancy from "../handlers/workOrders-post/doAddWorkOrderLotOccupancy.js";
|
import handler_doAddWorkOrderLotOccupancy from "../handlers/workOrders-post/doAddWorkOrderLotOccupancy.js";
|
||||||
import handler_doDeleteWorkOrderLotOccupancy from "../handlers/workOrders-post/doDeleteWorkOrderLotOccupancy.js";
|
import handler_doDeleteWorkOrderLotOccupancy from "../handlers/workOrders-post/doDeleteWorkOrderLotOccupancy.js";
|
||||||
import handler_doAddWorkOrderLot from "../handlers/workOrders-post/doAddWorkOrderLot.js";
|
import handler_doAddWorkOrderLot from "../handlers/workOrders-post/doAddWorkOrderLot.js";
|
||||||
|
|
@ -22,12 +25,15 @@ export const router = Router();
|
||||||
router.get("/", handler_search);
|
router.get("/", handler_search);
|
||||||
router.post("/doSearchWorkOrders", handler_doSearchWorkOrders);
|
router.post("/doSearchWorkOrders", handler_doSearchWorkOrders);
|
||||||
router.get("/milestoneCalendar", handler_milestoneCalendar);
|
router.get("/milestoneCalendar", handler_milestoneCalendar);
|
||||||
|
router.post("/doGetWorkOrderMilestones", handler_doGetWorkOrderMilestones);
|
||||||
router.get("/new", permissionHandlers.adminGetHandler, handler_new);
|
router.get("/new", permissionHandlers.adminGetHandler, handler_new);
|
||||||
router.post("/doCreateWorkOrder", permissionHandlers.updatePostHandler, handler_doCreateWorkOrder);
|
router.post("/doCreateWorkOrder", permissionHandlers.updatePostHandler, handler_doCreateWorkOrder);
|
||||||
router.get("/:workOrderId", handler_view);
|
router.get("/:workOrderId", handler_view);
|
||||||
router.post("/doReopenWorkOrder", permissionHandlers.updatePostHandler, handler_doReopenWorkOrder);
|
router.post("/doReopenWorkOrder", permissionHandlers.updatePostHandler, handler_doReopenWorkOrder);
|
||||||
router.get("/:workOrderId/edit", permissionHandlers.updateGetHandler, handler_edit);
|
router.get("/:workOrderId/edit", permissionHandlers.updateGetHandler, handler_edit);
|
||||||
router.post("/doUpdateWorkOrder", permissionHandlers.updatePostHandler, handler_doUpdateWorkOrder);
|
router.post("/doUpdateWorkOrder", permissionHandlers.updatePostHandler, handler_doUpdateWorkOrder);
|
||||||
|
router.post("/doCloseWorkOrder", permissionHandlers.updatePostHandler, handler_doCloseWorkOrder);
|
||||||
|
router.post("/doDeleteWorkOrder", permissionHandlers.updatePostHandler, handler_doDeleteWorkOrder);
|
||||||
router.post("/doAddWorkOrderLotOccupancy", permissionHandlers.updatePostHandler, handler_doAddWorkOrderLotOccupancy);
|
router.post("/doAddWorkOrderLotOccupancy", permissionHandlers.updatePostHandler, handler_doAddWorkOrderLotOccupancy);
|
||||||
router.post("/doDeleteWorkOrderLotOccupancy", permissionHandlers.updatePostHandler, handler_doDeleteWorkOrderLotOccupancy);
|
router.post("/doDeleteWorkOrderLotOccupancy", permissionHandlers.updatePostHandler, handler_doDeleteWorkOrderLotOccupancy);
|
||||||
router.post("/doAddWorkOrderLot", permissionHandlers.updatePostHandler, handler_doAddWorkOrderLot);
|
router.post("/doAddWorkOrderLot", permissionHandlers.updatePostHandler, handler_doAddWorkOrderLot);
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import handler_search from "../handlers/workOrders-get/search.js";
|
||||||
import handler_doSearchWorkOrders from "../handlers/workOrders-post/doSearchWorkOrders.js";
|
import handler_doSearchWorkOrders from "../handlers/workOrders-post/doSearchWorkOrders.js";
|
||||||
|
|
||||||
import handler_milestoneCalendar from "../handlers/workOrders-get/milestoneCalendar.js";
|
import handler_milestoneCalendar from "../handlers/workOrders-get/milestoneCalendar.js";
|
||||||
|
import handler_doGetWorkOrderMilestones from "../handlers/workOrders-post/doGetWorkOrderMilestones.js";
|
||||||
|
|
||||||
import handler_view from "../handlers/workOrders-get/view.js";
|
import handler_view from "../handlers/workOrders-get/view.js";
|
||||||
import handler_doReopenWorkOrder from "../handlers/workOrders-post/doReopenWorkOrder.js";
|
import handler_doReopenWorkOrder from "../handlers/workOrders-post/doReopenWorkOrder.js";
|
||||||
|
|
@ -15,6 +16,8 @@ import handler_doCreateWorkOrder from "../handlers/workOrders-post/doCreateWorkO
|
||||||
|
|
||||||
import handler_edit from "../handlers/workOrders-get/edit.js";
|
import handler_edit from "../handlers/workOrders-get/edit.js";
|
||||||
import handler_doUpdateWorkOrder from "../handlers/workOrders-post/doUpdateWorkOrder.js";
|
import handler_doUpdateWorkOrder from "../handlers/workOrders-post/doUpdateWorkOrder.js";
|
||||||
|
import handler_doCloseWorkOrder from "../handlers/workOrders-post/doCloseWorkOrder.js";
|
||||||
|
import handler_doDeleteWorkOrder from "../handlers/workOrders-post/doDeleteWorkOrder.js";
|
||||||
|
|
||||||
import handler_doAddWorkOrderLotOccupancy from "../handlers/workOrders-post/doAddWorkOrderLotOccupancy.js";
|
import handler_doAddWorkOrderLotOccupancy from "../handlers/workOrders-post/doAddWorkOrderLotOccupancy.js";
|
||||||
import handler_doDeleteWorkOrderLotOccupancy from "../handlers/workOrders-post/doDeleteWorkOrderLotOccupancy.js";
|
import handler_doDeleteWorkOrderLotOccupancy from "../handlers/workOrders-post/doDeleteWorkOrderLotOccupancy.js";
|
||||||
|
|
@ -40,6 +43,8 @@ router.post("/doSearchWorkOrders", handler_doSearchWorkOrders);
|
||||||
|
|
||||||
router.get("/milestoneCalendar", handler_milestoneCalendar);
|
router.get("/milestoneCalendar", handler_milestoneCalendar);
|
||||||
|
|
||||||
|
router.post("/doGetWorkOrderMilestones", handler_doGetWorkOrderMilestones);
|
||||||
|
|
||||||
// New
|
// New
|
||||||
|
|
||||||
router.get("/new", permissionHandlers.adminGetHandler, handler_new);
|
router.get("/new", permissionHandlers.adminGetHandler, handler_new);
|
||||||
|
|
@ -74,6 +79,20 @@ router.post(
|
||||||
handler_doUpdateWorkOrder
|
handler_doUpdateWorkOrder
|
||||||
);
|
);
|
||||||
|
|
||||||
|
router.post(
|
||||||
|
"/doCloseWorkOrder",
|
||||||
|
permissionHandlers.updatePostHandler,
|
||||||
|
handler_doCloseWorkOrder
|
||||||
|
);
|
||||||
|
|
||||||
|
router.post(
|
||||||
|
"/doDeleteWorkOrder",
|
||||||
|
permissionHandlers.updatePostHandler,
|
||||||
|
handler_doDeleteWorkOrder
|
||||||
|
);
|
||||||
|
|
||||||
|
// Lot Occupancy
|
||||||
|
|
||||||
router.post(
|
router.post(
|
||||||
"/doAddWorkOrderLotOccupancy",
|
"/doAddWorkOrderLotOccupancy",
|
||||||
permissionHandlers.updatePostHandler,
|
permissionHandlers.updatePostHandler,
|
||||||
|
|
|
||||||
|
|
@ -728,7 +728,11 @@ function importFromWorkOrderCSV() {
|
||||||
workOrderRow.WO_REMARK3).trim(),
|
workOrderRow.WO_REMARK3).trim(),
|
||||||
workOrderOpenDateString
|
workOrderOpenDateString
|
||||||
}, user);
|
}, user);
|
||||||
workOrder = getWorkOrder(workOrderId);
|
workOrder = getWorkOrder(workOrderId, {
|
||||||
|
includeLotsAndLotOccupancies: true,
|
||||||
|
includeComments: true,
|
||||||
|
includeMilestones: true
|
||||||
|
});
|
||||||
}
|
}
|
||||||
let lot;
|
let lot;
|
||||||
if (workOrderRow.WO_CEMETERY !== "00") {
|
if (workOrderRow.WO_CEMETERY !== "00") {
|
||||||
|
|
@ -912,7 +916,11 @@ function importFromWorkOrderCSV() {
|
||||||
}
|
}
|
||||||
if (workOrderRow.WO_FUNERAL_YR) {
|
if (workOrderRow.WO_FUNERAL_YR) {
|
||||||
const workOrderMilestoneDateString = formatDateString(workOrderRow.WO_FUNERAL_YR, workOrderRow.WO_FUNERAL_MON, workOrderRow.WO_FUNERAL_DAY);
|
const workOrderMilestoneDateString = formatDateString(workOrderRow.WO_FUNERAL_YR, workOrderRow.WO_FUNERAL_MON, workOrderRow.WO_FUNERAL_DAY);
|
||||||
const workOrderMilestoneTimeString = formatTimeString(workOrderRow.WO_FUNERAL_HR, workOrderRow.WO_FUNERAL_MIN);
|
let funeralHour = Number.parseInt(workOrderRow.WO_FUNERAL_HR, 10);
|
||||||
|
if (funeralHour <= 6) {
|
||||||
|
funeralHour += 12;
|
||||||
|
}
|
||||||
|
const workOrderMilestoneTimeString = formatTimeString(funeralHour.toString(), workOrderRow.WO_FUNERAL_MIN);
|
||||||
addWorkOrderMilestone({
|
addWorkOrderMilestone({
|
||||||
workOrderId: workOrder.workOrderId,
|
workOrderId: workOrder.workOrderId,
|
||||||
workOrderMilestoneTypeId: funeralWorkOrderMilestoneType.workOrderMilestoneTypeId,
|
workOrderMilestoneTypeId: funeralWorkOrderMilestoneType.workOrderMilestoneTypeId,
|
||||||
|
|
|
||||||
|
|
@ -1295,7 +1295,11 @@ function importFromWorkOrderCSV() {
|
||||||
user
|
user
|
||||||
);
|
);
|
||||||
|
|
||||||
workOrder = getWorkOrder(workOrderId);
|
workOrder = getWorkOrder(workOrderId, {
|
||||||
|
includeLotsAndLotOccupancies: true,
|
||||||
|
includeComments: true,
|
||||||
|
includeMilestones: true
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
let lot: recordTypes.Lot;
|
let lot: recordTypes.Lot;
|
||||||
|
|
@ -1628,8 +1632,13 @@ function importFromWorkOrderCSV() {
|
||||||
workOrderRow.WO_FUNERAL_DAY
|
workOrderRow.WO_FUNERAL_DAY
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let funeralHour = Number.parseInt(workOrderRow.WO_FUNERAL_HR, 10);
|
||||||
|
if (funeralHour <= 6) {
|
||||||
|
funeralHour += 12;
|
||||||
|
}
|
||||||
|
|
||||||
const workOrderMilestoneTimeString = formatTimeString(
|
const workOrderMilestoneTimeString = formatTimeString(
|
||||||
workOrderRow.WO_FUNERAL_HR,
|
funeralHour.toString(),
|
||||||
workOrderRow.WO_FUNERAL_MIN
|
workOrderRow.WO_FUNERAL_MIN
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,8 @@ export interface Config {
|
||||||
};
|
};
|
||||||
workOrders?: {
|
workOrders?: {
|
||||||
workOrderNumberLength?: number;
|
workOrderNumberLength?: number;
|
||||||
|
workOrderMilestoneDateRecentBeforeDays?: number;
|
||||||
|
workOrderMilestoneDateRecentAfterDays?: number;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,8 @@ export interface Config {
|
||||||
};
|
};
|
||||||
workOrders?: {
|
workOrders?: {
|
||||||
workOrderNumberLength?: number;
|
workOrderNumberLength?: number;
|
||||||
|
workOrderMilestoneDateRecentBeforeDays?: number;
|
||||||
|
workOrderMilestoneDateRecentAfterDays?: number;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,4 +2,5 @@ export interface LOS {
|
||||||
highlightMap: (mapContainerElement: HTMLElement, mapKey: string, contextualClass: "success" | "danger") => void;
|
highlightMap: (mapContainerElement: HTMLElement, mapKey: string, contextualClass: "success" | "danger") => void;
|
||||||
initializeUnlockFieldButtons: (containerElement: HTMLElement) => void;
|
initializeUnlockFieldButtons: (containerElement: HTMLElement) => void;
|
||||||
populateAliases: (containerElement: HTMLElement) => void;
|
populateAliases: (containerElement: HTMLElement) => void;
|
||||||
|
getRandomColor: (seedString: string) => string;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1 +1,2 @@
|
||||||
export {};
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
|
|
||||||
|
|
@ -6,4 +6,5 @@ export interface LOS {
|
||||||
) => void;
|
) => void;
|
||||||
initializeUnlockFieldButtons: (containerElement: HTMLElement) => void;
|
initializeUnlockFieldButtons: (containerElement: HTMLElement) => void;
|
||||||
populateAliases: (containerElement: HTMLElement) => void;
|
populateAliases: (containerElement: HTMLElement) => void;
|
||||||
|
getRandomColor: (seedString: string) => string;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -209,6 +209,7 @@ export interface WorkOrderComment extends Record {
|
||||||
export interface WorkOrderMilestone extends Record {
|
export interface WorkOrderMilestone extends Record {
|
||||||
workOrderMilestoneId?: number;
|
workOrderMilestoneId?: number;
|
||||||
workOrderId?: number;
|
workOrderId?: number;
|
||||||
|
workOrder?: WorkOrder;
|
||||||
workOrderMilestoneTypeId?: number;
|
workOrderMilestoneTypeId?: number;
|
||||||
workOrderMilestoneType?: string;
|
workOrderMilestoneType?: string;
|
||||||
workOrderMilestoneDate?: number;
|
workOrderMilestoneDate?: number;
|
||||||
|
|
|
||||||
|
|
@ -279,7 +279,9 @@ export interface WorkOrderComment extends Record {
|
||||||
|
|
||||||
export interface WorkOrderMilestone extends Record {
|
export interface WorkOrderMilestone extends Record {
|
||||||
workOrderMilestoneId?: number;
|
workOrderMilestoneId?: number;
|
||||||
|
|
||||||
workOrderId?: number;
|
workOrderId?: number;
|
||||||
|
workOrder?: WorkOrder;
|
||||||
|
|
||||||
workOrderMilestoneTypeId?: number;
|
workOrderMilestoneTypeId?: number;
|
||||||
workOrderMilestoneType?: string;
|
workOrderMilestoneType?: string;
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@
|
||||||
<script src="<%= urlPrefix %>/lib/cityssm-bulma-js/bulma-js.js"></script>
|
<script src="<%= urlPrefix %>/lib/cityssm-bulma-js/bulma-js.js"></script>
|
||||||
<script src="<%= urlPrefix %>/lib/cityssm-bulma-webapp-js/dist/cityssm.min.js"></script>
|
<script src="<%= urlPrefix %>/lib/cityssm-bulma-webapp-js/dist/cityssm.min.js"></script>
|
||||||
<script src="<%= urlPrefix %>/lib/leaflet/leaflet.js"></script>
|
<script src="<%= urlPrefix %>/lib/leaflet/leaflet.js"></script>
|
||||||
|
<script src="<%= urlPrefix %>/lib/randomcolor/randomcolor.js"></script>
|
||||||
<script>
|
<script>
|
||||||
cityssm.htmlModalFolder ="<%= urlPrefix %>/html/";
|
cityssm.htmlModalFolder ="<%= urlPrefix %>/html/";
|
||||||
bulmaJS.init();
|
bulmaJS.init();
|
||||||
|
|
|
||||||
|
|
@ -115,6 +115,12 @@
|
||||||
</span>
|
</span>
|
||||||
</button>
|
</button>
|
||||||
<% if (!isCreate) { %>
|
<% if (!isCreate) { %>
|
||||||
|
<button class="button is-primary ml-2" id="button--closeWorkOrder" type="button">
|
||||||
|
<span class="icon is-small"><i class="fas fa-stop-circle" aria-hidden="true"></i></span>
|
||||||
|
<span>
|
||||||
|
Close Work Order
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
<div class="dropdown is-right ml-2">
|
<div class="dropdown is-right ml-2">
|
||||||
<div class="dropdown-trigger">
|
<div class="dropdown-trigger">
|
||||||
<button class="button" type="button">
|
<button class="button" type="button">
|
||||||
|
|
@ -124,7 +130,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="dropdown-menu">
|
<div class="dropdown-menu">
|
||||||
<div class="dropdown-content">
|
<div class="dropdown-content">
|
||||||
<a class="dropdown-item" href="#">
|
<a class="dropdown-item" id="button--deleteWorkOrder" href="#">
|
||||||
<span class="icon is-small">
|
<span class="icon is-small">
|
||||||
<i class="fas fa-trash has-text-danger" aria-hidden="true"></i>
|
<i class="fas fa-trash has-text-danger" aria-hidden="true"></i>
|
||||||
</span>
|
</span>
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,5 @@
|
||||||
<%- include('_header'); -%>
|
<%- include('_header'); -%>
|
||||||
|
|
||||||
<%- include('_header'); -%>
|
|
||||||
|
|
||||||
<div class="columns">
|
<div class="columns">
|
||||||
<div class="column is-3 is-hidden-mobile">
|
<div class="column is-3 is-hidden-mobile">
|
||||||
<%- include('_menu-workOrders'); -%>
|
<%- include('_menu-workOrders'); -%>
|
||||||
|
|
@ -36,7 +34,7 @@
|
||||||
<label class="label" for="searchFilter--workOrderMilestoneDateFilter">Miestone Date Filter Type</label>
|
<label class="label" for="searchFilter--workOrderMilestoneDateFilter">Miestone Date Filter Type</label>
|
||||||
<div class="control">
|
<div class="control">
|
||||||
<div class="select is-fullwidth">
|
<div class="select is-fullwidth">
|
||||||
<select id="searchFilter--workOrderMilestoneDateFilter">
|
<select id="searchFilter--workOrderMilestoneDateFilter" name="workOrderMilestoneDateFilter">
|
||||||
<option value="upcomingMissed" selected>Upcoming and Missed</option>
|
<option value="upcomingMissed" selected>Upcoming and Missed</option>
|
||||||
<option value="recent">Recent</option>
|
<option value="recent">Recent</option>
|
||||||
<option value="date">Specific Date</option>
|
<option value="date">Specific Date</option>
|
||||||
|
|
@ -56,6 +54,8 @@
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div id="container--milestoneCalendar"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,5 @@
|
||||||
<%- include('_header'); -%>
|
<%- include('_header'); -%>
|
||||||
|
|
||||||
<%- include('_header'); -%>
|
|
||||||
|
|
||||||
<div class="columns">
|
<div class="columns">
|
||||||
<div class="column is-3 is-hidden-mobile">
|
<div class="column is-3 is-hidden-mobile">
|
||||||
<%- include('_menu-workOrders'); -%>
|
<%- include('_menu-workOrders'); -%>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue