From 8b798443ed40031da4cb24c0abfebd869ad44e21 Mon Sep 17 00:00:00 2001 From: Dan Gowans Date: Fri, 26 Aug 2022 09:40:23 -0400 Subject: [PATCH] lot status maintenance --- handlers/admin-post/doAddLotStatus.d.ts | 3 + handlers/admin-post/doAddLotStatus.js | 12 + handlers/admin-post/doAddLotStatus.ts | 28 ++ handlers/admin-post/doDeleteLotStatus.d.ts | 3 + handlers/admin-post/doDeleteLotStatus.js | 11 + handlers/admin-post/doDeleteLotStatus.ts | 27 ++ handlers/admin-post/doMoveLotStatusDown.d.ts | 3 + handlers/admin-post/doMoveLotStatusDown.js | 11 + handlers/admin-post/doMoveLotStatusDown.ts | 27 ++ handlers/admin-post/doMoveLotStatusUp.d.ts | 3 + handlers/admin-post/doMoveLotStatusUp.js | 11 + handlers/admin-post/doMoveLotStatusUp.ts | 27 ++ handlers/admin-post/doUpdateLotStatus.d.ts | 3 + handlers/admin-post/doUpdateLotStatus.js | 11 + handlers/admin-post/doUpdateLotStatus.ts | 27 ++ helpers/lotOccupancyDB/addLotStatus.js | 2 +- helpers/lotOccupancyDB/addLotStatus.ts | 2 +- helpers/lotOccupancyDB/deleteLotStatus.d.ts | 3 + helpers/lotOccupancyDB/deleteLotStatus.js | 17 ++ helpers/lotOccupancyDB/deleteLotStatus.ts | 39 +++ helpers/lotOccupancyDB/deleteWorkOrderType.ts | 5 +- helpers/lotOccupancyDB/getLotStatuses.js | 15 +- helpers/lotOccupancyDB/getLotStatuses.ts | 39 ++- helpers/lotOccupancyDB/moveLotStatusDown.d.ts | 2 + helpers/lotOccupancyDB/moveLotStatusDown.js | 26 ++ helpers/lotOccupancyDB/moveLotStatusDown.ts | 44 +++ helpers/lotOccupancyDB/moveLotStatusUp.d.ts | 2 + helpers/lotOccupancyDB/moveLotStatusUp.js | 30 +++ helpers/lotOccupancyDB/moveLotStatusUp.ts | 49 ++++ helpers/lotOccupancyDB/updateLotStatus.d.ts | 7 + helpers/lotOccupancyDB/updateLotStatus.js | 19 ++ helpers/lotOccupancyDB/updateLotStatus.ts | 47 ++++ helpers/lotOccupancyDB/updateWorkOrderType.ts | 5 +- public-typescript/adminTables.js | 176 +++++++++++- public-typescript/adminTables.ts | 252 +++++++++++++++++- public/javascripts/adminTables.min.js | 2 +- routes/admin.js | 10 + routes/admin.ts | 31 +++ types/globalTypes.js | 3 +- types/recordTypes.js | 3 +- views/admin-tables.ejs | 27 ++ views/lotOccupancy-view.ejs | 1 - 42 files changed, 1040 insertions(+), 25 deletions(-) create mode 100644 handlers/admin-post/doAddLotStatus.d.ts create mode 100644 handlers/admin-post/doAddLotStatus.js create mode 100644 handlers/admin-post/doAddLotStatus.ts create mode 100644 handlers/admin-post/doDeleteLotStatus.d.ts create mode 100644 handlers/admin-post/doDeleteLotStatus.js create mode 100644 handlers/admin-post/doDeleteLotStatus.ts create mode 100644 handlers/admin-post/doMoveLotStatusDown.d.ts create mode 100644 handlers/admin-post/doMoveLotStatusDown.js create mode 100644 handlers/admin-post/doMoveLotStatusDown.ts create mode 100644 handlers/admin-post/doMoveLotStatusUp.d.ts create mode 100644 handlers/admin-post/doMoveLotStatusUp.js create mode 100644 handlers/admin-post/doMoveLotStatusUp.ts create mode 100644 handlers/admin-post/doUpdateLotStatus.d.ts create mode 100644 handlers/admin-post/doUpdateLotStatus.js create mode 100644 handlers/admin-post/doUpdateLotStatus.ts create mode 100644 helpers/lotOccupancyDB/deleteLotStatus.d.ts create mode 100644 helpers/lotOccupancyDB/deleteLotStatus.js create mode 100644 helpers/lotOccupancyDB/deleteLotStatus.ts create mode 100644 helpers/lotOccupancyDB/moveLotStatusDown.d.ts create mode 100644 helpers/lotOccupancyDB/moveLotStatusDown.js create mode 100644 helpers/lotOccupancyDB/moveLotStatusDown.ts create mode 100644 helpers/lotOccupancyDB/moveLotStatusUp.d.ts create mode 100644 helpers/lotOccupancyDB/moveLotStatusUp.js create mode 100644 helpers/lotOccupancyDB/moveLotStatusUp.ts create mode 100644 helpers/lotOccupancyDB/updateLotStatus.d.ts create mode 100644 helpers/lotOccupancyDB/updateLotStatus.js create mode 100644 helpers/lotOccupancyDB/updateLotStatus.ts diff --git a/handlers/admin-post/doAddLotStatus.d.ts b/handlers/admin-post/doAddLotStatus.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/admin-post/doAddLotStatus.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/doAddLotStatus.js b/handlers/admin-post/doAddLotStatus.js new file mode 100644 index 00000000..d508d38f --- /dev/null +++ b/handlers/admin-post/doAddLotStatus.js @@ -0,0 +1,12 @@ +import { addLotStatus } from "../../helpers/lotOccupancyDB/addLotStatus.js"; +import { getLotStatuses } from "../../helpers/functions.cache.js"; +export const handler = async (request, response) => { + const lotStatusId = addLotStatus(request.body, request.session); + const lotStatuses = getLotStatuses(); + response.json({ + success: true, + lotStatusId, + lotStatuses + }); +}; +export default handler; diff --git a/handlers/admin-post/doAddLotStatus.ts b/handlers/admin-post/doAddLotStatus.ts new file mode 100644 index 00000000..29a3d042 --- /dev/null +++ b/handlers/admin-post/doAddLotStatus.ts @@ -0,0 +1,28 @@ +import type { + RequestHandler +} from "express"; + +import { + addLotStatus +} from "../../helpers/lotOccupancyDB/addLotStatus.js"; + +import { + getLotStatuses +} from "../../helpers/functions.cache.js"; + + +export const handler: RequestHandler = async (request, response) => { + + const lotStatusId = addLotStatus(request.body, request.session); + + const lotStatuses = getLotStatuses(); + + response.json({ + success: true, + lotStatusId, + lotStatuses + }); +}; + + +export default handler; \ No newline at end of file diff --git a/handlers/admin-post/doDeleteLotStatus.d.ts b/handlers/admin-post/doDeleteLotStatus.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/admin-post/doDeleteLotStatus.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/doDeleteLotStatus.js b/handlers/admin-post/doDeleteLotStatus.js new file mode 100644 index 00000000..6704c67f --- /dev/null +++ b/handlers/admin-post/doDeleteLotStatus.js @@ -0,0 +1,11 @@ +import { deleteLotStatus } from "../../helpers/lotOccupancyDB/deleteLotStatus.js"; +import { getLotStatuses } from "../../helpers/functions.cache.js"; +export const handler = async (request, response) => { + const success = deleteLotStatus(request.body.lotStatusId, request.session); + const lotStatuses = getLotStatuses(); + response.json({ + success, + lotStatuses + }); +}; +export default handler; diff --git a/handlers/admin-post/doDeleteLotStatus.ts b/handlers/admin-post/doDeleteLotStatus.ts new file mode 100644 index 00000000..ddd55799 --- /dev/null +++ b/handlers/admin-post/doDeleteLotStatus.ts @@ -0,0 +1,27 @@ +import type { + RequestHandler +} from "express"; + +import { + deleteLotStatus +} from "../../helpers/lotOccupancyDB/deleteLotStatus.js"; + +import { + getLotStatuses +} from "../../helpers/functions.cache.js"; + + +export const handler: RequestHandler = async (request, response) => { + + const success = deleteLotStatus(request.body.lotStatusId, request.session); + + const lotStatuses = getLotStatuses(); + + response.json({ + success, + lotStatuses + }); +}; + + +export default handler; \ No newline at end of file diff --git a/handlers/admin-post/doMoveLotStatusDown.d.ts b/handlers/admin-post/doMoveLotStatusDown.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/admin-post/doMoveLotStatusDown.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/doMoveLotStatusDown.js b/handlers/admin-post/doMoveLotStatusDown.js new file mode 100644 index 00000000..17bffe1b --- /dev/null +++ b/handlers/admin-post/doMoveLotStatusDown.js @@ -0,0 +1,11 @@ +import { moveLotStatusDown } from "../../helpers/lotOccupancyDB/moveLotStatusDown.js"; +import { getLotStatuses } from "../../helpers/functions.cache.js"; +export const handler = async (request, response) => { + const success = moveLotStatusDown(request.body.lotStatusId); + const lotStatuses = getLotStatuses(); + response.json({ + success, + lotStatuses + }); +}; +export default handler; diff --git a/handlers/admin-post/doMoveLotStatusDown.ts b/handlers/admin-post/doMoveLotStatusDown.ts new file mode 100644 index 00000000..19219a0d --- /dev/null +++ b/handlers/admin-post/doMoveLotStatusDown.ts @@ -0,0 +1,27 @@ +import type { + RequestHandler +} from "express"; + +import { + moveLotStatusDown +} from "../../helpers/lotOccupancyDB/moveLotStatusDown.js"; + +import { + getLotStatuses +} from "../../helpers/functions.cache.js"; + + +export const handler: RequestHandler = async (request, response) => { + + const success = moveLotStatusDown(request.body.lotStatusId); + + const lotStatuses = getLotStatuses(); + + response.json({ + success, + lotStatuses + }); +}; + + +export default handler; \ No newline at end of file diff --git a/handlers/admin-post/doMoveLotStatusUp.d.ts b/handlers/admin-post/doMoveLotStatusUp.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/admin-post/doMoveLotStatusUp.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/doMoveLotStatusUp.js b/handlers/admin-post/doMoveLotStatusUp.js new file mode 100644 index 00000000..4ba3d37e --- /dev/null +++ b/handlers/admin-post/doMoveLotStatusUp.js @@ -0,0 +1,11 @@ +import { moveLotStatusUp } from "../../helpers/lotOccupancyDB/moveLotStatusUp.js"; +import { getLotStatuses } from "../../helpers/functions.cache.js"; +export const handler = async (request, response) => { + const success = moveLotStatusUp(request.body.lotStatusId); + const lotStatuses = getLotStatuses(); + response.json({ + success, + lotStatuses + }); +}; +export default handler; diff --git a/handlers/admin-post/doMoveLotStatusUp.ts b/handlers/admin-post/doMoveLotStatusUp.ts new file mode 100644 index 00000000..3a28f84a --- /dev/null +++ b/handlers/admin-post/doMoveLotStatusUp.ts @@ -0,0 +1,27 @@ +import type { + RequestHandler +} from "express"; + +import { + moveLotStatusUp +} from "../../helpers/lotOccupancyDB/moveLotStatusUp.js"; + +import { + getLotStatuses +} from "../../helpers/functions.cache.js"; + + +export const handler: RequestHandler = async (request, response) => { + + const success = moveLotStatusUp(request.body.lotStatusId); + + const lotStatuses = getLotStatuses(); + + response.json({ + success, + lotStatuses + }); +}; + + +export default handler; \ No newline at end of file diff --git a/handlers/admin-post/doUpdateLotStatus.d.ts b/handlers/admin-post/doUpdateLotStatus.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/admin-post/doUpdateLotStatus.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/doUpdateLotStatus.js b/handlers/admin-post/doUpdateLotStatus.js new file mode 100644 index 00000000..7ddfbb03 --- /dev/null +++ b/handlers/admin-post/doUpdateLotStatus.js @@ -0,0 +1,11 @@ +import { updateLotStatus } from "../../helpers/lotOccupancyDB/updateLotStatus.js"; +import { getLotStatuses } from "../../helpers/functions.cache.js"; +export const handler = async (request, response) => { + const success = updateLotStatus(request.body, request.session); + const lotStatuses = getLotStatuses(); + response.json({ + success, + lotStatuses + }); +}; +export default handler; diff --git a/handlers/admin-post/doUpdateLotStatus.ts b/handlers/admin-post/doUpdateLotStatus.ts new file mode 100644 index 00000000..c4046989 --- /dev/null +++ b/handlers/admin-post/doUpdateLotStatus.ts @@ -0,0 +1,27 @@ +import type { + RequestHandler +} from "express"; + +import { + updateLotStatus +} from "../../helpers/lotOccupancyDB/updateLotStatus.js"; + +import { + getLotStatuses +} from "../../helpers/functions.cache.js"; + + +export const handler: RequestHandler = async (request, response) => { + + const success = updateLotStatus(request.body, request.session); + + const lotStatuses = getLotStatuses(); + + response.json({ + success, + lotStatuses + }); +}; + + +export default handler; \ No newline at end of file diff --git a/helpers/lotOccupancyDB/addLotStatus.js b/helpers/lotOccupancyDB/addLotStatus.js index 9cf48ba4..e99f15c9 100644 --- a/helpers/lotOccupancyDB/addLotStatus.js +++ b/helpers/lotOccupancyDB/addLotStatus.js @@ -10,7 +10,7 @@ export const addLotStatus = (lotStatusForm, requestSession) => { " recordCreate_userName, recordCreate_timeMillis," + " recordUpdate_userName, recordUpdate_timeMillis)" + " values (?, ?, ?, ?, ?, ?)") - .run(lotStatusForm.lotStatus, (lotStatusForm.orderNumber || 0), requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis); + .run(lotStatusForm.lotStatus, (lotStatusForm.orderNumber || -1), requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis); database.close(); clearLotStatusesCache(); return result.lastInsertRowid; diff --git a/helpers/lotOccupancyDB/addLotStatus.ts b/helpers/lotOccupancyDB/addLotStatus.ts index 8b8e14d7..33b5d2f4 100644 --- a/helpers/lotOccupancyDB/addLotStatus.ts +++ b/helpers/lotOccupancyDB/addLotStatus.ts @@ -28,7 +28,7 @@ export const addLotStatus = " recordUpdate_userName, recordUpdate_timeMillis)" + " values (?, ?, ?, ?, ?, ?)") .run(lotStatusForm.lotStatus, - (lotStatusForm.orderNumber || 0), + (lotStatusForm.orderNumber || -1), requestSession.user.userName, rightNowMillis, requestSession.user.userName, diff --git a/helpers/lotOccupancyDB/deleteLotStatus.d.ts b/helpers/lotOccupancyDB/deleteLotStatus.d.ts new file mode 100644 index 00000000..75d14acb --- /dev/null +++ b/helpers/lotOccupancyDB/deleteLotStatus.d.ts @@ -0,0 +1,3 @@ +import type * as recordTypes from "../../types/recordTypes"; +export declare const deleteLotStatus: (lotStatusId: number | string, requestSession: recordTypes.PartialSession) => boolean; +export default deleteLotStatus; diff --git a/helpers/lotOccupancyDB/deleteLotStatus.js b/helpers/lotOccupancyDB/deleteLotStatus.js new file mode 100644 index 00000000..b9bf874f --- /dev/null +++ b/helpers/lotOccupancyDB/deleteLotStatus.js @@ -0,0 +1,17 @@ +import sqlite from "better-sqlite3"; +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { clearLotStatusesCache } from "../functions.cache.js"; +export const deleteLotStatus = (lotStatusId, requestSession) => { + const database = sqlite(databasePath); + const rightNowMillis = Date.now(); + const result = database + .prepare("update LotStatuses" + + " set recordDelete_userName = ?," + + " recordDelete_timeMillis = ?" + + " where lotStatusId = ?") + .run(requestSession.user.userName, rightNowMillis, lotStatusId); + database.close(); + clearLotStatusesCache(); + return (result.changes > 0); +}; +export default deleteLotStatus; diff --git a/helpers/lotOccupancyDB/deleteLotStatus.ts b/helpers/lotOccupancyDB/deleteLotStatus.ts new file mode 100644 index 00000000..88b958cc --- /dev/null +++ b/helpers/lotOccupancyDB/deleteLotStatus.ts @@ -0,0 +1,39 @@ +import sqlite from "better-sqlite3"; + +import { + lotOccupancyDB as databasePath +} from "../../data/databasePaths.js"; + +import { + clearLotStatusesCache +} from "../functions.cache.js"; + +import type * as recordTypes from "../../types/recordTypes"; + + +export const deleteLotStatus = + (lotStatusId: number | string, + requestSession: recordTypes.PartialSession): boolean => { + + const database = sqlite(databasePath); + + const rightNowMillis = Date.now(); + + const result = database + .prepare("update LotStatuses" + + " set recordDelete_userName = ?," + + " recordDelete_timeMillis = ?" + + " where lotStatusId = ?") + .run(requestSession.user.userName, + rightNowMillis, + lotStatusId); + + database.close(); + + clearLotStatusesCache(); + + return (result.changes > 0); + }; + + +export default deleteLotStatus; \ No newline at end of file diff --git a/helpers/lotOccupancyDB/deleteWorkOrderType.ts b/helpers/lotOccupancyDB/deleteWorkOrderType.ts index 8c9ef8d9..110867c1 100644 --- a/helpers/lotOccupancyDB/deleteWorkOrderType.ts +++ b/helpers/lotOccupancyDB/deleteWorkOrderType.ts @@ -4,8 +4,11 @@ import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { + clearWorkOrderTypesCache +} from "../functions.cache.js"; + import type * as recordTypes from "../../types/recordTypes"; -import { clearWorkOrderTypesCache } from "../functions.cache.js"; export const deleteWorkOrderType = diff --git a/helpers/lotOccupancyDB/getLotStatuses.js b/helpers/lotOccupancyDB/getLotStatuses.js index 1dd7b641..116ec381 100644 --- a/helpers/lotOccupancyDB/getLotStatuses.js +++ b/helpers/lotOccupancyDB/getLotStatuses.js @@ -1,15 +1,24 @@ import sqlite from "better-sqlite3"; import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; export const getLotStatuses = () => { - const database = sqlite(databasePath, { - readonly: true - }); + const database = sqlite(databasePath); const lotStatuses = database .prepare("select lotStatusId, lotStatus" + " from LotStatuses" + " where recordDelete_timeMillis is null" + " order by orderNumber, lotStatus") .all(); + let expectedOrderNumber = 0; + for (const lotStatus of lotStatuses) { + if (lotStatus.orderNumber !== expectedOrderNumber) { + database.prepare("update LotStatuses" + + " set orderNumber = ?" + + " where lotStatusId = ?") + .run(expectedOrderNumber, lotStatus.lotStatusId); + lotStatus.orderNumber = expectedOrderNumber; + } + expectedOrderNumber += 1; + } database.close(); return lotStatuses; }; diff --git a/helpers/lotOccupancyDB/getLotStatuses.ts b/helpers/lotOccupancyDB/getLotStatuses.ts index e97c3dac..46b7ca80 100644 --- a/helpers/lotOccupancyDB/getLotStatuses.ts +++ b/helpers/lotOccupancyDB/getLotStatuses.ts @@ -1,26 +1,45 @@ import sqlite from "better-sqlite3"; -import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; + +import { + lotOccupancyDB as databasePath +} from "../../data/databasePaths.js"; import type * as recordTypes from "../../types/recordTypes"; export const getLotStatuses = (): recordTypes.LotStatus[] => { - const database = sqlite(databasePath, { - readonly: true - }); + const database = sqlite(databasePath); const lotStatuses: recordTypes.LotStatus[] = database - .prepare("select lotStatusId, lotStatus" + - " from LotStatuses" + - " where recordDelete_timeMillis is null" + - " order by orderNumber, lotStatus") - .all(); + .prepare("select lotStatusId, lotStatus" + + " from LotStatuses" + + " where recordDelete_timeMillis is null" + + " order by orderNumber, lotStatus") + .all(); + + let expectedOrderNumber = 0; + + for (const lotStatus of lotStatuses) { + + if (lotStatus.orderNumber !== expectedOrderNumber) { + + database.prepare("update LotStatuses" + + " set orderNumber = ?" + + " where lotStatusId = ?") + .run(expectedOrderNumber, + lotStatus.lotStatusId); + + lotStatus.orderNumber = expectedOrderNumber; + } + + expectedOrderNumber += 1; + } database.close(); return lotStatuses; - }; +}; export default getLotStatuses; \ No newline at end of file diff --git a/helpers/lotOccupancyDB/moveLotStatusDown.d.ts b/helpers/lotOccupancyDB/moveLotStatusDown.d.ts new file mode 100644 index 00000000..0a6e5dde --- /dev/null +++ b/helpers/lotOccupancyDB/moveLotStatusDown.d.ts @@ -0,0 +1,2 @@ +export declare const moveLotStatusDown: (lotStatusId: number | string) => boolean; +export default moveLotStatusDown; diff --git a/helpers/lotOccupancyDB/moveLotStatusDown.js b/helpers/lotOccupancyDB/moveLotStatusDown.js new file mode 100644 index 00000000..4f14baa6 --- /dev/null +++ b/helpers/lotOccupancyDB/moveLotStatusDown.js @@ -0,0 +1,26 @@ +import sqlite from "better-sqlite3"; +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { clearLotStatusesCache } from "../functions.cache.js"; +export const moveLotStatusDown = (lotStatusId) => { + const database = sqlite(databasePath); + const currentOrderNumber = database.prepare("select orderNumber" + + " from LotStatuses" + + " where lotStatusId = ?") + .get(lotStatusId) + .orderNumber; + database + .prepare("update LotStatuses" + + " set orderNumber = orderNumber - 1" + + " where recordDelete_timeMillis is null" + + " and orderNumber = ? + 1") + .run(currentOrderNumber); + const result = database + .prepare("update LotStatuses" + + " set orderNumber = ? + 1" + + " where lotStatusId = ?") + .run(currentOrderNumber, lotStatusId); + database.close(); + clearLotStatusesCache(); + return result.changes > 0; +}; +export default moveLotStatusDown; diff --git a/helpers/lotOccupancyDB/moveLotStatusDown.ts b/helpers/lotOccupancyDB/moveLotStatusDown.ts new file mode 100644 index 00000000..730108e0 --- /dev/null +++ b/helpers/lotOccupancyDB/moveLotStatusDown.ts @@ -0,0 +1,44 @@ +import sqlite from "better-sqlite3"; + +import { + lotOccupancyDB as databasePath +} from "../../data/databasePaths.js"; + +import { + clearLotStatusesCache +} from "../functions.cache.js"; + + +export const moveLotStatusDown = + (lotStatusId: number | string): boolean => { + + const database = sqlite(databasePath); + + const currentOrderNumber: number = database.prepare("select orderNumber" + + " from LotStatuses" + + " where lotStatusId = ?") + .get(lotStatusId) + .orderNumber; + + database + .prepare("update LotStatuses" + + " set orderNumber = orderNumber - 1" + + " where recordDelete_timeMillis is null" + + " and orderNumber = ? + 1") + .run(currentOrderNumber); + + const result = database + .prepare("update LotStatuses" + + " set orderNumber = ? + 1" + + " where lotStatusId = ?") + .run(currentOrderNumber, lotStatusId); + + database.close(); + + clearLotStatusesCache(); + + return result.changes > 0; + }; + + +export default moveLotStatusDown; \ No newline at end of file diff --git a/helpers/lotOccupancyDB/moveLotStatusUp.d.ts b/helpers/lotOccupancyDB/moveLotStatusUp.d.ts new file mode 100644 index 00000000..090b829e --- /dev/null +++ b/helpers/lotOccupancyDB/moveLotStatusUp.d.ts @@ -0,0 +1,2 @@ +export declare const moveLotStatusUp: (lotStatusId: number | string) => boolean; +export default moveLotStatusUp; diff --git a/helpers/lotOccupancyDB/moveLotStatusUp.js b/helpers/lotOccupancyDB/moveLotStatusUp.js new file mode 100644 index 00000000..ab83bca0 --- /dev/null +++ b/helpers/lotOccupancyDB/moveLotStatusUp.js @@ -0,0 +1,30 @@ +import sqlite from "better-sqlite3"; +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { clearLotStatusesCache } from "../functions.cache.js"; +export const moveLotStatusUp = (lotStatusId) => { + const database = sqlite(databasePath); + const currentOrderNumber = database.prepare("select orderNumber" + + " from LotStatuses" + + " where lotStatusId = ?") + .get(lotStatusId) + .orderNumber; + if (currentOrderNumber <= 0) { + database.close(); + return true; + } + database + .prepare("update LotStatuses" + + " set orderNumber = orderNumber + 1" + + " where recordDelete_timeMillis is null" + + " and orderNumber = ? - 1") + .run(currentOrderNumber); + const result = database + .prepare("update LotStatuses" + + " set orderNumber = ? - 1" + + " where lotStatusId = ?") + .run(currentOrderNumber, lotStatusId); + database.close(); + clearLotStatusesCache(); + return result.changes > 0; +}; +export default moveLotStatusUp; diff --git a/helpers/lotOccupancyDB/moveLotStatusUp.ts b/helpers/lotOccupancyDB/moveLotStatusUp.ts new file mode 100644 index 00000000..988ca9f6 --- /dev/null +++ b/helpers/lotOccupancyDB/moveLotStatusUp.ts @@ -0,0 +1,49 @@ +import sqlite from "better-sqlite3"; + +import { + lotOccupancyDB as databasePath +} from "../../data/databasePaths.js"; + +import { + clearLotStatusesCache +} from "../functions.cache.js"; + + +export const moveLotStatusUp = + (lotStatusId: number | string): boolean => { + + const database = sqlite(databasePath); + + const currentOrderNumber: number = database.prepare("select orderNumber" + + " from LotStatuses" + + " where lotStatusId = ?") + .get(lotStatusId) + .orderNumber; + + if (currentOrderNumber <= 0) { + database.close(); + return true; + } + + database + .prepare("update LotStatuses" + + " set orderNumber = orderNumber + 1" + + " where recordDelete_timeMillis is null" + + " and orderNumber = ? - 1") + .run(currentOrderNumber); + + const result = database + .prepare("update LotStatuses" + + " set orderNumber = ? - 1" + + " where lotStatusId = ?") + .run(currentOrderNumber, lotStatusId); + + database.close(); + + clearLotStatusesCache(); + + return result.changes > 0; + }; + + +export default moveLotStatusUp; \ No newline at end of file diff --git a/helpers/lotOccupancyDB/updateLotStatus.d.ts b/helpers/lotOccupancyDB/updateLotStatus.d.ts new file mode 100644 index 00000000..671a77bd --- /dev/null +++ b/helpers/lotOccupancyDB/updateLotStatus.d.ts @@ -0,0 +1,7 @@ +import type * as recordTypes from "../../types/recordTypes"; +interface UpdateLotStatusForm { + lotStatusId: number | string; + lotStatus: string; +} +export declare const updateLotStatus: (lotStatusForm: UpdateLotStatusForm, requestSession: recordTypes.PartialSession) => boolean; +export default updateLotStatus; diff --git a/helpers/lotOccupancyDB/updateLotStatus.js b/helpers/lotOccupancyDB/updateLotStatus.js new file mode 100644 index 00000000..15b9f948 --- /dev/null +++ b/helpers/lotOccupancyDB/updateLotStatus.js @@ -0,0 +1,19 @@ +import sqlite from "better-sqlite3"; +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { clearLotStatusesCache } from "../functions.cache.js"; +export const updateLotStatus = (lotStatusForm, requestSession) => { + const database = sqlite(databasePath); + const rightNowMillis = Date.now(); + const result = database + .prepare("update LotStatuses" + + " set lotStatus = ?," + + " recordUpdate_userName = ?," + + " recordUpdate_timeMillis = ?" + + " where lotStatusId = ?" + + " and recordDelete_timeMillis is null") + .run(lotStatusForm.lotStatus, requestSession.user.userName, rightNowMillis, lotStatusForm.lotStatusId); + database.close(); + clearLotStatusesCache(); + return result.changes > 0; +}; +export default updateLotStatus; diff --git a/helpers/lotOccupancyDB/updateLotStatus.ts b/helpers/lotOccupancyDB/updateLotStatus.ts new file mode 100644 index 00000000..8e5d3ac8 --- /dev/null +++ b/helpers/lotOccupancyDB/updateLotStatus.ts @@ -0,0 +1,47 @@ +import sqlite from "better-sqlite3"; + +import { + lotOccupancyDB as databasePath +} from "../../data/databasePaths.js"; + +import { + clearLotStatusesCache +} from "../functions.cache.js"; + +import type * as recordTypes from "../../types/recordTypes"; + + +interface UpdateLotStatusForm { + lotStatusId: number | string; + lotStatus: string; +} + + +export const updateLotStatus = + (lotStatusForm: UpdateLotStatusForm, requestSession: recordTypes.PartialSession): boolean => { + + const database = sqlite(databasePath); + + const rightNowMillis = Date.now(); + + const result = database + .prepare("update LotStatuses" + + " set lotStatus = ?," + + " recordUpdate_userName = ?," + + " recordUpdate_timeMillis = ?" + + " where lotStatusId = ?" + + " and recordDelete_timeMillis is null") + .run(lotStatusForm.lotStatus, + requestSession.user.userName, + rightNowMillis, + lotStatusForm.lotStatusId); + + database.close(); + + clearLotStatusesCache(); + + return result.changes > 0; + }; + + +export default updateLotStatus; \ No newline at end of file diff --git a/helpers/lotOccupancyDB/updateWorkOrderType.ts b/helpers/lotOccupancyDB/updateWorkOrderType.ts index 9b42d121..40902e26 100644 --- a/helpers/lotOccupancyDB/updateWorkOrderType.ts +++ b/helpers/lotOccupancyDB/updateWorkOrderType.ts @@ -4,8 +4,11 @@ import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { + clearWorkOrderTypesCache +} from "../functions.cache.js"; + import type * as recordTypes from "../../types/recordTypes"; -import { clearWorkOrderTypesCache } from "../functions.cache.js"; interface UpdateWorkOrderTypeForm { diff --git a/public-typescript/adminTables.js b/public-typescript/adminTables.js index daf80e10..9195505e 100644 --- a/public-typescript/adminTables.js +++ b/public-typescript/adminTables.js @@ -1,7 +1,6 @@ "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; @@ -178,4 +177,179 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); }); renderWorkOrderTypes(); + let lotStatuses = exports.lotStatuses; + delete exports.lotStatuses; + const updateLotStatus = (submitEvent) => { + submitEvent.preventDefault(); + cityssm.postJSON(urlPrefix + "/admin/doUpdateLotStatus", submitEvent.currentTarget, (responseJSON) => { + if (responseJSON.success) { + lotStatuses = responseJSON.lotStatuses; + bulmaJS.alert({ + message: exports.aliases.lot + " Status Updated Successfully", + contextualColorName: "success" + }); + } + else { + bulmaJS.alert({ + title: "Error Updating " + exports.aliases.lot + " Status", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + const deleteLotStatus = (clickEvent) => { + const tableRowElement = clickEvent.currentTarget.closest("tr"); + const lotStatusId = tableRowElement.dataset.lotStatusId; + const doDelete = () => { + cityssm.postJSON(urlPrefix + "/admin/doDeleteLotStatus", { + lotStatusId + }, (responseJSON) => { + if (responseJSON.success) { + lotStatuses = responseJSON.lotStatuses; + if (lotStatuses.length === 0) { + renderLotStatuses(); + } + else { + tableRowElement.remove(); + } + bulmaJS.alert({ + message: exports.aliases.lot + " Status Deleted Successfully", + contextualColorName: "success" + }); + } + else { + bulmaJS.alert({ + title: "Error Deleting " + exports.aliases.lot + " Status", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + 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: true, + contextualColorName: "warning", + okButton: { + text: "Yes, Delete Status", + callbackFunction: doDelete + } + }); + }; + const moveLotStatusUp = (clickEvent) => { + const tableRowElement = clickEvent.currentTarget.closest("tr"); + const lotStatusId = tableRowElement.dataset.lotStatusId; + cityssm.postJSON(urlPrefix + "/admin/doMoveLotStatusUp", { + lotStatusId + }, (responseJSON) => { + if (responseJSON.success) { + lotStatuses = responseJSON.lotStatuses; + renderLotStatuses(); + } + else { + bulmaJS.alert({ + title: "Error Moving " + exports.aliases.lot + " Status", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + const moveLotStatusDown = (clickEvent) => { + const tableRowElement = clickEvent.currentTarget.closest("tr"); + const lotStatusId = tableRowElement.dataset.lotStatusId; + cityssm.postJSON(urlPrefix + "/admin/doMoveLotStatusDown", { + lotStatusId + }, (responseJSON) => { + if (responseJSON.success) { + lotStatuses = responseJSON.lotStatuses; + renderLotStatuses(); + } + else { + bulmaJS.alert({ + title: "Error Moving " + exports.aliases.lot + " Status", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + const renderLotStatuses = () => { + const containerElement = document.querySelector("#container--lotStatuses"); + if (workOrderTypes.length === 0) { + containerElement.innerHTML = "" + + "" + + "
" + + "

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

" + + "
" + + "" + + ""; + return; + } + containerElement.innerHTML = ""; + for (const lotStatus of lotStatuses) { + const tableRowElement = document.createElement("tr"); + tableRowElement.dataset.lotStatusId = lotStatus.lotStatusId.toString(); + tableRowElement.innerHTML = "" + + "
" + + "" + + ("
" + + "
" + + "" + + "
" + + "
" + + "" + + "
" + + "
") + + "
" + + "" + + "" + + "
" + + "
" + + ("
" + + "
" + + "" + + "
" + + "
" + + "" + + "
" + + "
") + + "
" + + "
" + + "" + + "
" + + "
" + + ""; + tableRowElement.querySelector("form").addEventListener("submit", updateLotStatus); + tableRowElement.querySelector(".button--moveLotStatusUp").addEventListener("click", moveLotStatusUp); + tableRowElement.querySelector(".button--moveLotStatusDown").addEventListener("click", moveLotStatusDown); + tableRowElement.querySelector(".button--deleteLotStatus").addEventListener("click", deleteLotStatus); + containerElement.append(tableRowElement); + } + }; + document.querySelector("#form--addLotStatus").addEventListener("submit", (submitEvent) => { + submitEvent.preventDefault(); + const formElement = submitEvent.currentTarget; + cityssm.postJSON(urlPrefix + "/admin/doAddLotStatus", formElement, (responseJSON) => { + if (responseJSON.success) { + lotStatuses = responseJSON.lotStatuses; + renderLotStatuses(); + formElement.reset(); + formElement.querySelector("input").focus(); + } + else { + bulmaJS.alert({ + title: "Error Adding " + exports.aliases.lot + " Status", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }); + renderLotStatuses(); })(); diff --git a/public-typescript/adminTables.ts b/public-typescript/adminTables.ts index e75db949..1f20b37a 100644 --- a/public-typescript/adminTables.ts +++ b/public-typescript/adminTables.ts @@ -1,6 +1,5 @@ /* eslint-disable unicorn/prefer-module */ -import type * as globalTypes from "../types/globalTypes"; import type * as recordTypes from "../types/recordTypes"; import type { @@ -16,8 +15,6 @@ declare const bulmaJS: BulmaJS; (() => { - const los = (exports.los as globalTypes.LOS); - const urlPrefix = document.querySelector("main").dataset.urlPrefix; /* @@ -270,4 +267,253 @@ declare const bulmaJS: BulmaJS; renderWorkOrderTypes(); + /* + * Lot Statuses + */ + + let lotStatuses: recordTypes.LotStatus[] = exports.lotStatuses; + delete exports.lotStatuses; + + const updateLotStatus = (submitEvent: SubmitEvent) => { + + submitEvent.preventDefault(); + + cityssm.postJSON(urlPrefix + "/admin/doUpdateLotStatus", + submitEvent.currentTarget, + (responseJSON: { + success: boolean; + errorMessage ? : string; + lotStatuses ? : recordTypes.LotStatus[]; + }) => { + if (responseJSON.success) { + + lotStatuses = responseJSON.lotStatuses; + + bulmaJS.alert({ + message: exports.aliases.lot + " Status Updated Successfully", + contextualColorName: "success" + }); + + } else { + bulmaJS.alert({ + title: "Error Updating " + exports.aliases.lot + " Status", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + + const deleteLotStatus = (clickEvent: Event) => { + + const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest("tr"); + + const lotStatusId = tableRowElement.dataset.lotStatusId; + + const doDelete = () => { + + cityssm.postJSON(urlPrefix + "/admin/doDeleteLotStatus", { + lotStatusId + }, + (responseJSON: { + success: boolean; + errorMessage ? : string; + lotStatuses ? : recordTypes.LotStatus[]; + }) => { + + if (responseJSON.success) { + + lotStatuses = responseJSON.lotStatuses; + + if (lotStatuses.length === 0) { + renderLotStatuses(); + } else { + tableRowElement.remove(); + } + + bulmaJS.alert({ + message: exports.aliases.lot + " Status Deleted Successfully", + contextualColorName: "success" + }); + + } else { + bulmaJS.alert({ + title: "Error Deleting " + exports.aliases.lot + " Status", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + + 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: true, + contextualColorName: "warning", + okButton: { + text: "Yes, Delete Status", + callbackFunction: doDelete + } + }); + }; + + const moveLotStatusUp = (clickEvent: Event) => { + + const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest("tr"); + + const lotStatusId = tableRowElement.dataset.lotStatusId; + + cityssm.postJSON(urlPrefix + "/admin/doMoveLotStatusUp", { + lotStatusId + }, + (responseJSON: { + success: boolean; + errorMessage ? : string; + lotStatuses ? : recordTypes.LotStatus[]; + }) => { + + if (responseJSON.success) { + + lotStatuses = responseJSON.lotStatuses; + renderLotStatuses(); + + } else { + bulmaJS.alert({ + title: "Error Moving " + exports.aliases.lot + " Status", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + + const moveLotStatusDown = (clickEvent: Event) => { + + const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest("tr"); + + const lotStatusId = tableRowElement.dataset.lotStatusId; + + cityssm.postJSON(urlPrefix + "/admin/doMoveLotStatusDown", { + lotStatusId + }, + (responseJSON: { + success: boolean; + errorMessage ? : string; + lotStatuses ? : recordTypes.LotStatus[]; + }) => { + + if (responseJSON.success) { + + lotStatuses = responseJSON.lotStatuses; + renderLotStatuses(); + + } else { + bulmaJS.alert({ + title: "Error Moving " + exports.aliases.lot + " Status", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + + const renderLotStatuses = () => { + + const containerElement = document.querySelector("#container--lotStatuses") as HTMLTableSectionElement; + + if (workOrderTypes.length === 0) { + containerElement.innerHTML = "" + + "" + + "
" + + "

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

" + + "
" + + "" + + ""; + + return; + } + + containerElement.innerHTML = ""; + + for (const lotStatus of lotStatuses) { + + const tableRowElement = document.createElement("tr"); + + tableRowElement.dataset.lotStatusId = lotStatus.lotStatusId.toString(); + + tableRowElement.innerHTML = "" + + "
" + + "" + + ("
" + + "
" + + "" + + "
" + + "
" + + "" + + "
" + + "
") + + "
" + + "" + + "" + + "
" + + "
" + + ("
" + + "
" + + "" + + "
" + + "
" + + "" + + "
" + + "
") + + "
" + + "
" + + "" + + "
" + + "
" + + ""; + + tableRowElement.querySelector("form").addEventListener("submit", updateLotStatus); + tableRowElement.querySelector(".button--moveLotStatusUp").addEventListener("click", moveLotStatusUp); + tableRowElement.querySelector(".button--moveLotStatusDown").addEventListener("click", moveLotStatusDown); + tableRowElement.querySelector(".button--deleteLotStatus").addEventListener("click", deleteLotStatus); + + containerElement.append(tableRowElement); + } + + }; + + document.querySelector("#form--addLotStatus").addEventListener("submit", (submitEvent: SubmitEvent) => { + + submitEvent.preventDefault(); + + const formElement = submitEvent.currentTarget as HTMLFormElement; + + cityssm.postJSON(urlPrefix + "/admin/doAddLotStatus", + formElement, + (responseJSON: { + success: boolean; + errorMessage ? : string; + lotStatuses ? : recordTypes.LotStatus[]; + }) => { + + if (responseJSON.success) { + lotStatuses = responseJSON.lotStatuses; + renderLotStatuses(); + formElement.reset(); + formElement.querySelector("input").focus(); + } else { + bulmaJS.alert({ + title: "Error Adding " + exports.aliases.lot + " Status", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }); + + renderLotStatuses(); })(); \ No newline at end of file diff --git a/public/javascripts/adminTables.min.js b/public/javascripts/adminTables.min.js index b608ccf4..c89953b9 100644 --- a/public/javascripts/adminTables.min.js +++ b/public/javascripts/adminTables.min.js @@ -1 +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 +"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"})})},r=s=>{const r=s.currentTarget.closest("tr"),o=r.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:o},e=>{e.success?(0===(t=e.workOrderTypes).length?l():r.remove(),bulmaJS.alert({message:"Work Order Type Deleted Successfully",contextualColorName:"success"})):bulmaJS.alert({title:"Error Deleting Work Order Type",message:e.errorMessage,contextualColorName:"danger"})})}}})},o=s=>{const r=s.currentTarget.closest("tr").dataset.workOrderTypeId;cityssm.postJSON(e+"/admin/doMoveWorkOrderTypeUp",{workOrderTypeId:r},e=>{e.success?(t=e.workOrderTypes,l()):bulmaJS.alert({title:"Error Moving Work Order Type",message:e.errorMessage,contextualColorName:"danger"})})},a=s=>{const r=s.currentTarget.closest("tr").dataset.workOrderTypeId;cityssm.postJSON(e+"/admin/doMoveWorkOrderTypeDown",{workOrderTypeId:r},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",o),t.querySelector(".button--moveWorkOrderTypeDown").addEventListener("click",a),t.querySelector(".button--deleteWorkOrderType").addEventListener("click",r),e.append(t)}}else e.innerHTML='

There are no active work order types.

'};document.querySelector("#form--addWorkOrderType").addEventListener("submit",s=>{s.preventDefault();const r=s.currentTarget;cityssm.postJSON(e+"/admin/doAddWorkOrderType",r,e=>{e.success?(t=e.workOrderTypes,l(),r.reset(),r.querySelector("input").focus()):bulmaJS.alert({title:"Error Adding Work Order Type",message:e.errorMessage,contextualColorName:"danger"})})}),l();let d=exports.lotStatuses;delete exports.lotStatuses;const n=t=>{t.preventDefault(),cityssm.postJSON(e+"/admin/doUpdateLotStatus",t.currentTarget,e=>{e.success?(d=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"})})},u=t=>{const s=t.currentTarget.closest("tr"),r=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:r},e=>{e.success?(0===(d=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?(d=e.lotStatuses,p()):bulmaJS.alert({title:"Error Moving "+exports.aliases.lot+" Status",message:e.errorMessage,contextualColorName:"danger"})})},c=t=>{const s=t.currentTarget.closest("tr").dataset.lotStatusId;cityssm.postJSON(e+"/admin/doMoveLotStatusDown",{lotStatusId:s},e=>{e.success?(d=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 d){const s=document.createElement("tr");s.dataset.lotStatusId=t.lotStatusId.toString(),s.innerHTML='
',s.querySelector("form").addEventListener("submit",n),s.querySelector(".button--moveLotStatusUp").addEventListener("click",i),s.querySelector(".button--moveLotStatusDown").addEventListener("click",c),s.querySelector(".button--deleteLotStatus").addEventListener("click",u),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?(d=e.lotStatuses,p(),s.reset(),s.querySelector("input").focus()):bulmaJS.alert({title:"Error Adding "+exports.aliases.lot+" Status",message:e.errorMessage,contextualColorName:"danger"})})}),p()})(); \ No newline at end of file diff --git a/routes/admin.js b/routes/admin.js index 9e05d077..446ef792 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -13,6 +13,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_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"; +import handler_doMoveLotStatusDown from "../handlers/admin-post/doMoveLotStatusDown.js"; +import handler_doDeleteLotStatus from "../handlers/admin-post/doDeleteLotStatus.js"; export const router = Router(); router.get("/fees", permissionHandlers.adminGetHandler, handler_fees); router.post("/doAddFeeCategory", permissionHandlers.adminPostHandler, handler_doAddFeeCategory); @@ -27,4 +32,9 @@ 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("/doAddLotStatus", permissionHandlers.adminPostHandler, handler_doAddLotStatus); +router.post("/doUpdateLotStatuse", permissionHandlers.adminPostHandler, handler_doUpdateLotStatus); +router.post("/doMoveLotStatusUp", permissionHandlers.adminPostHandler, handler_doMoveLotStatusUp); +router.post("/doMoveLotStatusDown", permissionHandlers.adminPostHandler, handler_doMoveLotStatusDown); +router.post("/doDeleteLotStatus", permissionHandlers.adminPostHandler, handler_doDeleteLotStatus); export default router; diff --git a/routes/admin.ts b/routes/admin.ts index b1efb461..2b986e61 100644 --- a/routes/admin.ts +++ b/routes/admin.ts @@ -21,6 +21,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_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"; +import handler_doMoveLotStatusDown from "../handlers/admin-post/doMoveLotStatusDown.js"; +import handler_doDeleteLotStatus from "../handlers/admin-post/doDeleteLotStatus.js"; + export const router = Router(); @@ -61,6 +67,8 @@ router.get("/tables", permissionHandlers.adminGetHandler, handler_tables); +// Config Tables - Work Order Types + router.post("/doAddWorkOrderType", permissionHandlers.adminPostHandler, handler_doAddWorkOrderType); @@ -81,5 +89,28 @@ router.post("/doDeleteWorkOrderType", permissionHandlers.adminPostHandler, handler_doDeleteWorkOrderType); +// Config Tables - Lot Statuses + + +router.post("/doAddLotStatus", + permissionHandlers.adminPostHandler, + handler_doAddLotStatus); + +router.post("/doUpdateLotStatuse", + permissionHandlers.adminPostHandler, + handler_doUpdateLotStatus); + +router.post("/doMoveLotStatusUp", + permissionHandlers.adminPostHandler, + handler_doMoveLotStatusUp); + +router.post("/doMoveLotStatusDown", + permissionHandlers.adminPostHandler, + handler_doMoveLotStatusDown); + +router.post("/doDeleteLotStatus", + permissionHandlers.adminPostHandler, + handler_doDeleteLotStatus); + export default router; \ No newline at end of file diff --git a/types/globalTypes.js b/types/globalTypes.js index cb0ff5c3..c8ad2e54 100644 --- a/types/globalTypes.js +++ b/types/globalTypes.js @@ -1 +1,2 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/types/recordTypes.js b/types/recordTypes.js index cb0ff5c3..c8ad2e54 100644 --- a/types/recordTypes.js +++ b/types/recordTypes.js @@ -1 +1,2 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/views/admin-tables.ejs b/views/admin-tables.ejs index 35dbeab4..0f9a6e85 100644 --- a/views/admin-tables.ejs +++ b/views/admin-tables.ejs @@ -77,6 +77,33 @@ - <% if (lotOccupancy.lotOccupancyComments.length > 0) { %>

Comments