From e8106c52291e2fa1c4b56e13fe9ff9d7625b0138 Mon Sep 17 00:00:00 2001 From: Dan Gowans Date: Thu, 25 Aug 2022 15:50:52 -0400 Subject: [PATCH] work order type maintenance --- handlers/admin-get/tables.d.ts | 3 + handlers/admin-get/tables.js | 13 + handlers/admin-get/tables.ts | 23 ++ handlers/admin-post/doAddWorkOrderType.d.ts | 3 + handlers/admin-post/doAddWorkOrderType.js | 12 + handlers/admin-post/doAddWorkOrderType.ts | 28 ++ .../admin-post/doDeleteWorkOrderType.d.ts | 3 + handlers/admin-post/doDeleteWorkOrderType.js | 11 + handlers/admin-post/doDeleteWorkOrderType.ts | 27 ++ .../admin-post/doMoveWorkOrderTypeDown.d.ts | 3 + .../admin-post/doMoveWorkOrderTypeDown.js | 11 + .../admin-post/doMoveWorkOrderTypeDown.ts | 27 ++ .../admin-post/doMoveWorkOrderTypeUp.d.ts | 3 + handlers/admin-post/doMoveWorkOrderTypeUp.js | 11 + handlers/admin-post/doMoveWorkOrderTypeUp.ts | 27 ++ .../admin-post/doUpdateWorkOrderType.d.ts | 3 + handlers/admin-post/doUpdateWorkOrderType.js | 11 + handlers/admin-post/doUpdateWorkOrderType.ts | 27 ++ helpers/functions.cache.d.ts | 2 + helpers/functions.cache.js | 11 + helpers/functions.cache.ts | 23 ++ helpers/lotOccupancyDB/addLotType.ts | 7 +- helpers/lotOccupancyDB/addWorkOrderType.d.ts | 7 + helpers/lotOccupancyDB/addWorkOrderType.js | 18 ++ helpers/lotOccupancyDB/addWorkOrderType.ts | 48 +++ .../lotOccupancyDB/deleteWorkOrderType.d.ts | 3 + helpers/lotOccupancyDB/deleteWorkOrderType.js | 17 ++ helpers/lotOccupancyDB/deleteWorkOrderType.ts | 36 +++ helpers/lotOccupancyDB/getWorkOrderTypes.d.ts | 3 + helpers/lotOccupancyDB/getWorkOrderTypes.js | 25 ++ helpers/lotOccupancyDB/getWorkOrderTypes.ts | 44 +++ .../lotOccupancyDB/moveWorkOrderTypeDown.d.ts | 2 + .../lotOccupancyDB/moveWorkOrderTypeDown.js | 26 ++ .../lotOccupancyDB/moveWorkOrderTypeDown.ts | 44 +++ .../lotOccupancyDB/moveWorkOrderTypeUp.d.ts | 2 + helpers/lotOccupancyDB/moveWorkOrderTypeUp.js | 30 ++ helpers/lotOccupancyDB/moveWorkOrderTypeUp.ts | 49 ++++ .../lotOccupancyDB/updateWorkOrderType.d.ts | 7 + helpers/lotOccupancyDB/updateWorkOrderType.js | 19 ++ helpers/lotOccupancyDB/updateWorkOrderType.ts | 44 +++ public-typescript/adminTables.d.ts | 1 + public-typescript/adminTables.js | 181 ++++++++++++ public-typescript/adminTables.ts | 273 ++++++++++++++++++ public/javascripts/adminTables.min.js | 1 + routes/admin.js | 12 + routes/admin.ts | 34 +++ types/recordTypes.d.ts | 5 + types/recordTypes.ts | 12 + views/admin-tables.ejs | 96 ++++++ views/dashboard.ejs | 18 ++ 50 files changed, 1344 insertions(+), 2 deletions(-) create mode 100644 handlers/admin-get/tables.d.ts create mode 100644 handlers/admin-get/tables.js create mode 100644 handlers/admin-get/tables.ts create mode 100644 handlers/admin-post/doAddWorkOrderType.d.ts create mode 100644 handlers/admin-post/doAddWorkOrderType.js create mode 100644 handlers/admin-post/doAddWorkOrderType.ts create mode 100644 handlers/admin-post/doDeleteWorkOrderType.d.ts create mode 100644 handlers/admin-post/doDeleteWorkOrderType.js create mode 100644 handlers/admin-post/doDeleteWorkOrderType.ts create mode 100644 handlers/admin-post/doMoveWorkOrderTypeDown.d.ts create mode 100644 handlers/admin-post/doMoveWorkOrderTypeDown.js create mode 100644 handlers/admin-post/doMoveWorkOrderTypeDown.ts create mode 100644 handlers/admin-post/doMoveWorkOrderTypeUp.d.ts create mode 100644 handlers/admin-post/doMoveWorkOrderTypeUp.js create mode 100644 handlers/admin-post/doMoveWorkOrderTypeUp.ts create mode 100644 handlers/admin-post/doUpdateWorkOrderType.d.ts create mode 100644 handlers/admin-post/doUpdateWorkOrderType.js create mode 100644 handlers/admin-post/doUpdateWorkOrderType.ts create mode 100644 helpers/lotOccupancyDB/addWorkOrderType.d.ts create mode 100644 helpers/lotOccupancyDB/addWorkOrderType.js create mode 100644 helpers/lotOccupancyDB/addWorkOrderType.ts create mode 100644 helpers/lotOccupancyDB/deleteWorkOrderType.d.ts create mode 100644 helpers/lotOccupancyDB/deleteWorkOrderType.js create mode 100644 helpers/lotOccupancyDB/deleteWorkOrderType.ts create mode 100644 helpers/lotOccupancyDB/getWorkOrderTypes.d.ts create mode 100644 helpers/lotOccupancyDB/getWorkOrderTypes.js create mode 100644 helpers/lotOccupancyDB/getWorkOrderTypes.ts create mode 100644 helpers/lotOccupancyDB/moveWorkOrderTypeDown.d.ts create mode 100644 helpers/lotOccupancyDB/moveWorkOrderTypeDown.js create mode 100644 helpers/lotOccupancyDB/moveWorkOrderTypeDown.ts create mode 100644 helpers/lotOccupancyDB/moveWorkOrderTypeUp.d.ts create mode 100644 helpers/lotOccupancyDB/moveWorkOrderTypeUp.js create mode 100644 helpers/lotOccupancyDB/moveWorkOrderTypeUp.ts create mode 100644 helpers/lotOccupancyDB/updateWorkOrderType.d.ts create mode 100644 helpers/lotOccupancyDB/updateWorkOrderType.js create mode 100644 helpers/lotOccupancyDB/updateWorkOrderType.ts create mode 100644 public-typescript/adminTables.d.ts create mode 100644 public-typescript/adminTables.js create mode 100644 public-typescript/adminTables.ts create mode 100644 public/javascripts/adminTables.min.js create mode 100644 views/admin-tables.ejs diff --git a/handlers/admin-get/tables.d.ts b/handlers/admin-get/tables.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/admin-get/tables.d.ts @@ -0,0 +1,3 @@ +import type { RequestHandler } from "express"; +export declare const handler: RequestHandler; +export default handler; diff --git a/handlers/admin-get/tables.js b/handlers/admin-get/tables.js new file mode 100644 index 00000000..d96e137c --- /dev/null +++ b/handlers/admin-get/tables.js @@ -0,0 +1,13 @@ +import { getLotOccupantTypes, getLotStatuses, getWorkOrderTypes } from "../../helpers/functions.cache.js"; +export const handler = (_request, response) => { + const workOrderTypes = getWorkOrderTypes(); + const lotStatuses = getLotStatuses(); + const lotOccupantTypes = getLotOccupantTypes(); + response.render("admin-tables", { + headTitle: "Config Table Management", + workOrderTypes, + lotStatuses, + lotOccupantTypes + }); +}; +export default handler; diff --git a/handlers/admin-get/tables.ts b/handlers/admin-get/tables.ts new file mode 100644 index 00000000..9b558dde --- /dev/null +++ b/handlers/admin-get/tables.ts @@ -0,0 +1,23 @@ +import type { + RequestHandler +} from "express"; + +import { getLotOccupantTypes, getLotStatuses, getWorkOrderTypes } from "../../helpers/functions.cache.js"; + + +export const handler: RequestHandler = (_request, response) => { + + const workOrderTypes = getWorkOrderTypes(); + const lotStatuses = getLotStatuses(); + const lotOccupantTypes = getLotOccupantTypes(); + + response.render("admin-tables", { + headTitle: "Config Table Management", + workOrderTypes, + lotStatuses, + lotOccupantTypes + }); +}; + + +export default handler; \ No newline at end of file diff --git a/handlers/admin-post/doAddWorkOrderType.d.ts b/handlers/admin-post/doAddWorkOrderType.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/admin-post/doAddWorkOrderType.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/doAddWorkOrderType.js b/handlers/admin-post/doAddWorkOrderType.js new file mode 100644 index 00000000..2ccfd8d8 --- /dev/null +++ b/handlers/admin-post/doAddWorkOrderType.js @@ -0,0 +1,12 @@ +import { addWorkOrderType } from "../../helpers/lotOccupancyDB/addWorkOrderType.js"; +import { getWorkOrderTypes } from "../../helpers/functions.cache.js"; +export const handler = async (request, response) => { + const workOrderTypeId = addWorkOrderType(request.body, request.session); + const workOrderTypes = getWorkOrderTypes(); + response.json({ + success: true, + workOrderTypeId, + workOrderTypes + }); +}; +export default handler; diff --git a/handlers/admin-post/doAddWorkOrderType.ts b/handlers/admin-post/doAddWorkOrderType.ts new file mode 100644 index 00000000..ebbf65d0 --- /dev/null +++ b/handlers/admin-post/doAddWorkOrderType.ts @@ -0,0 +1,28 @@ +import type { + RequestHandler +} from "express"; + +import { + addWorkOrderType +} from "../../helpers/lotOccupancyDB/addWorkOrderType.js"; + +import { + getWorkOrderTypes +} from "../../helpers/functions.cache.js"; + + +export const handler: RequestHandler = async (request, response) => { + + const workOrderTypeId = addWorkOrderType(request.body, request.session); + + const workOrderTypes = getWorkOrderTypes(); + + response.json({ + success: true, + workOrderTypeId, + workOrderTypes + }); +}; + + +export default handler; \ No newline at end of file diff --git a/handlers/admin-post/doDeleteWorkOrderType.d.ts b/handlers/admin-post/doDeleteWorkOrderType.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/admin-post/doDeleteWorkOrderType.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/doDeleteWorkOrderType.js b/handlers/admin-post/doDeleteWorkOrderType.js new file mode 100644 index 00000000..ee97f65b --- /dev/null +++ b/handlers/admin-post/doDeleteWorkOrderType.js @@ -0,0 +1,11 @@ +import { deleteWorkOrderType } from "../../helpers/lotOccupancyDB/deleteWorkOrderType.js"; +import { getWorkOrderTypes } from "../../helpers/functions.cache.js"; +export const handler = async (request, response) => { + const success = deleteWorkOrderType(request.body.workOrderTypeId, request.session); + const workOrderTypes = getWorkOrderTypes(); + response.json({ + success, + workOrderTypes + }); +}; +export default handler; diff --git a/handlers/admin-post/doDeleteWorkOrderType.ts b/handlers/admin-post/doDeleteWorkOrderType.ts new file mode 100644 index 00000000..ca5be76d --- /dev/null +++ b/handlers/admin-post/doDeleteWorkOrderType.ts @@ -0,0 +1,27 @@ +import type { + RequestHandler +} from "express"; + +import { + deleteWorkOrderType +} from "../../helpers/lotOccupancyDB/deleteWorkOrderType.js"; + +import { + getWorkOrderTypes +} from "../../helpers/functions.cache.js"; + + +export const handler: RequestHandler = async (request, response) => { + + const success = deleteWorkOrderType(request.body.workOrderTypeId, request.session); + + const workOrderTypes = getWorkOrderTypes(); + + response.json({ + success, + workOrderTypes + }); +}; + + +export default handler; \ No newline at end of file diff --git a/handlers/admin-post/doMoveWorkOrderTypeDown.d.ts b/handlers/admin-post/doMoveWorkOrderTypeDown.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/admin-post/doMoveWorkOrderTypeDown.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/doMoveWorkOrderTypeDown.js b/handlers/admin-post/doMoveWorkOrderTypeDown.js new file mode 100644 index 00000000..4aae884c --- /dev/null +++ b/handlers/admin-post/doMoveWorkOrderTypeDown.js @@ -0,0 +1,11 @@ +import { moveWorkOrderTypeDown } from "../../helpers/lotOccupancyDB/moveWorkOrderTypeDown.js"; +import { getWorkOrderTypes } from "../../helpers/functions.cache.js"; +export const handler = async (request, response) => { + const success = moveWorkOrderTypeDown(request.body.workOrderTypeId); + const workOrderTypes = getWorkOrderTypes(); + response.json({ + success, + workOrderTypes + }); +}; +export default handler; diff --git a/handlers/admin-post/doMoveWorkOrderTypeDown.ts b/handlers/admin-post/doMoveWorkOrderTypeDown.ts new file mode 100644 index 00000000..8b66bd41 --- /dev/null +++ b/handlers/admin-post/doMoveWorkOrderTypeDown.ts @@ -0,0 +1,27 @@ +import type { + RequestHandler +} from "express"; + +import { + moveWorkOrderTypeDown +} from "../../helpers/lotOccupancyDB/moveWorkOrderTypeDown.js"; + +import { + getWorkOrderTypes +} from "../../helpers/functions.cache.js"; + + +export const handler: RequestHandler = async (request, response) => { + + const success = moveWorkOrderTypeDown(request.body.workOrderTypeId); + + const workOrderTypes = getWorkOrderTypes(); + + response.json({ + success, + workOrderTypes + }); +}; + + +export default handler; \ No newline at end of file diff --git a/handlers/admin-post/doMoveWorkOrderTypeUp.d.ts b/handlers/admin-post/doMoveWorkOrderTypeUp.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/admin-post/doMoveWorkOrderTypeUp.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/doMoveWorkOrderTypeUp.js b/handlers/admin-post/doMoveWorkOrderTypeUp.js new file mode 100644 index 00000000..621d5f97 --- /dev/null +++ b/handlers/admin-post/doMoveWorkOrderTypeUp.js @@ -0,0 +1,11 @@ +import { moveWorkOrderTypeUp } from "../../helpers/lotOccupancyDB/moveWorkOrderTypeUp.js"; +import { getWorkOrderTypes } from "../../helpers/functions.cache.js"; +export const handler = async (request, response) => { + const success = moveWorkOrderTypeUp(request.body.workOrderTypeId); + const workOrderTypes = getWorkOrderTypes(); + response.json({ + success, + workOrderTypes + }); +}; +export default handler; diff --git a/handlers/admin-post/doMoveWorkOrderTypeUp.ts b/handlers/admin-post/doMoveWorkOrderTypeUp.ts new file mode 100644 index 00000000..428e2531 --- /dev/null +++ b/handlers/admin-post/doMoveWorkOrderTypeUp.ts @@ -0,0 +1,27 @@ +import type { + RequestHandler +} from "express"; + +import { + moveWorkOrderTypeUp +} from "../../helpers/lotOccupancyDB/moveWorkOrderTypeUp.js"; + +import { + getWorkOrderTypes +} from "../../helpers/functions.cache.js"; + + +export const handler: RequestHandler = async (request, response) => { + + const success = moveWorkOrderTypeUp(request.body.workOrderTypeId); + + const workOrderTypes = getWorkOrderTypes(); + + response.json({ + success, + workOrderTypes + }); +}; + + +export default handler; \ No newline at end of file diff --git a/handlers/admin-post/doUpdateWorkOrderType.d.ts b/handlers/admin-post/doUpdateWorkOrderType.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/admin-post/doUpdateWorkOrderType.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/doUpdateWorkOrderType.js b/handlers/admin-post/doUpdateWorkOrderType.js new file mode 100644 index 00000000..b371576f --- /dev/null +++ b/handlers/admin-post/doUpdateWorkOrderType.js @@ -0,0 +1,11 @@ +import { updateWorkOrderType } from "../../helpers/lotOccupancyDB/updateWorkOrderType.js"; +import { getWorkOrderTypes } from "../../helpers/functions.cache.js"; +export const handler = async (request, response) => { + const success = updateWorkOrderType(request.body, request.session); + const workOrderTypes = getWorkOrderTypes(); + response.json({ + success, + workOrderTypes + }); +}; +export default handler; diff --git a/handlers/admin-post/doUpdateWorkOrderType.ts b/handlers/admin-post/doUpdateWorkOrderType.ts new file mode 100644 index 00000000..f5cff47a --- /dev/null +++ b/handlers/admin-post/doUpdateWorkOrderType.ts @@ -0,0 +1,27 @@ +import type { + RequestHandler +} from "express"; + +import { + updateWorkOrderType +} from "../../helpers/lotOccupancyDB/updateWorkOrderType.js"; + +import { + getWorkOrderTypes +} from "../../helpers/functions.cache.js"; + + +export const handler: RequestHandler = async (request, response) => { + + const success = updateWorkOrderType(request.body, request.session); + + const workOrderTypes = getWorkOrderTypes(); + + response.json({ + success, + workOrderTypes + }); +}; + + +export default handler; \ No newline at end of file diff --git a/helpers/functions.cache.d.ts b/helpers/functions.cache.d.ts index 5d9ead16..f51f02a4 100644 --- a/helpers/functions.cache.d.ts +++ b/helpers/functions.cache.d.ts @@ -15,3 +15,5 @@ export declare function getOccupancyTypes(): recordTypes.OccupancyType[]; export declare function getOccupancyTypeById(occupancyTypeId: number): recordTypes.OccupancyType; export declare function getOccupancyTypeByOccupancyType(occupancyTypeString: string): recordTypes.OccupancyType; export declare function clearOccupancyTypesCache(): void; +export declare function getWorkOrderTypes(): recordTypes.WorkOrderType[]; +export declare function clearWorkOrderTypesCache(): void; diff --git a/helpers/functions.cache.js b/helpers/functions.cache.js index c53ae7f3..8431185b 100644 --- a/helpers/functions.cache.js +++ b/helpers/functions.cache.js @@ -2,6 +2,7 @@ import { getLotOccupantTypes as getLotOccupantTypesFromDatabase } from "./lotOcc import { getLotStatuses as getLotStatusesFromDatabase } from "./lotOccupancyDB/getLotStatuses.js"; import { getLotTypes as getLotTypesFromDatabase } from "./lotOccupancyDB/getLotTypes.js"; import { getOccupancyTypes as getOccupancyTypesFromDatabase } from "./lotOccupancyDB/getOccupancyTypes.js"; +import { getWorkOrderTypes as getWorkOrderTypesFromDatabase } from "./lotOccupancyDB/getWorkOrderTypes.js"; import { getOccupancyType } from "./lotOccupancyDB/getOccupancyType.js"; let lotOccupantTypes; export function getLotOccupantTypes() { @@ -102,3 +103,13 @@ export function clearOccupancyTypesCache() { occupancyTypes = undefined; occupancyTypeMap.clear(); } +let workOrderTypes; +export function getWorkOrderTypes() { + if (!workOrderTypes) { + workOrderTypes = getWorkOrderTypesFromDatabase(); + } + return workOrderTypes; +} +export function clearWorkOrderTypesCache() { + workOrderTypes = undefined; +} diff --git a/helpers/functions.cache.ts b/helpers/functions.cache.ts index 2da7ec4c..d41ef5a7 100644 --- a/helpers/functions.cache.ts +++ b/helpers/functions.cache.ts @@ -14,6 +14,10 @@ import { getOccupancyTypes as getOccupancyTypesFromDatabase } from "./lotOccupancyDB/getOccupancyTypes.js"; +import { + getWorkOrderTypes as getWorkOrderTypesFromDatabase +} from "./lotOccupancyDB/getWorkOrderTypes.js"; + import { getOccupancyType } from "./lotOccupancyDB/getOccupancyType.js"; @@ -187,4 +191,23 @@ export function getOccupancyTypeByOccupancyType(occupancyTypeString: string) { export function clearOccupancyTypesCache() { occupancyTypes = undefined; occupancyTypeMap.clear(); +} + +/* + * Work Order Types + */ + +let workOrderTypes: recordTypes.WorkOrderType[]; + +export function getWorkOrderTypes() { + + if (!workOrderTypes) { + workOrderTypes = getWorkOrderTypesFromDatabase(); + } + + return workOrderTypes; +} + +export function clearWorkOrderTypesCache() { + workOrderTypes = undefined; } \ No newline at end of file diff --git a/helpers/lotOccupancyDB/addLotType.ts b/helpers/lotOccupancyDB/addLotType.ts index daa48ca1..32ac543e 100644 --- a/helpers/lotOccupancyDB/addLotType.ts +++ b/helpers/lotOccupancyDB/addLotType.ts @@ -4,13 +4,16 @@ import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { + clearLotTypesCache +} from "../functions.cache.js"; + import type * as recordTypes from "../../types/recordTypes"; -import { clearLotTypesCache } from "../functions.cache.js"; interface AddLotTypeForm { lotType: string; - orderNumber?: number; + orderNumber ? : number; } diff --git a/helpers/lotOccupancyDB/addWorkOrderType.d.ts b/helpers/lotOccupancyDB/addWorkOrderType.d.ts new file mode 100644 index 00000000..b320376c --- /dev/null +++ b/helpers/lotOccupancyDB/addWorkOrderType.d.ts @@ -0,0 +1,7 @@ +import type * as recordTypes from "../../types/recordTypes"; +interface AddWorkOrderTypeForm { + workOrderType: string; + orderNumber?: number; +} +export declare const addWorkOrderType: (workOrderTypeForm: AddWorkOrderTypeForm, requestSession: recordTypes.PartialSession) => number; +export default addWorkOrderType; diff --git a/helpers/lotOccupancyDB/addWorkOrderType.js b/helpers/lotOccupancyDB/addWorkOrderType.js new file mode 100644 index 00000000..95559beb --- /dev/null +++ b/helpers/lotOccupancyDB/addWorkOrderType.js @@ -0,0 +1,18 @@ +import sqlite from "better-sqlite3"; +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { clearWorkOrderTypesCache } from "../functions.cache.js"; +export const addWorkOrderType = (workOrderTypeForm, requestSession) => { + const database = sqlite(databasePath); + const rightNowMillis = Date.now(); + const result = database + .prepare("insert into WorkOrderTypes (" + + "workOrderType, orderNumber," + + " recordCreate_userName, recordCreate_timeMillis," + + " recordUpdate_userName, recordUpdate_timeMillis)" + + " values (?, ?, ?, ?, ?, ?)") + .run(workOrderTypeForm.workOrderType, (workOrderTypeForm.orderNumber || -1), requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis); + database.close(); + clearWorkOrderTypesCache(); + return result.lastInsertRowid; +}; +export default addWorkOrderType; diff --git a/helpers/lotOccupancyDB/addWorkOrderType.ts b/helpers/lotOccupancyDB/addWorkOrderType.ts new file mode 100644 index 00000000..f65dbcb0 --- /dev/null +++ b/helpers/lotOccupancyDB/addWorkOrderType.ts @@ -0,0 +1,48 @@ +import sqlite from "better-sqlite3"; + +import { + lotOccupancyDB as databasePath +} from "../../data/databasePaths.js"; + +import { + clearWorkOrderTypesCache +} from "../functions.cache.js"; + +import type * as recordTypes from "../../types/recordTypes"; + + +interface AddWorkOrderTypeForm { + workOrderType: string; + orderNumber ? : number; +} + + +export const addWorkOrderType = + (workOrderTypeForm: AddWorkOrderTypeForm, requestSession: recordTypes.PartialSession): number => { + + const database = sqlite(databasePath); + + const rightNowMillis = Date.now(); + + const result = database + .prepare("insert into WorkOrderTypes (" + + "workOrderType, orderNumber," + + " recordCreate_userName, recordCreate_timeMillis," + + " recordUpdate_userName, recordUpdate_timeMillis)" + + " values (?, ?, ?, ?, ?, ?)") + .run(workOrderTypeForm.workOrderType, + (workOrderTypeForm.orderNumber || -1), + requestSession.user.userName, + rightNowMillis, + requestSession.user.userName, + rightNowMillis); + + database.close(); + + clearWorkOrderTypesCache(); + + return result.lastInsertRowid as number; + }; + + +export default addWorkOrderType; \ No newline at end of file diff --git a/helpers/lotOccupancyDB/deleteWorkOrderType.d.ts b/helpers/lotOccupancyDB/deleteWorkOrderType.d.ts new file mode 100644 index 00000000..42e11cd7 --- /dev/null +++ b/helpers/lotOccupancyDB/deleteWorkOrderType.d.ts @@ -0,0 +1,3 @@ +import type * as recordTypes from "../../types/recordTypes"; +export declare const deleteWorkOrderType: (workOrderTypeId: number | string, requestSession: recordTypes.PartialSession) => boolean; +export default deleteWorkOrderType; diff --git a/helpers/lotOccupancyDB/deleteWorkOrderType.js b/helpers/lotOccupancyDB/deleteWorkOrderType.js new file mode 100644 index 00000000..a4fda52c --- /dev/null +++ b/helpers/lotOccupancyDB/deleteWorkOrderType.js @@ -0,0 +1,17 @@ +import sqlite from "better-sqlite3"; +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { clearWorkOrderTypesCache } from "../functions.cache.js"; +export const deleteWorkOrderType = (workOrderTypeId, requestSession) => { + const database = sqlite(databasePath); + const rightNowMillis = Date.now(); + const result = database + .prepare("update WorkOrderTypes" + + " set recordDelete_userName = ?," + + " recordDelete_timeMillis = ?" + + " where workOrderTypeId = ?") + .run(requestSession.user.userName, rightNowMillis, workOrderTypeId); + database.close(); + clearWorkOrderTypesCache(); + return (result.changes > 0); +}; +export default deleteWorkOrderType; diff --git a/helpers/lotOccupancyDB/deleteWorkOrderType.ts b/helpers/lotOccupancyDB/deleteWorkOrderType.ts new file mode 100644 index 00000000..8c9ef8d9 --- /dev/null +++ b/helpers/lotOccupancyDB/deleteWorkOrderType.ts @@ -0,0 +1,36 @@ +import sqlite from "better-sqlite3"; + +import { + lotOccupancyDB as databasePath +} from "../../data/databasePaths.js"; + +import type * as recordTypes from "../../types/recordTypes"; +import { clearWorkOrderTypesCache } from "../functions.cache.js"; + + +export const deleteWorkOrderType = + (workOrderTypeId: number | string, + requestSession: recordTypes.PartialSession): boolean => { + + const database = sqlite(databasePath); + + const rightNowMillis = Date.now(); + + const result = database + .prepare("update WorkOrderTypes" + + " set recordDelete_userName = ?," + + " recordDelete_timeMillis = ?" + + " where workOrderTypeId = ?") + .run(requestSession.user.userName, + rightNowMillis, + workOrderTypeId); + + database.close(); + + clearWorkOrderTypesCache(); + + return (result.changes > 0); + }; + + +export default deleteWorkOrderType; \ No newline at end of file diff --git a/helpers/lotOccupancyDB/getWorkOrderTypes.d.ts b/helpers/lotOccupancyDB/getWorkOrderTypes.d.ts new file mode 100644 index 00000000..23e17a3d --- /dev/null +++ b/helpers/lotOccupancyDB/getWorkOrderTypes.d.ts @@ -0,0 +1,3 @@ +import type * as recordTypes from "../../types/recordTypes"; +export declare const getWorkOrderTypes: () => recordTypes.WorkOrderType[]; +export default getWorkOrderTypes; diff --git a/helpers/lotOccupancyDB/getWorkOrderTypes.js b/helpers/lotOccupancyDB/getWorkOrderTypes.js new file mode 100644 index 00000000..1841ce6c --- /dev/null +++ b/helpers/lotOccupancyDB/getWorkOrderTypes.js @@ -0,0 +1,25 @@ +import sqlite from "better-sqlite3"; +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +export const getWorkOrderTypes = () => { + const database = sqlite(databasePath); + const workOrderTypes = database + .prepare("select workOrderTypeId, workOrderType, orderNumber" + + " from WorkOrderTypes" + + " where recordDelete_timeMillis is null" + + " order by orderNumber, workOrderType") + .all(); + let expectedOrderNumber = 0; + for (const workOrderType of workOrderTypes) { + if (workOrderType.orderNumber !== expectedOrderNumber) { + database.prepare("update WorkOrderTypes" + + " set orderNumber = ?" + + " where workOrderTypeId = ?") + .run(expectedOrderNumber, workOrderType.workOrderTypeId); + workOrderType.orderNumber = expectedOrderNumber; + } + expectedOrderNumber += 1; + } + database.close(); + return workOrderTypes; +}; +export default getWorkOrderTypes; diff --git a/helpers/lotOccupancyDB/getWorkOrderTypes.ts b/helpers/lotOccupancyDB/getWorkOrderTypes.ts new file mode 100644 index 00000000..15cb9a4d --- /dev/null +++ b/helpers/lotOccupancyDB/getWorkOrderTypes.ts @@ -0,0 +1,44 @@ +import sqlite from "better-sqlite3"; +import { + lotOccupancyDB as databasePath +} from "../../data/databasePaths.js"; + +import type * as recordTypes from "../../types/recordTypes"; + + +export const getWorkOrderTypes = (): recordTypes.WorkOrderType[] => { + + const database = sqlite(databasePath); + + const workOrderTypes: recordTypes.WorkOrderType[] = database + .prepare("select workOrderTypeId, workOrderType, orderNumber" + + " from WorkOrderTypes" + + " where recordDelete_timeMillis is null" + + " order by orderNumber, workOrderType") + .all(); + + let expectedOrderNumber = 0; + + for (const workOrderType of workOrderTypes) { + + if (workOrderType.orderNumber !== expectedOrderNumber) { + + database.prepare("update WorkOrderTypes" + + " set orderNumber = ?" + + " where workOrderTypeId = ?") + .run(expectedOrderNumber, + workOrderType.workOrderTypeId); + + workOrderType.orderNumber = expectedOrderNumber; + } + + expectedOrderNumber += 1; + } + + database.close(); + + return workOrderTypes; +}; + + +export default getWorkOrderTypes; \ No newline at end of file diff --git a/helpers/lotOccupancyDB/moveWorkOrderTypeDown.d.ts b/helpers/lotOccupancyDB/moveWorkOrderTypeDown.d.ts new file mode 100644 index 00000000..03a81485 --- /dev/null +++ b/helpers/lotOccupancyDB/moveWorkOrderTypeDown.d.ts @@ -0,0 +1,2 @@ +export declare const moveWorkOrderTypeDown: (workOrderTypeId: number | string) => boolean; +export default moveWorkOrderTypeDown; diff --git a/helpers/lotOccupancyDB/moveWorkOrderTypeDown.js b/helpers/lotOccupancyDB/moveWorkOrderTypeDown.js new file mode 100644 index 00000000..ded00dca --- /dev/null +++ b/helpers/lotOccupancyDB/moveWorkOrderTypeDown.js @@ -0,0 +1,26 @@ +import sqlite from "better-sqlite3"; +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { clearWorkOrderTypesCache } from "../functions.cache.js"; +export const moveWorkOrderTypeDown = (workOrderTypeId) => { + const database = sqlite(databasePath); + const currentOrderNumber = database.prepare("select orderNumber" + + " from WorkOrderTypes" + + " where workOrderTypeId = ?") + .get(workOrderTypeId) + .orderNumber; + database + .prepare("update WorkOrderTypes" + + " set orderNumber = orderNumber - 1" + + " where recordDelete_timeMillis is null" + + " and orderNumber = ? + 1") + .run(currentOrderNumber); + const result = database + .prepare("update WorkOrderTypes" + + " set orderNumber = ? + 1" + + " where workOrderTypeId = ?") + .run(currentOrderNumber, workOrderTypeId); + database.close(); + clearWorkOrderTypesCache(); + return result.changes > 0; +}; +export default moveWorkOrderTypeDown; diff --git a/helpers/lotOccupancyDB/moveWorkOrderTypeDown.ts b/helpers/lotOccupancyDB/moveWorkOrderTypeDown.ts new file mode 100644 index 00000000..52d561e7 --- /dev/null +++ b/helpers/lotOccupancyDB/moveWorkOrderTypeDown.ts @@ -0,0 +1,44 @@ +import sqlite from "better-sqlite3"; + +import { + lotOccupancyDB as databasePath +} from "../../data/databasePaths.js"; + +import { + clearWorkOrderTypesCache +} from "../functions.cache.js"; + + +export const moveWorkOrderTypeDown = + (workOrderTypeId: number | string): boolean => { + + const database = sqlite(databasePath); + + const currentOrderNumber: number = database.prepare("select orderNumber" + + " from WorkOrderTypes" + + " where workOrderTypeId = ?") + .get(workOrderTypeId) + .orderNumber; + + database + .prepare("update WorkOrderTypes" + + " set orderNumber = orderNumber - 1" + + " where recordDelete_timeMillis is null" + + " and orderNumber = ? + 1") + .run(currentOrderNumber); + + const result = database + .prepare("update WorkOrderTypes" + + " set orderNumber = ? + 1" + + " where workOrderTypeId = ?") + .run(currentOrderNumber, workOrderTypeId); + + database.close(); + + clearWorkOrderTypesCache(); + + return result.changes > 0; + }; + + +export default moveWorkOrderTypeDown; \ No newline at end of file diff --git a/helpers/lotOccupancyDB/moveWorkOrderTypeUp.d.ts b/helpers/lotOccupancyDB/moveWorkOrderTypeUp.d.ts new file mode 100644 index 00000000..3d6c2c0e --- /dev/null +++ b/helpers/lotOccupancyDB/moveWorkOrderTypeUp.d.ts @@ -0,0 +1,2 @@ +export declare const moveWorkOrderTypeUp: (workOrderTypeId: number | string) => boolean; +export default moveWorkOrderTypeUp; diff --git a/helpers/lotOccupancyDB/moveWorkOrderTypeUp.js b/helpers/lotOccupancyDB/moveWorkOrderTypeUp.js new file mode 100644 index 00000000..8936db77 --- /dev/null +++ b/helpers/lotOccupancyDB/moveWorkOrderTypeUp.js @@ -0,0 +1,30 @@ +import sqlite from "better-sqlite3"; +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { clearWorkOrderTypesCache } from "../functions.cache.js"; +export const moveWorkOrderTypeUp = (workOrderTypeId) => { + const database = sqlite(databasePath); + const currentOrderNumber = database.prepare("select orderNumber" + + " from WorkOrderTypes" + + " where workOrderTypeId = ?") + .get(workOrderTypeId) + .orderNumber; + if (currentOrderNumber <= 0) { + database.close(); + return true; + } + database + .prepare("update WorkOrderTypes" + + " set orderNumber = orderNumber + 1" + + " where recordDelete_timeMillis is null" + + " and orderNumber = ? - 1") + .run(currentOrderNumber); + const result = database + .prepare("update WorkOrderTypes" + + " set orderNumber = ? - 1" + + " where workOrderTypeId = ?") + .run(currentOrderNumber, workOrderTypeId); + database.close(); + clearWorkOrderTypesCache(); + return result.changes > 0; +}; +export default moveWorkOrderTypeUp; diff --git a/helpers/lotOccupancyDB/moveWorkOrderTypeUp.ts b/helpers/lotOccupancyDB/moveWorkOrderTypeUp.ts new file mode 100644 index 00000000..0d6ac758 --- /dev/null +++ b/helpers/lotOccupancyDB/moveWorkOrderTypeUp.ts @@ -0,0 +1,49 @@ +import sqlite from "better-sqlite3"; + +import { + lotOccupancyDB as databasePath +} from "../../data/databasePaths.js"; + +import { + clearWorkOrderTypesCache +} from "../functions.cache.js"; + + +export const moveWorkOrderTypeUp = + (workOrderTypeId: number | string): boolean => { + + const database = sqlite(databasePath); + + const currentOrderNumber: number = database.prepare("select orderNumber" + + " from WorkOrderTypes" + + " where workOrderTypeId = ?") + .get(workOrderTypeId) + .orderNumber; + + if (currentOrderNumber <= 0) { + database.close(); + return true; + } + + database + .prepare("update WorkOrderTypes" + + " set orderNumber = orderNumber + 1" + + " where recordDelete_timeMillis is null" + + " and orderNumber = ? - 1") + .run(currentOrderNumber); + + const result = database + .prepare("update WorkOrderTypes" + + " set orderNumber = ? - 1" + + " where workOrderTypeId = ?") + .run(currentOrderNumber, workOrderTypeId); + + database.close(); + + clearWorkOrderTypesCache(); + + return result.changes > 0; + }; + + +export default moveWorkOrderTypeUp; \ No newline at end of file diff --git a/helpers/lotOccupancyDB/updateWorkOrderType.d.ts b/helpers/lotOccupancyDB/updateWorkOrderType.d.ts new file mode 100644 index 00000000..370ccad0 --- /dev/null +++ b/helpers/lotOccupancyDB/updateWorkOrderType.d.ts @@ -0,0 +1,7 @@ +import type * as recordTypes from "../../types/recordTypes"; +interface UpdateWorkOrderTypeForm { + workOrderTypeId: number | string; + workOrderType: string; +} +export declare const updateWorkOrderType: (workOrderTypeForm: UpdateWorkOrderTypeForm, requestSession: recordTypes.PartialSession) => boolean; +export default updateWorkOrderType; diff --git a/helpers/lotOccupancyDB/updateWorkOrderType.js b/helpers/lotOccupancyDB/updateWorkOrderType.js new file mode 100644 index 00000000..419db684 --- /dev/null +++ b/helpers/lotOccupancyDB/updateWorkOrderType.js @@ -0,0 +1,19 @@ +import sqlite from "better-sqlite3"; +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { clearWorkOrderTypesCache } from "../functions.cache.js"; +export const updateWorkOrderType = (workOrderTypeForm, requestSession) => { + const database = sqlite(databasePath); + const rightNowMillis = Date.now(); + const result = database + .prepare("update WorkOrderTypes" + + " set workOrderType = ?," + + " recordUpdate_userName = ?," + + " recordUpdate_timeMillis = ?" + + " where workOrderTypeId = ?" + + " and recordDelete_timeMillis is null") + .run(workOrderTypeForm.workOrderType, requestSession.user.userName, rightNowMillis, workOrderTypeForm.workOrderTypeId); + database.close(); + clearWorkOrderTypesCache(); + return result.changes > 0; +}; +export default updateWorkOrderType; diff --git a/helpers/lotOccupancyDB/updateWorkOrderType.ts b/helpers/lotOccupancyDB/updateWorkOrderType.ts new file mode 100644 index 00000000..9b42d121 --- /dev/null +++ b/helpers/lotOccupancyDB/updateWorkOrderType.ts @@ -0,0 +1,44 @@ +import sqlite from "better-sqlite3"; + +import { + lotOccupancyDB as databasePath +} from "../../data/databasePaths.js"; + +import type * as recordTypes from "../../types/recordTypes"; +import { clearWorkOrderTypesCache } from "../functions.cache.js"; + + +interface UpdateWorkOrderTypeForm { + workOrderTypeId: number | string; + workOrderType: string; +} + + +export const updateWorkOrderType = + (workOrderTypeForm: UpdateWorkOrderTypeForm, requestSession: recordTypes.PartialSession): boolean => { + + const database = sqlite(databasePath); + + const rightNowMillis = Date.now(); + + const result = database + .prepare("update WorkOrderTypes" + + " set workOrderType = ?," + + " recordUpdate_userName = ?," + + " recordUpdate_timeMillis = ?" + + " where workOrderTypeId = ?" + + " and recordDelete_timeMillis is null") + .run(workOrderTypeForm.workOrderType, + requestSession.user.userName, + rightNowMillis, + workOrderTypeForm.workOrderTypeId); + + database.close(); + + clearWorkOrderTypesCache(); + + return result.changes > 0; + }; + + +export default updateWorkOrderType; \ No newline at end of file diff --git a/public-typescript/adminTables.d.ts b/public-typescript/adminTables.d.ts new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/public-typescript/adminTables.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/public-typescript/adminTables.js b/public-typescript/adminTables.js new file mode 100644 index 00000000..daf80e10 --- /dev/null +++ b/public-typescript/adminTables.js @@ -0,0 +1,181 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +(() => { + const los = exports.los; + const urlPrefix = document.querySelector("main").dataset.urlPrefix; + let workOrderTypes = exports.workOrderTypes; + delete exports.workOrderTypes; + const updateWorkOrderType = (submitEvent) => { + submitEvent.preventDefault(); + cityssm.postJSON(urlPrefix + "/admin/doUpdateWorkOrderType", submitEvent.currentTarget, (responseJSON) => { + if (responseJSON.success) { + workOrderTypes = responseJSON.workOrderTypes; + bulmaJS.alert({ + message: "Work Order Type Updated Successfully", + contextualColorName: "success" + }); + } + else { + bulmaJS.alert({ + title: "Error Updating Work Order Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + const deleteWorkOrderType = (clickEvent) => { + const tableRowElement = clickEvent.currentTarget.closest("tr"); + const workOrderTypeId = tableRowElement.dataset.workOrderTypeId; + const doDelete = () => { + cityssm.postJSON(urlPrefix + "/admin/doDeleteWorkOrderType", { + workOrderTypeId + }, (responseJSON) => { + if (responseJSON.success) { + workOrderTypes = responseJSON.workOrderTypes; + if (workOrderTypes.length === 0) { + renderWorkOrderTypes(); + } + else { + tableRowElement.remove(); + } + bulmaJS.alert({ + message: "Work Order Type Deleted Successfully", + contextualColorName: "success" + }); + } + else { + bulmaJS.alert({ + title: "Error Deleting Work Order Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + 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: true, + contextualColorName: "warning", + okButton: { + text: "Yes, Delete Work Order Type", + callbackFunction: doDelete + } + }); + }; + const moveWorkOrderTypeUp = (clickEvent) => { + const tableRowElement = clickEvent.currentTarget.closest("tr"); + const workOrderTypeId = tableRowElement.dataset.workOrderTypeId; + cityssm.postJSON(urlPrefix + "/admin/doMoveWorkOrderTypeUp", { + workOrderTypeId + }, (responseJSON) => { + if (responseJSON.success) { + workOrderTypes = responseJSON.workOrderTypes; + renderWorkOrderTypes(); + } + else { + bulmaJS.alert({ + title: "Error Moving Work Order Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + const moveWorkOrderTypeDown = (clickEvent) => { + const tableRowElement = clickEvent.currentTarget.closest("tr"); + const workOrderTypeId = tableRowElement.dataset.workOrderTypeId; + cityssm.postJSON(urlPrefix + "/admin/doMoveWorkOrderTypeDown", { + workOrderTypeId + }, (responseJSON) => { + if (responseJSON.success) { + workOrderTypes = responseJSON.workOrderTypes; + renderWorkOrderTypes(); + } + else { + bulmaJS.alert({ + title: "Error Moving Work Order Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + const renderWorkOrderTypes = () => { + const containerElement = document.querySelector("#container--workOrderTypes"); + if (workOrderTypes.length === 0) { + containerElement.innerHTML = "" + + "" + + "
" + + "

There are no active work order types.

" + + "
" + + "" + + ""; + return; + } + containerElement.innerHTML = ""; + for (const workOrderType of workOrderTypes) { + const tableRowElement = document.createElement("tr"); + tableRowElement.dataset.workOrderTypeId = workOrderType.workOrderTypeId.toString(); + tableRowElement.innerHTML = "" + + "
" + + "" + + ("
" + + "
" + + "" + + "
" + + "
" + + "" + + "
" + + "
") + + "
" + + "" + + "" + + "
" + + "
" + + ("
" + + "
" + + "" + + "
" + + "
" + + "" + + "
" + + "
") + + "
" + + "
" + + "" + + "
" + + "
" + + ""; + tableRowElement.querySelector("form").addEventListener("submit", updateWorkOrderType); + tableRowElement.querySelector(".button--moveWorkOrderTypeUp").addEventListener("click", moveWorkOrderTypeUp); + tableRowElement.querySelector(".button--moveWorkOrderTypeDown").addEventListener("click", moveWorkOrderTypeDown); + tableRowElement.querySelector(".button--deleteWorkOrderType").addEventListener("click", deleteWorkOrderType); + containerElement.append(tableRowElement); + } + }; + document.querySelector("#form--addWorkOrderType").addEventListener("submit", (submitEvent) => { + submitEvent.preventDefault(); + const formElement = submitEvent.currentTarget; + cityssm.postJSON(urlPrefix + "/admin/doAddWorkOrderType", formElement, (responseJSON) => { + if (responseJSON.success) { + workOrderTypes = responseJSON.workOrderTypes; + renderWorkOrderTypes(); + formElement.reset(); + formElement.querySelector("input").focus(); + } + else { + bulmaJS.alert({ + title: "Error Adding Work Order Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }); + renderWorkOrderTypes(); +})(); diff --git a/public-typescript/adminTables.ts b/public-typescript/adminTables.ts new file mode 100644 index 00000000..e75db949 --- /dev/null +++ b/public-typescript/adminTables.ts @@ -0,0 +1,273 @@ +/* eslint-disable unicorn/prefer-module */ + +import type * as globalTypes from "../types/globalTypes"; +import type * as recordTypes from "../types/recordTypes"; + +import type { + cityssmGlobal +} from "@cityssm/bulma-webapp-js/src/types"; + +import type { + BulmaJS +} from "@cityssm/bulma-js/types"; + +declare const cityssm: cityssmGlobal; +declare const bulmaJS: BulmaJS; + + +(() => { + const los = (exports.los as globalTypes.LOS); + + const urlPrefix = document.querySelector("main").dataset.urlPrefix; + + /* + * Work Order Types + */ + + let workOrderTypes: recordTypes.WorkOrderType[] = exports.workOrderTypes; + delete exports.workOrderTypes; + + const updateWorkOrderType = (submitEvent: SubmitEvent) => { + + submitEvent.preventDefault(); + + cityssm.postJSON(urlPrefix + "/admin/doUpdateWorkOrderType", + submitEvent.currentTarget, + (responseJSON: { + success: boolean; + errorMessage ? : string; + workOrderTypes ? : recordTypes.WorkOrderType[]; + }) => { + if (responseJSON.success) { + + workOrderTypes = responseJSON.workOrderTypes; + + bulmaJS.alert({ + message: "Work Order Type Updated Successfully", + contextualColorName: "success" + }); + + } else { + bulmaJS.alert({ + title: "Error Updating Work Order Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + + const deleteWorkOrderType = (clickEvent: Event) => { + + const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest("tr"); + + const workOrderTypeId = tableRowElement.dataset.workOrderTypeId; + + const doDelete = () => { + + cityssm.postJSON(urlPrefix + "/admin/doDeleteWorkOrderType", { + workOrderTypeId + }, + (responseJSON: { + success: boolean; + errorMessage ? : string; + workOrderTypes ? : recordTypes.WorkOrderType[]; + }) => { + + if (responseJSON.success) { + + workOrderTypes = responseJSON.workOrderTypes; + + if (workOrderTypes.length === 0) { + renderWorkOrderTypes(); + } else { + tableRowElement.remove(); + } + + bulmaJS.alert({ + message: "Work Order Type Deleted Successfully", + contextualColorName: "success" + }); + + } else { + bulmaJS.alert({ + title: "Error Deleting Work Order Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + + 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: true, + contextualColorName: "warning", + okButton: { + text: "Yes, Delete Work Order Type", + callbackFunction: doDelete + } + }); + }; + + const moveWorkOrderTypeUp = (clickEvent: Event) => { + + const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest("tr"); + + const workOrderTypeId = tableRowElement.dataset.workOrderTypeId; + + cityssm.postJSON(urlPrefix + "/admin/doMoveWorkOrderTypeUp", { + workOrderTypeId + }, + (responseJSON: { + success: boolean; + errorMessage ? : string; + workOrderTypes ? : recordTypes.WorkOrderType[]; + }) => { + + if (responseJSON.success) { + + workOrderTypes = responseJSON.workOrderTypes; + renderWorkOrderTypes(); + + } else { + bulmaJS.alert({ + title: "Error Moving Work Order Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + + const moveWorkOrderTypeDown = (clickEvent: Event) => { + + const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest("tr"); + + const workOrderTypeId = tableRowElement.dataset.workOrderTypeId; + + cityssm.postJSON(urlPrefix + "/admin/doMoveWorkOrderTypeDown", { + workOrderTypeId + }, + (responseJSON: { + success: boolean; + errorMessage ? : string; + workOrderTypes ? : recordTypes.WorkOrderType[]; + }) => { + + if (responseJSON.success) { + + workOrderTypes = responseJSON.workOrderTypes; + renderWorkOrderTypes(); + + } else { + bulmaJS.alert({ + title: "Error Moving Work Order Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + + const renderWorkOrderTypes = () => { + + const containerElement = document.querySelector("#container--workOrderTypes") as HTMLTableSectionElement; + + if (workOrderTypes.length === 0) { + containerElement.innerHTML = "" + + "" + + "
" + + "

There are no active work order types.

" + + "
" + + "" + + ""; + + return; + } + + containerElement.innerHTML = ""; + + for (const workOrderType of workOrderTypes) { + + const tableRowElement = document.createElement("tr"); + + tableRowElement.dataset.workOrderTypeId = workOrderType.workOrderTypeId.toString(); + + tableRowElement.innerHTML = "" + + "
" + + "" + + ("
" + + "
" + + "" + + "
" + + "
" + + "" + + "
" + + "
") + + "
" + + "" + + "" + + "
" + + "
" + + ("
" + + "
" + + "" + + "
" + + "
" + + "" + + "
" + + "
") + + "
" + + "
" + + "" + + "
" + + "
" + + ""; + + tableRowElement.querySelector("form").addEventListener("submit", updateWorkOrderType); + tableRowElement.querySelector(".button--moveWorkOrderTypeUp").addEventListener("click", moveWorkOrderTypeUp); + tableRowElement.querySelector(".button--moveWorkOrderTypeDown").addEventListener("click", moveWorkOrderTypeDown); + tableRowElement.querySelector(".button--deleteWorkOrderType").addEventListener("click", deleteWorkOrderType); + + containerElement.append(tableRowElement); + } + + }; + + document.querySelector("#form--addWorkOrderType").addEventListener("submit", (submitEvent: SubmitEvent) => { + + submitEvent.preventDefault(); + + const formElement = submitEvent.currentTarget as HTMLFormElement; + + cityssm.postJSON(urlPrefix + "/admin/doAddWorkOrderType", + formElement, + (responseJSON: { + success: boolean; + errorMessage ? : string; + workOrderTypes ? : recordTypes.WorkOrderType[]; + }) => { + + if (responseJSON.success) { + workOrderTypes = responseJSON.workOrderTypes; + renderWorkOrderTypes(); + formElement.reset(); + formElement.querySelector("input").focus(); + } else { + bulmaJS.alert({ + title: "Error Adding Work Order Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }); + + renderWorkOrderTypes(); + +})(); \ No newline at end of file diff --git a/public/javascripts/adminTables.min.js b/public/javascripts/adminTables.min.js new file mode 100644 index 00000000..b608ccf4 --- /dev/null +++ b/public/javascripts/adminTables.min.js @@ -0,0 +1 @@ +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{exports.los;const e=document.querySelector("main").dataset.urlPrefix;let r=exports.workOrderTypes;delete exports.workOrderTypes;const t=t=>{t.preventDefault(),cityssm.postJSON(e+"/admin/doUpdateWorkOrderType",t.currentTarget,e=>{e.success?(r=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=t=>{const o=t.currentTarget.closest("tr"),s=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:s},e=>{e.success?(0===(r=e.workOrderTypes).length?d():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"})})}}})},s=t=>{const o=t.currentTarget.closest("tr").dataset.workOrderTypeId;cityssm.postJSON(e+"/admin/doMoveWorkOrderTypeUp",{workOrderTypeId:o},e=>{e.success?(r=e.workOrderTypes,d()):bulmaJS.alert({title:"Error Moving Work Order Type",message:e.errorMessage,contextualColorName:"danger"})})},a=t=>{const o=t.currentTarget.closest("tr").dataset.workOrderTypeId;cityssm.postJSON(e+"/admin/doMoveWorkOrderTypeDown",{workOrderTypeId:o},e=>{e.success?(r=e.workOrderTypes,d()):bulmaJS.alert({title:"Error Moving Work Order Type",message:e.errorMessage,contextualColorName:"danger"})})},d=()=>{const e=document.querySelector("#container--workOrderTypes");if(0!==r.length){e.innerHTML="";for(const d of r){const r=document.createElement("tr");r.dataset.workOrderTypeId=d.workOrderTypeId.toString(),r.innerHTML='
',r.querySelector("form").addEventListener("submit",t),r.querySelector(".button--moveWorkOrderTypeUp").addEventListener("click",s),r.querySelector(".button--moveWorkOrderTypeDown").addEventListener("click",a),r.querySelector(".button--deleteWorkOrderType").addEventListener("click",o),e.append(r)}}else e.innerHTML='

There are no active work order types.

'};document.querySelector("#form--addWorkOrderType").addEventListener("submit",t=>{t.preventDefault();const o=t.currentTarget;cityssm.postJSON(e+"/admin/doAddWorkOrderType",o,e=>{e.success?(r=e.workOrderTypes,d(),o.reset(),o.querySelector("input").focus()):bulmaJS.alert({title:"Error Adding Work Order Type",message:e.errorMessage,contextualColorName:"danger"})})}),d()})(); \ No newline at end of file diff --git a/routes/admin.js b/routes/admin.js index 7010e47c..9e05d077 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -7,6 +7,12 @@ import handler_doDeleteFeeCategory from "../handlers/admin-post/doDeleteFeeCateg import handler_doAddFee from "../handlers/admin-post/doAddFee.js"; import handler_doUpdateFee from "../handlers/admin-post/doUpdateFee.js"; import handler_doDeleteFee from "../handlers/admin-post/doDeleteFee.js"; +import handler_tables from "../handlers/admin-get/tables.js"; +import handler_doAddWorkOrderType from "../handlers/admin-post/doAddWorkOrderType.js"; +import handler_doUpdateWorkOrderType from "../handlers/admin-post/doUpdateWorkOrderType.js"; +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"; export const router = Router(); router.get("/fees", permissionHandlers.adminGetHandler, handler_fees); router.post("/doAddFeeCategory", permissionHandlers.adminPostHandler, handler_doAddFeeCategory); @@ -15,4 +21,10 @@ router.post("/doDeleteFeeCategory", permissionHandlers.adminPostHandler, handler router.post("/doAddFee", permissionHandlers.adminPostHandler, handler_doAddFee); router.post("/doUpdateFee", permissionHandlers.adminPostHandler, handler_doUpdateFee); router.post("/doDeleteFee", permissionHandlers.adminPostHandler, handler_doDeleteFee); +router.get("/tables", permissionHandlers.adminGetHandler, handler_tables); +router.post("/doAddWorkOrderType", permissionHandlers.adminPostHandler, handler_doAddWorkOrderType); +router.post("/doUpdateWorkOrderType", permissionHandlers.adminPostHandler, handler_doUpdateWorkOrderType); +router.post("/doMoveWorkOrderTypeUp", permissionHandlers.adminPostHandler, handler_doMoveWorkOrderTypeUp); +router.post("/doMoveWorkOrderTypeDown", permissionHandlers.adminPostHandler, handler_doMoveWorkOrderTypeDown); +router.post("/doDeleteWorkOrderType", permissionHandlers.adminPostHandler, handler_doDeleteWorkOrderType); export default router; diff --git a/routes/admin.ts b/routes/admin.ts index 717dd08b..b1efb461 100644 --- a/routes/admin.ts +++ b/routes/admin.ts @@ -13,6 +13,14 @@ import handler_doAddFee from "../handlers/admin-post/doAddFee.js"; import handler_doUpdateFee from "../handlers/admin-post/doUpdateFee.js"; import handler_doDeleteFee from "../handlers/admin-post/doDeleteFee.js"; +import handler_tables from "../handlers/admin-get/tables.js"; + +import handler_doAddWorkOrderType from "../handlers/admin-post/doAddWorkOrderType.js"; +import handler_doUpdateWorkOrderType from "../handlers/admin-post/doUpdateWorkOrderType.js"; +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"; + export const router = Router(); @@ -47,5 +55,31 @@ router.post("/doDeleteFee", permissionHandlers.adminPostHandler, handler_doDeleteFee); +// Config Tables + +router.get("/tables", + permissionHandlers.adminGetHandler, + handler_tables); + +router.post("/doAddWorkOrderType", + permissionHandlers.adminPostHandler, + handler_doAddWorkOrderType); + +router.post("/doUpdateWorkOrderType", + permissionHandlers.adminPostHandler, + handler_doUpdateWorkOrderType); + +router.post("/doMoveWorkOrderTypeUp", + permissionHandlers.adminPostHandler, + handler_doMoveWorkOrderTypeUp); + +router.post("/doMoveWorkOrderTypeDown", + permissionHandlers.adminPostHandler, + handler_doMoveWorkOrderTypeDown); + +router.post("/doDeleteWorkOrderType", + permissionHandlers.adminPostHandler, + handler_doDeleteWorkOrderType); + export default router; \ No newline at end of file diff --git a/types/recordTypes.d.ts b/types/recordTypes.d.ts index d17b920a..dcf337a4 100644 --- a/types/recordTypes.d.ts +++ b/types/recordTypes.d.ts @@ -185,6 +185,11 @@ export interface LotOccupancy extends Record { lotOccupancyFees?: LotOccupancyFee[]; lotOccupancyTransactions?: LotOccupancyTransaction[]; } +export interface WorkOrderType extends Record { + workOrderTypeId?: number; + workOrderType?: string; + orderNumber?: number; +} export interface User { userName: string; userProperties?: UserProperties; diff --git a/types/recordTypes.ts b/types/recordTypes.ts index 49e3a3e8..3c52c2dd 100644 --- a/types/recordTypes.ts +++ b/types/recordTypes.ts @@ -264,6 +264,18 @@ export interface LotOccupancy extends Record { } +/* + * WORK ORDER TYPES + */ + + +export interface WorkOrderType extends Record { + workOrderTypeId ? : number; + workOrderType ? : string; + orderNumber ? : number; +} + + /* * USER TYPES */ diff --git a/views/admin-tables.ejs b/views/admin-tables.ejs new file mode 100644 index 00000000..35dbeab4 --- /dev/null +++ b/views/admin-tables.ejs @@ -0,0 +1,96 @@ +<%- include('_header'); -%> + + + +

+ Config Table Management +

+ +
+ +
+
+
+

Work Order Types

+ + + + + + + + + + + + + +
Work Order TypeOptions
+
+
+
+ +
+
+ +
+
+
+
+
+ + +
+ +<%- include('_footerA'); -%> + + + + + +<%- include('_footerB'); -%> diff --git a/views/dashboard.ejs b/views/dashboard.ejs index c02827a4..7ccaf9a3 100644 --- a/views/dashboard.ejs +++ b/views/dashboard.ejs @@ -145,6 +145,24 @@ +
+
+
+ +
+
+

+ Config Table Management +

+

+ Manage simple configuration tables fees for + work order types, + <%= configFunctions.getProperty("aliases.lot").toLowerCase() %> statuses, + and <%= configFunctions.getProperty("aliases.lot").toLowerCase() %> <%= configFunctions.getProperty("aliases.occupant").toLowerCase() %> types. +

+
+
+