diff --git a/handlers/admin-get/occupancyTypes.js b/handlers/admin-get/occupancyTypes.js index b3900305..9dfc77de 100644 --- a/handlers/admin-get/occupancyTypes.js +++ b/handlers/admin-get/occupancyTypes.js @@ -1,11 +1,13 @@ -import { getOccupancyTypes } from "../../helpers/functions.cache.js"; +import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js"; import * as configFunctions from "../../helpers/functions.config.js"; export const handler = (_request, response) => { const occupancyTypes = getOccupancyTypes(); + const allOccupancyTypeFields = getAllOccupancyTypeFields(); response.render("admin-occupancyTypes", { headTitle: configFunctions.getProperty("aliases.occupancy") + " Type Management", - occupancyTypes + occupancyTypes, + allOccupancyTypeFields }); }; export default handler; diff --git a/handlers/admin-get/occupancyTypes.ts b/handlers/admin-get/occupancyTypes.ts index 84a6e7d7..f950aa44 100644 --- a/handlers/admin-get/occupancyTypes.ts +++ b/handlers/admin-get/occupancyTypes.ts @@ -1,17 +1,19 @@ import type { RequestHandler } from "express"; -import { getOccupancyTypes } from "../../helpers/functions.cache.js"; +import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js"; import * as configFunctions from "../../helpers/functions.config.js"; export const handler: RequestHandler = (_request, response) => { const occupancyTypes = getOccupancyTypes(); + const allOccupancyTypeFields = getAllOccupancyTypeFields(); response.render("admin-occupancyTypes", { headTitle: configFunctions.getProperty("aliases.occupancy") + " Type Management", - occupancyTypes + occupancyTypes, + allOccupancyTypeFields }); }; diff --git a/handlers/admin-post/doAddOccupancyType.js b/handlers/admin-post/doAddOccupancyType.js index 82a0525c..70ba7845 100644 --- a/handlers/admin-post/doAddOccupancyType.js +++ b/handlers/admin-post/doAddOccupancyType.js @@ -1,12 +1,14 @@ import { addOccupancyType } from "../../helpers/lotOccupancyDB/addOccupancyType.js"; -import { getOccupancyTypes } from "../../helpers/functions.cache.js"; +import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js"; export const handler = async (request, response) => { const occupancyTypeId = addOccupancyType(request.body, request.session); const occupancyTypes = getOccupancyTypes(); + const allOccupancyTypeFields = getAllOccupancyTypeFields(); response.json({ success: true, occupancyTypeId, - occupancyTypes + occupancyTypes, + allOccupancyTypeFields }); }; export default handler; diff --git a/handlers/admin-post/doAddOccupancyType.ts b/handlers/admin-post/doAddOccupancyType.ts index 255e1d22..1551b430 100644 --- a/handlers/admin-post/doAddOccupancyType.ts +++ b/handlers/admin-post/doAddOccupancyType.ts @@ -2,17 +2,19 @@ import type { RequestHandler } from "express"; import { addOccupancyType } from "../../helpers/lotOccupancyDB/addOccupancyType.js"; -import { getOccupancyTypes } from "../../helpers/functions.cache.js"; +import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js"; export const handler: RequestHandler = async (request, response) => { const occupancyTypeId = addOccupancyType(request.body, request.session); const occupancyTypes = getOccupancyTypes(); + const allOccupancyTypeFields = getAllOccupancyTypeFields(); response.json({ success: true, occupancyTypeId, - occupancyTypes + occupancyTypes, + allOccupancyTypeFields }); }; diff --git a/handlers/admin-post/doAddOccupancyTypeField.js b/handlers/admin-post/doAddOccupancyTypeField.js index 9fff25b7..81f7bba5 100644 --- a/handlers/admin-post/doAddOccupancyTypeField.js +++ b/handlers/admin-post/doAddOccupancyTypeField.js @@ -1,12 +1,14 @@ import { addOccupancyTypeField } from "../../helpers/lotOccupancyDB/addOccupancyTypeField.js"; -import { getOccupancyTypes } from "../../helpers/functions.cache.js"; +import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js"; export const handler = async (request, response) => { const occupancyTypeFieldId = addOccupancyTypeField(request.body, request.session); const occupancyTypes = getOccupancyTypes(); + const allOccupancyTypeFields = getAllOccupancyTypeFields(); response.json({ success: true, occupancyTypeFieldId, - occupancyTypes + occupancyTypes, + allOccupancyTypeFields }); }; export default handler; diff --git a/handlers/admin-post/doAddOccupancyTypeField.ts b/handlers/admin-post/doAddOccupancyTypeField.ts index 980fbd9a..8d1ee285 100644 --- a/handlers/admin-post/doAddOccupancyTypeField.ts +++ b/handlers/admin-post/doAddOccupancyTypeField.ts @@ -2,17 +2,19 @@ import type { RequestHandler } from "express"; import { addOccupancyTypeField } from "../../helpers/lotOccupancyDB/addOccupancyTypeField.js"; -import { getOccupancyTypes } from "../../helpers/functions.cache.js"; +import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js"; export const handler: RequestHandler = async (request, response) => { const occupancyTypeFieldId = addOccupancyTypeField(request.body, request.session); const occupancyTypes = getOccupancyTypes(); + const allOccupancyTypeFields = getAllOccupancyTypeFields(); response.json({ success: true, occupancyTypeFieldId, - occupancyTypes + occupancyTypes, + allOccupancyTypeFields }); }; diff --git a/handlers/admin-post/doDeleteOccupancyType.js b/handlers/admin-post/doDeleteOccupancyType.js index 5828f947..2d4a23f8 100644 --- a/handlers/admin-post/doDeleteOccupancyType.js +++ b/handlers/admin-post/doDeleteOccupancyType.js @@ -1,11 +1,13 @@ import { deleteOccupancyType } from "../../helpers/lotOccupancyDB/deleteOccupancyType.js"; -import { getOccupancyTypes } from "../../helpers/functions.cache.js"; +import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js"; export const handler = async (request, response) => { const success = deleteOccupancyType(request.body.occupancyTypeId, request.session); const occupancyTypes = getOccupancyTypes(); + const allOccupancyTypeFields = getAllOccupancyTypeFields(); response.json({ success, - occupancyTypes + occupancyTypes, + allOccupancyTypeFields }); }; export default handler; diff --git a/handlers/admin-post/doDeleteOccupancyType.ts b/handlers/admin-post/doDeleteOccupancyType.ts index 5ff491fd..daccdf62 100644 --- a/handlers/admin-post/doDeleteOccupancyType.ts +++ b/handlers/admin-post/doDeleteOccupancyType.ts @@ -2,7 +2,7 @@ import type { RequestHandler } from "express"; import { deleteOccupancyType } from "../../helpers/lotOccupancyDB/deleteOccupancyType.js"; -import { getOccupancyTypes } from "../../helpers/functions.cache.js"; +import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js"; export const handler: RequestHandler = async (request, response) => { const success = deleteOccupancyType( @@ -11,10 +11,12 @@ export const handler: RequestHandler = async (request, response) => { ); const occupancyTypes = getOccupancyTypes(); + const allOccupancyTypeFields = getAllOccupancyTypeFields(); response.json({ success, - occupancyTypes + occupancyTypes, + allOccupancyTypeFields }); }; diff --git a/handlers/admin-post/doDeleteOccupancyTypeField.js b/handlers/admin-post/doDeleteOccupancyTypeField.js index 37cdabd6..8c46a6b1 100644 --- a/handlers/admin-post/doDeleteOccupancyTypeField.js +++ b/handlers/admin-post/doDeleteOccupancyTypeField.js @@ -1,11 +1,13 @@ import { deleteOccupancyTypeField } from "../../helpers/lotOccupancyDB/deleteOccupancyTypeField.js"; -import { getOccupancyTypes } from "../../helpers/functions.cache.js"; +import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js"; export const handler = async (request, response) => { const success = deleteOccupancyTypeField(request.body.occupancyTypeFieldId, request.session); const occupancyTypes = getOccupancyTypes(); + const allOccupancyTypeFields = getAllOccupancyTypeFields(); response.json({ success, - occupancyTypes + occupancyTypes, + allOccupancyTypeFields }); }; export default handler; diff --git a/handlers/admin-post/doDeleteOccupancyTypeField.ts b/handlers/admin-post/doDeleteOccupancyTypeField.ts index b65accaa..8b6c2eee 100644 --- a/handlers/admin-post/doDeleteOccupancyTypeField.ts +++ b/handlers/admin-post/doDeleteOccupancyTypeField.ts @@ -2,7 +2,7 @@ import type { RequestHandler } from "express"; import { deleteOccupancyTypeField } from "../../helpers/lotOccupancyDB/deleteOccupancyTypeField.js"; -import { getOccupancyTypes } from "../../helpers/functions.cache.js"; +import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js"; export const handler: RequestHandler = async (request, response) => { const success = deleteOccupancyTypeField( @@ -11,10 +11,12 @@ export const handler: RequestHandler = async (request, response) => { ); const occupancyTypes = getOccupancyTypes(); + const allOccupancyTypeFields = getAllOccupancyTypeFields(); response.json({ success, - occupancyTypes + occupancyTypes, + allOccupancyTypeFields }); }; diff --git a/handlers/admin-post/doMoveOccupancyTypeDown.js b/handlers/admin-post/doMoveOccupancyTypeDown.js index 380142d3..e5e89d6c 100644 --- a/handlers/admin-post/doMoveOccupancyTypeDown.js +++ b/handlers/admin-post/doMoveOccupancyTypeDown.js @@ -1,11 +1,13 @@ import { moveOccupancyTypeDown } from "../../helpers/lotOccupancyDB/moveOccupancyTypeDown.js"; -import { getOccupancyTypes } from "../../helpers/functions.cache.js"; +import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js"; export const handler = async (request, response) => { const success = moveOccupancyTypeDown(request.body.occupancyTypeId); const occupancyTypes = getOccupancyTypes(); + const allOccupancyTypeFields = getAllOccupancyTypeFields(); response.json({ success, - occupancyTypes + occupancyTypes, + allOccupancyTypeFields }); }; export default handler; diff --git a/handlers/admin-post/doMoveOccupancyTypeDown.ts b/handlers/admin-post/doMoveOccupancyTypeDown.ts index 0e7e42b8..0a67f168 100644 --- a/handlers/admin-post/doMoveOccupancyTypeDown.ts +++ b/handlers/admin-post/doMoveOccupancyTypeDown.ts @@ -2,16 +2,18 @@ import type { RequestHandler } from "express"; import { moveOccupancyTypeDown } from "../../helpers/lotOccupancyDB/moveOccupancyTypeDown.js"; -import { getOccupancyTypes } from "../../helpers/functions.cache.js"; +import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js"; export const handler: RequestHandler = async (request, response) => { const success = moveOccupancyTypeDown(request.body.occupancyTypeId); const occupancyTypes = getOccupancyTypes(); + const allOccupancyTypeFields = getAllOccupancyTypeFields(); response.json({ success, - occupancyTypes + occupancyTypes, + allOccupancyTypeFields }); }; diff --git a/handlers/admin-post/doMoveOccupancyTypeUp.js b/handlers/admin-post/doMoveOccupancyTypeUp.js index 67477308..c8dce3da 100644 --- a/handlers/admin-post/doMoveOccupancyTypeUp.js +++ b/handlers/admin-post/doMoveOccupancyTypeUp.js @@ -1,11 +1,13 @@ import { moveOccupancyTypeUp } from "../../helpers/lotOccupancyDB/moveOccupancyTypeUp.js"; -import { getOccupancyTypes } from "../../helpers/functions.cache.js"; +import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js"; export const handler = async (request, response) => { const success = moveOccupancyTypeUp(request.body.occupancyTypeId); const occupancyTypes = getOccupancyTypes(); + const allOccupancyTypeFields = getAllOccupancyTypeFields(); response.json({ success, - occupancyTypes + occupancyTypes, + allOccupancyTypeFields }); }; export default handler; diff --git a/handlers/admin-post/doMoveOccupancyTypeUp.ts b/handlers/admin-post/doMoveOccupancyTypeUp.ts index 286b14a3..2a399b62 100644 --- a/handlers/admin-post/doMoveOccupancyTypeUp.ts +++ b/handlers/admin-post/doMoveOccupancyTypeUp.ts @@ -2,16 +2,18 @@ import type { RequestHandler } from "express"; import { moveOccupancyTypeUp } from "../../helpers/lotOccupancyDB/moveOccupancyTypeUp.js"; -import { getOccupancyTypes } from "../../helpers/functions.cache.js"; +import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js"; export const handler: RequestHandler = async (request, response) => { const success = moveOccupancyTypeUp(request.body.occupancyTypeId); const occupancyTypes = getOccupancyTypes(); + const allOccupancyTypeFields = getAllOccupancyTypeFields(); response.json({ success, - occupancyTypes + occupancyTypes, + allOccupancyTypeFields }); }; diff --git a/handlers/admin-post/doUpdateOccupancyType.js b/handlers/admin-post/doUpdateOccupancyType.js index 952a3280..e0be48b2 100644 --- a/handlers/admin-post/doUpdateOccupancyType.js +++ b/handlers/admin-post/doUpdateOccupancyType.js @@ -1,11 +1,13 @@ import { updateOccupancyType } from "../../helpers/lotOccupancyDB/updateOccupancyType.js"; -import { getOccupancyTypes } from "../../helpers/functions.cache.js"; +import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js"; export const handler = async (request, response) => { const success = updateOccupancyType(request.body, request.session); const occupancyTypes = getOccupancyTypes(); + const allOccupancyTypeFields = getAllOccupancyTypeFields(); response.json({ success, - occupancyTypes + occupancyTypes, + allOccupancyTypeFields }); }; export default handler; diff --git a/handlers/admin-post/doUpdateOccupancyType.ts b/handlers/admin-post/doUpdateOccupancyType.ts index ee27dd38..c23341de 100644 --- a/handlers/admin-post/doUpdateOccupancyType.ts +++ b/handlers/admin-post/doUpdateOccupancyType.ts @@ -2,16 +2,18 @@ import type { RequestHandler } from "express"; import { updateOccupancyType } from "../../helpers/lotOccupancyDB/updateOccupancyType.js"; -import { getOccupancyTypes } from "../../helpers/functions.cache.js"; +import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js"; export const handler: RequestHandler = async (request, response) => { const success = updateOccupancyType(request.body, request.session); const occupancyTypes = getOccupancyTypes(); + const allOccupancyTypeFields = getAllOccupancyTypeFields(); response.json({ success, - occupancyTypes + occupancyTypes, + allOccupancyTypeFields }); }; diff --git a/handlers/admin-post/doUpdateOccupancyTypeField.js b/handlers/admin-post/doUpdateOccupancyTypeField.js index 2cd41510..e267ea19 100644 --- a/handlers/admin-post/doUpdateOccupancyTypeField.js +++ b/handlers/admin-post/doUpdateOccupancyTypeField.js @@ -1,11 +1,13 @@ import { updateOccupancyTypeField } from "../../helpers/lotOccupancyDB/updateOccupancyTypeField.js"; -import { getOccupancyTypes } from "../../helpers/functions.cache.js"; +import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js"; export const handler = async (request, response) => { const success = updateOccupancyTypeField(request.body, request.session); const occupancyTypes = getOccupancyTypes(); + const allOccupancyTypeFields = getAllOccupancyTypeFields(); response.json({ success, - occupancyTypes + occupancyTypes, + allOccupancyTypeFields }); }; export default handler; diff --git a/handlers/admin-post/doUpdateOccupancyTypeField.ts b/handlers/admin-post/doUpdateOccupancyTypeField.ts index c378f0f4..257c0341 100644 --- a/handlers/admin-post/doUpdateOccupancyTypeField.ts +++ b/handlers/admin-post/doUpdateOccupancyTypeField.ts @@ -2,16 +2,18 @@ import type { RequestHandler } from "express"; import { updateOccupancyTypeField } from "../../helpers/lotOccupancyDB/updateOccupancyTypeField.js"; -import { getOccupancyTypes } from "../../helpers/functions.cache.js"; +import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js"; export const handler: RequestHandler = async (request, response) => { const success = updateOccupancyTypeField(request.body, request.session); const occupancyTypes = getOccupancyTypes(); + const allOccupancyTypeFields = getAllOccupancyTypeFields(); response.json({ success, - occupancyTypes + occupancyTypes, + allOccupancyTypeFields }); }; diff --git a/helpers/functions.cache.d.ts b/helpers/functions.cache.d.ts index 35c30a32..9fb7fa48 100644 --- a/helpers/functions.cache.d.ts +++ b/helpers/functions.cache.d.ts @@ -12,6 +12,7 @@ export declare function getLotTypeById(lotTypeId: number): recordTypes.LotType; export declare function getLotTypesByLotType(lotType: string): recordTypes.LotType; export declare function clearLotTypesCache(): void; export declare function getOccupancyTypes(): recordTypes.OccupancyType[]; +export declare function getAllOccupancyTypeFields(): recordTypes.OccupancyTypeField[]; export declare function getOccupancyTypeById(occupancyTypeId: number): recordTypes.OccupancyType; export declare function getOccupancyTypeByOccupancyType(occupancyTypeString: string): recordTypes.OccupancyType; export declare function clearOccupancyTypesCache(): void; diff --git a/helpers/functions.cache.js b/helpers/functions.cache.js index 740e68d2..d6f2169f 100644 --- a/helpers/functions.cache.js +++ b/helpers/functions.cache.js @@ -2,6 +2,7 @@ import { getLotOccupantTypes as getLotOccupantTypesFromDatabase } from "./lotOcc import { getLotStatuses as getLotStatusesFromDatabase } from "./lotOccupancyDB/getLotStatuses.js"; import { getLotTypes as getLotTypesFromDatabase } from "./lotOccupancyDB/getLotTypes.js"; import { getOccupancyTypes as getOccupancyTypesFromDatabase } from "./lotOccupancyDB/getOccupancyTypes.js"; +import { getOccupancyTypeFields as getOccupancyTypeFieldsFromDatabase } from "./lotOccupancyDB/getOccupancyTypeFields.js"; import { getWorkOrderTypes as getWorkOrderTypesFromDatabase } from "./lotOccupancyDB/getWorkOrderTypes.js"; import { getWorkOrderMilestoneTypes as getWorkOrderMilestoneTypesFromDatabase } from "./lotOccupancyDB/getWorkOrderMilestoneTypes.js"; let lotOccupantTypes; @@ -21,8 +22,7 @@ export function getLotOccupantTypesByLotOccupantType(lotOccupantType) { const cachedLotOccupantTypes = getLotOccupantTypes(); const lotOccupantTypeLowerCase = lotOccupantType.toLowerCase(); return cachedLotOccupantTypes.find((currentLotOccupantType) => { - return (currentLotOccupantType.lotOccupantType.toLowerCase() === - lotOccupantTypeLowerCase); + return currentLotOccupantType.lotOccupantType.toLowerCase() === lotOccupantTypeLowerCase; }); } export function clearLotOccupantTypesCache() { @@ -75,12 +75,19 @@ export function clearLotTypesCache() { lotTypes = undefined; } let occupancyTypes; +let allOccupancyTypeFields; export function getOccupancyTypes() { if (!occupancyTypes) { occupancyTypes = getOccupancyTypesFromDatabase(); } return occupancyTypes; } +export function getAllOccupancyTypeFields() { + if (!allOccupancyTypeFields) { + allOccupancyTypeFields = getOccupancyTypeFieldsFromDatabase(); + } + return allOccupancyTypeFields; +} export function getOccupancyTypeById(occupancyTypeId) { const cachedOccupancyTypes = getOccupancyTypes(); return cachedOccupancyTypes.find((currentOccupancyType) => { @@ -91,12 +98,12 @@ export function getOccupancyTypeByOccupancyType(occupancyTypeString) { const cachedOccupancyTypes = getOccupancyTypes(); const occupancyTypeLowerCase = occupancyTypeString.toLowerCase(); return cachedOccupancyTypes.find((currentOccupancyType) => { - return (currentOccupancyType.occupancyType.toLowerCase() === - occupancyTypeLowerCase); + return currentOccupancyType.occupancyType.toLowerCase() === occupancyTypeLowerCase; }); } export function clearOccupancyTypesCache() { occupancyTypes = undefined; + allOccupancyTypeFields = undefined; } let workOrderTypes; export function getWorkOrderTypes() { diff --git a/helpers/functions.cache.ts b/helpers/functions.cache.ts index 9d3f2960..2f9c89be 100644 --- a/helpers/functions.cache.ts +++ b/helpers/functions.cache.ts @@ -5,6 +5,7 @@ import { getLotStatuses as getLotStatusesFromDatabase } from "./lotOccupancyDB/g import { getLotTypes as getLotTypesFromDatabase } from "./lotOccupancyDB/getLotTypes.js"; import { getOccupancyTypes as getOccupancyTypesFromDatabase } from "./lotOccupancyDB/getOccupancyTypes.js"; +import { getOccupancyTypeFields as getOccupancyTypeFieldsFromDatabase } from "./lotOccupancyDB/getOccupancyTypeFields.js"; import { getWorkOrderTypes as getWorkOrderTypesFromDatabase } from "./lotOccupancyDB/getWorkOrderTypes.js"; @@ -40,10 +41,7 @@ export function getLotOccupantTypesByLotOccupantType(lotOccupantType: string) { const lotOccupantTypeLowerCase = lotOccupantType.toLowerCase(); return cachedLotOccupantTypes.find((currentLotOccupantType) => { - return ( - currentLotOccupantType.lotOccupantType.toLowerCase() === - lotOccupantTypeLowerCase - ); + return currentLotOccupantType.lotOccupantType.toLowerCase() === lotOccupantTypeLowerCase; }); } @@ -128,6 +126,7 @@ export function clearLotTypesCache() { */ let occupancyTypes: recordTypes.OccupancyType[]; +let allOccupancyTypeFields: recordTypes.OccupancyTypeField[]; export function getOccupancyTypes() { if (!occupancyTypes) { @@ -137,6 +136,13 @@ export function getOccupancyTypes() { return occupancyTypes; } +export function getAllOccupancyTypeFields() { + if (!allOccupancyTypeFields) { + allOccupancyTypeFields = getOccupancyTypeFieldsFromDatabase(); + } + return allOccupancyTypeFields; +} + export function getOccupancyTypeById(occupancyTypeId: number) { const cachedOccupancyTypes = getOccupancyTypes(); @@ -151,15 +157,13 @@ export function getOccupancyTypeByOccupancyType(occupancyTypeString: string) { const occupancyTypeLowerCase = occupancyTypeString.toLowerCase(); return cachedOccupancyTypes.find((currentOccupancyType) => { - return ( - currentOccupancyType.occupancyType.toLowerCase() === - occupancyTypeLowerCase - ); + return currentOccupancyType.occupancyType.toLowerCase() === occupancyTypeLowerCase; }); } export function clearOccupancyTypesCache() { occupancyTypes = undefined; + allOccupancyTypeFields = undefined; } /* @@ -194,7 +198,9 @@ export function getWorkOrderMilestoneTypes() { return workOrderMilestoneTypes; } -export function getWorkOrderMilestoneTypeByWorkOrderMilestoneType(workOrderMilestoneTypeString: string) { +export function getWorkOrderMilestoneTypeByWorkOrderMilestoneType( + workOrderMilestoneTypeString: string +) { const cachedWorkOrderMilestoneTypes = getWorkOrderMilestoneTypes(); const workOrderMilestoneTypeLowerCase = workOrderMilestoneTypeString.toLowerCase(); diff --git a/helpers/initializer.database.js b/helpers/initializer.database.js index 5781123f..d964c7a0 100644 --- a/helpers/initializer.database.js +++ b/helpers/initializer.database.js @@ -24,8 +24,7 @@ export const initializeDatabase = () => { ")") .run(); lotOccupancyDB - .prepare("create index if not exists idx_lottypes_ordernumber" + - " on LotTypes (orderNumber, lotType)") + .prepare("create index if not exists idx_lottypes_ordernumber" + " on LotTypes (orderNumber, lotType)") .run(); lotOccupancyDB .prepare("create table if not exists LotTypeFields (" + @@ -56,8 +55,7 @@ export const initializeDatabase = () => { ")") .run(); lotOccupancyDB - .prepare("create index if not exists idx_lotstatuses_ordernumber" + - " on LotStatuses (orderNumber, lotStatus)") + .prepare("create index if not exists idx_lotstatuses_ordernumber" + " on LotStatuses (orderNumber, lotStatus)") .run(); lotOccupancyDB .prepare("create table if not exists Maps (" + @@ -136,7 +134,7 @@ export const initializeDatabase = () => { lotOccupancyDB .prepare("create table if not exists OccupancyTypeFields (" + "occupancyTypeFieldId integer not null primary key autoincrement," + - " occupancyTypeId integer not null," + + " occupancyTypeId integer," + " occupancyTypeField varchar(100) not null," + " occupancyTypeFieldValues text," + " isRequired bit not null default 0," + @@ -257,8 +255,7 @@ export const initializeDatabase = () => { ")") .run(); lotOccupancyDB - .prepare("create index if not exists idx_fees_ordernumber" + - " on Fees (orderNumber, feeName)") + .prepare("create index if not exists idx_fees_ordernumber" + " on Fees (orderNumber, feeName)") .run(); lotOccupancyDB .prepare("create table if not exists LotOccupancyFees (" + diff --git a/helpers/initializer.database.ts b/helpers/initializer.database.ts index 0282e6f2..e2b05ced 100644 --- a/helpers/initializer.database.ts +++ b/helpers/initializer.database.ts @@ -17,9 +17,7 @@ export const initializeDatabase = (): boolean => { const lotOccupancyDB = sqlite(databasePath); const row = lotOccupancyDB - .prepare( - "select name from sqlite_master where type = 'table' and name = 'WorkOrderMilestones'" - ) + .prepare("select name from sqlite_master where type = 'table' and name = 'WorkOrderMilestones'") .get(); if (!row) { @@ -39,10 +37,7 @@ export const initializeDatabase = (): boolean => { .run(); lotOccupancyDB - .prepare( - "create index if not exists idx_lottypes_ordernumber" + - " on LotTypes (orderNumber, lotType)" - ) + .prepare("create index if not exists idx_lottypes_ordernumber" + " on LotTypes (orderNumber, lotType)") .run(); lotOccupancyDB @@ -84,8 +79,7 @@ export const initializeDatabase = (): boolean => { lotOccupancyDB .prepare( - "create index if not exists idx_lotstatuses_ordernumber" + - " on LotStatuses (orderNumber, lotStatus)" + "create index if not exists idx_lotstatuses_ordernumber" + " on LotStatuses (orderNumber, lotStatus)" ) .run(); @@ -192,7 +186,7 @@ export const initializeDatabase = (): boolean => { .prepare( "create table if not exists OccupancyTypeFields (" + "occupancyTypeFieldId integer not null primary key autoincrement," + - " occupancyTypeId integer not null," + + " occupancyTypeId integer," + " occupancyTypeField varchar(100) not null," + " occupancyTypeFieldValues text," + " isRequired bit not null default 0," + @@ -347,10 +341,7 @@ export const initializeDatabase = (): boolean => { .run(); lotOccupancyDB - .prepare( - "create index if not exists idx_fees_ordernumber" + - " on Fees (orderNumber, feeName)" - ) + .prepare("create index if not exists idx_fees_ordernumber" + " on Fees (orderNumber, feeName)") .run(); lotOccupancyDB diff --git a/helpers/lotOccupancyDB/addOccupancyTypeField.d.ts b/helpers/lotOccupancyDB/addOccupancyTypeField.d.ts index 11381a1a..5411fd7c 100644 --- a/helpers/lotOccupancyDB/addOccupancyTypeField.d.ts +++ b/helpers/lotOccupancyDB/addOccupancyTypeField.d.ts @@ -1,6 +1,6 @@ import type * as recordTypes from "../../types/recordTypes"; interface AddOccupancyTypeFieldForm { - occupancyTypeId: string | number; + occupancyTypeId?: string | number; occupancyTypeField: string; occupancyTypeFieldValues?: string; isRequired?: string; diff --git a/helpers/lotOccupancyDB/addOccupancyTypeField.js b/helpers/lotOccupancyDB/addOccupancyTypeField.js index 73116ee9..7ee98ff5 100644 --- a/helpers/lotOccupancyDB/addOccupancyTypeField.js +++ b/helpers/lotOccupancyDB/addOccupancyTypeField.js @@ -13,7 +13,7 @@ export const addOccupancyTypeField = (occupancyTypeFieldForm, requestSession) => " recordCreate_userName, recordCreate_timeMillis," + " recordUpdate_userName, recordUpdate_timeMillis)" + " values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") - .run(occupancyTypeFieldForm.occupancyTypeId, occupancyTypeFieldForm.occupancyTypeField, occupancyTypeFieldForm.occupancyTypeFieldValues || "", occupancyTypeFieldForm.isRequired ? 1 : 0, occupancyTypeFieldForm.pattern || "", occupancyTypeFieldForm.minimumLength || 0, occupancyTypeFieldForm.maximumLength || 100, occupancyTypeFieldForm.orderNumber || -1, requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis); + .run(occupancyTypeFieldForm.occupancyTypeId || undefined, occupancyTypeFieldForm.occupancyTypeField, occupancyTypeFieldForm.occupancyTypeFieldValues || "", occupancyTypeFieldForm.isRequired ? 1 : 0, occupancyTypeFieldForm.pattern || "", occupancyTypeFieldForm.minimumLength || 0, occupancyTypeFieldForm.maximumLength || 100, occupancyTypeFieldForm.orderNumber || -1, requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis); database.close(); clearOccupancyTypesCache(); return result.lastInsertRowid; diff --git a/helpers/lotOccupancyDB/addOccupancyTypeField.ts b/helpers/lotOccupancyDB/addOccupancyTypeField.ts index 52ebb036..f50e5815 100644 --- a/helpers/lotOccupancyDB/addOccupancyTypeField.ts +++ b/helpers/lotOccupancyDB/addOccupancyTypeField.ts @@ -6,7 +6,7 @@ import type * as recordTypes from "../../types/recordTypes"; import { clearOccupancyTypesCache } from "../functions.cache.js"; interface AddOccupancyTypeFieldForm { - occupancyTypeId: string | number; + occupancyTypeId?: string | number; occupancyTypeField: string; occupancyTypeFieldValues?: string; isRequired?: string; @@ -36,7 +36,7 @@ export const addOccupancyTypeField = ( " values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" ) .run( - occupancyTypeFieldForm.occupancyTypeId, + occupancyTypeFieldForm.occupancyTypeId || undefined, occupancyTypeFieldForm.occupancyTypeField, occupancyTypeFieldForm.occupancyTypeFieldValues || "", occupancyTypeFieldForm.isRequired ? 1 : 0, diff --git a/helpers/lotOccupancyDB/getLotOccupancyFields.js b/helpers/lotOccupancyDB/getLotOccupancyFields.js index 30c635f7..b4f40a08 100644 --- a/helpers/lotOccupancyDB/getLotOccupancyFields.js +++ b/helpers/lotOccupancyDB/getLotOccupancyFields.js @@ -23,7 +23,7 @@ export const getLotOccupancyFields = (lotOccupancyId, connectedDatabase) => { " f.orderNumber" + " from OccupancyTypeFields f" + " where f.recordDelete_timeMillis is null" + - " and f.occupancyTypeId in (select occupancyTypeId from LotOccupancies where lotOccupancyId = ?)" + + " and (f.occupancyTypeId is null or f.occupancyTypeId in (select occupancyTypeId from LotOccupancies where lotOccupancyId = ?))" + " and f.occupancyTypeFieldId not in (select occupancyTypeFieldId from LotOccupancyFields where lotOccupancyId = ? and recordDelete_timeMillis is null)" + " order by orderNumber, occupancyTypeField") .all(lotOccupancyId, lotOccupancyId, lotOccupancyId, lotOccupancyId); diff --git a/helpers/lotOccupancyDB/getLotOccupancyFields.ts b/helpers/lotOccupancyDB/getLotOccupancyFields.ts index 92785166..f3263f9e 100644 --- a/helpers/lotOccupancyDB/getLotOccupancyFields.ts +++ b/helpers/lotOccupancyDB/getLotOccupancyFields.ts @@ -33,7 +33,7 @@ export const getLotOccupancyFields = ( " f.orderNumber" + " from OccupancyTypeFields f" + " where f.recordDelete_timeMillis is null" + - " and f.occupancyTypeId in (select occupancyTypeId from LotOccupancies where lotOccupancyId = ?)" + + " and (f.occupancyTypeId is null or f.occupancyTypeId in (select occupancyTypeId from LotOccupancies where lotOccupancyId = ?))" + " and f.occupancyTypeFieldId not in (select occupancyTypeFieldId from LotOccupancyFields where lotOccupancyId = ? and recordDelete_timeMillis is null)" + " order by orderNumber, occupancyTypeField" ) diff --git a/helpers/lotOccupancyDB/getOccupancyTypeFields.d.ts b/helpers/lotOccupancyDB/getOccupancyTypeFields.d.ts new file mode 100644 index 00000000..1a709597 --- /dev/null +++ b/helpers/lotOccupancyDB/getOccupancyTypeFields.d.ts @@ -0,0 +1,4 @@ +import sqlite from "better-sqlite3"; +import type * as recordTypes from "../../types/recordTypes"; +export declare const getOccupancyTypeFields: (occupancyTypeId?: number, connectedDatabase?: sqlite.Database) => recordTypes.OccupancyTypeField[]; +export default getOccupancyTypeFields; diff --git a/helpers/lotOccupancyDB/getOccupancyTypeFields.js b/helpers/lotOccupancyDB/getOccupancyTypeFields.js new file mode 100644 index 00000000..d5c20434 --- /dev/null +++ b/helpers/lotOccupancyDB/getOccupancyTypeFields.js @@ -0,0 +1,36 @@ +import sqlite from "better-sqlite3"; +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +export const getOccupancyTypeFields = (occupancyTypeId, connectedDatabase) => { + const database = connectedDatabase || sqlite(databasePath); + const sqlParameters = []; + if (occupancyTypeId) { + sqlParameters.push(occupancyTypeId); + } + const occupancyTypeFields = database + .prepare("select occupancyTypeFieldId," + + " occupancyTypeField, occupancyTypeFieldValues, isRequired, pattern," + + " minimumLength, maximumLength," + + " orderNumber" + + " from OccupancyTypeFields" + + " where recordDelete_timeMillis is null" + + (occupancyTypeId ? " and occupancyTypeId = ?" : " and occupancyTypeId is null") + + " order by orderNumber, occupancyTypeField") + .all(sqlParameters); + let expectedFieldOrderNumber = -1; + for (const occupancyTypeField of occupancyTypeFields) { + expectedFieldOrderNumber += 1; + if (occupancyTypeField.orderNumber !== expectedFieldOrderNumber) { + database + .prepare("update OccupancyTypeFields" + + " set orderNumber = ?" + + " where occupancyTypeFieldId = ?") + .run(expectedFieldOrderNumber, occupancyTypeField.occupancyTypeFieldId); + occupancyTypeField.orderNumber = expectedFieldOrderNumber; + } + } + if (!connectedDatabase) { + database.close(); + } + return occupancyTypeFields; +}; +export default getOccupancyTypeFields; diff --git a/helpers/lotOccupancyDB/getOccupancyTypeFields.ts b/helpers/lotOccupancyDB/getOccupancyTypeFields.ts new file mode 100644 index 00000000..04895b5d --- /dev/null +++ b/helpers/lotOccupancyDB/getOccupancyTypeFields.ts @@ -0,0 +1,57 @@ +import sqlite from "better-sqlite3"; + +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; + +import type * as recordTypes from "../../types/recordTypes"; + +export const getOccupancyTypeFields = ( + occupancyTypeId?: number, + connectedDatabase?: sqlite.Database +): recordTypes.OccupancyTypeField[] => { + const database = connectedDatabase || sqlite(databasePath); + + const sqlParameters = []; + + if (occupancyTypeId) { + sqlParameters.push(occupancyTypeId); + } + + const occupancyTypeFields: recordTypes.OccupancyTypeField[] = database + .prepare( + "select occupancyTypeFieldId," + + " occupancyTypeField, occupancyTypeFieldValues, isRequired, pattern," + + " minimumLength, maximumLength," + + " orderNumber" + + " from OccupancyTypeFields" + + " where recordDelete_timeMillis is null" + + (occupancyTypeId ? " and occupancyTypeId = ?" : " and occupancyTypeId is null") + + " order by orderNumber, occupancyTypeField" + ) + .all(sqlParameters); + + let expectedFieldOrderNumber = -1; + + for (const occupancyTypeField of occupancyTypeFields) { + expectedFieldOrderNumber += 1; + + if (occupancyTypeField.orderNumber !== expectedFieldOrderNumber) { + database + .prepare( + "update OccupancyTypeFields" + + " set orderNumber = ?" + + " where occupancyTypeFieldId = ?" + ) + .run(expectedFieldOrderNumber, occupancyTypeField.occupancyTypeFieldId); + + occupancyTypeField.orderNumber = expectedFieldOrderNumber; + } + } + + if (!connectedDatabase) { + database.close(); + } + + return occupancyTypeFields; +}; + +export default getOccupancyTypeFields; diff --git a/helpers/lotOccupancyDB/getOccupancyTypes.js b/helpers/lotOccupancyDB/getOccupancyTypes.js index 7fd001ea..37b9225a 100644 --- a/helpers/lotOccupancyDB/getOccupancyTypes.js +++ b/helpers/lotOccupancyDB/getOccupancyTypes.js @@ -1,5 +1,6 @@ import sqlite from "better-sqlite3"; import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { getOccupancyTypeFields } from "./getOccupancyTypeFields.js"; export const getOccupancyTypes = () => { const database = sqlite(databasePath); const occupancyTypes = database @@ -13,22 +14,11 @@ export const getOccupancyTypes = () => { expectedTypeOrderNumber += 1; if (occupancyType.orderNumber !== expectedTypeOrderNumber) { database - .prepare("update OccupancyTypes" + - " set orderNumber = ?" + - " where occupancyTypeId = ?") + .prepare("update OccupancyTypes" + " set orderNumber = ?" + " where occupancyTypeId = ?") .run(expectedTypeOrderNumber, occupancyType.occupancyTypeId); occupancyType.orderNumber = expectedTypeOrderNumber; } - occupancyType.occupancyTypeFields = database - .prepare("select occupancyTypeFieldId," + - " occupancyTypeField, occupancyTypeFieldValues, isRequired, pattern," + - " minimumLength, maximumLength," + - " orderNumber" + - " from OccupancyTypeFields" + - " where recordDelete_timeMillis is null" + - " and occupancyTypeId = ?" + - " order by orderNumber, occupancyTypeField") - .all(occupancyType.occupancyTypeId); + occupancyType.occupancyTypeFields = getOccupancyTypeFields(occupancyType.occupancyTypeId, database); let expectedFieldOrderNumber = -1; for (const occupancyTypeField of occupancyType.occupancyTypeFields) { expectedFieldOrderNumber += 1; diff --git a/helpers/lotOccupancyDB/getOccupancyTypes.ts b/helpers/lotOccupancyDB/getOccupancyTypes.ts index 24df53c5..7362e237 100644 --- a/helpers/lotOccupancyDB/getOccupancyTypes.ts +++ b/helpers/lotOccupancyDB/getOccupancyTypes.ts @@ -2,6 +2,8 @@ import sqlite from "better-sqlite3"; import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { getOccupancyTypeFields } from "./getOccupancyTypeFields.js"; + import type * as recordTypes from "../../types/recordTypes"; export const getOccupancyTypes = (): recordTypes.OccupancyType[] => { @@ -24,27 +26,17 @@ export const getOccupancyTypes = (): recordTypes.OccupancyType[] => { if (occupancyType.orderNumber !== expectedTypeOrderNumber) { database .prepare( - "update OccupancyTypes" + - " set orderNumber = ?" + - " where occupancyTypeId = ?" + "update OccupancyTypes" + " set orderNumber = ?" + " where occupancyTypeId = ?" ) .run(expectedTypeOrderNumber, occupancyType.occupancyTypeId); occupancyType.orderNumber = expectedTypeOrderNumber; } - occupancyType.occupancyTypeFields = database - .prepare( - "select occupancyTypeFieldId," + - " occupancyTypeField, occupancyTypeFieldValues, isRequired, pattern," + - " minimumLength, maximumLength," + - " orderNumber" + - " from OccupancyTypeFields" + - " where recordDelete_timeMillis is null" + - " and occupancyTypeId = ?" + - " order by orderNumber, occupancyTypeField" - ) - .all(occupancyType.occupancyTypeId); + occupancyType.occupancyTypeFields = getOccupancyTypeFields( + occupancyType.occupancyTypeId, + database + ); let expectedFieldOrderNumber = -1; @@ -58,10 +50,7 @@ export const getOccupancyTypes = (): recordTypes.OccupancyType[] => { " set orderNumber = ?" + " where occupancyTypeFieldId = ?" ) - .run( - expectedFieldOrderNumber, - occupancyTypeField.occupancyTypeFieldId - ); + .run(expectedFieldOrderNumber, occupancyTypeField.occupancyTypeFieldId); occupancyTypeField.orderNumber = expectedFieldOrderNumber; } diff --git a/public-typescript/adminOccupancyTypes.js b/public-typescript/adminOccupancyTypes.js index f83e78d8..fef0ea73 100644 --- a/public-typescript/adminOccupancyTypes.js +++ b/public-typescript/adminOccupancyTypes.js @@ -6,6 +6,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); const containerElement = document.querySelector("#container--occupancyTypes"); let occupancyTypes = exports.occupancyTypes; delete exports.occupancyTypes; + let allOccupancyTypeFields = exports.allOccupancyTypeFields; + delete exports.allOccupancyTypeFields; const expandedOccupancyTypes = new Set(); const toggleOccupancyTypeFields = (clickEvent) => { const toggleButtonElement = clickEvent.currentTarget; @@ -25,26 +27,26 @@ Object.defineProperty(exports, "__esModule", { value: true }); panelBlockElement.classList.toggle("is-hidden"); } }; + const occupancyTypeResponseHandler = (responseJSON) => { + if (responseJSON.success) { + occupancyTypes = responseJSON.occupancyTypes; + allOccupancyTypeFields = responseJSON.allOccupancyTypeFields; + renderOccupancyTypes(); + } + else { + bulmaJS.alert({ + title: "Error Updating " + exports.aliases.occupancy + " Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }; const deleteOccupancyType = (clickEvent) => { const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId, 10); const doDelete = () => { cityssm.postJSON(urlPrefix + "/admin/doDeleteOccupancyType", { occupancyTypeId - }, (responseJSON) => { - if (responseJSON.success) { - occupancyTypes = responseJSON.occupancyTypes; - renderOccupancyTypes(); - } - else { - bulmaJS.alert({ - title: "Error Deleting " + - exports.aliases.occupancy + - " Type", - message: responseJSON.errorMessage, - contextualColorName: "danger" - }); - } - }); + }, occupancyTypeResponseHandler); }; bulmaJS.confirm({ title: "Delete " + exports.aliases.occupancy + " Type", @@ -67,19 +69,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); const doEdit = (submitEvent) => { submitEvent.preventDefault(); cityssm.postJSON(urlPrefix + "/admin/doUpdateOccupancyType", submitEvent.currentTarget, (responseJSON) => { + occupancyTypeResponseHandler(responseJSON); if (responseJSON.success) { editCloseModalFunction(); - occupancyTypes = responseJSON.occupancyTypes; - renderOccupancyTypes(); - } - else { - bulmaJS.alert({ - title: "Error Updating " + - exports.aliases.occupancy + - " Type", - message: responseJSON.errorMessage, - contextualColorName: "danger" - }); } }); }; @@ -92,9 +84,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); onshown: (modalElement, closeModalFunction) => { editCloseModalFunction = closeModalFunction; modalElement.querySelector("#occupancyTypeEdit--occupancyType").focus(); - modalElement - .querySelector("form") - .addEventListener("submit", doEdit); + modalElement.querySelector("form").addEventListener("submit", doEdit); bulmaJS.toggleHtmlClipped(); }, onremoved: () => { @@ -108,33 +98,25 @@ Object.defineProperty(exports, "__esModule", { value: true }); const doAdd = (submitEvent) => { submitEvent.preventDefault(); cityssm.postJSON(urlPrefix + "/admin/doAddOccupancyTypeField", submitEvent.currentTarget, (responseJSON) => { + expandedOccupancyTypes.add(occupancyTypeId); + occupancyTypeResponseHandler(responseJSON); if (responseJSON.success) { - expandedOccupancyTypes.add(occupancyTypeId); addCloseModalFunction(); - occupancyTypes = responseJSON.occupancyTypes; - renderOccupancyTypes(); openEditOccupancyTypeField(occupancyTypeId, responseJSON.occupancyTypeFieldId); } - else { - bulmaJS.alert({ - title: "Error Adding Field", - message: responseJSON.errorMessage, - contextualColorName: "danger" - }); - } }); }; cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyTypeField", { onshow: (modalElement) => { los.populateAliases(modalElement); - modalElement.querySelector("#occupancyTypeFieldAdd--occupancyTypeId").value = occupancyTypeId.toString(); + if (occupancyTypeId) { + modalElement.querySelector("#occupancyTypeFieldAdd--occupancyTypeId").value = occupancyTypeId.toString(); + } }, onshown: (modalElement, closeModalFunction) => { addCloseModalFunction = closeModalFunction; modalElement.querySelector("#occupancyTypeFieldAdd--occupancyTypeField").focus(); - modalElement - .querySelector("form") - .addEventListener("submit", doAdd); + modalElement.querySelector("form").addEventListener("submit", doAdd); bulmaJS.toggleHtmlClipped(); }, onremoved: () => { @@ -147,51 +129,30 @@ Object.defineProperty(exports, "__esModule", { value: true }); const occupancyTypeId = clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId; cityssm.postJSON(urlPrefix + "/admin/doMoveOccupancyTypeUp", { occupancyTypeId - }, (responseJSON) => { - if (responseJSON.success) { - occupancyTypes = responseJSON.occupancyTypes; - renderOccupancyTypes(); - } - else { - bulmaJS.alert({ - title: "Error Moving " + - exports.aliases.occupancy + - " Type", - message: responseJSON.errorMessage, - contextualColorName: "danger" - }); - } - }); + }, occupancyTypeResponseHandler); }; const moveOccupancyTypeDown = (clickEvent) => { clickEvent.preventDefault(); const occupancyTypeId = clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId; cityssm.postJSON(urlPrefix + "/admin/doMoveOccupancyTypeDown", { occupancyTypeId - }, (responseJSON) => { - if (responseJSON.success) { - occupancyTypes = responseJSON.occupancyTypes; - renderOccupancyTypes(); - } - else { - bulmaJS.alert({ - title: "Error Moving " + - exports.aliases.occupancy + - " Type", - message: responseJSON.errorMessage, - contextualColorName: "danger" - }); - } - }); + }, occupancyTypeResponseHandler); }; const openEditOccupancyTypeField = (occupancyTypeId, occupancyTypeFieldId) => { - const occupancyType = occupancyTypes.find((currentOccupancyType) => { - return currentOccupancyType.occupancyTypeId === occupancyTypeId; - }); - const occupancyTypeField = occupancyType.occupancyTypeFields.find((currentOccupancyTypeField) => { - return (currentOccupancyTypeField.occupancyTypeFieldId === - occupancyTypeFieldId); - }); + let occupancyTypeField; + if (occupancyTypeId) { + const occupancyType = occupancyTypes.find((currentOccupancyType) => { + return currentOccupancyType.occupancyTypeId === occupancyTypeId; + }); + occupancyTypeField = occupancyType.occupancyTypeFields.find((currentOccupancyTypeField) => { + return currentOccupancyTypeField.occupancyTypeFieldId === occupancyTypeFieldId; + }); + } + else { + occupancyTypeField = allOccupancyTypeFields.find((currentOccupancyTypeField) => { + return currentOccupancyTypeField.occupancyTypeFieldId === occupancyTypeFieldId; + }); + } let minimumLengthElement; let maximumLengthElement; let patternElement; @@ -215,17 +176,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); const doUpdate = (submitEvent) => { submitEvent.preventDefault(); cityssm.postJSON(urlPrefix + "/admin/doUpdateOccupancyTypeField", submitEvent.currentTarget, (responseJSON) => { + occupancyTypeResponseHandler(responseJSON); if (responseJSON.success) { - occupancyTypes = responseJSON.occupancyTypes; editCloseModalFunction(); - renderOccupancyTypes(); - } - else { - bulmaJS.alert({ - title: "Error Updating Field", - message: responseJSON.errorMessage, - contextualColorName: "danger" - }); } }); }; @@ -234,17 +187,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); cityssm.postJSON(urlPrefix + "/admin/doDeleteOccupancyTypeField", { occupancyTypeFieldId }, (responseJSON) => { + occupancyTypeResponseHandler(responseJSON); if (responseJSON.success) { - occupancyTypes = responseJSON.occupancyTypes; editCloseModalFunction(); - renderOccupancyTypes(); - } - else { - bulmaJS.alert({ - title: "Error Deleting Field", - message: responseJSON.errorMessage, - contextualColorName: "danger" - }); } }); }; @@ -265,16 +210,13 @@ Object.defineProperty(exports, "__esModule", { value: true }); modalElement.querySelector("#occupancyTypeFieldEdit--occupancyTypeField").value = occupancyTypeField.occupancyTypeField; modalElement.querySelector("#occupancyTypeFieldEdit--isRequired").value = occupancyTypeField.isRequired ? "1" : "0"; minimumLengthElement = modalElement.querySelector("#occupancyTypeFieldEdit--minimumLength"); - minimumLengthElement.value = - occupancyTypeField.minimumLength.toString(); + minimumLengthElement.value = occupancyTypeField.minimumLength.toString(); maximumLengthElement = modalElement.querySelector("#occupancyTypeFieldEdit--maximumLength"); - maximumLengthElement.value = - occupancyTypeField.maximumLength.toString(); + maximumLengthElement.value = occupancyTypeField.maximumLength.toString(); patternElement = modalElement.querySelector("#occupancyTypeFieldEdit--pattern"); patternElement.value = occupancyTypeField.pattern; occupancyTypeFieldValuesElement = modalElement.querySelector("#occupancyTypeFieldEdit--occupancyTypeFieldValues"); - occupancyTypeFieldValuesElement.value = - occupancyTypeField.occupancyTypeFieldValues; + occupancyTypeFieldValuesElement.value = occupancyTypeField.occupancyTypeFieldValues; toggleInputFields(); }, onshown: (modalElement, closeModalFunction) => { @@ -282,9 +224,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); bulmaJS.init(modalElement); bulmaJS.toggleHtmlClipped(); cityssm.enableNavBlocker(); - modalElement - .querySelector("form") - .addEventListener("submit", doUpdate); + modalElement.querySelector("form").addEventListener("submit", doUpdate); minimumLengthElement.addEventListener("keyup", updateMaximumLengthMin); updateMaximumLengthMin(); occupancyTypeFieldValuesElement.addEventListener("keyup", toggleInputFields); @@ -304,17 +244,91 @@ Object.defineProperty(exports, "__esModule", { value: true }); const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId, 10); openEditOccupancyTypeField(occupancyTypeId, occupancyTypeFieldId); }; + const renderOccupancyTypeFields = (panelElement, occupancyTypeId, occupancyTypeFields) => { + if (occupancyTypeFields.length === 0) { + panelElement.insertAdjacentHTML("beforeend", '
' + + '
' + + '

There are no additional fields.

' + + "
" + + "
"); + } + else { + for (const occupancyTypeField of occupancyTypeFields) { + const panelBlockElement = document.createElement("div"); + panelBlockElement.className = "panel-block is-block container--occupancyTypeField"; + if (occupancyTypeId && !expandedOccupancyTypes.has(occupancyTypeId)) { + panelBlockElement.classList.add("is-hidden"); + } + panelBlockElement.dataset.occupancyTypeFieldId = + occupancyTypeField.occupancyTypeFieldId.toString(); + panelBlockElement.innerHTML = + '
' + + '
' + + ('") + + "
" + + '
' + + ('
' + + '
' + + '
' + + '" + + "
" + + '
' + + '" + + "
" + + "
" + + "
") + + "
" + + "
"; + panelBlockElement + .querySelector(".button--editOccupancyTypeField") + .addEventListener("click", openEditOccupancyTypeFieldByClick); + panelElement.append(panelBlockElement); + } + } + }; const renderOccupancyTypes = () => { + containerElement.innerHTML = + '
' + + '
' + + ('
' + + ('
' + + '

(All Occupancy Types)

' + + "
") + + ('
' + + ('
' + + '" + + "
") + + "
") + + "
") + + "
" + + "
"; + renderOccupancyTypeFields(containerElement.querySelector("#container--allOccupancyTypeFields"), undefined, allOccupancyTypeFields); + containerElement + .querySelector(".button--addOccupancyTypeField") + .addEventListener("click", openAddOccupancyTypeField); if (occupancyTypes.length === 0) { - containerElement.innerHTML = - '
There are no active ' + - exports.aliases.occupancy.toLowerCase() + - " types.

" + - "
"; + containerElement.insertAdjacentHTML("afterbegin", '
There are no active ' + + exports.aliases.occupancy.toLowerCase() + + " types.

" + + "
"); return; } - containerElement.innerHTML = ""; for (const occupancyType of occupancyTypes) { const occupancyTypeContainer = document.createElement("div"); occupancyTypeContainer.className = "panel container--occupancyType"; @@ -375,59 +389,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); "") + "" + ""; - if (occupancyType.occupancyTypeFields.length === 0) { - occupancyTypeContainer.insertAdjacentHTML("beforeend", '
' + - '
' + - '

There are no additional fields.

' + - "
" + - "
"); - } - else { - for (const occupancyTypeField of occupancyType.occupancyTypeFields) { - const panelBlockElement = document.createElement("div"); - panelBlockElement.className = - "panel-block is-block container--occupancyTypeField"; - if (!expandedOccupancyTypes.has(occupancyType.occupancyTypeId)) { - panelBlockElement.classList.add("is-hidden"); - } - panelBlockElement.dataset.occupancyTypeFieldId = - occupancyTypeField.occupancyTypeFieldId.toString(); - panelBlockElement.innerHTML = - '
' + - '
' + - ('") + - "
" + - '
' + - ('
' + - '
' + - '
' + - '" + - "
" + - '
' + - '" + - "
" + - "
" + - "
") + - "
" + - "
"; - panelBlockElement - .querySelector(".button--editOccupancyTypeField") - .addEventListener("click", openEditOccupancyTypeFieldByClick); - occupancyTypeContainer.append(panelBlockElement); - } - } + renderOccupancyTypeFields(occupancyTypeContainer, occupancyType.occupancyTypeId, occupancyType.occupancyTypeFields); occupancyTypeContainer .querySelector(".button--toggleOccupancyTypeFields") .addEventListener("click", toggleOccupancyTypeFields); @@ -449,9 +411,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); containerElement.append(occupancyTypeContainer); } }; - document - .querySelector("#button--addOccupancyType") - .addEventListener("click", () => { + document.querySelector("#button--addOccupancyType").addEventListener("click", () => { let addCloseModalFunction; const doAdd = (submitEvent) => { submitEvent.preventDefault(); @@ -463,9 +423,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Adding " + - exports.aliases.occupancy + - " Type", + title: "Error Adding " + exports.aliases.occupancy + " Type", message: responseJSON.errorMessage, contextualColorName: "danger" }); @@ -479,9 +437,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); onshown: (modalElement, closeModalFunction) => { addCloseModalFunction = closeModalFunction; modalElement.querySelector("#occupancyTypeAdd--occupancyType").focus(); - modalElement - .querySelector("form") - .addEventListener("submit", doAdd); + modalElement.querySelector("form").addEventListener("submit", doAdd); bulmaJS.toggleHtmlClipped(); }, onremoved: () => { diff --git a/public-typescript/adminOccupancyTypes.ts b/public-typescript/adminOccupancyTypes.ts index f4a1e3d2..56e9c407 100644 --- a/public-typescript/adminOccupancyTypes.ts +++ b/public-typescript/adminOccupancyTypes.ts @@ -15,27 +15,24 @@ declare const bulmaJS: BulmaJS; const urlPrefix = document.querySelector("main").dataset.urlPrefix; - const containerElement = document.querySelector( - "#container--occupancyTypes" - ) as HTMLElement; + const containerElement = document.querySelector("#container--occupancyTypes") as HTMLElement; let occupancyTypes: recordTypes.OccupancyType[] = exports.occupancyTypes; delete exports.occupancyTypes; + let allOccupancyTypeFields: recordTypes.OccupancyTypeField[] = exports.allOccupancyTypeFields; + delete exports.allOccupancyTypeFields; + const expandedOccupancyTypes = new Set(); const toggleOccupancyTypeFields = (clickEvent: Event) => { - const toggleButtonElement = - clickEvent.currentTarget as HTMLButtonElement; + const toggleButtonElement = clickEvent.currentTarget as HTMLButtonElement; const occupancyTypeElement = toggleButtonElement.closest( ".container--occupancyType" ) as HTMLElement; - const occupancyTypeId = Number.parseInt( - occupancyTypeElement.dataset.occupancyTypeId, - 10 - ); + const occupancyTypeId = Number.parseInt(occupancyTypeElement.dataset.occupancyTypeId, 10); if (expandedOccupancyTypes.has(occupancyTypeId)) { expandedOccupancyTypes.delete(occupancyTypeId); @@ -43,20 +40,36 @@ declare const bulmaJS: BulmaJS; expandedOccupancyTypes.add(occupancyTypeId); } - toggleButtonElement.innerHTML = expandedOccupancyTypes.has( - occupancyTypeId - ) + toggleButtonElement.innerHTML = expandedOccupancyTypes.has(occupancyTypeId) ? '' : ''; - const panelBlockElements = - occupancyTypeElement.querySelectorAll(".panel-block"); + const panelBlockElements = occupancyTypeElement.querySelectorAll(".panel-block"); for (const panelBlockElement of panelBlockElements) { panelBlockElement.classList.toggle("is-hidden"); } }; + const occupancyTypeResponseHandler = (responseJSON: { + success: boolean; + errorMessage?: string; + occupancyTypes?: recordTypes.OccupancyType[]; + allOccupancyTypeFields?: recordTypes.OccupancyTypeField[]; + }) => { + if (responseJSON.success) { + occupancyTypes = responseJSON.occupancyTypes; + allOccupancyTypeFields = responseJSON.allOccupancyTypeFields; + renderOccupancyTypes(); + } else { + bulmaJS.alert({ + title: "Error Updating " + exports.aliases.occupancy + " Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }; + const deleteOccupancyType = (clickEvent: Event) => { const occupancyTypeId = Number.parseInt( ( @@ -73,25 +86,7 @@ declare const bulmaJS: BulmaJS; { occupancyTypeId }, - (responseJSON: { - success: boolean; - errorMessage?: string; - occupancyTypes?: recordTypes.OccupancyType[]; - }) => { - if (responseJSON.success) { - occupancyTypes = responseJSON.occupancyTypes; - renderOccupancyTypes(); - } else { - bulmaJS.alert({ - title: - "Error Deleting " + - exports.aliases.occupancy + - " Type", - message: responseJSON.errorMessage, - contextualColorName: "danger" - }); - } - } + occupancyTypeResponseHandler ); }; @@ -135,20 +130,11 @@ declare const bulmaJS: BulmaJS; success: boolean; errorMessage?: string; occupancyTypes?: recordTypes.OccupancyType[]; + allOccupancyTypeFields?: recordTypes.OccupancyTypeField[]; }) => { + occupancyTypeResponseHandler(responseJSON); if (responseJSON.success) { editCloseModalFunction(); - occupancyTypes = responseJSON.occupancyTypes; - renderOccupancyTypes(); - } else { - bulmaJS.alert({ - title: - "Error Updating " + - exports.aliases.occupancy + - " Type", - message: responseJSON.errorMessage, - contextualColorName: "danger" - }); } } ); @@ -179,9 +165,7 @@ declare const bulmaJS: BulmaJS; ) as HTMLInputElement ).focus(); - modalElement - .querySelector("form") - .addEventListener("submit", doEdit); + modalElement.querySelector("form").addEventListener("submit", doEdit); bulmaJS.toggleHtmlClipped(); }, @@ -213,25 +197,18 @@ declare const bulmaJS: BulmaJS; success: boolean; errorMessage?: string; occupancyTypes?: recordTypes.OccupancyType[]; + allOccupancyTypeFields?: recordTypes.OccupancyTypeField[]; occupancyTypeFieldId?: number; }) => { + expandedOccupancyTypes.add(occupancyTypeId); + occupancyTypeResponseHandler(responseJSON); + if (responseJSON.success) { - expandedOccupancyTypes.add(occupancyTypeId); - addCloseModalFunction(); - occupancyTypes = responseJSON.occupancyTypes; - renderOccupancyTypes(); - openEditOccupancyTypeField( occupancyTypeId, responseJSON.occupancyTypeFieldId ); - } else { - bulmaJS.alert({ - title: "Error Adding Field", - message: responseJSON.errorMessage, - contextualColorName: "danger" - }); } } ); @@ -241,11 +218,13 @@ declare const bulmaJS: BulmaJS; onshow: (modalElement) => { los.populateAliases(modalElement); - ( - modalElement.querySelector( - "#occupancyTypeFieldAdd--occupancyTypeId" - ) as HTMLInputElement - ).value = occupancyTypeId.toString(); + if (occupancyTypeId) { + ( + modalElement.querySelector( + "#occupancyTypeFieldAdd--occupancyTypeId" + ) as HTMLInputElement + ).value = occupancyTypeId.toString(); + } }, onshown: (modalElement, closeModalFunction) => { addCloseModalFunction = closeModalFunction; @@ -256,9 +235,7 @@ declare const bulmaJS: BulmaJS; ) as HTMLInputElement ).focus(); - modalElement - .querySelector("form") - .addEventListener("submit", doAdd); + modalElement.querySelector("form").addEventListener("submit", doAdd); bulmaJS.toggleHtmlClipped(); }, @@ -282,25 +259,7 @@ declare const bulmaJS: BulmaJS; { occupancyTypeId }, - (responseJSON: { - success: boolean; - errorMessage?: string; - occupancyTypes?: recordTypes.OccupancyType[]; - }) => { - if (responseJSON.success) { - occupancyTypes = responseJSON.occupancyTypes; - renderOccupancyTypes(); - } else { - bulmaJS.alert({ - title: - "Error Moving " + - exports.aliases.occupancy + - " Type", - message: responseJSON.errorMessage, - contextualColorName: "danger" - }); - } - } + occupancyTypeResponseHandler ); }; @@ -318,44 +277,28 @@ declare const bulmaJS: BulmaJS; { occupancyTypeId }, - (responseJSON: { - success: boolean; - errorMessage?: string; - occupancyTypes?: recordTypes.OccupancyType[]; - }) => { - if (responseJSON.success) { - occupancyTypes = responseJSON.occupancyTypes; - renderOccupancyTypes(); - } else { - bulmaJS.alert({ - title: - "Error Moving " + - exports.aliases.occupancy + - " Type", - message: responseJSON.errorMessage, - contextualColorName: "danger" - }); - } - } + occupancyTypeResponseHandler ); }; - const openEditOccupancyTypeField = ( - occupancyTypeId: number, - occupancyTypeFieldId: number - ) => { - const occupancyType = occupancyTypes.find((currentOccupancyType) => { - return currentOccupancyType.occupancyTypeId === occupancyTypeId; - }); + const openEditOccupancyTypeField = (occupancyTypeId: number, occupancyTypeFieldId: number) => { + let occupancyTypeField: recordTypes.OccupancyTypeField; - const occupancyTypeField = occupancyType.occupancyTypeFields.find( - (currentOccupancyTypeField) => { - return ( - currentOccupancyTypeField.occupancyTypeFieldId === - occupancyTypeFieldId - ); - } - ); + if (occupancyTypeId) { + const occupancyType = occupancyTypes.find((currentOccupancyType) => { + return currentOccupancyType.occupancyTypeId === occupancyTypeId; + }); + + occupancyTypeField = occupancyType.occupancyTypeFields.find( + (currentOccupancyTypeField) => { + return currentOccupancyTypeField.occupancyTypeFieldId === occupancyTypeFieldId; + } + ); + } else { + occupancyTypeField = allOccupancyTypeFields.find((currentOccupancyTypeField) => { + return currentOccupancyTypeField.occupancyTypeFieldId === occupancyTypeFieldId; + }); + } let minimumLengthElement: HTMLInputElement; let maximumLengthElement: HTMLInputElement; @@ -391,16 +334,9 @@ declare const bulmaJS: BulmaJS; errorMessage?: string; occupancyTypes?: recordTypes.OccupancyType[]; }) => { + occupancyTypeResponseHandler(responseJSON); if (responseJSON.success) { - occupancyTypes = responseJSON.occupancyTypes; editCloseModalFunction(); - renderOccupancyTypes(); - } else { - bulmaJS.alert({ - title: "Error Updating Field", - message: responseJSON.errorMessage, - contextualColorName: "danger" - }); } } ); @@ -418,16 +354,9 @@ declare const bulmaJS: BulmaJS; errorMessage?: string; occupancyTypes?: recordTypes.OccupancyType[]; }) => { + occupancyTypeResponseHandler(responseJSON); if (responseJSON.success) { - occupancyTypes = responseJSON.occupancyTypes; editCloseModalFunction(); - renderOccupancyTypes(); - } else { - bulmaJS.alert({ - title: "Error Deleting Field", - message: responseJSON.errorMessage, - contextualColorName: "danger" - }); } } ); @@ -471,19 +400,15 @@ declare const bulmaJS: BulmaJS; "#occupancyTypeFieldEdit--minimumLength" ); - minimumLengthElement.value = - occupancyTypeField.minimumLength.toString(); + minimumLengthElement.value = occupancyTypeField.minimumLength.toString(); maximumLengthElement = modalElement.querySelector( "#occupancyTypeFieldEdit--maximumLength" ); - maximumLengthElement.value = - occupancyTypeField.maximumLength.toString(); + maximumLengthElement.value = occupancyTypeField.maximumLength.toString(); - patternElement = modalElement.querySelector( - "#occupancyTypeFieldEdit--pattern" - ); + patternElement = modalElement.querySelector("#occupancyTypeFieldEdit--pattern"); patternElement.value = occupancyTypeField.pattern; @@ -491,8 +416,7 @@ declare const bulmaJS: BulmaJS; "#occupancyTypeFieldEdit--occupancyTypeFieldValues" ); - occupancyTypeFieldValuesElement.value = - occupancyTypeField.occupancyTypeFieldValues; + occupancyTypeFieldValuesElement.value = occupancyTypeField.occupancyTypeFieldValues; toggleInputFields(); }, @@ -503,20 +427,12 @@ declare const bulmaJS: BulmaJS; bulmaJS.toggleHtmlClipped(); cityssm.enableNavBlocker(); - modalElement - .querySelector("form") - .addEventListener("submit", doUpdate); + modalElement.querySelector("form").addEventListener("submit", doUpdate); - minimumLengthElement.addEventListener( - "keyup", - updateMaximumLengthMin - ); + minimumLengthElement.addEventListener("keyup", updateMaximumLengthMin); updateMaximumLengthMin(); - occupancyTypeFieldValuesElement.addEventListener( - "keyup", - toggleInputFields - ); + occupancyTypeFieldValuesElement.addEventListener("keyup", toggleInputFields); modalElement .querySelector("#button--deleteOccupancyTypeField") @@ -553,20 +469,115 @@ declare const bulmaJS: BulmaJS; openEditOccupancyTypeField(occupancyTypeId, occupancyTypeFieldId); }; + const renderOccupancyTypeFields = ( + panelElement: HTMLElement, + occupancyTypeId: number | undefined, + occupancyTypeFields: recordTypes.OccupancyTypeField[] + ) => { + if (occupancyTypeFields.length === 0) { + panelElement.insertAdjacentHTML( + "beforeend", + '
' + + '
' + + '

There are no additional fields.

' + + "
" + + "
" + ); + } else { + for (const occupancyTypeField of occupancyTypeFields) { + const panelBlockElement = document.createElement("div"); + panelBlockElement.className = "panel-block is-block container--occupancyTypeField"; + + if (occupancyTypeId && !expandedOccupancyTypes.has(occupancyTypeId)) { + panelBlockElement.classList.add("is-hidden"); + } + + panelBlockElement.dataset.occupancyTypeFieldId = + occupancyTypeField.occupancyTypeFieldId.toString(); + + panelBlockElement.innerHTML = + '
' + + '" + + '
' + + ('
' + + '
' + + '
' + + '" + + "
" + + '
' + + '" + + "
" + + "
" + + "
") + + "
" + + "
"; + + panelBlockElement + .querySelector(".button--editOccupancyTypeField") + .addEventListener("click", openEditOccupancyTypeFieldByClick); + + panelElement.append(panelBlockElement); + } + } + }; + const renderOccupancyTypes = () => { + containerElement.innerHTML = + '
' + + '
' + + ('
' + + ('
' + + '

(All Occupancy Types)

' + + "
") + + ('
' + + ('
' + + '" + + "
") + + "
") + + "
") + + "
" + + "
"; + + renderOccupancyTypeFields( + containerElement.querySelector("#container--allOccupancyTypeFields"), + undefined, + allOccupancyTypeFields + ); + + containerElement + .querySelector(".button--addOccupancyTypeField") + .addEventListener("click", openAddOccupancyTypeField); + if (occupancyTypes.length === 0) { - containerElement.innerHTML = + containerElement.insertAdjacentHTML( + "afterbegin", '
There are no active ' + - exports.aliases.occupancy.toLowerCase() + - " types.

" + - "
"; + '

There are no active ' + + exports.aliases.occupancy.toLowerCase() + + " types.

" + + "" + ); return; } - containerElement.innerHTML = ""; - for (const occupancyType of occupancyTypes) { const occupancyTypeContainer = document.createElement("div"); @@ -631,77 +642,11 @@ declare const bulmaJS: BulmaJS; "" + ""; - if (occupancyType.occupancyTypeFields.length === 0) { - occupancyTypeContainer.insertAdjacentHTML( - "beforeend", - '
' + - '
' + - '

There are no additional fields.

' + - "
" + - "
" - ); - } else { - for (const occupancyTypeField of occupancyType.occupancyTypeFields) { - const panelBlockElement = document.createElement("div"); - panelBlockElement.className = - "panel-block is-block container--occupancyTypeField"; - - if ( - !expandedOccupancyTypes.has( - occupancyType.occupancyTypeId - ) - ) { - panelBlockElement.classList.add("is-hidden"); - } - - panelBlockElement.dataset.occupancyTypeFieldId = - occupancyTypeField.occupancyTypeFieldId.toString(); - - panelBlockElement.innerHTML = - '
' + - '" + - '
' + - ('
' + - '
' + - '
' + - '" + - "
" + - '
' + - '" + - "
" + - "
" + - "
") + - "
" + - "
"; - - panelBlockElement - .querySelector(".button--editOccupancyTypeField") - .addEventListener( - "click", - openEditOccupancyTypeFieldByClick - ); - - occupancyTypeContainer.append(panelBlockElement); - } - } + renderOccupancyTypeFields( + occupancyTypeContainer, + occupancyType.occupancyTypeId, + occupancyType.occupancyTypeFields + ); occupancyTypeContainer .querySelector(".button--toggleOccupancyTypeFields") @@ -731,64 +676,57 @@ declare const bulmaJS: BulmaJS; } }; - document - .querySelector("#button--addOccupancyType") - .addEventListener("click", () => { - let addCloseModalFunction: () => void; + document.querySelector("#button--addOccupancyType").addEventListener("click", () => { + let addCloseModalFunction: () => void; - const doAdd = (submitEvent: SubmitEvent) => { - submitEvent.preventDefault(); + const doAdd = (submitEvent: SubmitEvent) => { + submitEvent.preventDefault(); - cityssm.postJSON( - urlPrefix + "/admin/doAddOccupancyType", - submitEvent.currentTarget, - (responseJSON: { - success: boolean; - errorMessage?: string; - occupancyTypes?: recordTypes.OccupancyType[]; - }) => { - if (responseJSON.success) { - addCloseModalFunction(); - occupancyTypes = responseJSON.occupancyTypes; - renderOccupancyTypes(); - } else { - bulmaJS.alert({ - title: - "Error Adding " + - exports.aliases.occupancy + - " Type", - message: responseJSON.errorMessage, - contextualColorName: "danger" - }); - } + cityssm.postJSON( + urlPrefix + "/admin/doAddOccupancyType", + submitEvent.currentTarget, + (responseJSON: { + success: boolean; + errorMessage?: string; + occupancyTypes?: recordTypes.OccupancyType[]; + }) => { + if (responseJSON.success) { + addCloseModalFunction(); + occupancyTypes = responseJSON.occupancyTypes; + renderOccupancyTypes(); + } else { + bulmaJS.alert({ + title: "Error Adding " + exports.aliases.occupancy + " Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); } - ); - }; - - cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyType", { - onshow: (modalElement) => { - los.populateAliases(modalElement); - }, - onshown: (modalElement, closeModalFunction) => { - addCloseModalFunction = closeModalFunction; - - ( - modalElement.querySelector( - "#occupancyTypeAdd--occupancyType" - ) as HTMLInputElement - ).focus(); - - modalElement - .querySelector("form") - .addEventListener("submit", doAdd); - - bulmaJS.toggleHtmlClipped(); - }, - onremoved: () => { - bulmaJS.toggleHtmlClipped(); } - }); + ); + }; + + cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyType", { + onshow: (modalElement) => { + los.populateAliases(modalElement); + }, + onshown: (modalElement, closeModalFunction) => { + addCloseModalFunction = closeModalFunction; + + ( + modalElement.querySelector( + "#occupancyTypeAdd--occupancyType" + ) as HTMLInputElement + ).focus(); + + modalElement.querySelector("form").addEventListener("submit", doAdd); + + bulmaJS.toggleHtmlClipped(); + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped(); + } }); + }); renderOccupancyTypes(); })(); diff --git a/public/javascripts/adminOccupancyTypes.min.js b/public/javascripts/adminOccupancyTypes.min.js index e233e373..1f114b2d 100644 --- a/public/javascripts/adminOccupancyTypes.min.js +++ b/public/javascripts/adminOccupancyTypes.min.js @@ -1 +1 @@ -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=exports.los,c=document.querySelector("main").dataset.urlPrefix,a=document.querySelector("#container--occupancyTypes");let t=exports.occupancyTypes;delete exports.occupancyTypes;const s=new Set,o=e=>{const c=e.currentTarget,a=c.closest(".container--occupancyType"),t=Number.parseInt(a.dataset.occupancyTypeId,10);s.has(t)?s.delete(t):s.add(t),c.innerHTML=s.has(t)?'':'';const o=a.querySelectorAll(".panel-block");for(const e of o)e.classList.toggle("is-hidden")},n=e=>{const a=Number.parseInt(e.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId,10);bulmaJS.confirm({title:"Delete "+exports.aliases.occupancy+" Type",message:"Are you sure you want to delete this "+exports.aliases.occupancy.toLowerCase()+" type?",contextualColorName:"warning",okButton:{text:"Yes, Delete "+exports.aliases.occupancy+" Type",callbackFunction:()=>{cityssm.postJSON(c+"/admin/doDeleteOccupancyType",{occupancyTypeId:a},e=>{e.success?(t=e.occupancyTypes,y()):bulmaJS.alert({title:"Error Deleting "+exports.aliases.occupancy+" Type",message:e.errorMessage,contextualColorName:"danger"})})}}})},l=a=>{const s=Number.parseInt(a.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId,10),o=t.find(e=>s===e.occupancyTypeId);let n;const l=e=>{e.preventDefault(),cityssm.postJSON(c+"/admin/doUpdateOccupancyType",e.currentTarget,e=>{e.success?(n(),t=e.occupancyTypes,y()):bulmaJS.alert({title:"Error Updating "+exports.aliases.occupancy+" Type",message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("adminOccupancyTypes-editOccupancyType",{onshow:c=>{e.populateAliases(c),c.querySelector("#occupancyTypeEdit--occupancyTypeId").value=s.toString(),c.querySelector("#occupancyTypeEdit--occupancyType").value=o.occupancyType},onshown:(e,c)=>{n=c,e.querySelector("#occupancyTypeEdit--occupancyType").focus(),e.querySelector("form").addEventListener("submit",l),bulmaJS.toggleHtmlClipped()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},i=a=>{const o=Number.parseInt(a.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId,10);let n;const l=e=>{e.preventDefault(),cityssm.postJSON(c+"/admin/doAddOccupancyTypeField",e.currentTarget,e=>{e.success?(s.add(o),n(),t=e.occupancyTypes,y(),u(o,e.occupancyTypeFieldId)):bulmaJS.alert({title:"Error Adding Field",message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyTypeField",{onshow:c=>{e.populateAliases(c),c.querySelector("#occupancyTypeFieldAdd--occupancyTypeId").value=o.toString()},onshown:(e,c)=>{n=c,e.querySelector("#occupancyTypeFieldAdd--occupancyTypeField").focus(),e.querySelector("form").addEventListener("submit",l),bulmaJS.toggleHtmlClipped()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},p=e=>{e.preventDefault();const a=e.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId;cityssm.postJSON(c+"/admin/doMoveOccupancyTypeUp",{occupancyTypeId:a},e=>{e.success?(t=e.occupancyTypes,y()):bulmaJS.alert({title:"Error Moving "+exports.aliases.occupancy+" Type",message:e.errorMessage,contextualColorName:"danger"})})},d=e=>{e.preventDefault();const a=e.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId;cityssm.postJSON(c+"/admin/doMoveOccupancyTypeDown",{occupancyTypeId:a},e=>{e.success?(t=e.occupancyTypes,y()):bulmaJS.alert({title:"Error Moving "+exports.aliases.occupancy+" Type",message:e.errorMessage,contextualColorName:"danger"})})},u=(a,s)=>{const o=t.find(e=>e.occupancyTypeId===a).occupancyTypeFields.find(e=>e.occupancyTypeFieldId===s);let n,l,i,p,d;const u=()=>{l.min=n.value},r=()=>{""===p.value?(n.disabled=!1,l.disabled=!1,i.disabled=!1):(n.disabled=!0,l.disabled=!0,i.disabled=!0)},m=e=>{e.preventDefault(),cityssm.postJSON(c+"/admin/doUpdateOccupancyTypeField",e.currentTarget,e=>{e.success?(t=e.occupancyTypes,d(),y()):bulmaJS.alert({title:"Error Updating Field",message:e.errorMessage,contextualColorName:"danger"})})},T=()=>{bulmaJS.confirm({title:"Delete Field",message:"Are you sure you want to delete this field? Note that historical records that make use of this field will not be affected.",contextualColorName:"warning",okButton:{text:"Yes, Delete Field",callbackFunction:()=>{cityssm.postJSON(c+"/admin/doDeleteOccupancyTypeField",{occupancyTypeFieldId:s},e=>{e.success?(t=e.occupancyTypes,d(),y()):bulmaJS.alert({title:"Error Deleting Field",message:e.errorMessage,contextualColorName:"danger"})})}}})};cityssm.openHtmlModal("adminOccupancyTypes-editOccupancyTypeField",{onshow:c=>{e.populateAliases(c),c.querySelector("#occupancyTypeFieldEdit--occupancyTypeFieldId").value=o.occupancyTypeFieldId.toString(),c.querySelector("#occupancyTypeFieldEdit--occupancyTypeField").value=o.occupancyTypeField,c.querySelector("#occupancyTypeFieldEdit--isRequired").value=o.isRequired?"1":"0",(n=c.querySelector("#occupancyTypeFieldEdit--minimumLength")).value=o.minimumLength.toString(),(l=c.querySelector("#occupancyTypeFieldEdit--maximumLength")).value=o.maximumLength.toString(),(i=c.querySelector("#occupancyTypeFieldEdit--pattern")).value=o.pattern,(p=c.querySelector("#occupancyTypeFieldEdit--occupancyTypeFieldValues")).value=o.occupancyTypeFieldValues,r()},onshown:(e,c)=>{d=c,bulmaJS.init(e),bulmaJS.toggleHtmlClipped(),cityssm.enableNavBlocker(),e.querySelector("form").addEventListener("submit",m),n.addEventListener("keyup",u),u(),p.addEventListener("keyup",r),e.querySelector("#button--deleteOccupancyTypeField").addEventListener("click",T)},onremoved:()=>{bulmaJS.toggleHtmlClipped(),cityssm.disableNavBlocker()}})},r=e=>{e.preventDefault();const c=Number.parseInt(e.currentTarget.closest(".container--occupancyTypeField").dataset.occupancyTypeFieldId,10),a=Number.parseInt(e.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId,10);u(a,c)},y=()=>{if(0!==t.length){a.innerHTML="";for(const e of t){const c=document.createElement("div");if(c.className="panel container--occupancyType",c.dataset.occupancyTypeId=e.occupancyTypeId.toString(),c.innerHTML='

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

',0===e.occupancyTypeFields.length)c.insertAdjacentHTML("beforeend",'

There are no additional fields.

');else for(const a of e.occupancyTypeFields){const t=document.createElement("div");t.className="panel-block is-block container--occupancyTypeField",s.has(e.occupancyTypeId)||t.classList.add("is-hidden"),t.dataset.occupancyTypeFieldId=a.occupancyTypeFieldId.toString(),t.innerHTML='
',t.querySelector(".button--editOccupancyTypeField").addEventListener("click",r),c.append(t)}c.querySelector(".button--toggleOccupancyTypeFields").addEventListener("click",o),c.querySelector(".button--deleteOccupancyType").addEventListener("click",n),c.querySelector(".button--editOccupancyType").addEventListener("click",l),c.querySelector(".button--addOccupancyTypeField").addEventListener("click",i),c.querySelector(".button--moveOccupancyTypeUp").addEventListener("click",p),c.querySelector(".button--moveOccupancyTypeDown").addEventListener("click",d),a.append(c)}}else a.innerHTML='
There are no active '+exports.aliases.occupancy.toLowerCase()+" types.

"};document.querySelector("#button--addOccupancyType").addEventListener("click",()=>{let a;const s=e=>{e.preventDefault(),cityssm.postJSON(c+"/admin/doAddOccupancyType",e.currentTarget,e=>{e.success?(a(),t=e.occupancyTypes,y()):bulmaJS.alert({title:"Error Adding "+exports.aliases.occupancy+" Type",message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyType",{onshow:c=>{e.populateAliases(c)},onshown:(e,c)=>{a=c,e.querySelector("#occupancyTypeAdd--occupancyType").focus(),e.querySelector("form").addEventListener("submit",s),bulmaJS.toggleHtmlClipped()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})}),y()})(); \ No newline at end of file +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=exports.los,c=document.querySelector("main").dataset.urlPrefix,t=document.querySelector("#container--occupancyTypes");let a=exports.occupancyTypes;delete exports.occupancyTypes;let s=exports.allOccupancyTypeFields;delete exports.allOccupancyTypeFields;const n=new Set,l=e=>{const c=e.currentTarget,t=c.closest(".container--occupancyType"),a=Number.parseInt(t.dataset.occupancyTypeId,10);n.has(a)?n.delete(a):n.add(a),c.innerHTML=n.has(a)?'':'';const s=t.querySelectorAll(".panel-block");for(const e of s)e.classList.toggle("is-hidden")},i=e=>{e.success?(a=e.occupancyTypes,s=e.allOccupancyTypeFields,T()):bulmaJS.alert({title:"Error Updating "+exports.aliases.occupancy+" Type",message:e.errorMessage,contextualColorName:"danger"})},o=e=>{const t=Number.parseInt(e.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId,10);bulmaJS.confirm({title:"Delete "+exports.aliases.occupancy+" Type",message:"Are you sure you want to delete this "+exports.aliases.occupancy.toLowerCase()+" type?",contextualColorName:"warning",okButton:{text:"Yes, Delete "+exports.aliases.occupancy+" Type",callbackFunction:()=>{cityssm.postJSON(c+"/admin/doDeleteOccupancyType",{occupancyTypeId:t},i)}}})},d=t=>{const s=Number.parseInt(t.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId,10),n=a.find(e=>s===e.occupancyTypeId);let l;const o=e=>{e.preventDefault(),cityssm.postJSON(c+"/admin/doUpdateOccupancyType",e.currentTarget,e=>{i(e),e.success&&l()})};cityssm.openHtmlModal("adminOccupancyTypes-editOccupancyType",{onshow:c=>{e.populateAliases(c),c.querySelector("#occupancyTypeEdit--occupancyTypeId").value=s.toString(),c.querySelector("#occupancyTypeEdit--occupancyType").value=n.occupancyType},onshown:(e,c)=>{l=c,e.querySelector("#occupancyTypeEdit--occupancyType").focus(),e.querySelector("form").addEventListener("submit",o),bulmaJS.toggleHtmlClipped()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},p=t=>{const a=Number.parseInt(t.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId,10);let s;const l=e=>{e.preventDefault(),cityssm.postJSON(c+"/admin/doAddOccupancyTypeField",e.currentTarget,e=>{n.add(a),i(e),e.success&&(s(),r(a,e.occupancyTypeFieldId))})};cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyTypeField",{onshow:c=>{e.populateAliases(c),a&&(c.querySelector("#occupancyTypeFieldAdd--occupancyTypeId").value=a.toString())},onshown:(e,c)=>{s=c,e.querySelector("#occupancyTypeFieldAdd--occupancyTypeField").focus(),e.querySelector("form").addEventListener("submit",l),bulmaJS.toggleHtmlClipped()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},u=e=>{e.preventDefault();const t=e.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId;cityssm.postJSON(c+"/admin/doMoveOccupancyTypeUp",{occupancyTypeId:t},i)},y=e=>{e.preventDefault();const t=e.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId;cityssm.postJSON(c+"/admin/doMoveOccupancyTypeDown",{occupancyTypeId:t},i)},r=(t,n)=>{let l,o,d,p,u,y;if(t){const e=a.find(e=>e.occupancyTypeId===t);l=e.occupancyTypeFields.find(e=>e.occupancyTypeFieldId===n)}else l=s.find(e=>e.occupancyTypeFieldId===n);const r=()=>{d.min=o.value},m=()=>{""===u.value?(o.disabled=!1,d.disabled=!1,p.disabled=!1):(o.disabled=!0,d.disabled=!0,p.disabled=!0)},v=e=>{e.preventDefault(),cityssm.postJSON(c+"/admin/doUpdateOccupancyTypeField",e.currentTarget,e=>{i(e),e.success&&y()})},T=()=>{bulmaJS.confirm({title:"Delete Field",message:"Are you sure you want to delete this field? Note that historical records that make use of this field will not be affected.",contextualColorName:"warning",okButton:{text:"Yes, Delete Field",callbackFunction:()=>{cityssm.postJSON(c+"/admin/doDeleteOccupancyTypeField",{occupancyTypeFieldId:n},e=>{i(e),e.success&&y()})}}})};cityssm.openHtmlModal("adminOccupancyTypes-editOccupancyTypeField",{onshow:c=>{e.populateAliases(c),c.querySelector("#occupancyTypeFieldEdit--occupancyTypeFieldId").value=l.occupancyTypeFieldId.toString(),c.querySelector("#occupancyTypeFieldEdit--occupancyTypeField").value=l.occupancyTypeField,c.querySelector("#occupancyTypeFieldEdit--isRequired").value=l.isRequired?"1":"0",(o=c.querySelector("#occupancyTypeFieldEdit--minimumLength")).value=l.minimumLength.toString(),(d=c.querySelector("#occupancyTypeFieldEdit--maximumLength")).value=l.maximumLength.toString(),(p=c.querySelector("#occupancyTypeFieldEdit--pattern")).value=l.pattern,(u=c.querySelector("#occupancyTypeFieldEdit--occupancyTypeFieldValues")).value=l.occupancyTypeFieldValues,m()},onshown:(e,c)=>{y=c,bulmaJS.init(e),bulmaJS.toggleHtmlClipped(),cityssm.enableNavBlocker(),e.querySelector("form").addEventListener("submit",v),o.addEventListener("keyup",r),r(),u.addEventListener("keyup",m),e.querySelector("#button--deleteOccupancyTypeField").addEventListener("click",T)},onremoved:()=>{bulmaJS.toggleHtmlClipped(),cityssm.disableNavBlocker()}})},m=e=>{e.preventDefault();const c=Number.parseInt(e.currentTarget.closest(".container--occupancyTypeField").dataset.occupancyTypeFieldId,10),t=Number.parseInt(e.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId,10);r(t,c)},v=(e,c,t)=>{if(0===t.length)e.insertAdjacentHTML("beforeend",'

There are no additional fields.

');else for(const a of t){const t=document.createElement("div");t.className="panel-block is-block container--occupancyTypeField",c&&!n.has(c)&&t.classList.add("is-hidden"),t.dataset.occupancyTypeFieldId=a.occupancyTypeFieldId.toString(),t.innerHTML='
',t.querySelector(".button--editOccupancyTypeField").addEventListener("click",m),e.append(t)}},T=()=>{if(t.innerHTML='

(All Occupancy Types)

',v(t.querySelector("#container--allOccupancyTypeFields"),void 0,s),t.querySelector(".button--addOccupancyTypeField").addEventListener("click",p),0!==a.length)for(const e of a){const c=document.createElement("div");c.className="panel container--occupancyType",c.dataset.occupancyTypeId=e.occupancyTypeId.toString(),c.innerHTML='

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

',v(c,e.occupancyTypeId,e.occupancyTypeFields),c.querySelector(".button--toggleOccupancyTypeFields").addEventListener("click",l),c.querySelector(".button--deleteOccupancyType").addEventListener("click",o),c.querySelector(".button--editOccupancyType").addEventListener("click",d),c.querySelector(".button--addOccupancyTypeField").addEventListener("click",p),c.querySelector(".button--moveOccupancyTypeUp").addEventListener("click",u),c.querySelector(".button--moveOccupancyTypeDown").addEventListener("click",y),t.append(c)}else t.insertAdjacentHTML("afterbegin",'
There are no active '+exports.aliases.occupancy.toLowerCase()+" types.

")};document.querySelector("#button--addOccupancyType").addEventListener("click",()=>{let t;const s=e=>{e.preventDefault(),cityssm.postJSON(c+"/admin/doAddOccupancyType",e.currentTarget,e=>{e.success?(t(),a=e.occupancyTypes,T()):bulmaJS.alert({title:"Error Adding "+exports.aliases.occupancy+" Type",message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyType",{onshow:c=>{e.populateAliases(c)},onshown:(e,c)=>{t=c,e.querySelector("#occupancyTypeAdd--occupancyType").focus(),e.querySelector("form").addEventListener("submit",s),bulmaJS.toggleHtmlClipped()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})}),T()})(); \ No newline at end of file diff --git a/views/admin-occupancyTypes.ejs b/views/admin-occupancyTypes.ejs index b7688aca..c0d10e60 100644 --- a/views/admin-occupancyTypes.ejs +++ b/views/admin-occupancyTypes.ejs @@ -49,6 +49,7 @@