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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,24 +1,21 @@
import type {
RequestHandler
} from "express";
import {
deleteFeeCategory
} from "../../helpers/lotOccupancyDB/deleteFeeCategory.js";
import {
getFeeCategories
} from "../../helpers/lotOccupancyDB/getFeeCategories.js";
import type { RequestHandler } from "express";
import { deleteFeeCategory } from "../../helpers/lotOccupancyDB/deleteFeeCategory.js";
import { getFeeCategories } from "../../helpers/lotOccupancyDB/getFeeCategories.js";
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
});
}
);
response.json({
success,
@ -26,5 +23,4 @@ export const handler: RequestHandler = async (request, response) => {
});
};
export default handler;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -8,53 +8,58 @@ Object.defineProperty(exports, "__esModule", { value: true });
delete exports.feeCategories;
const renderFeeCategories = () => {
if (feeCategories.length === 0) {
feeCategoriesContainerElement.innerHTML = "<div class=\"message is-warning\">" +
"<p class=\"message-body\">There are no available fees.</p>" +
feeCategoriesContainerElement.innerHTML =
'<div class="message is-warning">' +
'<p class="message-body">There are no available fees.</p>' +
"</div>";
return;
}
feeCategoriesContainerElement.innerHTML = "";
for (const feeCategory of feeCategories) {
const feeCategoryContainerElement = document.createElement("section");
feeCategoryContainerElement.className = "container--feeCategory mb-5";
feeCategoryContainerElement.dataset.feeCategoryId = feeCategory.feeCategoryId.toString();
feeCategoryContainerElement.insertAdjacentHTML("beforeend", "<div class=\"level is-mobile\">" +
("<div class=\"level-left\">" +
"<div class=\"level-item\">" +
"<h2 class=\"title is-4\">" + cityssm.escapeHTML(feeCategory.feeCategory) + "</h2>" +
feeCategoryContainerElement.className =
"container--feeCategory mb-5";
feeCategoryContainerElement.dataset.feeCategoryId =
feeCategory.feeCategoryId.toString();
feeCategoryContainerElement.insertAdjacentHTML("beforeend", '<div class="level is-mobile">' +
('<div class="level-left">' +
'<div class="level-item">' +
'<h2 class="title is-4">' +
cityssm.escapeHTML(feeCategory.feeCategory) +
"</h2>" +
"</div>" +
"</div>") +
("<div class=\"level-right\">" +
(feeCategory.fees.length === 0 ?
"<div class=\"level-item\">" +
"<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>" +
('<div class="level-right">' +
(feeCategory.fees.length === 0
? '<div class="level-item">' +
'<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>Delete Category</span>" +
"</button>" +
"</div>" :
"") +
("<div class=\"level-item\">" +
"<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>" +
"</div>"
: "") +
('<div class="level-item">' +
'<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>Edit Category</span>" +
"</button>" +
"</div>") +
("<div class=\"level-item\">" +
"<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>" +
('<div class="level-item">' +
'<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>Add Fee</span>" +
"</button>" +
"</div>") +
("<div class=\"level-item\">" +
"<div class=\"field has-addons\">" +
"<div class=\"control\">" +
"<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>" +
('<div class="level-item">' +
'<div class="field has-addons">' +
'<div class="control">' +
'<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>' +
"</button>" +
"</div>" +
"<div class=\"control\">" +
"<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>" +
'<div class="control">' +
'<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>' +
"</button>" +
"</div>" +
"</div>" +
@ -62,8 +67,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
"</div>") +
"</div>");
if (feeCategory.fees.length === 0) {
feeCategoryContainerElement.insertAdjacentHTML("beforeend", "<div class=\"message is-info\">" +
"<p class=\"message-body\">There are no fees in the \"" + cityssm.escapeHTML(feeCategory.feeCategory) + "\" category.</p>" +
feeCategoryContainerElement.insertAdjacentHTML("beforeend", '<div class="message is-info">' +
'<p class="message-body">There are no fees in the "' +
cityssm.escapeHTML(feeCategory.feeCategory) +
'" category.</p>' +
"</div>");
}
else {
@ -71,85 +78,116 @@ Object.defineProperty(exports, "__esModule", { value: true });
panelElement.className = "panel";
for (const fee of feeCategory.fees) {
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.innerHTML = "<div class=\"columns\">" +
("<div class=\"column is-half\">" +
panelBlockElement.innerHTML =
'<div class="columns">' +
('<div class="column is-half">' +
"<p>" +
"<a class=\"has-text-weight-bold\" href=\"#\">" + cityssm.escapeHTML(fee.feeName) + "</a><br />" +
"<small>" + cityssm.escapeHTML(fee.feeDescription).replace(/\n/g, "<br />") + "</small>" +
'<a class="has-text-weight-bold" href="#">' +
cityssm.escapeHTML(fee.feeName) +
"</a><br />" +
"<small>" +
cityssm
.escapeHTML(fee.feeDescription)
.replace(/\n/g, "<br />") +
"</small>" +
"</p>" +
"<p class=\"tags\">" +
(fee.isRequired ?
"<span class=\"tag is-warning\">Required</span>" :
"") +
(fee.occupancyTypeId ?
" <span class=\"tag has-tooltip-bottom\" data-tooltip=\"" + cityssm.escapeHTML(exports.aliases.occupancy) + " Type Filter\">" +
cityssm.escapeHTML(fee.occupancyType) + "</span>" :
"") +
(fee.lotTypeId ?
" <span class=\"tag has-tooltip-bottom\" data-tooltip=\"" + cityssm.escapeHTML(exports.aliases.lot) + " Type Filter\">" +
cityssm.escapeHTML(fee.lotType) + "</span>" :
"") +
'<p class="tags">' +
(fee.isRequired
? '<span class="tag is-warning">Required</span>'
: "") +
(fee.occupancyTypeId
? ' <span class="tag has-tooltip-bottom" data-tooltip="' +
cityssm.escapeHTML(exports.aliases.occupancy) +
' Type Filter">' +
cityssm.escapeHTML(fee.occupancyType) +
"</span>"
: "") +
(fee.lotTypeId
? ' <span class="tag has-tooltip-bottom" data-tooltip="' +
cityssm.escapeHTML(exports.aliases.lot) +
' Type Filter">' +
cityssm.escapeHTML(fee.lotType) +
"</span>"
: "") +
"</p>" +
"</div>") +
("<div class=\"column has-text-centered\">" +
(fee.feeFunction ?
cityssm.escapeHTML(fee.feeFunction) + "<br />" +
"<small>Fee Function</small>" :
"$" + fee.feeAmount.toFixed(2) + "<br />" +
('<div class="column has-text-centered">' +
(fee.feeFunction
? cityssm.escapeHTML(fee.feeFunction) +
"<br />" +
"<small>Fee Function</small>"
: "$" +
fee.feeAmount.toFixed(2) +
"<br />" +
"<small>Fee</small>") +
"</div>") +
("<div class=\"column has-text-centered\">" +
(fee.taxPercentage ?
fee.taxPercentage + "%" :
"$" + fee.taxAmount.toFixed(2)) +
('<div class="column has-text-centered">' +
(fee.taxPercentage
? fee.taxPercentage + "%"
: "$" + fee.taxAmount.toFixed(2)) +
"<br /><small>Tax</small>" +
"</div>") +
("<div class=\"column has-text-centered\">" +
(fee.includeQuantity ?
cityssm.escapeHTML(fee.quantityUnit) + "<br />" +
"<small>Quantity</small>" :
"") +
('<div class="column has-text-centered">' +
(fee.includeQuantity
? cityssm.escapeHTML(fee.quantityUnit) +
"<br />" +
"<small>Quantity</small>"
: "") +
"</div>") +
("<div class=\"column is-narrow\">" +
"<div class=\"field has-addons\">" +
"<div class=\"control\">" +
"<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>" +
('<div class="column is-narrow">' +
'<div class="field has-addons">' +
'<div class="control">' +
'<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>' +
"</button>" +
"</div>" +
"<div class=\"control\">" +
"<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>" +
'<div class="control">' +
'<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>' +
"</button>" +
"</div>" +
"</div>" +
"</div>") +
"</div>";
panelBlockElement.querySelector("a").addEventListener("click", openEditFee);
panelBlockElement.querySelector(".button--moveFeeUp").addEventListener("click", moveFeeUp);
panelBlockElement.querySelector(".button--moveFeeDown").addEventListener("click", moveFeeDown);
panelBlockElement
.querySelector("a")
.addEventListener("click", openEditFee);
panelBlockElement
.querySelector(".button--moveFeeUp")
.addEventListener("click", moveFeeUp);
panelBlockElement
.querySelector(".button--moveFeeDown")
.addEventListener("click", moveFeeDown);
panelElement.append(panelBlockElement);
}
feeCategoryContainerElement.append(panelElement);
}
if (feeCategory.fees.length === 0) {
feeCategoryContainerElement.querySelector(".button--deleteFeeCategory")
feeCategoryContainerElement
.querySelector(".button--deleteFeeCategory")
.addEventListener("click", confirmDeleteFeeCategory);
}
feeCategoryContainerElement.querySelector(".button--editFeeCategory")
feeCategoryContainerElement
.querySelector(".button--editFeeCategory")
.addEventListener("click", openEditFeeCategory);
feeCategoryContainerElement.querySelector(".button--addFee")
feeCategoryContainerElement
.querySelector(".button--addFee")
.addEventListener("click", openAddFee);
feeCategoryContainerElement.querySelector(".button--moveFeeCategoryUp")
feeCategoryContainerElement
.querySelector(".button--moveFeeCategoryUp")
.addEventListener("click", moveFeeCategoryUp);
feeCategoryContainerElement.querySelector(".button--moveFeeCategoryDown")
feeCategoryContainerElement
.querySelector(".button--moveFeeCategoryDown")
.addEventListener("click", moveFeeCategoryDown);
feeCategoriesContainerElement.append(feeCategoryContainerElement);
}
};
document.querySelector("#button--addFeeCategory").addEventListener("click", () => {
document
.querySelector("#button--addFeeCategory")
.addEventListener("click", () => {
let addCloseModalFunction;
const doAddFeeCategory = (submitEvent) => {
submitEvent.preventDefault();
@ -173,7 +211,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
bulmaJS.toggleHtmlClipped();
modalElement.querySelector("#feeCategoryAdd--feeCategory").focus();
addCloseModalFunction = closeModalFunction;
modalElement.querySelector("form").addEventListener("submit", doAddFeeCategory);
modalElement
.querySelector("form")
.addEventListener("submit", doAddFeeCategory);
},
onremoved: () => {
bulmaJS.toggleHtmlClipped();
@ -211,7 +251,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
onshown: (modalElement, closeModalFunction) => {
bulmaJS.toggleHtmlClipped();
editCloseModalFunction = closeModalFunction;
modalElement.querySelector("form").addEventListener("submit", doUpdateFeeCategory);
modalElement
.querySelector("form")
.addEventListener("submit", doUpdateFeeCategory);
modalElement.querySelector("#feeCategoryEdit--feeCategory").focus();
},
onremoved: () => {
@ -319,7 +361,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
const occupancyTypeElement = modalElement.querySelector("#feeAdd--occupancyTypeId");
for (const occupancyType of exports.occupancyTypes) {
const optionElement = document.createElement("option");
optionElement.value = occupancyType.occupancyTypeId.toString();
optionElement.value =
occupancyType.occupancyTypeId.toString();
optionElement.textContent = occupancyType.occupancyType;
occupancyTypeElement.append(optionElement);
}
@ -336,23 +379,33 @@ Object.defineProperty(exports, "__esModule", { value: true });
onshown: (modalElement, closeModalFunction) => {
bulmaJS.toggleHtmlClipped();
addCloseModalFunction = closeModalFunction;
modalElement.querySelector("form").addEventListener("submit", doAddFee);
modalElement
.querySelector("form")
.addEventListener("submit", doAddFee);
modalElement.querySelector("#feeAdd--feeName").focus();
modalElement.querySelector("#feeAdd--feeFunction").addEventListener("change", () => {
modalElement
.querySelector("#feeAdd--feeFunction")
.addEventListener("change", () => {
const feeAmountElement = modalElement.querySelector("#feeAdd--feeAmount");
const feeFunctionElement = modalElement.querySelector("#feeAdd--feeFunction");
if (feeFunctionElement.value === "") {
feeFunctionElement.closest(".select").classList.remove("is-success");
feeFunctionElement
.closest(".select")
.classList.remove("is-success");
feeAmountElement.classList.add("is-success");
feeAmountElement.disabled = false;
}
else {
feeFunctionElement.closest(".select").classList.add("is-success");
feeFunctionElement
.closest(".select")
.classList.add("is-success");
feeAmountElement.classList.remove("is-success");
feeAmountElement.disabled = true;
}
});
modalElement.querySelector("#feeAdd--taxPercentage").addEventListener("keyup", () => {
modalElement
.querySelector("#feeAdd--taxPercentage")
.addEventListener("keyup", () => {
const taxAmountElement = modalElement.querySelector("#feeAdd--taxAmount");
const taxPercentageElement = modalElement.querySelector("#feeAdd--taxPercentage");
if (taxPercentageElement.value === "") {
@ -366,7 +419,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
taxAmountElement.disabled = true;
}
});
modalElement.querySelector("#feeAdd--includeQuantity").addEventListener("change", () => {
modalElement
.querySelector("#feeAdd--includeQuantity")
.addEventListener("change", () => {
modalElement.querySelector("#feeAdd--quantityUnit").disabled =
modalElement.querySelector("#feeAdd--includeQuantity").value === "";
});
@ -440,12 +495,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
const feeAmountElement = editModalElement.querySelector("#feeEdit--feeAmount");
const feeFunctionElement = editModalElement.querySelector("#feeEdit--feeFunction");
if (feeFunctionElement.value === "") {
feeFunctionElement.closest(".select").classList.remove("is-success");
feeFunctionElement
.closest(".select")
.classList.remove("is-success");
feeAmountElement.classList.add("is-success");
feeAmountElement.disabled = false;
}
else {
feeFunctionElement.closest(".select").classList.add("is-success");
feeFunctionElement
.closest(".select")
.classList.add("is-success");
feeAmountElement.classList.remove("is-success");
feeAmountElement.disabled = true;
}
@ -487,7 +546,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
const occupancyTypeElement = modalElement.querySelector("#feeEdit--occupancyTypeId");
for (const occupancyType of exports.occupancyTypes) {
const optionElement = document.createElement("option");
optionElement.value = occupancyType.occupancyTypeId.toString();
optionElement.value =
occupancyType.occupancyTypeId.toString();
optionElement.textContent = occupancyType.occupancyType;
if (occupancyType.occupancyTypeId === fee.occupancyTypeId) {
optionElement.selected = true;
@ -505,11 +565,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
lotTypeElement.append(optionElement);
}
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();
modalElement.querySelector("#feeEdit--taxAmount").value = fee.taxAmount ? fee.taxAmount.toFixed(2) : "";
const taxPercentageElement = modalElement.querySelector("#feeEdit--taxPercentage");
taxPercentageElement.value = fee.taxPercentage ? fee.taxPercentage.toString() : "";
taxPercentageElement.value = fee.taxPercentage
? fee.taxPercentage.toString()
: "";
taxPercentageElement.addEventListener("keyup", toggleTaxFields);
toggleTaxFields();
const includeQuantityElement = modalElement.querySelector("#feeEdit--includeQuantity");
@ -527,9 +591,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
onshown: (modalElement, closeModalFunction) => {
bulmaJS.toggleHtmlClipped();
editCloseModalFunction = closeModalFunction;
modalElement.querySelector("form").addEventListener("submit", doUpdateFee);
modalElement
.querySelector("form")
.addEventListener("submit", doUpdateFee);
bulmaJS.init(modalElement);
modalElement.querySelector(".button--deleteFee").addEventListener("click", confirmDeleteFee);
modalElement
.querySelector(".button--deleteFee")
.addEventListener("click", confirmDeleteFee);
},
onremoved: () => {
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 containerElement = document.querySelector("#container--workOrderTypes");
if (workOrderTypes.length === 0) {
containerElement.innerHTML = "<tr>" +
"<td colspan=\"2\">" +
"<div class=\"message is-warning\">" +
"<p class=\"message-body\">There are no active work order types.</p>" +
containerElement.innerHTML =
"<tr>" +
'<td colspan="2">' +
'<div class="message is-warning">' +
'<p class="message-body">There are no active work order types.</p>' +
"</div>" +
"</td>" +
"</tr>";
@ -117,47 +118,63 @@ Object.defineProperty(exports, "__esModule", { value: true });
containerElement.innerHTML = "";
for (const workOrderType of workOrderTypes) {
const tableRowElement = document.createElement("tr");
tableRowElement.dataset.workOrderTypeId = workOrderType.workOrderTypeId.toString();
tableRowElement.innerHTML = "<td>" +
tableRowElement.dataset.workOrderTypeId =
workOrderType.workOrderTypeId.toString();
tableRowElement.innerHTML =
"<td>" +
"<form>" +
"<input name=\"workOrderTypeId\" type=\"hidden\" value=\"" + workOrderType.workOrderTypeId.toString() + "\" />" +
("<div class=\"field has-addons\">" +
"<div class=\"control\">" +
"<input class=\"input\" name=\"workOrderType\" type=\"text\" value=\"" + cityssm.escapeHTML(workOrderType.workOrderType) + "\" maxlength=\"100\" required />" +
'<input name="workOrderTypeId" type="hidden" value="' +
workOrderType.workOrderTypeId.toString() +
'" />' +
('<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 class=\"control\">" +
"<button class=\"button is-success\" type=\"submit\"><i class=\"fas fa-save\" aria-hidden=\"true\"></i></button>" +
'<div class="control">' +
'<button class="button is-success" type="submit"><i class="fas fa-save" aria-hidden="true"></i></button>' +
"</div>" +
"</div>") +
"</form>" +
"</td>" +
"<td class=\"is-nowrap\">" +
"<div class=\"field is-grouped\">" +
"<div class=\"control\">" +
("<div class=\"field has-addons\">" +
"<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>" +
'<td class="is-nowrap">' +
'<div class="field is-grouped">' +
'<div class="control">' +
('<div class="field has-addons">' +
'<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>' +
"</div>" +
"<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>" +
'<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>' +
"</div>" +
"</div>") +
"</div>" +
"<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\">" +
"<i class=\"fas fa-trash\" aria-hidden=\"true\"></i>" +
'<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">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" +
"</div>" +
"</div>" +
"</td>";
tableRowElement.querySelector("form").addEventListener("submit", updateWorkOrderType);
tableRowElement.querySelector(".button--moveWorkOrderTypeUp").addEventListener("click", moveWorkOrderTypeUp);
tableRowElement.querySelector(".button--moveWorkOrderTypeDown").addEventListener("click", moveWorkOrderTypeDown);
tableRowElement.querySelector(".button--deleteWorkOrderType").addEventListener("click", deleteWorkOrderType);
tableRowElement
.querySelector("form")
.addEventListener("submit", updateWorkOrderType);
tableRowElement
.querySelector(".button--moveWorkOrderTypeUp")
.addEventListener("click", moveWorkOrderTypeUp);
tableRowElement
.querySelector(".button--moveWorkOrderTypeDown")
.addEventListener("click", moveWorkOrderTypeDown);
tableRowElement
.querySelector(".button--deleteWorkOrderType")
.addEventListener("click", deleteWorkOrderType);
containerElement.append(tableRowElement);
}
};
document.querySelector("#form--addWorkOrderType").addEventListener("submit", (submitEvent) => {
document
.querySelector("#form--addWorkOrderType")
.addEventListener("submit", (submitEvent) => {
submitEvent.preventDefault();
const formElement = submitEvent.currentTarget;
cityssm.postJSON(urlPrefix + "/admin/doAddWorkOrderType", formElement, (responseJSON) => {
@ -185,7 +202,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
if (responseJSON.success) {
lotStatuses = responseJSON.lotStatuses;
bulmaJS.alert({
message: exports.aliases.lot + " Status Updated Successfully",
message: exports.aliases.lot +
" Status Updated Successfully",
contextualColorName: "success"
});
}
@ -214,13 +232,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
tableRowElement.remove();
}
bulmaJS.alert({
message: exports.aliases.lot + " Status Deleted Successfully",
message: exports.aliases.lot +
" Status Deleted Successfully",
contextualColorName: "success"
});
}
else {
bulmaJS.alert({
title: "Error Deleting " + exports.aliases.lot + " Status",
title: "Error Deleting " +
exports.aliases.lot +
" Status",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
@ -230,7 +251,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
bulmaJS.confirm({
title: "Delete " + exports.aliases.lot + " Status",
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,
contextualColorName: "warning",
okButton: {
@ -280,10 +303,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
const renderLotStatuses = () => {
const containerElement = document.querySelector("#container--lotStatuses");
if (workOrderTypes.length === 0) {
containerElement.innerHTML = "<tr>" +
"<td colspan=\"2\">" +
"<div class=\"message is-warning\">" +
"<p class=\"message-body\">There are no active " + cityssm.escapeHTML(exports.aliases.lot.toLowerCase()) + " statuses.</p>" +
containerElement.innerHTML =
"<tr>" +
'<td colspan="2">' +
'<div class="message is-warning">' +
'<p class="message-body">There are no active ' +
cityssm.escapeHTML(exports.aliases.lot.toLowerCase()) +
" statuses.</p>" +
"</div>" +
"</td>" +
"</tr>";
@ -292,47 +318,63 @@ Object.defineProperty(exports, "__esModule", { value: true });
containerElement.innerHTML = "";
for (const lotStatus of lotStatuses) {
const tableRowElement = document.createElement("tr");
tableRowElement.dataset.lotStatusId = lotStatus.lotStatusId.toString();
tableRowElement.innerHTML = "<td>" +
tableRowElement.dataset.lotStatusId =
lotStatus.lotStatusId.toString();
tableRowElement.innerHTML =
"<td>" +
"<form>" +
"<input name=\"lotStatusId\" type=\"hidden\" value=\"" + lotStatus.lotStatusId.toString() + "\" />" +
("<div class=\"field has-addons\">" +
"<div class=\"control\">" +
"<input class=\"input\" name=\"lotStatus\" type=\"text\" value=\"" + cityssm.escapeHTML(lotStatus.lotStatus) + "\" maxlength=\"100\" required />" +
'<input name="lotStatusId" type="hidden" value="' +
lotStatus.lotStatusId.toString() +
'" />' +
('<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 class=\"control\">" +
"<button class=\"button is-success\" type=\"submit\"><i class=\"fas fa-save\" aria-hidden=\"true\"></i></button>" +
'<div class="control">' +
'<button class="button is-success" type="submit"><i class="fas fa-save" aria-hidden="true"></i></button>' +
"</div>" +
"</div>") +
"</form>" +
"</td>" +
"<td class=\"is-nowrap\">" +
"<div class=\"field is-grouped\">" +
"<div class=\"control\">" +
("<div class=\"field has-addons\">" +
"<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>" +
'<td class="is-nowrap">' +
'<div class="field is-grouped">' +
'<div class="control">' +
('<div class="field has-addons">' +
'<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>' +
"</div>" +
"<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>" +
'<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>' +
"</div>" +
"</div>") +
"</div>" +
"<div class=\"control\">" +
"<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>" +
'<div class="control">' +
'<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>' +
"</button>" +
"</div>" +
"</div>" +
"</td>";
tableRowElement.querySelector("form").addEventListener("submit", updateLotStatus);
tableRowElement.querySelector(".button--moveLotStatusUp").addEventListener("click", moveLotStatusUp);
tableRowElement.querySelector(".button--moveLotStatusDown").addEventListener("click", moveLotStatusDown);
tableRowElement.querySelector(".button--deleteLotStatus").addEventListener("click", deleteLotStatus);
tableRowElement
.querySelector("form")
.addEventListener("submit", updateLotStatus);
tableRowElement
.querySelector(".button--moveLotStatusUp")
.addEventListener("click", moveLotStatusUp);
tableRowElement
.querySelector(".button--moveLotStatusDown")
.addEventListener("click", moveLotStatusDown);
tableRowElement
.querySelector(".button--deleteLotStatus")
.addEventListener("click", deleteLotStatus);
containerElement.append(tableRowElement);
}
};
document.querySelector("#form--addLotStatus").addEventListener("submit", (submitEvent) => {
document
.querySelector("#form--addLotStatus")
.addEventListener("submit", (submitEvent) => {
submitEvent.preventDefault();
const formElement = submitEvent.currentTarget;
cityssm.postJSON(urlPrefix + "/admin/doAddLotStatus", formElement, (responseJSON) => {
@ -344,7 +386,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
}
else {
bulmaJS.alert({
title: "Error Adding " + exports.aliases.lot + " Status",
title: "Error Adding " +
exports.aliases.lot +
" Status",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
@ -360,13 +404,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
if (responseJSON.success) {
lotOccupantTypes = responseJSON.lotOccupantTypes;
bulmaJS.alert({
message: exports.aliases.lot + " " + exports.aliases.occupant + " Type Updated Successfully",
message: exports.aliases.lot +
" " +
exports.aliases.occupant +
" Type Updated Successfully",
contextualColorName: "success"
});
}
else {
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,
contextualColorName: "danger"
});
@ -389,13 +440,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
tableRowElement.remove();
}
bulmaJS.alert({
message: exports.aliases.lot + " " + exports.aliases.occupant + " Type Deleted Successfully",
message: exports.aliases.lot +
" " +
exports.aliases.occupant +
" Type Deleted Successfully",
contextualColorName: "success"
});
}
else {
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,
contextualColorName: "danger"
});
@ -403,13 +461,29 @@ Object.defineProperty(exports, "__esModule", { value: true });
});
};
bulmaJS.confirm({
title: "Delete " + exports.aliases.lot + " " + 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.",
title: "Delete " +
exports.aliases.lot +
" " +
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,
contextualColorName: "warning",
okButton: {
text: "Yes, Delete " + exports.aliases.lot + " " + exports.aliases.occupant + " Type",
text: "Yes, Delete " +
exports.aliases.lot +
" " +
exports.aliases.occupant +
" Type",
callbackFunction: doDelete
}
});
@ -426,7 +500,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
}
else {
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,
contextualColorName: "danger"
});
@ -445,7 +523,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
}
else {
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,
contextualColorName: "danger"
});
@ -455,10 +537,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
const renderLotOccupantTypes = () => {
const containerElement = document.querySelector("#container--lotOccupantTypes");
if (workOrderTypes.length === 0) {
containerElement.innerHTML = "<tr>" +
"<td colspan=\"2\">" +
"<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>" +
containerElement.innerHTML =
"<tr>" +
'<td colspan="2">' +
'<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>" +
"</td>" +
"</tr>";
@ -467,49 +554,73 @@ Object.defineProperty(exports, "__esModule", { value: true });
containerElement.innerHTML = "";
for (const lotOccupantType of lotOccupantTypes) {
const tableRowElement = document.createElement("tr");
tableRowElement.dataset.lotOccupantTypeId = lotOccupantType.lotOccupantTypeId.toString();
tableRowElement.innerHTML = "<td>" +
tableRowElement.dataset.lotOccupantTypeId =
lotOccupantType.lotOccupantTypeId.toString();
tableRowElement.innerHTML =
"<td>" +
"<form>" +
"<input name=\"lotOccupantTypeId\" type=\"hidden\" value=\"" + lotOccupantType.lotOccupantTypeId.toString() + "\" />" +
("<div class=\"field has-addons\">" +
"<div class=\"control\">" +
"<input class=\"input\" name=\"lotOccupantType\" type=\"text\" value=\"" + cityssm.escapeHTML(lotOccupantType.lotOccupantType) + "\" maxlength=\"100\" required />" +
'<input name="lotOccupantTypeId" type="hidden" value="' +
lotOccupantType.lotOccupantTypeId.toString() +
'" />' +
('<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 class=\"control\">" +
"<button class=\"button is-success\" type=\"submit\"><i class=\"fas fa-save\" aria-hidden=\"true\"></i></button>" +
'<div class="control">' +
'<button class="button is-success" type="submit"><i class="fas fa-save" aria-hidden="true"></i></button>' +
"</div>" +
"</div>") +
"</form>" +
"</td>" +
"<td class=\"is-nowrap\">" +
"<div class=\"field is-grouped\">" +
"<div class=\"control\">" +
("<div class=\"field has-addons\">" +
"<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>" +
'<td class="is-nowrap">' +
'<div class="field is-grouped">' +
'<div class="control">' +
('<div class="field has-addons">' +
'<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>' +
"</div>" +
"<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>" +
'<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>' +
"</div>" +
"</div>") +
"</div>" +
"<div class=\"control\">" +
"<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\"" +
" aria-label=\"Delete " + cityssm.escapeHTML(exports.aliases.lot) + " " + cityssm.escapeHTML(exports.aliases.occupant) + " Type\">" +
"<i class=\"fas fa-trash\" aria-hidden=\"true\"></i>" +
'<div class="control">' +
'<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"' +
' aria-label="Delete ' +
cityssm.escapeHTML(exports.aliases.lot) +
" " +
cityssm.escapeHTML(exports.aliases.occupant) +
' Type">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" +
"</div>" +
"</div>" +
"</td>";
tableRowElement.querySelector("form").addEventListener("submit", updateLotOccupantType);
tableRowElement.querySelector(".button--moveLotOccupantTypeUp").addEventListener("click", moveLotOccupantTypeUp);
tableRowElement.querySelector(".button--moveLotOccupantTypeDown").addEventListener("click", moveLotOccupantTypeDown);
tableRowElement.querySelector(".button--deleteLotOccupantType").addEventListener("click", deleteLotOccupantType);
tableRowElement
.querySelector("form")
.addEventListener("submit", updateLotOccupantType);
tableRowElement
.querySelector(".button--moveLotOccupantTypeUp")
.addEventListener("click", moveLotOccupantTypeUp);
tableRowElement
.querySelector(".button--moveLotOccupantTypeDown")
.addEventListener("click", moveLotOccupantTypeDown);
tableRowElement
.querySelector(".button--deleteLotOccupantType")
.addEventListener("click", deleteLotOccupantType);
containerElement.append(tableRowElement);
}
};
document.querySelector("#form--addLotOccupantType").addEventListener("submit", (submitEvent) => {
document
.querySelector("#form--addLotOccupantType")
.addEventListener("submit", (submitEvent) => {
submitEvent.preventDefault();
const formElement = submitEvent.currentTarget;
cityssm.postJSON(urlPrefix + "/admin/doAddLotOccupantType", formElement, (responseJSON) => {
@ -521,7 +632,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
}
else {
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,
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 urlPrefix = document.querySelector("main").dataset.urlPrefix;
const lotId = document.querySelector("#lot--lotId").value;
const isCreate = (lotId === "");
const lotId = document.querySelector("#lot--lotId")
.value;
const isCreate = lotId === "";
const formElement = document.querySelector("#form--lot");
const updateLot = (formEvent) => {
formEvent.preventDefault();
cityssm.postJSON(urlPrefix + "/lots/" + (isCreate ? "doCreateLot" : "doUpdateLot"), formElement, (responseJSON) => {
if (responseJSON.success) {
if (isCreate) {
window.location.href = urlPrefix + "/lots/" + responseJSON.lotId + "/edit";
window.location.href =
urlPrefix + "/lots/" + responseJSON.lotId + "/edit";
}
else {
bulmaJS.alert({
@ -34,7 +36,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
let lotComments = exports.lotComments;
delete exports.lotComments;
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) => {
return currentLotComment.lotCommentId === lotCommentId;
});
@ -79,7 +82,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
});
};
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 = () => {
cityssm.postJSON(urlPrefix + "/lots/doDeleteLotComment", {
lotId,
@ -111,42 +115,56 @@ Object.defineProperty(exports, "__esModule", { value: true });
const renderLotComments = () => {
const containerElement = document.querySelector("#container--lotComments");
if (lotComments.length === 0) {
containerElement.innerHTML = "<div class=\"message is-info\">" +
"<p class=\"message-body\">There are no comments to display.</p>" +
containerElement.innerHTML =
'<div class="message is-info">' +
'<p class="message-body">There are no comments to display.</p>' +
"</div>";
return;
}
const tableElement = document.createElement("table");
tableElement.className = "table is-fullwidth is-striped is-hoverable";
tableElement.innerHTML = "<thead><tr>" +
tableElement.innerHTML =
"<thead><tr>" +
"<th>Commentor</th>" +
"<th>Comment Date</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>" +
"<tbody></tbody>";
for (const lotComment of lotComments) {
const tableRowElement = document.createElement("tr");
tableRowElement.dataset.lotCommentId = lotComment.lotCommentId.toString();
tableRowElement.innerHTML = "<td>" + cityssm.escapeHTML(lotComment.recordCreate_userName) + "</td>" +
tableRowElement.dataset.lotCommentId =
lotComment.lotCommentId.toString();
tableRowElement.innerHTML =
"<td>" +
cityssm.escapeHTML(lotComment.recordCreate_userName) +
"</td>" +
"<td>" +
lotComment.lotCommentDateString +
(lotComment.lotCommentTime === 0 ? "" : " " + lotComment.lotCommentTimeString) +
(lotComment.lotCommentTime === 0
? ""
: " " + lotComment.lotCommentTimeString) +
"</td>" +
"<td>" + cityssm.escapeHTML(lotComment.lotComment) + "</td>" +
("<td class=\"is-hidden-print\">" +
"<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>" +
"<td>" +
cityssm.escapeHTML(lotComment.lotComment) +
"</td>" +
('<td class="is-hidden-print">' +
'<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>" +
"</button>") +
("<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>" +
('<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>' +
"</button>") +
"</div>" +
"</td>");
tableRowElement.querySelector(".button--edit").addEventListener("click", openEditLotComment);
tableRowElement.querySelector(".button--delete").addEventListener("click", deleteLotComment);
tableRowElement
.querySelector(".button--edit")
.addEventListener("click", openEditLotComment);
tableRowElement
.querySelector(".button--delete")
.addEventListener("click", deleteLotComment);
tableElement.querySelector("tbody").append(tableRowElement);
}
containerElement.innerHTML = "";
@ -168,7 +186,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
onshow(modalElement) {
los.populateAliases(modalElement);
modalElement.querySelector("#lotCommentAdd--lotId").value = lotId;
modalElement.querySelector("form").addEventListener("submit", doAddComment);
modalElement
.querySelector("form")
.addEventListener("submit", doAddComment);
},
onshown(modalElement, closeModalFunction) {
bulmaJS.toggleHtmlClipped();
@ -182,7 +202,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
});
};
if (!isCreate) {
document.querySelector("#lotComments--add").addEventListener("click", openAddCommentModal);
document
.querySelector("#lotComments--add")
.addEventListener("click", openAddCommentModal);
renderLotComments();
}
})();

View File

@ -3,25 +3,21 @@
import type * as globalTypes from "../types/globalTypes";
import type * as recordTypes from "../types/recordTypes";
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";
declare const cityssm: cityssmGlobal;
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 lotId = (document.querySelector("#lot--lotId") as HTMLInputElement).value;
const isCreate = (lotId === "");
const lotId = (document.querySelector("#lot--lotId") as HTMLInputElement)
.value;
const isCreate = lotId === "";
// Main form
@ -30,18 +26,22 @@ declare const bulmaJS: BulmaJS;
const updateLot = (formEvent: SubmitEvent) => {
formEvent.preventDefault();
cityssm.postJSON(urlPrefix + "/lots/" + (isCreate ? "doCreateLot" : "doUpdateLot"),
cityssm.postJSON(
urlPrefix + "/lots/" + (isCreate ? "doCreateLot" : "doUpdateLot"),
formElement,
(responseJSON: {
success: boolean;lotId ? : number;errorMessage ? : string
success: boolean;
lotId?: number;
errorMessage?: string;
}) => {
if (responseJSON.success) {
if (isCreate) {
window.location.href = urlPrefix + "/lots/" + responseJSON.lotId + "/edit";
window.location.href =
urlPrefix + "/lots/" + responseJSON.lotId + "/edit";
} else {
bulmaJS.alert({
message: exports.aliases.lot + " Updated Successfully",
message:
exports.aliases.lot + " Updated Successfully",
contextualColorName: "success"
});
}
@ -52,7 +52,8 @@ declare const bulmaJS: BulmaJS;
contextualColorName: "danger"
});
}
});
}
);
};
formElement.addEventListener("submit", updateLot);
@ -65,8 +66,11 @@ declare const bulmaJS: BulmaJS;
delete exports.lotComments;
const openEditLotComment = (clickEvent: Event) => {
const lotCommentId = Number.parseInt((clickEvent.currentTarget as HTMLElement).closest("tr").dataset.lotCommentId, 10);
const lotCommentId = Number.parseInt(
(clickEvent.currentTarget as HTMLElement).closest("tr").dataset
.lotCommentId,
10
);
const lotComment = lotComments.find((currentLotComment) => {
return currentLotComment.lotCommentId === lotCommentId;
@ -76,17 +80,16 @@ declare const bulmaJS: BulmaJS;
let editCloseModalFunction: () => void;
const editComment = (submitEvent: SubmitEvent) => {
submitEvent.preventDefault();
cityssm.postJSON(urlPrefix + "/lots/doUpdateLotComment",
cityssm.postJSON(
urlPrefix + "/lots/doUpdateLotComment",
editFormElement,
(responseJSON: {
success: boolean;
errorMessage?: string;
lotComments?: recordTypes.LotComment[];
}) => {
if (responseJSON.success) {
lotComments = responseJSON.lotComments;
editCloseModalFunction();
@ -98,25 +101,49 @@ declare const bulmaJS: BulmaJS;
contextualColorName: "danger"
});
}
});
}
);
};
cityssm.openHtmlModal("lot-editComment", {
onshow: (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("#lotCommentEdit--lotCommentTimeString") as HTMLInputElement).value = lotComment.lotCommentTimeString;
(
modalElement.querySelector(
"#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) => {
bulmaJS.toggleHtmlClipped();
(modalElement.querySelector("#lotCommentEdit--lotComment") as HTMLTextAreaElement).focus();
(
modalElement.querySelector(
"#lotCommentEdit--lotComment"
) as HTMLTextAreaElement
).focus();
editFormElement = modalElement.querySelector("form");
editFormElement.addEventListener("submit", editComment);
@ -130,11 +157,16 @@ declare const bulmaJS: BulmaJS;
};
const deleteLotComment = (clickEvent: Event) => {
const lotCommentId = Number.parseInt((clickEvent.currentTarget as HTMLElement).closest("tr").dataset.lotCommentId, 10);
const lotCommentId = Number.parseInt(
(clickEvent.currentTarget as HTMLElement).closest("tr").dataset
.lotCommentId,
10
);
const doDelete = () => {
cityssm.postJSON(urlPrefix + "/lots/doDeleteLotComment", {
cityssm.postJSON(
urlPrefix + "/lots/doDeleteLotComment",
{
lotId,
lotCommentId
},
@ -153,7 +185,8 @@ declare const bulmaJS: BulmaJS;
contextualColorName: "danger"
});
}
});
}
);
};
bulmaJS.confirm({
@ -167,53 +200,66 @@ declare const bulmaJS: BulmaJS;
});
};
const renderLotComments = () => {
const containerElement = document.querySelector("#container--lotComments") as HTMLElement;
const containerElement = document.querySelector(
"#container--lotComments"
) as HTMLElement;
if (lotComments.length === 0) {
containerElement.innerHTML = "<div class=\"message is-info\">" +
"<p class=\"message-body\">There are no comments to display.</p>" +
containerElement.innerHTML =
'<div class="message is-info">' +
'<p class="message-body">There are no comments to display.</p>' +
"</div>";
return;
}
const tableElement = document.createElement("table");
tableElement.className = "table is-fullwidth is-striped is-hoverable";
tableElement.innerHTML = "<thead><tr>" +
tableElement.innerHTML =
"<thead><tr>" +
"<th>Commentor</th>" +
"<th>Comment Date</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>" +
"<tbody></tbody>";
for (const lotComment of lotComments) {
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>" +
lotComment.lotCommentDateString +
(lotComment.lotCommentTime === 0 ? "" : " " + lotComment.lotCommentTimeString) +
(lotComment.lotCommentTime === 0
? ""
: " " + lotComment.lotCommentTimeString) +
"</td>" +
"<td>" + cityssm.escapeHTML(lotComment.lotComment) + "</td>" +
("<td class=\"is-hidden-print\">" +
"<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>" +
"<td>" +
cityssm.escapeHTML(lotComment.lotComment) +
"</td>" +
('<td class="is-hidden-print">' +
'<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>" +
"</button>") +
("<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>" +
('<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>' +
"</button>") +
"</div>" +
"</td>");
tableRowElement.querySelector(".button--edit").addEventListener("click", openEditLotComment);
tableRowElement.querySelector(".button--delete").addEventListener("click", deleteLotComment);
tableRowElement
.querySelector(".button--edit")
.addEventListener("click", openEditLotComment);
tableRowElement
.querySelector(".button--delete")
.addEventListener("click", deleteLotComment);
tableElement.querySelector("tbody").append(tableRowElement);
}
@ -223,44 +269,63 @@ declare const bulmaJS: BulmaJS;
};
const openAddCommentModal = () => {
let addCommentCloseModalFunction: () => void;
const doAddComment = (formEvent: SubmitEvent) => {
formEvent.preventDefault();
cityssm.postJSON(urlPrefix + "/lots/doAddLotComment",
cityssm.postJSON(
urlPrefix + "/lots/doAddLotComment",
formEvent.currentTarget,
(responseJSON: {success: boolean; lotComments?: recordTypes.LotComment[]}) => {
(responseJSON: {
success: boolean;
lotComments?: recordTypes.LotComment[];
}) => {
if (responseJSON.success) {
lotComments = responseJSON.lotComments;
renderLotComments();
addCommentCloseModalFunction();
}
});
}
);
};
cityssm.openHtmlModal("lot-addComment", {
onshow(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) {
bulmaJS.toggleHtmlClipped();
addCommentCloseModalFunction = closeModalFunction;
(modalElement.querySelector("#lotCommentAdd--lotComment") as HTMLTextAreaElement).focus();
(
modalElement.querySelector(
"#lotCommentAdd--lotComment"
) as HTMLTextAreaElement
).focus();
},
onremoved() {
bulmaJS.toggleHtmlClipped();
(document.querySelector("#lotComments--add") as HTMLButtonElement).focus();
(
document.querySelector(
"#lotComments--add"
) as HTMLButtonElement
).focus();
}
});
};
if (!isCreate) {
document.querySelector("#lotComments--add").addEventListener("click", openAddCommentModal);
document
.querySelector("#lotComments--add")
.addEventListener("click", openAddCommentModal);
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 searchFilterFormElement = document.querySelector("#form--searchFilters");
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 getLotOccupancies = () => {
const offset = Number.parseInt(offsetElement.value, 10);
searchResultsContainerElement.innerHTML = "<div class=\"has-text-grey has-text-centered\">" +
"<i class=\"fas fa-5x fa-circle-notch fa-spin\" aria-hidden=\"true\"></i><br />" +
"Loading " + exports.aliases.occupancies + "..." +
searchResultsContainerElement.innerHTML =
'<div class="has-text-grey has-text-centered">' +
'<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />' +
"Loading " +
exports.aliases.occupancies +
"..." +
"</div>";
cityssm.postJSON(urlPrefix + "/lotOccupancies/doSearchLotOccupancies", searchFilterFormElement, (responseJSON) => {
if (responseJSON.lotOccupancies.length === 0) {
searchResultsContainerElement.innerHTML = "<div class=\"message is-info\">" +
"<p class=\"message-body\">There are no " + exports.aliases.occupancy.toLowerCase() + " records that meet the search criteria.</p>" +
searchResultsContainerElement.innerHTML =
'<div class="message is-info">' +
'<p class="message-body">There are no ' +
exports.aliases.occupancy.toLowerCase() +
" records that meet the search criteria.</p>" +
"</div>";
return;
}
@ -23,83 +30,129 @@ Object.defineProperty(exports, "__esModule", { value: true });
const nowDateString = cityssm.dateToString(new Date());
for (const lotOccupancy of responseJSON.lotOccupancies) {
let occupancyTimeHTML = "";
if (lotOccupancy.occupancyStartDateString <= nowDateString && (lotOccupancy.occupancyEndDateString === "" || lotOccupancy.occupancyEndDateString >= nowDateString)) {
occupancyTimeHTML = "<i class=\"fas fa-play\" title=\"Current " + exports.aliases.occupancy + "\"></i>";
if (lotOccupancy.occupancyStartDateString <=
nowDateString &&
(lotOccupancy.occupancyEndDateString === "" ||
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>";
occupancyTimeHTML =
'<i class="fas fa-fast-forward" title="Future ' +
exports.aliases.occupancy +
'"></i>';
}
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 = "";
for (const occupant of lotOccupancy.lotOccupancyOccupants) {
occupantsHTML += cityssm.escapeHTML(occupant.occupantName) + "<br />";
occupantsHTML +=
cityssm.escapeHTML(occupant.occupantName) +
"<br />";
}
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
"<td>" + occupancyTimeHTML + "</td>" +
"<td>" +
occupancyTimeHTML +
"</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) +
"</a>" +
"</td>") +
("<td>" +
(lotOccupancy.lotName ? 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>" +
(lotOccupancy.lotName
? 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>" +
lotOccupancy.occupancyStartDateString +
"</td>") +
("<td>" +
(lotOccupancy.occupancyEndDate ?
lotOccupancy.occupancyEndDateString :
"<span class=\"has-text-grey\">(No End Date)</span>") +
(lotOccupancy.occupancyEndDate
? lotOccupancy.occupancyEndDateString
: '<span class="has-text-grey">(No End Date)</span>') +
"</td>") +
"<td>" + occupantsHTML + "</td>" +
"<td>" +
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>" +
"<th></th>" +
"<th>" + exports.aliases.occupancy + " Type</th>" +
"<th>" + exports.aliases.lot + "</th>" +
"<th>" +
exports.aliases.occupancy +
" Type</th>" +
"<th>" +
exports.aliases.lot +
"</th>" +
"<th>Start Date</th>" +
"<th>End Date</th>" +
"<th>" + exports.aliases.occupants + "</th>" +
"<th>" +
exports.aliases.occupants +
"</th>" +
"</tr></thead>" +
"<table>" +
"<div class=\"level\">" +
("<div class=\"level-left\">" +
"<div class=\"level-item has-text-weight-bold\">" +
"Displaying " + (offset + 1).toString() +
" to " + Math.min(responseJSON.count, limit + offset) +
" of " + responseJSON.count +
'<div class="level">' +
('<div class="level-left">' +
'<div class="level-item has-text-weight-bold">' +
"Displaying " +
(offset + 1).toString() +
" to " +
Math.min(responseJSON.count, limit + offset) +
" of " +
responseJSON.count +
"</div>" +
"</div>") +
("<div class=\"level-right\">" +
(offset > 0 ?
"<div class=\"level-item\">" +
"<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>" +
('<div class="level-right">' +
(offset > 0
? '<div class="level-item">' +
'<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>' +
"</button>" +
"</div>" :
"") +
(limit + offset < responseJSON.count ?
"<div class=\"level-item\">" +
"<button class=\"button is-rounded is-link\" data-page=\"next\" type=\"button\" title=\"Next\">" +
"</div>"
: "") +
(limit + offset < responseJSON.count
? '<div class="level-item">' +
'<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
"<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>" +
"</div>" :
"") +
"</div>"
: "") +
"</div>") +
"</div>";
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement);
searchResultsContainerElement
.querySelector("table")
.append(resultsTbodyElement);
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) {
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 {
cityssmGlobal
} from "@cityssm/bulma-webapp-js/src/types";
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
declare const cityssm: cityssmGlobal;
(() => {
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
const searchFilterFormElement = document.querySelector("#form--searchFilters") as HTMLFormElement;
const searchResultsContainerElement = document.querySelector("#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 searchFilterFormElement = document.querySelector(
"#form--searchFilters"
) as HTMLFormElement;
const searchResultsContainerElement = document.querySelector(
"#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 offset = Number.parseInt(offsetElement.value, 10);
searchResultsContainerElement.innerHTML = "<div class=\"has-text-grey has-text-centered\">" +
"<i class=\"fas fa-5x fa-circle-notch fa-spin\" aria-hidden=\"true\"></i><br />" +
"Loading " + exports.aliases.occupancies + "..." +
searchResultsContainerElement.innerHTML =
'<div class="has-text-grey has-text-centered">' +
'<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />' +
"Loading " +
exports.aliases.occupancies +
"..." +
"</div>";
cityssm.postJSON(urlPrefix + "/lotOccupancies/doSearchLotOccupancies", searchFilterFormElement,
cityssm.postJSON(
urlPrefix + "/lotOccupancies/doSearchLotOccupancies",
searchFilterFormElement,
(responseJSON: {
count: number;
lotOccupancies: recordTypes.LotOccupancy[];
}) => {
if (responseJSON.lotOccupancies.length === 0) {
searchResultsContainerElement.innerHTML = "<div class=\"message is-info\">" +
"<p class=\"message-body\">There are no " + exports.aliases.occupancy.toLowerCase() + " records that meet the search criteria.</p>" +
searchResultsContainerElement.innerHTML =
'<div class="message is-info">' +
'<p class="message-body">There are no ' +
exports.aliases.occupancy.toLowerCase() +
" records that meet the search criteria.</p>" +
"</div>";
return;
@ -49,116 +59,182 @@ declare const cityssm: cityssmGlobal;
const nowDateString = cityssm.dateToString(new Date());
for (const lotOccupancy of responseJSON.lotOccupancies) {
let occupancyTimeHTML = "";
if (lotOccupancy.occupancyStartDateString <= nowDateString && (lotOccupancy.occupancyEndDateString === "" || 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>";
if (
lotOccupancy.occupancyStartDateString <=
nowDateString &&
(lotOccupancy.occupancyEndDateString === "" ||
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 {
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 = "";
for (const occupant of lotOccupancy.lotOccupancyOccupants) {
occupantsHTML += cityssm.escapeHTML(occupant.occupantName) + "<br />";
occupantsHTML +=
cityssm.escapeHTML(occupant.occupantName) +
"<br />";
}
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
"<td>" + occupancyTimeHTML + "</td>" +
resultsTbodyElement.insertAdjacentHTML(
"beforeend",
"<tr>" +
"<td>" +
occupancyTimeHTML +
"</td>" +
("<td>" +
"<a class=\"has-text-weight-bold\" href=\"" + urlPrefix + "/lotOccupancies/" + lotOccupancy.lotOccupancyId + "\">" +
cityssm.escapeHTML(lotOccupancy.occupancyType as string) +
'<a class="has-text-weight-bold" href="' +
urlPrefix +
"/lotOccupancies/" +
lotOccupancy.lotOccupancyId +
'">' +
cityssm.escapeHTML(
lotOccupancy.occupancyType as string
) +
"</a>" +
"</td>") +
("<td>" +
(lotOccupancy.lotName ? 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>" +
(lotOccupancy.lotName
? 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>" +
lotOccupancy.occupancyStartDateString +
"</td>") +
("<td>" +
(lotOccupancy.occupancyEndDate ?
lotOccupancy.occupancyEndDateString :
"<span class=\"has-text-grey\">(No End Date)</span>") +
(lotOccupancy.occupancyEndDate
? lotOccupancy.occupancyEndDateString
: '<span class="has-text-grey">(No End Date)</span>') +
"</td>") +
"<td>" + occupantsHTML + "</td>" +
"</tr>");
"<td>" +
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>" +
"<th></th>" +
"<th>" + exports.aliases.occupancy + " Type</th>" +
"<th>" + exports.aliases.lot + "</th>" +
"<th>" +
exports.aliases.occupancy +
" Type</th>" +
"<th>" +
exports.aliases.lot +
"</th>" +
"<th>Start Date</th>" +
"<th>End Date</th>" +
"<th>" + exports.aliases.occupants + "</th>" +
"<th>" +
exports.aliases.occupants +
"</th>" +
"</tr></thead>" +
"<table>" +
"<div class=\"level\">" +
("<div class=\"level-left\">" +
"<div class=\"level-item has-text-weight-bold\">" +
"Displaying " + (offset + 1).toString() +
" to " + Math.min(responseJSON.count, limit + offset) +
" of " + responseJSON.count +
'<div class="level">' +
('<div class="level-left">' +
'<div class="level-item has-text-weight-bold">' +
"Displaying " +
(offset + 1).toString() +
" to " +
Math.min(responseJSON.count, limit + offset) +
" of " +
responseJSON.count +
"</div>" +
"</div>") +
("<div class=\"level-right\">" +
(offset > 0 ?
"<div class=\"level-item\">" +
"<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>" +
('<div class="level-right">' +
(offset > 0
? '<div class="level-item">' +
'<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>' +
"</button>" +
"</div>" :
"") +
(limit + offset < responseJSON.count ?
"<div class=\"level-item\">" +
"<button class=\"button is-rounded is-link\" data-page=\"next\" type=\"button\" title=\"Next\">" +
"</div>"
: "") +
(limit + offset < responseJSON.count
? '<div class="level-item">' +
'<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
"<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>" +
"</div>" :
"") +
"</div>"
: "") +
"</div>") +
"</div>";
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement);
searchResultsContainerElement
.querySelector("table")
.append(resultsTbodyElement);
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) {
searchResultsContainerElement.querySelector("button[data-page='next']").addEventListener("click", nextAndGetLotOccupancies);
searchResultsContainerElement
.querySelector("button[data-page='next']")
.addEventListener("click", nextAndGetLotOccupancies);
}
});
}
);
};
const resetOffsetAndGetLotOccupancies = () => {
offsetElement.value = "0";
getLotOccupancies();
}
};
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();
};
const nextAndGetLotOccupancies = () => {
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString();
offsetElement.value = (
Number.parseInt(offsetElement.value, 10) + limit
).toString();
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) {
filterElement.addEventListener("change", resetOffsetAndGetLotOccupancies);
filterElement.addEventListener(
"change",
resetOffsetAndGetLotOccupancies
);
}
searchFilterFormElement.addEventListener("submit", (formEvent) => {

View File

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

View File

@ -3,9 +3,14 @@
import * as globalTypes from "../types/globalTypes";
(() => {
const mapContainerElement = document.querySelector("#lot--map") as HTMLElement;
const mapContainerElement = document.querySelector(
"#lot--map"
) as HTMLElement;
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;
break;
case "lot":
aliasElement.textContent = exports.aliases.lot.toLowerCase();
aliasElement.textContent =
exports.aliases.lot.toLowerCase();
break;
case "Occupancy":
aliasElement.textContent = exports.aliases.occupancy;
break;
case "occupancy":
aliasElement.textContent = exports.aliases.occupancy.toLowerCase();
aliasElement.textContent =
exports.aliases.occupancy.toLowerCase();
break;
case "Occupant":
aliasElement.textContent = exports.aliases.occupant;
break;
case "occupant":
aliasElement.textContent = exports.aliases.occupant.toLowerCase();
aliasElement.textContent =
exports.aliases.occupant.toLowerCase();
break;
case "ExternalReceiptNumber":
aliasElement.textContent = exports.aliases.externalReceiptNumber;
aliasElement.textContent =
exports.aliases.externalReceiptNumber;
break;
}
}

View File

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

View File

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

View File

@ -1,40 +1,39 @@
/* eslint-disable unicorn/prefer-module */
import type {
cityssmGlobal
} from "@cityssm/bulma-webapp-js/src/types";
import type {
BulmaJS
} from "@cityssm/bulma-js/types";
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
import type { BulmaJS } from "@cityssm/bulma-js/types";
declare const cityssm: cityssmGlobal;
declare const bulmaJS: BulmaJS;
(() => {
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
const mapId = (document.querySelector("#map--mapId") as HTMLInputElement).value;
const isCreate = (mapId === "");
const mapId = (document.querySelector("#map--mapId") as HTMLInputElement)
.value;
const isCreate = mapId === "";
const mapForm = document.querySelector("#form--map") as HTMLFormElement;
const updateMap = (formEvent: SubmitEvent) => {
formEvent.preventDefault();
cityssm.postJSON(urlPrefix + "/maps/" + (isCreate ? "doCreateMap" : "doUpdateMap"),
cityssm.postJSON(
urlPrefix + "/maps/" + (isCreate ? "doCreateMap" : "doUpdateMap"),
mapForm,
(responseJSON: {
success: boolean;mapId ? : number,
errorMessage ? : string
success: boolean;
mapId?: number;
errorMessage?: string;
}) => {
if (responseJSON.success) {
if (isCreate) {
window.location.href = urlPrefix + "/maps/" + responseJSON.mapId + "/edit";
window.location.href =
urlPrefix + "/maps/" + responseJSON.mapId + "/edit";
} else {
bulmaJS.alert({
message: exports.aliases.map + " Updated Successfully",
message:
exports.aliases.map + " Updated Successfully",
contextualColorName: "success"
});
}
@ -45,40 +44,49 @@ declare const bulmaJS: BulmaJS;
contextualColorName: "danger"
});
}
});
}
);
};
mapForm.addEventListener("submit", updateMap);
if (!isCreate) {
document.querySelector("#button--deleteMap").addEventListener("click", (clickEvent) => {
document
.querySelector("#button--deleteMap")
.addEventListener("click", (clickEvent) => {
clickEvent.preventDefault();
const doDelete = () => {
cityssm.postJSON(urlPrefix + "/maps/doDeleteMap", {
cityssm.postJSON(
urlPrefix + "/maps/doDeleteMap",
{
mapId
},
(responseJSON: {
success: boolean;errorMessage ? : string;
success: boolean;
errorMessage?: string;
}) => {
if (responseJSON.success) {
window.location.href = urlPrefix + "/maps?t=" + Date.now();
window.location.href =
urlPrefix + "/maps?t=" + Date.now();
} else {
bulmaJS.alert({
title: "Error Deleting " + exports.aliases.map,
title:
"Error Deleting " + exports.aliases.map,
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
});
}
);
};
bulmaJS.confirm({
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",
okButton: {
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 searchResultsContainerElement = document.querySelector("#container--searchResults");
const renderResults = () => {
searchResultsContainerElement.innerHTML = "<div class=\"has-text-grey has-text-centered\">" +
"<i class=\"fas fa-5x fa-circle-notch fa-spin\" aria-hidden=\"true\"></i><br />" +
"Loading " + exports.aliases.maps + "..." +
searchResultsContainerElement.innerHTML =
'<div class="has-text-grey has-text-centered">' +
'<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />' +
"Loading " +
exports.aliases.maps +
"..." +
"</div>";
let searchResultCount = 0;
const searchResultsTbodyElement = document.createElement("tbody");
const filterStringSplit = searchFilterElement.value.trim().toLowerCase().split(" ");
const filterStringSplit = searchFilterElement.value
.trim()
.toLowerCase()
.split(" ");
for (const map of maps) {
const mapSearchString = (map.mapName + " " +
map.mapDescription + " " +
map.mapAddress1 + " " +
const mapSearchString = (map.mapName +
" " +
map.mapDescription +
" " +
map.mapAddress1 +
" " +
map.mapAddress2).toLowerCase();
let showMap = true;
for (const filterStringPiece of filterStringSplit) {
@ -29,28 +38,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
continue;
}
searchResultCount += 1;
const mapName = map.mapName === "" ?
"(No Name)" :
map.mapName;
const mapName = map.mapName === "" ? "(No Name)" : map.mapName;
searchResultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
("<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) +
"</a><br />" +
cityssm.escapeHTML(map.mapAddress1) +
"</td>") +
"<td class=\"has-text-centered\">" +
(map.mapLatitude && map.mapLongitude ?
"<i class=\"fas fa-map-marker-alt\" title=\"Has Geographic Coordinates\"></i>" :
"") +
'<td class="has-text-centered">' +
(map.mapLatitude && map.mapLongitude
? '<i class="fas fa-map-marker-alt" title="Has Geographic Coordinates"></i>'
: "") +
"</td>" +
"<td class=\"has-text-centered\">" +
(map.mapSVG ?
"<i class=\"fas fa-image\" title=\"Has Image\"></i>" :
"") +
'<td class="has-text-centered">' +
(map.mapSVG
? '<i class="fas fa-image" title="Has Image"></i>'
: "") +
"</td>" +
("<td class=\"has-text-right\">" +
"<a href=\"" + urlPrefix + "/lots?mapId=" + map.mapId + "\">" +
('<td class="has-text-right">' +
'<a href="' +
urlPrefix +
"/lots?mapId=" +
map.mapId +
'">' +
map.lotCount +
"</a>" +
"</td>") +
@ -58,25 +73,36 @@ Object.defineProperty(exports, "__esModule", { value: true });
}
searchResultsContainerElement.innerHTML = "";
if (searchResultCount === 0) {
searchResultsContainerElement.innerHTML = "<div class=\"message is-info\">" +
"<p class=\"message-body\">There are no " + exports.aliases.maps.toLowerCase() + " that meet the search criteria.</p>" +
searchResultsContainerElement.innerHTML =
'<div class="message is-info">' +
'<p class="message-body">There are no ' +
exports.aliases.maps.toLowerCase() +
" that meet the search criteria.</p>" +
"</div>";
}
else {
const searchResultsTableElement = document.createElement("table");
searchResultsTableElement.className = "table is-fullwidth is-striped is-hoverable";
searchResultsTableElement.innerHTML = "<thead><tr>" +
"<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>" +
searchResultsTableElement.className =
"table is-fullwidth is-striped is-hoverable";
searchResultsTableElement.innerHTML =
"<thead><tr>" +
"<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>";
searchResultsTableElement.append(searchResultsTbodyElement);
searchResultsContainerElement.append(searchResultsTableElement);
}
};
searchFilterElement.addEventListener("keyup", renderResults);
document.querySelector("#form--searchFilters").addEventListener("submit", (formEvent) => {
document
.querySelector("#form--searchFilters")
.addEventListener("submit", (formEvent) => {
formEvent.preventDefault();
renderResults();
});

View File

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

View File

@ -8,9 +8,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
const mapCoordinates = [mapLatitude, mapLongitude];
const map = L.map(mapContainerElement);
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,
attribution: '© OpenStreetMap'
attribution: "© OpenStreetMap"
}).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 { BulmaJS } from "@cityssm/bulma-js/types";
// import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
// import type { BulmaJS } from "@cityssm/bulma-js/types";
import type * as Leaflet from "leaflet";
declare const cityssm: cityssmGlobal;
declare const bulmaJS: BulmaJS;
// declare const cityssm: cityssmGlobal;
// declare const bulmaJS: BulmaJS;
declare const L;
(() => {
const mapContainerElement = document.querySelector("#map--leaflet") as HTMLElement;
const mapContainerElement = document.querySelector(
"#map--leaflet"
) as HTMLElement;
if (mapContainerElement) {
const mapLatitude = Number.parseFloat(mapContainerElement.dataset.mapLatitude);
const mapLongitude = Number.parseFloat(mapContainerElement.dataset.mapLongitude);
const mapLatitude = Number.parseFloat(
mapContainerElement.dataset.mapLatitude
);
const mapLongitude = Number.parseFloat(
mapContainerElement.dataset.mapLongitude
);
const mapCoordinates: Leaflet.LatLngTuple = [mapLatitude, mapLongitude];
const map: Leaflet.Map = L.map(mapContainerElement);
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,
attribution: '© OpenStreetMap'
attribution: "© OpenStreetMap"
}).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 searchFilterFormElement = document.querySelector("#form--searchFilters");
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 getWorkOrders = () => {
const offset = Number.parseInt(offsetElement.value, 10);
searchResultsContainerElement.innerHTML = "<div class=\"has-text-grey has-text-centered\">" +
"<i class=\"fas fa-5x fa-circle-notch fa-spin\" aria-hidden=\"true\"></i><br />" +
searchResultsContainerElement.innerHTML =
'<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..." +
"</div>";
cityssm.postJSON(urlPrefix + "/workOrders/doSearchWorkOrders", searchFilterFormElement, (responseJSON) => {
if (responseJSON.workOrders.length === 0) {
searchResultsContainerElement.innerHTML = "<div class=\"message is-info\">" +
"<p class=\"message-body\">There are no work orders that meet the search criteria.</p>" +
searchResultsContainerElement.innerHTML =
'<div class="message is-info">' +
'<p class="message-body">There are no work orders that meet the search criteria.</p>' +
"</div>";
return;
}
@ -23,23 +26,32 @@ Object.defineProperty(exports, "__esModule", { value: true });
for (const workOrder of responseJSON.workOrders) {
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
("<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) +
"</a>" +
"</td>") +
("<td>" +
cityssm.escapeHTML(workOrder.workOrderType) +
"</td>") +
"<td>" + cityssm.escapeHTML(workOrder.workOrderDescription) + "</td>" +
"<td>" +
cityssm.escapeHTML(workOrder.workOrderDescription) +
"</td>" +
("<td>" +
workOrder.workOrderOpenDateString +
"</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>") +
"</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>" +
"<th>Work Order Number</th>" +
"<th>Work Order Type</th>" +
@ -48,38 +60,47 @@ Object.defineProperty(exports, "__esModule", { value: true });
"<th>Close Date</th>" +
"</tr></thead>" +
"<table>" +
"<div class=\"level\">" +
("<div class=\"level-left\">" +
"<div class=\"level-item has-text-weight-bold\">" +
"Displaying " + (offset + 1).toString() +
" to " + Math.min(responseJSON.count, limit + offset) +
" of " + responseJSON.count +
'<div class="level">' +
('<div class="level-left">' +
'<div class="level-item has-text-weight-bold">' +
"Displaying " +
(offset + 1).toString() +
" to " +
Math.min(responseJSON.count, limit + offset) +
" of " +
responseJSON.count +
"</div>" +
"</div>") +
("<div class=\"level-right\">" +
(offset > 0 ?
"<div class=\"level-item\">" +
"<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>" +
('<div class="level-right">' +
(offset > 0
? '<div class="level-item">' +
'<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>' +
"</button>" +
"</div>" :
"") +
(limit + offset < responseJSON.count ?
"<div class=\"level-item\">" +
"<button class=\"button is-rounded is-link\" data-page=\"next\" type=\"button\" title=\"Next\">" +
"</div>"
: "") +
(limit + offset < responseJSON.count
? '<div class="level-item">' +
'<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
"<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>" +
"</div>" :
"") +
"</div>"
: "") +
"</div>") +
"</div>";
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement);
searchResultsContainerElement
.querySelector("table")
.append(resultsTbodyElement);
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) {
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 {
cityssmGlobal
} from "@cityssm/bulma-webapp-js/src/types";
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
declare const cityssm: cityssmGlobal;
(() => {
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
const searchFilterFormElement = document.querySelector("#form--searchFilters") as HTMLFormElement;
const searchResultsContainerElement = document.querySelector("#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 searchFilterFormElement = document.querySelector(
"#form--searchFilters"
) as HTMLFormElement;
const searchResultsContainerElement = document.querySelector(
"#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 offset = Number.parseInt(offsetElement.value, 10);
searchResultsContainerElement.innerHTML = "<div class=\"has-text-grey has-text-centered\">" +
"<i class=\"fas fa-5x fa-circle-notch fa-spin\" aria-hidden=\"true\"></i><br />" +
searchResultsContainerElement.innerHTML =
'<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..." +
"</div>";
cityssm.postJSON(urlPrefix + "/workOrders/doSearchWorkOrders", searchFilterFormElement,
cityssm.postJSON(
urlPrefix + "/workOrders/doSearchWorkOrders",
searchFilterFormElement,
(responseJSON: {
count: number;
workOrders: recordTypes.WorkOrder[];
}) => {
if (responseJSON.workOrders.length === 0) {
searchResultsContainerElement.innerHTML = "<div class=\"message is-info\">" +
"<p class=\"message-body\">There are no work orders that meet the search criteria.</p>" +
searchResultsContainerElement.innerHTML =
'<div class="message is-info">' +
'<p class="message-body">There are no work orders that meet the search criteria.</p>' +
"</div>";
return;
@ -47,28 +53,38 @@ declare const cityssm: cityssmGlobal;
const resultsTbodyElement = document.createElement("tbody");
for (const workOrder of responseJSON.workOrders) {
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
resultsTbodyElement.insertAdjacentHTML(
"beforeend",
"<tr>" +
("<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) +
"</a>" +
"</td>") +
("<td>" +
cityssm.escapeHTML(workOrder.workOrderType) +
"</td>") +
"<td>" + cityssm.escapeHTML(workOrder.workOrderDescription) + "</td>" +
"<td>" +
cityssm.escapeHTML(workOrder.workOrderDescription) +
"</td>" +
("<td>" +
workOrder.workOrderOpenDateString +
"</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>") +
"</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>" +
"<th>Work Order Number</th>" +
"<th>Work Order Type</th>" +
@ -77,61 +93,78 @@ declare const cityssm: cityssmGlobal;
"<th>Close Date</th>" +
"</tr></thead>" +
"<table>" +
"<div class=\"level\">" +
("<div class=\"level-left\">" +
"<div class=\"level-item has-text-weight-bold\">" +
"Displaying " + (offset + 1).toString() +
" to " + Math.min(responseJSON.count, limit + offset) +
" of " + responseJSON.count +
'<div class="level">' +
('<div class="level-left">' +
'<div class="level-item has-text-weight-bold">' +
"Displaying " +
(offset + 1).toString() +
" to " +
Math.min(responseJSON.count, limit + offset) +
" of " +
responseJSON.count +
"</div>" +
"</div>") +
("<div class=\"level-right\">" +
(offset > 0 ?
"<div class=\"level-item\">" +
"<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>" +
('<div class="level-right">' +
(offset > 0
? '<div class="level-item">' +
'<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>' +
"</button>" +
"</div>" :
"") +
(limit + offset < responseJSON.count ?
"<div class=\"level-item\">" +
"<button class=\"button is-rounded is-link\" data-page=\"next\" type=\"button\" title=\"Next\">" +
"</div>"
: "") +
(limit + offset < responseJSON.count
? '<div class="level-item">' +
'<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
"<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>" +
"</div>" :
"") +
"</div>"
: "") +
"</div>") +
"</div>";
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement);
searchResultsContainerElement
.querySelector("table")
.append(resultsTbodyElement);
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) {
searchResultsContainerElement.querySelector("button[data-page='next']").addEventListener("click", nextAndGetWorkOrders);
searchResultsContainerElement
.querySelector("button[data-page='next']")
.addEventListener("click", nextAndGetWorkOrders);
}
});
}
);
};
const resetOffsetAndGetWorkOrders = () => {
offsetElement.value = "0";
getWorkOrders();
}
};
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();
};
const nextAndGetWorkOrders = () => {
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString();
offsetElement.value = (
Number.parseInt(offsetElement.value, 10) + limit
).toString();
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) {
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_doMoveFeeDown from "../handlers/admin-post/doMoveFeeDown.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_doAddWorkOrderType from "../handlers/admin-post/doAddWorkOrderType.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("/doMoveFeeDown", permissionHandlers.adminPostHandler, handler_doMoveFeeDown);
router.post("/doDeleteFee", permissionHandlers.adminPostHandler, handler_doDeleteFee);
router.get("/occupancyTypes", permissionHandlers.adminGetHandler, handler_occupancyTypes);
router.get("/tables", permissionHandlers.adminGetHandler, handler_tables);
router.post("/doAddWorkOrderType", permissionHandlers.adminPostHandler, handler_doAddWorkOrderType);
router.post("/doUpdateWorkOrderType", permissionHandlers.adminPostHandler, handler_doUpdateWorkOrderType);

View File

@ -1,10 +1,11 @@
import {
Router
} from "express";
import { Router } from "express";
import * as permissionHandlers from "../handlers/permissions.js";
// Fee Management
import handler_fees from "../handlers/admin-get/fees.js";
import handler_doAddFeeCategory from "../handlers/admin-post/doAddFeeCategory.js";
import handler_doUpdateFeeCategory from "../handlers/admin-post/doUpdateFeeCategory.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_doDeleteFee from "../handlers/admin-post/doDeleteFee.js";
// Config Table Management
import handler_tables from "../handlers/admin-get/tables.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_doDeleteLotOccupantType from "../handlers/admin-post/doDeleteLotOccupantType.js";
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,
handler_fees);
/*
* Config Tables
*/
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);
// Config Tables
router.get("/tables",
permissionHandlers.adminGetHandler,
handler_tables);
router.get("/tables", permissionHandlers.adminGetHandler, handler_tables);
// Config Tables - Work Order Types
router.post("/doAddWorkOrderType",
router.post(
"/doAddWorkOrderType",
permissionHandlers.adminPostHandler,
handler_doAddWorkOrderType);
handler_doAddWorkOrderType
);
router.post("/doUpdateWorkOrderType",
router.post(
"/doUpdateWorkOrderType",
permissionHandlers.adminPostHandler,
handler_doUpdateWorkOrderType);
handler_doUpdateWorkOrderType
);
router.post("/doMoveWorkOrderTypeUp",
router.post(
"/doMoveWorkOrderTypeUp",
permissionHandlers.adminPostHandler,
handler_doMoveWorkOrderTypeUp);
handler_doMoveWorkOrderTypeUp
);
router.post("/doMoveWorkOrderTypeDown",
router.post(
"/doMoveWorkOrderTypeDown",
permissionHandlers.adminPostHandler,
handler_doMoveWorkOrderTypeDown);
handler_doMoveWorkOrderTypeDown
);
router.post("/doDeleteWorkOrderType",
router.post(
"/doDeleteWorkOrderType",
permissionHandlers.adminPostHandler,
handler_doDeleteWorkOrderType);
handler_doDeleteWorkOrderType
);
// Config Tables - Lot Statuses
router.post("/doAddLotStatus",
router.post(
"/doAddLotStatus",
permissionHandlers.adminPostHandler,
handler_doAddLotStatus);
handler_doAddLotStatus
);
router.post("/doUpdateLotStatus",
router.post(
"/doUpdateLotStatus",
permissionHandlers.adminPostHandler,
handler_doUpdateLotStatus);
handler_doUpdateLotStatus
);
router.post("/doMoveLotStatusUp",
router.post(
"/doMoveLotStatusUp",
permissionHandlers.adminPostHandler,
handler_doMoveLotStatusUp);
handler_doMoveLotStatusUp
);
router.post("/doMoveLotStatusDown",
router.post(
"/doMoveLotStatusDown",
permissionHandlers.adminPostHandler,
handler_doMoveLotStatusDown);
handler_doMoveLotStatusDown
);
router.post("/doDeleteLotStatus",
router.post(
"/doDeleteLotStatus",
permissionHandlers.adminPostHandler,
handler_doDeleteLotStatus);
handler_doDeleteLotStatus
);
// Config Tables - Lot Occupant Types
router.post("/doAddLotOccupantType",
router.post(
"/doAddLotOccupantType",
permissionHandlers.adminPostHandler,
handler_doAddLotOccupantType);
handler_doAddLotOccupantType
);
router.post("/doUpdateLotOccupantType",
router.post(
"/doUpdateLotOccupantType",
permissionHandlers.adminPostHandler,
handler_doUpdateLotOccupantType);
handler_doUpdateLotOccupantType
);
router.post("/doMoveLotOccupantTypeUp",
router.post(
"/doMoveLotOccupantTypeUp",
permissionHandlers.adminPostHandler,
handler_doMoveLotOccupantTypeUp);
handler_doMoveLotOccupantTypeUp
);
router.post("/doMoveLotOccupantTypeDown",
router.post(
"/doMoveLotOccupantTypeDown",
permissionHandlers.adminPostHandler,
handler_doMoveLotOccupantTypeDown);
handler_doMoveLotOccupantTypeDown
);
router.post("/doDeleteLotOccupantType",
router.post(
"/doDeleteLotOccupantType",
permissionHandlers.adminPostHandler,
handler_doDeleteLotOccupantType);
handler_doDeleteLotOccupantType
);
export default router;

View File

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

View File

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

View File

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

View File

@ -1,6 +1,4 @@
import {
Router
} from "express";
import { Router } from "express";
import handler_search from "../handlers/lotOccupancies-get/search.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";
export const router = Router();
// Search
router.get("/",
handler_search);
router.get("/", handler_search);
router.post("/doSearchLotOccupancies",
handler_doSearchLotOccupancies);
router.post("/doSearchLotOccupancies", handler_doSearchLotOccupancies);
// Create
router.get("/new",
permissionHandlers.updateGetHandler,
handler_new);
router.get("/new", permissionHandlers.updateGetHandler, handler_new);
router.post("/doGetOccupancyTypeFields",
router.post(
"/doGetOccupancyTypeFields",
permissionHandlers.updatePostHandler,
handler_doGetOccupancyTypeFields);
handler_doGetOccupancyTypeFields
);
router.post("/doCreateLotOccupancy",
router.post(
"/doCreateLotOccupancy",
permissionHandlers.updatePostHandler,
handler_doCreateLotOccupancy);
handler_doCreateLotOccupancy
);
// View
router.get("/:lotOccupancyId",
handler_view);
router.get("/:lotOccupancyId", handler_view);
router.get("/:lotOccupancyId/print",
handler_print);
router.get("/:lotOccupancyId/print", handler_print);
// Edit
router.get("/:lotOccupancyId/edit",
router.get(
"/:lotOccupancyId/edit",
permissionHandlers.updateGetHandler,
handler_edit);
handler_edit
);
router.post("/doUpdateLotOccupancy",
router.post(
"/doUpdateLotOccupancy",
permissionHandlers.updatePostHandler,
handler_doUpdateLotOccupancy);
handler_doUpdateLotOccupancy
);
router.post("/doDeleteLotOccupancy",
router.post(
"/doDeleteLotOccupancy",
permissionHandlers.updatePostHandler,
handler_doDeleteLotOccupancy);
handler_doDeleteLotOccupancy
);
// Occupants
router.post("/doAddLotOccupancyOccupant",
router.post(
"/doAddLotOccupancyOccupant",
permissionHandlers.updatePostHandler,
handler_doAddLotOccupancyOccupant);
handler_doAddLotOccupancyOccupant
);
router.post("/doUpdateLotOccupancyOccupant",
router.post(
"/doUpdateLotOccupancyOccupant",
permissionHandlers.updatePostHandler,
handler_doUpdateLotOccupancyOccupant);
handler_doUpdateLotOccupancyOccupant
);
router.post("/doDeleteLotOccupancyOccupant",
router.post(
"/doDeleteLotOccupancyOccupant",
permissionHandlers.updatePostHandler,
handler_doDeleteLotOccupancyOccupant);
handler_doDeleteLotOccupancyOccupant
);
// Comments
router.post("/doAddLotOccupancyComment",
router.post(
"/doAddLotOccupancyComment",
permissionHandlers.updatePostHandler,
handler_doAddLotOccupancyComment);
handler_doAddLotOccupancyComment
);
router.post("/doUpdateLotOccupancyComment",
router.post(
"/doUpdateLotOccupancyComment",
permissionHandlers.updatePostHandler,
handler_doUpdateLotOccupancyComment);
handler_doUpdateLotOccupancyComment
);
router.post("/doDeleteLotOccupancyComment",
router.post(
"/doDeleteLotOccupancyComment",
permissionHandlers.updatePostHandler,
handler_doDeleteLotOccupancyComment);
handler_doDeleteLotOccupancyComment
);
// Fees
router.post("/doGetFees",
router.post(
"/doGetFees",
permissionHandlers.updatePostHandler,
handler_doGetFees);
handler_doGetFees
);
router.post("/doAddLotOccupancyFee",
router.post(
"/doAddLotOccupancyFee",
permissionHandlers.updatePostHandler,
handler_doAddLotOccupancyFee);
handler_doAddLotOccupancyFee
);
router.post("/doDeleteLotOccupancyFee",
router.post(
"/doDeleteLotOccupancyFee",
permissionHandlers.updatePostHandler,
handler_doDeleteLotOccupancyFee);
handler_doDeleteLotOccupancyFee
);
// Transactions
router.post("/doAddLotOccupancyTransaction",
router.post(
"/doAddLotOccupancyTransaction",
permissionHandlers.updatePostHandler,
handler_doAddLotOccupancyTransaction);
handler_doAddLotOccupancyTransaction
);
router.post("/doDeleteLotOccupancyTransaction",
router.post(
"/doDeleteLotOccupancyTransaction",
permissionHandlers.updatePostHandler,
handler_doDeleteLotOccupancyTransaction);
handler_doDeleteLotOccupancyTransaction
);
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_doDeleteLotComment from "../handlers/lots-post/doDeleteLotComment.js";
export const router = Router();
/*
* Lot Search
*/
router.get("/", handler_search);
router.get("/",
handler_search);
router.post("/doSearchLots",
handler_doSearchLots);
router.post("/doSearchLots", handler_doSearchLots);
/*
* Lot View / Edit
*/
router.get("/new", permissionHandlers.updateGetHandler, handler_new);
router.get("/new",
permissionHandlers.updateGetHandler,
handler_new);
router.get("/:lotId", handler_view);
router.get("/:lotId/next", handler_next);
router.get("/:lotId",
handler_view);
router.get("/:lotId/previous", handler_previous);
router.get("/:lotId/edit", permissionHandlers.updateGetHandler, handler_edit);
router.get("/:lotId/next",
handler_next);
router.get("/:lotId/previous",
handler_previous);
router.get("/:lotId/edit",
permissionHandlers.updateGetHandler,
handler_edit);
router.post("/doCreateLot",
router.post(
"/doCreateLot",
permissionHandlers.updatePostHandler,
handler_doCreateLot);
handler_doCreateLot
);
router.post("/doUpdateLot",
router.post(
"/doUpdateLot",
permissionHandlers.updatePostHandler,
handler_doUpdateLot);
handler_doUpdateLot
);
router.post("/doAddLotComment",
router.post(
"/doAddLotComment",
permissionHandlers.updatePostHandler,
handler_doAddLotComment);
handler_doAddLotComment
);
router.post("/doUpdateLotComment",
router.post(
"/doUpdateLotComment",
permissionHandlers.updatePostHandler,
handler_doUpdateLotComment);
handler_doUpdateLotComment
);
router.post("/doDeleteLotComment",
router.post(
"/doDeleteLotComment",
permissionHandlers.updatePostHandler,
handler_doDeleteLotComment);
handler_doDeleteLotComment
);
export default router;

View File

@ -1,6 +1,4 @@
import {
Router
} from "express";
import { Router } from "express";
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_doDeleteMap from "../handlers/maps-post/doDeleteMap.js";
export const router = Router();
router.get("/", handler_search);
router.get("/",
handler_search);
router.get("/new", permissionHandlers.updateGetHandler, handler_new);
router.get("/:mapId", handler_view);
router.get("/new",
permissionHandlers.updateGetHandler,
handler_new);
router.get("/:mapId/edit", permissionHandlers.updateGetHandler, handler_edit);
router.get("/:mapId",
handler_view);
router.get("/:mapId/edit",
permissionHandlers.updateGetHandler,
handler_edit);
router.post("/doCreateMap",
router.post(
"/doCreateMap",
permissionHandlers.updatePostHandler,
handler_doCreateMap);
handler_doCreateMap
);
router.post("/doUpdateMap",
router.post(
"/doUpdateMap",
permissionHandlers.updatePostHandler,
handler_doUpdateMap);
handler_doUpdateMap
);
router.post("/doDeleteMap",
router.post(
"/doDeleteMap",
permissionHandlers.updatePostHandler,
handler_doDeleteMap);
handler_doDeleteMap
);
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";
export const router = Router();
router.get("/", (_request, response) => {
const rightNow = new Date();
response.render("report-search", {
headTitle: "Reports",
todayDateString: dateTimeFns.dateToString(rightNow)
});
});
router.all("/:reportName", handler_reportName);
export default router;

View File

@ -1,6 +1,4 @@
import {
Router
} from "express";
import { Router } from "express";
import * as permissionHandlers from "../handlers/permissions.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";
export const router = Router();
router.get("/", handler_search);
router.get("/",
handler_search);
router.post("/doSearchWorkOrders",
handler_doSearchWorkOrders);
router.get("/:workOrderId",
handler_view);
router.post("/doSearchWorkOrders", handler_doSearchWorkOrders);
router.get("/:workOrderId", handler_view);
export default router;

View File

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

View File

@ -2,28 +2,19 @@
import * as assert from "assert";
import {
portNumber
} from "./_globals.js";
import { portNumber } from "./_globals.js";
import {
exec
} from "child_process";
import { exec } from "child_process";
import * as http from "http";
import {
app
} from "../app.js";
import { app } from "../app.js";
describe("lot-occupancy-system", () => {
const httpServer = http.createServer(app);
let serverStarted = false;
before(() => {
httpServer.listen(portNumber);
httpServer.on("listening", () => {
@ -44,12 +35,14 @@ describe("lot-occupancy-system", () => {
});
describe("Cypress tests", () => {
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";
}

View File

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

View File

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

View File

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

View File

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

View File

@ -1,5 +1,9 @@
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;
populateAliases: (containerElement: HTMLElement) => void;
}

View File

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

View File

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

View File

@ -9,6 +9,12 @@
<span>Fee Management</span>
</a>
</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>
<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>

View File

@ -145,6 +145,23 @@
</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="media">
<div class="media-left">