From 326cac8717ea1d036b217c88f2a23ed19ec5d635 Mon Sep 17 00:00:00 2001 From: Dan Gowans Date: Thu, 15 Sep 2022 12:57:19 -0400 Subject: [PATCH] milestone type maintenance --- handlers/admin-get/tables.js | 4 +- handlers/admin-get/tables.ts | 3 + .../doAddWorkOrderMilestoneType.d.ts | 3 + .../admin-post/doAddWorkOrderMilestoneType.js | 12 + .../admin-post/doAddWorkOrderMilestoneType.ts | 19 ++ .../doDeleteWorkOrderMilestoneType.d.ts | 3 + .../doDeleteWorkOrderMilestoneType.js | 11 + .../doDeleteWorkOrderMilestoneType.ts | 21 ++ .../doMoveWorkOrderMilestoneTypeDown.d.ts | 3 + .../doMoveWorkOrderMilestoneTypeDown.js | 11 + .../doMoveWorkOrderMilestoneTypeDown.ts | 18 ++ .../doMoveWorkOrderMilestoneTypeUp.d.ts | 3 + .../doMoveWorkOrderMilestoneTypeUp.js | 11 + .../doMoveWorkOrderMilestoneTypeUp.ts | 18 ++ .../doUpdateWorkOrderMilestoneType.d.ts | 3 + .../doUpdateWorkOrderMilestoneType.js | 11 + .../doUpdateWorkOrderMilestoneType.ts | 18 ++ .../deleteWorkOrderMilestoneType.d.ts | 3 + .../deleteWorkOrderMilestoneType.js | 17 ++ .../deleteWorkOrderMilestoneType.ts | 33 +++ .../getWorkOrderMilestoneTypes.js | 2 +- .../getWorkOrderMilestoneTypes.ts | 2 +- .../moveWorkOrderMilestoneTypeDown.d.ts | 2 + .../moveWorkOrderMilestoneTypeDown.js | 26 ++ .../moveWorkOrderMilestoneTypeDown.ts | 44 +++ .../moveWorkOrderMilestoneTypeUp.d.ts | 2 + .../moveWorkOrderMilestoneTypeUp.js | 30 ++ .../moveWorkOrderMilestoneTypeUp.ts | 49 ++++ .../updateWorkOrderMilestoneType.d.ts | 7 + .../updateWorkOrderMilestoneType.js | 19 ++ .../updateWorkOrderMilestoneType.ts | 45 +++ public-typescript/adminTables.js | 192 +++++++++++++ public-typescript/adminTables.ts | 268 ++++++++++++++++++ public/javascripts/adminTables.min.js | 2 +- routes/admin.js | 10 + routes/admin.ts | 37 +++ views/admin-tables.ejs | 37 +++ 37 files changed, 995 insertions(+), 4 deletions(-) create mode 100644 handlers/admin-post/doAddWorkOrderMilestoneType.d.ts create mode 100644 handlers/admin-post/doAddWorkOrderMilestoneType.js create mode 100644 handlers/admin-post/doAddWorkOrderMilestoneType.ts create mode 100644 handlers/admin-post/doDeleteWorkOrderMilestoneType.d.ts create mode 100644 handlers/admin-post/doDeleteWorkOrderMilestoneType.js create mode 100644 handlers/admin-post/doDeleteWorkOrderMilestoneType.ts create mode 100644 handlers/admin-post/doMoveWorkOrderMilestoneTypeDown.d.ts create mode 100644 handlers/admin-post/doMoveWorkOrderMilestoneTypeDown.js create mode 100644 handlers/admin-post/doMoveWorkOrderMilestoneTypeDown.ts create mode 100644 handlers/admin-post/doMoveWorkOrderMilestoneTypeUp.d.ts create mode 100644 handlers/admin-post/doMoveWorkOrderMilestoneTypeUp.js create mode 100644 handlers/admin-post/doMoveWorkOrderMilestoneTypeUp.ts create mode 100644 handlers/admin-post/doUpdateWorkOrderMilestoneType.d.ts create mode 100644 handlers/admin-post/doUpdateWorkOrderMilestoneType.js create mode 100644 handlers/admin-post/doUpdateWorkOrderMilestoneType.ts create mode 100644 helpers/lotOccupancyDB/deleteWorkOrderMilestoneType.d.ts create mode 100644 helpers/lotOccupancyDB/deleteWorkOrderMilestoneType.js create mode 100644 helpers/lotOccupancyDB/deleteWorkOrderMilestoneType.ts create mode 100644 helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeDown.d.ts create mode 100644 helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeDown.js create mode 100644 helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeDown.ts create mode 100644 helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeUp.d.ts create mode 100644 helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeUp.js create mode 100644 helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeUp.ts create mode 100644 helpers/lotOccupancyDB/updateWorkOrderMilestoneType.d.ts create mode 100644 helpers/lotOccupancyDB/updateWorkOrderMilestoneType.js create mode 100644 helpers/lotOccupancyDB/updateWorkOrderMilestoneType.ts diff --git a/handlers/admin-get/tables.js b/handlers/admin-get/tables.js index d96e137c..c4b12261 100644 --- a/handlers/admin-get/tables.js +++ b/handlers/admin-get/tables.js @@ -1,11 +1,13 @@ -import { getLotOccupantTypes, getLotStatuses, getWorkOrderTypes } from "../../helpers/functions.cache.js"; +import { getLotOccupantTypes, getLotStatuses, getWorkOrderMilestoneTypes, getWorkOrderTypes } from "../../helpers/functions.cache.js"; export const handler = (_request, response) => { const workOrderTypes = getWorkOrderTypes(); + const workOrderMilestoneTypes = getWorkOrderMilestoneTypes(); const lotStatuses = getLotStatuses(); const lotOccupantTypes = getLotOccupantTypes(); response.render("admin-tables", { headTitle: "Config Table Management", workOrderTypes, + workOrderMilestoneTypes, lotStatuses, lotOccupantTypes }); diff --git a/handlers/admin-get/tables.ts b/handlers/admin-get/tables.ts index 6b074e52..a2f85429 100644 --- a/handlers/admin-get/tables.ts +++ b/handlers/admin-get/tables.ts @@ -3,17 +3,20 @@ import type { RequestHandler } from "express"; import { getLotOccupantTypes, getLotStatuses, + getWorkOrderMilestoneTypes, getWorkOrderTypes } from "../../helpers/functions.cache.js"; export const handler: RequestHandler = (_request, response) => { const workOrderTypes = getWorkOrderTypes(); + const workOrderMilestoneTypes = getWorkOrderMilestoneTypes(); const lotStatuses = getLotStatuses(); const lotOccupantTypes = getLotOccupantTypes(); response.render("admin-tables", { headTitle: "Config Table Management", workOrderTypes, + workOrderMilestoneTypes, lotStatuses, lotOccupantTypes }); diff --git a/handlers/admin-post/doAddWorkOrderMilestoneType.d.ts b/handlers/admin-post/doAddWorkOrderMilestoneType.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/admin-post/doAddWorkOrderMilestoneType.d.ts @@ -0,0 +1,3 @@ +import type { RequestHandler } from "express"; +export declare const handler: RequestHandler; +export default handler; diff --git a/handlers/admin-post/doAddWorkOrderMilestoneType.js b/handlers/admin-post/doAddWorkOrderMilestoneType.js new file mode 100644 index 00000000..3fea74d1 --- /dev/null +++ b/handlers/admin-post/doAddWorkOrderMilestoneType.js @@ -0,0 +1,12 @@ +import { addWorkOrderMilestoneType } from "../../helpers/lotOccupancyDB/addWorkOrderMilestoneType.js"; +import { getWorkOrderMilestoneTypes } from "../../helpers/functions.cache.js"; +export const handler = async (request, response) => { + const workOrderMilestoneTypeId = addWorkOrderMilestoneType(request.body, request.session); + const workOrderMilestoneTypes = getWorkOrderMilestoneTypes(); + response.json({ + success: true, + workOrderMilestoneTypeId, + workOrderMilestoneTypes + }); +}; +export default handler; diff --git a/handlers/admin-post/doAddWorkOrderMilestoneType.ts b/handlers/admin-post/doAddWorkOrderMilestoneType.ts new file mode 100644 index 00000000..3f06bf1f --- /dev/null +++ b/handlers/admin-post/doAddWorkOrderMilestoneType.ts @@ -0,0 +1,19 @@ +import type { RequestHandler } from "express"; + +import { addWorkOrderMilestoneType } from "../../helpers/lotOccupancyDB/addWorkOrderMilestoneType.js"; + +import { getWorkOrderMilestoneTypes } from "../../helpers/functions.cache.js"; + +export const handler: RequestHandler = async (request, response) => { + const workOrderMilestoneTypeId = addWorkOrderMilestoneType(request.body, request.session); + + const workOrderMilestoneTypes = getWorkOrderMilestoneTypes(); + + response.json({ + success: true, + workOrderMilestoneTypeId, + workOrderMilestoneTypes + }); +}; + +export default handler; diff --git a/handlers/admin-post/doDeleteWorkOrderMilestoneType.d.ts b/handlers/admin-post/doDeleteWorkOrderMilestoneType.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/admin-post/doDeleteWorkOrderMilestoneType.d.ts @@ -0,0 +1,3 @@ +import type { RequestHandler } from "express"; +export declare const handler: RequestHandler; +export default handler; diff --git a/handlers/admin-post/doDeleteWorkOrderMilestoneType.js b/handlers/admin-post/doDeleteWorkOrderMilestoneType.js new file mode 100644 index 00000000..37de25e5 --- /dev/null +++ b/handlers/admin-post/doDeleteWorkOrderMilestoneType.js @@ -0,0 +1,11 @@ +import { deleteWorkOrderMilestoneType } from "../../helpers/lotOccupancyDB/deleteWorkOrderMilestoneType.js"; +import { getWorkOrderMilestoneTypes } from "../../helpers/functions.cache.js"; +export const handler = async (request, response) => { + const success = deleteWorkOrderMilestoneType(request.body.workOrderMilestoneTypeId, request.session); + const workOrderMilestoneTypes = getWorkOrderMilestoneTypes(); + response.json({ + success, + workOrderMilestoneTypes + }); +}; +export default handler; diff --git a/handlers/admin-post/doDeleteWorkOrderMilestoneType.ts b/handlers/admin-post/doDeleteWorkOrderMilestoneType.ts new file mode 100644 index 00000000..475cbea9 --- /dev/null +++ b/handlers/admin-post/doDeleteWorkOrderMilestoneType.ts @@ -0,0 +1,21 @@ +import type { RequestHandler } from "express"; + +import { deleteWorkOrderMilestoneType } from "../../helpers/lotOccupancyDB/deleteWorkOrderMilestoneType.js"; + +import { getWorkOrderMilestoneTypes } from "../../helpers/functions.cache.js"; + +export const handler: RequestHandler = async (request, response) => { + const success = deleteWorkOrderMilestoneType( + request.body.workOrderMilestoneTypeId, + request.session + ); + + const workOrderMilestoneTypes = getWorkOrderMilestoneTypes(); + + response.json({ + success, + workOrderMilestoneTypes + }); +}; + +export default handler; diff --git a/handlers/admin-post/doMoveWorkOrderMilestoneTypeDown.d.ts b/handlers/admin-post/doMoveWorkOrderMilestoneTypeDown.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/admin-post/doMoveWorkOrderMilestoneTypeDown.d.ts @@ -0,0 +1,3 @@ +import type { RequestHandler } from "express"; +export declare const handler: RequestHandler; +export default handler; diff --git a/handlers/admin-post/doMoveWorkOrderMilestoneTypeDown.js b/handlers/admin-post/doMoveWorkOrderMilestoneTypeDown.js new file mode 100644 index 00000000..b212f180 --- /dev/null +++ b/handlers/admin-post/doMoveWorkOrderMilestoneTypeDown.js @@ -0,0 +1,11 @@ +import { moveWorkOrderMilestoneTypeDown } from "../../helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeDown.js"; +import { getWorkOrderMilestoneTypes } from "../../helpers/functions.cache.js"; +export const handler = async (request, response) => { + const success = moveWorkOrderMilestoneTypeDown(request.body.workOrderMilestoneTypeId); + const workOrderMilestoneTypes = getWorkOrderMilestoneTypes(); + response.json({ + success, + workOrderMilestoneTypes + }); +}; +export default handler; diff --git a/handlers/admin-post/doMoveWorkOrderMilestoneTypeDown.ts b/handlers/admin-post/doMoveWorkOrderMilestoneTypeDown.ts new file mode 100644 index 00000000..f0dd3a97 --- /dev/null +++ b/handlers/admin-post/doMoveWorkOrderMilestoneTypeDown.ts @@ -0,0 +1,18 @@ +import type { RequestHandler } from "express"; + +import { moveWorkOrderMilestoneTypeDown } from "../../helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeDown.js"; + +import { getWorkOrderMilestoneTypes } from "../../helpers/functions.cache.js"; + +export const handler: RequestHandler = async (request, response) => { + const success = moveWorkOrderMilestoneTypeDown(request.body.workOrderMilestoneTypeId); + + const workOrderMilestoneTypes = getWorkOrderMilestoneTypes(); + + response.json({ + success, + workOrderMilestoneTypes + }); +}; + +export default handler; diff --git a/handlers/admin-post/doMoveWorkOrderMilestoneTypeUp.d.ts b/handlers/admin-post/doMoveWorkOrderMilestoneTypeUp.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/admin-post/doMoveWorkOrderMilestoneTypeUp.d.ts @@ -0,0 +1,3 @@ +import type { RequestHandler } from "express"; +export declare const handler: RequestHandler; +export default handler; diff --git a/handlers/admin-post/doMoveWorkOrderMilestoneTypeUp.js b/handlers/admin-post/doMoveWorkOrderMilestoneTypeUp.js new file mode 100644 index 00000000..072b6645 --- /dev/null +++ b/handlers/admin-post/doMoveWorkOrderMilestoneTypeUp.js @@ -0,0 +1,11 @@ +import { moveWorkOrderMilestoneTypeUp } from "../../helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeUp.js"; +import { getWorkOrderMilestoneTypes } from "../../helpers/functions.cache.js"; +export const handler = async (request, response) => { + const success = moveWorkOrderMilestoneTypeUp(request.body.workOrderMilestoneTypeId); + const workOrderMilestoneTypes = getWorkOrderMilestoneTypes(); + response.json({ + success, + workOrderMilestoneTypes + }); +}; +export default handler; diff --git a/handlers/admin-post/doMoveWorkOrderMilestoneTypeUp.ts b/handlers/admin-post/doMoveWorkOrderMilestoneTypeUp.ts new file mode 100644 index 00000000..1dd3eb8c --- /dev/null +++ b/handlers/admin-post/doMoveWorkOrderMilestoneTypeUp.ts @@ -0,0 +1,18 @@ +import type { RequestHandler } from "express"; + +import { moveWorkOrderMilestoneTypeUp } from "../../helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeUp.js"; + +import { getWorkOrderMilestoneTypes } from "../../helpers/functions.cache.js"; + +export const handler: RequestHandler = async (request, response) => { + const success = moveWorkOrderMilestoneTypeUp(request.body.workOrderMilestoneTypeId); + + const workOrderMilestoneTypes = getWorkOrderMilestoneTypes(); + + response.json({ + success, + workOrderMilestoneTypes + }); +}; + +export default handler; diff --git a/handlers/admin-post/doUpdateWorkOrderMilestoneType.d.ts b/handlers/admin-post/doUpdateWorkOrderMilestoneType.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/admin-post/doUpdateWorkOrderMilestoneType.d.ts @@ -0,0 +1,3 @@ +import type { RequestHandler } from "express"; +export declare const handler: RequestHandler; +export default handler; diff --git a/handlers/admin-post/doUpdateWorkOrderMilestoneType.js b/handlers/admin-post/doUpdateWorkOrderMilestoneType.js new file mode 100644 index 00000000..643626d7 --- /dev/null +++ b/handlers/admin-post/doUpdateWorkOrderMilestoneType.js @@ -0,0 +1,11 @@ +import { updateWorkOrderMilestoneType } from "../../helpers/lotOccupancyDB/updateWorkOrderMilestoneType.js"; +import { getWorkOrderMilestoneTypes } from "../../helpers/functions.cache.js"; +export const handler = async (request, response) => { + const success = updateWorkOrderMilestoneType(request.body, request.session); + const workOrderMilestoneTypes = getWorkOrderMilestoneTypes(); + response.json({ + success, + workOrderMilestoneTypes + }); +}; +export default handler; diff --git a/handlers/admin-post/doUpdateWorkOrderMilestoneType.ts b/handlers/admin-post/doUpdateWorkOrderMilestoneType.ts new file mode 100644 index 00000000..63f88241 --- /dev/null +++ b/handlers/admin-post/doUpdateWorkOrderMilestoneType.ts @@ -0,0 +1,18 @@ +import type { RequestHandler } from "express"; + +import { updateWorkOrderMilestoneType } from "../../helpers/lotOccupancyDB/updateWorkOrderMilestoneType.js"; + +import { getWorkOrderMilestoneTypes } from "../../helpers/functions.cache.js"; + +export const handler: RequestHandler = async (request, response) => { + const success = updateWorkOrderMilestoneType(request.body, request.session); + + const workOrderMilestoneTypes = getWorkOrderMilestoneTypes(); + + response.json({ + success, + workOrderMilestoneTypes + }); +}; + +export default handler; diff --git a/helpers/lotOccupancyDB/deleteWorkOrderMilestoneType.d.ts b/helpers/lotOccupancyDB/deleteWorkOrderMilestoneType.d.ts new file mode 100644 index 00000000..a84c7757 --- /dev/null +++ b/helpers/lotOccupancyDB/deleteWorkOrderMilestoneType.d.ts @@ -0,0 +1,3 @@ +import type * as recordTypes from "../../types/recordTypes"; +export declare const deleteWorkOrderMilestoneType: (workOrderMilestoneTypeId: number | string, requestSession: recordTypes.PartialSession) => boolean; +export default deleteWorkOrderMilestoneType; diff --git a/helpers/lotOccupancyDB/deleteWorkOrderMilestoneType.js b/helpers/lotOccupancyDB/deleteWorkOrderMilestoneType.js new file mode 100644 index 00000000..05a1b9ea --- /dev/null +++ b/helpers/lotOccupancyDB/deleteWorkOrderMilestoneType.js @@ -0,0 +1,17 @@ +import sqlite from "better-sqlite3"; +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { clearWorkOrderMilestoneTypesCache } from "../functions.cache.js"; +export const deleteWorkOrderMilestoneType = (workOrderMilestoneTypeId, requestSession) => { + const database = sqlite(databasePath); + const rightNowMillis = Date.now(); + const result = database + .prepare("update WorkOrderMilestoneTypes" + + " set recordDelete_userName = ?," + + " recordDelete_timeMillis = ?" + + " where workOrderMilestoneTypeId = ?") + .run(requestSession.user.userName, rightNowMillis, workOrderMilestoneTypeId); + database.close(); + clearWorkOrderMilestoneTypesCache(); + return result.changes > 0; +}; +export default deleteWorkOrderMilestoneType; diff --git a/helpers/lotOccupancyDB/deleteWorkOrderMilestoneType.ts b/helpers/lotOccupancyDB/deleteWorkOrderMilestoneType.ts new file mode 100644 index 00000000..1af50800 --- /dev/null +++ b/helpers/lotOccupancyDB/deleteWorkOrderMilestoneType.ts @@ -0,0 +1,33 @@ +import sqlite from "better-sqlite3"; + +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; + +import { clearWorkOrderMilestoneTypesCache } from "../functions.cache.js"; + +import type * as recordTypes from "../../types/recordTypes"; + +export const deleteWorkOrderMilestoneType = ( + workOrderMilestoneTypeId: number | string, + requestSession: recordTypes.PartialSession +): boolean => { + const database = sqlite(databasePath); + + const rightNowMillis = Date.now(); + + const result = database + .prepare( + "update WorkOrderMilestoneTypes" + + " set recordDelete_userName = ?," + + " recordDelete_timeMillis = ?" + + " where workOrderMilestoneTypeId = ?" + ) + .run(requestSession.user.userName, rightNowMillis, workOrderMilestoneTypeId); + + database.close(); + + clearWorkOrderMilestoneTypesCache(); + + return result.changes > 0; +}; + +export default deleteWorkOrderMilestoneType; diff --git a/helpers/lotOccupancyDB/getWorkOrderMilestoneTypes.js b/helpers/lotOccupancyDB/getWorkOrderMilestoneTypes.js index 7db9dc5d..e98da0b3 100644 --- a/helpers/lotOccupancyDB/getWorkOrderMilestoneTypes.js +++ b/helpers/lotOccupancyDB/getWorkOrderMilestoneTypes.js @@ -12,7 +12,7 @@ export const getWorkOrderMilestoneTypes = () => { for (const workOrderMilestoneType of workOrderMilestoneTypes) { if (workOrderMilestoneType.orderNumber !== expectedOrderNumber) { database - .prepare("update WorkOrdeMilestoneTypes" + + .prepare("update WorkOrderMilestoneTypes" + " set orderNumber = ?" + " where workOrderMilestoneTypeId = ?") .run(expectedOrderNumber, workOrderMilestoneType.workOrderMilestoneTypeId); diff --git a/helpers/lotOccupancyDB/getWorkOrderMilestoneTypes.ts b/helpers/lotOccupancyDB/getWorkOrderMilestoneTypes.ts index f58faa1b..24d3c0e8 100644 --- a/helpers/lotOccupancyDB/getWorkOrderMilestoneTypes.ts +++ b/helpers/lotOccupancyDB/getWorkOrderMilestoneTypes.ts @@ -22,7 +22,7 @@ export const getWorkOrderMilestoneTypes = (): recordTypes.WorkOrderMilestoneType if (workOrderMilestoneType.orderNumber !== expectedOrderNumber) { database .prepare( - "update WorkOrdeMilestoneTypes" + + "update WorkOrderMilestoneTypes" + " set orderNumber = ?" + " where workOrderMilestoneTypeId = ?" ) diff --git a/helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeDown.d.ts b/helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeDown.d.ts new file mode 100644 index 00000000..db79e8df --- /dev/null +++ b/helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeDown.d.ts @@ -0,0 +1,2 @@ +export declare const moveWorkOrderMilestoneTypeDown: (workOrderMilestoneTypeId: number | string) => boolean; +export default moveWorkOrderMilestoneTypeDown; diff --git a/helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeDown.js b/helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeDown.js new file mode 100644 index 00000000..33fd5e34 --- /dev/null +++ b/helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeDown.js @@ -0,0 +1,26 @@ +import sqlite from "better-sqlite3"; +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { clearWorkOrderMilestoneTypesCache } from "../functions.cache.js"; +export const moveWorkOrderMilestoneTypeDown = (workOrderMilestoneTypeId) => { + const database = sqlite(databasePath); + const currentOrderNumber = database + .prepare("select orderNumber" + + " from WorkOrderMilestoneTypes" + + " where workOrderMilestoneTypeId = ?") + .get(workOrderMilestoneTypeId).orderNumber; + database + .prepare("update WorkOrderMilestoneTypes" + + " set orderNumber = orderNumber - 1" + + " where recordDelete_timeMillis is null" + + " and orderNumber = ? + 1") + .run(currentOrderNumber); + const result = database + .prepare("update WorkOrderMilestoneTypes" + + " set orderNumber = ? + 1" + + " where workOrderMilestoneTypeId = ?") + .run(currentOrderNumber, workOrderMilestoneTypeId); + database.close(); + clearWorkOrderMilestoneTypesCache(); + return result.changes > 0; +}; +export default moveWorkOrderMilestoneTypeDown; diff --git a/helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeDown.ts b/helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeDown.ts new file mode 100644 index 00000000..54be7264 --- /dev/null +++ b/helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeDown.ts @@ -0,0 +1,44 @@ +import sqlite from "better-sqlite3"; + +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; + +import { clearWorkOrderMilestoneTypesCache } from "../functions.cache.js"; + +export const moveWorkOrderMilestoneTypeDown = ( + workOrderMilestoneTypeId: number | string +): boolean => { + const database = sqlite(databasePath); + + const currentOrderNumber: number = database + .prepare( + "select orderNumber" + + " from WorkOrderMilestoneTypes" + + " where workOrderMilestoneTypeId = ?" + ) + .get(workOrderMilestoneTypeId).orderNumber; + + database + .prepare( + "update WorkOrderMilestoneTypes" + + " set orderNumber = orderNumber - 1" + + " where recordDelete_timeMillis is null" + + " and orderNumber = ? + 1" + ) + .run(currentOrderNumber); + + const result = database + .prepare( + "update WorkOrderMilestoneTypes" + + " set orderNumber = ? + 1" + + " where workOrderMilestoneTypeId = ?" + ) + .run(currentOrderNumber, workOrderMilestoneTypeId); + + database.close(); + + clearWorkOrderMilestoneTypesCache(); + + return result.changes > 0; +}; + +export default moveWorkOrderMilestoneTypeDown; diff --git a/helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeUp.d.ts b/helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeUp.d.ts new file mode 100644 index 00000000..d76fc840 --- /dev/null +++ b/helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeUp.d.ts @@ -0,0 +1,2 @@ +export declare const moveWorkOrderMilestoneTypeUp: (workOrderMilestoneTypeId: number | string) => boolean; +export default moveWorkOrderMilestoneTypeUp; diff --git a/helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeUp.js b/helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeUp.js new file mode 100644 index 00000000..cc7f6ef2 --- /dev/null +++ b/helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeUp.js @@ -0,0 +1,30 @@ +import sqlite from "better-sqlite3"; +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { clearWorkOrderMilestoneTypesCache } from "../functions.cache.js"; +export const moveWorkOrderMilestoneTypeUp = (workOrderMilestoneTypeId) => { + const database = sqlite(databasePath); + const currentOrderNumber = database + .prepare("select orderNumber" + + " from WorkOrderMilestoneTypes" + + " where workOrderMilestoneTypeId = ?") + .get(workOrderMilestoneTypeId).orderNumber; + if (currentOrderNumber <= 0) { + database.close(); + return true; + } + database + .prepare("update WorkOrderMilestoneTypes" + + " set orderNumber = orderNumber + 1" + + " where recordDelete_timeMillis is null" + + " and orderNumber = ? - 1") + .run(currentOrderNumber); + const result = database + .prepare("update WorkOrderMilestoneTypes" + + " set orderNumber = ? - 1" + + " where workOrderMilestoneTypeId = ?") + .run(currentOrderNumber, workOrderMilestoneTypeId); + database.close(); + clearWorkOrderMilestoneTypesCache(); + return result.changes > 0; +}; +export default moveWorkOrderMilestoneTypeUp; diff --git a/helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeUp.ts b/helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeUp.ts new file mode 100644 index 00000000..21b7b984 --- /dev/null +++ b/helpers/lotOccupancyDB/moveWorkOrderMilestoneTypeUp.ts @@ -0,0 +1,49 @@ +import sqlite from "better-sqlite3"; + +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; + +import { clearWorkOrderMilestoneTypesCache } from "../functions.cache.js"; + +export const moveWorkOrderMilestoneTypeUp = ( + workOrderMilestoneTypeId: number | string +): boolean => { + const database = sqlite(databasePath); + + const currentOrderNumber: number = database + .prepare( + "select orderNumber" + + " from WorkOrderMilestoneTypes" + + " where workOrderMilestoneTypeId = ?" + ) + .get(workOrderMilestoneTypeId).orderNumber; + + if (currentOrderNumber <= 0) { + database.close(); + return true; + } + + database + .prepare( + "update WorkOrderMilestoneTypes" + + " set orderNumber = orderNumber + 1" + + " where recordDelete_timeMillis is null" + + " and orderNumber = ? - 1" + ) + .run(currentOrderNumber); + + const result = database + .prepare( + "update WorkOrderMilestoneTypes" + + " set orderNumber = ? - 1" + + " where workOrderMilestoneTypeId = ?" + ) + .run(currentOrderNumber, workOrderMilestoneTypeId); + + database.close(); + + clearWorkOrderMilestoneTypesCache(); + + return result.changes > 0; +}; + +export default moveWorkOrderMilestoneTypeUp; diff --git a/helpers/lotOccupancyDB/updateWorkOrderMilestoneType.d.ts b/helpers/lotOccupancyDB/updateWorkOrderMilestoneType.d.ts new file mode 100644 index 00000000..46216ddd --- /dev/null +++ b/helpers/lotOccupancyDB/updateWorkOrderMilestoneType.d.ts @@ -0,0 +1,7 @@ +import type * as recordTypes from "../../types/recordTypes"; +interface UpdateWorkOrderMilestoneTypeForm { + workOrderMilestoneTypeId: number | string; + workOrderMilestoneType: string; +} +export declare const updateWorkOrderMilestoneType: (workOrderMilestoneTypeForm: UpdateWorkOrderMilestoneTypeForm, requestSession: recordTypes.PartialSession) => boolean; +export default updateWorkOrderMilestoneType; diff --git a/helpers/lotOccupancyDB/updateWorkOrderMilestoneType.js b/helpers/lotOccupancyDB/updateWorkOrderMilestoneType.js new file mode 100644 index 00000000..2440a432 --- /dev/null +++ b/helpers/lotOccupancyDB/updateWorkOrderMilestoneType.js @@ -0,0 +1,19 @@ +import sqlite from "better-sqlite3"; +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { clearWorkOrderMilestoneTypesCache } from "../functions.cache.js"; +export const updateWorkOrderMilestoneType = (workOrderMilestoneTypeForm, requestSession) => { + const database = sqlite(databasePath); + const rightNowMillis = Date.now(); + const result = database + .prepare("update WorkOrderMilestoneTypes" + + " set workOrderMilestoneType = ?," + + " recordUpdate_userName = ?," + + " recordUpdate_timeMillis = ?" + + " where workOrderMilestoneTypeId = ?" + + " and recordDelete_timeMillis is null") + .run(workOrderMilestoneTypeForm.workOrderMilestoneType, requestSession.user.userName, rightNowMillis, workOrderMilestoneTypeForm.workOrderMilestoneTypeId); + database.close(); + clearWorkOrderMilestoneTypesCache(); + return result.changes > 0; +}; +export default updateWorkOrderMilestoneType; diff --git a/helpers/lotOccupancyDB/updateWorkOrderMilestoneType.ts b/helpers/lotOccupancyDB/updateWorkOrderMilestoneType.ts new file mode 100644 index 00000000..9ddde888 --- /dev/null +++ b/helpers/lotOccupancyDB/updateWorkOrderMilestoneType.ts @@ -0,0 +1,45 @@ +import sqlite from "better-sqlite3"; + +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; + +import { clearWorkOrderMilestoneTypesCache } from "../functions.cache.js"; + +import type * as recordTypes from "../../types/recordTypes"; + +interface UpdateWorkOrderMilestoneTypeForm { + workOrderMilestoneTypeId: number | string; + workOrderMilestoneType: string; +} + +export const updateWorkOrderMilestoneType = ( + workOrderMilestoneTypeForm: UpdateWorkOrderMilestoneTypeForm, + requestSession: recordTypes.PartialSession +): boolean => { + const database = sqlite(databasePath); + + const rightNowMillis = Date.now(); + + const result = database + .prepare( + "update WorkOrderMilestoneTypes" + + " set workOrderMilestoneType = ?," + + " recordUpdate_userName = ?," + + " recordUpdate_timeMillis = ?" + + " where workOrderMilestoneTypeId = ?" + + " and recordDelete_timeMillis is null" + ) + .run( + workOrderMilestoneTypeForm.workOrderMilestoneType, + requestSession.user.userName, + rightNowMillis, + workOrderMilestoneTypeForm.workOrderMilestoneTypeId + ); + + database.close(); + + clearWorkOrderMilestoneTypesCache(); + + return result.changes > 0; +}; + +export default updateWorkOrderMilestoneType; diff --git a/public-typescript/adminTables.js b/public-typescript/adminTables.js index f5f88ccd..7874a845 100644 --- a/public-typescript/adminTables.js +++ b/public-typescript/adminTables.js @@ -194,6 +194,198 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); }); renderWorkOrderTypes(); + let workOrderMilestoneTypes = exports.workOrderMilestoneTypes; + delete exports.workOrderMilestoneTypes; + const updateWorkOrderMilestoneType = (submitEvent) => { + submitEvent.preventDefault(); + cityssm.postJSON(urlPrefix + "/admin/doUpdateWorkOrderMilestoneType", submitEvent.currentTarget, (responseJSON) => { + if (responseJSON.success) { + workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes; + bulmaJS.alert({ + message: "Work Order Milestone Type Updated Successfully", + contextualColorName: "success" + }); + } + else { + bulmaJS.alert({ + title: "Error Updating Work Order Milestone Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + const deleteWorkOrderMilestoneType = (clickEvent) => { + const tableRowElement = clickEvent.currentTarget.closest("tr"); + const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId; + const doDelete = () => { + cityssm.postJSON(urlPrefix + "/admin/doDeleteWorkOrderMilestoneType", { + workOrderMilestoneTypeId + }, (responseJSON) => { + if (responseJSON.success) { + workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes; + if (workOrderMilestoneTypes.length === 0) { + renderWorkOrderMilestoneTypes(); + } + else { + tableRowElement.remove(); + } + bulmaJS.alert({ + message: "Work Order Milestone Type Deleted Successfully", + contextualColorName: "success" + }); + } + else { + bulmaJS.alert({ + title: "Error Deleting Work Order Milestone Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + bulmaJS.confirm({ + title: "Delete Work Order Milestone Type", + message: "Are you sure you want to delete this work order milestone type?
" + + "Note that no work orders will be removed.", + messageIsHtml: true, + contextualColorName: "warning", + okButton: { + text: "Yes, Delete Work Order Milestone Type", + callbackFunction: doDelete + } + }); + }; + const moveWorkOrderMilestoneTypeUp = (clickEvent) => { + const tableRowElement = clickEvent.currentTarget.closest("tr"); + const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId; + cityssm.postJSON(urlPrefix + "/admin/doMoveWorkOrderMilestoneTypeUp", { + workOrderMilestoneTypeId + }, (responseJSON) => { + if (responseJSON.success) { + workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes; + renderWorkOrderMilestoneTypes(); + } + else { + bulmaJS.alert({ + title: "Error Moving Work Order Milestone Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + const moveWorkOrderMilestoneTypeDown = (clickEvent) => { + const tableRowElement = clickEvent.currentTarget.closest("tr"); + const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId; + cityssm.postJSON(urlPrefix + "/admin/doMoveWorkOrderMilestoneTypeDown", { + workOrderMilestoneTypeId + }, (responseJSON) => { + if (responseJSON.success) { + workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes; + renderWorkOrderMilestoneTypes(); + } + else { + bulmaJS.alert({ + title: "Error Moving Work Order Milestone Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + const renderWorkOrderMilestoneTypes = () => { + const containerElement = document.querySelector("#container--workOrderMilestoneTypes"); + if (workOrderMilestoneTypes.length === 0) { + containerElement.innerHTML = + "" + + '' + + '
' + + '

There are no active work order milestone types.

' + + "
" + + "" + + ""; + return; + } + containerElement.innerHTML = ""; + for (const workOrderMilestoneType of workOrderMilestoneTypes) { + const tableRowElement = document.createElement("tr"); + tableRowElement.dataset.workOrderMilestoneTypeId = + workOrderMilestoneType.workOrderMilestoneTypeId.toString(); + tableRowElement.innerHTML = + "" + + "
" + + '' + + ('
' + + '
' + + '' + + "
" + + '
' + + '' + + "
" + + "
") + + "
" + + "" + + '' + + '
' + + '
' + + ('
' + + '
' + + '' + + "
" + + '
' + + '' + + "
" + + "
") + + "
" + + '
' + + '" + + "
" + + "
" + + ""; + tableRowElement + .querySelector("form") + .addEventListener("submit", updateWorkOrderMilestoneType); + tableRowElement + .querySelector(".button--moveWorkOrderMilestoneTypeUp") + .addEventListener("click", moveWorkOrderMilestoneTypeUp); + tableRowElement + .querySelector(".button--moveWorkOrderMilestoneTypeDown") + .addEventListener("click", moveWorkOrderMilestoneTypeDown); + tableRowElement + .querySelector(".button--deleteWorkOrderMilestoneType") + .addEventListener("click", deleteWorkOrderMilestoneType); + containerElement.append(tableRowElement); + } + }; + document + .querySelector("#form--addWorkOrderMilestoneType") + .addEventListener("submit", (submitEvent) => { + submitEvent.preventDefault(); + const formElement = submitEvent.currentTarget; + cityssm.postJSON(urlPrefix + "/admin/doAddWorkOrderMilestoneType", formElement, (responseJSON) => { + if (responseJSON.success) { + workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes; + renderWorkOrderMilestoneTypes(); + formElement.reset(); + formElement.querySelector("input").focus(); + } + else { + bulmaJS.alert({ + title: "Error Adding Work Order Milestone Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }); + renderWorkOrderMilestoneTypes(); let lotStatuses = exports.lotStatuses; delete exports.lotStatuses; const updateLotStatus = (submitEvent) => { diff --git a/public-typescript/adminTables.ts b/public-typescript/adminTables.ts index 18e4c125..7078c61b 100644 --- a/public-typescript/adminTables.ts +++ b/public-typescript/adminTables.ts @@ -280,6 +280,274 @@ declare const bulmaJS: BulmaJS; renderWorkOrderTypes(); + /* + * Work Order Milestone Types + */ + + let workOrderMilestoneTypes: recordTypes.WorkOrderMilestoneType[] = exports.workOrderMilestoneTypes; + delete exports.workOrderMilestoneTypes; + + const updateWorkOrderMilestoneType = (submitEvent: SubmitEvent) => { + submitEvent.preventDefault(); + + cityssm.postJSON( + urlPrefix + "/admin/doUpdateWorkOrderMilestoneType", + submitEvent.currentTarget, + (responseJSON: { + success: boolean; + errorMessage?: string; + workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]; + }) => { + if (responseJSON.success) { + workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes; + + bulmaJS.alert({ + message: "Work Order Milestone Type Updated Successfully", + contextualColorName: "success" + }); + } else { + bulmaJS.alert({ + title: "Error Updating Work Order Milestone Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + } + ); + }; + + const deleteWorkOrderMilestoneType = (clickEvent: Event) => { + const tableRowElement = ( + clickEvent.currentTarget as HTMLElement + ).closest("tr"); + + const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId; + + const doDelete = () => { + cityssm.postJSON( + urlPrefix + "/admin/doDeleteWorkOrderMilestoneType", + { + workOrderMilestoneTypeId + }, + (responseJSON: { + success: boolean; + errorMessage?: string; + workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]; + }) => { + if (responseJSON.success) { + workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes; + + if (workOrderMilestoneTypes.length === 0) { + renderWorkOrderMilestoneTypes(); + } else { + tableRowElement.remove(); + } + + bulmaJS.alert({ + message: "Work Order Milestone Type Deleted Successfully", + contextualColorName: "success" + }); + } else { + bulmaJS.alert({ + title: "Error Deleting Work Order Milestone Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + } + ); + }; + + bulmaJS.confirm({ + title: "Delete Work Order Milestone Type", + message: + "Are you sure you want to delete this work order milestone type?
" + + "Note that no work orders will be removed.", + messageIsHtml: true, + contextualColorName: "warning", + okButton: { + text: "Yes, Delete Work Order Milestone Type", + callbackFunction: doDelete + } + }); + }; + + const moveWorkOrderMilestoneTypeUp = (clickEvent: Event) => { + const tableRowElement = ( + clickEvent.currentTarget as HTMLElement + ).closest("tr"); + + const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId; + + cityssm.postJSON( + urlPrefix + "/admin/doMoveWorkOrderMilestoneTypeUp", + { + workOrderMilestoneTypeId + }, + (responseJSON: { + success: boolean; + errorMessage?: string; + workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]; + }) => { + if (responseJSON.success) { + workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes; + renderWorkOrderMilestoneTypes(); + } else { + bulmaJS.alert({ + title: "Error Moving Work Order Milestone Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + } + ); + }; + + const moveWorkOrderMilestoneTypeDown = (clickEvent: Event) => { + const tableRowElement = ( + clickEvent.currentTarget as HTMLElement + ).closest("tr"); + + const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId; + + cityssm.postJSON( + urlPrefix + "/admin/doMoveWorkOrderMilestoneTypeDown", + { + workOrderMilestoneTypeId + }, + (responseJSON: { + success: boolean; + errorMessage?: string; + workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]; + }) => { + if (responseJSON.success) { + workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes; + renderWorkOrderMilestoneTypes(); + } else { + bulmaJS.alert({ + title: "Error Moving Work Order Milestone Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + } + ); + }; + + const renderWorkOrderMilestoneTypes = () => { + const containerElement = document.querySelector( + "#container--workOrderMilestoneTypes" + ) as HTMLTableSectionElement; + + if (workOrderMilestoneTypes.length === 0) { + containerElement.innerHTML = + "" + + '' + + '
' + + '

There are no active work order milestone types.

' + + "
" + + "" + + ""; + + return; + } + + containerElement.innerHTML = ""; + + for (const workOrderMilestoneType of workOrderMilestoneTypes) { + const tableRowElement = document.createElement("tr"); + + tableRowElement.dataset.workOrderMilestoneTypeId = + workOrderMilestoneType.workOrderMilestoneTypeId.toString(); + + tableRowElement.innerHTML = + "" + + "
" + + '' + + ('
' + + '
' + + '' + + "
" + + '
' + + '' + + "
" + + "
") + + "
" + + "" + + '' + + '
' + + '
' + + ('
' + + '
' + + '' + + "
" + + '
' + + '' + + "
" + + "
") + + "
" + + '
' + + '" + + "
" + + "
" + + ""; + + tableRowElement + .querySelector("form") + .addEventListener("submit", updateWorkOrderMilestoneType); + tableRowElement + .querySelector(".button--moveWorkOrderMilestoneTypeUp") + .addEventListener("click", moveWorkOrderMilestoneTypeUp); + tableRowElement + .querySelector(".button--moveWorkOrderMilestoneTypeDown") + .addEventListener("click", moveWorkOrderMilestoneTypeDown); + tableRowElement + .querySelector(".button--deleteWorkOrderMilestoneType") + .addEventListener("click", deleteWorkOrderMilestoneType); + + containerElement.append(tableRowElement); + } + }; + + document + .querySelector("#form--addWorkOrderMilestoneType") + .addEventListener("submit", (submitEvent: SubmitEvent) => { + submitEvent.preventDefault(); + + const formElement = submitEvent.currentTarget as HTMLFormElement; + + cityssm.postJSON( + urlPrefix + "/admin/doAddWorkOrderMilestoneType", + formElement, + (responseJSON: { + success: boolean; + errorMessage?: string; + workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]; + }) => { + if (responseJSON.success) { + workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes; + renderWorkOrderMilestoneTypes(); + formElement.reset(); + formElement.querySelector("input").focus(); + } else { + bulmaJS.alert({ + title: "Error Adding Work Order Milestone Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + } + ); + }); + + renderWorkOrderMilestoneTypes(); + /* * Lot Statuses */ diff --git a/public/javascripts/adminTables.min.js b/public/javascripts/adminTables.min.js index 76b460a5..73224844 100644 --- a/public/javascripts/adminTables.min.js +++ b/public/javascripts/adminTables.min.js @@ -1 +1 @@ -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=document.querySelector("main").dataset.urlPrefix;let t=exports.workOrderTypes;delete exports.workOrderTypes;const s=s=>{s.preventDefault(),cityssm.postJSON(e+"/admin/doUpdateWorkOrderType",s.currentTarget,e=>{e.success?(t=e.workOrderTypes,bulmaJS.alert({message:"Work Order Type Updated Successfully",contextualColorName:"success"})):bulmaJS.alert({title:"Error Updating Work Order Type",message:e.errorMessage,contextualColorName:"danger"})})},o=s=>{const o=s.currentTarget.closest("tr"),a=o.dataset.workOrderTypeId;bulmaJS.confirm({title:"Delete Work Order Type",message:"Are you sure you want to delete this work order type?
Note that no work orders will be removed.",messageIsHtml:!0,contextualColorName:"warning",okButton:{text:"Yes, Delete Work Order Type",callbackFunction:()=>{cityssm.postJSON(e+"/admin/doDeleteWorkOrderType",{workOrderTypeId:a},e=>{e.success?(0===(t=e.workOrderTypes).length?l():o.remove(),bulmaJS.alert({message:"Work Order Type Deleted Successfully",contextualColorName:"success"})):bulmaJS.alert({title:"Error Deleting Work Order Type",message:e.errorMessage,contextualColorName:"danger"})})}}})},a=s=>{const o=s.currentTarget.closest("tr").dataset.workOrderTypeId;cityssm.postJSON(e+"/admin/doMoveWorkOrderTypeUp",{workOrderTypeId:o},e=>{e.success?(t=e.workOrderTypes,l()):bulmaJS.alert({title:"Error Moving Work Order Type",message:e.errorMessage,contextualColorName:"danger"})})},r=s=>{const o=s.currentTarget.closest("tr").dataset.workOrderTypeId;cityssm.postJSON(e+"/admin/doMoveWorkOrderTypeDown",{workOrderTypeId:o},e=>{e.success?(t=e.workOrderTypes,l()):bulmaJS.alert({title:"Error Moving Work Order Type",message:e.errorMessage,contextualColorName:"danger"})})},l=()=>{const e=document.querySelector("#container--workOrderTypes");if(0!==t.length){e.innerHTML="";for(const l of t){const t=document.createElement("tr");t.dataset.workOrderTypeId=l.workOrderTypeId.toString(),t.innerHTML='
',t.querySelector("form").addEventListener("submit",s),t.querySelector(".button--moveWorkOrderTypeUp").addEventListener("click",a),t.querySelector(".button--moveWorkOrderTypeDown").addEventListener("click",r),t.querySelector(".button--deleteWorkOrderType").addEventListener("click",o),e.append(t)}}else e.innerHTML='

There are no active work order types.

'};document.querySelector("#form--addWorkOrderType").addEventListener("submit",s=>{s.preventDefault();const o=s.currentTarget;cityssm.postJSON(e+"/admin/doAddWorkOrderType",o,e=>{e.success?(t=e.workOrderTypes,l(),o.reset(),o.querySelector("input").focus()):bulmaJS.alert({title:"Error Adding Work Order Type",message:e.errorMessage,contextualColorName:"danger"})})}),l();let n=exports.lotStatuses;delete exports.lotStatuses;const c=t=>{t.preventDefault(),cityssm.postJSON(e+"/admin/doUpdateLotStatus",t.currentTarget,e=>{e.success?(n=e.lotStatuses,bulmaJS.alert({message:exports.aliases.lot+" Status Updated Successfully",contextualColorName:"success"})):bulmaJS.alert({title:"Error Updating "+exports.aliases.lot+" Status",message:e.errorMessage,contextualColorName:"danger"})})},d=t=>{const s=t.currentTarget.closest("tr"),o=s.dataset.lotStatusId;bulmaJS.confirm({title:"Delete "+exports.aliases.lot+" Status",message:"Are you sure you want to delete this status?
Note that no "+exports.aliases.lots.toLowerCase()+" will be removed.",messageIsHtml:!0,contextualColorName:"warning",okButton:{text:"Yes, Delete Status",callbackFunction:()=>{cityssm.postJSON(e+"/admin/doDeleteLotStatus",{lotStatusId:o},e=>{e.success?(0===(n=e.lotStatuses).length?p():s.remove(),bulmaJS.alert({message:exports.aliases.lot+" Status Deleted Successfully",contextualColorName:"success"})):bulmaJS.alert({title:"Error Deleting "+exports.aliases.lot+" Status",message:e.errorMessage,contextualColorName:"danger"})})}}})},i=t=>{const s=t.currentTarget.closest("tr").dataset.lotStatusId;cityssm.postJSON(e+"/admin/doMoveLotStatusUp",{lotStatusId:s},e=>{e.success?(n=e.lotStatuses,p()):bulmaJS.alert({title:"Error Moving "+exports.aliases.lot+" Status",message:e.errorMessage,contextualColorName:"danger"})})},u=t=>{const s=t.currentTarget.closest("tr").dataset.lotStatusId;cityssm.postJSON(e+"/admin/doMoveLotStatusDown",{lotStatusId:s},e=>{e.success?(n=e.lotStatuses,p()):bulmaJS.alert({title:"Error Moving "+exports.aliases.lot+" Status",message:e.errorMessage,contextualColorName:"danger"})})},p=()=>{const e=document.querySelector("#container--lotStatuses");if(0!==t.length){e.innerHTML="";for(const t of n){const s=document.createElement("tr");s.dataset.lotStatusId=t.lotStatusId.toString(),s.innerHTML='
',s.querySelector("form").addEventListener("submit",c),s.querySelector(".button--moveLotStatusUp").addEventListener("click",i),s.querySelector(".button--moveLotStatusDown").addEventListener("click",u),s.querySelector(".button--deleteLotStatus").addEventListener("click",d),e.append(s)}}else e.innerHTML='

There are no active '+cityssm.escapeHTML(exports.aliases.lot.toLowerCase())+" statuses.

"};document.querySelector("#form--addLotStatus").addEventListener("submit",t=>{t.preventDefault();const s=t.currentTarget;cityssm.postJSON(e+"/admin/doAddLotStatus",s,e=>{e.success?(n=e.lotStatuses,p(),s.reset(),s.querySelector("input").focus()):bulmaJS.alert({title:"Error Adding "+exports.aliases.lot+" Status",message:e.errorMessage,contextualColorName:"danger"})})}),p();let m=exports.lotOccupantTypes;delete exports.lotOccupantTypes;const y=t=>{t.preventDefault(),cityssm.postJSON(e+"/admin/doUpdateLotOccupantType",t.currentTarget,e=>{e.success?(m=e.lotOccupantTypes,bulmaJS.alert({message:exports.aliases.lot+" "+exports.aliases.occupant+" Type Updated Successfully",contextualColorName:"success"})):bulmaJS.alert({title:"Error Updating "+exports.aliases.lot+" "+exports.aliases.occupant+" Type",message:e.errorMessage,contextualColorName:"danger"})})},v=t=>{const s=t.currentTarget.closest("tr"),o=s.dataset.lotOccupantTypeId;bulmaJS.confirm({title:"Delete "+exports.aliases.lot+" "+exports.aliases.occupant+" Type",message:"Are you sure you want to delete this "+exports.aliases.lot.toLowerCase()+" "+exports.aliases.occupant.toLowerCase()+" type?
Note that no "+exports.aliases.lot.toLowerCase()+" "+exports.aliases.occupancy.toLowerCase()+" will be removed.",messageIsHtml:!0,contextualColorName:"warning",okButton:{text:"Yes, Delete "+exports.aliases.lot+" "+exports.aliases.occupant+" Type",callbackFunction:()=>{cityssm.postJSON(e+"/admin/doDeleteLotOccupantType",{lotOccupantTypeId:o},e=>{e.success?(0===(m=e.lotOccupantTypes).length?b():s.remove(),bulmaJS.alert({message:exports.aliases.lot+" "+exports.aliases.occupant+" Type Deleted Successfully",contextualColorName:"success"})):bulmaJS.alert({title:"Error Deleting "+exports.aliases.lot+" "+exports.aliases.occupant+" Type",message:e.errorMessage,contextualColorName:"danger"})})}}})},g=t=>{const s=t.currentTarget.closest("tr").dataset.lotOccupantTypeId;cityssm.postJSON(e+"/admin/doMoveLotOccupantTypeUp",{lotOccupantTypeId:s},e=>{e.success?(m=e.lotOccupantTypes,b()):bulmaJS.alert({title:"Error Moving "+exports.aliases.lot+" "+exports.aliases.occupant+" Type",message:e.errorMessage,contextualColorName:"danger"})})},T=t=>{const s=t.currentTarget.closest("tr").dataset.lotOccupantTypeId;cityssm.postJSON(e+"/admin/doMoveLotOccupantTypeDown",{lotOccupantTypeId:s},e=>{e.success?(m=e.lotOccupantTypes,b()):bulmaJS.alert({title:"Error Moving "+exports.aliases.lot+" "+exports.aliases.occupant+" Type",message:e.errorMessage,contextualColorName:"danger"})})},b=()=>{const e=document.querySelector("#container--lotOccupantTypes");if(0!==t.length){e.innerHTML="";for(const t of m){const s=document.createElement("tr");s.dataset.lotOccupantTypeId=t.lotOccupantTypeId.toString(),s.innerHTML='
',s.querySelector("form").addEventListener("submit",y),s.querySelector(".button--moveLotOccupantTypeUp").addEventListener("click",g),s.querySelector(".button--moveLotOccupantTypeDown").addEventListener("click",T),s.querySelector(".button--deleteLotOccupantType").addEventListener("click",v),e.append(s)}}else e.innerHTML='

There are no active '+cityssm.escapeHTML(exports.aliases.lot.toLowerCase())+" "+cityssm.escapeHTML(exports.aliases.occupant.toLowerCase())+" types.

"};document.querySelector("#form--addLotOccupantType").addEventListener("submit",t=>{t.preventDefault();const s=t.currentTarget;cityssm.postJSON(e+"/admin/doAddLotOccupantType",s,e=>{e.success?(m=e.lotOccupantTypes,b(),s.reset(),s.querySelector("input").focus()):bulmaJS.alert({title:"Error Adding "+exports.aliases.lot+" "+exports.aliases.occupant+" Type",message:e.errorMessage,contextualColorName:"danger"})})}),b()})(); \ No newline at end of file +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=document.querySelector("main").dataset.urlPrefix;let t=exports.workOrderTypes;delete exports.workOrderTypes;const s=s=>{s.preventDefault(),cityssm.postJSON(e+"/admin/doUpdateWorkOrderType",s.currentTarget,e=>{e.success?(t=e.workOrderTypes,bulmaJS.alert({message:"Work Order Type Updated Successfully",contextualColorName:"success"})):bulmaJS.alert({title:"Error Updating Work Order Type",message:e.errorMessage,contextualColorName:"danger"})})},o=s=>{const o=s.currentTarget.closest("tr"),r=o.dataset.workOrderTypeId;bulmaJS.confirm({title:"Delete Work Order Type",message:"Are you sure you want to delete this work order type?
Note that no work orders will be removed.",messageIsHtml:!0,contextualColorName:"warning",okButton:{text:"Yes, Delete Work Order Type",callbackFunction:()=>{cityssm.postJSON(e+"/admin/doDeleteWorkOrderType",{workOrderTypeId:r},e=>{e.success?(0===(t=e.workOrderTypes).length?l():o.remove(),bulmaJS.alert({message:"Work Order Type Deleted Successfully",contextualColorName:"success"})):bulmaJS.alert({title:"Error Deleting Work Order Type",message:e.errorMessage,contextualColorName:"danger"})})}}})},r=s=>{const o=s.currentTarget.closest("tr").dataset.workOrderTypeId;cityssm.postJSON(e+"/admin/doMoveWorkOrderTypeUp",{workOrderTypeId:o},e=>{e.success?(t=e.workOrderTypes,l()):bulmaJS.alert({title:"Error Moving Work Order Type",message:e.errorMessage,contextualColorName:"danger"})})},a=s=>{const o=s.currentTarget.closest("tr").dataset.workOrderTypeId;cityssm.postJSON(e+"/admin/doMoveWorkOrderTypeDown",{workOrderTypeId:o},e=>{e.success?(t=e.workOrderTypes,l()):bulmaJS.alert({title:"Error Moving Work Order Type",message:e.errorMessage,contextualColorName:"danger"})})},l=()=>{const e=document.querySelector("#container--workOrderTypes");if(0!==t.length){e.innerHTML="";for(const l of t){const t=document.createElement("tr");t.dataset.workOrderTypeId=l.workOrderTypeId.toString(),t.innerHTML='
',t.querySelector("form").addEventListener("submit",s),t.querySelector(".button--moveWorkOrderTypeUp").addEventListener("click",r),t.querySelector(".button--moveWorkOrderTypeDown").addEventListener("click",a),t.querySelector(".button--deleteWorkOrderType").addEventListener("click",o),e.append(t)}}else e.innerHTML='

There are no active work order types.

'};document.querySelector("#form--addWorkOrderType").addEventListener("submit",s=>{s.preventDefault();const o=s.currentTarget;cityssm.postJSON(e+"/admin/doAddWorkOrderType",o,e=>{e.success?(t=e.workOrderTypes,l(),o.reset(),o.querySelector("input").focus()):bulmaJS.alert({title:"Error Adding Work Order Type",message:e.errorMessage,contextualColorName:"danger"})})}),l();let n=exports.workOrderMilestoneTypes;delete exports.workOrderMilestoneTypes;const d=t=>{t.preventDefault(),cityssm.postJSON(e+"/admin/doUpdateWorkOrderMilestoneType",t.currentTarget,e=>{e.success?(n=e.workOrderMilestoneTypes,bulmaJS.alert({message:"Work Order Milestone Type Updated Successfully",contextualColorName:"success"})):bulmaJS.alert({title:"Error Updating Work Order Milestone Type",message:e.errorMessage,contextualColorName:"danger"})})},c=t=>{const s=t.currentTarget.closest("tr"),o=s.dataset.workOrderMilestoneTypeId;bulmaJS.confirm({title:"Delete Work Order Milestone Type",message:"Are you sure you want to delete this work order milestone type?
Note that no work orders will be removed.",messageIsHtml:!0,contextualColorName:"warning",okButton:{text:"Yes, Delete Work Order Milestone Type",callbackFunction:()=>{cityssm.postJSON(e+"/admin/doDeleteWorkOrderMilestoneType",{workOrderMilestoneTypeId:o},e=>{e.success?(0===(n=e.workOrderMilestoneTypes).length?p():s.remove(),bulmaJS.alert({message:"Work Order Milestone Type Deleted Successfully",contextualColorName:"success"})):bulmaJS.alert({title:"Error Deleting Work Order Milestone Type",message:e.errorMessage,contextualColorName:"danger"})})}}})},i=t=>{const s=t.currentTarget.closest("tr").dataset.workOrderMilestoneTypeId;cityssm.postJSON(e+"/admin/doMoveWorkOrderMilestoneTypeUp",{workOrderMilestoneTypeId:s},e=>{e.success?(n=e.workOrderMilestoneTypes,p()):bulmaJS.alert({title:"Error Moving Work Order Milestone Type",message:e.errorMessage,contextualColorName:"danger"})})},u=t=>{const s=t.currentTarget.closest("tr").dataset.workOrderMilestoneTypeId;cityssm.postJSON(e+"/admin/doMoveWorkOrderMilestoneTypeDown",{workOrderMilestoneTypeId:s},e=>{e.success?(n=e.workOrderMilestoneTypes,p()):bulmaJS.alert({title:"Error Moving Work Order Milestone Type",message:e.errorMessage,contextualColorName:"danger"})})},p=()=>{const e=document.querySelector("#container--workOrderMilestoneTypes");if(0!==n.length){e.innerHTML="";for(const t of n){const s=document.createElement("tr");s.dataset.workOrderMilestoneTypeId=t.workOrderMilestoneTypeId.toString(),s.innerHTML='
',s.querySelector("form").addEventListener("submit",d),s.querySelector(".button--moveWorkOrderMilestoneTypeUp").addEventListener("click",i),s.querySelector(".button--moveWorkOrderMilestoneTypeDown").addEventListener("click",u),s.querySelector(".button--deleteWorkOrderMilestoneType").addEventListener("click",c),e.append(s)}}else e.innerHTML='

There are no active work order milestone types.

'};document.querySelector("#form--addWorkOrderMilestoneType").addEventListener("submit",t=>{t.preventDefault();const s=t.currentTarget;cityssm.postJSON(e+"/admin/doAddWorkOrderMilestoneType",s,e=>{e.success?(n=e.workOrderMilestoneTypes,p(),s.reset(),s.querySelector("input").focus()):bulmaJS.alert({title:"Error Adding Work Order Milestone Type",message:e.errorMessage,contextualColorName:"danger"})})}),p();let m=exports.lotStatuses;delete exports.lotStatuses;const y=t=>{t.preventDefault(),cityssm.postJSON(e+"/admin/doUpdateLotStatus",t.currentTarget,e=>{e.success?(m=e.lotStatuses,bulmaJS.alert({message:exports.aliases.lot+" Status Updated Successfully",contextualColorName:"success"})):bulmaJS.alert({title:"Error Updating "+exports.aliases.lot+" Status",message:e.errorMessage,contextualColorName:"danger"})})},v=t=>{const s=t.currentTarget.closest("tr"),o=s.dataset.lotStatusId;bulmaJS.confirm({title:"Delete "+exports.aliases.lot+" Status",message:"Are you sure you want to delete this status?
Note that no "+exports.aliases.lots.toLowerCase()+" will be removed.",messageIsHtml:!0,contextualColorName:"warning",okButton:{text:"Yes, Delete Status",callbackFunction:()=>{cityssm.postJSON(e+"/admin/doDeleteLotStatus",{lotStatusId:o},e=>{e.success?(0===(m=e.lotStatuses).length?b():s.remove(),bulmaJS.alert({message:exports.aliases.lot+" Status Deleted Successfully",contextualColorName:"success"})):bulmaJS.alert({title:"Error Deleting "+exports.aliases.lot+" Status",message:e.errorMessage,contextualColorName:"danger"})})}}})},T=t=>{const s=t.currentTarget.closest("tr").dataset.lotStatusId;cityssm.postJSON(e+"/admin/doMoveLotStatusUp",{lotStatusId:s},e=>{e.success?(m=e.lotStatuses,b()):bulmaJS.alert({title:"Error Moving "+exports.aliases.lot+" Status",message:e.errorMessage,contextualColorName:"danger"})})},g=t=>{const s=t.currentTarget.closest("tr").dataset.lotStatusId;cityssm.postJSON(e+"/admin/doMoveLotStatusDown",{lotStatusId:s},e=>{e.success?(m=e.lotStatuses,b()):bulmaJS.alert({title:"Error Moving "+exports.aliases.lot+" Status",message:e.errorMessage,contextualColorName:"danger"})})},b=()=>{const e=document.querySelector("#container--lotStatuses");if(0!==t.length){e.innerHTML="";for(const t of m){const s=document.createElement("tr");s.dataset.lotStatusId=t.lotStatusId.toString(),s.innerHTML='
',s.querySelector("form").addEventListener("submit",y),s.querySelector(".button--moveLotStatusUp").addEventListener("click",T),s.querySelector(".button--moveLotStatusDown").addEventListener("click",g),s.querySelector(".button--deleteLotStatus").addEventListener("click",v),e.append(s)}}else e.innerHTML='

There are no active '+cityssm.escapeHTML(exports.aliases.lot.toLowerCase())+" statuses.

"};document.querySelector("#form--addLotStatus").addEventListener("submit",t=>{t.preventDefault();const s=t.currentTarget;cityssm.postJSON(e+"/admin/doAddLotStatus",s,e=>{e.success?(m=e.lotStatuses,b(),s.reset(),s.querySelector("input").focus()):bulmaJS.alert({title:"Error Adding "+exports.aliases.lot+" Status",message:e.errorMessage,contextualColorName:"danger"})})}),b();let S=exports.lotOccupantTypes;delete exports.lotOccupantTypes;const O=t=>{t.preventDefault(),cityssm.postJSON(e+"/admin/doUpdateLotOccupantType",t.currentTarget,e=>{e.success?(S=e.lotOccupantTypes,bulmaJS.alert({message:exports.aliases.lot+" "+exports.aliases.occupant+" Type Updated Successfully",contextualColorName:"success"})):bulmaJS.alert({title:"Error Updating "+exports.aliases.lot+" "+exports.aliases.occupant+" Type",message:e.errorMessage,contextualColorName:"danger"})})},M=t=>{const s=t.currentTarget.closest("tr"),o=s.dataset.lotOccupantTypeId;bulmaJS.confirm({title:"Delete "+exports.aliases.lot+" "+exports.aliases.occupant+" Type",message:"Are you sure you want to delete this "+exports.aliases.lot.toLowerCase()+" "+exports.aliases.occupant.toLowerCase()+" type?
Note that no "+exports.aliases.lot.toLowerCase()+" "+exports.aliases.occupancy.toLowerCase()+" will be removed.",messageIsHtml:!0,contextualColorName:"warning",okButton:{text:"Yes, Delete "+exports.aliases.lot+" "+exports.aliases.occupant+" Type",callbackFunction:()=>{cityssm.postJSON(e+"/admin/doDeleteLotOccupantType",{lotOccupantTypeId:o},e=>{e.success?(0===(S=e.lotOccupantTypes).length?f():s.remove(),bulmaJS.alert({message:exports.aliases.lot+" "+exports.aliases.occupant+" Type Deleted Successfully",contextualColorName:"success"})):bulmaJS.alert({title:"Error Deleting "+exports.aliases.lot+" "+exports.aliases.occupant+" Type",message:e.errorMessage,contextualColorName:"danger"})})}}})},k=t=>{const s=t.currentTarget.closest("tr").dataset.lotOccupantTypeId;cityssm.postJSON(e+"/admin/doMoveLotOccupantTypeUp",{lotOccupantTypeId:s},e=>{e.success?(S=e.lotOccupantTypes,f()):bulmaJS.alert({title:"Error Moving "+exports.aliases.lot+" "+exports.aliases.occupant+" Type",message:e.errorMessage,contextualColorName:"danger"})})},w=t=>{const s=t.currentTarget.closest("tr").dataset.lotOccupantTypeId;cityssm.postJSON(e+"/admin/doMoveLotOccupantTypeDown",{lotOccupantTypeId:s},e=>{e.success?(S=e.lotOccupantTypes,f()):bulmaJS.alert({title:"Error Moving "+exports.aliases.lot+" "+exports.aliases.occupant+" Type",message:e.errorMessage,contextualColorName:"danger"})})},f=()=>{const e=document.querySelector("#container--lotOccupantTypes");if(0!==t.length){e.innerHTML="";for(const t of S){const s=document.createElement("tr");s.dataset.lotOccupantTypeId=t.lotOccupantTypeId.toString(),s.innerHTML='
',s.querySelector("form").addEventListener("submit",O),s.querySelector(".button--moveLotOccupantTypeUp").addEventListener("click",k),s.querySelector(".button--moveLotOccupantTypeDown").addEventListener("click",w),s.querySelector(".button--deleteLotOccupantType").addEventListener("click",M),e.append(s)}}else e.innerHTML='

There are no active '+cityssm.escapeHTML(exports.aliases.lot.toLowerCase())+" "+cityssm.escapeHTML(exports.aliases.occupant.toLowerCase())+" types.

"};document.querySelector("#form--addLotOccupantType").addEventListener("submit",t=>{t.preventDefault();const s=t.currentTarget;cityssm.postJSON(e+"/admin/doAddLotOccupantType",s,e=>{e.success?(S=e.lotOccupantTypes,f(),s.reset(),s.querySelector("input").focus()):bulmaJS.alert({title:"Error Adding "+exports.aliases.lot+" "+exports.aliases.occupant+" Type",message:e.errorMessage,contextualColorName:"danger"})})}),f()})(); \ No newline at end of file diff --git a/routes/admin.js b/routes/admin.js index fabf32b4..4dee9cd6 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -25,6 +25,11 @@ import handler_doUpdateWorkOrderType from "../handlers/admin-post/doUpdateWorkOr import handler_doMoveWorkOrderTypeUp from "../handlers/admin-post/doMoveWorkOrderTypeUp.js"; import handler_doMoveWorkOrderTypeDown from "../handlers/admin-post/doMoveWorkOrderTypeDown.js"; import handler_doDeleteWorkOrderType from "../handlers/admin-post/doDeleteWorkOrderType.js"; +import handler_doAddWorkOrderMilestoneType from "../handlers/admin-post/doAddWorkOrderMilestoneType.js"; +import handler_doUpdateWorkOrderMilestoneType from "../handlers/admin-post/doUpdateWorkOrderMilestoneType.js"; +import handler_doMoveWorkOrderMilestoneTypeUp from "../handlers/admin-post/doMoveWorkOrderMilestoneTypeUp.js"; +import handler_doMoveWorkOrderMilestoneTypeDown from "../handlers/admin-post/doMoveWorkOrderMilestoneTypeDown.js"; +import handler_doDeleteWorkOrderMilestoneType from "../handlers/admin-post/doDeleteWorkOrderMilestoneType.js"; import handler_doAddLotStatus from "../handlers/admin-post/doAddLotStatus.js"; import handler_doUpdateLotStatus from "../handlers/admin-post/doUpdateLotStatus.js"; import handler_doMoveLotStatusUp from "../handlers/admin-post/doMoveLotStatusUp.js"; @@ -61,6 +66,11 @@ router.post("/doUpdateWorkOrderType", permissionHandlers.adminPostHandler, handl router.post("/doMoveWorkOrderTypeUp", permissionHandlers.adminPostHandler, handler_doMoveWorkOrderTypeUp); router.post("/doMoveWorkOrderTypeDown", permissionHandlers.adminPostHandler, handler_doMoveWorkOrderTypeDown); router.post("/doDeleteWorkOrderType", permissionHandlers.adminPostHandler, handler_doDeleteWorkOrderType); +router.post("/doAddWorkOrderMilestoneType", permissionHandlers.adminPostHandler, handler_doAddWorkOrderMilestoneType); +router.post("/doUpdateWorkOrderMilestoneType", permissionHandlers.adminPostHandler, handler_doUpdateWorkOrderMilestoneType); +router.post("/doMoveWorkOrderMilestoneTypeUp", permissionHandlers.adminPostHandler, handler_doMoveWorkOrderMilestoneTypeUp); +router.post("/doMoveWorkOrderMilestoneTypeDown", permissionHandlers.adminPostHandler, handler_doMoveWorkOrderMilestoneTypeDown); +router.post("/doDeleteWorkOrderMilestoneType", permissionHandlers.adminPostHandler, handler_doDeleteWorkOrderMilestoneType); router.post("/doAddLotStatus", permissionHandlers.adminPostHandler, handler_doAddLotStatus); router.post("/doUpdateLotStatus", permissionHandlers.adminPostHandler, handler_doUpdateLotStatus); router.post("/doMoveLotStatusUp", permissionHandlers.adminPostHandler, handler_doMoveLotStatusUp); diff --git a/routes/admin.ts b/routes/admin.ts index 0bcb3e98..d57a0bb3 100644 --- a/routes/admin.ts +++ b/routes/admin.ts @@ -41,6 +41,12 @@ import handler_doMoveWorkOrderTypeUp from "../handlers/admin-post/doMoveWorkOrde import handler_doMoveWorkOrderTypeDown from "../handlers/admin-post/doMoveWorkOrderTypeDown.js"; import handler_doDeleteWorkOrderType from "../handlers/admin-post/doDeleteWorkOrderType.js"; +import handler_doAddWorkOrderMilestoneType from "../handlers/admin-post/doAddWorkOrderMilestoneType.js"; +import handler_doUpdateWorkOrderMilestoneType from "../handlers/admin-post/doUpdateWorkOrderMilestoneType.js"; +import handler_doMoveWorkOrderMilestoneTypeUp from "../handlers/admin-post/doMoveWorkOrderMilestoneTypeUp.js"; +import handler_doMoveWorkOrderMilestoneTypeDown from "../handlers/admin-post/doMoveWorkOrderMilestoneTypeDown.js"; +import handler_doDeleteWorkOrderMilestoneType from "../handlers/admin-post/doDeleteWorkOrderMilestoneType.js"; + import handler_doAddLotStatus from "../handlers/admin-post/doAddLotStatus.js"; import handler_doUpdateLotStatus from "../handlers/admin-post/doUpdateLotStatus.js"; import handler_doMoveLotStatusUp from "../handlers/admin-post/doMoveLotStatusUp.js"; @@ -208,6 +214,37 @@ router.post( permissionHandlers.adminPostHandler, handler_doDeleteWorkOrderType ); +// Config Tables - Work Order Milestone Types + +router.post( + "/doAddWorkOrderMilestoneType", + permissionHandlers.adminPostHandler, + handler_doAddWorkOrderMilestoneType +); + +router.post( + "/doUpdateWorkOrderMilestoneType", + permissionHandlers.adminPostHandler, + handler_doUpdateWorkOrderMilestoneType +); + +router.post( + "/doMoveWorkOrderMilestoneTypeUp", + permissionHandlers.adminPostHandler, + handler_doMoveWorkOrderMilestoneTypeUp +); + +router.post( + "/doMoveWorkOrderMilestoneTypeDown", + permissionHandlers.adminPostHandler, + handler_doMoveWorkOrderMilestoneTypeDown +); + +router.post( + "/doDeleteWorkOrderMilestoneType", + permissionHandlers.adminPostHandler, + handler_doDeleteWorkOrderMilestoneType +); // Config Tables - Lot Statuses diff --git a/views/admin-tables.ejs b/views/admin-tables.ejs index 7a6eb03f..ef473586 100644 --- a/views/admin-tables.ejs +++ b/views/admin-tables.ejs @@ -35,6 +35,12 @@ Work Order Types +
  • + + + Work Order Milestone Types + +
  • @@ -80,6 +86,36 @@ +