/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
import type * as recordTypes from '../types/recordTypes'
import type * as globalTypes from '../types/globalTypes'
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
declare const cityssm: cityssmGlobal
;(() => {
const los = exports.los as globalTypes.LOS
const workOrderSearchFiltersFormElement = document.querySelector(
'#form--searchFilters'
) as HTMLFormElement
const workOrderMilestoneDateFilterElement =
workOrderSearchFiltersFormElement.querySelector(
'#searchFilter--workOrderMilestoneDateFilter'
) as HTMLSelectElement
const workOrderMilestoneDateStringElement =
workOrderSearchFiltersFormElement.querySelector(
'#searchFilter--workOrderMilestoneDateString'
) as HTMLInputElement
const milestoneCalendarContainerElement = document.querySelector(
'#container--milestoneCalendar'
) as HTMLElement
function renderMilestones(
workOrderMilestones: recordTypes.WorkOrderMilestone[]
): void {
if (workOrderMilestones.length === 0) {
milestoneCalendarContainerElement.innerHTML = `
There are no milestones that meet the search criteria.
`
return
}
milestoneCalendarContainerElement.innerHTML = ''
const currentDate = cityssm.dateToString(new Date())
let currentPanelElement: HTMLElement | undefined
let currentPanelDateString = ''
for (const milestone of workOrderMilestones) {
if (currentPanelDateString !== milestone.workOrderMilestoneDateString) {
if (currentPanelElement) {
milestoneCalendarContainerElement.append(currentPanelElement)
}
currentPanelElement = document.createElement('div')
currentPanelElement.className = 'panel'
currentPanelElement.innerHTML = `${milestone.workOrderMilestoneDateString!}
`
currentPanelDateString = milestone.workOrderMilestoneDateString!
}
const panelBlockElement = document.createElement('div')
panelBlockElement.className = 'panel-block is-block'
if (
!milestone.workOrderMilestoneCompletionDate &&
milestone.workOrderMilestoneDateString! < currentDate
) {
panelBlockElement.classList.add('has-background-warning-light')
}
let lotOccupancyHTML = ''
for (const lot of milestone.workOrderLots!) {
lotOccupancyHTML +=
'' +
' ' +
cityssm.escapeHTML(lot.lotName ?? '') +
'' +
'
'
}
for (const lotOccupancy of milestone.workOrderLotOccupancies!) {
for (const occupant of lotOccupancy.lotOccupancyOccupants!) {
lotOccupancyHTML +=
'' +
' ' +
cityssm.escapeHTML(occupant.occupantName ?? '') +
'' +
'
'
}
}
panelBlockElement.innerHTML =
'' +
('
' +
'' +
(milestone.workOrderMilestoneCompletionDate
? ''
: '') +
'' +
'
') +
('
' +
(milestone.workOrderMilestoneTime === 0
? ''
: milestone.workOrderMilestoneTimeString + '
') +
(milestone.workOrderMilestoneTypeId
? '' +
cityssm.escapeHTML(milestone.workOrderMilestoneType!) +
'
'
: '') +
'' +
cityssm.escapeHTML(milestone.workOrderMilestoneDescription!) +
'' +
'
') +
('
') +
('
' + lotOccupancyHTML + '
') +
'
'
;(currentPanelElement as HTMLElement).append(panelBlockElement)
}
milestoneCalendarContainerElement.append(currentPanelElement!)
}
function getMilestones(event?: Event): void {
if (event) {
event.preventDefault()
}
milestoneCalendarContainerElement.innerHTML = los.getLoadingParagraphHTML(
'Loading Milestones...'
)
cityssm.postJSON(
los.urlPrefix + '/workOrders/doGetWorkOrderMilestones',
workOrderSearchFiltersFormElement,
(responseJSON: {
workOrderMilestones: recordTypes.WorkOrderMilestone[]
}) => {
renderMilestones(responseJSON.workOrderMilestones)
}
)
}
workOrderMilestoneDateFilterElement.addEventListener('change', () => {
workOrderMilestoneDateStringElement.closest('fieldset')!.disabled =
workOrderMilestoneDateFilterElement.value !== 'date'
getMilestones()
})
los.initializeDatePickers(workOrderSearchFiltersFormElement)
workOrderMilestoneDateStringElement.addEventListener('change', getMilestones)
workOrderSearchFiltersFormElement.addEventListener('submit', getMilestones)
getMilestones()
})()