From a4abbc055c3a25425295d3fee5d1f8e20ea259ce Mon Sep 17 00:00:00 2001 From: Dan Gowans Date: Tue, 6 Sep 2022 10:24:31 -0400 Subject: [PATCH] add occupancy type --- handlers/admin-post/doAddOccupancyType.d.ts | 3 + handlers/admin-post/doAddOccupancyType.js | 12 ++++ handlers/admin-post/doAddOccupancyType.ts | 19 +++++ helpers/lotOccupancyDB/addOccupancyType.js | 2 +- helpers/lotOccupancyDB/addOccupancyType.ts | 2 +- public-typescript/adminOccupancyTypes.js | 49 ++++++++++++- public-typescript/adminOccupancyTypes.ts | 71 ++++++++++++++++++- .../adminOccupancyTypes-addOccupancyType.html | 28 ++++++++ public/javascripts/adminOccupancyTypes.min.js | 2 +- routes/admin.js | 2 + routes/admin.ts | 7 ++ views/admin-occupancyTypes.ejs | 2 +- 12 files changed, 191 insertions(+), 8 deletions(-) create mode 100644 handlers/admin-post/doAddOccupancyType.d.ts create mode 100644 handlers/admin-post/doAddOccupancyType.js create mode 100644 handlers/admin-post/doAddOccupancyType.ts create mode 100644 public/html/adminOccupancyTypes-addOccupancyType.html diff --git a/handlers/admin-post/doAddOccupancyType.d.ts b/handlers/admin-post/doAddOccupancyType.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/admin-post/doAddOccupancyType.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/doAddOccupancyType.js b/handlers/admin-post/doAddOccupancyType.js new file mode 100644 index 00000000..82a0525c --- /dev/null +++ b/handlers/admin-post/doAddOccupancyType.js @@ -0,0 +1,12 @@ +import { addOccupancyType } from "../../helpers/lotOccupancyDB/addOccupancyType.js"; +import { getOccupancyTypes } from "../../helpers/functions.cache.js"; +export const handler = async (request, response) => { + const occupancyTypeId = addOccupancyType(request.body, request.session); + const occupancyTypes = getOccupancyTypes(); + response.json({ + success: true, + occupancyTypeId, + occupancyTypes + }); +}; +export default handler; diff --git a/handlers/admin-post/doAddOccupancyType.ts b/handlers/admin-post/doAddOccupancyType.ts new file mode 100644 index 00000000..255e1d22 --- /dev/null +++ b/handlers/admin-post/doAddOccupancyType.ts @@ -0,0 +1,19 @@ +import type { RequestHandler } from "express"; + +import { addOccupancyType } from "../../helpers/lotOccupancyDB/addOccupancyType.js"; + +import { getOccupancyTypes } from "../../helpers/functions.cache.js"; + +export const handler: RequestHandler = async (request, response) => { + const occupancyTypeId = addOccupancyType(request.body, request.session); + + const occupancyTypes = getOccupancyTypes(); + + response.json({ + success: true, + occupancyTypeId, + occupancyTypes + }); +}; + +export default handler; diff --git a/helpers/lotOccupancyDB/addOccupancyType.js b/helpers/lotOccupancyDB/addOccupancyType.js index 682cba5a..59fec62a 100644 --- a/helpers/lotOccupancyDB/addOccupancyType.js +++ b/helpers/lotOccupancyDB/addOccupancyType.js @@ -10,7 +10,7 @@ export const addOccupancyType = (occupancyTypeForm, requestSession) => { " recordCreate_userName, recordCreate_timeMillis," + " recordUpdate_userName, recordUpdate_timeMillis)" + " values (?, ?, ?, ?, ?, ?)") - .run(occupancyTypeForm.occupancyType, occupancyTypeForm.orderNumber || 0, requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis); + .run(occupancyTypeForm.occupancyType, occupancyTypeForm.orderNumber || -1, requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis); database.close(); clearOccupancyTypesCache(); return result.lastInsertRowid; diff --git a/helpers/lotOccupancyDB/addOccupancyType.ts b/helpers/lotOccupancyDB/addOccupancyType.ts index af31416f..cb59b05b 100644 --- a/helpers/lotOccupancyDB/addOccupancyType.ts +++ b/helpers/lotOccupancyDB/addOccupancyType.ts @@ -29,7 +29,7 @@ export const addOccupancyType = ( ) .run( occupancyTypeForm.occupancyType, - occupancyTypeForm.orderNumber || 0, + occupancyTypeForm.orderNumber || -1, requestSession.user.userName, rightNowMillis, requestSession.user.userName, diff --git a/public-typescript/adminOccupancyTypes.js b/public-typescript/adminOccupancyTypes.js index 14d905a1..0bd4224b 100644 --- a/public-typescript/adminOccupancyTypes.js +++ b/public-typescript/adminOccupancyTypes.js @@ -1,6 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); (() => { + const los = exports.los; const urlPrefix = document.querySelector("main").dataset.urlPrefix; const containerElement = document.querySelector("#container--occupancyTypes"); let occupancyTypes = exports.occupancyTypes; @@ -36,7 +37,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Moving Occupancy Type", + title: "Error Moving " + + exports.aliases.occupancy + + " Type", message: responseJSON.errorMessage, contextualColorName: "danger" }); @@ -55,7 +58,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Moving Occupancy Type", + title: "Error Moving " + + exports.aliases.occupancy + + " Type", message: responseJSON.errorMessage, contextualColorName: "danger" }); @@ -189,5 +194,45 @@ Object.defineProperty(exports, "__esModule", { value: true }); containerElement.append(occupancyTypeContainer); } }; + document + .querySelector("#button--addOccupancyType") + .addEventListener("click", () => { + let addCloseModalFunction; + const doAdd = (submitEvent) => { + submitEvent.preventDefault(); + cityssm.postJSON(urlPrefix + "/admin/doAddOccupancyType", submitEvent.currentTarget, (responseJSON) => { + 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").focus(); + modalElement + .querySelector("form") + .addEventListener("submit", doAdd); + bulmaJS.toggleHtmlClipped(); + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped(); + } + }); + }); renderOccupancyTypes(); })(); diff --git a/public-typescript/adminOccupancyTypes.ts b/public-typescript/adminOccupancyTypes.ts index 75f0952c..60fd68b8 100644 --- a/public-typescript/adminOccupancyTypes.ts +++ b/public-typescript/adminOccupancyTypes.ts @@ -11,6 +11,8 @@ declare const cityssm: cityssmGlobal; declare const bulmaJS: BulmaJS; (() => { + const los = exports.los as globalTypes.LOS; + const urlPrefix = document.querySelector("main").dataset.urlPrefix; const containerElement = document.querySelector( @@ -79,7 +81,10 @@ declare const bulmaJS: BulmaJS; renderOccupancyTypes(); } else { bulmaJS.alert({ - title: "Error Moving Occupancy Type", + title: + "Error Moving " + + exports.aliases.occupancy + + " Type", message: responseJSON.errorMessage, contextualColorName: "danger" }); @@ -112,7 +117,10 @@ declare const bulmaJS: BulmaJS; renderOccupancyTypes(); } else { bulmaJS.alert({ - title: "Error Moving Occupancy Type", + title: + "Error Moving " + + exports.aliases.occupancy + + " Type", message: responseJSON.errorMessage, contextualColorName: "danger" }); @@ -274,5 +282,64 @@ declare const bulmaJS: BulmaJS; } }; + document + .querySelector("#button--addOccupancyType") + .addEventListener("click", () => { + let addCloseModalFunction: () => void; + + 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.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/html/adminOccupancyTypes-addOccupancyType.html b/public/html/adminOccupancyTypes-addOccupancyType.html new file mode 100644 index 00000000..ccaffb39 --- /dev/null +++ b/public/html/adminOccupancyTypes-addOccupancyType.html @@ -0,0 +1,28 @@ + \ No newline at end of file diff --git a/public/javascripts/adminOccupancyTypes.min.js b/public/javascripts/adminOccupancyTypes.min.js index ba4ad039..49d0bd39 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=document.querySelector("main").dataset.urlPrefix,a=document.querySelector("#container--occupancyTypes");let s=exports.occupancyTypes;delete exports.occupancyTypes;const c=new Set,t=e=>{const a=e.currentTarget,s=a.closest(".container--occupancyType"),t=Number.parseInt(s.dataset.occupancyTypeId,10);c.has(t)?c.delete(t):c.add(t),a.innerHTML=c.has(t)?'':'';const i=s.querySelectorAll(".panel-block");for(const e of i)e.classList.toggle("is-hidden")},i=a=>{a.preventDefault();const c=a.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId;cityssm.postJSON(e+"/admin/doMoveOccupancyTypeUp",{occupancyTypeId:c},e=>{e.success?(s=e.occupancyTypes,o()):bulmaJS.alert({title:"Error Moving Occupancy Type",message:e.errorMessage,contextualColorName:"danger"})})},n=a=>{a.preventDefault();const c=a.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId;cityssm.postJSON(e+"/admin/doMoveOccupancyTypeDown",{occupancyTypeId:c},e=>{e.success?(s=e.occupancyTypes,o()):bulmaJS.alert({title:"Error Moving Occupancy Type",message:e.errorMessage,contextualColorName:"danger"})})},o=()=>{if(0!==s.length){a.innerHTML="";for(const e of s){const s=document.createElement("div");if(s.className="panel container--occupancyType",s.dataset.occupancyTypeId=e.occupancyTypeId.toString(),s.innerHTML='

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

',0===e.occupancyTypeFields.length)s.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",c.has(e.occupancyTypeId)||t.classList.add("is-hidden"),t.dataset.occupancyTypeFieldId=a.occupancyTypeFieldId.toString(),t.innerHTML='
',s.append(t)}s.querySelector(".button--toggleOccupancyTypeFields").addEventListener("click",t),s.querySelector(".button--moveOccupancyTypeUp").addEventListener("click",i),s.querySelector(".button--moveOccupancyTypeDown").addEventListener("click",n),a.append(s)}}else a.innerHTML='
There are no active '+exports.aliases.occupancy.toLowerCase()+" types.

"};o()})(); \ No newline at end of file +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=exports.los,a=document.querySelector("main").dataset.urlPrefix,s=document.querySelector("#container--occupancyTypes");let c=exports.occupancyTypes;delete exports.occupancyTypes;const t=new Set,o=e=>{const a=e.currentTarget,s=a.closest(".container--occupancyType"),c=Number.parseInt(s.dataset.occupancyTypeId,10);t.has(c)?t.delete(c):t.add(c),a.innerHTML=t.has(c)?'':'';const o=s.querySelectorAll(".panel-block");for(const e of o)e.classList.toggle("is-hidden")},n=e=>{e.preventDefault();const s=e.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId;cityssm.postJSON(a+"/admin/doMoveOccupancyTypeUp",{occupancyTypeId:s},e=>{e.success?(c=e.occupancyTypes,i()):bulmaJS.alert({title:"Error Moving "+exports.aliases.occupancy+" Type",message:e.errorMessage,contextualColorName:"danger"})})},l=e=>{e.preventDefault();const s=e.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId;cityssm.postJSON(a+"/admin/doMoveOccupancyTypeDown",{occupancyTypeId:s},e=>{e.success?(c=e.occupancyTypes,i()):bulmaJS.alert({title:"Error Moving "+exports.aliases.occupancy+" Type",message:e.errorMessage,contextualColorName:"danger"})})},i=()=>{if(0!==c.length){s.innerHTML="";for(const e of c){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 s of e.occupancyTypeFields){const c=document.createElement("div");c.className="panel-block is-block container--occupancyTypeField",t.has(e.occupancyTypeId)||c.classList.add("is-hidden"),c.dataset.occupancyTypeFieldId=s.occupancyTypeFieldId.toString(),c.innerHTML='
',a.append(c)}a.querySelector(".button--toggleOccupancyTypeFields").addEventListener("click",o),a.querySelector(".button--moveOccupancyTypeUp").addEventListener("click",n),a.querySelector(".button--moveOccupancyTypeDown").addEventListener("click",l),s.append(a)}}else s.innerHTML='
There are no active '+exports.aliases.occupancy.toLowerCase()+" types.

"};document.querySelector("#button--addOccupancyType").addEventListener("click",()=>{let s;const t=e=>{e.preventDefault(),cityssm.postJSON(a+"/admin/doAddOccupancyType",e.currentTarget,e=>{e.success?(s(),c=e.occupancyTypes,i()):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)=>{s=a,e.querySelector("#occupancyTypeAdd--occupancyType").focus(),e.querySelector("form").addEventListener("submit",t),bulmaJS.toggleHtmlClipped()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})}),i()})(); \ No newline at end of file diff --git a/routes/admin.js b/routes/admin.js index e236665e..642e4a93 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -12,6 +12,7 @@ import handler_doMoveFeeUp from "../handlers/admin-post/doMoveFeeUp.js"; import handler_doMoveFeeDown from "../handlers/admin-post/doMoveFeeDown.js"; import handler_doDeleteFee from "../handlers/admin-post/doDeleteFee.js"; import handler_occupancyTypes from "../handlers/admin-get/occupancyTypes.js"; +import handler_doAddOccupancyType from "../handlers/admin-post/doAddOccupancyType.js"; import handler_doMoveOccupancyTypeUp from "../handlers/admin-post/doMoveOccupancyTypeUp.js"; import handler_doMoveOccupancyTypeDown from "../handlers/admin-post/doMoveOccupancyTypeDown.js"; import handler_tables from "../handlers/admin-get/tables.js"; @@ -43,6 +44,7 @@ router.post("/doMoveFeeUp", permissionHandlers.adminPostHandler, handler_doMoveF router.post("/doMoveFeeDown", permissionHandlers.adminPostHandler, handler_doMoveFeeDown); router.post("/doDeleteFee", permissionHandlers.adminPostHandler, handler_doDeleteFee); router.get("/occupancyTypes", permissionHandlers.adminGetHandler, handler_occupancyTypes); +router.post("/doAddOccupancyType", permissionHandlers.adminPostHandler, handler_doAddOccupancyType); router.post("/doMoveOccupancyTypeUp", permissionHandlers.adminPostHandler, handler_doMoveOccupancyTypeUp); router.post("/doMoveOccupancyTypeDown", permissionHandlers.adminPostHandler, handler_doMoveOccupancyTypeDown); router.get("/tables", permissionHandlers.adminGetHandler, handler_tables); diff --git a/routes/admin.ts b/routes/admin.ts index 2dd4160a..733c56fa 100644 --- a/routes/admin.ts +++ b/routes/admin.ts @@ -22,6 +22,7 @@ import handler_doDeleteFee from "../handlers/admin-post/doDeleteFee.js"; import handler_occupancyTypes from "../handlers/admin-get/occupancyTypes.js"; +import handler_doAddOccupancyType from "../handlers/admin-post/doAddOccupancyType.js"; import handler_doMoveOccupancyTypeUp from "../handlers/admin-post/doMoveOccupancyTypeUp.js"; import handler_doMoveOccupancyTypeDown from "../handlers/admin-post/doMoveOccupancyTypeDown.js"; @@ -121,6 +122,12 @@ router.get( handler_occupancyTypes ); +router.post( + "/doAddOccupancyType", + permissionHandlers.adminPostHandler, + handler_doAddOccupancyType +); + router.post( "/doMoveOccupancyTypeUp", permissionHandlers.adminPostHandler, diff --git a/views/admin-occupancyTypes.ejs b/views/admin-occupancyTypes.ejs index eefd620c..b7688aca 100644 --- a/views/admin-occupancyTypes.ejs +++ b/views/admin-occupancyTypes.ejs @@ -33,7 +33,7 @@
-