diff --git a/handlers/admin-post/doMoveOccupancyTypeFieldDown.d.ts b/handlers/admin-post/doMoveOccupancyTypeFieldDown.d.ts
new file mode 100644
index 00000000..9621c611
--- /dev/null
+++ b/handlers/admin-post/doMoveOccupancyTypeFieldDown.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/doMoveOccupancyTypeFieldDown.js b/handlers/admin-post/doMoveOccupancyTypeFieldDown.js
new file mode 100644
index 00000000..e89e6459
--- /dev/null
+++ b/handlers/admin-post/doMoveOccupancyTypeFieldDown.js
@@ -0,0 +1,13 @@
+import { moveOccupancyTypeFieldDown } from "../../helpers/lotOccupancyDB/moveOccupancyTypeFieldDown.js";
+import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js";
+export const handler = async (request, response) => {
+ const success = moveOccupancyTypeFieldDown(request.body.occupancyTypeFieldId);
+ const occupancyTypes = getOccupancyTypes();
+ const allOccupancyTypeFields = getAllOccupancyTypeFields();
+ response.json({
+ success,
+ occupancyTypes,
+ allOccupancyTypeFields
+ });
+};
+export default handler;
diff --git a/handlers/admin-post/doMoveOccupancyTypeFieldDown.ts b/handlers/admin-post/doMoveOccupancyTypeFieldDown.ts
new file mode 100644
index 00000000..bfc71130
--- /dev/null
+++ b/handlers/admin-post/doMoveOccupancyTypeFieldDown.ts
@@ -0,0 +1,20 @@
+import type { RequestHandler } from "express";
+
+import { moveOccupancyTypeFieldDown } from "../../helpers/lotOccupancyDB/moveOccupancyTypeFieldDown.js";
+
+import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js";
+
+export const handler: RequestHandler = async (request, response) => {
+ const success = moveOccupancyTypeFieldDown(request.body.occupancyTypeFieldId);
+
+ const occupancyTypes = getOccupancyTypes();
+ const allOccupancyTypeFields = getAllOccupancyTypeFields();
+
+ response.json({
+ success,
+ occupancyTypes,
+ allOccupancyTypeFields
+ });
+};
+
+export default handler;
diff --git a/handlers/admin-post/doMoveOccupancyTypeFieldUp.d.ts b/handlers/admin-post/doMoveOccupancyTypeFieldUp.d.ts
new file mode 100644
index 00000000..9621c611
--- /dev/null
+++ b/handlers/admin-post/doMoveOccupancyTypeFieldUp.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/doMoveOccupancyTypeFieldUp.js b/handlers/admin-post/doMoveOccupancyTypeFieldUp.js
new file mode 100644
index 00000000..5f9d0d5a
--- /dev/null
+++ b/handlers/admin-post/doMoveOccupancyTypeFieldUp.js
@@ -0,0 +1,13 @@
+import { moveOccupancyTypeFieldUp } from "../../helpers/lotOccupancyDB/moveOccupancyTypeFieldUp.js";
+import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js";
+export const handler = async (request, response) => {
+ const success = moveOccupancyTypeFieldUp(request.body.occupancyTypeFieldId);
+ const occupancyTypes = getOccupancyTypes();
+ const allOccupancyTypeFields = getAllOccupancyTypeFields();
+ response.json({
+ success,
+ occupancyTypes,
+ allOccupancyTypeFields
+ });
+};
+export default handler;
diff --git a/handlers/admin-post/doMoveOccupancyTypeFieldUp.ts b/handlers/admin-post/doMoveOccupancyTypeFieldUp.ts
new file mode 100644
index 00000000..2853d561
--- /dev/null
+++ b/handlers/admin-post/doMoveOccupancyTypeFieldUp.ts
@@ -0,0 +1,20 @@
+import type { RequestHandler } from "express";
+
+import { moveOccupancyTypeFieldUp } from "../../helpers/lotOccupancyDB/moveOccupancyTypeFieldUp.js";
+
+import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js";
+
+export const handler: RequestHandler = async (request, response) => {
+ const success = moveOccupancyTypeFieldUp(request.body.occupancyTypeFieldId);
+
+ const occupancyTypes = getOccupancyTypes();
+ const allOccupancyTypeFields = getAllOccupancyTypeFields();
+
+ response.json({
+ success,
+ occupancyTypes,
+ allOccupancyTypeFields
+ });
+};
+
+export default handler;
diff --git a/helpers/lotOccupancyDB/getLotOccupancyFields.js b/helpers/lotOccupancyDB/getLotOccupancyFields.js
index b4f40a08..5f6585de 100644
--- a/helpers/lotOccupancyDB/getLotOccupancyFields.js
+++ b/helpers/lotOccupancyDB/getLotOccupancyFields.js
@@ -10,9 +10,10 @@ export const getLotOccupancyFields = (lotOccupancyId, connectedDatabase) => {
" o.occupancyTypeFieldId, o.lotOccupancyFieldValue," +
" f.occupancyTypeField," +
" f.occupancyTypeFieldValues, f.isRequired, f.pattern, f.minimumLength, f.maximumLength," +
- " f.orderNumber" +
+ " f.orderNumber, t.orderNumber as occupancyTypeOrderNumber" +
" from LotOccupancyFields o" +
" left join OccupancyTypeFields f on o.occupancyTypeFieldId = f.occupancyTypeFieldId" +
+ " left join OccupancyTypes t on f.occupancyTypeId = t.occupancyTypeId" +
" where o.recordDelete_timeMillis is null" +
" and o.lotOccupancyId = ?" +
" union" +
@@ -20,12 +21,13 @@ export const getLotOccupancyFields = (lotOccupancyId, connectedDatabase) => {
" f.occupancyTypeFieldId, '' as lotOccupancyFieldValue," +
" f.occupancyTypeField," +
" f.occupancyTypeFieldValues, f.isRequired, f.pattern, f.minimumLength, f.maximumLength," +
- " f.orderNumber" +
+ " f.orderNumber, t.orderNumber as occupancyTypeOrderNumber" +
" from OccupancyTypeFields f" +
+ " left join OccupancyTypes t on f.occupancyTypeId = t.occupancyTypeId" +
" where f.recordDelete_timeMillis is null" +
" and (f.occupancyTypeId is null or f.occupancyTypeId in (select occupancyTypeId from LotOccupancies where lotOccupancyId = ?))" +
" and f.occupancyTypeFieldId not in (select occupancyTypeFieldId from LotOccupancyFields where lotOccupancyId = ? and recordDelete_timeMillis is null)" +
- " order by orderNumber, occupancyTypeField")
+ " order by occupancyTypeOrderNumber, f.orderNumber, f.occupancyTypeField")
.all(lotOccupancyId, lotOccupancyId, lotOccupancyId, lotOccupancyId);
if (!connectedDatabase) {
database.close();
diff --git a/helpers/lotOccupancyDB/getLotOccupancyFields.ts b/helpers/lotOccupancyDB/getLotOccupancyFields.ts
index f3263f9e..36ec11df 100644
--- a/helpers/lotOccupancyDB/getLotOccupancyFields.ts
+++ b/helpers/lotOccupancyDB/getLotOccupancyFields.ts
@@ -20,9 +20,10 @@ export const getLotOccupancyFields = (
" o.occupancyTypeFieldId, o.lotOccupancyFieldValue," +
" f.occupancyTypeField," +
" f.occupancyTypeFieldValues, f.isRequired, f.pattern, f.minimumLength, f.maximumLength," +
- " f.orderNumber" +
+ " f.orderNumber, t.orderNumber as occupancyTypeOrderNumber" +
" from LotOccupancyFields o" +
" left join OccupancyTypeFields f on o.occupancyTypeFieldId = f.occupancyTypeFieldId" +
+ " left join OccupancyTypes t on f.occupancyTypeId = t.occupancyTypeId" +
" where o.recordDelete_timeMillis is null" +
" and o.lotOccupancyId = ?" +
" union" +
@@ -30,12 +31,13 @@ export const getLotOccupancyFields = (
" f.occupancyTypeFieldId, '' as lotOccupancyFieldValue," +
" f.occupancyTypeField," +
" f.occupancyTypeFieldValues, f.isRequired, f.pattern, f.minimumLength, f.maximumLength," +
- " f.orderNumber" +
+ " f.orderNumber, t.orderNumber as occupancyTypeOrderNumber" +
" from OccupancyTypeFields f" +
+ " left join OccupancyTypes t on f.occupancyTypeId = t.occupancyTypeId" +
" where f.recordDelete_timeMillis is null" +
" and (f.occupancyTypeId is null or f.occupancyTypeId in (select occupancyTypeId from LotOccupancies where lotOccupancyId = ?))" +
" and f.occupancyTypeFieldId not in (select occupancyTypeFieldId from LotOccupancyFields where lotOccupancyId = ? and recordDelete_timeMillis is null)" +
- " order by orderNumber, occupancyTypeField"
+ " order by occupancyTypeOrderNumber, f.orderNumber, f.occupancyTypeField"
)
.all(lotOccupancyId, lotOccupancyId, lotOccupancyId, lotOccupancyId);
diff --git a/helpers/lotOccupancyDB/moveOccupancyTypeFieldDown.d.ts b/helpers/lotOccupancyDB/moveOccupancyTypeFieldDown.d.ts
new file mode 100644
index 00000000..6905d678
--- /dev/null
+++ b/helpers/lotOccupancyDB/moveOccupancyTypeFieldDown.d.ts
@@ -0,0 +1,2 @@
+export declare const moveOccupancyTypeFieldDown: (occupancyTypeFieldId: number | string) => boolean;
+export default moveOccupancyTypeFieldDown;
diff --git a/helpers/lotOccupancyDB/moveOccupancyTypeFieldDown.js b/helpers/lotOccupancyDB/moveOccupancyTypeFieldDown.js
new file mode 100644
index 00000000..1a02e4bc
--- /dev/null
+++ b/helpers/lotOccupancyDB/moveOccupancyTypeFieldDown.js
@@ -0,0 +1,29 @@
+import sqlite from "better-sqlite3";
+import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
+import { clearOccupancyTypesCache } from "../functions.cache.js";
+export const moveOccupancyTypeFieldDown = (occupancyTypeFieldId) => {
+ const database = sqlite(databasePath);
+ const currentField = database
+ .prepare("select occupancyTypeId, orderNumber" +
+ " from OccupancyTypeFields" +
+ " where occupancyTypeFieldId = ?")
+ .get(occupancyTypeFieldId);
+ database
+ .prepare("update OccupancyTypeFields" +
+ " set orderNumber = orderNumber - 1" +
+ " where recordDelete_timeMillis is null" +
+ (currentField.occupancyTypeId
+ ? " and occupancyTypeId = '" + currentField.occupancyTypeId + "'"
+ : " and occupancyTypeId is null") +
+ " and orderNumber = ? + 1")
+ .run(currentField.orderNumber);
+ const result = database
+ .prepare("update OccupancyTypeFields" +
+ " set orderNumber = ? + 1" +
+ " where occupancyTypeFieldId = ?")
+ .run(currentField.orderNumber, occupancyTypeFieldId);
+ database.close();
+ clearOccupancyTypesCache();
+ return result.changes > 0;
+};
+export default moveOccupancyTypeFieldDown;
diff --git a/helpers/lotOccupancyDB/moveOccupancyTypeFieldDown.ts b/helpers/lotOccupancyDB/moveOccupancyTypeFieldDown.ts
new file mode 100644
index 00000000..8c2be26a
--- /dev/null
+++ b/helpers/lotOccupancyDB/moveOccupancyTypeFieldDown.ts
@@ -0,0 +1,47 @@
+import sqlite from "better-sqlite3";
+
+import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
+
+import { clearOccupancyTypesCache } from "../functions.cache.js";
+
+export const moveOccupancyTypeFieldDown = (
+ occupancyTypeFieldId: number | string
+): boolean => {
+ const database = sqlite(databasePath);
+
+ const currentField: { occupancyTypeId?: number; orderNumber: number } = database
+ .prepare(
+ "select occupancyTypeId, orderNumber" +
+ " from OccupancyTypeFields" +
+ " where occupancyTypeFieldId = ?"
+ )
+ .get(occupancyTypeFieldId);
+
+ database
+ .prepare(
+ "update OccupancyTypeFields" +
+ " set orderNumber = orderNumber - 1" +
+ " where recordDelete_timeMillis is null" +
+ (currentField.occupancyTypeId
+ ? " and occupancyTypeId = '" + currentField.occupancyTypeId + "'"
+ : " and occupancyTypeId is null") +
+ " and orderNumber = ? + 1"
+ )
+ .run(currentField.orderNumber);
+
+ const result = database
+ .prepare(
+ "update OccupancyTypeFields" +
+ " set orderNumber = ? + 1" +
+ " where occupancyTypeFieldId = ?"
+ )
+ .run(currentField.orderNumber, occupancyTypeFieldId);
+
+ database.close();
+
+ clearOccupancyTypesCache();
+
+ return result.changes > 0;
+};
+
+export default moveOccupancyTypeFieldDown;
diff --git a/helpers/lotOccupancyDB/moveOccupancyTypeFieldUp.d.ts b/helpers/lotOccupancyDB/moveOccupancyTypeFieldUp.d.ts
new file mode 100644
index 00000000..bdf7f5b8
--- /dev/null
+++ b/helpers/lotOccupancyDB/moveOccupancyTypeFieldUp.d.ts
@@ -0,0 +1,2 @@
+export declare const moveOccupancyTypeFieldUp: (occupancyTypeFieldId: number | string) => boolean;
+export default moveOccupancyTypeFieldUp;
diff --git a/helpers/lotOccupancyDB/moveOccupancyTypeFieldUp.js b/helpers/lotOccupancyDB/moveOccupancyTypeFieldUp.js
new file mode 100644
index 00000000..075a43c6
--- /dev/null
+++ b/helpers/lotOccupancyDB/moveOccupancyTypeFieldUp.js
@@ -0,0 +1,36 @@
+import sqlite from "better-sqlite3";
+import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
+import { clearOccupancyTypesCache } from "../functions.cache.js";
+export const moveOccupancyTypeFieldUp = (occupancyTypeFieldId) => {
+ const database = sqlite(databasePath);
+ const currentField = database
+ .prepare("select occupancyTypeId, orderNumber" +
+ " from OccupancyTypeFields" +
+ " where occupancyTypeFieldId = ?")
+ .get(occupancyTypeFieldId);
+ if (currentField.orderNumber <= 0) {
+ database.close();
+ return true;
+ }
+ database
+ .prepare("update OccupancyTypeFields" +
+ " set orderNumber = orderNumber + 1" +
+ " where recordDelete_timeMillis is null" +
+ (currentField.occupancyTypeId
+ ? " and occupancyTypeId = '" + currentField.occupancyTypeId + "'"
+ : " and occupancyTypeId is null") +
+ " and orderNumber = ? - 1")
+ .run(currentField.orderNumber);
+ const result = database
+ .prepare("update OccupancyTypeFields" +
+ " set orderNumber = ? - 1" +
+ " where occupancyTypeFieldId = ?" +
+ (currentField.occupancyTypeId
+ ? " and occupancyTypeId = '" + currentField.occupancyTypeId + "'"
+ : " and occupancyTypeId is null"))
+ .run(currentField.orderNumber, occupancyTypeFieldId);
+ database.close();
+ clearOccupancyTypesCache();
+ return result.changes > 0;
+};
+export default moveOccupancyTypeFieldUp;
diff --git a/helpers/lotOccupancyDB/moveOccupancyTypeFieldUp.ts b/helpers/lotOccupancyDB/moveOccupancyTypeFieldUp.ts
new file mode 100644
index 00000000..4ae4ccc7
--- /dev/null
+++ b/helpers/lotOccupancyDB/moveOccupancyTypeFieldUp.ts
@@ -0,0 +1,53 @@
+import sqlite from "better-sqlite3";
+
+import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
+
+import { clearOccupancyTypesCache } from "../functions.cache.js";
+
+export const moveOccupancyTypeFieldUp = (occupancyTypeFieldId: number | string): boolean => {
+ const database = sqlite(databasePath);
+
+ const currentField: { occupancyTypeId?: number; orderNumber: number } = database
+ .prepare(
+ "select occupancyTypeId, orderNumber" +
+ " from OccupancyTypeFields" +
+ " where occupancyTypeFieldId = ?"
+ )
+ .get(occupancyTypeFieldId);
+
+ if (currentField.orderNumber <= 0) {
+ database.close();
+ return true;
+ }
+
+ database
+ .prepare(
+ "update OccupancyTypeFields" +
+ " set orderNumber = orderNumber + 1" +
+ " where recordDelete_timeMillis is null" +
+ (currentField.occupancyTypeId
+ ? " and occupancyTypeId = '" + currentField.occupancyTypeId + "'"
+ : " and occupancyTypeId is null") +
+ " and orderNumber = ? - 1"
+ )
+ .run(currentField.orderNumber);
+
+ const result = database
+ .prepare(
+ "update OccupancyTypeFields" +
+ " set orderNumber = ? - 1" +
+ " where occupancyTypeFieldId = ?" +
+ (currentField.occupancyTypeId
+ ? " and occupancyTypeId = '" + currentField.occupancyTypeId + "'"
+ : " and occupancyTypeId is null")
+ )
+ .run(currentField.orderNumber, occupancyTypeFieldId);
+
+ database.close();
+
+ clearOccupancyTypesCache();
+
+ return result.changes > 0;
+};
+
+export default moveOccupancyTypeFieldUp;
diff --git a/public-typescript/adminOccupancyTypes.js b/public-typescript/adminOccupancyTypes.js
index fef0ea73..b3d3a485 100644
--- a/public-typescript/adminOccupancyTypes.js
+++ b/public-typescript/adminOccupancyTypes.js
@@ -139,20 +139,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
}, occupancyTypeResponseHandler);
};
const openEditOccupancyTypeField = (occupancyTypeId, occupancyTypeFieldId) => {
- let occupancyTypeField;
+ let occupancyType;
if (occupancyTypeId) {
- const occupancyType = occupancyTypes.find((currentOccupancyType) => {
+ occupancyType = occupancyTypes.find((currentOccupancyType) => {
return currentOccupancyType.occupancyTypeId === occupancyTypeId;
});
- occupancyTypeField = occupancyType.occupancyTypeFields.find((currentOccupancyTypeField) => {
- return currentOccupancyTypeField.occupancyTypeFieldId === occupancyTypeFieldId;
- });
- }
- else {
- occupancyTypeField = allOccupancyTypeFields.find((currentOccupancyTypeField) => {
- return currentOccupancyTypeField.occupancyTypeFieldId === occupancyTypeFieldId;
- });
}
+ const occupancyTypeField = (occupancyType ? occupancyType.occupancyTypeFields : allOccupancyTypeFields).find((currentOccupancyTypeField) => {
+ return currentOccupancyTypeField.occupancyTypeFieldId === occupancyTypeFieldId;
+ });
let minimumLengthElement;
let maximumLengthElement;
let patternElement;
@@ -244,6 +239,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId, 10);
openEditOccupancyTypeField(occupancyTypeId, occupancyTypeFieldId);
};
+ const moveOccupancyTypeFieldUp = (clickEvent) => {
+ clickEvent.preventDefault();
+ const occupancyTypeFieldId = clickEvent.currentTarget.closest(".container--occupancyTypeField").dataset.occupancyTypeFieldId;
+ cityssm.postJSON(urlPrefix + "/admin/doMoveOccupancyTypeFieldUp", {
+ occupancyTypeFieldId
+ }, occupancyTypeResponseHandler);
+ };
+ const moveOccupancyTypeFieldDown = (clickEvent) => {
+ clickEvent.preventDefault();
+ const occupancyTypeFieldId = clickEvent.currentTarget.closest(".container--occupancyTypeField").dataset.occupancyTypeFieldId;
+ cityssm.postJSON(urlPrefix + "/admin/doMoveOccupancyTypeFieldDown", {
+ occupancyTypeFieldId
+ }, occupancyTypeResponseHandler);
+ };
const renderOccupancyTypeFields = (panelElement, occupancyTypeId, occupancyTypeFields) => {
if (occupancyTypeFields.length === 0) {
panelElement.insertAdjacentHTML("beforeend", '
{
- let occupancyTypeField: recordTypes.OccupancyTypeField;
+ let occupancyType: recordTypes.OccupancyType;
if (occupancyTypeId) {
- const occupancyType = occupancyTypes.find((currentOccupancyType) => {
+ occupancyType = occupancyTypes.find((currentOccupancyType) => {
return currentOccupancyType.occupancyTypeId === occupancyTypeId;
});
-
- occupancyTypeField = occupancyType.occupancyTypeFields.find(
- (currentOccupancyTypeField) => {
- return currentOccupancyTypeField.occupancyTypeFieldId === occupancyTypeFieldId;
- }
- );
- } else {
- occupancyTypeField = allOccupancyTypeFields.find((currentOccupancyTypeField) => {
- return currentOccupancyTypeField.occupancyTypeFieldId === occupancyTypeFieldId;
- });
}
+ const occupancyTypeField = (
+ occupancyType ? occupancyType.occupancyTypeFields : allOccupancyTypeFields
+ ).find((currentOccupancyTypeField) => {
+ return currentOccupancyTypeField.occupancyTypeFieldId === occupancyTypeFieldId;
+ });
+
let minimumLengthElement: HTMLInputElement;
let maximumLengthElement: HTMLInputElement;
let patternElement: HTMLInputElement;
@@ -469,6 +465,44 @@ declare const bulmaJS: BulmaJS;
openEditOccupancyTypeField(occupancyTypeId, occupancyTypeFieldId);
};
+
+ const moveOccupancyTypeFieldUp = (clickEvent: Event) => {
+ clickEvent.preventDefault();
+
+ const occupancyTypeFieldId = (
+ (clickEvent.currentTarget as HTMLElement).closest(
+ ".container--occupancyTypeField"
+ ) as HTMLElement
+ ).dataset.occupancyTypeFieldId;
+
+ cityssm.postJSON(
+ urlPrefix + "/admin/doMoveOccupancyTypeFieldUp",
+ {
+ occupancyTypeFieldId
+ },
+ occupancyTypeResponseHandler
+ );
+ };
+
+ const moveOccupancyTypeFieldDown = (clickEvent: Event) => {
+ clickEvent.preventDefault();
+
+ const occupancyTypeFieldId = (
+ (clickEvent.currentTarget as HTMLElement).closest(
+ ".container--occupancyTypeField"
+ ) as HTMLElement
+ ).dataset.occupancyTypeFieldId;
+
+ cityssm.postJSON(
+ urlPrefix + "/admin/doMoveOccupancyTypeFieldDown",
+ {
+ occupancyTypeFieldId
+ },
+ occupancyTypeResponseHandler
+ );
+ };
+
+
const renderOccupancyTypeFields = (
panelElement: HTMLElement,
occupancyTypeId: number | undefined,
@@ -530,6 +564,14 @@ declare const bulmaJS: BulmaJS;
.querySelector(".button--editOccupancyTypeField")
.addEventListener("click", openEditOccupancyTypeFieldByClick);
+ panelBlockElement
+ .querySelector(".button--moveOccupancyTypeFieldUp")
+ .addEventListener("click", moveOccupancyTypeFieldUp);
+
+ panelBlockElement
+ .querySelector(".button--moveOccupancyTypeFieldDown")
+ .addEventListener("click", moveOccupancyTypeFieldDown);
+
panelElement.append(panelBlockElement);
}
}
diff --git a/public/javascripts/adminOccupancyTypes.min.js b/public/javascripts/adminOccupancyTypes.min.js
index 1f114b2d..fecc5746 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,t=document.querySelector("#container--occupancyTypes");let a=exports.occupancyTypes;delete exports.occupancyTypes;let s=exports.allOccupancyTypeFields;delete exports.allOccupancyTypeFields;const n=new Set,l=e=>{const c=e.currentTarget,t=c.closest(".container--occupancyType"),a=Number.parseInt(t.dataset.occupancyTypeId,10);n.has(a)?n.delete(a):n.add(a),c.innerHTML=n.has(a)?'
':'
';const s=t.querySelectorAll(".panel-block");for(const e of s)e.classList.toggle("is-hidden")},i=e=>{e.success?(a=e.occupancyTypes,s=e.allOccupancyTypeFields,T()):bulmaJS.alert({title:"Error Updating "+exports.aliases.occupancy+" Type",message:e.errorMessage,contextualColorName:"danger"})},o=e=>{const t=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:t},i)}}})},d=t=>{const s=Number.parseInt(t.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId,10),n=a.find(e=>s===e.occupancyTypeId);let l;const o=e=>{e.preventDefault(),cityssm.postJSON(c+"/admin/doUpdateOccupancyType",e.currentTarget,e=>{i(e),e.success&&l()})};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)=>{l=c,e.querySelector("#occupancyTypeEdit--occupancyType").focus(),e.querySelector("form").addEventListener("submit",o),bulmaJS.toggleHtmlClipped()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},p=t=>{const a=Number.parseInt(t.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId,10);let s;const l=e=>{e.preventDefault(),cityssm.postJSON(c+"/admin/doAddOccupancyTypeField",e.currentTarget,e=>{n.add(a),i(e),e.success&&(s(),r(a,e.occupancyTypeFieldId))})};cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyTypeField",{onshow:c=>{e.populateAliases(c),a&&(c.querySelector("#occupancyTypeFieldAdd--occupancyTypeId").value=a.toString())},onshown:(e,c)=>{s=c,e.querySelector("#occupancyTypeFieldAdd--occupancyTypeField").focus(),e.querySelector("form").addEventListener("submit",l),bulmaJS.toggleHtmlClipped()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},u=e=>{e.preventDefault();const t=e.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId;cityssm.postJSON(c+"/admin/doMoveOccupancyTypeUp",{occupancyTypeId:t},i)},y=e=>{e.preventDefault();const t=e.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId;cityssm.postJSON(c+"/admin/doMoveOccupancyTypeDown",{occupancyTypeId:t},i)},r=(t,n)=>{let l,o,d,p,u,y;if(t){const e=a.find(e=>e.occupancyTypeId===t);l=e.occupancyTypeFields.find(e=>e.occupancyTypeFieldId===n)}else l=s.find(e=>e.occupancyTypeFieldId===n);const r=()=>{d.min=o.value},m=()=>{""===u.value?(o.disabled=!1,d.disabled=!1,p.disabled=!1):(o.disabled=!0,d.disabled=!0,p.disabled=!0)},v=e=>{e.preventDefault(),cityssm.postJSON(c+"/admin/doUpdateOccupancyTypeField",e.currentTarget,e=>{i(e),e.success&&y()})},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:n},e=>{i(e),e.success&&y()})}}})};cityssm.openHtmlModal("adminOccupancyTypes-editOccupancyTypeField",{onshow:c=>{e.populateAliases(c),c.querySelector("#occupancyTypeFieldEdit--occupancyTypeFieldId").value=l.occupancyTypeFieldId.toString(),c.querySelector("#occupancyTypeFieldEdit--occupancyTypeField").value=l.occupancyTypeField,c.querySelector("#occupancyTypeFieldEdit--isRequired").value=l.isRequired?"1":"0",(o=c.querySelector("#occupancyTypeFieldEdit--minimumLength")).value=l.minimumLength.toString(),(d=c.querySelector("#occupancyTypeFieldEdit--maximumLength")).value=l.maximumLength.toString(),(p=c.querySelector("#occupancyTypeFieldEdit--pattern")).value=l.pattern,(u=c.querySelector("#occupancyTypeFieldEdit--occupancyTypeFieldValues")).value=l.occupancyTypeFieldValues,m()},onshown:(e,c)=>{y=c,bulmaJS.init(e),bulmaJS.toggleHtmlClipped(),cityssm.enableNavBlocker(),e.querySelector("form").addEventListener("submit",v),o.addEventListener("keyup",r),r(),u.addEventListener("keyup",m),e.querySelector("#button--deleteOccupancyTypeField").addEventListener("click",T)},onremoved:()=>{bulmaJS.toggleHtmlClipped(),cityssm.disableNavBlocker()}})},m=e=>{e.preventDefault();const c=Number.parseInt(e.currentTarget.closest(".container--occupancyTypeField").dataset.occupancyTypeFieldId,10),t=Number.parseInt(e.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId,10);r(t,c)},v=(e,c,t)=>{if(0===t.length)e.insertAdjacentHTML("beforeend",'
There are no additional fields.
');else for(const a of t){const t=document.createElement("div");t.className="panel-block is-block container--occupancyTypeField",c&&!n.has(c)&&t.classList.add("is-hidden"),t.dataset.occupancyTypeFieldId=a.occupancyTypeFieldId.toString(),t.innerHTML='
',t.querySelector(".button--editOccupancyTypeField").addEventListener("click",m),e.append(t)}},T=()=>{if(t.innerHTML='
',v(t.querySelector("#container--allOccupancyTypeFields"),void 0,s),t.querySelector(".button--addOccupancyTypeField").addEventListener("click",p),0!==a.length)for(const e of a){const c=document.createElement("div");c.className="panel container--occupancyType",c.dataset.occupancyTypeId=e.occupancyTypeId.toString(),c.innerHTML='
'+(n.has(e.occupancyTypeId)?' ':' ')+'
'+cityssm.escapeHTML(e.occupancyType)+' Delete
Edit '+exports.aliases.occupancy+' Type
Add Field
',v(c,e.occupancyTypeId,e.occupancyTypeFields),c.querySelector(".button--toggleOccupancyTypeFields").addEventListener("click",l),c.querySelector(".button--deleteOccupancyType").addEventListener("click",o),c.querySelector(".button--editOccupancyType").addEventListener("click",d),c.querySelector(".button--addOccupancyTypeField").addEventListener("click",p),c.querySelector(".button--moveOccupancyTypeUp").addEventListener("click",u),c.querySelector(".button--moveOccupancyTypeDown").addEventListener("click",y),t.append(c)}else t.insertAdjacentHTML("afterbegin",'
There are no active '+exports.aliases.occupancy.toLowerCase()+" types.
")};document.querySelector("#button--addOccupancyType").addEventListener("click",()=>{let t;const s=e=>{e.preventDefault(),cityssm.postJSON(c+"/admin/doAddOccupancyType",e.currentTarget,e=>{e.success?(t(),a=e.occupancyTypes,T()):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)=>{t=c,e.querySelector("#occupancyTypeAdd--occupancyType").focus(),e.querySelector("form").addEventListener("submit",s),bulmaJS.toggleHtmlClipped()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})}),T()})();
\ No newline at end of file
+"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=exports.los,c=document.querySelector("main").dataset.urlPrefix,t=document.querySelector("#container--occupancyTypes");let a=exports.occupancyTypes;delete exports.occupancyTypes;let s=exports.allOccupancyTypeFields;delete exports.allOccupancyTypeFields;const n=new Set,l=e=>{const c=e.currentTarget,t=c.closest(".container--occupancyType"),a=Number.parseInt(t.dataset.occupancyTypeId,10);n.has(a)?n.delete(a):n.add(a),c.innerHTML=n.has(a)?'
':'
';const s=t.querySelectorAll(".panel-block");for(const e of s)e.classList.toggle("is-hidden")},o=e=>{e.success?(a=e.occupancyTypes,s=e.allOccupancyTypeFields,f()):bulmaJS.alert({title:"Error Updating "+exports.aliases.occupancy+" Type",message:e.errorMessage,contextualColorName:"danger"})},i=e=>{const t=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:t},o)}}})},d=t=>{const s=Number.parseInt(t.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId,10),n=a.find(e=>s===e.occupancyTypeId);let l;const i=e=>{e.preventDefault(),cityssm.postJSON(c+"/admin/doUpdateOccupancyType",e.currentTarget,e=>{o(e),e.success&&l()})};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)=>{l=c,e.querySelector("#occupancyTypeEdit--occupancyType").focus(),e.querySelector("form").addEventListener("submit",i),bulmaJS.toggleHtmlClipped()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},p=t=>{const a=Number.parseInt(t.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId,10);let s;const l=e=>{e.preventDefault(),cityssm.postJSON(c+"/admin/doAddOccupancyTypeField",e.currentTarget,e=>{n.add(a),o(e),e.success&&(s(),r(a,e.occupancyTypeFieldId))})};cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyTypeField",{onshow:c=>{e.populateAliases(c),a&&(c.querySelector("#occupancyTypeFieldAdd--occupancyTypeId").value=a.toString())},onshown:(e,c)=>{s=c,e.querySelector("#occupancyTypeFieldAdd--occupancyTypeField").focus(),e.querySelector("form").addEventListener("submit",l),bulmaJS.toggleHtmlClipped()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},u=e=>{e.preventDefault();const t=e.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId;cityssm.postJSON(c+"/admin/doMoveOccupancyTypeUp",{occupancyTypeId:t},o)},y=e=>{e.preventDefault();const t=e.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId;cityssm.postJSON(c+"/admin/doMoveOccupancyTypeDown",{occupancyTypeId:t},o)},r=(t,n)=>{let l;t&&(l=a.find(e=>e.occupancyTypeId===t));const i=(l?l.occupancyTypeFields:s).find(e=>e.occupancyTypeFieldId===n);let d,p,u,y,r;const v=()=>{p.min=d.value},T=()=>{""===y.value?(d.disabled=!1,p.disabled=!1,u.disabled=!1):(d.disabled=!0,p.disabled=!0,u.disabled=!0)},m=e=>{e.preventDefault(),cityssm.postJSON(c+"/admin/doUpdateOccupancyTypeField",e.currentTarget,e=>{o(e),e.success&&r()})},b=()=>{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:n},e=>{o(e),e.success&&r()})}}})};cityssm.openHtmlModal("adminOccupancyTypes-editOccupancyTypeField",{onshow:c=>{e.populateAliases(c),c.querySelector("#occupancyTypeFieldEdit--occupancyTypeFieldId").value=i.occupancyTypeFieldId.toString(),c.querySelector("#occupancyTypeFieldEdit--occupancyTypeField").value=i.occupancyTypeField,c.querySelector("#occupancyTypeFieldEdit--isRequired").value=i.isRequired?"1":"0",(d=c.querySelector("#occupancyTypeFieldEdit--minimumLength")).value=i.minimumLength.toString(),(p=c.querySelector("#occupancyTypeFieldEdit--maximumLength")).value=i.maximumLength.toString(),(u=c.querySelector("#occupancyTypeFieldEdit--pattern")).value=i.pattern,(y=c.querySelector("#occupancyTypeFieldEdit--occupancyTypeFieldValues")).value=i.occupancyTypeFieldValues,T()},onshown:(e,c)=>{r=c,bulmaJS.init(e),bulmaJS.toggleHtmlClipped(),cityssm.enableNavBlocker(),e.querySelector("form").addEventListener("submit",m),d.addEventListener("keyup",v),v(),y.addEventListener("keyup",T),e.querySelector("#button--deleteOccupancyTypeField").addEventListener("click",b)},onremoved:()=>{bulmaJS.toggleHtmlClipped(),cityssm.disableNavBlocker()}})},v=e=>{e.preventDefault();const c=Number.parseInt(e.currentTarget.closest(".container--occupancyTypeField").dataset.occupancyTypeFieldId,10),t=Number.parseInt(e.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId,10);r(t,c)},T=e=>{e.preventDefault();const t=e.currentTarget.closest(".container--occupancyTypeField").dataset.occupancyTypeFieldId;cityssm.postJSON(c+"/admin/doMoveOccupancyTypeFieldUp",{occupancyTypeFieldId:t},o)},m=e=>{e.preventDefault();const t=e.currentTarget.closest(".container--occupancyTypeField").dataset.occupancyTypeFieldId;cityssm.postJSON(c+"/admin/doMoveOccupancyTypeFieldDown",{occupancyTypeFieldId:t},o)},b=(e,c,t)=>{if(0===t.length)e.insertAdjacentHTML("beforeend",'
There are no additional fields.
');else for(const a of t){const t=document.createElement("div");t.className="panel-block is-block container--occupancyTypeField",c&&!n.has(c)&&t.classList.add("is-hidden"),t.dataset.occupancyTypeFieldId=a.occupancyTypeFieldId.toString(),t.innerHTML='
',t.querySelector(".button--editOccupancyTypeField").addEventListener("click",v),t.querySelector(".button--moveOccupancyTypeFieldUp").addEventListener("click",T),t.querySelector(".button--moveOccupancyTypeFieldDown").addEventListener("click",m),e.append(t)}},f=()=>{if(t.innerHTML='
',b(t.querySelector("#container--allOccupancyTypeFields"),void 0,s),t.querySelector(".button--addOccupancyTypeField").addEventListener("click",p),0!==a.length)for(const e of a){const c=document.createElement("div");c.className="panel container--occupancyType",c.dataset.occupancyTypeId=e.occupancyTypeId.toString(),c.innerHTML='
'+(n.has(e.occupancyTypeId)?' ':' ')+'
'+cityssm.escapeHTML(e.occupancyType)+' Delete
Edit '+exports.aliases.occupancy+' Type
Add Field
',b(c,e.occupancyTypeId,e.occupancyTypeFields),c.querySelector(".button--toggleOccupancyTypeFields").addEventListener("click",l),c.querySelector(".button--deleteOccupancyType").addEventListener("click",i),c.querySelector(".button--editOccupancyType").addEventListener("click",d),c.querySelector(".button--addOccupancyTypeField").addEventListener("click",p),c.querySelector(".button--moveOccupancyTypeUp").addEventListener("click",u),c.querySelector(".button--moveOccupancyTypeDown").addEventListener("click",y),t.append(c)}else t.insertAdjacentHTML("afterbegin",'
There are no active '+exports.aliases.occupancy.toLowerCase()+" types.
")};document.querySelector("#button--addOccupancyType").addEventListener("click",()=>{let t;const s=e=>{e.preventDefault(),cityssm.postJSON(c+"/admin/doAddOccupancyType",e.currentTarget,e=>{e.success?(t(),a=e.occupancyTypes,f()):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)=>{t=c,e.querySelector("#occupancyTypeAdd--occupancyType").focus(),e.querySelector("form").addEventListener("submit",s),bulmaJS.toggleHtmlClipped()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})}),f()})();
\ No newline at end of file
diff --git a/routes/admin.js b/routes/admin.js
index 69c676d3..b140252a 100644
--- a/routes/admin.js
+++ b/routes/admin.js
@@ -19,6 +19,8 @@ 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_doMoveOccupancyTypeFieldUp from "../handlers/admin-post/doMoveOccupancyTypeFieldUp.js";
+import handler_doMoveOccupancyTypeFieldDown from "../handlers/admin-post/doMoveOccupancyTypeFieldDown.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";
@@ -61,6 +63,8 @@ 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("/doMoveOccupancyTypeFieldUp", permissionHandlers.adminPostHandler, handler_doMoveOccupancyTypeFieldUp);
+router.post("/doMoveOccupancyTypeFieldDown", permissionHandlers.adminPostHandler, handler_doMoveOccupancyTypeFieldDown);
router.post("/doDeleteOccupancyTypeField", permissionHandlers.adminPostHandler, handler_doDeleteOccupancyTypeField);
router.get("/tables", permissionHandlers.adminGetHandler, handler_tables);
router.post("/doAddWorkOrderType", permissionHandlers.adminPostHandler, handler_doAddWorkOrderType);
diff --git a/routes/admin.ts b/routes/admin.ts
index 49b371ed..cbfea3f3 100644
--- a/routes/admin.ts
+++ b/routes/admin.ts
@@ -30,6 +30,8 @@ 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_doMoveOccupancyTypeFieldUp from "../handlers/admin-post/doMoveOccupancyTypeFieldUp.js";
+import handler_doMoveOccupancyTypeFieldDown from "../handlers/admin-post/doMoveOccupancyTypeFieldDown.js";
import handler_doDeleteOccupancyTypeField from "../handlers/admin-post/doDeleteOccupancyTypeField.js";
// Config Table Management
@@ -178,6 +180,18 @@ router.post(
handler_doUpdateOccupancyTypeField
);
+router.post(
+ "/doMoveOccupancyTypeFieldUp",
+ permissionHandlers.adminPostHandler,
+ handler_doMoveOccupancyTypeFieldUp
+);
+
+router.post(
+ "/doMoveOccupancyTypeFieldDown",
+ permissionHandlers.adminPostHandler,
+ handler_doMoveOccupancyTypeFieldDown
+);
+
router.post(
"/doDeleteOccupancyTypeField",
permissionHandlers.adminPostHandler,