From 48cecf873585475258a83093d037e6053cafe1c5 Mon Sep 17 00:00:00 2001 From: Dan Gowans Date: Fri, 21 Oct 2022 11:27:02 -0400 Subject: [PATCH] fee management cypress tests --- cypress/e2e/01-admin/feeManagement.cy.d.ts | 1 + cypress/e2e/01-admin/feeManagement.cy.js | 53 +++++++++++++ cypress/e2e/01-admin/feeManagement.cy.ts | 90 ++++++++++++++++++++++ cypress/e2e/02-update/maps.cy.ts | 2 +- cypress/fixtures/fee.json | 7 ++ cypress/fixtures/map.json | 2 +- nodemon.json | 2 +- public-typescript/adminFees.js | 2 +- public-typescript/adminFees.ts | 2 +- public/html/adminFees-addFee.html | 10 +-- public/html/adminFees-addFeeCategory.html | 10 +-- public/javascripts/adminFees.min.js | 2 +- views/admin-fees.ejs | 2 +- 13 files changed, 168 insertions(+), 17 deletions(-) create mode 100644 cypress/e2e/01-admin/feeManagement.cy.d.ts create mode 100644 cypress/e2e/01-admin/feeManagement.cy.js create mode 100644 cypress/e2e/01-admin/feeManagement.cy.ts create mode 100644 cypress/fixtures/fee.json diff --git a/cypress/e2e/01-admin/feeManagement.cy.d.ts b/cypress/e2e/01-admin/feeManagement.cy.d.ts new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/cypress/e2e/01-admin/feeManagement.cy.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/cypress/e2e/01-admin/feeManagement.cy.js b/cypress/e2e/01-admin/feeManagement.cy.js new file mode 100644 index 00000000..1de502f7 --- /dev/null +++ b/cypress/e2e/01-admin/feeManagement.cy.js @@ -0,0 +1,53 @@ +import { testAdmin } from "../../../test/_globals.js"; +import { logout, login, ajaxDelayMillis } from "../../support/index.js"; +import * as configFunctions from "../../../helpers/functions.config.js"; +describe("Admin - Fee Management", () => { + before(() => { + logout(); + login(testAdmin); + }); + after(logout); + beforeEach("Loads page", () => { + cy.visit("/admin/fees"); + cy.location("pathname").should("equal", "/admin/fees"); + }); + it("Has no detectable accessibility issues", () => { + cy.injectAxe(); + cy.checkA11y(); + }); + it("Creates a new fee category", () => { + cy.get("[data-cy='addFeeCategory']").click(); + cy.get(".modal").should("be.visible"); + cy.injectAxe(); + cy.checkA11y(); + cy.fixture("fee.json").then((fee) => { + cy.get(".modal input[name='feeCategory']").type(fee.feeCategory); + cy.get(".modal button[type='submit']").click(); + cy.wait(ajaxDelayMillis); + cy.get(".container--feeCategory .panel-heading .title").should("contain.text", fee.feeCategory); + }); + }); + it.only("Creates a new fee", () => { + cy.get("[data-cy='addFee']").first().click(); + cy.get(".modal").should("be.visible"); + cy.injectAxe(); + cy.checkA11y(); + cy.fixture("fee.json").then((fee) => { + cy.get(".modal input[name='feeName']").type(fee.feeName); + cy.get(".modal textarea[name='feeDescription']").type(fee.feeDescription); + cy.get(".modal input[name='feeAmount']").clear().type(fee.feeAmount.toString()); + cy.get(".modal input[name='taxAmount']").should("be.disabled"); + cy.get(".modal input[name='taxPercentage']") + .invoke("val") + .should("equal", configFunctions.getProperty("settings.fees.taxPercentageDefault").toString()); + cy.get(".modal input[name='quantityUnit']").should("be.disabled"); + cy.get(".modal select[name='includeQuantity']").select("1"); + cy.get(".modal input[name='quantityUnit']") + .should("not.be.disabled") + .type(fee.quantityUnit); + cy.get(".modal button[type='submit']").click(); + cy.wait(ajaxDelayMillis); + cy.get(".container--fee a").should("contain.text", fee.feeName); + }); + }); +}); diff --git a/cypress/e2e/01-admin/feeManagement.cy.ts b/cypress/e2e/01-admin/feeManagement.cy.ts new file mode 100644 index 00000000..13bbbf41 --- /dev/null +++ b/cypress/e2e/01-admin/feeManagement.cy.ts @@ -0,0 +1,90 @@ +/* eslint-disable unicorn/filename-case, promise/catch-or-return, promise/always-return */ + +import { testAdmin } from "../../../test/_globals.js"; + +import { logout, login, ajaxDelayMillis } from "../../support/index.js"; + +import * as configFunctions from "../../../helpers/functions.config.js"; + +import type * as recordTypes from "../../../types/recordTypes"; + +describe("Admin - Fee Management", () => { + before(() => { + logout(); + login(testAdmin); + }); + + after(logout); + + beforeEach("Loads page", () => { + cy.visit("/admin/fees"); + cy.location("pathname").should("equal", "/admin/fees"); + }); + + it("Has no detectable accessibility issues", () => { + cy.injectAxe(); + cy.checkA11y(); + }); + + it("Creates a new fee category", () => { + cy.get("[data-cy='addFeeCategory']").click(); + + cy.get(".modal").should("be.visible"); + + cy.injectAxe(); + cy.checkA11y(); + + cy.fixture("fee.json").then((fee: recordTypes.Fee) => { + cy.get(".modal input[name='feeCategory']").type(fee.feeCategory); + + cy.get(".modal button[type='submit']").click(); + + cy.wait(ajaxDelayMillis); + + cy.get(".container--feeCategory .panel-heading .title").should( + "contain.text", + fee.feeCategory + ); + }); + }); + + it.only("Creates a new fee", () => { + cy.get("[data-cy='addFee']").first().click(); + + cy.get(".modal").should("be.visible"); + + cy.injectAxe(); + cy.checkA11y(); + + cy.fixture("fee.json").then((fee: recordTypes.Fee) => { + cy.get(".modal input[name='feeName']").type(fee.feeName); + + cy.get(".modal textarea[name='feeDescription']").type(fee.feeDescription); + + cy.get(".modal input[name='feeAmount']").clear().type(fee.feeAmount.toString()); + + cy.get(".modal input[name='taxAmount']").should("be.disabled"); + + cy.get(".modal input[name='taxPercentage']") + .invoke("val") + .should( + "equal", + configFunctions.getProperty("settings.fees.taxPercentageDefault").toString() + ); + + cy.get(".modal input[name='quantityUnit']").should("be.disabled"); + + cy.get(".modal select[name='includeQuantity']").select("1"); + + cy.get(".modal input[name='quantityUnit']") + .should("not.be.disabled") + .type(fee.quantityUnit); + + cy.get(".modal button[type='submit']").click(); + + cy.wait(ajaxDelayMillis); + + cy.get(".container--fee a").should("contain.text", fee.feeName); + }); + }); +}); diff --git a/cypress/e2e/02-update/maps.cy.ts b/cypress/e2e/02-update/maps.cy.ts index 06dce554..ca401f93 100644 --- a/cypress/e2e/02-update/maps.cy.ts +++ b/cypress/e2e/02-update/maps.cy.ts @@ -4,7 +4,7 @@ import { logout, login } from "../../support/index.js"; import * as configFunctions from "../../../helpers/functions.config.js"; -import * as recordTypes from "../../../types/recordTypes"; +import type * as recordTypes from "../../../types/recordTypes"; describe("Update - Maps", () => { before(() => { diff --git a/cypress/fixtures/fee.json b/cypress/fixtures/fee.json new file mode 100644 index 00000000..3c4da779 --- /dev/null +++ b/cypress/fixtures/fee.json @@ -0,0 +1,7 @@ +{ + "feeCategory": "Cypress Test - Fee Category", + "feeName": "Cypress Test - Fee Name", + "feeDescription": "Test Description", + "feeAmount": 10.50, + "quantityUnit": "units" +} \ No newline at end of file diff --git a/cypress/fixtures/map.json b/cypress/fixtures/map.json index 5de56552..d72e1b50 100644 --- a/cypress/fixtures/map.json +++ b/cypress/fixtures/map.json @@ -1,5 +1,5 @@ { - "mapName": "Holy Sepulchre (Test)", + "mapName": "Cypress Test - Holy Sepulchre", "mapDescription": "Operated by the City of Sault Ste. Marie" , "mapAddress1": "Fourth Line and Peoples Road", "mapAddress2": "27 Fourth Line East", diff --git a/nodemon.json b/nodemon.json index 377b4812..72370ce1 100644 --- a/nodemon.json +++ b/nodemon.json @@ -1,3 +1,3 @@ { - "ignore": ["data/sessions/*", "public/javascripts/*", "public-typescript/*"] + "ignore": ["cypress/*", "data/sessions/*", "public/javascripts/*", "public-typescript/*"] } diff --git a/public-typescript/adminFees.js b/public-typescript/adminFees.js index cf817456..bd0a4fec 100644 --- a/public-typescript/adminFees.js +++ b/public-typescript/adminFees.js @@ -45,7 +45,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); "" + "") + ('
' + - '" + diff --git a/public-typescript/adminFees.ts b/public-typescript/adminFees.ts index ec552028..1c4d181d 100644 --- a/public-typescript/adminFees.ts +++ b/public-typescript/adminFees.ts @@ -67,7 +67,7 @@ declare const bulmaJS: BulmaJS; "" + "
") + ('
' + - '" + diff --git a/public/html/adminFees-addFee.html b/public/html/adminFees-addFee.html index 165d9ebd..e8078596 100644 --- a/public/html/adminFees-addFee.html +++ b/public/html/adminFees-addFee.html @@ -1,12 +1,12 @@ -
\ No newline at end of file diff --git a/public/html/adminFees-addFeeCategory.html b/public/html/adminFees-addFeeCategory.html index 878b9995..f1c350e2 100644 --- a/public/html/adminFees-addFeeCategory.html +++ b/public/html/adminFees-addFeeCategory.html @@ -1,12 +1,12 @@ - \ No newline at end of file diff --git a/public/javascripts/adminFees.min.js b/public/javascripts/adminFees.min.js index 432b0a8e..2d9a67c1 100644 --- a/public/javascripts/adminFees.min.js +++ b/public/javascripts/adminFees.min.js @@ -1 +1 @@ -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=exports.los,t=document.querySelector("main").dataset.urlPrefix,s=document.querySelector("#container--feeCategories");let o=exports.feeCategories;delete exports.feeCategories;const a=()=>{if(0!==o.length){s.innerHTML="";for(const e of o){const t=document.createElement("section");if(t.className="panel container--feeCategory",t.dataset.feeCategoryId=e.feeCategoryId.toString(),t.innerHTML='

'+cityssm.escapeHTML(e.feeCategory)+'

'+(0===e.fees.length?'
':"")+'
',0===e.fees.length)t.insertAdjacentHTML("beforeend",'

There are no fees in the "'+cityssm.escapeHTML(e.feeCategory)+'" category.

');else for(const s of e.fees){const e=document.createElement("div");e.className="panel-block is-block container--fee",e.dataset.feeId=s.feeId.toString(),e.innerHTML='

'+cityssm.escapeHTML(s.feeName)+"
"+cityssm.escapeHTML(s.feeDescription).replace(/\n/g,"
")+'

'+(s.isRequired?'Required':"")+(s.occupancyTypeId?' '+cityssm.escapeHTML(s.occupancyType)+"":"")+(s.lotTypeId?' '+cityssm.escapeHTML(s.lotType)+"":"")+'

'+(s.feeFunction?cityssm.escapeHTML(s.feeFunction)+"
Fee Function":"$"+s.feeAmount.toFixed(2)+"
Fee")+'
'+(s.taxPercentage?s.taxPercentage+"%":"$"+s.taxAmount.toFixed(2))+'
Tax
'+(s.includeQuantity?cityssm.escapeHTML(s.quantityUnit)+"
Quantity":"")+'
',e.querySelector("a").addEventListener("click",d),e.querySelector(".button--moveFeeUp").addEventListener("click",u),e.querySelector(".button--moveFeeDown").addEventListener("click",y),t.append(e)}0===e.fees.length&&t.querySelector(".button--deleteFeeCategory").addEventListener("click",n),t.querySelector(".button--editFeeCategory").addEventListener("click",r),t.querySelector(".button--addFee").addEventListener("click",i),t.querySelector(".button--moveFeeCategoryUp").addEventListener("click",c),t.querySelector(".button--moveFeeCategoryDown").addEventListener("click",l),s.append(t)}}else s.innerHTML='

There are no available fees.

'};document.querySelector("#button--addFeeCategory").addEventListener("click",()=>{let e;const s=s=>{s.preventDefault(),cityssm.postJSON(t+"/admin/doAddFeeCategory",s.currentTarget,t=>{t.success?(o=t.feeCategories,e(),a()):bulmaJS.alert({title:"Error Creating Fee Category",message:t.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("adminFees-addFeeCategory",{onshown:(t,o)=>{bulmaJS.toggleHtmlClipped(),t.querySelector("#feeCategoryAdd--feeCategory").focus(),e=o,t.querySelector("form").addEventListener("submit",s)},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})});const r=e=>{const s=Number.parseInt(e.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10),r=o.find(e=>e.feeCategoryId===s);let n;const c=e=>{e.preventDefault(),cityssm.postJSON(t+"/admin/doUpdateFeeCategory",e.currentTarget,e=>{e.success?(o=e.feeCategories,n(),a()):bulmaJS.alert({title:"Error Updating Fee Category",message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("adminFees-editFeeCategory",{onshow:e=>{e.querySelector("#feeCategoryEdit--feeCategoryId").value=r.feeCategoryId.toString(),e.querySelector("#feeCategoryEdit--feeCategory").value=r.feeCategory},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),n=t,e.querySelector("form").addEventListener("submit",c),e.querySelector("#feeCategoryEdit--feeCategory").focus()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},n=e=>{const s=Number.parseInt(e.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10);bulmaJS.confirm({title:"Delete Fee Category?",message:"Are you sure you want to delete this fee category?",contextualColorName:"warning",okButton:{text:"Yes, Delete the Fee Category",callbackFunction:()=>{cityssm.postJSON(t+"/admin/doDeleteFeeCategory",{feeCategoryId:s},e=>{e.success?(o=e.feeCategories,a()):bulmaJS.alert({title:"Error Updating Fee Category",message:e.errorMessage,contextualColorName:"danger"})})}}})},c=e=>{const s=Number.parseInt(e.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10);cityssm.postJSON(t+"/admin/doMoveFeeCategoryUp",{feeCategoryId:s,moveToTop:e.shiftKey?"1":"0"},e=>{e.success?(o=e.feeCategories,a()):bulmaJS.alert({title:"Error Moving Fee Category",message:e.errorMessage,contextualColorName:"danger"})})},l=e=>{const s=Number.parseInt(e.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10);cityssm.postJSON(t+"/admin/doMoveFeeCategoryDown",{feeCategoryId:s,moveToBottom:e.shiftKey?"1":"0"},e=>{e.success?(o=e.feeCategories,a()):bulmaJS.alert({title:"Error Moving Fee Category",message:e.errorMessage,contextualColorName:"danger"})})},i=s=>{const r=Number.parseInt(s.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10);let n;const c=e=>{e.preventDefault(),cityssm.postJSON(t+"/admin/doAddFee",e.currentTarget,e=>{e.success?(o=e.feeCategories,n(),a()):bulmaJS.alert({title:"Error Adding Fee",message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("adminFees-addFee",{onshow:t=>{const s=t.querySelector("#feeAdd--feeCategoryId");for(const e of o){const t=document.createElement("option");t.value=e.feeCategoryId.toString(),t.textContent=e.feeCategory,e.feeCategoryId===r&&(t.selected=!0),s.append(t)}const a=t.querySelector("#feeAdd--occupancyTypeId");for(const e of exports.occupancyTypes){const t=document.createElement("option");t.value=e.occupancyTypeId.toString(),t.textContent=e.occupancyType,a.append(t)}const n=t.querySelector("#feeAdd--lotTypeId");for(const e of exports.lotTypes){const t=document.createElement("option");t.value=e.lotTypeId.toString(),t.textContent=e.lotType,n.append(t)}t.querySelector("#feeAdd--taxPercentage").value=exports.taxPercentageDefault.toString(),e.populateAliases(t)},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),n=t,e.querySelector("form").addEventListener("submit",c),e.querySelector("#feeAdd--feeName").focus(),e.querySelector("#feeAdd--feeFunction").addEventListener("change",()=>{const t=e.querySelector("#feeAdd--feeAmount"),s=e.querySelector("#feeAdd--feeFunction");""===s.value?(s.closest(".select").classList.remove("is-success"),t.classList.add("is-success"),t.disabled=!1):(s.closest(".select").classList.add("is-success"),t.classList.remove("is-success"),t.disabled=!0)}),e.querySelector("#feeAdd--taxPercentage").addEventListener("keyup",()=>{const t=e.querySelector("#feeAdd--taxAmount"),s=e.querySelector("#feeAdd--taxPercentage");""===s.value?(s.classList.remove("is-success"),t.classList.add("is-success"),t.disabled=!1):(s.classList.add("is-success"),t.classList.remove("is-success"),t.disabled=!0)}),e.querySelector("#feeAdd--includeQuantity").addEventListener("change",()=>{e.querySelector("#feeAdd--quantityUnit").disabled=""===e.querySelector("#feeAdd--includeQuantity").value})},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},d=s=>{s.preventDefault();const r=s.currentTarget.closest(".container--fee"),n=Number.parseInt(r.dataset.feeId,10),c=Number.parseInt(r.closest(".container--feeCategory").dataset.feeCategoryId),l=o.find(e=>e.feeCategoryId===c).fees.find(e=>e.feeId===n);let i,d;const u=e=>{e.preventDefault(),cityssm.postJSON(t+"/admin/doUpdateFee",e.currentTarget,e=>{e.success?(o=e.feeCategories,i(),a()):bulmaJS.alert({title:"Error Updating Fee",message:e.errorMessage,contextualColorName:"danger"})})},y=e=>{e.preventDefault();bulmaJS.confirm({title:"Delete Fee?",message:"Are you sure you want to delete this fee?",contextualColorName:"warning",okButton:{text:"Yes, Delete the Fee",callbackFunction:()=>{cityssm.postJSON(t+"/admin/doDeleteFee",{feeId:n},e=>{e.success?(o=e.feeCategories,i(),a()):bulmaJS.alert({title:"Error Deleting Fee",message:e.errorMessage,contextualColorName:"danger"})})}}})},m=()=>{const e=d.querySelector("#feeEdit--feeAmount"),t=d.querySelector("#feeEdit--feeFunction");""===t.value?(t.closest(".select").classList.remove("is-success"),e.classList.add("is-success"),e.disabled=!1):(t.closest(".select").classList.add("is-success"),e.classList.remove("is-success"),e.disabled=!0)},p=()=>{const e=d.querySelector("#feeEdit--taxAmount"),t=d.querySelector("#feeEdit--taxPercentage");""===t.value?(t.classList.remove("is-success"),e.classList.add("is-success"),e.disabled=!1):(t.classList.add("is-success"),e.classList.remove("is-success"),e.disabled=!0)},g=()=>{d.querySelector("#feeEdit--quantityUnit").disabled=""===d.querySelector("#feeEdit--includeQuantity").value};cityssm.openHtmlModal("adminFees-editFee",{onshow:t=>{d=t,t.querySelector("#feeEdit--feeId").value=l.feeId.toString();const s=t.querySelector("#feeEdit--feeCategoryId");for(const e of o){const t=document.createElement("option");t.value=e.feeCategoryId.toString(),t.textContent=e.feeCategory,e.feeCategoryId===c&&(t.selected=!0),s.append(t)}t.querySelector("#feeEdit--feeName").value=l.feeName,t.querySelector("#feeEdit--feeDescription").value=l.feeDescription;const a=t.querySelector("#feeEdit--occupancyTypeId");for(const e of exports.occupancyTypes){const t=document.createElement("option");t.value=e.occupancyTypeId.toString(),t.textContent=e.occupancyType,e.occupancyTypeId===l.occupancyTypeId&&(t.selected=!0),a.append(t)}const r=t.querySelector("#feeEdit--lotTypeId");for(const e of exports.lotTypes){const t=document.createElement("option");t.value=e.lotTypeId.toString(),t.textContent=e.lotType,e.lotTypeId===l.lotTypeId&&(t.selected=!0),r.append(t)}t.querySelector("#feeEdit--feeAmount").value=l.feeAmount?l.feeAmount.toFixed(2):"",t.querySelector("#feeEdit--feeFunction").addEventListener("change",m),m(),t.querySelector("#feeEdit--taxAmount").value=l.taxAmount?l.taxAmount.toFixed(2):"";const n=t.querySelector("#feeEdit--taxPercentage");n.value=l.taxPercentage?l.taxPercentage.toString():"",n.addEventListener("keyup",p),p();const i=t.querySelector("#feeEdit--includeQuantity");l.includeQuantity&&(i.value="1"),i.addEventListener("change",g),t.querySelector("#feeEdit--quantityUnit").value=l.quantityUnit||"",g(),l.isRequired&&(t.querySelector("#feeEdit--isRequired").value="1"),e.populateAliases(t)},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),i=t,e.querySelector("form").addEventListener("submit",u),bulmaJS.init(e),e.querySelector(".button--deleteFee").addEventListener("click",y)},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},u=e=>{const s=e.currentTarget.closest(".container--fee"),r=Number.parseInt(s.dataset.feeId,10);cityssm.postJSON(t+"/admin/doMoveFeeUp",{feeId:r,moveToTop:e.shiftKey?"1":"0"},e=>{e.success?(o=e.feeCategories,a()):bulmaJS.alert({title:"Error Moving Fee",message:e.errorMessage,contextualColorName:"danger"})})},y=e=>{const s=e.currentTarget.closest(".container--fee"),r=Number.parseInt(s.dataset.feeId,10);cityssm.postJSON(t+"/admin/doMoveFeeDown",{feeId:r,moveToBottom:e.shiftKey?"1":"0"},e=>{e.success?(o=e.feeCategories,a()):bulmaJS.alert({title:"Error Moving Fee",message:e.errorMessage,contextualColorName:"danger"})})};a()})(); \ No newline at end of file +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=exports.los,t=document.querySelector("main").dataset.urlPrefix,s=document.querySelector("#container--feeCategories");let o=exports.feeCategories;delete exports.feeCategories;const a=()=>{if(0!==o.length){s.innerHTML="";for(const e of o){const t=document.createElement("section");if(t.className="panel container--feeCategory",t.dataset.feeCategoryId=e.feeCategoryId.toString(),t.innerHTML='

'+cityssm.escapeHTML(e.feeCategory)+'

'+(0===e.fees.length?'
':"")+'
',0===e.fees.length)t.insertAdjacentHTML("beforeend",'

There are no fees in the "'+cityssm.escapeHTML(e.feeCategory)+'" category.

');else for(const s of e.fees){const e=document.createElement("div");e.className="panel-block is-block container--fee",e.dataset.feeId=s.feeId.toString(),e.innerHTML='

'+cityssm.escapeHTML(s.feeName)+"
"+cityssm.escapeHTML(s.feeDescription).replace(/\n/g,"
")+'

'+(s.isRequired?'Required':"")+(s.occupancyTypeId?' '+cityssm.escapeHTML(s.occupancyType)+"":"")+(s.lotTypeId?' '+cityssm.escapeHTML(s.lotType)+"":"")+'

'+(s.feeFunction?cityssm.escapeHTML(s.feeFunction)+"
Fee Function":"$"+s.feeAmount.toFixed(2)+"
Fee")+'
'+(s.taxPercentage?s.taxPercentage+"%":"$"+s.taxAmount.toFixed(2))+'
Tax
'+(s.includeQuantity?cityssm.escapeHTML(s.quantityUnit)+"
Quantity":"")+'
',e.querySelector("a").addEventListener("click",d),e.querySelector(".button--moveFeeUp").addEventListener("click",u),e.querySelector(".button--moveFeeDown").addEventListener("click",y),t.append(e)}0===e.fees.length&&t.querySelector(".button--deleteFeeCategory").addEventListener("click",n),t.querySelector(".button--editFeeCategory").addEventListener("click",r),t.querySelector(".button--addFee").addEventListener("click",i),t.querySelector(".button--moveFeeCategoryUp").addEventListener("click",c),t.querySelector(".button--moveFeeCategoryDown").addEventListener("click",l),s.append(t)}}else s.innerHTML='

There are no available fees.

'};document.querySelector("#button--addFeeCategory").addEventListener("click",()=>{let e;const s=s=>{s.preventDefault(),cityssm.postJSON(t+"/admin/doAddFeeCategory",s.currentTarget,t=>{t.success?(o=t.feeCategories,e(),a()):bulmaJS.alert({title:"Error Creating Fee Category",message:t.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("adminFees-addFeeCategory",{onshown:(t,o)=>{bulmaJS.toggleHtmlClipped(),t.querySelector("#feeCategoryAdd--feeCategory").focus(),e=o,t.querySelector("form").addEventListener("submit",s)},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})});const r=e=>{const s=Number.parseInt(e.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10),r=o.find(e=>e.feeCategoryId===s);let n;const c=e=>{e.preventDefault(),cityssm.postJSON(t+"/admin/doUpdateFeeCategory",e.currentTarget,e=>{e.success?(o=e.feeCategories,n(),a()):bulmaJS.alert({title:"Error Updating Fee Category",message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("adminFees-editFeeCategory",{onshow:e=>{e.querySelector("#feeCategoryEdit--feeCategoryId").value=r.feeCategoryId.toString(),e.querySelector("#feeCategoryEdit--feeCategory").value=r.feeCategory},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),n=t,e.querySelector("form").addEventListener("submit",c),e.querySelector("#feeCategoryEdit--feeCategory").focus()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},n=e=>{const s=Number.parseInt(e.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10);bulmaJS.confirm({title:"Delete Fee Category?",message:"Are you sure you want to delete this fee category?",contextualColorName:"warning",okButton:{text:"Yes, Delete the Fee Category",callbackFunction:()=>{cityssm.postJSON(t+"/admin/doDeleteFeeCategory",{feeCategoryId:s},e=>{e.success?(o=e.feeCategories,a()):bulmaJS.alert({title:"Error Updating Fee Category",message:e.errorMessage,contextualColorName:"danger"})})}}})},c=e=>{const s=Number.parseInt(e.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10);cityssm.postJSON(t+"/admin/doMoveFeeCategoryUp",{feeCategoryId:s,moveToTop:e.shiftKey?"1":"0"},e=>{e.success?(o=e.feeCategories,a()):bulmaJS.alert({title:"Error Moving Fee Category",message:e.errorMessage,contextualColorName:"danger"})})},l=e=>{const s=Number.parseInt(e.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10);cityssm.postJSON(t+"/admin/doMoveFeeCategoryDown",{feeCategoryId:s,moveToBottom:e.shiftKey?"1":"0"},e=>{e.success?(o=e.feeCategories,a()):bulmaJS.alert({title:"Error Moving Fee Category",message:e.errorMessage,contextualColorName:"danger"})})},i=s=>{const r=Number.parseInt(s.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10);let n;const c=e=>{e.preventDefault(),cityssm.postJSON(t+"/admin/doAddFee",e.currentTarget,e=>{e.success?(o=e.feeCategories,n(),a()):bulmaJS.alert({title:"Error Adding Fee",message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("adminFees-addFee",{onshow:t=>{const s=t.querySelector("#feeAdd--feeCategoryId");for(const e of o){const t=document.createElement("option");t.value=e.feeCategoryId.toString(),t.textContent=e.feeCategory,e.feeCategoryId===r&&(t.selected=!0),s.append(t)}const a=t.querySelector("#feeAdd--occupancyTypeId");for(const e of exports.occupancyTypes){const t=document.createElement("option");t.value=e.occupancyTypeId.toString(),t.textContent=e.occupancyType,a.append(t)}const n=t.querySelector("#feeAdd--lotTypeId");for(const e of exports.lotTypes){const t=document.createElement("option");t.value=e.lotTypeId.toString(),t.textContent=e.lotType,n.append(t)}t.querySelector("#feeAdd--taxPercentage").value=exports.taxPercentageDefault.toString(),e.populateAliases(t)},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),n=t,e.querySelector("form").addEventListener("submit",c),e.querySelector("#feeAdd--feeName").focus(),e.querySelector("#feeAdd--feeFunction").addEventListener("change",()=>{const t=e.querySelector("#feeAdd--feeAmount"),s=e.querySelector("#feeAdd--feeFunction");""===s.value?(s.closest(".select").classList.remove("is-success"),t.classList.add("is-success"),t.disabled=!1):(s.closest(".select").classList.add("is-success"),t.classList.remove("is-success"),t.disabled=!0)}),e.querySelector("#feeAdd--taxPercentage").addEventListener("keyup",()=>{const t=e.querySelector("#feeAdd--taxAmount"),s=e.querySelector("#feeAdd--taxPercentage");""===s.value?(s.classList.remove("is-success"),t.classList.add("is-success"),t.disabled=!1):(s.classList.add("is-success"),t.classList.remove("is-success"),t.disabled=!0)}),e.querySelector("#feeAdd--includeQuantity").addEventListener("change",()=>{e.querySelector("#feeAdd--quantityUnit").disabled=""===e.querySelector("#feeAdd--includeQuantity").value})},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},d=s=>{s.preventDefault();const r=s.currentTarget.closest(".container--fee"),n=Number.parseInt(r.dataset.feeId,10),c=Number.parseInt(r.closest(".container--feeCategory").dataset.feeCategoryId),l=o.find(e=>e.feeCategoryId===c).fees.find(e=>e.feeId===n);let i,d;const u=e=>{e.preventDefault(),cityssm.postJSON(t+"/admin/doUpdateFee",e.currentTarget,e=>{e.success?(o=e.feeCategories,i(),a()):bulmaJS.alert({title:"Error Updating Fee",message:e.errorMessage,contextualColorName:"danger"})})},y=e=>{e.preventDefault();bulmaJS.confirm({title:"Delete Fee?",message:"Are you sure you want to delete this fee?",contextualColorName:"warning",okButton:{text:"Yes, Delete the Fee",callbackFunction:()=>{cityssm.postJSON(t+"/admin/doDeleteFee",{feeId:n},e=>{e.success?(o=e.feeCategories,i(),a()):bulmaJS.alert({title:"Error Deleting Fee",message:e.errorMessage,contextualColorName:"danger"})})}}})},m=()=>{const e=d.querySelector("#feeEdit--feeAmount"),t=d.querySelector("#feeEdit--feeFunction");""===t.value?(t.closest(".select").classList.remove("is-success"),e.classList.add("is-success"),e.disabled=!1):(t.closest(".select").classList.add("is-success"),e.classList.remove("is-success"),e.disabled=!0)},p=()=>{const e=d.querySelector("#feeEdit--taxAmount"),t=d.querySelector("#feeEdit--taxPercentage");""===t.value?(t.classList.remove("is-success"),e.classList.add("is-success"),e.disabled=!1):(t.classList.add("is-success"),e.classList.remove("is-success"),e.disabled=!0)},g=()=>{d.querySelector("#feeEdit--quantityUnit").disabled=""===d.querySelector("#feeEdit--includeQuantity").value};cityssm.openHtmlModal("adminFees-editFee",{onshow:t=>{d=t,t.querySelector("#feeEdit--feeId").value=l.feeId.toString();const s=t.querySelector("#feeEdit--feeCategoryId");for(const e of o){const t=document.createElement("option");t.value=e.feeCategoryId.toString(),t.textContent=e.feeCategory,e.feeCategoryId===c&&(t.selected=!0),s.append(t)}t.querySelector("#feeEdit--feeName").value=l.feeName,t.querySelector("#feeEdit--feeDescription").value=l.feeDescription;const a=t.querySelector("#feeEdit--occupancyTypeId");for(const e of exports.occupancyTypes){const t=document.createElement("option");t.value=e.occupancyTypeId.toString(),t.textContent=e.occupancyType,e.occupancyTypeId===l.occupancyTypeId&&(t.selected=!0),a.append(t)}const r=t.querySelector("#feeEdit--lotTypeId");for(const e of exports.lotTypes){const t=document.createElement("option");t.value=e.lotTypeId.toString(),t.textContent=e.lotType,e.lotTypeId===l.lotTypeId&&(t.selected=!0),r.append(t)}t.querySelector("#feeEdit--feeAmount").value=l.feeAmount?l.feeAmount.toFixed(2):"",t.querySelector("#feeEdit--feeFunction").addEventListener("change",m),m(),t.querySelector("#feeEdit--taxAmount").value=l.taxAmount?l.taxAmount.toFixed(2):"";const n=t.querySelector("#feeEdit--taxPercentage");n.value=l.taxPercentage?l.taxPercentage.toString():"",n.addEventListener("keyup",p),p();const i=t.querySelector("#feeEdit--includeQuantity");l.includeQuantity&&(i.value="1"),i.addEventListener("change",g),t.querySelector("#feeEdit--quantityUnit").value=l.quantityUnit||"",g(),l.isRequired&&(t.querySelector("#feeEdit--isRequired").value="1"),e.populateAliases(t)},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),i=t,e.querySelector("form").addEventListener("submit",u),bulmaJS.init(e),e.querySelector(".button--deleteFee").addEventListener("click",y)},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},u=e=>{const s=e.currentTarget.closest(".container--fee"),r=Number.parseInt(s.dataset.feeId,10);cityssm.postJSON(t+"/admin/doMoveFeeUp",{feeId:r,moveToTop:e.shiftKey?"1":"0"},e=>{e.success?(o=e.feeCategories,a()):bulmaJS.alert({title:"Error Moving Fee",message:e.errorMessage,contextualColorName:"danger"})})},y=e=>{const s=e.currentTarget.closest(".container--fee"),r=Number.parseInt(s.dataset.feeId,10);cityssm.postJSON(t+"/admin/doMoveFeeDown",{feeId:r,moveToBottom:e.shiftKey?"1":"0"},e=>{e.success?(o=e.feeCategories,a()):bulmaJS.alert({title:"Error Moving Fee",message:e.errorMessage,contextualColorName:"danger"})})};a()})(); \ No newline at end of file diff --git a/views/admin-fees.ejs b/views/admin-fees.ejs index a1b7ec6b..0300283c 100644 --- a/views/admin-fees.ejs +++ b/views/admin-fees.ejs @@ -33,7 +33,7 @@
-