// eslint-disable-next-line @eslint-community/eslint-comments/disable-enable-pair /* eslint-disable unicorn/prefer-module */ import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types.js' import type { LOS } from '../types/globalTypes.js' import type * as recordTypes from '../types/recordTypes.js' declare const cityssm: cityssmGlobal declare const exports: Record ;(() => { const los = exports.los as LOS const searchFilterFormElement = document.querySelector( '#form--searchFilters' ) as HTMLFormElement const searchResultsContainerElement = document.querySelector( '#container--searchResults' ) as HTMLElement const limit = Number.parseInt( (document.querySelector('#searchFilter--limit') as HTMLInputElement).value, 10 ) const offsetElement = document.querySelector( '#searchFilter--offset' ) as HTMLInputElement function renderLotOccupancies(rawResponseJSON: unknown): void { const responseJSON = rawResponseJSON as { count: number offset: number lotOccupancies: recordTypes.LotOccupancy[] } if (responseJSON.lotOccupancies.length === 0) { // eslint-disable-next-line no-unsanitized/property searchResultsContainerElement.innerHTML = `

There are no ${los.escapedAliases.occupancy} records that meet the search criteria.

` return } const resultsTbodyElement = document.createElement('tbody') const nowDateString = cityssm.dateToString(new Date()) for (const lotOccupancy of responseJSON.lotOccupancies) { let occupancyTimeHTML = '' if ( lotOccupancy.occupancyStartDateString! <= nowDateString && (lotOccupancy.occupancyEndDateString === '' || lotOccupancy.occupancyEndDateString! >= nowDateString) ) { occupancyTimeHTML = ` ` } else if (lotOccupancy.occupancyStartDateString! > nowDateString) { occupancyTimeHTML = ` ` } else { occupancyTimeHTML = ` ` } let occupantsHTML = '' for (const occupant of lotOccupancy.lotOccupancyOccupants ?? []) { occupantsHTML += `
  • ${cityssm.escapeHTML(occupant.occupantName ?? '')} ${cityssm.escapeHTML(occupant.occupantFamilyName ?? '')}
  • ` } const feeTotal = ( lotOccupancy.lotOccupancyFees?.reduce((soFar, currentFee): number => { return ( soFar + ((currentFee.feeAmount ?? 0) + (currentFee.taxAmount ?? 0)) * (currentFee.quantity ?? 0) ) }, 0) ?? 0 ).toFixed(2) const transactionTotal = ( lotOccupancy.lotOccupancyTransactions?.reduce( (soFar, currentTransaction): number => { return soFar + currentTransaction.transactionAmount }, 0 ) ?? 0 ).toFixed(2) let feeIconHTML = '' if (feeTotal !== '0.00' || transactionTotal !== '0.00') { feeIconHTML = ` ` } // eslint-disable-next-line no-unsanitized/method resultsTbodyElement.insertAdjacentHTML( 'beforeend', ` ${occupancyTimeHTML} ${cityssm.escapeHTML(lotOccupancy.occupancyType ?? '')}
    #${lotOccupancy.lotOccupancyId} ${ (lotOccupancy.lotId ?? -1) === -1 ? `(No ${los.escapedAliases.Lot})` : `${cityssm.escapeHTML(lotOccupancy.lotName ?? '')}` }
    ${cityssm.escapeHTML(lotOccupancy.mapName ?? '')} ${lotOccupancy.occupancyStartDateString} ${ lotOccupancy.occupancyEndDate ? lotOccupancy.occupancyEndDateString : '(No End Date)' } ${ occupantsHTML === '' ? '' : `` } ${feeIconHTML} ${ lotOccupancy.printEJS ? ` ` : '' }` ) } // eslint-disable-next-line no-unsanitized/property searchResultsContainerElement.innerHTML = `
    ${los.escapedAliases.Occupancy} Type ${los.escapedAliases.Lot} ${los.escapedAliases.OccupancyStartDate} End Date ${los.escapedAliases.Occupants} Fees and Transactions Print
    ` searchResultsContainerElement .querySelector('table') ?.append(resultsTbodyElement) // eslint-disable-next-line no-unsanitized/method searchResultsContainerElement.insertAdjacentHTML( 'beforeend', los.getSearchResultsPagerHTML( limit, responseJSON.offset, responseJSON.count ) ) searchResultsContainerElement .querySelector("button[data-page='previous']") ?.addEventListener('click', previousAndGetLotOccupancies) searchResultsContainerElement .querySelector("button[data-page='next']") ?.addEventListener('click', nextAndGetLotOccupancies) } function getLotOccupancies(): void { // eslint-disable-next-line no-unsanitized/property searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML( `Loading ${los.escapedAliases.Occupancies}...` ) cityssm.postJSON( `${los.urlPrefix}/lotOccupancies/doSearchLotOccupancies`, searchFilterFormElement, renderLotOccupancies ) } function resetOffsetAndGetLotOccupancies(): void { offsetElement.value = '0' getLotOccupancies() } function previousAndGetLotOccupancies(): void { offsetElement.value = Math.max( Number.parseInt(offsetElement.value, 10) - limit, 0 ).toString() getLotOccupancies() } function nextAndGetLotOccupancies(): void { offsetElement.value = ( Number.parseInt(offsetElement.value, 10) + limit ).toString() getLotOccupancies() } const filterElements = searchFilterFormElement.querySelectorAll('input, select') for (const filterElement of filterElements) { filterElement.addEventListener('change', resetOffsetAndGetLotOccupancies) } searchFilterFormElement.addEventListener('submit', (formEvent) => { formEvent.preventDefault() }) getLotOccupancies() })()