410 lines
20 KiB
JavaScript
410 lines
20 KiB
JavaScript
"use strict";
|
|
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();
|
|
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);
|
|
}
|
|
else {
|
|
expandedLotTypes.add(burialSiteTypeId);
|
|
}
|
|
// eslint-disable-next-line no-unsanitized/property
|
|
toggleButtonElement.innerHTML = expandedLotTypes.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');
|
|
for (const panelBlockElement of panelBlockElements) {
|
|
panelBlockElement.classList.toggle('is-hidden');
|
|
}
|
|
}
|
|
function lotTypeResponseHandler(rawResponseJSON) {
|
|
const responseJSON = rawResponseJSON;
|
|
if (responseJSON.success) {
|
|
lotTypes = responseJSON.lotTypes;
|
|
renderLotTypes();
|
|
}
|
|
else {
|
|
bulmaJS.alert({
|
|
title: `Error Updating ${los.escapedAliases.Lot} Type`,
|
|
message: responseJSON.errorMessage ?? '',
|
|
contextualColorName: 'danger'
|
|
});
|
|
}
|
|
}
|
|
function deleteLotType(clickEvent) {
|
|
const burialSiteTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotType').dataset.burialSiteTypeId ?? '', 10);
|
|
function doDelete() {
|
|
cityssm.postJSON(`${los.urlPrefix}/admin/doDeleteBurialSiteType`, {
|
|
burialSiteTypeId
|
|
}, lotTypeResponseHandler);
|
|
}
|
|
bulmaJS.confirm({
|
|
title: `Delete ${los.escapedAliases.Lot} Type`,
|
|
message: `Are you sure you want to delete this ${los.escapedAliases.lot} type?`,
|
|
contextualColorName: 'warning',
|
|
okButton: {
|
|
text: `Yes, Delete ${los.escapedAliases.Lot} 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);
|
|
let editCloseModalFunction;
|
|
function doEdit(submitEvent) {
|
|
submitEvent.preventDefault();
|
|
cityssm.postJSON(`${los.urlPrefix}/admin/doUpdateBurialSiteType`, submitEvent.currentTarget, (rawResponseJSON) => {
|
|
const responseJSON = rawResponseJSON;
|
|
lotTypeResponseHandler(responseJSON);
|
|
if (responseJSON.success) {
|
|
editCloseModalFunction();
|
|
}
|
|
});
|
|
}
|
|
cityssm.openHtmlModal('adminLotTypes-editLotType', {
|
|
onshow(modalElement) {
|
|
los.populateAliases(modalElement);
|
|
modalElement.querySelector('#lotTypeEdit--burialSiteTypeId').value = burialSiteTypeId.toString();
|
|
modalElement.querySelector('#lotTypeEdit--lotType').value = lotType.lotType;
|
|
},
|
|
onshown(modalElement, closeModalFunction) {
|
|
editCloseModalFunction = closeModalFunction;
|
|
modalElement.querySelector('#lotTypeEdit--lotType').focus();
|
|
modalElement.querySelector('form')?.addEventListener('submit', doEdit);
|
|
bulmaJS.toggleHtmlClipped();
|
|
},
|
|
onremoved() {
|
|
bulmaJS.toggleHtmlClipped();
|
|
}
|
|
});
|
|
}
|
|
function openAddLotTypeField(clickEvent) {
|
|
const burialSiteTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotType').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);
|
|
if (responseJSON.success) {
|
|
addCloseModalFunction();
|
|
openEditLotTypeField(burialSiteTypeId, responseJSON.lotTypeFieldId);
|
|
}
|
|
});
|
|
}
|
|
cityssm.openHtmlModal('adminLotTypes-addBurialSiteTypeField', {
|
|
onshow(modalElement) {
|
|
los.populateAliases(modalElement);
|
|
if (burialSiteTypeId) {
|
|
;
|
|
modalElement.querySelector('#lotTypeFieldAdd--burialSiteTypeId').value = burialSiteTypeId.toString();
|
|
}
|
|
},
|
|
onshown(modalElement, closeModalFunction) {
|
|
addCloseModalFunction = closeModalFunction;
|
|
modalElement.querySelector('#lotTypeFieldAdd--lotTypeField').focus();
|
|
modalElement.querySelector('form')?.addEventListener('submit', doAdd);
|
|
bulmaJS.toggleHtmlClipped();
|
|
},
|
|
onremoved() {
|
|
bulmaJS.toggleHtmlClipped();
|
|
}
|
|
});
|
|
}
|
|
function moveLotType(clickEvent) {
|
|
const buttonElement = clickEvent.currentTarget;
|
|
const burialSiteTypeId = buttonElement.closest('.container--lotType').dataset.burialSiteTypeId;
|
|
cityssm.postJSON(`${los.urlPrefix}/admin/${buttonElement.dataset.direction === 'up'
|
|
? 'doMoveBurialSiteTypeUp'
|
|
: 'doMoveBurialSiteTypeDown'}`, {
|
|
burialSiteTypeId,
|
|
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
|
}, lotTypeResponseHandler);
|
|
}
|
|
function openEditLotTypeField(burialSiteTypeId, lotTypeFieldId) {
|
|
const lotType = lotTypes.find((currentLotType) => currentLotType.burialSiteTypeId === burialSiteTypeId);
|
|
const lotTypeField = (lotType.BurialSiteTypeFields ?? []).find((currentLotTypeField) => currentLotTypeField.lotTypeFieldId === lotTypeFieldId);
|
|
let fieldTypeElement;
|
|
let minLengthInputElement;
|
|
let maxLengthInputElement;
|
|
let patternElement;
|
|
let lotTypeFieldValuesElement;
|
|
let editCloseModalFunction;
|
|
function updateMaximumLengthMin() {
|
|
maxLengthInputElement.min = minLengthInputElement.value;
|
|
}
|
|
function toggleInputFields() {
|
|
switch (fieldTypeElement.value) {
|
|
case 'date': {
|
|
minLengthInputElement.disabled = true;
|
|
maxLengthInputElement.disabled = true;
|
|
patternElement.disabled = true;
|
|
lotTypeFieldValuesElement.disabled = true;
|
|
break;
|
|
}
|
|
case 'select': {
|
|
minLengthInputElement.disabled = true;
|
|
maxLengthInputElement.disabled = true;
|
|
patternElement.disabled = true;
|
|
lotTypeFieldValuesElement.disabled = false;
|
|
break;
|
|
}
|
|
default: {
|
|
minLengthInputElement.disabled = false;
|
|
maxLengthInputElement.disabled = false;
|
|
patternElement.disabled = false;
|
|
lotTypeFieldValuesElement.disabled = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
function doUpdate(submitEvent) {
|
|
submitEvent.preventDefault();
|
|
cityssm.postJSON(`${los.urlPrefix}/admin/doUpdateBurialSiteTypeField`, submitEvent.currentTarget, (rawResponseJSON) => {
|
|
const responseJSON = rawResponseJSON;
|
|
lotTypeResponseHandler(responseJSON);
|
|
if (responseJSON.success) {
|
|
editCloseModalFunction();
|
|
}
|
|
});
|
|
}
|
|
function doDelete() {
|
|
cityssm.postJSON(`${los.urlPrefix}/admin/doDeleteBurialSiteTypeField`, {
|
|
lotTypeFieldId
|
|
}, (rawResponseJSON) => {
|
|
const responseJSON = rawResponseJSON;
|
|
lotTypeResponseHandler(responseJSON);
|
|
if (responseJSON.success) {
|
|
editCloseModalFunction();
|
|
}
|
|
});
|
|
}
|
|
function confirmDoDelete() {
|
|
bulmaJS.confirm({
|
|
title: 'Delete Field',
|
|
message: 'Are you sure you want to delete this field? Note that historical records that make use of this field will not be affected.',
|
|
contextualColorName: 'warning',
|
|
okButton: {
|
|
text: 'Yes, Delete Field',
|
|
callbackFunction: doDelete
|
|
}
|
|
});
|
|
}
|
|
cityssm.openHtmlModal('adminLotTypes-editLotTypeField', {
|
|
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');
|
|
minLengthInputElement.value =
|
|
lotTypeField.minLength?.toString() ?? '';
|
|
maxLengthInputElement = modalElement.querySelector('#lotTypeFieldEdit--maxLength');
|
|
maxLengthInputElement.value =
|
|
lotTypeField.maxLength?.toString() ?? '';
|
|
patternElement = modalElement.querySelector('#lotTypeFieldEdit--pattern');
|
|
patternElement.value = lotTypeField.pattern ?? '';
|
|
lotTypeFieldValuesElement = modalElement.querySelector('#lotTypeFieldEdit--lotTypeFieldValues');
|
|
lotTypeFieldValuesElement.value = lotTypeField.lotTypeFieldValues ?? '';
|
|
toggleInputFields();
|
|
},
|
|
onshown(modalElement, closeModalFunction) {
|
|
editCloseModalFunction = closeModalFunction;
|
|
bulmaJS.init(modalElement);
|
|
bulmaJS.toggleHtmlClipped();
|
|
cityssm.enableNavBlocker();
|
|
modalElement.querySelector('form')?.addEventListener('submit', doUpdate);
|
|
minLengthInputElement.addEventListener('keyup', updateMaximumLengthMin);
|
|
updateMaximumLengthMin();
|
|
fieldTypeElement.addEventListener('change', toggleInputFields);
|
|
modalElement
|
|
.querySelector('#button--deleteLotTypeField')
|
|
?.addEventListener('click', confirmDoDelete);
|
|
},
|
|
onremoved() {
|
|
bulmaJS.toggleHtmlClipped();
|
|
cityssm.disableNavBlocker();
|
|
}
|
|
});
|
|
}
|
|
function openEditLotTypeFieldByClick(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);
|
|
}
|
|
function moveLotTypeField(clickEvent) {
|
|
const buttonElement = clickEvent.currentTarget;
|
|
const lotTypeFieldId = buttonElement.closest('.container--lotTypeField').dataset.lotTypeFieldId;
|
|
cityssm.postJSON(`${los.urlPrefix}/admin/${buttonElement.dataset.direction === 'up'
|
|
? 'doMoveBurialSiteTypeFieldUp'
|
|
: 'doMoveBurialSiteTypeFieldDown'}`, {
|
|
lotTypeFieldId,
|
|
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
|
}, lotTypeResponseHandler);
|
|
}
|
|
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'}">
|
|
<div class="message is-info"><p class="message-body">There are no additional fields.</p></div>
|
|
</div>`);
|
|
}
|
|
else {
|
|
for (const lotTypeField of BurialSiteTypeFields) {
|
|
const panelBlockElement = document.createElement('div');
|
|
panelBlockElement.className =
|
|
'panel-block is-block container--lotTypeField';
|
|
if (!expandedLotTypes.has(burialSiteTypeId)) {
|
|
panelBlockElement.classList.add('is-hidden');
|
|
}
|
|
panelBlockElement.dataset.lotTypeFieldId =
|
|
lotTypeField.lotTypeFieldId.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>
|
|
</div>
|
|
</div>
|
|
<div class="level-right">
|
|
<div class="level-item">
|
|
${los.getMoveUpDownButtonFieldHTML('button--moveLotTypeFieldUp', 'button--moveLotTypeFieldDown')}
|
|
</div>
|
|
</div>
|
|
</div>`;
|
|
panelBlockElement
|
|
.querySelector('.button--editLotTypeField')
|
|
?.addEventListener('click', openEditLotTypeFieldByClick);
|
|
panelBlockElement.querySelector('.button--moveLotTypeFieldUp').addEventListener('click', moveLotTypeField);
|
|
panelBlockElement.querySelector('.button--moveLotTypeFieldDown').addEventListener('click', moveLotTypeField);
|
|
panelElement.append(panelBlockElement);
|
|
}
|
|
}
|
|
}
|
|
function renderLotTypes() {
|
|
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>
|
|
</div>`);
|
|
return;
|
|
}
|
|
for (const lotType of lotTypes) {
|
|
const lotTypeContainer = document.createElement('div');
|
|
lotTypeContainer.className = 'panel container--lotType';
|
|
lotTypeContainer.dataset.burialSiteTypeId = lotType.burialSiteTypeId.toString();
|
|
// eslint-disable-next-line no-unsanitized/property
|
|
lotTypeContainer.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)
|
|
? '<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>
|
|
</div>
|
|
</div>
|
|
<div class="level-right">
|
|
<div class="level-item">
|
|
<button class="button is-danger is-small button--deleteLotType" 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">
|
|
<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>
|
|
<span>Edit ${los.escapedAliases.Lot} Type</span>
|
|
</button>
|
|
</div>
|
|
<div class="level-item">
|
|
<button class="button is-success is-small button--addBurialSiteTypeField" type="button">
|
|
<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>
|
|
<span>Add Field</span>
|
|
</button>
|
|
</div>
|
|
<div class="level-item">
|
|
${los.getMoveUpDownButtonFieldHTML('button--moveLotTypeUp', 'button--moveLotTypeDown')}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>`;
|
|
renderBurialSiteTypeFields(lotTypeContainer, lotType.burialSiteTypeId, lotType.BurialSiteTypeFields ?? []);
|
|
lotTypeContainer
|
|
.querySelector('.button--toggleBurialSiteTypeFields')
|
|
?.addEventListener('click', toggleBurialSiteTypeFields);
|
|
lotTypeContainer
|
|
.querySelector('.button--deleteLotType')
|
|
?.addEventListener('click', deleteLotType);
|
|
lotTypeContainer
|
|
.querySelector('.button--editLotType')
|
|
?.addEventListener('click', openEditLotType);
|
|
lotTypeContainer
|
|
.querySelector('.button--addBurialSiteTypeField')
|
|
?.addEventListener('click', openAddLotTypeField);
|
|
lotTypeContainer.querySelector('.button--moveLotTypeUp').addEventListener('click', moveLotType);
|
|
lotTypeContainer.querySelector('.button--moveLotTypeDown').addEventListener('click', moveLotType);
|
|
containerElement.append(lotTypeContainer);
|
|
}
|
|
}
|
|
document
|
|
.querySelector('#button--addBurialSiteType')
|
|
?.addEventListener('click', () => {
|
|
let addCloseModalFunction;
|
|
function doAdd(submitEvent) {
|
|
submitEvent.preventDefault();
|
|
cityssm.postJSON(`${los.urlPrefix}/admin/doAddLotType`, submitEvent.currentTarget, (rawResponseJSON) => {
|
|
const responseJSON = rawResponseJSON;
|
|
if (responseJSON.success) {
|
|
addCloseModalFunction();
|
|
lotTypes = responseJSON.lotTypes;
|
|
renderLotTypes();
|
|
}
|
|
else {
|
|
bulmaJS.alert({
|
|
title: `Error Adding ${los.escapedAliases.Lot} Type`,
|
|
message: responseJSON.errorMessage ?? '',
|
|
contextualColorName: 'danger'
|
|
});
|
|
}
|
|
});
|
|
}
|
|
cityssm.openHtmlModal('adminLotTypes-addBurialSiteType', {
|
|
onshow(modalElement) {
|
|
los.populateAliases(modalElement);
|
|
},
|
|
onshown(modalElement, closeModalFunction) {
|
|
addCloseModalFunction = closeModalFunction;
|
|
modalElement.querySelector('#lotTypeAdd--lotType').focus();
|
|
modalElement.querySelector('form')?.addEventListener('submit', doAdd);
|
|
bulmaJS.toggleHtmlClipped();
|
|
},
|
|
onremoved() {
|
|
bulmaJS.toggleHtmlClipped();
|
|
}
|
|
});
|
|
});
|
|
renderLotTypes();
|
|
})();
|