From f7b87329efc356618ec1a6d52a8685b55186cb6a Mon Sep 17 00:00:00 2001 From: Dan Gowans Date: Wed, 31 Aug 2022 16:28:29 -0400 Subject: [PATCH] development --- handlers/workOrders-get/view.d.ts | 3 ++ handlers/workOrders-get/view.js | 13 +++++ handlers/workOrders-get/view.ts | 27 +++++++++++ helpers/lotOccupancyDB/getFeeCategories.d.ts | 2 +- helpers/lotOccupancyDB/getFeeCategories.js | 29 ++++++++++-- helpers/lotOccupancyDB/getFeeCategories.ts | 47 ++++++++++++++++--- .../lotOccupancyDB/moveFeeCategoryDown.d.ts | 2 + helpers/lotOccupancyDB/moveFeeCategoryDown.js | 24 ++++++++++ helpers/lotOccupancyDB/moveFeeCategoryDown.ts | 38 +++++++++++++++ helpers/lotOccupancyDB/moveFeeCategoryUp.d.ts | 2 + helpers/lotOccupancyDB/moveFeeCategoryUp.js | 28 +++++++++++ helpers/lotOccupancyDB/moveFeeCategoryUp.ts | 43 +++++++++++++++++ helpers/lotOccupancyDB/moveFeeDown.d.ts | 2 + helpers/lotOccupancyDB/moveFeeDown.js | 24 ++++++++++ helpers/lotOccupancyDB/moveFeeDown.ts | 38 +++++++++++++++ helpers/lotOccupancyDB/moveFeeUp.d.ts | 2 + helpers/lotOccupancyDB/moveFeeUp.js | 28 +++++++++++ helpers/lotOccupancyDB/moveFeeUp.ts | 43 +++++++++++++++++ public-typescript/adminFees.js | 12 +++-- public-typescript/adminFees.ts | 13 +++-- public/javascripts/adminFees.min.js | 2 +- routes/workOrders.js | 2 + routes/workOrders.ts | 6 +++ types/recordTypes.d.ts | 2 + types/recordTypes.ts | 3 ++ views/workOrder-view.ejs | 41 ++++++++++++++++ 26 files changed, 455 insertions(+), 21 deletions(-) create mode 100644 handlers/workOrders-get/view.d.ts create mode 100644 handlers/workOrders-get/view.js create mode 100644 handlers/workOrders-get/view.ts create mode 100644 helpers/lotOccupancyDB/moveFeeCategoryDown.d.ts create mode 100644 helpers/lotOccupancyDB/moveFeeCategoryDown.js create mode 100644 helpers/lotOccupancyDB/moveFeeCategoryDown.ts create mode 100644 helpers/lotOccupancyDB/moveFeeCategoryUp.d.ts create mode 100644 helpers/lotOccupancyDB/moveFeeCategoryUp.js create mode 100644 helpers/lotOccupancyDB/moveFeeCategoryUp.ts create mode 100644 helpers/lotOccupancyDB/moveFeeDown.d.ts create mode 100644 helpers/lotOccupancyDB/moveFeeDown.js create mode 100644 helpers/lotOccupancyDB/moveFeeDown.ts create mode 100644 helpers/lotOccupancyDB/moveFeeUp.d.ts create mode 100644 helpers/lotOccupancyDB/moveFeeUp.js create mode 100644 helpers/lotOccupancyDB/moveFeeUp.ts create mode 100644 views/workOrder-view.ejs diff --git a/handlers/workOrders-get/view.d.ts b/handlers/workOrders-get/view.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/workOrders-get/view.d.ts @@ -0,0 +1,3 @@ +import type { RequestHandler } from "express"; +export declare const handler: RequestHandler; +export default handler; diff --git a/handlers/workOrders-get/view.js b/handlers/workOrders-get/view.js new file mode 100644 index 00000000..1c0fec2f --- /dev/null +++ b/handlers/workOrders-get/view.js @@ -0,0 +1,13 @@ +import * as configFunctions from "../../helpers/functions.config.js"; +import { getWorkOrder } from "../../helpers/lotOccupancyDB/getWorkOrder.js"; +export const handler = (request, response) => { + const workOrder = getWorkOrder(request.params.workOrderId); + if (!workOrder) { + return response.redirect(configFunctions.getProperty("reverseProxy.urlPrefix") + "/workOrders/?error=workOrderIdNotFound"); + } + response.render("workOrder-view", { + headTitle: "Work Order #" + workOrder.workOrderNumber, + workOrder + }); +}; +export default handler; diff --git a/handlers/workOrders-get/view.ts b/handlers/workOrders-get/view.ts new file mode 100644 index 00000000..4ab10129 --- /dev/null +++ b/handlers/workOrders-get/view.ts @@ -0,0 +1,27 @@ +import type { + RequestHandler +} from "express"; + +import * as configFunctions from "../../helpers/functions.config.js"; + +import { + getWorkOrder +} from "../../helpers/lotOccupancyDB/getWorkOrder.js"; + + +export const handler: RequestHandler = (request, response) => { + + const workOrder = getWorkOrder(request.params.workOrderId); + + if (!workOrder) { + return response.redirect(configFunctions.getProperty("reverseProxy.urlPrefix") + "/workOrders/?error=workOrderIdNotFound"); + } + + response.render("workOrder-view", { + headTitle: "Work Order #" + workOrder.workOrderNumber, + workOrder + }); +}; + + +export default handler; \ No newline at end of file diff --git a/helpers/lotOccupancyDB/getFeeCategories.d.ts b/helpers/lotOccupancyDB/getFeeCategories.d.ts index 54f3ff80..f2e30aab 100644 --- a/helpers/lotOccupancyDB/getFeeCategories.d.ts +++ b/helpers/lotOccupancyDB/getFeeCategories.d.ts @@ -6,5 +6,5 @@ interface GetFeeCategoriesFilters { interface GetFeeCategoriesOptions { includeFees?: boolean; } -export declare const getFeeCategories: (filters?: GetFeeCategoriesFilters, options?: GetFeeCategoriesOptions) => recordTypes.FeeCategory[]; +export declare const getFeeCategories: (filters: GetFeeCategoriesFilters, options: GetFeeCategoriesOptions) => recordTypes.FeeCategory[]; export default getFeeCategories; diff --git a/helpers/lotOccupancyDB/getFeeCategories.js b/helpers/lotOccupancyDB/getFeeCategories.js index fba08d73..212115f0 100644 --- a/helpers/lotOccupancyDB/getFeeCategories.js +++ b/helpers/lotOccupancyDB/getFeeCategories.js @@ -1,10 +1,11 @@ import sqlite from "better-sqlite3"; import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; export const getFeeCategories = (filters, options) => { + const updateOrderNumbers = !(filters.lotTypeId || filters.occupancyTypeId) && options.includeFees; const database = sqlite(databasePath, { - readonly: true + readonly: !updateOrderNumbers }); - let sql = "select feeCategoryId, feeCategory" + + let sql = "select feeCategoryId, feeCategory, orderNumber" + " from FeeCategories" + " where recordDelete_timeMillis is null"; let sqlParameters = []; @@ -26,14 +27,23 @@ export const getFeeCategories = (filters, options) => { " order by orderNumber, feeCategory") .all(sqlParameters); if (options.includeFees) { + let expectedFeeCategoryOrderNumber = -1; for (const feeCategory of feeCategories) { + expectedFeeCategoryOrderNumber += 1; + if (feeCategory.orderNumber !== expectedFeeCategoryOrderNumber) { + database.prepare("update FeeCategories" + + " set orderNumber = ?" + + " where feeCategoryId = ?") + .run(expectedFeeCategoryOrderNumber, feeCategory.feeCategoryId); + feeCategory.orderNumber = expectedFeeCategoryOrderNumber; + } sql = "select f.feeId, f.feeName, f.feeDescription," + " f.occupancyTypeId, o.occupancyType," + " f.lotTypeId, l.lotType," + " ifnull(f.feeAmount, 0) as feeAmount, f.feeFunction," + " f.taxAmount, f.taxPercentage," + " f.includeQuantity, f.quantityUnit," + - " f.isRequired" + + " f.isRequired, f.orderNumber" + " from Fees f" + " left join OccupancyTypes o on f.occupancyTypeId = o.occupancyTypeId" + " left join LotTypes l on f.lotTypeId = l.lotTypeId" + @@ -52,6 +62,19 @@ export const getFeeCategories = (filters, options) => { feeCategory.fees = database.prepare(sql + " order by f.orderNumber, f.feeName") .all(sqlParameters); + if (updateOrderNumbers) { + let expectedFeeOrderNumber = -1; + for (const fee of feeCategory.fees) { + expectedFeeOrderNumber += 1; + if (fee.orderNumber !== expectedFeeOrderNumber) { + database.prepare("update Fees" + + " set orderNumber = ?" + + " where feeId = ?") + .run(expectedFeeOrderNumber, fee.feeId); + fee.orderNumber = expectedFeeOrderNumber; + } + } + } } } database.close(); diff --git a/helpers/lotOccupancyDB/getFeeCategories.ts b/helpers/lotOccupancyDB/getFeeCategories.ts index 619f100b..8a218e4e 100644 --- a/helpers/lotOccupancyDB/getFeeCategories.ts +++ b/helpers/lotOccupancyDB/getFeeCategories.ts @@ -17,13 +17,15 @@ interface GetFeeCategoriesOptions { } -export const getFeeCategories = (filters ? : GetFeeCategoriesFilters, options ? : GetFeeCategoriesOptions): recordTypes.FeeCategory[] => { +export const getFeeCategories = (filters: GetFeeCategoriesFilters, options: GetFeeCategoriesOptions): recordTypes.FeeCategory[] => { + + const updateOrderNumbers = !(filters.lotTypeId || filters.occupancyTypeId) && options.includeFees; const database = sqlite(databasePath, { - readonly: true + readonly: !updateOrderNumbers }); - let sql = "select feeCategoryId, feeCategory" + + let sql = "select feeCategoryId, feeCategory, orderNumber" + " from FeeCategories" + " where recordDelete_timeMillis is null"; @@ -52,22 +54,35 @@ export const getFeeCategories = (filters ? : GetFeeCategoriesFilters, options ? .all(sqlParameters); if (options.includeFees) { - + + let expectedFeeCategoryOrderNumber = -1; + for (const feeCategory of feeCategories) { + expectedFeeCategoryOrderNumber += 1; + + if (feeCategory.orderNumber !== expectedFeeCategoryOrderNumber) { + database.prepare("update FeeCategories" + + " set orderNumber = ?" + + " where feeCategoryId = ?") + .run(expectedFeeCategoryOrderNumber, feeCategory.feeCategoryId); + + feeCategory.orderNumber = expectedFeeCategoryOrderNumber; + } + sql = "select f.feeId, f.feeName, f.feeDescription," + " f.occupancyTypeId, o.occupancyType," + " f.lotTypeId, l.lotType," + " ifnull(f.feeAmount, 0) as feeAmount, f.feeFunction," + " f.taxAmount, f.taxPercentage," + " f.includeQuantity, f.quantityUnit," + - " f.isRequired" + + " f.isRequired, f.orderNumber" + " from Fees f" + " left join OccupancyTypes o on f.occupancyTypeId = o.occupancyTypeId" + " left join LotTypes l on f.lotTypeId = l.lotTypeId" + " where f.recordDelete_timeMillis is null" + " and f.feeCategoryId = ?"; - + sqlParameters = []; sqlParameters.push(feeCategory.feeCategoryId); @@ -87,6 +102,26 @@ export const getFeeCategories = (filters ? : GetFeeCategoriesFilters, options ? feeCategory.fees = database.prepare(sql + " order by f.orderNumber, f.feeName") .all(sqlParameters); + + if (updateOrderNumbers) { + + let expectedFeeOrderNumber = -1; + + for (const fee of feeCategory.fees) { + + expectedFeeOrderNumber += 1; + + if (fee.orderNumber !== expectedFeeOrderNumber) { + + database.prepare("update Fees" + + " set orderNumber = ?" + + " where feeId = ?") + .run(expectedFeeOrderNumber, fee.feeId); + + fee.orderNumber = expectedFeeOrderNumber; + } + } + } } } diff --git a/helpers/lotOccupancyDB/moveFeeCategoryDown.d.ts b/helpers/lotOccupancyDB/moveFeeCategoryDown.d.ts new file mode 100644 index 00000000..e032c071 --- /dev/null +++ b/helpers/lotOccupancyDB/moveFeeCategoryDown.d.ts @@ -0,0 +1,2 @@ +export declare const moveFeeCategoryDown: (feeCategoryId: number | string) => boolean; +export default moveFeeCategoryDown; diff --git a/helpers/lotOccupancyDB/moveFeeCategoryDown.js b/helpers/lotOccupancyDB/moveFeeCategoryDown.js new file mode 100644 index 00000000..3f682d31 --- /dev/null +++ b/helpers/lotOccupancyDB/moveFeeCategoryDown.js @@ -0,0 +1,24 @@ +import sqlite from "better-sqlite3"; +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +export const moveFeeCategoryDown = (feeCategoryId) => { + const database = sqlite(databasePath); + const currentOrderNumber = database.prepare("select orderNumber" + + " from FeeCategories" + + " where feeCategoryId = ?") + .get(feeCategoryId) + .orderNumber; + database + .prepare("update FeeCategories" + + " set orderNumber = orderNumber - 1" + + " where recordDelete_timeMillis is null" + + " and orderNumber = ? + 1") + .run(currentOrderNumber); + const result = database + .prepare("update FeeCategories" + + " set orderNumber = ? + 1" + + " where feeCategoryId = ?") + .run(currentOrderNumber, feeCategoryId); + database.close(); + return result.changes > 0; +}; +export default moveFeeCategoryDown; diff --git a/helpers/lotOccupancyDB/moveFeeCategoryDown.ts b/helpers/lotOccupancyDB/moveFeeCategoryDown.ts new file mode 100644 index 00000000..e72037b1 --- /dev/null +++ b/helpers/lotOccupancyDB/moveFeeCategoryDown.ts @@ -0,0 +1,38 @@ +import sqlite from "better-sqlite3"; + +import { + lotOccupancyDB as databasePath +} from "../../data/databasePaths.js"; + + +export const moveFeeCategoryDown = + (feeCategoryId: number | string): boolean => { + + const database = sqlite(databasePath); + + const currentOrderNumber: number = database.prepare("select orderNumber" + + " from FeeCategories" + + " where feeCategoryId = ?") + .get(feeCategoryId) + .orderNumber; + + database + .prepare("update FeeCategories" + + " set orderNumber = orderNumber - 1" + + " where recordDelete_timeMillis is null" + + " and orderNumber = ? + 1") + .run(currentOrderNumber); + + const result = database + .prepare("update FeeCategories" + + " set orderNumber = ? + 1" + + " where feeCategoryId = ?") + .run(currentOrderNumber, feeCategoryId); + + database.close(); + + return result.changes > 0; + }; + + +export default moveFeeCategoryDown; \ No newline at end of file diff --git a/helpers/lotOccupancyDB/moveFeeCategoryUp.d.ts b/helpers/lotOccupancyDB/moveFeeCategoryUp.d.ts new file mode 100644 index 00000000..87edbda2 --- /dev/null +++ b/helpers/lotOccupancyDB/moveFeeCategoryUp.d.ts @@ -0,0 +1,2 @@ +export declare const moveFeeCategoryUp: (feeCategoryId: number | string) => boolean; +export default moveFeeCategoryUp; diff --git a/helpers/lotOccupancyDB/moveFeeCategoryUp.js b/helpers/lotOccupancyDB/moveFeeCategoryUp.js new file mode 100644 index 00000000..dd5f3d00 --- /dev/null +++ b/helpers/lotOccupancyDB/moveFeeCategoryUp.js @@ -0,0 +1,28 @@ +import sqlite from "better-sqlite3"; +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +export const moveFeeCategoryUp = (feeCategoryId) => { + const database = sqlite(databasePath); + const currentOrderNumber = database.prepare("select orderNumber" + + " from FeeCategories" + + " where feeCategoryId = ?") + .get(feeCategoryId) + .orderNumber; + if (currentOrderNumber <= 0) { + database.close(); + return true; + } + database + .prepare("update FeeCategories" + + " set orderNumber = orderNumber + 1" + + " where recordDelete_timeMillis is null" + + " and orderNumber = ? - 1") + .run(currentOrderNumber); + const result = database + .prepare("update FeeCategories" + + " set orderNumber = ? - 1" + + " where feeCategoryId = ?") + .run(currentOrderNumber, feeCategoryId); + database.close(); + return result.changes > 0; +}; +export default moveFeeCategoryUp; diff --git a/helpers/lotOccupancyDB/moveFeeCategoryUp.ts b/helpers/lotOccupancyDB/moveFeeCategoryUp.ts new file mode 100644 index 00000000..68836001 --- /dev/null +++ b/helpers/lotOccupancyDB/moveFeeCategoryUp.ts @@ -0,0 +1,43 @@ +import sqlite from "better-sqlite3"; + +import { + lotOccupancyDB as databasePath +} from "../../data/databasePaths.js"; + + +export const moveFeeCategoryUp = + (feeCategoryId: number | string): boolean => { + + const database = sqlite(databasePath); + + const currentOrderNumber: number = database.prepare("select orderNumber" + + " from FeeCategories" + + " where feeCategoryId = ?") + .get(feeCategoryId) + .orderNumber; + + if (currentOrderNumber <= 0) { + database.close(); + return true; + } + + database + .prepare("update FeeCategories" + + " set orderNumber = orderNumber + 1" + + " where recordDelete_timeMillis is null" + + " and orderNumber = ? - 1") + .run(currentOrderNumber); + + const result = database + .prepare("update FeeCategories" + + " set orderNumber = ? - 1" + + " where feeCategoryId = ?") + .run(currentOrderNumber, feeCategoryId); + + database.close(); + + return result.changes > 0; + }; + + +export default moveFeeCategoryUp; \ No newline at end of file diff --git a/helpers/lotOccupancyDB/moveFeeDown.d.ts b/helpers/lotOccupancyDB/moveFeeDown.d.ts new file mode 100644 index 00000000..26c37023 --- /dev/null +++ b/helpers/lotOccupancyDB/moveFeeDown.d.ts @@ -0,0 +1,2 @@ +export declare const moveFeeDown: (feeId: number | string) => boolean; +export default moveFeeDown; diff --git a/helpers/lotOccupancyDB/moveFeeDown.js b/helpers/lotOccupancyDB/moveFeeDown.js new file mode 100644 index 00000000..6056be12 --- /dev/null +++ b/helpers/lotOccupancyDB/moveFeeDown.js @@ -0,0 +1,24 @@ +import sqlite from "better-sqlite3"; +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +export const moveFeeDown = (feeId) => { + const database = sqlite(databasePath); + const currentOrderNumber = database.prepare("select orderNumber" + + " from Fees" + + " where feeId = ?") + .get(feeId) + .orderNumber; + database + .prepare("update Fees" + + " set orderNumber = orderNumber - 1" + + " where recordDelete_timeMillis is null" + + " and orderNumber = ? + 1") + .run(currentOrderNumber); + const result = database + .prepare("update Fees" + + " set orderNumber = ? + 1" + + " where feeId = ?") + .run(currentOrderNumber, feeId); + database.close(); + return result.changes > 0; +}; +export default moveFeeDown; diff --git a/helpers/lotOccupancyDB/moveFeeDown.ts b/helpers/lotOccupancyDB/moveFeeDown.ts new file mode 100644 index 00000000..97a099d9 --- /dev/null +++ b/helpers/lotOccupancyDB/moveFeeDown.ts @@ -0,0 +1,38 @@ +import sqlite from "better-sqlite3"; + +import { + lotOccupancyDB as databasePath +} from "../../data/databasePaths.js"; + + +export const moveFeeDown = + (feeId: number | string): boolean => { + + const database = sqlite(databasePath); + + const currentOrderNumber: number = database.prepare("select orderNumber" + + " from Fees" + + " where feeId = ?") + .get(feeId) + .orderNumber; + + database + .prepare("update Fees" + + " set orderNumber = orderNumber - 1" + + " where recordDelete_timeMillis is null" + + " and orderNumber = ? + 1") + .run(currentOrderNumber); + + const result = database + .prepare("update Fees" + + " set orderNumber = ? + 1" + + " where feeId = ?") + .run(currentOrderNumber, feeId); + + database.close(); + + return result.changes > 0; + }; + + +export default moveFeeDown; \ No newline at end of file diff --git a/helpers/lotOccupancyDB/moveFeeUp.d.ts b/helpers/lotOccupancyDB/moveFeeUp.d.ts new file mode 100644 index 00000000..1e7c0999 --- /dev/null +++ b/helpers/lotOccupancyDB/moveFeeUp.d.ts @@ -0,0 +1,2 @@ +export declare const moveFeeUp: (feeId: number | string) => boolean; +export default moveFeeUp; diff --git a/helpers/lotOccupancyDB/moveFeeUp.js b/helpers/lotOccupancyDB/moveFeeUp.js new file mode 100644 index 00000000..7965c710 --- /dev/null +++ b/helpers/lotOccupancyDB/moveFeeUp.js @@ -0,0 +1,28 @@ +import sqlite from "better-sqlite3"; +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +export const moveFeeUp = (feeId) => { + const database = sqlite(databasePath); + const currentOrderNumber = database.prepare("select orderNumber" + + " from Fees" + + " where feeId = ?") + .get(feeId) + .orderNumber; + if (currentOrderNumber <= 0) { + database.close(); + return true; + } + database + .prepare("update Fees" + + " set orderNumber = orderNumber + 1" + + " where recordDelete_timeMillis is null" + + " and orderNumber = ? - 1") + .run(currentOrderNumber); + const result = database + .prepare("update Fees" + + " set orderNumber = ? - 1" + + " where feeId = ?") + .run(currentOrderNumber, feeId); + database.close(); + return result.changes > 0; +}; +export default moveFeeUp; diff --git a/helpers/lotOccupancyDB/moveFeeUp.ts b/helpers/lotOccupancyDB/moveFeeUp.ts new file mode 100644 index 00000000..b51eeec1 --- /dev/null +++ b/helpers/lotOccupancyDB/moveFeeUp.ts @@ -0,0 +1,43 @@ +import sqlite from "better-sqlite3"; + +import { + lotOccupancyDB as databasePath +} from "../../data/databasePaths.js"; + + +export const moveFeeUp = + (feeId: number | string): boolean => { + + const database = sqlite(databasePath); + + const currentOrderNumber: number = database.prepare("select orderNumber" + + " from Fees" + + " where feeId = ?") + .get(feeId) + .orderNumber; + + if (currentOrderNumber <= 0) { + database.close(); + return true; + } + + database + .prepare("update Fees" + + " set orderNumber = orderNumber + 1" + + " where recordDelete_timeMillis is null" + + " and orderNumber = ? - 1") + .run(currentOrderNumber); + + const result = database + .prepare("update Fees" + + " set orderNumber = ? - 1" + + " where feeId = ?") + .run(currentOrderNumber, feeId); + + database.close(); + + return result.changes > 0; + }; + + +export default moveFeeUp; \ No newline at end of file diff --git a/public-typescript/adminFees.js b/public-typescript/adminFees.js index da8f7d36..7317676e 100644 --- a/public-typescript/adminFees.js +++ b/public-typescript/adminFees.js @@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); const urlPrefix = document.querySelector("main").dataset.urlPrefix; const feeCategoriesContainerElement = document.querySelector("#container--feeCategories"); let feeCategories = exports.feeCategories; + delete exports.feeCategories; const renderFeeCategories = () => { if (feeCategories.length === 0) { feeCategoriesContainerElement.innerHTML = "
" + @@ -55,13 +56,13 @@ Object.defineProperty(exports, "__esModule", { value: true }); const panelElement = document.createElement("div"); panelElement.className = "panel"; for (const fee of feeCategory.fees) { - const panelBlockElement = document.createElement("a"); + const panelBlockElement = document.createElement("div"); panelBlockElement.className = "panel-block is-block container--fee"; panelBlockElement.dataset.feeId = fee.feeId.toString(); panelBlockElement.innerHTML = "
" + ("
" + "

" + - "" + cityssm.escapeHTML(fee.feeName) + "
" + + "" + cityssm.escapeHTML(fee.feeName) + "
" + "" + cityssm.escapeHTML(fee.feeDescription).replace(/\n/g, "
") + "
" + "

" + "

" + @@ -98,7 +99,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); "") + "

") + "
"; - panelBlockElement.addEventListener("click", openEditFee); + panelBlockElement.querySelector("a").addEventListener("click", openEditFee); panelElement.append(panelBlockElement); } feeCategoryContainerElement.append(panelElement); @@ -311,8 +312,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); }; const openEditFee = (clickEvent) => { clickEvent.preventDefault(); - const feeId = Number.parseInt(clickEvent.currentTarget.dataset.feeId, 10); - const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId); + const feeContainerElement = clickEvent.currentTarget.closest(".container--fee"); + const feeId = Number.parseInt(feeContainerElement.dataset.feeId, 10); + const feeCategoryId = Number.parseInt(feeContainerElement.closest(".container--feeCategory").dataset.feeCategoryId); const feeCategory = feeCategories.find((currentFeeCategory) => { return currentFeeCategory.feeCategoryId === feeCategoryId; }); diff --git a/public-typescript/adminFees.ts b/public-typescript/adminFees.ts index 43cb90c0..c9fb1e73 100644 --- a/public-typescript/adminFees.ts +++ b/public-typescript/adminFees.ts @@ -23,6 +23,7 @@ declare const bulmaJS: BulmaJS; const feeCategoriesContainerElement = document.querySelector("#container--feeCategories") as HTMLElement; let feeCategories: recordTypes.FeeCategory[] = exports.feeCategories; + delete exports.feeCategories; const renderFeeCategories = () => { @@ -85,14 +86,14 @@ declare const bulmaJS: BulmaJS; for (const fee of feeCategory.fees) { - const panelBlockElement = document.createElement("a"); + const panelBlockElement = document.createElement("div"); panelBlockElement.className = "panel-block is-block container--fee"; panelBlockElement.dataset.feeId = fee.feeId.toString(); panelBlockElement.innerHTML = "
" + ("
" + "

" + - "" + cityssm.escapeHTML(fee.feeName) + "
" + + "" + cityssm.escapeHTML(fee.feeName) + "
" + "" + cityssm.escapeHTML(fee.feeDescription).replace(/\n/g, "
") + "
" + "

" + "

" + @@ -130,7 +131,7 @@ declare const bulmaJS: BulmaJS; "

") + "
"; - panelBlockElement.addEventListener("click", openEditFee); + panelBlockElement.querySelector("a").addEventListener("click", openEditFee); panelElement.append(panelBlockElement); } @@ -435,8 +436,10 @@ declare const bulmaJS: BulmaJS; const openEditFee = (clickEvent: Event) => { clickEvent.preventDefault(); - const feeId = Number.parseInt((clickEvent.currentTarget as HTMLElement).dataset.feeId, 10); - const feeCategoryId = Number.parseInt(((clickEvent.currentTarget as HTMLElement).closest(".container--feeCategory") as HTMLElement).dataset.feeCategoryId); + const feeContainerElement = (clickEvent.currentTarget as HTMLElement).closest(".container--fee") as HTMLElement; + + const feeId = Number.parseInt(feeContainerElement.dataset.feeId, 10); + const feeCategoryId = Number.parseInt((feeContainerElement.closest(".container--feeCategory") as HTMLElement).dataset.feeCategoryId); const feeCategory = feeCategories.find((currentFeeCategory) => { return currentFeeCategory.feeCategoryId === feeCategoryId; diff --git a/public/javascripts/adminFees.min.js b/public/javascripts/adminFees.min.js index 36aa6213..e3c21763 100644 --- a/public/javascripts/adminFees.min.js +++ b/public/javascripts/adminFees.min.js @@ -1 +1 @@ -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=exports.los,t=document.querySelector("main").dataset.urlPrefix,s=document.querySelector("#container--feeCategories");let a=exports.feeCategories;const o=()=>{if(0===a.length)return void(s.innerHTML='

There are no available fees.

');s.innerHTML="";for(const e of a){const t=document.createElement("section");if(t.className="container--feeCategory mb-5",t.dataset.feeCategoryId=e.feeCategoryId.toString(),t.insertAdjacentHTML("beforeend",'

'+cityssm.escapeHTML(e.feeCategory)+'

'+(0===e.fees.length?'
':"")+'
'),0===e.fees.length)t.insertAdjacentHTML("beforeend",'

There are no fees in the "'+cityssm.escapeHTML(e.feeCategory)+'" category.

');else{const s=document.createElement("div");s.className="panel";for(const t of e.fees){const e=document.createElement("a");e.className="panel-block is-block container--fee",e.dataset.feeId=t.feeId.toString(),e.innerHTML='

'+cityssm.escapeHTML(t.feeName)+"
"+cityssm.escapeHTML(t.feeDescription).replace(/\n/g,"
")+'

'+(t.isRequired?'Required':"")+(t.occupancyTypeId?' '+cityssm.escapeHTML(t.occupancyType)+"":"")+(t.lotTypeId?' '+cityssm.escapeHTML(t.lotType)+"":"")+'

'+(t.feeFunction?cityssm.escapeHTML(t.feeFunction)+"
Fee Function":"$"+t.feeAmount.toFixed(2)+"
Fee")+'
'+(t.taxPercentage?t.taxPercentage+"%":"$"+t.taxAmount.toFixed(2))+'
Tax
'+(t.includeQuantity?cityssm.escapeHTML(t.quantityUnit)+"
Quantity":"")+"
",e.addEventListener("click",l),s.append(e)}t.append(s)}s.append(t)}const e=s.querySelectorAll(".button--deleteFeeCategory");for(const t of e)t.addEventListener("click",n);const t=s.querySelectorAll(".button--editFeeCategory");for(const e of t)e.addEventListener("click",r);const o=s.querySelectorAll(".button--addFee");for(const e of o)e.addEventListener("click",c)};document.querySelector("#button--addFeeCategory").addEventListener("click",()=>{let e;const s=s=>{s.preventDefault(),cityssm.postJSON(t+"/admin/doAddFeeCategory",s.currentTarget,t=>{t.success?(a=t.feeCategories,e(),o()):bulmaJS.alert({title:"Error Creating Fee Category",message:t.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("adminFees-addFeeCategory",{onshown:(t,a)=>{bulmaJS.toggleHtmlClipped(),t.querySelector("#feeCategoryAdd--feeCategory").focus(),e=a,t.querySelector("form").addEventListener("submit",s)},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})});const r=e=>{const s=Number.parseInt(e.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10),r=a.find(e=>e.feeCategoryId===s);let n;const c=e=>{e.preventDefault(),cityssm.postJSON(t+"/admin/doUpdateFeeCategory",e.currentTarget,e=>{e.success?(a=e.feeCategories,n(),o()):bulmaJS.alert({title:"Error Updating Fee Category",message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("adminFees-editFeeCategory",{onshow:e=>{e.querySelector("#feeCategoryEdit--feeCategoryId").value=r.feeCategoryId.toString(),e.querySelector("#feeCategoryEdit--feeCategory").value=r.feeCategory},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),n=t,e.querySelector("form").addEventListener("submit",c),e.querySelector("#feeCategoryEdit--feeCategory").focus()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},n=e=>{const s=Number.parseInt(e.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10);bulmaJS.confirm({title:"Delete Fee Category?",message:"Are you sure you want to delete this fee category?",contextualColorName:"warning",okButton:{text:"Yes, Delete the Fee Category",callbackFunction:()=>{cityssm.postJSON(t+"/admin/doDeleteFeeCategory",{feeCategoryId:s},e=>{e.success?(a=e.feeCategories,o()):bulmaJS.alert({title:"Error Updating Fee Category",message:e.errorMessage,contextualColorName:"danger"})})}}})},c=s=>{const r=Number.parseInt(s.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10);let n;const c=e=>{e.preventDefault(),cityssm.postJSON(t+"/admin/doAddFee",e.currentTarget,e=>{e.success?(a=e.feeCategories,n(),o()):bulmaJS.alert({title:"Error Adding Fee",message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("adminFees-addFee",{onshow:t=>{const s=t.querySelector("#feeAdd--feeCategoryId");for(const e of a){const t=document.createElement("option");t.value=e.feeCategoryId.toString(),t.textContent=e.feeCategory,e.feeCategoryId===r&&(t.selected=!0),s.append(t)}const o=t.querySelector("#feeAdd--occupancyTypeId");for(const e of exports.occupancyTypes){const t=document.createElement("option");t.value=e.occupancyTypeId.toString(),t.textContent=e.occupancyType,o.append(t)}const n=t.querySelector("#feeAdd--lotTypeId");for(const e of exports.lotTypes){const t=document.createElement("option");t.value=e.lotTypeId.toString(),t.textContent=e.lotType,n.append(t)}t.querySelector("#feeAdd--taxPercentage").value=exports.taxPercentageDefault.toString(),e.populateAliases(t)},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),n=t,e.querySelector("form").addEventListener("submit",c),e.querySelector("#feeAdd--feeName").focus(),e.querySelector("#feeAdd--feeFunction").addEventListener("change",()=>{const t=e.querySelector("#feeAdd--feeAmount"),s=e.querySelector("#feeAdd--feeFunction");""===s.value?(s.closest(".select").classList.remove("is-success"),t.classList.add("is-success"),t.disabled=!1):(s.closest(".select").classList.add("is-success"),t.classList.remove("is-success"),t.disabled=!0)}),e.querySelector("#feeAdd--taxPercentage").addEventListener("keyup",()=>{const t=e.querySelector("#feeAdd--taxAmount"),s=e.querySelector("#feeAdd--taxPercentage");""===s.value?(s.classList.remove("is-success"),t.classList.add("is-success"),t.disabled=!1):(s.classList.add("is-success"),t.classList.remove("is-success"),t.disabled=!0)}),e.querySelector("#feeAdd--includeQuantity").addEventListener("change",()=>{e.querySelector("#feeAdd--quantityUnit").disabled=""===e.querySelector("#feeAdd--includeQuantity").value})},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},l=s=>{s.preventDefault();const r=Number.parseInt(s.currentTarget.dataset.feeId,10),n=Number.parseInt(s.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId),c=a.find(e=>e.feeCategoryId===n).fees.find(e=>e.feeId===r);let l,i;const d=e=>{e.preventDefault(),cityssm.postJSON(t+"/admin/doUpdateFee",e.currentTarget,e=>{e.success?(a=e.feeCategories,l(),o()):bulmaJS.alert({title:"Error Updating Fee",message:e.errorMessage,contextualColorName:"danger"})})},u=e=>{e.preventDefault();bulmaJS.confirm({title:"Delete Fee?",message:"Are you sure you want to delete this fee?",contextualColorName:"warning",okButton:{text:"Yes, Delete the Fee",callbackFunction:()=>{cityssm.postJSON(t+"/admin/doDeleteFee",{feeId:r},e=>{e.success?(a=e.feeCategories,l(),o()):bulmaJS.alert({title:"Error Deleting Fee",message:e.errorMessage,contextualColorName:"danger"})})}}})},y=()=>{const e=i.querySelector("#feeEdit--feeAmount"),t=i.querySelector("#feeEdit--feeFunction");""===t.value?(t.closest(".select").classList.remove("is-success"),e.classList.add("is-success"),e.disabled=!1):(t.closest(".select").classList.add("is-success"),e.classList.remove("is-success"),e.disabled=!0)},m=()=>{const e=i.querySelector("#feeEdit--taxAmount"),t=i.querySelector("#feeEdit--taxPercentage");""===t.value?(t.classList.remove("is-success"),e.classList.add("is-success"),e.disabled=!1):(t.classList.add("is-success"),e.classList.remove("is-success"),e.disabled=!0)},p=()=>{i.querySelector("#feeEdit--quantityUnit").disabled=""===i.querySelector("#feeEdit--includeQuantity").value};cityssm.openHtmlModal("adminFees-editFee",{onshow:t=>{i=t,t.querySelector("#feeEdit--feeId").value=c.feeId.toString();const s=t.querySelector("#feeEdit--feeCategoryId");for(const e of a){const t=document.createElement("option");t.value=e.feeCategoryId.toString(),t.textContent=e.feeCategory,e.feeCategoryId===n&&(t.selected=!0),s.append(t)}t.querySelector("#feeEdit--feeName").value=c.feeName,t.querySelector("#feeEdit--feeDescription").value=c.feeDescription;const o=t.querySelector("#feeEdit--occupancyTypeId");for(const e of exports.occupancyTypes){const t=document.createElement("option");t.value=e.occupancyTypeId.toString(),t.textContent=e.occupancyType,e.occupancyTypeId===c.occupancyTypeId&&(t.selected=!0),o.append(t)}const r=t.querySelector("#feeEdit--lotTypeId");for(const e of exports.lotTypes){const t=document.createElement("option");t.value=e.lotTypeId.toString(),t.textContent=e.lotType,e.lotTypeId===c.lotTypeId&&(t.selected=!0),r.append(t)}t.querySelector("#feeEdit--feeAmount").value=c.feeAmount?c.feeAmount.toFixed(2):"",t.querySelector("#feeEdit--feeFunction").addEventListener("change",y),y(),t.querySelector("#feeEdit--taxAmount").value=c.taxAmount?c.taxAmount.toFixed(2):"";const l=t.querySelector("#feeEdit--taxPercentage");l.value=c.taxPercentage?c.taxPercentage.toString():"",l.addEventListener("keyup",m),m();const d=t.querySelector("#feeEdit--includeQuantity");c.includeQuantity&&(d.value="1"),d.addEventListener("change",p),t.querySelector("#feeEdit--quantityUnit").value=c.quantityUnit||"",p(),c.isRequired&&(t.querySelector("#feeEdit--isRequired").value="1"),e.populateAliases(t)},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),l=t,e.querySelector("form").addEventListener("submit",d),bulmaJS.init(e),e.querySelector(".button--deleteFee").addEventListener("click",u)},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})};o()})(); \ No newline at end of file +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=exports.los,t=document.querySelector("main").dataset.urlPrefix,s=document.querySelector("#container--feeCategories");let a=exports.feeCategories;delete exports.feeCategories;const o=()=>{if(0===a.length)return void(s.innerHTML='

There are no available fees.

');s.innerHTML="";for(const e of a){const t=document.createElement("section");if(t.className="container--feeCategory mb-5",t.dataset.feeCategoryId=e.feeCategoryId.toString(),t.insertAdjacentHTML("beforeend",'

'+cityssm.escapeHTML(e.feeCategory)+'

'+(0===e.fees.length?'
':"")+'
'),0===e.fees.length)t.insertAdjacentHTML("beforeend",'

There are no fees in the "'+cityssm.escapeHTML(e.feeCategory)+'" category.

');else{const s=document.createElement("div");s.className="panel";for(const t of e.fees){const e=document.createElement("div");e.className="panel-block is-block container--fee",e.dataset.feeId=t.feeId.toString(),e.innerHTML='

'+cityssm.escapeHTML(t.feeName)+"
"+cityssm.escapeHTML(t.feeDescription).replace(/\n/g,"
")+'

'+(t.isRequired?'Required':"")+(t.occupancyTypeId?' '+cityssm.escapeHTML(t.occupancyType)+"":"")+(t.lotTypeId?' '+cityssm.escapeHTML(t.lotType)+"":"")+'

'+(t.feeFunction?cityssm.escapeHTML(t.feeFunction)+"
Fee Function":"$"+t.feeAmount.toFixed(2)+"
Fee")+'
'+(t.taxPercentage?t.taxPercentage+"%":"$"+t.taxAmount.toFixed(2))+'
Tax
'+(t.includeQuantity?cityssm.escapeHTML(t.quantityUnit)+"
Quantity":"")+"
",e.querySelector("a").addEventListener("click",l),s.append(e)}t.append(s)}s.append(t)}const e=s.querySelectorAll(".button--deleteFeeCategory");for(const t of e)t.addEventListener("click",n);const t=s.querySelectorAll(".button--editFeeCategory");for(const e of t)e.addEventListener("click",r);const o=s.querySelectorAll(".button--addFee");for(const e of o)e.addEventListener("click",c)};document.querySelector("#button--addFeeCategory").addEventListener("click",()=>{let e;const s=s=>{s.preventDefault(),cityssm.postJSON(t+"/admin/doAddFeeCategory",s.currentTarget,t=>{t.success?(a=t.feeCategories,e(),o()):bulmaJS.alert({title:"Error Creating Fee Category",message:t.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("adminFees-addFeeCategory",{onshown:(t,a)=>{bulmaJS.toggleHtmlClipped(),t.querySelector("#feeCategoryAdd--feeCategory").focus(),e=a,t.querySelector("form").addEventListener("submit",s)},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})});const r=e=>{const s=Number.parseInt(e.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10),r=a.find(e=>e.feeCategoryId===s);let n;const c=e=>{e.preventDefault(),cityssm.postJSON(t+"/admin/doUpdateFeeCategory",e.currentTarget,e=>{e.success?(a=e.feeCategories,n(),o()):bulmaJS.alert({title:"Error Updating Fee Category",message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("adminFees-editFeeCategory",{onshow:e=>{e.querySelector("#feeCategoryEdit--feeCategoryId").value=r.feeCategoryId.toString(),e.querySelector("#feeCategoryEdit--feeCategory").value=r.feeCategory},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),n=t,e.querySelector("form").addEventListener("submit",c),e.querySelector("#feeCategoryEdit--feeCategory").focus()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},n=e=>{const s=Number.parseInt(e.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10);bulmaJS.confirm({title:"Delete Fee Category?",message:"Are you sure you want to delete this fee category?",contextualColorName:"warning",okButton:{text:"Yes, Delete the Fee Category",callbackFunction:()=>{cityssm.postJSON(t+"/admin/doDeleteFeeCategory",{feeCategoryId:s},e=>{e.success?(a=e.feeCategories,o()):bulmaJS.alert({title:"Error Updating Fee Category",message:e.errorMessage,contextualColorName:"danger"})})}}})},c=s=>{const r=Number.parseInt(s.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10);let n;const c=e=>{e.preventDefault(),cityssm.postJSON(t+"/admin/doAddFee",e.currentTarget,e=>{e.success?(a=e.feeCategories,n(),o()):bulmaJS.alert({title:"Error Adding Fee",message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("adminFees-addFee",{onshow:t=>{const s=t.querySelector("#feeAdd--feeCategoryId");for(const e of a){const t=document.createElement("option");t.value=e.feeCategoryId.toString(),t.textContent=e.feeCategory,e.feeCategoryId===r&&(t.selected=!0),s.append(t)}const o=t.querySelector("#feeAdd--occupancyTypeId");for(const e of exports.occupancyTypes){const t=document.createElement("option");t.value=e.occupancyTypeId.toString(),t.textContent=e.occupancyType,o.append(t)}const n=t.querySelector("#feeAdd--lotTypeId");for(const e of exports.lotTypes){const t=document.createElement("option");t.value=e.lotTypeId.toString(),t.textContent=e.lotType,n.append(t)}t.querySelector("#feeAdd--taxPercentage").value=exports.taxPercentageDefault.toString(),e.populateAliases(t)},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),n=t,e.querySelector("form").addEventListener("submit",c),e.querySelector("#feeAdd--feeName").focus(),e.querySelector("#feeAdd--feeFunction").addEventListener("change",()=>{const t=e.querySelector("#feeAdd--feeAmount"),s=e.querySelector("#feeAdd--feeFunction");""===s.value?(s.closest(".select").classList.remove("is-success"),t.classList.add("is-success"),t.disabled=!1):(s.closest(".select").classList.add("is-success"),t.classList.remove("is-success"),t.disabled=!0)}),e.querySelector("#feeAdd--taxPercentage").addEventListener("keyup",()=>{const t=e.querySelector("#feeAdd--taxAmount"),s=e.querySelector("#feeAdd--taxPercentage");""===s.value?(s.classList.remove("is-success"),t.classList.add("is-success"),t.disabled=!1):(s.classList.add("is-success"),t.classList.remove("is-success"),t.disabled=!0)}),e.querySelector("#feeAdd--includeQuantity").addEventListener("change",()=>{e.querySelector("#feeAdd--quantityUnit").disabled=""===e.querySelector("#feeAdd--includeQuantity").value})},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},l=s=>{s.preventDefault();const r=s.currentTarget.closest(".container--fee"),n=Number.parseInt(r.dataset.feeId,10),c=Number.parseInt(r.closest(".container--feeCategory").dataset.feeCategoryId),l=a.find(e=>e.feeCategoryId===c).fees.find(e=>e.feeId===n);let i,d;const u=e=>{e.preventDefault(),cityssm.postJSON(t+"/admin/doUpdateFee",e.currentTarget,e=>{e.success?(a=e.feeCategories,i(),o()):bulmaJS.alert({title:"Error Updating Fee",message:e.errorMessage,contextualColorName:"danger"})})},y=e=>{e.preventDefault();bulmaJS.confirm({title:"Delete Fee?",message:"Are you sure you want to delete this fee?",contextualColorName:"warning",okButton:{text:"Yes, Delete the Fee",callbackFunction:()=>{cityssm.postJSON(t+"/admin/doDeleteFee",{feeId:n},e=>{e.success?(a=e.feeCategories,i(),o()):bulmaJS.alert({title:"Error Deleting Fee",message:e.errorMessage,contextualColorName:"danger"})})}}})},m=()=>{const e=d.querySelector("#feeEdit--feeAmount"),t=d.querySelector("#feeEdit--feeFunction");""===t.value?(t.closest(".select").classList.remove("is-success"),e.classList.add("is-success"),e.disabled=!1):(t.closest(".select").classList.add("is-success"),e.classList.remove("is-success"),e.disabled=!0)},p=()=>{const e=d.querySelector("#feeEdit--taxAmount"),t=d.querySelector("#feeEdit--taxPercentage");""===t.value?(t.classList.remove("is-success"),e.classList.add("is-success"),e.disabled=!1):(t.classList.add("is-success"),e.classList.remove("is-success"),e.disabled=!0)},f=()=>{d.querySelector("#feeEdit--quantityUnit").disabled=""===d.querySelector("#feeEdit--includeQuantity").value};cityssm.openHtmlModal("adminFees-editFee",{onshow:t=>{d=t,t.querySelector("#feeEdit--feeId").value=l.feeId.toString();const s=t.querySelector("#feeEdit--feeCategoryId");for(const e of a){const t=document.createElement("option");t.value=e.feeCategoryId.toString(),t.textContent=e.feeCategory,e.feeCategoryId===c&&(t.selected=!0),s.append(t)}t.querySelector("#feeEdit--feeName").value=l.feeName,t.querySelector("#feeEdit--feeDescription").value=l.feeDescription;const o=t.querySelector("#feeEdit--occupancyTypeId");for(const e of exports.occupancyTypes){const t=document.createElement("option");t.value=e.occupancyTypeId.toString(),t.textContent=e.occupancyType,e.occupancyTypeId===l.occupancyTypeId&&(t.selected=!0),o.append(t)}const r=t.querySelector("#feeEdit--lotTypeId");for(const e of exports.lotTypes){const t=document.createElement("option");t.value=e.lotTypeId.toString(),t.textContent=e.lotType,e.lotTypeId===l.lotTypeId&&(t.selected=!0),r.append(t)}t.querySelector("#feeEdit--feeAmount").value=l.feeAmount?l.feeAmount.toFixed(2):"",t.querySelector("#feeEdit--feeFunction").addEventListener("change",m),m(),t.querySelector("#feeEdit--taxAmount").value=l.taxAmount?l.taxAmount.toFixed(2):"";const n=t.querySelector("#feeEdit--taxPercentage");n.value=l.taxPercentage?l.taxPercentage.toString():"",n.addEventListener("keyup",p),p();const i=t.querySelector("#feeEdit--includeQuantity");l.includeQuantity&&(i.value="1"),i.addEventListener("change",f),t.querySelector("#feeEdit--quantityUnit").value=l.quantityUnit||"",f(),l.isRequired&&(t.querySelector("#feeEdit--isRequired").value="1"),e.populateAliases(t)},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),i=t,e.querySelector("form").addEventListener("submit",u),bulmaJS.init(e),e.querySelector(".button--deleteFee").addEventListener("click",y)},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})};o()})(); \ No newline at end of file diff --git a/routes/workOrders.js b/routes/workOrders.js index 21ae8f37..60539be1 100644 --- a/routes/workOrders.js +++ b/routes/workOrders.js @@ -1,7 +1,9 @@ import { Router } from "express"; import handler_search from "../handlers/workOrders-get/search.js"; import handler_doSearchWorkOrders from "../handlers/workOrders-post/doSearchWorkOrders.js"; +import handler_view from "../handlers/workOrders-get/view.js"; export const router = Router(); router.get("/", handler_search); router.post("/doSearchWorkOrders", handler_doSearchWorkOrders); +router.get("/:workOrderId", handler_view); export default router; diff --git a/routes/workOrders.ts b/routes/workOrders.ts index 044d1142..f4a6c098 100644 --- a/routes/workOrders.ts +++ b/routes/workOrders.ts @@ -8,6 +8,7 @@ import * as configFunctions from "../helpers/functions.config.js"; import handler_search from "../handlers/workOrders-get/search.js"; import handler_doSearchWorkOrders from "../handlers/workOrders-post/doSearchWorkOrders.js"; +import handler_view from "../handlers/workOrders-get/view.js"; export const router = Router(); @@ -20,4 +21,9 @@ router.post("/doSearchWorkOrders", handler_doSearchWorkOrders); +router.get("/:workOrderId", + handler_view); + + + export default router; \ No newline at end of file diff --git a/types/recordTypes.d.ts b/types/recordTypes.d.ts index c152ac3f..eac9e45f 100644 --- a/types/recordTypes.d.ts +++ b/types/recordTypes.d.ts @@ -101,6 +101,7 @@ export interface FeeCategory extends Record { feeCategoryId?: number; feeCategory?: string; fees?: Fee[]; + orderNumber?: number; } export interface Fee extends Record { feeId?: number; @@ -119,6 +120,7 @@ export interface Fee extends Record { taxAmount?: number; taxPercentage?: number; isRequired?: boolean; + orderNumber?: number; } export interface LotOccupancyFee extends Fee, Record { lotOccupancyId?: number; diff --git a/types/recordTypes.ts b/types/recordTypes.ts index da8ddaab..0529a225 100644 --- a/types/recordTypes.ts +++ b/types/recordTypes.ts @@ -143,6 +143,7 @@ export interface FeeCategory extends Record { feeCategoryId ? : number; feeCategory ? : string; fees ? : Fee[]; + orderNumber ? : number; } @@ -171,6 +172,8 @@ export interface Fee extends Record { taxPercentage ? : number; isRequired ? : boolean; + + orderNumber ? : number; } diff --git a/views/workOrder-view.ejs b/views/workOrder-view.ejs new file mode 100644 index 00000000..34751046 --- /dev/null +++ b/views/workOrder-view.ejs @@ -0,0 +1,41 @@ +<%- include('_header'); -%> + +
+ +
+ + +

+ Work Order #<%= workOrder.workOrderNumber || "(No Number)" %> +

+ + <% if (user.userProperties.canUpdate) { %> + + <% } %> + +
+
+ +<%- include('_footerA'); -%> + +<%- include('_footerB'); -%> \ No newline at end of file