burial site type management

deepsource-autofix-76c6eb20
Dan Gowans 2025-02-28 14:59:28 -05:00
parent 414a45041c
commit acbb14a4d2
23 changed files with 384 additions and 362 deletions

View File

@ -9,7 +9,7 @@ recordIdColumns.set('Contracts', 'contractId');
recordIdColumns.set('ContractComments', 'contractCommentId');
recordIdColumns.set('BurialSiteStatuses', 'burialSiteStatusId');
recordIdColumns.set('BurialSiteTypes', 'burialSiteTypeId');
recordIdColumns.set('BurialSiteTypeFields', 'burialSiteFieldTypeId');
recordIdColumns.set('BurialSiteTypeFields', 'burialSiteTypeFieldId');
recordIdColumns.set('Cemeteries', 'cemeteryId');
recordIdColumns.set('ContractTypes', 'contractTypeId');
recordIdColumns.set('ContractTypeFields', 'contractTypeFieldId');

View File

@ -30,7 +30,7 @@ recordIdColumns.set('Contracts', 'contractId')
recordIdColumns.set('ContractComments', 'contractCommentId')
recordIdColumns.set('BurialSiteStatuses', 'burialSiteStatusId')
recordIdColumns.set('BurialSiteTypes', 'burialSiteTypeId')
recordIdColumns.set('BurialSiteTypeFields', 'burialSiteFieldTypeId')
recordIdColumns.set('BurialSiteTypeFields', 'burialSiteTypeFieldId')
recordIdColumns.set('Cemeteries', 'cemeteryId')
recordIdColumns.set('ContractTypes', 'contractTypeId')
recordIdColumns.set('ContractTypeFields', 'contractTypeFieldId')

View File

@ -1,8 +1,8 @@
import { getBurialSiteTypes } from '../../helpers/functions.cache.js';
export default async function handler(_request, response) {
const lotTypes = await getBurialSiteTypes();
const burialSiteTypes = await getBurialSiteTypes();
response.render('admin-burialSiteTypes', {
headTitle: `Burial Site Type Management`,
lotTypes
burialSiteTypes
});
}

View File

@ -6,10 +6,10 @@ export default async function handler(
_request: Request,
response: Response
): Promise<void> {
const lotTypes = await getBurialSiteTypes()
const burialSiteTypes = await getBurialSiteTypes()
response.render('admin-burialSiteTypes', {
headTitle: `Burial Site Type Management`,
lotTypes
burialSiteTypes
})
}

View File

@ -1,5 +1,5 @@
import type { Request, Response } from 'express';
export default function handler(request: Request<unknown, unknown, {
lotType: string;
burialSiteType: string;
orderNumber?: string | number;
}>, response: Response): Promise<void>;

View File

