formatting with prettier
parent
6703302913
commit
3e15918d6d
|
|
@ -0,0 +1,2 @@
|
|||
*.ejs
|
||||
*.js
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"trailingComma": "none",
|
||||
"tabWidth": 4,
|
||||
"semi": true,
|
||||
"singleQuote": false
|
||||
}
|
||||
3
app.js
3
app.js
|
|
@ -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");
|
||||
});
|
||||
|
|
|
|||
146
app.ts
146
app.ts
|
|
@ -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({
|
||||
extended: false
|
||||
}));
|
||||
app.use(
|
||||
express.urlencoded({
|
||||
extended: false
|
||||
})
|
||||
);
|
||||
|
||||
app.use(cookieParser());
|
||||
app.use(csurf({
|
||||
cookie: true
|
||||
}));
|
||||
|
||||
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,48 +100,59 @@ 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({
|
||||
store: new FileStoreSession({
|
||||
path: "./data/sessions",
|
||||
logFn: debug("general-licence-manager:session"),
|
||||
retries: 10
|
||||
}),
|
||||
name: sessionCookieName,
|
||||
secret: configFunctions.getProperty("session.secret"),
|
||||
resave: true,
|
||||
saveUninitialized: false,
|
||||
rolling: true,
|
||||
cookie: {
|
||||
maxAge: configFunctions.getProperty("session.maxAgeMillis"),
|
||||
sameSite: "strict"
|
||||
}
|
||||
}));
|
||||
app.use(
|
||||
session({
|
||||
store: new FileStoreSession({
|
||||
path: "./data/sessions",
|
||||
logFn: debug("general-licence-manager:session"),
|
||||
retries: 10
|
||||
}),
|
||||
name: sessionCookieName,
|
||||
secret: configFunctions.getProperty("session.secret"),
|
||||
resave: true,
|
||||
saveUninitialized: false,
|
||||
rolling: true,
|
||||
cookie: {
|
||||
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
|
||||
},
|
||||
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 : {};
|
||||
|
||||
// Render the error page
|
||||
response.status(error.status || 500);
|
||||
response.render("error");
|
||||
});
|
||||
app.use(
|
||||
(
|
||||
error: {
|
||||
status: number;
|
||||
message: string;
|
||||
},
|
||||
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 : {};
|
||||
|
||||
// Render the error page
|
||||
response.status(error.status || 500);
|
||||
response.render("error");
|
||||
}
|
||||
);
|
||||
|
||||
export default app;
|
||||
|
|
@ -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"
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
}
|
||||
e2e: {
|
||||
baseUrl: "http://localhost:7000",
|
||||
specPattern: "cypress/e2e/**/*.cy.ts",
|
||||
supportFile: false,
|
||||
projectId: "xya1fn"
|
||||
}
|
||||
});
|
||||
12
gulpfile.js
12
gulpfile.js
|
|
@ -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"
|
||||
}))
|
||||
|
|
|
|||
38
gulpfile.ts
38
gulpfile.ts
|
|
@ -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,10 +15,10 @@ const sass = gulpSass(dartSass);
|
|||
const publicSCSSDestination = "public/stylesheets";
|
||||
|
||||
const publicSCSSFunction = () => {
|
||||
|
||||
return gulp.src("public-scss/*.scss")
|
||||
.pipe(sass({outputStyle: 'compressed'}).on('error', sass.logError))
|
||||
.pipe(gulp.dest(publicSCSSDestination));
|
||||
return gulp
|
||||
.src("public-scss/*.scss")
|
||||
.pipe(sass({ outputStyle: "compressed" }).on("error", sass.logError))
|
||||
.pipe(gulp.dest(publicSCSSDestination));
|
||||
};
|
||||
|
||||
gulp.task("public-scss", publicSCSSFunction);
|
||||
|
|
@ -30,13 +30,15 @@ gulp.task("public-scss", publicSCSSFunction);
|
|||
const publicJavascriptsDestination = "public/javascripts";
|
||||
|
||||
const publicJavascriptsMinFunction = () => {
|
||||
|
||||
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));
|
||||
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));
|
||||
};
|
||||
|
||||
gulp.task("public-javascript-min", publicJavascriptsMinFunction);
|
||||
|
|
@ -46,8 +48,8 @@ gulp.task("public-javascript-min", publicJavascriptsMinFunction);
|
|||
*/
|
||||
|
||||
const watchFunction = () => {
|
||||
gulp.watch("public-scss/*.scss", publicSCSSFunction);
|
||||
gulp.watch("public-typescript/*.js", publicJavascriptsMinFunction);
|
||||
gulp.watch("public-scss/*.scss", publicSCSSFunction);
|
||||
gulp.watch("public-typescript/*.js", publicJavascriptsMinFunction);
|
||||
};
|
||||
|
||||
gulp.task("watch", watchFunction);
|
||||
|
|
@ -57,7 +59,7 @@ gulp.task("watch", watchFunction);
|
|||
*/
|
||||
|
||||
gulp.task("default", () => {
|
||||
publicJavascriptsMinFunction();
|
||||
publicSCSSFunction();
|
||||
watchFunction();
|
||||
publicJavascriptsMinFunction();
|
||||
publicSCSSFunction();
|
||||
watchFunction();
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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({}, {
|
||||
includeFees: true
|
||||
});
|
||||
const feeCategories = getFeeCategories(
|
||||
{},
|
||||
{
|
||||
includeFees: true
|
||||
}
|
||||
);
|
||||
|
||||
const occupancyTypes = getOccupancyTypes();
|
||||
const lotTypes = getLotTypes();
|
||||
|
|
@ -26,5 +26,4 @@ export const handler: RequestHandler = (_request, response) => {
|
|||
});
|
||||
};
|
||||
|
||||
|
||||
export default handler;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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({}, {
|
||||
includeFees: true
|
||||
});
|
||||
const feeCategories = getFeeCategories(
|
||||
{},
|
||||
{
|
||||
includeFees: true
|
||||
}
|
||||
);
|
||||
|
||||
response.json({
|
||||
success: true,
|
||||
|
|
@ -27,5 +21,4 @@ export const handler: RequestHandler = async (request, response) => {
|
|||
});
|
||||
};
|
||||
|
||||
|
||||
export default handler;
|
||||
|
|
@ -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({}, {
|
||||
includeFees: true
|
||||
});
|
||||
const feeCategories = getFeeCategories(
|
||||
{},
|
||||
{
|
||||
includeFees: true
|
||||
}
|
||||
);
|
||||
|
||||
response.json({
|
||||
success: true,
|
||||
|
|
@ -27,5 +21,4 @@ export const handler: RequestHandler = async (request, response) => {
|
|||
});
|
||||
};
|
||||
|
||||
|
||||
export default handler;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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({}, {
|
||||
includeFees: true
|
||||
});
|
||||
const feeCategories = getFeeCategories(
|
||||
{},
|
||||
{
|
||||
includeFees: true
|
||||
}
|
||||
);
|
||||
|
||||
response.json({
|
||||
success,
|
||||
|
|
@ -26,5 +20,4 @@ export const handler: RequestHandler = async (request, response) => {
|
|||
});
|
||||
};
|
||||
|
||||
|
||||
export default handler;
|
||||
|
|
@ -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({}, {
|
||||
includeFees: true
|
||||
});
|
||||
const feeCategories = getFeeCategories(
|
||||
{},
|
||||
{
|
||||
includeFees: true
|
||||
}
|
||||
);
|
||||
|
||||
response.json({
|
||||
success,
|
||||
|
|
@ -26,5 +23,4 @@ export const handler: RequestHandler = async (request, response) => {
|
|||
});
|
||||
};
|
||||
|
||||
|
||||
export default handler;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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({}, {
|
||||
includeFees: true
|
||||
});
|
||||
const feeCategories = getFeeCategories(
|
||||
{},
|
||||
{
|
||||
includeFees: true
|
||||
}
|
||||
);
|
||||
|
||||
response.json({
|
||||
success,
|
||||
|
|
@ -25,5 +20,4 @@ export const handler: RequestHandler = async (request, response) => {
|
|||
});
|
||||
};
|
||||
|
||||
|
||||
export default handler;
|
||||
|
|
@ -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({}, {
|
||||
includeFees: true
|
||||
});
|
||||
const feeCategories = getFeeCategories(
|
||||
{},
|
||||
{
|
||||
includeFees: true
|
||||
}
|
||||
);
|
||||
|
||||
response.json({
|
||||
success,
|
||||
|
|
@ -25,5 +20,4 @@ export const handler: RequestHandler = async (request, response) => {
|
|||
});
|
||||
};
|
||||
|
||||
|
||||
export default handler;
|
||||
|
|
@ -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({}, {
|
||||
includeFees: true
|
||||
});
|
||||
const feeCategories = getFeeCategories(
|
||||
{},
|
||||
{
|
||||
includeFees: true
|
||||
}
|
||||
);
|
||||
|
||||
response.json({
|
||||
success,
|
||||
|
|
@ -25,5 +20,4 @@ export const handler: RequestHandler = async (request, response) => {
|
|||
});
|
||||
};
|
||||
|
||||
|
||||
export default handler;
|
||||
|
|
@ -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({}, {
|
||||
includeFees: true
|
||||
});
|
||||
const feeCategories = getFeeCategories(
|
||||
{},
|
||||
{
|
||||
includeFees: true
|
||||
}
|
||||
);
|
||||
|
||||
response.json({
|
||||
success,
|
||||
|
|
@ -25,5 +20,4 @@ export const handler: RequestHandler = async (request, response) => {
|
|||
});
|
||||
};
|
||||
|
||||
|
||||
export default handler;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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({}, {
|
||||
includeFees: true
|
||||
});
|
||||
const feeCategories = getFeeCategories(
|
||||
{},
|
||||
{
|
||||
includeFees: true
|
||||
}
|
||||
);
|
||||
|
||||
response.json({
|
||||
success,
|
||||
|
|
@ -26,5 +20,4 @@ export const handler: RequestHandler = async (request, response) => {
|
|||
});
|
||||
};
|
||||
|
||||
|
||||
export default handler;
|
||||
|
|
@ -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({}, {
|
||||
includeFees: true
|
||||
});
|
||||
const feeCategories = getFeeCategories(
|
||||
{},
|
||||
{
|
||||
includeFees: true
|
||||
}
|
||||
);
|
||||
|
||||
response.json({
|
||||
success,
|
||||
|
|
@ -26,5 +20,4 @@ export const handler: RequestHandler = async (request, response) => {
|
|||
});
|
||||
};
|
||||
|
||||
|
||||
export default handler;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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>" +
|
||||
"</div>";
|
||||
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\">" +
|
||||
"<p>" +
|
||||
"<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>" +
|
||||
"</div>") +
|
||||
("<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)) +
|
||||
"<br /><small>Tax</small>" +
|
||||
"</div>") +
|
||||
("<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>" +
|
||||
"</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>" +
|
||||
"</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.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>" +
|
||||
"</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>" +
|
||||
"</div>") +
|
||||
('<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)) +
|
||||
"<br /><small>Tax</small>" +
|
||||
"</div>") +
|
||||
('<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>' +
|
||||
"</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>' +
|
||||
"</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);
|
||||
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
|
|
@ -105,59 +105,76 @@ 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>" +
|
||||
"</div>" +
|
||||
"</td>" +
|
||||
"</tr>";
|
||||
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>";
|
||||
return;
|
||||
}
|
||||
containerElement.innerHTML = "";
|
||||
for (const workOrderType of workOrderTypes) {
|
||||
const tableRowElement = document.createElement("tr");
|
||||
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 />" +
|
||||
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 />' +
|
||||
"</div>" +
|
||||
'<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>' +
|
||||
"</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>" +
|
||||
"</div>") +
|
||||
"</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-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>") +
|
||||
"</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>" +
|
||||
"</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>" +
|
||||
"</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>" +
|
||||
"</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);
|
||||
"</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);
|
||||
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,59 +303,78 @@ 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>" +
|
||||
"</div>" +
|
||||
"</td>" +
|
||||
"</tr>";
|
||||
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>";
|
||||
return;
|
||||
}
|
||||
containerElement.innerHTML = "";
|
||||
for (const lotStatus of lotStatuses) {
|
||||
const tableRowElement = document.createElement("tr");
|
||||
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 />" +
|
||||
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 />' +
|
||||
"</div>" +
|
||||
'<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>' +
|
||||
"</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>" +
|
||||
"</div>") +
|
||||
"</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-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>") +
|
||||
"</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>" +
|
||||
"</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>" +
|
||||
"</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>" +
|
||||
"</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);
|
||||
"</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);
|
||||
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,61 +537,90 @@ 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>" +
|
||||
"</div>" +
|
||||
"</td>" +
|
||||
"</tr>";
|
||||
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>";
|
||||
return;
|
||||
}
|
||||
containerElement.innerHTML = "";
|
||||
for (const lotOccupantType of lotOccupantTypes) {
|
||||
const tableRowElement = document.createElement("tr");
|
||||
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 />" +
|
||||
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 />' +
|
||||
"</div>" +
|
||||
'<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>' +
|
||||
"</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>" +
|
||||
"</div>") +
|
||||
"</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-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>") +
|
||||
"</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>" +
|
||||
"</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>" +
|
||||
"</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>" +
|
||||
"</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);
|
||||
"</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);
|
||||
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
|
|
@ -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>" +
|
||||
"</div>";
|
||||
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>" +
|
||||
"<th>Commentor</th>" +
|
||||
"<th>Comment Date</th>" +
|
||||
"<th>Comment</th>" +
|
||||
"<th class=\"is-hidden-print\"><span class=\"is-sr-only\">Options</span></th>" +
|
||||
"</tr></thead>" +
|
||||
"<tbody></tbody>";
|
||||
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>' +
|
||||
"</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>" +
|
||||
lotComment.lotCommentDateString +
|
||||
(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>" +
|
||||
" <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>") +
|
||||
"</div>" +
|
||||
"</td>");
|
||||
tableRowElement.querySelector(".button--edit").addEventListener("click", openEditLotComment);
|
||||
tableRowElement.querySelector(".button--delete").addEventListener("click", deleteLotComment);
|
||||
cityssm.escapeHTML(lotComment.recordCreate_userName) +
|
||||
"</td>" +
|
||||
"<td>" +
|
||||
lotComment.lotCommentDateString +
|
||||
(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>' +
|
||||
" <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>") +
|
||||
"</div>" +
|
||||
"</td>");
|
||||
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();
|
||||
}
|
||||
})();
|
||||
|
|
|
|||
|
|
@ -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[];
|
||||
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,17 +157,22 @@ 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
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage ? : string;
|
||||
errorMessage?: string;
|
||||
lotComments: recordTypes.LotComment[];
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
|
|
@ -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",
|
||||
formEvent.currentTarget,
|
||||
(responseJSON: {success: boolean; lotComments?: recordTypes.LotComment[]}) => {
|
||||
|
||||
if (responseJSON.success) {
|
||||
lotComments = responseJSON.lotComments;
|
||||
renderLotComments();
|
||||
addCommentCloseModalFunction();
|
||||
cityssm.postJSON(
|
||||
urlPrefix + "/lots/doAddLotComment",
|
||||
formEvent.currentTarget,
|
||||
(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
|
|
@ -4,102 +4,155 @@ 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 + "..." +
|
||||
"</div>";
|
||||
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>" +
|
||||
"</div>";
|
||||
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;
|
||||
}
|
||||
const resultsTbodyElement = document.createElement("tbody");
|
||||
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\">" +
|
||||
"<thead><tr>" +
|
||||
"<th></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>" +
|
||||
"</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>" +
|
||||
"</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>" +
|
||||
"</button>" +
|
||||
"</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>" +
|
||||
"</button>" +
|
||||
"</div>" :
|
||||
"") +
|
||||
"</div>") +
|
||||
"</div>";
|
||||
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement);
|
||||
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>Start Date</th>" +
|
||||
"<th>End Date</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>" +
|
||||
"</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>' +
|
||||
"</button>" +
|
||||
"</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>' +
|
||||
"</button>" +
|
||||
"</div>"
|
||||
: "") +
|
||||
"</div>") +
|
||||
"</div>";
|
||||
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);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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>" +
|
||||
("<td>" +
|
||||
"<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>" +
|
||||
"</td>") +
|
||||
("<td>" +
|
||||
lotOccupancy.occupancyStartDateString +
|
||||
"</td>") +
|
||||
("<td>" +
|
||||
(lotOccupancy.occupancyEndDate ?
|
||||
lotOccupancy.occupancyEndDateString :
|
||||
"<span class=\"has-text-grey\">(No End Date)</span>") +
|
||||
"</td>") +
|
||||
"<td>" + occupantsHTML + "</td>" +
|
||||
"</tr>");
|
||||
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>" +
|
||||
"</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>" +
|
||||
"</td>") +
|
||||
("<td>" +
|
||||
lotOccupancy.occupancyStartDateString +
|
||||
"</td>") +
|
||||
("<td>" +
|
||||
(lotOccupancy.occupancyEndDate
|
||||
? lotOccupancy.occupancyEndDateString
|
||||
: '<span class="has-text-grey">(No End Date)</span>') +
|
||||
"</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>" +
|
||||
"</button>" +
|
||||
"</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>" +
|
||||
"</button>" +
|
||||
"</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>' +
|
||||
"</button>" +
|
||||
"</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>' +
|
||||
"</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", 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) => {
|
||||
|
|
|
|||
|
|
@ -4,81 +4,117 @@ 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 + "..." +
|
||||
"</div>";
|
||||
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>" +
|
||||
"</div>";
|
||||
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;
|
||||
}
|
||||
const resultsTbodyElement = document.createElement("tbody");
|
||||
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\">" +
|
||||
"<thead><tr>" +
|
||||
"<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>" +
|
||||
"</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>" +
|
||||
"</button>" +
|
||||
"</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>" +
|
||||
"</button>" +
|
||||
"</div>"
|
||||
: "") +
|
||||
"</div>") +
|
||||
"</div>";
|
||||
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement);
|
||||
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>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>" +
|
||||
"</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>' +
|
||||
"</button>" +
|
||||
"</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>' +
|
||||
"</button>" +
|
||||
"</div>"
|
||||
: "") +
|
||||
"</div>") +
|
||||
"</div>";
|
||||
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);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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>" +
|
||||
("<td>" +
|
||||
"<a class=\"has-text-weight-bold\" href=\"" + urlPrefix + "/lots/" + lot.lotId + "\">" +
|
||||
lot.lotName +
|
||||
"</a>" +
|
||||
"</td>") +
|
||||
("<td>" +
|
||||
"<a href=\"" + urlPrefix + "/maps/" + lot.mapId + "\">" +
|
||||
lot.mapName +
|
||||
"</a>" +
|
||||
"</td>") +
|
||||
"<td>" + lot.lotType + "</td>" +
|
||||
("<td>" +
|
||||
lot.lotStatus + "<br />" +
|
||||
(lot.lotOccupancyCount > 0 ? "<span class=\"is-size-7\">Currently Occupied</span>" : "") +
|
||||
"</td>") +
|
||||
"</tr>");
|
||||
resultsTbodyElement.insertAdjacentHTML(
|
||||
"beforeend",
|
||||
"<tr>" +
|
||||
("<td>" +
|
||||
'<a class="has-text-weight-bold" href="' +
|
||||
urlPrefix +
|
||||
"/lots/" +
|
||||
lot.lotId +
|
||||
'">' +
|
||||
lot.lotName +
|
||||
"</a>" +
|
||||
"</td>") +
|
||||
("<td>" +
|
||||
'<a href="' +
|
||||
urlPrefix +
|
||||
"/maps/" +
|
||||
lot.mapId +
|
||||
'">' +
|
||||
lot.mapName +
|
||||
"</a>" +
|
||||
"</td>") +
|
||||
"<td>" +
|
||||
lot.lotType +
|
||||
"</td>" +
|
||||
("<td>" +
|
||||
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>" +
|
||||
"</button>" +
|
||||
"</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>' +
|
||||
"</button>" +
|
||||
"</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>" +
|
||||
"</button>" +
|
||||
"</div>"
|
||||
? '<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>' +
|
||||
"</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);
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
);
|
||||
}
|
||||
})();
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,17 +3,21 @@
|
|||
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;
|
||||
let svgElementToHighlight: SVGElement;
|
||||
|
||||
// eslint-disable-next-line no-constant-condition
|
||||
while(true) {
|
||||
svgElementToHighlight = mapContainerElement.querySelector("#" + svgId);
|
||||
while (true) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 + "?",
|
||||
|
|
|
|||
|
|
@ -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,46 +44,55 @@ declare const bulmaJS: BulmaJS;
|
|||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
mapForm.addEventListener("submit", updateMap);
|
||||
|
||||
if (!isCreate) {
|
||||
document
|
||||
.querySelector("#button--deleteMap")
|
||||
.addEventListener("click", (clickEvent) => {
|
||||
clickEvent.preventDefault();
|
||||
|
||||
document.querySelector("#button--deleteMap").addEventListener("click", (clickEvent) => {
|
||||
clickEvent.preventDefault();
|
||||
|
||||
const doDelete = () => {
|
||||
|
||||
cityssm.postJSON(urlPrefix + "/maps/doDeleteMap", {
|
||||
mapId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;errorMessage ? : string;
|
||||
}) => {
|
||||
|
||||
if (responseJSON.success) {
|
||||
window.location.href = urlPrefix + "/maps?t=" + Date.now();
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Deleting " + exports.aliases.map,
|
||||
message: responseJSON.errorMessage,
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(
|
||||
urlPrefix + "/maps/doDeleteMap",
|
||||
{
|
||||
mapId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
window.location.href =
|
||||
urlPrefix + "/maps?t=" + Date.now();
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
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() + "?",
|
||||
contextualColorName: "warning",
|
||||
okButton: {
|
||||
text: "Yes, Delete " + exports.aliases.map + "?",
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
bulmaJS.confirm({
|
||||
title: "Delete " + exports.aliases.map,
|
||||
message:
|
||||
"Are you sure you want to delete this " +
|
||||
exports.aliases.map.toLowerCase() +
|
||||
"?",
|
||||
contextualColorName: "warning",
|
||||
okButton: {
|
||||
text: "Yes, Delete " + exports.aliases.map + "?",
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
})();
|
||||
|
|
@ -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 + "..." +
|
||||
"</div>";
|
||||
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>" +
|
||||
"</div>";
|
||||
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>" +
|
||||
"</tr></thead>";
|
||||
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();
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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>" +
|
||||
("<td>" +
|
||||
"<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>" +
|
||||
"<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 + "\">" +
|
||||
map.lotCount +
|
||||
"</a>" +
|
||||
"</td>") +
|
||||
"</tr>");
|
||||
searchResultsTbodyElement.insertAdjacentHTML(
|
||||
"beforeend",
|
||||
"<tr>" +
|
||||
("<td>" +
|
||||
'<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>" +
|
||||
'<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 +
|
||||
'">' +
|
||||
map.lotCount +
|
||||
"</a>" +
|
||||
"</td>") +
|
||||
"</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,10 +132,12 @@ declare const cityssm: cityssmGlobal;
|
|||
};
|
||||
|
||||
searchFilterElement.addEventListener("keyup", renderResults);
|
||||
document.querySelector("#form--searchFilters").addEventListener("submit", (formEvent) => {
|
||||
formEvent.preventDefault();
|
||||
renderResults();
|
||||
});
|
||||
document
|
||||
.querySelector("#form--searchFilters")
|
||||
.addEventListener("submit", (formEvent) => {
|
||||
formEvent.preventDefault();
|
||||
renderResults();
|
||||
});
|
||||
|
||||
renderResults();
|
||||
})();
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -4,82 +4,103 @@ 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 />" +
|
||||
"Loading Work Orders..." +
|
||||
"</div>";
|
||||
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>" +
|
||||
"</div>";
|
||||
searchResultsContainerElement.innerHTML =
|
||||
'<div class="message is-info">' +
|
||||
'<p class="message-body">There are no work orders that meet the search criteria.</p>' +
|
||||
"</div>";
|
||||
return;
|
||||
}
|
||||
const resultsTbodyElement = document.createElement("tbody");
|
||||
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\">" +
|
||||
"<thead><tr>" +
|
||||
"<th>Work Order Number</th>" +
|
||||
"<th>Work Order Type</th>" +
|
||||
"<th>Work Order Description</th>" +
|
||||
"<th>Open Date</th>" +
|
||||
"<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>" +
|
||||
"</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>" +
|
||||
"</button>" +
|
||||
"</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>" +
|
||||
"</button>" +
|
||||
"</div>" :
|
||||
"") +
|
||||
"</div>") +
|
||||
"</div>";
|
||||
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement);
|
||||
searchResultsContainerElement.innerHTML =
|
||||
'<table class="table is-fullwidth is-striped is-hoverable">' +
|
||||
"<thead><tr>" +
|
||||
"<th>Work Order Number</th>" +
|
||||
"<th>Work Order Type</th>" +
|
||||
"<th>Work Order Description</th>" +
|
||||
"<th>Open Date</th>" +
|
||||
"<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>" +
|
||||
"</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>' +
|
||||
"</button>" +
|
||||
"</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>' +
|
||||
"</button>" +
|
||||
"</div>"
|
||||
: "") +
|
||||
"</div>") +
|
||||
"</div>";
|
||||
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);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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>" +
|
||||
("<td>" +
|
||||
"<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>" +
|
||||
workOrder.workOrderOpenDateString +
|
||||
"</td>") +
|
||||
resultsTbodyElement.insertAdjacentHTML(
|
||||
"beforeend",
|
||||
"<tr>" +
|
||||
("<td>" +
|
||||
(workOrder.workOrderCloseDate ? workOrder.workOrderCloseDateString : "<span class=\"has-text-grey\">(No Close Date)</span>") +
|
||||
"</td>") +
|
||||
"</tr>");
|
||||
|
||||
'<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>" +
|
||||
workOrder.workOrderOpenDateString +
|
||||
"</td>") +
|
||||
("<td>" +
|
||||
(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>" +
|
||||
|
|
@ -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>" +
|
||||
"</button>" +
|
||||
"</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>" +
|
||||
"</button>" +
|
||||
"</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>' +
|
||||
"</button>" +
|
||||
"</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>' +
|
||||
"</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", 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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
214
routes/admin.ts
214
routes/admin.ts
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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.post(
|
||||
"/doCreateLot",
|
||||
permissionHandlers.updatePostHandler,
|
||||
handler_doCreateLot
|
||||
);
|
||||
|
||||
router.post(
|
||||
"/doUpdateLot",
|
||||
permissionHandlers.updatePostHandler,
|
||||
handler_doUpdateLot
|
||||
);
|
||||
|
||||
router.get("/:lotId/previous",
|
||||
handler_previous);
|
||||
router.post(
|
||||
"/doAddLotComment",
|
||||
permissionHandlers.updatePostHandler,
|
||||
handler_doAddLotComment
|
||||
);
|
||||
|
||||
router.post(
|
||||
"/doUpdateLotComment",
|
||||
permissionHandlers.updatePostHandler,
|
||||
handler_doUpdateLotComment
|
||||
);
|
||||
|
||||
router.get("/:lotId/edit",
|
||||
permissionHandlers.updateGetHandler,
|
||||
handler_edit);
|
||||
|
||||
|
||||
router.post("/doCreateLot",
|
||||
permissionHandlers.updatePostHandler,
|
||||
handler_doCreateLot);
|
||||
|
||||
|
||||
router.post("/doUpdateLot",
|
||||
permissionHandlers.updatePostHandler,
|
||||
handler_doUpdateLot);
|
||||
|
||||
|
||||
router.post("/doAddLotComment",
|
||||
permissionHandlers.updatePostHandler,
|
||||
handler_doAddLotComment);
|
||||
|
||||
|
||||
router.post("/doUpdateLotComment",
|
||||
permissionHandlers.updatePostHandler,
|
||||
handler_doUpdateLotComment);
|
||||
|
||||
|
||||
router.post("/doDeleteLotComment",
|
||||
permissionHandlers.updatePostHandler,
|
||||
handler_doDeleteLotComment);
|
||||
|
||||
router.post(
|
||||
"/doDeleteLotComment",
|
||||
permissionHandlers.updatePostHandler,
|
||||
handler_doDeleteLotComment
|
||||
);
|
||||
|
||||
export default router;
|
||||
|
|
|
|||
|
|
@ -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.post(
|
||||
"/doCreateMap",
|
||||
permissionHandlers.updatePostHandler,
|
||||
handler_doCreateMap
|
||||
);
|
||||
|
||||
router.get("/:mapId",
|
||||
handler_view);
|
||||
|
||||
|
||||
router.get("/:mapId/edit",
|
||||
permissionHandlers.updateGetHandler,
|
||||
handler_edit);
|
||||
|
||||
|
||||
router.post("/doCreateMap",
|
||||
permissionHandlers.updatePostHandler,
|
||||
handler_doCreateMap);
|
||||
|
||||
|
||||
router.post("/doUpdateMap",
|
||||
permissionHandlers.updatePostHandler,
|
||||
handler_doUpdateMap);
|
||||
|
||||
|
||||
router.post("/doDeleteMap",
|
||||
permissionHandlers.updatePostHandler,
|
||||
handler_doDeleteMap);
|
||||
router.post(
|
||||
"/doUpdateMap",
|
||||
permissionHandlers.updatePostHandler,
|
||||
handler_doUpdateMap
|
||||
);
|
||||
|
||||
router.post(
|
||||
"/doDeleteMap",
|
||||
permissionHandlers.updatePostHandler,
|
||||
handler_doDeleteMap
|
||||
);
|
||||
|
||||
export default router;
|
||||
|
|
@ -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();
|
||||
|
||||
const rightNow = new Date();
|
||||
|
||||
response.render("report-search", {
|
||||
headTitle: "Reports",
|
||||
todayDateString: dateTimeFns.dateToString(rightNow)
|
||||
});
|
||||
|
||||
response.render("report-search", {
|
||||
headTitle: "Reports",
|
||||
todayDateString: dateTimeFns.dateToString(rightNow)
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
router.all("/:reportName", handler_reportName);
|
||||
|
||||
|
||||
export default router;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
@ -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
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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, {
|
||||
session: fakeViewOnlySession
|
||||
});
|
||||
|
||||
export const fakeViewOnlyRequest =
|
||||
Object.assign({}, fakeRequest, {
|
||||
session: fakeViewOnlySession
|
||||
});
|
||||
|
||||
|
||||
export const fakeAdminRequest =
|
||||
Object.assign({}, fakeRequest, {
|
||||
session: fakeAdminSession
|
||||
});
|
||||
export const fakeAdminRequest = Object.assign({}, fakeRequest, {
|
||||
session: fakeAdminSession
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -1,68 +1,66 @@
|
|||
export interface Config {
|
||||
application ? : ConfigApplication;
|
||||
session ? : ConfigSession;
|
||||
reverseProxy ? : {
|
||||
application?: ConfigApplication;
|
||||
session?: ConfigSession;
|
||||
reverseProxy?: {
|
||||
disableCompression: boolean;
|
||||
disableEtag: boolean;
|
||||
urlPrefix: string;
|
||||
};
|
||||
activeDirectory ? : ConfigActiveDirectory;
|
||||
users ? : {
|
||||
testing ? : string[];
|
||||
canLogin ? : string[];
|
||||
canUpdate ? : string[];
|
||||
isAdmin ? : string[];
|
||||
activeDirectory?: ConfigActiveDirectory;
|
||||
users?: {
|
||||
testing?: string[];
|
||||
canLogin?: string[];
|
||||
canUpdate?: string[];
|
||||
isAdmin?: string[];
|
||||
};
|
||||
aliases ? : {
|
||||
lot ? : string;
|
||||
lots ? : string;
|
||||
map ? : string;
|
||||
maps ? : string;
|
||||
occupancy ? : string;
|
||||
occupancies ? : string;
|
||||
occupant ? : string;
|
||||
occupants ? : string;
|
||||
externalReceiptNumber ? : string;
|
||||
aliases?: {
|
||||
lot?: string;
|
||||
lots?: string;
|
||||
map?: string;
|
||||
maps?: string;
|
||||
occupancy?: string;
|
||||
occupancies?: string;
|
||||
occupant?: string;
|
||||
occupants?: string;
|
||||
externalReceiptNumber?: string;
|
||||
};
|
||||
settings ? : {
|
||||
fees ? : {
|
||||
taxPercentageDefault ? : number;
|
||||
settings?: {
|
||||
fees?: {
|
||||
taxPercentageDefault?: number;
|
||||
};
|
||||
map ? : {
|
||||
mapCityDefault ? : string;
|
||||
mapProvinceDefault ? : string;
|
||||
map?: {
|
||||
mapCityDefault?: string;
|
||||
mapProvinceDefault?: string;
|
||||
};
|
||||
lot ? : {
|
||||
lotNamePattern ? : RegExp;
|
||||
lotNameSortNameFunction ? : (lotName: string) => string;
|
||||
lot?: {
|
||||
lotNamePattern?: RegExp;
|
||||
lotNameSortNameFunction?: (lotName: string) => string;
|
||||
};
|
||||
lotOccupancy ? : {
|
||||
lotIdIsRequired ? : boolean;
|
||||
occupancyEndDateIsRequired ? : boolean;
|
||||
occupantCityDefault ? : string;
|
||||
occupantProvinceDefault ? : string;
|
||||
lotOccupancy?: {
|
||||
lotIdIsRequired?: boolean;
|
||||
occupancyEndDateIsRequired?: boolean;
|
||||
occupantCityDefault?: string;
|
||||
occupantProvinceDefault?: string;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
interface ConfigApplication {
|
||||
applicationName ? : string;
|
||||
backgroundURL ? : string;
|
||||
logoURL ? : string;
|
||||
httpPort ? : number;
|
||||
userDomain ? : string;
|
||||
useTestDatabases ? : boolean;
|
||||
applicationName?: string;
|
||||
backgroundURL?: string;
|
||||
logoURL?: string;
|
||||
httpPort?: number;
|
||||
userDomain?: string;
|
||||
useTestDatabases?: boolean;
|
||||
}
|
||||
|
||||
|
||||
interface ConfigSession {
|
||||
cookieName ? : string;
|
||||
secret ? : string;
|
||||
maxAgeMillis ? : number;
|
||||
doKeepAlive ? : boolean;
|
||||
cookieName?: string;
|
||||
secret?: string;
|
||||
maxAgeMillis?: number;
|
||||
doKeepAlive?: boolean;
|
||||
}
|
||||
|
||||
|
||||
export interface ConfigActiveDirectory {
|
||||
url: string;
|
||||
baseDN: string;
|
||||
|
|
|
|||
|
|
@ -1,2 +1 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
export {};
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,2 +1 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
export {};
|
||||
|
|
|
|||
|
|
@ -1,327 +1,303 @@
|
|||
export interface Record {
|
||||
recordCreate_userName ? : string;
|
||||
recordCreate_timeMillis ? : number;
|
||||
recordCreate_dateString ? : string;
|
||||
recordCreate_userName?: string;
|
||||
recordCreate_timeMillis?: number;
|
||||
recordCreate_dateString?: string;
|
||||
|
||||
recordUpdate_userName ? : string;
|
||||
recordUpdate_timeMillis ? : number;
|
||||
recordUpdate_dateString ? : string;
|
||||
recordUpdate_timeString ? : string;
|
||||
recordUpdate_userName?: string;
|
||||
recordUpdate_timeMillis?: number;
|
||||
recordUpdate_dateString?: string;
|
||||
recordUpdate_timeString?: string;
|
||||
|
||||
recordDelete_userName ? : string;
|
||||
recordDelete_timeMillis ? : number;
|
||||
recordDelete_dateString ? : string;
|
||||
recordDelete_userName?: string;
|
||||
recordDelete_timeMillis?: number;
|
||||
recordDelete_dateString?: string;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* LOT OCCUPANCY DB TYPES
|
||||
*/
|
||||
|
||||
|
||||
export interface Map extends Record {
|
||||
mapId ? : number;
|
||||
mapName ? : string;
|
||||
mapDescription ? : string;
|
||||
mapId?: number;
|
||||
mapName?: string;
|
||||
mapDescription?: string;
|
||||
|
||||
mapLatitude ? : number;
|
||||
mapLongitude ? : number;
|
||||
mapSVG ? : string;
|
||||
mapLatitude?: number;
|
||||
mapLongitude?: number;
|
||||
mapSVG?: string;
|
||||
|
||||
mapAddress1 ? : string;
|
||||
mapAddress2 ? : string;
|
||||
mapCity ? : string;
|
||||
mapProvince ? : string;
|
||||
mapPostalCode ? : string;
|
||||
mapPhoneNumber ? : string;
|
||||
mapAddress1?: string;
|
||||
mapAddress2?: string;
|
||||
mapCity?: string;
|
||||
mapProvince?: string;
|
||||
mapPostalCode?: string;
|
||||
mapPhoneNumber?: string;
|
||||
|
||||
lotCount ? : number;
|
||||
lotCount?: number;
|
||||
}
|
||||
|
||||
|
||||
export interface LotType extends Record {
|
||||
lotTypeId ? : number;
|
||||
lotType ? : string;
|
||||
orderNumber ? : number;
|
||||
lotTypeFields ? : LotTypeField[];
|
||||
lotTypeId?: number;
|
||||
lotType?: string;
|
||||
orderNumber?: number;
|
||||
lotTypeFields?: LotTypeField[];
|
||||
}
|
||||
|
||||
|
||||
export interface LotTypeField extends Record {
|
||||
lotTypeFieldId ? : number;
|
||||
lotTypeField ? : string;
|
||||
lotTypeFieldId?: number;
|
||||
lotTypeField?: string;
|
||||
|
||||
lotTypeId ? : number;
|
||||
lotTypeId?: number;
|
||||
lotType: LotType;
|
||||
|
||||
lotTypeFieldValues ? : string;
|
||||
isRequired ? : boolean;
|
||||
pattern ? : string;
|
||||
minimumLength ? : number;
|
||||
maximumLength ? : number;
|
||||
lotTypeFieldValues?: string;
|
||||
isRequired?: boolean;
|
||||
pattern?: string;
|
||||
minimumLength?: number;
|
||||
maximumLength?: number;
|
||||
|
||||
orderNumber ? : number;
|
||||
orderNumber?: number;
|
||||
}
|
||||
|
||||
|
||||
export interface LotStatus extends Record {
|
||||
lotStatusId ? : number;
|
||||
lotStatus ? : string;
|
||||
orderNumber ? : number;
|
||||
lotStatusId?: number;
|
||||
lotStatus?: string;
|
||||
orderNumber?: number;
|
||||
}
|
||||
|
||||
|
||||
export interface Lot extends Record {
|
||||
lotId ? : number;
|
||||
lotName ? : string;
|
||||
lotId?: number;
|
||||
lotName?: string;
|
||||
|
||||
lotTypeId ? : number;
|
||||
lotType ? : LotType | string;
|
||||
lotTypeId?: number;
|
||||
lotType?: LotType | string;
|
||||
|
||||
mapId ? : number;
|
||||
mapName ? : string;
|
||||
map ? : Map;
|
||||
mapSVG ? : string;
|
||||
mapKey ? : string;
|
||||
mapId?: number;
|
||||
mapName?: string;
|
||||
map?: Map;
|
||||
mapSVG?: string;
|
||||
mapKey?: string;
|
||||
|
||||
lotLatitude ? : number;
|
||||
lotLongitude ? : number;
|
||||
lotLatitude?: number;
|
||||
lotLongitude?: number;
|
||||
|
||||
lotStatusId ? : number;
|
||||
lotStatus ? : LotStatus | string;
|
||||
lotStatusId?: number;
|
||||
lotStatus?: LotStatus | string;
|
||||
|
||||
lotOccupancyCount ? : number;
|
||||
lotOccupancies ? : LotOccupancy[];
|
||||
lotOccupancyCount?: number;
|
||||
lotOccupancies?: LotOccupancy[];
|
||||
|
||||
lotComments ? : LotComment[];
|
||||
lotComments?: LotComment[];
|
||||
}
|
||||
|
||||
|
||||
export interface LotComment extends Record {
|
||||
lotCommentId ? : number;
|
||||
lotId ? : number;
|
||||
lotCommentId?: number;
|
||||
lotId?: number;
|
||||
|
||||
lotCommentDate ? : number;
|
||||
lotCommentDateString ? : string;
|
||||
lotCommentDate?: number;
|
||||
lotCommentDateString?: string;
|
||||
|
||||
lotCommentTime ? : number;
|
||||
lotCommentTimeString ? : string;
|
||||
lotCommentTime?: number;
|
||||
lotCommentTimeString?: string;
|
||||
|
||||
lotComment ? : string;
|
||||
lotComment?: string;
|
||||
}
|
||||
|
||||
|
||||
export interface OccupancyType extends Record {
|
||||
occupancyTypeId ? : number;
|
||||
occupancyType ? : string;
|
||||
orderNumber ? : number;
|
||||
occupancyTypeFields ? : OccupancyTypeField[];
|
||||
occupancyTypeId?: number;
|
||||
occupancyType?: string;
|
||||
orderNumber?: number;
|
||||
occupancyTypeFields?: OccupancyTypeField[];
|
||||
}
|
||||
|
||||
|
||||
export interface OccupancyTypeField {
|
||||
occupancyTypeFieldId ? : number;
|
||||
occupancyTypeId ? : number;
|
||||
occupancyTypeField ? : string;
|
||||
occupancyTypeFieldValues ? : string;
|
||||
isRequired ? : boolean;
|
||||
pattern ? : string;
|
||||
minimumLength ? : number;
|
||||
maximumLength ? : number;
|
||||
orderNumber ? : number;
|
||||
occupancyTypeFieldId?: number;
|
||||
occupancyTypeId?: number;
|
||||
occupancyTypeField?: string;
|
||||
occupancyTypeFieldValues?: string;
|
||||
isRequired?: boolean;
|
||||
pattern?: string;
|
||||
minimumLength?: number;
|
||||
maximumLength?: number;
|
||||
orderNumber?: number;
|
||||
}
|
||||
|
||||
|
||||
export interface LotOccupantType extends Record {
|
||||
lotOccupantTypeId ? : number;
|
||||
lotOccupantType ? : string;
|
||||
orderNumber ? : number;
|
||||
lotOccupantTypeId?: number;
|
||||
lotOccupantType?: string;
|
||||
orderNumber?: number;
|
||||
}
|
||||
|
||||
|
||||
export interface FeeCategory extends Record {
|
||||
feeCategoryId ? : number;
|
||||
feeCategory ? : string;
|
||||
fees ? : Fee[];
|
||||
orderNumber ? : number;
|
||||
feeCategoryId?: number;
|
||||
feeCategory?: string;
|
||||
fees?: Fee[];
|
||||
orderNumber?: number;
|
||||
}
|
||||
|
||||
|
||||
export interface Fee extends Record {
|
||||
feeId ? : number;
|
||||
feeId?: number;
|
||||
|
||||
feeCategoryId ? : number;
|
||||
feeCategory ? : string;
|
||||
feeCategoryId?: number;
|
||||
feeCategory?: string;
|
||||
|
||||
feeName ? : string;
|
||||
feeDescription ? : string;
|
||||
feeName?: string;
|
||||
feeDescription?: string;
|
||||
|
||||
occupancyTypeId ? : number;
|
||||
occupancyType ? : string;
|
||||
occupancyTypeId?: number;
|
||||
occupancyType?: string;
|
||||
|
||||
lotTypeId ? : number;
|
||||
lotType ? : string;
|
||||
lotTypeId?: number;
|
||||
lotType?: string;
|
||||
|
||||
includeQuantity ? : boolean;
|
||||
quantityUnit ? : string;
|
||||
includeQuantity?: boolean;
|
||||
quantityUnit?: string;
|
||||
|
||||
feeAmount ? : number;
|
||||
feeFunction ? : string;
|
||||
feeAmount?: number;
|
||||
feeFunction?: string;
|
||||
|
||||
taxAmount ? : number;
|
||||
taxPercentage ? : number;
|
||||
taxAmount?: number;
|
||||
taxPercentage?: number;
|
||||
|
||||
isRequired ? : boolean;
|
||||
isRequired?: boolean;
|
||||
|
||||
orderNumber ? : number;
|
||||
orderNumber?: number;
|
||||
}
|
||||
|
||||
|
||||
export interface LotOccupancyFee extends Fee, Record {
|
||||
lotOccupancyId ? : number;
|
||||
lotOccupancyId?: number;
|
||||
|
||||
feeId ? : number;
|
||||
feeName ? : string;
|
||||
feeId?: number;
|
||||
feeName?: string;
|
||||
|
||||
quantity ? : number;
|
||||
feeAmount ? : number;
|
||||
taxAmount ? : number;
|
||||
quantity?: number;
|
||||
feeAmount?: number;
|
||||
taxAmount?: number;
|
||||
}
|
||||
|
||||
|
||||
export interface LotOccupancyTransaction extends Record {
|
||||
lotOccupancyId ? : number;
|
||||
transactionIndex ? : number;
|
||||
transactionDate ? : number;
|
||||
transactionDateString ? : string;
|
||||
transactionTime ? : number;
|
||||
transactionTimeString ? : string;
|
||||
transactionAmount ? : number;
|
||||
externalReceiptNumber ? : string;
|
||||
transactionNote ? : string;
|
||||
lotOccupancyId?: number;
|
||||
transactionIndex?: number;
|
||||
transactionDate?: number;
|
||||
transactionDateString?: string;
|
||||
transactionTime?: number;
|
||||
transactionTimeString?: string;
|
||||
transactionAmount?: number;
|
||||
externalReceiptNumber?: string;
|
||||
transactionNote?: string;
|
||||
}
|
||||
|
||||
|
||||
export interface LotOccupancyOccupant extends Record {
|
||||
lotOccupancyId ? : number;
|
||||
lotOccupantIndex ? : number;
|
||||
lotOccupancyId?: number;
|
||||
lotOccupantIndex?: number;
|
||||
|
||||
lotOccupantTypeId ? : number;
|
||||
lotOccupantType ? : string;
|
||||
lotOccupantTypeId?: number;
|
||||
lotOccupantType?: string;
|
||||
|
||||
occupantName ? : string;
|
||||
occupantAddress1 ? : string;
|
||||
occupantAddress2 ? : string;
|
||||
occupantCity ? : string;
|
||||
occupantProvince ? : string;
|
||||
occupantPostalCode ? : string;
|
||||
occupantPhoneNumber ? : string;
|
||||
occupantName?: string;
|
||||
occupantAddress1?: string;
|
||||
occupantAddress2?: string;
|
||||
occupantCity?: string;
|
||||
occupantProvince?: string;
|
||||
occupantPostalCode?: string;
|
||||
occupantPhoneNumber?: string;
|
||||
}
|
||||
|
||||
|
||||
export interface LotOccupancyComment extends Record {
|
||||
lotOccupancyCommentId ? : number;
|
||||
lotOccupancyId ? : number;
|
||||
lotOccupancyCommentId?: number;
|
||||
lotOccupancyId?: number;
|
||||
|
||||
lotOccupancyCommentDate ? : number;
|
||||
lotOccupancyCommentDateString ? : string;
|
||||
lotOccupancyCommentDate?: number;
|
||||
lotOccupancyCommentDateString?: string;
|
||||
|
||||
lotOccupancyCommentTime ? : number;
|
||||
lotOccupancyCommentTimeString ? : string;
|
||||
lotOccupancyCommentTime?: number;
|
||||
lotOccupancyCommentTimeString?: string;
|
||||
|
||||
lotOccupancyComment ? : string;
|
||||
lotOccupancyComment?: string;
|
||||
}
|
||||
|
||||
|
||||
export interface LotOccupancyField extends OccupancyTypeField, Record {
|
||||
lotOccupancyId ? : number;
|
||||
occupancyTypeFieldId ? : number;
|
||||
lotOccupancyFieldValue ? : string;
|
||||
lotOccupancyId?: number;
|
||||
occupancyTypeFieldId?: number;
|
||||
lotOccupancyFieldValue?: string;
|
||||
}
|
||||
|
||||
|
||||
export interface LotOccupancy extends Record {
|
||||
lotOccupancyId ? : number;
|
||||
lotOccupancyId?: number;
|
||||
|
||||
occupancyTypeId ? : number;
|
||||
occupancyType ? : string;
|
||||
occupancyTypeId?: number;
|
||||
occupancyType?: string;
|
||||
|
||||
lotId ? : number;
|
||||
lotTypeId ? : number;
|
||||
lotName ? : string;
|
||||
lotId?: number;
|
||||
lotTypeId?: number;
|
||||
lotName?: string;
|
||||
|
||||
mapId ? : number;
|
||||
mapName ? : string;
|
||||
mapId?: number;
|
||||
mapName?: string;
|
||||
|
||||
occupancyStartDate ? : number;
|
||||
occupancyStartDateString ? : string;
|
||||
occupancyStartDate?: number;
|
||||
occupancyStartDateString?: string;
|
||||
|
||||
occupancyEndDate ? : number;
|
||||
occupancyEndDateString ? : string;
|
||||
occupancyEndDate?: number;
|
||||
occupancyEndDateString?: string;
|
||||
|
||||
lotOccupancyFields ? : LotOccupancyField[];
|
||||
lotOccupancyComments ? : LotOccupancyComment[];
|
||||
lotOccupancyOccupants ? : LotOccupancyOccupant[];
|
||||
lotOccupancyFees ? : LotOccupancyFee[];
|
||||
lotOccupancyTransactions ? : LotOccupancyTransaction[];
|
||||
lotOccupancyFields?: LotOccupancyField[];
|
||||
lotOccupancyComments?: LotOccupancyComment[];
|
||||
lotOccupancyOccupants?: LotOccupancyOccupant[];
|
||||
lotOccupancyFees?: LotOccupancyFee[];
|
||||
lotOccupancyTransactions?: LotOccupancyTransaction[];
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* WORK ORDERS
|
||||
*/
|
||||
|
||||
|
||||
export interface WorkOrderType extends Record {
|
||||
workOrderTypeId ? : number;
|
||||
workOrderType ? : string;
|
||||
orderNumber ? : number;
|
||||
workOrderTypeId?: number;
|
||||
workOrderType?: string;
|
||||
orderNumber?: number;
|
||||
}
|
||||
|
||||
|
||||
export interface WorkOrderComment extends Record {
|
||||
workOrderCommentId ? : number;
|
||||
workOrderId ? : number;
|
||||
workOrderCommentId?: number;
|
||||
workOrderId?: number;
|
||||
|
||||
workOrderCommentDate ? : number;
|
||||
workOrderCommentDateString ? : string;
|
||||
workOrderCommentDate?: number;
|
||||
workOrderCommentDateString?: string;
|
||||
|
||||
workOrderCommentTime ? : number;
|
||||
workOrderCommentTimeString ? : string;
|
||||
workOrderCommentTime?: number;
|
||||
workOrderCommentTimeString?: string;
|
||||
|
||||
workOrderComment ? : string;
|
||||
workOrderComment?: string;
|
||||
}
|
||||
|
||||
|
||||
export interface WorkOrder extends Record {
|
||||
workOrderId ? : number;
|
||||
workOrderId?: number;
|
||||
|
||||
workOrderTypeId ? : number;
|
||||
workOrderType ? : string;
|
||||
workOrderTypeId?: number;
|
||||
workOrderType?: string;
|
||||
|
||||
workOrderNumber ? : string;
|
||||
workOrderDescription ? : string;
|
||||
workOrderNumber?: string;
|
||||
workOrderDescription?: string;
|
||||
|
||||
workOrderOpenDate ? : number;
|
||||
workOrderOpenDateString ? : string;
|
||||
workOrderOpenDate?: number;
|
||||
workOrderOpenDateString?: string;
|
||||
|
||||
workOrderCloseDate ? : number;
|
||||
workOrderCloseDateString ? : string;
|
||||
workOrderCloseDate?: number;
|
||||
workOrderCloseDateString?: string;
|
||||
|
||||
workOrderComments ? : WorkOrderComment[];
|
||||
workOrderLots ? : Lot[];
|
||||
workOrderLotOccupancies ? : LotOccupancy[];
|
||||
workOrderComments?: WorkOrderComment[];
|
||||
workOrderLots?: Lot[];
|
||||
workOrderLotOccupancies?: LotOccupancy[];
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* USER TYPES
|
||||
*/
|
||||
|
||||
|
||||
export interface User {
|
||||
userName: string;
|
||||
userProperties ? : UserProperties;
|
||||
userProperties?: UserProperties;
|
||||
}
|
||||
|
||||
export interface UserProperties {
|
||||
|
|
@ -329,7 +305,6 @@ export interface UserProperties {
|
|||
isAdmin: boolean;
|
||||
}
|
||||
|
||||
|
||||
declare module "express-session" {
|
||||
interface Session {
|
||||
user: User;
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
Loading…
Reference in New Issue