From 0ba94ae199581cc7922bc9ce71e152394d366157 Mon Sep 17 00:00:00 2001 From: Dan Gowans Date: Tue, 6 Sep 2022 11:20:41 -0400 Subject: [PATCH] delete occupancy type --- .../admin-post/doDeleteOccupancyType.d.ts | 3 + handlers/admin-post/doDeleteOccupancyType.js | 11 +++ handlers/admin-post/doDeleteOccupancyType.ts | 21 +++++ .../lotOccupancyDB/deleteOccupancyType.d.ts | 3 + helpers/lotOccupancyDB/deleteOccupancyType.js | 17 ++++ helpers/lotOccupancyDB/deleteOccupancyType.ts | 33 +++++++ public-typescript/adminOccupancyTypes.js | 68 +++++++++++--- public-typescript/adminOccupancyTypes.ts | 88 ++++++++++++++++--- public/javascripts/adminOccupancyTypes.min.js | 2 +- routes/admin.js | 2 + routes/admin.ts | 7 ++ 11 files changed, 226 insertions(+), 29 deletions(-) create mode 100644 handlers/admin-post/doDeleteOccupancyType.d.ts create mode 100644 handlers/admin-post/doDeleteOccupancyType.js create mode 100644 handlers/admin-post/doDeleteOccupancyType.ts create mode 100644 helpers/lotOccupancyDB/deleteOccupancyType.d.ts create mode 100644 helpers/lotOccupancyDB/deleteOccupancyType.js create mode 100644 helpers/lotOccupancyDB/deleteOccupancyType.ts diff --git a/handlers/admin-post/doDeleteOccupancyType.d.ts b/handlers/admin-post/doDeleteOccupancyType.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/admin-post/doDeleteOccupancyType.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/doDeleteOccupancyType.js b/handlers/admin-post/doDeleteOccupancyType.js new file mode 100644 index 00000000..5828f947 --- /dev/null +++ b/handlers/admin-post/doDeleteOccupancyType.js @@ -0,0 +1,11 @@ +import { deleteOccupancyType } from "../../helpers/lotOccupancyDB/deleteOccupancyType.js"; +import { getOccupancyTypes } from "../../helpers/functions.cache.js"; +export const handler = async (request, response) => { + const success = deleteOccupancyType(request.body.occupancyTypeId, request.session); + const occupancyTypes = getOccupancyTypes(); + response.json({ + success, + occupancyTypes + }); +}; +export default handler; diff --git a/handlers/admin-post/doDeleteOccupancyType.ts b/handlers/admin-post/doDeleteOccupancyType.ts new file mode 100644 index 00000000..5ff491fd --- /dev/null +++ b/handlers/admin-post/doDeleteOccupancyType.ts @@ -0,0 +1,21 @@ +import type { RequestHandler } from "express"; + +import { deleteOccupancyType } from "../../helpers/lotOccupancyDB/deleteOccupancyType.js"; + +import { getOccupancyTypes } from "../../helpers/functions.cache.js"; + +export const handler: RequestHandler = async (request, response) => { + const success = deleteOccupancyType( + request.body.occupancyTypeId, + request.session + ); + + const occupancyTypes = getOccupancyTypes(); + + response.json({ + success, + occupancyTypes + }); +}; + +export default handler; diff --git a/helpers/lotOccupancyDB/deleteOccupancyType.d.ts b/helpers/lotOccupancyDB/deleteOccupancyType.d.ts new file mode 100644 index 00000000..2059c3aa --- /dev/null +++ b/helpers/lotOccupancyDB/deleteOccupancyType.d.ts @@ -0,0 +1,3 @@ +import type * as recordTypes from "../../types/recordTypes"; +export declare const deleteOccupancyType: (occupancyTypeId: number | string, requestSession: recordTypes.PartialSession) => boolean; +export default deleteOccupancyType; diff --git a/helpers/lotOccupancyDB/deleteOccupancyType.js b/helpers/lotOccupancyDB/deleteOccupancyType.js new file mode 100644 index 00000000..48aba46e --- /dev/null +++ b/helpers/lotOccupancyDB/deleteOccupancyType.js @@ -0,0 +1,17 @@ +import sqlite from "better-sqlite3"; +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { clearOccupancyTypesCache } from "../functions.cache.js"; +export const deleteOccupancyType = (occupancyTypeId, requestSession) => { + const database = sqlite(databasePath); + const rightNowMillis = Date.now(); + const result = database + .prepare("update OccupancyTypes" + + " set recordDelete_userName = ?," + + " recordDelete_timeMillis = ?" + + " where occupancyTypeId = ?") + .run(requestSession.user.userName, rightNowMillis, occupancyTypeId); + database.close(); + clearOccupancyTypesCache(); + return result.changes > 0; +}; +export default deleteOccupancyType; diff --git a/helpers/lotOccupancyDB/deleteOccupancyType.ts b/helpers/lotOccupancyDB/deleteOccupancyType.ts new file mode 100644 index 00000000..c1ed78cc --- /dev/null +++ b/helpers/lotOccupancyDB/deleteOccupancyType.ts @@ -0,0 +1,33 @@ +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"; + +export const deleteOccupancyType = ( + occupancyTypeId: number | string, + requestSession: recordTypes.PartialSession +): boolean => { + const database = sqlite(databasePath); + + const rightNowMillis = Date.now(); + + const result = database + .prepare( + "update OccupancyTypes" + + " set recordDelete_userName = ?," + + " recordDelete_timeMillis = ?" + + " where occupancyTypeId = ?" + ) + .run(requestSession.user.userName, rightNowMillis, occupancyTypeId); + + database.close(); + + clearOccupancyTypesCache(); + + return result.changes > 0; +}; + +export default deleteOccupancyType; diff --git a/public-typescript/adminOccupancyTypes.js b/public-typescript/adminOccupancyTypes.js index 1f37992e..04d92ecd 100644 --- a/public-typescript/adminOccupancyTypes.js +++ b/public-typescript/adminOccupancyTypes.js @@ -25,6 +25,37 @@ Object.defineProperty(exports, "__esModule", { value: true }); panelBlockElement.classList.toggle("is-hidden"); } }; + 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" + }); + } + }); + }; + 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: doDelete + } + }); + }; const openEditOccupancyType = (clickEvent) => { const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId, 10); const occupancyType = occupancyTypes.find((currentOccupancyType) => { @@ -145,20 +176,26 @@ Object.defineProperty(exports, "__esModule", { value: true }); "" + "") + ('
' + - '
' + - '" + - "
" + - '
' + - '" + - "
" + + ('
' + + '" + + "
") + + ('
' + + '" + + "
") + + ('
' + + '" + + "
") + ('
' + '
' + '
' + @@ -232,6 +269,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); occupancyTypeContainer .querySelector(".button--editOccupancyType") .addEventListener("click", openEditOccupancyType); + occupancyTypeContainer + .querySelector(".button--deleteOccupancyType") + .addEventListener("click", deleteOccupancyType); occupancyTypeContainer .querySelector(".button--moveOccupancyTypeUp") .addEventListener("click", moveOccupancyTypeUp); diff --git a/public-typescript/adminOccupancyTypes.ts b/public-typescript/adminOccupancyTypes.ts index 4ef24a90..14f295e5 100644 --- a/public-typescript/adminOccupancyTypes.ts +++ b/public-typescript/adminOccupancyTypes.ts @@ -57,6 +57,56 @@ declare const bulmaJS: BulmaJS; } }; + const deleteOccupancyType = (clickEvent: Event) => { + const occupancyTypeId = Number.parseInt( + ( + (clickEvent.currentTarget as HTMLElement).closest( + ".container--occupancyType" + ) as HTMLElement + ).dataset.occupancyTypeId, + 10 + ); + + const doDelete = () => { + + cityssm.postJSON( + urlPrefix + "/admin/doDeleteOccupancyType", + { + 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" + }); + } + } + ); + }; + + 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: doDelete + } + }); + }; + const openEditOccupancyType = (clickEvent: Event) => { const occupancyTypeId = Number.parseInt( ( @@ -251,20 +301,26 @@ declare const bulmaJS: BulmaJS; "
" + "
") + ('
' + - '
' + - '" + - "
" + - '
' + - '" + - "
" + + ('
' + + '" + + "
") + + ('
' + + '" + + "
") + + ('
' + + '" + + "
") + ('
' + '
' + '
' + @@ -356,6 +412,10 @@ declare const bulmaJS: BulmaJS; .querySelector(".button--editOccupancyType") .addEventListener("click", openEditOccupancyType); + occupancyTypeContainer + .querySelector(".button--deleteOccupancyType") + .addEventListener("click", deleteOccupancyType); + occupancyTypeContainer .querySelector(".button--moveOccupancyTypeUp") .addEventListener("click", moveOccupancyTypeUp); diff --git a/public/javascripts/adminOccupancyTypes.min.js b/public/javascripts/adminOccupancyTypes.min.js index 5d965765..5afaea8a 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=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,p()):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()}})},l=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,p()):bulmaJS.alert({title:"Error Moving "+exports.aliases.occupancy+" Type",message:e.errorMessage,contextualColorName:"danger"})})},i=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,p()):bulmaJS.alert({title:"Error Moving "+exports.aliases.occupancy+" Type",message:e.errorMessage,contextualColorName:"danger"})})},p=()=>{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--editOccupancyType").addEventListener("click",n),c.querySelector(".button--moveOccupancyTypeUp").addEventListener("click",l),c.querySelector(".button--moveOccupancyTypeDown").addEventListener("click",i),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,p()):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()}})}),p()})(); \ No newline at end of file +"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 diff --git a/routes/admin.js b/routes/admin.js index 20cc8d87..641e6335 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -16,6 +16,7 @@ import handler_doAddOccupancyType from "../handlers/admin-post/doAddOccupancyTyp import handler_doUpdateOccupancyType from "../handlers/admin-post/doUpdateOccupancyType.js"; 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_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"; @@ -49,6 +50,7 @@ router.post("/doAddOccupancyType", permissionHandlers.adminPostHandler, handler_ router.post("/doUpdateOccupancyType", permissionHandlers.adminPostHandler, handler_doUpdateOccupancyType); router.post("/doMoveOccupancyTypeUp", permissionHandlers.adminPostHandler, handler_doMoveOccupancyTypeUp); router.post("/doMoveOccupancyTypeDown", permissionHandlers.adminPostHandler, handler_doMoveOccupancyTypeDown); +router.post("/doDeleteOccupancyType", permissionHandlers.adminPostHandler, handler_doDeleteOccupancyType); 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 2f7271a8..43f448c3 100644 --- a/routes/admin.ts +++ b/routes/admin.ts @@ -26,6 +26,7 @@ import handler_doAddOccupancyType from "../handlers/admin-post/doAddOccupancyTyp import handler_doUpdateOccupancyType from "../handlers/admin-post/doUpdateOccupancyType.js"; 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"; // Config Table Management @@ -147,6 +148,12 @@ router.post( handler_doMoveOccupancyTypeDown ); +router.post( + "/doDeleteOccupancyType", + permissionHandlers.adminPostHandler, + handler_doDeleteOccupancyType +); + /* * Config Tables