@ -1,7 +1,7 @@
import addRecord from '../../database/addRecord.js';
import { getBurialSiteTypes } from '../../helpers/functions.cache.js';
export default async function handler(request, response) {
const burialSiteTypeId = await addRecord('BurialSiteTypes', request.body.lotType, request.body.orderNumber ?? -1, request.session.user);
const burialSiteTypeId = await addRecord('BurialSiteTypes', request.body.burialSiteType, request.body.orderNumber ?? -1, request.session.user);
const burialSiteTypes = await getBurialSiteTypes();
response.json({
success: true,

View File

@ -7,13 +7,13 @@ export default async function handler(
request: Request<
unknown,
unknown,
{ lotType: string; orderNumber?: string | number }
{ burialSiteType: string; orderNumber?: string | number }
>,
response: Response
): Promise<void> {
const burialSiteTypeId = await addRecord(
'BurialSiteTypes',
request.body.lotType,
request.body.burialSiteType,
request.body.orderNumber ?? -1,
request.session.user as User
)

View File

@ -1,4 +1,4 @@
import type { Request, Response } from 'express';
export default function handler(request: Request<unknown, unknown, {
lotTypeFieldId: string;
burialSiteTypeFieldId: string;
}>, response: Response): Promise<void>;

View File

@ -1,7 +1,7 @@
import { deleteRecord } from '../../database/deleteRecord.js';
import { getBurialSiteTypes } from '../../helpers/functions.cache.js';
export default async function handler(request, response) {
const success = await deleteRecord('BurialSiteTypeFields', request.body.lotTypeFieldId, request.session.user);
const success = await deleteRecord('BurialSiteTypeFields', request.body.burialSiteTypeFieldId, request.session.user);
const burialSiteTypes = await getBurialSiteTypes();
response.json({
success,

View File

@ -4,12 +4,12 @@ import { deleteRecord } from '../../database/deleteRecord.js'
import { getBurialSiteTypes } from '../../helpers/functions.cache.js'
export default async function handler(
request: Request<unknown, unknown, { lotTypeFieldId: string }>,
request: Request<unknown, unknown, { burialSiteTypeFieldId: string }>,
response: Response
): Promise<void> {
const success = await deleteRecord(
'BurialSiteTypeFields',
request.body.lotTypeFieldId as string,
request.body.burialSiteTypeFieldId as string,
request.session.user as User
)

View File

@ -1,5 +1,5 @@
import type { Request, Response } from 'express';
export default function handler(request: Request<unknown, unknown, {
lotTypeFieldId: string;
burialSiteTypeFieldId: string;
moveToEnd: '0' | '1';
}>, response: Response): Promise<void>;

View File

@ -2,8 +2,8 @@ import { moveBurialSiteTypeFieldDown, moveBurialSiteTypeFieldDownToBottom } from
import { getBurialSiteTypes } from '../../helpers/functions.cache.js';
export default async function handler(request, response) {
const success = request.body.moveToEnd === '1'
? await moveBurialSiteTypeFieldDownToBottom(request.body.lotTypeFieldId)
: await moveBurialSiteTypeFieldDown(request.body.lotTypeFieldId);
? await moveBurialSiteTypeFieldDownToBottom(request.body.burialSiteTypeFieldId)
: await moveBurialSiteTypeFieldDown(request.body.burialSiteTypeFieldId);
const burialSiteTypes = await getBurialSiteTypes();
response.json({
success,

View File

@ -10,14 +10,14 @@ export default async function handler(
request: Request<
unknown,
unknown,
{ lotTypeFieldId: string; moveToEnd: '0' | '1' }
{ burialSiteTypeFieldId: string; moveToEnd: '0' | '1' }
>,
response: Response
): Promise<void> {
const success =
request.body.moveToEnd === '1'
? await moveBurialSiteTypeFieldDownToBottom(request.body.lotTypeFieldId)
: await moveBurialSiteTypeFieldDown(request.body.lotTypeFieldId)
? await moveBurialSiteTypeFieldDownToBottom(request.body.burialSiteTypeFieldId)
: await moveBurialSiteTypeFieldDown(request.body.burialSiteTypeFieldId)
const burialSiteTypes = await getBurialSiteTypes()

View File

@ -1,5 +1,5 @@
import type { Request, Response } from 'express';
export default function handler(request: Request<unknown, unknown, {
lotTypeFieldId: string;
burialSiteTypeFieldId: string;
moveToEnd: '0' | '1';
}>, response: Response): Promise<void>;

View File

@ -2,8 +2,8 @@ import { moveBurialSiteTypeFieldUp, moveBurialSiteTypeFieldUpToTop } from '../..
import { getBurialSiteTypes } from '../../helpers/functions.cache.js';
export default async function handler(request, response) {
const success = request.body.moveToEnd === '1'
? await moveBurialSiteTypeFieldUpToTop(request.body.lotTypeFieldId)
: await moveBurialSiteTypeFieldUp(request.body.lotTypeFieldId);
? await moveBurialSiteTypeFieldUpToTop(request.body.burialSiteTypeFieldId)
: await moveBurialSiteTypeFieldUp(request.body.burialSiteTypeFieldId);
const burialSiteTypes = await getBurialSiteTypes();
response.json({
success,

View File

@ -10,14 +10,14 @@ export default async function handler(
request: Request<
unknown,
unknown,
{ lotTypeFieldId: string; moveToEnd: '0' | '1' }
{ burialSiteTypeFieldId: string; moveToEnd: '0' | '1' }
>,
response: Response
): Promise<void> {
const success =
request.body.moveToEnd === '1'
? await moveBurialSiteTypeFieldUpToTop(request.body.lotTypeFieldId)
: await moveBurialSiteTypeFieldUp(request.body.lotTypeFieldId)
? await moveBurialSiteTypeFieldUpToTop(request.body.burialSiteTypeFieldId)
: await moveBurialSiteTypeFieldUp(request.body.burialSiteTypeFieldId)
const burialSiteTypes = await getBurialSiteTypes()

View File

@ -2,9 +2,7 @@
<div class="modal-background"></div>
<div class="modal-card has-width-900">
<header class="modal-card-head">
<h3 class="modal-card-title">
Add <span class="alias" data-alias="Lot"></span> Type
</h3>
<h3 class="modal-card-title">Add Burial Site Type</h3>
<button
class="delete is-close-modal-button"
aria-label="close"
@ -12,16 +10,16 @@
></button>
</header>
<section class="modal-card-body">
<form id="form--lotTypeAdd">
<form id="form--burialSiteTypeAdd">
<div class="field">
<label class="label" for="lotTypeAdd--lotType"
><span class="alias" data-alias="Lot"></span> Type</label
<label class="label" for="burialSiteTypeAdd--burialSiteType"
>Burial Site Type</label
>
<div class="control">
<input
class="input"
id="lotTypeAdd--lotType"
name="lotType"
id="burialSiteTypeAdd--burialSiteType"
name="burialSiteType"
type="text"
maxlength="100"
required
@ -31,9 +29,13 @@
</form>
</section>
<footer class="modal-card-foot justify-right">
<button class="button is-success" type="submit" form="form--lotTypeAdd">
<button
class="button is-success"
type="submit"
form="form--burialSiteTypeAdd"
>
<span class="icon"><i class="fas fa-plus" aria-hidden="true"></i></span>
<span>Add <span class="alias" data-alias="Lot"></span> Type</span>
<span>Add Burial Site Type</span>
</button>
<button class="button is-close-modal-button" type="button">Cancel</button>
</footer>

View File

@ -12,22 +12,22 @@
></button>
</header>
<section class="modal-card-body">
<form id="form--lotTypeFieldAdd">
<form id="form--burialSiteTypeFieldAdd">
<input
class="input"
id="lotTypeFieldAdd--burialSiteTypeId"
id="burialSiteTypeFieldAdd--burialSiteTypeId"
name="burialSiteTypeId"
type="hidden"
/>
<div class="field">
<label class="label" for="lotTypeFieldAdd--lotTypeField"
<label class="label" for="burialSiteTypeFieldAdd--burialSiteTypeField"
>New Field Name</label
>
<div class="control">
<input
class="input"
id="lotTypeFieldAdd--lotTypeField"
name="lotTypeField"
id="burialSiteTypeFieldAdd--burialSiteTypeField"
name="burialSiteTypeField"
type="text"
maxlength="100"
required
@ -40,7 +40,7 @@
<button
class="button is-success"
type="submit"
form="form--lotTypeFieldAdd"
form="form--burialSiteTypeFieldAdd"
>
<span class="icon"><i class="fas fa-plus" aria-hidden="true"></i></span>
<span>Add Field</span>

View File

@ -3,7 +3,7 @@
<div class="modal-card has-width-900">
<header class="modal-card-head">
<h3 class="modal-card-title">
Update <span class="alias" data-alias="Lot"></span> Type
Update Burial Site Type
</h3>
<button
class="delete is-close-modal-button"
@ -12,22 +12,22 @@
></button>
</header>
<section class="modal-card-body">
<form id="form--lotTypeEdit">
<form id="form--burialSiteTypeEdit">
<input
class="input"
id="lotTypeEdit--burialSiteTypeId"
id="burialSiteTypeEdit--burialSiteTypeId"
name="burialSiteTypeId"
type="hidden"
/>
<div class="field">
<label class="label" for="lotTypeEdit--lotType"
><span class="alias" data-alias="Lot"></span> Type</label
<label class="label" for="burialSiteTypeEdit--burialSiteType"
>Burial Site Type</label
>
<div class="control">
<input
class="input"
id="lotTypeEdit--lotType"
name="lotType"
id="burialSiteTypeEdit--burialSiteType"
name="burialSiteType"
type="text"
maxlength="100"
required
@ -37,9 +37,9 @@
</form>
</section>
<footer class="modal-card-foot justify-right">
<button class="button is-success" type="submit" form="form--lotTypeEdit">
<button class="button is-success" type="submit" form="form--burialSiteTypeEdit">
<span class="icon"><i class="fas fa-save" aria-hidden="true"></i></span>
<span>Update <span class="alias" data-alias="Lot"></span> Type</span>
<span>Update Burial Site Type</span>
</button>
<button class="button is-close-modal-button" type="button">Cancel</button>
</footer>

View File

@ -3,7 +3,7 @@
<div class="modal-card has-width-900">
<header class="modal-card-head">
<h3 class="modal-card-title">
Update <span class="alias" data-alias="Lot"></span> Type Field
Update Burial Site Type Field
</h3>
<button
class="delete is-close-modal-button"
@ -12,24 +12,24 @@
></button>
</header>
<section class="modal-card-body">
<form id="form--lotTypeFieldEdit">
<form id="form--burialSiteTypeFieldEdit">
<input
class="input"
id="lotTypeFieldEdit--lotTypeFieldId"
name="lotTypeFieldId"
id="burialSiteTypeFieldEdit--burialSiteTypeFieldId"
name="burialSiteTypeFieldId"
type="hidden"
/>
<div class="columns">
<div class="column is-8">
<div class="field">
<label class="label" for="lotTypeFieldEdit--lotTypeField"
<label class="label" for="burialSiteTypeFieldEdit--burialSiteTypeField"
>Field Name</label
>
<div class="control">
<input
class="input"
id="lotTypeFieldEdit--lotTypeField"
name="lotTypeField"
id="burialSiteTypeFieldEdit--burialSiteTypeField"
name="burialSiteTypeField"
type="text"
maxlength="100"
required
@ -39,12 +39,12 @@
</div>
<div class="column">
<div class="field">
<label class="label" for="lotTypeFieldEdit--isRequired"
<label class="label" for="burialSiteTypeFieldEdit--isRequired"
>Required</label
>
<div class="control">
<div class="select is-fullwidth">
<select id="lotTypeFieldEdit--isRequired" name="isRequired">
<select id="burialSiteTypeFieldEdit--isRequired" name="isRequired">
<option value="0">Not Required</option>
<option value="1">Required</option>
</select>
@ -57,13 +57,13 @@
<div class="columns">
<div class="column is-5">
<div class="field">
<label class="label" for="lotTypeFieldEdit--fieldType"
<label class="label" for="burialSiteTypeFieldEdit--fieldType"
>Field Type</label
>
<div class="control">
<div class="select is-fullwidth">
<select
id="lotTypeFieldEdit--fieldType"
id="burialSiteTypeFieldEdit--fieldType"
name="fieldType"
>
<option value="text">Text Field</option>
@ -76,13 +76,13 @@
<div class="columns">
<div class="column">
<div class="field">
<label class="label" for="lotTypeFieldEdit--minLength"
<label class="label" for="burialSiteTypeFieldEdit--minLength"
>Minimum Length</label
>
<div class="control">
<input
class="input"
id="lotTypeFieldEdit--minLength"
id="burialSiteTypeFieldEdit--minLength"
name="minLength"
type="number"
min="0"
@ -95,13 +95,13 @@
</div>
<div class="column">
<div class="field">
<label class="label" for="lotTypeFieldEdit--maxLength"
<label class="label" for="burialSiteTypeFieldEdit--maxLength"
>Maximum Length</label
>
<div class="control">
<input
class="input"
id="lotTypeFieldEdit--maxLength"
id="burialSiteTypeFieldEdit--maxLength"
name="maxLength"
type="number"
min="0"
@ -114,13 +114,13 @@
</div>
</div>
<div class="field">
<label class="label" for="lotTypeFieldEdit--pattern"
<label class="label" for="burialSiteTypeFieldEdit--pattern"
>Regular Expression</label
>
<div class="control">
<input
class="input"
id="lotTypeFieldEdit--pattern"
id="burialSiteTypeFieldEdit--pattern"
name="pattern"
type="text"
maxlength="100"
@ -130,14 +130,14 @@
</div>
<div class="column">
<div class="field">
<label class="label" for="lotTypeFieldEdit--lotTypeFieldValues"
<label class="label" for="burialSiteTypeFieldEdit--fieldValues"
>Field Values</label
>
<div class="control">
<textarea
class="textarea"
id="lotTypeFieldEdit--lotTypeFieldValues"
name="lotTypeFieldValues"
id="burialSiteTypeFieldEdit--fieldValues"
name="fieldValues"
></textarea>
</div>
<p class="help is-info">
@ -153,7 +153,7 @@
<button
class="button is-success"
type="submit"
form="form--lotTypeFieldEdit"
form="form--burialSiteTypeFieldEdit"
>
<span class="icon"><i class="fas fa-save" aria-hidden="true"></i></span>
<span>Update Field</span>
@ -169,7 +169,7 @@
</div>
<div class="dropdown-menu">
<div class="dropdown-content">
<a class="dropdown-item" id="button--deleteLotTypeField" href="#">
<a class="dropdown-item" id="button--deleteBurialSiteTypeField" href="#">
<span class="icon is-small"
><i class="fas fa-trash has-text-danger" aria-hidden="true"></i
></span>

View File

@ -1,84 +1,86 @@
"use strict";
// eslint-disable-next-line @eslint-community/eslint-comments/disable-enable-pair
/* eslint-disable max-lines */
Object.defineProperty(exports, "__esModule", { value: true });
(() => {
const los = exports.los;
const containerElement = document.querySelector('#container--lotTypes');
let lotTypes = exports.lotTypes;
delete exports.lotTypes;
const expandedLotTypes = new Set();
const containerElement = document.querySelector('#container--burialSiteTypes');
let burialSiteTypes = exports.burialSiteTypes;
delete exports.burialSiteTypes;
const expandedBurialSiteTypes = new Set();
function toggleBurialSiteTypeFields(clickEvent) {
const toggleButtonElement = clickEvent.currentTarget;
const lotTypeElement = toggleButtonElement.closest('.container--lotType');
const burialSiteTypeId = Number.parseInt(lotTypeElement.dataset.burialSiteTypeId ?? '', 10);
if (expandedLotTypes.has(burialSiteTypeId)) {
expandedLotTypes.delete(burialSiteTypeId);
const burialSiteTypeElement = toggleButtonElement.closest('.container--burialSiteType');
const burialSiteTypeId = Number.parseInt(burialSiteTypeElement.dataset.burialSiteTypeId ?? '', 10);
if (expandedBurialSiteTypes.has(burialSiteTypeId)) {
expandedBurialSiteTypes.delete(burialSiteTypeId);
}
else {
expandedLotTypes.add(burialSiteTypeId);
expandedBurialSiteTypes.add(burialSiteTypeId);
}
// eslint-disable-next-line no-unsanitized/property
toggleButtonElement.innerHTML = expandedLotTypes.has(burialSiteTypeId)
toggleButtonElement.innerHTML = expandedBurialSiteTypes.has(burialSiteTypeId)
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>';
const panelBlockElements = lotTypeElement.querySelectorAll('.panel-block');
const panelBlockElements = burialSiteTypeElement.querySelectorAll('.panel-block');
for (const panelBlockElement of panelBlockElements) {
panelBlockElement.classList.toggle('is-hidden');
}
}
function lotTypeResponseHandler(rawResponseJSON) {
function burialSiteTypeResponseHandler(rawResponseJSON) {
const responseJSON = rawResponseJSON;
if (responseJSON.success) {
lotTypes = responseJSON.lotTypes;
renderLotTypes();
burialSiteTypes = responseJSON.burialSiteTypes;
renderBurialSiteTypes();
}
else {
bulmaJS.alert({
title: `Error Updating ${los.escapedAliases.Lot} Type`,
title: `Error Updating Burial Site Type`,
message: responseJSON.errorMessage ?? '',
contextualColorName: 'danger'
});
}
}
function deleteLotType(clickEvent) {
const burialSiteTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotType').dataset.burialSiteTypeId ?? '', 10);
function deleteBurialSiteType(clickEvent) {
const burialSiteTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--burialSiteType').dataset.burialSiteTypeId ?? '', 10);
function doDelete() {
cityssm.postJSON(`${los.urlPrefix}/admin/doDeleteBurialSiteType`, {
burialSiteTypeId
}, lotTypeResponseHandler);
}, burialSiteTypeResponseHandler);
}
bulmaJS.confirm({
title: `Delete ${los.escapedAliases.Lot} Type`,
message: `Are you sure you want to delete this ${los.escapedAliases.lot} type?`,
title: `Delete Burial Site Type`,
message: `Are you sure you want to delete this burial site type?`,
contextualColorName: 'warning',
okButton: {
text: `Yes, Delete ${los.escapedAliases.Lot} Type`,
text: `Yes, Delete Burial Site Type`,
callbackFunction: doDelete
}
});
}
function openEditLotType(clickEvent) {
const burialSiteTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotType').dataset.burialSiteTypeId ?? '', 10);
const lotType = lotTypes.find((currentLotType) => burialSiteTypeId === currentLotType.burialSiteTypeId);
function openEditBurialSiteType(clickEvent) {
const burialSiteTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--burialSiteType').dataset.burialSiteTypeId ?? '', 10);
const burialSiteType = burialSiteTypes.find((currentType) => burialSiteTypeId === currentType.burialSiteTypeId);
let editCloseModalFunction;
function doEdit(submitEvent) {
submitEvent.preventDefault();
cityssm.postJSON(`${los.urlPrefix}/admin/doUpdateBurialSiteType`, submitEvent.currentTarget, (rawResponseJSON) => {
const responseJSON = rawResponseJSON;
lotTypeResponseHandler(responseJSON);
burialSiteTypeResponseHandler(responseJSON);
if (responseJSON.success) {
editCloseModalFunction();
}
});
}
cityssm.openHtmlModal('adminLotTypes-editLotType', {
cityssm.openHtmlModal('adminBurialSiteTypes-edit', {
onshow(modalElement) {
los.populateAliases(modalElement);
modalElement.querySelector('#lotTypeEdit--burialSiteTypeId').value = burialSiteTypeId.toString();
modalElement.querySelector('#lotTypeEdit--lotType').value = lotType.lotType;
modalElement.querySelector('#burialSiteTypeEdit--burialSiteTypeId').value = burialSiteTypeId.toString();
modalElement.querySelector('#burialSiteTypeEdit--burialSiteType').value = burialSiteType.burialSiteType;
},
onshown(modalElement, closeModalFunction) {
editCloseModalFunction = closeModalFunction;
modalElement.querySelector('#lotTypeEdit--lotType').focus();
modalElement.querySelector('#burialSiteTypeEdit--burialSiteType').focus();
modalElement.querySelector('form')?.addEventListener('submit', doEdit);
bulmaJS.toggleHtmlClipped();
},
@ -87,32 +89,32 @@ Object.defineProperty(exports, "__esModule", { value: true });
}
});
}
function openAddLotTypeField(clickEvent) {
const burialSiteTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotType').dataset.burialSiteTypeId ?? '', 10);
function openAddBurialSiteTypeField(clickEvent) {
const burialSiteTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--burialSiteType').dataset.burialSiteTypeId ?? '', 10);
let addCloseModalFunction;
function doAdd(submitEvent) {
submitEvent.preventDefault();
cityssm.postJSON(`${los.urlPrefix}/admin/doAddBurialSiteTypeField`, submitEvent.currentTarget, (rawResponseJSON) => {
const responseJSON = rawResponseJSON;
expandedLotTypes.add(burialSiteTypeId);
lotTypeResponseHandler(responseJSON);
expandedBurialSiteTypes.add(burialSiteTypeId);
burialSiteTypeResponseHandler(responseJSON);
if (responseJSON.success) {
addCloseModalFunction();
openEditLotTypeField(burialSiteTypeId, responseJSON.lotTypeFieldId);
openEditBurialSiteTypeField(burialSiteTypeId, responseJSON.burialSiteTypeFieldId);
}
});
}
cityssm.openHtmlModal('adminLotTypes-addBurialSiteTypeField', {
cityssm.openHtmlModal('adminBurialSiteTypes-addField', {
onshow(modalElement) {
los.populateAliases(modalElement);
if (burialSiteTypeId) {
;
modalElement.querySelector('#lotTypeFieldAdd--burialSiteTypeId').value = burialSiteTypeId.toString();
modalElement.querySelector('#burialSiteTypeFieldAdd--burialSiteTypeId').value = burialSiteTypeId.toString();
}
},
onshown(modalElement, closeModalFunction) {
addCloseModalFunction = closeModalFunction;
modalElement.querySelector('#lotTypeFieldAdd--lotTypeField').focus();
modalElement.querySelector('#burialSiteTypeFieldAdd--burialSiteTypeField').focus();
modalElement.querySelector('form')?.addEventListener('submit', doAdd);
bulmaJS.toggleHtmlClipped();
},
@ -121,24 +123,25 @@ Object.defineProperty(exports, "__esModule", { value: true });
}
});
}
function moveLotType(clickEvent) {
function moveBurialSiteType(clickEvent) {
const buttonElement = clickEvent.currentTarget;
const burialSiteTypeId = buttonElement.closest('.container--lotType').dataset.burialSiteTypeId;
const burialSiteTypeId = buttonElement.closest('.container--burialSiteType').dataset.burialSiteTypeId;
cityssm.postJSON(`${los.urlPrefix}/admin/${buttonElement.dataset.direction === 'up'
? 'doMoveBurialSiteTypeUp'
: 'doMoveBurialSiteTypeDown'}`, {
: // eslint-disable-next-line no-secrets/no-secrets
'doMoveBurialSiteTypeDown'}`, {
burialSiteTypeId,
moveToEnd: clickEvent.shiftKey ? '1' : '0'
}, lotTypeResponseHandler);
}, burialSiteTypeResponseHandler);
}
function openEditLotTypeField(burialSiteTypeId, lotTypeFieldId) {
const lotType = lotTypes.find((currentLotType) => currentLotType.burialSiteTypeId === burialSiteTypeId);
const lotTypeField = (lotType.BurialSiteTypeFields ?? []).find((currentLotTypeField) => currentLotTypeField.lotTypeFieldId === lotTypeFieldId);
function openEditBurialSiteTypeField(burialSiteTypeId, burialSiteTypeFieldId) {
const burialSiteType = burialSiteTypes.find((currentType) => currentType.burialSiteTypeId === burialSiteTypeId);
const burialSiteTypeField = (burialSiteType.burialSiteTypeFields ?? []).find((currentField) => currentField.burialSiteTypeFieldId === burialSiteTypeFieldId);
let fieldTypeElement;
let minLengthInputElement;
let maxLengthInputElement;
let patternElement;
let lotTypeFieldValuesElement;
let fieldValuesElement;
let editCloseModalFunction;
function updateMaximumLengthMin() {
maxLengthInputElement.min = minLengthInputElement.value;
@ -149,21 +152,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
minLengthInputElement.disabled = true;
maxLengthInputElement.disabled = true;
patternElement.disabled = true;
lotTypeFieldValuesElement.disabled = true;
fieldValuesElement.disabled = true;
break;
}
case 'select': {
minLengthInputElement.disabled = true;
maxLengthInputElement.disabled = true;
patternElement.disabled = true;
lotTypeFieldValuesElement.disabled = false;
fieldValuesElement.disabled = false;
break;
}
default: {
minLengthInputElement.disabled = false;
maxLengthInputElement.disabled = false;
patternElement.disabled = false;
lotTypeFieldValuesElement.disabled = true;
fieldValuesElement.disabled = true;
break;
}
}
@ -172,7 +175,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
submitEvent.preventDefault();
cityssm.postJSON(`${los.urlPrefix}/admin/doUpdateBurialSiteTypeField`, submitEvent.currentTarget, (rawResponseJSON) => {
const responseJSON = rawResponseJSON;
lotTypeResponseHandler(responseJSON);
burialSiteTypeResponseHandler(responseJSON);
if (responseJSON.success) {
editCloseModalFunction();
}
@ -180,10 +183,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
}
function doDelete() {
cityssm.postJSON(`${los.urlPrefix}/admin/doDeleteBurialSiteTypeField`, {
lotTypeFieldId
burialSiteTypeFieldId
}, (rawResponseJSON) => {
const responseJSON = rawResponseJSON;
lotTypeResponseHandler(responseJSON);
burialSiteTypeResponseHandler(responseJSON);
if (responseJSON.success) {
editCloseModalFunction();
}
@ -200,24 +203,24 @@ Object.defineProperty(exports, "__esModule", { value: true });
}
});
}
cityssm.openHtmlModal('adminLotTypes-editLotTypeField', {
cityssm.openHtmlModal('adminBurialSiteTypes-editField', {
onshow(modalElement) {
los.populateAliases(modalElement);
modalElement.querySelector('#lotTypeFieldEdit--lotTypeFieldId').value = lotTypeField.lotTypeFieldId.toString();
modalElement.querySelector('#lotTypeFieldEdit--lotTypeField').value = lotTypeField.lotTypeField ?? '';
modalElement.querySelector('#lotTypeFieldEdit--isRequired').value = lotTypeField.isRequired ? '1' : '0';
fieldTypeElement = modalElement.querySelector('#lotTypeFieldEdit--fieldType');
fieldTypeElement.value = lotTypeField.fieldType;
minLengthInputElement = modalElement.querySelector('#lotTypeFieldEdit--minLength');
modalElement.querySelector('#burialSiteTypeFieldEdit--burialSiteTypeFieldId').value = burialSiteTypeField.burialSiteTypeFieldId.toString();
modalElement.querySelector('#burialSiteTypeFieldEdit--burialSiteTypeField').value = burialSiteTypeField.burialSiteTypeField ?? '';
modalElement.querySelector('#burialSiteTypeFieldEdit--isRequired').value = burialSiteTypeField.isRequired ?? false ? '1' : '0';
fieldTypeElement = modalElement.querySelector('#burialSiteTypeFieldEdit--fieldType');
fieldTypeElement.value = burialSiteTypeField.fieldType;
minLengthInputElement = modalElement.querySelector('#burialSiteTypeFieldEdit--minLength');
minLengthInputElement.value =
lotTypeField.minLength?.toString() ?? '';
maxLengthInputElement = modalElement.querySelector('#lotTypeFieldEdit--maxLength');
burialSiteTypeField.minLength?.toString() ?? '';
maxLengthInputElement = modalElement.querySelector('#burialSiteTypeFieldEdit--maxLength');
maxLengthInputElement.value =
lotTypeField.maxLength?.toString() ?? '';
patternElement = modalElement.querySelector('#lotTypeFieldEdit--pattern');
patternElement.value = lotTypeField.pattern ?? '';
lotTypeFieldValuesElement = modalElement.querySelector('#lotTypeFieldEdit--lotTypeFieldValues');
lotTypeFieldValuesElement.value = lotTypeField.lotTypeFieldValues ?? '';
burialSiteTypeField.maxLength?.toString() ?? '';
patternElement = modalElement.querySelector('#burialSiteTypeFieldEdit--pattern');
patternElement.value = burialSiteTypeField.pattern ?? '';
fieldValuesElement = modalElement.querySelector('#burialSiteTypeFieldEdit--fieldValues');
fieldValuesElement.value = burialSiteTypeField.fieldValues ?? '';
toggleInputFields();
},
onshown(modalElement, closeModalFunction) {
@ -230,7 +233,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
updateMaximumLengthMin();
fieldTypeElement.addEventListener('change', toggleInputFields);
modalElement
.querySelector('#button--deleteLotTypeField')
.querySelector('#button--deleteBurialSiteTypeField')
?.addEventListener('click', confirmDoDelete);
},
onremoved() {
@ -239,103 +242,106 @@ Object.defineProperty(exports, "__esModule", { value: true });
}
});
}
function openEditLotTypeFieldByClick(clickEvent) {
function openEditBurialSiteTypeFieldByClick(clickEvent) {
clickEvent.preventDefault();
const lotTypeFieldId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotTypeField').dataset.lotTypeFieldId ?? '', 10);
const burialSiteTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotType').dataset.burialSiteTypeId ?? '', 10);
openEditLotTypeField(burialSiteTypeId, lotTypeFieldId);
const burialSiteTypeFieldId = Number.parseInt(clickEvent.currentTarget.closest('.container--burialSiteTypeField').dataset.burialSiteTypeFieldId ?? '', 10);
const burialSiteTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--burialSiteType').dataset.burialSiteTypeId ?? '', 10);
openEditBurialSiteTypeField(burialSiteTypeId, burialSiteTypeFieldId);
}
function moveLotTypeField(clickEvent) {
function moveBurialSiteTypeField(clickEvent) {
const buttonElement = clickEvent.currentTarget;
const lotTypeFieldId = buttonElement.closest('.container--lotTypeField').dataset.lotTypeFieldId;
const burialSiteTypeFieldId = buttonElement.closest('.container--burialSiteTypeField').dataset.burialSiteTypeFieldId;
cityssm.postJSON(`${los.urlPrefix}/admin/${buttonElement.dataset.direction === 'up'
? 'doMoveBurialSiteTypeFieldUp'
: 'doMoveBurialSiteTypeFieldDown'}`, {
lotTypeFieldId,
: // eslint-disable-next-line no-secrets/no-secrets
'doMoveBurialSiteTypeFieldDown'}`, {
burialSiteTypeFieldId,
moveToEnd: clickEvent.shiftKey ? '1' : '0'
}, lotTypeResponseHandler);
}, burialSiteTypeResponseHandler);
}
function renderBurialSiteTypeFields(panelElement, burialSiteTypeId, BurialSiteTypeFields) {
if (BurialSiteTypeFields.length === 0) {
function renderBurialSiteTypeFields(panelElement, burialSiteTypeId, burialSiteTypeFields) {
if (burialSiteTypeFields.length === 0) {
// eslint-disable-next-line no-unsanitized/method
panelElement.insertAdjacentHTML('beforeend', `<div class="panel-block is-block
${expandedLotTypes.has(burialSiteTypeId) ? '' : ' is-hidden'}">
${expandedBurialSiteTypes.has(burialSiteTypeId) ? '' : ' is-hidden'}">
<div class="message is-info"><p class="message-body">There are no additional fields.</p></div>
</div>`);
}
else {
for (const lotTypeField of BurialSiteTypeFields) {
for (const burialSiteTypeField of burialSiteTypeFields) {
const panelBlockElement = document.createElement('div');
panelBlockElement.className =
'panel-block is-block container--lotTypeField';
if (!expandedLotTypes.has(burialSiteTypeId)) {
'panel-block is-block container--burialSiteTypeField';
if (!expandedBurialSiteTypes.has(burialSiteTypeId)) {
panelBlockElement.classList.add('is-hidden');
}
panelBlockElement.dataset.lotTypeFieldId =
lotTypeField.lotTypeFieldId.toString();
panelBlockElement.dataset.burialSiteTypeFieldId =
burialSiteTypeField.burialSiteTypeFieldId.toString();
// eslint-disable-next-line no-unsanitized/property
panelBlockElement.innerHTML = `<div class="level is-mobile">
<div class="level-left">
<div class="level-item">
<a class="has-text-weight-bold button--editLotTypeField" href="#">
${cityssm.escapeHTML(lotTypeField.lotTypeField ?? '')}
<a class="has-text-weight-bold button--editBurialSiteTypeField" href="#">
${cityssm.escapeHTML(burialSiteTypeField.burialSiteTypeField ?? '')}
</a>
</div>
</div>
<div class="level-right">
<div class="level-item">
${los.getMoveUpDownButtonFieldHTML('button--moveLotTypeFieldUp', 'button--moveLotTypeFieldDown')}
${los.getMoveUpDownButtonFieldHTML('button--moveBurialSiteTypeFieldUp',
// eslint-disable-next-line no-secrets/no-secrets
'button--moveBurialSiteTypeFieldDown')}
</div>
</div>
</div>`;
panelBlockElement
.querySelector('.button--editLotTypeField')
?.addEventListener('click', openEditLotTypeFieldByClick);
panelBlockElement.querySelector('.button--moveLotTypeFieldUp').addEventListener('click', moveLotTypeField);
panelBlockElement.querySelector('.button--moveLotTypeFieldDown').addEventListener('click', moveLotTypeField);
.querySelector('.button--editBurialSiteTypeField')
?.addEventListener('click', openEditBurialSiteTypeFieldByClick);
panelBlockElement.querySelector('.button--moveBurialSiteTypeFieldUp').addEventListener('click', moveBurialSiteTypeField);
panelBlockElement.querySelector('.button--moveBurialSiteTypeFieldDown').addEventListener('click', moveBurialSiteTypeField);
panelElement.append(panelBlockElement);
}
}
}
function renderLotTypes() {
function renderBurialSiteTypes() {
containerElement.innerHTML = '';
if (lotTypes.length === 0) {
// eslint-disable-next-line no-unsanitized/method
containerElement.insertAdjacentHTML('afterbegin', `<div class="message is-warning>
<p class="message-body">There are no active ${los.escapedAliases.lot} types.</p>
if (burialSiteTypes.length === 0) {
containerElement.insertAdjacentHTML('afterbegin', `<div class="message is-warning">
<p class="message-body">There are no active burial site types.</p>
</div>`);
return;
}
for (const lotType of lotTypes) {
const lotTypeContainer = document.createElement('div');
lotTypeContainer.className = 'panel container--lotType';
lotTypeContainer.dataset.burialSiteTypeId = lotType.burialSiteTypeId.toString();
for (const burialSiteType of burialSiteTypes) {
const burialSiteTypeContainer = document.createElement('div');
burialSiteTypeContainer.className = 'panel container--burialSiteType';
burialSiteTypeContainer.dataset.burialSiteTypeId =
burialSiteType.burialSiteTypeId.toString();
// eslint-disable-next-line no-unsanitized/property
lotTypeContainer.innerHTML = `<div class="panel-heading">
burialSiteTypeContainer.innerHTML = `<div class="panel-heading">
<div class="level is-mobile">
<div class="level-left">
<div class="level-item">
<button class="button is-small button--toggleBurialSiteTypeFields" data-tooltip="Toggle Fields" type="button" aria-label="Toggle Fields">
${expandedLotTypes.has(lotType.burialSiteTypeId)
${expandedBurialSiteTypes.has(burialSiteType.burialSiteTypeId)
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>'}
</button>
</div>
<div class="level-item">
<h2 class="title is-4">${cityssm.escapeHTML(lotType.lotType)}</h2>
<h2 class="title is-4">${cityssm.escapeHTML(burialSiteType.burialSiteType)}</h2>
</div>
</div>
<div class="level-right">
<div class="level-item">
<button class="button is-danger is-small button--deleteLotType" type="button">
<button class="button is-danger is-small button--deleteBurialSiteType" type="button">
<span class="icon is-small"><i class="fas fa-trash" aria-hidden="true"></i></span>
<span>Delete</span>
</button>
</div>
<div class="level-item">
<button class="button is-primary is-small button--editLotType" type="button">
<button class="button is-primary is-small button--editBurialSiteType" type="button">
<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>
<span>Edit ${los.escapedAliases.Lot} Type</span>
<span>Edit Burial Site Type</span>
</button>
</div>
<div class="level-item">
@ -345,27 +351,27 @@ Object.defineProperty(exports, "__esModule", { value: true });
</button>
</div>
<div class="level-item">
${los.getMoveUpDownButtonFieldHTML('button--moveLotTypeUp', 'button--moveLotTypeDown')}
${los.getMoveUpDownButtonFieldHTML('button--moveBurialSiteTypeUp', 'button--moveBurialSiteTypeDown')}
</div>
</div>
</div>
</div>`;
renderBurialSiteTypeFields(lotTypeContainer, lotType.burialSiteTypeId, lotType.BurialSiteTypeFields ?? []);
lotTypeContainer
renderBurialSiteTypeFields(burialSiteTypeContainer, burialSiteType.burialSiteTypeId, burialSiteType.burialSiteTypeFields ?? []);
burialSiteTypeContainer
.querySelector('.button--toggleBurialSiteTypeFields')
?.addEventListener('click', toggleBurialSiteTypeFields);
lotTypeContainer
.querySelector('.button--deleteLotType')
?.addEventListener('click', deleteLotType);
lotTypeContainer
.querySelector('.button--editLotType')
?.addEventListener('click', openEditLotType);
lotTypeContainer
burialSiteTypeContainer
.querySelector('.button--deleteBurialSiteType')
?.addEventListener('click', deleteBurialSiteType);
burialSiteTypeContainer
.querySelector('.button--editBurialSiteType')
?.addEventListener('click', openEditBurialSiteType);
burialSiteTypeContainer
.querySelector('.button--addBurialSiteTypeField')
?.addEventListener('click', openAddLotTypeField);
lotTypeContainer.querySelector('.button--moveLotTypeUp').addEventListener('click', moveLotType);
lotTypeContainer.querySelector('.button--moveLotTypeDown').addEventListener('click', moveLotType);
containerElement.append(lotTypeContainer);
?.addEventListener('click', openAddBurialSiteTypeField);
burialSiteTypeContainer.querySelector('.button--moveBurialSiteTypeUp').addEventListener('click', moveBurialSiteType);
burialSiteTypeContainer.querySelector('.button--moveBurialSiteTypeDown').addEventListener('click', moveBurialSiteType);
containerElement.append(burialSiteTypeContainer);
}
}
document
@ -374,29 +380,29 @@ Object.defineProperty(exports, "__esModule", { value: true });
let addCloseModalFunction;
function doAdd(submitEvent) {
submitEvent.preventDefault();
cityssm.postJSON(`${los.urlPrefix}/admin/doAddLotType`, submitEvent.currentTarget, (rawResponseJSON) => {
cityssm.postJSON(`${los.urlPrefix}/admin/doAddBurialSiteType`, submitEvent.currentTarget, (rawResponseJSON) => {
const responseJSON = rawResponseJSON;
if (responseJSON.success) {
addCloseModalFunction();
lotTypes = responseJSON.lotTypes;
renderLotTypes();
burialSiteTypes = responseJSON.burialSiteTypes;
renderBurialSiteTypes();
}
else {
bulmaJS.alert({
title: `Error Adding ${los.escapedAliases.Lot} Type`,
title: `Error Adding Burial Site Type`,
message: responseJSON.errorMessage ?? '',
contextualColorName: 'danger'
});
}
});
}
cityssm.openHtmlModal('adminLotTypes-addBurialSiteType', {
cityssm.openHtmlModal('adminBurialSiteTypes-add', {
onshow(modalElement) {
los.populateAliases(modalElement);
},
onshown(modalElement, closeModalFunction) {
addCloseModalFunction = closeModalFunction;
modalElement.querySelector('#lotTypeAdd--lotType').focus();
modalElement.querySelector('#burialSiteTypeAdd--burialSiteType').focus();
modalElement.querySelector('form')?.addEventListener('submit', doAdd);
bulmaJS.toggleHtmlClipped();
},
@ -405,5 +411,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
}
});
});
renderLotTypes();
renderBurialSiteTypes();
})();

View File

@ -1,8 +1,15 @@
// eslint-disable-next-line @eslint-community/eslint-comments/disable-enable-pair
/* eslint-disable max-lines */
import type { BulmaJS } from '@cityssm/bulma-js/types.js'
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types.js'
import type { LOS } from '../../types/globalTypes.js'
import type { LotType, LotTypeField } from '../../types/recordTypes.js'
import type {
BurialSiteType,
BurialSiteTypeField
} from '../../types/recordTypes.js'
import type { LOS } from './types.js'
declare const cityssm: cityssmGlobal
declare const bulmaJS: BulmaJS
@ -12,8 +19,8 @@ declare const exports: Record<string, unknown>
type ResponseJSON =
| {
success: true
lotTypes: LotType[]
lotTypeFieldId?: number
burialSiteTypes: BurialSiteType[]
burialSiteTypeFieldId?: number
}
| {
success: false
@ -23,38 +30,40 @@ type ResponseJSON =
const los = exports.los as LOS
const containerElement = document.querySelector(
'#container--lotTypes'
'#container--burialSiteTypes'
) as HTMLElement
let lotTypes = exports.lotTypes as LotType[]
delete exports.lotTypes
let burialSiteTypes = exports.burialSiteTypes as BurialSiteType[]
delete exports.burialSiteTypes
const expandedLotTypes = new Set<number>()
const expandedBurialSiteTypes = new Set<number>()
function toggleBurialSiteTypeFields(clickEvent: Event): void {
const toggleButtonElement = clickEvent.currentTarget as HTMLButtonElement
const lotTypeElement = toggleButtonElement.closest(
'.container--lotType'
const burialSiteTypeElement = toggleButtonElement.closest(
'.container--burialSiteType'
) as HTMLElement
const burialSiteTypeId = Number.parseInt(
lotTypeElement.dataset.burialSiteTypeId ?? '',
burialSiteTypeElement.dataset.burialSiteTypeId ?? '',
10
)
if (expandedLotTypes.has(burialSiteTypeId)) {
expandedLotTypes.delete(burialSiteTypeId)
if (expandedBurialSiteTypes.has(burialSiteTypeId)) {
expandedBurialSiteTypes.delete(burialSiteTypeId)
} else {
expandedLotTypes.add(burialSiteTypeId)
expandedBurialSiteTypes.add(burialSiteTypeId)
}
// eslint-disable-next-line no-unsanitized/property
toggleButtonElement.innerHTML = expandedLotTypes.has(burialSiteTypeId)
toggleButtonElement.innerHTML = expandedBurialSiteTypes.has(
burialSiteTypeId
)
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>'
const panelBlockElements = lotTypeElement.querySelectorAll(
const panelBlockElements = burialSiteTypeElement.querySelectorAll(
'.panel-block'
) as NodeListOf<HTMLElement>
@ -63,25 +72,25 @@ type ResponseJSON =
}
}
function lotTypeResponseHandler(rawResponseJSON: unknown): void {
function burialSiteTypeResponseHandler(rawResponseJSON: unknown): void {
const responseJSON = rawResponseJSON as ResponseJSON
if (responseJSON.success) {
lotTypes = responseJSON.lotTypes
renderLotTypes()
burialSiteTypes = responseJSON.burialSiteTypes
renderBurialSiteTypes()
} else {
bulmaJS.alert({
title: `Error Updating ${los.escapedAliases.Lot} Type`,
title: `Error Updating Burial Site Type`,
message: responseJSON.errorMessage ?? '',
contextualColorName: 'danger'
})
}
}
function deleteLotType(clickEvent: Event): void {
function deleteBurialSiteType(clickEvent: Event): void {
const burialSiteTypeId = Number.parseInt(
(
(clickEvent.currentTarget as HTMLElement).closest(
'.container--lotType'
'.container--burialSiteType'
) as HTMLElement
).dataset.burialSiteTypeId ?? '',
10
@ -93,34 +102,34 @@ type ResponseJSON =
{
burialSiteTypeId
},
lotTypeResponseHandler
burialSiteTypeResponseHandler
)
}
bulmaJS.confirm({
title: `Delete ${los.escapedAliases.Lot} Type`,
message: `Are you sure you want to delete this ${los.escapedAliases.lot} type?`,
title: `Delete Burial Site Type`,
message: `Are you sure you want to delete this burial site type?`,
contextualColorName: 'warning',
okButton: {
text: `Yes, Delete ${los.escapedAliases.Lot} Type`,
text: `Yes, Delete Burial Site Type`,
callbackFunction: doDelete
}
})
}
function openEditLotType(clickEvent: Event): void {
function openEditBurialSiteType(clickEvent: Event): void {
const burialSiteTypeId = Number.parseInt(
(
(clickEvent.currentTarget as HTMLElement).closest(
'.container--lotType'
'.container--burialSiteType'
) as HTMLElement
).dataset.burialSiteTypeId ?? '',
10
)
const lotType = lotTypes.find(
(currentLotType) => burialSiteTypeId === currentLotType.burialSiteTypeId
) as LotType
const burialSiteType = burialSiteTypes.find(
(currentType) => burialSiteTypeId === currentType.burialSiteTypeId
) as BurialSiteType
let editCloseModalFunction: () => void
@ -133,7 +142,7 @@ type ResponseJSON =
(rawResponseJSON) => {
const responseJSON = rawResponseJSON as ResponseJSON
lotTypeResponseHandler(responseJSON)
burialSiteTypeResponseHandler(responseJSON)
if (responseJSON.success) {
editCloseModalFunction()
}
@ -141,25 +150,25 @@ type ResponseJSON =
)
}
cityssm.openHtmlModal('adminLotTypes-editLotType', {
cityssm.openHtmlModal('adminBurialSiteTypes-edit', {
onshow(modalElement) {
los.populateAliases(modalElement)
;(
modalElement.querySelector(
'#lotTypeEdit--burialSiteTypeId'
'#burialSiteTypeEdit--burialSiteTypeId'
) as HTMLInputElement
).value = burialSiteTypeId.toString()
;(
modalElement.querySelector(
'#lotTypeEdit--lotType'
'#burialSiteTypeEdit--burialSiteType'
) as HTMLInputElement
).value = lotType.lotType
).value = burialSiteType.burialSiteType
},
onshown(modalElement, closeModalFunction) {
editCloseModalFunction = closeModalFunction
;(
modalElement.querySelector(
'#lotTypeEdit--lotType'
'#burialSiteTypeEdit--burialSiteType'
) as HTMLInputElement
).focus()
@ -173,11 +182,11 @@ type ResponseJSON =
})
}
function openAddLotTypeField(clickEvent: Event): void {
function openAddBurialSiteTypeField(clickEvent: Event): void {
const burialSiteTypeId = Number.parseInt(
(
(clickEvent.currentTarget as HTMLElement).closest(
'.container--lotType'
'.container--burialSiteType'
) as HTMLElement
).dataset.burialSiteTypeId ?? '',
10
@ -194,28 +203,28 @@ type ResponseJSON =
(rawResponseJSON) => {
const responseJSON = rawResponseJSON as ResponseJSON
expandedLotTypes.add(burialSiteTypeId)
lotTypeResponseHandler(responseJSON)
expandedBurialSiteTypes.add(burialSiteTypeId)
burialSiteTypeResponseHandler(responseJSON)
if (responseJSON.success) {
addCloseModalFunction()
openEditLotTypeField(
openEditBurialSiteTypeField(
burialSiteTypeId,
responseJSON.lotTypeFieldId as number
responseJSON.burialSiteTypeFieldId as number
)
}
}
)
}
cityssm.openHtmlModal('adminLotTypes-addBurialSiteTypeField', {
cityssm.openHtmlModal('adminBurialSiteTypes-addField', {
onshow(modalElement) {
los.populateAliases(modalElement)
if (burialSiteTypeId) {
;(
modalElement.querySelector(
'#lotTypeFieldAdd--burialSiteTypeId'
'#burialSiteTypeFieldAdd--burialSiteTypeId'
) as HTMLInputElement
).value = burialSiteTypeId.toString()
}
@ -224,7 +233,7 @@ type ResponseJSON =
addCloseModalFunction = closeModalFunction
;(
modalElement.querySelector(
'#lotTypeFieldAdd--lotTypeField'
'#burialSiteTypeFieldAdd--burialSiteTypeField'
) as HTMLInputElement
).focus()
@ -238,45 +247,48 @@ type ResponseJSON =
})
}
function moveLotType(clickEvent: MouseEvent): void {
function moveBurialSiteType(clickEvent: MouseEvent): void {
const buttonElement = clickEvent.currentTarget as HTMLButtonElement
const burialSiteTypeId = (
buttonElement.closest('.container--lotType') as HTMLElement
buttonElement.closest('.container--burialSiteType') as HTMLElement
).dataset.burialSiteTypeId
cityssm.postJSON(
`${los.urlPrefix}/admin/${
buttonElement.dataset.direction === 'up'
? 'doMoveBurialSiteTypeUp'
: 'doMoveBurialSiteTypeDown'
: // eslint-disable-next-line no-secrets/no-secrets
'doMoveBurialSiteTypeDown'
}`,
{
burialSiteTypeId,
moveToEnd: clickEvent.shiftKey ? '1' : '0'
},
lotTypeResponseHandler
burialSiteTypeResponseHandler
)
}
function openEditLotTypeField(
function openEditBurialSiteTypeField(
burialSiteTypeId: number,
lotTypeFieldId: number
burialSiteTypeFieldId: number
): void {
const lotType = lotTypes.find(
(currentLotType) => currentLotType.burialSiteTypeId === burialSiteTypeId
) as LotType
const burialSiteType = burialSiteTypes.find(
(currentType) => currentType.burialSiteTypeId === burialSiteTypeId
) as BurialSiteType
const lotTypeField = (lotType.BurialSiteTypeFields ?? []).find(
(currentLotTypeField) =>
currentLotTypeField.lotTypeFieldId === lotTypeFieldId
) as LotTypeField
const burialSiteTypeField = (
burialSiteType.burialSiteTypeFields ?? []
).find(
(currentField) =>
currentField.burialSiteTypeFieldId === burialSiteTypeFieldId
) as BurialSiteTypeField
let fieldTypeElement: HTMLSelectElement
let minLengthInputElement: HTMLInputElement
let maxLengthInputElement: HTMLInputElement
let patternElement: HTMLInputElement
let lotTypeFieldValuesElement: HTMLTextAreaElement
let fieldValuesElement: HTMLTextAreaElement
let editCloseModalFunction: () => void
@ -290,21 +302,21 @@ type ResponseJSON =
minLengthInputElement.disabled = true
maxLengthInputElement.disabled = true
patternElement.disabled = true
lotTypeFieldValuesElement.disabled = true
fieldValuesElement.disabled = true
break
}
case 'select': {
minLengthInputElement.disabled = true
maxLengthInputElement.disabled = true
patternElement.disabled = true
lotTypeFieldValuesElement.disabled = false
fieldValuesElement.disabled = false
break
}
default: {
minLengthInputElement.disabled = false
maxLengthInputElement.disabled = false
patternElement.disabled = false
lotTypeFieldValuesElement.disabled = true
fieldValuesElement.disabled = true
break
}
}
@ -319,7 +331,7 @@ type ResponseJSON =
(rawResponseJSON) => {
const responseJSON = rawResponseJSON as ResponseJSON
lotTypeResponseHandler(responseJSON)
burialSiteTypeResponseHandler(responseJSON)
if (responseJSON.success) {
editCloseModalFunction()
}
@ -331,12 +343,12 @@ type ResponseJSON =
cityssm.postJSON(
`${los.urlPrefix}/admin/doDeleteBurialSiteTypeField`,
{
lotTypeFieldId
burialSiteTypeFieldId
},
(rawResponseJSON) => {
const responseJSON = rawResponseJSON as ResponseJSON
lotTypeResponseHandler(responseJSON)
burialSiteTypeResponseHandler(responseJSON)
if (responseJSON.success) {
editCloseModalFunction()
}
@ -357,56 +369,56 @@ type ResponseJSON =
})
}
cityssm.openHtmlModal('adminLotTypes-editLotTypeField', {
cityssm.openHtmlModal('adminBurialSiteTypes-editField', {
onshow(modalElement) {
los.populateAliases(modalElement)
;(
modalElement.querySelector(
'#lotTypeFieldEdit--lotTypeFieldId'
'#burialSiteTypeFieldEdit--burialSiteTypeFieldId'
) as HTMLInputElement
).value = lotTypeField.lotTypeFieldId.toString()
).value = burialSiteTypeField.burialSiteTypeFieldId.toString()
;(
modalElement.querySelector(
'#lotTypeFieldEdit--lotTypeField'
'#burialSiteTypeFieldEdit--burialSiteTypeField'
) as HTMLInputElement
).value = lotTypeField.lotTypeField ?? ''
).value = burialSiteTypeField.burialSiteTypeField ?? ''
;(
modalElement.querySelector(
'#lotTypeFieldEdit--isRequired'
'#burialSiteTypeFieldEdit--isRequired'
) as HTMLSelectElement
).value = lotTypeField.isRequired ? '1' : '0'
).value = burialSiteTypeField.isRequired ?? false ? '1' : '0'
fieldTypeElement = modalElement.querySelector(
'#lotTypeFieldEdit--fieldType'
'#burialSiteTypeFieldEdit--fieldType'
) as HTMLSelectElement
fieldTypeElement.value = lotTypeField.fieldType
fieldTypeElement.value = burialSiteTypeField.fieldType
minLengthInputElement = modalElement.querySelector(
'#lotTypeFieldEdit--minLength'
'#burialSiteTypeFieldEdit--minLength'
) as HTMLInputElement
minLengthInputElement.value =
lotTypeField.minLength?.toString() ?? ''
burialSiteTypeField.minLength?.toString() ?? ''
maxLengthInputElement = modalElement.querySelector(
'#lotTypeFieldEdit--maxLength'
'#burialSiteTypeFieldEdit--maxLength'
) as HTMLInputElement
maxLengthInputElement.value =
lotTypeField.maxLength?.toString() ?? ''
burialSiteTypeField.maxLength?.toString() ?? ''
patternElement = modalElement.querySelector(
'#lotTypeFieldEdit--pattern'
'#burialSiteTypeFieldEdit--pattern'
) as HTMLInputElement
patternElement.value = lotTypeField.pattern ?? ''
patternElement.value = burialSiteTypeField.pattern ?? ''
lotTypeFieldValuesElement = modalElement.querySelector(
'#lotTypeFieldEdit--lotTypeFieldValues'
fieldValuesElement = modalElement.querySelector(
'#burialSiteTypeFieldEdit--fieldValues'
) as HTMLTextAreaElement
lotTypeFieldValuesElement.value = lotTypeField.lotTypeFieldValues ?? ''
fieldValuesElement.value = burialSiteTypeField.fieldValues ?? ''
toggleInputFields()
},
@ -425,7 +437,7 @@ type ResponseJSON =
fieldTypeElement.addEventListener('change', toggleInputFields)
modalElement
.querySelector('#button--deleteLotTypeField')
.querySelector('#button--deleteBurialSiteTypeField')
?.addEventListener('click', confirmDoDelete)
},
onremoved() {
@ -435,166 +447,168 @@ type ResponseJSON =
})
}
function openEditLotTypeFieldByClick(clickEvent: Event): void {
function openEditBurialSiteTypeFieldByClick(clickEvent: Event): void {
clickEvent.preventDefault()
const lotTypeFieldId = Number.parseInt(
const burialSiteTypeFieldId = Number.parseInt(
(
(clickEvent.currentTarget as HTMLElement).closest(
'.container--lotTypeField'
'.container--burialSiteTypeField'
) as HTMLElement
).dataset.lotTypeFieldId ?? '',
).dataset.burialSiteTypeFieldId ?? '',
10
)
const burialSiteTypeId = Number.parseInt(
(
(clickEvent.currentTarget as HTMLElement).closest(
'.container--lotType'
'.container--burialSiteType'
) as HTMLElement
).dataset.burialSiteTypeId ?? '',
10
)
openEditLotTypeField(burialSiteTypeId, lotTypeFieldId)
openEditBurialSiteTypeField(burialSiteTypeId, burialSiteTypeFieldId)
}
function moveLotTypeField(clickEvent: MouseEvent): void {
function moveBurialSiteTypeField(clickEvent: MouseEvent): void {
const buttonElement = clickEvent.currentTarget as HTMLButtonElement
const lotTypeFieldId = (
buttonElement.closest('.container--lotTypeField') as HTMLElement
).dataset.lotTypeFieldId
const burialSiteTypeFieldId = (
buttonElement.closest('.container--burialSiteTypeField') as HTMLElement
).dataset.burialSiteTypeFieldId
cityssm.postJSON(
`${los.urlPrefix}/admin/${
buttonElement.dataset.direction === 'up'
? 'doMoveBurialSiteTypeFieldUp'
: 'doMoveBurialSiteTypeFieldDown'
: // eslint-disable-next-line no-secrets/no-secrets
'doMoveBurialSiteTypeFieldDown'
}`,
{
lotTypeFieldId,
burialSiteTypeFieldId,
moveToEnd: clickEvent.shiftKey ? '1' : '0'
},
lotTypeResponseHandler
burialSiteTypeResponseHandler
)
}
function renderBurialSiteTypeFields(
panelElement: HTMLElement,
burialSiteTypeId: number,
BurialSiteTypeFields: LotTypeField[]
burialSiteTypeFields: BurialSiteTypeField[]
): void {
if (BurialSiteTypeFields.length === 0) {
if (burialSiteTypeFields.length === 0) {
// eslint-disable-next-line no-unsanitized/method
panelElement.insertAdjacentHTML(
'beforeend',
`<div class="panel-block is-block
${expandedLotTypes.has(burialSiteTypeId) ? '' : ' is-hidden'}">
${expandedBurialSiteTypes.has(burialSiteTypeId) ? '' : ' is-hidden'}">
<div class="message is-info"><p class="message-body">There are no additional fields.</p></div>
</div>`
)
} else {
for (const lotTypeField of BurialSiteTypeFields) {
for (const burialSiteTypeField of burialSiteTypeFields) {
const panelBlockElement = document.createElement('div')
panelBlockElement.className =
'panel-block is-block container--lotTypeField'
'panel-block is-block container--burialSiteTypeField'
if (!expandedLotTypes.has(burialSiteTypeId)) {
if (!expandedBurialSiteTypes.has(burialSiteTypeId)) {
panelBlockElement.classList.add('is-hidden')
}
panelBlockElement.dataset.lotTypeFieldId =
lotTypeField.lotTypeFieldId.toString()
panelBlockElement.dataset.burialSiteTypeFieldId =
burialSiteTypeField.burialSiteTypeFieldId.toString()
// eslint-disable-next-line no-unsanitized/property
panelBlockElement.innerHTML = `<div class="level is-mobile">
<div class="level-left">
<div class="level-item">
<a class="has-text-weight-bold button--editLotTypeField" href="#">
${cityssm.escapeHTML(lotTypeField.lotTypeField ?? '')}
<a class="has-text-weight-bold button--editBurialSiteTypeField" href="#">
${cityssm.escapeHTML(burialSiteTypeField.burialSiteTypeField ?? '')}
</a>
</div>
</div>
<div class="level-right">
<div class="level-item">
${los.getMoveUpDownButtonFieldHTML(
'button--moveLotTypeFieldUp',
'button--moveLotTypeFieldDown'
'button--moveBurialSiteTypeFieldUp',
// eslint-disable-next-line no-secrets/no-secrets
'button--moveBurialSiteTypeFieldDown'
)}
</div>
</div>
</div>`
panelBlockElement
.querySelector('.button--editLotTypeField')
?.addEventListener('click', openEditLotTypeFieldByClick)
.querySelector('.button--editBurialSiteTypeField')
?.addEventListener('click', openEditBurialSiteTypeFieldByClick)
;(
panelBlockElement.querySelector(
'.button--moveLotTypeFieldUp'
'.button--moveBurialSiteTypeFieldUp'
) as HTMLButtonElement
).addEventListener('click', moveLotTypeField)
).addEventListener('click', moveBurialSiteTypeField)
;(
panelBlockElement.querySelector(
'.button--moveLotTypeFieldDown'
'.button--moveBurialSiteTypeFieldDown'
) as HTMLButtonElement
).addEventListener('click', moveLotTypeField)
).addEventListener('click', moveBurialSiteTypeField)
panelElement.append(panelBlockElement)
}
}
}
function renderLotTypes(): void {
function renderBurialSiteTypes(): void {
containerElement.innerHTML = ''
if (lotTypes.length === 0) {
// eslint-disable-next-line no-unsanitized/method
if (burialSiteTypes.length === 0) {
containerElement.insertAdjacentHTML(
'afterbegin',
`<div class="message is-warning>
<p class="message-body">There are no active ${los.escapedAliases.lot} types.</p>
`<div class="message is-warning">
<p class="message-body">There are no active burial site types.</p>
</div>`
)
return
}
for (const lotType of lotTypes) {
const lotTypeContainer = document.createElement('div')
for (const burialSiteType of burialSiteTypes) {
const burialSiteTypeContainer = document.createElement('div')
lotTypeContainer.className = 'panel container--lotType'
burialSiteTypeContainer.className = 'panel container--burialSiteType'
lotTypeContainer.dataset.burialSiteTypeId = lotType.burialSiteTypeId.toString()
burialSiteTypeContainer.dataset.burialSiteTypeId =
burialSiteType.burialSiteTypeId.toString()
// eslint-disable-next-line no-unsanitized/property
lotTypeContainer.innerHTML = `<div class="panel-heading">
burialSiteTypeContainer.innerHTML = `<div class="panel-heading">
<div class="level is-mobile">
<div class="level-left">
<div class="level-item">
<button class="button is-small button--toggleBurialSiteTypeFields" data-tooltip="Toggle Fields" type="button" aria-label="Toggle Fields">
${
expandedLotTypes.has(lotType.burialSiteTypeId)
expandedBurialSiteTypes.has(burialSiteType.burialSiteTypeId)
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>'
}
</button>
</div>
<div class="level-item">
<h2 class="title is-4">${cityssm.escapeHTML(lotType.lotType)}</h2>
<h2 class="title is-4">${cityssm.escapeHTML(burialSiteType.burialSiteType)}</h2>
</div>
</div>
<div class="level-right">
<div class="level-item">
<button class="button is-danger is-small button--deleteLotType" type="button">
<button class="button is-danger is-small button--deleteBurialSiteType" type="button">
<span class="icon is-small"><i class="fas fa-trash" aria-hidden="true"></i></span>
<span>Delete</span>
</button>
</div>
<div class="level-item">
<button class="button is-primary is-small button--editLotType" type="button">
<button class="button is-primary is-small button--editBurialSiteType" type="button">
<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>
<span>Edit ${los.escapedAliases.Lot} Type</span>
<span>Edit Burial Site Type</span>
</button>
</div>
<div class="level-item">
@ -605,8 +619,8 @@ type ResponseJSON =
</div>
<div class="level-item">
${los.getMoveUpDownButtonFieldHTML(
'button--moveLotTypeUp',
'button--moveLotTypeDown'
'button--moveBurialSiteTypeUp',
'button--moveBurialSiteTypeDown'
)}
</div>
</div>
@ -614,38 +628,38 @@ type ResponseJSON =
</div>`
renderBurialSiteTypeFields(
lotTypeContainer,
lotType.burialSiteTypeId,
lotType.BurialSiteTypeFields ?? []
burialSiteTypeContainer,
burialSiteType.burialSiteTypeId,
burialSiteType.burialSiteTypeFields ?? []
)
lotTypeContainer
burialSiteTypeContainer
.querySelector('.button--toggleBurialSiteTypeFields')
?.addEventListener('click', toggleBurialSiteTypeFields)
lotTypeContainer
.querySelector('.button--deleteLotType')
?.addEventListener('click', deleteLotType)
burialSiteTypeContainer
.querySelector('.button--deleteBurialSiteType')
?.addEventListener('click', deleteBurialSiteType)
lotTypeContainer
.querySelector('.button--editLotType')
?.addEventListener('click', openEditLotType)
burialSiteTypeContainer
.querySelector('.button--editBurialSiteType')
?.addEventListener('click', openEditBurialSiteType)
lotTypeContainer
burialSiteTypeContainer
.querySelector('.button--addBurialSiteTypeField')
?.addEventListener('click', openAddLotTypeField)
?.addEventListener('click', openAddBurialSiteTypeField)
;(
lotTypeContainer.querySelector(
'.button--moveLotTypeUp'
burialSiteTypeContainer.querySelector(
'.button--moveBurialSiteTypeUp'
) as HTMLButtonElement
).addEventListener('click', moveLotType)
).addEventListener('click', moveBurialSiteType)
;(
lotTypeContainer.querySelector(
'.button--moveLotTypeDown'
burialSiteTypeContainer.querySelector(
'.button--moveBurialSiteTypeDown'
) as HTMLButtonElement
).addEventListener('click', moveLotType)
).addEventListener('click', moveBurialSiteType)
containerElement.append(lotTypeContainer)
containerElement.append(burialSiteTypeContainer)
}
}
@ -658,18 +672,18 @@ type ResponseJSON =
submitEvent.preventDefault()
cityssm.postJSON(
`${los.urlPrefix}/admin/doAddLotType`,
`${los.urlPrefix}/admin/doAddBurialSiteType`,
submitEvent.currentTarget,
(rawResponseJSON) => {
const responseJSON = rawResponseJSON as ResponseJSON
if (responseJSON.success) {
addCloseModalFunction()
lotTypes = responseJSON.lotTypes
renderLotTypes()
burialSiteTypes = responseJSON.burialSiteTypes
renderBurialSiteTypes()
} else {
bulmaJS.alert({
title: `Error Adding ${los.escapedAliases.Lot} Type`,
title: `Error Adding Burial Site Type`,
message: responseJSON.errorMessage ?? '',
contextualColorName: 'danger'
})
@ -678,7 +692,7 @@ type ResponseJSON =
)
}
cityssm.openHtmlModal('adminLotTypes-addBurialSiteType', {
cityssm.openHtmlModal('adminBurialSiteTypes-add', {
onshow(modalElement) {
los.populateAliases(modalElement)
},
@ -686,7 +700,7 @@ type ResponseJSON =
addCloseModalFunction = closeModalFunction
;(
modalElement.querySelector(
'#lotTypeAdd--lotType'
'#burialSiteTypeAdd--burialSiteType'
) as HTMLInputElement
).focus()
@ -700,5 +714,5 @@ type ResponseJSON =
})
})
renderLotTypes()
renderBurialSiteTypes()
})()

View File

@ -29,23 +29,23 @@
</h1>
</div>
<div class="column has-text-right is-narrow">
<button class="button is-success" id="button--addLotType" type="button" accesskey="n">
<button class="button is-success" id="button--addBurialSiteType" type="button" accesskey="n">
<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>
<span>Add Burial Site Type</span>
</button>
</div>
</div>
<div id="container--lotTypes"></div>
<div id="container--burialSiteTypes"></div>
</div>
</div>
<%- include('_footerA'); -%>
<script>
exports.lotTypes = <%- JSON.stringify(lotTypes) %>;
exports.burialSiteTypes = <%- JSON.stringify(burialSiteTypes) %>;
</script>
<script src="<%= urlPrefix %>/javascripts/adminLotTypes.js"></script>
<script src="<%= urlPrefix %>/javascripts/burialSiteTypes.admin.js"></script>
<%- include('_footerB'); -%>