/* eslint-disable spaced-comment, @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ import type * as globalTypes from '../../types/globalTypes' import type * as recordTypes from '../../types/recordTypes' import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types' import type { BulmaJS } from '@cityssm/bulma-js/types' declare const cityssm: cityssmGlobal declare const bulmaJS: BulmaJS ;(() => { const los = exports.los as globalTypes.LOS const lotOccupancyId = ( document.querySelector('#lotOccupancy--lotOccupancyId') as HTMLInputElement ).value const isCreate = lotOccupancyId === '' /* * Main form */ let refreshAfterSave = isCreate function setUnsavedChanges(): void { los.setUnsavedChanges() document .querySelector("button[type='submit'][form='form--lotOccupancy']") ?.classList.remove('is-light') } function clearUnsavedChanges(): void { los.clearUnsavedChanges() document .querySelector("button[type='submit'][form='form--lotOccupancy']") ?.classList.add('is-light') } const formElement = document.querySelector( '#form--lotOccupancy' ) as HTMLFormElement formElement.addEventListener('submit', (formEvent) => { formEvent.preventDefault() cityssm.postJSON( los.urlPrefix + '/lotOccupancies/' + (isCreate ? 'doCreateLotOccupancy' : 'doUpdateLotOccupancy'), formElement, (rawResponseJSON) => { const responseJSON = rawResponseJSON as { success: boolean lotOccupancyId?: number errorMessage?: string } if (responseJSON.success) { clearUnsavedChanges() if (isCreate || refreshAfterSave) { window.location.href = los.getLotOccupancyURL( responseJSON.lotOccupancyId, true, true ) } else { bulmaJS.alert({ message: `${los.escapedAliases.Occupancy} Updated Successfully`, contextualColorName: 'success' }) } } else { bulmaJS.alert({ title: 'Error Saving ' + los.escapedAliases.Occupancy, message: responseJSON.errorMessage ?? '', contextualColorName: 'danger' }) } } ) }) const formInputElements = formElement.querySelectorAll('input, select') for (const formInputElement of formInputElements) { formInputElement.addEventListener('change', setUnsavedChanges) } function doCopy(): void { cityssm.postJSON( los.urlPrefix + '/lotOccupancies/doCopyLotOccupancy', { lotOccupancyId }, (rawResponseJSON) => { const responseJSON = rawResponseJSON as { success: boolean errorMessage?: string lotOccupancyId?: number } if (responseJSON.success) { clearUnsavedChanges() window.location.href = los.getLotOccupancyURL( responseJSON.lotOccupancyId, true ) } else { bulmaJS.alert({ title: 'Error Copying Record', message: responseJSON.errorMessage ?? '', contextualColorName: 'danger' }) } } ) } document .querySelector('#button--copyLotOccupancy') ?.addEventListener('click', (clickEvent) => { clickEvent.preventDefault() if (los.hasUnsavedChanges()) { bulmaJS.alert({ title: 'Unsaved Changes', message: 'Please save all unsaved changes before continuing.', contextualColorName: 'warning' }) } else { bulmaJS.confirm({ title: `Copy ${los.escapedAliases.Occupancy} Record as New`, message: 'Are you sure you want to copy this record to a new record?', contextualColorName: 'info', okButton: { text: 'Yes, Copy', callbackFunction: doCopy } }) } }) document .querySelector('#button--deleteLotOccupancy') ?.addEventListener('click', (clickEvent) => { clickEvent.preventDefault() function doDelete(): void { cityssm.postJSON( los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancy', { lotOccupancyId }, (rawResponseJSON) => { const responseJSON = rawResponseJSON as { success: boolean errorMessage?: string } if (responseJSON.success) { clearUnsavedChanges() window.location.href = los.getLotOccupancyURL() } else { bulmaJS.alert({ title: 'Error Deleting Record', message: responseJSON.errorMessage ?? '', contextualColorName: 'danger' }) } } ) } bulmaJS.confirm({ title: `Delete ${los.escapedAliases.Occupancy} Record`, message: 'Are you sure you want to delete this record?', contextualColorName: 'warning', okButton: { text: 'Yes, Delete', callbackFunction: doDelete } }) }) document .querySelector('#button--createWorkOrder') ?.addEventListener('click', (clickEvent) => { clickEvent.preventDefault() let createCloseModalFunction: () => void function doCreate(formEvent: SubmitEvent): void { formEvent.preventDefault() cityssm.postJSON( los.urlPrefix + '/workOrders/doCreateWorkOrder', formEvent.currentTarget, (rawResponseJSON) => { const responseJSON = rawResponseJSON as { success: boolean errorMessage?: string workOrderId?: number } if (responseJSON.success) { createCloseModalFunction() bulmaJS.confirm({ title: 'Work Order Created Successfully', message: 'Would you like to open the work order now?', contextualColorName: 'success', okButton: { text: 'Yes, Open the Work Order', callbackFunction: () => { window.location.href = los.getWorkOrderURL( responseJSON.workOrderId, true ) } } }) } else { bulmaJS.alert({ title: 'Error Creating Work Order', message: responseJSON.errorMessage as string, contextualColorName: 'danger' }) } } ) } cityssm.openHtmlModal('lotOccupancy-createWorkOrder', { onshow(modalElement) { ;( modalElement.querySelector( '#workOrderCreate--lotOccupancyId' ) as HTMLInputElement ).value = lotOccupancyId ;( modalElement.querySelector( '#workOrderCreate--workOrderOpenDateString' ) as HTMLInputElement ).value = cityssm.dateToString(new Date()) const workOrderTypeSelectElement = modalElement.querySelector( '#workOrderCreate--workOrderTypeId' ) as HTMLSelectElement const workOrderTypes = exports.workOrderTypes as recordTypes.WorkOrderType[] if (workOrderTypes.length === 1) { workOrderTypeSelectElement.innerHTML = '' } for (const workOrderType of workOrderTypes) { const optionElement = document.createElement('option') optionElement.value = workOrderType.workOrderTypeId.toString() optionElement.textContent = workOrderType.workOrderType ?? '' workOrderTypeSelectElement.append(optionElement) } }, onshown(modalElement, closeModalFunction) { createCloseModalFunction = closeModalFunction bulmaJS.toggleHtmlClipped() ;( modalElement.querySelector( '#workOrderCreate--workOrderTypeId' ) as HTMLSelectElement ).focus() modalElement .querySelector('form') ?.addEventListener('submit', doCreate) }, onremoved() { bulmaJS.toggleHtmlClipped() ;( document.querySelector( '#button--createWorkOrder' ) as HTMLButtonElement ).focus() } }) }) // Occupancy Type const occupancyTypeIdElement = document.querySelector( '#lotOccupancy--occupancyTypeId' ) as HTMLSelectElement if (isCreate) { const lotOccupancyFieldsContainerElement = document.querySelector( '#container--lotOccupancyFields' ) as HTMLElement occupancyTypeIdElement.addEventListener('change', () => { if (occupancyTypeIdElement.value === '') { lotOccupancyFieldsContainerElement.innerHTML = `
` return } cityssm.postJSON( los.urlPrefix + '/lotOccupancies/doGetOccupancyTypeFields', { occupancyTypeId: occupancyTypeIdElement.value }, (rawResponseJSON) => { const responseJSON = rawResponseJSON as { occupancyTypeFields: recordTypes.OccupancyTypeField[] } if (responseJSON.occupancyTypeFields.length === 0) { lotOccupancyFieldsContainerElement.innerHTML = `` return } lotOccupancyFieldsContainerElement.innerHTML = '' let occupancyTypeFieldIds = '' for (const occupancyTypeField of responseJSON.occupancyTypeFields) { occupancyTypeFieldIds += ',' + occupancyTypeField.occupancyTypeFieldId!.toString() const fieldName = 'lotOccupancyFieldValue_' + occupancyTypeField.occupancyTypeFieldId!.toString() const fieldId = 'lotOccupancy--' + fieldName const fieldElement = document.createElement('div') fieldElement.className = 'field' fieldElement.innerHTML = `` ;( fieldElement.querySelector('label') as HTMLLabelElement ).textContent = occupancyTypeField.occupancyTypeField as string if ((occupancyTypeField.occupancyTypeFieldValues ?? '') === '') { const inputElement = document.createElement('input') inputElement.className = 'input' inputElement.id = fieldId inputElement.name = fieldName inputElement.type = 'text' inputElement.required = occupancyTypeField.isRequired as boolean inputElement.minLength = occupancyTypeField.minimumLength as number inputElement.maxLength = occupancyTypeField.maximumLength as number if ((occupancyTypeField.pattern ?? '') !== '') { inputElement.pattern = occupancyTypeField.pattern! } ;(fieldElement.querySelector('.control') as HTMLElement).append( inputElement ) } else { ;( fieldElement.querySelector('.control') as HTMLElement ).innerHTML = `