From 6ae44e00bcf01f0d7b00469ab8844ac2f403d9da Mon Sep 17 00:00:00 2001 From: Dan Gowans Date: Mon, 19 Sep 2022 10:55:21 -0400 Subject: [PATCH] sort occupancy type fields --- .../doMoveOccupancyTypeFieldDown.d.ts | 3 + .../doMoveOccupancyTypeFieldDown.js | 13 ++++ .../doMoveOccupancyTypeFieldDown.ts | 20 ++++++ .../doMoveOccupancyTypeFieldUp.d.ts | 3 + .../admin-post/doMoveOccupancyTypeFieldUp.js | 13 ++++ .../admin-post/doMoveOccupancyTypeFieldUp.ts | 20 ++++++ .../lotOccupancyDB/getLotOccupancyFields.js | 8 ++- .../lotOccupancyDB/getLotOccupancyFields.ts | 8 ++- .../moveOccupancyTypeFieldDown.d.ts | 2 + .../moveOccupancyTypeFieldDown.js | 29 ++++++++ .../moveOccupancyTypeFieldDown.ts | 47 +++++++++++++ .../moveOccupancyTypeFieldUp.d.ts | 2 + .../moveOccupancyTypeFieldUp.js | 36 ++++++++++ .../moveOccupancyTypeFieldUp.ts | 53 +++++++++++++++ public-typescript/adminOccupancyTypes.js | 35 +++++++--- public-typescript/adminOccupancyTypes.ts | 66 +++++++++++++++---- public/javascripts/adminOccupancyTypes.min.js | 2 +- routes/admin.js | 4 ++ routes/admin.ts | 14 ++++ 19 files changed, 349 insertions(+), 29 deletions(-) create mode 100644 handlers/admin-post/doMoveOccupancyTypeFieldDown.d.ts create mode 100644 handlers/admin-post/doMoveOccupancyTypeFieldDown.js create mode 100644 handlers/admin-post/doMoveOccupancyTypeFieldDown.ts create mode 100644 handlers/admin-post/doMoveOccupancyTypeFieldUp.d.ts create mode 100644 handlers/admin-post/doMoveOccupancyTypeFieldUp.js create mode 100644 handlers/admin-post/doMoveOccupancyTypeFieldUp.ts create mode 100644 helpers/lotOccupancyDB/moveOccupancyTypeFieldDown.d.ts create mode 100644 helpers/lotOccupancyDB/moveOccupancyTypeFieldDown.js create mode 100644 helpers/lotOccupancyDB/moveOccupancyTypeFieldDown.ts create mode 100644 helpers/lotOccupancyDB/moveOccupancyTypeFieldUp.d.ts create mode 100644 helpers/lotOccupancyDB/moveOccupancyTypeFieldUp.js create mode 100644 helpers/lotOccupancyDB/moveOccupancyTypeFieldUp.ts 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='

(All Occupancy Types)

',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='

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

',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='

(All Occupancy Types)

',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='

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

',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,