formatting with prettier

deepsource-autofix-76c6eb20
Dan Gowans 2022-09-02 09:56:40 -04:00
parent 6703302913
commit 3e15918d6d
81 changed files with 5771 additions and 4068 deletions

2
.prettierignore 100644
View File

@ -0,0 +1,2 @@
*.ejs
*.js

6
.prettierrc.json 100644
View File

@ -0,0 +1,6 @@
{
"trailingComma": "none",
"tabWidth": 4,
"semi": true,
"singleQuote": false
}

3
app.js
View File

@ -131,7 +131,8 @@ app.use((_request, _response, next) => {
}); });
app.use((error, request, response) => { app.use((error, request, response) => {
response.locals.message = error.message; response.locals.message = error.message;
response.locals.error = request.app.get("env") === "development" ? error : {}; response.locals.error =
request.app.get("env") === "development" ? error : {};
response.status(error.status || 500); response.status(error.status || 500);
response.render("error"); response.render("error");
}); });

102
app.ts
View File

@ -24,29 +24,23 @@ import * as dateTimeFns from "@cityssm/expressjs-server-js/dateTimeFns.js";
import * as stringFns from "@cityssm/expressjs-server-js/stringFns.js"; import * as stringFns from "@cityssm/expressjs-server-js/stringFns.js";
import * as htmlFns from "@cityssm/expressjs-server-js/htmlFns.js"; import * as htmlFns from "@cityssm/expressjs-server-js/htmlFns.js";
import { import { version } from "./version.js";
version
} from "./version.js";
import * as databaseInitializer from "./helpers/initializer.database.js"; import * as databaseInitializer from "./helpers/initializer.database.js";
import debug from "debug"; import debug from "debug";
const debugApp = debug("lot-occupancy-system:app"); const debugApp = debug("lot-occupancy-system:app");
/* /*
* INITALIZE THE DATABASE * INITALIZE THE DATABASE
*/ */
databaseInitializer.initializeDatabase(); databaseInitializer.initializeDatabase();
/* /*
* INITIALIZE APP * INITIALIZE APP
*/ */
const __dirname = "."; const __dirname = ".";
export const app = express(); export const app = express();
@ -70,15 +64,18 @@ app.use((request, _response, next) => {
app.use(express.json()); app.use(express.json());
app.use(express.urlencoded({ app.use(
express.urlencoded({
extended: false extended: false
})); })
);
app.use(cookieParser()); app.use(cookieParser());
app.use(csurf({ app.use(
csurf({
cookie: true cookie: true
})); })
);
/* /*
* Rate Limiter * Rate Limiter
@ -91,12 +88,10 @@ const limiter = rateLimit({
app.use(limiter); app.use(limiter);
/* /*
* STATIC ROUTES * STATIC ROUTES
*/ */
const urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix"); const urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix");
if (urlPrefix !== "") { if (urlPrefix !== "") {
@ -105,29 +100,40 @@ if (urlPrefix !== "") {
app.use(urlPrefix, express.static(path.join("public"))); app.use(urlPrefix, express.static(path.join("public")));
app.use(urlPrefix + "/lib/fa", app.use(
express.static(path.join("node_modules", "@fortawesome", "fontawesome-free"))); urlPrefix + "/lib/fa",
express.static(
path.join("node_modules", "@fortawesome", "fontawesome-free")
)
);
app.use(urlPrefix + "/lib/cityssm-bulma-webapp-js", app.use(
express.static(path.join("node_modules", "@cityssm", "bulma-webapp-js"))); urlPrefix + "/lib/cityssm-bulma-webapp-js",
express.static(path.join("node_modules", "@cityssm", "bulma-webapp-js"))
);
app.use(urlPrefix + "/lib/cityssm-bulma-js", app.use(
express.static(path.join("node_modules", "@cityssm", "bulma-js", "dist"))); urlPrefix + "/lib/cityssm-bulma-js",
express.static(path.join("node_modules", "@cityssm", "bulma-js", "dist"))
app.use(urlPrefix + "/lib/leaflet", );
express.static(path.join("node_modules", "leaflet", "dist")));
app.use(
urlPrefix + "/lib/leaflet",
express.static(path.join("node_modules", "leaflet", "dist"))
);
/* /*
* SESSION MANAGEMENT * SESSION MANAGEMENT
*/ */
const sessionCookieName: string = configFunctions.getProperty("session.cookieName"); const sessionCookieName: string =
configFunctions.getProperty("session.cookieName");
const FileStoreSession = FileStore(session); const FileStoreSession = FileStore(session);
// Initialize session // Initialize session
app.use(session({ app.use(
session({
store: new FileStoreSession({ store: new FileStoreSession({
path: "./data/sessions", path: "./data/sessions",
logFn: debug("general-licence-manager:session"), logFn: debug("general-licence-manager:session"),
@ -142,11 +148,11 @@ app.use(session({
maxAge: configFunctions.getProperty("session.maxAgeMillis"), maxAge: configFunctions.getProperty("session.maxAgeMillis"),
sameSite: "strict" sameSite: "strict"
} }
})); })
);
// Clear cookie if no corresponding session // Clear cookie if no corresponding session
app.use((request, response, next) => { app.use((request, response, next) => {
if (request.cookies[sessionCookieName] && !request.session.user) { if (request.cookies[sessionCookieName] && !request.session.user) {
response.clearCookie(sessionCookieName); response.clearCookie(sessionCookieName);
} }
@ -155,25 +161,27 @@ app.use((request, response, next) => {
}); });
// Redirect logged in users // Redirect logged in users
const sessionChecker = (request: express.Request, response: express.Response, next: express.NextFunction) => { const sessionChecker = (
request: express.Request,
response: express.Response,
next: express.NextFunction
) => {
if (request.session.user && request.cookies[sessionCookieName]) { if (request.session.user && request.cookies[sessionCookieName]) {
return next(); return next();
} }
return response.redirect(`${urlPrefix}/login?redirect=${request.originalUrl}`); return response.redirect(
`${urlPrefix}/login?redirect=${request.originalUrl}`
);
}; };
/* /*
* ROUTES * ROUTES
*/ */
// Make the user and config objects available to the templates // Make the user and config objects available to the templates
app.use((request, response, next) => { app.use((request, response, next) => {
response.locals.buildNumber = version; response.locals.buildNumber = version;
response.locals.user = request.session.user; response.locals.user = request.session.user;
@ -184,12 +192,13 @@ app.use((request, response, next) => {
response.locals.stringFunctions = stringFns; response.locals.stringFunctions = stringFns;
response.locals.htmlFunctions = htmlFns; response.locals.htmlFunctions = htmlFns;
response.locals.urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix"); response.locals.urlPrefix = configFunctions.getProperty(
"reverseProxy.urlPrefix"
);
next(); next();
}); });
app.get(urlPrefix + "/", sessionChecker, (_request, response) => { app.get(urlPrefix + "/", sessionChecker, (_request, response) => {
response.redirect(urlPrefix + "/dashboard"); response.redirect(urlPrefix + "/dashboard");
}); });
@ -211,40 +220,41 @@ app.all(urlPrefix + "/keepAlive", (_request, response) => {
app.use(urlPrefix + "/login", routerLogin); app.use(urlPrefix + "/login", routerLogin);
app.get(urlPrefix + "/logout", (request, response) => { app.get(urlPrefix + "/logout", (request, response) => {
if (request.session.user && request.cookies[sessionCookieName]) { if (request.session.user && request.cookies[sessionCookieName]) {
// eslint-disable-next-line unicorn/no-null // eslint-disable-next-line unicorn/no-null
request.session.destroy(null); request.session.destroy(null);
request.session = undefined; request.session = undefined;
response.clearCookie(sessionCookieName); response.clearCookie(sessionCookieName);
response.redirect(urlPrefix + "/"); response.redirect(urlPrefix + "/");
} else { } else {
response.redirect(urlPrefix + "/login"); response.redirect(urlPrefix + "/login");
} }
}); });
// Catch 404 and forward to error handler // Catch 404 and forward to error handler
app.use((_request, _response, next) => { app.use((_request, _response, next) => {
next(createError(404)); next(createError(404));
}); });
// Error handler // Error handler
app.use((error: { app.use(
status: number;message: string (
error: {
status: number;
message: string;
}, },
request: express.Request, response: express.Response) => { request: express.Request,
response: express.Response
) => {
// Set locals, only providing error in development // Set locals, only providing error in development
response.locals.message = error.message; response.locals.message = error.message;
response.locals.error = request.app.get("env") === "development" ? error : {}; response.locals.error =
request.app.get("env") === "development" ? error : {};
// Render the error page // Render the error page
response.status(error.status || 500); response.status(error.status || 500);
response.render("error"); response.render("error");
}); }
);
export default app; export default app;

View File

@ -1,9 +1,9 @@
import { defineConfig } from "cypress"; import { defineConfig } from "cypress";
export default defineConfig({ export default defineConfig({
e2e: { e2e: {
"baseUrl": "http://localhost:7000", baseUrl: "http://localhost:7000",
"specPattern": "cypress/e2e/**/*.cy.ts", specPattern: "cypress/e2e/**/*.cy.ts",
"supportFile": false, supportFile: false,
"projectId": "xya1fn" projectId: "xya1fn"
} }
}); });

View File

@ -2,12 +2,11 @@
import { defineConfig } from "cypress"; import { defineConfig } from "cypress";
export default defineConfig({ export default defineConfig({
e2e: { e2e: {
"baseUrl": "http://localhost:7000", baseUrl: "http://localhost:7000",
"specPattern": "cypress/e2e/**/*.cy.ts", specPattern: "cypress/e2e/**/*.cy.ts",
"supportFile": false, supportFile: false,
"projectId": "xya1fn" projectId: "xya1fn"
} }
}); });

View File

@ -1,19 +1,21 @@
import gulp from "gulp"; import gulp from "gulp";
import changed from "gulp-changed"; import changed from "gulp-changed";
import minify from "gulp-minify"; import minify from "gulp-minify";
import dartSass from 'sass'; import dartSass from "sass";
import gulpSass from 'gulp-sass'; import gulpSass from "gulp-sass";
const sass = gulpSass(dartSass); const sass = gulpSass(dartSass);
const publicSCSSDestination = "public/stylesheets"; const publicSCSSDestination = "public/stylesheets";
const publicSCSSFunction = () => { const publicSCSSFunction = () => {
return gulp.src("public-scss/*.scss") return gulp
.pipe(sass({ outputStyle: 'compressed' }).on('error', sass.logError)) .src("public-scss/*.scss")
.pipe(sass({ outputStyle: "compressed" }).on("error", sass.logError))
.pipe(gulp.dest(publicSCSSDestination)); .pipe(gulp.dest(publicSCSSDestination));
}; };
gulp.task("public-scss", publicSCSSFunction); gulp.task("public-scss", publicSCSSFunction);
const publicJavascriptsDestination = "public/javascripts"; const publicJavascriptsDestination = "public/javascripts";
const publicJavascriptsMinFunction = () => { const publicJavascriptsMinFunction = () => {
return gulp.src("public-typescript/*.js", { allowEmpty: true }) return gulp
.src("public-typescript/*.js", { allowEmpty: true })
.pipe(changed(publicJavascriptsDestination, { .pipe(changed(publicJavascriptsDestination, {
extension: ".min.js" extension: ".min.js"
})) }))

View File

@ -4,8 +4,8 @@ import gulp from "gulp";
import changed from "gulp-changed"; import changed from "gulp-changed";
import minify from "gulp-minify"; import minify from "gulp-minify";
import dartSass from 'sass'; import dartSass from "sass";
import gulpSass from 'gulp-sass'; import gulpSass from "gulp-sass";
const sass = gulpSass(dartSass); const sass = gulpSass(dartSass);
/* /*
@ -15,9 +15,9 @@ const sass = gulpSass(dartSass);
const publicSCSSDestination = "public/stylesheets"; const publicSCSSDestination = "public/stylesheets";
const publicSCSSFunction = () => { const publicSCSSFunction = () => {
return gulp
return gulp.src("public-scss/*.scss") .src("public-scss/*.scss")
.pipe(sass({outputStyle: 'compressed'}).on('error', sass.logError)) .pipe(sass({ outputStyle: "compressed" }).on("error", sass.logError))
.pipe(gulp.dest(publicSCSSDestination)); .pipe(gulp.dest(publicSCSSDestination));
}; };
@ -30,11 +30,13 @@ gulp.task("public-scss", publicSCSSFunction);
const publicJavascriptsDestination = "public/javascripts"; const publicJavascriptsDestination = "public/javascripts";
const publicJavascriptsMinFunction = () => { const publicJavascriptsMinFunction = () => {
return gulp
return gulp.src("public-typescript/*.js", { allowEmpty: true }) .src("public-typescript/*.js", { allowEmpty: true })
.pipe(changed(publicJavascriptsDestination, { .pipe(
changed(publicJavascriptsDestination, {
extension: ".min.js" extension: ".min.js"
})) })
)
.pipe(minify({ noSource: true, ext: { min: ".min.js" } })) .pipe(minify({ noSource: true, ext: { min: ".min.js" } }))
.pipe(gulp.dest(publicJavascriptsDestination)); .pipe(gulp.dest(publicJavascriptsDestination));
}; };

View File

@ -1,19 +1,19 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import { getLotTypes, getOccupancyTypes } from "../../helpers/functions.cache.js";
import { import {
getFeeCategories getLotTypes,
} from "../../helpers/lotOccupancyDB/getFeeCategories.js"; getOccupancyTypes
} from "../../helpers/functions.cache.js";
import { getFeeCategories } from "../../helpers/lotOccupancyDB/getFeeCategories.js";
export const handler: RequestHandler = (_request, response) => { export const handler: RequestHandler = (_request, response) => {
const feeCategories = getFeeCategories(
const feeCategories = getFeeCategories({}, { {},
{
includeFees: true includeFees: true
}); }
);
const occupancyTypes = getOccupancyTypes(); const occupancyTypes = getOccupancyTypes();
const lotTypes = getLotTypes(); const lotTypes = getLotTypes();
@ -26,5 +26,4 @@ export const handler: RequestHandler = (_request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -1,12 +1,12 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import { getLotOccupantTypes, getLotStatuses, getWorkOrderTypes } from "../../helpers/functions.cache.js";
import {
getLotOccupantTypes,
getLotStatuses,
getWorkOrderTypes
} from "../../helpers/functions.cache.js";
export const handler: RequestHandler = (_request, response) => { export const handler: RequestHandler = (_request, response) => {
const workOrderTypes = getWorkOrderTypes(); const workOrderTypes = getWorkOrderTypes();
const lotStatuses = getLotStatuses(); const lotStatuses = getLotStatuses();
const lotOccupantTypes = getLotOccupantTypes(); const lotOccupantTypes = getLotOccupantTypes();
@ -19,5 +19,4 @@ export const handler: RequestHandler = (_request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -1,24 +1,18 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import {
addFee
} from "../../helpers/lotOccupancyDB/addFee.js";
import {
getFeeCategories
} from "../../helpers/lotOccupancyDB/getFeeCategories.js";
import { addFee } from "../../helpers/lotOccupancyDB/addFee.js";
import { getFeeCategories } from "../../helpers/lotOccupancyDB/getFeeCategories.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const feeId = addFee(request.body, request.session); const feeId = addFee(request.body, request.session);
const feeCategories = getFeeCategories({}, { const feeCategories = getFeeCategories(
{},
{
includeFees: true includeFees: true
}); }
);
response.json({ response.json({
success: true, success: true,
@ -27,5 +21,4 @@ export const handler: RequestHandler = async (request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -1,24 +1,18 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import {
addFeeCategory
} from "../../helpers/lotOccupancyDB/addFeeCategory.js";
import {
getFeeCategories
} from "../../helpers/lotOccupancyDB/getFeeCategories.js";
import { addFeeCategory } from "../../helpers/lotOccupancyDB/addFeeCategory.js";
import { getFeeCategories } from "../../helpers/lotOccupancyDB/getFeeCategories.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const feeCategoryId = addFeeCategory(request.body, request.session); const feeCategoryId = addFeeCategory(request.body, request.session);
const feeCategories = getFeeCategories({}, { const feeCategories = getFeeCategories(
{},
{
includeFees: true includeFees: true
}); }
);
response.json({ response.json({
success: true, success: true,
@ -27,5 +21,4 @@ export const handler: RequestHandler = async (request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -1,18 +1,10 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import { import { addLotOccupantType } from "../../helpers/lotOccupancyDB/addLotOccupantType.js";
addLotOccupantType
} from "../../helpers/lotOccupancyDB/addLotOccupantType.js";
import {
getLotOccupantTypes
} from "../../helpers/functions.cache.js";
import { getLotOccupantTypes } from "../../helpers/functions.cache.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const lotOccupantTypeId = addLotOccupantType(request.body, request.session); const lotOccupantTypeId = addLotOccupantType(request.body, request.session);
const lotOccupantTypes = getLotOccupantTypes(); const lotOccupantTypes = getLotOccupantTypes();
@ -24,5 +16,4 @@ export const handler: RequestHandler = async (request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -1,18 +1,10 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import { import { addLotStatus } from "../../helpers/lotOccupancyDB/addLotStatus.js";
addLotStatus
} from "../../helpers/lotOccupancyDB/addLotStatus.js";
import {
getLotStatuses
} from "../../helpers/functions.cache.js";
import { getLotStatuses } from "../../helpers/functions.cache.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const lotStatusId = addLotStatus(request.body, request.session); const lotStatusId = addLotStatus(request.body, request.session);
const lotStatuses = getLotStatuses(); const lotStatuses = getLotStatuses();
@ -24,5 +16,4 @@ export const handler: RequestHandler = async (request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -1,18 +1,10 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import { import { addWorkOrderType } from "../../helpers/lotOccupancyDB/addWorkOrderType.js";
addWorkOrderType
} from "../../helpers/lotOccupancyDB/addWorkOrderType.js";
import {
getWorkOrderTypes
} from "../../helpers/functions.cache.js";
import { getWorkOrderTypes } from "../../helpers/functions.cache.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const workOrderTypeId = addWorkOrderType(request.body, request.session); const workOrderTypeId = addWorkOrderType(request.body, request.session);
const workOrderTypes = getWorkOrderTypes(); const workOrderTypes = getWorkOrderTypes();
@ -24,5 +16,4 @@ export const handler: RequestHandler = async (request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -1,24 +1,18 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import {
deleteFee
} from "../../helpers/lotOccupancyDB/deleteFee.js";
import {
getFeeCategories
} from "../../helpers/lotOccupancyDB/getFeeCategories.js";
import { deleteFee } from "../../helpers/lotOccupancyDB/deleteFee.js";
import { getFeeCategories } from "../../helpers/lotOccupancyDB/getFeeCategories.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const success = deleteFee(request.body.feeId, request.session); const success = deleteFee(request.body.feeId, request.session);
const feeCategories = getFeeCategories({}, { const feeCategories = getFeeCategories(
{},
{
includeFees: true includeFees: true
}); }
);
response.json({ response.json({
success, success,
@ -26,5 +20,4 @@ export const handler: RequestHandler = async (request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -1,24 +1,21 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import {
deleteFeeCategory
} from "../../helpers/lotOccupancyDB/deleteFeeCategory.js";
import {
getFeeCategories
} from "../../helpers/lotOccupancyDB/getFeeCategories.js";
import { deleteFeeCategory } from "../../helpers/lotOccupancyDB/deleteFeeCategory.js";
import { getFeeCategories } from "../../helpers/lotOccupancyDB/getFeeCategories.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const success = deleteFeeCategory(
request.body.feeCategoryId,
request.session
);
const success = deleteFeeCategory(request.body.feeCategoryId, request.session); const feeCategories = getFeeCategories(
{},
const feeCategories = getFeeCategories({}, { {
includeFees: true includeFees: true
}); }
);
response.json({ response.json({
success, success,
@ -26,5 +23,4 @@ export const handler: RequestHandler = async (request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -1,19 +1,14 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import { import { deleteLotOccupantType } from "../../helpers/lotOccupancyDB/deleteLotOccupantType.js";
deleteLotOccupantType
} from "../../helpers/lotOccupancyDB/deleteLotOccupantType.js";
import {
getLotOccupantTypes
} from "../../helpers/functions.cache.js";
import { getLotOccupantTypes } from "../../helpers/functions.cache.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const success = deleteLotOccupantType(
const success = deleteLotOccupantType(request.body.lotOccupantTypeId, request.session); request.body.lotOccupantTypeId,
request.session
);
const lotOccupantTypes = getLotOccupantTypes(); const lotOccupantTypes = getLotOccupantTypes();
@ -23,5 +18,4 @@ export const handler: RequestHandler = async (request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -1,18 +1,10 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import { import { deleteLotStatus } from "../../helpers/lotOccupancyDB/deleteLotStatus.js";
deleteLotStatus
} from "../../helpers/lotOccupancyDB/deleteLotStatus.js";
import {
getLotStatuses
} from "../../helpers/functions.cache.js";
import { getLotStatuses } from "../../helpers/functions.cache.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const success = deleteLotStatus(request.body.lotStatusId, request.session); const success = deleteLotStatus(request.body.lotStatusId, request.session);
const lotStatuses = getLotStatuses(); const lotStatuses = getLotStatuses();
@ -23,5 +15,4 @@ export const handler: RequestHandler = async (request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -1,19 +1,14 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import { import { deleteWorkOrderType } from "../../helpers/lotOccupancyDB/deleteWorkOrderType.js";
deleteWorkOrderType
} from "../../helpers/lotOccupancyDB/deleteWorkOrderType.js";
import {
getWorkOrderTypes
} from "../../helpers/functions.cache.js";
import { getWorkOrderTypes } from "../../helpers/functions.cache.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const success = deleteWorkOrderType(
const success = deleteWorkOrderType(request.body.workOrderTypeId, request.session); request.body.workOrderTypeId,
request.session
);
const workOrderTypes = getWorkOrderTypes(); const workOrderTypes = getWorkOrderTypes();
@ -23,5 +18,4 @@ export const handler: RequestHandler = async (request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -1,23 +1,18 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import { import { moveFeeCategoryDown } from "../../helpers/lotOccupancyDB/moveFeeCategoryDown.js";
moveFeeCategoryDown
} from "../../helpers/lotOccupancyDB/moveFeeCategoryDown.js";
import {
getFeeCategories
} from "../../helpers/lotOccupancyDB/getFeeCategories.js";
import { getFeeCategories } from "../../helpers/lotOccupancyDB/getFeeCategories.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const success = moveFeeCategoryDown(request.body.feeCategoryId); const success = moveFeeCategoryDown(request.body.feeCategoryId);
const feeCategories = getFeeCategories({}, { const feeCategories = getFeeCategories(
{},
{
includeFees: true includeFees: true
}); }
);
response.json({ response.json({
success, success,
@ -25,5 +20,4 @@ export const handler: RequestHandler = async (request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -1,23 +1,18 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import { import { moveFeeCategoryUp } from "../../helpers/lotOccupancyDB/moveFeeCategoryUp.js";
moveFeeCategoryUp
} from "../../helpers/lotOccupancyDB/moveFeeCategoryUp.js";
import {
getFeeCategories
} from "../../helpers/lotOccupancyDB/getFeeCategories.js";
import { getFeeCategories } from "../../helpers/lotOccupancyDB/getFeeCategories.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const success = moveFeeCategoryUp(request.body.feeCategoryId); const success = moveFeeCategoryUp(request.body.feeCategoryId);
const feeCategories = getFeeCategories({}, { const feeCategories = getFeeCategories(
{},
{
includeFees: true includeFees: true
}); }
);
response.json({ response.json({
success, success,
@ -25,5 +20,4 @@ export const handler: RequestHandler = async (request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -1,23 +1,18 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import { import { moveFeeDown } from "../../helpers/lotOccupancyDB/moveFeeDown.js";
moveFeeDown
} from "../../helpers/lotOccupancyDB/moveFeeDown.js";
import {
getFeeCategories
} from "../../helpers/lotOccupancyDB/getFeeCategories.js";
import { getFeeCategories } from "../../helpers/lotOccupancyDB/getFeeCategories.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const success = moveFeeDown(request.body.feeId); const success = moveFeeDown(request.body.feeId);
const feeCategories = getFeeCategories({}, { const feeCategories = getFeeCategories(
{},
{
includeFees: true includeFees: true
}); }
);
response.json({ response.json({
success, success,
@ -25,5 +20,4 @@ export const handler: RequestHandler = async (request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -1,23 +1,18 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import { import { moveFeeUp } from "../../helpers/lotOccupancyDB/moveFeeUp.js";
moveFeeUp
} from "../../helpers/lotOccupancyDB/moveFeeUp.js";
import {
getFeeCategories
} from "../../helpers/lotOccupancyDB/getFeeCategories.js";
import { getFeeCategories } from "../../helpers/lotOccupancyDB/getFeeCategories.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const success = moveFeeUp(request.body.feeId); const success = moveFeeUp(request.body.feeId);
const feeCategories = getFeeCategories({}, { const feeCategories = getFeeCategories(
{},
{
includeFees: true includeFees: true
}); }
);
response.json({ response.json({
success, success,
@ -25,5 +20,4 @@ export const handler: RequestHandler = async (request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -1,18 +1,10 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import { import { moveLotOccupantTypeDown } from "../../helpers/lotOccupancyDB/moveLotOccupantTypeDown.js";
moveLotOccupantTypeDown
} from "../../helpers/lotOccupancyDB/moveLotOccupantTypeDown.js";
import {
getLotOccupantTypes
} from "../../helpers/functions.cache.js";
import { getLotOccupantTypes } from "../../helpers/functions.cache.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const success = moveLotOccupantTypeDown(request.body.lotOccupantTypeId); const success = moveLotOccupantTypeDown(request.body.lotOccupantTypeId);
const lotOccupantTypes = getLotOccupantTypes(); const lotOccupantTypes = getLotOccupantTypes();
@ -23,5 +15,4 @@ export const handler: RequestHandler = async (request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -1,18 +1,10 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import { import { moveLotOccupantTypeUp } from "../../helpers/lotOccupancyDB/moveLotOccupantTypeUp.js";
moveLotOccupantTypeUp
} from "../../helpers/lotOccupancyDB/moveLotOccupantTypeUp.js";
import {
getLotOccupantTypes
} from "../../helpers/functions.cache.js";
import { getLotOccupantTypes } from "../../helpers/functions.cache.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const success = moveLotOccupantTypeUp(request.body.lotOccupantTypeId); const success = moveLotOccupantTypeUp(request.body.lotOccupantTypeId);
const lotOccupantTypes = getLotOccupantTypes(); const lotOccupantTypes = getLotOccupantTypes();
@ -23,5 +15,4 @@ export const handler: RequestHandler = async (request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -1,18 +1,10 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import { import { moveLotStatusDown } from "../../helpers/lotOccupancyDB/moveLotStatusDown.js";
moveLotStatusDown
} from "../../helpers/lotOccupancyDB/moveLotStatusDown.js";
import {
getLotStatuses
} from "../../helpers/functions.cache.js";
import { getLotStatuses } from "../../helpers/functions.cache.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const success = moveLotStatusDown(request.body.lotStatusId); const success = moveLotStatusDown(request.body.lotStatusId);
const lotStatuses = getLotStatuses(); const lotStatuses = getLotStatuses();
@ -23,5 +15,4 @@ export const handler: RequestHandler = async (request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -1,18 +1,10 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import { import { moveLotStatusUp } from "../../helpers/lotOccupancyDB/moveLotStatusUp.js";
moveLotStatusUp
} from "../../helpers/lotOccupancyDB/moveLotStatusUp.js";
import {
getLotStatuses
} from "../../helpers/functions.cache.js";
import { getLotStatuses } from "../../helpers/functions.cache.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const success = moveLotStatusUp(request.body.lotStatusId); const success = moveLotStatusUp(request.body.lotStatusId);
const lotStatuses = getLotStatuses(); const lotStatuses = getLotStatuses();
@ -23,5 +15,4 @@ export const handler: RequestHandler = async (request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -1,18 +1,10 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import { import { moveWorkOrderTypeDown } from "../../helpers/lotOccupancyDB/moveWorkOrderTypeDown.js";
moveWorkOrderTypeDown
} from "../../helpers/lotOccupancyDB/moveWorkOrderTypeDown.js";
import {
getWorkOrderTypes
} from "../../helpers/functions.cache.js";
import { getWorkOrderTypes } from "../../helpers/functions.cache.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const success = moveWorkOrderTypeDown(request.body.workOrderTypeId); const success = moveWorkOrderTypeDown(request.body.workOrderTypeId);
const workOrderTypes = getWorkOrderTypes(); const workOrderTypes = getWorkOrderTypes();
@ -23,5 +15,4 @@ export const handler: RequestHandler = async (request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -1,18 +1,10 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import { import { moveWorkOrderTypeUp } from "../../helpers/lotOccupancyDB/moveWorkOrderTypeUp.js";
moveWorkOrderTypeUp
} from "../../helpers/lotOccupancyDB/moveWorkOrderTypeUp.js";
import {
getWorkOrderTypes
} from "../../helpers/functions.cache.js";
import { getWorkOrderTypes } from "../../helpers/functions.cache.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const success = moveWorkOrderTypeUp(request.body.workOrderTypeId); const success = moveWorkOrderTypeUp(request.body.workOrderTypeId);
const workOrderTypes = getWorkOrderTypes(); const workOrderTypes = getWorkOrderTypes();
@ -23,5 +15,4 @@ export const handler: RequestHandler = async (request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -1,24 +1,18 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import {
updateFee
} from "../../helpers/lotOccupancyDB/updateFee.js";
import {
getFeeCategories
} from "../../helpers/lotOccupancyDB/getFeeCategories.js";
import { updateFee } from "../../helpers/lotOccupancyDB/updateFee.js";
import { getFeeCategories } from "../../helpers/lotOccupancyDB/getFeeCategories.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const success = updateFee(request.body, request.session); const success = updateFee(request.body, request.session);
const feeCategories = getFeeCategories({}, { const feeCategories = getFeeCategories(
{},
{
includeFees: true includeFees: true
}); }
);
response.json({ response.json({
success, success,
@ -26,5 +20,4 @@ export const handler: RequestHandler = async (request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -1,24 +1,18 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import {
updateFeeCategory
} from "../../helpers/lotOccupancyDB/updateFeeCategory.js";
import {
getFeeCategories
} from "../../helpers/lotOccupancyDB/getFeeCategories.js";
import { updateFeeCategory } from "../../helpers/lotOccupancyDB/updateFeeCategory.js";
import { getFeeCategories } from "../../helpers/lotOccupancyDB/getFeeCategories.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const success = updateFeeCategory(request.body, request.session); const success = updateFeeCategory(request.body, request.session);
const feeCategories = getFeeCategories({}, { const feeCategories = getFeeCategories(
{},
{
includeFees: true includeFees: true
}); }
);
response.json({ response.json({
success, success,
@ -26,5 +20,4 @@ export const handler: RequestHandler = async (request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -1,18 +1,10 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import { import { updateLotOccupantType } from "../../helpers/lotOccupancyDB/updateLotOccupantType.js";
updateLotOccupantType
} from "../../helpers/lotOccupancyDB/updateLotOccupantType.js";
import {
getLotOccupantTypes
} from "../../helpers/functions.cache.js";
import { getLotOccupantTypes } from "../../helpers/functions.cache.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const success = updateLotOccupantType(request.body, request.session); const success = updateLotOccupantType(request.body, request.session);
const lotOccupantTypes = getLotOccupantTypes(); const lotOccupantTypes = getLotOccupantTypes();
@ -23,5 +15,4 @@ export const handler: RequestHandler = async (request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -1,18 +1,10 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import { import { updateLotStatus } from "../../helpers/lotOccupancyDB/updateLotStatus.js";
updateLotStatus
} from "../../helpers/lotOccupancyDB/updateLotStatus.js";
import {
getLotStatuses
} from "../../helpers/functions.cache.js";
import { getLotStatuses } from "../../helpers/functions.cache.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const success = updateLotStatus(request.body, request.session); const success = updateLotStatus(request.body, request.session);
const lotStatuses = getLotStatuses(); const lotStatuses = getLotStatuses();
@ -23,5 +15,4 @@ export const handler: RequestHandler = async (request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -1,18 +1,10 @@
import type { import type { RequestHandler } from "express";
RequestHandler
} from "express";
import { import { updateWorkOrderType } from "../../helpers/lotOccupancyDB/updateWorkOrderType.js";
updateWorkOrderType
} from "../../helpers/lotOccupancyDB/updateWorkOrderType.js";
import {
getWorkOrderTypes
} from "../../helpers/functions.cache.js";
import { getWorkOrderTypes } from "../../helpers/functions.cache.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const success = updateWorkOrderType(request.body, request.session); const success = updateWorkOrderType(request.body, request.session);
const workOrderTypes = getWorkOrderTypes(); const workOrderTypes = getWorkOrderTypes();
@ -23,5 +15,4 @@ export const handler: RequestHandler = async (request, response) => {
}); });
}; };
export default handler; export default handler;

View File

@ -8,53 +8,58 @@ Object.defineProperty(exports, "__esModule", { value: true });
delete exports.feeCategories; delete exports.feeCategories;
const renderFeeCategories = () => { const renderFeeCategories = () => {
if (feeCategories.length === 0) { if (feeCategories.length === 0) {
feeCategoriesContainerElement.innerHTML = "<div class=\"message is-warning\">" + feeCategoriesContainerElement.innerHTML =
"<p class=\"message-body\">There are no available fees.</p>" + '<div class="message is-warning">' +
'<p class="message-body">There are no available fees.</p>' +
"</div>"; "</div>";
return; return;
} }
feeCategoriesContainerElement.innerHTML = ""; feeCategoriesContainerElement.innerHTML = "";
for (const feeCategory of feeCategories) { for (const feeCategory of feeCategories) {
const feeCategoryContainerElement = document.createElement("section"); const feeCategoryContainerElement = document.createElement("section");
feeCategoryContainerElement.className = "container--feeCategory mb-5"; feeCategoryContainerElement.className =
feeCategoryContainerElement.dataset.feeCategoryId = feeCategory.feeCategoryId.toString(); "container--feeCategory mb-5";
feeCategoryContainerElement.insertAdjacentHTML("beforeend", "<div class=\"level is-mobile\">" + feeCategoryContainerElement.dataset.feeCategoryId =
("<div class=\"level-left\">" + feeCategory.feeCategoryId.toString();
"<div class=\"level-item\">" + feeCategoryContainerElement.insertAdjacentHTML("beforeend", '<div class="level is-mobile">' +
"<h2 class=\"title is-4\">" + cityssm.escapeHTML(feeCategory.feeCategory) + "</h2>" + ('<div class="level-left">' +
'<div class="level-item">' +
'<h2 class="title is-4">' +
cityssm.escapeHTML(feeCategory.feeCategory) +
"</h2>" +
"</div>" + "</div>" +
"</div>") + "</div>") +
("<div class=\"level-right\">" + ('<div class="level-right">' +
(feeCategory.fees.length === 0 ? (feeCategory.fees.length === 0
"<div class=\"level-item\">" + ? '<div class="level-item">' +
"<button class=\"button is-small is-danger button--deleteFeeCategory\" type=\"button\">" + '<button class="button is-small is-danger button--deleteFeeCategory" type="button">' +
"<span class=\"icon is-small\"><i class=\"fas fa-trash\" aria-hidden=\"true\"></i></span>" + '<span class="icon is-small"><i class="fas fa-trash" aria-hidden="true"></i></span>' +
"<span>Delete Category</span>" + "<span>Delete Category</span>" +
"</button>" + "</button>" +
"</div>" : "</div>"
"") + : "") +
("<div class=\"level-item\">" + ('<div class="level-item">' +
"<button class=\"button is-small is-primary button--editFeeCategory\" type=\"button\">" + '<button class="button is-small is-primary button--editFeeCategory" type="button">' +
"<span class=\"icon is-small\"><i class=\"fas fa-pencil-alt\" aria-hidden=\"true\"></i></span>" + '<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
"<span>Edit Category</span>" + "<span>Edit Category</span>" +
"</button>" + "</button>" +
"</div>") + "</div>") +
("<div class=\"level-item\">" + ('<div class="level-item">' +
"<button class=\"button is-small is-success button--addFee\" type=\"button\">" + '<button class="button is-small is-success button--addFee" type="button">' +
"<span class=\"icon is-small\"><i class=\"fas fa-plus\" aria-hidden=\"true\"></i></span>" + '<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>' +
"<span>Add Fee</span>" + "<span>Add Fee</span>" +
"</button>" + "</button>" +
"</div>") + "</div>") +
("<div class=\"level-item\">" + ('<div class="level-item">' +
"<div class=\"field has-addons\">" + '<div class="field has-addons">' +
"<div class=\"control\">" + '<div class="control">' +
"<button class=\"button is-small button--moveFeeCategoryUp\" data-tooltip=\"Move Up\" type=\"button\" aria-label=\"Move Up\">" + '<button class="button is-small button--moveFeeCategoryUp" data-tooltip="Move Up" type="button" aria-label="Move Up">' +
"<i class=\"fas fa-arrow-up\" aria-hidden=\"true\"></i>" + '<i class="fas fa-arrow-up" aria-hidden="true"></i>' +
"</button>" + "</button>" +
"</div>" + "</div>" +
"<div class=\"control\">" + '<div class="control">' +
"<button class=\"button is-small button--moveFeeCategoryDown\" data-tooltip=\"Move Down\" type=\"button\" aria-label=\"Move Down\">" + '<button class="button is-small button--moveFeeCategoryDown" data-tooltip="Move Down" type="button" aria-label="Move Down">' +
"<i class=\"fas fa-arrow-down\" aria-hidden=\"true\"></i>" + '<i class="fas fa-arrow-down" aria-hidden="true"></i>' +
"</button>" + "</button>" +
"</div>" + "</div>" +
"</div>" + "</div>" +
@ -62,8 +67,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
"</div>") + "</div>") +
"</div>"); "</div>");
if (feeCategory.fees.length === 0) { if (feeCategory.fees.length === 0) {
feeCategoryContainerElement.insertAdjacentHTML("beforeend", "<div class=\"message is-info\">" + feeCategoryContainerElement.insertAdjacentHTML("beforeend", '<div class="message is-info">' +
"<p class=\"message-body\">There are no fees in the \"" + cityssm.escapeHTML(feeCategory.feeCategory) + "\" category.</p>" + '<p class="message-body">There are no fees in the "' +
cityssm.escapeHTML(feeCategory.feeCategory) +
'" category.</p>' +
"</div>"); "</div>");
} }
else { else {
@ -71,85 +78,116 @@ Object.defineProperty(exports, "__esModule", { value: true });
panelElement.className = "panel"; panelElement.className = "panel";
for (const fee of feeCategory.fees) { for (const fee of feeCategory.fees) {
const panelBlockElement = document.createElement("div"); const panelBlockElement = document.createElement("div");
panelBlockElement.className = "panel-block is-block container--fee"; panelBlockElement.className =
"panel-block is-block container--fee";
panelBlockElement.dataset.feeId = fee.feeId.toString(); panelBlockElement.dataset.feeId = fee.feeId.toString();
panelBlockElement.innerHTML = "<div class=\"columns\">" + panelBlockElement.innerHTML =
("<div class=\"column is-half\">" + '<div class="columns">' +
('<div class="column is-half">' +
"<p>" + "<p>" +
"<a class=\"has-text-weight-bold\" href=\"#\">" + cityssm.escapeHTML(fee.feeName) + "</a><br />" + '<a class="has-text-weight-bold" href="#">' +
"<small>" + cityssm.escapeHTML(fee.feeDescription).replace(/\n/g, "<br />") + "</small>" + cityssm.escapeHTML(fee.feeName) +
"</a><br />" +
"<small>" +
cityssm
.escapeHTML(fee.feeDescription)
.replace(/\n/g, "<br />") +
"</small>" +
"</p>" + "</p>" +
"<p class=\"tags\">" + '<p class="tags">' +
(fee.isRequired ? (fee.isRequired
"<span class=\"tag is-warning\">Required</span>" : ? '<span class="tag is-warning">Required</span>'
"") + : "") +
(fee.occupancyTypeId ? (fee.occupancyTypeId
" <span class=\"tag has-tooltip-bottom\" data-tooltip=\"" + cityssm.escapeHTML(exports.aliases.occupancy) + " Type Filter\">" + ? ' <span class="tag has-tooltip-bottom" data-tooltip="' +
cityssm.escapeHTML(fee.occupancyType) + "</span>" : cityssm.escapeHTML(exports.aliases.occupancy) +
"") + ' Type Filter">' +
(fee.lotTypeId ? cityssm.escapeHTML(fee.occupancyType) +
" <span class=\"tag has-tooltip-bottom\" data-tooltip=\"" + cityssm.escapeHTML(exports.aliases.lot) + " Type Filter\">" + "</span>"
cityssm.escapeHTML(fee.lotType) + "</span>" : : "") +
"") + (fee.lotTypeId
? ' <span class="tag has-tooltip-bottom" data-tooltip="' +
cityssm.escapeHTML(exports.aliases.lot) +
' Type Filter">' +
cityssm.escapeHTML(fee.lotType) +
"</span>"
: "") +
"</p>" + "</p>" +
"</div>") + "</div>") +
("<div class=\"column has-text-centered\">" + ('<div class="column has-text-centered">' +
(fee.feeFunction ? (fee.feeFunction
cityssm.escapeHTML(fee.feeFunction) + "<br />" + ? cityssm.escapeHTML(fee.feeFunction) +
"<small>Fee Function</small>" : "<br />" +
"$" + fee.feeAmount.toFixed(2) + "<br />" + "<small>Fee Function</small>"
: "$" +
fee.feeAmount.toFixed(2) +
"<br />" +
"<small>Fee</small>") + "<small>Fee</small>") +
"</div>") + "</div>") +
("<div class=\"column has-text-centered\">" + ('<div class="column has-text-centered">' +
(fee.taxPercentage ? (fee.taxPercentage
fee.taxPercentage + "%" : ? fee.taxPercentage + "%"
"$" + fee.taxAmount.toFixed(2)) + : "$" + fee.taxAmount.toFixed(2)) +
"<br /><small>Tax</small>" + "<br /><small>Tax</small>" +
"</div>") + "</div>") +
("<div class=\"column has-text-centered\">" + ('<div class="column has-text-centered">' +
(fee.includeQuantity ? (fee.includeQuantity
cityssm.escapeHTML(fee.quantityUnit) + "<br />" + ? cityssm.escapeHTML(fee.quantityUnit) +
"<small>Quantity</small>" : "<br />" +
"") + "<small>Quantity</small>"
: "") +
"</div>") + "</div>") +
("<div class=\"column is-narrow\">" + ('<div class="column is-narrow">' +
"<div class=\"field has-addons\">" + '<div class="field has-addons">' +
"<div class=\"control\">" + '<div class="control">' +
"<button class=\"button is-small button--moveFeeUp\" data-tooltip=\"Move Up\" type=\"button\" aria-label=\"Move Up\">" + '<button class="button is-small button--moveFeeUp" data-tooltip="Move Up" type="button" aria-label="Move Up">' +
"<i class=\"fas fa-arrow-up\" aria-hidden=\"true\"></i>" + '<i class="fas fa-arrow-up" aria-hidden="true"></i>' +
"</button>" + "</button>" +
"</div>" + "</div>" +
"<div class=\"control\">" + '<div class="control">' +
"<button class=\"button is-small button--moveFeeDown\" data-tooltip=\"Move Down\" type=\"button\" aria-label=\"Move Down\">" + '<button class="button is-small button--moveFeeDown" data-tooltip="Move Down" type="button" aria-label="Move Down">' +
"<i class=\"fas fa-arrow-down\" aria-hidden=\"true\"></i>" + '<i class="fas fa-arrow-down" aria-hidden="true"></i>' +
"</button>" + "</button>" +
"</div>" + "</div>" +
"</div>" + "</div>" +
"</div>") + "</div>") +
"</div>"; "</div>";
panelBlockElement.querySelector("a").addEventListener("click", openEditFee); panelBlockElement
panelBlockElement.querySelector(".button--moveFeeUp").addEventListener("click", moveFeeUp); .querySelector("a")
panelBlockElement.querySelector(".button--moveFeeDown").addEventListener("click", moveFeeDown); .addEventListener("click", openEditFee);
panelBlockElement
.querySelector(".button--moveFeeUp")
.addEventListener("click", moveFeeUp);
panelBlockElement
.querySelector(".button--moveFeeDown")
.addEventListener("click", moveFeeDown);
panelElement.append(panelBlockElement); panelElement.append(panelBlockElement);
} }
feeCategoryContainerElement.append(panelElement); feeCategoryContainerElement.append(panelElement);
} }
if (feeCategory.fees.length === 0) { if (feeCategory.fees.length === 0) {
feeCategoryContainerElement.querySelector(".button--deleteFeeCategory") feeCategoryContainerElement
.querySelector(".button--deleteFeeCategory")
.addEventListener("click", confirmDeleteFeeCategory); .addEventListener("click", confirmDeleteFeeCategory);
} }
feeCategoryContainerElement.querySelector(".button--editFeeCategory") feeCategoryContainerElement
.querySelector(".button--editFeeCategory")
.addEventListener("click", openEditFeeCategory); .addEventListener("click", openEditFeeCategory);
feeCategoryContainerElement.querySelector(".button--addFee") feeCategoryContainerElement
.querySelector(".button--addFee")
.addEventListener("click", openAddFee); .addEventListener("click", openAddFee);
feeCategoryContainerElement.querySelector(".button--moveFeeCategoryUp") feeCategoryContainerElement
.querySelector(".button--moveFeeCategoryUp")
.addEventListener("click", moveFeeCategoryUp); .addEventListener("click", moveFeeCategoryUp);
feeCategoryContainerElement.querySelector(".button--moveFeeCategoryDown") feeCategoryContainerElement
.querySelector(".button--moveFeeCategoryDown")
.addEventListener("click", moveFeeCategoryDown); .addEventListener("click", moveFeeCategoryDown);
feeCategoriesContainerElement.append(feeCategoryContainerElement); feeCategoriesContainerElement.append(feeCategoryContainerElement);
} }
}; };
document.querySelector("#button--addFeeCategory").addEventListener("click", () => { document
.querySelector("#button--addFeeCategory")
.addEventListener("click", () => {
let addCloseModalFunction; let addCloseModalFunction;
const doAddFeeCategory = (submitEvent) => { const doAddFeeCategory = (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
@ -173,7 +211,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
modalElement.querySelector("#feeCategoryAdd--feeCategory").focus(); modalElement.querySelector("#feeCategoryAdd--feeCategory").focus();
addCloseModalFunction = closeModalFunction; addCloseModalFunction = closeModalFunction;
modalElement.querySelector("form").addEventListener("submit", doAddFeeCategory); modalElement
.querySelector("form")
.addEventListener("submit", doAddFeeCategory);
}, },
onremoved: () => { onremoved: () => {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
@ -211,7 +251,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
onshown: (modalElement, closeModalFunction) => { onshown: (modalElement, closeModalFunction) => {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
editCloseModalFunction = closeModalFunction; editCloseModalFunction = closeModalFunction;
modalElement.querySelector("form").addEventListener("submit", doUpdateFeeCategory); modalElement
.querySelector("form")
.addEventListener("submit", doUpdateFeeCategory);
modalElement.querySelector("#feeCategoryEdit--feeCategory").focus(); modalElement.querySelector("#feeCategoryEdit--feeCategory").focus();
}, },
onremoved: () => { onremoved: () => {
@ -319,7 +361,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
const occupancyTypeElement = modalElement.querySelector("#feeAdd--occupancyTypeId"); const occupancyTypeElement = modalElement.querySelector("#feeAdd--occupancyTypeId");
for (const occupancyType of exports.occupancyTypes) { for (const occupancyType of exports.occupancyTypes) {
const optionElement = document.createElement("option"); const optionElement = document.createElement("option");
optionElement.value = occupancyType.occupancyTypeId.toString(); optionElement.value =
occupancyType.occupancyTypeId.toString();
optionElement.textContent = occupancyType.occupancyType; optionElement.textContent = occupancyType.occupancyType;
occupancyTypeElement.append(optionElement); occupancyTypeElement.append(optionElement);
} }
@ -336,23 +379,33 @@ Object.defineProperty(exports, "__esModule", { value: true });
onshown: (modalElement, closeModalFunction) => { onshown: (modalElement, closeModalFunction) => {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
addCloseModalFunction = closeModalFunction; addCloseModalFunction = closeModalFunction;
modalElement.querySelector("form").addEventListener("submit", doAddFee); modalElement
.querySelector("form")
.addEventListener("submit", doAddFee);
modalElement.querySelector("#feeAdd--feeName").focus(); modalElement.querySelector("#feeAdd--feeName").focus();
modalElement.querySelector("#feeAdd--feeFunction").addEventListener("change", () => { modalElement
.querySelector("#feeAdd--feeFunction")
.addEventListener("change", () => {
const feeAmountElement = modalElement.querySelector("#feeAdd--feeAmount"); const feeAmountElement = modalElement.querySelector("#feeAdd--feeAmount");
const feeFunctionElement = modalElement.querySelector("#feeAdd--feeFunction"); const feeFunctionElement = modalElement.querySelector("#feeAdd--feeFunction");
if (feeFunctionElement.value === "") { if (feeFunctionElement.value === "") {
feeFunctionElement.closest(".select").classList.remove("is-success"); feeFunctionElement
.closest(".select")
.classList.remove("is-success");
feeAmountElement.classList.add("is-success"); feeAmountElement.classList.add("is-success");
feeAmountElement.disabled = false; feeAmountElement.disabled = false;
} }
else { else {
feeFunctionElement.closest(".select").classList.add("is-success"); feeFunctionElement
.closest(".select")
.classList.add("is-success");
feeAmountElement.classList.remove("is-success"); feeAmountElement.classList.remove("is-success");
feeAmountElement.disabled = true; feeAmountElement.disabled = true;
} }
}); });
modalElement.querySelector("#feeAdd--taxPercentage").addEventListener("keyup", () => { modalElement
.querySelector("#feeAdd--taxPercentage")
.addEventListener("keyup", () => {
const taxAmountElement = modalElement.querySelector("#feeAdd--taxAmount"); const taxAmountElement = modalElement.querySelector("#feeAdd--taxAmount");
const taxPercentageElement = modalElement.querySelector("#feeAdd--taxPercentage"); const taxPercentageElement = modalElement.querySelector("#feeAdd--taxPercentage");
if (taxPercentageElement.value === "") { if (taxPercentageElement.value === "") {
@ -366,7 +419,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
taxAmountElement.disabled = true; taxAmountElement.disabled = true;
} }
}); });
modalElement.querySelector("#feeAdd--includeQuantity").addEventListener("change", () => { modalElement
.querySelector("#feeAdd--includeQuantity")
.addEventListener("change", () => {
modalElement.querySelector("#feeAdd--quantityUnit").disabled = modalElement.querySelector("#feeAdd--quantityUnit").disabled =
modalElement.querySelector("#feeAdd--includeQuantity").value === ""; modalElement.querySelector("#feeAdd--includeQuantity").value === "";
}); });
@ -440,12 +495,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
const feeAmountElement = editModalElement.querySelector("#feeEdit--feeAmount"); const feeAmountElement = editModalElement.querySelector("#feeEdit--feeAmount");
const feeFunctionElement = editModalElement.querySelector("#feeEdit--feeFunction"); const feeFunctionElement = editModalElement.querySelector("#feeEdit--feeFunction");
if (feeFunctionElement.value === "") { if (feeFunctionElement.value === "") {
feeFunctionElement.closest(".select").classList.remove("is-success"); feeFunctionElement
.closest(".select")
.classList.remove("is-success");
feeAmountElement.classList.add("is-success"); feeAmountElement.classList.add("is-success");
feeAmountElement.disabled = false; feeAmountElement.disabled = false;
} }
else { else {
feeFunctionElement.closest(".select").classList.add("is-success"); feeFunctionElement
.closest(".select")
.classList.add("is-success");
feeAmountElement.classList.remove("is-success"); feeAmountElement.classList.remove("is-success");
feeAmountElement.disabled = true; feeAmountElement.disabled = true;
} }
@ -487,7 +546,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
const occupancyTypeElement = modalElement.querySelector("#feeEdit--occupancyTypeId"); const occupancyTypeElement = modalElement.querySelector("#feeEdit--occupancyTypeId");
for (const occupancyType of exports.occupancyTypes) { for (const occupancyType of exports.occupancyTypes) {
const optionElement = document.createElement("option"); const optionElement = document.createElement("option");
optionElement.value = occupancyType.occupancyTypeId.toString(); optionElement.value =
occupancyType.occupancyTypeId.toString();
optionElement.textContent = occupancyType.occupancyType; optionElement.textContent = occupancyType.occupancyType;
if (occupancyType.occupancyTypeId === fee.occupancyTypeId) { if (occupancyType.occupancyTypeId === fee.occupancyTypeId) {
optionElement.selected = true; optionElement.selected = true;
@ -505,11 +565,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
lotTypeElement.append(optionElement); lotTypeElement.append(optionElement);
} }
modalElement.querySelector("#feeEdit--feeAmount").value = fee.feeAmount ? fee.feeAmount.toFixed(2) : ""; modalElement.querySelector("#feeEdit--feeAmount").value = fee.feeAmount ? fee.feeAmount.toFixed(2) : "";
modalElement.querySelector("#feeEdit--feeFunction").addEventListener("change", toggleFeeFields); modalElement
.querySelector("#feeEdit--feeFunction")
.addEventListener("change", toggleFeeFields);
toggleFeeFields(); toggleFeeFields();
modalElement.querySelector("#feeEdit--taxAmount").value = fee.taxAmount ? fee.taxAmount.toFixed(2) : ""; modalElement.querySelector("#feeEdit--taxAmount").value = fee.taxAmount ? fee.taxAmount.toFixed(2) : "";
const taxPercentageElement = modalElement.querySelector("#feeEdit--taxPercentage"); const taxPercentageElement = modalElement.querySelector("#feeEdit--taxPercentage");
taxPercentageElement.value = fee.taxPercentage ? fee.taxPercentage.toString() : ""; taxPercentageElement.value = fee.taxPercentage
? fee.taxPercentage.toString()
: "";
taxPercentageElement.addEventListener("keyup", toggleTaxFields); taxPercentageElement.addEventListener("keyup", toggleTaxFields);
toggleTaxFields(); toggleTaxFields();
const includeQuantityElement = modalElement.querySelector("#feeEdit--includeQuantity"); const includeQuantityElement = modalElement.querySelector("#feeEdit--includeQuantity");
@ -527,9 +591,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
onshown: (modalElement, closeModalFunction) => { onshown: (modalElement, closeModalFunction) => {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
editCloseModalFunction = closeModalFunction; editCloseModalFunction = closeModalFunction;
modalElement.querySelector("form").addEventListener("submit", doUpdateFee); modalElement
.querySelector("form")
.addEventListener("submit", doUpdateFee);
bulmaJS.init(modalElement); bulmaJS.init(modalElement);
modalElement.querySelector(".button--deleteFee").addEventListener("click", confirmDeleteFee); modalElement
.querySelector(".button--deleteFee")
.addEventListener("click", confirmDeleteFee);
}, },
onremoved: () => { onremoved: () => {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();

File diff suppressed because it is too large Load Diff

View File

@ -105,10 +105,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
const renderWorkOrderTypes = () => { const renderWorkOrderTypes = () => {
const containerElement = document.querySelector("#container--workOrderTypes"); const containerElement = document.querySelector("#container--workOrderTypes");
if (workOrderTypes.length === 0) { if (workOrderTypes.length === 0) {
containerElement.innerHTML = "<tr>" + containerElement.innerHTML =
"<td colspan=\"2\">" + "<tr>" +
"<div class=\"message is-warning\">" + '<td colspan="2">' +
"<p class=\"message-body\">There are no active work order types.</p>" + '<div class="message is-warning">' +
'<p class="message-body">There are no active work order types.</p>' +
"</div>" + "</div>" +
"</td>" + "</td>" +
"</tr>"; "</tr>";
@ -117,47 +118,63 @@ Object.defineProperty(exports, "__esModule", { value: true });
containerElement.innerHTML = ""; containerElement.innerHTML = "";
for (const workOrderType of workOrderTypes) { for (const workOrderType of workOrderTypes) {
const tableRowElement = document.createElement("tr"); const tableRowElement = document.createElement("tr");
tableRowElement.dataset.workOrderTypeId = workOrderType.workOrderTypeId.toString(); tableRowElement.dataset.workOrderTypeId =
tableRowElement.innerHTML = "<td>" + workOrderType.workOrderTypeId.toString();
tableRowElement.innerHTML =
"<td>" +
"<form>" + "<form>" +
"<input name=\"workOrderTypeId\" type=\"hidden\" value=\"" + workOrderType.workOrderTypeId.toString() + "\" />" + '<input name="workOrderTypeId" type="hidden" value="' +
("<div class=\"field has-addons\">" + workOrderType.workOrderTypeId.toString() +
"<div class=\"control\">" + '" />' +
"<input class=\"input\" name=\"workOrderType\" type=\"text\" value=\"" + cityssm.escapeHTML(workOrderType.workOrderType) + "\" maxlength=\"100\" required />" + ('<div class="field has-addons">' +
'<div class="control">' +
'<input class="input" name="workOrderType" type="text" value="' +
cityssm.escapeHTML(workOrderType.workOrderType) +
'" maxlength="100" required />' +
"</div>" + "</div>" +
"<div class=\"control\">" + '<div class="control">' +
"<button class=\"button is-success\" type=\"submit\"><i class=\"fas fa-save\" aria-hidden=\"true\"></i></button>" + '<button class="button is-success" type="submit"><i class="fas fa-save" aria-hidden="true"></i></button>' +
"</div>" + "</div>" +
"</div>") + "</div>") +
"</form>" + "</form>" +
"</td>" + "</td>" +
"<td class=\"is-nowrap\">" + '<td class="is-nowrap">' +
"<div class=\"field is-grouped\">" + '<div class="field is-grouped">' +
"<div class=\"control\">" + '<div class="control">' +
("<div class=\"field has-addons\">" + ('<div class="field has-addons">' +
"<div class=\"control\">" + '<div class="control">' +
"<button class=\"button button--moveWorkOrderTypeUp\" data-tooltip=\"Move Up\" type=\"button\" aria-label=\"Move Up\"><i class=\"fas fa-arrow-up\" aria-hidden=\"true\"></i></button>" + '<button class="button button--moveWorkOrderTypeUp" data-tooltip="Move Up" type="button" aria-label="Move Up"><i class="fas fa-arrow-up" aria-hidden="true"></i></button>' +
"</div>" + "</div>" +
"<div class=\"control\">" + '<div class="control">' +
"<button class=\"button button--moveWorkOrderTypeDown\" data-tooltip=\"Move Down\" type=\"button\" aria-label=\"Move Down\"><i class=\"fas fa-arrow-down\" aria-hidden=\"true\"></i></button>" + '<button class="button button--moveWorkOrderTypeDown" data-tooltip="Move Down" type="button" aria-label="Move Down"><i class="fas fa-arrow-down" aria-hidden="true"></i></button>' +
"</div>" + "</div>" +
"</div>") + "</div>") +
"</div>" + "</div>" +
"<div class=\"control\">" + '<div class="control">' +
"<button class=\"button is-danger is-light button--deleteWorkOrderType\" data-tooltip=\"Delete Work Order Type\" type=\"button\" aria-label=\"Delete Work Order Type\">" + '<button class="button is-danger is-light button--deleteWorkOrderType" data-tooltip="Delete Work Order Type" type="button" aria-label="Delete Work Order Type">' +
"<i class=\"fas fa-trash\" aria-hidden=\"true\"></i>" + '<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" + "</button>" +
"</div>" + "</div>" +
"</div>" + "</div>" +
"</td>"; "</td>";
tableRowElement.querySelector("form").addEventListener("submit", updateWorkOrderType); tableRowElement
tableRowElement.querySelector(".button--moveWorkOrderTypeUp").addEventListener("click", moveWorkOrderTypeUp); .querySelector("form")
tableRowElement.querySelector(".button--moveWorkOrderTypeDown").addEventListener("click", moveWorkOrderTypeDown); .addEventListener("submit", updateWorkOrderType);
tableRowElement.querySelector(".button--deleteWorkOrderType").addEventListener("click", deleteWorkOrderType); tableRowElement
.querySelector(".button--moveWorkOrderTypeUp")
.addEventListener("click", moveWorkOrderTypeUp);
tableRowElement
.querySelector(".button--moveWorkOrderTypeDown")
.addEventListener("click", moveWorkOrderTypeDown);
tableRowElement
.querySelector(".button--deleteWorkOrderType")
.addEventListener("click", deleteWorkOrderType);
containerElement.append(tableRowElement); containerElement.append(tableRowElement);
} }
}; };
document.querySelector("#form--addWorkOrderType").addEventListener("submit", (submitEvent) => { document
.querySelector("#form--addWorkOrderType")
.addEventListener("submit", (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
const formElement = submitEvent.currentTarget; const formElement = submitEvent.currentTarget;
cityssm.postJSON(urlPrefix + "/admin/doAddWorkOrderType", formElement, (responseJSON) => { cityssm.postJSON(urlPrefix + "/admin/doAddWorkOrderType", formElement, (responseJSON) => {
@ -185,7 +202,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
if (responseJSON.success) { if (responseJSON.success) {
lotStatuses = responseJSON.lotStatuses; lotStatuses = responseJSON.lotStatuses;
bulmaJS.alert({ bulmaJS.alert({
message: exports.aliases.lot + " Status Updated Successfully", message: exports.aliases.lot +
" Status Updated Successfully",
contextualColorName: "success" contextualColorName: "success"
}); });
} }
@ -214,13 +232,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
tableRowElement.remove(); tableRowElement.remove();
} }
bulmaJS.alert({ bulmaJS.alert({
message: exports.aliases.lot + " Status Deleted Successfully", message: exports.aliases.lot +
" Status Deleted Successfully",
contextualColorName: "success" contextualColorName: "success"
}); });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Deleting " + exports.aliases.lot + " Status", title: "Error Deleting " +
exports.aliases.lot +
" Status",
message: responseJSON.errorMessage, message: responseJSON.errorMessage,
contextualColorName: "danger" contextualColorName: "danger"
}); });
@ -230,7 +251,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
bulmaJS.confirm({ bulmaJS.confirm({
title: "Delete " + exports.aliases.lot + " Status", title: "Delete " + exports.aliases.lot + " Status",
message: "Are you sure you want to delete this status?<br />" + message: "Are you sure you want to delete this status?<br />" +
"Note that no " + exports.aliases.lots.toLowerCase() + " will be removed.", "Note that no " +
exports.aliases.lots.toLowerCase() +
" will be removed.",
messageIsHtml: true, messageIsHtml: true,
contextualColorName: "warning", contextualColorName: "warning",
okButton: { okButton: {
@ -280,10 +303,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
const renderLotStatuses = () => { const renderLotStatuses = () => {
const containerElement = document.querySelector("#container--lotStatuses"); const containerElement = document.querySelector("#container--lotStatuses");
if (workOrderTypes.length === 0) { if (workOrderTypes.length === 0) {
containerElement.innerHTML = "<tr>" + containerElement.innerHTML =
"<td colspan=\"2\">" + "<tr>" +
"<div class=\"message is-warning\">" + '<td colspan="2">' +
"<p class=\"message-body\">There are no active " + cityssm.escapeHTML(exports.aliases.lot.toLowerCase()) + " statuses.</p>" + '<div class="message is-warning">' +
'<p class="message-body">There are no active ' +
cityssm.escapeHTML(exports.aliases.lot.toLowerCase()) +
" statuses.</p>" +
"</div>" + "</div>" +
"</td>" + "</td>" +
"</tr>"; "</tr>";
@ -292,47 +318,63 @@ Object.defineProperty(exports, "__esModule", { value: true });
containerElement.innerHTML = ""; containerElement.innerHTML = "";
for (const lotStatus of lotStatuses) { for (const lotStatus of lotStatuses) {
const tableRowElement = document.createElement("tr"); const tableRowElement = document.createElement("tr");
tableRowElement.dataset.lotStatusId = lotStatus.lotStatusId.toString(); tableRowElement.dataset.lotStatusId =
tableRowElement.innerHTML = "<td>" + lotStatus.lotStatusId.toString();
tableRowElement.innerHTML =
"<td>" +
"<form>" + "<form>" +
"<input name=\"lotStatusId\" type=\"hidden\" value=\"" + lotStatus.lotStatusId.toString() + "\" />" + '<input name="lotStatusId" type="hidden" value="' +
("<div class=\"field has-addons\">" + lotStatus.lotStatusId.toString() +
"<div class=\"control\">" + '" />' +
"<input class=\"input\" name=\"lotStatus\" type=\"text\" value=\"" + cityssm.escapeHTML(lotStatus.lotStatus) + "\" maxlength=\"100\" required />" + ('<div class="field has-addons">' +
'<div class="control">' +
'<input class="input" name="lotStatus" type="text" value="' +
cityssm.escapeHTML(lotStatus.lotStatus) +
'" maxlength="100" required />' +
"</div>" + "</div>" +
"<div class=\"control\">" + '<div class="control">' +
"<button class=\"button is-success\" type=\"submit\"><i class=\"fas fa-save\" aria-hidden=\"true\"></i></button>" + '<button class="button is-success" type="submit"><i class="fas fa-save" aria-hidden="true"></i></button>' +
"</div>" + "</div>" +
"</div>") + "</div>") +
"</form>" + "</form>" +
"</td>" + "</td>" +
"<td class=\"is-nowrap\">" + '<td class="is-nowrap">' +
"<div class=\"field is-grouped\">" + '<div class="field is-grouped">' +
"<div class=\"control\">" + '<div class="control">' +
("<div class=\"field has-addons\">" + ('<div class="field has-addons">' +
"<div class=\"control\">" + '<div class="control">' +
"<button class=\"button button--moveLotStatusUp\" data-tooltip=\"Move Up\" type=\"button\" aria-label=\"Move Up\"><i class=\"fas fa-arrow-up\" aria-hidden=\"true\"></i></button>" + '<button class="button button--moveLotStatusUp" data-tooltip="Move Up" type="button" aria-label="Move Up"><i class="fas fa-arrow-up" aria-hidden="true"></i></button>' +
"</div>" + "</div>" +
"<div class=\"control\">" + '<div class="control">' +
"<button class=\"button button--moveLotStatusDown\" data-tooltip=\"Move Down\" type=\"button\" aria-label=\"Move Down\"><i class=\"fas fa-arrow-down\" aria-hidden=\"true\"></i></button>" + '<button class="button button--moveLotStatusDown" data-tooltip="Move Down" type="button" aria-label="Move Down"><i class="fas fa-arrow-down" aria-hidden="true"></i></button>' +
"</div>" + "</div>" +
"</div>") + "</div>") +
"</div>" + "</div>" +
"<div class=\"control\">" + '<div class="control">' +
"<button class=\"button is-danger is-light button--deleteLotStatus\" data-tooltip=\"Delete Status\" type=\"button\" aria-label=\"Delete Status\">" + '<button class="button is-danger is-light button--deleteLotStatus" data-tooltip="Delete Status" type="button" aria-label="Delete Status">' +
"<i class=\"fas fa-trash\" aria-hidden=\"true\"></i>" + '<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" + "</button>" +
"</div>" + "</div>" +
"</div>" + "</div>" +
"</td>"; "</td>";
tableRowElement.querySelector("form").addEventListener("submit", updateLotStatus); tableRowElement
tableRowElement.querySelector(".button--moveLotStatusUp").addEventListener("click", moveLotStatusUp); .querySelector("form")
tableRowElement.querySelector(".button--moveLotStatusDown").addEventListener("click", moveLotStatusDown); .addEventListener("submit", updateLotStatus);
tableRowElement.querySelector(".button--deleteLotStatus").addEventListener("click", deleteLotStatus); tableRowElement
.querySelector(".button--moveLotStatusUp")
.addEventListener("click", moveLotStatusUp);
tableRowElement
.querySelector(".button--moveLotStatusDown")
.addEventListener("click", moveLotStatusDown);
tableRowElement
.querySelector(".button--deleteLotStatus")
.addEventListener("click", deleteLotStatus);
containerElement.append(tableRowElement); containerElement.append(tableRowElement);
} }
}; };
document.querySelector("#form--addLotStatus").addEventListener("submit", (submitEvent) => { document
.querySelector("#form--addLotStatus")
.addEventListener("submit", (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
const formElement = submitEvent.currentTarget; const formElement = submitEvent.currentTarget;
cityssm.postJSON(urlPrefix + "/admin/doAddLotStatus", formElement, (responseJSON) => { cityssm.postJSON(urlPrefix + "/admin/doAddLotStatus", formElement, (responseJSON) => {
@ -344,7 +386,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Adding " + exports.aliases.lot + " Status", title: "Error Adding " +
exports.aliases.lot +
" Status",
message: responseJSON.errorMessage, message: responseJSON.errorMessage,
contextualColorName: "danger" contextualColorName: "danger"
}); });
@ -360,13 +404,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
if (responseJSON.success) { if (responseJSON.success) {
lotOccupantTypes = responseJSON.lotOccupantTypes; lotOccupantTypes = responseJSON.lotOccupantTypes;
bulmaJS.alert({ bulmaJS.alert({
message: exports.aliases.lot + " " + exports.aliases.occupant + " Type Updated Successfully", message: exports.aliases.lot +
" " +
exports.aliases.occupant +
" Type Updated Successfully",
contextualColorName: "success" contextualColorName: "success"
}); });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Updating " + exports.aliases.lot + " " + exports.aliases.occupant + " Type", title: "Error Updating " +
exports.aliases.lot +
" " +
exports.aliases.occupant +
" Type",
message: responseJSON.errorMessage, message: responseJSON.errorMessage,
contextualColorName: "danger" contextualColorName: "danger"
}); });
@ -389,13 +440,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
tableRowElement.remove(); tableRowElement.remove();
} }
bulmaJS.alert({ bulmaJS.alert({
message: exports.aliases.lot + " " + exports.aliases.occupant + " Type Deleted Successfully", message: exports.aliases.lot +
" " +
exports.aliases.occupant +
" Type Deleted Successfully",
contextualColorName: "success" contextualColorName: "success"
}); });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Deleting " + exports.aliases.lot + " " + exports.aliases.occupant + " Type", title: "Error Deleting " +
exports.aliases.lot +
" " +
exports.aliases.occupant +
" Type",
message: responseJSON.errorMessage, message: responseJSON.errorMessage,
contextualColorName: "danger" contextualColorName: "danger"
}); });
@ -403,13 +461,29 @@ Object.defineProperty(exports, "__esModule", { value: true });
}); });
}; };
bulmaJS.confirm({ bulmaJS.confirm({
title: "Delete " + exports.aliases.lot + " " + exports.aliases.occupant + " Type", title: "Delete " +
message: "Are you sure you want to delete this " + exports.aliases.lot.toLowerCase() + " " + exports.aliases.occupant.toLowerCase() + " type?<br />" + exports.aliases.lot +
"Note that no " + exports.aliases.lot.toLowerCase() + " " + exports.aliases.occupancy.toLowerCase() + " will be removed.", " " +
exports.aliases.occupant +
" Type",
message: "Are you sure you want to delete this " +
exports.aliases.lot.toLowerCase() +
" " +
exports.aliases.occupant.toLowerCase() +
" type?<br />" +
"Note that no " +
exports.aliases.lot.toLowerCase() +
" " +
exports.aliases.occupancy.toLowerCase() +
" will be removed.",
messageIsHtml: true, messageIsHtml: true,
contextualColorName: "warning", contextualColorName: "warning",
okButton: { okButton: {
text: "Yes, Delete " + exports.aliases.lot + " " + exports.aliases.occupant + " Type", text: "Yes, Delete " +
exports.aliases.lot +
" " +
exports.aliases.occupant +
" Type",
callbackFunction: doDelete callbackFunction: doDelete
} }
}); });
@ -426,7 +500,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Moving " + exports.aliases.lot + " " + exports.aliases.occupant + " Type", title: "Error Moving " +
exports.aliases.lot +
" " +
exports.aliases.occupant +
" Type",
message: responseJSON.errorMessage, message: responseJSON.errorMessage,
contextualColorName: "danger" contextualColorName: "danger"
}); });
@ -445,7 +523,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Moving " + exports.aliases.lot + " " + exports.aliases.occupant + " Type", title: "Error Moving " +
exports.aliases.lot +
" " +
exports.aliases.occupant +
" Type",
message: responseJSON.errorMessage, message: responseJSON.errorMessage,
contextualColorName: "danger" contextualColorName: "danger"
}); });
@ -455,10 +537,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
const renderLotOccupantTypes = () => { const renderLotOccupantTypes = () => {
const containerElement = document.querySelector("#container--lotOccupantTypes"); const containerElement = document.querySelector("#container--lotOccupantTypes");
if (workOrderTypes.length === 0) { if (workOrderTypes.length === 0) {
containerElement.innerHTML = "<tr>" + containerElement.innerHTML =
"<td colspan=\"2\">" + "<tr>" +
"<div class=\"message is-warning\">" + '<td colspan="2">' +
"<p class=\"message-body\">There are no active " + cityssm.escapeHTML(exports.aliases.lot.toLowerCase()) + " " + cityssm.escapeHTML(exports.aliases.occupant.toLowerCase()) + " types.</p>" + '<div class="message is-warning">' +
'<p class="message-body">There are no active ' +
cityssm.escapeHTML(exports.aliases.lot.toLowerCase()) +
" " +
cityssm.escapeHTML(exports.aliases.occupant.toLowerCase()) +
" types.</p>" +
"</div>" + "</div>" +
"</td>" + "</td>" +
"</tr>"; "</tr>";
@ -467,49 +554,73 @@ Object.defineProperty(exports, "__esModule", { value: true });
containerElement.innerHTML = ""; containerElement.innerHTML = "";
for (const lotOccupantType of lotOccupantTypes) { for (const lotOccupantType of lotOccupantTypes) {
const tableRowElement = document.createElement("tr"); const tableRowElement = document.createElement("tr");
tableRowElement.dataset.lotOccupantTypeId = lotOccupantType.lotOccupantTypeId.toString(); tableRowElement.dataset.lotOccupantTypeId =
tableRowElement.innerHTML = "<td>" + lotOccupantType.lotOccupantTypeId.toString();
tableRowElement.innerHTML =
"<td>" +
"<form>" + "<form>" +
"<input name=\"lotOccupantTypeId\" type=\"hidden\" value=\"" + lotOccupantType.lotOccupantTypeId.toString() + "\" />" + '<input name="lotOccupantTypeId" type="hidden" value="' +
("<div class=\"field has-addons\">" + lotOccupantType.lotOccupantTypeId.toString() +
"<div class=\"control\">" + '" />' +
"<input class=\"input\" name=\"lotOccupantType\" type=\"text\" value=\"" + cityssm.escapeHTML(lotOccupantType.lotOccupantType) + "\" maxlength=\"100\" required />" + ('<div class="field has-addons">' +
'<div class="control">' +
'<input class="input" name="lotOccupantType" type="text" value="' +
cityssm.escapeHTML(lotOccupantType.lotOccupantType) +
'" maxlength="100" required />' +
"</div>" + "</div>" +
"<div class=\"control\">" + '<div class="control">' +
"<button class=\"button is-success\" type=\"submit\"><i class=\"fas fa-save\" aria-hidden=\"true\"></i></button>" + '<button class="button is-success" type="submit"><i class="fas fa-save" aria-hidden="true"></i></button>' +
"</div>" + "</div>" +
"</div>") + "</div>") +
"</form>" + "</form>" +
"</td>" + "</td>" +
"<td class=\"is-nowrap\">" + '<td class="is-nowrap">' +
"<div class=\"field is-grouped\">" + '<div class="field is-grouped">' +
"<div class=\"control\">" + '<div class="control">' +
("<div class=\"field has-addons\">" + ('<div class="field has-addons">' +
"<div class=\"control\">" + '<div class="control">' +
"<button class=\"button button--moveLotOccupantTypeUp\" data-tooltip=\"Move Up\" type=\"button\" aria-label=\"Move Up\"><i class=\"fas fa-arrow-up\" aria-hidden=\"true\"></i></button>" + '<button class="button button--moveLotOccupantTypeUp" data-tooltip="Move Up" type="button" aria-label="Move Up"><i class="fas fa-arrow-up" aria-hidden="true"></i></button>' +
"</div>" + "</div>" +
"<div class=\"control\">" + '<div class="control">' +
"<button class=\"button button--moveLotOccupantTypeDown\" data-tooltip=\"Move Down\" type=\"button\" aria-label=\"Move Down\"><i class=\"fas fa-arrow-down\" aria-hidden=\"true\"></i></button>" + '<button class="button button--moveLotOccupantTypeDown" data-tooltip="Move Down" type="button" aria-label="Move Down"><i class="fas fa-arrow-down" aria-hidden="true"></i></button>' +
"</div>" + "</div>" +
"</div>") + "</div>") +
"</div>" + "</div>" +
"<div class=\"control\">" + '<div class="control">' +
"<button class=\"button is-danger is-light button--deleteLotOccupantType\"" + '<button class="button is-danger is-light button--deleteLotOccupantType"' +
" data-tooltip=\"Delete " + cityssm.escapeHTML(exports.aliases.lot) + " " + cityssm.escapeHTML(exports.aliases.occupant) + " Type\" type=\"button\"" + ' data-tooltip="Delete ' +
" aria-label=\"Delete " + cityssm.escapeHTML(exports.aliases.lot) + " " + cityssm.escapeHTML(exports.aliases.occupant) + " Type\">" + cityssm.escapeHTML(exports.aliases.lot) +
"<i class=\"fas fa-trash\" aria-hidden=\"true\"></i>" + " " +
cityssm.escapeHTML(exports.aliases.occupant) +
' Type" type="button"' +
' aria-label="Delete ' +
cityssm.escapeHTML(exports.aliases.lot) +
" " +
cityssm.escapeHTML(exports.aliases.occupant) +
' Type">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" + "</button>" +
"</div>" + "</div>" +
"</div>" + "</div>" +
"</td>"; "</td>";
tableRowElement.querySelector("form").addEventListener("submit", updateLotOccupantType); tableRowElement
tableRowElement.querySelector(".button--moveLotOccupantTypeUp").addEventListener("click", moveLotOccupantTypeUp); .querySelector("form")
tableRowElement.querySelector(".button--moveLotOccupantTypeDown").addEventListener("click", moveLotOccupantTypeDown); .addEventListener("submit", updateLotOccupantType);
tableRowElement.querySelector(".button--deleteLotOccupantType").addEventListener("click", deleteLotOccupantType); tableRowElement
.querySelector(".button--moveLotOccupantTypeUp")
.addEventListener("click", moveLotOccupantTypeUp);
tableRowElement
.querySelector(".button--moveLotOccupantTypeDown")
.addEventListener("click", moveLotOccupantTypeDown);
tableRowElement
.querySelector(".button--deleteLotOccupantType")
.addEventListener("click", deleteLotOccupantType);
containerElement.append(tableRowElement); containerElement.append(tableRowElement);
} }
}; };
document.querySelector("#form--addLotOccupantType").addEventListener("submit", (submitEvent) => { document
.querySelector("#form--addLotOccupantType")
.addEventListener("submit", (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
const formElement = submitEvent.currentTarget; const formElement = submitEvent.currentTarget;
cityssm.postJSON(urlPrefix + "/admin/doAddLotOccupantType", formElement, (responseJSON) => { cityssm.postJSON(urlPrefix + "/admin/doAddLotOccupantType", formElement, (responseJSON) => {
@ -521,7 +632,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Adding " + exports.aliases.lot + " " + exports.aliases.occupant + " Type", title: "Error Adding " +
exports.aliases.lot +
" " +
exports.aliases.occupant +
" Type",
message: responseJSON.errorMessage, message: responseJSON.errorMessage,
contextualColorName: "danger" contextualColorName: "danger"
}); });

File diff suppressed because it is too large Load Diff

View File

@ -3,15 +3,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
(() => { (() => {
const los = exports.los; const los = exports.los;
const urlPrefix = document.querySelector("main").dataset.urlPrefix; const urlPrefix = document.querySelector("main").dataset.urlPrefix;
const lotId = document.querySelector("#lot--lotId").value; const lotId = document.querySelector("#lot--lotId")
const isCreate = (lotId === ""); .value;
const isCreate = lotId === "";
const formElement = document.querySelector("#form--lot"); const formElement = document.querySelector("#form--lot");
const updateLot = (formEvent) => { const updateLot = (formEvent) => {
formEvent.preventDefault(); formEvent.preventDefault();
cityssm.postJSON(urlPrefix + "/lots/" + (isCreate ? "doCreateLot" : "doUpdateLot"), formElement, (responseJSON) => { cityssm.postJSON(urlPrefix + "/lots/" + (isCreate ? "doCreateLot" : "doUpdateLot"), formElement, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
if (isCreate) { if (isCreate) {
window.location.href = urlPrefix + "/lots/" + responseJSON.lotId + "/edit"; window.location.href =
urlPrefix + "/lots/" + responseJSON.lotId + "/edit";
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
@ -34,7 +36,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
let lotComments = exports.lotComments; let lotComments = exports.lotComments;
delete exports.lotComments; delete exports.lotComments;
const openEditLotComment = (clickEvent) => { const openEditLotComment = (clickEvent) => {
const lotCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.lotCommentId, 10); const lotCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset
.lotCommentId, 10);
const lotComment = lotComments.find((currentLotComment) => { const lotComment = lotComments.find((currentLotComment) => {
return currentLotComment.lotCommentId === lotCommentId; return currentLotComment.lotCommentId === lotCommentId;
}); });
@ -79,7 +82,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
}); });
}; };
const deleteLotComment = (clickEvent) => { const deleteLotComment = (clickEvent) => {
const lotCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.lotCommentId, 10); const lotCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset
.lotCommentId, 10);
const doDelete = () => { const doDelete = () => {
cityssm.postJSON(urlPrefix + "/lots/doDeleteLotComment", { cityssm.postJSON(urlPrefix + "/lots/doDeleteLotComment", {
lotId, lotId,
@ -111,42 +115,56 @@ Object.defineProperty(exports, "__esModule", { value: true });
const renderLotComments = () => { const renderLotComments = () => {
const containerElement = document.querySelector("#container--lotComments"); const containerElement = document.querySelector("#container--lotComments");
if (lotComments.length === 0) { if (lotComments.length === 0) {
containerElement.innerHTML = "<div class=\"message is-info\">" + containerElement.innerHTML =
"<p class=\"message-body\">There are no comments to display.</p>" + '<div class="message is-info">' +
'<p class="message-body">There are no comments to display.</p>' +
"</div>"; "</div>";
return; return;
} }
const tableElement = document.createElement("table"); const tableElement = document.createElement("table");
tableElement.className = "table is-fullwidth is-striped is-hoverable"; tableElement.className = "table is-fullwidth is-striped is-hoverable";
tableElement.innerHTML = "<thead><tr>" + tableElement.innerHTML =
"<thead><tr>" +
"<th>Commentor</th>" + "<th>Commentor</th>" +
"<th>Comment Date</th>" + "<th>Comment Date</th>" +
"<th>Comment</th>" + "<th>Comment</th>" +
"<th class=\"is-hidden-print\"><span class=\"is-sr-only\">Options</span></th>" + '<th class="is-hidden-print"><span class="is-sr-only">Options</span></th>' +
"</tr></thead>" + "</tr></thead>" +
"<tbody></tbody>"; "<tbody></tbody>";
for (const lotComment of lotComments) { for (const lotComment of lotComments) {
const tableRowElement = document.createElement("tr"); const tableRowElement = document.createElement("tr");
tableRowElement.dataset.lotCommentId = lotComment.lotCommentId.toString(); tableRowElement.dataset.lotCommentId =
tableRowElement.innerHTML = "<td>" + cityssm.escapeHTML(lotComment.recordCreate_userName) + "</td>" + lotComment.lotCommentId.toString();
tableRowElement.innerHTML =
"<td>" +
cityssm.escapeHTML(lotComment.recordCreate_userName) +
"</td>" +
"<td>" + "<td>" +
lotComment.lotCommentDateString + lotComment.lotCommentDateString +
(lotComment.lotCommentTime === 0 ? "" : " " + lotComment.lotCommentTimeString) + (lotComment.lotCommentTime === 0
? ""
: " " + lotComment.lotCommentTimeString) +
"</td>" + "</td>" +
"<td>" + cityssm.escapeHTML(lotComment.lotComment) + "</td>" + "<td>" +
("<td class=\"is-hidden-print\">" + cityssm.escapeHTML(lotComment.lotComment) +
"<div class=\"buttons are-small is-justify-content-end\">" + "</td>" +
("<button class=\"button is-primary button--edit\" type=\"button\">" + ('<td class="is-hidden-print">' +
"<span class=\"icon is-small\"><i class=\"fas fa-pencil-alt\" aria-hidden=\"true\"></i></span>" + '<div class="buttons are-small is-justify-content-end">' +
('<button class="button is-primary button--edit" type="button">' +
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
" <span>Edit</span>" + " <span>Edit</span>" +
"</button>") + "</button>") +
("<button class=\"button is-light is-danger button--delete\" data-tooltip=\"Delete Comment\" type=\"button\" aria-label=\"Delete\">" + ('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
"<i class=\"fas fa-trash\" aria-hidden=\"true\"></i>" + '<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>") + "</button>") +
"</div>" + "</div>" +
"</td>"); "</td>");
tableRowElement.querySelector(".button--edit").addEventListener("click", openEditLotComment); tableRowElement
tableRowElement.querySelector(".button--delete").addEventListener("click", deleteLotComment); .querySelector(".button--edit")
.addEventListener("click", openEditLotComment);
tableRowElement
.querySelector(".button--delete")
.addEventListener("click", deleteLotComment);
tableElement.querySelector("tbody").append(tableRowElement); tableElement.querySelector("tbody").append(tableRowElement);
} }
containerElement.innerHTML = ""; containerElement.innerHTML = "";
@ -168,7 +186,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
onshow(modalElement) { onshow(modalElement) {
los.populateAliases(modalElement); los.populateAliases(modalElement);
modalElement.querySelector("#lotCommentAdd--lotId").value = lotId; modalElement.querySelector("#lotCommentAdd--lotId").value = lotId;
modalElement.querySelector("form").addEventListener("submit", doAddComment); modalElement
.querySelector("form")
.addEventListener("submit", doAddComment);
}, },
onshown(modalElement, closeModalFunction) { onshown(modalElement, closeModalFunction) {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
@ -182,7 +202,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
}); });
}; };
if (!isCreate) { if (!isCreate) {
document.querySelector("#lotComments--add").addEventListener("click", openAddCommentModal); document
.querySelector("#lotComments--add")
.addEventListener("click", openAddCommentModal);
renderLotComments(); renderLotComments();
} }
})(); })();

View File

@ -3,25 +3,21 @@
import type * as globalTypes from "../types/globalTypes"; import type * as globalTypes from "../types/globalTypes";
import type * as recordTypes from "../types/recordTypes"; import type * as recordTypes from "../types/recordTypes";
import type { import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
cityssmGlobal
} from "@cityssm/bulma-webapp-js/src/types";
import type { import type { BulmaJS } from "@cityssm/bulma-js/types";
BulmaJS
} from "@cityssm/bulma-js/types";
declare const cityssm: cityssmGlobal; declare const cityssm: cityssmGlobal;
declare const bulmaJS: BulmaJS; declare const bulmaJS: BulmaJS;
(() => { (() => {
const los = (exports.los as globalTypes.LOS); const los = exports.los as globalTypes.LOS;
const urlPrefix = document.querySelector("main").dataset.urlPrefix; const urlPrefix = document.querySelector("main").dataset.urlPrefix;
const lotId = (document.querySelector("#lot--lotId") as HTMLInputElement).value; const lotId = (document.querySelector("#lot--lotId") as HTMLInputElement)
const isCreate = (lotId === ""); .value;
const isCreate = lotId === "";
// Main form // Main form
@ -30,18 +26,22 @@ declare const bulmaJS: BulmaJS;
const updateLot = (formEvent: SubmitEvent) => { const updateLot = (formEvent: SubmitEvent) => {
formEvent.preventDefault(); formEvent.preventDefault();
cityssm.postJSON(urlPrefix + "/lots/" + (isCreate ? "doCreateLot" : "doUpdateLot"), cityssm.postJSON(
urlPrefix + "/lots/" + (isCreate ? "doCreateLot" : "doUpdateLot"),
formElement, formElement,
(responseJSON: { (responseJSON: {
success: boolean;lotId ? : number;errorMessage ? : string success: boolean;
lotId?: number;
errorMessage?: string;
}) => { }) => {
if (responseJSON.success) { if (responseJSON.success) {
if (isCreate) { if (isCreate) {
window.location.href = urlPrefix + "/lots/" + responseJSON.lotId + "/edit"; window.location.href =
urlPrefix + "/lots/" + responseJSON.lotId + "/edit";
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
message: exports.aliases.lot + " Updated Successfully", message:
exports.aliases.lot + " Updated Successfully",
contextualColorName: "success" contextualColorName: "success"
}); });
} }
@ -52,7 +52,8 @@ declare const bulmaJS: BulmaJS;
contextualColorName: "danger" contextualColorName: "danger"
}); });
} }
}); }
);
}; };
formElement.addEventListener("submit", updateLot); formElement.addEventListener("submit", updateLot);
@ -65,8 +66,11 @@ declare const bulmaJS: BulmaJS;
delete exports.lotComments; delete exports.lotComments;
const openEditLotComment = (clickEvent: Event) => { const openEditLotComment = (clickEvent: Event) => {
const lotCommentId = Number.parseInt(
const lotCommentId = Number.parseInt((clickEvent.currentTarget as HTMLElement).closest("tr").dataset.lotCommentId, 10); (clickEvent.currentTarget as HTMLElement).closest("tr").dataset
.lotCommentId,
10
);
const lotComment = lotComments.find((currentLotComment) => { const lotComment = lotComments.find((currentLotComment) => {
return currentLotComment.lotCommentId === lotCommentId; return currentLotComment.lotCommentId === lotCommentId;
@ -76,17 +80,16 @@ declare const bulmaJS: BulmaJS;
let editCloseModalFunction: () => void; let editCloseModalFunction: () => void;
const editComment = (submitEvent: SubmitEvent) => { const editComment = (submitEvent: SubmitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(urlPrefix + "/lots/doUpdateLotComment", cityssm.postJSON(
urlPrefix + "/lots/doUpdateLotComment",
editFormElement, editFormElement,
(responseJSON: { (responseJSON: {
success: boolean; success: boolean;
errorMessage?: string; errorMessage?: string;
lotComments?: recordTypes.LotComment[]; lotComments?: recordTypes.LotComment[];
}) => { }) => {
if (responseJSON.success) { if (responseJSON.success) {
lotComments = responseJSON.lotComments; lotComments = responseJSON.lotComments;
editCloseModalFunction(); editCloseModalFunction();
@ -98,25 +101,49 @@ declare const bulmaJS: BulmaJS;
contextualColorName: "danger" contextualColorName: "danger"
}); });
} }
}); }
);
}; };
cityssm.openHtmlModal("lot-editComment", { cityssm.openHtmlModal("lot-editComment", {
onshow: (modalElement) => { onshow: (modalElement) => {
los.populateAliases(modalElement); los.populateAliases(modalElement);
(modalElement.querySelector("#lotCommentEdit--lotId") as HTMLInputElement).value = lotId; (
(modalElement.querySelector("#lotCommentEdit--lotCommentId") as HTMLInputElement).value = lotCommentId.toString(); modalElement.querySelector(
"#lotCommentEdit--lotId"
) as HTMLInputElement
).value = lotId;
(
modalElement.querySelector(
"#lotCommentEdit--lotCommentId"
) as HTMLInputElement
).value = lotCommentId.toString();
(modalElement.querySelector("#lotCommentEdit--lotComment") as HTMLInputElement).value = lotComment.lotComment; (
(modalElement.querySelector("#lotCommentEdit--lotCommentDateString") as HTMLInputElement).value = lotComment.lotCommentDateString; modalElement.querySelector(
(modalElement.querySelector("#lotCommentEdit--lotCommentTimeString") as HTMLInputElement).value = lotComment.lotCommentTimeString; "#lotCommentEdit--lotComment"
) as HTMLInputElement
).value = lotComment.lotComment;
(
modalElement.querySelector(
"#lotCommentEdit--lotCommentDateString"
) as HTMLInputElement
).value = lotComment.lotCommentDateString;
(
modalElement.querySelector(
"#lotCommentEdit--lotCommentTimeString"
) as HTMLInputElement
).value = lotComment.lotCommentTimeString;
}, },
onshown: (modalElement, closeModalFunction) => { onshown: (modalElement, closeModalFunction) => {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
(modalElement.querySelector("#lotCommentEdit--lotComment") as HTMLTextAreaElement).focus(); (
modalElement.querySelector(
"#lotCommentEdit--lotComment"
) as HTMLTextAreaElement
).focus();
editFormElement = modalElement.querySelector("form"); editFormElement = modalElement.querySelector("form");
editFormElement.addEventListener("submit", editComment); editFormElement.addEventListener("submit", editComment);
@ -130,11 +157,16 @@ declare const bulmaJS: BulmaJS;
}; };
const deleteLotComment = (clickEvent: Event) => { const deleteLotComment = (clickEvent: Event) => {
const lotCommentId = Number.parseInt(
const lotCommentId = Number.parseInt((clickEvent.currentTarget as HTMLElement).closest("tr").dataset.lotCommentId, 10); (clickEvent.currentTarget as HTMLElement).closest("tr").dataset
.lotCommentId,
10
);
const doDelete = () => { const doDelete = () => {
cityssm.postJSON(urlPrefix + "/lots/doDeleteLotComment", { cityssm.postJSON(
urlPrefix + "/lots/doDeleteLotComment",
{
lotId, lotId,
lotCommentId lotCommentId
}, },
@ -153,7 +185,8 @@ declare const bulmaJS: BulmaJS;
contextualColorName: "danger" contextualColorName: "danger"
}); });
} }
}); }
);
}; };
bulmaJS.confirm({ bulmaJS.confirm({
@ -167,53 +200,66 @@ declare const bulmaJS: BulmaJS;
}); });
}; };
const renderLotComments = () => { const renderLotComments = () => {
const containerElement = document.querySelector(
const containerElement = document.querySelector("#container--lotComments") as HTMLElement; "#container--lotComments"
) as HTMLElement;
if (lotComments.length === 0) { if (lotComments.length === 0) {
containerElement.innerHTML = "<div class=\"message is-info\">" + containerElement.innerHTML =
"<p class=\"message-body\">There are no comments to display.</p>" + '<div class="message is-info">' +
'<p class="message-body">There are no comments to display.</p>' +
"</div>"; "</div>";
return; return;
} }
const tableElement = document.createElement("table"); const tableElement = document.createElement("table");
tableElement.className = "table is-fullwidth is-striped is-hoverable"; tableElement.className = "table is-fullwidth is-striped is-hoverable";
tableElement.innerHTML = "<thead><tr>" + tableElement.innerHTML =
"<thead><tr>" +
"<th>Commentor</th>" + "<th>Commentor</th>" +
"<th>Comment Date</th>" + "<th>Comment Date</th>" +
"<th>Comment</th>" + "<th>Comment</th>" +
"<th class=\"is-hidden-print\"><span class=\"is-sr-only\">Options</span></th>" + '<th class="is-hidden-print"><span class="is-sr-only">Options</span></th>' +
"</tr></thead>" + "</tr></thead>" +
"<tbody></tbody>"; "<tbody></tbody>";
for (const lotComment of lotComments) { for (const lotComment of lotComments) {
const tableRowElement = document.createElement("tr"); const tableRowElement = document.createElement("tr");
tableRowElement.dataset.lotCommentId = lotComment.lotCommentId.toString(); tableRowElement.dataset.lotCommentId =
lotComment.lotCommentId.toString();
tableRowElement.innerHTML = "<td>" + cityssm.escapeHTML(lotComment.recordCreate_userName) + "</td>" + tableRowElement.innerHTML =
"<td>" +
cityssm.escapeHTML(lotComment.recordCreate_userName) +
"</td>" +
"<td>" + "<td>" +
lotComment.lotCommentDateString + lotComment.lotCommentDateString +
(lotComment.lotCommentTime === 0 ? "" : " " + lotComment.lotCommentTimeString) + (lotComment.lotCommentTime === 0
? ""
: " " + lotComment.lotCommentTimeString) +
"</td>" + "</td>" +
"<td>" + cityssm.escapeHTML(lotComment.lotComment) + "</td>" + "<td>" +
("<td class=\"is-hidden-print\">" + cityssm.escapeHTML(lotComment.lotComment) +
"<div class=\"buttons are-small is-justify-content-end\">" + "</td>" +
("<button class=\"button is-primary button--edit\" type=\"button\">" + ('<td class="is-hidden-print">' +
"<span class=\"icon is-small\"><i class=\"fas fa-pencil-alt\" aria-hidden=\"true\"></i></span>" + '<div class="buttons are-small is-justify-content-end">' +
('<button class="button is-primary button--edit" type="button">' +
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
" <span>Edit</span>" + " <span>Edit</span>" +
"</button>") + "</button>") +
("<button class=\"button is-light is-danger button--delete\" data-tooltip=\"Delete Comment\" type=\"button\" aria-label=\"Delete\">" + ('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
"<i class=\"fas fa-trash\" aria-hidden=\"true\"></i>" + '<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>") + "</button>") +
"</div>" + "</div>" +
"</td>"); "</td>");
tableRowElement.querySelector(".button--edit").addEventListener("click", openEditLotComment); tableRowElement
tableRowElement.querySelector(".button--delete").addEventListener("click", deleteLotComment); .querySelector(".button--edit")
.addEventListener("click", openEditLotComment);
tableRowElement
.querySelector(".button--delete")
.addEventListener("click", deleteLotComment);
tableElement.querySelector("tbody").append(tableRowElement); tableElement.querySelector("tbody").append(tableRowElement);
} }
@ -223,44 +269,63 @@ declare const bulmaJS: BulmaJS;
}; };
const openAddCommentModal = () => { const openAddCommentModal = () => {
let addCommentCloseModalFunction: () => void; let addCommentCloseModalFunction: () => void;
const doAddComment = (formEvent: SubmitEvent) => { const doAddComment = (formEvent: SubmitEvent) => {
formEvent.preventDefault(); formEvent.preventDefault();
cityssm.postJSON(urlPrefix + "/lots/doAddLotComment", cityssm.postJSON(
urlPrefix + "/lots/doAddLotComment",
formEvent.currentTarget, formEvent.currentTarget,
(responseJSON: {success: boolean; lotComments?: recordTypes.LotComment[]}) => { (responseJSON: {
success: boolean;
lotComments?: recordTypes.LotComment[];
}) => {
if (responseJSON.success) { if (responseJSON.success) {
lotComments = responseJSON.lotComments; lotComments = responseJSON.lotComments;
renderLotComments(); renderLotComments();
addCommentCloseModalFunction(); addCommentCloseModalFunction();
} }
}); }
);
}; };
cityssm.openHtmlModal("lot-addComment", { cityssm.openHtmlModal("lot-addComment", {
onshow(modalElement) { onshow(modalElement) {
los.populateAliases(modalElement); los.populateAliases(modalElement);
(modalElement.querySelector("#lotCommentAdd--lotId") as HTMLInputElement).value = lotId; (
modalElement.querySelector("form").addEventListener("submit", doAddComment); modalElement.querySelector(
"#lotCommentAdd--lotId"
) as HTMLInputElement
).value = lotId;
modalElement
.querySelector("form")
.addEventListener("submit", doAddComment);
}, },
onshown(modalElement, closeModalFunction) { onshown(modalElement, closeModalFunction) {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
addCommentCloseModalFunction = closeModalFunction; addCommentCloseModalFunction = closeModalFunction;
(modalElement.querySelector("#lotCommentAdd--lotComment") as HTMLTextAreaElement).focus(); (
modalElement.querySelector(
"#lotCommentAdd--lotComment"
) as HTMLTextAreaElement
).focus();
}, },
onremoved() { onremoved() {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
(document.querySelector("#lotComments--add") as HTMLButtonElement).focus(); (
document.querySelector(
"#lotComments--add"
) as HTMLButtonElement
).focus();
} }
}); });
}; };
if (!isCreate) { if (!isCreate) {
document.querySelector("#lotComments--add").addEventListener("click", openAddCommentModal); document
.querySelector("#lotComments--add")
.addEventListener("click", openAddCommentModal);
renderLotComments(); renderLotComments();
} }
})(); })();

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -4,18 +4,25 @@ Object.defineProperty(exports, "__esModule", { value: true });
const urlPrefix = document.querySelector("main").dataset.urlPrefix; const urlPrefix = document.querySelector("main").dataset.urlPrefix;
const searchFilterFormElement = document.querySelector("#form--searchFilters"); const searchFilterFormElement = document.querySelector("#form--searchFilters");
const searchResultsContainerElement = document.querySelector("#container--searchResults"); const searchResultsContainerElement = document.querySelector("#container--searchResults");
const limit = Number.parseInt(document.querySelector("#searchFilter--limit").value, 10); const limit = Number.parseInt(document.querySelector("#searchFilter--limit")
.value, 10);
const offsetElement = document.querySelector("#searchFilter--offset"); const offsetElement = document.querySelector("#searchFilter--offset");
const getLotOccupancies = () => { const getLotOccupancies = () => {
const offset = Number.parseInt(offsetElement.value, 10); const offset = Number.parseInt(offsetElement.value, 10);
searchResultsContainerElement.innerHTML = "<div class=\"has-text-grey has-text-centered\">" + searchResultsContainerElement.innerHTML =
"<i class=\"fas fa-5x fa-circle-notch fa-spin\" aria-hidden=\"true\"></i><br />" + '<div class="has-text-grey has-text-centered">' +
"Loading " + exports.aliases.occupancies + "..." + '<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />' +
"Loading " +
exports.aliases.occupancies +
"..." +
"</div>"; "</div>";
cityssm.postJSON(urlPrefix + "/lotOccupancies/doSearchLotOccupancies", searchFilterFormElement, (responseJSON) => { cityssm.postJSON(urlPrefix + "/lotOccupancies/doSearchLotOccupancies", searchFilterFormElement, (responseJSON) => {
if (responseJSON.lotOccupancies.length === 0) { if (responseJSON.lotOccupancies.length === 0) {
searchResultsContainerElement.innerHTML = "<div class=\"message is-info\">" + searchResultsContainerElement.innerHTML =
"<p class=\"message-body\">There are no " + exports.aliases.occupancy.toLowerCase() + " records that meet the search criteria.</p>" + '<div class="message is-info">' +
'<p class="message-body">There are no ' +
exports.aliases.occupancy.toLowerCase() +
" records that meet the search criteria.</p>" +
"</div>"; "</div>";
return; return;
} }
@ -23,83 +30,129 @@ Object.defineProperty(exports, "__esModule", { value: true });
const nowDateString = cityssm.dateToString(new Date()); const nowDateString = cityssm.dateToString(new Date());
for (const lotOccupancy of responseJSON.lotOccupancies) { for (const lotOccupancy of responseJSON.lotOccupancies) {
let occupancyTimeHTML = ""; let occupancyTimeHTML = "";
if (lotOccupancy.occupancyStartDateString <= nowDateString && (lotOccupancy.occupancyEndDateString === "" || lotOccupancy.occupancyEndDateString >= nowDateString)) { if (lotOccupancy.occupancyStartDateString <=
occupancyTimeHTML = "<i class=\"fas fa-play\" title=\"Current " + exports.aliases.occupancy + "\"></i>"; nowDateString &&
(lotOccupancy.occupancyEndDateString === "" ||
lotOccupancy.occupancyEndDateString >=
nowDateString)) {
occupancyTimeHTML =
'<i class="fas fa-play" title="Current ' +
exports.aliases.occupancy +
'"></i>';
} }
else if (lotOccupancy.occupancyStartDateString > nowDateString) { else if (lotOccupancy.occupancyStartDateString > nowDateString) {
occupancyTimeHTML = "<i class=\"fas fa-fast-forward\" title=\"Future " + exports.aliases.occupancy + "\"></i>"; occupancyTimeHTML =
'<i class="fas fa-fast-forward" title="Future ' +
exports.aliases.occupancy +
'"></i>';
} }
else { else {
occupancyTimeHTML = "<i class=\"fas fa-stop\" title=\"Previous " + exports.aliases.occupancy + "\"></i>"; occupancyTimeHTML =
'<i class="fas fa-stop" title="Previous ' +
exports.aliases.occupancy +
'"></i>';
} }
let occupantsHTML = ""; let occupantsHTML = "";
for (const occupant of lotOccupancy.lotOccupancyOccupants) { for (const occupant of lotOccupancy.lotOccupancyOccupants) {
occupantsHTML += cityssm.escapeHTML(occupant.occupantName) + "<br />"; occupantsHTML +=
cityssm.escapeHTML(occupant.occupantName) +
"<br />";
} }
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" + resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
"<td>" + occupancyTimeHTML + "</td>" + "<td>" +
occupancyTimeHTML +
"</td>" +
("<td>" + ("<td>" +
"<a class=\"has-text-weight-bold\" href=\"" + urlPrefix + "/lotOccupancies/" + lotOccupancy.lotOccupancyId + "\">" + '<a class="has-text-weight-bold" href="' +
urlPrefix +
"/lotOccupancies/" +
lotOccupancy.lotOccupancyId +
'">' +
cityssm.escapeHTML(lotOccupancy.occupancyType) + cityssm.escapeHTML(lotOccupancy.occupancyType) +
"</a>" + "</a>" +
"</td>") + "</td>") +
("<td>" + ("<td>" +
(lotOccupancy.lotName ? cityssm.escapeHTML(lotOccupancy.lotName) : "<span class=\"has-text-grey\">(No " + cityssm.escapeHTML(exports.aliases.lot) + ")</span>") + "<br />" + (lotOccupancy.lotName
"<span class=\"is-size-7\">" + cityssm.escapeHTML(lotOccupancy.mapName || "") + "</span>" + ? cityssm.escapeHTML(lotOccupancy.lotName)
: '<span class="has-text-grey">(No ' +
cityssm.escapeHTML(exports.aliases.lot) +
")</span>") +
"<br />" +
'<span class="is-size-7">' +
cityssm.escapeHTML(lotOccupancy.mapName || "") +
"</span>" +
"</td>") + "</td>") +
("<td>" + ("<td>" +
lotOccupancy.occupancyStartDateString + lotOccupancy.occupancyStartDateString +
"</td>") + "</td>") +
("<td>" + ("<td>" +
(lotOccupancy.occupancyEndDate ? (lotOccupancy.occupancyEndDate
lotOccupancy.occupancyEndDateString : ? lotOccupancy.occupancyEndDateString
"<span class=\"has-text-grey\">(No End Date)</span>") + : '<span class="has-text-grey">(No End Date)</span>') +
"</td>") + "</td>") +
"<td>" + occupantsHTML + "</td>" + "<td>" +
occupantsHTML +
"</td>" +
"</tr>"); "</tr>");
} }
searchResultsContainerElement.innerHTML = "<table class=\"table is-fullwidth is-striped is-hoverable\">" + searchResultsContainerElement.innerHTML =
'<table class="table is-fullwidth is-striped is-hoverable">' +
"<thead><tr>" + "<thead><tr>" +
"<th></th>" + "<th></th>" +
"<th>" + exports.aliases.occupancy + " Type</th>" + "<th>" +
"<th>" + exports.aliases.lot + "</th>" + exports.aliases.occupancy +
" Type</th>" +
"<th>" +
exports.aliases.lot +
"</th>" +
"<th>Start Date</th>" + "<th>Start Date</th>" +
"<th>End Date</th>" + "<th>End Date</th>" +
"<th>" + exports.aliases.occupants + "</th>" + "<th>" +
exports.aliases.occupants +
"</th>" +
"</tr></thead>" + "</tr></thead>" +
"<table>" + "<table>" +
"<div class=\"level\">" + '<div class="level">' +
("<div class=\"level-left\">" + ('<div class="level-left">' +
"<div class=\"level-item has-text-weight-bold\">" + '<div class="level-item has-text-weight-bold">' +
"Displaying " + (offset + 1).toString() + "Displaying " +
" to " + Math.min(responseJSON.count, limit + offset) + (offset + 1).toString() +
" of " + responseJSON.count + " to " +
Math.min(responseJSON.count, limit + offset) +
" of " +
responseJSON.count +
"</div>" + "</div>" +
"</div>") + "</div>") +
("<div class=\"level-right\">" + ('<div class="level-right">' +
(offset > 0 ? (offset > 0
"<div class=\"level-item\">" + ? '<div class="level-item">' +
"<button class=\"button is-rounded is-link is-outlined\" data-page=\"previous\" type=\"button\" title=\"Previous\">" + '<button class="button is-rounded is-link is-outlined" data-page="previous" type="button" title="Previous">' +
"<i class=\"fas fa-arrow-left\" aria-hidden=\"true\"></i>" + '<i class="fas fa-arrow-left" aria-hidden="true"></i>' +
"</button>" + "</button>" +
"</div>" : "</div>"
"") + : "") +
(limit + offset < responseJSON.count ? (limit + offset < responseJSON.count
"<div class=\"level-item\">" + ? '<div class="level-item">' +
"<button class=\"button is-rounded is-link\" data-page=\"next\" type=\"button\" title=\"Next\">" + '<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
"<span>Next</span>" + "<span>Next</span>" +
"<span class=\"icon\"><i class=\"fas fa-arrow-right\" aria-hidden=\"true\"></i></span>" + '<span class="icon"><i class="fas fa-arrow-right" aria-hidden="true"></i></span>' +
"</button>" + "</button>" +
"</div>" : "</div>"
"") + : "") +
"</div>") + "</div>") +
"</div>"; "</div>";
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement); searchResultsContainerElement
.querySelector("table")
.append(resultsTbodyElement);
if (offset > 0) { if (offset > 0) {
searchResultsContainerElement.querySelector("button[data-page='previous']").addEventListener("click", previousAndGetLotOccupancies); searchResultsContainerElement
.querySelector("button[data-page='previous']")
.addEventListener("click", previousAndGetLotOccupancies);
} }
if (limit + offset < responseJSON.count) { if (limit + offset < responseJSON.count) {
searchResultsContainerElement.querySelector("button[data-page='next']").addEventListener("click", nextAndGetLotOccupancies); searchResultsContainerElement
.querySelector("button[data-page='next']")
.addEventListener("click", nextAndGetLotOccupancies);
} }
}); });
}; };

View File

@ -2,43 +2,53 @@
import type * as recordTypes from "../types/recordTypes"; import type * as recordTypes from "../types/recordTypes";
import type { import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
cityssmGlobal
} from "@cityssm/bulma-webapp-js/src/types";
declare const cityssm: cityssmGlobal; declare const cityssm: cityssmGlobal;
(() => { (() => {
const urlPrefix = document.querySelector("main").dataset.urlPrefix; const urlPrefix = document.querySelector("main").dataset.urlPrefix;
const searchFilterFormElement = document.querySelector("#form--searchFilters") as HTMLFormElement; const searchFilterFormElement = document.querySelector(
const searchResultsContainerElement = document.querySelector("#container--searchResults") as HTMLElement; "#form--searchFilters"
) as HTMLFormElement;
const limit = Number.parseInt((document.querySelector("#searchFilter--limit") as HTMLInputElement).value, 10); const searchResultsContainerElement = document.querySelector(
const offsetElement = document.querySelector("#searchFilter--offset") as HTMLInputElement; "#container--searchResults"
) as HTMLElement;
const limit = Number.parseInt(
(document.querySelector("#searchFilter--limit") as HTMLInputElement)
.value,
10
);
const offsetElement = document.querySelector(
"#searchFilter--offset"
) as HTMLInputElement;
const getLotOccupancies = () => { const getLotOccupancies = () => {
const offset = Number.parseInt(offsetElement.value, 10); const offset = Number.parseInt(offsetElement.value, 10);
searchResultsContainerElement.innerHTML = "<div class=\"has-text-grey has-text-centered\">" + searchResultsContainerElement.innerHTML =
"<i class=\"fas fa-5x fa-circle-notch fa-spin\" aria-hidden=\"true\"></i><br />" + '<div class="has-text-grey has-text-centered">' +
"Loading " + exports.aliases.occupancies + "..." + '<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />' +
"Loading " +
exports.aliases.occupancies +
"..." +
"</div>"; "</div>";
cityssm.postJSON(urlPrefix + "/lotOccupancies/doSearchLotOccupancies", searchFilterFormElement, cityssm.postJSON(
urlPrefix + "/lotOccupancies/doSearchLotOccupancies",
searchFilterFormElement,
(responseJSON: { (responseJSON: {
count: number; count: number;
lotOccupancies: recordTypes.LotOccupancy[]; lotOccupancies: recordTypes.LotOccupancy[];
}) => { }) => {
if (responseJSON.lotOccupancies.length === 0) { if (responseJSON.lotOccupancies.length === 0) {
searchResultsContainerElement.innerHTML =
searchResultsContainerElement.innerHTML = "<div class=\"message is-info\">" + '<div class="message is-info">' +
"<p class=\"message-body\">There are no " + exports.aliases.occupancy.toLowerCase() + " records that meet the search criteria.</p>" + '<p class="message-body">There are no ' +
exports.aliases.occupancy.toLowerCase() +
" records that meet the search criteria.</p>" +
"</div>"; "</div>";
return; return;
@ -49,116 +59,182 @@ declare const cityssm: cityssmGlobal;
const nowDateString = cityssm.dateToString(new Date()); const nowDateString = cityssm.dateToString(new Date());
for (const lotOccupancy of responseJSON.lotOccupancies) { for (const lotOccupancy of responseJSON.lotOccupancies) {
let occupancyTimeHTML = ""; let occupancyTimeHTML = "";
if (lotOccupancy.occupancyStartDateString <= nowDateString && (lotOccupancy.occupancyEndDateString === "" || lotOccupancy.occupancyEndDateString >= nowDateString)) { if (
occupancyTimeHTML = "<i class=\"fas fa-play\" title=\"Current " + exports.aliases.occupancy + "\"></i>"; lotOccupancy.occupancyStartDateString <=
nowDateString &&
} else if (lotOccupancy.occupancyStartDateString > nowDateString) { (lotOccupancy.occupancyEndDateString === "" ||
occupancyTimeHTML = "<i class=\"fas fa-fast-forward\" title=\"Future " + exports.aliases.occupancy + "\"></i>"; lotOccupancy.occupancyEndDateString >=
nowDateString)
) {
occupancyTimeHTML =
'<i class="fas fa-play" title="Current ' +
exports.aliases.occupancy +
'"></i>';
} else if (
lotOccupancy.occupancyStartDateString > nowDateString
) {
occupancyTimeHTML =
'<i class="fas fa-fast-forward" title="Future ' +
exports.aliases.occupancy +
'"></i>';
} else { } else {
occupancyTimeHTML = "<i class=\"fas fa-stop\" title=\"Previous " + exports.aliases.occupancy + "\"></i>"; occupancyTimeHTML =
'<i class="fas fa-stop" title="Previous ' +
exports.aliases.occupancy +
'"></i>';
} }
let occupantsHTML = ""; let occupantsHTML = "";
for (const occupant of lotOccupancy.lotOccupancyOccupants) { for (const occupant of lotOccupancy.lotOccupancyOccupants) {
occupantsHTML += cityssm.escapeHTML(occupant.occupantName) + "<br />"; occupantsHTML +=
cityssm.escapeHTML(occupant.occupantName) +
"<br />";
} }
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" + resultsTbodyElement.insertAdjacentHTML(
"<td>" + occupancyTimeHTML + "</td>" + "beforeend",
"<tr>" +
"<td>" +
occupancyTimeHTML +
"</td>" +
("<td>" + ("<td>" +
"<a class=\"has-text-weight-bold\" href=\"" + urlPrefix + "/lotOccupancies/" + lotOccupancy.lotOccupancyId + "\">" + '<a class="has-text-weight-bold" href="' +
cityssm.escapeHTML(lotOccupancy.occupancyType as string) + urlPrefix +
"/lotOccupancies/" +
lotOccupancy.lotOccupancyId +
'">' +
cityssm.escapeHTML(
lotOccupancy.occupancyType as string
) +
"</a>" + "</a>" +
"</td>") + "</td>") +
("<td>" + ("<td>" +
(lotOccupancy.lotName ? cityssm.escapeHTML(lotOccupancy.lotName) : "<span class=\"has-text-grey\">(No " + cityssm.escapeHTML(exports.aliases.lot) + ")</span>") + "<br />" + (lotOccupancy.lotName
"<span class=\"is-size-7\">" + cityssm.escapeHTML(lotOccupancy.mapName || "") + "</span>" + ? cityssm.escapeHTML(lotOccupancy.lotName)
: '<span class="has-text-grey">(No ' +
cityssm.escapeHTML(exports.aliases.lot) +
")</span>") +
"<br />" +
'<span class="is-size-7">' +
cityssm.escapeHTML(lotOccupancy.mapName || "") +
"</span>" +
"</td>") + "</td>") +
("<td>" + ("<td>" +
lotOccupancy.occupancyStartDateString + lotOccupancy.occupancyStartDateString +
"</td>") + "</td>") +
("<td>" + ("<td>" +
(lotOccupancy.occupancyEndDate ? (lotOccupancy.occupancyEndDate
lotOccupancy.occupancyEndDateString : ? lotOccupancy.occupancyEndDateString
"<span class=\"has-text-grey\">(No End Date)</span>") + : '<span class="has-text-grey">(No End Date)</span>') +
"</td>") + "</td>") +
"<td>" + occupantsHTML + "</td>" + "<td>" +
"</tr>"); occupantsHTML +
"</td>" +
"</tr>"
);
} }
searchResultsContainerElement.innerHTML = "<table class=\"table is-fullwidth is-striped is-hoverable\">" + searchResultsContainerElement.innerHTML =
'<table class="table is-fullwidth is-striped is-hoverable">' +
"<thead><tr>" + "<thead><tr>" +
"<th></th>" + "<th></th>" +
"<th>" + exports.aliases.occupancy + " Type</th>" + "<th>" +
"<th>" + exports.aliases.lot + "</th>" + exports.aliases.occupancy +
" Type</th>" +
"<th>" +
exports.aliases.lot +
"</th>" +
"<th>Start Date</th>" + "<th>Start Date</th>" +
"<th>End Date</th>" + "<th>End Date</th>" +
"<th>" + exports.aliases.occupants + "</th>" + "<th>" +
exports.aliases.occupants +
"</th>" +
"</tr></thead>" + "</tr></thead>" +
"<table>" + "<table>" +
"<div class=\"level\">" + '<div class="level">' +
("<div class=\"level-left\">" + ('<div class="level-left">' +
"<div class=\"level-item has-text-weight-bold\">" + '<div class="level-item has-text-weight-bold">' +
"Displaying " + (offset + 1).toString() + "Displaying " +
" to " + Math.min(responseJSON.count, limit + offset) + (offset + 1).toString() +
" of " + responseJSON.count + " to " +
Math.min(responseJSON.count, limit + offset) +
" of " +
responseJSON.count +
"</div>" + "</div>" +
"</div>") + "</div>") +
("<div class=\"level-right\">" + ('<div class="level-right">' +
(offset > 0 ? (offset > 0
"<div class=\"level-item\">" + ? '<div class="level-item">' +
"<button class=\"button is-rounded is-link is-outlined\" data-page=\"previous\" type=\"button\" title=\"Previous\">" + '<button class="button is-rounded is-link is-outlined" data-page="previous" type="button" title="Previous">' +
"<i class=\"fas fa-arrow-left\" aria-hidden=\"true\"></i>" + '<i class="fas fa-arrow-left" aria-hidden="true"></i>' +
"</button>" + "</button>" +
"</div>" : "</div>"
"") + : "") +
(limit + offset < responseJSON.count ? (limit + offset < responseJSON.count
"<div class=\"level-item\">" + ? '<div class="level-item">' +
"<button class=\"button is-rounded is-link\" data-page=\"next\" type=\"button\" title=\"Next\">" + '<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
"<span>Next</span>" + "<span>Next</span>" +
"<span class=\"icon\"><i class=\"fas fa-arrow-right\" aria-hidden=\"true\"></i></span>" + '<span class="icon"><i class="fas fa-arrow-right" aria-hidden="true"></i></span>' +
"</button>" + "</button>" +
"</div>" : "</div>"
"") + : "") +
"</div>") + "</div>") +
"</div>"; "</div>";
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement); searchResultsContainerElement
.querySelector("table")
.append(resultsTbodyElement);
if (offset > 0) { if (offset > 0) {
searchResultsContainerElement.querySelector("button[data-page='previous']").addEventListener("click", previousAndGetLotOccupancies); searchResultsContainerElement
.querySelector("button[data-page='previous']")
.addEventListener(
"click",
previousAndGetLotOccupancies
);
} }
if (limit + offset < responseJSON.count) { if (limit + offset < responseJSON.count) {
searchResultsContainerElement.querySelector("button[data-page='next']").addEventListener("click", nextAndGetLotOccupancies); searchResultsContainerElement
.querySelector("button[data-page='next']")
.addEventListener("click", nextAndGetLotOccupancies);
} }
}); }
);
}; };
const resetOffsetAndGetLotOccupancies = () => { const resetOffsetAndGetLotOccupancies = () => {
offsetElement.value = "0"; offsetElement.value = "0";
getLotOccupancies(); getLotOccupancies();
} };
const previousAndGetLotOccupancies = () => { const previousAndGetLotOccupancies = () => {
offsetElement.value = Math.max(Number.parseInt(offsetElement.value, 10) - limit, 0).toString(); offsetElement.value = Math.max(
Number.parseInt(offsetElement.value, 10) - limit,
0
).toString();
getLotOccupancies(); getLotOccupancies();
}; };
const nextAndGetLotOccupancies = () => { const nextAndGetLotOccupancies = () => {
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString(); offsetElement.value = (
Number.parseInt(offsetElement.value, 10) + limit
).toString();
getLotOccupancies(); getLotOccupancies();
}; };
const filterElements = searchFilterFormElement.querySelectorAll("input, select") as NodeListOf < HTMLInputElement | HTMLSelectElement > ; const filterElements = searchFilterFormElement.querySelectorAll(
"input, select"
) as NodeListOf<HTMLInputElement | HTMLSelectElement>;
for (const filterElement of filterElements) { for (const filterElement of filterElements) {
filterElement.addEventListener("change", resetOffsetAndGetLotOccupancies); filterElement.addEventListener(
"change",
resetOffsetAndGetLotOccupancies
);
} }
searchFilterFormElement.addEventListener("submit", (formEvent) => { searchFilterFormElement.addEventListener("submit", (formEvent) => {

View File

@ -4,18 +4,25 @@ Object.defineProperty(exports, "__esModule", { value: true });
const urlPrefix = document.querySelector("main").dataset.urlPrefix; const urlPrefix = document.querySelector("main").dataset.urlPrefix;
const searchFilterFormElement = document.querySelector("#form--searchFilters"); const searchFilterFormElement = document.querySelector("#form--searchFilters");
const searchResultsContainerElement = document.querySelector("#container--searchResults"); const searchResultsContainerElement = document.querySelector("#container--searchResults");
const limit = Number.parseInt(document.querySelector("#searchFilter--limit").value, 10); const limit = Number.parseInt(document.querySelector("#searchFilter--limit")
.value, 10);
const offsetElement = document.querySelector("#searchFilter--offset"); const offsetElement = document.querySelector("#searchFilter--offset");
const getLots = () => { const getLots = () => {
const offset = Number.parseInt(offsetElement.value, 10); const offset = Number.parseInt(offsetElement.value, 10);
searchResultsContainerElement.innerHTML = "<div class=\"has-text-grey has-text-centered\">" + searchResultsContainerElement.innerHTML =
"<i class=\"fas fa-5x fa-circle-notch fa-spin\" aria-hidden=\"true\"></i><br />" + '<div class="has-text-grey has-text-centered">' +
"Loading " + exports.aliases.lots + "..." + '<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />' +
"Loading " +
exports.aliases.lots +
"..." +
"</div>"; "</div>";
cityssm.postJSON(urlPrefix + "/lots/doSearchLots", searchFilterFormElement, (responseJSON) => { cityssm.postJSON(urlPrefix + "/lots/doSearchLots", searchFilterFormElement, (responseJSON) => {
if (responseJSON.lots.length === 0) { if (responseJSON.lots.length === 0) {
searchResultsContainerElement.innerHTML = "<div class=\"message is-info\">" + searchResultsContainerElement.innerHTML =
"<p class=\"message-body\">There are no " + exports.aliases.lots.toLowerCase() + " that meet the search criteria.</p>" + '<div class="message is-info">' +
'<p class="message-body">There are no ' +
exports.aliases.lots.toLowerCase() +
" that meet the search criteria.</p>" +
"</div>"; "</div>";
return; return;
} }
@ -23,62 +30,91 @@ Object.defineProperty(exports, "__esModule", { value: true });
for (const lot of responseJSON.lots) { for (const lot of responseJSON.lots) {
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" + resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
("<td>" + ("<td>" +
"<a class=\"has-text-weight-bold\" href=\"" + urlPrefix + "/lots/" + lot.lotId + "\">" + '<a class="has-text-weight-bold" href="' +
urlPrefix +
"/lots/" +
lot.lotId +
'">' +
lot.lotName + lot.lotName +
"</a>" + "</a>" +
"</td>") + "</td>") +
("<td>" + ("<td>" +
"<a href=\"" + urlPrefix + "/maps/" + lot.mapId + "\">" + '<a href="' +
urlPrefix +
"/maps/" +
lot.mapId +
'">' +
lot.mapName + lot.mapName +
"</a>" + "</a>" +
"</td>") + "</td>") +
"<td>" + lot.lotType + "</td>" + "<td>" +
lot.lotType +
"</td>" +
("<td>" + ("<td>" +
lot.lotStatus + "<br />" + lot.lotStatus +
(lot.lotOccupancyCount > 0 ? "<span class=\"is-size-7\">Currently Occupied</span>" : "") + "<br />" +
(lot.lotOccupancyCount > 0
? '<span class="is-size-7">Currently Occupied</span>'
: "") +
"</td>") + "</td>") +
"</tr>"); "</tr>");
} }
searchResultsContainerElement.innerHTML = "<table class=\"table is-fullwidth is-striped is-hoverable\">" + searchResultsContainerElement.innerHTML =
'<table class="table is-fullwidth is-striped is-hoverable">' +
"<thead><tr>" + "<thead><tr>" +
"<th>" + exports.aliases.lot + "</th>" + "<th>" +
"<th>" + exports.aliases.map + "</th>" + exports.aliases.lot +
"<th>" + exports.aliases.lot + " Type</th>" + "</th>" +
"<th>" +
exports.aliases.map +
"</th>" +
"<th>" +
exports.aliases.lot +
" Type</th>" +
"<th>Status</th>" + "<th>Status</th>" +
"</tr></thead>" + "</tr></thead>" +
"<table>" + "<table>" +
"<div class=\"level\">" + '<div class="level">' +
("<div class=\"level-left\">" + ('<div class="level-left">' +
"<div class=\"level-item has-text-weight-bold\">" + '<div class="level-item has-text-weight-bold">' +
"Displaying " + (offset + 1).toString() + "Displaying " +
" to " + Math.min(responseJSON.count, limit + offset) + (offset + 1).toString() +
" of " + responseJSON.count + " to " +
Math.min(responseJSON.count, limit + offset) +
" of " +
responseJSON.count +
"</div>" + "</div>" +
"</div>") + "</div>") +
("<div class=\"level-right\">" + ('<div class="level-right">' +
(offset > 0 ? (offset > 0
"<div class=\"level-item\">" + ? '<div class="level-item">' +
"<button class=\"button is-rounded is-link is-outlined\" data-page=\"previous\" type=\"button\" title=\"Previous\">" + '<button class="button is-rounded is-link is-outlined" data-page="previous" type="button" title="Previous">' +
"<i class=\"fas fa-arrow-left\" aria-hidden=\"true\"></i>" + '<i class="fas fa-arrow-left" aria-hidden="true"></i>' +
"</button>" + "</button>" +
"</div>" : "</div>"
"") + : "") +
(limit + offset < responseJSON.count (limit + offset < responseJSON.count
? "<div class=\"level-item\">" + ? '<div class="level-item">' +
"<button class=\"button is-rounded is-link\" data-page=\"next\" type=\"button\" title=\"Next\">" + '<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
"<span>Next</span>" + "<span>Next</span>" +
"<span class=\"icon\"><i class=\"fas fa-arrow-right\" aria-hidden=\"true\"></i></span>" + '<span class="icon"><i class="fas fa-arrow-right" aria-hidden="true"></i></span>' +
"</button>" + "</button>" +
"</div>" "</div>"
: "") + : "") +
"</div>") + "</div>") +
"</div>"; "</div>";
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement); searchResultsContainerElement
.querySelector("table")
.append(resultsTbodyElement);
if (offset > 0) { if (offset > 0) {
searchResultsContainerElement.querySelector("button[data-page='previous']").addEventListener("click", previousAndGetLots); searchResultsContainerElement
.querySelector("button[data-page='previous']")
.addEventListener("click", previousAndGetLots);
} }
if (limit + offset < responseJSON.count) { if (limit + offset < responseJSON.count) {
searchResultsContainerElement.querySelector("button[data-page='next']").addEventListener("click", nextAndGetLots); searchResultsContainerElement
.querySelector("button[data-page='next']")
.addEventListener("click", nextAndGetLots);
} }
}); });
}; };

View File

@ -2,43 +2,50 @@
import type * as recordTypes from "../types/recordTypes"; import type * as recordTypes from "../types/recordTypes";
import type { import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
cityssmGlobal
} from "@cityssm/bulma-webapp-js/src/types";
declare const cityssm: cityssmGlobal; declare const cityssm: cityssmGlobal;
(() => { (() => {
const urlPrefix = document.querySelector("main").dataset.urlPrefix; const urlPrefix = document.querySelector("main").dataset.urlPrefix;
const searchFilterFormElement = document.querySelector("#form--searchFilters") as HTMLFormElement; const searchFilterFormElement = document.querySelector(
const searchResultsContainerElement = document.querySelector("#container--searchResults") as HTMLElement; "#form--searchFilters"
) as HTMLFormElement;
const limit = Number.parseInt((document.querySelector("#searchFilter--limit") as HTMLInputElement).value, 10); const searchResultsContainerElement = document.querySelector(
const offsetElement = document.querySelector("#searchFilter--offset") as HTMLInputElement; "#container--searchResults"
) as HTMLElement;
const limit = Number.parseInt(
(document.querySelector("#searchFilter--limit") as HTMLInputElement)
.value,
10
);
const offsetElement = document.querySelector(
"#searchFilter--offset"
) as HTMLInputElement;
const getLots = () => { const getLots = () => {
const offset = Number.parseInt(offsetElement.value, 10); const offset = Number.parseInt(offsetElement.value, 10);
searchResultsContainerElement.innerHTML = "<div class=\"has-text-grey has-text-centered\">" + searchResultsContainerElement.innerHTML =
"<i class=\"fas fa-5x fa-circle-notch fa-spin\" aria-hidden=\"true\"></i><br />" + '<div class="has-text-grey has-text-centered">' +
"Loading " + exports.aliases.lots + "..." + '<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />' +
"Loading " +
exports.aliases.lots +
"..." +
"</div>"; "</div>";
cityssm.postJSON(urlPrefix + "/lots/doSearchLots", searchFilterFormElement, cityssm.postJSON(
(responseJSON: { urlPrefix + "/lots/doSearchLots",
count: number; searchFilterFormElement,
lots: recordTypes.Lot[]; (responseJSON: { count: number; lots: recordTypes.Lot[] }) => {
}) => {
if (responseJSON.lots.length === 0) { if (responseJSON.lots.length === 0) {
searchResultsContainerElement.innerHTML =
searchResultsContainerElement.innerHTML = "<div class=\"message is-info\">" + '<div class="message is-info">' +
"<p class=\"message-body\">There are no " + exports.aliases.lots.toLowerCase() + " that meet the search criteria.</p>" + '<p class="message-body">There are no ' +
exports.aliases.lots.toLowerCase() +
" that meet the search criteria.</p>" +
"</div>"; "</div>";
return; return;
@ -47,88 +54,128 @@ declare const cityssm: cityssmGlobal;
const resultsTbodyElement = document.createElement("tbody"); const resultsTbodyElement = document.createElement("tbody");
for (const lot of responseJSON.lots) { for (const lot of responseJSON.lots) {
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" + resultsTbodyElement.insertAdjacentHTML(
"beforeend",
"<tr>" +
("<td>" + ("<td>" +
"<a class=\"has-text-weight-bold\" href=\"" + urlPrefix + "/lots/" + lot.lotId + "\">" + '<a class="has-text-weight-bold" href="' +
urlPrefix +
"/lots/" +
lot.lotId +
'">' +
lot.lotName + lot.lotName +
"</a>" + "</a>" +
"</td>") + "</td>") +
("<td>" + ("<td>" +
"<a href=\"" + urlPrefix + "/maps/" + lot.mapId + "\">" + '<a href="' +
urlPrefix +
"/maps/" +
lot.mapId +
'">' +
lot.mapName + lot.mapName +
"</a>" + "</a>" +
"</td>") + "</td>") +
"<td>" + lot.lotType + "</td>" + "<td>" +
lot.lotType +
"</td>" +
("<td>" + ("<td>" +
lot.lotStatus + "<br />" + lot.lotStatus +
(lot.lotOccupancyCount > 0 ? "<span class=\"is-size-7\">Currently Occupied</span>" : "") + "<br />" +
(lot.lotOccupancyCount > 0
? '<span class="is-size-7">Currently Occupied</span>'
: "") +
"</td>") + "</td>") +
"</tr>"); "</tr>"
);
} }
searchResultsContainerElement.innerHTML = "<table class=\"table is-fullwidth is-striped is-hoverable\">" + searchResultsContainerElement.innerHTML =
'<table class="table is-fullwidth is-striped is-hoverable">' +
"<thead><tr>" + "<thead><tr>" +
"<th>" + exports.aliases.lot + "</th>" + "<th>" +
"<th>" + exports.aliases.map + "</th>" + exports.aliases.lot +
"<th>" + exports.aliases.lot + " Type</th>" + "</th>" +
"<th>" +
exports.aliases.map +
"</th>" +
"<th>" +
exports.aliases.lot +
" Type</th>" +
"<th>Status</th>" + "<th>Status</th>" +
"</tr></thead>" + "</tr></thead>" +
"<table>" + "<table>" +
"<div class=\"level\">" + '<div class="level">' +
("<div class=\"level-left\">" + ('<div class="level-left">' +
"<div class=\"level-item has-text-weight-bold\">" + '<div class="level-item has-text-weight-bold">' +
"Displaying " + (offset + 1).toString() + "Displaying " +
" to " + Math.min(responseJSON.count, limit + offset) + (offset + 1).toString() +
" of " + responseJSON.count + " to " +
Math.min(responseJSON.count, limit + offset) +
" of " +
responseJSON.count +
"</div>" + "</div>" +
"</div>") + "</div>") +
("<div class=\"level-right\">" + ('<div class="level-right">' +
(offset > 0 ? (offset > 0
"<div class=\"level-item\">" + ? '<div class="level-item">' +
"<button class=\"button is-rounded is-link is-outlined\" data-page=\"previous\" type=\"button\" title=\"Previous\">" + '<button class="button is-rounded is-link is-outlined" data-page="previous" type="button" title="Previous">' +
"<i class=\"fas fa-arrow-left\" aria-hidden=\"true\"></i>" + '<i class="fas fa-arrow-left" aria-hidden="true"></i>' +
"</button>" + "</button>" +
"</div>" : "</div>"
"") + : "") +
(limit + offset < responseJSON.count (limit + offset < responseJSON.count
? "<div class=\"level-item\">" + ? '<div class="level-item">' +
"<button class=\"button is-rounded is-link\" data-page=\"next\" type=\"button\" title=\"Next\">" + '<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
"<span>Next</span>" + "<span>Next</span>" +
"<span class=\"icon\"><i class=\"fas fa-arrow-right\" aria-hidden=\"true\"></i></span>" + '<span class="icon"><i class="fas fa-arrow-right" aria-hidden="true"></i></span>' +
"</button>" + "</button>" +
"</div>" "</div>"
: "") + : "") +
"</div>") + "</div>") +
"</div>"; "</div>";
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement); searchResultsContainerElement
.querySelector("table")
.append(resultsTbodyElement);
if (offset > 0) { if (offset > 0) {
searchResultsContainerElement.querySelector("button[data-page='previous']").addEventListener("click", previousAndGetLots); searchResultsContainerElement
.querySelector("button[data-page='previous']")
.addEventListener("click", previousAndGetLots);
} }
if (limit + offset < responseJSON.count) { if (limit + offset < responseJSON.count) {
searchResultsContainerElement.querySelector("button[data-page='next']").addEventListener("click", nextAndGetLots); searchResultsContainerElement
.querySelector("button[data-page='next']")
.addEventListener("click", nextAndGetLots);
} }
}); }
);
}; };
const resetOffsetAndGetLots = () => { const resetOffsetAndGetLots = () => {
offsetElement.value = "0"; offsetElement.value = "0";
getLots(); getLots();
} };
const previousAndGetLots = () => { const previousAndGetLots = () => {
offsetElement.value = Math.max(Number.parseInt(offsetElement.value, 10) - limit, 0).toString(); offsetElement.value = Math.max(
Number.parseInt(offsetElement.value, 10) - limit,
0
).toString();
getLots(); getLots();
}; };
const nextAndGetLots = () => { const nextAndGetLots = () => {
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString(); offsetElement.value = (
Number.parseInt(offsetElement.value, 10) + limit
).toString();
getLots(); getLots();
}; };
const filterElements = searchFilterFormElement.querySelectorAll("input, select") as NodeListOf < HTMLInputElement | HTMLSelectElement > ; const filterElements = searchFilterFormElement.querySelectorAll(
"input, select"
) as NodeListOf<HTMLInputElement | HTMLSelectElement>;
for (const filterElement of filterElements) { for (const filterElement of filterElements) {
filterElement.addEventListener("change", resetOffsetAndGetLots); filterElement.addEventListener("change", resetOffsetAndGetLots);

View File

@ -3,9 +3,14 @@
import * as globalTypes from "../types/globalTypes"; import * as globalTypes from "../types/globalTypes";
(() => { (() => {
const mapContainerElement = document.querySelector(
const mapContainerElement = document.querySelector("#lot--map") as HTMLElement; "#lot--map"
) as HTMLElement;
if (mapContainerElement) { if (mapContainerElement) {
(exports.los as globalTypes.LOS).highlightMap(mapContainerElement, mapContainerElement.dataset.mapKey, "success"); (exports.los as globalTypes.LOS).highlightMap(
mapContainerElement,
mapContainerElement.dataset.mapKey,
"success"
);
} }
})(); })();

View File

@ -48,22 +48,26 @@ Object.defineProperty(exports, "__esModule", { value: true });
aliasElement.textContent = exports.aliases.lot; aliasElement.textContent = exports.aliases.lot;
break; break;
case "lot": case "lot":
aliasElement.textContent = exports.aliases.lot.toLowerCase(); aliasElement.textContent =
exports.aliases.lot.toLowerCase();
break; break;
case "Occupancy": case "Occupancy":
aliasElement.textContent = exports.aliases.occupancy; aliasElement.textContent = exports.aliases.occupancy;
break; break;
case "occupancy": case "occupancy":
aliasElement.textContent = exports.aliases.occupancy.toLowerCase(); aliasElement.textContent =
exports.aliases.occupancy.toLowerCase();
break; break;
case "Occupant": case "Occupant":
aliasElement.textContent = exports.aliases.occupant; aliasElement.textContent = exports.aliases.occupant;
break; break;
case "occupant": case "occupant":
aliasElement.textContent = exports.aliases.occupant.toLowerCase(); aliasElement.textContent =
exports.aliases.occupant.toLowerCase();
break; break;
case "ExternalReceiptNumber": case "ExternalReceiptNumber":
aliasElement.textContent = exports.aliases.externalReceiptNumber; aliasElement.textContent =
exports.aliases.externalReceiptNumber;
break; break;
} }
} }

View File

@ -3,9 +3,11 @@
import type * as globalTypes from "../types/globalTypes"; import type * as globalTypes from "../types/globalTypes";
(() => { (() => {
const highlightMap = (
const highlightMap = (mapContainerElement: HTMLElement, mapKey: string, contextualClass: "success" | "danger") => { mapContainerElement: HTMLElement,
mapKey: string,
contextualClass: "success" | "danger"
) => {
// Search for ID // Search for ID
let svgId = mapKey; let svgId = mapKey;
@ -13,7 +15,9 @@ import type * as globalTypes from "../types/globalTypes";
// eslint-disable-next-line no-constant-condition // eslint-disable-next-line no-constant-condition
while (true) { while (true) {
svgElementToHighlight = mapContainerElement.querySelector("#" + svgId); svgElementToHighlight = mapContainerElement.querySelector(
"#" + svgId
);
if (svgElementToHighlight || !svgId.includes("-")) { if (svgElementToHighlight || !svgId.includes("-")) {
break; break;
@ -23,15 +27,17 @@ import type * as globalTypes from "../types/globalTypes";
} }
if (svgElementToHighlight) { if (svgElementToHighlight) {
// eslint-disable-next-line unicorn/no-null // eslint-disable-next-line unicorn/no-null
svgElementToHighlight.style.fill = null; svgElementToHighlight.style.fill = null;
svgElementToHighlight.classList.add("highlight", "is-" + contextualClass); svgElementToHighlight.classList.add(
"highlight",
"is-" + contextualClass
);
const childPathElements = svgElementToHighlight.querySelectorAll("path"); const childPathElements =
svgElementToHighlight.querySelectorAll("path");
for (const pathElement of childPathElements) { for (const pathElement of childPathElements) {
// eslint-disable-next-line unicorn/no-null // eslint-disable-next-line unicorn/no-null
pathElement.style.fill = null; pathElement.style.fill = null;
} }
@ -39,15 +45,19 @@ import type * as globalTypes from "../types/globalTypes";
}; };
const unlockField = (clickEvent: Event) => { const unlockField = (clickEvent: Event) => {
const fieldElement = (clickEvent.currentTarget as HTMLElement).closest(
".field"
);
const fieldElement = (clickEvent.currentTarget as HTMLElement).closest(".field"); const inputOrSelectElement = fieldElement.querySelector(
"input, select"
const inputOrSelectElement = fieldElement.querySelector("input, select") as HTMLInputElement | HTMLSelectElement; ) as HTMLInputElement | HTMLSelectElement;
if (inputOrSelectElement.tagName === "INPUT") { if (inputOrSelectElement.tagName === "INPUT") {
inputOrSelectElement.disabled = false; inputOrSelectElement.disabled = false;
} else { } else {
const optionElements = inputOrSelectElement.querySelectorAll("option"); const optionElements =
inputOrSelectElement.querySelectorAll("option");
for (const optionElement of optionElements) { for (const optionElement of optionElements) {
optionElement.disabled = false; optionElement.disabled = false;
} }
@ -57,8 +67,9 @@ import type * as globalTypes from "../types/globalTypes";
}; };
const initializeUnlockFieldButtons = (containerElement: HTMLElement) => { const initializeUnlockFieldButtons = (containerElement: HTMLElement) => {
const unlockFieldButtonElements = containerElement.querySelectorAll(
const unlockFieldButtonElements = containerElement.querySelectorAll(".is-unlock-field-button"); ".is-unlock-field-button"
);
for (const unlockFieldButtonElement of unlockFieldButtonElements) { for (const unlockFieldButtonElement of unlockFieldButtonElements) {
unlockFieldButtonElement.addEventListener("click", unlockField); unlockFieldButtonElement.addEventListener("click", unlockField);
@ -66,19 +77,19 @@ import type * as globalTypes from "../types/globalTypes";
}; };
const populateAliases = (containerElement: HTMLElement) => { const populateAliases = (containerElement: HTMLElement) => {
const aliasElements = containerElement.querySelectorAll(
const aliasElements = containerElement.querySelectorAll(".alias") as NodeListOf<HTMLElement>; ".alias"
) as NodeListOf<HTMLElement>;
for (const aliasElement of aliasElements) { for (const aliasElement of aliasElements) {
switch (aliasElement.dataset.alias) { switch (aliasElement.dataset.alias) {
case "Lot": case "Lot":
aliasElement.textContent = exports.aliases.lot; aliasElement.textContent = exports.aliases.lot;
break; break;
case "lot": case "lot":
aliasElement.textContent = exports.aliases.lot.toLowerCase(); aliasElement.textContent =
exports.aliases.lot.toLowerCase();
break; break;
case "Occupancy": case "Occupancy":
@ -86,7 +97,8 @@ import type * as globalTypes from "../types/globalTypes";
break; break;
case "occupancy": case "occupancy":
aliasElement.textContent = exports.aliases.occupancy.toLowerCase(); aliasElement.textContent =
exports.aliases.occupancy.toLowerCase();
break; break;
case "Occupant": case "Occupant":
@ -94,11 +106,13 @@ import type * as globalTypes from "../types/globalTypes";
break; break;
case "occupant": case "occupant":
aliasElement.textContent = exports.aliases.occupant.toLowerCase(); aliasElement.textContent =
exports.aliases.occupant.toLowerCase();
break; break;
case "ExternalReceiptNumber": case "ExternalReceiptNumber":
aliasElement.textContent = exports.aliases.externalReceiptNumber; aliasElement.textContent =
exports.aliases.externalReceiptNumber;
break; break;
} }
} }

View File

@ -2,15 +2,17 @@
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
(() => { (() => {
const urlPrefix = document.querySelector("main").dataset.urlPrefix; const urlPrefix = document.querySelector("main").dataset.urlPrefix;
const mapId = document.querySelector("#map--mapId").value; const mapId = document.querySelector("#map--mapId")
const isCreate = (mapId === ""); .value;
const isCreate = mapId === "";
const mapForm = document.querySelector("#form--map"); const mapForm = document.querySelector("#form--map");
const updateMap = (formEvent) => { const updateMap = (formEvent) => {
formEvent.preventDefault(); formEvent.preventDefault();
cityssm.postJSON(urlPrefix + "/maps/" + (isCreate ? "doCreateMap" : "doUpdateMap"), mapForm, (responseJSON) => { cityssm.postJSON(urlPrefix + "/maps/" + (isCreate ? "doCreateMap" : "doUpdateMap"), mapForm, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
if (isCreate) { if (isCreate) {
window.location.href = urlPrefix + "/maps/" + responseJSON.mapId + "/edit"; window.location.href =
urlPrefix + "/maps/" + responseJSON.mapId + "/edit";
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
@ -30,14 +32,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
}; };
mapForm.addEventListener("submit", updateMap); mapForm.addEventListener("submit", updateMap);
if (!isCreate) { if (!isCreate) {
document.querySelector("#button--deleteMap").addEventListener("click", (clickEvent) => { document
.querySelector("#button--deleteMap")
.addEventListener("click", (clickEvent) => {
clickEvent.preventDefault(); clickEvent.preventDefault();
const doDelete = () => { const doDelete = () => {
cityssm.postJSON(urlPrefix + "/maps/doDeleteMap", { cityssm.postJSON(urlPrefix + "/maps/doDeleteMap", {
mapId mapId
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
window.location.href = urlPrefix + "/maps?t=" + Date.now(); window.location.href =
urlPrefix + "/maps?t=" + Date.now();
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
@ -50,7 +55,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
}; };
bulmaJS.confirm({ bulmaJS.confirm({
title: "Delete " + exports.aliases.map, title: "Delete " + exports.aliases.map,
message: "Are you sure you want to delete this " + exports.aliases.map.toLowerCase() + "?", message: "Are you sure you want to delete this " +
exports.aliases.map.toLowerCase() +
"?",
contextualColorName: "warning", contextualColorName: "warning",
okButton: { okButton: {
text: "Yes, Delete " + exports.aliases.map + "?", text: "Yes, Delete " + exports.aliases.map + "?",

View File

@ -1,40 +1,39 @@
/* eslint-disable unicorn/prefer-module */ /* eslint-disable unicorn/prefer-module */
import type { import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
cityssmGlobal import type { BulmaJS } from "@cityssm/bulma-js/types";
} from "@cityssm/bulma-webapp-js/src/types";
import type {
BulmaJS
} from "@cityssm/bulma-js/types";
declare const cityssm: cityssmGlobal; declare const cityssm: cityssmGlobal;
declare const bulmaJS: BulmaJS; declare const bulmaJS: BulmaJS;
(() => { (() => {
const urlPrefix = document.querySelector("main").dataset.urlPrefix; const urlPrefix = document.querySelector("main").dataset.urlPrefix;
const mapId = (document.querySelector("#map--mapId") as HTMLInputElement).value; const mapId = (document.querySelector("#map--mapId") as HTMLInputElement)
const isCreate = (mapId === ""); .value;
const isCreate = mapId === "";
const mapForm = document.querySelector("#form--map") as HTMLFormElement; const mapForm = document.querySelector("#form--map") as HTMLFormElement;
const updateMap = (formEvent: SubmitEvent) => { const updateMap = (formEvent: SubmitEvent) => {
formEvent.preventDefault(); formEvent.preventDefault();
cityssm.postJSON(urlPrefix + "/maps/" + (isCreate ? "doCreateMap" : "doUpdateMap"), cityssm.postJSON(
urlPrefix + "/maps/" + (isCreate ? "doCreateMap" : "doUpdateMap"),
mapForm, mapForm,
(responseJSON: { (responseJSON: {
success: boolean;mapId ? : number, success: boolean;
errorMessage ? : string mapId?: number;
errorMessage?: string;
}) => { }) => {
if (responseJSON.success) { if (responseJSON.success) {
if (isCreate) { if (isCreate) {
window.location.href = urlPrefix + "/maps/" + responseJSON.mapId + "/edit"; window.location.href =
urlPrefix + "/maps/" + responseJSON.mapId + "/edit";
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
message: exports.aliases.map + " Updated Successfully", message:
exports.aliases.map + " Updated Successfully",
contextualColorName: "success" contextualColorName: "success"
}); });
} }
@ -45,40 +44,49 @@ declare const bulmaJS: BulmaJS;
contextualColorName: "danger" contextualColorName: "danger"
}); });
} }
}); }
);
}; };
mapForm.addEventListener("submit", updateMap); mapForm.addEventListener("submit", updateMap);
if (!isCreate) { if (!isCreate) {
document
document.querySelector("#button--deleteMap").addEventListener("click", (clickEvent) => { .querySelector("#button--deleteMap")
.addEventListener("click", (clickEvent) => {
clickEvent.preventDefault(); clickEvent.preventDefault();
const doDelete = () => { const doDelete = () => {
cityssm.postJSON(
cityssm.postJSON(urlPrefix + "/maps/doDeleteMap", { urlPrefix + "/maps/doDeleteMap",
{
mapId mapId
}, },
(responseJSON: { (responseJSON: {
success: boolean;errorMessage ? : string; success: boolean;
errorMessage?: string;
}) => { }) => {
if (responseJSON.success) { if (responseJSON.success) {
window.location.href = urlPrefix + "/maps?t=" + Date.now(); window.location.href =
urlPrefix + "/maps?t=" + Date.now();
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Deleting " + exports.aliases.map, title:
"Error Deleting " + exports.aliases.map,
message: responseJSON.errorMessage, message: responseJSON.errorMessage,
contextualColorName: "danger" contextualColorName: "danger"
}); });
} }
}); }
);
}; };
bulmaJS.confirm({ bulmaJS.confirm({
title: "Delete " + exports.aliases.map, title: "Delete " + exports.aliases.map,
message: "Are you sure you want to delete this " + exports.aliases.map.toLowerCase() + "?", message:
"Are you sure you want to delete this " +
exports.aliases.map.toLowerCase() +
"?",
contextualColorName: "warning", contextualColorName: "warning",
okButton: { okButton: {
text: "Yes, Delete " + exports.aliases.map + "?", text: "Yes, Delete " + exports.aliases.map + "?",

View File

@ -6,17 +6,26 @@ Object.defineProperty(exports, "__esModule", { value: true });
const searchFilterElement = document.querySelector("#searchFilter--map"); const searchFilterElement = document.querySelector("#searchFilter--map");
const searchResultsContainerElement = document.querySelector("#container--searchResults"); const searchResultsContainerElement = document.querySelector("#container--searchResults");
const renderResults = () => { const renderResults = () => {
searchResultsContainerElement.innerHTML = "<div class=\"has-text-grey has-text-centered\">" + searchResultsContainerElement.innerHTML =
"<i class=\"fas fa-5x fa-circle-notch fa-spin\" aria-hidden=\"true\"></i><br />" + '<div class="has-text-grey has-text-centered">' +
"Loading " + exports.aliases.maps + "..." + '<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />' +
"Loading " +
exports.aliases.maps +
"..." +
"</div>"; "</div>";
let searchResultCount = 0; let searchResultCount = 0;
const searchResultsTbodyElement = document.createElement("tbody"); const searchResultsTbodyElement = document.createElement("tbody");
const filterStringSplit = searchFilterElement.value.trim().toLowerCase().split(" "); const filterStringSplit = searchFilterElement.value
.trim()
.toLowerCase()
.split(" ");
for (const map of maps) { for (const map of maps) {
const mapSearchString = (map.mapName + " " + const mapSearchString = (map.mapName +
map.mapDescription + " " + " " +
map.mapAddress1 + " " + map.mapDescription +
" " +
map.mapAddress1 +
" " +
map.mapAddress2).toLowerCase(); map.mapAddress2).toLowerCase();
let showMap = true; let showMap = true;
for (const filterStringPiece of filterStringSplit) { for (const filterStringPiece of filterStringSplit) {
@ -29,28 +38,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
continue; continue;
} }
searchResultCount += 1; searchResultCount += 1;
const mapName = map.mapName === "" ? const mapName = map.mapName === "" ? "(No Name)" : map.mapName;
"(No Name)" :
map.mapName;
searchResultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" + searchResultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
("<td>" + ("<td>" +
"<a class=\"has-text-weight-bold\" href=\"" + urlPrefix + "/maps/" + map.mapId + "\">" + '<a class="has-text-weight-bold" href="' +
urlPrefix +
"/maps/" +
map.mapId +
'">' +
cityssm.escapeHTML(mapName) + cityssm.escapeHTML(mapName) +
"</a><br />" + "</a><br />" +
cityssm.escapeHTML(map.mapAddress1) + cityssm.escapeHTML(map.mapAddress1) +
"</td>") + "</td>") +
"<td class=\"has-text-centered\">" + '<td class="has-text-centered">' +
(map.mapLatitude && map.mapLongitude ? (map.mapLatitude && map.mapLongitude
"<i class=\"fas fa-map-marker-alt\" title=\"Has Geographic Coordinates\"></i>" : ? '<i class="fas fa-map-marker-alt" title="Has Geographic Coordinates"></i>'
"") + : "") +
"</td>" + "</td>" +
"<td class=\"has-text-centered\">" + '<td class="has-text-centered">' +
(map.mapSVG ? (map.mapSVG
"<i class=\"fas fa-image\" title=\"Has Image\"></i>" : ? '<i class="fas fa-image" title="Has Image"></i>'
"") + : "") +
"</td>" + "</td>" +
("<td class=\"has-text-right\">" + ('<td class="has-text-right">' +
"<a href=\"" + urlPrefix + "/lots?mapId=" + map.mapId + "\">" + '<a href="' +
urlPrefix +
"/lots?mapId=" +
map.mapId +
'">' +
map.lotCount + map.lotCount +
"</a>" + "</a>" +
"</td>") + "</td>") +
@ -58,25 +73,36 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
searchResultsContainerElement.innerHTML = ""; searchResultsContainerElement.innerHTML = "";
if (searchResultCount === 0) { if (searchResultCount === 0) {
searchResultsContainerElement.innerHTML = "<div class=\"message is-info\">" + searchResultsContainerElement.innerHTML =
"<p class=\"message-body\">There are no " + exports.aliases.maps.toLowerCase() + " that meet the search criteria.</p>" + '<div class="message is-info">' +
'<p class="message-body">There are no ' +
exports.aliases.maps.toLowerCase() +
" that meet the search criteria.</p>" +
"</div>"; "</div>";
} }
else { else {
const searchResultsTableElement = document.createElement("table"); const searchResultsTableElement = document.createElement("table");
searchResultsTableElement.className = "table is-fullwidth is-striped is-hoverable"; searchResultsTableElement.className =
searchResultsTableElement.innerHTML = "<thead><tr>" + "table is-fullwidth is-striped is-hoverable";
"<th>" + exports.aliases.map + "</th>" + searchResultsTableElement.innerHTML =
"<th class=\"has-text-centered\">Coordinates</th>" + "<thead><tr>" +
"<th class=\"has-text-centered\">Image</th>" + "<th>" +
"<th class=\"has-text-right\">" + exports.aliases.lot + " Count</th>" + exports.aliases.map +
"</th>" +
'<th class="has-text-centered">Coordinates</th>' +
'<th class="has-text-centered">Image</th>' +
'<th class="has-text-right">' +
exports.aliases.lot +
" Count</th>" +
"</tr></thead>"; "</tr></thead>";
searchResultsTableElement.append(searchResultsTbodyElement); searchResultsTableElement.append(searchResultsTbodyElement);
searchResultsContainerElement.append(searchResultsTableElement); searchResultsContainerElement.append(searchResultsTableElement);
} }
}; };
searchFilterElement.addEventListener("keyup", renderResults); searchFilterElement.addEventListener("keyup", renderResults);
document.querySelector("#form--searchFilters").addEventListener("submit", (formEvent) => { document
.querySelector("#form--searchFilters")
.addEventListener("submit", (formEvent) => {
formEvent.preventDefault(); formEvent.preventDefault();
renderResults(); renderResults();
}); });

View File

@ -2,39 +2,50 @@
import type * as recordTypes from "../types/recordTypes"; import type * as recordTypes from "../types/recordTypes";
import type { import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
cityssmGlobal
} from "@cityssm/bulma-webapp-js/src/types";
declare const cityssm: cityssmGlobal; declare const cityssm: cityssmGlobal;
(() => { (() => {
const urlPrefix = document.querySelector("main").dataset.urlPrefix; const urlPrefix = document.querySelector("main").dataset.urlPrefix;
const maps: recordTypes.Map[] = exports.maps; const maps: recordTypes.Map[] = exports.maps;
const searchFilterElement = document.querySelector("#searchFilter--map") as HTMLInputElement; const searchFilterElement = document.querySelector(
const searchResultsContainerElement = document.querySelector("#container--searchResults") as HTMLElement; "#searchFilter--map"
) as HTMLInputElement;
const searchResultsContainerElement = document.querySelector(
"#container--searchResults"
) as HTMLElement;
const renderResults = () => { const renderResults = () => {
searchResultsContainerElement.innerHTML =
searchResultsContainerElement.innerHTML = "<div class=\"has-text-grey has-text-centered\">" + '<div class="has-text-grey has-text-centered">' +
"<i class=\"fas fa-5x fa-circle-notch fa-spin\" aria-hidden=\"true\"></i><br />" + '<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />' +
"Loading " + exports.aliases.maps + "..." + "Loading " +
exports.aliases.maps +
"..." +
"</div>"; "</div>";
let searchResultCount = 0; let searchResultCount = 0;
const searchResultsTbodyElement = document.createElement("tbody"); const searchResultsTbodyElement = document.createElement("tbody");
const filterStringSplit = searchFilterElement.value.trim().toLowerCase().split(" "); const filterStringSplit = searchFilterElement.value
.trim()
.toLowerCase()
.split(" ");
for (const map of maps) { for (const map of maps) {
const mapSearchString = (
const mapSearchString = (map.mapName + " " + map.mapName +
map.mapDescription + " " + " " +
map.mapAddress1 + " " + map.mapDescription +
map.mapAddress2).toLowerCase(); " " +
map.mapAddress1 +
" " +
map.mapAddress2
).toLowerCase();
let showMap = true; let showMap = true;
@ -51,52 +62,67 @@ declare const cityssm: cityssmGlobal;
searchResultCount += 1; searchResultCount += 1;
const mapName = map.mapName === "" ? const mapName = map.mapName === "" ? "(No Name)" : map.mapName;
"(No Name)" :
map.mapName;
searchResultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" + searchResultsTbodyElement.insertAdjacentHTML(
"beforeend",
"<tr>" +
("<td>" + ("<td>" +
"<a class=\"has-text-weight-bold\" href=\"" + urlPrefix + "/maps/" + map.mapId + "\">" + '<a class="has-text-weight-bold" href="' +
urlPrefix +
"/maps/" +
map.mapId +
'">' +
cityssm.escapeHTML(mapName) + cityssm.escapeHTML(mapName) +
"</a><br />" + "</a><br />" +
cityssm.escapeHTML(map.mapAddress1) + cityssm.escapeHTML(map.mapAddress1) +
"</td>") + "</td>") +
"<td class=\"has-text-centered\">" + '<td class="has-text-centered">' +
(map.mapLatitude && map.mapLongitude ? (map.mapLatitude && map.mapLongitude
"<i class=\"fas fa-map-marker-alt\" title=\"Has Geographic Coordinates\"></i>" : ? '<i class="fas fa-map-marker-alt" title="Has Geographic Coordinates"></i>'
"") + : "") +
"</td>" + "</td>" +
"<td class=\"has-text-centered\">" + '<td class="has-text-centered">' +
(map.mapSVG ? (map.mapSVG
"<i class=\"fas fa-image\" title=\"Has Image\"></i>" : ? '<i class="fas fa-image" title="Has Image"></i>'
"") + : "") +
"</td>" + "</td>" +
("<td class=\"has-text-right\">" + ('<td class="has-text-right">' +
"<a href=\"" + urlPrefix + "/lots?mapId=" + map.mapId + "\">" + '<a href="' +
urlPrefix +
"/lots?mapId=" +
map.mapId +
'">' +
map.lotCount + map.lotCount +
"</a>" + "</a>" +
"</td>") + "</td>") +
"</tr>"); "</tr>"
);
} }
searchResultsContainerElement.innerHTML = ""; searchResultsContainerElement.innerHTML = "";
if (searchResultCount === 0) { if (searchResultCount === 0) {
searchResultsContainerElement.innerHTML =
searchResultsContainerElement.innerHTML = "<div class=\"message is-info\">" + '<div class="message is-info">' +
"<p class=\"message-body\">There are no " + exports.aliases.maps.toLowerCase() + " that meet the search criteria.</p>" + '<p class="message-body">There are no ' +
exports.aliases.maps.toLowerCase() +
" that meet the search criteria.</p>" +
"</div>"; "</div>";
} else { } else {
const searchResultsTableElement = document.createElement("table"); const searchResultsTableElement = document.createElement("table");
searchResultsTableElement.className = "table is-fullwidth is-striped is-hoverable"; searchResultsTableElement.className =
searchResultsTableElement.innerHTML = "<thead><tr>" + "table is-fullwidth is-striped is-hoverable";
"<th>" + exports.aliases.map + "</th>" + searchResultsTableElement.innerHTML =
"<th class=\"has-text-centered\">Coordinates</th>" + "<thead><tr>" +
"<th class=\"has-text-centered\">Image</th>" + "<th>" +
"<th class=\"has-text-right\">" + exports.aliases.lot + " Count</th>" + exports.aliases.map +
"</th>" +
'<th class="has-text-centered">Coordinates</th>' +
'<th class="has-text-centered">Image</th>' +
'<th class="has-text-right">' +
exports.aliases.lot +
" Count</th>" +
"</tr></thead>"; "</tr></thead>";
searchResultsTableElement.append(searchResultsTbodyElement); searchResultsTableElement.append(searchResultsTbodyElement);
@ -106,7 +132,9 @@ declare const cityssm: cityssmGlobal;
}; };
searchFilterElement.addEventListener("keyup", renderResults); searchFilterElement.addEventListener("keyup", renderResults);
document.querySelector("#form--searchFilters").addEventListener("submit", (formEvent) => { document
.querySelector("#form--searchFilters")
.addEventListener("submit", (formEvent) => {
formEvent.preventDefault(); formEvent.preventDefault();
renderResults(); renderResults();
}); });

View File

@ -8,9 +8,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
const mapCoordinates = [mapLatitude, mapLongitude]; const mapCoordinates = [mapLatitude, mapLongitude];
const map = L.map(mapContainerElement); const map = L.map(mapContainerElement);
map.setView(mapCoordinates, 15); map.setView(mapCoordinates, 15);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
maxZoom: 19, maxZoom: 19,
attribution: '© OpenStreetMap' attribution: "© OpenStreetMap"
}).addTo(map); }).addTo(map);
L.marker(mapCoordinates).addTo(map); L.marker(mapCoordinates).addTo(map);
} }

View File

@ -1,28 +1,32 @@
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; // import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
import type { BulmaJS } from "@cityssm/bulma-js/types"; // import type { BulmaJS } from "@cityssm/bulma-js/types";
import type * as Leaflet from "leaflet"; import type * as Leaflet from "leaflet";
declare const cityssm: cityssmGlobal; // declare const cityssm: cityssmGlobal;
declare const bulmaJS: BulmaJS; // declare const bulmaJS: BulmaJS;
declare const L; declare const L;
(() => { (() => {
const mapContainerElement = document.querySelector(
const mapContainerElement = document.querySelector("#map--leaflet") as HTMLElement; "#map--leaflet"
) as HTMLElement;
if (mapContainerElement) { if (mapContainerElement) {
const mapLatitude = Number.parseFloat(
const mapLatitude = Number.parseFloat(mapContainerElement.dataset.mapLatitude); mapContainerElement.dataset.mapLatitude
const mapLongitude = Number.parseFloat(mapContainerElement.dataset.mapLongitude); );
const mapLongitude = Number.parseFloat(
mapContainerElement.dataset.mapLongitude
);
const mapCoordinates: Leaflet.LatLngTuple = [mapLatitude, mapLongitude]; const mapCoordinates: Leaflet.LatLngTuple = [mapLatitude, mapLongitude];
const map: Leaflet.Map = L.map(mapContainerElement); const map: Leaflet.Map = L.map(mapContainerElement);
map.setView(mapCoordinates, 15); map.setView(mapCoordinates, 15);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
maxZoom: 19, maxZoom: 19,
attribution: '© OpenStreetMap' attribution: "© OpenStreetMap"
}).addTo(map); }).addTo(map);
L.marker(mapCoordinates).addTo(map); L.marker(mapCoordinates).addTo(map);

View File

@ -4,18 +4,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
const urlPrefix = document.querySelector("main").dataset.urlPrefix; const urlPrefix = document.querySelector("main").dataset.urlPrefix;
const searchFilterFormElement = document.querySelector("#form--searchFilters"); const searchFilterFormElement = document.querySelector("#form--searchFilters");
const searchResultsContainerElement = document.querySelector("#container--searchResults"); const searchResultsContainerElement = document.querySelector("#container--searchResults");
const limit = Number.parseInt(document.querySelector("#searchFilter--limit").value, 10); const limit = Number.parseInt(document.querySelector("#searchFilter--limit")
.value, 10);
const offsetElement = document.querySelector("#searchFilter--offset"); const offsetElement = document.querySelector("#searchFilter--offset");
const getWorkOrders = () => { const getWorkOrders = () => {
const offset = Number.parseInt(offsetElement.value, 10); const offset = Number.parseInt(offsetElement.value, 10);
searchResultsContainerElement.innerHTML = "<div class=\"has-text-grey has-text-centered\">" + searchResultsContainerElement.innerHTML =
"<i class=\"fas fa-5x fa-circle-notch fa-spin\" aria-hidden=\"true\"></i><br />" + '<div class="has-text-grey has-text-centered">' +
'<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />' +
"Loading Work Orders..." + "Loading Work Orders..." +
"</div>"; "</div>";
cityssm.postJSON(urlPrefix + "/workOrders/doSearchWorkOrders", searchFilterFormElement, (responseJSON) => { cityssm.postJSON(urlPrefix + "/workOrders/doSearchWorkOrders", searchFilterFormElement, (responseJSON) => {
if (responseJSON.workOrders.length === 0) { if (responseJSON.workOrders.length === 0) {
searchResultsContainerElement.innerHTML = "<div class=\"message is-info\">" + searchResultsContainerElement.innerHTML =
"<p class=\"message-body\">There are no work orders that meet the search criteria.</p>" + '<div class="message is-info">' +
'<p class="message-body">There are no work orders that meet the search criteria.</p>' +
"</div>"; "</div>";
return; return;
} }
@ -23,23 +26,32 @@ Object.defineProperty(exports, "__esModule", { value: true });
for (const workOrder of responseJSON.workOrders) { for (const workOrder of responseJSON.workOrders) {
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" + resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
("<td>" + ("<td>" +
"<a class=\"has-text-weight-bold\" href=\"" + urlPrefix + "/workOrders/" + workOrder.workOrderId + "\">" + '<a class="has-text-weight-bold" href="' +
urlPrefix +
"/workOrders/" +
workOrder.workOrderId +
'">' +
cityssm.escapeHTML(workOrder.workOrderNumber) + cityssm.escapeHTML(workOrder.workOrderNumber) +
"</a>" + "</a>" +
"</td>") + "</td>") +
("<td>" + ("<td>" +
cityssm.escapeHTML(workOrder.workOrderType) + cityssm.escapeHTML(workOrder.workOrderType) +
"</td>") + "</td>") +
"<td>" + cityssm.escapeHTML(workOrder.workOrderDescription) + "</td>" + "<td>" +
cityssm.escapeHTML(workOrder.workOrderDescription) +
"</td>" +
("<td>" + ("<td>" +
workOrder.workOrderOpenDateString + workOrder.workOrderOpenDateString +
"</td>") + "</td>") +
("<td>" + ("<td>" +
(workOrder.workOrderCloseDate ? workOrder.workOrderCloseDateString : "<span class=\"has-text-grey\">(No Close Date)</span>") + (workOrder.workOrderCloseDate
? workOrder.workOrderCloseDateString
: '<span class="has-text-grey">(No Close Date)</span>') +
"</td>") + "</td>") +
"</tr>"); "</tr>");
} }
searchResultsContainerElement.innerHTML = "<table class=\"table is-fullwidth is-striped is-hoverable\">" + searchResultsContainerElement.innerHTML =
'<table class="table is-fullwidth is-striped is-hoverable">' +
"<thead><tr>" + "<thead><tr>" +
"<th>Work Order Number</th>" + "<th>Work Order Number</th>" +
"<th>Work Order Type</th>" + "<th>Work Order Type</th>" +
@ -48,38 +60,47 @@ Object.defineProperty(exports, "__esModule", { value: true });
"<th>Close Date</th>" + "<th>Close Date</th>" +
"</tr></thead>" + "</tr></thead>" +
"<table>" + "<table>" +
"<div class=\"level\">" + '<div class="level">' +
("<div class=\"level-left\">" + ('<div class="level-left">' +
"<div class=\"level-item has-text-weight-bold\">" + '<div class="level-item has-text-weight-bold">' +
"Displaying " + (offset + 1).toString() + "Displaying " +
" to " + Math.min(responseJSON.count, limit + offset) + (offset + 1).toString() +
" of " + responseJSON.count + " to " +
Math.min(responseJSON.count, limit + offset) +
" of " +
responseJSON.count +
"</div>" + "</div>" +
"</div>") + "</div>") +
("<div class=\"level-right\">" + ('<div class="level-right">' +
(offset > 0 ? (offset > 0
"<div class=\"level-item\">" + ? '<div class="level-item">' +
"<button class=\"button is-rounded is-link is-outlined\" data-page=\"previous\" type=\"button\" title=\"Previous\">" + '<button class="button is-rounded is-link is-outlined" data-page="previous" type="button" title="Previous">' +
"<i class=\"fas fa-arrow-left\" aria-hidden=\"true\"></i>" + '<i class="fas fa-arrow-left" aria-hidden="true"></i>' +
"</button>" + "</button>" +
"</div>" : "</div>"
"") + : "") +
(limit + offset < responseJSON.count ? (limit + offset < responseJSON.count
"<div class=\"level-item\">" + ? '<div class="level-item">' +
"<button class=\"button is-rounded is-link\" data-page=\"next\" type=\"button\" title=\"Next\">" + '<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
"<span>Next</span>" + "<span>Next</span>" +
"<span class=\"icon\"><i class=\"fas fa-arrow-right\" aria-hidden=\"true\"></i></span>" + '<span class="icon"><i class="fas fa-arrow-right" aria-hidden="true"></i></span>' +
"</button>" + "</button>" +
"</div>" : "</div>"
"") + : "") +
"</div>") + "</div>") +
"</div>"; "</div>";
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement); searchResultsContainerElement
.querySelector("table")
.append(resultsTbodyElement);
if (offset > 0) { if (offset > 0) {
searchResultsContainerElement.querySelector("button[data-page='previous']").addEventListener("click", previousAndGetWorkOrders); searchResultsContainerElement
.querySelector("button[data-page='previous']")
.addEventListener("click", previousAndGetWorkOrders);
} }
if (limit + offset < responseJSON.count) { if (limit + offset < responseJSON.count) {
searchResultsContainerElement.querySelector("button[data-page='next']").addEventListener("click", nextAndGetWorkOrders); searchResultsContainerElement
.querySelector("button[data-page='next']")
.addEventListener("click", nextAndGetWorkOrders);
} }
}); });
}; };

View File

@ -2,43 +2,49 @@
import type * as recordTypes from "../types/recordTypes"; import type * as recordTypes from "../types/recordTypes";
import type { import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
cityssmGlobal
} from "@cityssm/bulma-webapp-js/src/types";
declare const cityssm: cityssmGlobal; declare const cityssm: cityssmGlobal;
(() => { (() => {
const urlPrefix = document.querySelector("main").dataset.urlPrefix; const urlPrefix = document.querySelector("main").dataset.urlPrefix;
const searchFilterFormElement = document.querySelector("#form--searchFilters") as HTMLFormElement; const searchFilterFormElement = document.querySelector(
const searchResultsContainerElement = document.querySelector("#container--searchResults") as HTMLElement; "#form--searchFilters"
) as HTMLFormElement;
const limit = Number.parseInt((document.querySelector("#searchFilter--limit") as HTMLInputElement).value, 10); const searchResultsContainerElement = document.querySelector(
const offsetElement = document.querySelector("#searchFilter--offset") as HTMLInputElement; "#container--searchResults"
) as HTMLElement;
const limit = Number.parseInt(
(document.querySelector("#searchFilter--limit") as HTMLInputElement)
.value,
10
);
const offsetElement = document.querySelector(
"#searchFilter--offset"
) as HTMLInputElement;
const getWorkOrders = () => { const getWorkOrders = () => {
const offset = Number.parseInt(offsetElement.value, 10); const offset = Number.parseInt(offsetElement.value, 10);
searchResultsContainerElement.innerHTML = "<div class=\"has-text-grey has-text-centered\">" + searchResultsContainerElement.innerHTML =
"<i class=\"fas fa-5x fa-circle-notch fa-spin\" aria-hidden=\"true\"></i><br />" + '<div class="has-text-grey has-text-centered">' +
'<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />' +
"Loading Work Orders..." + "Loading Work Orders..." +
"</div>"; "</div>";
cityssm.postJSON(urlPrefix + "/workOrders/doSearchWorkOrders", searchFilterFormElement, cityssm.postJSON(
urlPrefix + "/workOrders/doSearchWorkOrders",
searchFilterFormElement,
(responseJSON: { (responseJSON: {
count: number; count: number;
workOrders: recordTypes.WorkOrder[]; workOrders: recordTypes.WorkOrder[];
}) => { }) => {
if (responseJSON.workOrders.length === 0) { if (responseJSON.workOrders.length === 0) {
searchResultsContainerElement.innerHTML =
searchResultsContainerElement.innerHTML = "<div class=\"message is-info\">" + '<div class="message is-info">' +
"<p class=\"message-body\">There are no work orders that meet the search criteria.</p>" + '<p class="message-body">There are no work orders that meet the search criteria.</p>' +
"</div>"; "</div>";
return; return;
@ -47,28 +53,38 @@ declare const cityssm: cityssmGlobal;
const resultsTbodyElement = document.createElement("tbody"); const resultsTbodyElement = document.createElement("tbody");
for (const workOrder of responseJSON.workOrders) { for (const workOrder of responseJSON.workOrders) {
resultsTbodyElement.insertAdjacentHTML(
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" + "beforeend",
"<tr>" +
("<td>" + ("<td>" +
"<a class=\"has-text-weight-bold\" href=\"" + urlPrefix + "/workOrders/" + workOrder.workOrderId + "\">" + '<a class="has-text-weight-bold" href="' +
urlPrefix +
"/workOrders/" +
workOrder.workOrderId +
'">' +
cityssm.escapeHTML(workOrder.workOrderNumber) + cityssm.escapeHTML(workOrder.workOrderNumber) +
"</a>" + "</a>" +
"</td>") + "</td>") +
("<td>" + ("<td>" +
cityssm.escapeHTML(workOrder.workOrderType) + cityssm.escapeHTML(workOrder.workOrderType) +
"</td>") + "</td>") +
"<td>" + cityssm.escapeHTML(workOrder.workOrderDescription) + "</td>" + "<td>" +
cityssm.escapeHTML(workOrder.workOrderDescription) +
"</td>" +
("<td>" + ("<td>" +
workOrder.workOrderOpenDateString + workOrder.workOrderOpenDateString +
"</td>") + "</td>") +
("<td>" + ("<td>" +
(workOrder.workOrderCloseDate ? workOrder.workOrderCloseDateString : "<span class=\"has-text-grey\">(No Close Date)</span>") + (workOrder.workOrderCloseDate
? workOrder.workOrderCloseDateString
: '<span class="has-text-grey">(No Close Date)</span>') +
"</td>") + "</td>") +
"</tr>"); "</tr>"
);
} }
searchResultsContainerElement.innerHTML = "<table class=\"table is-fullwidth is-striped is-hoverable\">" + searchResultsContainerElement.innerHTML =
'<table class="table is-fullwidth is-striped is-hoverable">' +
"<thead><tr>" + "<thead><tr>" +
"<th>Work Order Number</th>" + "<th>Work Order Number</th>" +
"<th>Work Order Type</th>" + "<th>Work Order Type</th>" +
@ -77,61 +93,78 @@ declare const cityssm: cityssmGlobal;
"<th>Close Date</th>" + "<th>Close Date</th>" +
"</tr></thead>" + "</tr></thead>" +
"<table>" + "<table>" +
"<div class=\"level\">" + '<div class="level">' +
("<div class=\"level-left\">" + ('<div class="level-left">' +
"<div class=\"level-item has-text-weight-bold\">" + '<div class="level-item has-text-weight-bold">' +
"Displaying " + (offset + 1).toString() + "Displaying " +
" to " + Math.min(responseJSON.count, limit + offset) + (offset + 1).toString() +
" of " + responseJSON.count + " to " +
Math.min(responseJSON.count, limit + offset) +
" of " +
responseJSON.count +
"</div>" + "</div>" +
"</div>") + "</div>") +
("<div class=\"level-right\">" + ('<div class="level-right">' +
(offset > 0 ? (offset > 0
"<div class=\"level-item\">" + ? '<div class="level-item">' +
"<button class=\"button is-rounded is-link is-outlined\" data-page=\"previous\" type=\"button\" title=\"Previous\">" + '<button class="button is-rounded is-link is-outlined" data-page="previous" type="button" title="Previous">' +
"<i class=\"fas fa-arrow-left\" aria-hidden=\"true\"></i>" + '<i class="fas fa-arrow-left" aria-hidden="true"></i>' +
"</button>" + "</button>" +
"</div>" : "</div>"
"") + : "") +
(limit + offset < responseJSON.count ? (limit + offset < responseJSON.count
"<div class=\"level-item\">" + ? '<div class="level-item">' +
"<button class=\"button is-rounded is-link\" data-page=\"next\" type=\"button\" title=\"Next\">" + '<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
"<span>Next</span>" + "<span>Next</span>" +
"<span class=\"icon\"><i class=\"fas fa-arrow-right\" aria-hidden=\"true\"></i></span>" + '<span class="icon"><i class="fas fa-arrow-right" aria-hidden="true"></i></span>' +
"</button>" + "</button>" +
"</div>" : "</div>"
"") + : "") +
"</div>") + "</div>") +
"</div>"; "</div>";
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement); searchResultsContainerElement
.querySelector("table")
.append(resultsTbodyElement);
if (offset > 0) { if (offset > 0) {
searchResultsContainerElement.querySelector("button[data-page='previous']").addEventListener("click", previousAndGetWorkOrders); searchResultsContainerElement
.querySelector("button[data-page='previous']")
.addEventListener("click", previousAndGetWorkOrders);
} }
if (limit + offset < responseJSON.count) { if (limit + offset < responseJSON.count) {
searchResultsContainerElement.querySelector("button[data-page='next']").addEventListener("click", nextAndGetWorkOrders); searchResultsContainerElement
.querySelector("button[data-page='next']")
.addEventListener("click", nextAndGetWorkOrders);
} }
}); }
);
}; };
const resetOffsetAndGetWorkOrders = () => { const resetOffsetAndGetWorkOrders = () => {
offsetElement.value = "0"; offsetElement.value = "0";
getWorkOrders(); getWorkOrders();
} };
const previousAndGetWorkOrders = () => { const previousAndGetWorkOrders = () => {
offsetElement.value = Math.max(Number.parseInt(offsetElement.value, 10) - limit, 0).toString(); offsetElement.value = Math.max(
Number.parseInt(offsetElement.value, 10) - limit,
0
).toString();
getWorkOrders(); getWorkOrders();
}; };
const nextAndGetWorkOrders = () => { const nextAndGetWorkOrders = () => {
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString(); offsetElement.value = (
Number.parseInt(offsetElement.value, 10) + limit
).toString();
getWorkOrders(); getWorkOrders();
}; };
const filterElements = searchFilterFormElement.querySelectorAll("input, select") as NodeListOf < HTMLInputElement | HTMLSelectElement > ; const filterElements = searchFilterFormElement.querySelectorAll(
"input, select"
) as NodeListOf<HTMLInputElement | HTMLSelectElement>;
for (const filterElement of filterElements) { for (const filterElement of filterElements) {
filterElement.addEventListener("change", resetOffsetAndGetWorkOrders); filterElement.addEventListener("change", resetOffsetAndGetWorkOrders);

View File

@ -11,6 +11,7 @@ import handler_doUpdateFee from "../handlers/admin-post/doUpdateFee.js";
import handler_doMoveFeeUp from "../handlers/admin-post/doMoveFeeUp.js"; import handler_doMoveFeeUp from "../handlers/admin-post/doMoveFeeUp.js";
import handler_doMoveFeeDown from "../handlers/admin-post/doMoveFeeDown.js"; import handler_doMoveFeeDown from "../handlers/admin-post/doMoveFeeDown.js";
import handler_doDeleteFee from "../handlers/admin-post/doDeleteFee.js"; import handler_doDeleteFee from "../handlers/admin-post/doDeleteFee.js";
import handler_occupancyTypes from "../handlers/admin-get/occupancyTypes.js";
import handler_tables from "../handlers/admin-get/tables.js"; import handler_tables from "../handlers/admin-get/tables.js";
import handler_doAddWorkOrderType from "../handlers/admin-post/doAddWorkOrderType.js"; import handler_doAddWorkOrderType from "../handlers/admin-post/doAddWorkOrderType.js";
import handler_doUpdateWorkOrderType from "../handlers/admin-post/doUpdateWorkOrderType.js"; import handler_doUpdateWorkOrderType from "../handlers/admin-post/doUpdateWorkOrderType.js";
@ -39,6 +40,7 @@ router.post("/doUpdateFee", permissionHandlers.adminPostHandler, handler_doUpdat
router.post("/doMoveFeeUp", permissionHandlers.adminPostHandler, handler_doMoveFeeUp); router.post("/doMoveFeeUp", permissionHandlers.adminPostHandler, handler_doMoveFeeUp);
router.post("/doMoveFeeDown", permissionHandlers.adminPostHandler, handler_doMoveFeeDown); router.post("/doMoveFeeDown", permissionHandlers.adminPostHandler, handler_doMoveFeeDown);
router.post("/doDeleteFee", permissionHandlers.adminPostHandler, handler_doDeleteFee); router.post("/doDeleteFee", permissionHandlers.adminPostHandler, handler_doDeleteFee);
router.get("/occupancyTypes", permissionHandlers.adminGetHandler, handler_occupancyTypes);
router.get("/tables", permissionHandlers.adminGetHandler, handler_tables); router.get("/tables", permissionHandlers.adminGetHandler, handler_tables);
router.post("/doAddWorkOrderType", permissionHandlers.adminPostHandler, handler_doAddWorkOrderType); router.post("/doAddWorkOrderType", permissionHandlers.adminPostHandler, handler_doAddWorkOrderType);
router.post("/doUpdateWorkOrderType", permissionHandlers.adminPostHandler, handler_doUpdateWorkOrderType); router.post("/doUpdateWorkOrderType", permissionHandlers.adminPostHandler, handler_doUpdateWorkOrderType);

View File

@ -1,10 +1,11 @@
import { import { Router } from "express";
Router
} from "express";
import * as permissionHandlers from "../handlers/permissions.js"; import * as permissionHandlers from "../handlers/permissions.js";
// Fee Management
import handler_fees from "../handlers/admin-get/fees.js"; import handler_fees from "../handlers/admin-get/fees.js";
import handler_doAddFeeCategory from "../handlers/admin-post/doAddFeeCategory.js"; import handler_doAddFeeCategory from "../handlers/admin-post/doAddFeeCategory.js";
import handler_doUpdateFeeCategory from "../handlers/admin-post/doUpdateFeeCategory.js"; import handler_doUpdateFeeCategory from "../handlers/admin-post/doUpdateFeeCategory.js";
import handler_doMoveFeeCategoryUp from "../handlers/admin-post/doMoveFeeCategoryUp.js"; import handler_doMoveFeeCategoryUp from "../handlers/admin-post/doMoveFeeCategoryUp.js";
@ -17,6 +18,8 @@ import handler_doMoveFeeUp from "../handlers/admin-post/doMoveFeeUp.js";
import handler_doMoveFeeDown from "../handlers/admin-post/doMoveFeeDown.js"; import handler_doMoveFeeDown from "../handlers/admin-post/doMoveFeeDown.js";
import handler_doDeleteFee from "../handlers/admin-post/doDeleteFee.js"; import handler_doDeleteFee from "../handlers/admin-post/doDeleteFee.js";
// Config Table Management
import handler_tables from "../handlers/admin-get/tables.js"; import handler_tables from "../handlers/admin-get/tables.js";
import handler_doAddWorkOrderType from "../handlers/admin-post/doAddWorkOrderType.js"; import handler_doAddWorkOrderType from "../handlers/admin-post/doAddWorkOrderType.js";
@ -37,127 +40,172 @@ import handler_doMoveLotOccupantTypeUp from "../handlers/admin-post/doMoveLotOcc
import handler_doMoveLotOccupantTypeDown from "../handlers/admin-post/doMoveLotOccupantTypeDown.js"; import handler_doMoveLotOccupantTypeDown from "../handlers/admin-post/doMoveLotOccupantTypeDown.js";
import handler_doDeleteLotOccupantType from "../handlers/admin-post/doDeleteLotOccupantType.js"; import handler_doDeleteLotOccupantType from "../handlers/admin-post/doDeleteLotOccupantType.js";
export const router = Router(); export const router = Router();
/*
* Fees
*/
router.get("/fees", permissionHandlers.adminGetHandler, handler_fees);
router.post(
"/doAddFeeCategory",
permissionHandlers.adminPostHandler,
handler_doAddFeeCategory
);
router.post(
"/doUpdateFeeCategory",
permissionHandlers.adminPostHandler,
handler_doUpdateFeeCategory
);
router.post(
"/doMoveFeeCategoryUp",
permissionHandlers.adminPostHandler,
handler_doMoveFeeCategoryUp
);
router.post(
"/doMoveFeeCategoryDown",
permissionHandlers.adminPostHandler,
handler_doMoveFeeCategoryDown
);
router.post(
"/doDeleteFeeCategory",
permissionHandlers.adminPostHandler,
handler_doDeleteFeeCategory
);
router.post("/doAddFee", permissionHandlers.adminPostHandler, handler_doAddFee);
router.post(
"/doUpdateFee",
permissionHandlers.adminPostHandler,
handler_doUpdateFee
);
router.post(
"/doMoveFeeUp",
permissionHandlers.adminPostHandler,
handler_doMoveFeeUp
);
router.post(
"/doMoveFeeDown",
permissionHandlers.adminPostHandler,
handler_doMoveFeeDown
);
router.post(
"/doDeleteFee",
permissionHandlers.adminPostHandler,
handler_doDeleteFee
);
// Fees
router.get("/fees",
permissionHandlers.adminGetHandler, permissionHandlers.adminGetHandler,
handler_fees); /*
* Config Tables
*/
router.post("/doAddFeeCategory", router.get("/tables", permissionHandlers.adminGetHandler, handler_tables);
permissionHandlers.adminPostHandler,
handler_doAddFeeCategory);
router.post("/doUpdateFeeCategory",
permissionHandlers.adminPostHandler,
handler_doUpdateFeeCategory);
router.post("/doMoveFeeCategoryUp",
permissionHandlers.adminPostHandler,
handler_doMoveFeeCategoryUp);
router.post("/doMoveFeeCategoryDown",
permissionHandlers.adminPostHandler,
handler_doMoveFeeCategoryDown);
router.post("/doDeleteFeeCategory",
permissionHandlers.adminPostHandler,
handler_doDeleteFeeCategory);
router.post("/doAddFee",
permissionHandlers.adminPostHandler,
handler_doAddFee);
router.post("/doUpdateFee",
permissionHandlers.adminPostHandler,
handler_doUpdateFee);
router.post("/doMoveFeeUp",
permissionHandlers.adminPostHandler,
handler_doMoveFeeUp);
router.post("/doMoveFeeDown",
permissionHandlers.adminPostHandler,
handler_doMoveFeeDown);
router.post("/doDeleteFee",
permissionHandlers.adminPostHandler,
handler_doDeleteFee);
// Config Tables
router.get("/tables",
permissionHandlers.adminGetHandler,
handler_tables);
// Config Tables - Work Order Types // Config Tables - Work Order Types
router.post("/doAddWorkOrderType", router.post(
"/doAddWorkOrderType",
permissionHandlers.adminPostHandler, permissionHandlers.adminPostHandler,
handler_doAddWorkOrderType); handler_doAddWorkOrderType
);
router.post("/doUpdateWorkOrderType", router.post(
"/doUpdateWorkOrderType",
permissionHandlers.adminPostHandler, permissionHandlers.adminPostHandler,
handler_doUpdateWorkOrderType); handler_doUpdateWorkOrderType
);
router.post("/doMoveWorkOrderTypeUp", router.post(
"/doMoveWorkOrderTypeUp",
permissionHandlers.adminPostHandler, permissionHandlers.adminPostHandler,
handler_doMoveWorkOrderTypeUp); handler_doMoveWorkOrderTypeUp
);
router.post("/doMoveWorkOrderTypeDown", router.post(
"/doMoveWorkOrderTypeDown",
permissionHandlers.adminPostHandler, permissionHandlers.adminPostHandler,
handler_doMoveWorkOrderTypeDown); handler_doMoveWorkOrderTypeDown
);
router.post("/doDeleteWorkOrderType", router.post(
"/doDeleteWorkOrderType",
permissionHandlers.adminPostHandler, permissionHandlers.adminPostHandler,
handler_doDeleteWorkOrderType); handler_doDeleteWorkOrderType
);
// Config Tables - Lot Statuses // Config Tables - Lot Statuses
router.post("/doAddLotStatus", router.post(
"/doAddLotStatus",
permissionHandlers.adminPostHandler, permissionHandlers.adminPostHandler,
handler_doAddLotStatus); handler_doAddLotStatus
);
router.post("/doUpdateLotStatus", router.post(
"/doUpdateLotStatus",
permissionHandlers.adminPostHandler, permissionHandlers.adminPostHandler,
handler_doUpdateLotStatus); handler_doUpdateLotStatus
);
router.post("/doMoveLotStatusUp", router.post(
"/doMoveLotStatusUp",
permissionHandlers.adminPostHandler, permissionHandlers.adminPostHandler,
handler_doMoveLotStatusUp); handler_doMoveLotStatusUp
);
router.post("/doMoveLotStatusDown", router.post(
"/doMoveLotStatusDown",
permissionHandlers.adminPostHandler, permissionHandlers.adminPostHandler,
handler_doMoveLotStatusDown); handler_doMoveLotStatusDown
);
router.post("/doDeleteLotStatus", router.post(
"/doDeleteLotStatus",
permissionHandlers.adminPostHandler, permissionHandlers.adminPostHandler,
handler_doDeleteLotStatus); handler_doDeleteLotStatus
);
// Config Tables - Lot Occupant Types // Config Tables - Lot Occupant Types
router.post("/doAddLotOccupantType", router.post(
"/doAddLotOccupantType",
permissionHandlers.adminPostHandler, permissionHandlers.adminPostHandler,
handler_doAddLotOccupantType); handler_doAddLotOccupantType
);
router.post("/doUpdateLotOccupantType", router.post(
"/doUpdateLotOccupantType",
permissionHandlers.adminPostHandler, permissionHandlers.adminPostHandler,
handler_doUpdateLotOccupantType); handler_doUpdateLotOccupantType
);
router.post("/doMoveLotOccupantTypeUp", router.post(
"/doMoveLotOccupantTypeUp",
permissionHandlers.adminPostHandler, permissionHandlers.adminPostHandler,
handler_doMoveLotOccupantTypeUp); handler_doMoveLotOccupantTypeUp
);
router.post("/doMoveLotOccupantTypeDown", router.post(
"/doMoveLotOccupantTypeDown",
permissionHandlers.adminPostHandler, permissionHandlers.adminPostHandler,
handler_doMoveLotOccupantTypeDown); handler_doMoveLotOccupantTypeDown
);
router.post("/doDeleteLotOccupantType", router.post(
"/doDeleteLotOccupantType",
permissionHandlers.adminPostHandler, permissionHandlers.adminPostHandler,
handler_doDeleteLotOccupantType); handler_doDeleteLotOccupantType
);
export default router; export default router;

View File

@ -2,11 +2,8 @@ import { Router } from "express";
import handler_dashboard from "../handlers/dashboard-get/dashboard.js"; import handler_dashboard from "../handlers/dashboard-get/dashboard.js";
export const router = Router(); export const router = Router();
router.get("/", handler_dashboard); router.get("/", handler_dashboard);
export default router; export default router;

View File

@ -5,10 +5,10 @@ import { useTestDatabases } from "../data/databasePaths.js";
export const router = Router(); export const router = Router();
const getSafeRedirectURL = (possibleRedirectURL = "") => { const getSafeRedirectURL = (possibleRedirectURL = "") => {
const urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix"); const urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix");
if (typeof (possibleRedirectURL) === "string") { if (typeof possibleRedirectURL === "string") {
const urlToCheck = (possibleRedirectURL.startsWith(urlPrefix) ? const urlToCheck = (possibleRedirectURL.startsWith(urlPrefix)
possibleRedirectURL.slice(urlPrefix.length) : ? possibleRedirectURL.slice(urlPrefix.length)
possibleRedirectURL).toLowerCase(); : possibleRedirectURL).toLowerCase();
switch (urlToCheck) { switch (urlToCheck) {
case "/admin/fees": case "/admin/fees":
case "/lotOccupancies": case "/lotOccupancies":
@ -21,7 +21,8 @@ const getSafeRedirectURL = (possibleRedirectURL = "") => {
} }
return urlPrefix + "/dashboard"; return urlPrefix + "/dashboard";
}; };
router.route("/") router
.route("/")
.get((request, response) => { .get((request, response) => {
const sessionCookieName = configFunctions.getProperty("session.cookieName"); const sessionCookieName = configFunctions.getProperty("session.cookieName");
if (request.session.user && request.cookies[sessionCookieName]) { if (request.session.user && request.cookies[sessionCookieName]) {
@ -41,25 +42,26 @@ router.route("/")
const userName = request.body.userName; const userName = request.body.userName;
const passwordPlain = request.body.password; const passwordPlain = request.body.password;
const unsafeRedirectURL = request.body.redirect; const unsafeRedirectURL = request.body.redirect;
const redirectURL = getSafeRedirectURL(typeof (unsafeRedirectURL) === "string" ? const redirectURL = getSafeRedirectURL(typeof unsafeRedirectURL === "string" ? unsafeRedirectURL : "");
unsafeRedirectURL :
"");
const isAuthenticated = await authenticationFunctions.authenticate(userName, passwordPlain); const isAuthenticated = await authenticationFunctions.authenticate(userName, passwordPlain);
let userObject; let userObject;
if (isAuthenticated) { if (isAuthenticated) {
const userNameLowerCase = userName.toLowerCase(); const userNameLowerCase = userName.toLowerCase();
const canLogin = configFunctions.getProperty("users.canLogin") const canLogin = configFunctions
.getProperty("users.canLogin")
.some((currentUserName) => { .some((currentUserName) => {
return userNameLowerCase === currentUserName.toLowerCase(); return userNameLowerCase === currentUserName.toLowerCase();
}); });
if (canLogin) { if (canLogin) {
const canUpdate = configFunctions.getProperty("users.canUpdate") const canUpdate = configFunctions
.getProperty("users.canUpdate")
.some((currentUserName) => { .some((currentUserName) => {
return userNameLowerCase === currentUserName.toLowerCase(); return (userNameLowerCase === currentUserName.toLowerCase());
}); });
const isAdmin = configFunctions.getProperty("users.isAdmin") const isAdmin = configFunctions
.getProperty("users.isAdmin")
.some((currentUserName) => { .some((currentUserName) => {
return userNameLowerCase === currentUserName.toLowerCase(); return (userNameLowerCase === currentUserName.toLowerCase());
}); });
userObject = { userObject = {
userName: userNameLowerCase, userName: userNameLowerCase,

View File

@ -1,6 +1,4 @@
import { import { Router } from "express";
Router
} from "express";
import * as configFunctions from "../helpers/functions.config.js"; import * as configFunctions from "../helpers/functions.config.js";
@ -10,19 +8,17 @@ import { useTestDatabases } from "../data/databasePaths.js";
import type * as recordTypes from "../types/recordTypes"; import type * as recordTypes from "../types/recordTypes";
export const router = Router(); export const router = Router();
const getSafeRedirectURL = (possibleRedirectURL = "") => { const getSafeRedirectURL = (possibleRedirectURL = "") => {
const urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix"); const urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix");
if (typeof (possibleRedirectURL) === "string") { if (typeof possibleRedirectURL === "string") {
const urlToCheck = (
const urlToCheck = (possibleRedirectURL.startsWith(urlPrefix) ? possibleRedirectURL.startsWith(urlPrefix)
possibleRedirectURL.slice(urlPrefix.length) : ? possibleRedirectURL.slice(urlPrefix.length)
possibleRedirectURL).toLowerCase(); : possibleRedirectURL
).toLowerCase();
switch (urlToCheck) { switch (urlToCheck) {
case "/admin/fees": case "/admin/fees":
@ -31,7 +27,6 @@ const getSafeRedirectURL = (possibleRedirectURL = "") => {
case "/maps": case "/maps":
case "/workOrders": case "/workOrders":
case "/reports": case "/reports":
return urlPrefix + urlToCheck; return urlPrefix + urlToCheck;
} }
} }
@ -39,20 +34,19 @@ const getSafeRedirectURL = (possibleRedirectURL = "") => {
return urlPrefix + "/dashboard"; return urlPrefix + "/dashboard";
}; };
router
router.route("/") .route("/")
.get((request, response) => { .get((request, response) => {
const sessionCookieName =
const sessionCookieName = configFunctions.getProperty("session.cookieName"); configFunctions.getProperty("session.cookieName");
if (request.session.user && request.cookies[sessionCookieName]) { if (request.session.user && request.cookies[sessionCookieName]) {
const redirectURL = getSafeRedirectURL(
const redirectURL = getSafeRedirectURL((request.query.redirect || "") as string); (request.query.redirect || "") as string
);
response.redirect(redirectURL); response.redirect(redirectURL);
} else { } else {
response.render("login", { response.render("login", {
userName: "", userName: "",
message: "", message: "",
@ -62,38 +56,45 @@ router.route("/")
} }
}) })
.post(async (request, response) => { .post(async (request, response) => {
const userName = request.body.userName as string; const userName = request.body.userName as string;
const passwordPlain = request.body.password as string; const passwordPlain = request.body.password as string;
const unsafeRedirectURL = request.body.redirect; const unsafeRedirectURL = request.body.redirect;
const redirectURL = getSafeRedirectURL(typeof (unsafeRedirectURL) === "string" ? const redirectURL = getSafeRedirectURL(
unsafeRedirectURL : typeof unsafeRedirectURL === "string" ? unsafeRedirectURL : ""
""); );
const isAuthenticated = await authenticationFunctions.authenticate(userName, passwordPlain) const isAuthenticated = await authenticationFunctions.authenticate(
userName,
passwordPlain
);
let userObject: recordTypes.User; let userObject: recordTypes.User;
if (isAuthenticated) { if (isAuthenticated) {
const userNameLowerCase = userName.toLowerCase(); const userNameLowerCase = userName.toLowerCase();
const canLogin = configFunctions.getProperty("users.canLogin") const canLogin = configFunctions
.getProperty("users.canLogin")
.some((currentUserName) => { .some((currentUserName) => {
return userNameLowerCase === currentUserName.toLowerCase(); return userNameLowerCase === currentUserName.toLowerCase();
}); });
if (canLogin) { if (canLogin) {
const canUpdate = configFunctions
const canUpdate = configFunctions.getProperty("users.canUpdate") .getProperty("users.canUpdate")
.some((currentUserName) => { .some((currentUserName) => {
return userNameLowerCase === currentUserName.toLowerCase(); return (
userNameLowerCase === currentUserName.toLowerCase()
);
}); });
const isAdmin = configFunctions.getProperty("users.isAdmin") const isAdmin = configFunctions
.getProperty("users.isAdmin")
.some((currentUserName) => { .some((currentUserName) => {
return userNameLowerCase === currentUserName.toLowerCase(); return (
userNameLowerCase === currentUserName.toLowerCase()
);
}); });
userObject = { userObject = {
@ -107,13 +108,10 @@ router.route("/")
} }
if (isAuthenticated && userObject) { if (isAuthenticated && userObject) {
request.session.user = userObject; request.session.user = userObject;
response.redirect(redirectURL); response.redirect(redirectURL);
} else { } else {
response.render("login", { response.render("login", {
userName, userName,
message: "Login Failed", message: "Login Failed",
@ -123,5 +121,4 @@ router.route("/")
} }
}); });
export default router; export default router;

View File

@ -1,6 +1,4 @@
import { import { Router } from "express";
Router
} from "express";
import handler_search from "../handlers/lotOccupancies-get/search.js"; import handler_search from "../handlers/lotOccupancies-get/search.js";
import handler_doSearchLotOccupancies from "../handlers/lotOccupancies-post/doSearchLotOccupancies.js"; import handler_doSearchLotOccupancies from "../handlers/lotOccupancies-post/doSearchLotOccupancies.js";
@ -33,103 +31,128 @@ import handler_doDeleteLotOccupancyTransaction from "../handlers/lotOccupancies-
import * as permissionHandlers from "../handlers/permissions.js"; import * as permissionHandlers from "../handlers/permissions.js";
export const router = Router(); export const router = Router();
// Search // Search
router.get("/", router.get("/", handler_search);
handler_search);
router.post("/doSearchLotOccupancies", router.post("/doSearchLotOccupancies", handler_doSearchLotOccupancies);
handler_doSearchLotOccupancies);
// Create // Create
router.get("/new", router.get("/new", permissionHandlers.updateGetHandler, handler_new);
permissionHandlers.updateGetHandler,
handler_new);
router.post("/doGetOccupancyTypeFields", router.post(
"/doGetOccupancyTypeFields",
permissionHandlers.updatePostHandler, permissionHandlers.updatePostHandler,
handler_doGetOccupancyTypeFields); handler_doGetOccupancyTypeFields
);
router.post("/doCreateLotOccupancy", router.post(
"/doCreateLotOccupancy",
permissionHandlers.updatePostHandler, permissionHandlers.updatePostHandler,
handler_doCreateLotOccupancy); handler_doCreateLotOccupancy
);
// View // View
router.get("/:lotOccupancyId", router.get("/:lotOccupancyId", handler_view);
handler_view);
router.get("/:lotOccupancyId/print", router.get("/:lotOccupancyId/print", handler_print);
handler_print);
// Edit // Edit
router.get("/:lotOccupancyId/edit", router.get(
"/:lotOccupancyId/edit",
permissionHandlers.updateGetHandler, permissionHandlers.updateGetHandler,
handler_edit); handler_edit
);
router.post("/doUpdateLotOccupancy", router.post(
"/doUpdateLotOccupancy",
permissionHandlers.updatePostHandler, permissionHandlers.updatePostHandler,
handler_doUpdateLotOccupancy); handler_doUpdateLotOccupancy
);
router.post("/doDeleteLotOccupancy", router.post(
"/doDeleteLotOccupancy",
permissionHandlers.updatePostHandler, permissionHandlers.updatePostHandler,
handler_doDeleteLotOccupancy); handler_doDeleteLotOccupancy
);
// Occupants // Occupants
router.post("/doAddLotOccupancyOccupant", router.post(
"/doAddLotOccupancyOccupant",
permissionHandlers.updatePostHandler, permissionHandlers.updatePostHandler,
handler_doAddLotOccupancyOccupant); handler_doAddLotOccupancyOccupant
);
router.post("/doUpdateLotOccupancyOccupant", router.post(
"/doUpdateLotOccupancyOccupant",
permissionHandlers.updatePostHandler, permissionHandlers.updatePostHandler,
handler_doUpdateLotOccupancyOccupant); handler_doUpdateLotOccupancyOccupant
);
router.post("/doDeleteLotOccupancyOccupant", router.post(
"/doDeleteLotOccupancyOccupant",
permissionHandlers.updatePostHandler, permissionHandlers.updatePostHandler,
handler_doDeleteLotOccupancyOccupant); handler_doDeleteLotOccupancyOccupant
);
// Comments // Comments
router.post("/doAddLotOccupancyComment", router.post(
"/doAddLotOccupancyComment",
permissionHandlers.updatePostHandler, permissionHandlers.updatePostHandler,
handler_doAddLotOccupancyComment); handler_doAddLotOccupancyComment
);
router.post("/doUpdateLotOccupancyComment", router.post(
"/doUpdateLotOccupancyComment",
permissionHandlers.updatePostHandler, permissionHandlers.updatePostHandler,
handler_doUpdateLotOccupancyComment); handler_doUpdateLotOccupancyComment
);
router.post("/doDeleteLotOccupancyComment", router.post(
"/doDeleteLotOccupancyComment",
permissionHandlers.updatePostHandler, permissionHandlers.updatePostHandler,
handler_doDeleteLotOccupancyComment); handler_doDeleteLotOccupancyComment
);
// Fees // Fees
router.post("/doGetFees", router.post(
"/doGetFees",
permissionHandlers.updatePostHandler, permissionHandlers.updatePostHandler,
handler_doGetFees); handler_doGetFees
);
router.post("/doAddLotOccupancyFee", router.post(
"/doAddLotOccupancyFee",
permissionHandlers.updatePostHandler, permissionHandlers.updatePostHandler,
handler_doAddLotOccupancyFee); handler_doAddLotOccupancyFee
);
router.post("/doDeleteLotOccupancyFee", router.post(
"/doDeleteLotOccupancyFee",
permissionHandlers.updatePostHandler, permissionHandlers.updatePostHandler,
handler_doDeleteLotOccupancyFee); handler_doDeleteLotOccupancyFee
);
// Transactions // Transactions
router.post("/doAddLotOccupancyTransaction", router.post(
"/doAddLotOccupancyTransaction",
permissionHandlers.updatePostHandler, permissionHandlers.updatePostHandler,
handler_doAddLotOccupancyTransaction); handler_doAddLotOccupancyTransaction
);
router.post("/doDeleteLotOccupancyTransaction", router.post(
"/doDeleteLotOccupancyTransaction",
permissionHandlers.updatePostHandler, permissionHandlers.updatePostHandler,
handler_doDeleteLotOccupancyTransaction); handler_doDeleteLotOccupancyTransaction
);
export default router; export default router;

View File

@ -19,72 +19,58 @@ import handler_doAddLotComment from "../handlers/lots-post/doAddLotComment.js";
import handler_doUpdateLotComment from "../handlers/lots-post/doUpdateLotComment.js"; import handler_doUpdateLotComment from "../handlers/lots-post/doUpdateLotComment.js";
import handler_doDeleteLotComment from "../handlers/lots-post/doDeleteLotComment.js"; import handler_doDeleteLotComment from "../handlers/lots-post/doDeleteLotComment.js";
export const router = Router(); export const router = Router();
/* /*
* Lot Search * Lot Search
*/ */
router.get("/", handler_search);
router.get("/", router.post("/doSearchLots", handler_doSearchLots);
handler_search);
router.post("/doSearchLots",
handler_doSearchLots);
/* /*
* Lot View / Edit * Lot View / Edit
*/ */
router.get("/new", permissionHandlers.updateGetHandler, handler_new);
router.get("/new", router.get("/:lotId", handler_view);
permissionHandlers.updateGetHandler,
handler_new);
router.get("/:lotId/next", handler_next);
router.get("/:lotId", router.get("/:lotId/previous", handler_previous);
handler_view);
router.get("/:lotId/edit", permissionHandlers.updateGetHandler, handler_edit);
router.get("/:lotId/next", router.post(
handler_next); "/doCreateLot",
router.get("/:lotId/previous",
handler_previous);
router.get("/:lotId/edit",
permissionHandlers.updateGetHandler,
handler_edit);
router.post("/doCreateLot",
permissionHandlers.updatePostHandler, permissionHandlers.updatePostHandler,
handler_doCreateLot); handler_doCreateLot
);
router.post(
router.post("/doUpdateLot", "/doUpdateLot",
permissionHandlers.updatePostHandler, permissionHandlers.updatePostHandler,
handler_doUpdateLot); handler_doUpdateLot
);
router.post(
router.post("/doAddLotComment", "/doAddLotComment",
permissionHandlers.updatePostHandler, permissionHandlers.updatePostHandler,
handler_doAddLotComment); handler_doAddLotComment
);
router.post(
router.post("/doUpdateLotComment", "/doUpdateLotComment",
permissionHandlers.updatePostHandler, permissionHandlers.updatePostHandler,
handler_doUpdateLotComment); handler_doUpdateLotComment
);
router.post(
router.post("/doDeleteLotComment", "/doDeleteLotComment",
permissionHandlers.updatePostHandler, permissionHandlers.updatePostHandler,
handler_doDeleteLotComment); handler_doDeleteLotComment
);
export default router; export default router;

View File

@ -1,6 +1,4 @@
import { import { Router } from "express";
Router
} from "express";
import * as permissionHandlers from "../handlers/permissions.js"; import * as permissionHandlers from "../handlers/permissions.js";
@ -14,41 +12,32 @@ import handler_doCreateMap from "../handlers/maps-post/doCreateMap.js";
import handler_doUpdateMap from "../handlers/maps-post/doUpdateMap.js"; import handler_doUpdateMap from "../handlers/maps-post/doUpdateMap.js";
import handler_doDeleteMap from "../handlers/maps-post/doDeleteMap.js"; import handler_doDeleteMap from "../handlers/maps-post/doDeleteMap.js";
export const router = Router(); export const router = Router();
router.get("/", handler_search);
router.get("/", router.get("/new", permissionHandlers.updateGetHandler, handler_new);
handler_search);
router.get("/:mapId", handler_view);
router.get("/new", router.get("/:mapId/edit", permissionHandlers.updateGetHandler, handler_edit);
permissionHandlers.updateGetHandler,
handler_new);
router.post(
router.get("/:mapId", "/doCreateMap",
handler_view);
router.get("/:mapId/edit",
permissionHandlers.updateGetHandler,
handler_edit);
router.post("/doCreateMap",
permissionHandlers.updatePostHandler, permissionHandlers.updatePostHandler,
handler_doCreateMap); handler_doCreateMap
);
router.post(
router.post("/doUpdateMap", "/doUpdateMap",
permissionHandlers.updatePostHandler, permissionHandlers.updatePostHandler,
handler_doUpdateMap); handler_doUpdateMap
);
router.post(
router.post("/doDeleteMap", "/doDeleteMap",
permissionHandlers.updatePostHandler, permissionHandlers.updatePostHandler,
handler_doDeleteMap); handler_doDeleteMap
);
export default router; export default router;

View File

@ -4,23 +4,17 @@ import handler_reportName from "../handlers/reports-get/reportName.js";
import * as dateTimeFns from "@cityssm/expressjs-server-js/dateTimeFns.js"; import * as dateTimeFns from "@cityssm/expressjs-server-js/dateTimeFns.js";
export const router = Router(); export const router = Router();
router.get("/", (_request, response) => { router.get("/", (_request, response) => {
const rightNow = new Date(); const rightNow = new Date();
response.render("report-search", { response.render("report-search", {
headTitle: "Reports", headTitle: "Reports",
todayDateString: dateTimeFns.dateToString(rightNow) todayDateString: dateTimeFns.dateToString(rightNow)
}); });
}); });
router.all("/:reportName", handler_reportName); router.all("/:reportName", handler_reportName);
export default router; export default router;

View File

@ -1,6 +1,4 @@
import { import { Router } from "express";
Router
} from "express";
import * as permissionHandlers from "../handlers/permissions.js"; import * as permissionHandlers from "../handlers/permissions.js";
import * as configFunctions from "../helpers/functions.config.js"; import * as configFunctions from "../helpers/functions.config.js";
@ -10,20 +8,12 @@ import handler_doSearchWorkOrders from "../handlers/workOrders-post/doSearchWork
import handler_view from "../handlers/workOrders-get/view.js"; import handler_view from "../handlers/workOrders-get/view.js";
export const router = Router(); export const router = Router();
router.get("/", handler_search);
router.get("/", router.post("/doSearchWorkOrders", handler_doSearchWorkOrders);
handler_search);
router.post("/doSearchWorkOrders",
handler_doSearchWorkOrders);
router.get("/:workOrderId",
handler_view);
router.get("/:workOrderId", handler_view);
export default router; export default router;

View File

@ -42,13 +42,17 @@ function purgeTables() {
database.prepare("delete from LotOccupancies").run(); database.prepare("delete from LotOccupancies").run();
database.prepare("delete from LotComments").run(); database.prepare("delete from LotComments").run();
database.prepare("delete from Lots").run(); database.prepare("delete from Lots").run();
database.prepare("delete from sqlite_sequence where name in ('Lots', 'LotComments', 'LotOccupancies', 'LotOccupancyComments', 'WorkOrders', 'WorkOrderComments')").run(); database
.prepare("delete from sqlite_sequence where name in ('Lots', 'LotComments', 'LotOccupancies', 'LotOccupancyComments', 'WorkOrders', 'WorkOrderComments')")
.run();
database.close(); database.close();
} }
function purgeConfigTables() { function purgeConfigTables() {
const database = sqlite(databasePath); const database = sqlite(databasePath);
database.prepare("delete from Maps").run(); database.prepare("delete from Maps").run();
database.prepare("delete from sqlite_sequence where name in ('Maps')").run(); database
.prepare("delete from sqlite_sequence where name in ('Maps')")
.run();
database.close(); database.close();
} }
function getMapByMapDescription(mapDescription) { function getMapByMapDescription(mapDescription) {
@ -56,29 +60,30 @@ function getMapByMapDescription(mapDescription) {
readonly: true readonly: true
}); });
const map = database const map = database
.prepare("select * from Maps" + .prepare("select * from Maps" + " where mapDescription = ?")
" where mapDescription = ?")
.get(mapDescription); .get(mapDescription);
database.close(); database.close();
return map; return map;
} }
function formatDateString(year, month, day) { function formatDateString(year, month, day) {
return ("0000" + year).slice(-4) + "-" + return (("0000" + year).slice(-4) +
("00" + month).slice(-2) + "-" + "-" +
("00" + day).slice(-2); ("00" + month).slice(-2) +
"-" +
("00" + day).slice(-2));
} }
const cemeteryToMapName = { const cemeteryToMapName = {
"00": "Crematorium", "00": "Crematorium",
"GC": "New Greenwood - Columbarium", GC: "New Greenwood - Columbarium",
"HC": "Holy Sepulchre - Columbarium", HC: "Holy Sepulchre - Columbarium",
"HS": "Holy Sepulchre", HS: "Holy Sepulchre",
"MA": "Holy Sepulchre - Mausoleum", MA: "Holy Sepulchre - Mausoleum",
"NG": "New Greenwood", NG: "New Greenwood",
"NW": "Niche Wall", NW: "Niche Wall",
"OG": "Old Greenwood", OG: "Old Greenwood",
"PG": "Pine Grove", PG: "Pine Grove",
"UG": "New Greenwood - Urn Garden", UG: "New Greenwood - Urn Garden",
"WK": "West Korah" WK: "West Korah"
}; };
const mapCache = new Map(); const mapCache = new Map();
function getMap(dataRow) { function getMap(dataRow) {
@ -125,16 +130,19 @@ function getFeeIdByFeeDescription(feeDescription) {
return feeCache.get(feeDescription); return feeCache.get(feeDescription);
} }
function buildLotName(lotNamePieces) { function buildLotName(lotNamePieces) {
return lotNamePieces.cemetery + "-" + return (lotNamePieces.cemetery +
"-" +
(lotNamePieces.block === "" ? "" : lotNamePieces.block + "-") + (lotNamePieces.block === "" ? "" : lotNamePieces.block + "-") +
(lotNamePieces.range1 === "0" && lotNamePieces.range2 === "" ? (lotNamePieces.range1 === "0" && lotNamePieces.range2 === ""
"" : ? ""
(lotNamePieces.range1 + lotNamePieces.range2) + "-") + : lotNamePieces.range1 + lotNamePieces.range2 + "-") +
(lotNamePieces.lot1 === "0" && lotNamePieces.lot2 === "" ? (lotNamePieces.lot1 === "0" && lotNamePieces.lot2 === ""
"" : ? ""
lotNamePieces.lot1 + lotNamePieces.lot2 + "-") + : lotNamePieces.lot1 + lotNamePieces.lot2 + "-") +
lotNamePieces.grave1 + lotNamePieces.grave2 + "-" + lotNamePieces.grave1 +
lotNamePieces.interment; lotNamePieces.grave2 +
"-" +
lotNamePieces.interment);
} }
const casketLotType = cacheFunctions.getLotTypesByLotType("Casket Grave"); const casketLotType = cacheFunctions.getLotTypesByLotType("Casket Grave");
const columbariumLotType = cacheFunctions.getLotTypesByLotType("Columbarium"); const columbariumLotType = cacheFunctions.getLotTypesByLotType("Columbarium");
@ -219,16 +227,21 @@ function importFromMasterCSV() {
if (masterRow.CM_PRENEED_ORDER) { if (masterRow.CM_PRENEED_ORDER) {
preneedOccupancyStartDateString = formatDateString(masterRow.CM_PURCHASE_YR, masterRow.CM_PURCHASE_MON, masterRow.CM_PURCHASE_DAY); preneedOccupancyStartDateString = formatDateString(masterRow.CM_PURCHASE_YR, masterRow.CM_PURCHASE_MON, masterRow.CM_PURCHASE_DAY);
let occupancyEndDateString = ""; let occupancyEndDateString = "";
if (masterRow.CM_INTERMENT_YR !== "" && masterRow.CM_INTERMENT_YR !== "0") { if (masterRow.CM_INTERMENT_YR !== "" &&
masterRow.CM_INTERMENT_YR !== "0") {
occupancyEndDateString = formatDateString(masterRow.CM_INTERMENT_YR, masterRow.CM_INTERMENT_MON, masterRow.CM_INTERMENT_DAY); occupancyEndDateString = formatDateString(masterRow.CM_INTERMENT_YR, masterRow.CM_INTERMENT_MON, masterRow.CM_INTERMENT_DAY);
} }
if (preneedOccupancyStartDateString === "0000-00-00" && occupancyEndDateString !== "") { if (preneedOccupancyStartDateString === "0000-00-00" &&
occupancyEndDateString !== "") {
preneedOccupancyStartDateString = occupancyEndDateString; preneedOccupancyStartDateString = occupancyEndDateString;
} }
if (preneedOccupancyStartDateString === "0000-00-00" && masterRow.CM_DEATH_YR !== "" && masterRow.CM_DEATH_YR !== "0") { if (preneedOccupancyStartDateString === "0000-00-00" &&
masterRow.CM_DEATH_YR !== "" &&
masterRow.CM_DEATH_YR !== "0") {
preneedOccupancyStartDateString = formatDateString(masterRow.CM_DEATH_YR, masterRow.CM_DEATH_MON, masterRow.CM_DEATH_DAY); preneedOccupancyStartDateString = formatDateString(masterRow.CM_DEATH_YR, masterRow.CM_DEATH_MON, masterRow.CM_DEATH_DAY);
} }
if (preneedOccupancyStartDateString === "" || preneedOccupancyStartDateString === "0000-00-00") { if (preneedOccupancyStartDateString === "" ||
preneedOccupancyStartDateString === "0000-00-00") {
preneedOccupancyStartDateString = "0001-01-01"; preneedOccupancyStartDateString = "0001-01-01";
} }
preneedLotOccupancyId = addLotOccupancy({ preneedLotOccupancyId = addLotOccupancy({
@ -238,7 +251,9 @@ function importFromMasterCSV() {
occupancyEndDateString, occupancyEndDateString,
occupancyTypeFieldIds: "" occupancyTypeFieldIds: ""
}, user); }, user);
const occupantPostalCode = ((masterRow.CM_POST1 || "") + " " + (masterRow.CM_POST2 || "")).trim(); const occupantPostalCode = ((masterRow.CM_POST1 || "") +
" " +
(masterRow.CM_POST2 || "")).trim();
addLotOccupancyOccupant({ addLotOccupancyOccupant({
lotOccupancyId: preneedLotOccupancyId, lotOccupancyId: preneedLotOccupancyId,
lotOccupantTypeId: preneedOwnerLotOccupantType.lotOccupantTypeId, lotOccupantTypeId: preneedOwnerLotOccupantType.lotOccupantTypeId,
@ -275,20 +290,27 @@ function importFromMasterCSV() {
if (masterRow.CM_DECEASED_NAME) { if (masterRow.CM_DECEASED_NAME) {
deceasedOccupancyStartDateString = formatDateString(masterRow.CM_INTERMENT_YR, masterRow.CM_INTERMENT_MON, masterRow.CM_INTERMENT_DAY); deceasedOccupancyStartDateString = formatDateString(masterRow.CM_INTERMENT_YR, masterRow.CM_INTERMENT_MON, masterRow.CM_INTERMENT_DAY);
const occupancyEndDateString = ""; const occupancyEndDateString = "";
if (deceasedOccupancyStartDateString === "0000-00-00" && masterRow.CM_DEATH_YR !== "" && masterRow.CM_DEATH_YR !== "0") { if (deceasedOccupancyStartDateString === "0000-00-00" &&
masterRow.CM_DEATH_YR !== "" &&
masterRow.CM_DEATH_YR !== "0") {
deceasedOccupancyStartDateString = formatDateString(masterRow.CM_DEATH_YR, masterRow.CM_DEATH_MON, masterRow.CM_DEATH_DAY); deceasedOccupancyStartDateString = formatDateString(masterRow.CM_DEATH_YR, masterRow.CM_DEATH_MON, masterRow.CM_DEATH_DAY);
} }
if (deceasedOccupancyStartDateString === "" || deceasedOccupancyStartDateString === "0000-00-00") { if (deceasedOccupancyStartDateString === "" ||
deceasedOccupancyStartDateString === "0000-00-00") {
deceasedOccupancyStartDateString = "0001-01-01"; deceasedOccupancyStartDateString = "0001-01-01";
} }
deceasedLotOccupancyId = addLotOccupancy({ deceasedLotOccupancyId = addLotOccupancy({
occupancyTypeId: lotId ? deceasedOccupancyType.occupancyTypeId : cremationOccupancyType.occupancyTypeId, occupancyTypeId: lotId
? deceasedOccupancyType.occupancyTypeId
: cremationOccupancyType.occupancyTypeId,
lotId, lotId,
occupancyStartDateString: deceasedOccupancyStartDateString, occupancyStartDateString: deceasedOccupancyStartDateString,
occupancyEndDateString, occupancyEndDateString,
occupancyTypeFieldIds: "" occupancyTypeFieldIds: ""
}, user); }, user);
const deceasedPostalCode = ((masterRow.CM_POST1 || "") + " " + (masterRow.CM_POST2 || "")).trim(); const deceasedPostalCode = ((masterRow.CM_POST1 || "") +
" " +
(masterRow.CM_POST2 || "")).trim();
addLotOccupancyOccupant({ addLotOccupancyOccupant({
lotOccupancyId: deceasedLotOccupancyId, lotOccupancyId: deceasedLotOccupancyId,
lotOccupantTypeId: deceasedLotOccupantType.lotOccupantTypeId, lotOccupantTypeId: deceasedLotOccupantType.lotOccupantTypeId,
@ -305,7 +327,8 @@ function importFromMasterCSV() {
addOrUpdateLotOccupancyField({ addOrUpdateLotOccupancyField({
lotOccupancyId: deceasedLotOccupancyId, lotOccupancyId: deceasedLotOccupancyId,
occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => { occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => {
return occupancyTypeField.occupancyTypeField === "Death Date"; return (occupancyTypeField.occupancyTypeField ===
"Death Date");
}).occupancyTypeFieldId, }).occupancyTypeFieldId,
lotOccupancyFieldValue lotOccupancyFieldValue
}, user); }, user);
@ -314,7 +337,8 @@ function importFromMasterCSV() {
addOrUpdateLotOccupancyField({ addOrUpdateLotOccupancyField({
lotOccupancyId: deceasedLotOccupancyId, lotOccupancyId: deceasedLotOccupancyId,
occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => { occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => {
return occupancyTypeField.occupancyTypeField === "Death Age"; return (occupancyTypeField.occupancyTypeField ===
"Death Age");
}).occupancyTypeFieldId, }).occupancyTypeFieldId,
lotOccupancyFieldValue: masterRow.CM_AGE lotOccupancyFieldValue: masterRow.CM_AGE
}, user); }, user);
@ -323,7 +347,8 @@ function importFromMasterCSV() {
addOrUpdateLotOccupancyField({ addOrUpdateLotOccupancyField({
lotOccupancyId: deceasedLotOccupancyId, lotOccupancyId: deceasedLotOccupancyId,
occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => { occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => {
return occupancyTypeField.occupancyTypeField === "Death Age Period"; return (occupancyTypeField.occupancyTypeField ===
"Death Age Period");
}).occupancyTypeFieldId, }).occupancyTypeFieldId,
lotOccupancyFieldValue: masterRow.CM_PERIOD lotOccupancyFieldValue: masterRow.CM_PERIOD
}, user); }, user);
@ -332,7 +357,8 @@ function importFromMasterCSV() {
addOrUpdateLotOccupancyField({ addOrUpdateLotOccupancyField({
lotOccupancyId: deceasedLotOccupancyId, lotOccupancyId: deceasedLotOccupancyId,
occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => { occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => {
return occupancyTypeField.occupancyTypeField === "Funeral Home"; return (occupancyTypeField.occupancyTypeField ===
"Funeral Home");
}).occupancyTypeFieldId, }).occupancyTypeFieldId,
lotOccupancyFieldValue: masterRow.CM_FUNERAL_HOME lotOccupancyFieldValue: masterRow.CM_FUNERAL_HOME
}, user); }, user);
@ -342,7 +368,8 @@ function importFromMasterCSV() {
addOrUpdateLotOccupancyField({ addOrUpdateLotOccupancyField({
lotOccupancyId: deceasedLotOccupancyId, lotOccupancyId: deceasedLotOccupancyId,
occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => { occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => {
return occupancyTypeField.occupancyTypeField === "Funeral Date"; return (occupancyTypeField.occupancyTypeField ===
"Funeral Date");
}).occupancyTypeFieldId, }).occupancyTypeFieldId,
lotOccupancyFieldValue lotOccupancyFieldValue
}, user); }, user);
@ -351,7 +378,8 @@ function importFromMasterCSV() {
addOrUpdateLotOccupancyField({ addOrUpdateLotOccupancyField({
lotOccupancyId: deceasedLotOccupancyId, lotOccupancyId: deceasedLotOccupancyId,
occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => { occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => {
return occupancyTypeField.occupancyTypeField === "Container Type"; return (occupancyTypeField.occupancyTypeField ===
"Container Type");
}).occupancyTypeFieldId, }).occupancyTypeFieldId,
lotOccupancyFieldValue: masterRow.CM_CONTAINER_TYPE lotOccupancyFieldValue: masterRow.CM_CONTAINER_TYPE
}, user); }, user);
@ -364,7 +392,8 @@ function importFromMasterCSV() {
addOrUpdateLotOccupancyField({ addOrUpdateLotOccupancyField({
lotOccupancyId: deceasedLotOccupancyId, lotOccupancyId: deceasedLotOccupancyId,
occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => { occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => {
return occupancyTypeField.occupancyTypeField === "Committal Type"; return (occupancyTypeField.occupancyTypeField ===
"Committal Type");
}).occupancyTypeFieldId, }).occupancyTypeFieldId,
lotOccupancyFieldValue: commitalType lotOccupancyFieldValue: commitalType
}, user); }, user);
@ -392,7 +421,8 @@ function importFromMasterCSV() {
workOrderNumber: masterRow.CM_WORK_ORDER, workOrderNumber: masterRow.CM_WORK_ORDER,
workOrderTypeId: 1, workOrderTypeId: 1,
workOrderDescription: "", workOrderDescription: "",
workOrderOpenDateString: deceasedOccupancyStartDateString || preneedOccupancyStartDateString workOrderOpenDateString: deceasedOccupancyStartDateString ||
preneedOccupancyStartDateString
}, user); }, user);
if (lotId) { if (lotId) {
addWorkOrderLot({ addWorkOrderLot({
@ -499,7 +529,8 @@ function importFromPrepaidCSV() {
offset: 0 offset: 0
}); });
if (possibleLotOccupancies.lotOccupancies.length > 0) { if (possibleLotOccupancies.lotOccupancies.length > 0) {
lotOccupancyId = possibleLotOccupancies.lotOccupancies[0].lotOccupancyId; lotOccupancyId =
possibleLotOccupancies.lotOccupancies[0].lotOccupancyId;
} }
} }
if (!lotOccupancyId) { if (!lotOccupancyId) {
@ -597,7 +628,8 @@ function importFromPrepaidCSV() {
taxAmount: prepaidRow.CMPP_GST_NICHE taxAmount: prepaidRow.CMPP_GST_NICHE
}, user); }, user);
} }
if (prepaidRow.CMPP_FEE_DISINTERMENT !== "0.0" && prepaidRow.CMPP_FEE_DISINTERMENT !== "20202.02") { if (prepaidRow.CMPP_FEE_DISINTERMENT !== "0.0" &&
prepaidRow.CMPP_FEE_DISINTERMENT !== "20202.02") {
addLotOccupancyFee({ addLotOccupancyFee({
lotOccupancyId, lotOccupancyId,
feeId: getFeeIdByFeeDescription("CMPP_FEE_DISINTERMENT"), feeId: getFeeIdByFeeDescription("CMPP_FEE_DISINTERMENT"),
@ -620,8 +652,12 @@ function importFromPrepaidCSV() {
Number.parseFloat(prepaidRow.CMPP_GST_CREM) + Number.parseFloat(prepaidRow.CMPP_GST_CREM) +
Number.parseFloat(prepaidRow.CMPP_FEE_NICHE) + Number.parseFloat(prepaidRow.CMPP_FEE_NICHE) +
Number.parseFloat(prepaidRow.CMPP_GST_NICHE) + Number.parseFloat(prepaidRow.CMPP_GST_NICHE) +
Number.parseFloat(prepaidRow.CMPP_FEE_DISINTERMENT === "20202.02" ? "0" : prepaidRow.CMPP_FEE_DISINTERMENT) + Number.parseFloat(prepaidRow.CMPP_FEE_DISINTERMENT === "20202.02"
Number.parseFloat(prepaidRow.CMPP_GST_DISINTERMENT === "20202.02" ? "0" : prepaidRow.CMPP_GST_DISINTERMENT); ? "0"
: prepaidRow.CMPP_FEE_DISINTERMENT) +
Number.parseFloat(prepaidRow.CMPP_GST_DISINTERMENT === "20202.02"
? "0"
: prepaidRow.CMPP_GST_DISINTERMENT);
addLotOccupancyTransaction({ addLotOccupancyTransaction({
lotOccupancyId, lotOccupancyId,
externalReceiptNumber: prepaidRow.CMPP_ORDER_NO, externalReceiptNumber: prepaidRow.CMPP_ORDER_NO,

File diff suppressed because it is too large Load Diff

View File

@ -25,7 +25,8 @@ describe("lot-occupancy-system", () => {
describe("Cypress tests", () => { describe("Cypress tests", () => {
it("should run Cypress tests", (done) => { it("should run Cypress tests", (done) => {
let cypressCommand = "cypress run --config-file cypress.config.ts --browser chrome"; let cypressCommand = "cypress run --config-file cypress.config.ts --browser chrome";
if (process.env.CYPRESS_RECORD_KEY && process.env.CYPRESS_RECORD_KEY !== "") { if (process.env.CYPRESS_RECORD_KEY &&
process.env.CYPRESS_RECORD_KEY !== "") {
cypressCommand += " --record"; cypressCommand += " --record";
} }
const childProcess = exec(cypressCommand); const childProcess = exec(cypressCommand);

View File

@ -2,28 +2,19 @@
import * as assert from "assert"; import * as assert from "assert";
import { import { portNumber } from "./_globals.js";
portNumber
} from "./_globals.js";
import { import { exec } from "child_process";
exec
} from "child_process";
import * as http from "http"; import * as http from "http";
import { import { app } from "../app.js";
app
} from "../app.js";
describe("lot-occupancy-system", () => { describe("lot-occupancy-system", () => {
const httpServer = http.createServer(app); const httpServer = http.createServer(app);
let serverStarted = false; let serverStarted = false;
before(() => { before(() => {
httpServer.listen(portNumber); httpServer.listen(portNumber);
httpServer.on("listening", () => { httpServer.on("listening", () => {
@ -44,12 +35,14 @@ describe("lot-occupancy-system", () => {
}); });
describe("Cypress tests", () => { describe("Cypress tests", () => {
it("should run Cypress tests", (done) => { it("should run Cypress tests", (done) => {
let cypressCommand =
"cypress run --config-file cypress.config.ts --browser chrome";
let cypressCommand = "cypress run --config-file cypress.config.ts --browser chrome"; if (
process.env.CYPRESS_RECORD_KEY &&
if (process.env.CYPRESS_RECORD_KEY && process.env.CYPRESS_RECORD_KEY !== "") { process.env.CYPRESS_RECORD_KEY !== ""
) {
cypressCommand += " --record"; cypressCommand += " --record";
} }

View File

@ -1,20 +1,13 @@
import type { import type { Request } from "express";
Request
} from "express";
import type {
Session
} from "express-session";
import type { Session } from "express-session";
export const testView = "*testView"; export const testView = "*testView";
export const testUpdate = "*testUpdate"; export const testUpdate = "*testUpdate";
export const testAdmin = "*testAdmin"; export const testAdmin = "*testAdmin";
export const portNumber = 7000; export const portNumber = 7000;
export const fakeViewOnlySession: Session = { export const fakeViewOnlySession: Session = {
id: "", id: "",
cookie: undefined, cookie: undefined,
@ -27,7 +20,6 @@ export const fakeViewOnlySession: Session = {
user: undefined user: undefined
}; };
export const fakeAdminSession: Session = { export const fakeAdminSession: Session = {
id: "", id: "",
cookie: undefined, cookie: undefined,
@ -40,7 +32,6 @@ export const fakeAdminSession: Session = {
user: undefined user: undefined
}; };
export const fakeRequest: Request = { export const fakeRequest: Request = {
// eslint-disable-next-line @typescript-eslint/no-empty-function // eslint-disable-next-line @typescript-eslint/no-empty-function
async *[Symbol.asyncIterator]() {}, async *[Symbol.asyncIterator]() {},
@ -132,14 +123,10 @@ export const fakeRequest: Request = {
xhr: undefined xhr: undefined
}; };
export const fakeViewOnlyRequest = Object.assign({}, fakeRequest, {
export const fakeViewOnlyRequest =
Object.assign({}, fakeRequest, {
session: fakeViewOnlySession session: fakeViewOnlySession
}); });
export const fakeAdminRequest = Object.assign({}, fakeRequest, {
export const fakeAdminRequest =
Object.assign({}, fakeRequest, {
session: fakeAdminSession session: fakeAdminSession
}); });

View File

@ -2,13 +2,9 @@ import * as assert from "assert";
import fs from "fs"; import fs from "fs";
import { import { version } from "../version.js";
version
} from "../version.js";
describe("version", () => { describe("version", () => {
it("has a version that matches the package.json", () => { it("has a version that matches the package.json", () => {
const packageJSON = JSON.parse(fs.readFileSync("package.json", "utf8")); const packageJSON = JSON.parse(fs.readFileSync("package.json", "utf8"));
assert.strictEqual(version, packageJSON.version); assert.strictEqual(version, packageJSON.version);

View File

@ -54,7 +54,6 @@ interface ConfigApplication {
useTestDatabases?: boolean; useTestDatabases?: boolean;
} }
interface ConfigSession { interface ConfigSession {
cookieName?: string; cookieName?: string;
secret?: string; secret?: string;
@ -62,7 +61,6 @@ interface ConfigSession {
doKeepAlive?: boolean; doKeepAlive?: boolean;
} }
export interface ConfigActiveDirectory { export interface ConfigActiveDirectory {
url: string; url: string;
baseDN: string; baseDN: string;

View File

@ -1,2 +1 @@
"use strict"; export {};
Object.defineProperty(exports, "__esModule", { value: true });

View File

@ -1,5 +1,9 @@
export interface LOS { export interface LOS {
highlightMap: (mapContainerElement: HTMLElement, mapKey: string, contextualClass: "success" | "danger") => void; highlightMap: (
mapContainerElement: HTMLElement,
mapKey: string,
contextualClass: "success" | "danger"
) => void;
initializeUnlockFieldButtons: (containerElement: HTMLElement) => void; initializeUnlockFieldButtons: (containerElement: HTMLElement) => void;
populateAliases: (containerElement: HTMLElement) => void; populateAliases: (containerElement: HTMLElement) => void;
} }

View File

@ -1,2 +1 @@
"use strict"; export {};
Object.defineProperty(exports, "__esModule", { value: true });

View File

@ -13,12 +13,10 @@ export interface Record {
recordDelete_dateString?: string; recordDelete_dateString?: string;
} }
/* /*
* LOT OCCUPANCY DB TYPES * LOT OCCUPANCY DB TYPES
*/ */
export interface Map extends Record { export interface Map extends Record {
mapId?: number; mapId?: number;
mapName?: string; mapName?: string;
@ -38,7 +36,6 @@ export interface Map extends Record {
lotCount?: number; lotCount?: number;
} }
export interface LotType extends Record { export interface LotType extends Record {
lotTypeId?: number; lotTypeId?: number;
lotType?: string; lotType?: string;
@ -46,7 +43,6 @@ export interface LotType extends Record {
lotTypeFields?: LotTypeField[]; lotTypeFields?: LotTypeField[];
} }
export interface LotTypeField extends Record { export interface LotTypeField extends Record {
lotTypeFieldId?: number; lotTypeFieldId?: number;
lotTypeField?: string; lotTypeField?: string;
@ -63,14 +59,12 @@ export interface LotTypeField extends Record {
orderNumber?: number; orderNumber?: number;
} }
export interface LotStatus extends Record { export interface LotStatus extends Record {
lotStatusId?: number; lotStatusId?: number;
lotStatus?: string; lotStatus?: string;
orderNumber?: number; orderNumber?: number;
} }
export interface Lot extends Record { export interface Lot extends Record {
lotId?: number; lotId?: number;
lotName?: string; lotName?: string;
@ -96,7 +90,6 @@ export interface Lot extends Record {
lotComments?: LotComment[]; lotComments?: LotComment[];
} }
export interface LotComment extends Record { export interface LotComment extends Record {
lotCommentId?: number; lotCommentId?: number;
lotId?: number; lotId?: number;
@ -110,7 +103,6 @@ export interface LotComment extends Record {
lotComment?: string; lotComment?: string;
} }
export interface OccupancyType extends Record { export interface OccupancyType extends Record {
occupancyTypeId?: number; occupancyTypeId?: number;
occupancyType?: string; occupancyType?: string;
@ -118,7 +110,6 @@ export interface OccupancyType extends Record {
occupancyTypeFields?: OccupancyTypeField[]; occupancyTypeFields?: OccupancyTypeField[];
} }
export interface OccupancyTypeField { export interface OccupancyTypeField {
occupancyTypeFieldId?: number; occupancyTypeFieldId?: number;
occupancyTypeId?: number; occupancyTypeId?: number;
@ -131,14 +122,12 @@ export interface OccupancyTypeField {
orderNumber?: number; orderNumber?: number;
} }
export interface LotOccupantType extends Record { export interface LotOccupantType extends Record {
lotOccupantTypeId?: number; lotOccupantTypeId?: number;
lotOccupantType?: string; lotOccupantType?: string;
orderNumber?: number; orderNumber?: number;
} }
export interface FeeCategory extends Record { export interface FeeCategory extends Record {
feeCategoryId?: number; feeCategoryId?: number;
feeCategory?: string; feeCategory?: string;
@ -146,7 +135,6 @@ export interface FeeCategory extends Record {
orderNumber?: number; orderNumber?: number;
} }
export interface Fee extends Record { export interface Fee extends Record {
feeId?: number; feeId?: number;
@ -176,7 +164,6 @@ export interface Fee extends Record {
orderNumber?: number; orderNumber?: number;
} }
export interface LotOccupancyFee extends Fee, Record { export interface LotOccupancyFee extends Fee, Record {
lotOccupancyId?: number; lotOccupancyId?: number;
@ -188,7 +175,6 @@ export interface LotOccupancyFee extends Fee, Record {
taxAmount?: number; taxAmount?: number;
} }
export interface LotOccupancyTransaction extends Record { export interface LotOccupancyTransaction extends Record {
lotOccupancyId?: number; lotOccupancyId?: number;
transactionIndex?: number; transactionIndex?: number;
@ -201,7 +187,6 @@ export interface LotOccupancyTransaction extends Record {
transactionNote?: string; transactionNote?: string;
} }
export interface LotOccupancyOccupant extends Record { export interface LotOccupancyOccupant extends Record {
lotOccupancyId?: number; lotOccupancyId?: number;
lotOccupantIndex?: number; lotOccupantIndex?: number;
@ -218,7 +203,6 @@ export interface LotOccupancyOccupant extends Record {
occupantPhoneNumber?: string; occupantPhoneNumber?: string;
} }
export interface LotOccupancyComment extends Record { export interface LotOccupancyComment extends Record {
lotOccupancyCommentId?: number; lotOccupancyCommentId?: number;
lotOccupancyId?: number; lotOccupancyId?: number;
@ -232,14 +216,12 @@ export interface LotOccupancyComment extends Record {
lotOccupancyComment?: string; lotOccupancyComment?: string;
} }
export interface LotOccupancyField extends OccupancyTypeField, Record { export interface LotOccupancyField extends OccupancyTypeField, Record {
lotOccupancyId?: number; lotOccupancyId?: number;
occupancyTypeFieldId?: number; occupancyTypeFieldId?: number;
lotOccupancyFieldValue?: string; lotOccupancyFieldValue?: string;
} }
export interface LotOccupancy extends Record { export interface LotOccupancy extends Record {
lotOccupancyId?: number; lotOccupancyId?: number;
@ -266,19 +248,16 @@ export interface LotOccupancy extends Record {
lotOccupancyTransactions?: LotOccupancyTransaction[]; lotOccupancyTransactions?: LotOccupancyTransaction[];
} }
/* /*
* WORK ORDERS * WORK ORDERS
*/ */
export interface WorkOrderType extends Record { export interface WorkOrderType extends Record {
workOrderTypeId?: number; workOrderTypeId?: number;
workOrderType?: string; workOrderType?: string;
orderNumber?: number; orderNumber?: number;
} }
export interface WorkOrderComment extends Record { export interface WorkOrderComment extends Record {
workOrderCommentId?: number; workOrderCommentId?: number;
workOrderId?: number; workOrderId?: number;
@ -292,7 +271,6 @@ export interface WorkOrderComment extends Record {
workOrderComment?: string; workOrderComment?: string;
} }
export interface WorkOrder extends Record { export interface WorkOrder extends Record {
workOrderId?: number; workOrderId?: number;
@ -313,12 +291,10 @@ export interface WorkOrder extends Record {
workOrderLotOccupancies?: LotOccupancy[]; workOrderLotOccupancies?: LotOccupancy[];
} }
/* /*
* USER TYPES * USER TYPES
*/ */
export interface User { export interface User {
userName: string; userName: string;
userProperties?: UserProperties; userProperties?: UserProperties;
@ -329,7 +305,6 @@ export interface UserProperties {
isAdmin: boolean; isAdmin: boolean;
} }
declare module "express-session" { declare module "express-session" {
interface Session { interface Session {
user: User; user: User;

View File

@ -9,6 +9,12 @@
<span>Fee Management</span> <span>Fee Management</span>
</a> </a>
</li> </li>
<li>
<a class="<%= (headTitle.endsWith("Type Management") ? "is-active" : "") %>" href="<%= urlPrefix %>/admin/occupancyTypes">
<span class="icon is-small"><i class="fas fa-fw fa-user-friends" aria-hidden="true"></i></span>
<span><%= configFunctions.getProperty("aliases.occupancy") %> Type Management</span>
</a>
</li>
<li> <li>
<a class="<%= (headTitle === "Config Table Management" ? "is-active" : "") %>" href="<%= urlPrefix %>/admin/tables"> <a class="<%= (headTitle === "Config Table Management" ? "is-active" : "") %>" href="<%= urlPrefix %>/admin/tables">
<span class="icon is-small"><i class="fas fa-fw fa-table" aria-hidden="true"></i></span> <span class="icon is-small"><i class="fas fa-fw fa-table" aria-hidden="true"></i></span>

View File

@ -145,6 +145,23 @@
</div> </div>
</div> </div>
</div> </div>
<div class="card-content">
<div class="media">
<div class="media-left">
<i class="fas fa-3x fa-fw fa-user-friends" aria-hidden="true"></i>
</div>
<div class="media-content has-text-black">
<h2 class="title is-4 is-marginless">
<a href="<%= urlPrefix %>/admin/occupancyTypes"><%= configFunctions.getProperty("aliases.occupancy") %> Type Management</a>
</h2>
<p>
Manage
<%= configFunctions.getProperty("aliases.occupancy").toLowerCase() %> types
and fields associated with them.
</p>
</div>
</div>
</div>
<div class="card-content"> <div class="card-content">
<div class="media"> <div class="media">
<div class="media-left"> <div class="media-left">