diff --git a/handlers/admin-post/doAddOccupancyTypeField.d.ts b/handlers/admin-post/doAddOccupancyTypeField.d.ts
new file mode 100644
index 00000000..9621c611
--- /dev/null
+++ b/handlers/admin-post/doAddOccupancyTypeField.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/doAddOccupancyTypeField.js b/handlers/admin-post/doAddOccupancyTypeField.js
new file mode 100644
index 00000000..9fff25b7
--- /dev/null
+++ b/handlers/admin-post/doAddOccupancyTypeField.js
@@ -0,0 +1,12 @@
+import { addOccupancyTypeField } from "../../helpers/lotOccupancyDB/addOccupancyTypeField.js";
+import { getOccupancyTypes } from "../../helpers/functions.cache.js";
+export const handler = async (request, response) => {
+ const occupancyTypeFieldId = addOccupancyTypeField(request.body, request.session);
+ const occupancyTypes = getOccupancyTypes();
+ response.json({
+ success: true,
+ occupancyTypeFieldId,
+ occupancyTypes
+ });
+};
+export default handler;
diff --git a/handlers/admin-post/doAddOccupancyTypeField.ts b/handlers/admin-post/doAddOccupancyTypeField.ts
new file mode 100644
index 00000000..980fbd9a
--- /dev/null
+++ b/handlers/admin-post/doAddOccupancyTypeField.ts
@@ -0,0 +1,19 @@
+import type { RequestHandler } from "express";
+
+import { addOccupancyTypeField } from "../../helpers/lotOccupancyDB/addOccupancyTypeField.js";
+
+import { getOccupancyTypes } from "../../helpers/functions.cache.js";
+
+export const handler: RequestHandler = async (request, response) => {
+ const occupancyTypeFieldId = addOccupancyTypeField(request.body, request.session);
+
+ const occupancyTypes = getOccupancyTypes();
+
+ response.json({
+ success: true,
+ occupancyTypeFieldId,
+ occupancyTypes
+ });
+};
+
+export default handler;
diff --git a/helpers/lotOccupancyDB/addOccupancyTypeField.d.ts b/helpers/lotOccupancyDB/addOccupancyTypeField.d.ts
index d0a883c7..11381a1a 100644
--- a/helpers/lotOccupancyDB/addOccupancyTypeField.d.ts
+++ b/helpers/lotOccupancyDB/addOccupancyTypeField.d.ts
@@ -2,9 +2,9 @@ import type * as recordTypes from "../../types/recordTypes";
interface AddOccupancyTypeFieldForm {
occupancyTypeId: string | number;
occupancyTypeField: string;
- occupancyTypeFieldValues: string;
+ occupancyTypeFieldValues?: string;
isRequired?: string;
- pattern: string;
+ pattern?: string;
minimumLength: string | number;
maximumLength: string | number;
orderNumber?: number;
diff --git a/helpers/lotOccupancyDB/addOccupancyTypeField.js b/helpers/lotOccupancyDB/addOccupancyTypeField.js
index d10d2d3c..73116ee9 100644
--- a/helpers/lotOccupancyDB/addOccupancyTypeField.js
+++ b/helpers/lotOccupancyDB/addOccupancyTypeField.js
@@ -1,5 +1,6 @@
import sqlite from "better-sqlite3";
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
+import { clearOccupancyTypesCache } from "../functions.cache.js";
export const addOccupancyTypeField = (occupancyTypeFieldForm, requestSession) => {
const database = sqlite(databasePath);
const rightNowMillis = Date.now();
@@ -12,8 +13,9 @@ export const addOccupancyTypeField = (occupancyTypeFieldForm, requestSession) =>
" recordCreate_userName, recordCreate_timeMillis," +
" recordUpdate_userName, recordUpdate_timeMillis)" +
" values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
- .run(occupancyTypeFieldForm.occupancyTypeId, occupancyTypeFieldForm.occupancyTypeField, occupancyTypeFieldForm.occupancyTypeFieldValues, occupancyTypeFieldForm.isRequired ? 1 : 0, occupancyTypeFieldForm.pattern, occupancyTypeFieldForm.minimumLength || 0, occupancyTypeFieldForm.maximumLength || 100, occupancyTypeFieldForm.orderNumber || 0, requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis);
+ .run(occupancyTypeFieldForm.occupancyTypeId, occupancyTypeFieldForm.occupancyTypeField, occupancyTypeFieldForm.occupancyTypeFieldValues || "", occupancyTypeFieldForm.isRequired ? 1 : 0, occupancyTypeFieldForm.pattern || "", occupancyTypeFieldForm.minimumLength || 0, occupancyTypeFieldForm.maximumLength || 100, occupancyTypeFieldForm.orderNumber || -1, requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis);
database.close();
+ clearOccupancyTypesCache();
return result.lastInsertRowid;
};
export default addOccupancyTypeField;
diff --git a/helpers/lotOccupancyDB/addOccupancyTypeField.ts b/helpers/lotOccupancyDB/addOccupancyTypeField.ts
index 767e3f98..52ebb036 100644
--- a/helpers/lotOccupancyDB/addOccupancyTypeField.ts
+++ b/helpers/lotOccupancyDB/addOccupancyTypeField.ts
@@ -3,13 +3,14 @@ import sqlite from "better-sqlite3";
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
import type * as recordTypes from "../../types/recordTypes";
+import { clearOccupancyTypesCache } from "../functions.cache.js";
interface AddOccupancyTypeFieldForm {
occupancyTypeId: string | number;
occupancyTypeField: string;
- occupancyTypeFieldValues: string;
+ occupancyTypeFieldValues?: string;
isRequired?: string;
- pattern: string;
+ pattern?: string;
minimumLength: string | number;
maximumLength: string | number;
orderNumber?: number;
@@ -37,12 +38,12 @@ export const addOccupancyTypeField = (
.run(
occupancyTypeFieldForm.occupancyTypeId,
occupancyTypeFieldForm.occupancyTypeField,
- occupancyTypeFieldForm.occupancyTypeFieldValues,
+ occupancyTypeFieldForm.occupancyTypeFieldValues || "",
occupancyTypeFieldForm.isRequired ? 1 : 0,
- occupancyTypeFieldForm.pattern,
+ occupancyTypeFieldForm.pattern || "",
occupancyTypeFieldForm.minimumLength || 0,
occupancyTypeFieldForm.maximumLength || 100,
- occupancyTypeFieldForm.orderNumber || 0,
+ occupancyTypeFieldForm.orderNumber || -1,
requestSession.user.userName,
rightNowMillis,
requestSession.user.userName,
@@ -51,6 +52,8 @@ export const addOccupancyTypeField = (
database.close();
+ clearOccupancyTypesCache();
+
return result.lastInsertRowid as number;
};
diff --git a/public-typescript/adminOccupancyTypes.js b/public-typescript/adminOccupancyTypes.js
index 04d92ecd..505d3c15 100644
--- a/public-typescript/adminOccupancyTypes.js
+++ b/public-typescript/adminOccupancyTypes.js
@@ -48,7 +48,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
};
bulmaJS.confirm({
title: "Delete " + exports.aliases.occupancy + " Type",
- message: "Are you sure you want to delete this " + exports.aliases.occupancy.toLowerCase() + " 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",
@@ -100,6 +102,48 @@ Object.defineProperty(exports, "__esModule", { value: true });
}
});
};
+ const openAddOccupancyTypeField = (clickEvent) => {
+ const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId, 10);
+ const occupancyType = occupancyTypes.find((currentOccupancyType) => {
+ return occupancyTypeId === currentOccupancyType.occupancyTypeId;
+ });
+ let addCloseModalFunction;
+ const doAdd = (submitEvent) => {
+ submitEvent.preventDefault();
+ cityssm.postJSON(urlPrefix + "/admin/doAddOccupancyTypeField", submitEvent.currentTarget, (responseJSON) => {
+ if (responseJSON.success) {
+ expandedOccupancyTypes.add(occupancyTypeId);
+ addCloseModalFunction();
+ occupancyTypes = responseJSON.occupancyTypes;
+ renderOccupancyTypes();
+ }
+ else {
+ bulmaJS.alert({
+ title: "Error Adding Field",
+ message: responseJSON.errorMessage,
+ contextualColorName: "danger"
+ });
+ }
+ });
+ };
+ cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyTypeField", {
+ onshow: (modalElement) => {
+ los.populateAliases(modalElement);
+ modalElement.querySelector("#occupancyTypeFieldAdd--occupancyTypeId").value = occupancyTypeId.toString();
+ },
+ onshown: (modalElement, closeModalFunction) => {
+ addCloseModalFunction = closeModalFunction;
+ modalElement.querySelector("#occupancyTypeFieldAdd--occupancyTypeField").focus();
+ modalElement
+ .querySelector("form")
+ .addEventListener("submit", doAdd);
+ bulmaJS.toggleHtmlClipped();
+ },
+ onremoved: () => {
+ bulmaJS.toggleHtmlClipped();
+ }
+ });
+ };
const moveOccupancyTypeUp = (clickEvent) => {
clickEvent.preventDefault();
const occupancyTypeId = clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId;
@@ -266,12 +310,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
occupancyTypeContainer
.querySelector(".button--toggleOccupancyTypeFields")
.addEventListener("click", toggleOccupancyTypeFields);
+ occupancyTypeContainer
+ .querySelector(".button--deleteOccupancyType")
+ .addEventListener("click", deleteOccupancyType);
occupancyTypeContainer
.querySelector(".button--editOccupancyType")
.addEventListener("click", openEditOccupancyType);
occupancyTypeContainer
- .querySelector(".button--deleteOccupancyType")
- .addEventListener("click", deleteOccupancyType);
+ .querySelector(".button--addOccupancyTypeField")
+ .addEventListener("click", openAddOccupancyTypeField);
occupancyTypeContainer
.querySelector(".button--moveOccupancyTypeUp")
.addEventListener("click", moveOccupancyTypeUp);
diff --git a/public-typescript/adminOccupancyTypes.ts b/public-typescript/adminOccupancyTypes.ts
index 14f295e5..0e7b85a1 100644
--- a/public-typescript/adminOccupancyTypes.ts
+++ b/public-typescript/adminOccupancyTypes.ts
@@ -68,7 +68,6 @@ declare const bulmaJS: BulmaJS;
);
const doDelete = () => {
-
cityssm.postJSON(
urlPrefix + "/admin/doDeleteOccupancyType",
{
@@ -98,7 +97,10 @@ declare const bulmaJS: BulmaJS;
bulmaJS.confirm({
title: "Delete " + exports.aliases.occupancy + " Type",
- message: "Are you sure you want to delete this " + exports.aliases.occupancy.toLowerCase() + " 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",
@@ -189,6 +191,81 @@ declare const bulmaJS: BulmaJS;
});
};
+ const openAddOccupancyTypeField = (clickEvent: Event) => {
+ const occupancyTypeId = Number.parseInt(
+ (
+ (clickEvent.currentTarget as HTMLElement).closest(
+ ".container--occupancyType"
+ ) as HTMLElement
+ ).dataset.occupancyTypeId,
+ 10
+ );
+
+ const occupancyType = occupancyTypes.find((currentOccupancyType) => {
+ return occupancyTypeId === currentOccupancyType.occupancyTypeId;
+ });
+
+ let addCloseModalFunction: () => void;
+
+ const doAdd = (submitEvent: SubmitEvent) => {
+ submitEvent.preventDefault();
+
+ cityssm.postJSON(
+ urlPrefix + "/admin/doAddOccupancyTypeField",
+ submitEvent.currentTarget,
+ (responseJSON: {
+ success: boolean;
+ errorMessage?: string;
+ occupancyTypes?: recordTypes.OccupancyType[];
+ }) => {
+ if (responseJSON.success) {
+ expandedOccupancyTypes.add(occupancyTypeId);
+
+ addCloseModalFunction();
+ occupancyTypes = responseJSON.occupancyTypes;
+ renderOccupancyTypes();
+ } else {
+ bulmaJS.alert({
+ title: "Error Adding Field",
+ message: responseJSON.errorMessage,
+ contextualColorName: "danger"
+ });
+ }
+ }
+ );
+ };
+
+ cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyTypeField", {
+ onshow: (modalElement) => {
+ los.populateAliases(modalElement);
+
+ (
+ modalElement.querySelector(
+ "#occupancyTypeFieldAdd--occupancyTypeId"
+ ) as HTMLInputElement
+ ).value = occupancyTypeId.toString();
+ },
+ onshown: (modalElement, closeModalFunction) => {
+ addCloseModalFunction = closeModalFunction;
+
+ (
+ modalElement.querySelector(
+ "#occupancyTypeFieldAdd--occupancyTypeField"
+ ) as HTMLInputElement
+ ).focus();
+
+ modalElement
+ .querySelector("form")
+ .addEventListener("submit", doAdd);
+
+ bulmaJS.toggleHtmlClipped();
+ },
+ onremoved: () => {
+ bulmaJS.toggleHtmlClipped();
+ }
+ });
+ };
+
const moveOccupancyTypeUp = (clickEvent: Event) => {
clickEvent.preventDefault();
@@ -408,13 +485,17 @@ declare const bulmaJS: BulmaJS;
.querySelector(".button--toggleOccupancyTypeFields")
.addEventListener("click", toggleOccupancyTypeFields);
+ occupancyTypeContainer
+ .querySelector(".button--deleteOccupancyType")
+ .addEventListener("click", deleteOccupancyType);
+
occupancyTypeContainer
.querySelector(".button--editOccupancyType")
.addEventListener("click", openEditOccupancyType);
occupancyTypeContainer
- .querySelector(".button--deleteOccupancyType")
- .addEventListener("click", deleteOccupancyType);
+ .querySelector(".button--addOccupancyTypeField")
+ .addEventListener("click", openAddOccupancyTypeField);
occupancyTypeContainer
.querySelector(".button--moveOccupancyTypeUp")
diff --git a/public/html/adminOccupancyTypes-addOccupancyTypeField.html b/public/html/adminOccupancyTypes-addOccupancyTypeField.html
new file mode 100644
index 00000000..43c899ac
--- /dev/null
+++ b/public/html/adminOccupancyTypes-addOccupancyTypeField.html
@@ -0,0 +1,29 @@
+
\ No newline at end of file
diff --git a/public/javascripts/adminOccupancyTypes.min.js b/public/javascripts/adminOccupancyTypes.min.js
index 5afaea8a..3250a592 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,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=''+(s.has(e.occupancyTypeId)?' ':' ')+'
'+cityssm.escapeHTML(e.occupancyType)+' Delete
Edit '+exports.aliases.occupancy+' Type
Add Field
',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
+"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,r()):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,r()):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);t.find(e=>o===e.occupancyTypeId);let n;const l=e=>{e.preventDefault(),cityssm.postJSON(c+"/admin/doAddOccupancyTypeField",e.currentTarget,e=>{e.success?(s.add(o),n(),t=e.occupancyTypes,r()):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,r()):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,r()):bulmaJS.alert({title:"Error Moving "+exports.aliases.occupancy+" Type",message:e.errorMessage,contextualColorName:"danger"})})},r=()=>{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=''+(s.has(e.occupancyTypeId)?' ':' ')+'
'+cityssm.escapeHTML(e.occupancyType)+' Delete
Edit '+exports.aliases.occupancy+' Type
Add Field
',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--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,r()):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()}})}),r()})();
\ No newline at end of file
diff --git a/routes/admin.js b/routes/admin.js
index 641e6335..45079d22 100644
--- a/routes/admin.js
+++ b/routes/admin.js
@@ -17,6 +17,7 @@ import handler_doUpdateOccupancyType from "../handlers/admin-post/doUpdateOccupa
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_doAddOccupancyTypeField from "../handlers/admin-post/doAddOccupancyTypeField.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";
@@ -51,6 +52,7 @@ router.post("/doUpdateOccupancyType", permissionHandlers.adminPostHandler, handl
router.post("/doMoveOccupancyTypeUp", permissionHandlers.adminPostHandler, handler_doMoveOccupancyTypeUp);
router.post("/doMoveOccupancyTypeDown", permissionHandlers.adminPostHandler, handler_doMoveOccupancyTypeDown);
router.post("/doDeleteOccupancyType", permissionHandlers.adminPostHandler, handler_doDeleteOccupancyType);
+router.post("/doAddOccupancyTypeField", permissionHandlers.adminPostHandler, handler_doAddOccupancyTypeField);
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 43f448c3..81c590d1 100644
--- a/routes/admin.ts
+++ b/routes/admin.ts
@@ -28,6 +28,8 @@ import handler_doMoveOccupancyTypeUp from "../handlers/admin-post/doMoveOccupanc
import handler_doMoveOccupancyTypeDown from "../handlers/admin-post/doMoveOccupancyTypeDown.js";
import handler_doDeleteOccupancyType from "../handlers/admin-post/doDeleteOccupancyType.js";
+import handler_doAddOccupancyTypeField from "../handlers/admin-post/doAddOccupancyTypeField.js";
+
// Config Table Management
import handler_tables from "../handlers/admin-get/tables.js";
@@ -154,6 +156,13 @@ router.post(
handler_doDeleteOccupancyType
);
+// Occupancy Type Fields
+
+router.post(
+ "/doAddOccupancyTypeField",
+ permissionHandlers.adminPostHandler,
+ handler_doAddOccupancyTypeField
+);
/*
* Config Tables