From a9c32c2d0baa86a4945b1e50903a14d6d3963279 Mon Sep 17 00:00:00 2001 From: Dan Gowans Date: Wed, 28 Sep 2022 13:51:13 -0400 Subject: [PATCH] add print to work order and occupancy search --- handlers/print-get/pdf.js | 2 +- handlers/print-get/pdf.ts | 2 +- public-typescript/lotOccupancySearch.js | 26 +++++++++++++++--- public-typescript/lotOccupancySearch.ts | 28 +++++++++++++++++--- public-typescript/workOrderSearch.js | 15 +++++++++++ public-typescript/workOrderSearch.ts | 16 +++++++++++ public/javascripts/lotOccupancySearch.min.js | 2 +- public/javascripts/workOrderSearch.min.js | 2 +- views/lotOccupancy-search.ejs | 3 +++ views/workOrder-search.ejs | 3 +++ 10 files changed, 89 insertions(+), 10 deletions(-) diff --git a/handlers/print-get/pdf.js b/handlers/print-get/pdf.js index 4024c765..4965023f 100644 --- a/handlers/print-get/pdf.js +++ b/handlers/print-get/pdf.js @@ -15,7 +15,7 @@ export const handler = async (request, response, next) => { const reportData = getReportData(printConfig, request.query); const reportPath = path.join("views", "print", "pdf", printName + ".ejs"); const pdfCallbackFunction = (pdf) => { - response.setHeader("Content-Disposition", "inline;" + " filename=" + camelcase(printConfig.title) + ".pdf"); + response.setHeader("Content-Disposition", "attachment;" + " filename=" + camelcase(printConfig.title) + ".pdf"); response.setHeader("Content-Type", "application/pdf"); response.send(pdf); }; diff --git a/handlers/print-get/pdf.ts b/handlers/print-get/pdf.ts index a9b2d690..c7988b8e 100644 --- a/handlers/print-get/pdf.ts +++ b/handlers/print-get/pdf.ts @@ -30,7 +30,7 @@ export const handler: RequestHandler = async (request, response, next) => { const pdfCallbackFunction = (pdf: Buffer) => { response.setHeader( "Content-Disposition", - "inline;" + " filename=" + camelcase(printConfig.title) + ".pdf" + "attachment;" + " filename=" + camelcase(printConfig.title) + ".pdf" ); response.setHeader("Content-Type", "application/pdf"); diff --git a/public-typescript/lotOccupancySearch.js b/public-typescript/lotOccupancySearch.js index 27d76fe8..45e29961 100644 --- a/public-typescript/lotOccupancySearch.js +++ b/public-typescript/lotOccupancySearch.js @@ -2,6 +2,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const urlPrefix = document.querySelector("main").dataset.urlPrefix; + const lotOccupancyPrints = exports.lotOccupancyPrints; const searchFilterFormElement = document.querySelector("#form--searchFilters"); const searchResultsContainerElement = document.querySelector("#container--searchResults"); const limit = Number.parseInt(document.querySelector("#searchFilter--limit").value, 10); @@ -51,10 +52,15 @@ Object.defineProperty(exports, "__esModule", { value: true }); } let occupantsHTML = ""; for (const occupant of lotOccupancy.lotOccupancyOccupants) { - occupantsHTML += cityssm.escapeHTML(occupant.occupantName) + "
"; + occupantsHTML += + '' + + cityssm.escapeHTML(occupant.occupantName) + + "
"; } resultsTbodyElement.insertAdjacentHTML("beforeend", "" + - ("" + occupancyTimeHTML + "") + + ('' + occupancyTimeHTML + "") + ("" + '" + occupantsHTML + "" + + (lotOccupancyPrints.length > 0 + ? "" + + '' + + '' + + "" + + "" + : "") + ""); } searchResultsContainerElement.innerHTML = '' + "" + - "" + + '' + ("") + ("") + "" + "" + ("") + + (lotOccupancyPrints.length > 0 ? '' : "") + "" + "
" + cityssm.escapeHTML(exports.aliases.occupancy) + " Type" + cityssm.escapeHTML(exports.aliases.lot) + "Start DateEnd Date" + cityssm.escapeHTML(exports.aliases.occupants) + "
" + '
' + diff --git a/public-typescript/lotOccupancySearch.ts b/public-typescript/lotOccupancySearch.ts index 5dd2ac13..1016eec7 100644 --- a/public-typescript/lotOccupancySearch.ts +++ b/public-typescript/lotOccupancySearch.ts @@ -9,9 +9,12 @@ declare const cityssm: cityssmGlobal; (() => { const urlPrefix = document.querySelector("main").dataset.urlPrefix; + const lotOccupancyPrints: string[] = exports.lotOccupancyPrints; + const searchFilterFormElement = document.querySelector( "#form--searchFilters" ) as HTMLFormElement; + const searchResultsContainerElement = document.querySelector( "#container--searchResults" ) as HTMLElement; @@ -79,13 +82,18 @@ declare const cityssm: cityssmGlobal; let occupantsHTML = ""; for (const occupant of lotOccupancy.lotOccupancyOccupants) { - occupantsHTML += cityssm.escapeHTML(occupant.occupantName) + "
"; + occupantsHTML += + '' + + cityssm.escapeHTML(occupant.occupantName) + + "
"; } resultsTbodyElement.insertAdjacentHTML( "beforeend", "
" + - ("") + + ('") + ("" + + (lotOccupancyPrints.length > 0 + ? "" + : "") + "" ); } @@ -122,12 +143,13 @@ declare const cityssm: cityssmGlobal; searchResultsContainerElement.innerHTML = '
" + occupancyTimeHTML + "' + occupancyTimeHTML + "" + '" + occupantsHTML + "" + + '' + + '' + + "" + + "
' + "" + - "" + + '' + ("") + ("") + "" + "" + ("") + + (lotOccupancyPrints.length > 0 ? '' : "") + "" + "
" + cityssm.escapeHTML(exports.aliases.occupancy) + " Type" + cityssm.escapeHTML(exports.aliases.lot) + "Start DateEnd Date" + cityssm.escapeHTML(exports.aliases.occupants) + "
" + '
' + diff --git a/public-typescript/workOrderSearch.js b/public-typescript/workOrderSearch.js index 95347a02..d39361b5 100644 --- a/public-typescript/workOrderSearch.js +++ b/public-typescript/workOrderSearch.js @@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; const urlPrefix = document.querySelector("main").dataset.urlPrefix; + const workOrderPrints = exports.workOrderPrints; const searchFilterFormElement = document.querySelector("#form--searchFilters"); los.initializeDatePickers(searchFilterFormElement); const searchResultsContainerElement = document.querySelector("#container--searchResults"); @@ -61,6 +62,19 @@ Object.defineProperty(exports, "__esModule", { value: true }); " / " + workOrder.workOrderMilestoneCount) + "") + + (workOrderPrints.length > 0 + ? "
" + : "") + ""); } searchResultsContainerElement.innerHTML = @@ -70,6 +84,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); "" + "" + "" + + (workOrderPrints.length > 0 ? '' : "") + "" + "
" + + '' + + '' + + "" + + "
Work Order DescriptionDateProgress
" + '
' + diff --git a/public-typescript/workOrderSearch.ts b/public-typescript/workOrderSearch.ts index 03f47b34..f06bfaee 100644 --- a/public-typescript/workOrderSearch.ts +++ b/public-typescript/workOrderSearch.ts @@ -11,6 +11,8 @@ declare const cityssm: cityssmGlobal; const urlPrefix = document.querySelector("main").dataset.urlPrefix; + const workOrderPrints: string[] = exports.workOrderPrints; + const searchFilterFormElement = document.querySelector( "#form--searchFilters" ) as HTMLFormElement; @@ -91,6 +93,19 @@ declare const cityssm: cityssmGlobal; " / " + workOrder.workOrderMilestoneCount) + "") + + (workOrderPrints.length > 0 + ? "
" + : "") + "" ); } @@ -102,6 +117,7 @@ declare const cityssm: cityssmGlobal; "" + "" + "" + + (workOrderPrints.length > 0 ? '' : "") + "" + "
" + + '' + + '' + + "" + + "
Work Order DescriptionDateProgress
" + '
' + diff --git a/public/javascripts/lotOccupancySearch.min.js b/public/javascripts/lotOccupancySearch.min.js index a9f53487..1893e9f7 100644 --- a/public/javascripts/lotOccupancySearch.min.js +++ b/public/javascripts/lotOccupancySearch.min.js @@ -1 +1 @@ -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=document.querySelector("main").dataset.urlPrefix,t=document.querySelector("#form--searchFilters"),a=document.querySelector("#container--searchResults"),s=Number.parseInt(document.querySelector("#searchFilter--limit").value,10),c=document.querySelector("#searchFilter--offset"),i=()=>{const i=Number.parseInt(c.value,10);a.innerHTML='

