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 @@
@@ -626,7 +632,9 @@
Place of Death
-
+
@@ -858,11 +866,15 @@
<% } %>
+
+
<%- include('_footerA'); -%>
-
+
+<% } %>
<% if (!isCreate) { %>