diff --git a/handlers/admin-post/doMoveLotTypeDown.js b/handlers/admin-post/doMoveLotTypeDown.js index 41fdae5f..2c99d00e 100644 --- a/handlers/admin-post/doMoveLotTypeDown.js +++ b/handlers/admin-post/doMoveLotTypeDown.js @@ -1,7 +1,9 @@ -import { moveLotTypeDown } from "../../helpers/lotOccupancyDB/moveLotTypeDown.js"; +import { moveLotTypeDown, moveLotTypeDownToBottom } from "../../helpers/lotOccupancyDB/moveLotTypeDown.js"; import { getLotTypes } from "../../helpers/functions.cache.js"; export const handler = async (request, response) => { - const success = moveLotTypeDown(request.body.lotTypeId); + const success = request.body.moveToBottom === "1" + ? moveLotTypeDownToBottom(request.body.lotTypeId) + : moveLotTypeDown(request.body.lotTypeId); const lotTypes = getLotTypes(); response.json({ success, diff --git a/handlers/admin-post/doMoveLotTypeDown.ts b/handlers/admin-post/doMoveLotTypeDown.ts index 1d9980a6..a7aef985 100644 --- a/handlers/admin-post/doMoveLotTypeDown.ts +++ b/handlers/admin-post/doMoveLotTypeDown.ts @@ -1,11 +1,17 @@ import type { RequestHandler } from "express"; -import { moveLotTypeDown } from "../../helpers/lotOccupancyDB/moveLotTypeDown.js"; +import { + moveLotTypeDown, + moveLotTypeDownToBottom +} from "../../helpers/lotOccupancyDB/moveLotTypeDown.js"; import { getLotTypes } from "../../helpers/functions.cache.js"; export const handler: RequestHandler = async (request, response) => { - const success = moveLotTypeDown(request.body.lotTypeId); + const success = + request.body.moveToBottom === "1" + ? moveLotTypeDownToBottom(request.body.lotTypeId) + : moveLotTypeDown(request.body.lotTypeId); const lotTypes = getLotTypes(); diff --git a/handlers/admin-post/doMoveLotTypeFieldDown.js b/handlers/admin-post/doMoveLotTypeFieldDown.js index e0fe0008..774ebf99 100644 --- a/handlers/admin-post/doMoveLotTypeFieldDown.js +++ b/handlers/admin-post/doMoveLotTypeFieldDown.js @@ -1,7 +1,9 @@ -import { moveLotTypeFieldDown } from "../../helpers/lotOccupancyDB/moveLotTypeFieldDown.js"; +import { moveLotTypeFieldDown, moveLotTypeFieldDownToBottom } from "../../helpers/lotOccupancyDB/moveLotTypeFieldDown.js"; import { getLotTypes } from "../../helpers/functions.cache.js"; export const handler = async (request, response) => { - const success = moveLotTypeFieldDown(request.body.lotTypeFieldId); + const success = request.body.moveToBottom === "1" + ? moveLotTypeFieldDownToBottom(request.body.lotTypeFieldId) + : moveLotTypeFieldDown(request.body.lotTypeFieldId); const lotTypes = getLotTypes(); response.json({ success, diff --git a/handlers/admin-post/doMoveLotTypeFieldDown.ts b/handlers/admin-post/doMoveLotTypeFieldDown.ts index 979e09a1..930ec9aa 100644 --- a/handlers/admin-post/doMoveLotTypeFieldDown.ts +++ b/handlers/admin-post/doMoveLotTypeFieldDown.ts @@ -1,11 +1,17 @@ import type { RequestHandler } from "express"; -import { moveLotTypeFieldDown } from "../../helpers/lotOccupancyDB/moveLotTypeFieldDown.js"; +import { + moveLotTypeFieldDown, + moveLotTypeFieldDownToBottom +} from "../../helpers/lotOccupancyDB/moveLotTypeFieldDown.js"; import { getLotTypes } from "../../helpers/functions.cache.js"; export const handler: RequestHandler = async (request, response) => { - const success = moveLotTypeFieldDown(request.body.lotTypeFieldId); + const success = + request.body.moveToBottom === "1" + ? moveLotTypeFieldDownToBottom(request.body.lotTypeFieldId) + : moveLotTypeFieldDown(request.body.lotTypeFieldId); const lotTypes = getLotTypes(); diff --git a/handlers/admin-post/doMoveLotTypeFieldUp.js b/handlers/admin-post/doMoveLotTypeFieldUp.js index acad2347..688b1051 100644 --- a/handlers/admin-post/doMoveLotTypeFieldUp.js +++ b/handlers/admin-post/doMoveLotTypeFieldUp.js @@ -1,7 +1,9 @@ -import { moveLotTypeFieldUp } from "../../helpers/lotOccupancyDB/moveLotTypeFieldUp.js"; +import { moveLotTypeFieldUp, moveLotTypeFieldUpToTop } from "../../helpers/lotOccupancyDB/moveLotTypeFieldUp.js"; import { getLotTypes } from "../../helpers/functions.cache.js"; export const handler = async (request, response) => { - const success = moveLotTypeFieldUp(request.body.lotTypeFieldId); + const success = request.body.moveToTop === "1" + ? moveLotTypeFieldUpToTop(request.body.lotTypeFieldId) + : moveLotTypeFieldUp(request.body.lotTypeFieldId); const lotTypes = getLotTypes(); response.json({ success, diff --git a/handlers/admin-post/doMoveLotTypeFieldUp.ts b/handlers/admin-post/doMoveLotTypeFieldUp.ts index 6758683e..ab1a5787 100644 --- a/handlers/admin-post/doMoveLotTypeFieldUp.ts +++ b/handlers/admin-post/doMoveLotTypeFieldUp.ts @@ -1,11 +1,17 @@ import type { RequestHandler } from "express"; -import { moveLotTypeFieldUp } from "../../helpers/lotOccupancyDB/moveLotTypeFieldUp.js"; +import { + moveLotTypeFieldUp, + moveLotTypeFieldUpToTop +} from "../../helpers/lotOccupancyDB/moveLotTypeFieldUp.js"; import { getLotTypes } from "../../helpers/functions.cache.js"; export const handler: RequestHandler = async (request, response) => { - const success = moveLotTypeFieldUp(request.body.lotTypeFieldId); + const success = + request.body.moveToTop === "1" + ? moveLotTypeFieldUpToTop(request.body.lotTypeFieldId) + : moveLotTypeFieldUp(request.body.lotTypeFieldId); const lotTypes = getLotTypes(); diff --git a/handlers/admin-post/doMoveLotTypeUp.js b/handlers/admin-post/doMoveLotTypeUp.js index 1ad89c88..c5096590 100644 --- a/handlers/admin-post/doMoveLotTypeUp.js +++ b/handlers/admin-post/doMoveLotTypeUp.js @@ -1,7 +1,9 @@ -import { moveLotTypeUp } from "../../helpers/lotOccupancyDB/moveLotTypeUp.js"; +import { moveLotTypeUp, moveLotTypeUpToTop } from "../../helpers/lotOccupancyDB/moveLotTypeUp.js"; import { getLotTypes } from "../../helpers/functions.cache.js"; export const handler = async (request, response) => { - const success = moveLotTypeUp(request.body.lotTypeId); + const success = request.body.moveToTop === "1" + ? moveLotTypeUpToTop(request.body.lotTypeId) + : moveLotTypeUp(request.body.lotTypeId); const lotTypes = getLotTypes(); response.json({ success, diff --git a/handlers/admin-post/doMoveLotTypeUp.ts b/handlers/admin-post/doMoveLotTypeUp.ts index 57b35777..8f62d9f2 100644 --- a/handlers/admin-post/doMoveLotTypeUp.ts +++ b/handlers/admin-post/doMoveLotTypeUp.ts @@ -1,11 +1,14 @@ import type { RequestHandler } from "express"; -import { moveLotTypeUp } from "../../helpers/lotOccupancyDB/moveLotTypeUp.js"; +import { moveLotTypeUp, moveLotTypeUpToTop } from "../../helpers/lotOccupancyDB/moveLotTypeUp.js"; import { getLotTypes } from "../../helpers/functions.cache.js"; export const handler: RequestHandler = async (request, response) => { - const success = moveLotTypeUp(request.body.lotTypeId); + const success = + request.body.moveToTop === "1" + ? moveLotTypeUpToTop(request.body.lotTypeId) + : moveLotTypeUp(request.body.lotTypeId); const lotTypes = getLotTypes(); diff --git a/helpers/lotOccupancyDB/moveLotTypeDown.d.ts b/helpers/lotOccupancyDB/moveLotTypeDown.d.ts index 2007cc71..a00edbab 100644 --- a/helpers/lotOccupancyDB/moveLotTypeDown.d.ts +++ b/helpers/lotOccupancyDB/moveLotTypeDown.d.ts @@ -1,2 +1,3 @@ export declare const moveLotTypeDown: (lotTypeId: number | string) => boolean; +export declare const moveLotTypeDownToBottom: (lotTypeId: number | string) => boolean; export default moveLotTypeDown; diff --git a/helpers/lotOccupancyDB/moveLotTypeDown.js b/helpers/lotOccupancyDB/moveLotTypeDown.js index 23633c53..c8d9ef44 100644 --- a/helpers/lotOccupancyDB/moveLotTypeDown.js +++ b/helpers/lotOccupancyDB/moveLotTypeDown.js @@ -4,7 +4,7 @@ import { clearLotTypesCache } from "../functions.cache.js"; export const moveLotTypeDown = (lotTypeId) => { const database = sqlite(databasePath); const currentOrderNumber = database - .prepare("select orderNumber" + " from LotTypes" + " where lotTypeId = ?") + .prepare("select orderNumber from LotTypes where lotTypeId = ?") .get(lotTypeId).orderNumber; database .prepare("update LotTypes" + @@ -13,10 +13,35 @@ export const moveLotTypeDown = (lotTypeId) => { " and orderNumber = ? + 1") .run(currentOrderNumber); const result = database - .prepare("update LotTypes" + " set orderNumber = ? + 1" + " where lotTypeId = ?") + .prepare("update LotTypes set orderNumber = ? + 1 where lotTypeId = ?") .run(currentOrderNumber, lotTypeId); database.close(); clearLotTypesCache(); return result.changes > 0; }; +export const moveLotTypeDownToBottom = (lotTypeId) => { + const database = sqlite(databasePath); + const currentOrderNumber = database + .prepare("select orderNumber from LotTypes where lotTypeId = ?") + .get(lotTypeId).orderNumber; + const maxOrderNumber = database + .prepare("select max(orderNumber) as maxOrderNumber" + + " from LotTypes" + + " where recordDelete_timeMillis is null") + .get().maxOrderNumber; + if (currentOrderNumber !== maxOrderNumber) { + database + .prepare("update LotTypes set orderNumber = ? + 1 where lotTypeId = ?") + .run(maxOrderNumber, lotTypeId); + database + .prepare("update LotTypes" + + " set orderNumber = orderNumber - 1" + + " where recordDelete_timeMillis is null" + + " and orderNumber > ?") + .run(currentOrderNumber); + } + database.close(); + clearLotTypesCache(); + return true; +}; export default moveLotTypeDown; diff --git a/helpers/lotOccupancyDB/moveLotTypeDown.ts b/helpers/lotOccupancyDB/moveLotTypeDown.ts index bf5b0d83..fe5d3efe 100644 --- a/helpers/lotOccupancyDB/moveLotTypeDown.ts +++ b/helpers/lotOccupancyDB/moveLotTypeDown.ts @@ -8,7 +8,7 @@ export const moveLotTypeDown = (lotTypeId: number | string): boolean => { const database = sqlite(databasePath); const currentOrderNumber: number = database - .prepare("select orderNumber" + " from LotTypes" + " where lotTypeId = ?") + .prepare("select orderNumber from LotTypes where lotTypeId = ?") .get(lotTypeId).orderNumber; database @@ -21,7 +21,7 @@ export const moveLotTypeDown = (lotTypeId: number | string): boolean => { .run(currentOrderNumber); const result = database - .prepare("update LotTypes" + " set orderNumber = ? + 1" + " where lotTypeId = ?") + .prepare("update LotTypes set orderNumber = ? + 1 where lotTypeId = ?") .run(currentOrderNumber, lotTypeId); database.close(); @@ -31,4 +31,41 @@ export const moveLotTypeDown = (lotTypeId: number | string): boolean => { return result.changes > 0; }; +export const moveLotTypeDownToBottom = (lotTypeId: number | string): boolean => { + const database = sqlite(databasePath); + + const currentOrderNumber: number = database + .prepare("select orderNumber from LotTypes where lotTypeId = ?") + .get(lotTypeId).orderNumber; + + const maxOrderNumber: number = database + .prepare( + "select max(orderNumber) as maxOrderNumber" + + " from LotTypes" + + " where recordDelete_timeMillis is null" + ) + .get().maxOrderNumber; + + if (currentOrderNumber !== maxOrderNumber) { + database + .prepare("update LotTypes set orderNumber = ? + 1 where lotTypeId = ?") + .run(maxOrderNumber, lotTypeId); + + database + .prepare( + "update LotTypes" + + " set orderNumber = orderNumber - 1" + + " where recordDelete_timeMillis is null" + + " and orderNumber > ?" + ) + .run(currentOrderNumber); + } + + database.close(); + + clearLotTypesCache(); + + return true; +}; + export default moveLotTypeDown; diff --git a/helpers/lotOccupancyDB/moveLotTypeFieldDown.d.ts b/helpers/lotOccupancyDB/moveLotTypeFieldDown.d.ts index 8f25f30e..52da4006 100644 --- a/helpers/lotOccupancyDB/moveLotTypeFieldDown.d.ts +++ b/helpers/lotOccupancyDB/moveLotTypeFieldDown.d.ts @@ -1,2 +1,3 @@ export declare const moveLotTypeFieldDown: (lotTypeFieldId: number | string) => boolean; +export declare const moveLotTypeFieldDownToBottom: (lotTypeFieldId: number | string) => boolean; export default moveLotTypeFieldDown; diff --git a/helpers/lotOccupancyDB/moveLotTypeFieldDown.js b/helpers/lotOccupancyDB/moveLotTypeFieldDown.js index e863696b..9e70e8c0 100644 --- a/helpers/lotOccupancyDB/moveLotTypeFieldDown.js +++ b/helpers/lotOccupancyDB/moveLotTypeFieldDown.js @@ -20,4 +20,31 @@ export const moveLotTypeFieldDown = (lotTypeFieldId) => { clearLotTypesCache(); return result.changes > 0; }; +export const moveLotTypeFieldDownToBottom = (lotTypeFieldId) => { + const database = sqlite(databasePath); + const currentField = database + .prepare("select lotTypeId, orderNumber from LotTypeFields where lotTypeFieldId = ?") + .get(lotTypeFieldId); + const maxOrderNumber = database + .prepare("select max(orderNumber) as maxOrderNumber" + + " from LotTypeFields" + + " where recordDelete_timeMillis is null" + + " and lotTypeId = ?") + .get(currentField.lotTypeId).maxOrderNumber; + if (currentField.orderNumber !== maxOrderNumber) { + database + .prepare("update LotTypeFields set orderNumber = ? + 1 where lotTypeFieldId = ?") + .run(maxOrderNumber, lotTypeFieldId); + database + .prepare("update LotTypeFields" + + " set orderNumber = orderNumber - 1" + + " where recordDelete_timeMillis is null" + + " and lotTypeId = ?" + + " and orderNumber > ?") + .run(currentField.lotTypeId, currentField.orderNumber); + } + database.close(); + clearLotTypesCache(); + return true; +}; export default moveLotTypeFieldDown; diff --git a/helpers/lotOccupancyDB/moveLotTypeFieldDown.ts b/helpers/lotOccupancyDB/moveLotTypeFieldDown.ts index 346193de..90b622f9 100644 --- a/helpers/lotOccupancyDB/moveLotTypeFieldDown.ts +++ b/helpers/lotOccupancyDB/moveLotTypeFieldDown.ts @@ -8,9 +8,7 @@ export const moveLotTypeFieldDown = (lotTypeFieldId: number | string): boolean = const database = sqlite(databasePath); const currentField: { lotTypeId?: number; orderNumber: number } = database - .prepare( - "select lotTypeId, orderNumber from LotTypeFields where lotTypeFieldId = ?" - ) + .prepare("select lotTypeId, orderNumber from LotTypeFields where lotTypeFieldId = ?") .get(lotTypeFieldId); database @@ -34,4 +32,43 @@ export const moveLotTypeFieldDown = (lotTypeFieldId: number | string): boolean = return result.changes > 0; }; +export const moveLotTypeFieldDownToBottom = (lotTypeFieldId: number | string): boolean => { + const database = sqlite(databasePath); + + const currentField: { lotTypeId?: number; orderNumber: number } = database + .prepare("select lotTypeId, orderNumber from LotTypeFields where lotTypeFieldId = ?") + .get(lotTypeFieldId); + + const maxOrderNumber: number = database + .prepare( + "select max(orderNumber) as maxOrderNumber" + + " from LotTypeFields" + + " where recordDelete_timeMillis is null" + + " and lotTypeId = ?" + ) + .get(currentField.lotTypeId).maxOrderNumber; + + if (currentField.orderNumber !== maxOrderNumber) { + database + .prepare("update LotTypeFields set orderNumber = ? + 1 where lotTypeFieldId = ?") + .run(maxOrderNumber, lotTypeFieldId); + + database + .prepare( + "update LotTypeFields" + + " set orderNumber = orderNumber - 1" + + " where recordDelete_timeMillis is null" + + " and lotTypeId = ?" + + " and orderNumber > ?" + ) + .run(currentField.lotTypeId, currentField.orderNumber); + } + + database.close(); + + clearLotTypesCache(); + + return true; +}; + export default moveLotTypeFieldDown; diff --git a/helpers/lotOccupancyDB/moveLotTypeFieldUp.d.ts b/helpers/lotOccupancyDB/moveLotTypeFieldUp.d.ts index 81612b3a..dd0b9295 100644 --- a/helpers/lotOccupancyDB/moveLotTypeFieldUp.d.ts +++ b/helpers/lotOccupancyDB/moveLotTypeFieldUp.d.ts @@ -1,2 +1,3 @@ export declare const moveLotTypeFieldUp: (lotTypeFieldId: number | string) => boolean; +export declare const moveLotTypeFieldUpToTop: (lotTypeFieldId: number | string) => boolean; export default moveLotTypeFieldUp; diff --git a/helpers/lotOccupancyDB/moveLotTypeFieldUp.js b/helpers/lotOccupancyDB/moveLotTypeFieldUp.js index 0878c04a..3da71e17 100644 --- a/helpers/lotOccupancyDB/moveLotTypeFieldUp.js +++ b/helpers/lotOccupancyDB/moveLotTypeFieldUp.js @@ -24,4 +24,25 @@ export const moveLotTypeFieldUp = (lotTypeFieldId) => { clearLotTypesCache(); return result.changes > 0; }; +export const moveLotTypeFieldUpToTop = (lotTypeFieldId) => { + const database = sqlite(databasePath); + const currentField = database + .prepare("select lotTypeId, orderNumber from LotTypeFields where lotTypeFieldId = ?") + .get(lotTypeFieldId); + if (currentField.orderNumber > 0) { + database + .prepare("update LotTypeFields set orderNumber = -1 where lotTypeFieldId = ?") + .run(lotTypeFieldId); + database + .prepare("update LotTypeFields" + + " set orderNumber = orderNumber + 1" + + " where recordDelete_timeMillis is null" + + " and lotTypeId = ?" + + " and orderNumber < ?") + .run(currentField.lotTypeId, currentField.orderNumber); + } + database.close(); + clearLotTypesCache(); + return true; +}; export default moveLotTypeFieldUp; diff --git a/helpers/lotOccupancyDB/moveLotTypeFieldUp.ts b/helpers/lotOccupancyDB/moveLotTypeFieldUp.ts index a35c7a12..657b799d 100644 --- a/helpers/lotOccupancyDB/moveLotTypeFieldUp.ts +++ b/helpers/lotOccupancyDB/moveLotTypeFieldUp.ts @@ -37,4 +37,34 @@ export const moveLotTypeFieldUp = (lotTypeFieldId: number | string): boolean => return result.changes > 0; }; +export const moveLotTypeFieldUpToTop = (lotTypeFieldId: number | string): boolean => { + const database = sqlite(databasePath); + + const currentField: { lotTypeId: number; orderNumber: number } = database + .prepare("select lotTypeId, orderNumber from LotTypeFields where lotTypeFieldId = ?") + .get(lotTypeFieldId); + + if (currentField.orderNumber > 0) { + database + .prepare("update LotTypeFields set orderNumber = -1 where lotTypeFieldId = ?") + .run(lotTypeFieldId); + + database + .prepare( + "update LotTypeFields" + + " set orderNumber = orderNumber + 1" + + " where recordDelete_timeMillis is null" + + " and lotTypeId = ?" + + " and orderNumber < ?" + ) + .run(currentField.lotTypeId, currentField.orderNumber); + } + + database.close(); + + clearLotTypesCache(); + + return true; +}; + export default moveLotTypeFieldUp; diff --git a/helpers/lotOccupancyDB/moveLotTypeUp.d.ts b/helpers/lotOccupancyDB/moveLotTypeUp.d.ts index 2b647c6e..a2a82d5c 100644 --- a/helpers/lotOccupancyDB/moveLotTypeUp.d.ts +++ b/helpers/lotOccupancyDB/moveLotTypeUp.d.ts @@ -1,2 +1,3 @@ export declare const moveLotTypeUp: (lotTypeId: number | string) => boolean; +export declare const moveLotTypeUpToTop: (lotTypeId: number | string) => boolean; export default moveLotTypeUp; diff --git a/helpers/lotOccupancyDB/moveLotTypeUp.js b/helpers/lotOccupancyDB/moveLotTypeUp.js index 16bb0dfc..22463503 100644 --- a/helpers/lotOccupancyDB/moveLotTypeUp.js +++ b/helpers/lotOccupancyDB/moveLotTypeUp.js @@ -4,9 +4,7 @@ import { clearLotTypesCache } from "../functions.cache.js"; export const moveLotTypeUp = (lotTypeId) => { const database = sqlite(databasePath); const currentOrderNumber = database - .prepare("select orderNumber" + - " from LotTypes" + - " where lotTypeId = ?") + .prepare("select orderNumber from LotTypes where lotTypeId = ?") .get(lotTypeId).orderNumber; if (currentOrderNumber <= 0) { database.close(); @@ -19,12 +17,28 @@ export const moveLotTypeUp = (lotTypeId) => { " and orderNumber = ? - 1") .run(currentOrderNumber); const result = database - .prepare("update LotTypes" + - " set orderNumber = ? - 1" + - " where lotTypeId = ?") + .prepare("update LotTypes set orderNumber = ? - 1 where lotTypeId = ?") .run(currentOrderNumber, lotTypeId); database.close(); clearLotTypesCache(); return result.changes > 0; }; +export const moveLotTypeUpToTop = (lotTypeId) => { + const database = sqlite(databasePath); + const currentOrderNumber = database + .prepare("select orderNumber from LotTypes where lotTypeId = ?") + .get(lotTypeId).orderNumber; + if (currentOrderNumber > 0) { + database.prepare("update LotTypes set orderNumber = -1 where lotTypeId = ?").run(lotTypeId); + database + .prepare("update LotTypes" + + " set orderNumber = orderNumber + 1" + + " where recordDelete_timeMillis is null" + + " and orderNumber < ?") + .run(currentOrderNumber); + } + database.close(); + clearLotTypesCache(); + return true; +}; export default moveLotTypeUp; diff --git a/helpers/lotOccupancyDB/moveLotTypeUp.ts b/helpers/lotOccupancyDB/moveLotTypeUp.ts index d4ae6c5d..b77617b6 100644 --- a/helpers/lotOccupancyDB/moveLotTypeUp.ts +++ b/helpers/lotOccupancyDB/moveLotTypeUp.ts @@ -4,17 +4,11 @@ import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; import { clearLotTypesCache } from "../functions.cache.js"; -export const moveLotTypeUp = ( - lotTypeId: number | string -): boolean => { +export const moveLotTypeUp = (lotTypeId: number | string): boolean => { const database = sqlite(databasePath); const currentOrderNumber: number = database - .prepare( - "select orderNumber" + - " from LotTypes" + - " where lotTypeId = ?" - ) + .prepare("select orderNumber from LotTypes where lotTypeId = ?") .get(lotTypeId).orderNumber; if (currentOrderNumber <= 0) { @@ -32,11 +26,7 @@ export const moveLotTypeUp = ( .run(currentOrderNumber); const result = database - .prepare( - "update LotTypes" + - " set orderNumber = ? - 1" + - " where lotTypeId = ?" - ) + .prepare("update LotTypes set orderNumber = ? - 1 where lotTypeId = ?") .run(currentOrderNumber, lotTypeId); database.close(); @@ -46,4 +36,31 @@ export const moveLotTypeUp = ( return result.changes > 0; }; +export const moveLotTypeUpToTop = (lotTypeId: number | string): boolean => { + const database = sqlite(databasePath); + + const currentOrderNumber: number = database + .prepare("select orderNumber from LotTypes where lotTypeId = ?") + .get(lotTypeId).orderNumber; + + if (currentOrderNumber > 0) { + database.prepare("update LotTypes set orderNumber = -1 where lotTypeId = ?").run(lotTypeId); + + database + .prepare( + "update LotTypes" + + " set orderNumber = orderNumber + 1" + + " where recordDelete_timeMillis is null" + + " and orderNumber < ?" + ) + .run(currentOrderNumber); + } + + database.close(); + + clearLotTypesCache(); + + return true; +}; + export default moveLotTypeUp; diff --git a/public-typescript/adminLotTypes.js b/public-typescript/adminLotTypes.js index c7f91874..462157a3 100644 --- a/public-typescript/adminLotTypes.js +++ b/public-typescript/adminLotTypes.js @@ -127,14 +127,16 @@ Object.defineProperty(exports, "__esModule", { value: true }); clickEvent.preventDefault(); const lotTypeId = clickEvent.currentTarget.closest(".container--lotType").dataset.lotTypeId; cityssm.postJSON(urlPrefix + "/admin/doMoveLotTypeUp", { - lotTypeId + lotTypeId, + moveToTop: clickEvent.shiftKey ? "1" : "0" }, lotTypeResponseHandler); }; const moveLotTypeDown = (clickEvent) => { clickEvent.preventDefault(); const lotTypeId = clickEvent.currentTarget.closest(".container--lotType").dataset.lotTypeId; cityssm.postJSON(urlPrefix + "/admin/doMoveLotTypeDown", { - lotTypeId + lotTypeId, + moveToBottom: clickEvent.shiftKey ? "1" : "0" }, lotTypeResponseHandler); }; const openEditLotTypeField = (lotTypeId, lotTypeFieldId) => { @@ -239,14 +241,16 @@ Object.defineProperty(exports, "__esModule", { value: true }); clickEvent.preventDefault(); const lotTypeFieldId = clickEvent.currentTarget.closest(".container--lotTypeField").dataset.lotTypeFieldId; cityssm.postJSON(urlPrefix + "/admin/doMoveLotTypeFieldUp", { - lotTypeFieldId + lotTypeFieldId, + moveToTop: clickEvent.shiftKey ? "1" : "0" }, lotTypeResponseHandler); }; const moveLotTypeFieldDown = (clickEvent) => { clickEvent.preventDefault(); const lotTypeFieldId = clickEvent.currentTarget.closest(".container--lotTypeField").dataset.lotTypeFieldId; cityssm.postJSON(urlPrefix + "/admin/doMoveLotTypeFieldDown", { - lotTypeFieldId + lotTypeFieldId, + moveToBottom: clickEvent.shiftKey ? "1" : "0" }, lotTypeResponseHandler); }; const renderLotTypeFields = (panelElement, lotTypeId, lotTypeFields) => { diff --git a/public-typescript/adminLotTypes.ts b/public-typescript/adminLotTypes.ts index 530f7d02..0126c5d7 100644 --- a/public-typescript/adminLotTypes.ts +++ b/public-typescript/adminLotTypes.ts @@ -221,7 +221,7 @@ declare const bulmaJS: BulmaJS; }); }; - const moveLotTypeUp = (clickEvent: Event) => { + const moveLotTypeUp = (clickEvent: MouseEvent) => { clickEvent.preventDefault(); const lotTypeId = ( @@ -231,13 +231,14 @@ declare const bulmaJS: BulmaJS; cityssm.postJSON( urlPrefix + "/admin/doMoveLotTypeUp", { - lotTypeId + lotTypeId, + moveToTop: clickEvent.shiftKey ? "1" : "0" }, lotTypeResponseHandler ); }; - const moveLotTypeDown = (clickEvent: Event) => { + const moveLotTypeDown = (clickEvent: MouseEvent) => { clickEvent.preventDefault(); const lotTypeId = ( @@ -247,7 +248,8 @@ declare const bulmaJS: BulmaJS; cityssm.postJSON( urlPrefix + "/admin/doMoveLotTypeDown", { - lotTypeId + lotTypeId, + moveToBottom: clickEvent.shiftKey ? "1" : "0" }, lotTypeResponseHandler ); @@ -429,7 +431,7 @@ declare const bulmaJS: BulmaJS; openEditLotTypeField(lotTypeId, lotTypeFieldId); }; - const moveLotTypeFieldUp = (clickEvent: Event) => { + const moveLotTypeFieldUp = (clickEvent: MouseEvent) => { clickEvent.preventDefault(); const lotTypeFieldId = ( @@ -441,13 +443,14 @@ declare const bulmaJS: BulmaJS; cityssm.postJSON( urlPrefix + "/admin/doMoveLotTypeFieldUp", { - lotTypeFieldId + lotTypeFieldId, + moveToTop: clickEvent.shiftKey ? "1" : "0" }, lotTypeResponseHandler ); }; - const moveLotTypeFieldDown = (clickEvent: Event) => { + const moveLotTypeFieldDown = (clickEvent: MouseEvent) => { clickEvent.preventDefault(); const lotTypeFieldId = ( @@ -459,7 +462,8 @@ declare const bulmaJS: BulmaJS; cityssm.postJSON( urlPrefix + "/admin/doMoveLotTypeFieldDown", { - lotTypeFieldId + lotTypeFieldId, + moveToBottom: clickEvent.shiftKey ? "1" : "0" }, lotTypeResponseHandler ); diff --git a/public/javascripts/adminLotTypes.min.js b/public/javascripts/adminLotTypes.min.js index a0bcecf1..820dcb41 100644 --- a/public/javascripts/adminLotTypes.min.js +++ b/public/javascripts/adminLotTypes.min.js @@ -1 +1 @@ -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=exports.los,t=document.querySelector("main").dataset.urlPrefix,l=document.querySelector("#container--lotTypes");let o=exports.lotTypes;delete exports.lotTypes;const s=new Set,a=e=>{const t=e.currentTarget,l=t.closest(".container--lotType"),o=Number.parseInt(l.dataset.lotTypeId,10);s.has(o)?s.delete(o):s.add(o),t.innerHTML=s.has(o)?'':'';const a=l.querySelectorAll(".panel-block");for(const e of a)e.classList.toggle("is-hidden")},i=e=>{e.success?(o=e.lotTypes,b()):bulmaJS.alert({title:"Error Updating "+exports.aliases.lot+" Type",message:e.errorMessage,contextualColorName:"danger"})},d=e=>{const l=Number.parseInt(e.currentTarget.closest(".container--lotType").dataset.lotTypeId,10);bulmaJS.confirm({title:"Delete "+exports.aliases.lot+" Type",message:"Are you sure you want to delete this "+exports.aliases.lot.toLowerCase()+" type?",contextualColorName:"warning",okButton:{text:"Yes, Delete "+exports.aliases.lot+" Type",callbackFunction:()=>{cityssm.postJSON(t+"/admin/doDeleteLotType",{lotTypeId:l},i)}}})},n=l=>{const s=Number.parseInt(l.currentTarget.closest(".container--lotType").dataset.lotTypeId,10),a=o.find(e=>s===e.lotTypeId);let d;const n=e=>{e.preventDefault(),cityssm.postJSON(t+"/admin/doUpdateLotType",e.currentTarget,e=>{i(e),e.success&&d()})};cityssm.openHtmlModal("adminLotTypes-editLotType",{onshow:t=>{e.populateAliases(t),t.querySelector("#lotTypeEdit--lotTypeId").value=s.toString(),t.querySelector("#lotTypeEdit--lotType").value=a.lotType},onshown:(e,t)=>{d=t,e.querySelector("#lotTypeEdit--lotType").focus(),e.querySelector("form").addEventListener("submit",n),bulmaJS.toggleHtmlClipped()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},r=l=>{const o=Number.parseInt(l.currentTarget.closest(".container--lotType").dataset.lotTypeId,10);let a;const d=e=>{e.preventDefault(),cityssm.postJSON(t+"/admin/doAddLotTypeField",e.currentTarget,e=>{s.add(o),i(e),e.success&&(a(),u(o,e.lotTypeFieldId))})};cityssm.openHtmlModal("adminLotTypes-addLotTypeField",{onshow:t=>{e.populateAliases(t),o&&(t.querySelector("#lotTypeFieldAdd--lotTypeId").value=o.toString())},onshown:(e,t)=>{a=t,e.querySelector("#lotTypeFieldAdd--lotTypeField").focus(),e.querySelector("form").addEventListener("submit",d),bulmaJS.toggleHtmlClipped()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},p=e=>{e.preventDefault();const l=e.currentTarget.closest(".container--lotType").dataset.lotTypeId;cityssm.postJSON(t+"/admin/doMoveLotTypeUp",{lotTypeId:l},i)},c=e=>{e.preventDefault();const l=e.currentTarget.closest(".container--lotType").dataset.lotTypeId;cityssm.postJSON(t+"/admin/doMoveLotTypeDown",{lotTypeId:l},i)},u=(l,s)=>{const a=o.find(e=>e.lotTypeId===l).lotTypeFields.find(e=>e.lotTypeFieldId===s);let d,n,r,p,c;const u=()=>{n.min=d.value},y=()=>{""===p.value?(d.disabled=!1,n.disabled=!1,r.disabled=!1):(d.disabled=!0,n.disabled=!0,r.disabled=!0)},m=e=>{e.preventDefault(),cityssm.postJSON(t+"/admin/doUpdateLotTypeField",e.currentTarget,e=>{i(e),e.success&&c()})},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(t+"/admin/doDeleteLotTypeField",{lotTypeFieldId:s},e=>{i(e),e.success&&c()})}}})};cityssm.openHtmlModal("adminLotTypes-editLotTypeField",{onshow:t=>{e.populateAliases(t),t.querySelector("#lotTypeFieldEdit--lotTypeFieldId").value=a.lotTypeFieldId.toString(),t.querySelector("#lotTypeFieldEdit--lotTypeField").value=a.lotTypeField,t.querySelector("#lotTypeFieldEdit--isRequired").value=a.isRequired?"1":"0",(d=t.querySelector("#lotTypeFieldEdit--minimumLength")).value=a.minimumLength.toString(),(n=t.querySelector("#lotTypeFieldEdit--maximumLength")).value=a.maximumLength.toString(),(r=t.querySelector("#lotTypeFieldEdit--pattern")).value=a.pattern,(p=t.querySelector("#lotTypeFieldEdit--lotTypeFieldValues")).value=a.lotTypeFieldValues,y()},onshown:(e,t)=>{c=t,bulmaJS.init(e),bulmaJS.toggleHtmlClipped(),cityssm.enableNavBlocker(),e.querySelector("form").addEventListener("submit",m),d.addEventListener("keyup",u),u(),p.addEventListener("keyup",y),e.querySelector("#button--deleteLotTypeField").addEventListener("click",T)},onremoved:()=>{bulmaJS.toggleHtmlClipped(),cityssm.disableNavBlocker()}})},y=e=>{e.preventDefault();const t=Number.parseInt(e.currentTarget.closest(".container--lotTypeField").dataset.lotTypeFieldId,10),l=Number.parseInt(e.currentTarget.closest(".container--lotType").dataset.lotTypeId,10);u(l,t)},m=e=>{e.preventDefault();const l=e.currentTarget.closest(".container--lotTypeField").dataset.lotTypeFieldId;cityssm.postJSON(t+"/admin/doMoveLotTypeFieldUp",{lotTypeFieldId:l},i)},T=e=>{e.preventDefault();const l=e.currentTarget.closest(".container--lotTypeField").dataset.lotTypeFieldId;cityssm.postJSON(t+"/admin/doMoveLotTypeFieldDown",{lotTypeFieldId:l},i)},v=(e,t,l)=>{if(0===l.length)e.insertAdjacentHTML("beforeend",'

There are no additional fields.

');else for(const o of l){const l=document.createElement("div");l.className="panel-block is-block container--lotTypeField",s.has(t)||l.classList.add("is-hidden"),l.dataset.lotTypeFieldId=o.lotTypeFieldId.toString(),l.innerHTML='
',l.querySelector(".button--editLotTypeField").addEventListener("click",y),l.querySelector(".button--moveLotTypeFieldUp").addEventListener("click",m),l.querySelector(".button--moveLotTypeFieldDown").addEventListener("click",T),e.append(l)}},b=()=>{if(l.innerHTML="",0!==o.length)for(const e of o){const t=document.createElement("div");t.className="panel container--lotType",t.dataset.lotTypeId=e.lotTypeId.toString(),t.innerHTML='

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

',v(t,e.lotTypeId,e.lotTypeFields),t.querySelector(".button--toggleLotTypeFields").addEventListener("click",a),t.querySelector(".button--deleteLotType").addEventListener("click",d),t.querySelector(".button--editLotType").addEventListener("click",n),t.querySelector(".button--addLotTypeField").addEventListener("click",r),t.querySelector(".button--moveLotTypeUp").addEventListener("click",p),t.querySelector(".button--moveLotTypeDown").addEventListener("click",c),l.append(t)}else l.insertAdjacentHTML("afterbegin",'
There are no active '+exports.aliases.lot.toLowerCase()+" types.

")};document.querySelector("#button--addLotType").addEventListener("click",()=>{let l;const s=e=>{e.preventDefault(),cityssm.postJSON(t+"/admin/doAddLotType",e.currentTarget,e=>{e.success?(l(),o=e.lotTypes,b()):bulmaJS.alert({title:"Error Adding "+exports.aliases.lot+" Type",message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("adminLotTypes-addLotType",{onshow:t=>{e.populateAliases(t)},onshown:(e,t)=>{l=t,e.querySelector("#lotTypeAdd--lotType").focus(),e.querySelector("form").addEventListener("submit",s),bulmaJS.toggleHtmlClipped()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})}),b()})(); \ No newline at end of file +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=exports.los,t=document.querySelector("main").dataset.urlPrefix,l=document.querySelector("#container--lotTypes");let o=exports.lotTypes;delete exports.lotTypes;const s=new Set,a=e=>{const t=e.currentTarget,l=t.closest(".container--lotType"),o=Number.parseInt(l.dataset.lotTypeId,10);s.has(o)?s.delete(o):s.add(o),t.innerHTML=s.has(o)?'':'';const a=l.querySelectorAll(".panel-block");for(const e of a)e.classList.toggle("is-hidden")},i=e=>{e.success?(o=e.lotTypes,b()):bulmaJS.alert({title:"Error Updating "+exports.aliases.lot+" Type",message:e.errorMessage,contextualColorName:"danger"})},d=e=>{const l=Number.parseInt(e.currentTarget.closest(".container--lotType").dataset.lotTypeId,10);bulmaJS.confirm({title:"Delete "+exports.aliases.lot+" Type",message:"Are you sure you want to delete this "+exports.aliases.lot.toLowerCase()+" type?",contextualColorName:"warning",okButton:{text:"Yes, Delete "+exports.aliases.lot+" Type",callbackFunction:()=>{cityssm.postJSON(t+"/admin/doDeleteLotType",{lotTypeId:l},i)}}})},n=l=>{const s=Number.parseInt(l.currentTarget.closest(".container--lotType").dataset.lotTypeId,10),a=o.find(e=>s===e.lotTypeId);let d;const n=e=>{e.preventDefault(),cityssm.postJSON(t+"/admin/doUpdateLotType",e.currentTarget,e=>{i(e),e.success&&d()})};cityssm.openHtmlModal("adminLotTypes-editLotType",{onshow:t=>{e.populateAliases(t),t.querySelector("#lotTypeEdit--lotTypeId").value=s.toString(),t.querySelector("#lotTypeEdit--lotType").value=a.lotType},onshown:(e,t)=>{d=t,e.querySelector("#lotTypeEdit--lotType").focus(),e.querySelector("form").addEventListener("submit",n),bulmaJS.toggleHtmlClipped()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},r=l=>{const o=Number.parseInt(l.currentTarget.closest(".container--lotType").dataset.lotTypeId,10);let a;const d=e=>{e.preventDefault(),cityssm.postJSON(t+"/admin/doAddLotTypeField",e.currentTarget,e=>{s.add(o),i(e),e.success&&(a(),u(o,e.lotTypeFieldId))})};cityssm.openHtmlModal("adminLotTypes-addLotTypeField",{onshow:t=>{e.populateAliases(t),o&&(t.querySelector("#lotTypeFieldAdd--lotTypeId").value=o.toString())},onshown:(e,t)=>{a=t,e.querySelector("#lotTypeFieldAdd--lotTypeField").focus(),e.querySelector("form").addEventListener("submit",d),bulmaJS.toggleHtmlClipped()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},p=e=>{e.preventDefault();const l=e.currentTarget.closest(".container--lotType").dataset.lotTypeId;cityssm.postJSON(t+"/admin/doMoveLotTypeUp",{lotTypeId:l,moveToTop:e.shiftKey?"1":"0"},i)},c=e=>{e.preventDefault();const l=e.currentTarget.closest(".container--lotType").dataset.lotTypeId;cityssm.postJSON(t+"/admin/doMoveLotTypeDown",{lotTypeId:l,moveToBottom:e.shiftKey?"1":"0"},i)},u=(l,s)=>{const a=o.find(e=>e.lotTypeId===l).lotTypeFields.find(e=>e.lotTypeFieldId===s);let d,n,r,p,c;const u=()=>{n.min=d.value},y=()=>{""===p.value?(d.disabled=!1,n.disabled=!1,r.disabled=!1):(d.disabled=!0,n.disabled=!0,r.disabled=!0)},m=e=>{e.preventDefault(),cityssm.postJSON(t+"/admin/doUpdateLotTypeField",e.currentTarget,e=>{i(e),e.success&&c()})},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(t+"/admin/doDeleteLotTypeField",{lotTypeFieldId:s},e=>{i(e),e.success&&c()})}}})};cityssm.openHtmlModal("adminLotTypes-editLotTypeField",{onshow:t=>{e.populateAliases(t),t.querySelector("#lotTypeFieldEdit--lotTypeFieldId").value=a.lotTypeFieldId.toString(),t.querySelector("#lotTypeFieldEdit--lotTypeField").value=a.lotTypeField,t.querySelector("#lotTypeFieldEdit--isRequired").value=a.isRequired?"1":"0",(d=t.querySelector("#lotTypeFieldEdit--minimumLength")).value=a.minimumLength.toString(),(n=t.querySelector("#lotTypeFieldEdit--maximumLength")).value=a.maximumLength.toString(),(r=t.querySelector("#lotTypeFieldEdit--pattern")).value=a.pattern,(p=t.querySelector("#lotTypeFieldEdit--lotTypeFieldValues")).value=a.lotTypeFieldValues,y()},onshown:(e,t)=>{c=t,bulmaJS.init(e),bulmaJS.toggleHtmlClipped(),cityssm.enableNavBlocker(),e.querySelector("form").addEventListener("submit",m),d.addEventListener("keyup",u),u(),p.addEventListener("keyup",y),e.querySelector("#button--deleteLotTypeField").addEventListener("click",T)},onremoved:()=>{bulmaJS.toggleHtmlClipped(),cityssm.disableNavBlocker()}})},y=e=>{e.preventDefault();const t=Number.parseInt(e.currentTarget.closest(".container--lotTypeField").dataset.lotTypeFieldId,10),l=Number.parseInt(e.currentTarget.closest(".container--lotType").dataset.lotTypeId,10);u(l,t)},m=e=>{e.preventDefault();const l=e.currentTarget.closest(".container--lotTypeField").dataset.lotTypeFieldId;cityssm.postJSON(t+"/admin/doMoveLotTypeFieldUp",{lotTypeFieldId:l,moveToTop:e.shiftKey?"1":"0"},i)},T=e=>{e.preventDefault();const l=e.currentTarget.closest(".container--lotTypeField").dataset.lotTypeFieldId;cityssm.postJSON(t+"/admin/doMoveLotTypeFieldDown",{lotTypeFieldId:l,moveToBottom:e.shiftKey?"1":"0"},i)},v=(e,t,l)=>{if(0===l.length)e.insertAdjacentHTML("beforeend",'

There are no additional fields.

');else for(const o of l){const l=document.createElement("div");l.className="panel-block is-block container--lotTypeField",s.has(t)||l.classList.add("is-hidden"),l.dataset.lotTypeFieldId=o.lotTypeFieldId.toString(),l.innerHTML='
',l.querySelector(".button--editLotTypeField").addEventListener("click",y),l.querySelector(".button--moveLotTypeFieldUp").addEventListener("click",m),l.querySelector(".button--moveLotTypeFieldDown").addEventListener("click",T),e.append(l)}},b=()=>{if(l.innerHTML="",0!==o.length)for(const e of o){const t=document.createElement("div");t.className="panel container--lotType",t.dataset.lotTypeId=e.lotTypeId.toString(),t.innerHTML='

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

',v(t,e.lotTypeId,e.lotTypeFields),t.querySelector(".button--toggleLotTypeFields").addEventListener("click",a),t.querySelector(".button--deleteLotType").addEventListener("click",d),t.querySelector(".button--editLotType").addEventListener("click",n),t.querySelector(".button--addLotTypeField").addEventListener("click",r),t.querySelector(".button--moveLotTypeUp").addEventListener("click",p),t.querySelector(".button--moveLotTypeDown").addEventListener("click",c),l.append(t)}else l.insertAdjacentHTML("afterbegin",'
There are no active '+exports.aliases.lot.toLowerCase()+" types.

")};document.querySelector("#button--addLotType").addEventListener("click",()=>{let l;const s=e=>{e.preventDefault(),cityssm.postJSON(t+"/admin/doAddLotType",e.currentTarget,e=>{e.success?(l(),o=e.lotTypes,b()):bulmaJS.alert({title:"Error Adding "+exports.aliases.lot+" Type",message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("adminLotTypes-addLotType",{onshow:t=>{e.populateAliases(t)},onshown:(e,t)=>{l=t,e.querySelector("#lotTypeAdd--lotType").focus(),e.querySelector("form").addEventListener("submit",s),bulmaJS.toggleHtmlClipped()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})}),b()})(); \ No newline at end of file