diff --git a/app.js b/app.js index ded35b89..382f615f 100644 --- a/app.js +++ b/app.js @@ -1,5 +1,5 @@ import path from 'node:path'; -import * as dateTimeFns from '@cityssm/utils-datetime'; +import * as dateTimeFunctions from '@cityssm/utils-datetime'; import compression from 'compression'; import cookieParser from 'cookie-parser'; import csurf from 'csurf'; @@ -129,7 +129,7 @@ app.use((request, response, next) => { response.locals.csrfToken = request.csrfToken(); response.locals.configFunctions = configFunctions; response.locals.printFunctions = printFunctions; - response.locals.dateTimeFunctions = dateTimeFns; + response.locals.dateTimeFunctions = dateTimeFunctions; response.locals.urlPrefix = configFunctions.getConfigProperty('reverseProxy.urlPrefix'); next(); }); diff --git a/app.ts b/app.ts index 3e813ff6..e60ea184 100644 --- a/app.ts +++ b/app.ts @@ -1,6 +1,6 @@ import path from 'node:path' -import * as dateTimeFns from '@cityssm/utils-datetime' +import * as dateTimeFunctions from '@cityssm/utils-datetime' import compression from 'compression' import cookieParser from 'cookie-parser' import csurf from 'csurf' @@ -230,7 +230,7 @@ app.use((request, response, next) => { response.locals.configFunctions = configFunctions response.locals.printFunctions = printFunctions - response.locals.dateTimeFunctions = dateTimeFns + response.locals.dateTimeFunctions = dateTimeFunctions response.locals.urlPrefix = configFunctions.getConfigProperty( 'reverseProxy.urlPrefix' diff --git a/handlers/api-get/milestoneICS.js b/handlers/api-get/milestoneICS.js index 7cab7229..298154e9 100644 --- a/handlers/api-get/milestoneICS.js +++ b/handlers/api-get/milestoneICS.js @@ -42,7 +42,7 @@ function buildEventSummary(milestone) { // eslint-disable-next-line @typescript-eslint/naming-convention function buildEventDescriptionHTML_occupancies(request, milestone) { let descriptionHTML = ''; - if (milestone.workOrderContracts.length > 0) { + if ((milestone.workOrderContracts ?? []).length > 0) { const urlRoot = getUrlRoot(request); descriptionHTML = `

Related Contracts @@ -248,7 +248,7 @@ export default async function handler(request, response) { const location = buildEventLocation(milestone); calendarEvent.location(location); // Set organizer / attendees - if (milestone.workOrderContracts.length > 0) { + if ((milestone.workOrderContracts ?? []).length > 0) { let organizerSet = false; for (const contract of milestone.workOrderContracts ?? []) { for (const interment of contract.contractInterments ?? []) { diff --git a/handlers/api-get/milestoneICS.ts b/handlers/api-get/milestoneICS.ts index dae1dcff..4ec008df 100644 --- a/handlers/api-get/milestoneICS.ts +++ b/handlers/api-get/milestoneICS.ts @@ -75,7 +75,7 @@ function buildEventDescriptionHTML_occupancies( ): string { let descriptionHTML = '' - if (milestone.workOrderContracts!.length > 0) { + if ((milestone.workOrderContracts ?? []).length > 0) { const urlRoot = getUrlRoot(request) descriptionHTML = `

@@ -366,7 +366,7 @@ export default async function handler( calendarEvent.location(location) // Set organizer / attendees - if (milestone.workOrderContracts!.length > 0) { + if ((milestone.workOrderContracts ?? []).length > 0) { let organizerSet = false for (const contract of milestone.workOrderContracts ?? []) { for (const interment of contract.contractInterments ?? []) { diff --git a/public/javascripts/contract.editComments.js b/public/javascripts/contract.editComments.js index a7fb18ce..1ffd486f 100644 --- a/public/javascripts/contract.editComments.js +++ b/public/javascripts/contract.editComments.js @@ -9,8 +9,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); const contractCommentId = Number.parseInt(clickEvent.currentTarget.closest('tr')?.dataset .contractCommentId ?? '', 10); const contractComment = contractComments.find((currentComment) => currentComment.contractCommentId === contractCommentId); - let editFormElement = undefined; - let editCloseModalFunction = undefined; + let editFormElement; + let editCloseModalFunction; function editContractComment(submitEvent) { submitEvent.preventDefault(); cityssm.postJSON(`${sunrise.urlPrefix}/contracts/doUpdateContractComment`, editFormElement, (rawResponseJSON) => { diff --git a/public/javascripts/contract.editComments.ts b/public/javascripts/contract.editComments.ts index 69a051bc..0799e175 100644 --- a/public/javascripts/contract.editComments.ts +++ b/public/javascripts/contract.editComments.ts @@ -29,8 +29,8 @@ declare const exports: Record (currentComment) => currentComment.contractCommentId === contractCommentId ) as ContractComment - let editFormElement: HTMLFormElement | undefined = undefined - let editCloseModalFunction: (() => void) | undefined = undefined + let editFormElement: HTMLFormElement | undefined + let editCloseModalFunction: (() => void) | undefined function editContractComment(submitEvent: SubmitEvent): void { submitEvent.preventDefault() diff --git a/public/javascripts/workOrder.edit.js b/public/javascripts/workOrder.edit.js index 0e822e08..e11a9a8b 100644 --- a/public/javascripts/workOrder.edit.js +++ b/public/javascripts/workOrder.edit.js @@ -419,81 +419,88 @@ Object.defineProperty(exports, "__esModule", { value: true }); ?.addEventListener('click', deleteMilestone); milestonesPanelElement.append(panelBlockElement); } + if (workOrderMilestones.length === 0) { + milestonesPanelElement.insertAdjacentHTML('beforeend', `
+
+

There are no milestones on this work order.

+
+
`); + } bulmaJS.init(milestonesPanelElement); } if (!isCreate) { workOrderMilestones = exports.workOrderMilestones; delete exports.workOrderMilestones; renderMilestones(); - document - .querySelector('#button--addMilestone') - ?.addEventListener('click', () => { - let addFormElement; - let workOrderMilestoneDateStringElement; - let addCloseModalFunction; - function doAdd(submitEvent) { - if (submitEvent) { - submitEvent.preventDefault(); - } - const currentDateString = cityssm.dateToString(new Date()); - function _doAdd() { - cityssm.postJSON(`${sunrise.urlPrefix}/workOrders/doAddWorkOrderMilestone`, addFormElement, (rawResponseJSON) => { - const responseJSON = rawResponseJSON; - processMilestoneResponse(responseJSON); - if (responseJSON.success) { - addCloseModalFunction(); - } - }); - } - const milestoneDateString = workOrderMilestoneDateStringElement.value; - if (milestoneDateString !== '' && - milestoneDateString < currentDateString) { - bulmaJS.confirm({ - title: 'Milestone Date in the Past', - message: 'Are you sure you want to create a milestone with a date in the past?', - contextualColorName: 'warning', - okButton: { - text: 'Yes, Create a Past Milestone', - callbackFunction: _doAdd - } - }); - } - else { - _doAdd(); - } - } - cityssm.openHtmlModal('workOrder-addMilestone', { - onshow(modalElement) { - ; - modalElement.querySelector('#milestoneAdd--workOrderId').value = workOrderId; - const milestoneTypeElement = modalElement.querySelector('#milestoneAdd--workOrderMilestoneTypeId'); - for (const milestoneType of exports.workOrderMilestoneTypes) { - const optionElement = document.createElement('option'); - optionElement.value = - milestoneType.workOrderMilestoneTypeId.toString(); - optionElement.textContent = milestoneType.workOrderMilestoneType; - milestoneTypeElement.append(optionElement); - } - workOrderMilestoneDateStringElement = modalElement.querySelector('#milestoneAdd--workOrderMilestoneDateString'); - workOrderMilestoneDateStringElement.valueAsDate = new Date(); - }, - onshown(modalElement, closeModalFunction) { - addCloseModalFunction = closeModalFunction; - bulmaJS.toggleHtmlClipped(); - modalElement.querySelector('#milestoneAdd--workOrderMilestoneTypeId').focus(); - addFormElement = modalElement.querySelector('form'); - addFormElement.addEventListener('submit', doAdd); - const conflictingMilestonePanelElement = document.querySelector('#milestoneAdd--conflictingMilestonesPanel'); - workOrderMilestoneDateStringElement.addEventListener('change', () => { - refreshConflictingMilestones(workOrderMilestoneDateStringElement.value, conflictingMilestonePanelElement); - }); - refreshConflictingMilestones(workOrderMilestoneDateStringElement.value, conflictingMilestonePanelElement); - }, - onremoved() { - bulmaJS.toggleHtmlClipped(); - document.querySelector('#button--addMilestone').focus(); - } - }); - }); } + document + .querySelector('#button--addMilestone') + ?.addEventListener('click', () => { + let addFormElement; + let workOrderMilestoneDateStringElement; + let addCloseModalFunction; + function doAdd(submitEvent) { + if (submitEvent) { + submitEvent.preventDefault(); + } + const currentDateString = cityssm.dateToString(new Date()); + function _doAdd() { + cityssm.postJSON(`${sunrise.urlPrefix}/workOrders/doAddWorkOrderMilestone`, addFormElement, (rawResponseJSON) => { + const responseJSON = rawResponseJSON; + processMilestoneResponse(responseJSON); + if (responseJSON.success) { + addCloseModalFunction(); + } + }); + } + const milestoneDateString = workOrderMilestoneDateStringElement.value; + if (milestoneDateString !== '' && + milestoneDateString < currentDateString) { + bulmaJS.confirm({ + title: 'Milestone Date in the Past', + message: 'Are you sure you want to create a milestone with a date in the past?', + contextualColorName: 'warning', + okButton: { + text: 'Yes, Create a Past Milestone', + callbackFunction: _doAdd + } + }); + } + else { + _doAdd(); + } + } + cityssm.openHtmlModal('workOrder-addMilestone', { + onshow(modalElement) { + ; + modalElement.querySelector('#milestoneAdd--workOrderId').value = workOrderId; + const milestoneTypeElement = modalElement.querySelector('#milestoneAdd--workOrderMilestoneTypeId'); + for (const milestoneType of exports.workOrderMilestoneTypes) { + const optionElement = document.createElement('option'); + optionElement.value = + milestoneType.workOrderMilestoneTypeId.toString(); + optionElement.textContent = milestoneType.workOrderMilestoneType; + milestoneTypeElement.append(optionElement); + } + workOrderMilestoneDateStringElement = modalElement.querySelector('#milestoneAdd--workOrderMilestoneDateString'); + workOrderMilestoneDateStringElement.valueAsDate = new Date(); + }, + onshown(modalElement, closeModalFunction) { + addCloseModalFunction = closeModalFunction; + bulmaJS.toggleHtmlClipped(); + modalElement.querySelector('#milestoneAdd--workOrderMilestoneTypeId').focus(); + addFormElement = modalElement.querySelector('form'); + addFormElement.addEventListener('submit', doAdd); + const conflictingMilestonePanelElement = document.querySelector('#milestoneAdd--conflictingMilestonesPanel'); + workOrderMilestoneDateStringElement.addEventListener('change', () => { + refreshConflictingMilestones(workOrderMilestoneDateStringElement.value, conflictingMilestonePanelElement); + }); + refreshConflictingMilestones(workOrderMilestoneDateStringElement.value, conflictingMilestonePanelElement); + }, + onremoved() { + bulmaJS.toggleHtmlClipped(); + document.querySelector('#button--addMilestone').focus(); + } + }); + }); })(); diff --git a/public/javascripts/workOrder.edit.ts b/public/javascripts/workOrder.edit.ts index eca25183..978a11a4 100644 --- a/public/javascripts/workOrder.edit.ts +++ b/public/javascripts/workOrder.edit.ts @@ -666,6 +666,17 @@ declare const exports: Record milestonesPanelElement.append(panelBlockElement) } + if (workOrderMilestones.length === 0) { + milestonesPanelElement.insertAdjacentHTML( + 'beforeend', + `
+
+

There are no milestones on this work order.

+
+
` + ) + } + bulmaJS.init(milestonesPanelElement) } @@ -674,133 +685,126 @@ declare const exports: Record delete exports.workOrderMilestones renderMilestones() + } - document - .querySelector('#button--addMilestone') - ?.addEventListener('click', () => { - let addFormElement: HTMLFormElement - let workOrderMilestoneDateStringElement: HTMLInputElement - let addCloseModalFunction: () => void + document + .querySelector('#button--addMilestone') + ?.addEventListener('click', () => { + let addFormElement: HTMLFormElement + let workOrderMilestoneDateStringElement: HTMLInputElement + let addCloseModalFunction: () => void - function doAdd(submitEvent?: SubmitEvent): void { - if (submitEvent) { - submitEvent.preventDefault() - } - - const currentDateString = cityssm.dateToString(new Date()) - - function _doAdd(): void { - cityssm.postJSON( - `${sunrise.urlPrefix}/workOrders/doAddWorkOrderMilestone`, - addFormElement, - (rawResponseJSON) => { - const responseJSON = rawResponseJSON as { - success: boolean - errorMessage?: string - workOrderMilestones?: WorkOrderMilestone[] - } - - processMilestoneResponse(responseJSON) - - if (responseJSON.success) { - addCloseModalFunction() - } - } - ) - } - - const milestoneDateString = workOrderMilestoneDateStringElement.value - - if ( - milestoneDateString !== '' && - milestoneDateString < currentDateString - ) { - bulmaJS.confirm({ - title: 'Milestone Date in the Past', - message: - 'Are you sure you want to create a milestone with a date in the past?', - contextualColorName: 'warning', - okButton: { - text: 'Yes, Create a Past Milestone', - callbackFunction: _doAdd - } - }) - } else { - _doAdd() - } + function doAdd(submitEvent?: SubmitEvent): void { + if (submitEvent) { + submitEvent.preventDefault() } - cityssm.openHtmlModal('workOrder-addMilestone', { - onshow(modalElement) { - ;( - modalElement.querySelector( - '#milestoneAdd--workOrderId' - ) as HTMLInputElement - ).value = workOrderId + const currentDateString = cityssm.dateToString(new Date()) - const milestoneTypeElement = modalElement.querySelector( + function _doAdd(): void { + cityssm.postJSON( + `${sunrise.urlPrefix}/workOrders/doAddWorkOrderMilestone`, + addFormElement, + (rawResponseJSON) => { + const responseJSON = rawResponseJSON as { + success: boolean + errorMessage?: string + workOrderMilestones?: WorkOrderMilestone[] + } + + processMilestoneResponse(responseJSON) + + if (responseJSON.success) { + addCloseModalFunction() + } + } + ) + } + + const milestoneDateString = workOrderMilestoneDateStringElement.value + + if ( + milestoneDateString !== '' && + milestoneDateString < currentDateString + ) { + bulmaJS.confirm({ + title: 'Milestone Date in the Past', + message: + 'Are you sure you want to create a milestone with a date in the past?', + contextualColorName: 'warning', + okButton: { + text: 'Yes, Create a Past Milestone', + callbackFunction: _doAdd + } + }) + } else { + _doAdd() + } + } + + cityssm.openHtmlModal('workOrder-addMilestone', { + onshow(modalElement) { + ;( + modalElement.querySelector( + '#milestoneAdd--workOrderId' + ) as HTMLInputElement + ).value = workOrderId + + const milestoneTypeElement = modalElement.querySelector( + '#milestoneAdd--workOrderMilestoneTypeId' + ) as HTMLSelectElement + + for (const milestoneType of exports.workOrderMilestoneTypes as WorkOrderMilestoneType[]) { + const optionElement = document.createElement('option') + + optionElement.value = + milestoneType.workOrderMilestoneTypeId.toString() + optionElement.textContent = milestoneType.workOrderMilestoneType + + milestoneTypeElement.append(optionElement) + } + + workOrderMilestoneDateStringElement = modalElement.querySelector( + '#milestoneAdd--workOrderMilestoneDateString' + ) as HTMLInputElement + + workOrderMilestoneDateStringElement.valueAsDate = new Date() + }, + onshown(modalElement, closeModalFunction) { + addCloseModalFunction = closeModalFunction + + bulmaJS.toggleHtmlClipped() + ;( + modalElement.querySelector( '#milestoneAdd--workOrderMilestoneTypeId' ) as HTMLSelectElement + ).focus() - for (const milestoneType of exports.workOrderMilestoneTypes as WorkOrderMilestoneType[]) { - const optionElement = document.createElement('option') + addFormElement = modalElement.querySelector('form') as HTMLFormElement + addFormElement.addEventListener('submit', doAdd) - optionElement.value = - milestoneType.workOrderMilestoneTypeId.toString() - optionElement.textContent = milestoneType.workOrderMilestoneType - - milestoneTypeElement.append(optionElement) - } - - workOrderMilestoneDateStringElement = modalElement.querySelector( - '#milestoneAdd--workOrderMilestoneDateString' - ) as HTMLInputElement - - workOrderMilestoneDateStringElement.valueAsDate = new Date() - }, - onshown(modalElement, closeModalFunction) { - addCloseModalFunction = closeModalFunction - - bulmaJS.toggleHtmlClipped() - ;( - modalElement.querySelector( - '#milestoneAdd--workOrderMilestoneTypeId' - ) as HTMLSelectElement - ).focus() - - addFormElement = modalElement.querySelector( - 'form' - ) as HTMLFormElement - addFormElement.addEventListener('submit', doAdd) - - const conflictingMilestonePanelElement = document.querySelector( - '#milestoneAdd--conflictingMilestonesPanel' - ) as HTMLElement - - workOrderMilestoneDateStringElement.addEventListener( - 'change', - () => { - refreshConflictingMilestones( - workOrderMilestoneDateStringElement.value, - conflictingMilestonePanelElement - ) - } - ) + const conflictingMilestonePanelElement = document.querySelector( + '#milestoneAdd--conflictingMilestonesPanel' + ) as HTMLElement + workOrderMilestoneDateStringElement.addEventListener('change', () => { refreshConflictingMilestones( workOrderMilestoneDateStringElement.value, conflictingMilestonePanelElement ) - }, - onremoved() { - bulmaJS.toggleHtmlClipped() - ;( - document.querySelector( - '#button--addMilestone' - ) as HTMLButtonElement - ).focus() - } - }) + }) + + refreshConflictingMilestones( + workOrderMilestoneDateStringElement.value, + conflictingMilestonePanelElement + ) + }, + onremoved() { + bulmaJS.toggleHtmlClipped() + ;( + document.querySelector('#button--addMilestone') as HTMLButtonElement + ).focus() + } }) - } + }) })() diff --git a/types/recordTypes.d.ts b/types/recordTypes.d.ts index 2c98c3eb..970440ab 100644 --- a/types/recordTypes.d.ts +++ b/types/recordTypes.d.ts @@ -1,4 +1,4 @@ -import type { DateString, TimeString } from "@cityssm/utils-datetime"; +import type { DateString, TimeString } from '@cityssm/utils-datetime'; export interface Record { recordCreate_userName?: string; recordCreate_timeMillis?: number; @@ -199,7 +199,7 @@ export interface ContractInterment extends Record { deathDate?: number; deathDateString?: DateString; deathPlace?: string; - deathAge?: number; + deathAge?: number | null; deathAgePeriod?: string; intermentContainerTypeId?: number; intermentContainerType?: string; @@ -260,6 +260,7 @@ export interface Contract extends Record { funeralDateString?: DateString; funeralTime?: number; funeralTimeString?: TimeString; + funeralTimePeriodString?: string; committalTypeId?: number; committalType?: string; contractFields?: ContractField[]; diff --git a/types/recordTypes.ts b/types/recordTypes.ts index 6539d464..81d2ea22 100644 --- a/types/recordTypes.ts +++ b/types/recordTypes.ts @@ -1,4 +1,4 @@ -import type { DateString, TimeString } from "@cityssm/utils-datetime" +import type { DateString, TimeString } from '@cityssm/utils-datetime' export interface Record { recordCreate_userName?: string @@ -146,7 +146,7 @@ export interface ContractTypeField { contractTypeFieldId: number contractTypeId?: number contractTypeField?: string - + fieldType: string fieldValues?: string isRequired?: boolean @@ -240,7 +240,7 @@ export interface CommittalType extends Record { export interface ContractInterment extends Record { contractId?: number intermentNumber?: number - + deceasedName?: string deceasedAddress1?: string deceasedAddress2?: string @@ -254,8 +254,8 @@ export interface ContractInterment extends Record { deathDate?: number deathDateString?: DateString - deathPlace?: string - deathAge?: number + deathPlace?: string + deathAge?: number | null deathAgePeriod?: string intermentContainerTypeId?: number @@ -299,7 +299,7 @@ export interface Contract extends Record { burialSiteTypeId?: number burialSiteType?: string burialSiteName?: string - + cemeteryId?: number cemeteryName?: string @@ -315,7 +315,7 @@ export interface Contract extends Record { purchaserCity: string purchaserProvince: string purchaserPostalCode: string - purchaserPhoneNumber: string + purchaserPhoneNumber: string purchaserEmail: string purchaserRelationship: string @@ -331,8 +331,11 @@ export interface Contract extends Record { funeralDate?: number funeralDateString?: DateString + funeralTime?: number funeralTimeString?: TimeString + funeralTimePeriodString?: string + committalTypeId?: number committalType?: string diff --git a/views/admin-burialSiteTypes.ejs b/views/admin-burialSiteTypes.ejs index 4895aea5..9205a1d2 100644 --- a/views/admin-burialSiteTypes.ejs +++ b/views/admin-burialSiteTypes.ejs @@ -5,45 +5,45 @@ <%- include('_menu-admin'); -%>
- - -
- -
- -
+
+ + + + +
+
+

+ Burial Site Type Management +

- -
+
+ +
+
+ +
<%- include('_footerA'); -%> diff --git a/views/contract-edit.ejs b/views/contract-edit.ejs index 6404d88b..880bca4c 100644 --- a/views/contract-edit.ejs +++ b/views/contract-edit.ejs @@ -368,7 +368,7 @@
- +
@@ -451,7 +451,9 @@
- +
@@ -560,7 +562,9 @@
- +
@@ -601,7 +605,9 @@ Place of Birth
- +
@@ -626,7 +632,9 @@ Place of Death
- +
@@ -858,11 +866,15 @@
<% } %> + + + <%- include('_footerA'); -%> - + +<% } %> <% if (!isCreate) { %>