import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types.js' import type { Contract } from '../../types/record.types.js' import type { Sunrise } from './types.js' declare const cityssm: cityssmGlobal declare const exports: Record ;(() => { const sunrise = exports.sunrise as Sunrise const searchFilterFormElement = document.querySelector( '#form--searchFilters' ) as HTMLFormElement const searchResultsContainerElement = document.querySelector( '#container--searchResults' ) as HTMLElement const limitElement = document.querySelector( '#searchFilter--limit' ) as HTMLSelectElement const offsetElement = document.querySelector( '#searchFilter--offset' ) as HTMLInputElement // eslint-disable-next-line complexity function renderContracts(rawResponseJSON: unknown): void { const responseJSON = rawResponseJSON as { contracts: Contract[] count: number offset: number } if (responseJSON.contracts.length === 0) { searchResultsContainerElement.innerHTML = `

There are no contracts that meet the search criteria.

` return } const resultsTbodyElement = document.createElement('tbody') const nowDateString = cityssm.dateToString(new Date()) for (const contract of responseJSON.contracts) { let contractTimeHTML = '' if ( contract.contractStartDateString <= nowDateString && (contract.contractEndDateString === '' || contract.contractEndDateString! >= nowDateString) ) { contractTimeHTML = ` ` } else if (contract.contractStartDateString > nowDateString) { contractTimeHTML = ` ` } else { contractTimeHTML = ` ` } let contactsHTML = '' for (const interment of contract.contractInterments ?? []) { contactsHTML += `
  • ${cityssm.escapeHTML(interment.deceasedName ?? '')}
  • ` } if (contract.purchaserName !== '') { contactsHTML += `
  • ${cityssm.escapeHTML(contract.purchaserName)}
  • ` } if ( contract.funeralHomeName !== null && contract.funeralHomeName !== '' ) { contactsHTML += `
  • ${cityssm.escapeHTML(contract.funeralHomeName)}
  • ` } const feeTotal = ( contract.contractFees?.reduce( (soFar, currentFee): number => soFar + ((currentFee.feeAmount ?? 0) + (currentFee.taxAmount ?? 0)) * (currentFee.quantity ?? 0), 0 ) ?? 0 ).toFixed(2) const transactionTotal = ( contract.contractTransactions?.reduce( (soFar, currentTransaction): number => soFar + currentTransaction.transactionAmount, 0 ) ?? 0 ).toFixed(2) let feeIconHTML = '' if (feeTotal !== '0.00' || transactionTotal !== '0.00') { feeIconHTML = ` ` } const burialSiteLinkClass = contract.burialSiteIsActive === 0 ? 'has-text-danger-dark' : '' // eslint-disable-next-line no-unsanitized/method resultsTbodyElement.insertAdjacentHTML( 'beforeend', ` ${contractTimeHTML} ${cityssm.escapeHTML(contract.contractType)}
    #${contract.contractId} ${ (contract.burialSiteId ?? -1) === -1 ? '(No Burial Site)' : ` ${cityssm.escapeHTML(contract.burialSiteName ?? '')} ` }
    ${cityssm.escapeHTML(contract.cemeteryName ?? '')} ${contract.contractStartDateString} ${ contract.contractEndDate ? contract.contractEndDateString : '(No End Date)' } ${ contactsHTML === '' ? '' : `` } ${feeIconHTML} ${ contract.printEJS ? ` ` : '' }` ) } searchResultsContainerElement.innerHTML = `
    Contract Type Burial Site Contract Date End Date Contacts Fees and Transactions Print
    ` searchResultsContainerElement .querySelector('table') ?.append(resultsTbodyElement) // eslint-disable-next-line no-unsanitized/method searchResultsContainerElement.insertAdjacentHTML( 'beforeend', sunrise.getSearchResultsPagerHTML( Number.parseInt(limitElement.value, 10), responseJSON.offset, responseJSON.count ) ) searchResultsContainerElement .querySelector("button[data-page='previous']") ?.addEventListener('click', previousAndGetContracts) searchResultsContainerElement .querySelector("button[data-page='next']") ?.addEventListener('click', nextAndGetContracts) } function getContracts(): void { // eslint-disable-next-line no-unsanitized/property searchResultsContainerElement.innerHTML = sunrise.getLoadingParagraphHTML( 'Loading Contracts...' ) cityssm.postJSON( `${sunrise.urlPrefix}/contracts/doSearchContracts`, searchFilterFormElement, renderContracts ) } function resetOffsetAndGetContracts(): void { offsetElement.value = '0' getContracts() } function previousAndGetContracts(): void { offsetElement.value = Math.max( Number.parseInt(offsetElement.value, 10) - Number.parseInt(limitElement.value, 10), 0 ).toString() getContracts() } function nextAndGetContracts(): void { offsetElement.value = ( Number.parseInt(offsetElement.value, 10) + Number.parseInt(limitElement.value, 10) ).toString() getContracts() } const filterElements = searchFilterFormElement.querySelectorAll('input, select') for (const filterElement of filterElements) { filterElement.addEventListener('change', resetOffsetAndGetContracts) } searchFilterFormElement.addEventListener('submit', (formEvent) => { formEvent.preventDefault() }) getContracts() })()