From b6808f15595928c4a1331a400adb5d32e294983b Mon Sep 17 00:00:00 2001 From: Dan Gowans Date: Tue, 6 Sep 2022 11:44:28 -0400 Subject: [PATCH] add occupancy type field --- .../admin-post/doAddOccupancyTypeField.d.ts | 3 + .../admin-post/doAddOccupancyTypeField.js | 12 +++ .../admin-post/doAddOccupancyTypeField.ts | 19 ++++ .../lotOccupancyDB/addOccupancyTypeField.d.ts | 4 +- .../lotOccupancyDB/addOccupancyTypeField.js | 4 +- .../lotOccupancyDB/addOccupancyTypeField.ts | 13 +-- public-typescript/adminOccupancyTypes.js | 53 ++++++++++- public-typescript/adminOccupancyTypes.ts | 89 ++++++++++++++++++- ...nOccupancyTypes-addOccupancyTypeField.html | 29 ++++++ public/javascripts/adminOccupancyTypes.min.js | 2 +- routes/admin.js | 2 + routes/admin.ts | 9 ++ 12 files changed, 223 insertions(+), 16 deletions(-) create mode 100644 handlers/admin-post/doAddOccupancyTypeField.d.ts create mode 100644 handlers/admin-post/doAddOccupancyTypeField.js create mode 100644 handlers/admin-post/doAddOccupancyTypeField.ts create mode 100644 public/html/adminOccupancyTypes-addOccupancyTypeField.html diff --git a/handlers/admin-post/doAddOccupancyTypeField.d.ts b/handlers/admin-post/doAddOccupancyTypeField.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/admin-post/doAddOccupancyTypeField.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/doAddOccupancyTypeField.js b/handlers/admin-post/doAddOccupancyTypeField.js new file mode 100644 index 00000000..9fff25b7 --- /dev/null +++ b/handlers/admin-post/doAddOccupancyTypeField.js @@ -0,0 +1,12 @@ +import { addOccupancyTypeField } from "../../helpers/lotOccupancyDB/addOccupancyTypeField.js"; +import { getOccupancyTypes } from "../../helpers/functions.cache.js"; +export const handler = async (request, response) => { + const occupancyTypeFieldId = addOccupancyTypeField(request.body, request.session); + const occupancyTypes = getOccupancyTypes(); + response.json({ + success: true, + occupancyTypeFieldId, + occupancyTypes + }); +}; +export default handler; diff --git a/handlers/admin-post/doAddOccupancyTypeField.ts b/handlers/admin-post/doAddOccupancyTypeField.ts new file mode 100644 index 00000000..980fbd9a --- /dev/null +++ b/handlers/admin-post/doAddOccupancyTypeField.ts @@ -0,0 +1,19 @@ +import type { RequestHandler } from "express"; + +import { addOccupancyTypeField } from "../../helpers/lotOccupancyDB/addOccupancyTypeField.js"; + +import { getOccupancyTypes } from "../../helpers/functions.cache.js"; + +export const handler: RequestHandler = async (request, response) => { + const occupancyTypeFieldId = addOccupancyTypeField(request.body, request.session); + + const occupancyTypes = getOccupancyTypes(); + + response.json({ + success: true, + occupancyTypeFieldId, + occupancyTypes + }); +}; + +export default handler; diff --git a/helpers/lotOccupancyDB/addOccupancyTypeField.d.ts b/helpers/lotOccupancyDB/addOccupancyTypeField.d.ts index d0a883c7..11381a1a 100644 --- a/helpers/lotOccupancyDB/addOccupancyTypeField.d.ts +++ b/helpers/lotOccupancyDB/addOccupancyTypeField.d.ts @@ -2,9 +2,9 @@ import type * as recordTypes from "../../types/recordTypes"; interface AddOccupancyTypeFieldForm { occupancyTypeId: string | number; occupancyTypeField: string; - occupancyTypeFieldValues: string; + occupancyTypeFieldValues?: string; isRequired?: string; - pattern: string; + pattern?: string; minimumLength: string | number; maximumLength: string | number; orderNumber?: number; diff --git a/helpers/lotOccupancyDB/addOccupancyTypeField.js b/helpers/lotOccupancyDB/addOccupancyTypeField.js index d10d2d3c..73116ee9 100644 --- a/helpers/lotOccupancyDB/addOccupancyTypeField.js +++ b/helpers/lotOccupancyDB/addOccupancyTypeField.js @@ -1,5 +1,6 @@ import sqlite from "better-sqlite3"; import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { clearOccupancyTypesCache } from "../functions.cache.js"; export const addOccupancyTypeField = (occupancyTypeFieldForm, requestSession) => { const database = sqlite(databasePath); const rightNowMillis = Date.now(); @@ -12,8 +13,9 @@ 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 || 0, requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis); + .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); database.close(); + clearOccupancyTypesCache(); return result.lastInsertRowid; }; export default addOccupancyTypeField; diff --git a/helpers/lotOccupancyDB/addOccupancyTypeField.ts b/helpers/lotOccupancyDB/addOccupancyTypeField.ts index 767e3f98..52ebb036 100644 --- a/helpers/lotOccupancyDB/addOccupancyTypeField.ts +++ b/helpers/lotOccupancyDB/addOccupancyTypeField.ts @@ -3,13 +3,14 @@ import sqlite from "better-sqlite3"; import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; import type * as recordTypes from "../../types/recordTypes"; +import { clearOccupancyTypesCache } from "../functions.cache.js"; interface AddOccupancyTypeFieldForm { occupancyTypeId: string | number; occupancyTypeField: string; - occupancyTypeFieldValues: string; + occupancyTypeFieldValues?: string; isRequired?: string; - pattern: string; + pattern?: string; minimumLength: string | number; maximumLength: string | number; orderNumber?: number; @@ -37,12 +38,12 @@ export const addOccupancyTypeField = ( .run( occupancyTypeFieldForm.occupancyTypeId, occupancyTypeFieldForm.occupancyTypeField, - occupancyTypeFieldForm.occupancyTypeFieldValues, + occupancyTypeFieldForm.occupancyTypeFieldValues || "", occupancyTypeFieldForm.isRequired ? 1 : 0, - occupancyTypeFieldForm.pattern, + occupancyTypeFieldForm.pattern || "", occupancyTypeFieldForm.minimumLength || 0, occupancyTypeFieldForm.maximumLength || 100, - occupancyTypeFieldForm.orderNumber || 0, + occupancyTypeFieldForm.orderNumber || -1, requestSession.user.userName, rightNowMillis, requestSession.user.userName, @@ -51,6 +52,8 @@ export const addOccupancyTypeField = ( database.close(); + clearOccupancyTypesCache(); + return result.lastInsertRowid as number; }; diff --git a/public-typescript/adminOccupancyTypes.js b/public-typescript/adminOccupancyTypes.js index 04d92ecd..505d3c15 100644 --- a/public-typescript/adminOccupancyTypes.js +++ b/public-typescript/adminOccupancyTypes.js @@ -48,7 +48,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); }; bulmaJS.confirm({ title: "Delete " + exports.aliases.occupancy + " Type", - message: "Are you sure you want to delete this " + exports.aliases.occupancy.toLowerCase() + " 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", @@ -100,6 +102,48 @@ 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(); + cityssm.postJSON(urlPrefix + "/admin/doAddOccupancyTypeField", submitEvent.currentTarget, (responseJSON) => { + if (responseJSON.success) { + expandedOccupancyTypes.add(occupancyTypeId); + addCloseModalFunction(); + occupancyTypes = responseJSON.occupancyTypes; + renderOccupancyTypes(); + } + 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(); + }, + onshown: (modalElement, closeModalFunction) => { + addCloseModalFunction = closeModalFunction; + modalElement.querySelector("#occupancyTypeFieldAdd--occupancyTypeField").focus(); + modalElement + .querySelector("form") + .addEventListener("submit", doAdd); + bulmaJS.toggleHtmlClipped(); + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped(); + } + }); + }; const moveOccupancyTypeUp = (clickEvent) => { clickEvent.preventDefault(); const occupancyTypeId = clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId; @@ -266,12 +310,15 @@ Object.defineProperty(exports, "__esModule", { value: true }); occupancyTypeContainer .querySelector(".button--toggleOccupancyTypeFields") .addEventListener("click", toggleOccupancyTypeFields); + occupancyTypeContainer + .querySelector(".button--deleteOccupancyType") + .addEventListener("click", deleteOccupancyType); occupancyTypeContainer .querySelector(".button--editOccupancyType") .addEventListener("click", openEditOccupancyType); occupancyTypeContainer - .querySelector(".button--deleteOccupancyType") - .addEventListener("click", deleteOccupancyType); + .querySelector(".button--addOccupancyTypeField") + .addEventListener("click", openAddOccupancyTypeField); occupancyTypeContainer .querySelector(".button--moveOccupancyTypeUp") .addEventListener("click", moveOccupancyTypeUp); diff --git a/public-typescript/adminOccupancyTypes.ts b/public-typescript/adminOccupancyTypes.ts index 14f295e5..0e7b85a1 100644 --- a/public-typescript/adminOccupancyTypes.ts +++ b/public-typescript/adminOccupancyTypes.ts @@ -68,7 +68,6 @@ declare const bulmaJS: BulmaJS; ); const doDelete = () => { - cityssm.postJSON( urlPrefix + "/admin/doDeleteOccupancyType", { @@ -98,7 +97,10 @@ declare const bulmaJS: BulmaJS; bulmaJS.confirm({ title: "Delete " + exports.aliases.occupancy + " Type", - message: "Are you sure you want to delete this " + exports.aliases.occupancy.toLowerCase() + " 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", @@ -189,6 +191,81 @@ declare const bulmaJS: BulmaJS; }); }; + const openAddOccupancyTypeField = (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 addCloseModalFunction: () => void; + + const doAdd = (submitEvent: SubmitEvent) => { + submitEvent.preventDefault(); + + cityssm.postJSON( + urlPrefix + "/admin/doAddOccupancyTypeField", + submitEvent.currentTarget, + (responseJSON: { + success: boolean; + errorMessage?: string; + occupancyTypes?: recordTypes.OccupancyType[]; + }) => { + if (responseJSON.success) { + expandedOccupancyTypes.add(occupancyTypeId); + + addCloseModalFunction(); + occupancyTypes = responseJSON.occupancyTypes; + renderOccupancyTypes(); + } 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" + ) as HTMLInputElement + ).value = occupancyTypeId.toString(); + }, + onshown: (modalElement, closeModalFunction) => { + addCloseModalFunction = closeModalFunction; + + ( + modalElement.querySelector( + "#occupancyTypeFieldAdd--occupancyTypeField" + ) as HTMLInputElement + ).focus(); + + modalElement + .querySelector("form") + .addEventListener("submit", doAdd); + + bulmaJS.toggleHtmlClipped(); + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped(); + } + }); + }; + const moveOccupancyTypeUp = (clickEvent: Event) => { clickEvent.preventDefault(); @@ -408,13 +485,17 @@ declare const bulmaJS: BulmaJS; .querySelector(".button--toggleOccupancyTypeFields") .addEventListener("click", toggleOccupancyTypeFields); + occupancyTypeContainer + .querySelector(".button--deleteOccupancyType") + .addEventListener("click", deleteOccupancyType); + occupancyTypeContainer .querySelector(".button--editOccupancyType") .addEventListener("click", openEditOccupancyType); occupancyTypeContainer - .querySelector(".button--deleteOccupancyType") - .addEventListener("click", deleteOccupancyType); + .querySelector(".button--addOccupancyTypeField") + .addEventListener("click", openAddOccupancyTypeField); occupancyTypeContainer .querySelector(".button--moveOccupancyTypeUp") diff --git a/public/html/adminOccupancyTypes-addOccupancyTypeField.html b/public/html/adminOccupancyTypes-addOccupancyTypeField.html new file mode 100644 index 00000000..43c899ac --- /dev/null +++ b/public/html/adminOccupancyTypes-addOccupancyTypeField.html @@ -0,0 +1,29 @@ + \ No newline at end of file diff --git a/public/javascripts/adminOccupancyTypes.min.js b/public/javascripts/adminOccupancyTypes.min.js index 5afaea8a..3250a592 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,a=document.querySelector("main").dataset.urlPrefix,c=document.querySelector("#container--occupancyTypes");let t=exports.occupancyTypes;delete exports.occupancyTypes;const s=new Set,o=e=>{const a=e.currentTarget,c=a.closest(".container--occupancyType"),t=Number.parseInt(c.dataset.occupancyTypeId,10);s.has(t)?s.delete(t):s.add(t),a.innerHTML=s.has(t)?'':'';const o=c.querySelectorAll(".panel-block");for(const e of o)e.classList.toggle("is-hidden")},n=e=>{const c=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(a+"/admin/doDeleteOccupancyType",{occupancyTypeId:c},e=>{e.success?(t=e.occupancyTypes,d()):bulmaJS.alert({title:"Error Deleting "+exports.aliases.occupancy+" Type",message:e.errorMessage,contextualColorName:"danger"})})}}})},l=c=>{const s=Number.parseInt(c.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId,10),o=t.find(e=>s===e.occupancyTypeId);let n;const l=e=>{e.preventDefault(),cityssm.postJSON(a+"/admin/doUpdateOccupancyType",e.currentTarget,e=>{e.success?(n(),t=e.occupancyTypes,d()):bulmaJS.alert({title:"Error Updating "+exports.aliases.occupancy+" Type",message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("adminOccupancyTypes-editOccupancyType",{onshow:a=>{e.populateAliases(a),a.querySelector("#occupancyTypeEdit--occupancyTypeId").value=s.toString(),a.querySelector("#occupancyTypeEdit--occupancyType").value=o.occupancyType},onshown:(e,a)=>{n=a,e.querySelector("#occupancyTypeEdit--occupancyType").focus(),e.querySelector("form").addEventListener("submit",l),bulmaJS.toggleHtmlClipped()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},i=e=>{e.preventDefault();const c=e.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId;cityssm.postJSON(a+"/admin/doMoveOccupancyTypeUp",{occupancyTypeId:c},e=>{e.success?(t=e.occupancyTypes,d()):bulmaJS.alert({title:"Error Moving "+exports.aliases.occupancy+" Type",message:e.errorMessage,contextualColorName:"danger"})})},p=e=>{e.preventDefault();const c=e.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId;cityssm.postJSON(a+"/admin/doMoveOccupancyTypeDown",{occupancyTypeId:c},e=>{e.success?(t=e.occupancyTypes,d()):bulmaJS.alert({title:"Error Moving "+exports.aliases.occupancy+" Type",message:e.errorMessage,contextualColorName:"danger"})})},d=()=>{if(0!==t.length){c.innerHTML="";for(const e of t){const a=document.createElement("div");if(a.className="panel container--occupancyType",a.dataset.occupancyTypeId=e.occupancyTypeId.toString(),a.innerHTML='

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

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

There are no additional fields.

');else for(const c 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=c.occupancyTypeFieldId.toString(),t.innerHTML='
',a.append(t)}a.querySelector(".button--toggleOccupancyTypeFields").addEventListener("click",o),a.querySelector(".button--editOccupancyType").addEventListener("click",l),a.querySelector(".button--deleteOccupancyType").addEventListener("click",n),a.querySelector(".button--moveOccupancyTypeUp").addEventListener("click",i),a.querySelector(".button--moveOccupancyTypeDown").addEventListener("click",p),c.append(a)}}else c.innerHTML='
There are no active '+exports.aliases.occupancy.toLowerCase()+" types.

"};document.querySelector("#button--addOccupancyType").addEventListener("click",()=>{let c;const s=e=>{e.preventDefault(),cityssm.postJSON(a+"/admin/doAddOccupancyType",e.currentTarget,e=>{e.success?(c(),t=e.occupancyTypes,d()):bulmaJS.alert({title:"Error Adding "+exports.aliases.occupancy+" Type",message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyType",{onshow:a=>{e.populateAliases(a)},onshown:(e,a)=>{c=a,e.querySelector("#occupancyTypeAdd--occupancyType").focus(),e.querySelector("form").addEventListener("submit",s),bulmaJS.toggleHtmlClipped()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})}),d()})(); \ 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,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 diff --git a/routes/admin.js b/routes/admin.js index 641e6335..45079d22 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -17,6 +17,7 @@ import handler_doUpdateOccupancyType from "../handlers/admin-post/doUpdateOccupa import handler_doMoveOccupancyTypeUp from "../handlers/admin-post/doMoveOccupancyTypeUp.js"; 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_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"; @@ -51,6 +52,7 @@ router.post("/doUpdateOccupancyType", permissionHandlers.adminPostHandler, handl router.post("/doMoveOccupancyTypeUp", permissionHandlers.adminPostHandler, handler_doMoveOccupancyTypeUp); router.post("/doMoveOccupancyTypeDown", permissionHandlers.adminPostHandler, handler_doMoveOccupancyTypeDown); router.post("/doDeleteOccupancyType", permissionHandlers.adminPostHandler, handler_doDeleteOccupancyType); +router.post("/doAddOccupancyTypeField", permissionHandlers.adminPostHandler, handler_doAddOccupancyTypeField); 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 43f448c3..81c590d1 100644 --- a/routes/admin.ts +++ b/routes/admin.ts @@ -28,6 +28,8 @@ 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"; + // Config Table Management import handler_tables from "../handlers/admin-get/tables.js"; @@ -154,6 +156,13 @@ router.post( handler_doDeleteOccupancyType ); +// Occupancy Type Fields + +router.post( + "/doAddOccupancyTypeField", + permissionHandlers.adminPostHandler, + handler_doAddOccupancyTypeField +); /* * Config Tables