diff --git a/handlers/admin-post/doUpdateOccupancyType.d.ts b/handlers/admin-post/doUpdateOccupancyType.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/admin-post/doUpdateOccupancyType.d.ts @@ -0,0 +1,3 @@ +import type { RequestHandler } from "express"; +export declare const handler: RequestHandler; +export default handler; diff --git a/handlers/admin-post/doUpdateOccupancyType.js b/handlers/admin-post/doUpdateOccupancyType.js new file mode 100644 index 00000000..952a3280 --- /dev/null +++ b/handlers/admin-post/doUpdateOccupancyType.js @@ -0,0 +1,11 @@ +import { updateOccupancyType } from "../../helpers/lotOccupancyDB/updateOccupancyType.js"; +import { getOccupancyTypes } from "../../helpers/functions.cache.js"; +export const handler = async (request, response) => { + const success = updateOccupancyType(request.body, request.session); + const occupancyTypes = getOccupancyTypes(); + response.json({ + success, + occupancyTypes + }); +}; +export default handler; diff --git a/handlers/admin-post/doUpdateOccupancyType.ts b/handlers/admin-post/doUpdateOccupancyType.ts new file mode 100644 index 00000000..ee27dd38 --- /dev/null +++ b/handlers/admin-post/doUpdateOccupancyType.ts @@ -0,0 +1,18 @@ +import type { RequestHandler } from "express"; + +import { updateOccupancyType } from "../../helpers/lotOccupancyDB/updateOccupancyType.js"; + +import { getOccupancyTypes } from "../../helpers/functions.cache.js"; + +export const handler: RequestHandler = async (request, response) => { + const success = updateOccupancyType(request.body, request.session); + + const occupancyTypes = getOccupancyTypes(); + + response.json({ + success, + occupancyTypes + }); +}; + +export default handler; diff --git a/helpers/lotOccupancyDB/updateOccupancyType.d.ts b/helpers/lotOccupancyDB/updateOccupancyType.d.ts new file mode 100644 index 00000000..eb2a313a --- /dev/null +++ b/helpers/lotOccupancyDB/updateOccupancyType.d.ts @@ -0,0 +1,7 @@ +import type * as recordTypes from "../../types/recordTypes"; +interface UpdateOccupancyTypeForm { + occupancyTypeId: number | string; + occupancyType: string; +} +export declare const updateOccupancyType: (occupancyTypeForm: UpdateOccupancyTypeForm, requestSession: recordTypes.PartialSession) => boolean; +export default updateOccupancyType; diff --git a/helpers/lotOccupancyDB/updateOccupancyType.js b/helpers/lotOccupancyDB/updateOccupancyType.js new file mode 100644 index 00000000..9b024797 --- /dev/null +++ b/helpers/lotOccupancyDB/updateOccupancyType.js @@ -0,0 +1,19 @@ +import sqlite from "better-sqlite3"; +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { clearOccupancyTypesCache } from "../functions.cache.js"; +export const updateOccupancyType = (occupancyTypeForm, requestSession) => { + const database = sqlite(databasePath); + const rightNowMillis = Date.now(); + const result = database + .prepare("update OccupancyTypes" + + " set occupancyType = ?," + + " recordUpdate_userName = ?," + + " recordUpdate_timeMillis = ?" + + " where occupancyTypeId = ?" + + " and recordDelete_timeMillis is null") + .run(occupancyTypeForm.occupancyType, requestSession.user.userName, rightNowMillis, occupancyTypeForm.occupancyTypeId); + database.close(); + clearOccupancyTypesCache(); + return result.changes > 0; +}; +export default updateOccupancyType; diff --git a/helpers/lotOccupancyDB/updateOccupancyType.ts b/helpers/lotOccupancyDB/updateOccupancyType.ts new file mode 100644 index 00000000..8fe7a5e6 --- /dev/null +++ b/helpers/lotOccupancyDB/updateOccupancyType.ts @@ -0,0 +1,45 @@ +import sqlite from "better-sqlite3"; + +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; + +import { clearOccupancyTypesCache } from "../functions.cache.js"; + +import type * as recordTypes from "../../types/recordTypes"; + +interface UpdateOccupancyTypeForm { + occupancyTypeId: number | string; + occupancyType: string; +} + +export const updateOccupancyType = ( + occupancyTypeForm: UpdateOccupancyTypeForm, + requestSession: recordTypes.PartialSession +): boolean => { + const database = sqlite(databasePath); + + const rightNowMillis = Date.now(); + + const result = database + .prepare( + "update OccupancyTypes" + + " set occupancyType = ?," + + " recordUpdate_userName = ?," + + " recordUpdate_timeMillis = ?" + + " where occupancyTypeId = ?" + + " and recordDelete_timeMillis is null" + ) + .run( + occupancyTypeForm.occupancyType, + requestSession.user.userName, + rightNowMillis, + occupancyTypeForm.occupancyTypeId + ); + + database.close(); + + clearOccupancyTypesCache(); + + return result.changes > 0; +}; + +export default updateOccupancyType; diff --git a/public-typescript/adminOccupancyTypes.js b/public-typescript/adminOccupancyTypes.js index 0bd4224b..1f37992e 100644 --- a/public-typescript/adminOccupancyTypes.js +++ b/public-typescript/adminOccupancyTypes.js @@ -25,6 +25,50 @@ Object.defineProperty(exports, "__esModule", { value: true }); panelBlockElement.classList.toggle("is-hidden"); } }; + const openEditOccupancyType = (clickEvent) => { + const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId, 10); + const occupancyType = occupancyTypes.find((currentOccupancyType) => { + return occupancyTypeId === currentOccupancyType.occupancyTypeId; + }); + let editCloseModalFunction; + const doEdit = (submitEvent) => { + submitEvent.preventDefault(); + cityssm.postJSON(urlPrefix + "/admin/doUpdateOccupancyType", submitEvent.currentTarget, (responseJSON) => { + if (responseJSON.success) { + editCloseModalFunction(); + occupancyTypes = responseJSON.occupancyTypes; + renderOccupancyTypes(); + } + else { + bulmaJS.alert({ + title: "Error Updating " + + exports.aliases.occupancy + + " Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + cityssm.openHtmlModal("adminOccupancyTypes-editOccupancyType", { + onshow: (modalElement) => { + los.populateAliases(modalElement); + modalElement.querySelector("#occupancyTypeEdit--occupancyTypeId").value = occupancyTypeId.toString(); + modalElement.querySelector("#occupancyTypeEdit--occupancyType").value = occupancyType.occupancyType; + }, + onshown: (modalElement, closeModalFunction) => { + editCloseModalFunction = closeModalFunction; + modalElement.querySelector("#occupancyTypeEdit--occupancyType").focus(); + modalElement + .querySelector("form") + .addEventListener("submit", doEdit); + bulmaJS.toggleHtmlClipped(); + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped(); + } + }); + }; const moveOccupancyTypeUp = (clickEvent) => { clickEvent.preventDefault(); const occupancyTypeId = clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId; @@ -185,6 +229,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); occupancyTypeContainer .querySelector(".button--toggleOccupancyTypeFields") .addEventListener("click", toggleOccupancyTypeFields); + occupancyTypeContainer + .querySelector(".button--editOccupancyType") + .addEventListener("click", openEditOccupancyType); occupancyTypeContainer .querySelector(".button--moveOccupancyTypeUp") .addEventListener("click", moveOccupancyTypeUp); diff --git a/public-typescript/adminOccupancyTypes.ts b/public-typescript/adminOccupancyTypes.ts index 60fd68b8..4ef24a90 100644 --- a/public-typescript/adminOccupancyTypes.ts +++ b/public-typescript/adminOccupancyTypes.ts @@ -57,6 +57,88 @@ declare const bulmaJS: BulmaJS; } }; + const openEditOccupancyType = (clickEvent: Event) => { + const occupancyTypeId = Number.parseInt( + ( + (clickEvent.currentTarget as HTMLElement).closest( + ".container--occupancyType" + ) as HTMLElement + ).dataset.occupancyTypeId, + 10 + ); + + const occupancyType = occupancyTypes.find((currentOccupancyType) => { + return occupancyTypeId === currentOccupancyType.occupancyTypeId; + }); + + let editCloseModalFunction: () => void; + + const doEdit = (submitEvent: SubmitEvent) => { + submitEvent.preventDefault(); + + cityssm.postJSON( + urlPrefix + "/admin/doUpdateOccupancyType", + submitEvent.currentTarget, + (responseJSON: { + success: boolean; + errorMessage?: string; + occupancyTypes?: recordTypes.OccupancyType[]; + }) => { + if (responseJSON.success) { + editCloseModalFunction(); + occupancyTypes = responseJSON.occupancyTypes; + renderOccupancyTypes(); + } else { + bulmaJS.alert({ + title: + "Error Updating " + + exports.aliases.occupancy + + " Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + } + ); + }; + + cityssm.openHtmlModal("adminOccupancyTypes-editOccupancyType", { + onshow: (modalElement) => { + los.populateAliases(modalElement); + + ( + modalElement.querySelector( + "#occupancyTypeEdit--occupancyTypeId" + ) as HTMLInputElement + ).value = occupancyTypeId.toString(); + + ( + modalElement.querySelector( + "#occupancyTypeEdit--occupancyType" + ) as HTMLInputElement + ).value = occupancyType.occupancyType; + }, + onshown: (modalElement, closeModalFunction) => { + editCloseModalFunction = closeModalFunction; + + ( + modalElement.querySelector( + "#occupancyTypeEdit--occupancyType" + ) as HTMLInputElement + ).focus(); + + modalElement + .querySelector("form") + .addEventListener("submit", doEdit); + + bulmaJS.toggleHtmlClipped(); + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped(); + } + }); + }; + const moveOccupancyTypeUp = (clickEvent: Event) => { clickEvent.preventDefault(); @@ -270,6 +352,10 @@ declare const bulmaJS: BulmaJS; .querySelector(".button--toggleOccupancyTypeFields") .addEventListener("click", toggleOccupancyTypeFields); + occupancyTypeContainer + .querySelector(".button--editOccupancyType") + .addEventListener("click", openEditOccupancyType); + occupancyTypeContainer .querySelector(".button--moveOccupancyTypeUp") .addEventListener("click", moveOccupancyTypeUp); diff --git a/public/html/adminOccupancyTypes-editOccupancyType.html b/public/html/adminOccupancyTypes-editOccupancyType.html new file mode 100644 index 00000000..f1e473d5 --- /dev/null +++ b/public/html/adminOccupancyTypes-editOccupancyType.html @@ -0,0 +1,29 @@ +