Loading '+exports.aliases.occupancies+"...
",cityssm.postJSON(e+"/lotOccupancies/doSearchLotOccupancies",t,t=>{if(0===t.lotOccupancies.length)return void(a.innerHTML='

There are no '+cityssm.escapeHTML(exports.aliases.occupancy.toLowerCase())+" records that meet the search criteria.

");const c=document.createElement("tbody"),n=cityssm.dateToString(new Date);for(const a of t.lotOccupancies){let t="";t=a.occupancyStartDateString<=n&&(""===a.occupancyEndDateString||a.occupancyEndDateString>=n)?'':a.occupancyStartDateString>n?'':'';let s="";for(const e of a.lotOccupancyOccupants)s+=cityssm.escapeHTML(e.occupantName)+"
";c.insertAdjacentHTML("beforeend","
")}a.innerHTML='
"+t+''+cityssm.escapeHTML(a.occupancyType)+""+(a.lotName?cityssm.escapeHTML(a.lotName):'(No '+cityssm.escapeHTML(exports.aliases.lot)+")")+'
'+cityssm.escapeHTML(a.mapName||"")+"
"+a.occupancyStartDateString+""+(a.occupancyEndDate?a.occupancyEndDateString:'(No End Date)')+""+s+"
'+cityssm.escapeHTML(exports.aliases.occupancy)+" Type"+cityssm.escapeHTML(exports.aliases.lot)+"Start DateEnd Date"+cityssm.escapeHTML(exports.aliases.occupants)+'
Displaying '+(i+1).toString()+" to "+Math.min(t.count,s+i)+" of "+t.count+'
'+(i>0?'
':"")+(s+i
':"")+"
",a.querySelector("table").append(c),i>0&&a.querySelector("button[data-page='previous']").addEventListener("click",r),s+i{c.value="0",i()},r=()=>{c.value=Math.max(Number.parseInt(c.value,10)-s,0).toString(),i()},o=()=>{c.value=(Number.parseInt(c.value,10)+s).toString(),i()},l=t.querySelectorAll("input, select");for(const e of l)e.addEventListener("change",n);t.addEventListener("submit",e=>{e.preventDefault(),n()}),i()})(); \ No newline at end of file +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const t=document.querySelector("main").dataset.urlPrefix,e=exports.lotOccupancyPrints,a=document.querySelector("#form--searchFilters"),s=document.querySelector("#container--searchResults"),c=Number.parseInt(document.querySelector("#searchFilter--limit").value,10),i=document.querySelector("#searchFilter--offset"),n=()=>{const n=Number.parseInt(i.value,10);s.innerHTML='

