diff --git a/handlers/admin-post/doMoveOccupancyTypeDown.d.ts b/handlers/admin-post/doMoveOccupancyTypeDown.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/admin-post/doMoveOccupancyTypeDown.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/doMoveOccupancyTypeDown.js b/handlers/admin-post/doMoveOccupancyTypeDown.js new file mode 100644 index 00000000..380142d3 --- /dev/null +++ b/handlers/admin-post/doMoveOccupancyTypeDown.js @@ -0,0 +1,11 @@ +import { moveOccupancyTypeDown } from "../../helpers/lotOccupancyDB/moveOccupancyTypeDown.js"; +import { getOccupancyTypes } from "../../helpers/functions.cache.js"; +export const handler = async (request, response) => { + const success = moveOccupancyTypeDown(request.body.occupancyTypeId); + const occupancyTypes = getOccupancyTypes(); + response.json({ + success, + occupancyTypes + }); +}; +export default handler; diff --git a/handlers/admin-post/doMoveOccupancyTypeDown.ts b/handlers/admin-post/doMoveOccupancyTypeDown.ts new file mode 100644 index 00000000..0e7e42b8 --- /dev/null +++ b/handlers/admin-post/doMoveOccupancyTypeDown.ts @@ -0,0 +1,18 @@ +import type { RequestHandler } from "express"; + +import { moveOccupancyTypeDown } from "../../helpers/lotOccupancyDB/moveOccupancyTypeDown.js"; + +import { getOccupancyTypes } from "../../helpers/functions.cache.js"; + +export const handler: RequestHandler = async (request, response) => { + const success = moveOccupancyTypeDown(request.body.occupancyTypeId); + + const occupancyTypes = getOccupancyTypes(); + + response.json({ + success, + occupancyTypes + }); +}; + +export default handler; diff --git a/handlers/admin-post/doMoveOccupancyTypeUp.d.ts b/handlers/admin-post/doMoveOccupancyTypeUp.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/admin-post/doMoveOccupancyTypeUp.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/doMoveOccupancyTypeUp.js b/handlers/admin-post/doMoveOccupancyTypeUp.js new file mode 100644 index 00000000..67477308 --- /dev/null +++ b/handlers/admin-post/doMoveOccupancyTypeUp.js @@ -0,0 +1,11 @@ +import { moveOccupancyTypeUp } from "../../helpers/lotOccupancyDB/moveOccupancyTypeUp.js"; +import { getOccupancyTypes } from "../../helpers/functions.cache.js"; +export const handler = async (request, response) => { + const success = moveOccupancyTypeUp(request.body.occupancyTypeId); + const occupancyTypes = getOccupancyTypes(); + response.json({ + success, + occupancyTypes + }); +}; +export default handler; diff --git a/handlers/admin-post/doMoveOccupancyTypeUp.ts b/handlers/admin-post/doMoveOccupancyTypeUp.ts new file mode 100644 index 00000000..286b14a3 --- /dev/null +++ b/handlers/admin-post/doMoveOccupancyTypeUp.ts @@ -0,0 +1,18 @@ +import type { RequestHandler } from "express"; + +import { moveOccupancyTypeUp } from "../../helpers/lotOccupancyDB/moveOccupancyTypeUp.js"; + +import { getOccupancyTypes } from "../../helpers/functions.cache.js"; + +export const handler: RequestHandler = async (request, response) => { + const success = moveOccupancyTypeUp(request.body.occupancyTypeId); + + const occupancyTypes = getOccupancyTypes(); + + response.json({ + success, + occupancyTypes + }); +}; + +export default handler; diff --git a/public-typescript/adminOccupancyTypes.js b/public-typescript/adminOccupancyTypes.js index e9f7c071..14d905a1 100644 --- a/public-typescript/adminOccupancyTypes.js +++ b/public-typescript/adminOccupancyTypes.js @@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const urlPrefix = document.querySelector("main").dataset.urlPrefix; const containerElement = document.querySelector("#container--occupancyTypes"); - const occupancyTypes = exports.occupancyTypes; + let occupancyTypes = exports.occupancyTypes; delete exports.occupancyTypes; const expandedOccupancyTypes = new Set(); const toggleOccupancyTypeFields = (clickEvent) => { @@ -24,6 +24,44 @@ Object.defineProperty(exports, "__esModule", { value: true }); panelBlockElement.classList.toggle("is-hidden"); } }; + const moveOccupancyTypeUp = (clickEvent) => { + clickEvent.preventDefault(); + const occupancyTypeId = clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId; + cityssm.postJSON(urlPrefix + "/admin/doMoveOccupancyTypeUp", { + occupancyTypeId + }, (responseJSON) => { + if (responseJSON.success) { + occupancyTypes = responseJSON.occupancyTypes; + renderOccupancyTypes(); + } + else { + bulmaJS.alert({ + title: "Error Moving Occupancy Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + const moveOccupancyTypeDown = (clickEvent) => { + clickEvent.preventDefault(); + const occupancyTypeId = clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId; + cityssm.postJSON(urlPrefix + "/admin/doMoveOccupancyTypeDown", { + occupancyTypeId + }, (responseJSON) => { + if (responseJSON.success) { + occupancyTypes = responseJSON.occupancyTypes; + renderOccupancyTypes(); + } + else { + bulmaJS.alert({ + title: "Error Moving Occupancy Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; const renderOccupancyTypes = () => { if (occupancyTypes.length === 0) { containerElement.innerHTML = @@ -142,6 +180,12 @@ Object.defineProperty(exports, "__esModule", { value: true }); occupancyTypeContainer .querySelector(".button--toggleOccupancyTypeFields") .addEventListener("click", toggleOccupancyTypeFields); + occupancyTypeContainer + .querySelector(".button--moveOccupancyTypeUp") + .addEventListener("click", moveOccupancyTypeUp); + occupancyTypeContainer + .querySelector(".button--moveOccupancyTypeDown") + .addEventListener("click", moveOccupancyTypeDown); containerElement.append(occupancyTypeContainer); } }; diff --git a/public-typescript/adminOccupancyTypes.ts b/public-typescript/adminOccupancyTypes.ts index 76b15ec2..75f0952c 100644 --- a/public-typescript/adminOccupancyTypes.ts +++ b/public-typescript/adminOccupancyTypes.ts @@ -17,7 +17,7 @@ declare const bulmaJS: BulmaJS; "#container--occupancyTypes" ) as HTMLElement; - const occupancyTypes: recordTypes.OccupancyType[] = exports.occupancyTypes; + let occupancyTypes: recordTypes.OccupancyType[] = exports.occupancyTypes; delete exports.occupancyTypes; const expandedOccupancyTypes = new Set(); @@ -55,6 +55,72 @@ declare const bulmaJS: BulmaJS; } }; + const moveOccupancyTypeUp = (clickEvent: Event) => { + clickEvent.preventDefault(); + + const occupancyTypeId = ( + (clickEvent.currentTarget as HTMLElement).closest( + ".container--occupancyType" + ) as HTMLElement + ).dataset.occupancyTypeId; + + cityssm.postJSON( + urlPrefix + "/admin/doMoveOccupancyTypeUp", + { + occupancyTypeId + }, + (responseJSON: { + success: boolean; + errorMessage?: string; + occupancyTypes?: recordTypes.OccupancyType[]; + }) => { + if (responseJSON.success) { + occupancyTypes = responseJSON.occupancyTypes; + renderOccupancyTypes(); + } else { + bulmaJS.alert({ + title: "Error Moving Occupancy Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + } + ); + }; + + const moveOccupancyTypeDown = (clickEvent: Event) => { + clickEvent.preventDefault(); + + const occupancyTypeId = ( + (clickEvent.currentTarget as HTMLElement).closest( + ".container--occupancyType" + ) as HTMLElement + ).dataset.occupancyTypeId; + + cityssm.postJSON( + urlPrefix + "/admin/doMoveOccupancyTypeDown", + { + occupancyTypeId + }, + (responseJSON: { + success: boolean; + errorMessage?: string; + occupancyTypes?: recordTypes.OccupancyType[]; + }) => { + if (responseJSON.success) { + occupancyTypes = responseJSON.occupancyTypes; + renderOccupancyTypes(); + } else { + bulmaJS.alert({ + title: "Error Moving Occupancy Type", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + } + ); + }; + const renderOccupancyTypes = () => { if (occupancyTypes.length === 0) { containerElement.innerHTML = @@ -196,6 +262,14 @@ declare const bulmaJS: BulmaJS; .querySelector(".button--toggleOccupancyTypeFields") .addEventListener("click", toggleOccupancyTypeFields); + occupancyTypeContainer + .querySelector(".button--moveOccupancyTypeUp") + .addEventListener("click", moveOccupancyTypeUp); + + occupancyTypeContainer + .querySelector(".button--moveOccupancyTypeDown") + .addEventListener("click", moveOccupancyTypeDown); + containerElement.append(occupancyTypeContainer); } }; diff --git a/public/javascripts/adminOccupancyTypes.min.js b/public/javascripts/adminOccupancyTypes.min.js index e7f1ce65..ba4ad039 100644 --- a/public/javascripts/adminOccupancyTypes.min.js +++ b/public/javascripts/adminOccupancyTypes.min.js @@ -1 +1 @@ -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{document.querySelector("main").dataset.urlPrefix;const e=document.querySelector("#container--occupancyTypes"),a=exports.occupancyTypes;delete exports.occupancyTypes;const s=new Set,t=e=>{const a=e.currentTarget,t=a.closest(".container--occupancyType"),i=Number.parseInt(t.dataset.occupancyTypeId,10);s.has(i)?s.delete(i):s.add(i),a.innerHTML=s.has(i)?'':'';const c=t.querySelectorAll(".panel-block");for(const e of c)e.classList.toggle("is-hidden")};(()=>{if(0!==a.length){e.innerHTML="";for(const i of a){const a=document.createElement("div");if(a.className="panel container--occupancyType",a.dataset.occupancyTypeId=i.occupancyTypeId.toString(),a.innerHTML='

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

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

There are no additional fields.

');else for(const e of i.occupancyTypeFields){const t=document.createElement("div");t.className="panel-block is-block container--occupancyTypeField",s.has(i.occupancyTypeId)||t.classList.add("is-hidden"),t.dataset.occupancyTypeFieldId=e.occupancyTypeFieldId.toString(),t.innerHTML='
',a.append(t)}a.querySelector(".button--toggleOccupancyTypeFields").addEventListener("click",t),e.append(a)}}else e.innerHTML='
There are no active '+exports.aliases.occupancy.toLowerCase()+" types.

"})()})(); \ No newline at end of file +"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 diff --git a/routes/admin.js b/routes/admin.js index b5e6acc9..e236665e 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -12,6 +12,8 @@ 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_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"; import handler_doAddWorkOrderType from "../handlers/admin-post/doAddWorkOrderType.js"; import handler_doUpdateWorkOrderType from "../handlers/admin-post/doUpdateWorkOrderType.js"; @@ -41,6 +43,8 @@ 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("/doMoveOccupancyTypeUp", permissionHandlers.adminPostHandler, handler_doMoveOccupancyTypeUp); +router.post("/doMoveOccupancyTypeDown", permissionHandlers.adminPostHandler, handler_doMoveOccupancyTypeDown); 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 47952623..2dd4160a 100644 --- a/routes/admin.ts +++ b/routes/admin.ts @@ -22,6 +22,9 @@ import handler_doDeleteFee from "../handlers/admin-post/doDeleteFee.js"; import handler_occupancyTypes from "../handlers/admin-get/occupancyTypes.js"; +import handler_doMoveOccupancyTypeUp from "../handlers/admin-post/doMoveOccupancyTypeUp.js"; +import handler_doMoveOccupancyTypeDown from "../handlers/admin-post/doMoveOccupancyTypeDown.js"; + // Config Table Management import handler_tables from "../handlers/admin-get/tables.js"; @@ -118,6 +121,19 @@ router.get( handler_occupancyTypes ); +router.post( + "/doMoveOccupancyTypeUp", + permissionHandlers.adminPostHandler, + handler_doMoveOccupancyTypeUp +); + +router.post( + "/doMoveOccupancyTypeDown", + permissionHandlers.adminPostHandler, + handler_doMoveOccupancyTypeDown +); + + /* * Config Tables */