diff --git a/handlers/lotOccupancies-post/doSearchPastOccupants.d.ts b/handlers/lotOccupancies-post/doSearchPastOccupants.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/lotOccupancies-post/doSearchPastOccupants.d.ts @@ -0,0 +1,3 @@ +import type { RequestHandler } from "express"; +export declare const handler: RequestHandler; +export default handler; diff --git a/handlers/lotOccupancies-post/doSearchPastOccupants.js b/handlers/lotOccupancies-post/doSearchPastOccupants.js new file mode 100644 index 00000000..682596e9 --- /dev/null +++ b/handlers/lotOccupancies-post/doSearchPastOccupants.js @@ -0,0 +1,10 @@ +import { getPastLotOccupancyOccupants } from "../../helpers/lotOccupancyDB/getPastLotOccupancyOccupants.js"; +export const handler = (request, response) => { + const occupants = getPastLotOccupancyOccupants(request.body, { + limit: Number.parseInt(request.body.limit, 10) + }); + response.json({ + occupants + }); +}; +export default handler; diff --git a/handlers/lotOccupancies-post/doSearchPastOccupants.ts b/handlers/lotOccupancies-post/doSearchPastOccupants.ts new file mode 100644 index 00000000..ea58123e --- /dev/null +++ b/handlers/lotOccupancies-post/doSearchPastOccupants.ts @@ -0,0 +1,16 @@ +import type { RequestHandler } from "express"; + +import { getPastLotOccupancyOccupants } from "../../helpers/lotOccupancyDB/getPastLotOccupancyOccupants.js"; + +export const handler: RequestHandler = (request, response) => { + + const occupants = getPastLotOccupancyOccupants(request.body, { + limit: Number.parseInt(request.body.limit, 10) + }); + + response.json({ + occupants + }); +}; + +export default handler; diff --git a/helpers/lotOccupancyDB/getPastLotOccupancyOccupants.d.ts b/helpers/lotOccupancyDB/getPastLotOccupancyOccupants.d.ts new file mode 100644 index 00000000..be605efa --- /dev/null +++ b/helpers/lotOccupancyDB/getPastLotOccupancyOccupants.d.ts @@ -0,0 +1,9 @@ +import type * as recordTypes from "../../types/recordTypes"; +interface GetPastLotOccupancyOccupantsFilters { + searchFilter: string; +} +interface GetPastLotOccupancyOccupantsOptions { + limit: number; +} +export declare const getPastLotOccupancyOccupants: (filters: GetPastLotOccupancyOccupantsFilters, options: GetPastLotOccupancyOccupantsOptions) => recordTypes.LotOccupancyOccupant[]; +export default getPastLotOccupancyOccupants; diff --git a/helpers/lotOccupancyDB/getPastLotOccupancyOccupants.js b/helpers/lotOccupancyDB/getPastLotOccupancyOccupants.js new file mode 100644 index 00000000..1161a15f --- /dev/null +++ b/helpers/lotOccupancyDB/getPastLotOccupancyOccupants.js @@ -0,0 +1,40 @@ +import sqlite from "better-sqlite3"; +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +export const getPastLotOccupancyOccupants = (filters, options) => { + const database = sqlite(databasePath, { + readonly: true + }); + let sqlWhereClause = " where o.recordDelete_timeMillis is null and l.recordDelete_timeMillis is null"; + const sqlParameters = []; + if (filters.searchFilter) { + const searchFilterPieces = filters.searchFilter.split(" "); + for (const searchFilterPiece of searchFilterPieces) { + sqlWhereClause += + " and (o.occupantName like '%' || ? || '%'" + + " or o.occupantAddress1 like '%' || ? || '%'" + + " or o.occupantAddress2 like '%' || ? || '%'" + + " or o.occupantCity like '%' || ? || '%')"; + sqlParameters.push(searchFilterPiece, searchFilterPiece, searchFilterPiece, searchFilterPiece); + } + } + const sql = "select" + + " o.occupantName, o.occupantAddress1, o.occupantAddress2," + + " o.occupantCity, o.occupantProvince, o.occupantPostalCode," + + " o.occupantPhoneNumber, o.occupantEmailAddress," + + " count(*) as lotOccupancyIdCount," + + " max(o.recordUpdate_timeMillis) as recordUpdate_timeMillisMax" + + " from LotOccupancyOccupants o" + + " left join LotOccupancies l on o.lotOccupancyId = l.lotOccupancyId" + + sqlWhereClause + + " group by occupantName, occupantAddress1, occupantAddress2, occupantCity, occupantProvince, occupantPostalCode," + + " occupantPhoneNumber, occupantEmailAddress" + + " order by lotOccupancyIdCount desc, recordUpdate_timeMillisMax desc" + + " limit " + + options.limit; + const lotOccupancyOccupants = database + .prepare(sql) + .all(sqlParameters); + database.close(); + return lotOccupancyOccupants; +}; +export default getPastLotOccupancyOccupants; diff --git a/helpers/lotOccupancyDB/getPastLotOccupancyOccupants.ts b/helpers/lotOccupancyDB/getPastLotOccupancyOccupants.ts new file mode 100644 index 00000000..762c5d32 --- /dev/null +++ b/helpers/lotOccupancyDB/getPastLotOccupancyOccupants.ts @@ -0,0 +1,72 @@ +import sqlite from "better-sqlite3"; + +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; + +import type * as recordTypes from "../../types/recordTypes"; + +interface GetPastLotOccupancyOccupantsFilters { + searchFilter: string; +} + +interface GetPastLotOccupancyOccupantsOptions { + limit: number; +} + +export const getPastLotOccupancyOccupants = ( + filters: GetPastLotOccupancyOccupantsFilters, + options: GetPastLotOccupancyOccupantsOptions +): recordTypes.LotOccupancyOccupant[] => { + const database = sqlite(databasePath, { + readonly: true + }); + + let sqlWhereClause = + " where o.recordDelete_timeMillis is null and l.recordDelete_timeMillis is null"; + + const sqlParameters = []; + + if (filters.searchFilter) { + const searchFilterPieces = filters.searchFilter.split(" "); + + for (const searchFilterPiece of searchFilterPieces) { + sqlWhereClause += + " and (o.occupantName like '%' || ? || '%'" + + " or o.occupantAddress1 like '%' || ? || '%'" + + " or o.occupantAddress2 like '%' || ? || '%'" + + " or o.occupantCity like '%' || ? || '%')"; + + sqlParameters.push( + searchFilterPiece, + searchFilterPiece, + searchFilterPiece, + searchFilterPiece + ); + } + } + + const sql = + "select" + + " o.occupantName, o.occupantAddress1, o.occupantAddress2," + + " o.occupantCity, o.occupantProvince, o.occupantPostalCode," + + " o.occupantPhoneNumber, o.occupantEmailAddress," + + " count(*) as lotOccupancyIdCount," + + " max(o.recordUpdate_timeMillis) as recordUpdate_timeMillisMax" + + " from LotOccupancyOccupants o" + + " left join LotOccupancies l on o.lotOccupancyId = l.lotOccupancyId" + + sqlWhereClause + + " group by occupantName, occupantAddress1, occupantAddress2, occupantCity, occupantProvince, occupantPostalCode," + + " occupantPhoneNumber, occupantEmailAddress" + + " order by lotOccupancyIdCount desc, recordUpdate_timeMillisMax desc" + + " limit " + + options.limit; + + const lotOccupancyOccupants: recordTypes.LotOccupancyOccupant[] = database + .prepare(sql) + .all(sqlParameters); + + database.close(); + + return lotOccupancyOccupants; +}; + +export default getPastLotOccupancyOccupants; diff --git a/public-typescript/lotOccupancyEdit.js b/public-typescript/lotOccupancyEdit.js index 75ef739b..76a9ea40 100644 --- a/public-typescript/lotOccupancyEdit.js +++ b/public-typescript/lotOccupancyEdit.js @@ -562,11 +562,12 @@ Object.defineProperty(exports, "__esModule", { value: true }); occupantsContainer.append(tableElement); }; document.querySelector("#button--addOccupant").addEventListener("click", () => { - let addFormElement; let addCloseModalFunction; - const addOccupant = (submitEvent) => { - submitEvent.preventDefault(); - cityssm.postJSON(urlPrefix + "/lotOccupancies/doAddLotOccupancyOccupant", addFormElement, (responseJSON) => { + let addFormElement; + let searchFormElement; + let searchResultsElement; + const addOccupant = (formOrObject) => { + cityssm.postJSON(urlPrefix + "/lotOccupancies/doAddLotOccupancyOccupant", formOrObject, (responseJSON) => { if (responseJSON.success) { lotOccupancyOccupants = responseJSON.lotOccupancyOccupants; addCloseModalFunction(); @@ -581,25 +582,119 @@ Object.defineProperty(exports, "__esModule", { value: true }); } }); }; + const addOccupantFromForm = (submitEvent) => { + submitEvent.preventDefault(); + addOccupant(addFormElement); + }; + let pastOccupantSearchResults = []; + const addOccupantFromCopy = (clickEvent) => { + clickEvent.preventDefault(); + const panelBlockElement = clickEvent.currentTarget; + const occupant = pastOccupantSearchResults[Number.parseInt(panelBlockElement.dataset.index, 10)]; + const lotOccupantTypeId = panelBlockElement + .closest(".modal") + .querySelector("#lotOccupancyOccupantCopy--lotOccupantTypeId").value; + if (lotOccupantTypeId === "") { + bulmaJS.alert({ + title: "No " + exports.aliases.occupant + " Type Selected", + message: "Select a type to apply to the newly added " + + exports.aliases.occupant.toLowerCase() + + ".", + contextualColorName: "warning" + }); + } + else { + occupant.lotOccupantTypeId = Number.parseInt(lotOccupantTypeId, 10); + occupant.lotOccupancyId = Number.parseInt(lotOccupancyId, 10); + addOccupant(occupant); + } + }; + const searchOccupants = (event) => { + event.preventDefault(); + if (searchFormElement.querySelector("#lotOccupancyOccupantCopy--searchFilter").value === "") { + searchResultsElement.innerHTML = + '
' + + '

Enter a partial name or address in the search field above.

' + + "
"; + return; + } + searchResultsElement.innerHTML = + '
' + + '
' + + "Searching..." + + "
"; + cityssm.postJSON(urlPrefix + "/lotOccupancies/doSearchPastOccupants", searchFormElement, (responseJSON) => { + pastOccupantSearchResults = responseJSON.occupants; + const panelElement = document.createElement("div"); + panelElement.className = "panel"; + for (const [index, occupant] of pastOccupantSearchResults.entries()) { + const panelBlockElement = document.createElement("a"); + panelBlockElement.className = "panel-block is-block"; + panelBlockElement.dataset.index = index.toString(); + panelBlockElement.innerHTML = + "" + + cityssm.escapeHTML(occupant.occupantName) + + "" + + "
" + + '
' + + ('
' + + cityssm.escapeHTML(occupant.occupantAddress1) + + "
" + + (occupant.occupantAddress2 + ? cityssm.escapeHTML(occupant.occupantAddress2) + "
" + : "") + + cityssm.escapeHTML(occupant.occupantCity) + + ", " + + cityssm.escapeHTML(occupant.occupantProvince) + + "
" + + cityssm.escapeHTML(occupant.occupantPostalCode) + + "
") + + ('
' + + (occupant.occupantPhoneNumber + ? cityssm.escapeHTML(occupant.occupantPhoneNumber) + + "
" + : "") + + cityssm.escapeHTML(occupant.occupantEmailAddress) + + "
" + + "
") + + "
"; + panelBlockElement.addEventListener("click", addOccupantFromCopy); + panelElement.append(panelBlockElement); + } + searchResultsElement.innerHTML = ""; + searchResultsElement.append(panelElement); + }); + }; cityssm.openHtmlModal("lotOccupancy-addOccupant", { onshow: (modalElement) => { los.populateAliases(modalElement); modalElement.querySelector("#lotOccupancyOccupantAdd--lotOccupancyId").value = lotOccupancyId; const lotOccupantTypeSelectElement = modalElement.querySelector("#lotOccupancyOccupantAdd--lotOccupantTypeId"); + const lotOccupantTypeCopySelectElement = modalElement.querySelector("#lotOccupancyOccupantCopy--lotOccupantTypeId"); for (const lotOccupantType of exports.lotOccupantTypes) { const optionElement = document.createElement("option"); optionElement.value = lotOccupantType.lotOccupantTypeId.toString(); optionElement.textContent = lotOccupantType.lotOccupantType; lotOccupantTypeSelectElement.append(optionElement); + lotOccupantTypeCopySelectElement.append(optionElement.cloneNode(true)); } modalElement.querySelector("#lotOccupancyOccupantAdd--occupantCity").value = exports.occupantCityDefault; modalElement.querySelector("#lotOccupancyOccupantAdd--occupantProvince").value = exports.occupantProvinceDefault; }, onshown: (modalElement, closeModalFunction) => { bulmaJS.toggleHtmlClipped(); + bulmaJS.init(modalElement); modalElement.querySelector("#lotOccupancyOccupantAdd--lotOccupantTypeId").focus(); - addFormElement = modalElement.querySelector("form"); - addFormElement.addEventListener("submit", addOccupant); + addFormElement = modalElement.querySelector("#form--lotOccupancyOccupantAdd"); + addFormElement.addEventListener("submit", addOccupantFromForm); + searchResultsElement = modalElement.querySelector("#lotOccupancyOccupantCopy--searchResults"); + searchFormElement = modalElement.querySelector("#form--lotOccupancyOccupantCopy"); + searchFormElement.addEventListener("submit", (formEvent) => { + formEvent.preventDefault(); + }); + modalElement + .querySelector("#lotOccupancyOccupantCopy--searchFilter") + .addEventListener("change", searchOccupants); addCloseModalFunction = closeModalFunction; }, onremoved: () => { diff --git a/public-typescript/lotOccupancyEdit.ts b/public-typescript/lotOccupancyEdit.ts index 8527efa5..f9060fe5 100644 --- a/public-typescript/lotOccupancyEdit.ts +++ b/public-typescript/lotOccupancyEdit.ts @@ -845,15 +845,19 @@ declare const bulmaJS: BulmaJS; }; document.querySelector("#button--addOccupant").addEventListener("click", () => { - let addFormElement: HTMLFormElement; let addCloseModalFunction: () => void; - const addOccupant = (submitEvent: SubmitEvent) => { - submitEvent.preventDefault(); + let addFormElement: HTMLFormElement; + let searchFormElement: HTMLFormElement; + let searchResultsElement: HTMLElement; + + const addOccupant = ( + formOrObject: HTMLFormElement | recordTypes.LotOccupancyOccupant + ) => { cityssm.postJSON( urlPrefix + "/lotOccupancies/doAddLotOccupancyOccupant", - addFormElement, + formOrObject, (responseJSON: { success: boolean; errorMessage?: string; @@ -874,6 +878,122 @@ declare const bulmaJS: BulmaJS; ); }; + const addOccupantFromForm = (submitEvent: SubmitEvent) => { + submitEvent.preventDefault(); + addOccupant(addFormElement); + }; + + let pastOccupantSearchResults: recordTypes.LotOccupancyOccupant[] = []; + + const addOccupantFromCopy = (clickEvent: MouseEvent) => { + clickEvent.preventDefault(); + + const panelBlockElement = clickEvent.currentTarget as HTMLElement; + + const occupant = + pastOccupantSearchResults[Number.parseInt(panelBlockElement.dataset.index, 10)]; + + const lotOccupantTypeId = ( + panelBlockElement + .closest(".modal") + .querySelector( + "#lotOccupancyOccupantCopy--lotOccupantTypeId" + ) as HTMLSelectElement + ).value; + + if (lotOccupantTypeId === "") { + bulmaJS.alert({ + title: "No " + exports.aliases.occupant + " Type Selected", + message: + "Select a type to apply to the newly added " + + exports.aliases.occupant.toLowerCase() + + ".", + contextualColorName: "warning" + }); + } else { + occupant.lotOccupantTypeId = Number.parseInt(lotOccupantTypeId, 10); + occupant.lotOccupancyId = Number.parseInt(lotOccupancyId, 10); + addOccupant(occupant); + } + }; + + const searchOccupants = (event: Event) => { + event.preventDefault(); + + if ( + ( + searchFormElement.querySelector( + "#lotOccupancyOccupantCopy--searchFilter" + ) as HTMLInputElement + ).value === "" + ) { + searchResultsElement.innerHTML = + '
' + + '

Enter a partial name or address in the search field above.

' + + "
"; + + return; + } + + searchResultsElement.innerHTML = + '
' + + '
' + + "Searching..." + + "
"; + + cityssm.postJSON( + urlPrefix + "/lotOccupancies/doSearchPastOccupants", + searchFormElement, + (responseJSON: { occupants: recordTypes.LotOccupancyOccupant[] }) => { + pastOccupantSearchResults = responseJSON.occupants; + + const panelElement = document.createElement("div"); + panelElement.className = "panel"; + + for (const [index, occupant] of pastOccupantSearchResults.entries()) { + const panelBlockElement = document.createElement("a"); + panelBlockElement.className = "panel-block is-block"; + panelBlockElement.dataset.index = index.toString(); + + panelBlockElement.innerHTML = + "" + + cityssm.escapeHTML(occupant.occupantName) + + "" + + "
" + + '
' + + ('
' + + cityssm.escapeHTML(occupant.occupantAddress1) + + "
" + + (occupant.occupantAddress2 + ? cityssm.escapeHTML(occupant.occupantAddress2) + "
" + : "") + + cityssm.escapeHTML(occupant.occupantCity) + + ", " + + cityssm.escapeHTML(occupant.occupantProvince) + + "
" + + cityssm.escapeHTML(occupant.occupantPostalCode) + + "
") + + ('
' + + (occupant.occupantPhoneNumber + ? cityssm.escapeHTML(occupant.occupantPhoneNumber) + + "
" + : "") + + cityssm.escapeHTML(occupant.occupantEmailAddress) + + "
" + + "
") + + "
"; + + panelBlockElement.addEventListener("click", addOccupantFromCopy); + + panelElement.append(panelBlockElement); + } + + searchResultsElement.innerHTML = ""; + searchResultsElement.append(panelElement); + } + ); + }; + cityssm.openHtmlModal("lotOccupancy-addOccupant", { onshow: (modalElement) => { los.populateAliases(modalElement); @@ -888,11 +1008,18 @@ declare const bulmaJS: BulmaJS; "#lotOccupancyOccupantAdd--lotOccupantTypeId" ) as HTMLSelectElement; + const lotOccupantTypeCopySelectElement = modalElement.querySelector( + "#lotOccupancyOccupantCopy--lotOccupantTypeId" + ) as HTMLSelectElement; + for (const lotOccupantType of exports.lotOccupantTypes as recordTypes.LotOccupantType[]) { const optionElement = document.createElement("option"); optionElement.value = lotOccupantType.lotOccupantTypeId.toString(); optionElement.textContent = lotOccupantType.lotOccupantType; + lotOccupantTypeSelectElement.append(optionElement); + + lotOccupantTypeCopySelectElement.append(optionElement.cloneNode(true)); } ( @@ -900,6 +1027,7 @@ declare const bulmaJS: BulmaJS; "#lotOccupancyOccupantAdd--occupantCity" ) as HTMLInputElement ).value = exports.occupantCityDefault; + ( modalElement.querySelector( "#lotOccupancyOccupantAdd--occupantProvince" @@ -908,6 +1036,7 @@ declare const bulmaJS: BulmaJS; }, onshown: (modalElement, closeModalFunction) => { bulmaJS.toggleHtmlClipped(); + bulmaJS.init(modalElement); ( modalElement.querySelector( @@ -915,8 +1044,23 @@ declare const bulmaJS: BulmaJS; ) as HTMLInputElement ).focus(); - addFormElement = modalElement.querySelector("form"); - addFormElement.addEventListener("submit", addOccupant); + addFormElement = modalElement.querySelector("#form--lotOccupancyOccupantAdd"); + addFormElement.addEventListener("submit", addOccupantFromForm); + + searchResultsElement = modalElement.querySelector( + "#lotOccupancyOccupantCopy--searchResults" + ); + + searchFormElement = modalElement.querySelector( + "#form--lotOccupancyOccupantCopy" + ); + searchFormElement.addEventListener("submit", (formEvent) => { + formEvent.preventDefault(); + }); + + modalElement + .querySelector("#lotOccupancyOccupantCopy--searchFilter") + .addEventListener("change", searchOccupants); addCloseModalFunction = closeModalFunction; }, diff --git a/public/html/lotOccupancy-addOccupant.html b/public/html/lotOccupancy-addOccupant.html index 59e40fb1..78bea57d 100644 --- a/public/html/lotOccupancy-addOccupant.html +++ b/public/html/lotOccupancy-addOccupant.html @@ -8,88 +8,135 @@ \ No newline at end of file diff --git a/public/javascripts/lotOccupancyEdit.min.js b/public/javascripts/lotOccupancyEdit.min.js index 64bfbb04..21e0b9e5 100644 --- a/public/javascripts/lotOccupancyEdit.min.js +++ b/public/javascripts/lotOccupancyEdit.min.js @@ -1 +1 @@ -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=exports.los,t=document.querySelector("main").dataset.urlPrefix,c=document.querySelector("#lotOccupancy--lotOccupancyId").value,a=""===c;let o=!1,n=a;const s=()=>{o||(o=!0,cityssm.enableNavBlocker())},l=document.querySelector("#form--lotOccupancy");l.addEventListener("submit",e=>{e.preventDefault(),cityssm.postJSON(t+"/lotOccupancies/"+(a?"doCreateLotOccupancy":"doUpdateLotOccupancy"),l,e=>{e.success?(o=!1,cityssm.disableNavBlocker(),a||n?window.location.href=t+"/lotOccupancies/"+e.lotOccupancyId+"/edit?t="+Date.now():bulmaJS.alert({message:exports.aliases.occupancy+" Updated Successfully",contextualColorName:"success"})):bulmaJS.alert({title:"Error Saving "+exports.aliases.occupancy,message:e.errorMessage,contextualColorName:"danger"})})});const r=l.querySelectorAll("input, select");for(const e of r)e.addEventListener("change",s);a||document.querySelector("#button--deleteLotOccupancy").addEventListener("click",e=>{e.preventDefault();bulmaJS.confirm({title:"Delete "+exports.aliases.occupancy+" Record",message:"Are you sure you want to delete this record?",contextualColorName:"warning",okButton:{text:"Yes, Delete",callbackFunction:()=>{cityssm.postJSON(t+"/lotOccupancies/doDeleteLotOccupancy",{lotOccupancyId:c},e=>{e.success?(cityssm.disableNavBlocker(),window.location.href=t+"/lotOccupancies?t="+Date.now()):bulmaJS.alert({title:"Error Deleting Record",message:e.errorMessage,contextualColorName:"danger"})})}}})});const i=document.querySelector("#lotOccupancy--occupancyTypeId");if(a){const e=document.querySelector("#container--lotOccupancyFields");i.addEventListener("change",()=>{""!==i.value?cityssm.postJSON(t+"/lotOccupancies/doGetOccupancyTypeFields",{occupancyTypeId:i.value},t=>{if(0===t.occupancyTypeFields.length)return void(e.innerHTML='

There are no additional fields for this '+exports.aliases.occupancy.toLowerCase()+" type.

");e.innerHTML="";let c="";for(const a of t.occupancyTypeFields){c+=","+a.occupancyTypeFieldId;const t="lotOccupancyFieldValue_"+a.occupancyTypeFieldId,o="lotOccupancy--"+t,n=document.createElement("div");if(n.className="field",n.innerHTML='
',n.querySelector("label").textContent=a.occupancyTypeField,""===a.occupancyTypeFieldValues){const e=document.createElement("input");e.className="input",e.id=o,e.name=t,e.type="text",e.required=a.isRequired,e.minLength=a.minimumLength,e.maxLength=a.maximumLength,a.pattern&&""!==a.pattern&&(e.pattern=a.pattern),n.querySelector(".control").append(e)}else{n.querySelector(".control").innerHTML='
',n.querySelector("select").required=a.isRequired;const e=a.occupancyTypeFieldValues.split("\n");for(const t of e){const e=document.createElement("option");e.value=t,e.textContent=t,n.querySelector("select").append(e)}}e.append(n)}e.insertAdjacentHTML("beforeend",'')}):e.innerHTML='

Select the '+exports.aliases.occupancy.toLowerCase()+" type to load the available fields.

"})}else{const e=i.value;i.addEventListener("change",()=>{i.value!==e&&bulmaJS.confirm({title:"Confirm Change",message:"Are you sure you want to change the "+exports.aliases.occupancy.toLowerCase()+" type?\nThis change affects the additional fields associated with this record, and may also affect the available fees.",contextualColorName:"warning",okButton:{text:"Yes, Keep the Change",callbackFunction:()=>{n=!0}},cancelButton:{text:"Revert the Change",callbackFunction:()=>{i.value=e}}})})}const u=document.querySelector("#lotOccupancy--lotName");if(u.addEventListener("click",c=>{const a=c.currentTarget.value;let o,n,l,r;const i=(e,t)=>{document.querySelector("#lotOccupancy--lotId").value=e.toString(),document.querySelector("#lotOccupancy--lotName").value=t,s(),o()},u=e=>{e.preventDefault();const t=e.currentTarget;i(t.dataset.lotId,t.dataset.lotName)},d=()=>{r.innerHTML='


Searching...

',cityssm.postJSON(t+"/lots/doSearchLots",l,e=>{if(0===e.count)return void(r.innerHTML='

No results.

');const t=document.createElement("div");t.className="panel";for(const c of e.lots){const e=document.createElement("a");e.className="panel-block is-block",e.href="#",e.dataset.lotId=c.lotId.toString(),e.dataset.lotName=c.lotName,e.innerHTML='
'+cityssm.escapeHTML(c.lotName)+'
'+cityssm.escapeHTML(c.mapName)+'
'+cityssm.escapeHTML(c.lotStatus)+'
'+(c.lotOccupancyCount>0?"Currently Occupied":"")+"
",e.addEventListener("click",u),t.append(e)}r.innerHTML="",r.append(t)})},p=e=>{e.preventDefault();const c=n.querySelector("#lotCreate--lotName").value;cityssm.postJSON(t+"/lots/doCreateLot",e.currentTarget,e=>{e.success?i(e.lotId,c):bulmaJS.alert({title:"Error Creating "+exports.aliases.lot,message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("lotOccupancy-selectLot",{onshow:t=>{e.populateAliases(t)},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),n=e,o=t,bulmaJS.init(e);const c=e.querySelector("#lotSelect--lotName");""!==document.querySelector("#lotOccupancy--lotId").value&&(c.value=a),c.focus(),c.addEventListener("change",d);const s=e.querySelector("#lotSelect--occupancyStatus");if(s.addEventListener("change",d),""!==a&&(s.value=""),l=e.querySelector("#form--lotSelect"),r=e.querySelector("#resultsContainer--lotSelect"),l.addEventListener("submit",e=>{e.preventDefault()}),d(),exports.lotNamePattern){const t=exports.lotNamePattern;e.querySelector("#lotCreate--lotName").pattern=t.source}const i=e.querySelector("#lotCreate--lotTypeId");for(const e of exports.lotTypes){const t=document.createElement("option");t.value=e.lotTypeId.toString(),t.textContent=e.lotType,i.append(t)}const u=e.querySelector("#lotCreate--lotStatusId");for(const e of exports.lotStatuses){const t=document.createElement("option");t.value=e.lotStatusId.toString(),t.textContent=e.lotStatus,u.append(t)}const m=e.querySelector("#lotCreate--mapId");for(const e of exports.maps){const t=document.createElement("option");t.value=e.mapId.toString(),t.textContent=e.mapName||"(No Name)",m.append(t)}e.querySelector("#form--lotCreate").addEventListener("submit",p)},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})}),document.querySelector(".is-lot-view-button").addEventListener("click",()=>{const e=document.querySelector("#lotOccupancy--lotId").value;e?window.open(t+"/lots/"+e):bulmaJS.alert({message:"No "+exports.aliases.lot.toLowerCase()+" selected.",contextualColorName:"info"})}),document.querySelector(".is-clear-lot-button").addEventListener("click",()=>{u.disabled?bulmaJS.alert({message:"You need to unlock the field before clearing it.",contextualColorName:"info"}):(u.value="(No "+exports.aliases.lot+")",document.querySelector("#lotOccupancy--lotId").value="",s())}),e.initializeDatePickers(l),document.querySelector("#lotOccupancy--occupancyStartDateString").addEventListener("change",()=>{const e=document.querySelector("#lotOccupancy--occupancyEndDateString").bulmaCalendar.datePicker;e.min=document.querySelector("#lotOccupancy--occupancyStartDateString").value,e.refresh()}),e.initializeUnlockFieldButtons(l),!a){let a=exports.lotOccupancyOccupants;delete exports.lotOccupancyOccupants;const o=o=>{const n=Number.parseInt(o.currentTarget.closest("tr").dataset.lotOccupantIndex,10),l=a.find(e=>e.lotOccupantIndex===n);let r,i;const u=e=>{e.preventDefault(),cityssm.postJSON(t+"/lotOccupancies/doUpdateLotOccupancyOccupant",r,e=>{e.success?(a=e.lotOccupancyOccupants,i(),s()):bulmaJS.alert({title:"Error Updating "+exports.aliases.occupant,message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("lotOccupancy-editOccupant",{onshow:t=>{e.populateAliases(t),t.querySelector("#lotOccupancyOccupantEdit--lotOccupancyId").value=c,t.querySelector("#lotOccupancyOccupantEdit--lotOccupantIndex").value=n.toString();const a=t.querySelector("#lotOccupancyOccupantEdit--lotOccupantTypeId");let o=!1;for(const e of exports.lotOccupantTypes){const t=document.createElement("option");t.value=e.lotOccupantTypeId.toString(),t.textContent=e.lotOccupantType,e.lotOccupantTypeId===l.lotOccupantTypeId&&(t.selected=!0,o=!0),a.append(t)}if(!o){const e=document.createElement("option");e.value=l.lotOccupantTypeId.toString(),e.textContent=l.lotOccupantType,e.selected=!0,a.append(e)}t.querySelector("#lotOccupancyOccupantEdit--occupantName").value=l.occupantName,t.querySelector("#lotOccupancyOccupantEdit--occupantAddress1").value=l.occupantAddress1,t.querySelector("#lotOccupancyOccupantEdit--occupantAddress2").value=l.occupantAddress2,t.querySelector("#lotOccupancyOccupantEdit--occupantCity").value=l.occupantCity,t.querySelector("#lotOccupancyOccupantEdit--occupantProvince").value=l.occupantProvince,t.querySelector("#lotOccupancyOccupantEdit--occupantPostalCode").value=l.occupantPostalCode,t.querySelector("#lotOccupancyOccupantEdit--occupantPhoneNumber").value=l.occupantPhoneNumber,t.querySelector("#lotOccupancyOccupantEdit--occupantEmailAddress").value=l.occupantEmailAddress},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),e.querySelector("#lotOccupancyOccupantEdit--lotOccupantTypeId").focus(),(r=e.querySelector("form")).addEventListener("submit",u),i=t},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},n=e=>{const o=e.currentTarget.closest("tr").dataset.lotOccupantIndex;bulmaJS.confirm({title:"Remove "+exports.aliases.occupant+"?",message:"Are you sure you want to remove this "+exports.aliases.occupant.toLowerCase()+"?",okButton:{text:"Yes, Remove "+exports.aliases.occupant,callbackFunction:()=>{cityssm.postJSON(t+"/lotOccupancies/doDeleteLotOccupancyOccupant",{lotOccupancyId:c,lotOccupantIndex:o},e=>{e.success?(a=e.lotOccupancyOccupants,s()):bulmaJS.alert({title:"Error Removing "+exports.aliases.occupant,message:e.errorMessage,contextualColorName:"danger"})})}},contextualColorName:"warning"})},s=()=>{const e=document.querySelector("#container--lotOccupancyOccupants");if(cityssm.clearElement(e),0===a.length)return void(e.innerHTML='

There are no '+exports.aliases.occupants.toLowerCase()+" associated with this record.

");const t=document.createElement("table");t.className="table is-fullwidth is-striped is-hoverable",t.innerHTML=""+exports.aliases.occupant+" Type"+exports.aliases.occupant+'AddressOther ContactOptions';for(const e of a){const c=document.createElement("tr");c.dataset.lotOccupantIndex=e.lotOccupantIndex.toString(),c.innerHTML=""+cityssm.escapeHTML(e.lotOccupantType)+""+cityssm.escapeHTML(e.occupantName)+""+(e.occupantAddress1?cityssm.escapeHTML(e.occupantAddress1)+"
":"")+(e.occupantAddress2?cityssm.escapeHTML(e.occupantAddress2)+"
":"")+(e.occupantCity?cityssm.escapeHTML(e.occupantCity)+", ":"")+cityssm.escapeHTML(e.occupantProvince)+"
"+cityssm.escapeHTML(e.occupantPostalCode)+""+(e.occupantPhoneNumber?cityssm.escapeHTML(e.occupantPhoneNumber)+"
":"")+(e.occupantEmailAddress?cityssm.escapeHTML(e.occupantEmailAddress):"")+'
',c.querySelector(".button--edit").addEventListener("click",o),c.querySelector(".button--delete").addEventListener("click",n),t.querySelector("tbody").append(c)}e.append(t)};document.querySelector("#button--addOccupant").addEventListener("click",()=>{let o,n;const l=e=>{e.preventDefault(),cityssm.postJSON(t+"/lotOccupancies/doAddLotOccupancyOccupant",o,e=>{e.success?(a=e.lotOccupancyOccupants,n(),s()):bulmaJS.alert({title:"Error Adding "+exports.aliases.occupant,message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("lotOccupancy-addOccupant",{onshow:t=>{e.populateAliases(t),t.querySelector("#lotOccupancyOccupantAdd--lotOccupancyId").value=c;const a=t.querySelector("#lotOccupancyOccupantAdd--lotOccupantTypeId");for(const e of exports.lotOccupantTypes){const t=document.createElement("option");t.value=e.lotOccupantTypeId.toString(),t.textContent=e.lotOccupantType,a.append(t)}t.querySelector("#lotOccupancyOccupantAdd--occupantCity").value=exports.occupantCityDefault,t.querySelector("#lotOccupancyOccupantAdd--occupantProvince").value=exports.occupantProvinceDefault},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),e.querySelector("#lotOccupancyOccupantAdd--lotOccupantTypeId").focus(),(o=e.querySelector("form")).addEventListener("submit",l),n=t},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})}),s()}if(!a){let a=exports.lotOccupancyComments;delete exports.lotOccupancyComments;const o=o=>{const n=Number.parseInt(o.currentTarget.closest("tr").dataset.lotOccupancyCommentId,10),l=a.find(e=>e.lotOccupancyCommentId===n);let r,i;const u=e=>{e.preventDefault(),cityssm.postJSON(t+"/lotOccupancies/doUpdateLotOccupancyComment",r,e=>{e.success?(a=e.lotOccupancyComments,i(),s()):bulmaJS.alert({title:"Error Updating Comment",message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("lotOccupancy-editComment",{onshow:t=>{e.populateAliases(t),t.querySelector("#lotOccupancyCommentEdit--lotOccupancyId").value=c,t.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentId").value=n.toString(),t.querySelector("#lotOccupancyCommentEdit--lotOccupancyComment").value=l.lotOccupancyComment;const a=t.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentDateString");a.value=l.lotOccupancyCommentDateString;const o=cityssm.dateToString(new Date);a.max=l.lotOccupancyCommentDateString<=o?o:l.lotOccupancyCommentDateString,t.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentTimeString").value=l.lotOccupancyCommentTimeString},onshown:(t,c)=>{bulmaJS.toggleHtmlClipped(),e.initializeDatePickers(t),e.initializeTimePickers(t),t.querySelector("#lotOccupancyCommentEdit--lotOccupancyComment").focus(),(r=t.querySelector("form")).addEventListener("submit",u),i=c},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},n=e=>{const o=Number.parseInt(e.currentTarget.closest("tr").dataset.lotOccupancyCommentId,10);bulmaJS.confirm({title:"Remove Comment?",message:"Are you sure you want to remove this comment?",okButton:{text:"Yes, Remove Comment",callbackFunction:()=>{cityssm.postJSON(t+"/lotOccupancies/doDeleteLotOccupancyComment",{lotOccupancyId:c,lotOccupancyCommentId:o},e=>{e.success?(a=e.lotOccupancyComments,s()):bulmaJS.alert({title:"Error Removing Comment",message:e.errorMessage,contextualColorName:"danger"})})}},contextualColorName:"warning"})},s=()=>{const e=document.querySelector("#container--lotOccupancyComments");if(0===a.length)return void(e.innerHTML='

There are no comments associated with this record.

');const t=document.createElement("table");t.className="table is-fullwidth is-striped is-hoverable",t.innerHTML='CommentorComment DateCommentOptions';for(const e of a){const c=document.createElement("tr");c.dataset.lotOccupancyCommentId=e.lotOccupancyCommentId.toString(),c.innerHTML=""+cityssm.escapeHTML(e.recordCreate_userName)+""+e.lotOccupancyCommentDateString+(0===e.lotOccupancyCommentTime?"":" "+e.lotOccupancyCommentTimeString)+""+cityssm.escapeHTML(e.lotOccupancyComment)+'
',c.querySelector(".button--edit").addEventListener("click",o),c.querySelector(".button--delete").addEventListener("click",n),t.querySelector("tbody").append(c)}e.innerHTML="",e.append(t)};document.querySelector("#button--addComment").addEventListener("click",()=>{let o,n;const l=e=>{e.preventDefault(),cityssm.postJSON(t+"/lotOccupancies/doAddLotOccupancyComment",o,e=>{e.success?(a=e.lotOccupancyComments,n(),s()):bulmaJS.alert({title:"Error Adding Comment",message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("lotOccupancy-addComment",{onshow:t=>{e.populateAliases(t),t.querySelector("#lotOccupancyCommentAdd--lotOccupancyId").value=c},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),e.querySelector("#lotOccupancyCommentAdd--lotOccupancyComment").focus(),(o=e.querySelector("form")).addEventListener("submit",l),n=t},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})}),s()}if(!a){let a=exports.lotOccupancyFees;delete exports.lotOccupancyFees;const n=document.querySelector("#container--lotOccupancyFees"),s=()=>{let e=0;for(const t of a)e+=(t.feeAmount+t.taxAmount)*t.quantity;return e},l=e=>{const o=e.currentTarget.closest(".container--lotOccupancyFee").dataset.feeId;bulmaJS.confirm({title:"Delete Fee",message:"Are you sure you want to delete this fee?",contextualColorName:"warning",okButton:{text:"Yes, Delete Fee",callbackFunction:()=>{cityssm.postJSON(t+"/lotOccupancies/doDeleteLotOccupancyFee",{lotOccupancyId:c,feeId:o},e=>{e.success?(a=e.lotOccupancyFees,r()):bulmaJS.alert({title:"Error Deleting Fee",message:e.errorMessage,contextualColorName:"danger"})})}}})},r=()=>{if(0===a.length)return n.innerHTML='

There are no fees associated with this record.

',void m();n.innerHTML='
FeeUnit Cost×QuantityequalsTotalOptions
Subtotal
Tax
Grand Total
';let e=0,t=0;for(const c of a){const a=document.createElement("tr");a.className="container--lotOccupancyFee",a.dataset.feeId=c.feeId.toString(),a.dataset.includeQuantity=c.includeQuantity?"1":"0",a.innerHTML=''+cityssm.escapeHTML(c.feeName)+""+(1===c.quantity?"":'$'+c.feeAmount.toFixed(2)+'×'+c.quantity+"=")+'$'+(c.feeAmount*c.quantity).toFixed(2)+'',a.querySelector("button").addEventListener("click",l),n.querySelector("tbody").append(a),e+=c.feeAmount*c.quantity,t+=c.taxAmount*c.quantity}n.querySelector("#lotOccupancyFees--feeAmountTotal").textContent="$"+e.toFixed(2),n.querySelector("#lotOccupancyFees--taxAmountTotal").textContent="$"+t.toFixed(2),n.querySelector("#lotOccupancyFees--grandTotal").textContent="$"+(e+t).toFixed(2),m()};document.querySelector("#button--addFee").addEventListener("click",()=>{if(o)return void bulmaJS.alert({message:"Please save all unsaved changes before adding fees.",contextualColorName:"warning"});let e,s,l;const i=(e,o=1)=>{cityssm.postJSON(t+"/lotOccupancies/doAddLotOccupancyFee",{lotOccupancyId:c,feeId:e,quantity:o},e=>{e.success?(a=e.lotOccupancyFees,r(),d()):bulmaJS.alert({title:"Error Adding Fee",message:e.errorMessage,contextualColorName:"danger"})})},u=t=>{t.preventDefault();const c=Number.parseInt(t.currentTarget.dataset.feeId,10),a=Number.parseInt(t.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10),o=e.find(e=>e.feeCategoryId===a).fees.find(e=>e.feeId===c);o.includeQuantity?(e=>{let t,c;const a=a=>{a.preventDefault(),i(e.feeId,t.value),c()};cityssm.openHtmlModal("lotOccupancy-setFeeQuantity",{onshow:t=>{t.querySelector("#lotOccupancyFeeQuantity--quantityUnit").textContent=e.quantityUnit},onshown:(e,o)=>{c=o,t=e.querySelector("#lotOccupancyFeeQuantity--quantity"),e.querySelector("form").addEventListener("submit",a)}})})(o):i(c)},d=()=>{const t=s.value.trim().toLowerCase().split(" ");l.innerHTML="";for(const c of e){const e=document.createElement("div");e.className="container--feeCategory",e.dataset.feeCategoryId=c.feeCategoryId.toString(),e.innerHTML='

'+cityssm.escapeHTML(c.feeCategory)+'

';let a=!1;for(const o of c.fees){if(n.querySelector(".container--lotOccupancyFee[data-fee-id='"+o.feeId+"'][data-include-quantity='0']"))continue;let c=!0;for(const e of t)if(!o.feeName.toLowerCase().includes(e)){c=!1;break}if(!c)continue;a=!0;const s=document.createElement("a");s.className="panel-block is-block container--fee",s.dataset.feeId=o.feeId.toString(),s.href="#",s.innerHTML=""+cityssm.escapeHTML(o.feeName)+"
"+cityssm.escapeHTML(o.feeDescription).replace(/\n/g,"
")+"
",s.addEventListener("click",u),e.querySelector(".panel").append(s)}a&&l.append(e)}};cityssm.openHtmlModal("lotOccupancy-addFee",{onshow:a=>{s=a.querySelector("#feeSelect--feeName"),l=a.querySelector("#resultsContainer--feeSelect"),cityssm.postJSON(t+"/lotOccupancies/doGetFees",{lotOccupancyId:c},t=>{e=t.feeCategories,s.disabled=!1,s.addEventListener("keyup",d),s.focus(),d()})},onshown:()=>{bulmaJS.toggleHtmlClipped()},onhidden:()=>{r()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})});let i=exports.lotOccupancyTransactions;delete exports.lotOccupancyTransactions;const u=document.querySelector("#container--lotOccupancyTransactions"),d=()=>{let e=0;for(const t of i)e+=t.transactionAmount;return e},p=e=>{const a=e.currentTarget.closest(".container--lotOccupancyTransaction").dataset.transactionIndex;bulmaJS.confirm({title:"Delete Trasnaction",message:"Are you sure you want to delete this transaction?",contextualColorName:"warning",okButton:{text:"Yes, Delete Transaction",callbackFunction:()=>{cityssm.postJSON(t+"/lotOccupancies/doDeleteLotOccupancyTransaction",{lotOccupancyId:c,transactionIndex:a},e=>{e.success?(i=e.lotOccupancyTransactions,m()):bulmaJS.alert({title:"Error Deleting Transaction",message:e.errorMessage,contextualColorName:"danger"})})}}})},m=()=>{if(0===i.length)return void(u.innerHTML='

There are no transactions associated with this record.

');u.innerHTML='
Date'+cityssm.escapeHTML(exports.aliases.externalReceiptNumber)+'AmountOptions
Transaction Total
';let e=0;for(const t of i){e+=t.transactionAmount;const c=document.createElement("tr");c.className="container--lotOccupancyTransaction",c.dataset.transactionIndex=t.transactionIndex.toString(),c.innerHTML=""+t.transactionDateString+""+cityssm.escapeHTML(t.externalReceiptNumber)+"
"+cityssm.escapeHTML(t.transactionNote)+'$'+t.transactionAmount.toFixed(2)+'',c.querySelector("button").addEventListener("click",p),u.querySelector("tbody").append(c)}u.querySelector("#lotOccupancyTransactions--grandTotal").textContent="$"+e.toFixed(2);const t=s();t>e&&u.insertAdjacentHTML("afterbegin",'
Outstanding Balance
$'+(t-e).toFixed(2)+"
")};document.querySelector("#button--addTransaction").addEventListener("click",()=>{let a;const o=e=>{e.preventDefault(),cityssm.postJSON(t+"/lotOccupancies/doAddLotOccupancyTransaction",e.currentTarget,e=>{e.success?(i=e.lotOccupancyTransactions,a(),m()):bulmaJS.confirm({title:"Error Adding Transaction",message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("lotOccupancy-addTransaction",{onshow:t=>{e.populateAliases(t),t.querySelector("#lotOccupancyTransactionAdd--lotOccupancyId").value=c.toString();const a=s(),o=d(),n=t.querySelector("#lotOccupancyTransactionAdd--transactionAmount");n.min=(-1*o).toFixed(2),n.max=Math.max(a-o,0).toFixed(2),n.value=Math.max(a-o,0).toFixed(2)},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),a=t,e.querySelector("form").addEventListener("submit",o)},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})}),r()}})(); \ No newline at end of file +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=exports.los,t=document.querySelector("main").dataset.urlPrefix,c=document.querySelector("#lotOccupancy--lotOccupancyId").value,a=""===c;let o=!1,n=a;const s=()=>{o||(o=!0,cityssm.enableNavBlocker())},l=document.querySelector("#form--lotOccupancy");l.addEventListener("submit",e=>{e.preventDefault(),cityssm.postJSON(t+"/lotOccupancies/"+(a?"doCreateLotOccupancy":"doUpdateLotOccupancy"),l,e=>{e.success?(o=!1,cityssm.disableNavBlocker(),a||n?window.location.href=t+"/lotOccupancies/"+e.lotOccupancyId+"/edit?t="+Date.now():bulmaJS.alert({message:exports.aliases.occupancy+" Updated Successfully",contextualColorName:"success"})):bulmaJS.alert({title:"Error Saving "+exports.aliases.occupancy,message:e.errorMessage,contextualColorName:"danger"})})});const r=l.querySelectorAll("input, select");for(const e of r)e.addEventListener("change",s);a||document.querySelector("#button--deleteLotOccupancy").addEventListener("click",e=>{e.preventDefault();bulmaJS.confirm({title:"Delete "+exports.aliases.occupancy+" Record",message:"Are you sure you want to delete this record?",contextualColorName:"warning",okButton:{text:"Yes, Delete",callbackFunction:()=>{cityssm.postJSON(t+"/lotOccupancies/doDeleteLotOccupancy",{lotOccupancyId:c},e=>{e.success?(cityssm.disableNavBlocker(),window.location.href=t+"/lotOccupancies?t="+Date.now()):bulmaJS.alert({title:"Error Deleting Record",message:e.errorMessage,contextualColorName:"danger"})})}}})});const i=document.querySelector("#lotOccupancy--occupancyTypeId");if(a){const e=document.querySelector("#container--lotOccupancyFields");i.addEventListener("change",()=>{""!==i.value?cityssm.postJSON(t+"/lotOccupancies/doGetOccupancyTypeFields",{occupancyTypeId:i.value},t=>{if(0===t.occupancyTypeFields.length)return void(e.innerHTML='

There are no additional fields for this '+exports.aliases.occupancy.toLowerCase()+" type.

");e.innerHTML="";let c="";for(const a of t.occupancyTypeFields){c+=","+a.occupancyTypeFieldId;const t="lotOccupancyFieldValue_"+a.occupancyTypeFieldId,o="lotOccupancy--"+t,n=document.createElement("div");if(n.className="field",n.innerHTML='
',n.querySelector("label").textContent=a.occupancyTypeField,""===a.occupancyTypeFieldValues){const e=document.createElement("input");e.className="input",e.id=o,e.name=t,e.type="text",e.required=a.isRequired,e.minLength=a.minimumLength,e.maxLength=a.maximumLength,a.pattern&&""!==a.pattern&&(e.pattern=a.pattern),n.querySelector(".control").append(e)}else{n.querySelector(".control").innerHTML='
',n.querySelector("select").required=a.isRequired;const e=a.occupancyTypeFieldValues.split("\n");for(const t of e){const e=document.createElement("option");e.value=t,e.textContent=t,n.querySelector("select").append(e)}}e.append(n)}e.insertAdjacentHTML("beforeend",'')}):e.innerHTML='

Select the '+exports.aliases.occupancy.toLowerCase()+" type to load the available fields.

"})}else{const e=i.value;i.addEventListener("change",()=>{i.value!==e&&bulmaJS.confirm({title:"Confirm Change",message:"Are you sure you want to change the "+exports.aliases.occupancy.toLowerCase()+" type?\nThis change affects the additional fields associated with this record, and may also affect the available fees.",contextualColorName:"warning",okButton:{text:"Yes, Keep the Change",callbackFunction:()=>{n=!0}},cancelButton:{text:"Revert the Change",callbackFunction:()=>{i.value=e}}})})}const u=document.querySelector("#lotOccupancy--lotName");if(u.addEventListener("click",c=>{const a=c.currentTarget.value;let o,n,l,r;const i=(e,t)=>{document.querySelector("#lotOccupancy--lotId").value=e.toString(),document.querySelector("#lotOccupancy--lotName").value=t,s(),o()},u=e=>{e.preventDefault();const t=e.currentTarget;i(t.dataset.lotId,t.dataset.lotName)},d=()=>{r.innerHTML='


Searching...

',cityssm.postJSON(t+"/lots/doSearchLots",l,e=>{if(0===e.count)return void(r.innerHTML='

No results.

');const t=document.createElement("div");t.className="panel";for(const c of e.lots){const e=document.createElement("a");e.className="panel-block is-block",e.href="#",e.dataset.lotId=c.lotId.toString(),e.dataset.lotName=c.lotName,e.innerHTML='
'+cityssm.escapeHTML(c.lotName)+'
'+cityssm.escapeHTML(c.mapName)+'
'+cityssm.escapeHTML(c.lotStatus)+'
'+(c.lotOccupancyCount>0?"Currently Occupied":"")+"
",e.addEventListener("click",u),t.append(e)}r.innerHTML="",r.append(t)})},p=e=>{e.preventDefault();const c=n.querySelector("#lotCreate--lotName").value;cityssm.postJSON(t+"/lots/doCreateLot",e.currentTarget,e=>{e.success?i(e.lotId,c):bulmaJS.alert({title:"Error Creating "+exports.aliases.lot,message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("lotOccupancy-selectLot",{onshow:t=>{e.populateAliases(t)},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),n=e,o=t,bulmaJS.init(e);const c=e.querySelector("#lotSelect--lotName");""!==document.querySelector("#lotOccupancy--lotId").value&&(c.value=a),c.focus(),c.addEventListener("change",d);const s=e.querySelector("#lotSelect--occupancyStatus");if(s.addEventListener("change",d),""!==a&&(s.value=""),l=e.querySelector("#form--lotSelect"),r=e.querySelector("#resultsContainer--lotSelect"),l.addEventListener("submit",e=>{e.preventDefault()}),d(),exports.lotNamePattern){const t=exports.lotNamePattern;e.querySelector("#lotCreate--lotName").pattern=t.source}const i=e.querySelector("#lotCreate--lotTypeId");for(const e of exports.lotTypes){const t=document.createElement("option");t.value=e.lotTypeId.toString(),t.textContent=e.lotType,i.append(t)}const u=e.querySelector("#lotCreate--lotStatusId");for(const e of exports.lotStatuses){const t=document.createElement("option");t.value=e.lotStatusId.toString(),t.textContent=e.lotStatus,u.append(t)}const m=e.querySelector("#lotCreate--mapId");for(const e of exports.maps){const t=document.createElement("option");t.value=e.mapId.toString(),t.textContent=e.mapName||"(No Name)",m.append(t)}e.querySelector("#form--lotCreate").addEventListener("submit",p)},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})}),document.querySelector(".is-lot-view-button").addEventListener("click",()=>{const e=document.querySelector("#lotOccupancy--lotId").value;e?window.open(t+"/lots/"+e):bulmaJS.alert({message:"No "+exports.aliases.lot.toLowerCase()+" selected.",contextualColorName:"info"})}),document.querySelector(".is-clear-lot-button").addEventListener("click",()=>{u.disabled?bulmaJS.alert({message:"You need to unlock the field before clearing it.",contextualColorName:"info"}):(u.value="(No "+exports.aliases.lot+")",document.querySelector("#lotOccupancy--lotId").value="",s())}),e.initializeDatePickers(l),document.querySelector("#lotOccupancy--occupancyStartDateString").addEventListener("change",()=>{const e=document.querySelector("#lotOccupancy--occupancyEndDateString").bulmaCalendar.datePicker;e.min=document.querySelector("#lotOccupancy--occupancyStartDateString").value,e.refresh()}),e.initializeUnlockFieldButtons(l),!a){let a=exports.lotOccupancyOccupants;delete exports.lotOccupancyOccupants;const o=o=>{const n=Number.parseInt(o.currentTarget.closest("tr").dataset.lotOccupantIndex,10),l=a.find(e=>e.lotOccupantIndex===n);let r,i;const u=e=>{e.preventDefault(),cityssm.postJSON(t+"/lotOccupancies/doUpdateLotOccupancyOccupant",r,e=>{e.success?(a=e.lotOccupancyOccupants,i(),s()):bulmaJS.alert({title:"Error Updating "+exports.aliases.occupant,message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("lotOccupancy-editOccupant",{onshow:t=>{e.populateAliases(t),t.querySelector("#lotOccupancyOccupantEdit--lotOccupancyId").value=c,t.querySelector("#lotOccupancyOccupantEdit--lotOccupantIndex").value=n.toString();const a=t.querySelector("#lotOccupancyOccupantEdit--lotOccupantTypeId");let o=!1;for(const e of exports.lotOccupantTypes){const t=document.createElement("option");t.value=e.lotOccupantTypeId.toString(),t.textContent=e.lotOccupantType,e.lotOccupantTypeId===l.lotOccupantTypeId&&(t.selected=!0,o=!0),a.append(t)}if(!o){const e=document.createElement("option");e.value=l.lotOccupantTypeId.toString(),e.textContent=l.lotOccupantType,e.selected=!0,a.append(e)}t.querySelector("#lotOccupancyOccupantEdit--occupantName").value=l.occupantName,t.querySelector("#lotOccupancyOccupantEdit--occupantAddress1").value=l.occupantAddress1,t.querySelector("#lotOccupancyOccupantEdit--occupantAddress2").value=l.occupantAddress2,t.querySelector("#lotOccupancyOccupantEdit--occupantCity").value=l.occupantCity,t.querySelector("#lotOccupancyOccupantEdit--occupantProvince").value=l.occupantProvince,t.querySelector("#lotOccupancyOccupantEdit--occupantPostalCode").value=l.occupantPostalCode,t.querySelector("#lotOccupancyOccupantEdit--occupantPhoneNumber").value=l.occupantPhoneNumber,t.querySelector("#lotOccupancyOccupantEdit--occupantEmailAddress").value=l.occupantEmailAddress},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),e.querySelector("#lotOccupancyOccupantEdit--lotOccupantTypeId").focus(),(r=e.querySelector("form")).addEventListener("submit",u),i=t},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},n=e=>{const o=e.currentTarget.closest("tr").dataset.lotOccupantIndex;bulmaJS.confirm({title:"Remove "+exports.aliases.occupant+"?",message:"Are you sure you want to remove this "+exports.aliases.occupant.toLowerCase()+"?",okButton:{text:"Yes, Remove "+exports.aliases.occupant,callbackFunction:()=>{cityssm.postJSON(t+"/lotOccupancies/doDeleteLotOccupancyOccupant",{lotOccupancyId:c,lotOccupantIndex:o},e=>{e.success?(a=e.lotOccupancyOccupants,s()):bulmaJS.alert({title:"Error Removing "+exports.aliases.occupant,message:e.errorMessage,contextualColorName:"danger"})})}},contextualColorName:"warning"})},s=()=>{const e=document.querySelector("#container--lotOccupancyOccupants");if(cityssm.clearElement(e),0===a.length)return void(e.innerHTML='

There are no '+exports.aliases.occupants.toLowerCase()+" associated with this record.

");const t=document.createElement("table");t.className="table is-fullwidth is-striped is-hoverable",t.innerHTML=""+exports.aliases.occupant+" Type"+exports.aliases.occupant+'AddressOther ContactOptions';for(const e of a){const c=document.createElement("tr");c.dataset.lotOccupantIndex=e.lotOccupantIndex.toString(),c.innerHTML=""+cityssm.escapeHTML(e.lotOccupantType)+""+cityssm.escapeHTML(e.occupantName)+""+(e.occupantAddress1?cityssm.escapeHTML(e.occupantAddress1)+"
":"")+(e.occupantAddress2?cityssm.escapeHTML(e.occupantAddress2)+"
":"")+(e.occupantCity?cityssm.escapeHTML(e.occupantCity)+", ":"")+cityssm.escapeHTML(e.occupantProvince)+"
"+cityssm.escapeHTML(e.occupantPostalCode)+""+(e.occupantPhoneNumber?cityssm.escapeHTML(e.occupantPhoneNumber)+"
":"")+(e.occupantEmailAddress?cityssm.escapeHTML(e.occupantEmailAddress):"")+'
',c.querySelector(".button--edit").addEventListener("click",o),c.querySelector(".button--delete").addEventListener("click",n),t.querySelector("tbody").append(c)}e.append(t)};document.querySelector("#button--addOccupant").addEventListener("click",()=>{let o,n,l,r;const i=e=>{cityssm.postJSON(t+"/lotOccupancies/doAddLotOccupancyOccupant",e,e=>{e.success?(a=e.lotOccupancyOccupants,o(),s()):bulmaJS.alert({title:"Error Adding "+exports.aliases.occupant,message:e.errorMessage,contextualColorName:"danger"})})},u=e=>{e.preventDefault(),i(n)};let d=[];const p=e=>{e.preventDefault();const t=e.currentTarget,a=d[Number.parseInt(t.dataset.index,10)],o=t.closest(".modal").querySelector("#lotOccupancyOccupantCopy--lotOccupantTypeId").value;""===o?bulmaJS.alert({title:"No "+exports.aliases.occupant+" Type Selected",message:"Select a type to apply to the newly added "+exports.aliases.occupant.toLowerCase()+".",contextualColorName:"warning"}):(a.lotOccupantTypeId=Number.parseInt(o,10),a.lotOccupancyId=Number.parseInt(c,10),i(a))},m=e=>{e.preventDefault(),""!==l.querySelector("#lotOccupancyOccupantCopy--searchFilter").value?(r.innerHTML='

Searching...
',cityssm.postJSON(t+"/lotOccupancies/doSearchPastOccupants",l,e=>{d=e.occupants;const t=document.createElement("div");t.className="panel";for(const[e,c]of d.entries()){const a=document.createElement("a");a.className="panel-block is-block",a.dataset.index=e.toString(),a.innerHTML=""+cityssm.escapeHTML(c.occupantName)+'
'+cityssm.escapeHTML(c.occupantAddress1)+"
"+(c.occupantAddress2?cityssm.escapeHTML(c.occupantAddress2)+"
":"")+cityssm.escapeHTML(c.occupantCity)+", "+cityssm.escapeHTML(c.occupantProvince)+"
"+cityssm.escapeHTML(c.occupantPostalCode)+'
'+(c.occupantPhoneNumber?cityssm.escapeHTML(c.occupantPhoneNumber)+"
":"")+cityssm.escapeHTML(c.occupantEmailAddress)+"
",a.addEventListener("click",p),t.append(a)}r.innerHTML="",r.append(t)})):r.innerHTML='

Enter a partial name or address in the search field above.

'};cityssm.openHtmlModal("lotOccupancy-addOccupant",{onshow:t=>{e.populateAliases(t),t.querySelector("#lotOccupancyOccupantAdd--lotOccupancyId").value=c;const a=t.querySelector("#lotOccupancyOccupantAdd--lotOccupantTypeId"),o=t.querySelector("#lotOccupancyOccupantCopy--lotOccupantTypeId");for(const e of exports.lotOccupantTypes){const t=document.createElement("option");t.value=e.lotOccupantTypeId.toString(),t.textContent=e.lotOccupantType,a.append(t),o.append(t.cloneNode(!0))}t.querySelector("#lotOccupancyOccupantAdd--occupantCity").value=exports.occupantCityDefault,t.querySelector("#lotOccupancyOccupantAdd--occupantProvince").value=exports.occupantProvinceDefault},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),bulmaJS.init(e),e.querySelector("#lotOccupancyOccupantAdd--lotOccupantTypeId").focus(),(n=e.querySelector("#form--lotOccupancyOccupantAdd")).addEventListener("submit",u),r=e.querySelector("#lotOccupancyOccupantCopy--searchResults"),(l=e.querySelector("#form--lotOccupancyOccupantCopy")).addEventListener("submit",e=>{e.preventDefault()}),e.querySelector("#lotOccupancyOccupantCopy--searchFilter").addEventListener("change",m),o=t},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})}),s()}if(!a){let a=exports.lotOccupancyComments;delete exports.lotOccupancyComments;const o=o=>{const n=Number.parseInt(o.currentTarget.closest("tr").dataset.lotOccupancyCommentId,10),l=a.find(e=>e.lotOccupancyCommentId===n);let r,i;const u=e=>{e.preventDefault(),cityssm.postJSON(t+"/lotOccupancies/doUpdateLotOccupancyComment",r,e=>{e.success?(a=e.lotOccupancyComments,i(),s()):bulmaJS.alert({title:"Error Updating Comment",message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("lotOccupancy-editComment",{onshow:t=>{e.populateAliases(t),t.querySelector("#lotOccupancyCommentEdit--lotOccupancyId").value=c,t.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentId").value=n.toString(),t.querySelector("#lotOccupancyCommentEdit--lotOccupancyComment").value=l.lotOccupancyComment;const a=t.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentDateString");a.value=l.lotOccupancyCommentDateString;const o=cityssm.dateToString(new Date);a.max=l.lotOccupancyCommentDateString<=o?o:l.lotOccupancyCommentDateString,t.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentTimeString").value=l.lotOccupancyCommentTimeString},onshown:(t,c)=>{bulmaJS.toggleHtmlClipped(),e.initializeDatePickers(t),e.initializeTimePickers(t),t.querySelector("#lotOccupancyCommentEdit--lotOccupancyComment").focus(),(r=t.querySelector("form")).addEventListener("submit",u),i=c},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},n=e=>{const o=Number.parseInt(e.currentTarget.closest("tr").dataset.lotOccupancyCommentId,10);bulmaJS.confirm({title:"Remove Comment?",message:"Are you sure you want to remove this comment?",okButton:{text:"Yes, Remove Comment",callbackFunction:()=>{cityssm.postJSON(t+"/lotOccupancies/doDeleteLotOccupancyComment",{lotOccupancyId:c,lotOccupancyCommentId:o},e=>{e.success?(a=e.lotOccupancyComments,s()):bulmaJS.alert({title:"Error Removing Comment",message:e.errorMessage,contextualColorName:"danger"})})}},contextualColorName:"warning"})},s=()=>{const e=document.querySelector("#container--lotOccupancyComments");if(0===a.length)return void(e.innerHTML='

There are no comments associated with this record.

');const t=document.createElement("table");t.className="table is-fullwidth is-striped is-hoverable",t.innerHTML='CommentorComment DateCommentOptions';for(const e of a){const c=document.createElement("tr");c.dataset.lotOccupancyCommentId=e.lotOccupancyCommentId.toString(),c.innerHTML=""+cityssm.escapeHTML(e.recordCreate_userName)+""+e.lotOccupancyCommentDateString+(0===e.lotOccupancyCommentTime?"":" "+e.lotOccupancyCommentTimeString)+""+cityssm.escapeHTML(e.lotOccupancyComment)+'
',c.querySelector(".button--edit").addEventListener("click",o),c.querySelector(".button--delete").addEventListener("click",n),t.querySelector("tbody").append(c)}e.innerHTML="",e.append(t)};document.querySelector("#button--addComment").addEventListener("click",()=>{let o,n;const l=e=>{e.preventDefault(),cityssm.postJSON(t+"/lotOccupancies/doAddLotOccupancyComment",o,e=>{e.success?(a=e.lotOccupancyComments,n(),s()):bulmaJS.alert({title:"Error Adding Comment",message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("lotOccupancy-addComment",{onshow:t=>{e.populateAliases(t),t.querySelector("#lotOccupancyCommentAdd--lotOccupancyId").value=c},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),e.querySelector("#lotOccupancyCommentAdd--lotOccupancyComment").focus(),(o=e.querySelector("form")).addEventListener("submit",l),n=t},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})}),s()}if(!a){let a=exports.lotOccupancyFees;delete exports.lotOccupancyFees;const n=document.querySelector("#container--lotOccupancyFees"),s=()=>{let e=0;for(const t of a)e+=(t.feeAmount+t.taxAmount)*t.quantity;return e},l=e=>{const o=e.currentTarget.closest(".container--lotOccupancyFee").dataset.feeId;bulmaJS.confirm({title:"Delete Fee",message:"Are you sure you want to delete this fee?",contextualColorName:"warning",okButton:{text:"Yes, Delete Fee",callbackFunction:()=>{cityssm.postJSON(t+"/lotOccupancies/doDeleteLotOccupancyFee",{lotOccupancyId:c,feeId:o},e=>{e.success?(a=e.lotOccupancyFees,r()):bulmaJS.alert({title:"Error Deleting Fee",message:e.errorMessage,contextualColorName:"danger"})})}}})},r=()=>{if(0===a.length)return n.innerHTML='

There are no fees associated with this record.

',void m();n.innerHTML='
FeeUnit Cost×QuantityequalsTotalOptions
Subtotal
Tax
Grand Total
';let e=0,t=0;for(const c of a){const a=document.createElement("tr");a.className="container--lotOccupancyFee",a.dataset.feeId=c.feeId.toString(),a.dataset.includeQuantity=c.includeQuantity?"1":"0",a.innerHTML=''+cityssm.escapeHTML(c.feeName)+""+(1===c.quantity?"":'$'+c.feeAmount.toFixed(2)+'×'+c.quantity+"=")+'$'+(c.feeAmount*c.quantity).toFixed(2)+'',a.querySelector("button").addEventListener("click",l),n.querySelector("tbody").append(a),e+=c.feeAmount*c.quantity,t+=c.taxAmount*c.quantity}n.querySelector("#lotOccupancyFees--feeAmountTotal").textContent="$"+e.toFixed(2),n.querySelector("#lotOccupancyFees--taxAmountTotal").textContent="$"+t.toFixed(2),n.querySelector("#lotOccupancyFees--grandTotal").textContent="$"+(e+t).toFixed(2),m()};document.querySelector("#button--addFee").addEventListener("click",()=>{if(o)return void bulmaJS.alert({message:"Please save all unsaved changes before adding fees.",contextualColorName:"warning"});let e,s,l;const i=(e,o=1)=>{cityssm.postJSON(t+"/lotOccupancies/doAddLotOccupancyFee",{lotOccupancyId:c,feeId:e,quantity:o},e=>{e.success?(a=e.lotOccupancyFees,r(),d()):bulmaJS.alert({title:"Error Adding Fee",message:e.errorMessage,contextualColorName:"danger"})})},u=t=>{t.preventDefault();const c=Number.parseInt(t.currentTarget.dataset.feeId,10),a=Number.parseInt(t.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10),o=e.find(e=>e.feeCategoryId===a).fees.find(e=>e.feeId===c);o.includeQuantity?(e=>{let t,c;const a=a=>{a.preventDefault(),i(e.feeId,t.value),c()};cityssm.openHtmlModal("lotOccupancy-setFeeQuantity",{onshow:t=>{t.querySelector("#lotOccupancyFeeQuantity--quantityUnit").textContent=e.quantityUnit},onshown:(e,o)=>{c=o,t=e.querySelector("#lotOccupancyFeeQuantity--quantity"),e.querySelector("form").addEventListener("submit",a)}})})(o):i(c)},d=()=>{const t=s.value.trim().toLowerCase().split(" ");l.innerHTML="";for(const c of e){const e=document.createElement("div");e.className="container--feeCategory",e.dataset.feeCategoryId=c.feeCategoryId.toString(),e.innerHTML='

'+cityssm.escapeHTML(c.feeCategory)+'

';let a=!1;for(const o of c.fees){if(n.querySelector(".container--lotOccupancyFee[data-fee-id='"+o.feeId+"'][data-include-quantity='0']"))continue;let c=!0;for(const e of t)if(!o.feeName.toLowerCase().includes(e)){c=!1;break}if(!c)continue;a=!0;const s=document.createElement("a");s.className="panel-block is-block container--fee",s.dataset.feeId=o.feeId.toString(),s.href="#",s.innerHTML=""+cityssm.escapeHTML(o.feeName)+"
"+cityssm.escapeHTML(o.feeDescription).replace(/\n/g,"
")+"
",s.addEventListener("click",u),e.querySelector(".panel").append(s)}a&&l.append(e)}};cityssm.openHtmlModal("lotOccupancy-addFee",{onshow:a=>{s=a.querySelector("#feeSelect--feeName"),l=a.querySelector("#resultsContainer--feeSelect"),cityssm.postJSON(t+"/lotOccupancies/doGetFees",{lotOccupancyId:c},t=>{e=t.feeCategories,s.disabled=!1,s.addEventListener("keyup",d),s.focus(),d()})},onshown:()=>{bulmaJS.toggleHtmlClipped()},onhidden:()=>{r()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})});let i=exports.lotOccupancyTransactions;delete exports.lotOccupancyTransactions;const u=document.querySelector("#container--lotOccupancyTransactions"),d=()=>{let e=0;for(const t of i)e+=t.transactionAmount;return e},p=e=>{const a=e.currentTarget.closest(".container--lotOccupancyTransaction").dataset.transactionIndex;bulmaJS.confirm({title:"Delete Trasnaction",message:"Are you sure you want to delete this transaction?",contextualColorName:"warning",okButton:{text:"Yes, Delete Transaction",callbackFunction:()=>{cityssm.postJSON(t+"/lotOccupancies/doDeleteLotOccupancyTransaction",{lotOccupancyId:c,transactionIndex:a},e=>{e.success?(i=e.lotOccupancyTransactions,m()):bulmaJS.alert({title:"Error Deleting Transaction",message:e.errorMessage,contextualColorName:"danger"})})}}})},m=()=>{if(0===i.length)return void(u.innerHTML='

There are no transactions associated with this record.

');u.innerHTML='
Date'+cityssm.escapeHTML(exports.aliases.externalReceiptNumber)+'AmountOptions
Transaction Total
';let e=0;for(const t of i){e+=t.transactionAmount;const c=document.createElement("tr");c.className="container--lotOccupancyTransaction",c.dataset.transactionIndex=t.transactionIndex.toString(),c.innerHTML=""+t.transactionDateString+""+cityssm.escapeHTML(t.externalReceiptNumber)+"
"+cityssm.escapeHTML(t.transactionNote)+'$'+t.transactionAmount.toFixed(2)+'',c.querySelector("button").addEventListener("click",p),u.querySelector("tbody").append(c)}u.querySelector("#lotOccupancyTransactions--grandTotal").textContent="$"+e.toFixed(2);const t=s();t>e&&u.insertAdjacentHTML("afterbegin",'
Outstanding Balance
$'+(t-e).toFixed(2)+"
")};document.querySelector("#button--addTransaction").addEventListener("click",()=>{let a;const o=e=>{e.preventDefault(),cityssm.postJSON(t+"/lotOccupancies/doAddLotOccupancyTransaction",e.currentTarget,e=>{e.success?(i=e.lotOccupancyTransactions,a(),m()):bulmaJS.confirm({title:"Error Adding Transaction",message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("lotOccupancy-addTransaction",{onshow:t=>{e.populateAliases(t),t.querySelector("#lotOccupancyTransactionAdd--lotOccupancyId").value=c.toString();const a=s(),o=d(),n=t.querySelector("#lotOccupancyTransactionAdd--transactionAmount");n.min=(-1*o).toFixed(2),n.max=Math.max(a-o,0).toFixed(2),n.value=Math.max(a-o,0).toFixed(2)},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),a=t,e.querySelector("form").addEventListener("submit",o)},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})}),r()}})(); \ No newline at end of file diff --git a/routes/lotOccupancies.js b/routes/lotOccupancies.js index 3704d4aa..469533b4 100644 --- a/routes/lotOccupancies.js +++ b/routes/lotOccupancies.js @@ -8,6 +8,7 @@ import handler_doCreateLotOccupancy from "../handlers/lotOccupancies-post/doCrea import handler_edit from "../handlers/lotOccupancies-get/edit.js"; import handler_doUpdateLotOccupancy from "../handlers/lotOccupancies-post/doUpdateLotOccupancy.js"; import handler_doDeleteLotOccupancy from "../handlers/lotOccupancies-post/doDeleteLotOccupancy.js"; +import handler_doSearchPastOccupants from "../handlers/lotOccupancies-post/doSearchPastOccupants.js"; import handler_doAddLotOccupancyOccupant from "../handlers/lotOccupancies-post/doAddLotOccupancyOccupant.js"; import handler_doUpdateLotOccupancyOccupant from "../handlers/lotOccupancies-post/doUpdateLotOccupancyOccupant.js"; import handler_doDeleteLotOccupancyOccupant from "../handlers/lotOccupancies-post/doDeleteLotOccupancyOccupant.js"; @@ -30,6 +31,7 @@ router.get("/:lotOccupancyId", handler_view); router.get("/:lotOccupancyId/edit", permissionHandlers.updateGetHandler, handler_edit); router.post("/doUpdateLotOccupancy", permissionHandlers.updatePostHandler, handler_doUpdateLotOccupancy); router.post("/doDeleteLotOccupancy", permissionHandlers.updatePostHandler, handler_doDeleteLotOccupancy); +router.post("/doSearchPastOccupants", permissionHandlers.updatePostHandler, handler_doSearchPastOccupants); router.post("/doAddLotOccupancyOccupant", permissionHandlers.updatePostHandler, handler_doAddLotOccupancyOccupant); router.post("/doUpdateLotOccupancyOccupant", permissionHandlers.updatePostHandler, handler_doUpdateLotOccupancyOccupant); router.post("/doDeleteLotOccupancyOccupant", permissionHandlers.updatePostHandler, handler_doDeleteLotOccupancyOccupant); diff --git a/routes/lotOccupancies.ts b/routes/lotOccupancies.ts index 7d251a4d..6c1598f7 100644 --- a/routes/lotOccupancies.ts +++ b/routes/lotOccupancies.ts @@ -13,6 +13,7 @@ import handler_edit from "../handlers/lotOccupancies-get/edit.js"; import handler_doUpdateLotOccupancy from "../handlers/lotOccupancies-post/doUpdateLotOccupancy.js"; import handler_doDeleteLotOccupancy from "../handlers/lotOccupancies-post/doDeleteLotOccupancy.js"; +import handler_doSearchPastOccupants from "../handlers/lotOccupancies-post/doSearchPastOccupants.js"; import handler_doAddLotOccupancyOccupant from "../handlers/lotOccupancies-post/doAddLotOccupancyOccupant.js"; import handler_doUpdateLotOccupancyOccupant from "../handlers/lotOccupancies-post/doUpdateLotOccupancyOccupant.js"; import handler_doDeleteLotOccupancyOccupant from "../handlers/lotOccupancies-post/doDeleteLotOccupancyOccupant.js"; @@ -80,6 +81,12 @@ router.post( // Occupants +router.post( + "/doSearchPastOccupants", + permissionHandlers.updatePostHandler, + handler_doSearchPastOccupants +); + router.post( "/doAddLotOccupancyOccupant", permissionHandlers.updatePostHandler, diff --git a/types/recordTypes.d.ts b/types/recordTypes.d.ts index e1e2c3ef..f98b6ba9 100644 --- a/types/recordTypes.d.ts +++ b/types/recordTypes.d.ts @@ -154,6 +154,8 @@ export interface LotOccupancyOccupant extends Record { occupantPostalCode?: string; occupantPhoneNumber?: string; occupantEmailAddress?: string; + lotOccupancyIdCount?: number; + recordUpdate_timeMillisMax?: number; } export interface LotOccupancyComment extends Record { lotOccupancyCommentId?: number; diff --git a/types/recordTypes.ts b/types/recordTypes.ts index 7924bfb2..aa2e455c 100644 --- a/types/recordTypes.ts +++ b/types/recordTypes.ts @@ -203,6 +203,9 @@ export interface LotOccupancyOccupant extends Record { occupantPhoneNumber?: string; occupantEmailAddress?: string; + + lotOccupancyIdCount?: number; + recordUpdate_timeMillisMax?: number; } export interface LotOccupancyComment extends Record {