From c7640f6dfd8d3e3df78a3affd9f8c87366ab05c5 Mon Sep 17 00:00:00 2001 From: Dan Gowans Date: Fri, 25 Apr 2025 14:18:24 -0400 Subject: [PATCH] death age calculator closes #9 --- public/html/contract-addInterment.html | 5 ++ public/html/contract-editInterment.html | 5 ++ public/javascripts/contract.edit.js | 40 ++++++++- public/javascripts/contract.edit.ts | 72 +++++++++++++++- public/javascripts/contract.editInterments.js | 44 ++++++++++ public/javascripts/contract.editInterments.ts | 83 +++++++++++++++++++ views/contract-edit.ejs | 5 ++ 7 files changed, 249 insertions(+), 5 deletions(-) diff --git a/public/html/contract-addInterment.html b/public/html/contract-addInterment.html index 0411310b..d55650b0 100644 --- a/public/html/contract-addInterment.html +++ b/public/html/contract-addInterment.html @@ -177,6 +177,11 @@
+
+ +
diff --git a/public/html/contract-editInterment.html b/public/html/contract-editInterment.html index 252fa86b..9433e560 100644 --- a/public/html/contract-editInterment.html +++ b/public/html/contract-editInterment.html @@ -184,6 +184,11 @@
+
+ +
diff --git a/public/javascripts/contract.edit.js b/public/javascripts/contract.edit.js index 27402538..a765aa4c 100644 --- a/public/javascripts/contract.edit.js +++ b/public/javascripts/contract.edit.js @@ -435,7 +435,43 @@ Object.defineProperty(exports, "__esModule", { value: true }); } setUnsavedChanges(); }); - sunrise.initializeMinDateUpdate(document.querySelector('#contract--birthDateString'), document.querySelector('#contract--deathDateString')); - sunrise.initializeMinDateUpdate(document.querySelector('#contract--deathDateString'), document.querySelector('#contract--funeralDateString')); + const birthDateStringElement = document.querySelector('#contract--birthDateString'); + const deathDateStringElement = document.querySelector('#contract--deathDateString'); + sunrise.initializeMinDateUpdate(birthDateStringElement, deathDateStringElement); + sunrise.initializeMinDateUpdate(deathDateStringElement, document.querySelector('#contract--funeralDateString')); + const calculateDeathAgeButtonElement = document.querySelector('#button--calculateDeathAge'); + function toggleDeathAgeCalculatorButton() { + if (birthDateStringElement.value === '' || + deathDateStringElement.value === '') { + calculateDeathAgeButtonElement.setAttribute('disabled', 'disabled'); + } + else { + calculateDeathAgeButtonElement.removeAttribute('disabled'); + } + } + birthDateStringElement.addEventListener('change', toggleDeathAgeCalculatorButton); + deathDateStringElement.addEventListener('change', toggleDeathAgeCalculatorButton); + calculateDeathAgeButtonElement.addEventListener('click', (clickEvent) => { + clickEvent.preventDefault(); + const birthDate = new Date(birthDateStringElement.value); + const deathDate = new Date(deathDateStringElement.value); + const ageInDays = Math.floor((deathDate.getTime() - birthDate.getTime()) / (1000 * 60 * 60 * 24)); + const ageInYears = Math.floor(ageInDays / 365.25); + const deathAgeElement = document.querySelector('#contract--deathAge'); + const deathAgePeriodElement = document.querySelector('#contract--deathAgePeriod'); + if (ageInYears > 0) { + deathAgeElement.value = ageInYears.toString(); + deathAgePeriodElement.value = 'Years'; + } + else if (ageInDays > 0) { + deathAgeElement.value = ageInDays.toString(); + deathAgePeriodElement.value = 'Days'; + } + else { + deathAgeElement.value = '0'; + deathAgePeriodElement.value = 'Stillborn'; + } + setUnsavedChanges(); + }); } })(); diff --git a/public/javascripts/contract.edit.ts b/public/javascripts/contract.edit.ts index 6bc21049..db62ab89 100644 --- a/public/javascripts/contract.edit.ts +++ b/public/javascripts/contract.edit.ts @@ -724,14 +724,80 @@ declare const exports: { setUnsavedChanges() }) + const birthDateStringElement = document.querySelector( + '#contract--birthDateString' + ) as HTMLInputElement + + const deathDateStringElement = document.querySelector( + '#contract--deathDateString' + ) as HTMLInputElement + sunrise.initializeMinDateUpdate( - document.querySelector('#contract--birthDateString') as HTMLInputElement, - document.querySelector('#contract--deathDateString') as HTMLInputElement + birthDateStringElement, + deathDateStringElement ) sunrise.initializeMinDateUpdate( - document.querySelector('#contract--deathDateString') as HTMLInputElement, + deathDateStringElement, document.querySelector('#contract--funeralDateString') as HTMLInputElement ) + + const calculateDeathAgeButtonElement = document.querySelector( + '#button--calculateDeathAge' + ) as HTMLButtonElement + + function toggleDeathAgeCalculatorButton(): void { + if ( + birthDateStringElement.value === '' || + deathDateStringElement.value === '' + ) { + calculateDeathAgeButtonElement.setAttribute('disabled', 'disabled') + } else { + calculateDeathAgeButtonElement.removeAttribute('disabled') + } + } + + birthDateStringElement.addEventListener( + 'change', + toggleDeathAgeCalculatorButton + ) + deathDateStringElement.addEventListener( + 'change', + toggleDeathAgeCalculatorButton + ) + + calculateDeathAgeButtonElement.addEventListener('click', (clickEvent) => { + clickEvent.preventDefault() + + const birthDate = new Date(birthDateStringElement.value) + const deathDate = new Date(deathDateStringElement.value) + + const ageInDays = Math.floor( + (deathDate.getTime() - birthDate.getTime()) / (1000 * 60 * 60 * 24) + ) + + const ageInYears = Math.floor(ageInDays / 365.25) + + const deathAgeElement = document.querySelector( + '#contract--deathAge' + ) as HTMLInputElement + + const deathAgePeriodElement = document.querySelector( + '#contract--deathAgePeriod' + ) as HTMLInputElement + + if (ageInYears > 0) { + deathAgeElement.value = ageInYears.toString() + deathAgePeriodElement.value = 'Years' + } else if (ageInDays > 0) { + deathAgeElement.value = ageInDays.toString() + deathAgePeriodElement.value = 'Days' + } else { + deathAgeElement.value = '0' + deathAgePeriodElement.value = 'Stillborn' + } + + setUnsavedChanges() + }) } })() diff --git a/public/javascripts/contract.editInterments.js b/public/javascripts/contract.editInterments.js index 9dc5246c..4596bc2a 100644 --- a/public/javascripts/contract.editInterments.js +++ b/public/javascripts/contract.editInterments.js @@ -8,6 +8,48 @@ Object.defineProperty(exports, "__esModule", { value: true }); delete exports.deathAgePeriods; const intermentContainerTypes = exports.intermentContainerTypes; delete exports.intermentContainerTypes; + function initializeDeathAgeCalculator(fieldPrefix) { + const birthDateStringElement = document.querySelector(`#${fieldPrefix}--birthDateString`); + const deathDateStringElement = document.querySelector(`#${fieldPrefix}--deathDateString`); + const calculateDeathAgeButtonElement = document.querySelector('#button--calculateDeathAge'); + function toggleDeathAgeCalculatorButton() { + if (birthDateStringElement.value === '' || + deathDateStringElement.value === '') { + calculateDeathAgeButtonElement.setAttribute('disabled', 'disabled'); + } + else { + calculateDeathAgeButtonElement.removeAttribute('disabled'); + } + } + toggleDeathAgeCalculatorButton(); + birthDateStringElement.addEventListener('change', toggleDeathAgeCalculatorButton); + deathDateStringElement.addEventListener('change', toggleDeathAgeCalculatorButton); + const deathAgeElement = document.querySelector(`#${fieldPrefix}--deathAge`); + const deathAgePeriodElement = document.querySelector(`#${fieldPrefix}--deathAgePeriod`); + function calculateDeathAge() { + if (birthDateStringElement.value === '' || + deathDateStringElement.value === '') { + return; + } + const birthDate = new Date(birthDateStringElement.value); + const deathDate = new Date(deathDateStringElement.value); + const ageInDays = Math.floor((deathDate.getTime() - birthDate.getTime()) / (1000 * 60 * 60 * 24)); + const ageInYears = Math.floor(ageInDays / 365.25); + if (ageInYears > 0) { + deathAgeElement.value = ageInYears.toString(); + deathAgePeriodElement.value = 'Years'; + } + else if (ageInDays > 0) { + deathAgeElement.value = ageInDays.toString(); + deathAgePeriodElement.value = 'Days'; + } + else { + deathAgeElement.value = '0'; + deathAgePeriodElement.value = 'Stillborn'; + } + } + calculateDeathAgeButtonElement.addEventListener('click', calculateDeathAge); + } function openEditContractInterment(clickEvent) { const intermentNumber = clickEvent.currentTarget.closest('tr')?.dataset.intermentNumber; if (intermentNumber === undefined) { @@ -123,6 +165,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); modalElement .querySelector('form') ?.addEventListener('submit', submitForm); + initializeDeathAgeCalculator('contractIntermentEdit'); }, onremoved() { bulmaJS.toggleHtmlClipped(); @@ -290,6 +333,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); modalElement .querySelector('form') ?.addEventListener('submit', submitForm); + initializeDeathAgeCalculator('contractIntermentAdd'); }, onremoved() { bulmaJS.toggleHtmlClipped(); diff --git a/public/javascripts/contract.editInterments.ts b/public/javascripts/contract.editInterments.ts index 54d904bd..c941c19c 100644 --- a/public/javascripts/contract.editInterments.ts +++ b/public/javascripts/contract.editInterments.ts @@ -24,6 +24,83 @@ declare const exports: Record exports.intermentContainerTypes as IntermentContainerType[] delete exports.intermentContainerTypes + function initializeDeathAgeCalculator( + fieldPrefix: 'contractIntermentAdd' | 'contractIntermentEdit' + ): void { + const birthDateStringElement = document.querySelector( + `#${fieldPrefix}--birthDateString` + ) as HTMLInputElement + + const deathDateStringElement = document.querySelector( + `#${fieldPrefix}--deathDateString` + ) as HTMLInputElement + + const calculateDeathAgeButtonElement = document.querySelector( + '#button--calculateDeathAge' + ) as HTMLButtonElement + + function toggleDeathAgeCalculatorButton(): void { + if ( + birthDateStringElement.value === '' || + deathDateStringElement.value === '' + ) { + calculateDeathAgeButtonElement.setAttribute('disabled', 'disabled') + } else { + calculateDeathAgeButtonElement.removeAttribute('disabled') + } + } + + toggleDeathAgeCalculatorButton() + + birthDateStringElement.addEventListener( + 'change', + toggleDeathAgeCalculatorButton + ) + deathDateStringElement.addEventListener( + 'change', + toggleDeathAgeCalculatorButton + ) + + const deathAgeElement = document.querySelector( + `#${fieldPrefix}--deathAge` + ) as HTMLInputElement + + const deathAgePeriodElement = document.querySelector( + `#${fieldPrefix}--deathAgePeriod` + ) as HTMLSelectElement + + function calculateDeathAge(): void { + if ( + birthDateStringElement.value === '' || + deathDateStringElement.value === '' + ) { + return + } + + const birthDate = new Date(birthDateStringElement.value) + const deathDate = new Date(deathDateStringElement.value) + + const ageInDays = Math.floor( + (deathDate.getTime() - birthDate.getTime()) / (1000 * 60 * 60 * 24) + ) + + const ageInYears = Math.floor(ageInDays / 365.25) + + if (ageInYears > 0) { + deathAgeElement.value = ageInYears.toString() + deathAgePeriodElement.value = 'Years' + } else if (ageInDays > 0) { + deathAgeElement.value = ageInDays.toString() + deathAgePeriodElement.value = 'Days' + } else { + deathAgeElement.value = '0' + deathAgePeriodElement.value = 'Stillborn' + } + } + + calculateDeathAgeButtonElement.addEventListener('click', calculateDeathAge) + } + function openEditContractInterment(clickEvent: Event): void { const intermentNumber = (clickEvent.currentTarget as HTMLElement).closest( 'tr' @@ -198,7 +275,10 @@ declare const exports: Record modalElement .querySelector('form') ?.addEventListener('submit', submitForm) + + initializeDeathAgeCalculator('contractIntermentEdit') }, + onremoved() { bulmaJS.toggleHtmlClipped() } @@ -424,7 +504,10 @@ declare const exports: Record modalElement .querySelector('form') ?.addEventListener('submit', submitForm) + + initializeDeathAgeCalculator('contractIntermentAdd') }, + onremoved() { bulmaJS.toggleHtmlClipped() } diff --git a/views/contract-edit.ejs b/views/contract-edit.ejs index f03e0ffc..961e4fbd 100644 --- a/views/contract-edit.ejs +++ b/views/contract-edit.ejs @@ -687,6 +687,11 @@
+
+ +