From 1b57e629c61cf4e628c6be3f18ba244e9b936878 Mon Sep 17 00:00:00 2001 From: Dan Gowans Date: Tue, 6 Sep 2022 15:26:26 -0400 Subject: [PATCH] update occupancy type field --- .../doUpdateOccupancyTypeField.d.ts | 3 + .../admin-post/doUpdateOccupancyTypeField.js | 11 ++ .../admin-post/doUpdateOccupancyTypeField.ts | 18 ++ .../updateOccupancyTypeField.d.ts | 12 ++ .../updateOccupancyTypeField.js | 24 +++ .../updateOccupancyTypeField.ts | 60 ++++++ public-typescript/adminOccupancyTypes.js | 94 ++++++++- public-typescript/adminOccupancyTypes.ts | 186 +++++++++++++++++- ...nOccupancyTypes-addOccupancyTypeField.html | 2 +- ...OccupancyTypes-editOccupancyTypeField.html | 87 ++++++++ public/javascripts/adminOccupancyTypes.min.js | 2 +- routes/admin.js | 2 + routes/admin.ts | 7 + 13 files changed, 499 insertions(+), 9 deletions(-) create mode 100644 handlers/admin-post/doUpdateOccupancyTypeField.d.ts create mode 100644 handlers/admin-post/doUpdateOccupancyTypeField.js create mode 100644 handlers/admin-post/doUpdateOccupancyTypeField.ts create mode 100644 helpers/lotOccupancyDB/updateOccupancyTypeField.d.ts create mode 100644 helpers/lotOccupancyDB/updateOccupancyTypeField.js create mode 100644 helpers/lotOccupancyDB/updateOccupancyTypeField.ts create mode 100644 public/html/adminOccupancyTypes-editOccupancyTypeField.html diff --git a/handlers/admin-post/doUpdateOccupancyTypeField.d.ts b/handlers/admin-post/doUpdateOccupancyTypeField.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/admin-post/doUpdateOccupancyTypeField.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/doUpdateOccupancyTypeField.js b/handlers/admin-post/doUpdateOccupancyTypeField.js new file mode 100644 index 00000000..2cd41510 --- /dev/null +++ b/handlers/admin-post/doUpdateOccupancyTypeField.js @@ -0,0 +1,11 @@ +import { updateOccupancyTypeField } from "../../helpers/lotOccupancyDB/updateOccupancyTypeField.js"; +import { getOccupancyTypes } from "../../helpers/functions.cache.js"; +export const handler = async (request, response) => { + const success = updateOccupancyTypeField(request.body, request.session); + const occupancyTypes = getOccupancyTypes(); + response.json({ + success, + occupancyTypes + }); +}; +export default handler; diff --git a/handlers/admin-post/doUpdateOccupancyTypeField.ts b/handlers/admin-post/doUpdateOccupancyTypeField.ts new file mode 100644 index 00000000..c378f0f4 --- /dev/null +++ b/handlers/admin-post/doUpdateOccupancyTypeField.ts @@ -0,0 +1,18 @@ +import type { RequestHandler } from "express"; + +import { updateOccupancyTypeField } from "../../helpers/lotOccupancyDB/updateOccupancyTypeField.js"; + +import { getOccupancyTypes } from "../../helpers/functions.cache.js"; + +export const handler: RequestHandler = async (request, response) => { + const success = updateOccupancyTypeField(request.body, request.session); + + const occupancyTypes = getOccupancyTypes(); + + response.json({ + success, + occupancyTypes + }); +}; + +export default handler; diff --git a/helpers/lotOccupancyDB/updateOccupancyTypeField.d.ts b/helpers/lotOccupancyDB/updateOccupancyTypeField.d.ts new file mode 100644 index 00000000..eaba42c5 --- /dev/null +++ b/helpers/lotOccupancyDB/updateOccupancyTypeField.d.ts @@ -0,0 +1,12 @@ +import type * as recordTypes from "../../types/recordTypes"; +interface UpdateOccupancyTypeFieldForm { + occupancyTypeFieldId: number | string; + occupancyTypeField: string; + isRequired: "0" | "1"; + minimumLength?: string; + maximumLength?: string; + pattern?: string; + occupancyTypeFieldValues: string; +} +export declare const updateOccupancyTypeField: (occupancyTypeFieldForm: UpdateOccupancyTypeFieldForm, requestSession: recordTypes.PartialSession) => boolean; +export default updateOccupancyTypeField; diff --git a/helpers/lotOccupancyDB/updateOccupancyTypeField.js b/helpers/lotOccupancyDB/updateOccupancyTypeField.js new file mode 100644 index 00000000..bfb7dee2 --- /dev/null +++ b/helpers/lotOccupancyDB/updateOccupancyTypeField.js @@ -0,0 +1,24 @@ +import sqlite from "better-sqlite3"; +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { clearOccupancyTypesCache } from "../functions.cache.js"; +export const updateOccupancyTypeField = (occupancyTypeFieldForm, requestSession) => { + const database = sqlite(databasePath); + const rightNowMillis = Date.now(); + const result = database + .prepare("update OccupancyTypeFields" + + " set occupancyTypeField = ?," + + " isRequired = ?," + + " minimumLength = ?," + + " maximumLength = ?," + + " pattern = ?," + + " occupancyTypeFieldValues = ?," + + " recordUpdate_userName = ?," + + " recordUpdate_timeMillis = ?" + + " where occupancyTypeFieldId = ?" + + " and recordDelete_timeMillis is null") + .run(occupancyTypeFieldForm.occupancyTypeField, Number.parseInt(occupancyTypeFieldForm.isRequired, 10), occupancyTypeFieldForm.minimumLength || 0, occupancyTypeFieldForm.maximumLength || 100, occupancyTypeFieldForm.pattern || "", occupancyTypeFieldForm.occupancyTypeFieldValues, requestSession.user.userName, rightNowMillis, occupancyTypeFieldForm.occupancyTypeFieldId); + database.close(); + clearOccupancyTypesCache(); + return result.changes > 0; +}; +export default updateOccupancyTypeField; diff --git a/helpers/lotOccupancyDB/updateOccupancyTypeField.ts b/helpers/lotOccupancyDB/updateOccupancyTypeField.ts new file mode 100644 index 00000000..8669f2d0 --- /dev/null +++ b/helpers/lotOccupancyDB/updateOccupancyTypeField.ts @@ -0,0 +1,60 @@ +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 UpdateOccupancyTypeFieldForm { + occupancyTypeFieldId: number | string; + occupancyTypeField: string; + isRequired: "0" | "1"; + minimumLength?: string; + maximumLength?: string; + pattern?: string; + occupancyTypeFieldValues: string; +} + +export const updateOccupancyTypeField = ( + occupancyTypeFieldForm: UpdateOccupancyTypeFieldForm, + requestSession: recordTypes.PartialSession +): boolean => { + const database = sqlite(databasePath); + + const rightNowMillis = Date.now(); + + const result = database + .prepare( + "update OccupancyTypeFields" + + " set occupancyTypeField = ?," + + " isRequired = ?," + + " minimumLength = ?," + + " maximumLength = ?," + + " pattern = ?," + + " occupancyTypeFieldValues = ?," + + " recordUpdate_userName = ?," + + " recordUpdate_timeMillis = ?" + + " where occupancyTypeFieldId = ?" + + " and recordDelete_timeMillis is null" + ) + .run( + occupancyTypeFieldForm.occupancyTypeField, + Number.parseInt(occupancyTypeFieldForm.isRequired, 10), + occupancyTypeFieldForm.minimumLength || 0, + occupancyTypeFieldForm.maximumLength || 100, + occupancyTypeFieldForm.pattern || "", + occupancyTypeFieldForm.occupancyTypeFieldValues, + requestSession.user.userName, + rightNowMillis, + occupancyTypeFieldForm.occupancyTypeFieldId + ); + + database.close(); + + clearOccupancyTypesCache(); + + return result.changes > 0; +}; + +export default updateOccupancyTypeField; diff --git a/public-typescript/adminOccupancyTypes.js b/public-typescript/adminOccupancyTypes.js index 505d3c15..b495b6da 100644 --- a/public-typescript/adminOccupancyTypes.js +++ b/public-typescript/adminOccupancyTypes.js @@ -104,9 +104,6 @@ Object.defineProperty(exports, "__esModule", { value: true }); }; const openAddOccupancyTypeField = (clickEvent) => { const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId, 10); - const occupancyType = occupancyTypes.find((currentOccupancyType) => { - return occupancyTypeId === currentOccupancyType.occupancyTypeId; - }); let addCloseModalFunction; const doAdd = (submitEvent) => { submitEvent.preventDefault(); @@ -116,6 +113,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); addCloseModalFunction(); occupancyTypes = responseJSON.occupancyTypes; renderOccupancyTypes(); + openEditOccupancyTypeField(occupancyTypeId, responseJSON.occupancyTypeFieldId); } else { bulmaJS.alert({ @@ -186,6 +184,93 @@ Object.defineProperty(exports, "__esModule", { value: true }); } }); }; + const openEditOccupancyTypeField = (occupancyTypeId, occupancyTypeFieldId) => { + const occupancyType = occupancyTypes.find((currentOccupancyType) => { + return currentOccupancyType.occupancyTypeId === occupancyTypeId; + }); + const occupancyTypeField = occupancyType.occupancyTypeFields.find((currentOccupancyTypeField) => { + return (currentOccupancyTypeField.occupancyTypeFieldId === + occupancyTypeFieldId); + }); + let minimumLengthElement; + let maximumLengthElement; + let patternElement; + let occupancyTypeFieldValuesElement; + let editCloseModalFunction; + const updateMaximumLengthMin = () => { + maximumLengthElement.min = minimumLengthElement.value; + }; + const toggleInputFields = () => { + if (occupancyTypeFieldValuesElement.value === "") { + minimumLengthElement.disabled = false; + maximumLengthElement.disabled = false; + patternElement.disabled = false; + } + else { + minimumLengthElement.disabled = true; + maximumLengthElement.disabled = true; + patternElement.disabled = true; + } + }; + const doUpdate = (submitEvent) => { + submitEvent.preventDefault(); + cityssm.postJSON(urlPrefix + "/admin/doUpdateOccupancyTypeField", submitEvent.currentTarget, (responseJSON) => { + if (responseJSON.success) { + occupancyTypes = responseJSON.occupancyTypes; + editCloseModalFunction(); + renderOccupancyTypes(); + } + else { + bulmaJS.alert({ + title: "Error Updating Field", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + cityssm.openHtmlModal("adminOccupancyTypes-editOccupancyTypeField", { + onshow: (modalElement) => { + los.populateAliases(modalElement); + modalElement.querySelector("#occupancyTypeFieldEdit--occupancyTypeFieldId").value = occupancyTypeField.occupancyTypeFieldId.toString(); + 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(); + maximumLengthElement = modalElement.querySelector("#occupancyTypeFieldEdit--maximumLength"); + maximumLengthElement.value = + occupancyTypeField.maximumLength.toString(); + patternElement = modalElement.querySelector("#occupancyTypeFieldEdit--pattern"); + patternElement.value = occupancyTypeField.pattern; + occupancyTypeFieldValuesElement = modalElement.querySelector("#occupancyTypeFieldEdit--occupancyTypeFieldValues"); + occupancyTypeFieldValuesElement.value = + occupancyTypeField.occupancyTypeFieldValues; + toggleInputFields(); + }, + onshown: (modalElement, closeModalFunction) => { + editCloseModalFunction = closeModalFunction; + bulmaJS.toggleHtmlClipped(); + cityssm.enableNavBlocker(); + modalElement + .querySelector("form") + .addEventListener("submit", doUpdate); + minimumLengthElement.addEventListener("keyup", updateMaximumLengthMin); + updateMaximumLengthMin(); + occupancyTypeFieldValuesElement.addEventListener("keyup", toggleInputFields); + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped(); + cityssm.disableNavBlocker(); + } + }); + }; + const openEditOccupancyTypeFieldByClick = (clickEvent) => { + clickEvent.preventDefault(); + const occupancyTypeFieldId = Number.parseInt(clickEvent.currentTarget.closest(".container--occupancyTypeField").dataset.occupancyTypeFieldId, 10); + const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId, 10); + openEditOccupancyTypeField(occupancyTypeId, occupancyTypeFieldId); + }; const renderOccupancyTypes = () => { if (occupancyTypes.length === 0) { containerElement.innerHTML = @@ -304,6 +389,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); "") + "" + ""; + panelBlockElement + .querySelector(".button--editOccupancyTypeField") + .addEventListener("click", openEditOccupancyTypeFieldByClick); occupancyTypeContainer.append(panelBlockElement); } } diff --git a/public-typescript/adminOccupancyTypes.ts b/public-typescript/adminOccupancyTypes.ts index 0e7b85a1..a9696c3e 100644 --- a/public-typescript/adminOccupancyTypes.ts +++ b/public-typescript/adminOccupancyTypes.ts @@ -201,10 +201,6 @@ declare const bulmaJS: BulmaJS; 10 ); - const occupancyType = occupancyTypes.find((currentOccupancyType) => { - return occupancyTypeId === currentOccupancyType.occupancyTypeId; - }); - let addCloseModalFunction: () => void; const doAdd = (submitEvent: SubmitEvent) => { @@ -217,6 +213,7 @@ declare const bulmaJS: BulmaJS; success: boolean; errorMessage?: string; occupancyTypes?: recordTypes.OccupancyType[]; + occupancyTypeFieldId?: number; }) => { if (responseJSON.success) { expandedOccupancyTypes.add(occupancyTypeId); @@ -224,6 +221,11 @@ declare const bulmaJS: BulmaJS; addCloseModalFunction(); occupancyTypes = responseJSON.occupancyTypes; renderOccupancyTypes(); + + openEditOccupancyTypeField( + occupancyTypeId, + responseJSON.occupancyTypeFieldId + ); } else { bulmaJS.alert({ title: "Error Adding Field", @@ -338,6 +340,175 @@ declare const bulmaJS: BulmaJS; ); }; + const openEditOccupancyTypeField = ( + occupancyTypeId: number, + occupancyTypeFieldId: number + ) => { + const occupancyType = occupancyTypes.find((currentOccupancyType) => { + return currentOccupancyType.occupancyTypeId === occupancyTypeId; + }); + + const occupancyTypeField = occupancyType.occupancyTypeFields.find( + (currentOccupancyTypeField) => { + return ( + currentOccupancyTypeField.occupancyTypeFieldId === + occupancyTypeFieldId + ); + } + ); + + let minimumLengthElement: HTMLInputElement; + let maximumLengthElement: HTMLInputElement; + let patternElement: HTMLInputElement; + let occupancyTypeFieldValuesElement: HTMLTextAreaElement; + + let editCloseModalFunction: () => void; + + const updateMaximumLengthMin = () => { + maximumLengthElement.min = minimumLengthElement.value; + }; + + const toggleInputFields = () => { + if (occupancyTypeFieldValuesElement.value === "") { + minimumLengthElement.disabled = false; + maximumLengthElement.disabled = false; + patternElement.disabled = false; + } else { + minimumLengthElement.disabled = true; + maximumLengthElement.disabled = true; + patternElement.disabled = true; + } + }; + + const doUpdate = (submitEvent: SubmitEvent) => { + submitEvent.preventDefault(); + + cityssm.postJSON( + urlPrefix + "/admin/doUpdateOccupancyTypeField", + submitEvent.currentTarget, + (responseJSON: { + success: boolean; + errorMessage?: string; + occupancyTypes?: recordTypes.OccupancyType[]; + }) => { + if (responseJSON.success) { + occupancyTypes = responseJSON.occupancyTypes; + editCloseModalFunction(); + renderOccupancyTypes(); + } else { + bulmaJS.alert({ + title: "Error Updating Field", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + } + ); + }; + + cityssm.openHtmlModal("adminOccupancyTypes-editOccupancyTypeField", { + onshow: (modalElement) => { + los.populateAliases(modalElement); + + ( + modalElement.querySelector( + "#occupancyTypeFieldEdit--occupancyTypeFieldId" + ) as HTMLInputElement + ).value = occupancyTypeField.occupancyTypeFieldId.toString(); + + ( + modalElement.querySelector( + "#occupancyTypeFieldEdit--occupancyTypeField" + ) as HTMLInputElement + ).value = occupancyTypeField.occupancyTypeField; + + ( + modalElement.querySelector( + "#occupancyTypeFieldEdit--isRequired" + ) as HTMLSelectElement + ).value = occupancyTypeField.isRequired ? "1" : "0"; + + minimumLengthElement = modalElement.querySelector( + "#occupancyTypeFieldEdit--minimumLength" + ); + + minimumLengthElement.value = + occupancyTypeField.minimumLength.toString(); + + maximumLengthElement = modalElement.querySelector( + "#occupancyTypeFieldEdit--maximumLength" + ); + + maximumLengthElement.value = + occupancyTypeField.maximumLength.toString(); + + patternElement = modalElement.querySelector( + "#occupancyTypeFieldEdit--pattern" + ); + + patternElement.value = occupancyTypeField.pattern; + + occupancyTypeFieldValuesElement = modalElement.querySelector( + "#occupancyTypeFieldEdit--occupancyTypeFieldValues" + ); + + occupancyTypeFieldValuesElement.value = + occupancyTypeField.occupancyTypeFieldValues; + + toggleInputFields(); + }, + onshown: (modalElement, closeModalFunction) => { + editCloseModalFunction = closeModalFunction; + + bulmaJS.toggleHtmlClipped(); + cityssm.enableNavBlocker(); + + modalElement + .querySelector("form") + .addEventListener("submit", doUpdate); + + minimumLengthElement.addEventListener( + "keyup", + updateMaximumLengthMin + ); + updateMaximumLengthMin(); + + occupancyTypeFieldValuesElement.addEventListener( + "keyup", + toggleInputFields + ); + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped(); + cityssm.disableNavBlocker(); + } + }); + }; + + const openEditOccupancyTypeFieldByClick = (clickEvent: Event) => { + clickEvent.preventDefault(); + + const occupancyTypeFieldId = Number.parseInt( + ( + (clickEvent.currentTarget as HTMLElement).closest( + ".container--occupancyTypeField" + ) as HTMLElement + ).dataset.occupancyTypeFieldId, + 10 + ); + + const occupancyTypeId = Number.parseInt( + ( + (clickEvent.currentTarget as HTMLElement).closest( + ".container--occupancyType" + ) as HTMLElement + ).dataset.occupancyTypeId, + 10 + ); + + openEditOccupancyTypeField(occupancyTypeId, occupancyTypeFieldId); + }; + const renderOccupancyTypes = () => { if (occupancyTypes.length === 0) { containerElement.innerHTML = @@ -477,6 +648,13 @@ declare const bulmaJS: BulmaJS; "" + ""; + panelBlockElement + .querySelector(".button--editOccupancyTypeField") + .addEventListener( + "click", + openEditOccupancyTypeFieldByClick + ); + occupancyTypeContainer.append(panelBlockElement); } } diff --git a/public/html/adminOccupancyTypes-addOccupancyTypeField.html b/public/html/adminOccupancyTypes-addOccupancyTypeField.html index 43c899ac..33794c3f 100644 --- a/public/html/adminOccupancyTypes-addOccupancyTypeField.html +++ b/public/html/adminOccupancyTypes-addOccupancyTypeField.html @@ -11,7 +11,7 @@
- +
diff --git a/public/html/adminOccupancyTypes-editOccupancyTypeField.html b/public/html/adminOccupancyTypes-editOccupancyTypeField.html new file mode 100644 index 00000000..6174705a --- /dev/null +++ b/public/html/adminOccupancyTypes-editOccupancyTypeField.html @@ -0,0 +1,87 @@ + \ No newline at end of file diff --git a/public/javascripts/adminOccupancyTypes.min.js b/public/javascripts/adminOccupancyTypes.min.js index 3250a592..4a65cc0b 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,r()):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,r()):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);t.find(e=>o===e.occupancyTypeId);let n;const l=e=>{e.preventDefault(),cityssm.postJSON(c+"/admin/doAddOccupancyTypeField",e.currentTarget,e=>{e.success?(s.add(o),n(),t=e.occupancyTypes,r()):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,r()):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,r()):bulmaJS.alert({title:"Error Moving "+exports.aliases.occupancy+" Type",message:e.errorMessage,contextualColorName:"danger"})})},r=()=>{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='',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,r()):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()}})}),r()})(); \ No newline at end of file +"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,n=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 n=a.querySelectorAll(".panel-block");for(const e of n)e.classList.toggle("is-hidden")},o=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),n=t.find(e=>s===e.occupancyTypeId);let o;const l=e=>{e.preventDefault(),cityssm.postJSON(c+"/admin/doUpdateOccupancyType",e.currentTarget,e=>{e.success?(o(),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=n.occupancyType},onshown:(e,c)=>{o=c,e.querySelector("#occupancyTypeEdit--occupancyType").focus(),e.querySelector("form").addEventListener("submit",l),bulmaJS.toggleHtmlClipped()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},i=a=>{const n=Number.parseInt(a.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId,10);let o;const l=e=>{e.preventDefault(),cityssm.postJSON(c+"/admin/doAddOccupancyTypeField",e.currentTarget,e=>{e.success?(s.add(n),o(),t=e.occupancyTypes,y(),u(n,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=n.toString()},onshown:(e,c)=>{o=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 n=t.find(e=>e.occupancyTypeId===a).occupancyTypeFields.find(e=>e.occupancyTypeFieldId===s);let o,l,i,p,d;const u=()=>{l.min=o.value},r=()=>{""===p.value?(o.disabled=!1,l.disabled=!1,i.disabled=!1):(o.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"})})};cityssm.openHtmlModal("adminOccupancyTypes-editOccupancyTypeField",{onshow:c=>{e.populateAliases(c),c.querySelector("#occupancyTypeFieldEdit--occupancyTypeFieldId").value=n.occupancyTypeFieldId.toString(),c.querySelector("#occupancyTypeFieldEdit--occupancyTypeField").value=n.occupancyTypeField,c.querySelector("#occupancyTypeFieldEdit--isRequired").value=n.isRequired?"1":"0",(o=c.querySelector("#occupancyTypeFieldEdit--minimumLength")).value=n.minimumLength.toString(),(l=c.querySelector("#occupancyTypeFieldEdit--maximumLength")).value=n.maximumLength.toString(),(i=c.querySelector("#occupancyTypeFieldEdit--pattern")).value=n.pattern,(p=c.querySelector("#occupancyTypeFieldEdit--occupancyTypeFieldValues")).value=n.occupancyTypeFieldValues,r()},onshown:(e,c)=>{d=c,bulmaJS.toggleHtmlClipped(),cityssm.enableNavBlocker(),e.querySelector("form").addEventListener("submit",m),o.addEventListener("keyup",u),u(),p.addEventListener("keyup",r)},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",n),c.querySelector(".button--deleteOccupancyType").addEventListener("click",o),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 diff --git a/routes/admin.js b/routes/admin.js index 45079d22..fabf32b4 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -18,6 +18,7 @@ import handler_doMoveOccupancyTypeUp from "../handlers/admin-post/doMoveOccupanc import handler_doMoveOccupancyTypeDown from "../handlers/admin-post/doMoveOccupancyTypeDown.js"; import handler_doDeleteOccupancyType from "../handlers/admin-post/doDeleteOccupancyType.js"; import handler_doAddOccupancyTypeField from "../handlers/admin-post/doAddOccupancyTypeField.js"; +import handler_doUpdateOccupancyTypeField from "../handlers/admin-post/doUpdateOccupancyTypeField.js"; import handler_tables from "../handlers/admin-get/tables.js"; import handler_doAddWorkOrderType from "../handlers/admin-post/doAddWorkOrderType.js"; import handler_doUpdateWorkOrderType from "../handlers/admin-post/doUpdateWorkOrderType.js"; @@ -53,6 +54,7 @@ router.post("/doMoveOccupancyTypeUp", permissionHandlers.adminPostHandler, handl router.post("/doMoveOccupancyTypeDown", permissionHandlers.adminPostHandler, handler_doMoveOccupancyTypeDown); router.post("/doDeleteOccupancyType", permissionHandlers.adminPostHandler, handler_doDeleteOccupancyType); router.post("/doAddOccupancyTypeField", permissionHandlers.adminPostHandler, handler_doAddOccupancyTypeField); +router.post("/doUpdateOccupancyTypeField", permissionHandlers.adminPostHandler, handler_doUpdateOccupancyTypeField); router.get("/tables", permissionHandlers.adminGetHandler, handler_tables); router.post("/doAddWorkOrderType", permissionHandlers.adminPostHandler, handler_doAddWorkOrderType); router.post("/doUpdateWorkOrderType", permissionHandlers.adminPostHandler, handler_doUpdateWorkOrderType); diff --git a/routes/admin.ts b/routes/admin.ts index 81c590d1..0bcb3e98 100644 --- a/routes/admin.ts +++ b/routes/admin.ts @@ -29,6 +29,7 @@ import handler_doMoveOccupancyTypeDown from "../handlers/admin-post/doMoveOccupa import handler_doDeleteOccupancyType from "../handlers/admin-post/doDeleteOccupancyType.js"; import handler_doAddOccupancyTypeField from "../handlers/admin-post/doAddOccupancyTypeField.js"; +import handler_doUpdateOccupancyTypeField from "../handlers/admin-post/doUpdateOccupancyTypeField.js"; // Config Table Management @@ -164,6 +165,12 @@ router.post( handler_doAddOccupancyTypeField ); +router.post( + "/doUpdateOccupancyTypeField", + permissionHandlers.adminPostHandler, + handler_doUpdateOccupancyTypeField +); + /* * Config Tables */