Loading '+exports.aliases.occupancies+"...
",cityssm.postJSON(t+"/lotOccupancies/doSearchLotOccupancies",a,a=>{if(0===a.lotOccupancies.length)return void(s.innerHTML='

There are no '+cityssm.escapeHTML(exports.aliases.occupancy.toLowerCase())+" records that meet the search criteria.

");const i=document.createElement("tbody"),r=cityssm.dateToString(new Date);for(const s of a.lotOccupancies){let a="";a=s.occupancyStartDateString<=r&&(""===s.occupancyEndDateString||s.occupancyEndDateString>=r)?'':s.occupancyStartDateString>r?'':'';let c="";for(const t of s.lotOccupancyOccupants)c+=''+cityssm.escapeHTML(t.occupantName)+"
";i.insertAdjacentHTML("beforeend",'
"+(e.length>0?'':"")+"")}s.innerHTML='
'+a+''+cityssm.escapeHTML(s.occupancyType)+""+(s.lotName?cityssm.escapeHTML(s.lotName):'(No '+cityssm.escapeHTML(exports.aliases.lot)+")")+'
'+cityssm.escapeHTML(s.mapName||"")+"
"+s.occupancyStartDateString+""+(s.occupancyEndDate?s.occupancyEndDateString:'(No End Date)')+""+c+"
"+(e.length>0?'':"")+'
'+cityssm.escapeHTML(exports.aliases.occupancy)+" Type"+cityssm.escapeHTML(exports.aliases.lot)+"Start DateEnd Date"+cityssm.escapeHTML(exports.aliases.occupants)+"
Displaying '+(n+1).toString()+" to "+Math.min(a.count,c+n)+" of "+a.count+'
'+(n>0?'
':"")+(c+n
':"")+"
",s.querySelector("table").append(i),n>0&&s.querySelector("button[data-page='previous']").addEventListener("click",l),c+n{i.value="0",n()},l=()=>{i.value=Math.max(Number.parseInt(i.value,10)-c,0).toString(),n()},o=()=>{i.value=(Number.parseInt(i.value,10)+c).toString(),n()},p=a.querySelectorAll("input, select");for(const t of p)t.addEventListener("change",r);a.addEventListener("submit",t=>{t.preventDefault(),r()}),n()})(); \ No newline at end of file diff --git a/public/javascripts/workOrderSearch.min.js b/public/javascripts/workOrderSearch.min.js index ece2cf34..d68f4617 100644 --- a/public/javascripts/workOrderSearch.min.js +++ b/public/javascripts/workOrderSearch.min.js @@ -1 +1 @@ -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=exports.los,t=document.querySelector("main").dataset.urlPrefix,r=document.querySelector("#form--searchFilters");e.initializeDatePickers(r);const s=document.querySelector("#container--searchResults"),a=Number.parseInt(document.querySelector("#searchFilter--limit").value,10),i=document.querySelector("#searchFilter--offset"),o=()=>{const e=Number.parseInt(i.value,10);s.innerHTML='

Loading Work Orders...
',cityssm.postJSON(t+"/workOrders/doSearchWorkOrders",r,r=>{if(0===r.workOrders.length)return void(s.innerHTML='

There are no work orders that meet the search criteria.

');const i=document.createElement("tbody");for(const e of r.workOrders)i.insertAdjacentHTML("beforeend",'
");s.innerHTML='
'+cityssm.escapeHTML(e.workOrderNumber)+""+cityssm.escapeHTML(e.workOrderType)+'
'+cityssm.escapeHTML(e.workOrderDescription)+'
'+e.workOrderOpenDateString+'
'+(e.workOrderCloseDate?e.workOrderCloseDateString:'(No Close Date)')+"
"+(0===e.workOrderMilestoneCount?"-":e.workOrderMilestoneCompletionCount+" / "+e.workOrderMilestoneCount)+"
Work Order NumberWork Order DescriptionDateProgress
Displaying '+(e+1).toString()+" to "+Math.min(r.count,a+e)+" of "+r.count+'
'+(e>0?'
':"")+(a+e
':"")+"
",s.querySelector("table").append(i),e>0&&s.querySelector("button[data-page='previous']").addEventListener("click",l),a+e{i.value="0",o()},l=()=>{i.value=Math.max(Number.parseInt(i.value,10)-a,0).toString(),o()},d=()=>{i.value=(Number.parseInt(i.value,10)+a).toString(),o()},c=r.querySelectorAll("input, select");for(const e of c)e.addEventListener("change",n);r.addEventListener("submit",e=>{e.preventDefault(),n()}),o()})(); \ No newline at end of file +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=exports.los,t=document.querySelector("main").dataset.urlPrefix,r=exports.workOrderPrints,s=document.querySelector("#form--searchFilters");e.initializeDatePickers(s);const a=document.querySelector("#container--searchResults"),i=Number.parseInt(document.querySelector("#searchFilter--limit").value,10),o=document.querySelector("#searchFilter--offset"),n=()=>{const e=Number.parseInt(o.value,10);a.innerHTML='

Loading Work Orders...
',cityssm.postJSON(t+"/workOrders/doSearchWorkOrders",s,s=>{if(0===s.workOrders.length)return void(a.innerHTML='

There are no work orders that meet the search criteria.

');const o=document.createElement("tbody");for(const e of s.workOrders)o.insertAdjacentHTML("beforeend",'
"+(r.length>0?'':"")+"");a.innerHTML='
'+cityssm.escapeHTML(e.workOrderNumber)+""+cityssm.escapeHTML(e.workOrderType)+'
'+cityssm.escapeHTML(e.workOrderDescription)+'
'+e.workOrderOpenDateString+'
'+(e.workOrderCloseDate?e.workOrderCloseDateString:'(No Close Date)')+"
"+(0===e.workOrderMilestoneCount?"-":e.workOrderMilestoneCompletionCount+" / "+e.workOrderMilestoneCount)+"
'+(r.length>0?'':"")+'
Work Order NumberWork Order DescriptionDateProgress
Displaying '+(e+1).toString()+" to "+Math.min(s.count,i+e)+" of "+s.count+'
'+(e>0?'
':"")+(i+e
':"")+"
",a.querySelector("table").append(o),e>0&&a.querySelector("button[data-page='previous']").addEventListener("click",d),i+e{o.value="0",n()},d=()=>{o.value=Math.max(Number.parseInt(o.value,10)-i,0).toString(),n()},c=()=>{o.value=(Number.parseInt(o.value,10)+i).toString(),n()},u=s.querySelectorAll("input, select");for(const e of u)e.addEventListener("change",l);s.addEventListener("submit",e=>{e.preventDefault(),l()}),n()})(); \ No newline at end of file diff --git a/views/lotOccupancy-search.ejs b/views/lotOccupancy-search.ejs index 493fe257..3b3e9c6b 100644 --- a/views/lotOccupancy-search.ejs +++ b/views/lotOccupancy-search.ejs @@ -144,6 +144,9 @@ <%- include('_footerA'); -%> + <%- include('_footerB'); -%> diff --git a/views/workOrder-search.ejs b/views/workOrder-search.ejs index 150202cf..5442c330 100644 --- a/views/workOrder-search.ejs +++ b/views/workOrder-search.ejs @@ -96,6 +96,9 @@ <%- include('_footerA'); -%> + <%- include('_footerB'); -%> \ No newline at end of file