diff --git a/handlers/admin-post/doDeleteOccupancyTypeField.d.ts b/handlers/admin-post/doDeleteOccupancyTypeField.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/admin-post/doDeleteOccupancyTypeField.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/doDeleteOccupancyTypeField.js b/handlers/admin-post/doDeleteOccupancyTypeField.js new file mode 100644 index 00000000..37cdabd6 --- /dev/null +++ b/handlers/admin-post/doDeleteOccupancyTypeField.js @@ -0,0 +1,11 @@ +import { deleteOccupancyTypeField } from "../../helpers/lotOccupancyDB/deleteOccupancyTypeField.js"; +import { getOccupancyTypes } from "../../helpers/functions.cache.js"; +export const handler = async (request, response) => { + const success = deleteOccupancyTypeField(request.body.occupancyTypeFieldId, request.session); + const occupancyTypes = getOccupancyTypes(); + response.json({ + success, + occupancyTypes + }); +}; +export default handler; diff --git a/handlers/admin-post/doDeleteOccupancyTypeField.ts b/handlers/admin-post/doDeleteOccupancyTypeField.ts new file mode 100644 index 00000000..b65accaa --- /dev/null +++ b/handlers/admin-post/doDeleteOccupancyTypeField.ts @@ -0,0 +1,21 @@ +import type { RequestHandler } from "express"; + +import { deleteOccupancyTypeField } from "../../helpers/lotOccupancyDB/deleteOccupancyTypeField.js"; + +import { getOccupancyTypes } from "../../helpers/functions.cache.js"; + +export const handler: RequestHandler = async (request, response) => { + const success = deleteOccupancyTypeField( + request.body.occupancyTypeFieldId, + request.session + ); + + const occupancyTypes = getOccupancyTypes(); + + response.json({ + success, + occupancyTypes + }); +}; + +export default handler; diff --git a/helpers/lotOccupancyDB/deleteOccupancyTypeField.d.ts b/helpers/lotOccupancyDB/deleteOccupancyTypeField.d.ts new file mode 100644 index 00000000..0bae386d --- /dev/null +++ b/helpers/lotOccupancyDB/deleteOccupancyTypeField.d.ts @@ -0,0 +1,3 @@ +import type * as recordTypes from "../../types/recordTypes"; +export declare const deleteOccupancyTypeField: (occupancyTypeFieldId: number | string, requestSession: recordTypes.PartialSession) => boolean; +export default deleteOccupancyTypeField; diff --git a/helpers/lotOccupancyDB/deleteOccupancyTypeField.js b/helpers/lotOccupancyDB/deleteOccupancyTypeField.js new file mode 100644 index 00000000..fb30e23c --- /dev/null +++ b/helpers/lotOccupancyDB/deleteOccupancyTypeField.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 deleteOccupancyTypeField = (occupancyTypeFieldId, requestSession) => { + const database = sqlite(databasePath); + const rightNowMillis = Date.now(); + const result = database + .prepare("update OccupancyTypeFields" + + " set recordDelete_userName = ?," + + " recordDelete_timeMillis = ?" + + " where occupancyTypeFieldId = ?") + .run(requestSession.user.userName, rightNowMillis, occupancyTypeFieldId); + database.close(); + clearOccupancyTypesCache(); + return result.changes > 0; +}; +export default deleteOccupancyTypeField; diff --git a/helpers/lotOccupancyDB/deleteOccupancyTypeField.ts b/helpers/lotOccupancyDB/deleteOccupancyTypeField.ts new file mode 100644 index 00000000..215a8914 --- /dev/null +++ b/helpers/lotOccupancyDB/deleteOccupancyTypeField.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 deleteOccupancyTypeField = ( + occupancyTypeFieldId: number | string, + requestSession: recordTypes.PartialSession +): boolean => { + const database = sqlite(databasePath); + + const rightNowMillis = Date.now(); + + const result = database + .prepare( + "update OccupancyTypeFields" + + " set recordDelete_userName = ?," + + " recordDelete_timeMillis = ?" + + " where occupancyTypeFieldId = ?" + ) + .run(requestSession.user.userName, rightNowMillis, occupancyTypeFieldId); + + database.close(); + + clearOccupancyTypesCache(); + + return result.changes > 0; +}; + +export default deleteOccupancyTypeField; diff --git a/public-typescript/adminOccupancyTypes.js b/public-typescript/adminOccupancyTypes.js index b495b6da..f83e78d8 100644 --- a/public-typescript/adminOccupancyTypes.js +++ b/public-typescript/adminOccupancyTypes.js @@ -229,6 +229,35 @@ Object.defineProperty(exports, "__esModule", { value: true }); } }); }; + const doDelete = () => { + const _doDelete = () => { + cityssm.postJSON(urlPrefix + "/admin/doDeleteOccupancyTypeField", { + occupancyTypeFieldId + }, (responseJSON) => { + if (responseJSON.success) { + occupancyTypes = responseJSON.occupancyTypes; + editCloseModalFunction(); + renderOccupancyTypes(); + } + else { + bulmaJS.alert({ + title: "Error Deleting Field", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + bulmaJS.confirm({ + title: "Delete Field", + message: "Are you sure you want to delete this field? Note that historical records that make use of this field will not be affected.", + contextualColorName: "warning", + okButton: { + text: "Yes, Delete Field", + callbackFunction: _doDelete + } + }); + }; cityssm.openHtmlModal("adminOccupancyTypes-editOccupancyTypeField", { onshow: (modalElement) => { los.populateAliases(modalElement); @@ -250,6 +279,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); }, onshown: (modalElement, closeModalFunction) => { editCloseModalFunction = closeModalFunction; + bulmaJS.init(modalElement); bulmaJS.toggleHtmlClipped(); cityssm.enableNavBlocker(); modalElement @@ -258,6 +288,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); minimumLengthElement.addEventListener("keyup", updateMaximumLengthMin); updateMaximumLengthMin(); occupancyTypeFieldValuesElement.addEventListener("keyup", toggleInputFields); + modalElement + .querySelector("#button--deleteOccupancyTypeField") + .addEventListener("click", doDelete); }, onremoved: () => { bulmaJS.toggleHtmlClipped(); diff --git a/public-typescript/adminOccupancyTypes.ts b/public-typescript/adminOccupancyTypes.ts index a9696c3e..9d4893a7 100644 --- a/public-typescript/adminOccupancyTypes.ts +++ b/public-typescript/adminOccupancyTypes.ts @@ -6,6 +6,7 @@ import type * as recordTypes from "../types/recordTypes"; import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; import type { BulmaJS } from "@cityssm/bulma-js/types"; +import { response } from "express"; declare const cityssm: cityssmGlobal; declare const bulmaJS: BulmaJS; @@ -406,6 +407,45 @@ declare const bulmaJS: BulmaJS; ); }; + const doDelete = () => { + const _doDelete = () => { + cityssm.postJSON( + urlPrefix + "/admin/doDeleteOccupancyTypeField", + { + occupancyTypeFieldId + }, + (responseJSON: { + success: boolean; + errorMessage?: string; + occupancyTypes?: recordTypes.OccupancyType[]; + }) => { + if (responseJSON.success) { + occupancyTypes = responseJSON.occupancyTypes; + editCloseModalFunction(); + renderOccupancyTypes(); + } else { + bulmaJS.alert({ + title: "Error Deleting Field", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + } + ); + }; + + bulmaJS.confirm({ + title: "Delete Field", + message: + "Are you sure you want to delete this field? Note that historical records that make use of this field will not be affected.", + contextualColorName: "warning", + okButton: { + text: "Yes, Delete Field", + callbackFunction: _doDelete + } + }); + }; + cityssm.openHtmlModal("adminOccupancyTypes-editOccupancyTypeField", { onshow: (modalElement) => { los.populateAliases(modalElement); @@ -460,6 +500,7 @@ declare const bulmaJS: BulmaJS; onshown: (modalElement, closeModalFunction) => { editCloseModalFunction = closeModalFunction; + bulmaJS.init(modalElement); bulmaJS.toggleHtmlClipped(); cityssm.enableNavBlocker(); @@ -477,6 +518,10 @@ declare const bulmaJS: BulmaJS; "keyup", toggleInputFields ); + + modalElement + .querySelector("#button--deleteOccupancyTypeField") + .addEventListener("click", doDelete); }, onremoved: () => { bulmaJS.toggleHtmlClipped(); diff --git a/public/html/adminOccupancyTypes-editOccupancyTypeField.html b/public/html/adminOccupancyTypes-editOccupancyTypeField.html index c57536a1..0b8b8d6c 100644 --- a/public/html/adminOccupancyTypes-editOccupancyTypeField.html +++ b/public/html/adminOccupancyTypes-editOccupancyTypeField.html @@ -81,6 +81,24 @@ Update Field + diff --git a/public/javascripts/adminOccupancyTypes.min.js b/public/javascripts/adminOccupancyTypes.min.js index 4a65cc0b..e233e373 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,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 +"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,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),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,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=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);let n;const l=e=>{e.preventDefault(),cityssm.postJSON(c+"/admin/doAddOccupancyTypeField",e.currentTarget,e=>{e.success?(s.add(o),n(),t=e.occupancyTypes,y(),u(o,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=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,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 o=t.find(e=>e.occupancyTypeId===a).occupancyTypeFields.find(e=>e.occupancyTypeFieldId===s);let n,l,i,p,d;const u=()=>{l.min=n.value},r=()=>{""===p.value?(n.disabled=!1,l.disabled=!1,i.disabled=!1):(n.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"})})},T=()=>{bulmaJS.confirm({title:"Delete Field",message:"Are you sure you want to delete this field? Note that historical records that make use of this field will not be affected.",contextualColorName:"warning",okButton:{text:"Yes, Delete Field",callbackFunction:()=>{cityssm.postJSON(c+"/admin/doDeleteOccupancyTypeField",{occupancyTypeFieldId:s},e=>{e.success?(t=e.occupancyTypes,d(),y()):bulmaJS.alert({title:"Error Deleting Field",message:e.errorMessage,contextualColorName:"danger"})})}}})};cityssm.openHtmlModal("adminOccupancyTypes-editOccupancyTypeField",{onshow:c=>{e.populateAliases(c),c.querySelector("#occupancyTypeFieldEdit--occupancyTypeFieldId").value=o.occupancyTypeFieldId.toString(),c.querySelector("#occupancyTypeFieldEdit--occupancyTypeField").value=o.occupancyTypeField,c.querySelector("#occupancyTypeFieldEdit--isRequired").value=o.isRequired?"1":"0",(n=c.querySelector("#occupancyTypeFieldEdit--minimumLength")).value=o.minimumLength.toString(),(l=c.querySelector("#occupancyTypeFieldEdit--maximumLength")).value=o.maximumLength.toString(),(i=c.querySelector("#occupancyTypeFieldEdit--pattern")).value=o.pattern,(p=c.querySelector("#occupancyTypeFieldEdit--occupancyTypeFieldValues")).value=o.occupancyTypeFieldValues,r()},onshown:(e,c)=>{d=c,bulmaJS.init(e),bulmaJS.toggleHtmlClipped(),cityssm.enableNavBlocker(),e.querySelector("form").addEventListener("submit",m),n.addEventListener("keyup",u),u(),p.addEventListener("keyup",r),e.querySelector("#button--deleteOccupancyTypeField").addEventListener("click",T)},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",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,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 4dee9cd6..69c676d3 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -19,6 +19,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"; +import handler_doDeleteOccupancyTypeField from "../handlers/admin-post/doDeleteOccupancyTypeField.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"; @@ -60,6 +61,7 @@ router.post("/doMoveOccupancyTypeDown", permissionHandlers.adminPostHandler, han router.post("/doDeleteOccupancyType", permissionHandlers.adminPostHandler, handler_doDeleteOccupancyType); router.post("/doAddOccupancyTypeField", permissionHandlers.adminPostHandler, handler_doAddOccupancyTypeField); router.post("/doUpdateOccupancyTypeField", permissionHandlers.adminPostHandler, handler_doUpdateOccupancyTypeField); +router.post("/doDeleteOccupancyTypeField", permissionHandlers.adminPostHandler, handler_doDeleteOccupancyTypeField); 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 d57a0bb3..49b371ed 100644 --- a/routes/admin.ts +++ b/routes/admin.ts @@ -30,6 +30,7 @@ import handler_doDeleteOccupancyType from "../handlers/admin-post/doDeleteOccupa import handler_doAddOccupancyTypeField from "../handlers/admin-post/doAddOccupancyTypeField.js"; import handler_doUpdateOccupancyTypeField from "../handlers/admin-post/doUpdateOccupancyTypeField.js"; +import handler_doDeleteOccupancyTypeField from "../handlers/admin-post/doDeleteOccupancyTypeField.js"; // Config Table Management @@ -177,6 +178,12 @@ router.post( handler_doUpdateOccupancyTypeField ); +router.post( + "/doDeleteOccupancyTypeField", + permissionHandlers.adminPostHandler, + handler_doDeleteOccupancyTypeField +); + /* * Config Tables */