From 13f92a72e8dc05b1e194e9ac64cc6f01443d4d1c Mon Sep 17 00:00:00 2001 From: Arpit Chakladar <54011232+arpitchakladar@users.noreply.github.com> Date: Tue, 30 Jul 2024 10:38:51 +0530 Subject: Added the ability to download the map in PDF. --- src/scripts.json | 2 +- src/scripts/functionality/sheet-map.ts | 20 --- .../sheet-map/download-map-pdf-page-content.html | 46 ++++++ src/scripts/functionality/sheet-map/index.ts | 160 +++++++++++++++++++++ .../sheet-map/map-svg-path-element.html | 11 ++ .../sheet-map/map-svg-plot-label-element.html | 3 + .../download-information-pdf-page-content.html | 1 - 7 files changed, 221 insertions(+), 22 deletions(-) delete mode 100644 src/scripts/functionality/sheet-map.ts create mode 100644 src/scripts/functionality/sheet-map/download-map-pdf-page-content.html create mode 100644 src/scripts/functionality/sheet-map/index.ts create mode 100644 src/scripts/functionality/sheet-map/map-svg-path-element.html create mode 100644 src/scripts/functionality/sheet-map/map-svg-plot-label-element.html diff --git a/src/scripts.json b/src/scripts.json index 5a821b4..43d506c 100644 --- a/src/scripts.json +++ b/src/scripts.json @@ -9,6 +9,6 @@ "functionality/view-khatian/index.ts": "KnowYourProperty.action", "captcha/know-your-property.ts": "KnowYourProperty.action", "captcha/application-receipt.ts": "Apprecrep.action", - "functionality/sheet-map.ts": "SheetMapViewAction.action?lstSheetNo=0" + "functionality/sheet-map/index.ts": "SheetMapViewAction.action" } } diff --git a/src/scripts/functionality/sheet-map.ts b/src/scripts/functionality/sheet-map.ts deleted file mode 100644 index 4e3bc75..0000000 --- a/src/scripts/functionality/sheet-map.ts +++ /dev/null @@ -1,20 +0,0 @@ -const downloadButtonContainer = document.createElement("td"); -const downloadButton = document.createElement("button"); -downloadButton.innerHTML = "DOWNLOAD"; -downloadButtonContainer.appendChild(downloadButton); -const svgElement = document.querySelector("svg"); -(document.querySelector("#headerTable > tbody > tr") as any).appendChild(downloadButtonContainer); -downloadButton.addEventListener("click", e => { - e.preventDefault(); - (document.querySelector("#btnResetZoom") as any).click() - function download(filename: string, text: string) { - const element = document.createElement("a"); - element.setAttribute("href", "data:text/plain;charset=utf-8," + encodeURIComponent(text)); - element.setAttribute("download", filename); - element.style.display = "none"; - document.body.appendChild(element); - element.click(); - document.body.removeChild(element); - } - download("map.svg", $("#OpenLayers_Layer_Vector_RootContainer_35").html()); -}); diff --git a/src/scripts/functionality/sheet-map/download-map-pdf-page-content.html b/src/scripts/functionality/sheet-map/download-map-pdf-page-content.html new file mode 100644 index 0000000..a07a316 --- /dev/null +++ b/src/scripts/functionality/sheet-map/download-map-pdf-page-content.html @@ -0,0 +1,46 @@ + + + $mapContent$ + + diff --git a/src/scripts/functionality/sheet-map/index.ts b/src/scripts/functionality/sheet-map/index.ts new file mode 100644 index 0000000..341c39b --- /dev/null +++ b/src/scripts/functionality/sheet-map/index.ts @@ -0,0 +1,160 @@ +import { generateWebPage } from "@/shared/generate-web-page"; +import getDownloadMapPDFPageContent from "@/scripts/functionality/sheet-map/download-map-pdf-page-content.html"; +import getMapSVGPathElementContent from "@/scripts/functionality/sheet-map/map-svg-path-element.html"; +import getMapPlotLabelElementContent from "@/scripts/functionality/sheet-map/map-svg-plot-label-element.html"; + +interface PlotDetail { + plotArea: number; + plotno: string; + polygon: string; +}; + +interface PlotLabel { + plotno: string; + point: string; +} + +const downloadSVGButtonContainer = document.createElement("td"); +const downloadSVGButton = document.createElement("button"); +const downloadPDFButtonContainer = document.createElement("td"); +const downloadPDFButton = document.createElement("button"); +const downloadPDFWithOutLabelButtonContainer = document.createElement("td"); +const downloadPDFWithOutLabelButton = document.createElement("button"); +downloadSVGButton.innerHTML = "DOWNLOAD SVG"; +downloadPDFButton.innerHTML = "DOWNLOAD PDF"; +downloadPDFWithOutLabelButton.innerHTML = "DOWNLOAD PDF (NO LABELS)"; +downloadSVGButtonContainer.appendChild(downloadSVGButton); +downloadPDFButtonContainer.appendChild(downloadPDFButton); +downloadPDFWithOutLabelButtonContainer.appendChild(downloadPDFWithOutLabelButton); +const svgElement = document.querySelector("svg"); +document.querySelector("#headerTable > tbody > tr")!.appendChild(downloadSVGButtonContainer); +document.querySelector("#headerTable > tbody > tr")!.appendChild(downloadPDFButtonContainer); +document.querySelector("#headerTable > tbody > tr")!.appendChild(downloadPDFWithOutLabelButtonContainer); +const resetZoomButton = document.querySelector("#btnResetZoom")!; +const plotNumberInput = document.querySelector("#txtPlotNo")!; +const plotInformation = document.createElement("div") as HTMLDivElement; +document.body.appendChild(plotInformation); + +const setPlotInformation = (plotDetail: PlotDetail | null | undefined = null) => { + if (plotDetail) { + plotInformation.innerHTML = "
Plot Number: " + plotDetail.plotno + "
Area: " + (plotDetail.plotArea/1000).toFixed(3) + " acres
"; + } else { + plotInformation.innerHTML = "
Plot Number:
Area: 0.000 acres
"; + } +}; +setPlotInformation(); + +let plotDetailContent = ""; +let plotLabelContent = ""; + +downloadSVGButton.addEventListener("click", e => { + e.preventDefault(); + const element = document.createElement("a"); + element.setAttribute( + "href", + "data:text/plain;charset=utf-8," + encodeURIComponent(plotDetailContent + plotLabelContent) + ); + element.setAttribute("download", "map.svg"); + element.style.display = "none"; + document.body.appendChild(element); + element.click(); + document.body.removeChild(element); +}); + +const downloadPDF = (labelPoints: boolean = true) => { + generateWebPage( + getDownloadMapPDFPageContent({ + mapContent: plotDetailContent + (labelPoints ? plotLabelContent : "") + }), + "map" + ); +}; + +downloadPDFButton.addEventListener("click", e => { + e.preventDefault(); + downloadPDF(); +}); + +downloadPDFWithOutLabelButton.addEventListener("click", e => { + e.preventDefault(); + downloadPDF(false); +}); + +(async () => { + const searchParams = new URLSearchParams(window.location.search); + const response1 = await fetch( + "/BanglarBhumi/sheetMap_populateLayerData?lstSheetNo=" + searchParams.get("lstSheetNo"), + { + method: "POST" + }); + const plotDetailList: PlotDetail[] = (await response1.json()).features; + const response2 = await fetch( + "/BanglarBhumi/sheetMap_populateCentroidData?lstSheetNo=" + searchParams.get("lstSheetNo"), + { + method: "POST" + }); + const plotLabelList: PlotLabel[] = (await response2.json()).features; + let plotDetails: { [key: string]: PlotDetail } = {}; + + for (const plotDetail of plotDetailList) { + const plotPolygonPoints = plotDetail.polygon.split("(((")[1].split(")))")[0]; + plotDetailContent += getMapSVGPathElementContent({ + polygonData: plotPolygonPoints + }); + } + + for (const plotLabel of plotLabelList) { + const plotLabelPoint = plotLabel.point.split("(")[1].split(")")[0].split(" "); + plotLabelContent += getMapPlotLabelElementContent({ + plotLabelX: plotLabelPoint[0], + plotLabelY: plotLabelPoint[1], + plotNumber: plotLabel.plotno + }); + } + + document.querySelector("#btnSearch")!.addEventListener("click", () => { + let plotDetail; + for (const p of plotDetailList) { + if (p.plotno === plotNumberInput.value) { + plotDetail = p; + break; + } + } + setPlotInformation(plotDetail); + }); + + await new Promise((resolve, reject) => { + const plotElementIdsControl = setInterval(() => { + let i = 0; + let plotElements = document.querySelector("#OpenLayers_Layer_Vector_25_vroot")?.children || []; + if (plotElements.length) { + clearInterval(plotElementIdsControl); + for (let i = 0; i < plotElements.length; i++) { + plotDetails[plotElements[i].id] = plotDetailList[i]; + } + resolve(); + } + }, 300); + }); + + setInterval(() => { + for (const plotElementId in plotDetails) { + const e = document.getElementById(plotElementId); + if (e) { + e.removeEventListener("click", handlePlotClick); + e.addEventListener("click", handlePlotClick); + } + } + }, 300); + + const handlePlotClick = (e: MouseEvent) => { + document.querySelectorAll("path").forEach(e => { + e.setAttribute("fill", "#ffcc66"); + }); + + const target = e.target as SVGPathElement; + + target.setAttribute("fill", "#8aeeef"); + setPlotInformation(plotDetails[target.id]); + }; +})(); diff --git a/src/scripts/functionality/sheet-map/map-svg-path-element.html b/src/scripts/functionality/sheet-map/map-svg-path-element.html new file mode 100644 index 0000000..673707e --- /dev/null +++ b/src/scripts/functionality/sheet-map/map-svg-path-element.html @@ -0,0 +1,11 @@ + + diff --git a/src/scripts/functionality/sheet-map/map-svg-plot-label-element.html b/src/scripts/functionality/sheet-map/map-svg-plot-label-element.html new file mode 100644 index 0000000..b4eefec --- /dev/null +++ b/src/scripts/functionality/sheet-map/map-svg-plot-label-element.html @@ -0,0 +1,3 @@ + + $plotNumber$ + diff --git a/src/scripts/functionality/view-khatian/download-information-pdf-page-content.html b/src/scripts/functionality/view-khatian/download-information-pdf-page-content.html index 668c36a..5b26469 100644 --- a/src/scripts/functionality/view-khatian/download-information-pdf-page-content.html +++ b/src/scripts/functionality/view-khatian/download-information-pdf-page-content.html @@ -211,7 +211,6 @@ } -
$details$