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=''+(c.has(e.occupancyTypeId)?' ':' ')+'
'+cityssm.escapeHTML(e.occupancyType)+' Edit '+exports.aliases.occupancy+' Type
Add Field
',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=''+(t.has(e.occupancyTypeId)?' ':' ')+'
'+cityssm.escapeHTML(e.occupancyType)+' Edit '+exports.aliases.occupancy+' Type
Add Field
',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 @@
-
+
Add <%= configFunctions.getProperty("aliases.occupancy") %> Type