diff --git a/handlers/maps-post/doDeleteMap.d.ts b/handlers/maps-post/doDeleteMap.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/maps-post/doDeleteMap.d.ts @@ -0,0 +1,3 @@ +import type { RequestHandler } from "express"; +export declare const handler: RequestHandler; +export default handler; diff --git a/handlers/maps-post/doDeleteMap.js b/handlers/maps-post/doDeleteMap.js new file mode 100644 index 00000000..b70cc2e7 --- /dev/null +++ b/handlers/maps-post/doDeleteMap.js @@ -0,0 +1,8 @@ +import { deleteMap } from "../../helpers/lotOccupancyDB/deleteMap.js"; +export const handler = async (request, response) => { + const success = deleteMap(request.body.mapId, request.session); + response.json({ + success + }); +}; +export default handler; diff --git a/handlers/maps-post/doDeleteMap.ts b/handlers/maps-post/doDeleteMap.ts new file mode 100644 index 00000000..ca413eac --- /dev/null +++ b/handlers/maps-post/doDeleteMap.ts @@ -0,0 +1,20 @@ +import type { + RequestHandler +} from "express"; + +import { + deleteMap +} from "../../helpers/lotOccupancyDB/deleteMap.js"; + + +export const handler: RequestHandler = async (request, response) => { + + const success = deleteMap(request.body.mapId, request.session); + + response.json({ + success + }); +}; + + +export default handler; \ No newline at end of file diff --git a/helpers/lotOccupancyDB/deleteMap.d.ts b/helpers/lotOccupancyDB/deleteMap.d.ts new file mode 100644 index 00000000..8e055bd2 --- /dev/null +++ b/helpers/lotOccupancyDB/deleteMap.d.ts @@ -0,0 +1,3 @@ +import type * as recordTypes from "../../types/recordTypes"; +export declare const deleteMap: (mapId: number | string, requestSession: recordTypes.PartialSession) => boolean; +export default deleteMap; diff --git a/helpers/lotOccupancyDB/deleteMap.js b/helpers/lotOccupancyDB/deleteMap.js new file mode 100644 index 00000000..b81fcaf0 --- /dev/null +++ b/helpers/lotOccupancyDB/deleteMap.js @@ -0,0 +1,15 @@ +import sqlite from "better-sqlite3"; +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +export const deleteMap = (mapId, requestSession) => { + const database = sqlite(databasePath); + const rightNowMillis = Date.now(); + const result = database + .prepare("update Maps" + + " set recordDelete_userName = ?," + + " recordDelete_timeMillis = ?" + + " where mapId = ?") + .run(requestSession.user.userName, rightNowMillis, mapId); + database.close(); + return (result.changes > 0); +}; +export default deleteMap; diff --git a/helpers/lotOccupancyDB/deleteMap.ts b/helpers/lotOccupancyDB/deleteMap.ts new file mode 100644 index 00000000..177894e4 --- /dev/null +++ b/helpers/lotOccupancyDB/deleteMap.ts @@ -0,0 +1,33 @@ +import sqlite from "better-sqlite3"; + +import { + lotOccupancyDB as databasePath +} from "../../data/databasePaths.js"; + +import type * as recordTypes from "../../types/recordTypes"; + + +export const deleteMap = + (mapId: number | string, + requestSession: recordTypes.PartialSession): boolean => { + + const database = sqlite(databasePath); + + const rightNowMillis = Date.now(); + + const result = database + .prepare("update Maps" + + " set recordDelete_userName = ?," + + " recordDelete_timeMillis = ?" + + " where mapId = ?") + .run(requestSession.user.userName, + rightNowMillis, + mapId); + + database.close(); + + return (result.changes > 0); + }; + + +export default deleteMap; \ No newline at end of file diff --git a/public-typescript/mapEdit.js b/public-typescript/mapEdit.js index 5f40ff33..11c0d669 100644 --- a/public-typescript/mapEdit.js +++ b/public-typescript/mapEdit.js @@ -29,4 +29,34 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); }; mapForm.addEventListener("submit", updateMap); + if (!isCreate) { + document.querySelector("#button--deleteMap").addEventListener("click", (clickEvent) => { + clickEvent.preventDefault(); + const doDelete = () => { + cityssm.postJSON(urlPrefix + "/maps/doDeleteMap", { + mapId + }, (responseJSON) => { + if (responseJSON.success) { + window.location.href = urlPrefix + "/maps?t=" + Date.now(); + } + else { + bulmaJS.alert({ + title: "Error Deleting " + exports.aliases.map, + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + bulmaJS.confirm({ + title: "Delete " + exports.aliases.map, + message: "Are you sure you want to delete this " + exports.aliases.map.toLowerCase() + "?", + contextualColorName: "warning", + okButton: { + text: "Yes, Delete " + exports.aliases.map + "?", + callbackFunction: doDelete + } + }); + }); + } })(); diff --git a/public-typescript/mapEdit.ts b/public-typescript/mapEdit.ts index 6a81df55..cac34987 100644 --- a/public-typescript/mapEdit.ts +++ b/public-typescript/mapEdit.ts @@ -1,7 +1,11 @@ /* eslint-disable unicorn/prefer-module */ -import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; -import type { BulmaJS } from "@cityssm/bulma-js/types"; +import type { + cityssmGlobal +} from "@cityssm/bulma-webapp-js/src/types"; +import type { + BulmaJS +} from "@cityssm/bulma-js/types"; declare const cityssm: cityssmGlobal; declare const bulmaJS: BulmaJS; @@ -20,7 +24,10 @@ declare const bulmaJS: BulmaJS; cityssm.postJSON(urlPrefix + "/maps/" + (isCreate ? "doCreateMap" : "doUpdateMap"), mapForm, - (responseJSON: { success: boolean; mapId?: number, errorMessage?: string}) => { + (responseJSON: { + success: boolean;mapId ? : number, + errorMessage ? : string + }) => { if (responseJSON.success) { if (isCreate) { @@ -38,8 +45,46 @@ declare const bulmaJS: BulmaJS; contextualColorName: "danger" }); } - }); + }); }; mapForm.addEventListener("submit", updateMap); + + if (!isCreate) { + + document.querySelector("#button--deleteMap").addEventListener("click", (clickEvent) => { + clickEvent.preventDefault(); + + const doDelete = () => { + + cityssm.postJSON(urlPrefix + "/maps/doDeleteMap", { + mapId + }, + (responseJSON: { + success: boolean;errorMessage ? : string; + }) => { + + if (responseJSON.success) { + window.location.href = urlPrefix + "/maps?t=" + Date.now(); + } else { + bulmaJS.alert({ + title: "Error Deleting " + exports.aliases.map, + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + + bulmaJS.confirm({ + title: "Delete " + exports.aliases.map, + message: "Are you sure you want to delete this " + exports.aliases.map.toLowerCase() + "?", + contextualColorName: "warning", + okButton: { + text: "Yes, Delete " + exports.aliases.map + "?", + callbackFunction: doDelete + } + }); + }); + } })(); \ No newline at end of file diff --git a/public/javascripts/mapEdit.min.js b/public/javascripts/mapEdit.min.js index d99df116..ceff5678 100644 --- a/public/javascripts/mapEdit.min.js +++ b/public/javascripts/mapEdit.min.js @@ -1 +1 @@ -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=document.querySelector("main").dataset.urlPrefix,a=""===document.querySelector("#map--mapId").value,t=document.querySelector("#form--map");t.addEventListener("submit",s=>{s.preventDefault(),cityssm.postJSON(e+"/maps/"+(a?"doCreateMap":"doUpdateMap"),t,t=>{t.success?a?window.location.href=e+"/maps/"+t.mapId+"/edit":bulmaJS.alert({message:exports.aliases.map+" Updated Successfully",contextualColorName:"success"}):bulmaJS.alert({title:"Error Updating "+exports.aliases.map,message:t.errorMessage,contextualColorName:"danger"})})})})(); \ No newline at end of file +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=document.querySelector("main").dataset.urlPrefix,t=document.querySelector("#map--mapId").value,a=""===t,s=document.querySelector("#form--map");s.addEventListener("submit",t=>{t.preventDefault(),cityssm.postJSON(e+"/maps/"+(a?"doCreateMap":"doUpdateMap"),s,t=>{t.success?a?window.location.href=e+"/maps/"+t.mapId+"/edit":bulmaJS.alert({message:exports.aliases.map+" Updated Successfully",contextualColorName:"success"}):bulmaJS.alert({title:"Error Updating "+exports.aliases.map,message:t.errorMessage,contextualColorName:"danger"})})}),a||document.querySelector("#button--deleteMap").addEventListener("click",a=>{a.preventDefault();bulmaJS.confirm({title:"Delete "+exports.aliases.map,message:"Are you sure you want to delete this "+exports.aliases.map.toLowerCase()+"?",contextualColorName:"warning",okButton:{text:"Yes, Delete "+exports.aliases.map+"?",callbackFunction:()=>{cityssm.postJSON(e+"/maps/doDeleteMap",{mapId:t},t=>{t.success?window.location.href=e+"/maps?t="+Date.now():bulmaJS.alert({title:"Error Deleting "+exports.aliases.map,message:t.errorMessage,contextualColorName:"danger"})})}}})})})(); \ No newline at end of file diff --git a/routes/maps.js b/routes/maps.js index fe2cc841..219ed37a 100644 --- a/routes/maps.js +++ b/routes/maps.js @@ -6,6 +6,7 @@ import handler_new from "../handlers/maps-get/new.js"; import handler_edit from "../handlers/maps-get/edit.js"; import handler_doCreateMap from "../handlers/maps-post/doCreateMap.js"; import handler_doUpdateMap from "../handlers/maps-post/doUpdateMap.js"; +import handler_doDeleteMap from "../handlers/maps-post/doDeleteMap.js"; export const router = Router(); router.get("/", handler_search); router.get("/new", permissionHandlers.updateGetHandler, handler_new); @@ -13,4 +14,5 @@ router.get("/:mapId", handler_view); router.get("/:mapId/edit", permissionHandlers.updateGetHandler, handler_edit); router.post("/doCreateMap", permissionHandlers.updatePostHandler, handler_doCreateMap); router.post("/doUpdateMap", permissionHandlers.updatePostHandler, handler_doUpdateMap); +router.post("/doDeleteMap", permissionHandlers.updatePostHandler, handler_doDeleteMap); export default router; diff --git a/routes/maps.ts b/routes/maps.ts index bbf5ee40..d4619704 100644 --- a/routes/maps.ts +++ b/routes/maps.ts @@ -12,6 +12,7 @@ import handler_edit from "../handlers/maps-get/edit.js"; import handler_doCreateMap from "../handlers/maps-post/doCreateMap.js"; import handler_doUpdateMap from "../handlers/maps-post/doUpdateMap.js"; +import handler_doDeleteMap from "../handlers/maps-post/doDeleteMap.js"; export const router = Router(); @@ -45,4 +46,9 @@ router.post("/doUpdateMap", handler_doUpdateMap); +router.post("/doDeleteMap", + permissionHandlers.updatePostHandler, + handler_doDeleteMap); + + export default router; \ No newline at end of file diff --git a/views/map-edit.ejs b/views/map-edit.ejs index b6b8cba5..f3e42339 100644 --- a/views/map-edit.ejs +++ b/views/map-edit.ejs @@ -160,8 +160,31 @@