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) => {
|
app.use((error, request, response) => {
|
||||||
response.locals.message = error.message;
|
response.locals.message = error.message;
|
||||||
response.locals.error = request.app.get("env") === "development" ? error : {};
|
response.locals.error =
|
||||||
|
request.app.get("env") === "development" ? error : {};
|
||||||
response.status(error.status || 500);
|
response.status(error.status || 500);
|
||||||
response.render("error");
|
response.render("error");
|
||||||
});
|
});
|
||||||
|
|
|
||||||
102
app.ts
102
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 stringFns from "@cityssm/expressjs-server-js/stringFns.js";
|
||||||
import * as htmlFns from "@cityssm/expressjs-server-js/htmlFns.js";
|
import * as htmlFns from "@cityssm/expressjs-server-js/htmlFns.js";
|
||||||
|
|
||||||
import {
|
import { version } from "./version.js";
|
||||||
version
|
|
||||||
} from "./version.js";
|
|
||||||
|
|
||||||
import * as databaseInitializer from "./helpers/initializer.database.js";
|
import * as databaseInitializer from "./helpers/initializer.database.js";
|
||||||
|
|
||||||
import debug from "debug";
|
import debug from "debug";
|
||||||
const debugApp = debug("lot-occupancy-system:app");
|
const debugApp = debug("lot-occupancy-system:app");
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* INITALIZE THE DATABASE
|
* INITALIZE THE DATABASE
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
databaseInitializer.initializeDatabase();
|
databaseInitializer.initializeDatabase();
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* INITIALIZE APP
|
* INITIALIZE APP
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
const __dirname = ".";
|
const __dirname = ".";
|
||||||
|
|
||||||
export const app = express();
|
export const app = express();
|
||||||
|
|
@ -70,15 +64,18 @@ app.use((request, _response, next) => {
|
||||||
|
|
||||||
app.use(express.json());
|
app.use(express.json());
|
||||||
|
|
||||||
app.use(express.urlencoded({
|
app.use(
|
||||||
|
express.urlencoded({
|
||||||
extended: false
|
extended: false
|
||||||
}));
|
})
|
||||||
|
);
|
||||||
|
|
||||||
app.use(cookieParser());
|
app.use(cookieParser());
|
||||||
app.use(csurf({
|
app.use(
|
||||||
|
csurf({
|
||||||
cookie: true
|
cookie: true
|
||||||
}));
|
})
|
||||||
|
);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Rate Limiter
|
* Rate Limiter
|
||||||
|
|
@ -91,12 +88,10 @@ const limiter = rateLimit({
|
||||||
|
|
||||||
app.use(limiter);
|
app.use(limiter);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* STATIC ROUTES
|
* STATIC ROUTES
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
const urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix");
|
const urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix");
|
||||||
|
|
||||||
if (urlPrefix !== "") {
|
if (urlPrefix !== "") {
|
||||||
|
|
@ -105,29 +100,40 @@ if (urlPrefix !== "") {
|
||||||
|
|
||||||
app.use(urlPrefix, express.static(path.join("public")));
|
app.use(urlPrefix, express.static(path.join("public")));
|
||||||
|
|
||||||
app.use(urlPrefix + "/lib/fa",
|
app.use(
|
||||||
express.static(path.join("node_modules", "@fortawesome", "fontawesome-free")));
|
urlPrefix + "/lib/fa",
|
||||||
|
express.static(
|
||||||
|
path.join("node_modules", "@fortawesome", "fontawesome-free")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
app.use(urlPrefix + "/lib/cityssm-bulma-webapp-js",
|
app.use(
|
||||||
express.static(path.join("node_modules", "@cityssm", "bulma-webapp-js")));
|
urlPrefix + "/lib/cityssm-bulma-webapp-js",
|
||||||
|
express.static(path.join("node_modules", "@cityssm", "bulma-webapp-js"))
|
||||||
|
);
|
||||||
|
|
||||||
app.use(urlPrefix + "/lib/cityssm-bulma-js",
|
app.use(
|
||||||
express.static(path.join("node_modules", "@cityssm", "bulma-js", "dist")));
|
urlPrefix + "/lib/cityssm-bulma-js",
|
||||||
|
express.static(path.join("node_modules", "@cityssm", "bulma-js", "dist"))
|
||||||
app.use(urlPrefix + "/lib/leaflet",
|
);
|
||||||
express.static(path.join("node_modules", "leaflet", "dist")));
|
|
||||||
|
|
||||||
|
app.use(
|
||||||
|
urlPrefix + "/lib/leaflet",
|
||||||
|
express.static(path.join("node_modules", "leaflet", "dist"))
|
||||||
|
);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SESSION MANAGEMENT
|
* SESSION MANAGEMENT
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const sessionCookieName: string = configFunctions.getProperty("session.cookieName");
|
const sessionCookieName: string =
|
||||||
|
configFunctions.getProperty("session.cookieName");
|
||||||
|
|
||||||
const FileStoreSession = FileStore(session);
|
const FileStoreSession = FileStore(session);
|
||||||
|
|
||||||
// Initialize session
|
// Initialize session
|
||||||
app.use(session({
|
app.use(
|
||||||
|
session({
|
||||||
store: new FileStoreSession({
|
store: new FileStoreSession({
|
||||||
path: "./data/sessions",
|
path: "./data/sessions",
|
||||||
logFn: debug("general-licence-manager:session"),
|
logFn: debug("general-licence-manager:session"),
|
||||||
|
|
@ -142,11 +148,11 @@ app.use(session({
|
||||||
maxAge: configFunctions.getProperty("session.maxAgeMillis"),
|
maxAge: configFunctions.getProperty("session.maxAgeMillis"),
|
||||||
sameSite: "strict"
|
sameSite: "strict"
|
||||||
}
|
}
|
||||||
}));
|
})
|
||||||
|
);
|
||||||
|
|
||||||
// Clear cookie if no corresponding session
|
// Clear cookie if no corresponding session
|
||||||
app.use((request, response, next) => {
|
app.use((request, response, next) => {
|
||||||
|
|
||||||
if (request.cookies[sessionCookieName] && !request.session.user) {
|
if (request.cookies[sessionCookieName] && !request.session.user) {
|
||||||
response.clearCookie(sessionCookieName);
|
response.clearCookie(sessionCookieName);
|
||||||
}
|
}
|
||||||
|
|
@ -155,25 +161,27 @@ app.use((request, response, next) => {
|
||||||
});
|
});
|
||||||
|
|
||||||
// Redirect logged in users
|
// Redirect logged in users
|
||||||
const sessionChecker = (request: express.Request, response: express.Response, next: express.NextFunction) => {
|
const sessionChecker = (
|
||||||
|
request: express.Request,
|
||||||
|
response: express.Response,
|
||||||
|
next: express.NextFunction
|
||||||
|
) => {
|
||||||
if (request.session.user && request.cookies[sessionCookieName]) {
|
if (request.session.user && request.cookies[sessionCookieName]) {
|
||||||
return next();
|
return next();
|
||||||
}
|
}
|
||||||
|
|
||||||
return response.redirect(`${urlPrefix}/login?redirect=${request.originalUrl}`);
|
return response.redirect(
|
||||||
|
`${urlPrefix}/login?redirect=${request.originalUrl}`
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ROUTES
|
* ROUTES
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
// Make the user and config objects available to the templates
|
// Make the user and config objects available to the templates
|
||||||
|
|
||||||
app.use((request, response, next) => {
|
app.use((request, response, next) => {
|
||||||
|
|
||||||
response.locals.buildNumber = version;
|
response.locals.buildNumber = version;
|
||||||
|
|
||||||
response.locals.user = request.session.user;
|
response.locals.user = request.session.user;
|
||||||
|
|
@ -184,12 +192,13 @@ app.use((request, response, next) => {
|
||||||
response.locals.stringFunctions = stringFns;
|
response.locals.stringFunctions = stringFns;
|
||||||
response.locals.htmlFunctions = htmlFns;
|
response.locals.htmlFunctions = htmlFns;
|
||||||
|
|
||||||
response.locals.urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix");
|
response.locals.urlPrefix = configFunctions.getProperty(
|
||||||
|
"reverseProxy.urlPrefix"
|
||||||
|
);
|
||||||
|
|
||||||
next();
|
next();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
app.get(urlPrefix + "/", sessionChecker, (_request, response) => {
|
app.get(urlPrefix + "/", sessionChecker, (_request, response) => {
|
||||||
response.redirect(urlPrefix + "/dashboard");
|
response.redirect(urlPrefix + "/dashboard");
|
||||||
});
|
});
|
||||||
|
|
@ -211,40 +220,41 @@ app.all(urlPrefix + "/keepAlive", (_request, response) => {
|
||||||
app.use(urlPrefix + "/login", routerLogin);
|
app.use(urlPrefix + "/login", routerLogin);
|
||||||
|
|
||||||
app.get(urlPrefix + "/logout", (request, response) => {
|
app.get(urlPrefix + "/logout", (request, response) => {
|
||||||
|
|
||||||
if (request.session.user && request.cookies[sessionCookieName]) {
|
if (request.session.user && request.cookies[sessionCookieName]) {
|
||||||
|
|
||||||
// eslint-disable-next-line unicorn/no-null
|
// eslint-disable-next-line unicorn/no-null
|
||||||
request.session.destroy(null);
|
request.session.destroy(null);
|
||||||
request.session = undefined;
|
request.session = undefined;
|
||||||
response.clearCookie(sessionCookieName);
|
response.clearCookie(sessionCookieName);
|
||||||
response.redirect(urlPrefix + "/");
|
response.redirect(urlPrefix + "/");
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
response.redirect(urlPrefix + "/login");
|
response.redirect(urlPrefix + "/login");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
// Catch 404 and forward to error handler
|
// Catch 404 and forward to error handler
|
||||||
app.use((_request, _response, next) => {
|
app.use((_request, _response, next) => {
|
||||||
next(createError(404));
|
next(createError(404));
|
||||||
});
|
});
|
||||||
|
|
||||||
// Error handler
|
// Error handler
|
||||||
app.use((error: {
|
app.use(
|
||||||
status: number;message: string
|
(
|
||||||
|
error: {
|
||||||
|
status: number;
|
||||||
|
message: string;
|
||||||
},
|
},
|
||||||
request: express.Request, response: express.Response) => {
|
request: express.Request,
|
||||||
|
response: express.Response
|
||||||
|
) => {
|
||||||
// Set locals, only providing error in development
|
// Set locals, only providing error in development
|
||||||
response.locals.message = error.message;
|
response.locals.message = error.message;
|
||||||
response.locals.error = request.app.get("env") === "development" ? error : {};
|
response.locals.error =
|
||||||
|
request.app.get("env") === "development" ? error : {};
|
||||||
|
|
||||||
// Render the error page
|
// Render the error page
|
||||||
response.status(error.status || 500);
|
response.status(error.status || 500);
|
||||||
response.render("error");
|
response.render("error");
|
||||||
});
|
}
|
||||||
|
);
|
||||||
|
|
||||||
export default app;
|
export default app;
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
import { defineConfig } from "cypress";
|
import { defineConfig } from "cypress";
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
e2e: {
|
e2e: {
|
||||||
"baseUrl": "http://localhost:7000",
|
baseUrl: "http://localhost:7000",
|
||||||
"specPattern": "cypress/e2e/**/*.cy.ts",
|
specPattern: "cypress/e2e/**/*.cy.ts",
|
||||||
"supportFile": false,
|
supportFile: false,
|
||||||
"projectId": "xya1fn"
|
projectId: "xya1fn"
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,11 @@
|
||||||
|
|
||||||
import { defineConfig } from "cypress";
|
import { defineConfig } from "cypress";
|
||||||
|
|
||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
e2e: {
|
e2e: {
|
||||||
"baseUrl": "http://localhost:7000",
|
baseUrl: "http://localhost:7000",
|
||||||
"specPattern": "cypress/e2e/**/*.cy.ts",
|
specPattern: "cypress/e2e/**/*.cy.ts",
|
||||||
"supportFile": false,
|
supportFile: false,
|
||||||
"projectId": "xya1fn"
|
projectId: "xya1fn"
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
12
gulpfile.js
12
gulpfile.js
|
|
@ -1,19 +1,21 @@
|
||||||
import gulp from "gulp";
|
import gulp from "gulp";
|
||||||
import changed from "gulp-changed";
|
import changed from "gulp-changed";
|
||||||
import minify from "gulp-minify";
|
import minify from "gulp-minify";
|
||||||
import dartSass from 'sass';
|
import dartSass from "sass";
|
||||||
import gulpSass from 'gulp-sass';
|
import gulpSass from "gulp-sass";
|
||||||
const sass = gulpSass(dartSass);
|
const sass = gulpSass(dartSass);
|
||||||
const publicSCSSDestination = "public/stylesheets";
|
const publicSCSSDestination = "public/stylesheets";
|
||||||
const publicSCSSFunction = () => {
|
const publicSCSSFunction = () => {
|
||||||
return gulp.src("public-scss/*.scss")
|
return gulp
|
||||||
.pipe(sass({ outputStyle: 'compressed' }).on('error', sass.logError))
|
.src("public-scss/*.scss")
|
||||||
|
.pipe(sass({ outputStyle: "compressed" }).on("error", sass.logError))
|
||||||
.pipe(gulp.dest(publicSCSSDestination));
|
.pipe(gulp.dest(publicSCSSDestination));
|
||||||
};
|
};
|
||||||
gulp.task("public-scss", publicSCSSFunction);
|
gulp.task("public-scss", publicSCSSFunction);
|
||||||
const publicJavascriptsDestination = "public/javascripts";
|
const publicJavascriptsDestination = "public/javascripts";
|
||||||
const publicJavascriptsMinFunction = () => {
|
const publicJavascriptsMinFunction = () => {
|
||||||
return gulp.src("public-typescript/*.js", { allowEmpty: true })
|
return gulp
|
||||||
|
.src("public-typescript/*.js", { allowEmpty: true })
|
||||||
.pipe(changed(publicJavascriptsDestination, {
|
.pipe(changed(publicJavascriptsDestination, {
|
||||||
extension: ".min.js"
|
extension: ".min.js"
|
||||||
}))
|
}))
|
||||||
|
|
|
||||||
20
gulpfile.ts
20
gulpfile.ts
|
|
@ -4,8 +4,8 @@ import gulp from "gulp";
|
||||||
import changed from "gulp-changed";
|
import changed from "gulp-changed";
|
||||||
import minify from "gulp-minify";
|
import minify from "gulp-minify";
|
||||||
|
|
||||||
import dartSass from 'sass';
|
import dartSass from "sass";
|
||||||
import gulpSass from 'gulp-sass';
|
import gulpSass from "gulp-sass";
|
||||||
const sass = gulpSass(dartSass);
|
const sass = gulpSass(dartSass);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -15,9 +15,9 @@ const sass = gulpSass(dartSass);
|
||||||
const publicSCSSDestination = "public/stylesheets";
|
const publicSCSSDestination = "public/stylesheets";
|
||||||
|
|
||||||
const publicSCSSFunction = () => {
|
const publicSCSSFunction = () => {
|
||||||
|
return gulp
|
||||||
return gulp.src("public-scss/*.scss")
|
.src("public-scss/*.scss")
|
||||||
.pipe(sass({outputStyle: 'compressed'}).on('error', sass.logError))
|
.pipe(sass({ outputStyle: "compressed" }).on("error", sass.logError))
|
||||||
.pipe(gulp.dest(publicSCSSDestination));
|
.pipe(gulp.dest(publicSCSSDestination));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -30,11 +30,13 @@ gulp.task("public-scss", publicSCSSFunction);
|
||||||
const publicJavascriptsDestination = "public/javascripts";
|
const publicJavascriptsDestination = "public/javascripts";
|
||||||
|
|
||||||
const publicJavascriptsMinFunction = () => {
|
const publicJavascriptsMinFunction = () => {
|
||||||
|
return gulp
|
||||||
return gulp.src("public-typescript/*.js", { allowEmpty: true })
|
.src("public-typescript/*.js", { allowEmpty: true })
|
||||||
.pipe(changed(publicJavascriptsDestination, {
|
.pipe(
|
||||||
|
changed(publicJavascriptsDestination, {
|
||||||
extension: ".min.js"
|
extension: ".min.js"
|
||||||
}))
|
})
|
||||||
|
)
|
||||||
.pipe(minify({ noSource: true, ext: { min: ".min.js" } }))
|
.pipe(minify({ noSource: true, ext: { min: ".min.js" } }))
|
||||||
.pipe(gulp.dest(publicJavascriptsDestination));
|
.pipe(gulp.dest(publicJavascriptsDestination));
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,19 +1,19 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import { getLotTypes, getOccupancyTypes } from "../../helpers/functions.cache.js";
|
|
||||||
|
|
||||||
import {
|
import {
|
||||||
getFeeCategories
|
getLotTypes,
|
||||||
} from "../../helpers/lotOccupancyDB/getFeeCategories.js";
|
getOccupancyTypes
|
||||||
|
} from "../../helpers/functions.cache.js";
|
||||||
|
|
||||||
|
import { getFeeCategories } from "../../helpers/lotOccupancyDB/getFeeCategories.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = (_request, response) => {
|
export const handler: RequestHandler = (_request, response) => {
|
||||||
|
const feeCategories = getFeeCategories(
|
||||||
const feeCategories = getFeeCategories({}, {
|
{},
|
||||||
|
{
|
||||||
includeFees: true
|
includeFees: true
|
||||||
});
|
}
|
||||||
|
);
|
||||||
|
|
||||||
const occupancyTypes = getOccupancyTypes();
|
const occupancyTypes = getOccupancyTypes();
|
||||||
const lotTypes = getLotTypes();
|
const lotTypes = getLotTypes();
|
||||||
|
|
@ -26,5 +26,4 @@ export const handler: RequestHandler = (_request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import { getLotOccupantTypes, getLotStatuses, getWorkOrderTypes } from "../../helpers/functions.cache.js";
|
|
||||||
|
|
||||||
|
import {
|
||||||
|
getLotOccupantTypes,
|
||||||
|
getLotStatuses,
|
||||||
|
getWorkOrderTypes
|
||||||
|
} from "../../helpers/functions.cache.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = (_request, response) => {
|
export const handler: RequestHandler = (_request, response) => {
|
||||||
|
|
||||||
const workOrderTypes = getWorkOrderTypes();
|
const workOrderTypes = getWorkOrderTypes();
|
||||||
const lotStatuses = getLotStatuses();
|
const lotStatuses = getLotStatuses();
|
||||||
const lotOccupantTypes = getLotOccupantTypes();
|
const lotOccupantTypes = getLotOccupantTypes();
|
||||||
|
|
@ -19,5 +19,4 @@ export const handler: RequestHandler = (_request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -1,24 +1,18 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import {
|
|
||||||
addFee
|
|
||||||
} from "../../helpers/lotOccupancyDB/addFee.js";
|
|
||||||
|
|
||||||
import {
|
|
||||||
getFeeCategories
|
|
||||||
} from "../../helpers/lotOccupancyDB/getFeeCategories.js";
|
|
||||||
|
|
||||||
|
import { addFee } from "../../helpers/lotOccupancyDB/addFee.js";
|
||||||
|
|
||||||
|
import { getFeeCategories } from "../../helpers/lotOccupancyDB/getFeeCategories.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
|
||||||
const feeId = addFee(request.body, request.session);
|
const feeId = addFee(request.body, request.session);
|
||||||
|
|
||||||
const feeCategories = getFeeCategories({}, {
|
const feeCategories = getFeeCategories(
|
||||||
|
{},
|
||||||
|
{
|
||||||
includeFees: true
|
includeFees: true
|
||||||
});
|
}
|
||||||
|
);
|
||||||
|
|
||||||
response.json({
|
response.json({
|
||||||
success: true,
|
success: true,
|
||||||
|
|
@ -27,5 +21,4 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -1,24 +1,18 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import {
|
|
||||||
addFeeCategory
|
|
||||||
} from "../../helpers/lotOccupancyDB/addFeeCategory.js";
|
|
||||||
|
|
||||||
import {
|
|
||||||
getFeeCategories
|
|
||||||
} from "../../helpers/lotOccupancyDB/getFeeCategories.js";
|
|
||||||
|
|
||||||
|
import { addFeeCategory } from "../../helpers/lotOccupancyDB/addFeeCategory.js";
|
||||||
|
|
||||||
|
import { getFeeCategories } from "../../helpers/lotOccupancyDB/getFeeCategories.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
|
||||||
const feeCategoryId = addFeeCategory(request.body, request.session);
|
const feeCategoryId = addFeeCategory(request.body, request.session);
|
||||||
|
|
||||||
const feeCategories = getFeeCategories({}, {
|
const feeCategories = getFeeCategories(
|
||||||
|
{},
|
||||||
|
{
|
||||||
includeFees: true
|
includeFees: true
|
||||||
});
|
}
|
||||||
|
);
|
||||||
|
|
||||||
response.json({
|
response.json({
|
||||||
success: true,
|
success: true,
|
||||||
|
|
@ -27,5 +21,4 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -1,18 +1,10 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import {
|
import { addLotOccupantType } from "../../helpers/lotOccupancyDB/addLotOccupantType.js";
|
||||||
addLotOccupantType
|
|
||||||
} from "../../helpers/lotOccupancyDB/addLotOccupantType.js";
|
|
||||||
|
|
||||||
import {
|
|
||||||
getLotOccupantTypes
|
|
||||||
} from "../../helpers/functions.cache.js";
|
|
||||||
|
|
||||||
|
import { getLotOccupantTypes } from "../../helpers/functions.cache.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
|
||||||
const lotOccupantTypeId = addLotOccupantType(request.body, request.session);
|
const lotOccupantTypeId = addLotOccupantType(request.body, request.session);
|
||||||
|
|
||||||
const lotOccupantTypes = getLotOccupantTypes();
|
const lotOccupantTypes = getLotOccupantTypes();
|
||||||
|
|
@ -24,5 +16,4 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -1,18 +1,10 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import {
|
import { addLotStatus } from "../../helpers/lotOccupancyDB/addLotStatus.js";
|
||||||
addLotStatus
|
|
||||||
} from "../../helpers/lotOccupancyDB/addLotStatus.js";
|
|
||||||
|
|
||||||
import {
|
|
||||||
getLotStatuses
|
|
||||||
} from "../../helpers/functions.cache.js";
|
|
||||||
|
|
||||||
|
import { getLotStatuses } from "../../helpers/functions.cache.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
|
||||||
const lotStatusId = addLotStatus(request.body, request.session);
|
const lotStatusId = addLotStatus(request.body, request.session);
|
||||||
|
|
||||||
const lotStatuses = getLotStatuses();
|
const lotStatuses = getLotStatuses();
|
||||||
|
|
@ -24,5 +16,4 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -1,18 +1,10 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import {
|
import { addWorkOrderType } from "../../helpers/lotOccupancyDB/addWorkOrderType.js";
|
||||||
addWorkOrderType
|
|
||||||
} from "../../helpers/lotOccupancyDB/addWorkOrderType.js";
|
|
||||||
|
|
||||||
import {
|
|
||||||
getWorkOrderTypes
|
|
||||||
} from "../../helpers/functions.cache.js";
|
|
||||||
|
|
||||||
|
import { getWorkOrderTypes } from "../../helpers/functions.cache.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
|
||||||
const workOrderTypeId = addWorkOrderType(request.body, request.session);
|
const workOrderTypeId = addWorkOrderType(request.body, request.session);
|
||||||
|
|
||||||
const workOrderTypes = getWorkOrderTypes();
|
const workOrderTypes = getWorkOrderTypes();
|
||||||
|
|
@ -24,5 +16,4 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -1,24 +1,18 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import {
|
|
||||||
deleteFee
|
|
||||||
} from "../../helpers/lotOccupancyDB/deleteFee.js";
|
|
||||||
|
|
||||||
import {
|
|
||||||
getFeeCategories
|
|
||||||
} from "../../helpers/lotOccupancyDB/getFeeCategories.js";
|
|
||||||
|
|
||||||
|
import { deleteFee } from "../../helpers/lotOccupancyDB/deleteFee.js";
|
||||||
|
|
||||||
|
import { getFeeCategories } from "../../helpers/lotOccupancyDB/getFeeCategories.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
|
||||||
const success = deleteFee(request.body.feeId, request.session);
|
const success = deleteFee(request.body.feeId, request.session);
|
||||||
|
|
||||||
const feeCategories = getFeeCategories({}, {
|
const feeCategories = getFeeCategories(
|
||||||
|
{},
|
||||||
|
{
|
||||||
includeFees: true
|
includeFees: true
|
||||||
});
|
}
|
||||||
|
);
|
||||||
|
|
||||||
response.json({
|
response.json({
|
||||||
success,
|
success,
|
||||||
|
|
@ -26,5 +20,4 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -1,24 +1,21 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import {
|
|
||||||
deleteFeeCategory
|
|
||||||
} from "../../helpers/lotOccupancyDB/deleteFeeCategory.js";
|
|
||||||
|
|
||||||
import {
|
|
||||||
getFeeCategories
|
|
||||||
} from "../../helpers/lotOccupancyDB/getFeeCategories.js";
|
|
||||||
|
|
||||||
|
import { deleteFeeCategory } from "../../helpers/lotOccupancyDB/deleteFeeCategory.js";
|
||||||
|
|
||||||
|
import { getFeeCategories } from "../../helpers/lotOccupancyDB/getFeeCategories.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
const success = deleteFeeCategory(
|
||||||
|
request.body.feeCategoryId,
|
||||||
|
request.session
|
||||||
|
);
|
||||||
|
|
||||||
const success = deleteFeeCategory(request.body.feeCategoryId, request.session);
|
const feeCategories = getFeeCategories(
|
||||||
|
{},
|
||||||
const feeCategories = getFeeCategories({}, {
|
{
|
||||||
includeFees: true
|
includeFees: true
|
||||||
});
|
}
|
||||||
|
);
|
||||||
|
|
||||||
response.json({
|
response.json({
|
||||||
success,
|
success,
|
||||||
|
|
@ -26,5 +23,4 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -1,19 +1,14 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import {
|
import { deleteLotOccupantType } from "../../helpers/lotOccupancyDB/deleteLotOccupantType.js";
|
||||||
deleteLotOccupantType
|
|
||||||
} from "../../helpers/lotOccupancyDB/deleteLotOccupantType.js";
|
|
||||||
|
|
||||||
import {
|
|
||||||
getLotOccupantTypes
|
|
||||||
} from "../../helpers/functions.cache.js";
|
|
||||||
|
|
||||||
|
import { getLotOccupantTypes } from "../../helpers/functions.cache.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
const success = deleteLotOccupantType(
|
||||||
const success = deleteLotOccupantType(request.body.lotOccupantTypeId, request.session);
|
request.body.lotOccupantTypeId,
|
||||||
|
request.session
|
||||||
|
);
|
||||||
|
|
||||||
const lotOccupantTypes = getLotOccupantTypes();
|
const lotOccupantTypes = getLotOccupantTypes();
|
||||||
|
|
||||||
|
|
@ -23,5 +18,4 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -1,18 +1,10 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import {
|
import { deleteLotStatus } from "../../helpers/lotOccupancyDB/deleteLotStatus.js";
|
||||||
deleteLotStatus
|
|
||||||
} from "../../helpers/lotOccupancyDB/deleteLotStatus.js";
|
|
||||||
|
|
||||||
import {
|
|
||||||
getLotStatuses
|
|
||||||
} from "../../helpers/functions.cache.js";
|
|
||||||
|
|
||||||
|
import { getLotStatuses } from "../../helpers/functions.cache.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
|
||||||
const success = deleteLotStatus(request.body.lotStatusId, request.session);
|
const success = deleteLotStatus(request.body.lotStatusId, request.session);
|
||||||
|
|
||||||
const lotStatuses = getLotStatuses();
|
const lotStatuses = getLotStatuses();
|
||||||
|
|
@ -23,5 +15,4 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -1,19 +1,14 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import {
|
import { deleteWorkOrderType } from "../../helpers/lotOccupancyDB/deleteWorkOrderType.js";
|
||||||
deleteWorkOrderType
|
|
||||||
} from "../../helpers/lotOccupancyDB/deleteWorkOrderType.js";
|
|
||||||
|
|
||||||
import {
|
|
||||||
getWorkOrderTypes
|
|
||||||
} from "../../helpers/functions.cache.js";
|
|
||||||
|
|
||||||
|
import { getWorkOrderTypes } from "../../helpers/functions.cache.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
const success = deleteWorkOrderType(
|
||||||
const success = deleteWorkOrderType(request.body.workOrderTypeId, request.session);
|
request.body.workOrderTypeId,
|
||||||
|
request.session
|
||||||
|
);
|
||||||
|
|
||||||
const workOrderTypes = getWorkOrderTypes();
|
const workOrderTypes = getWorkOrderTypes();
|
||||||
|
|
||||||
|
|
@ -23,5 +18,4 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -1,23 +1,18 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import {
|
import { moveFeeCategoryDown } from "../../helpers/lotOccupancyDB/moveFeeCategoryDown.js";
|
||||||
moveFeeCategoryDown
|
|
||||||
} from "../../helpers/lotOccupancyDB/moveFeeCategoryDown.js";
|
|
||||||
|
|
||||||
import {
|
|
||||||
getFeeCategories
|
|
||||||
} from "../../helpers/lotOccupancyDB/getFeeCategories.js";
|
|
||||||
|
|
||||||
|
import { getFeeCategories } from "../../helpers/lotOccupancyDB/getFeeCategories.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
|
||||||
const success = moveFeeCategoryDown(request.body.feeCategoryId);
|
const success = moveFeeCategoryDown(request.body.feeCategoryId);
|
||||||
|
|
||||||
const feeCategories = getFeeCategories({}, {
|
const feeCategories = getFeeCategories(
|
||||||
|
{},
|
||||||
|
{
|
||||||
includeFees: true
|
includeFees: true
|
||||||
});
|
}
|
||||||
|
);
|
||||||
|
|
||||||
response.json({
|
response.json({
|
||||||
success,
|
success,
|
||||||
|
|
@ -25,5 +20,4 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -1,23 +1,18 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import {
|
import { moveFeeCategoryUp } from "../../helpers/lotOccupancyDB/moveFeeCategoryUp.js";
|
||||||
moveFeeCategoryUp
|
|
||||||
} from "../../helpers/lotOccupancyDB/moveFeeCategoryUp.js";
|
|
||||||
|
|
||||||
import {
|
|
||||||
getFeeCategories
|
|
||||||
} from "../../helpers/lotOccupancyDB/getFeeCategories.js";
|
|
||||||
|
|
||||||
|
import { getFeeCategories } from "../../helpers/lotOccupancyDB/getFeeCategories.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
|
||||||
const success = moveFeeCategoryUp(request.body.feeCategoryId);
|
const success = moveFeeCategoryUp(request.body.feeCategoryId);
|
||||||
|
|
||||||
const feeCategories = getFeeCategories({}, {
|
const feeCategories = getFeeCategories(
|
||||||
|
{},
|
||||||
|
{
|
||||||
includeFees: true
|
includeFees: true
|
||||||
});
|
}
|
||||||
|
);
|
||||||
|
|
||||||
response.json({
|
response.json({
|
||||||
success,
|
success,
|
||||||
|
|
@ -25,5 +20,4 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -1,23 +1,18 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import {
|
import { moveFeeDown } from "../../helpers/lotOccupancyDB/moveFeeDown.js";
|
||||||
moveFeeDown
|
|
||||||
} from "../../helpers/lotOccupancyDB/moveFeeDown.js";
|
|
||||||
|
|
||||||
import {
|
|
||||||
getFeeCategories
|
|
||||||
} from "../../helpers/lotOccupancyDB/getFeeCategories.js";
|
|
||||||
|
|
||||||
|
import { getFeeCategories } from "../../helpers/lotOccupancyDB/getFeeCategories.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
|
||||||
const success = moveFeeDown(request.body.feeId);
|
const success = moveFeeDown(request.body.feeId);
|
||||||
|
|
||||||
const feeCategories = getFeeCategories({}, {
|
const feeCategories = getFeeCategories(
|
||||||
|
{},
|
||||||
|
{
|
||||||
includeFees: true
|
includeFees: true
|
||||||
});
|
}
|
||||||
|
);
|
||||||
|
|
||||||
response.json({
|
response.json({
|
||||||
success,
|
success,
|
||||||
|
|
@ -25,5 +20,4 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -1,23 +1,18 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import {
|
import { moveFeeUp } from "../../helpers/lotOccupancyDB/moveFeeUp.js";
|
||||||
moveFeeUp
|
|
||||||
} from "../../helpers/lotOccupancyDB/moveFeeUp.js";
|
|
||||||
|
|
||||||
import {
|
|
||||||
getFeeCategories
|
|
||||||
} from "../../helpers/lotOccupancyDB/getFeeCategories.js";
|
|
||||||
|
|
||||||
|
import { getFeeCategories } from "../../helpers/lotOccupancyDB/getFeeCategories.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
|
||||||
const success = moveFeeUp(request.body.feeId);
|
const success = moveFeeUp(request.body.feeId);
|
||||||
|
|
||||||
const feeCategories = getFeeCategories({}, {
|
const feeCategories = getFeeCategories(
|
||||||
|
{},
|
||||||
|
{
|
||||||
includeFees: true
|
includeFees: true
|
||||||
});
|
}
|
||||||
|
);
|
||||||
|
|
||||||
response.json({
|
response.json({
|
||||||
success,
|
success,
|
||||||
|
|
@ -25,5 +20,4 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -1,18 +1,10 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import {
|
import { moveLotOccupantTypeDown } from "../../helpers/lotOccupancyDB/moveLotOccupantTypeDown.js";
|
||||||
moveLotOccupantTypeDown
|
|
||||||
} from "../../helpers/lotOccupancyDB/moveLotOccupantTypeDown.js";
|
|
||||||
|
|
||||||
import {
|
|
||||||
getLotOccupantTypes
|
|
||||||
} from "../../helpers/functions.cache.js";
|
|
||||||
|
|
||||||
|
import { getLotOccupantTypes } from "../../helpers/functions.cache.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
|
||||||
const success = moveLotOccupantTypeDown(request.body.lotOccupantTypeId);
|
const success = moveLotOccupantTypeDown(request.body.lotOccupantTypeId);
|
||||||
|
|
||||||
const lotOccupantTypes = getLotOccupantTypes();
|
const lotOccupantTypes = getLotOccupantTypes();
|
||||||
|
|
@ -23,5 +15,4 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -1,18 +1,10 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import {
|
import { moveLotOccupantTypeUp } from "../../helpers/lotOccupancyDB/moveLotOccupantTypeUp.js";
|
||||||
moveLotOccupantTypeUp
|
|
||||||
} from "../../helpers/lotOccupancyDB/moveLotOccupantTypeUp.js";
|
|
||||||
|
|
||||||
import {
|
|
||||||
getLotOccupantTypes
|
|
||||||
} from "../../helpers/functions.cache.js";
|
|
||||||
|
|
||||||
|
import { getLotOccupantTypes } from "../../helpers/functions.cache.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
|
||||||
const success = moveLotOccupantTypeUp(request.body.lotOccupantTypeId);
|
const success = moveLotOccupantTypeUp(request.body.lotOccupantTypeId);
|
||||||
|
|
||||||
const lotOccupantTypes = getLotOccupantTypes();
|
const lotOccupantTypes = getLotOccupantTypes();
|
||||||
|
|
@ -23,5 +15,4 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -1,18 +1,10 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import {
|
import { moveLotStatusDown } from "../../helpers/lotOccupancyDB/moveLotStatusDown.js";
|
||||||
moveLotStatusDown
|
|
||||||
} from "../../helpers/lotOccupancyDB/moveLotStatusDown.js";
|
|
||||||
|
|
||||||
import {
|
|
||||||
getLotStatuses
|
|
||||||
} from "../../helpers/functions.cache.js";
|
|
||||||
|
|
||||||
|
import { getLotStatuses } from "../../helpers/functions.cache.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
|
||||||
const success = moveLotStatusDown(request.body.lotStatusId);
|
const success = moveLotStatusDown(request.body.lotStatusId);
|
||||||
|
|
||||||
const lotStatuses = getLotStatuses();
|
const lotStatuses = getLotStatuses();
|
||||||
|
|
@ -23,5 +15,4 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -1,18 +1,10 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import {
|
import { moveLotStatusUp } from "../../helpers/lotOccupancyDB/moveLotStatusUp.js";
|
||||||
moveLotStatusUp
|
|
||||||
} from "../../helpers/lotOccupancyDB/moveLotStatusUp.js";
|
|
||||||
|
|
||||||
import {
|
|
||||||
getLotStatuses
|
|
||||||
} from "../../helpers/functions.cache.js";
|
|
||||||
|
|
||||||
|
import { getLotStatuses } from "../../helpers/functions.cache.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
|
||||||
const success = moveLotStatusUp(request.body.lotStatusId);
|
const success = moveLotStatusUp(request.body.lotStatusId);
|
||||||
|
|
||||||
const lotStatuses = getLotStatuses();
|
const lotStatuses = getLotStatuses();
|
||||||
|
|
@ -23,5 +15,4 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -1,18 +1,10 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import {
|
import { moveWorkOrderTypeDown } from "../../helpers/lotOccupancyDB/moveWorkOrderTypeDown.js";
|
||||||
moveWorkOrderTypeDown
|
|
||||||
} from "../../helpers/lotOccupancyDB/moveWorkOrderTypeDown.js";
|
|
||||||
|
|
||||||
import {
|
|
||||||
getWorkOrderTypes
|
|
||||||
} from "../../helpers/functions.cache.js";
|
|
||||||
|
|
||||||
|
import { getWorkOrderTypes } from "../../helpers/functions.cache.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
|
||||||
const success = moveWorkOrderTypeDown(request.body.workOrderTypeId);
|
const success = moveWorkOrderTypeDown(request.body.workOrderTypeId);
|
||||||
|
|
||||||
const workOrderTypes = getWorkOrderTypes();
|
const workOrderTypes = getWorkOrderTypes();
|
||||||
|
|
@ -23,5 +15,4 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -1,18 +1,10 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import {
|
import { moveWorkOrderTypeUp } from "../../helpers/lotOccupancyDB/moveWorkOrderTypeUp.js";
|
||||||
moveWorkOrderTypeUp
|
|
||||||
} from "../../helpers/lotOccupancyDB/moveWorkOrderTypeUp.js";
|
|
||||||
|
|
||||||
import {
|
|
||||||
getWorkOrderTypes
|
|
||||||
} from "../../helpers/functions.cache.js";
|
|
||||||
|
|
||||||
|
import { getWorkOrderTypes } from "../../helpers/functions.cache.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
|
||||||
const success = moveWorkOrderTypeUp(request.body.workOrderTypeId);
|
const success = moveWorkOrderTypeUp(request.body.workOrderTypeId);
|
||||||
|
|
||||||
const workOrderTypes = getWorkOrderTypes();
|
const workOrderTypes = getWorkOrderTypes();
|
||||||
|
|
@ -23,5 +15,4 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -1,24 +1,18 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import {
|
|
||||||
updateFee
|
|
||||||
} from "../../helpers/lotOccupancyDB/updateFee.js";
|
|
||||||
|
|
||||||
import {
|
|
||||||
getFeeCategories
|
|
||||||
} from "../../helpers/lotOccupancyDB/getFeeCategories.js";
|
|
||||||
|
|
||||||
|
import { updateFee } from "../../helpers/lotOccupancyDB/updateFee.js";
|
||||||
|
|
||||||
|
import { getFeeCategories } from "../../helpers/lotOccupancyDB/getFeeCategories.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
|
||||||
const success = updateFee(request.body, request.session);
|
const success = updateFee(request.body, request.session);
|
||||||
|
|
||||||
const feeCategories = getFeeCategories({}, {
|
const feeCategories = getFeeCategories(
|
||||||
|
{},
|
||||||
|
{
|
||||||
includeFees: true
|
includeFees: true
|
||||||
});
|
}
|
||||||
|
);
|
||||||
|
|
||||||
response.json({
|
response.json({
|
||||||
success,
|
success,
|
||||||
|
|
@ -26,5 +20,4 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -1,24 +1,18 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import {
|
|
||||||
updateFeeCategory
|
|
||||||
} from "../../helpers/lotOccupancyDB/updateFeeCategory.js";
|
|
||||||
|
|
||||||
import {
|
|
||||||
getFeeCategories
|
|
||||||
} from "../../helpers/lotOccupancyDB/getFeeCategories.js";
|
|
||||||
|
|
||||||
|
import { updateFeeCategory } from "../../helpers/lotOccupancyDB/updateFeeCategory.js";
|
||||||
|
|
||||||
|
import { getFeeCategories } from "../../helpers/lotOccupancyDB/getFeeCategories.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
|
||||||
const success = updateFeeCategory(request.body, request.session);
|
const success = updateFeeCategory(request.body, request.session);
|
||||||
|
|
||||||
const feeCategories = getFeeCategories({}, {
|
const feeCategories = getFeeCategories(
|
||||||
|
{},
|
||||||
|
{
|
||||||
includeFees: true
|
includeFees: true
|
||||||
});
|
}
|
||||||
|
);
|
||||||
|
|
||||||
response.json({
|
response.json({
|
||||||
success,
|
success,
|
||||||
|
|
@ -26,5 +20,4 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -1,18 +1,10 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import {
|
import { updateLotOccupantType } from "../../helpers/lotOccupancyDB/updateLotOccupantType.js";
|
||||||
updateLotOccupantType
|
|
||||||
} from "../../helpers/lotOccupancyDB/updateLotOccupantType.js";
|
|
||||||
|
|
||||||
import {
|
|
||||||
getLotOccupantTypes
|
|
||||||
} from "../../helpers/functions.cache.js";
|
|
||||||
|
|
||||||
|
import { getLotOccupantTypes } from "../../helpers/functions.cache.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
|
||||||
const success = updateLotOccupantType(request.body, request.session);
|
const success = updateLotOccupantType(request.body, request.session);
|
||||||
|
|
||||||
const lotOccupantTypes = getLotOccupantTypes();
|
const lotOccupantTypes = getLotOccupantTypes();
|
||||||
|
|
@ -23,5 +15,4 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -1,18 +1,10 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import {
|
import { updateLotStatus } from "../../helpers/lotOccupancyDB/updateLotStatus.js";
|
||||||
updateLotStatus
|
|
||||||
} from "../../helpers/lotOccupancyDB/updateLotStatus.js";
|
|
||||||
|
|
||||||
import {
|
|
||||||
getLotStatuses
|
|
||||||
} from "../../helpers/functions.cache.js";
|
|
||||||
|
|
||||||
|
import { getLotStatuses } from "../../helpers/functions.cache.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
|
||||||
const success = updateLotStatus(request.body, request.session);
|
const success = updateLotStatus(request.body, request.session);
|
||||||
|
|
||||||
const lotStatuses = getLotStatuses();
|
const lotStatuses = getLotStatuses();
|
||||||
|
|
@ -23,5 +15,4 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -1,18 +1,10 @@
|
||||||
import type {
|
import type { RequestHandler } from "express";
|
||||||
RequestHandler
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import {
|
import { updateWorkOrderType } from "../../helpers/lotOccupancyDB/updateWorkOrderType.js";
|
||||||
updateWorkOrderType
|
|
||||||
} from "../../helpers/lotOccupancyDB/updateWorkOrderType.js";
|
|
||||||
|
|
||||||
import {
|
|
||||||
getWorkOrderTypes
|
|
||||||
} from "../../helpers/functions.cache.js";
|
|
||||||
|
|
||||||
|
import { getWorkOrderTypes } from "../../helpers/functions.cache.js";
|
||||||
|
|
||||||
export const handler: RequestHandler = async (request, response) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
|
|
||||||
const success = updateWorkOrderType(request.body, request.session);
|
const success = updateWorkOrderType(request.body, request.session);
|
||||||
|
|
||||||
const workOrderTypes = getWorkOrderTypes();
|
const workOrderTypes = getWorkOrderTypes();
|
||||||
|
|
@ -23,5 +15,4 @@ export const handler: RequestHandler = async (request, response) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
@ -8,53 +8,58 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
delete exports.feeCategories;
|
delete exports.feeCategories;
|
||||||
const renderFeeCategories = () => {
|
const renderFeeCategories = () => {
|
||||||
if (feeCategories.length === 0) {
|
if (feeCategories.length === 0) {
|
||||||
feeCategoriesContainerElement.innerHTML = "<div class=\"message is-warning\">" +
|
feeCategoriesContainerElement.innerHTML =
|
||||||
"<p class=\"message-body\">There are no available fees.</p>" +
|
'<div class="message is-warning">' +
|
||||||
|
'<p class="message-body">There are no available fees.</p>' +
|
||||||
"</div>";
|
"</div>";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
feeCategoriesContainerElement.innerHTML = "";
|
feeCategoriesContainerElement.innerHTML = "";
|
||||||
for (const feeCategory of feeCategories) {
|
for (const feeCategory of feeCategories) {
|
||||||
const feeCategoryContainerElement = document.createElement("section");
|
const feeCategoryContainerElement = document.createElement("section");
|
||||||
feeCategoryContainerElement.className = "container--feeCategory mb-5";
|
feeCategoryContainerElement.className =
|
||||||
feeCategoryContainerElement.dataset.feeCategoryId = feeCategory.feeCategoryId.toString();
|
"container--feeCategory mb-5";
|
||||||
feeCategoryContainerElement.insertAdjacentHTML("beforeend", "<div class=\"level is-mobile\">" +
|
feeCategoryContainerElement.dataset.feeCategoryId =
|
||||||
("<div class=\"level-left\">" +
|
feeCategory.feeCategoryId.toString();
|
||||||
"<div class=\"level-item\">" +
|
feeCategoryContainerElement.insertAdjacentHTML("beforeend", '<div class="level is-mobile">' +
|
||||||
"<h2 class=\"title is-4\">" + cityssm.escapeHTML(feeCategory.feeCategory) + "</h2>" +
|
('<div class="level-left">' +
|
||||||
|
'<div class="level-item">' +
|
||||||
|
'<h2 class="title is-4">' +
|
||||||
|
cityssm.escapeHTML(feeCategory.feeCategory) +
|
||||||
|
"</h2>" +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
("<div class=\"level-right\">" +
|
('<div class="level-right">' +
|
||||||
(feeCategory.fees.length === 0 ?
|
(feeCategory.fees.length === 0
|
||||||
"<div class=\"level-item\">" +
|
? '<div class="level-item">' +
|
||||||
"<button class=\"button is-small is-danger button--deleteFeeCategory\" type=\"button\">" +
|
'<button class="button is-small is-danger button--deleteFeeCategory" type="button">' +
|
||||||
"<span class=\"icon is-small\"><i class=\"fas fa-trash\" aria-hidden=\"true\"></i></span>" +
|
'<span class="icon is-small"><i class="fas fa-trash" aria-hidden="true"></i></span>' +
|
||||||
"<span>Delete Category</span>" +
|
"<span>Delete Category</span>" +
|
||||||
"</button>" +
|
"</button>" +
|
||||||
"</div>" :
|
"</div>"
|
||||||
"") +
|
: "") +
|
||||||
("<div class=\"level-item\">" +
|
('<div class="level-item">' +
|
||||||
"<button class=\"button is-small is-primary button--editFeeCategory\" type=\"button\">" +
|
'<button class="button is-small is-primary button--editFeeCategory" type="button">' +
|
||||||
"<span class=\"icon is-small\"><i class=\"fas fa-pencil-alt\" aria-hidden=\"true\"></i></span>" +
|
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||||
"<span>Edit Category</span>" +
|
"<span>Edit Category</span>" +
|
||||||
"</button>" +
|
"</button>" +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
("<div class=\"level-item\">" +
|
('<div class="level-item">' +
|
||||||
"<button class=\"button is-small is-success button--addFee\" type=\"button\">" +
|
'<button class="button is-small is-success button--addFee" type="button">' +
|
||||||
"<span class=\"icon is-small\"><i class=\"fas fa-plus\" aria-hidden=\"true\"></i></span>" +
|
'<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>' +
|
||||||
"<span>Add Fee</span>" +
|
"<span>Add Fee</span>" +
|
||||||
"</button>" +
|
"</button>" +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
("<div class=\"level-item\">" +
|
('<div class="level-item">' +
|
||||||
"<div class=\"field has-addons\">" +
|
'<div class="field has-addons">' +
|
||||||
"<div class=\"control\">" +
|
'<div class="control">' +
|
||||||
"<button class=\"button is-small button--moveFeeCategoryUp\" data-tooltip=\"Move Up\" type=\"button\" aria-label=\"Move Up\">" +
|
'<button class="button is-small button--moveFeeCategoryUp" data-tooltip="Move Up" type="button" aria-label="Move Up">' +
|
||||||
"<i class=\"fas fa-arrow-up\" aria-hidden=\"true\"></i>" +
|
'<i class="fas fa-arrow-up" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
"</button>" +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"<div class=\"control\">" +
|
'<div class="control">' +
|
||||||
"<button class=\"button is-small button--moveFeeCategoryDown\" data-tooltip=\"Move Down\" type=\"button\" aria-label=\"Move Down\">" +
|
'<button class="button is-small button--moveFeeCategoryDown" data-tooltip="Move Down" type="button" aria-label="Move Down">' +
|
||||||
"<i class=\"fas fa-arrow-down\" aria-hidden=\"true\"></i>" +
|
'<i class="fas fa-arrow-down" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
"</button>" +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
|
|
@ -62,8 +67,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
"</div>") +
|
"</div>") +
|
||||||
"</div>");
|
"</div>");
|
||||||
if (feeCategory.fees.length === 0) {
|
if (feeCategory.fees.length === 0) {
|
||||||
feeCategoryContainerElement.insertAdjacentHTML("beforeend", "<div class=\"message is-info\">" +
|
feeCategoryContainerElement.insertAdjacentHTML("beforeend", '<div class="message is-info">' +
|
||||||
"<p class=\"message-body\">There are no fees in the \"" + cityssm.escapeHTML(feeCategory.feeCategory) + "\" category.</p>" +
|
'<p class="message-body">There are no fees in the "' +
|
||||||
|
cityssm.escapeHTML(feeCategory.feeCategory) +
|
||||||
|
'" category.</p>' +
|
||||||
"</div>");
|
"</div>");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
@ -71,85 +78,116 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
panelElement.className = "panel";
|
panelElement.className = "panel";
|
||||||
for (const fee of feeCategory.fees) {
|
for (const fee of feeCategory.fees) {
|
||||||
const panelBlockElement = document.createElement("div");
|
const panelBlockElement = document.createElement("div");
|
||||||
panelBlockElement.className = "panel-block is-block container--fee";
|
panelBlockElement.className =
|
||||||
|
"panel-block is-block container--fee";
|
||||||
panelBlockElement.dataset.feeId = fee.feeId.toString();
|
panelBlockElement.dataset.feeId = fee.feeId.toString();
|
||||||
panelBlockElement.innerHTML = "<div class=\"columns\">" +
|
panelBlockElement.innerHTML =
|
||||||
("<div class=\"column is-half\">" +
|
'<div class="columns">' +
|
||||||
|
('<div class="column is-half">' +
|
||||||
"<p>" +
|
"<p>" +
|
||||||
"<a class=\"has-text-weight-bold\" href=\"#\">" + cityssm.escapeHTML(fee.feeName) + "</a><br />" +
|
'<a class="has-text-weight-bold" href="#">' +
|
||||||
"<small>" + cityssm.escapeHTML(fee.feeDescription).replace(/\n/g, "<br />") + "</small>" +
|
cityssm.escapeHTML(fee.feeName) +
|
||||||
|
"</a><br />" +
|
||||||
|
"<small>" +
|
||||||
|
cityssm
|
||||||
|
.escapeHTML(fee.feeDescription)
|
||||||
|
.replace(/\n/g, "<br />") +
|
||||||
|
"</small>" +
|
||||||
"</p>" +
|
"</p>" +
|
||||||
"<p class=\"tags\">" +
|
'<p class="tags">' +
|
||||||
(fee.isRequired ?
|
(fee.isRequired
|
||||||
"<span class=\"tag is-warning\">Required</span>" :
|
? '<span class="tag is-warning">Required</span>'
|
||||||
"") +
|
: "") +
|
||||||
(fee.occupancyTypeId ?
|
(fee.occupancyTypeId
|
||||||
" <span class=\"tag has-tooltip-bottom\" data-tooltip=\"" + cityssm.escapeHTML(exports.aliases.occupancy) + " Type Filter\">" +
|
? ' <span class="tag has-tooltip-bottom" data-tooltip="' +
|
||||||
cityssm.escapeHTML(fee.occupancyType) + "</span>" :
|
cityssm.escapeHTML(exports.aliases.occupancy) +
|
||||||
"") +
|
' Type Filter">' +
|
||||||
(fee.lotTypeId ?
|
cityssm.escapeHTML(fee.occupancyType) +
|
||||||
" <span class=\"tag has-tooltip-bottom\" data-tooltip=\"" + cityssm.escapeHTML(exports.aliases.lot) + " Type Filter\">" +
|
"</span>"
|
||||||
cityssm.escapeHTML(fee.lotType) + "</span>" :
|
: "") +
|
||||||
"") +
|
(fee.lotTypeId
|
||||||
|
? ' <span class="tag has-tooltip-bottom" data-tooltip="' +
|
||||||
|
cityssm.escapeHTML(exports.aliases.lot) +
|
||||||
|
' Type Filter">' +
|
||||||
|
cityssm.escapeHTML(fee.lotType) +
|
||||||
|
"</span>"
|
||||||
|
: "") +
|
||||||
"</p>" +
|
"</p>" +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
("<div class=\"column has-text-centered\">" +
|
('<div class="column has-text-centered">' +
|
||||||
(fee.feeFunction ?
|
(fee.feeFunction
|
||||||
cityssm.escapeHTML(fee.feeFunction) + "<br />" +
|
? cityssm.escapeHTML(fee.feeFunction) +
|
||||||
"<small>Fee Function</small>" :
|
"<br />" +
|
||||||
"$" + fee.feeAmount.toFixed(2) + "<br />" +
|
"<small>Fee Function</small>"
|
||||||
|
: "$" +
|
||||||
|
fee.feeAmount.toFixed(2) +
|
||||||
|
"<br />" +
|
||||||
"<small>Fee</small>") +
|
"<small>Fee</small>") +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
("<div class=\"column has-text-centered\">" +
|
('<div class="column has-text-centered">' +
|
||||||
(fee.taxPercentage ?
|
(fee.taxPercentage
|
||||||
fee.taxPercentage + "%" :
|
? fee.taxPercentage + "%"
|
||||||
"$" + fee.taxAmount.toFixed(2)) +
|
: "$" + fee.taxAmount.toFixed(2)) +
|
||||||
"<br /><small>Tax</small>" +
|
"<br /><small>Tax</small>" +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
("<div class=\"column has-text-centered\">" +
|
('<div class="column has-text-centered">' +
|
||||||
(fee.includeQuantity ?
|
(fee.includeQuantity
|
||||||
cityssm.escapeHTML(fee.quantityUnit) + "<br />" +
|
? cityssm.escapeHTML(fee.quantityUnit) +
|
||||||
"<small>Quantity</small>" :
|
"<br />" +
|
||||||
"") +
|
"<small>Quantity</small>"
|
||||||
|
: "") +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
("<div class=\"column is-narrow\">" +
|
('<div class="column is-narrow">' +
|
||||||
"<div class=\"field has-addons\">" +
|
'<div class="field has-addons">' +
|
||||||
"<div class=\"control\">" +
|
'<div class="control">' +
|
||||||
"<button class=\"button is-small button--moveFeeUp\" data-tooltip=\"Move Up\" type=\"button\" aria-label=\"Move Up\">" +
|
'<button class="button is-small button--moveFeeUp" data-tooltip="Move Up" type="button" aria-label="Move Up">' +
|
||||||
"<i class=\"fas fa-arrow-up\" aria-hidden=\"true\"></i>" +
|
'<i class="fas fa-arrow-up" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
"</button>" +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"<div class=\"control\">" +
|
'<div class="control">' +
|
||||||
"<button class=\"button is-small button--moveFeeDown\" data-tooltip=\"Move Down\" type=\"button\" aria-label=\"Move Down\">" +
|
'<button class="button is-small button--moveFeeDown" data-tooltip="Move Down" type="button" aria-label="Move Down">' +
|
||||||
"<i class=\"fas fa-arrow-down\" aria-hidden=\"true\"></i>" +
|
'<i class="fas fa-arrow-down" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
"</button>" +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
"</div>";
|
"</div>";
|
||||||
panelBlockElement.querySelector("a").addEventListener("click", openEditFee);
|
panelBlockElement
|
||||||
panelBlockElement.querySelector(".button--moveFeeUp").addEventListener("click", moveFeeUp);
|
.querySelector("a")
|
||||||
panelBlockElement.querySelector(".button--moveFeeDown").addEventListener("click", moveFeeDown);
|
.addEventListener("click", openEditFee);
|
||||||
|
panelBlockElement
|
||||||
|
.querySelector(".button--moveFeeUp")
|
||||||
|
.addEventListener("click", moveFeeUp);
|
||||||
|
panelBlockElement
|
||||||
|
.querySelector(".button--moveFeeDown")
|
||||||
|
.addEventListener("click", moveFeeDown);
|
||||||
panelElement.append(panelBlockElement);
|
panelElement.append(panelBlockElement);
|
||||||
}
|
}
|
||||||
feeCategoryContainerElement.append(panelElement);
|
feeCategoryContainerElement.append(panelElement);
|
||||||
}
|
}
|
||||||
if (feeCategory.fees.length === 0) {
|
if (feeCategory.fees.length === 0) {
|
||||||
feeCategoryContainerElement.querySelector(".button--deleteFeeCategory")
|
feeCategoryContainerElement
|
||||||
|
.querySelector(".button--deleteFeeCategory")
|
||||||
.addEventListener("click", confirmDeleteFeeCategory);
|
.addEventListener("click", confirmDeleteFeeCategory);
|
||||||
}
|
}
|
||||||
feeCategoryContainerElement.querySelector(".button--editFeeCategory")
|
feeCategoryContainerElement
|
||||||
|
.querySelector(".button--editFeeCategory")
|
||||||
.addEventListener("click", openEditFeeCategory);
|
.addEventListener("click", openEditFeeCategory);
|
||||||
feeCategoryContainerElement.querySelector(".button--addFee")
|
feeCategoryContainerElement
|
||||||
|
.querySelector(".button--addFee")
|
||||||
.addEventListener("click", openAddFee);
|
.addEventListener("click", openAddFee);
|
||||||
feeCategoryContainerElement.querySelector(".button--moveFeeCategoryUp")
|
feeCategoryContainerElement
|
||||||
|
.querySelector(".button--moveFeeCategoryUp")
|
||||||
.addEventListener("click", moveFeeCategoryUp);
|
.addEventListener("click", moveFeeCategoryUp);
|
||||||
feeCategoryContainerElement.querySelector(".button--moveFeeCategoryDown")
|
feeCategoryContainerElement
|
||||||
|
.querySelector(".button--moveFeeCategoryDown")
|
||||||
.addEventListener("click", moveFeeCategoryDown);
|
.addEventListener("click", moveFeeCategoryDown);
|
||||||
feeCategoriesContainerElement.append(feeCategoryContainerElement);
|
feeCategoriesContainerElement.append(feeCategoryContainerElement);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
document.querySelector("#button--addFeeCategory").addEventListener("click", () => {
|
document
|
||||||
|
.querySelector("#button--addFeeCategory")
|
||||||
|
.addEventListener("click", () => {
|
||||||
let addCloseModalFunction;
|
let addCloseModalFunction;
|
||||||
const doAddFeeCategory = (submitEvent) => {
|
const doAddFeeCategory = (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
|
|
@ -173,7 +211,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
modalElement.querySelector("#feeCategoryAdd--feeCategory").focus();
|
modalElement.querySelector("#feeCategoryAdd--feeCategory").focus();
|
||||||
addCloseModalFunction = closeModalFunction;
|
addCloseModalFunction = closeModalFunction;
|
||||||
modalElement.querySelector("form").addEventListener("submit", doAddFeeCategory);
|
modalElement
|
||||||
|
.querySelector("form")
|
||||||
|
.addEventListener("submit", doAddFeeCategory);
|
||||||
},
|
},
|
||||||
onremoved: () => {
|
onremoved: () => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
|
|
@ -211,7 +251,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
onshown: (modalElement, closeModalFunction) => {
|
onshown: (modalElement, closeModalFunction) => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
editCloseModalFunction = closeModalFunction;
|
editCloseModalFunction = closeModalFunction;
|
||||||
modalElement.querySelector("form").addEventListener("submit", doUpdateFeeCategory);
|
modalElement
|
||||||
|
.querySelector("form")
|
||||||
|
.addEventListener("submit", doUpdateFeeCategory);
|
||||||
modalElement.querySelector("#feeCategoryEdit--feeCategory").focus();
|
modalElement.querySelector("#feeCategoryEdit--feeCategory").focus();
|
||||||
},
|
},
|
||||||
onremoved: () => {
|
onremoved: () => {
|
||||||
|
|
@ -319,7 +361,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const occupancyTypeElement = modalElement.querySelector("#feeAdd--occupancyTypeId");
|
const occupancyTypeElement = modalElement.querySelector("#feeAdd--occupancyTypeId");
|
||||||
for (const occupancyType of exports.occupancyTypes) {
|
for (const occupancyType of exports.occupancyTypes) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement("option");
|
||||||
optionElement.value = occupancyType.occupancyTypeId.toString();
|
optionElement.value =
|
||||||
|
occupancyType.occupancyTypeId.toString();
|
||||||
optionElement.textContent = occupancyType.occupancyType;
|
optionElement.textContent = occupancyType.occupancyType;
|
||||||
occupancyTypeElement.append(optionElement);
|
occupancyTypeElement.append(optionElement);
|
||||||
}
|
}
|
||||||
|
|
@ -336,23 +379,33 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
onshown: (modalElement, closeModalFunction) => {
|
onshown: (modalElement, closeModalFunction) => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
addCloseModalFunction = closeModalFunction;
|
addCloseModalFunction = closeModalFunction;
|
||||||
modalElement.querySelector("form").addEventListener("submit", doAddFee);
|
modalElement
|
||||||
|
.querySelector("form")
|
||||||
|
.addEventListener("submit", doAddFee);
|
||||||
modalElement.querySelector("#feeAdd--feeName").focus();
|
modalElement.querySelector("#feeAdd--feeName").focus();
|
||||||
modalElement.querySelector("#feeAdd--feeFunction").addEventListener("change", () => {
|
modalElement
|
||||||
|
.querySelector("#feeAdd--feeFunction")
|
||||||
|
.addEventListener("change", () => {
|
||||||
const feeAmountElement = modalElement.querySelector("#feeAdd--feeAmount");
|
const feeAmountElement = modalElement.querySelector("#feeAdd--feeAmount");
|
||||||
const feeFunctionElement = modalElement.querySelector("#feeAdd--feeFunction");
|
const feeFunctionElement = modalElement.querySelector("#feeAdd--feeFunction");
|
||||||
if (feeFunctionElement.value === "") {
|
if (feeFunctionElement.value === "") {
|
||||||
feeFunctionElement.closest(".select").classList.remove("is-success");
|
feeFunctionElement
|
||||||
|
.closest(".select")
|
||||||
|
.classList.remove("is-success");
|
||||||
feeAmountElement.classList.add("is-success");
|
feeAmountElement.classList.add("is-success");
|
||||||
feeAmountElement.disabled = false;
|
feeAmountElement.disabled = false;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
feeFunctionElement.closest(".select").classList.add("is-success");
|
feeFunctionElement
|
||||||
|
.closest(".select")
|
||||||
|
.classList.add("is-success");
|
||||||
feeAmountElement.classList.remove("is-success");
|
feeAmountElement.classList.remove("is-success");
|
||||||
feeAmountElement.disabled = true;
|
feeAmountElement.disabled = true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
modalElement.querySelector("#feeAdd--taxPercentage").addEventListener("keyup", () => {
|
modalElement
|
||||||
|
.querySelector("#feeAdd--taxPercentage")
|
||||||
|
.addEventListener("keyup", () => {
|
||||||
const taxAmountElement = modalElement.querySelector("#feeAdd--taxAmount");
|
const taxAmountElement = modalElement.querySelector("#feeAdd--taxAmount");
|
||||||
const taxPercentageElement = modalElement.querySelector("#feeAdd--taxPercentage");
|
const taxPercentageElement = modalElement.querySelector("#feeAdd--taxPercentage");
|
||||||
if (taxPercentageElement.value === "") {
|
if (taxPercentageElement.value === "") {
|
||||||
|
|
@ -366,7 +419,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
taxAmountElement.disabled = true;
|
taxAmountElement.disabled = true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
modalElement.querySelector("#feeAdd--includeQuantity").addEventListener("change", () => {
|
modalElement
|
||||||
|
.querySelector("#feeAdd--includeQuantity")
|
||||||
|
.addEventListener("change", () => {
|
||||||
modalElement.querySelector("#feeAdd--quantityUnit").disabled =
|
modalElement.querySelector("#feeAdd--quantityUnit").disabled =
|
||||||
modalElement.querySelector("#feeAdd--includeQuantity").value === "";
|
modalElement.querySelector("#feeAdd--includeQuantity").value === "";
|
||||||
});
|
});
|
||||||
|
|
@ -440,12 +495,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const feeAmountElement = editModalElement.querySelector("#feeEdit--feeAmount");
|
const feeAmountElement = editModalElement.querySelector("#feeEdit--feeAmount");
|
||||||
const feeFunctionElement = editModalElement.querySelector("#feeEdit--feeFunction");
|
const feeFunctionElement = editModalElement.querySelector("#feeEdit--feeFunction");
|
||||||
if (feeFunctionElement.value === "") {
|
if (feeFunctionElement.value === "") {
|
||||||
feeFunctionElement.closest(".select").classList.remove("is-success");
|
feeFunctionElement
|
||||||
|
.closest(".select")
|
||||||
|
.classList.remove("is-success");
|
||||||
feeAmountElement.classList.add("is-success");
|
feeAmountElement.classList.add("is-success");
|
||||||
feeAmountElement.disabled = false;
|
feeAmountElement.disabled = false;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
feeFunctionElement.closest(".select").classList.add("is-success");
|
feeFunctionElement
|
||||||
|
.closest(".select")
|
||||||
|
.classList.add("is-success");
|
||||||
feeAmountElement.classList.remove("is-success");
|
feeAmountElement.classList.remove("is-success");
|
||||||
feeAmountElement.disabled = true;
|
feeAmountElement.disabled = true;
|
||||||
}
|
}
|
||||||
|
|
@ -487,7 +546,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const occupancyTypeElement = modalElement.querySelector("#feeEdit--occupancyTypeId");
|
const occupancyTypeElement = modalElement.querySelector("#feeEdit--occupancyTypeId");
|
||||||
for (const occupancyType of exports.occupancyTypes) {
|
for (const occupancyType of exports.occupancyTypes) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement("option");
|
||||||
optionElement.value = occupancyType.occupancyTypeId.toString();
|
optionElement.value =
|
||||||
|
occupancyType.occupancyTypeId.toString();
|
||||||
optionElement.textContent = occupancyType.occupancyType;
|
optionElement.textContent = occupancyType.occupancyType;
|
||||||
if (occupancyType.occupancyTypeId === fee.occupancyTypeId) {
|
if (occupancyType.occupancyTypeId === fee.occupancyTypeId) {
|
||||||
optionElement.selected = true;
|
optionElement.selected = true;
|
||||||
|
|
@ -505,11 +565,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
lotTypeElement.append(optionElement);
|
lotTypeElement.append(optionElement);
|
||||||
}
|
}
|
||||||
modalElement.querySelector("#feeEdit--feeAmount").value = fee.feeAmount ? fee.feeAmount.toFixed(2) : "";
|
modalElement.querySelector("#feeEdit--feeAmount").value = fee.feeAmount ? fee.feeAmount.toFixed(2) : "";
|
||||||
modalElement.querySelector("#feeEdit--feeFunction").addEventListener("change", toggleFeeFields);
|
modalElement
|
||||||
|
.querySelector("#feeEdit--feeFunction")
|
||||||
|
.addEventListener("change", toggleFeeFields);
|
||||||
toggleFeeFields();
|
toggleFeeFields();
|
||||||
modalElement.querySelector("#feeEdit--taxAmount").value = fee.taxAmount ? fee.taxAmount.toFixed(2) : "";
|
modalElement.querySelector("#feeEdit--taxAmount").value = fee.taxAmount ? fee.taxAmount.toFixed(2) : "";
|
||||||
const taxPercentageElement = modalElement.querySelector("#feeEdit--taxPercentage");
|
const taxPercentageElement = modalElement.querySelector("#feeEdit--taxPercentage");
|
||||||
taxPercentageElement.value = fee.taxPercentage ? fee.taxPercentage.toString() : "";
|
taxPercentageElement.value = fee.taxPercentage
|
||||||
|
? fee.taxPercentage.toString()
|
||||||
|
: "";
|
||||||
taxPercentageElement.addEventListener("keyup", toggleTaxFields);
|
taxPercentageElement.addEventListener("keyup", toggleTaxFields);
|
||||||
toggleTaxFields();
|
toggleTaxFields();
|
||||||
const includeQuantityElement = modalElement.querySelector("#feeEdit--includeQuantity");
|
const includeQuantityElement = modalElement.querySelector("#feeEdit--includeQuantity");
|
||||||
|
|
@ -527,9 +591,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
onshown: (modalElement, closeModalFunction) => {
|
onshown: (modalElement, closeModalFunction) => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
editCloseModalFunction = closeModalFunction;
|
editCloseModalFunction = closeModalFunction;
|
||||||
modalElement.querySelector("form").addEventListener("submit", doUpdateFee);
|
modalElement
|
||||||
|
.querySelector("form")
|
||||||
|
.addEventListener("submit", doUpdateFee);
|
||||||
bulmaJS.init(modalElement);
|
bulmaJS.init(modalElement);
|
||||||
modalElement.querySelector(".button--deleteFee").addEventListener("click", confirmDeleteFee);
|
modalElement
|
||||||
|
.querySelector(".button--deleteFee")
|
||||||
|
.addEventListener("click", confirmDeleteFee);
|
||||||
},
|
},
|
||||||
onremoved: () => {
|
onremoved: () => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -105,10 +105,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const renderWorkOrderTypes = () => {
|
const renderWorkOrderTypes = () => {
|
||||||
const containerElement = document.querySelector("#container--workOrderTypes");
|
const containerElement = document.querySelector("#container--workOrderTypes");
|
||||||
if (workOrderTypes.length === 0) {
|
if (workOrderTypes.length === 0) {
|
||||||
containerElement.innerHTML = "<tr>" +
|
containerElement.innerHTML =
|
||||||
"<td colspan=\"2\">" +
|
"<tr>" +
|
||||||
"<div class=\"message is-warning\">" +
|
'<td colspan="2">' +
|
||||||
"<p class=\"message-body\">There are no active work order types.</p>" +
|
'<div class="message is-warning">' +
|
||||||
|
'<p class="message-body">There are no active work order types.</p>' +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</td>" +
|
"</td>" +
|
||||||
"</tr>";
|
"</tr>";
|
||||||
|
|
@ -117,47 +118,63 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
containerElement.innerHTML = "";
|
containerElement.innerHTML = "";
|
||||||
for (const workOrderType of workOrderTypes) {
|
for (const workOrderType of workOrderTypes) {
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement("tr");
|
||||||
tableRowElement.dataset.workOrderTypeId = workOrderType.workOrderTypeId.toString();
|
tableRowElement.dataset.workOrderTypeId =
|
||||||
tableRowElement.innerHTML = "<td>" +
|
workOrderType.workOrderTypeId.toString();
|
||||||
|
tableRowElement.innerHTML =
|
||||||
|
"<td>" +
|
||||||
"<form>" +
|
"<form>" +
|
||||||
"<input name=\"workOrderTypeId\" type=\"hidden\" value=\"" + workOrderType.workOrderTypeId.toString() + "\" />" +
|
'<input name="workOrderTypeId" type="hidden" value="' +
|
||||||
("<div class=\"field has-addons\">" +
|
workOrderType.workOrderTypeId.toString() +
|
||||||
"<div class=\"control\">" +
|
'" />' +
|
||||||
"<input class=\"input\" name=\"workOrderType\" type=\"text\" value=\"" + cityssm.escapeHTML(workOrderType.workOrderType) + "\" maxlength=\"100\" required />" +
|
('<div class="field has-addons">' +
|
||||||
|
'<div class="control">' +
|
||||||
|
'<input class="input" name="workOrderType" type="text" value="' +
|
||||||
|
cityssm.escapeHTML(workOrderType.workOrderType) +
|
||||||
|
'" maxlength="100" required />' +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"<div class=\"control\">" +
|
'<div class="control">' +
|
||||||
"<button class=\"button is-success\" type=\"submit\"><i class=\"fas fa-save\" aria-hidden=\"true\"></i></button>" +
|
'<button class="button is-success" type="submit"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
"</form>" +
|
"</form>" +
|
||||||
"</td>" +
|
"</td>" +
|
||||||
"<td class=\"is-nowrap\">" +
|
'<td class="is-nowrap">' +
|
||||||
"<div class=\"field is-grouped\">" +
|
'<div class="field is-grouped">' +
|
||||||
"<div class=\"control\">" +
|
'<div class="control">' +
|
||||||
("<div class=\"field has-addons\">" +
|
('<div class="field has-addons">' +
|
||||||
"<div class=\"control\">" +
|
'<div class="control">' +
|
||||||
"<button class=\"button button--moveWorkOrderTypeUp\" data-tooltip=\"Move Up\" type=\"button\" aria-label=\"Move Up\"><i class=\"fas fa-arrow-up\" aria-hidden=\"true\"></i></button>" +
|
'<button class="button button--moveWorkOrderTypeUp" data-tooltip="Move Up" type="button" aria-label="Move Up"><i class="fas fa-arrow-up" aria-hidden="true"></i></button>' +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"<div class=\"control\">" +
|
'<div class="control">' +
|
||||||
"<button class=\"button button--moveWorkOrderTypeDown\" data-tooltip=\"Move Down\" type=\"button\" aria-label=\"Move Down\"><i class=\"fas fa-arrow-down\" aria-hidden=\"true\"></i></button>" +
|
'<button class="button button--moveWorkOrderTypeDown" data-tooltip="Move Down" type="button" aria-label="Move Down"><i class="fas fa-arrow-down" aria-hidden="true"></i></button>' +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"<div class=\"control\">" +
|
'<div class="control">' +
|
||||||
"<button class=\"button is-danger is-light button--deleteWorkOrderType\" data-tooltip=\"Delete Work Order Type\" type=\"button\" aria-label=\"Delete Work Order Type\">" +
|
'<button class="button is-danger is-light button--deleteWorkOrderType" data-tooltip="Delete Work Order Type" type="button" aria-label="Delete Work Order Type">' +
|
||||||
"<i class=\"fas fa-trash\" aria-hidden=\"true\"></i>" +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
"</button>" +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</td>";
|
"</td>";
|
||||||
tableRowElement.querySelector("form").addEventListener("submit", updateWorkOrderType);
|
tableRowElement
|
||||||
tableRowElement.querySelector(".button--moveWorkOrderTypeUp").addEventListener("click", moveWorkOrderTypeUp);
|
.querySelector("form")
|
||||||
tableRowElement.querySelector(".button--moveWorkOrderTypeDown").addEventListener("click", moveWorkOrderTypeDown);
|
.addEventListener("submit", updateWorkOrderType);
|
||||||
tableRowElement.querySelector(".button--deleteWorkOrderType").addEventListener("click", deleteWorkOrderType);
|
tableRowElement
|
||||||
|
.querySelector(".button--moveWorkOrderTypeUp")
|
||||||
|
.addEventListener("click", moveWorkOrderTypeUp);
|
||||||
|
tableRowElement
|
||||||
|
.querySelector(".button--moveWorkOrderTypeDown")
|
||||||
|
.addEventListener("click", moveWorkOrderTypeDown);
|
||||||
|
tableRowElement
|
||||||
|
.querySelector(".button--deleteWorkOrderType")
|
||||||
|
.addEventListener("click", deleteWorkOrderType);
|
||||||
containerElement.append(tableRowElement);
|
containerElement.append(tableRowElement);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
document.querySelector("#form--addWorkOrderType").addEventListener("submit", (submitEvent) => {
|
document
|
||||||
|
.querySelector("#form--addWorkOrderType")
|
||||||
|
.addEventListener("submit", (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
const formElement = submitEvent.currentTarget;
|
const formElement = submitEvent.currentTarget;
|
||||||
cityssm.postJSON(urlPrefix + "/admin/doAddWorkOrderType", formElement, (responseJSON) => {
|
cityssm.postJSON(urlPrefix + "/admin/doAddWorkOrderType", formElement, (responseJSON) => {
|
||||||
|
|
@ -185,7 +202,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotStatuses = responseJSON.lotStatuses;
|
lotStatuses = responseJSON.lotStatuses;
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: exports.aliases.lot + " Status Updated Successfully",
|
message: exports.aliases.lot +
|
||||||
|
" Status Updated Successfully",
|
||||||
contextualColorName: "success"
|
contextualColorName: "success"
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -214,13 +232,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
tableRowElement.remove();
|
tableRowElement.remove();
|
||||||
}
|
}
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: exports.aliases.lot + " Status Deleted Successfully",
|
message: exports.aliases.lot +
|
||||||
|
" Status Deleted Successfully",
|
||||||
contextualColorName: "success"
|
contextualColorName: "success"
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Deleting " + exports.aliases.lot + " Status",
|
title: "Error Deleting " +
|
||||||
|
exports.aliases.lot +
|
||||||
|
" Status",
|
||||||
message: responseJSON.errorMessage,
|
message: responseJSON.errorMessage,
|
||||||
contextualColorName: "danger"
|
contextualColorName: "danger"
|
||||||
});
|
});
|
||||||
|
|
@ -230,7 +251,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete " + exports.aliases.lot + " Status",
|
title: "Delete " + exports.aliases.lot + " Status",
|
||||||
message: "Are you sure you want to delete this status?<br />" +
|
message: "Are you sure you want to delete this status?<br />" +
|
||||||
"Note that no " + exports.aliases.lots.toLowerCase() + " will be removed.",
|
"Note that no " +
|
||||||
|
exports.aliases.lots.toLowerCase() +
|
||||||
|
" will be removed.",
|
||||||
messageIsHtml: true,
|
messageIsHtml: true,
|
||||||
contextualColorName: "warning",
|
contextualColorName: "warning",
|
||||||
okButton: {
|
okButton: {
|
||||||
|
|
@ -280,10 +303,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const renderLotStatuses = () => {
|
const renderLotStatuses = () => {
|
||||||
const containerElement = document.querySelector("#container--lotStatuses");
|
const containerElement = document.querySelector("#container--lotStatuses");
|
||||||
if (workOrderTypes.length === 0) {
|
if (workOrderTypes.length === 0) {
|
||||||
containerElement.innerHTML = "<tr>" +
|
containerElement.innerHTML =
|
||||||
"<td colspan=\"2\">" +
|
"<tr>" +
|
||||||
"<div class=\"message is-warning\">" +
|
'<td colspan="2">' +
|
||||||
"<p class=\"message-body\">There are no active " + cityssm.escapeHTML(exports.aliases.lot.toLowerCase()) + " statuses.</p>" +
|
'<div class="message is-warning">' +
|
||||||
|
'<p class="message-body">There are no active ' +
|
||||||
|
cityssm.escapeHTML(exports.aliases.lot.toLowerCase()) +
|
||||||
|
" statuses.</p>" +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</td>" +
|
"</td>" +
|
||||||
"</tr>";
|
"</tr>";
|
||||||
|
|
@ -292,47 +318,63 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
containerElement.innerHTML = "";
|
containerElement.innerHTML = "";
|
||||||
for (const lotStatus of lotStatuses) {
|
for (const lotStatus of lotStatuses) {
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement("tr");
|
||||||
tableRowElement.dataset.lotStatusId = lotStatus.lotStatusId.toString();
|
tableRowElement.dataset.lotStatusId =
|
||||||
tableRowElement.innerHTML = "<td>" +
|
lotStatus.lotStatusId.toString();
|
||||||
|
tableRowElement.innerHTML =
|
||||||
|
"<td>" +
|
||||||
"<form>" +
|
"<form>" +
|
||||||
"<input name=\"lotStatusId\" type=\"hidden\" value=\"" + lotStatus.lotStatusId.toString() + "\" />" +
|
'<input name="lotStatusId" type="hidden" value="' +
|
||||||
("<div class=\"field has-addons\">" +
|
lotStatus.lotStatusId.toString() +
|
||||||
"<div class=\"control\">" +
|
'" />' +
|
||||||
"<input class=\"input\" name=\"lotStatus\" type=\"text\" value=\"" + cityssm.escapeHTML(lotStatus.lotStatus) + "\" maxlength=\"100\" required />" +
|
('<div class="field has-addons">' +
|
||||||
|
'<div class="control">' +
|
||||||
|
'<input class="input" name="lotStatus" type="text" value="' +
|
||||||
|
cityssm.escapeHTML(lotStatus.lotStatus) +
|
||||||
|
'" maxlength="100" required />' +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"<div class=\"control\">" +
|
'<div class="control">' +
|
||||||
"<button class=\"button is-success\" type=\"submit\"><i class=\"fas fa-save\" aria-hidden=\"true\"></i></button>" +
|
'<button class="button is-success" type="submit"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
"</form>" +
|
"</form>" +
|
||||||
"</td>" +
|
"</td>" +
|
||||||
"<td class=\"is-nowrap\">" +
|
'<td class="is-nowrap">' +
|
||||||
"<div class=\"field is-grouped\">" +
|
'<div class="field is-grouped">' +
|
||||||
"<div class=\"control\">" +
|
'<div class="control">' +
|
||||||
("<div class=\"field has-addons\">" +
|
('<div class="field has-addons">' +
|
||||||
"<div class=\"control\">" +
|
'<div class="control">' +
|
||||||
"<button class=\"button button--moveLotStatusUp\" data-tooltip=\"Move Up\" type=\"button\" aria-label=\"Move Up\"><i class=\"fas fa-arrow-up\" aria-hidden=\"true\"></i></button>" +
|
'<button class="button button--moveLotStatusUp" data-tooltip="Move Up" type="button" aria-label="Move Up"><i class="fas fa-arrow-up" aria-hidden="true"></i></button>' +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"<div class=\"control\">" +
|
'<div class="control">' +
|
||||||
"<button class=\"button button--moveLotStatusDown\" data-tooltip=\"Move Down\" type=\"button\" aria-label=\"Move Down\"><i class=\"fas fa-arrow-down\" aria-hidden=\"true\"></i></button>" +
|
'<button class="button button--moveLotStatusDown" data-tooltip="Move Down" type="button" aria-label="Move Down"><i class="fas fa-arrow-down" aria-hidden="true"></i></button>' +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"<div class=\"control\">" +
|
'<div class="control">' +
|
||||||
"<button class=\"button is-danger is-light button--deleteLotStatus\" data-tooltip=\"Delete Status\" type=\"button\" aria-label=\"Delete Status\">" +
|
'<button class="button is-danger is-light button--deleteLotStatus" data-tooltip="Delete Status" type="button" aria-label="Delete Status">' +
|
||||||
"<i class=\"fas fa-trash\" aria-hidden=\"true\"></i>" +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
"</button>" +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</td>";
|
"</td>";
|
||||||
tableRowElement.querySelector("form").addEventListener("submit", updateLotStatus);
|
tableRowElement
|
||||||
tableRowElement.querySelector(".button--moveLotStatusUp").addEventListener("click", moveLotStatusUp);
|
.querySelector("form")
|
||||||
tableRowElement.querySelector(".button--moveLotStatusDown").addEventListener("click", moveLotStatusDown);
|
.addEventListener("submit", updateLotStatus);
|
||||||
tableRowElement.querySelector(".button--deleteLotStatus").addEventListener("click", deleteLotStatus);
|
tableRowElement
|
||||||
|
.querySelector(".button--moveLotStatusUp")
|
||||||
|
.addEventListener("click", moveLotStatusUp);
|
||||||
|
tableRowElement
|
||||||
|
.querySelector(".button--moveLotStatusDown")
|
||||||
|
.addEventListener("click", moveLotStatusDown);
|
||||||
|
tableRowElement
|
||||||
|
.querySelector(".button--deleteLotStatus")
|
||||||
|
.addEventListener("click", deleteLotStatus);
|
||||||
containerElement.append(tableRowElement);
|
containerElement.append(tableRowElement);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
document.querySelector("#form--addLotStatus").addEventListener("submit", (submitEvent) => {
|
document
|
||||||
|
.querySelector("#form--addLotStatus")
|
||||||
|
.addEventListener("submit", (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
const formElement = submitEvent.currentTarget;
|
const formElement = submitEvent.currentTarget;
|
||||||
cityssm.postJSON(urlPrefix + "/admin/doAddLotStatus", formElement, (responseJSON) => {
|
cityssm.postJSON(urlPrefix + "/admin/doAddLotStatus", formElement, (responseJSON) => {
|
||||||
|
|
@ -344,7 +386,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Adding " + exports.aliases.lot + " Status",
|
title: "Error Adding " +
|
||||||
|
exports.aliases.lot +
|
||||||
|
" Status",
|
||||||
message: responseJSON.errorMessage,
|
message: responseJSON.errorMessage,
|
||||||
contextualColorName: "danger"
|
contextualColorName: "danger"
|
||||||
});
|
});
|
||||||
|
|
@ -360,13 +404,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotOccupantTypes = responseJSON.lotOccupantTypes;
|
lotOccupantTypes = responseJSON.lotOccupantTypes;
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: exports.aliases.lot + " " + exports.aliases.occupant + " Type Updated Successfully",
|
message: exports.aliases.lot +
|
||||||
|
" " +
|
||||||
|
exports.aliases.occupant +
|
||||||
|
" Type Updated Successfully",
|
||||||
contextualColorName: "success"
|
contextualColorName: "success"
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating " + exports.aliases.lot + " " + exports.aliases.occupant + " Type",
|
title: "Error Updating " +
|
||||||
|
exports.aliases.lot +
|
||||||
|
" " +
|
||||||
|
exports.aliases.occupant +
|
||||||
|
" Type",
|
||||||
message: responseJSON.errorMessage,
|
message: responseJSON.errorMessage,
|
||||||
contextualColorName: "danger"
|
contextualColorName: "danger"
|
||||||
});
|
});
|
||||||
|
|
@ -389,13 +440,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
tableRowElement.remove();
|
tableRowElement.remove();
|
||||||
}
|
}
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: exports.aliases.lot + " " + exports.aliases.occupant + " Type Deleted Successfully",
|
message: exports.aliases.lot +
|
||||||
|
" " +
|
||||||
|
exports.aliases.occupant +
|
||||||
|
" Type Deleted Successfully",
|
||||||
contextualColorName: "success"
|
contextualColorName: "success"
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Deleting " + exports.aliases.lot + " " + exports.aliases.occupant + " Type",
|
title: "Error Deleting " +
|
||||||
|
exports.aliases.lot +
|
||||||
|
" " +
|
||||||
|
exports.aliases.occupant +
|
||||||
|
" Type",
|
||||||
message: responseJSON.errorMessage,
|
message: responseJSON.errorMessage,
|
||||||
contextualColorName: "danger"
|
contextualColorName: "danger"
|
||||||
});
|
});
|
||||||
|
|
@ -403,13 +461,29 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete " + exports.aliases.lot + " " + exports.aliases.occupant + " Type",
|
title: "Delete " +
|
||||||
message: "Are you sure you want to delete this " + exports.aliases.lot.toLowerCase() + " " + exports.aliases.occupant.toLowerCase() + " type?<br />" +
|
exports.aliases.lot +
|
||||||
"Note that no " + exports.aliases.lot.toLowerCase() + " " + exports.aliases.occupancy.toLowerCase() + " will be removed.",
|
" " +
|
||||||
|
exports.aliases.occupant +
|
||||||
|
" Type",
|
||||||
|
message: "Are you sure you want to delete this " +
|
||||||
|
exports.aliases.lot.toLowerCase() +
|
||||||
|
" " +
|
||||||
|
exports.aliases.occupant.toLowerCase() +
|
||||||
|
" type?<br />" +
|
||||||
|
"Note that no " +
|
||||||
|
exports.aliases.lot.toLowerCase() +
|
||||||
|
" " +
|
||||||
|
exports.aliases.occupancy.toLowerCase() +
|
||||||
|
" will be removed.",
|
||||||
messageIsHtml: true,
|
messageIsHtml: true,
|
||||||
contextualColorName: "warning",
|
contextualColorName: "warning",
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete " + exports.aliases.lot + " " + exports.aliases.occupant + " Type",
|
text: "Yes, Delete " +
|
||||||
|
exports.aliases.lot +
|
||||||
|
" " +
|
||||||
|
exports.aliases.occupant +
|
||||||
|
" Type",
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -426,7 +500,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Moving " + exports.aliases.lot + " " + exports.aliases.occupant + " Type",
|
title: "Error Moving " +
|
||||||
|
exports.aliases.lot +
|
||||||
|
" " +
|
||||||
|
exports.aliases.occupant +
|
||||||
|
" Type",
|
||||||
message: responseJSON.errorMessage,
|
message: responseJSON.errorMessage,
|
||||||
contextualColorName: "danger"
|
contextualColorName: "danger"
|
||||||
});
|
});
|
||||||
|
|
@ -445,7 +523,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Moving " + exports.aliases.lot + " " + exports.aliases.occupant + " Type",
|
title: "Error Moving " +
|
||||||
|
exports.aliases.lot +
|
||||||
|
" " +
|
||||||
|
exports.aliases.occupant +
|
||||||
|
" Type",
|
||||||
message: responseJSON.errorMessage,
|
message: responseJSON.errorMessage,
|
||||||
contextualColorName: "danger"
|
contextualColorName: "danger"
|
||||||
});
|
});
|
||||||
|
|
@ -455,10 +537,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const renderLotOccupantTypes = () => {
|
const renderLotOccupantTypes = () => {
|
||||||
const containerElement = document.querySelector("#container--lotOccupantTypes");
|
const containerElement = document.querySelector("#container--lotOccupantTypes");
|
||||||
if (workOrderTypes.length === 0) {
|
if (workOrderTypes.length === 0) {
|
||||||
containerElement.innerHTML = "<tr>" +
|
containerElement.innerHTML =
|
||||||
"<td colspan=\"2\">" +
|
"<tr>" +
|
||||||
"<div class=\"message is-warning\">" +
|
'<td colspan="2">' +
|
||||||
"<p class=\"message-body\">There are no active " + cityssm.escapeHTML(exports.aliases.lot.toLowerCase()) + " " + cityssm.escapeHTML(exports.aliases.occupant.toLowerCase()) + " types.</p>" +
|
'<div class="message is-warning">' +
|
||||||
|
'<p class="message-body">There are no active ' +
|
||||||
|
cityssm.escapeHTML(exports.aliases.lot.toLowerCase()) +
|
||||||
|
" " +
|
||||||
|
cityssm.escapeHTML(exports.aliases.occupant.toLowerCase()) +
|
||||||
|
" types.</p>" +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</td>" +
|
"</td>" +
|
||||||
"</tr>";
|
"</tr>";
|
||||||
|
|
@ -467,49 +554,73 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
containerElement.innerHTML = "";
|
containerElement.innerHTML = "";
|
||||||
for (const lotOccupantType of lotOccupantTypes) {
|
for (const lotOccupantType of lotOccupantTypes) {
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement("tr");
|
||||||
tableRowElement.dataset.lotOccupantTypeId = lotOccupantType.lotOccupantTypeId.toString();
|
tableRowElement.dataset.lotOccupantTypeId =
|
||||||
tableRowElement.innerHTML = "<td>" +
|
lotOccupantType.lotOccupantTypeId.toString();
|
||||||
|
tableRowElement.innerHTML =
|
||||||
|
"<td>" +
|
||||||
"<form>" +
|
"<form>" +
|
||||||
"<input name=\"lotOccupantTypeId\" type=\"hidden\" value=\"" + lotOccupantType.lotOccupantTypeId.toString() + "\" />" +
|
'<input name="lotOccupantTypeId" type="hidden" value="' +
|
||||||
("<div class=\"field has-addons\">" +
|
lotOccupantType.lotOccupantTypeId.toString() +
|
||||||
"<div class=\"control\">" +
|
'" />' +
|
||||||
"<input class=\"input\" name=\"lotOccupantType\" type=\"text\" value=\"" + cityssm.escapeHTML(lotOccupantType.lotOccupantType) + "\" maxlength=\"100\" required />" +
|
('<div class="field has-addons">' +
|
||||||
|
'<div class="control">' +
|
||||||
|
'<input class="input" name="lotOccupantType" type="text" value="' +
|
||||||
|
cityssm.escapeHTML(lotOccupantType.lotOccupantType) +
|
||||||
|
'" maxlength="100" required />' +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"<div class=\"control\">" +
|
'<div class="control">' +
|
||||||
"<button class=\"button is-success\" type=\"submit\"><i class=\"fas fa-save\" aria-hidden=\"true\"></i></button>" +
|
'<button class="button is-success" type="submit"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
"</form>" +
|
"</form>" +
|
||||||
"</td>" +
|
"</td>" +
|
||||||
"<td class=\"is-nowrap\">" +
|
'<td class="is-nowrap">' +
|
||||||
"<div class=\"field is-grouped\">" +
|
'<div class="field is-grouped">' +
|
||||||
"<div class=\"control\">" +
|
'<div class="control">' +
|
||||||
("<div class=\"field has-addons\">" +
|
('<div class="field has-addons">' +
|
||||||
"<div class=\"control\">" +
|
'<div class="control">' +
|
||||||
"<button class=\"button button--moveLotOccupantTypeUp\" data-tooltip=\"Move Up\" type=\"button\" aria-label=\"Move Up\"><i class=\"fas fa-arrow-up\" aria-hidden=\"true\"></i></button>" +
|
'<button class="button button--moveLotOccupantTypeUp" data-tooltip="Move Up" type="button" aria-label="Move Up"><i class="fas fa-arrow-up" aria-hidden="true"></i></button>' +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"<div class=\"control\">" +
|
'<div class="control">' +
|
||||||
"<button class=\"button button--moveLotOccupantTypeDown\" data-tooltip=\"Move Down\" type=\"button\" aria-label=\"Move Down\"><i class=\"fas fa-arrow-down\" aria-hidden=\"true\"></i></button>" +
|
'<button class="button button--moveLotOccupantTypeDown" data-tooltip="Move Down" type="button" aria-label="Move Down"><i class="fas fa-arrow-down" aria-hidden="true"></i></button>' +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"<div class=\"control\">" +
|
'<div class="control">' +
|
||||||
"<button class=\"button is-danger is-light button--deleteLotOccupantType\"" +
|
'<button class="button is-danger is-light button--deleteLotOccupantType"' +
|
||||||
" data-tooltip=\"Delete " + cityssm.escapeHTML(exports.aliases.lot) + " " + cityssm.escapeHTML(exports.aliases.occupant) + " Type\" type=\"button\"" +
|
' data-tooltip="Delete ' +
|
||||||
" aria-label=\"Delete " + cityssm.escapeHTML(exports.aliases.lot) + " " + cityssm.escapeHTML(exports.aliases.occupant) + " Type\">" +
|
cityssm.escapeHTML(exports.aliases.lot) +
|
||||||
"<i class=\"fas fa-trash\" aria-hidden=\"true\"></i>" +
|
" " +
|
||||||
|
cityssm.escapeHTML(exports.aliases.occupant) +
|
||||||
|
' Type" type="button"' +
|
||||||
|
' aria-label="Delete ' +
|
||||||
|
cityssm.escapeHTML(exports.aliases.lot) +
|
||||||
|
" " +
|
||||||
|
cityssm.escapeHTML(exports.aliases.occupant) +
|
||||||
|
' Type">' +
|
||||||
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
"</button>" +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</td>";
|
"</td>";
|
||||||
tableRowElement.querySelector("form").addEventListener("submit", updateLotOccupantType);
|
tableRowElement
|
||||||
tableRowElement.querySelector(".button--moveLotOccupantTypeUp").addEventListener("click", moveLotOccupantTypeUp);
|
.querySelector("form")
|
||||||
tableRowElement.querySelector(".button--moveLotOccupantTypeDown").addEventListener("click", moveLotOccupantTypeDown);
|
.addEventListener("submit", updateLotOccupantType);
|
||||||
tableRowElement.querySelector(".button--deleteLotOccupantType").addEventListener("click", deleteLotOccupantType);
|
tableRowElement
|
||||||
|
.querySelector(".button--moveLotOccupantTypeUp")
|
||||||
|
.addEventListener("click", moveLotOccupantTypeUp);
|
||||||
|
tableRowElement
|
||||||
|
.querySelector(".button--moveLotOccupantTypeDown")
|
||||||
|
.addEventListener("click", moveLotOccupantTypeDown);
|
||||||
|
tableRowElement
|
||||||
|
.querySelector(".button--deleteLotOccupantType")
|
||||||
|
.addEventListener("click", deleteLotOccupantType);
|
||||||
containerElement.append(tableRowElement);
|
containerElement.append(tableRowElement);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
document.querySelector("#form--addLotOccupantType").addEventListener("submit", (submitEvent) => {
|
document
|
||||||
|
.querySelector("#form--addLotOccupantType")
|
||||||
|
.addEventListener("submit", (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
const formElement = submitEvent.currentTarget;
|
const formElement = submitEvent.currentTarget;
|
||||||
cityssm.postJSON(urlPrefix + "/admin/doAddLotOccupantType", formElement, (responseJSON) => {
|
cityssm.postJSON(urlPrefix + "/admin/doAddLotOccupantType", formElement, (responseJSON) => {
|
||||||
|
|
@ -521,7 +632,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Adding " + exports.aliases.lot + " " + exports.aliases.occupant + " Type",
|
title: "Error Adding " +
|
||||||
|
exports.aliases.lot +
|
||||||
|
" " +
|
||||||
|
exports.aliases.occupant +
|
||||||
|
" Type",
|
||||||
message: responseJSON.errorMessage,
|
message: responseJSON.errorMessage,
|
||||||
contextualColorName: "danger"
|
contextualColorName: "danger"
|
||||||
});
|
});
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -3,15 +3,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
(() => {
|
(() => {
|
||||||
const los = exports.los;
|
const los = exports.los;
|
||||||
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
||||||
const lotId = document.querySelector("#lot--lotId").value;
|
const lotId = document.querySelector("#lot--lotId")
|
||||||
const isCreate = (lotId === "");
|
.value;
|
||||||
|
const isCreate = lotId === "";
|
||||||
const formElement = document.querySelector("#form--lot");
|
const formElement = document.querySelector("#form--lot");
|
||||||
const updateLot = (formEvent) => {
|
const updateLot = (formEvent) => {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault();
|
||||||
cityssm.postJSON(urlPrefix + "/lots/" + (isCreate ? "doCreateLot" : "doUpdateLot"), formElement, (responseJSON) => {
|
cityssm.postJSON(urlPrefix + "/lots/" + (isCreate ? "doCreateLot" : "doUpdateLot"), formElement, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
if (isCreate) {
|
if (isCreate) {
|
||||||
window.location.href = urlPrefix + "/lots/" + responseJSON.lotId + "/edit";
|
window.location.href =
|
||||||
|
urlPrefix + "/lots/" + responseJSON.lotId + "/edit";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
|
|
@ -34,7 +36,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
let lotComments = exports.lotComments;
|
let lotComments = exports.lotComments;
|
||||||
delete exports.lotComments;
|
delete exports.lotComments;
|
||||||
const openEditLotComment = (clickEvent) => {
|
const openEditLotComment = (clickEvent) => {
|
||||||
const lotCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.lotCommentId, 10);
|
const lotCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset
|
||||||
|
.lotCommentId, 10);
|
||||||
const lotComment = lotComments.find((currentLotComment) => {
|
const lotComment = lotComments.find((currentLotComment) => {
|
||||||
return currentLotComment.lotCommentId === lotCommentId;
|
return currentLotComment.lotCommentId === lotCommentId;
|
||||||
});
|
});
|
||||||
|
|
@ -79,7 +82,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const deleteLotComment = (clickEvent) => {
|
const deleteLotComment = (clickEvent) => {
|
||||||
const lotCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.lotCommentId, 10);
|
const lotCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset
|
||||||
|
.lotCommentId, 10);
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(urlPrefix + "/lots/doDeleteLotComment", {
|
cityssm.postJSON(urlPrefix + "/lots/doDeleteLotComment", {
|
||||||
lotId,
|
lotId,
|
||||||
|
|
@ -111,42 +115,56 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const renderLotComments = () => {
|
const renderLotComments = () => {
|
||||||
const containerElement = document.querySelector("#container--lotComments");
|
const containerElement = document.querySelector("#container--lotComments");
|
||||||
if (lotComments.length === 0) {
|
if (lotComments.length === 0) {
|
||||||
containerElement.innerHTML = "<div class=\"message is-info\">" +
|
containerElement.innerHTML =
|
||||||
"<p class=\"message-body\">There are no comments to display.</p>" +
|
'<div class="message is-info">' +
|
||||||
|
'<p class="message-body">There are no comments to display.</p>' +
|
||||||
"</div>";
|
"</div>";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const tableElement = document.createElement("table");
|
const tableElement = document.createElement("table");
|
||||||
tableElement.className = "table is-fullwidth is-striped is-hoverable";
|
tableElement.className = "table is-fullwidth is-striped is-hoverable";
|
||||||
tableElement.innerHTML = "<thead><tr>" +
|
tableElement.innerHTML =
|
||||||
|
"<thead><tr>" +
|
||||||
"<th>Commentor</th>" +
|
"<th>Commentor</th>" +
|
||||||
"<th>Comment Date</th>" +
|
"<th>Comment Date</th>" +
|
||||||
"<th>Comment</th>" +
|
"<th>Comment</th>" +
|
||||||
"<th class=\"is-hidden-print\"><span class=\"is-sr-only\">Options</span></th>" +
|
'<th class="is-hidden-print"><span class="is-sr-only">Options</span></th>' +
|
||||||
"</tr></thead>" +
|
"</tr></thead>" +
|
||||||
"<tbody></tbody>";
|
"<tbody></tbody>";
|
||||||
for (const lotComment of lotComments) {
|
for (const lotComment of lotComments) {
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement("tr");
|
||||||
tableRowElement.dataset.lotCommentId = lotComment.lotCommentId.toString();
|
tableRowElement.dataset.lotCommentId =
|
||||||
tableRowElement.innerHTML = "<td>" + cityssm.escapeHTML(lotComment.recordCreate_userName) + "</td>" +
|
lotComment.lotCommentId.toString();
|
||||||
|
tableRowElement.innerHTML =
|
||||||
|
"<td>" +
|
||||||
|
cityssm.escapeHTML(lotComment.recordCreate_userName) +
|
||||||
|
"</td>" +
|
||||||
"<td>" +
|
"<td>" +
|
||||||
lotComment.lotCommentDateString +
|
lotComment.lotCommentDateString +
|
||||||
(lotComment.lotCommentTime === 0 ? "" : " " + lotComment.lotCommentTimeString) +
|
(lotComment.lotCommentTime === 0
|
||||||
|
? ""
|
||||||
|
: " " + lotComment.lotCommentTimeString) +
|
||||||
"</td>" +
|
"</td>" +
|
||||||
"<td>" + cityssm.escapeHTML(lotComment.lotComment) + "</td>" +
|
"<td>" +
|
||||||
("<td class=\"is-hidden-print\">" +
|
cityssm.escapeHTML(lotComment.lotComment) +
|
||||||
"<div class=\"buttons are-small is-justify-content-end\">" +
|
"</td>" +
|
||||||
("<button class=\"button is-primary button--edit\" type=\"button\">" +
|
('<td class="is-hidden-print">' +
|
||||||
"<span class=\"icon is-small\"><i class=\"fas fa-pencil-alt\" aria-hidden=\"true\"></i></span>" +
|
'<div class="buttons are-small is-justify-content-end">' +
|
||||||
|
('<button class="button is-primary button--edit" type="button">' +
|
||||||
|
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||||
" <span>Edit</span>" +
|
" <span>Edit</span>" +
|
||||||
"</button>") +
|
"</button>") +
|
||||||
("<button class=\"button is-light is-danger button--delete\" data-tooltip=\"Delete Comment\" type=\"button\" aria-label=\"Delete\">" +
|
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
|
||||||
"<i class=\"fas fa-trash\" aria-hidden=\"true\"></i>" +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>") +
|
"</button>") +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</td>");
|
"</td>");
|
||||||
tableRowElement.querySelector(".button--edit").addEventListener("click", openEditLotComment);
|
tableRowElement
|
||||||
tableRowElement.querySelector(".button--delete").addEventListener("click", deleteLotComment);
|
.querySelector(".button--edit")
|
||||||
|
.addEventListener("click", openEditLotComment);
|
||||||
|
tableRowElement
|
||||||
|
.querySelector(".button--delete")
|
||||||
|
.addEventListener("click", deleteLotComment);
|
||||||
tableElement.querySelector("tbody").append(tableRowElement);
|
tableElement.querySelector("tbody").append(tableRowElement);
|
||||||
}
|
}
|
||||||
containerElement.innerHTML = "";
|
containerElement.innerHTML = "";
|
||||||
|
|
@ -168,7 +186,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement);
|
||||||
modalElement.querySelector("#lotCommentAdd--lotId").value = lotId;
|
modalElement.querySelector("#lotCommentAdd--lotId").value = lotId;
|
||||||
modalElement.querySelector("form").addEventListener("submit", doAddComment);
|
modalElement
|
||||||
|
.querySelector("form")
|
||||||
|
.addEventListener("submit", doAddComment);
|
||||||
},
|
},
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
|
|
@ -182,7 +202,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
if (!isCreate) {
|
if (!isCreate) {
|
||||||
document.querySelector("#lotComments--add").addEventListener("click", openAddCommentModal);
|
document
|
||||||
|
.querySelector("#lotComments--add")
|
||||||
|
.addEventListener("click", openAddCommentModal);
|
||||||
renderLotComments();
|
renderLotComments();
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|
|
||||||
|
|
@ -3,25 +3,21 @@
|
||||||
import type * as globalTypes from "../types/globalTypes";
|
import type * as globalTypes from "../types/globalTypes";
|
||||||
import type * as recordTypes from "../types/recordTypes";
|
import type * as recordTypes from "../types/recordTypes";
|
||||||
|
|
||||||
import type {
|
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||||
cityssmGlobal
|
|
||||||
} from "@cityssm/bulma-webapp-js/src/types";
|
|
||||||
|
|
||||||
import type {
|
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
||||||
BulmaJS
|
|
||||||
} from "@cityssm/bulma-js/types";
|
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal;
|
||||||
declare const bulmaJS: BulmaJS;
|
declare const bulmaJS: BulmaJS;
|
||||||
|
|
||||||
|
|
||||||
(() => {
|
(() => {
|
||||||
const los = (exports.los as globalTypes.LOS);
|
const los = exports.los as globalTypes.LOS;
|
||||||
|
|
||||||
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
||||||
|
|
||||||
const lotId = (document.querySelector("#lot--lotId") as HTMLInputElement).value;
|
const lotId = (document.querySelector("#lot--lotId") as HTMLInputElement)
|
||||||
const isCreate = (lotId === "");
|
.value;
|
||||||
|
const isCreate = lotId === "";
|
||||||
|
|
||||||
// Main form
|
// Main form
|
||||||
|
|
||||||
|
|
@ -30,18 +26,22 @@ declare const bulmaJS: BulmaJS;
|
||||||
const updateLot = (formEvent: SubmitEvent) => {
|
const updateLot = (formEvent: SubmitEvent) => {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault();
|
||||||
|
|
||||||
cityssm.postJSON(urlPrefix + "/lots/" + (isCreate ? "doCreateLot" : "doUpdateLot"),
|
cityssm.postJSON(
|
||||||
|
urlPrefix + "/lots/" + (isCreate ? "doCreateLot" : "doUpdateLot"),
|
||||||
formElement,
|
formElement,
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;lotId ? : number;errorMessage ? : string
|
success: boolean;
|
||||||
|
lotId?: number;
|
||||||
|
errorMessage?: string;
|
||||||
}) => {
|
}) => {
|
||||||
|
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
if (isCreate) {
|
if (isCreate) {
|
||||||
window.location.href = urlPrefix + "/lots/" + responseJSON.lotId + "/edit";
|
window.location.href =
|
||||||
|
urlPrefix + "/lots/" + responseJSON.lotId + "/edit";
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: exports.aliases.lot + " Updated Successfully",
|
message:
|
||||||
|
exports.aliases.lot + " Updated Successfully",
|
||||||
contextualColorName: "success"
|
contextualColorName: "success"
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -52,7 +52,8 @@ declare const bulmaJS: BulmaJS;
|
||||||
contextualColorName: "danger"
|
contextualColorName: "danger"
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
formElement.addEventListener("submit", updateLot);
|
formElement.addEventListener("submit", updateLot);
|
||||||
|
|
@ -65,8 +66,11 @@ declare const bulmaJS: BulmaJS;
|
||||||
delete exports.lotComments;
|
delete exports.lotComments;
|
||||||
|
|
||||||
const openEditLotComment = (clickEvent: Event) => {
|
const openEditLotComment = (clickEvent: Event) => {
|
||||||
|
const lotCommentId = Number.parseInt(
|
||||||
const lotCommentId = Number.parseInt((clickEvent.currentTarget as HTMLElement).closest("tr").dataset.lotCommentId, 10);
|
(clickEvent.currentTarget as HTMLElement).closest("tr").dataset
|
||||||
|
.lotCommentId,
|
||||||
|
10
|
||||||
|
);
|
||||||
|
|
||||||
const lotComment = lotComments.find((currentLotComment) => {
|
const lotComment = lotComments.find((currentLotComment) => {
|
||||||
return currentLotComment.lotCommentId === lotCommentId;
|
return currentLotComment.lotCommentId === lotCommentId;
|
||||||
|
|
@ -76,17 +80,16 @@ declare const bulmaJS: BulmaJS;
|
||||||
let editCloseModalFunction: () => void;
|
let editCloseModalFunction: () => void;
|
||||||
|
|
||||||
const editComment = (submitEvent: SubmitEvent) => {
|
const editComment = (submitEvent: SubmitEvent) => {
|
||||||
|
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
|
|
||||||
cityssm.postJSON(urlPrefix + "/lots/doUpdateLotComment",
|
cityssm.postJSON(
|
||||||
|
urlPrefix + "/lots/doUpdateLotComment",
|
||||||
editFormElement,
|
editFormElement,
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean;
|
||||||
errorMessage ? : string;
|
errorMessage?: string;
|
||||||
lotComments ? : recordTypes.LotComment[];
|
lotComments?: recordTypes.LotComment[];
|
||||||
}) => {
|
}) => {
|
||||||
|
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotComments = responseJSON.lotComments;
|
lotComments = responseJSON.lotComments;
|
||||||
editCloseModalFunction();
|
editCloseModalFunction();
|
||||||
|
|
@ -98,25 +101,49 @@ declare const bulmaJS: BulmaJS;
|
||||||
contextualColorName: "danger"
|
contextualColorName: "danger"
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
cityssm.openHtmlModal("lot-editComment", {
|
cityssm.openHtmlModal("lot-editComment", {
|
||||||
onshow: (modalElement) => {
|
onshow: (modalElement) => {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement);
|
||||||
|
|
||||||
(modalElement.querySelector("#lotCommentEdit--lotId") as HTMLInputElement).value = lotId;
|
(
|
||||||
(modalElement.querySelector("#lotCommentEdit--lotCommentId") as HTMLInputElement).value = lotCommentId.toString();
|
modalElement.querySelector(
|
||||||
|
"#lotCommentEdit--lotId"
|
||||||
|
) as HTMLInputElement
|
||||||
|
).value = lotId;
|
||||||
|
(
|
||||||
|
modalElement.querySelector(
|
||||||
|
"#lotCommentEdit--lotCommentId"
|
||||||
|
) as HTMLInputElement
|
||||||
|
).value = lotCommentId.toString();
|
||||||
|
|
||||||
(modalElement.querySelector("#lotCommentEdit--lotComment") as HTMLInputElement).value = lotComment.lotComment;
|
(
|
||||||
(modalElement.querySelector("#lotCommentEdit--lotCommentDateString") as HTMLInputElement).value = lotComment.lotCommentDateString;
|
modalElement.querySelector(
|
||||||
(modalElement.querySelector("#lotCommentEdit--lotCommentTimeString") as HTMLInputElement).value = lotComment.lotCommentTimeString;
|
"#lotCommentEdit--lotComment"
|
||||||
|
) as HTMLInputElement
|
||||||
|
).value = lotComment.lotComment;
|
||||||
|
(
|
||||||
|
modalElement.querySelector(
|
||||||
|
"#lotCommentEdit--lotCommentDateString"
|
||||||
|
) as HTMLInputElement
|
||||||
|
).value = lotComment.lotCommentDateString;
|
||||||
|
(
|
||||||
|
modalElement.querySelector(
|
||||||
|
"#lotCommentEdit--lotCommentTimeString"
|
||||||
|
) as HTMLInputElement
|
||||||
|
).value = lotComment.lotCommentTimeString;
|
||||||
},
|
},
|
||||||
onshown: (modalElement, closeModalFunction) => {
|
onshown: (modalElement, closeModalFunction) => {
|
||||||
|
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
|
|
||||||
(modalElement.querySelector("#lotCommentEdit--lotComment") as HTMLTextAreaElement).focus();
|
(
|
||||||
|
modalElement.querySelector(
|
||||||
|
"#lotCommentEdit--lotComment"
|
||||||
|
) as HTMLTextAreaElement
|
||||||
|
).focus();
|
||||||
|
|
||||||
editFormElement = modalElement.querySelector("form");
|
editFormElement = modalElement.querySelector("form");
|
||||||
editFormElement.addEventListener("submit", editComment);
|
editFormElement.addEventListener("submit", editComment);
|
||||||
|
|
@ -130,17 +157,22 @@ declare const bulmaJS: BulmaJS;
|
||||||
};
|
};
|
||||||
|
|
||||||
const deleteLotComment = (clickEvent: Event) => {
|
const deleteLotComment = (clickEvent: Event) => {
|
||||||
|
const lotCommentId = Number.parseInt(
|
||||||
const lotCommentId = Number.parseInt((clickEvent.currentTarget as HTMLElement).closest("tr").dataset.lotCommentId, 10);
|
(clickEvent.currentTarget as HTMLElement).closest("tr").dataset
|
||||||
|
.lotCommentId,
|
||||||
|
10
|
||||||
|
);
|
||||||
|
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(urlPrefix + "/lots/doDeleteLotComment", {
|
cityssm.postJSON(
|
||||||
|
urlPrefix + "/lots/doDeleteLotComment",
|
||||||
|
{
|
||||||
lotId,
|
lotId,
|
||||||
lotCommentId
|
lotCommentId
|
||||||
},
|
},
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean;
|
||||||
errorMessage ? : string;
|
errorMessage?: string;
|
||||||
lotComments: recordTypes.LotComment[];
|
lotComments: recordTypes.LotComment[];
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
|
|
@ -153,7 +185,8 @@ declare const bulmaJS: BulmaJS;
|
||||||
contextualColorName: "danger"
|
contextualColorName: "danger"
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
|
|
@ -167,53 +200,66 @@ declare const bulmaJS: BulmaJS;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
const renderLotComments = () => {
|
const renderLotComments = () => {
|
||||||
|
const containerElement = document.querySelector(
|
||||||
const containerElement = document.querySelector("#container--lotComments") as HTMLElement;
|
"#container--lotComments"
|
||||||
|
) as HTMLElement;
|
||||||
|
|
||||||
if (lotComments.length === 0) {
|
if (lotComments.length === 0) {
|
||||||
containerElement.innerHTML = "<div class=\"message is-info\">" +
|
containerElement.innerHTML =
|
||||||
"<p class=\"message-body\">There are no comments to display.</p>" +
|
'<div class="message is-info">' +
|
||||||
|
'<p class="message-body">There are no comments to display.</p>' +
|
||||||
"</div>";
|
"</div>";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const tableElement = document.createElement("table");
|
const tableElement = document.createElement("table");
|
||||||
tableElement.className = "table is-fullwidth is-striped is-hoverable";
|
tableElement.className = "table is-fullwidth is-striped is-hoverable";
|
||||||
tableElement.innerHTML = "<thead><tr>" +
|
tableElement.innerHTML =
|
||||||
|
"<thead><tr>" +
|
||||||
"<th>Commentor</th>" +
|
"<th>Commentor</th>" +
|
||||||
"<th>Comment Date</th>" +
|
"<th>Comment Date</th>" +
|
||||||
"<th>Comment</th>" +
|
"<th>Comment</th>" +
|
||||||
"<th class=\"is-hidden-print\"><span class=\"is-sr-only\">Options</span></th>" +
|
'<th class="is-hidden-print"><span class="is-sr-only">Options</span></th>' +
|
||||||
"</tr></thead>" +
|
"</tr></thead>" +
|
||||||
"<tbody></tbody>";
|
"<tbody></tbody>";
|
||||||
|
|
||||||
for (const lotComment of lotComments) {
|
for (const lotComment of lotComments) {
|
||||||
|
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement("tr");
|
||||||
tableRowElement.dataset.lotCommentId = lotComment.lotCommentId.toString();
|
tableRowElement.dataset.lotCommentId =
|
||||||
|
lotComment.lotCommentId.toString();
|
||||||
|
|
||||||
tableRowElement.innerHTML = "<td>" + cityssm.escapeHTML(lotComment.recordCreate_userName) + "</td>" +
|
tableRowElement.innerHTML =
|
||||||
|
"<td>" +
|
||||||
|
cityssm.escapeHTML(lotComment.recordCreate_userName) +
|
||||||
|
"</td>" +
|
||||||
"<td>" +
|
"<td>" +
|
||||||
lotComment.lotCommentDateString +
|
lotComment.lotCommentDateString +
|
||||||
(lotComment.lotCommentTime === 0 ? "" : " " + lotComment.lotCommentTimeString) +
|
(lotComment.lotCommentTime === 0
|
||||||
|
? ""
|
||||||
|
: " " + lotComment.lotCommentTimeString) +
|
||||||
"</td>" +
|
"</td>" +
|
||||||
"<td>" + cityssm.escapeHTML(lotComment.lotComment) + "</td>" +
|
"<td>" +
|
||||||
("<td class=\"is-hidden-print\">" +
|
cityssm.escapeHTML(lotComment.lotComment) +
|
||||||
"<div class=\"buttons are-small is-justify-content-end\">" +
|
"</td>" +
|
||||||
("<button class=\"button is-primary button--edit\" type=\"button\">" +
|
('<td class="is-hidden-print">' +
|
||||||
"<span class=\"icon is-small\"><i class=\"fas fa-pencil-alt\" aria-hidden=\"true\"></i></span>" +
|
'<div class="buttons are-small is-justify-content-end">' +
|
||||||
|
('<button class="button is-primary button--edit" type="button">' +
|
||||||
|
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||||
" <span>Edit</span>" +
|
" <span>Edit</span>" +
|
||||||
"</button>") +
|
"</button>") +
|
||||||
("<button class=\"button is-light is-danger button--delete\" data-tooltip=\"Delete Comment\" type=\"button\" aria-label=\"Delete\">" +
|
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
|
||||||
"<i class=\"fas fa-trash\" aria-hidden=\"true\"></i>" +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>") +
|
"</button>") +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</td>");
|
"</td>");
|
||||||
|
|
||||||
tableRowElement.querySelector(".button--edit").addEventListener("click", openEditLotComment);
|
tableRowElement
|
||||||
tableRowElement.querySelector(".button--delete").addEventListener("click", deleteLotComment);
|
.querySelector(".button--edit")
|
||||||
|
.addEventListener("click", openEditLotComment);
|
||||||
|
tableRowElement
|
||||||
|
.querySelector(".button--delete")
|
||||||
|
.addEventListener("click", deleteLotComment);
|
||||||
|
|
||||||
tableElement.querySelector("tbody").append(tableRowElement);
|
tableElement.querySelector("tbody").append(tableRowElement);
|
||||||
}
|
}
|
||||||
|
|
@ -223,44 +269,63 @@ declare const bulmaJS: BulmaJS;
|
||||||
};
|
};
|
||||||
|
|
||||||
const openAddCommentModal = () => {
|
const openAddCommentModal = () => {
|
||||||
|
|
||||||
let addCommentCloseModalFunction: () => void;
|
let addCommentCloseModalFunction: () => void;
|
||||||
|
|
||||||
const doAddComment = (formEvent: SubmitEvent) => {
|
const doAddComment = (formEvent: SubmitEvent) => {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault();
|
||||||
|
|
||||||
cityssm.postJSON(urlPrefix + "/lots/doAddLotComment",
|
cityssm.postJSON(
|
||||||
|
urlPrefix + "/lots/doAddLotComment",
|
||||||
formEvent.currentTarget,
|
formEvent.currentTarget,
|
||||||
(responseJSON: {success: boolean; lotComments?: recordTypes.LotComment[]}) => {
|
(responseJSON: {
|
||||||
|
success: boolean;
|
||||||
|
lotComments?: recordTypes.LotComment[];
|
||||||
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotComments = responseJSON.lotComments;
|
lotComments = responseJSON.lotComments;
|
||||||
renderLotComments();
|
renderLotComments();
|
||||||
addCommentCloseModalFunction();
|
addCommentCloseModalFunction();
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
cityssm.openHtmlModal("lot-addComment", {
|
cityssm.openHtmlModal("lot-addComment", {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement);
|
||||||
(modalElement.querySelector("#lotCommentAdd--lotId") as HTMLInputElement).value = lotId;
|
(
|
||||||
modalElement.querySelector("form").addEventListener("submit", doAddComment);
|
modalElement.querySelector(
|
||||||
|
"#lotCommentAdd--lotId"
|
||||||
|
) as HTMLInputElement
|
||||||
|
).value = lotId;
|
||||||
|
modalElement
|
||||||
|
.querySelector("form")
|
||||||
|
.addEventListener("submit", doAddComment);
|
||||||
},
|
},
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
addCommentCloseModalFunction = closeModalFunction;
|
addCommentCloseModalFunction = closeModalFunction;
|
||||||
(modalElement.querySelector("#lotCommentAdd--lotComment") as HTMLTextAreaElement).focus();
|
(
|
||||||
|
modalElement.querySelector(
|
||||||
|
"#lotCommentAdd--lotComment"
|
||||||
|
) as HTMLTextAreaElement
|
||||||
|
).focus();
|
||||||
},
|
},
|
||||||
onremoved() {
|
onremoved() {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
(document.querySelector("#lotComments--add") as HTMLButtonElement).focus();
|
(
|
||||||
|
document.querySelector(
|
||||||
|
"#lotComments--add"
|
||||||
|
) as HTMLButtonElement
|
||||||
|
).focus();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!isCreate) {
|
if (!isCreate) {
|
||||||
document.querySelector("#lotComments--add").addEventListener("click", openAddCommentModal);
|
document
|
||||||
|
.querySelector("#lotComments--add")
|
||||||
|
.addEventListener("click", openAddCommentModal);
|
||||||
renderLotComments();
|
renderLotComments();
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -4,18 +4,25 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
||||||
const searchFilterFormElement = document.querySelector("#form--searchFilters");
|
const searchFilterFormElement = document.querySelector("#form--searchFilters");
|
||||||
const searchResultsContainerElement = document.querySelector("#container--searchResults");
|
const searchResultsContainerElement = document.querySelector("#container--searchResults");
|
||||||
const limit = Number.parseInt(document.querySelector("#searchFilter--limit").value, 10);
|
const limit = Number.parseInt(document.querySelector("#searchFilter--limit")
|
||||||
|
.value, 10);
|
||||||
const offsetElement = document.querySelector("#searchFilter--offset");
|
const offsetElement = document.querySelector("#searchFilter--offset");
|
||||||
const getLotOccupancies = () => {
|
const getLotOccupancies = () => {
|
||||||
const offset = Number.parseInt(offsetElement.value, 10);
|
const offset = Number.parseInt(offsetElement.value, 10);
|
||||||
searchResultsContainerElement.innerHTML = "<div class=\"has-text-grey has-text-centered\">" +
|
searchResultsContainerElement.innerHTML =
|
||||||
"<i class=\"fas fa-5x fa-circle-notch fa-spin\" aria-hidden=\"true\"></i><br />" +
|
'<div class="has-text-grey has-text-centered">' +
|
||||||
"Loading " + exports.aliases.occupancies + "..." +
|
'<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />' +
|
||||||
|
"Loading " +
|
||||||
|
exports.aliases.occupancies +
|
||||||
|
"..." +
|
||||||
"</div>";
|
"</div>";
|
||||||
cityssm.postJSON(urlPrefix + "/lotOccupancies/doSearchLotOccupancies", searchFilterFormElement, (responseJSON) => {
|
cityssm.postJSON(urlPrefix + "/lotOccupancies/doSearchLotOccupancies", searchFilterFormElement, (responseJSON) => {
|
||||||
if (responseJSON.lotOccupancies.length === 0) {
|
if (responseJSON.lotOccupancies.length === 0) {
|
||||||
searchResultsContainerElement.innerHTML = "<div class=\"message is-info\">" +
|
searchResultsContainerElement.innerHTML =
|
||||||
"<p class=\"message-body\">There are no " + exports.aliases.occupancy.toLowerCase() + " records that meet the search criteria.</p>" +
|
'<div class="message is-info">' +
|
||||||
|
'<p class="message-body">There are no ' +
|
||||||
|
exports.aliases.occupancy.toLowerCase() +
|
||||||
|
" records that meet the search criteria.</p>" +
|
||||||
"</div>";
|
"</div>";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -23,83 +30,129 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const nowDateString = cityssm.dateToString(new Date());
|
const nowDateString = cityssm.dateToString(new Date());
|
||||||
for (const lotOccupancy of responseJSON.lotOccupancies) {
|
for (const lotOccupancy of responseJSON.lotOccupancies) {
|
||||||
let occupancyTimeHTML = "";
|
let occupancyTimeHTML = "";
|
||||||
if (lotOccupancy.occupancyStartDateString <= nowDateString && (lotOccupancy.occupancyEndDateString === "" || lotOccupancy.occupancyEndDateString >= nowDateString)) {
|
if (lotOccupancy.occupancyStartDateString <=
|
||||||
occupancyTimeHTML = "<i class=\"fas fa-play\" title=\"Current " + exports.aliases.occupancy + "\"></i>";
|
nowDateString &&
|
||||||
|
(lotOccupancy.occupancyEndDateString === "" ||
|
||||||
|
lotOccupancy.occupancyEndDateString >=
|
||||||
|
nowDateString)) {
|
||||||
|
occupancyTimeHTML =
|
||||||
|
'<i class="fas fa-play" title="Current ' +
|
||||||
|
exports.aliases.occupancy +
|
||||||
|
'"></i>';
|
||||||
}
|
}
|
||||||
else if (lotOccupancy.occupancyStartDateString > nowDateString) {
|
else if (lotOccupancy.occupancyStartDateString > nowDateString) {
|
||||||
occupancyTimeHTML = "<i class=\"fas fa-fast-forward\" title=\"Future " + exports.aliases.occupancy + "\"></i>";
|
occupancyTimeHTML =
|
||||||
|
'<i class="fas fa-fast-forward" title="Future ' +
|
||||||
|
exports.aliases.occupancy +
|
||||||
|
'"></i>';
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
occupancyTimeHTML = "<i class=\"fas fa-stop\" title=\"Previous " + exports.aliases.occupancy + "\"></i>";
|
occupancyTimeHTML =
|
||||||
|
'<i class="fas fa-stop" title="Previous ' +
|
||||||
|
exports.aliases.occupancy +
|
||||||
|
'"></i>';
|
||||||
}
|
}
|
||||||
let occupantsHTML = "";
|
let occupantsHTML = "";
|
||||||
for (const occupant of lotOccupancy.lotOccupancyOccupants) {
|
for (const occupant of lotOccupancy.lotOccupancyOccupants) {
|
||||||
occupantsHTML += cityssm.escapeHTML(occupant.occupantName) + "<br />";
|
occupantsHTML +=
|
||||||
|
cityssm.escapeHTML(occupant.occupantName) +
|
||||||
|
"<br />";
|
||||||
}
|
}
|
||||||
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
|
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
|
||||||
"<td>" + occupancyTimeHTML + "</td>" +
|
"<td>" +
|
||||||
|
occupancyTimeHTML +
|
||||||
|
"</td>" +
|
||||||
("<td>" +
|
("<td>" +
|
||||||
"<a class=\"has-text-weight-bold\" href=\"" + urlPrefix + "/lotOccupancies/" + lotOccupancy.lotOccupancyId + "\">" +
|
'<a class="has-text-weight-bold" href="' +
|
||||||
|
urlPrefix +
|
||||||
|
"/lotOccupancies/" +
|
||||||
|
lotOccupancy.lotOccupancyId +
|
||||||
|
'">' +
|
||||||
cityssm.escapeHTML(lotOccupancy.occupancyType) +
|
cityssm.escapeHTML(lotOccupancy.occupancyType) +
|
||||||
"</a>" +
|
"</a>" +
|
||||||
"</td>") +
|
"</td>") +
|
||||||
("<td>" +
|
("<td>" +
|
||||||
(lotOccupancy.lotName ? cityssm.escapeHTML(lotOccupancy.lotName) : "<span class=\"has-text-grey\">(No " + cityssm.escapeHTML(exports.aliases.lot) + ")</span>") + "<br />" +
|
(lotOccupancy.lotName
|
||||||
"<span class=\"is-size-7\">" + cityssm.escapeHTML(lotOccupancy.mapName || "") + "</span>" +
|
? cityssm.escapeHTML(lotOccupancy.lotName)
|
||||||
|
: '<span class="has-text-grey">(No ' +
|
||||||
|
cityssm.escapeHTML(exports.aliases.lot) +
|
||||||
|
")</span>") +
|
||||||
|
"<br />" +
|
||||||
|
'<span class="is-size-7">' +
|
||||||
|
cityssm.escapeHTML(lotOccupancy.mapName || "") +
|
||||||
|
"</span>" +
|
||||||
"</td>") +
|
"</td>") +
|
||||||
("<td>" +
|
("<td>" +
|
||||||
lotOccupancy.occupancyStartDateString +
|
lotOccupancy.occupancyStartDateString +
|
||||||
"</td>") +
|
"</td>") +
|
||||||
("<td>" +
|
("<td>" +
|
||||||
(lotOccupancy.occupancyEndDate ?
|
(lotOccupancy.occupancyEndDate
|
||||||
lotOccupancy.occupancyEndDateString :
|
? lotOccupancy.occupancyEndDateString
|
||||||
"<span class=\"has-text-grey\">(No End Date)</span>") +
|
: '<span class="has-text-grey">(No End Date)</span>') +
|
||||||
"</td>") +
|
"</td>") +
|
||||||
"<td>" + occupantsHTML + "</td>" +
|
"<td>" +
|
||||||
|
occupantsHTML +
|
||||||
|
"</td>" +
|
||||||
"</tr>");
|
"</tr>");
|
||||||
}
|
}
|
||||||
searchResultsContainerElement.innerHTML = "<table class=\"table is-fullwidth is-striped is-hoverable\">" +
|
searchResultsContainerElement.innerHTML =
|
||||||
|
'<table class="table is-fullwidth is-striped is-hoverable">' +
|
||||||
"<thead><tr>" +
|
"<thead><tr>" +
|
||||||
"<th></th>" +
|
"<th></th>" +
|
||||||
"<th>" + exports.aliases.occupancy + " Type</th>" +
|
"<th>" +
|
||||||
"<th>" + exports.aliases.lot + "</th>" +
|
exports.aliases.occupancy +
|
||||||
|
" Type</th>" +
|
||||||
|
"<th>" +
|
||||||
|
exports.aliases.lot +
|
||||||
|
"</th>" +
|
||||||
"<th>Start Date</th>" +
|
"<th>Start Date</th>" +
|
||||||
"<th>End Date</th>" +
|
"<th>End Date</th>" +
|
||||||
"<th>" + exports.aliases.occupants + "</th>" +
|
"<th>" +
|
||||||
|
exports.aliases.occupants +
|
||||||
|
"</th>" +
|
||||||
"</tr></thead>" +
|
"</tr></thead>" +
|
||||||
"<table>" +
|
"<table>" +
|
||||||
"<div class=\"level\">" +
|
'<div class="level">' +
|
||||||
("<div class=\"level-left\">" +
|
('<div class="level-left">' +
|
||||||
"<div class=\"level-item has-text-weight-bold\">" +
|
'<div class="level-item has-text-weight-bold">' +
|
||||||
"Displaying " + (offset + 1).toString() +
|
"Displaying " +
|
||||||
" to " + Math.min(responseJSON.count, limit + offset) +
|
(offset + 1).toString() +
|
||||||
" of " + responseJSON.count +
|
" to " +
|
||||||
|
Math.min(responseJSON.count, limit + offset) +
|
||||||
|
" of " +
|
||||||
|
responseJSON.count +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
("<div class=\"level-right\">" +
|
('<div class="level-right">' +
|
||||||
(offset > 0 ?
|
(offset > 0
|
||||||
"<div class=\"level-item\">" +
|
? '<div class="level-item">' +
|
||||||
"<button class=\"button is-rounded is-link is-outlined\" data-page=\"previous\" type=\"button\" title=\"Previous\">" +
|
'<button class="button is-rounded is-link is-outlined" data-page="previous" type="button" title="Previous">' +
|
||||||
"<i class=\"fas fa-arrow-left\" aria-hidden=\"true\"></i>" +
|
'<i class="fas fa-arrow-left" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
"</button>" +
|
||||||
"</div>" :
|
"</div>"
|
||||||
"") +
|
: "") +
|
||||||
(limit + offset < responseJSON.count ?
|
(limit + offset < responseJSON.count
|
||||||
"<div class=\"level-item\">" +
|
? '<div class="level-item">' +
|
||||||
"<button class=\"button is-rounded is-link\" data-page=\"next\" type=\"button\" title=\"Next\">" +
|
'<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
|
||||||
"<span>Next</span>" +
|
"<span>Next</span>" +
|
||||||
"<span class=\"icon\"><i class=\"fas fa-arrow-right\" aria-hidden=\"true\"></i></span>" +
|
'<span class="icon"><i class="fas fa-arrow-right" aria-hidden="true"></i></span>' +
|
||||||
"</button>" +
|
"</button>" +
|
||||||
"</div>" :
|
"</div>"
|
||||||
"") +
|
: "") +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
"</div>";
|
"</div>";
|
||||||
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement);
|
searchResultsContainerElement
|
||||||
|
.querySelector("table")
|
||||||
|
.append(resultsTbodyElement);
|
||||||
if (offset > 0) {
|
if (offset > 0) {
|
||||||
searchResultsContainerElement.querySelector("button[data-page='previous']").addEventListener("click", previousAndGetLotOccupancies);
|
searchResultsContainerElement
|
||||||
|
.querySelector("button[data-page='previous']")
|
||||||
|
.addEventListener("click", previousAndGetLotOccupancies);
|
||||||
}
|
}
|
||||||
if (limit + offset < responseJSON.count) {
|
if (limit + offset < responseJSON.count) {
|
||||||
searchResultsContainerElement.querySelector("button[data-page='next']").addEventListener("click", nextAndGetLotOccupancies);
|
searchResultsContainerElement
|
||||||
|
.querySelector("button[data-page='next']")
|
||||||
|
.addEventListener("click", nextAndGetLotOccupancies);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -2,43 +2,53 @@
|
||||||
|
|
||||||
import type * as recordTypes from "../types/recordTypes";
|
import type * as recordTypes from "../types/recordTypes";
|
||||||
|
|
||||||
import type {
|
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||||
cityssmGlobal
|
|
||||||
} from "@cityssm/bulma-webapp-js/src/types";
|
|
||||||
|
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal;
|
||||||
|
|
||||||
|
|
||||||
(() => {
|
(() => {
|
||||||
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
||||||
|
|
||||||
const searchFilterFormElement = document.querySelector("#form--searchFilters") as HTMLFormElement;
|
const searchFilterFormElement = document.querySelector(
|
||||||
const searchResultsContainerElement = document.querySelector("#container--searchResults") as HTMLElement;
|
"#form--searchFilters"
|
||||||
|
) as HTMLFormElement;
|
||||||
const limit = Number.parseInt((document.querySelector("#searchFilter--limit") as HTMLInputElement).value, 10);
|
const searchResultsContainerElement = document.querySelector(
|
||||||
const offsetElement = document.querySelector("#searchFilter--offset") as HTMLInputElement;
|
"#container--searchResults"
|
||||||
|
) as HTMLElement;
|
||||||
|
|
||||||
|
const limit = Number.parseInt(
|
||||||
|
(document.querySelector("#searchFilter--limit") as HTMLInputElement)
|
||||||
|
.value,
|
||||||
|
10
|
||||||
|
);
|
||||||
|
const offsetElement = document.querySelector(
|
||||||
|
"#searchFilter--offset"
|
||||||
|
) as HTMLInputElement;
|
||||||
|
|
||||||
const getLotOccupancies = () => {
|
const getLotOccupancies = () => {
|
||||||
|
|
||||||
const offset = Number.parseInt(offsetElement.value, 10);
|
const offset = Number.parseInt(offsetElement.value, 10);
|
||||||
|
|
||||||
searchResultsContainerElement.innerHTML = "<div class=\"has-text-grey has-text-centered\">" +
|
searchResultsContainerElement.innerHTML =
|
||||||
"<i class=\"fas fa-5x fa-circle-notch fa-spin\" aria-hidden=\"true\"></i><br />" +
|
'<div class="has-text-grey has-text-centered">' +
|
||||||
"Loading " + exports.aliases.occupancies + "..." +
|
'<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />' +
|
||||||
|
"Loading " +
|
||||||
|
exports.aliases.occupancies +
|
||||||
|
"..." +
|
||||||
"</div>";
|
"</div>";
|
||||||
|
|
||||||
cityssm.postJSON(urlPrefix + "/lotOccupancies/doSearchLotOccupancies", searchFilterFormElement,
|
cityssm.postJSON(
|
||||||
|
urlPrefix + "/lotOccupancies/doSearchLotOccupancies",
|
||||||
|
searchFilterFormElement,
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
count: number;
|
count: number;
|
||||||
lotOccupancies: recordTypes.LotOccupancy[];
|
lotOccupancies: recordTypes.LotOccupancy[];
|
||||||
}) => {
|
}) => {
|
||||||
|
|
||||||
if (responseJSON.lotOccupancies.length === 0) {
|
if (responseJSON.lotOccupancies.length === 0) {
|
||||||
|
searchResultsContainerElement.innerHTML =
|
||||||
searchResultsContainerElement.innerHTML = "<div class=\"message is-info\">" +
|
'<div class="message is-info">' +
|
||||||
"<p class=\"message-body\">There are no " + exports.aliases.occupancy.toLowerCase() + " records that meet the search criteria.</p>" +
|
'<p class="message-body">There are no ' +
|
||||||
|
exports.aliases.occupancy.toLowerCase() +
|
||||||
|
" records that meet the search criteria.</p>" +
|
||||||
"</div>";
|
"</div>";
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
@ -49,116 +59,182 @@ declare const cityssm: cityssmGlobal;
|
||||||
const nowDateString = cityssm.dateToString(new Date());
|
const nowDateString = cityssm.dateToString(new Date());
|
||||||
|
|
||||||
for (const lotOccupancy of responseJSON.lotOccupancies) {
|
for (const lotOccupancy of responseJSON.lotOccupancies) {
|
||||||
|
|
||||||
let occupancyTimeHTML = "";
|
let occupancyTimeHTML = "";
|
||||||
|
|
||||||
if (lotOccupancy.occupancyStartDateString <= nowDateString && (lotOccupancy.occupancyEndDateString === "" || lotOccupancy.occupancyEndDateString >= nowDateString)) {
|
if (
|
||||||
occupancyTimeHTML = "<i class=\"fas fa-play\" title=\"Current " + exports.aliases.occupancy + "\"></i>";
|
lotOccupancy.occupancyStartDateString <=
|
||||||
|
nowDateString &&
|
||||||
} else if (lotOccupancy.occupancyStartDateString > nowDateString) {
|
(lotOccupancy.occupancyEndDateString === "" ||
|
||||||
occupancyTimeHTML = "<i class=\"fas fa-fast-forward\" title=\"Future " + exports.aliases.occupancy + "\"></i>";
|
lotOccupancy.occupancyEndDateString >=
|
||||||
|
nowDateString)
|
||||||
|
) {
|
||||||
|
occupancyTimeHTML =
|
||||||
|
'<i class="fas fa-play" title="Current ' +
|
||||||
|
exports.aliases.occupancy +
|
||||||
|
'"></i>';
|
||||||
|
} else if (
|
||||||
|
lotOccupancy.occupancyStartDateString > nowDateString
|
||||||
|
) {
|
||||||
|
occupancyTimeHTML =
|
||||||
|
'<i class="fas fa-fast-forward" title="Future ' +
|
||||||
|
exports.aliases.occupancy +
|
||||||
|
'"></i>';
|
||||||
} else {
|
} else {
|
||||||
occupancyTimeHTML = "<i class=\"fas fa-stop\" title=\"Previous " + exports.aliases.occupancy + "\"></i>";
|
occupancyTimeHTML =
|
||||||
|
'<i class="fas fa-stop" title="Previous ' +
|
||||||
|
exports.aliases.occupancy +
|
||||||
|
'"></i>';
|
||||||
}
|
}
|
||||||
|
|
||||||
let occupantsHTML = "";
|
let occupantsHTML = "";
|
||||||
|
|
||||||
for (const occupant of lotOccupancy.lotOccupancyOccupants) {
|
for (const occupant of lotOccupancy.lotOccupancyOccupants) {
|
||||||
occupantsHTML += cityssm.escapeHTML(occupant.occupantName) + "<br />";
|
occupantsHTML +=
|
||||||
|
cityssm.escapeHTML(occupant.occupantName) +
|
||||||
|
"<br />";
|
||||||
}
|
}
|
||||||
|
|
||||||
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
|
resultsTbodyElement.insertAdjacentHTML(
|
||||||
"<td>" + occupancyTimeHTML + "</td>" +
|
"beforeend",
|
||||||
|
"<tr>" +
|
||||||
|
"<td>" +
|
||||||
|
occupancyTimeHTML +
|
||||||
|
"</td>" +
|
||||||
("<td>" +
|
("<td>" +
|
||||||
"<a class=\"has-text-weight-bold\" href=\"" + urlPrefix + "/lotOccupancies/" + lotOccupancy.lotOccupancyId + "\">" +
|
'<a class="has-text-weight-bold" href="' +
|
||||||
cityssm.escapeHTML(lotOccupancy.occupancyType as string) +
|
urlPrefix +
|
||||||
|
"/lotOccupancies/" +
|
||||||
|
lotOccupancy.lotOccupancyId +
|
||||||
|
'">' +
|
||||||
|
cityssm.escapeHTML(
|
||||||
|
lotOccupancy.occupancyType as string
|
||||||
|
) +
|
||||||
"</a>" +
|
"</a>" +
|
||||||
"</td>") +
|
"</td>") +
|
||||||
("<td>" +
|
("<td>" +
|
||||||
(lotOccupancy.lotName ? cityssm.escapeHTML(lotOccupancy.lotName) : "<span class=\"has-text-grey\">(No " + cityssm.escapeHTML(exports.aliases.lot) + ")</span>") + "<br />" +
|
(lotOccupancy.lotName
|
||||||
"<span class=\"is-size-7\">" + cityssm.escapeHTML(lotOccupancy.mapName || "") + "</span>" +
|
? cityssm.escapeHTML(lotOccupancy.lotName)
|
||||||
|
: '<span class="has-text-grey">(No ' +
|
||||||
|
cityssm.escapeHTML(exports.aliases.lot) +
|
||||||
|
")</span>") +
|
||||||
|
"<br />" +
|
||||||
|
'<span class="is-size-7">' +
|
||||||
|
cityssm.escapeHTML(lotOccupancy.mapName || "") +
|
||||||
|
"</span>" +
|
||||||
"</td>") +
|
"</td>") +
|
||||||
("<td>" +
|
("<td>" +
|
||||||
lotOccupancy.occupancyStartDateString +
|
lotOccupancy.occupancyStartDateString +
|
||||||
"</td>") +
|
"</td>") +
|
||||||
("<td>" +
|
("<td>" +
|
||||||
(lotOccupancy.occupancyEndDate ?
|
(lotOccupancy.occupancyEndDate
|
||||||
lotOccupancy.occupancyEndDateString :
|
? lotOccupancy.occupancyEndDateString
|
||||||
"<span class=\"has-text-grey\">(No End Date)</span>") +
|
: '<span class="has-text-grey">(No End Date)</span>') +
|
||||||
"</td>") +
|
"</td>") +
|
||||||
"<td>" + occupantsHTML + "</td>" +
|
"<td>" +
|
||||||
"</tr>");
|
occupantsHTML +
|
||||||
|
"</td>" +
|
||||||
|
"</tr>"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
searchResultsContainerElement.innerHTML = "<table class=\"table is-fullwidth is-striped is-hoverable\">" +
|
searchResultsContainerElement.innerHTML =
|
||||||
|
'<table class="table is-fullwidth is-striped is-hoverable">' +
|
||||||
"<thead><tr>" +
|
"<thead><tr>" +
|
||||||
"<th></th>" +
|
"<th></th>" +
|
||||||
"<th>" + exports.aliases.occupancy + " Type</th>" +
|
"<th>" +
|
||||||
"<th>" + exports.aliases.lot + "</th>" +
|
exports.aliases.occupancy +
|
||||||
|
" Type</th>" +
|
||||||
|
"<th>" +
|
||||||
|
exports.aliases.lot +
|
||||||
|
"</th>" +
|
||||||
"<th>Start Date</th>" +
|
"<th>Start Date</th>" +
|
||||||
"<th>End Date</th>" +
|
"<th>End Date</th>" +
|
||||||
"<th>" + exports.aliases.occupants + "</th>" +
|
"<th>" +
|
||||||
|
exports.aliases.occupants +
|
||||||
|
"</th>" +
|
||||||
"</tr></thead>" +
|
"</tr></thead>" +
|
||||||
"<table>" +
|
"<table>" +
|
||||||
"<div class=\"level\">" +
|
'<div class="level">' +
|
||||||
("<div class=\"level-left\">" +
|
('<div class="level-left">' +
|
||||||
"<div class=\"level-item has-text-weight-bold\">" +
|
'<div class="level-item has-text-weight-bold">' +
|
||||||
"Displaying " + (offset + 1).toString() +
|
"Displaying " +
|
||||||
" to " + Math.min(responseJSON.count, limit + offset) +
|
(offset + 1).toString() +
|
||||||
" of " + responseJSON.count +
|
" to " +
|
||||||
|
Math.min(responseJSON.count, limit + offset) +
|
||||||
|
" of " +
|
||||||
|
responseJSON.count +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
("<div class=\"level-right\">" +
|
('<div class="level-right">' +
|
||||||
(offset > 0 ?
|
(offset > 0
|
||||||
"<div class=\"level-item\">" +
|
? '<div class="level-item">' +
|
||||||
"<button class=\"button is-rounded is-link is-outlined\" data-page=\"previous\" type=\"button\" title=\"Previous\">" +
|
'<button class="button is-rounded is-link is-outlined" data-page="previous" type="button" title="Previous">' +
|
||||||
"<i class=\"fas fa-arrow-left\" aria-hidden=\"true\"></i>" +
|
'<i class="fas fa-arrow-left" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
"</button>" +
|
||||||
"</div>" :
|
"</div>"
|
||||||
"") +
|
: "") +
|
||||||
(limit + offset < responseJSON.count ?
|
(limit + offset < responseJSON.count
|
||||||
"<div class=\"level-item\">" +
|
? '<div class="level-item">' +
|
||||||
"<button class=\"button is-rounded is-link\" data-page=\"next\" type=\"button\" title=\"Next\">" +
|
'<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
|
||||||
"<span>Next</span>" +
|
"<span>Next</span>" +
|
||||||
"<span class=\"icon\"><i class=\"fas fa-arrow-right\" aria-hidden=\"true\"></i></span>" +
|
'<span class="icon"><i class="fas fa-arrow-right" aria-hidden="true"></i></span>' +
|
||||||
"</button>" +
|
"</button>" +
|
||||||
"</div>" :
|
"</div>"
|
||||||
"") +
|
: "") +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
"</div>";
|
"</div>";
|
||||||
|
|
||||||
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement);
|
searchResultsContainerElement
|
||||||
|
.querySelector("table")
|
||||||
|
.append(resultsTbodyElement);
|
||||||
|
|
||||||
if (offset > 0) {
|
if (offset > 0) {
|
||||||
searchResultsContainerElement.querySelector("button[data-page='previous']").addEventListener("click", previousAndGetLotOccupancies);
|
searchResultsContainerElement
|
||||||
|
.querySelector("button[data-page='previous']")
|
||||||
|
.addEventListener(
|
||||||
|
"click",
|
||||||
|
previousAndGetLotOccupancies
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (limit + offset < responseJSON.count) {
|
if (limit + offset < responseJSON.count) {
|
||||||
searchResultsContainerElement.querySelector("button[data-page='next']").addEventListener("click", nextAndGetLotOccupancies);
|
searchResultsContainerElement
|
||||||
|
.querySelector("button[data-page='next']")
|
||||||
|
.addEventListener("click", nextAndGetLotOccupancies);
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const resetOffsetAndGetLotOccupancies = () => {
|
const resetOffsetAndGetLotOccupancies = () => {
|
||||||
offsetElement.value = "0";
|
offsetElement.value = "0";
|
||||||
getLotOccupancies();
|
getLotOccupancies();
|
||||||
}
|
};
|
||||||
|
|
||||||
const previousAndGetLotOccupancies = () => {
|
const previousAndGetLotOccupancies = () => {
|
||||||
offsetElement.value = Math.max(Number.parseInt(offsetElement.value, 10) - limit, 0).toString();
|
offsetElement.value = Math.max(
|
||||||
|
Number.parseInt(offsetElement.value, 10) - limit,
|
||||||
|
0
|
||||||
|
).toString();
|
||||||
getLotOccupancies();
|
getLotOccupancies();
|
||||||
};
|
};
|
||||||
|
|
||||||
const nextAndGetLotOccupancies = () => {
|
const nextAndGetLotOccupancies = () => {
|
||||||
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString();
|
offsetElement.value = (
|
||||||
|
Number.parseInt(offsetElement.value, 10) + limit
|
||||||
|
).toString();
|
||||||
getLotOccupancies();
|
getLotOccupancies();
|
||||||
};
|
};
|
||||||
|
|
||||||
const filterElements = searchFilterFormElement.querySelectorAll("input, select") as NodeListOf < HTMLInputElement | HTMLSelectElement > ;
|
const filterElements = searchFilterFormElement.querySelectorAll(
|
||||||
|
"input, select"
|
||||||
|
) as NodeListOf<HTMLInputElement | HTMLSelectElement>;
|
||||||
|
|
||||||
for (const filterElement of filterElements) {
|
for (const filterElement of filterElements) {
|
||||||
filterElement.addEventListener("change", resetOffsetAndGetLotOccupancies);
|
filterElement.addEventListener(
|
||||||
|
"change",
|
||||||
|
resetOffsetAndGetLotOccupancies
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
searchFilterFormElement.addEventListener("submit", (formEvent) => {
|
searchFilterFormElement.addEventListener("submit", (formEvent) => {
|
||||||
|
|
|
||||||
|
|
@ -4,18 +4,25 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
||||||
const searchFilterFormElement = document.querySelector("#form--searchFilters");
|
const searchFilterFormElement = document.querySelector("#form--searchFilters");
|
||||||
const searchResultsContainerElement = document.querySelector("#container--searchResults");
|
const searchResultsContainerElement = document.querySelector("#container--searchResults");
|
||||||
const limit = Number.parseInt(document.querySelector("#searchFilter--limit").value, 10);
|
const limit = Number.parseInt(document.querySelector("#searchFilter--limit")
|
||||||
|
.value, 10);
|
||||||
const offsetElement = document.querySelector("#searchFilter--offset");
|
const offsetElement = document.querySelector("#searchFilter--offset");
|
||||||
const getLots = () => {
|
const getLots = () => {
|
||||||
const offset = Number.parseInt(offsetElement.value, 10);
|
const offset = Number.parseInt(offsetElement.value, 10);
|
||||||
searchResultsContainerElement.innerHTML = "<div class=\"has-text-grey has-text-centered\">" +
|
searchResultsContainerElement.innerHTML =
|
||||||
"<i class=\"fas fa-5x fa-circle-notch fa-spin\" aria-hidden=\"true\"></i><br />" +
|
'<div class="has-text-grey has-text-centered">' +
|
||||||
"Loading " + exports.aliases.lots + "..." +
|
'<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />' +
|
||||||
|
"Loading " +
|
||||||
|
exports.aliases.lots +
|
||||||
|
"..." +
|
||||||
"</div>";
|
"</div>";
|
||||||
cityssm.postJSON(urlPrefix + "/lots/doSearchLots", searchFilterFormElement, (responseJSON) => {
|
cityssm.postJSON(urlPrefix + "/lots/doSearchLots", searchFilterFormElement, (responseJSON) => {
|
||||||
if (responseJSON.lots.length === 0) {
|
if (responseJSON.lots.length === 0) {
|
||||||
searchResultsContainerElement.innerHTML = "<div class=\"message is-info\">" +
|
searchResultsContainerElement.innerHTML =
|
||||||
"<p class=\"message-body\">There are no " + exports.aliases.lots.toLowerCase() + " that meet the search criteria.</p>" +
|
'<div class="message is-info">' +
|
||||||
|
'<p class="message-body">There are no ' +
|
||||||
|
exports.aliases.lots.toLowerCase() +
|
||||||
|
" that meet the search criteria.</p>" +
|
||||||
"</div>";
|
"</div>";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -23,62 +30,91 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
for (const lot of responseJSON.lots) {
|
for (const lot of responseJSON.lots) {
|
||||||
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
|
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
|
||||||
("<td>" +
|
("<td>" +
|
||||||
"<a class=\"has-text-weight-bold\" href=\"" + urlPrefix + "/lots/" + lot.lotId + "\">" +
|
'<a class="has-text-weight-bold" href="' +
|
||||||
|
urlPrefix +
|
||||||
|
"/lots/" +
|
||||||
|
lot.lotId +
|
||||||
|
'">' +
|
||||||
lot.lotName +
|
lot.lotName +
|
||||||
"</a>" +
|
"</a>" +
|
||||||
"</td>") +
|
"</td>") +
|
||||||
("<td>" +
|
("<td>" +
|
||||||
"<a href=\"" + urlPrefix + "/maps/" + lot.mapId + "\">" +
|
'<a href="' +
|
||||||
|
urlPrefix +
|
||||||
|
"/maps/" +
|
||||||
|
lot.mapId +
|
||||||
|
'">' +
|
||||||
lot.mapName +
|
lot.mapName +
|
||||||
"</a>" +
|
"</a>" +
|
||||||
"</td>") +
|
"</td>") +
|
||||||
"<td>" + lot.lotType + "</td>" +
|
"<td>" +
|
||||||
|
lot.lotType +
|
||||||
|
"</td>" +
|
||||||
("<td>" +
|
("<td>" +
|
||||||
lot.lotStatus + "<br />" +
|
lot.lotStatus +
|
||||||
(lot.lotOccupancyCount > 0 ? "<span class=\"is-size-7\">Currently Occupied</span>" : "") +
|
"<br />" +
|
||||||
|
(lot.lotOccupancyCount > 0
|
||||||
|
? '<span class="is-size-7">Currently Occupied</span>'
|
||||||
|
: "") +
|
||||||
"</td>") +
|
"</td>") +
|
||||||
"</tr>");
|
"</tr>");
|
||||||
}
|
}
|
||||||
searchResultsContainerElement.innerHTML = "<table class=\"table is-fullwidth is-striped is-hoverable\">" +
|
searchResultsContainerElement.innerHTML =
|
||||||
|
'<table class="table is-fullwidth is-striped is-hoverable">' +
|
||||||
"<thead><tr>" +
|
"<thead><tr>" +
|
||||||
"<th>" + exports.aliases.lot + "</th>" +
|
"<th>" +
|
||||||
"<th>" + exports.aliases.map + "</th>" +
|
exports.aliases.lot +
|
||||||
"<th>" + exports.aliases.lot + " Type</th>" +
|
"</th>" +
|
||||||
|
"<th>" +
|
||||||
|
exports.aliases.map +
|
||||||
|
"</th>" +
|
||||||
|
"<th>" +
|
||||||
|
exports.aliases.lot +
|
||||||
|
" Type</th>" +
|
||||||
"<th>Status</th>" +
|
"<th>Status</th>" +
|
||||||
"</tr></thead>" +
|
"</tr></thead>" +
|
||||||
"<table>" +
|
"<table>" +
|
||||||
"<div class=\"level\">" +
|
'<div class="level">' +
|
||||||
("<div class=\"level-left\">" +
|
('<div class="level-left">' +
|
||||||
"<div class=\"level-item has-text-weight-bold\">" +
|
'<div class="level-item has-text-weight-bold">' +
|
||||||
"Displaying " + (offset + 1).toString() +
|
"Displaying " +
|
||||||
" to " + Math.min(responseJSON.count, limit + offset) +
|
(offset + 1).toString() +
|
||||||
" of " + responseJSON.count +
|
" to " +
|
||||||
|
Math.min(responseJSON.count, limit + offset) +
|
||||||
|
" of " +
|
||||||
|
responseJSON.count +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
("<div class=\"level-right\">" +
|
('<div class="level-right">' +
|
||||||
(offset > 0 ?
|
(offset > 0
|
||||||
"<div class=\"level-item\">" +
|
? '<div class="level-item">' +
|
||||||
"<button class=\"button is-rounded is-link is-outlined\" data-page=\"previous\" type=\"button\" title=\"Previous\">" +
|
'<button class="button is-rounded is-link is-outlined" data-page="previous" type="button" title="Previous">' +
|
||||||
"<i class=\"fas fa-arrow-left\" aria-hidden=\"true\"></i>" +
|
'<i class="fas fa-arrow-left" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
"</button>" +
|
||||||
"</div>" :
|
"</div>"
|
||||||
"") +
|
: "") +
|
||||||
(limit + offset < responseJSON.count
|
(limit + offset < responseJSON.count
|
||||||
? "<div class=\"level-item\">" +
|
? '<div class="level-item">' +
|
||||||
"<button class=\"button is-rounded is-link\" data-page=\"next\" type=\"button\" title=\"Next\">" +
|
'<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
|
||||||
"<span>Next</span>" +
|
"<span>Next</span>" +
|
||||||
"<span class=\"icon\"><i class=\"fas fa-arrow-right\" aria-hidden=\"true\"></i></span>" +
|
'<span class="icon"><i class="fas fa-arrow-right" aria-hidden="true"></i></span>' +
|
||||||
"</button>" +
|
"</button>" +
|
||||||
"</div>"
|
"</div>"
|
||||||
: "") +
|
: "") +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
"</div>";
|
"</div>";
|
||||||
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement);
|
searchResultsContainerElement
|
||||||
|
.querySelector("table")
|
||||||
|
.append(resultsTbodyElement);
|
||||||
if (offset > 0) {
|
if (offset > 0) {
|
||||||
searchResultsContainerElement.querySelector("button[data-page='previous']").addEventListener("click", previousAndGetLots);
|
searchResultsContainerElement
|
||||||
|
.querySelector("button[data-page='previous']")
|
||||||
|
.addEventListener("click", previousAndGetLots);
|
||||||
}
|
}
|
||||||
if (limit + offset < responseJSON.count) {
|
if (limit + offset < responseJSON.count) {
|
||||||
searchResultsContainerElement.querySelector("button[data-page='next']").addEventListener("click", nextAndGetLots);
|
searchResultsContainerElement
|
||||||
|
.querySelector("button[data-page='next']")
|
||||||
|
.addEventListener("click", nextAndGetLots);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -2,43 +2,50 @@
|
||||||
|
|
||||||
import type * as recordTypes from "../types/recordTypes";
|
import type * as recordTypes from "../types/recordTypes";
|
||||||
|
|
||||||
import type {
|
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||||
cityssmGlobal
|
|
||||||
} from "@cityssm/bulma-webapp-js/src/types";
|
|
||||||
|
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal;
|
||||||
|
|
||||||
|
|
||||||
(() => {
|
(() => {
|
||||||
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
||||||
|
|
||||||
const searchFilterFormElement = document.querySelector("#form--searchFilters") as HTMLFormElement;
|
const searchFilterFormElement = document.querySelector(
|
||||||
const searchResultsContainerElement = document.querySelector("#container--searchResults") as HTMLElement;
|
"#form--searchFilters"
|
||||||
|
) as HTMLFormElement;
|
||||||
const limit = Number.parseInt((document.querySelector("#searchFilter--limit") as HTMLInputElement).value, 10);
|
const searchResultsContainerElement = document.querySelector(
|
||||||
const offsetElement = document.querySelector("#searchFilter--offset") as HTMLInputElement;
|
"#container--searchResults"
|
||||||
|
) as HTMLElement;
|
||||||
|
|
||||||
|
const limit = Number.parseInt(
|
||||||
|
(document.querySelector("#searchFilter--limit") as HTMLInputElement)
|
||||||
|
.value,
|
||||||
|
10
|
||||||
|
);
|
||||||
|
const offsetElement = document.querySelector(
|
||||||
|
"#searchFilter--offset"
|
||||||
|
) as HTMLInputElement;
|
||||||
|
|
||||||
const getLots = () => {
|
const getLots = () => {
|
||||||
|
|
||||||
const offset = Number.parseInt(offsetElement.value, 10);
|
const offset = Number.parseInt(offsetElement.value, 10);
|
||||||
|
|
||||||
searchResultsContainerElement.innerHTML = "<div class=\"has-text-grey has-text-centered\">" +
|
searchResultsContainerElement.innerHTML =
|
||||||
"<i class=\"fas fa-5x fa-circle-notch fa-spin\" aria-hidden=\"true\"></i><br />" +
|
'<div class="has-text-grey has-text-centered">' +
|
||||||
"Loading " + exports.aliases.lots + "..." +
|
'<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />' +
|
||||||
|
"Loading " +
|
||||||
|
exports.aliases.lots +
|
||||||
|
"..." +
|
||||||
"</div>";
|
"</div>";
|
||||||
|
|
||||||
cityssm.postJSON(urlPrefix + "/lots/doSearchLots", searchFilterFormElement,
|
cityssm.postJSON(
|
||||||
(responseJSON: {
|
urlPrefix + "/lots/doSearchLots",
|
||||||
count: number;
|
searchFilterFormElement,
|
||||||
lots: recordTypes.Lot[];
|
(responseJSON: { count: number; lots: recordTypes.Lot[] }) => {
|
||||||
}) => {
|
|
||||||
|
|
||||||
if (responseJSON.lots.length === 0) {
|
if (responseJSON.lots.length === 0) {
|
||||||
|
searchResultsContainerElement.innerHTML =
|
||||||
searchResultsContainerElement.innerHTML = "<div class=\"message is-info\">" +
|
'<div class="message is-info">' +
|
||||||
"<p class=\"message-body\">There are no " + exports.aliases.lots.toLowerCase() + " that meet the search criteria.</p>" +
|
'<p class="message-body">There are no ' +
|
||||||
|
exports.aliases.lots.toLowerCase() +
|
||||||
|
" that meet the search criteria.</p>" +
|
||||||
"</div>";
|
"</div>";
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
@ -47,88 +54,128 @@ declare const cityssm: cityssmGlobal;
|
||||||
const resultsTbodyElement = document.createElement("tbody");
|
const resultsTbodyElement = document.createElement("tbody");
|
||||||
|
|
||||||
for (const lot of responseJSON.lots) {
|
for (const lot of responseJSON.lots) {
|
||||||
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
|
resultsTbodyElement.insertAdjacentHTML(
|
||||||
|
"beforeend",
|
||||||
|
"<tr>" +
|
||||||
("<td>" +
|
("<td>" +
|
||||||
"<a class=\"has-text-weight-bold\" href=\"" + urlPrefix + "/lots/" + lot.lotId + "\">" +
|
'<a class="has-text-weight-bold" href="' +
|
||||||
|
urlPrefix +
|
||||||
|
"/lots/" +
|
||||||
|
lot.lotId +
|
||||||
|
'">' +
|
||||||
lot.lotName +
|
lot.lotName +
|
||||||
"</a>" +
|
"</a>" +
|
||||||
"</td>") +
|
"</td>") +
|
||||||
("<td>" +
|
("<td>" +
|
||||||
"<a href=\"" + urlPrefix + "/maps/" + lot.mapId + "\">" +
|
'<a href="' +
|
||||||
|
urlPrefix +
|
||||||
|
"/maps/" +
|
||||||
|
lot.mapId +
|
||||||
|
'">' +
|
||||||
lot.mapName +
|
lot.mapName +
|
||||||
"</a>" +
|
"</a>" +
|
||||||
"</td>") +
|
"</td>") +
|
||||||
"<td>" + lot.lotType + "</td>" +
|
"<td>" +
|
||||||
|
lot.lotType +
|
||||||
|
"</td>" +
|
||||||
("<td>" +
|
("<td>" +
|
||||||
lot.lotStatus + "<br />" +
|
lot.lotStatus +
|
||||||
(lot.lotOccupancyCount > 0 ? "<span class=\"is-size-7\">Currently Occupied</span>" : "") +
|
"<br />" +
|
||||||
|
(lot.lotOccupancyCount > 0
|
||||||
|
? '<span class="is-size-7">Currently Occupied</span>'
|
||||||
|
: "") +
|
||||||
"</td>") +
|
"</td>") +
|
||||||
"</tr>");
|
"</tr>"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
searchResultsContainerElement.innerHTML = "<table class=\"table is-fullwidth is-striped is-hoverable\">" +
|
searchResultsContainerElement.innerHTML =
|
||||||
|
'<table class="table is-fullwidth is-striped is-hoverable">' +
|
||||||
"<thead><tr>" +
|
"<thead><tr>" +
|
||||||
"<th>" + exports.aliases.lot + "</th>" +
|
"<th>" +
|
||||||
"<th>" + exports.aliases.map + "</th>" +
|
exports.aliases.lot +
|
||||||
"<th>" + exports.aliases.lot + " Type</th>" +
|
"</th>" +
|
||||||
|
"<th>" +
|
||||||
|
exports.aliases.map +
|
||||||
|
"</th>" +
|
||||||
|
"<th>" +
|
||||||
|
exports.aliases.lot +
|
||||||
|
" Type</th>" +
|
||||||
"<th>Status</th>" +
|
"<th>Status</th>" +
|
||||||
"</tr></thead>" +
|
"</tr></thead>" +
|
||||||
"<table>" +
|
"<table>" +
|
||||||
"<div class=\"level\">" +
|
'<div class="level">' +
|
||||||
("<div class=\"level-left\">" +
|
('<div class="level-left">' +
|
||||||
"<div class=\"level-item has-text-weight-bold\">" +
|
'<div class="level-item has-text-weight-bold">' +
|
||||||
"Displaying " + (offset + 1).toString() +
|
"Displaying " +
|
||||||
" to " + Math.min(responseJSON.count, limit + offset) +
|
(offset + 1).toString() +
|
||||||
" of " + responseJSON.count +
|
" to " +
|
||||||
|
Math.min(responseJSON.count, limit + offset) +
|
||||||
|
" of " +
|
||||||
|
responseJSON.count +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
("<div class=\"level-right\">" +
|
('<div class="level-right">' +
|
||||||
(offset > 0 ?
|
(offset > 0
|
||||||
"<div class=\"level-item\">" +
|
? '<div class="level-item">' +
|
||||||
"<button class=\"button is-rounded is-link is-outlined\" data-page=\"previous\" type=\"button\" title=\"Previous\">" +
|
'<button class="button is-rounded is-link is-outlined" data-page="previous" type="button" title="Previous">' +
|
||||||
"<i class=\"fas fa-arrow-left\" aria-hidden=\"true\"></i>" +
|
'<i class="fas fa-arrow-left" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
"</button>" +
|
||||||
"</div>" :
|
"</div>"
|
||||||
"") +
|
: "") +
|
||||||
(limit + offset < responseJSON.count
|
(limit + offset < responseJSON.count
|
||||||
? "<div class=\"level-item\">" +
|
? '<div class="level-item">' +
|
||||||
"<button class=\"button is-rounded is-link\" data-page=\"next\" type=\"button\" title=\"Next\">" +
|
'<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
|
||||||
"<span>Next</span>" +
|
"<span>Next</span>" +
|
||||||
"<span class=\"icon\"><i class=\"fas fa-arrow-right\" aria-hidden=\"true\"></i></span>" +
|
'<span class="icon"><i class="fas fa-arrow-right" aria-hidden="true"></i></span>' +
|
||||||
"</button>" +
|
"</button>" +
|
||||||
"</div>"
|
"</div>"
|
||||||
: "") +
|
: "") +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
"</div>";
|
"</div>";
|
||||||
|
|
||||||
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement);
|
searchResultsContainerElement
|
||||||
|
.querySelector("table")
|
||||||
|
.append(resultsTbodyElement);
|
||||||
|
|
||||||
if (offset > 0) {
|
if (offset > 0) {
|
||||||
searchResultsContainerElement.querySelector("button[data-page='previous']").addEventListener("click", previousAndGetLots);
|
searchResultsContainerElement
|
||||||
|
.querySelector("button[data-page='previous']")
|
||||||
|
.addEventListener("click", previousAndGetLots);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (limit + offset < responseJSON.count) {
|
if (limit + offset < responseJSON.count) {
|
||||||
searchResultsContainerElement.querySelector("button[data-page='next']").addEventListener("click", nextAndGetLots);
|
searchResultsContainerElement
|
||||||
|
.querySelector("button[data-page='next']")
|
||||||
|
.addEventListener("click", nextAndGetLots);
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const resetOffsetAndGetLots = () => {
|
const resetOffsetAndGetLots = () => {
|
||||||
offsetElement.value = "0";
|
offsetElement.value = "0";
|
||||||
getLots();
|
getLots();
|
||||||
}
|
};
|
||||||
|
|
||||||
const previousAndGetLots = () => {
|
const previousAndGetLots = () => {
|
||||||
offsetElement.value = Math.max(Number.parseInt(offsetElement.value, 10) - limit, 0).toString();
|
offsetElement.value = Math.max(
|
||||||
|
Number.parseInt(offsetElement.value, 10) - limit,
|
||||||
|
0
|
||||||
|
).toString();
|
||||||
getLots();
|
getLots();
|
||||||
};
|
};
|
||||||
|
|
||||||
const nextAndGetLots = () => {
|
const nextAndGetLots = () => {
|
||||||
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString();
|
offsetElement.value = (
|
||||||
|
Number.parseInt(offsetElement.value, 10) + limit
|
||||||
|
).toString();
|
||||||
getLots();
|
getLots();
|
||||||
};
|
};
|
||||||
|
|
||||||
const filterElements = searchFilterFormElement.querySelectorAll("input, select") as NodeListOf < HTMLInputElement | HTMLSelectElement > ;
|
const filterElements = searchFilterFormElement.querySelectorAll(
|
||||||
|
"input, select"
|
||||||
|
) as NodeListOf<HTMLInputElement | HTMLSelectElement>;
|
||||||
|
|
||||||
for (const filterElement of filterElements) {
|
for (const filterElement of filterElements) {
|
||||||
filterElement.addEventListener("change", resetOffsetAndGetLots);
|
filterElement.addEventListener("change", resetOffsetAndGetLots);
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,14 @@
|
||||||
import * as globalTypes from "../types/globalTypes";
|
import * as globalTypes from "../types/globalTypes";
|
||||||
|
|
||||||
(() => {
|
(() => {
|
||||||
|
const mapContainerElement = document.querySelector(
|
||||||
const mapContainerElement = document.querySelector("#lot--map") as HTMLElement;
|
"#lot--map"
|
||||||
|
) as HTMLElement;
|
||||||
if (mapContainerElement) {
|
if (mapContainerElement) {
|
||||||
(exports.los as globalTypes.LOS).highlightMap(mapContainerElement, mapContainerElement.dataset.mapKey, "success");
|
(exports.los as globalTypes.LOS).highlightMap(
|
||||||
|
mapContainerElement,
|
||||||
|
mapContainerElement.dataset.mapKey,
|
||||||
|
"success"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|
@ -48,22 +48,26 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
aliasElement.textContent = exports.aliases.lot;
|
aliasElement.textContent = exports.aliases.lot;
|
||||||
break;
|
break;
|
||||||
case "lot":
|
case "lot":
|
||||||
aliasElement.textContent = exports.aliases.lot.toLowerCase();
|
aliasElement.textContent =
|
||||||
|
exports.aliases.lot.toLowerCase();
|
||||||
break;
|
break;
|
||||||
case "Occupancy":
|
case "Occupancy":
|
||||||
aliasElement.textContent = exports.aliases.occupancy;
|
aliasElement.textContent = exports.aliases.occupancy;
|
||||||
break;
|
break;
|
||||||
case "occupancy":
|
case "occupancy":
|
||||||
aliasElement.textContent = exports.aliases.occupancy.toLowerCase();
|
aliasElement.textContent =
|
||||||
|
exports.aliases.occupancy.toLowerCase();
|
||||||
break;
|
break;
|
||||||
case "Occupant":
|
case "Occupant":
|
||||||
aliasElement.textContent = exports.aliases.occupant;
|
aliasElement.textContent = exports.aliases.occupant;
|
||||||
break;
|
break;
|
||||||
case "occupant":
|
case "occupant":
|
||||||
aliasElement.textContent = exports.aliases.occupant.toLowerCase();
|
aliasElement.textContent =
|
||||||
|
exports.aliases.occupant.toLowerCase();
|
||||||
break;
|
break;
|
||||||
case "ExternalReceiptNumber":
|
case "ExternalReceiptNumber":
|
||||||
aliasElement.textContent = exports.aliases.externalReceiptNumber;
|
aliasElement.textContent =
|
||||||
|
exports.aliases.externalReceiptNumber;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,17 +3,21 @@
|
||||||
import type * as globalTypes from "../types/globalTypes";
|
import type * as globalTypes from "../types/globalTypes";
|
||||||
|
|
||||||
(() => {
|
(() => {
|
||||||
|
const highlightMap = (
|
||||||
const highlightMap = (mapContainerElement: HTMLElement, mapKey: string, contextualClass: "success" | "danger") => {
|
mapContainerElement: HTMLElement,
|
||||||
|
mapKey: string,
|
||||||
|
contextualClass: "success" | "danger"
|
||||||
|
) => {
|
||||||
// Search for ID
|
// Search for ID
|
||||||
|
|
||||||
let svgId = mapKey;
|
let svgId = mapKey;
|
||||||
let svgElementToHighlight: SVGElement;
|
let svgElementToHighlight: SVGElement;
|
||||||
|
|
||||||
// eslint-disable-next-line no-constant-condition
|
// eslint-disable-next-line no-constant-condition
|
||||||
while(true) {
|
while (true) {
|
||||||
svgElementToHighlight = mapContainerElement.querySelector("#" + svgId);
|
svgElementToHighlight = mapContainerElement.querySelector(
|
||||||
|
"#" + svgId
|
||||||
|
);
|
||||||
|
|
||||||
if (svgElementToHighlight || !svgId.includes("-")) {
|
if (svgElementToHighlight || !svgId.includes("-")) {
|
||||||
break;
|
break;
|
||||||
|
|
@ -23,15 +27,17 @@ import type * as globalTypes from "../types/globalTypes";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (svgElementToHighlight) {
|
if (svgElementToHighlight) {
|
||||||
|
|
||||||
// eslint-disable-next-line unicorn/no-null
|
// eslint-disable-next-line unicorn/no-null
|
||||||
svgElementToHighlight.style.fill = null;
|
svgElementToHighlight.style.fill = null;
|
||||||
|
|
||||||
svgElementToHighlight.classList.add("highlight", "is-" + contextualClass);
|
svgElementToHighlight.classList.add(
|
||||||
|
"highlight",
|
||||||
|
"is-" + contextualClass
|
||||||
|
);
|
||||||
|
|
||||||
const childPathElements = svgElementToHighlight.querySelectorAll("path");
|
const childPathElements =
|
||||||
|
svgElementToHighlight.querySelectorAll("path");
|
||||||
for (const pathElement of childPathElements) {
|
for (const pathElement of childPathElements) {
|
||||||
|
|
||||||
// eslint-disable-next-line unicorn/no-null
|
// eslint-disable-next-line unicorn/no-null
|
||||||
pathElement.style.fill = null;
|
pathElement.style.fill = null;
|
||||||
}
|
}
|
||||||
|
|
@ -39,15 +45,19 @@ import type * as globalTypes from "../types/globalTypes";
|
||||||
};
|
};
|
||||||
|
|
||||||
const unlockField = (clickEvent: Event) => {
|
const unlockField = (clickEvent: Event) => {
|
||||||
|
const fieldElement = (clickEvent.currentTarget as HTMLElement).closest(
|
||||||
|
".field"
|
||||||
|
);
|
||||||
|
|
||||||
const fieldElement = (clickEvent.currentTarget as HTMLElement).closest(".field");
|
const inputOrSelectElement = fieldElement.querySelector(
|
||||||
|
"input, select"
|
||||||
const inputOrSelectElement = fieldElement.querySelector("input, select") as HTMLInputElement | HTMLSelectElement;
|
) as HTMLInputElement | HTMLSelectElement;
|
||||||
|
|
||||||
if (inputOrSelectElement.tagName === "INPUT") {
|
if (inputOrSelectElement.tagName === "INPUT") {
|
||||||
inputOrSelectElement.disabled = false;
|
inputOrSelectElement.disabled = false;
|
||||||
} else {
|
} else {
|
||||||
const optionElements = inputOrSelectElement.querySelectorAll("option");
|
const optionElements =
|
||||||
|
inputOrSelectElement.querySelectorAll("option");
|
||||||
for (const optionElement of optionElements) {
|
for (const optionElement of optionElements) {
|
||||||
optionElement.disabled = false;
|
optionElement.disabled = false;
|
||||||
}
|
}
|
||||||
|
|
@ -57,8 +67,9 @@ import type * as globalTypes from "../types/globalTypes";
|
||||||
};
|
};
|
||||||
|
|
||||||
const initializeUnlockFieldButtons = (containerElement: HTMLElement) => {
|
const initializeUnlockFieldButtons = (containerElement: HTMLElement) => {
|
||||||
|
const unlockFieldButtonElements = containerElement.querySelectorAll(
|
||||||
const unlockFieldButtonElements = containerElement.querySelectorAll(".is-unlock-field-button");
|
".is-unlock-field-button"
|
||||||
|
);
|
||||||
|
|
||||||
for (const unlockFieldButtonElement of unlockFieldButtonElements) {
|
for (const unlockFieldButtonElement of unlockFieldButtonElements) {
|
||||||
unlockFieldButtonElement.addEventListener("click", unlockField);
|
unlockFieldButtonElement.addEventListener("click", unlockField);
|
||||||
|
|
@ -66,19 +77,19 @@ import type * as globalTypes from "../types/globalTypes";
|
||||||
};
|
};
|
||||||
|
|
||||||
const populateAliases = (containerElement: HTMLElement) => {
|
const populateAliases = (containerElement: HTMLElement) => {
|
||||||
|
const aliasElements = containerElement.querySelectorAll(
|
||||||
const aliasElements = containerElement.querySelectorAll(".alias") as NodeListOf<HTMLElement>;
|
".alias"
|
||||||
|
) as NodeListOf<HTMLElement>;
|
||||||
|
|
||||||
for (const aliasElement of aliasElements) {
|
for (const aliasElement of aliasElements) {
|
||||||
|
|
||||||
switch (aliasElement.dataset.alias) {
|
switch (aliasElement.dataset.alias) {
|
||||||
|
|
||||||
case "Lot":
|
case "Lot":
|
||||||
aliasElement.textContent = exports.aliases.lot;
|
aliasElement.textContent = exports.aliases.lot;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "lot":
|
case "lot":
|
||||||
aliasElement.textContent = exports.aliases.lot.toLowerCase();
|
aliasElement.textContent =
|
||||||
|
exports.aliases.lot.toLowerCase();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "Occupancy":
|
case "Occupancy":
|
||||||
|
|
@ -86,7 +97,8 @@ import type * as globalTypes from "../types/globalTypes";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "occupancy":
|
case "occupancy":
|
||||||
aliasElement.textContent = exports.aliases.occupancy.toLowerCase();
|
aliasElement.textContent =
|
||||||
|
exports.aliases.occupancy.toLowerCase();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "Occupant":
|
case "Occupant":
|
||||||
|
|
@ -94,11 +106,13 @@ import type * as globalTypes from "../types/globalTypes";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "occupant":
|
case "occupant":
|
||||||
aliasElement.textContent = exports.aliases.occupant.toLowerCase();
|
aliasElement.textContent =
|
||||||
|
exports.aliases.occupant.toLowerCase();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "ExternalReceiptNumber":
|
case "ExternalReceiptNumber":
|
||||||
aliasElement.textContent = exports.aliases.externalReceiptNumber;
|
aliasElement.textContent =
|
||||||
|
exports.aliases.externalReceiptNumber;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,15 +2,17 @@
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
(() => {
|
(() => {
|
||||||
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
||||||
const mapId = document.querySelector("#map--mapId").value;
|
const mapId = document.querySelector("#map--mapId")
|
||||||
const isCreate = (mapId === "");
|
.value;
|
||||||
|
const isCreate = mapId === "";
|
||||||
const mapForm = document.querySelector("#form--map");
|
const mapForm = document.querySelector("#form--map");
|
||||||
const updateMap = (formEvent) => {
|
const updateMap = (formEvent) => {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault();
|
||||||
cityssm.postJSON(urlPrefix + "/maps/" + (isCreate ? "doCreateMap" : "doUpdateMap"), mapForm, (responseJSON) => {
|
cityssm.postJSON(urlPrefix + "/maps/" + (isCreate ? "doCreateMap" : "doUpdateMap"), mapForm, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
if (isCreate) {
|
if (isCreate) {
|
||||||
window.location.href = urlPrefix + "/maps/" + responseJSON.mapId + "/edit";
|
window.location.href =
|
||||||
|
urlPrefix + "/maps/" + responseJSON.mapId + "/edit";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
|
|
@ -30,14 +32,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
};
|
};
|
||||||
mapForm.addEventListener("submit", updateMap);
|
mapForm.addEventListener("submit", updateMap);
|
||||||
if (!isCreate) {
|
if (!isCreate) {
|
||||||
document.querySelector("#button--deleteMap").addEventListener("click", (clickEvent) => {
|
document
|
||||||
|
.querySelector("#button--deleteMap")
|
||||||
|
.addEventListener("click", (clickEvent) => {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault();
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(urlPrefix + "/maps/doDeleteMap", {
|
cityssm.postJSON(urlPrefix + "/maps/doDeleteMap", {
|
||||||
mapId
|
mapId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
window.location.href = urlPrefix + "/maps?t=" + Date.now();
|
window.location.href =
|
||||||
|
urlPrefix + "/maps?t=" + Date.now();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
|
|
@ -50,7 +55,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
};
|
};
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete " + exports.aliases.map,
|
title: "Delete " + exports.aliases.map,
|
||||||
message: "Are you sure you want to delete this " + exports.aliases.map.toLowerCase() + "?",
|
message: "Are you sure you want to delete this " +
|
||||||
|
exports.aliases.map.toLowerCase() +
|
||||||
|
"?",
|
||||||
contextualColorName: "warning",
|
contextualColorName: "warning",
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete " + exports.aliases.map + "?",
|
text: "Yes, Delete " + exports.aliases.map + "?",
|
||||||
|
|
|
||||||
|
|
@ -1,40 +1,39 @@
|
||||||
/* eslint-disable unicorn/prefer-module */
|
/* eslint-disable unicorn/prefer-module */
|
||||||
|
|
||||||
import type {
|
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||||
cityssmGlobal
|
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
||||||
} from "@cityssm/bulma-webapp-js/src/types";
|
|
||||||
import type {
|
|
||||||
BulmaJS
|
|
||||||
} from "@cityssm/bulma-js/types";
|
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal;
|
||||||
declare const bulmaJS: BulmaJS;
|
declare const bulmaJS: BulmaJS;
|
||||||
|
|
||||||
|
|
||||||
(() => {
|
(() => {
|
||||||
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
||||||
|
|
||||||
const mapId = (document.querySelector("#map--mapId") as HTMLInputElement).value;
|
const mapId = (document.querySelector("#map--mapId") as HTMLInputElement)
|
||||||
const isCreate = (mapId === "");
|
.value;
|
||||||
|
const isCreate = mapId === "";
|
||||||
|
|
||||||
const mapForm = document.querySelector("#form--map") as HTMLFormElement;
|
const mapForm = document.querySelector("#form--map") as HTMLFormElement;
|
||||||
|
|
||||||
const updateMap = (formEvent: SubmitEvent) => {
|
const updateMap = (formEvent: SubmitEvent) => {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault();
|
||||||
|
|
||||||
cityssm.postJSON(urlPrefix + "/maps/" + (isCreate ? "doCreateMap" : "doUpdateMap"),
|
cityssm.postJSON(
|
||||||
|
urlPrefix + "/maps/" + (isCreate ? "doCreateMap" : "doUpdateMap"),
|
||||||
mapForm,
|
mapForm,
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;mapId ? : number,
|
success: boolean;
|
||||||
errorMessage ? : string
|
mapId?: number;
|
||||||
|
errorMessage?: string;
|
||||||
}) => {
|
}) => {
|
||||||
|
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
if (isCreate) {
|
if (isCreate) {
|
||||||
window.location.href = urlPrefix + "/maps/" + responseJSON.mapId + "/edit";
|
window.location.href =
|
||||||
|
urlPrefix + "/maps/" + responseJSON.mapId + "/edit";
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: exports.aliases.map + " Updated Successfully",
|
message:
|
||||||
|
exports.aliases.map + " Updated Successfully",
|
||||||
contextualColorName: "success"
|
contextualColorName: "success"
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -45,40 +44,49 @@ declare const bulmaJS: BulmaJS;
|
||||||
contextualColorName: "danger"
|
contextualColorName: "danger"
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
mapForm.addEventListener("submit", updateMap);
|
mapForm.addEventListener("submit", updateMap);
|
||||||
|
|
||||||
if (!isCreate) {
|
if (!isCreate) {
|
||||||
|
document
|
||||||
document.querySelector("#button--deleteMap").addEventListener("click", (clickEvent) => {
|
.querySelector("#button--deleteMap")
|
||||||
|
.addEventListener("click", (clickEvent) => {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault();
|
||||||
|
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
|
cityssm.postJSON(
|
||||||
cityssm.postJSON(urlPrefix + "/maps/doDeleteMap", {
|
urlPrefix + "/maps/doDeleteMap",
|
||||||
|
{
|
||||||
mapId
|
mapId
|
||||||
},
|
},
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;errorMessage ? : string;
|
success: boolean;
|
||||||
|
errorMessage?: string;
|
||||||
}) => {
|
}) => {
|
||||||
|
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
window.location.href = urlPrefix + "/maps?t=" + Date.now();
|
window.location.href =
|
||||||
|
urlPrefix + "/maps?t=" + Date.now();
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Deleting " + exports.aliases.map,
|
title:
|
||||||
|
"Error Deleting " + exports.aliases.map,
|
||||||
message: responseJSON.errorMessage,
|
message: responseJSON.errorMessage,
|
||||||
contextualColorName: "danger"
|
contextualColorName: "danger"
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete " + exports.aliases.map,
|
title: "Delete " + exports.aliases.map,
|
||||||
message: "Are you sure you want to delete this " + exports.aliases.map.toLowerCase() + "?",
|
message:
|
||||||
|
"Are you sure you want to delete this " +
|
||||||
|
exports.aliases.map.toLowerCase() +
|
||||||
|
"?",
|
||||||
contextualColorName: "warning",
|
contextualColorName: "warning",
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete " + exports.aliases.map + "?",
|
text: "Yes, Delete " + exports.aliases.map + "?",
|
||||||
|
|
|
||||||
|
|
@ -6,17 +6,26 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const searchFilterElement = document.querySelector("#searchFilter--map");
|
const searchFilterElement = document.querySelector("#searchFilter--map");
|
||||||
const searchResultsContainerElement = document.querySelector("#container--searchResults");
|
const searchResultsContainerElement = document.querySelector("#container--searchResults");
|
||||||
const renderResults = () => {
|
const renderResults = () => {
|
||||||
searchResultsContainerElement.innerHTML = "<div class=\"has-text-grey has-text-centered\">" +
|
searchResultsContainerElement.innerHTML =
|
||||||
"<i class=\"fas fa-5x fa-circle-notch fa-spin\" aria-hidden=\"true\"></i><br />" +
|
'<div class="has-text-grey has-text-centered">' +
|
||||||
"Loading " + exports.aliases.maps + "..." +
|
'<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />' +
|
||||||
|
"Loading " +
|
||||||
|
exports.aliases.maps +
|
||||||
|
"..." +
|
||||||
"</div>";
|
"</div>";
|
||||||
let searchResultCount = 0;
|
let searchResultCount = 0;
|
||||||
const searchResultsTbodyElement = document.createElement("tbody");
|
const searchResultsTbodyElement = document.createElement("tbody");
|
||||||
const filterStringSplit = searchFilterElement.value.trim().toLowerCase().split(" ");
|
const filterStringSplit = searchFilterElement.value
|
||||||
|
.trim()
|
||||||
|
.toLowerCase()
|
||||||
|
.split(" ");
|
||||||
for (const map of maps) {
|
for (const map of maps) {
|
||||||
const mapSearchString = (map.mapName + " " +
|
const mapSearchString = (map.mapName +
|
||||||
map.mapDescription + " " +
|
" " +
|
||||||
map.mapAddress1 + " " +
|
map.mapDescription +
|
||||||
|
" " +
|
||||||
|
map.mapAddress1 +
|
||||||
|
" " +
|
||||||
map.mapAddress2).toLowerCase();
|
map.mapAddress2).toLowerCase();
|
||||||
let showMap = true;
|
let showMap = true;
|
||||||
for (const filterStringPiece of filterStringSplit) {
|
for (const filterStringPiece of filterStringSplit) {
|
||||||
|
|
@ -29,28 +38,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
searchResultCount += 1;
|
searchResultCount += 1;
|
||||||
const mapName = map.mapName === "" ?
|
const mapName = map.mapName === "" ? "(No Name)" : map.mapName;
|
||||||
"(No Name)" :
|
|
||||||
map.mapName;
|
|
||||||
searchResultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
|
searchResultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
|
||||||
("<td>" +
|
("<td>" +
|
||||||
"<a class=\"has-text-weight-bold\" href=\"" + urlPrefix + "/maps/" + map.mapId + "\">" +
|
'<a class="has-text-weight-bold" href="' +
|
||||||
|
urlPrefix +
|
||||||
|
"/maps/" +
|
||||||
|
map.mapId +
|
||||||
|
'">' +
|
||||||
cityssm.escapeHTML(mapName) +
|
cityssm.escapeHTML(mapName) +
|
||||||
"</a><br />" +
|
"</a><br />" +
|
||||||
cityssm.escapeHTML(map.mapAddress1) +
|
cityssm.escapeHTML(map.mapAddress1) +
|
||||||
"</td>") +
|
"</td>") +
|
||||||
"<td class=\"has-text-centered\">" +
|
'<td class="has-text-centered">' +
|
||||||
(map.mapLatitude && map.mapLongitude ?
|
(map.mapLatitude && map.mapLongitude
|
||||||
"<i class=\"fas fa-map-marker-alt\" title=\"Has Geographic Coordinates\"></i>" :
|
? '<i class="fas fa-map-marker-alt" title="Has Geographic Coordinates"></i>'
|
||||||
"") +
|
: "") +
|
||||||
"</td>" +
|
"</td>" +
|
||||||
"<td class=\"has-text-centered\">" +
|
'<td class="has-text-centered">' +
|
||||||
(map.mapSVG ?
|
(map.mapSVG
|
||||||
"<i class=\"fas fa-image\" title=\"Has Image\"></i>" :
|
? '<i class="fas fa-image" title="Has Image"></i>'
|
||||||
"") +
|
: "") +
|
||||||
"</td>" +
|
"</td>" +
|
||||||
("<td class=\"has-text-right\">" +
|
('<td class="has-text-right">' +
|
||||||
"<a href=\"" + urlPrefix + "/lots?mapId=" + map.mapId + "\">" +
|
'<a href="' +
|
||||||
|
urlPrefix +
|
||||||
|
"/lots?mapId=" +
|
||||||
|
map.mapId +
|
||||||
|
'">' +
|
||||||
map.lotCount +
|
map.lotCount +
|
||||||
"</a>" +
|
"</a>" +
|
||||||
"</td>") +
|
"</td>") +
|
||||||
|
|
@ -58,25 +73,36 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
searchResultsContainerElement.innerHTML = "";
|
searchResultsContainerElement.innerHTML = "";
|
||||||
if (searchResultCount === 0) {
|
if (searchResultCount === 0) {
|
||||||
searchResultsContainerElement.innerHTML = "<div class=\"message is-info\">" +
|
searchResultsContainerElement.innerHTML =
|
||||||
"<p class=\"message-body\">There are no " + exports.aliases.maps.toLowerCase() + " that meet the search criteria.</p>" +
|
'<div class="message is-info">' +
|
||||||
|
'<p class="message-body">There are no ' +
|
||||||
|
exports.aliases.maps.toLowerCase() +
|
||||||
|
" that meet the search criteria.</p>" +
|
||||||
"</div>";
|
"</div>";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const searchResultsTableElement = document.createElement("table");
|
const searchResultsTableElement = document.createElement("table");
|
||||||
searchResultsTableElement.className = "table is-fullwidth is-striped is-hoverable";
|
searchResultsTableElement.className =
|
||||||
searchResultsTableElement.innerHTML = "<thead><tr>" +
|
"table is-fullwidth is-striped is-hoverable";
|
||||||
"<th>" + exports.aliases.map + "</th>" +
|
searchResultsTableElement.innerHTML =
|
||||||
"<th class=\"has-text-centered\">Coordinates</th>" +
|
"<thead><tr>" +
|
||||||
"<th class=\"has-text-centered\">Image</th>" +
|
"<th>" +
|
||||||
"<th class=\"has-text-right\">" + exports.aliases.lot + " Count</th>" +
|
exports.aliases.map +
|
||||||
|
"</th>" +
|
||||||
|
'<th class="has-text-centered">Coordinates</th>' +
|
||||||
|
'<th class="has-text-centered">Image</th>' +
|
||||||
|
'<th class="has-text-right">' +
|
||||||
|
exports.aliases.lot +
|
||||||
|
" Count</th>" +
|
||||||
"</tr></thead>";
|
"</tr></thead>";
|
||||||
searchResultsTableElement.append(searchResultsTbodyElement);
|
searchResultsTableElement.append(searchResultsTbodyElement);
|
||||||
searchResultsContainerElement.append(searchResultsTableElement);
|
searchResultsContainerElement.append(searchResultsTableElement);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
searchFilterElement.addEventListener("keyup", renderResults);
|
searchFilterElement.addEventListener("keyup", renderResults);
|
||||||
document.querySelector("#form--searchFilters").addEventListener("submit", (formEvent) => {
|
document
|
||||||
|
.querySelector("#form--searchFilters")
|
||||||
|
.addEventListener("submit", (formEvent) => {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault();
|
||||||
renderResults();
|
renderResults();
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -2,39 +2,50 @@
|
||||||
|
|
||||||
import type * as recordTypes from "../types/recordTypes";
|
import type * as recordTypes from "../types/recordTypes";
|
||||||
|
|
||||||
import type {
|
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||||
cityssmGlobal
|
|
||||||
} from "@cityssm/bulma-webapp-js/src/types";
|
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal;
|
||||||
|
|
||||||
|
|
||||||
(() => {
|
(() => {
|
||||||
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
||||||
|
|
||||||
const maps: recordTypes.Map[] = exports.maps;
|
const maps: recordTypes.Map[] = exports.maps;
|
||||||
|
|
||||||
const searchFilterElement = document.querySelector("#searchFilter--map") as HTMLInputElement;
|
const searchFilterElement = document.querySelector(
|
||||||
const searchResultsContainerElement = document.querySelector("#container--searchResults") as HTMLElement;
|
"#searchFilter--map"
|
||||||
|
) as HTMLInputElement;
|
||||||
|
|
||||||
|
const searchResultsContainerElement = document.querySelector(
|
||||||
|
"#container--searchResults"
|
||||||
|
) as HTMLElement;
|
||||||
|
|
||||||
const renderResults = () => {
|
const renderResults = () => {
|
||||||
|
searchResultsContainerElement.innerHTML =
|
||||||
searchResultsContainerElement.innerHTML = "<div class=\"has-text-grey has-text-centered\">" +
|
'<div class="has-text-grey has-text-centered">' +
|
||||||
"<i class=\"fas fa-5x fa-circle-notch fa-spin\" aria-hidden=\"true\"></i><br />" +
|
'<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />' +
|
||||||
"Loading " + exports.aliases.maps + "..." +
|
"Loading " +
|
||||||
|
exports.aliases.maps +
|
||||||
|
"..." +
|
||||||
"</div>";
|
"</div>";
|
||||||
|
|
||||||
let searchResultCount = 0;
|
let searchResultCount = 0;
|
||||||
const searchResultsTbodyElement = document.createElement("tbody");
|
const searchResultsTbodyElement = document.createElement("tbody");
|
||||||
|
|
||||||
const filterStringSplit = searchFilterElement.value.trim().toLowerCase().split(" ");
|
const filterStringSplit = searchFilterElement.value
|
||||||
|
.trim()
|
||||||
|
.toLowerCase()
|
||||||
|
.split(" ");
|
||||||
|
|
||||||
for (const map of maps) {
|
for (const map of maps) {
|
||||||
|
const mapSearchString = (
|
||||||
const mapSearchString = (map.mapName + " " +
|
map.mapName +
|
||||||
map.mapDescription + " " +
|
" " +
|
||||||
map.mapAddress1 + " " +
|
map.mapDescription +
|
||||||
map.mapAddress2).toLowerCase();
|
" " +
|
||||||
|
map.mapAddress1 +
|
||||||
|
" " +
|
||||||
|
map.mapAddress2
|
||||||
|
).toLowerCase();
|
||||||
|
|
||||||
let showMap = true;
|
let showMap = true;
|
||||||
|
|
||||||
|
|
@ -51,52 +62,67 @@ declare const cityssm: cityssmGlobal;
|
||||||
|
|
||||||
searchResultCount += 1;
|
searchResultCount += 1;
|
||||||
|
|
||||||
const mapName = map.mapName === "" ?
|
const mapName = map.mapName === "" ? "(No Name)" : map.mapName;
|
||||||
"(No Name)" :
|
|
||||||
map.mapName;
|
|
||||||
|
|
||||||
searchResultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
|
searchResultsTbodyElement.insertAdjacentHTML(
|
||||||
|
"beforeend",
|
||||||
|
"<tr>" +
|
||||||
("<td>" +
|
("<td>" +
|
||||||
"<a class=\"has-text-weight-bold\" href=\"" + urlPrefix + "/maps/" + map.mapId + "\">" +
|
'<a class="has-text-weight-bold" href="' +
|
||||||
|
urlPrefix +
|
||||||
|
"/maps/" +
|
||||||
|
map.mapId +
|
||||||
|
'">' +
|
||||||
cityssm.escapeHTML(mapName) +
|
cityssm.escapeHTML(mapName) +
|
||||||
"</a><br />" +
|
"</a><br />" +
|
||||||
cityssm.escapeHTML(map.mapAddress1) +
|
cityssm.escapeHTML(map.mapAddress1) +
|
||||||
"</td>") +
|
"</td>") +
|
||||||
"<td class=\"has-text-centered\">" +
|
'<td class="has-text-centered">' +
|
||||||
(map.mapLatitude && map.mapLongitude ?
|
(map.mapLatitude && map.mapLongitude
|
||||||
"<i class=\"fas fa-map-marker-alt\" title=\"Has Geographic Coordinates\"></i>" :
|
? '<i class="fas fa-map-marker-alt" title="Has Geographic Coordinates"></i>'
|
||||||
"") +
|
: "") +
|
||||||
"</td>" +
|
"</td>" +
|
||||||
"<td class=\"has-text-centered\">" +
|
'<td class="has-text-centered">' +
|
||||||
(map.mapSVG ?
|
(map.mapSVG
|
||||||
"<i class=\"fas fa-image\" title=\"Has Image\"></i>" :
|
? '<i class="fas fa-image" title="Has Image"></i>'
|
||||||
"") +
|
: "") +
|
||||||
"</td>" +
|
"</td>" +
|
||||||
("<td class=\"has-text-right\">" +
|
('<td class="has-text-right">' +
|
||||||
"<a href=\"" + urlPrefix + "/lots?mapId=" + map.mapId + "\">" +
|
'<a href="' +
|
||||||
|
urlPrefix +
|
||||||
|
"/lots?mapId=" +
|
||||||
|
map.mapId +
|
||||||
|
'">' +
|
||||||
map.lotCount +
|
map.lotCount +
|
||||||
"</a>" +
|
"</a>" +
|
||||||
"</td>") +
|
"</td>") +
|
||||||
"</tr>");
|
"</tr>"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
searchResultsContainerElement.innerHTML = "";
|
searchResultsContainerElement.innerHTML = "";
|
||||||
|
|
||||||
if (searchResultCount === 0) {
|
if (searchResultCount === 0) {
|
||||||
|
searchResultsContainerElement.innerHTML =
|
||||||
searchResultsContainerElement.innerHTML = "<div class=\"message is-info\">" +
|
'<div class="message is-info">' +
|
||||||
"<p class=\"message-body\">There are no " + exports.aliases.maps.toLowerCase() + " that meet the search criteria.</p>" +
|
'<p class="message-body">There are no ' +
|
||||||
|
exports.aliases.maps.toLowerCase() +
|
||||||
|
" that meet the search criteria.</p>" +
|
||||||
"</div>";
|
"</div>";
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
const searchResultsTableElement = document.createElement("table");
|
const searchResultsTableElement = document.createElement("table");
|
||||||
searchResultsTableElement.className = "table is-fullwidth is-striped is-hoverable";
|
searchResultsTableElement.className =
|
||||||
searchResultsTableElement.innerHTML = "<thead><tr>" +
|
"table is-fullwidth is-striped is-hoverable";
|
||||||
"<th>" + exports.aliases.map + "</th>" +
|
searchResultsTableElement.innerHTML =
|
||||||
"<th class=\"has-text-centered\">Coordinates</th>" +
|
"<thead><tr>" +
|
||||||
"<th class=\"has-text-centered\">Image</th>" +
|
"<th>" +
|
||||||
"<th class=\"has-text-right\">" + exports.aliases.lot + " Count</th>" +
|
exports.aliases.map +
|
||||||
|
"</th>" +
|
||||||
|
'<th class="has-text-centered">Coordinates</th>' +
|
||||||
|
'<th class="has-text-centered">Image</th>' +
|
||||||
|
'<th class="has-text-right">' +
|
||||||
|
exports.aliases.lot +
|
||||||
|
" Count</th>" +
|
||||||
"</tr></thead>";
|
"</tr></thead>";
|
||||||
|
|
||||||
searchResultsTableElement.append(searchResultsTbodyElement);
|
searchResultsTableElement.append(searchResultsTbodyElement);
|
||||||
|
|
@ -106,7 +132,9 @@ declare const cityssm: cityssmGlobal;
|
||||||
};
|
};
|
||||||
|
|
||||||
searchFilterElement.addEventListener("keyup", renderResults);
|
searchFilterElement.addEventListener("keyup", renderResults);
|
||||||
document.querySelector("#form--searchFilters").addEventListener("submit", (formEvent) => {
|
document
|
||||||
|
.querySelector("#form--searchFilters")
|
||||||
|
.addEventListener("submit", (formEvent) => {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault();
|
||||||
renderResults();
|
renderResults();
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -8,9 +8,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const mapCoordinates = [mapLatitude, mapLongitude];
|
const mapCoordinates = [mapLatitude, mapLongitude];
|
||||||
const map = L.map(mapContainerElement);
|
const map = L.map(mapContainerElement);
|
||||||
map.setView(mapCoordinates, 15);
|
map.setView(mapCoordinates, 15);
|
||||||
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
|
||||||
maxZoom: 19,
|
maxZoom: 19,
|
||||||
attribution: '© OpenStreetMap'
|
attribution: "© OpenStreetMap"
|
||||||
}).addTo(map);
|
}).addTo(map);
|
||||||
L.marker(mapCoordinates).addTo(map);
|
L.marker(mapCoordinates).addTo(map);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,28 +1,32 @@
|
||||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
// import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
// import type { BulmaJS } from "@cityssm/bulma-js/types";
|
||||||
import type * as Leaflet from "leaflet";
|
import type * as Leaflet from "leaflet";
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
// declare const cityssm: cityssmGlobal;
|
||||||
declare const bulmaJS: BulmaJS;
|
// declare const bulmaJS: BulmaJS;
|
||||||
declare const L;
|
declare const L;
|
||||||
|
|
||||||
(() => {
|
(() => {
|
||||||
|
const mapContainerElement = document.querySelector(
|
||||||
const mapContainerElement = document.querySelector("#map--leaflet") as HTMLElement;
|
"#map--leaflet"
|
||||||
|
) as HTMLElement;
|
||||||
|
|
||||||
if (mapContainerElement) {
|
if (mapContainerElement) {
|
||||||
|
const mapLatitude = Number.parseFloat(
|
||||||
const mapLatitude = Number.parseFloat(mapContainerElement.dataset.mapLatitude);
|
mapContainerElement.dataset.mapLatitude
|
||||||
const mapLongitude = Number.parseFloat(mapContainerElement.dataset.mapLongitude);
|
);
|
||||||
|
const mapLongitude = Number.parseFloat(
|
||||||
|
mapContainerElement.dataset.mapLongitude
|
||||||
|
);
|
||||||
|
|
||||||
const mapCoordinates: Leaflet.LatLngTuple = [mapLatitude, mapLongitude];
|
const mapCoordinates: Leaflet.LatLngTuple = [mapLatitude, mapLongitude];
|
||||||
|
|
||||||
const map: Leaflet.Map = L.map(mapContainerElement);
|
const map: Leaflet.Map = L.map(mapContainerElement);
|
||||||
map.setView(mapCoordinates, 15);
|
map.setView(mapCoordinates, 15);
|
||||||
|
|
||||||
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
|
||||||
maxZoom: 19,
|
maxZoom: 19,
|
||||||
attribution: '© OpenStreetMap'
|
attribution: "© OpenStreetMap"
|
||||||
}).addTo(map);
|
}).addTo(map);
|
||||||
|
|
||||||
L.marker(mapCoordinates).addTo(map);
|
L.marker(mapCoordinates).addTo(map);
|
||||||
|
|
|
||||||
|
|
@ -4,18 +4,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
||||||
const searchFilterFormElement = document.querySelector("#form--searchFilters");
|
const searchFilterFormElement = document.querySelector("#form--searchFilters");
|
||||||
const searchResultsContainerElement = document.querySelector("#container--searchResults");
|
const searchResultsContainerElement = document.querySelector("#container--searchResults");
|
||||||
const limit = Number.parseInt(document.querySelector("#searchFilter--limit").value, 10);
|
const limit = Number.parseInt(document.querySelector("#searchFilter--limit")
|
||||||
|
.value, 10);
|
||||||
const offsetElement = document.querySelector("#searchFilter--offset");
|
const offsetElement = document.querySelector("#searchFilter--offset");
|
||||||
const getWorkOrders = () => {
|
const getWorkOrders = () => {
|
||||||
const offset = Number.parseInt(offsetElement.value, 10);
|
const offset = Number.parseInt(offsetElement.value, 10);
|
||||||
searchResultsContainerElement.innerHTML = "<div class=\"has-text-grey has-text-centered\">" +
|
searchResultsContainerElement.innerHTML =
|
||||||
"<i class=\"fas fa-5x fa-circle-notch fa-spin\" aria-hidden=\"true\"></i><br />" +
|
'<div class="has-text-grey has-text-centered">' +
|
||||||
|
'<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />' +
|
||||||
"Loading Work Orders..." +
|
"Loading Work Orders..." +
|
||||||
"</div>";
|
"</div>";
|
||||||
cityssm.postJSON(urlPrefix + "/workOrders/doSearchWorkOrders", searchFilterFormElement, (responseJSON) => {
|
cityssm.postJSON(urlPrefix + "/workOrders/doSearchWorkOrders", searchFilterFormElement, (responseJSON) => {
|
||||||
if (responseJSON.workOrders.length === 0) {
|
if (responseJSON.workOrders.length === 0) {
|
||||||
searchResultsContainerElement.innerHTML = "<div class=\"message is-info\">" +
|
searchResultsContainerElement.innerHTML =
|
||||||
"<p class=\"message-body\">There are no work orders that meet the search criteria.</p>" +
|
'<div class="message is-info">' +
|
||||||
|
'<p class="message-body">There are no work orders that meet the search criteria.</p>' +
|
||||||
"</div>";
|
"</div>";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -23,23 +26,32 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
for (const workOrder of responseJSON.workOrders) {
|
for (const workOrder of responseJSON.workOrders) {
|
||||||
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
|
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
|
||||||
("<td>" +
|
("<td>" +
|
||||||
"<a class=\"has-text-weight-bold\" href=\"" + urlPrefix + "/workOrders/" + workOrder.workOrderId + "\">" +
|
'<a class="has-text-weight-bold" href="' +
|
||||||
|
urlPrefix +
|
||||||
|
"/workOrders/" +
|
||||||
|
workOrder.workOrderId +
|
||||||
|
'">' +
|
||||||
cityssm.escapeHTML(workOrder.workOrderNumber) +
|
cityssm.escapeHTML(workOrder.workOrderNumber) +
|
||||||
"</a>" +
|
"</a>" +
|
||||||
"</td>") +
|
"</td>") +
|
||||||
("<td>" +
|
("<td>" +
|
||||||
cityssm.escapeHTML(workOrder.workOrderType) +
|
cityssm.escapeHTML(workOrder.workOrderType) +
|
||||||
"</td>") +
|
"</td>") +
|
||||||
"<td>" + cityssm.escapeHTML(workOrder.workOrderDescription) + "</td>" +
|
"<td>" +
|
||||||
|
cityssm.escapeHTML(workOrder.workOrderDescription) +
|
||||||
|
"</td>" +
|
||||||
("<td>" +
|
("<td>" +
|
||||||
workOrder.workOrderOpenDateString +
|
workOrder.workOrderOpenDateString +
|
||||||
"</td>") +
|
"</td>") +
|
||||||
("<td>" +
|
("<td>" +
|
||||||
(workOrder.workOrderCloseDate ? workOrder.workOrderCloseDateString : "<span class=\"has-text-grey\">(No Close Date)</span>") +
|
(workOrder.workOrderCloseDate
|
||||||
|
? workOrder.workOrderCloseDateString
|
||||||
|
: '<span class="has-text-grey">(No Close Date)</span>') +
|
||||||
"</td>") +
|
"</td>") +
|
||||||
"</tr>");
|
"</tr>");
|
||||||
}
|
}
|
||||||
searchResultsContainerElement.innerHTML = "<table class=\"table is-fullwidth is-striped is-hoverable\">" +
|
searchResultsContainerElement.innerHTML =
|
||||||
|
'<table class="table is-fullwidth is-striped is-hoverable">' +
|
||||||
"<thead><tr>" +
|
"<thead><tr>" +
|
||||||
"<th>Work Order Number</th>" +
|
"<th>Work Order Number</th>" +
|
||||||
"<th>Work Order Type</th>" +
|
"<th>Work Order Type</th>" +
|
||||||
|
|
@ -48,38 +60,47 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
"<th>Close Date</th>" +
|
"<th>Close Date</th>" +
|
||||||
"</tr></thead>" +
|
"</tr></thead>" +
|
||||||
"<table>" +
|
"<table>" +
|
||||||
"<div class=\"level\">" +
|
'<div class="level">' +
|
||||||
("<div class=\"level-left\">" +
|
('<div class="level-left">' +
|
||||||
"<div class=\"level-item has-text-weight-bold\">" +
|
'<div class="level-item has-text-weight-bold">' +
|
||||||
"Displaying " + (offset + 1).toString() +
|
"Displaying " +
|
||||||
" to " + Math.min(responseJSON.count, limit + offset) +
|
(offset + 1).toString() +
|
||||||
" of " + responseJSON.count +
|
" to " +
|
||||||
|
Math.min(responseJSON.count, limit + offset) +
|
||||||
|
" of " +
|
||||||
|
responseJSON.count +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
("<div class=\"level-right\">" +
|
('<div class="level-right">' +
|
||||||
(offset > 0 ?
|
(offset > 0
|
||||||
"<div class=\"level-item\">" +
|
? '<div class="level-item">' +
|
||||||
"<button class=\"button is-rounded is-link is-outlined\" data-page=\"previous\" type=\"button\" title=\"Previous\">" +
|
'<button class="button is-rounded is-link is-outlined" data-page="previous" type="button" title="Previous">' +
|
||||||
"<i class=\"fas fa-arrow-left\" aria-hidden=\"true\"></i>" +
|
'<i class="fas fa-arrow-left" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
"</button>" +
|
||||||
"</div>" :
|
"</div>"
|
||||||
"") +
|
: "") +
|
||||||
(limit + offset < responseJSON.count ?
|
(limit + offset < responseJSON.count
|
||||||
"<div class=\"level-item\">" +
|
? '<div class="level-item">' +
|
||||||
"<button class=\"button is-rounded is-link\" data-page=\"next\" type=\"button\" title=\"Next\">" +
|
'<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
|
||||||
"<span>Next</span>" +
|
"<span>Next</span>" +
|
||||||
"<span class=\"icon\"><i class=\"fas fa-arrow-right\" aria-hidden=\"true\"></i></span>" +
|
'<span class="icon"><i class="fas fa-arrow-right" aria-hidden="true"></i></span>' +
|
||||||
"</button>" +
|
"</button>" +
|
||||||
"</div>" :
|
"</div>"
|
||||||
"") +
|
: "") +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
"</div>";
|
"</div>";
|
||||||
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement);
|
searchResultsContainerElement
|
||||||
|
.querySelector("table")
|
||||||
|
.append(resultsTbodyElement);
|
||||||
if (offset > 0) {
|
if (offset > 0) {
|
||||||
searchResultsContainerElement.querySelector("button[data-page='previous']").addEventListener("click", previousAndGetWorkOrders);
|
searchResultsContainerElement
|
||||||
|
.querySelector("button[data-page='previous']")
|
||||||
|
.addEventListener("click", previousAndGetWorkOrders);
|
||||||
}
|
}
|
||||||
if (limit + offset < responseJSON.count) {
|
if (limit + offset < responseJSON.count) {
|
||||||
searchResultsContainerElement.querySelector("button[data-page='next']").addEventListener("click", nextAndGetWorkOrders);
|
searchResultsContainerElement
|
||||||
|
.querySelector("button[data-page='next']")
|
||||||
|
.addEventListener("click", nextAndGetWorkOrders);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -2,43 +2,49 @@
|
||||||
|
|
||||||
import type * as recordTypes from "../types/recordTypes";
|
import type * as recordTypes from "../types/recordTypes";
|
||||||
|
|
||||||
import type {
|
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||||
cityssmGlobal
|
|
||||||
} from "@cityssm/bulma-webapp-js/src/types";
|
|
||||||
|
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal;
|
||||||
|
|
||||||
|
|
||||||
(() => {
|
(() => {
|
||||||
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
||||||
|
|
||||||
const searchFilterFormElement = document.querySelector("#form--searchFilters") as HTMLFormElement;
|
const searchFilterFormElement = document.querySelector(
|
||||||
const searchResultsContainerElement = document.querySelector("#container--searchResults") as HTMLElement;
|
"#form--searchFilters"
|
||||||
|
) as HTMLFormElement;
|
||||||
const limit = Number.parseInt((document.querySelector("#searchFilter--limit") as HTMLInputElement).value, 10);
|
const searchResultsContainerElement = document.querySelector(
|
||||||
const offsetElement = document.querySelector("#searchFilter--offset") as HTMLInputElement;
|
"#container--searchResults"
|
||||||
|
) as HTMLElement;
|
||||||
|
|
||||||
|
const limit = Number.parseInt(
|
||||||
|
(document.querySelector("#searchFilter--limit") as HTMLInputElement)
|
||||||
|
.value,
|
||||||
|
10
|
||||||
|
);
|
||||||
|
const offsetElement = document.querySelector(
|
||||||
|
"#searchFilter--offset"
|
||||||
|
) as HTMLInputElement;
|
||||||
|
|
||||||
const getWorkOrders = () => {
|
const getWorkOrders = () => {
|
||||||
|
|
||||||
const offset = Number.parseInt(offsetElement.value, 10);
|
const offset = Number.parseInt(offsetElement.value, 10);
|
||||||
|
|
||||||
searchResultsContainerElement.innerHTML = "<div class=\"has-text-grey has-text-centered\">" +
|
searchResultsContainerElement.innerHTML =
|
||||||
"<i class=\"fas fa-5x fa-circle-notch fa-spin\" aria-hidden=\"true\"></i><br />" +
|
'<div class="has-text-grey has-text-centered">' +
|
||||||
|
'<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />' +
|
||||||
"Loading Work Orders..." +
|
"Loading Work Orders..." +
|
||||||
"</div>";
|
"</div>";
|
||||||
|
|
||||||
cityssm.postJSON(urlPrefix + "/workOrders/doSearchWorkOrders", searchFilterFormElement,
|
cityssm.postJSON(
|
||||||
|
urlPrefix + "/workOrders/doSearchWorkOrders",
|
||||||
|
searchFilterFormElement,
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
count: number;
|
count: number;
|
||||||
workOrders: recordTypes.WorkOrder[];
|
workOrders: recordTypes.WorkOrder[];
|
||||||
}) => {
|
}) => {
|
||||||
|
|
||||||
if (responseJSON.workOrders.length === 0) {
|
if (responseJSON.workOrders.length === 0) {
|
||||||
|
searchResultsContainerElement.innerHTML =
|
||||||
searchResultsContainerElement.innerHTML = "<div class=\"message is-info\">" +
|
'<div class="message is-info">' +
|
||||||
"<p class=\"message-body\">There are no work orders that meet the search criteria.</p>" +
|
'<p class="message-body">There are no work orders that meet the search criteria.</p>' +
|
||||||
"</div>";
|
"</div>";
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
@ -47,28 +53,38 @@ declare const cityssm: cityssmGlobal;
|
||||||
const resultsTbodyElement = document.createElement("tbody");
|
const resultsTbodyElement = document.createElement("tbody");
|
||||||
|
|
||||||
for (const workOrder of responseJSON.workOrders) {
|
for (const workOrder of responseJSON.workOrders) {
|
||||||
|
resultsTbodyElement.insertAdjacentHTML(
|
||||||
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
|
"beforeend",
|
||||||
|
"<tr>" +
|
||||||
("<td>" +
|
("<td>" +
|
||||||
"<a class=\"has-text-weight-bold\" href=\"" + urlPrefix + "/workOrders/" + workOrder.workOrderId + "\">" +
|
'<a class="has-text-weight-bold" href="' +
|
||||||
|
urlPrefix +
|
||||||
|
"/workOrders/" +
|
||||||
|
workOrder.workOrderId +
|
||||||
|
'">' +
|
||||||
cityssm.escapeHTML(workOrder.workOrderNumber) +
|
cityssm.escapeHTML(workOrder.workOrderNumber) +
|
||||||
"</a>" +
|
"</a>" +
|
||||||
"</td>") +
|
"</td>") +
|
||||||
("<td>" +
|
("<td>" +
|
||||||
cityssm.escapeHTML(workOrder.workOrderType) +
|
cityssm.escapeHTML(workOrder.workOrderType) +
|
||||||
"</td>") +
|
"</td>") +
|
||||||
"<td>" + cityssm.escapeHTML(workOrder.workOrderDescription) + "</td>" +
|
"<td>" +
|
||||||
|
cityssm.escapeHTML(workOrder.workOrderDescription) +
|
||||||
|
"</td>" +
|
||||||
("<td>" +
|
("<td>" +
|
||||||
workOrder.workOrderOpenDateString +
|
workOrder.workOrderOpenDateString +
|
||||||
"</td>") +
|
"</td>") +
|
||||||
("<td>" +
|
("<td>" +
|
||||||
(workOrder.workOrderCloseDate ? workOrder.workOrderCloseDateString : "<span class=\"has-text-grey\">(No Close Date)</span>") +
|
(workOrder.workOrderCloseDate
|
||||||
|
? workOrder.workOrderCloseDateString
|
||||||
|
: '<span class="has-text-grey">(No Close Date)</span>') +
|
||||||
"</td>") +
|
"</td>") +
|
||||||
"</tr>");
|
"</tr>"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
searchResultsContainerElement.innerHTML = "<table class=\"table is-fullwidth is-striped is-hoverable\">" +
|
searchResultsContainerElement.innerHTML =
|
||||||
|
'<table class="table is-fullwidth is-striped is-hoverable">' +
|
||||||
"<thead><tr>" +
|
"<thead><tr>" +
|
||||||
"<th>Work Order Number</th>" +
|
"<th>Work Order Number</th>" +
|
||||||
"<th>Work Order Type</th>" +
|
"<th>Work Order Type</th>" +
|
||||||
|
|
@ -77,61 +93,78 @@ declare const cityssm: cityssmGlobal;
|
||||||
"<th>Close Date</th>" +
|
"<th>Close Date</th>" +
|
||||||
"</tr></thead>" +
|
"</tr></thead>" +
|
||||||
"<table>" +
|
"<table>" +
|
||||||
"<div class=\"level\">" +
|
'<div class="level">' +
|
||||||
("<div class=\"level-left\">" +
|
('<div class="level-left">' +
|
||||||
"<div class=\"level-item has-text-weight-bold\">" +
|
'<div class="level-item has-text-weight-bold">' +
|
||||||
"Displaying " + (offset + 1).toString() +
|
"Displaying " +
|
||||||
" to " + Math.min(responseJSON.count, limit + offset) +
|
(offset + 1).toString() +
|
||||||
" of " + responseJSON.count +
|
" to " +
|
||||||
|
Math.min(responseJSON.count, limit + offset) +
|
||||||
|
" of " +
|
||||||
|
responseJSON.count +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
("<div class=\"level-right\">" +
|
('<div class="level-right">' +
|
||||||
(offset > 0 ?
|
(offset > 0
|
||||||
"<div class=\"level-item\">" +
|
? '<div class="level-item">' +
|
||||||
"<button class=\"button is-rounded is-link is-outlined\" data-page=\"previous\" type=\"button\" title=\"Previous\">" +
|
'<button class="button is-rounded is-link is-outlined" data-page="previous" type="button" title="Previous">' +
|
||||||
"<i class=\"fas fa-arrow-left\" aria-hidden=\"true\"></i>" +
|
'<i class="fas fa-arrow-left" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
"</button>" +
|
||||||
"</div>" :
|
"</div>"
|
||||||
"") +
|
: "") +
|
||||||
(limit + offset < responseJSON.count ?
|
(limit + offset < responseJSON.count
|
||||||
"<div class=\"level-item\">" +
|
? '<div class="level-item">' +
|
||||||
"<button class=\"button is-rounded is-link\" data-page=\"next\" type=\"button\" title=\"Next\">" +
|
'<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
|
||||||
"<span>Next</span>" +
|
"<span>Next</span>" +
|
||||||
"<span class=\"icon\"><i class=\"fas fa-arrow-right\" aria-hidden=\"true\"></i></span>" +
|
'<span class="icon"><i class="fas fa-arrow-right" aria-hidden="true"></i></span>' +
|
||||||
"</button>" +
|
"</button>" +
|
||||||
"</div>" :
|
"</div>"
|
||||||
"") +
|
: "") +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
"</div>";
|
"</div>";
|
||||||
|
|
||||||
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement);
|
searchResultsContainerElement
|
||||||
|
.querySelector("table")
|
||||||
|
.append(resultsTbodyElement);
|
||||||
|
|
||||||
if (offset > 0) {
|
if (offset > 0) {
|
||||||
searchResultsContainerElement.querySelector("button[data-page='previous']").addEventListener("click", previousAndGetWorkOrders);
|
searchResultsContainerElement
|
||||||
|
.querySelector("button[data-page='previous']")
|
||||||
|
.addEventListener("click", previousAndGetWorkOrders);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (limit + offset < responseJSON.count) {
|
if (limit + offset < responseJSON.count) {
|
||||||
searchResultsContainerElement.querySelector("button[data-page='next']").addEventListener("click", nextAndGetWorkOrders);
|
searchResultsContainerElement
|
||||||
|
.querySelector("button[data-page='next']")
|
||||||
|
.addEventListener("click", nextAndGetWorkOrders);
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const resetOffsetAndGetWorkOrders = () => {
|
const resetOffsetAndGetWorkOrders = () => {
|
||||||
offsetElement.value = "0";
|
offsetElement.value = "0";
|
||||||
getWorkOrders();
|
getWorkOrders();
|
||||||
}
|
};
|
||||||
|
|
||||||
const previousAndGetWorkOrders = () => {
|
const previousAndGetWorkOrders = () => {
|
||||||
offsetElement.value = Math.max(Number.parseInt(offsetElement.value, 10) - limit, 0).toString();
|
offsetElement.value = Math.max(
|
||||||
|
Number.parseInt(offsetElement.value, 10) - limit,
|
||||||
|
0
|
||||||
|
).toString();
|
||||||
getWorkOrders();
|
getWorkOrders();
|
||||||
};
|
};
|
||||||
|
|
||||||
const nextAndGetWorkOrders = () => {
|
const nextAndGetWorkOrders = () => {
|
||||||
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString();
|
offsetElement.value = (
|
||||||
|
Number.parseInt(offsetElement.value, 10) + limit
|
||||||
|
).toString();
|
||||||
getWorkOrders();
|
getWorkOrders();
|
||||||
};
|
};
|
||||||
|
|
||||||
const filterElements = searchFilterFormElement.querySelectorAll("input, select") as NodeListOf < HTMLInputElement | HTMLSelectElement > ;
|
const filterElements = searchFilterFormElement.querySelectorAll(
|
||||||
|
"input, select"
|
||||||
|
) as NodeListOf<HTMLInputElement | HTMLSelectElement>;
|
||||||
|
|
||||||
for (const filterElement of filterElements) {
|
for (const filterElement of filterElements) {
|
||||||
filterElement.addEventListener("change", resetOffsetAndGetWorkOrders);
|
filterElement.addEventListener("change", resetOffsetAndGetWorkOrders);
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ import handler_doUpdateFee from "../handlers/admin-post/doUpdateFee.js";
|
||||||
import handler_doMoveFeeUp from "../handlers/admin-post/doMoveFeeUp.js";
|
import handler_doMoveFeeUp from "../handlers/admin-post/doMoveFeeUp.js";
|
||||||
import handler_doMoveFeeDown from "../handlers/admin-post/doMoveFeeDown.js";
|
import handler_doMoveFeeDown from "../handlers/admin-post/doMoveFeeDown.js";
|
||||||
import handler_doDeleteFee from "../handlers/admin-post/doDeleteFee.js";
|
import handler_doDeleteFee from "../handlers/admin-post/doDeleteFee.js";
|
||||||
|
import handler_occupancyTypes from "../handlers/admin-get/occupancyTypes.js";
|
||||||
import handler_tables from "../handlers/admin-get/tables.js";
|
import handler_tables from "../handlers/admin-get/tables.js";
|
||||||
import handler_doAddWorkOrderType from "../handlers/admin-post/doAddWorkOrderType.js";
|
import handler_doAddWorkOrderType from "../handlers/admin-post/doAddWorkOrderType.js";
|
||||||
import handler_doUpdateWorkOrderType from "../handlers/admin-post/doUpdateWorkOrderType.js";
|
import handler_doUpdateWorkOrderType from "../handlers/admin-post/doUpdateWorkOrderType.js";
|
||||||
|
|
@ -39,6 +40,7 @@ router.post("/doUpdateFee", permissionHandlers.adminPostHandler, handler_doUpdat
|
||||||
router.post("/doMoveFeeUp", permissionHandlers.adminPostHandler, handler_doMoveFeeUp);
|
router.post("/doMoveFeeUp", permissionHandlers.adminPostHandler, handler_doMoveFeeUp);
|
||||||
router.post("/doMoveFeeDown", permissionHandlers.adminPostHandler, handler_doMoveFeeDown);
|
router.post("/doMoveFeeDown", permissionHandlers.adminPostHandler, handler_doMoveFeeDown);
|
||||||
router.post("/doDeleteFee", permissionHandlers.adminPostHandler, handler_doDeleteFee);
|
router.post("/doDeleteFee", permissionHandlers.adminPostHandler, handler_doDeleteFee);
|
||||||
|
router.get("/occupancyTypes", permissionHandlers.adminGetHandler, handler_occupancyTypes);
|
||||||
router.get("/tables", permissionHandlers.adminGetHandler, handler_tables);
|
router.get("/tables", permissionHandlers.adminGetHandler, handler_tables);
|
||||||
router.post("/doAddWorkOrderType", permissionHandlers.adminPostHandler, handler_doAddWorkOrderType);
|
router.post("/doAddWorkOrderType", permissionHandlers.adminPostHandler, handler_doAddWorkOrderType);
|
||||||
router.post("/doUpdateWorkOrderType", permissionHandlers.adminPostHandler, handler_doUpdateWorkOrderType);
|
router.post("/doUpdateWorkOrderType", permissionHandlers.adminPostHandler, handler_doUpdateWorkOrderType);
|
||||||
|
|
|
||||||
214
routes/admin.ts
214
routes/admin.ts
|
|
@ -1,10 +1,11 @@
|
||||||
import {
|
import { Router } from "express";
|
||||||
Router
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import * as permissionHandlers from "../handlers/permissions.js";
|
import * as permissionHandlers from "../handlers/permissions.js";
|
||||||
|
|
||||||
|
// Fee Management
|
||||||
|
|
||||||
import handler_fees from "../handlers/admin-get/fees.js";
|
import handler_fees from "../handlers/admin-get/fees.js";
|
||||||
|
|
||||||
import handler_doAddFeeCategory from "../handlers/admin-post/doAddFeeCategory.js";
|
import handler_doAddFeeCategory from "../handlers/admin-post/doAddFeeCategory.js";
|
||||||
import handler_doUpdateFeeCategory from "../handlers/admin-post/doUpdateFeeCategory.js";
|
import handler_doUpdateFeeCategory from "../handlers/admin-post/doUpdateFeeCategory.js";
|
||||||
import handler_doMoveFeeCategoryUp from "../handlers/admin-post/doMoveFeeCategoryUp.js";
|
import handler_doMoveFeeCategoryUp from "../handlers/admin-post/doMoveFeeCategoryUp.js";
|
||||||
|
|
@ -17,6 +18,8 @@ import handler_doMoveFeeUp from "../handlers/admin-post/doMoveFeeUp.js";
|
||||||
import handler_doMoveFeeDown from "../handlers/admin-post/doMoveFeeDown.js";
|
import handler_doMoveFeeDown from "../handlers/admin-post/doMoveFeeDown.js";
|
||||||
import handler_doDeleteFee from "../handlers/admin-post/doDeleteFee.js";
|
import handler_doDeleteFee from "../handlers/admin-post/doDeleteFee.js";
|
||||||
|
|
||||||
|
// Config Table Management
|
||||||
|
|
||||||
import handler_tables from "../handlers/admin-get/tables.js";
|
import handler_tables from "../handlers/admin-get/tables.js";
|
||||||
|
|
||||||
import handler_doAddWorkOrderType from "../handlers/admin-post/doAddWorkOrderType.js";
|
import handler_doAddWorkOrderType from "../handlers/admin-post/doAddWorkOrderType.js";
|
||||||
|
|
@ -37,127 +40,172 @@ import handler_doMoveLotOccupantTypeUp from "../handlers/admin-post/doMoveLotOcc
|
||||||
import handler_doMoveLotOccupantTypeDown from "../handlers/admin-post/doMoveLotOccupantTypeDown.js";
|
import handler_doMoveLotOccupantTypeDown from "../handlers/admin-post/doMoveLotOccupantTypeDown.js";
|
||||||
import handler_doDeleteLotOccupantType from "../handlers/admin-post/doDeleteLotOccupantType.js";
|
import handler_doDeleteLotOccupantType from "../handlers/admin-post/doDeleteLotOccupantType.js";
|
||||||
|
|
||||||
|
|
||||||
export const router = Router();
|
export const router = Router();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Fees
|
||||||
|
*/
|
||||||
|
|
||||||
|
router.get("/fees", permissionHandlers.adminGetHandler, handler_fees);
|
||||||
|
|
||||||
|
router.post(
|
||||||
|
"/doAddFeeCategory",
|
||||||
|
permissionHandlers.adminPostHandler,
|
||||||
|
handler_doAddFeeCategory
|
||||||
|
);
|
||||||
|
|
||||||
|
router.post(
|
||||||
|
"/doUpdateFeeCategory",
|
||||||
|
permissionHandlers.adminPostHandler,
|
||||||
|
handler_doUpdateFeeCategory
|
||||||
|
);
|
||||||
|
|
||||||
|
router.post(
|
||||||
|
"/doMoveFeeCategoryUp",
|
||||||
|
permissionHandlers.adminPostHandler,
|
||||||
|
handler_doMoveFeeCategoryUp
|
||||||
|
);
|
||||||
|
|
||||||
|
router.post(
|
||||||
|
"/doMoveFeeCategoryDown",
|
||||||
|
permissionHandlers.adminPostHandler,
|
||||||
|
handler_doMoveFeeCategoryDown
|
||||||
|
);
|
||||||
|
|
||||||
|
router.post(
|
||||||
|
"/doDeleteFeeCategory",
|
||||||
|
permissionHandlers.adminPostHandler,
|
||||||
|
handler_doDeleteFeeCategory
|
||||||
|
);
|
||||||
|
|
||||||
|
router.post("/doAddFee", permissionHandlers.adminPostHandler, handler_doAddFee);
|
||||||
|
|
||||||
|
router.post(
|
||||||
|
"/doUpdateFee",
|
||||||
|
permissionHandlers.adminPostHandler,
|
||||||
|
handler_doUpdateFee
|
||||||
|
);
|
||||||
|
|
||||||
|
router.post(
|
||||||
|
"/doMoveFeeUp",
|
||||||
|
permissionHandlers.adminPostHandler,
|
||||||
|
handler_doMoveFeeUp
|
||||||
|
);
|
||||||
|
|
||||||
|
router.post(
|
||||||
|
"/doMoveFeeDown",
|
||||||
|
permissionHandlers.adminPostHandler,
|
||||||
|
handler_doMoveFeeDown
|
||||||
|
);
|
||||||
|
|
||||||
|
router.post(
|
||||||
|
"/doDeleteFee",
|
||||||
|
permissionHandlers.adminPostHandler,
|
||||||
|
handler_doDeleteFee
|
||||||
|
);
|
||||||
|
|
||||||
// Fees
|
|
||||||
|
|
||||||
router.get("/fees",
|
|
||||||
permissionHandlers.adminGetHandler,
|
permissionHandlers.adminGetHandler,
|
||||||
handler_fees);
|
/*
|
||||||
|
* Config Tables
|
||||||
|
*/
|
||||||
|
|
||||||
router.post("/doAddFeeCategory",
|
router.get("/tables", permissionHandlers.adminGetHandler, handler_tables);
|
||||||
permissionHandlers.adminPostHandler,
|
|
||||||
handler_doAddFeeCategory);
|
|
||||||
|
|
||||||
router.post("/doUpdateFeeCategory",
|
|
||||||
permissionHandlers.adminPostHandler,
|
|
||||||
handler_doUpdateFeeCategory);
|
|
||||||
|
|
||||||
router.post("/doMoveFeeCategoryUp",
|
|
||||||
permissionHandlers.adminPostHandler,
|
|
||||||
handler_doMoveFeeCategoryUp);
|
|
||||||
|
|
||||||
router.post("/doMoveFeeCategoryDown",
|
|
||||||
permissionHandlers.adminPostHandler,
|
|
||||||
handler_doMoveFeeCategoryDown);
|
|
||||||
|
|
||||||
router.post("/doDeleteFeeCategory",
|
|
||||||
permissionHandlers.adminPostHandler,
|
|
||||||
handler_doDeleteFeeCategory);
|
|
||||||
|
|
||||||
router.post("/doAddFee",
|
|
||||||
permissionHandlers.adminPostHandler,
|
|
||||||
handler_doAddFee);
|
|
||||||
|
|
||||||
router.post("/doUpdateFee",
|
|
||||||
permissionHandlers.adminPostHandler,
|
|
||||||
handler_doUpdateFee);
|
|
||||||
|
|
||||||
router.post("/doMoveFeeUp",
|
|
||||||
permissionHandlers.adminPostHandler,
|
|
||||||
handler_doMoveFeeUp);
|
|
||||||
|
|
||||||
router.post("/doMoveFeeDown",
|
|
||||||
permissionHandlers.adminPostHandler,
|
|
||||||
handler_doMoveFeeDown);
|
|
||||||
|
|
||||||
router.post("/doDeleteFee",
|
|
||||||
permissionHandlers.adminPostHandler,
|
|
||||||
handler_doDeleteFee);
|
|
||||||
|
|
||||||
// Config Tables
|
|
||||||
|
|
||||||
router.get("/tables",
|
|
||||||
permissionHandlers.adminGetHandler,
|
|
||||||
handler_tables);
|
|
||||||
|
|
||||||
// Config Tables - Work Order Types
|
// Config Tables - Work Order Types
|
||||||
|
|
||||||
router.post("/doAddWorkOrderType",
|
router.post(
|
||||||
|
"/doAddWorkOrderType",
|
||||||
permissionHandlers.adminPostHandler,
|
permissionHandlers.adminPostHandler,
|
||||||
handler_doAddWorkOrderType);
|
handler_doAddWorkOrderType
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/doUpdateWorkOrderType",
|
router.post(
|
||||||
|
"/doUpdateWorkOrderType",
|
||||||
permissionHandlers.adminPostHandler,
|
permissionHandlers.adminPostHandler,
|
||||||
handler_doUpdateWorkOrderType);
|
handler_doUpdateWorkOrderType
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/doMoveWorkOrderTypeUp",
|
router.post(
|
||||||
|
"/doMoveWorkOrderTypeUp",
|
||||||
permissionHandlers.adminPostHandler,
|
permissionHandlers.adminPostHandler,
|
||||||
handler_doMoveWorkOrderTypeUp);
|
handler_doMoveWorkOrderTypeUp
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/doMoveWorkOrderTypeDown",
|
router.post(
|
||||||
|
"/doMoveWorkOrderTypeDown",
|
||||||
permissionHandlers.adminPostHandler,
|
permissionHandlers.adminPostHandler,
|
||||||
handler_doMoveWorkOrderTypeDown);
|
handler_doMoveWorkOrderTypeDown
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/doDeleteWorkOrderType",
|
router.post(
|
||||||
|
"/doDeleteWorkOrderType",
|
||||||
permissionHandlers.adminPostHandler,
|
permissionHandlers.adminPostHandler,
|
||||||
handler_doDeleteWorkOrderType);
|
handler_doDeleteWorkOrderType
|
||||||
|
);
|
||||||
|
|
||||||
// Config Tables - Lot Statuses
|
// Config Tables - Lot Statuses
|
||||||
|
|
||||||
router.post("/doAddLotStatus",
|
router.post(
|
||||||
|
"/doAddLotStatus",
|
||||||
permissionHandlers.adminPostHandler,
|
permissionHandlers.adminPostHandler,
|
||||||
handler_doAddLotStatus);
|
handler_doAddLotStatus
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/doUpdateLotStatus",
|
router.post(
|
||||||
|
"/doUpdateLotStatus",
|
||||||
permissionHandlers.adminPostHandler,
|
permissionHandlers.adminPostHandler,
|
||||||
handler_doUpdateLotStatus);
|
handler_doUpdateLotStatus
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/doMoveLotStatusUp",
|
router.post(
|
||||||
|
"/doMoveLotStatusUp",
|
||||||
permissionHandlers.adminPostHandler,
|
permissionHandlers.adminPostHandler,
|
||||||
handler_doMoveLotStatusUp);
|
handler_doMoveLotStatusUp
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/doMoveLotStatusDown",
|
router.post(
|
||||||
|
"/doMoveLotStatusDown",
|
||||||
permissionHandlers.adminPostHandler,
|
permissionHandlers.adminPostHandler,
|
||||||
handler_doMoveLotStatusDown);
|
handler_doMoveLotStatusDown
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/doDeleteLotStatus",
|
router.post(
|
||||||
|
"/doDeleteLotStatus",
|
||||||
permissionHandlers.adminPostHandler,
|
permissionHandlers.adminPostHandler,
|
||||||
handler_doDeleteLotStatus);
|
handler_doDeleteLotStatus
|
||||||
|
);
|
||||||
|
|
||||||
// Config Tables - Lot Occupant Types
|
// Config Tables - Lot Occupant Types
|
||||||
|
|
||||||
router.post("/doAddLotOccupantType",
|
router.post(
|
||||||
|
"/doAddLotOccupantType",
|
||||||
permissionHandlers.adminPostHandler,
|
permissionHandlers.adminPostHandler,
|
||||||
handler_doAddLotOccupantType);
|
handler_doAddLotOccupantType
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/doUpdateLotOccupantType",
|
router.post(
|
||||||
|
"/doUpdateLotOccupantType",
|
||||||
permissionHandlers.adminPostHandler,
|
permissionHandlers.adminPostHandler,
|
||||||
handler_doUpdateLotOccupantType);
|
handler_doUpdateLotOccupantType
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/doMoveLotOccupantTypeUp",
|
router.post(
|
||||||
|
"/doMoveLotOccupantTypeUp",
|
||||||
permissionHandlers.adminPostHandler,
|
permissionHandlers.adminPostHandler,
|
||||||
handler_doMoveLotOccupantTypeUp);
|
handler_doMoveLotOccupantTypeUp
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/doMoveLotOccupantTypeDown",
|
router.post(
|
||||||
|
"/doMoveLotOccupantTypeDown",
|
||||||
permissionHandlers.adminPostHandler,
|
permissionHandlers.adminPostHandler,
|
||||||
handler_doMoveLotOccupantTypeDown);
|
handler_doMoveLotOccupantTypeDown
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/doDeleteLotOccupantType",
|
router.post(
|
||||||
|
"/doDeleteLotOccupantType",
|
||||||
permissionHandlers.adminPostHandler,
|
permissionHandlers.adminPostHandler,
|
||||||
handler_doDeleteLotOccupantType);
|
handler_doDeleteLotOccupantType
|
||||||
|
);
|
||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
|
|
@ -2,11 +2,8 @@ import { Router } from "express";
|
||||||
|
|
||||||
import handler_dashboard from "../handlers/dashboard-get/dashboard.js";
|
import handler_dashboard from "../handlers/dashboard-get/dashboard.js";
|
||||||
|
|
||||||
|
|
||||||
export const router = Router();
|
export const router = Router();
|
||||||
|
|
||||||
|
|
||||||
router.get("/", handler_dashboard);
|
router.get("/", handler_dashboard);
|
||||||
|
|
||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
|
|
|
||||||
|
|
@ -5,10 +5,10 @@ import { useTestDatabases } from "../data/databasePaths.js";
|
||||||
export const router = Router();
|
export const router = Router();
|
||||||
const getSafeRedirectURL = (possibleRedirectURL = "") => {
|
const getSafeRedirectURL = (possibleRedirectURL = "") => {
|
||||||
const urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix");
|
const urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix");
|
||||||
if (typeof (possibleRedirectURL) === "string") {
|
if (typeof possibleRedirectURL === "string") {
|
||||||
const urlToCheck = (possibleRedirectURL.startsWith(urlPrefix) ?
|
const urlToCheck = (possibleRedirectURL.startsWith(urlPrefix)
|
||||||
possibleRedirectURL.slice(urlPrefix.length) :
|
? possibleRedirectURL.slice(urlPrefix.length)
|
||||||
possibleRedirectURL).toLowerCase();
|
: possibleRedirectURL).toLowerCase();
|
||||||
switch (urlToCheck) {
|
switch (urlToCheck) {
|
||||||
case "/admin/fees":
|
case "/admin/fees":
|
||||||
case "/lotOccupancies":
|
case "/lotOccupancies":
|
||||||
|
|
@ -21,7 +21,8 @@ const getSafeRedirectURL = (possibleRedirectURL = "") => {
|
||||||
}
|
}
|
||||||
return urlPrefix + "/dashboard";
|
return urlPrefix + "/dashboard";
|
||||||
};
|
};
|
||||||
router.route("/")
|
router
|
||||||
|
.route("/")
|
||||||
.get((request, response) => {
|
.get((request, response) => {
|
||||||
const sessionCookieName = configFunctions.getProperty("session.cookieName");
|
const sessionCookieName = configFunctions.getProperty("session.cookieName");
|
||||||
if (request.session.user && request.cookies[sessionCookieName]) {
|
if (request.session.user && request.cookies[sessionCookieName]) {
|
||||||
|
|
@ -41,25 +42,26 @@ router.route("/")
|
||||||
const userName = request.body.userName;
|
const userName = request.body.userName;
|
||||||
const passwordPlain = request.body.password;
|
const passwordPlain = request.body.password;
|
||||||
const unsafeRedirectURL = request.body.redirect;
|
const unsafeRedirectURL = request.body.redirect;
|
||||||
const redirectURL = getSafeRedirectURL(typeof (unsafeRedirectURL) === "string" ?
|
const redirectURL = getSafeRedirectURL(typeof unsafeRedirectURL === "string" ? unsafeRedirectURL : "");
|
||||||
unsafeRedirectURL :
|
|
||||||
"");
|
|
||||||
const isAuthenticated = await authenticationFunctions.authenticate(userName, passwordPlain);
|
const isAuthenticated = await authenticationFunctions.authenticate(userName, passwordPlain);
|
||||||
let userObject;
|
let userObject;
|
||||||
if (isAuthenticated) {
|
if (isAuthenticated) {
|
||||||
const userNameLowerCase = userName.toLowerCase();
|
const userNameLowerCase = userName.toLowerCase();
|
||||||
const canLogin = configFunctions.getProperty("users.canLogin")
|
const canLogin = configFunctions
|
||||||
|
.getProperty("users.canLogin")
|
||||||
.some((currentUserName) => {
|
.some((currentUserName) => {
|
||||||
return userNameLowerCase === currentUserName.toLowerCase();
|
return userNameLowerCase === currentUserName.toLowerCase();
|
||||||
});
|
});
|
||||||
if (canLogin) {
|
if (canLogin) {
|
||||||
const canUpdate = configFunctions.getProperty("users.canUpdate")
|
const canUpdate = configFunctions
|
||||||
|
.getProperty("users.canUpdate")
|
||||||
.some((currentUserName) => {
|
.some((currentUserName) => {
|
||||||
return userNameLowerCase === currentUserName.toLowerCase();
|
return (userNameLowerCase === currentUserName.toLowerCase());
|
||||||
});
|
});
|
||||||
const isAdmin = configFunctions.getProperty("users.isAdmin")
|
const isAdmin = configFunctions
|
||||||
|
.getProperty("users.isAdmin")
|
||||||
.some((currentUserName) => {
|
.some((currentUserName) => {
|
||||||
return userNameLowerCase === currentUserName.toLowerCase();
|
return (userNameLowerCase === currentUserName.toLowerCase());
|
||||||
});
|
});
|
||||||
userObject = {
|
userObject = {
|
||||||
userName: userNameLowerCase,
|
userName: userNameLowerCase,
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,4 @@
|
||||||
import {
|
import { Router } from "express";
|
||||||
Router
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import * as configFunctions from "../helpers/functions.config.js";
|
import * as configFunctions from "../helpers/functions.config.js";
|
||||||
|
|
||||||
|
|
@ -10,19 +8,17 @@ import { useTestDatabases } from "../data/databasePaths.js";
|
||||||
|
|
||||||
import type * as recordTypes from "../types/recordTypes";
|
import type * as recordTypes from "../types/recordTypes";
|
||||||
|
|
||||||
|
|
||||||
export const router = Router();
|
export const router = Router();
|
||||||
|
|
||||||
|
|
||||||
const getSafeRedirectURL = (possibleRedirectURL = "") => {
|
const getSafeRedirectURL = (possibleRedirectURL = "") => {
|
||||||
|
|
||||||
const urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix");
|
const urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix");
|
||||||
|
|
||||||
if (typeof (possibleRedirectURL) === "string") {
|
if (typeof possibleRedirectURL === "string") {
|
||||||
|
const urlToCheck = (
|
||||||
const urlToCheck = (possibleRedirectURL.startsWith(urlPrefix) ?
|
possibleRedirectURL.startsWith(urlPrefix)
|
||||||
possibleRedirectURL.slice(urlPrefix.length) :
|
? possibleRedirectURL.slice(urlPrefix.length)
|
||||||
possibleRedirectURL).toLowerCase();
|
: possibleRedirectURL
|
||||||
|
).toLowerCase();
|
||||||
|
|
||||||
switch (urlToCheck) {
|
switch (urlToCheck) {
|
||||||
case "/admin/fees":
|
case "/admin/fees":
|
||||||
|
|
@ -31,7 +27,6 @@ const getSafeRedirectURL = (possibleRedirectURL = "") => {
|
||||||
case "/maps":
|
case "/maps":
|
||||||
case "/workOrders":
|
case "/workOrders":
|
||||||
case "/reports":
|
case "/reports":
|
||||||
|
|
||||||
return urlPrefix + urlToCheck;
|
return urlPrefix + urlToCheck;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -39,20 +34,19 @@ const getSafeRedirectURL = (possibleRedirectURL = "") => {
|
||||||
return urlPrefix + "/dashboard";
|
return urlPrefix + "/dashboard";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
router
|
||||||
router.route("/")
|
.route("/")
|
||||||
.get((request, response) => {
|
.get((request, response) => {
|
||||||
|
const sessionCookieName =
|
||||||
const sessionCookieName = configFunctions.getProperty("session.cookieName");
|
configFunctions.getProperty("session.cookieName");
|
||||||
|
|
||||||
if (request.session.user && request.cookies[sessionCookieName]) {
|
if (request.session.user && request.cookies[sessionCookieName]) {
|
||||||
|
const redirectURL = getSafeRedirectURL(
|
||||||
const redirectURL = getSafeRedirectURL((request.query.redirect || "") as string);
|
(request.query.redirect || "") as string
|
||||||
|
);
|
||||||
|
|
||||||
response.redirect(redirectURL);
|
response.redirect(redirectURL);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
response.render("login", {
|
response.render("login", {
|
||||||
userName: "",
|
userName: "",
|
||||||
message: "",
|
message: "",
|
||||||
|
|
@ -62,38 +56,45 @@ router.route("/")
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.post(async (request, response) => {
|
.post(async (request, response) => {
|
||||||
|
|
||||||
const userName = request.body.userName as string;
|
const userName = request.body.userName as string;
|
||||||
const passwordPlain = request.body.password as string;
|
const passwordPlain = request.body.password as string;
|
||||||
|
|
||||||
const unsafeRedirectURL = request.body.redirect;
|
const unsafeRedirectURL = request.body.redirect;
|
||||||
|
|
||||||
const redirectURL = getSafeRedirectURL(typeof (unsafeRedirectURL) === "string" ?
|
const redirectURL = getSafeRedirectURL(
|
||||||
unsafeRedirectURL :
|
typeof unsafeRedirectURL === "string" ? unsafeRedirectURL : ""
|
||||||
"");
|
);
|
||||||
|
|
||||||
const isAuthenticated = await authenticationFunctions.authenticate(userName, passwordPlain)
|
const isAuthenticated = await authenticationFunctions.authenticate(
|
||||||
|
userName,
|
||||||
|
passwordPlain
|
||||||
|
);
|
||||||
let userObject: recordTypes.User;
|
let userObject: recordTypes.User;
|
||||||
|
|
||||||
if (isAuthenticated) {
|
if (isAuthenticated) {
|
||||||
|
|
||||||
const userNameLowerCase = userName.toLowerCase();
|
const userNameLowerCase = userName.toLowerCase();
|
||||||
|
|
||||||
const canLogin = configFunctions.getProperty("users.canLogin")
|
const canLogin = configFunctions
|
||||||
|
.getProperty("users.canLogin")
|
||||||
.some((currentUserName) => {
|
.some((currentUserName) => {
|
||||||
return userNameLowerCase === currentUserName.toLowerCase();
|
return userNameLowerCase === currentUserName.toLowerCase();
|
||||||
});
|
});
|
||||||
|
|
||||||
if (canLogin) {
|
if (canLogin) {
|
||||||
|
const canUpdate = configFunctions
|
||||||
const canUpdate = configFunctions.getProperty("users.canUpdate")
|
.getProperty("users.canUpdate")
|
||||||
.some((currentUserName) => {
|
.some((currentUserName) => {
|
||||||
return userNameLowerCase === currentUserName.toLowerCase();
|
return (
|
||||||
|
userNameLowerCase === currentUserName.toLowerCase()
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
const isAdmin = configFunctions.getProperty("users.isAdmin")
|
const isAdmin = configFunctions
|
||||||
|
.getProperty("users.isAdmin")
|
||||||
.some((currentUserName) => {
|
.some((currentUserName) => {
|
||||||
return userNameLowerCase === currentUserName.toLowerCase();
|
return (
|
||||||
|
userNameLowerCase === currentUserName.toLowerCase()
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
userObject = {
|
userObject = {
|
||||||
|
|
@ -107,13 +108,10 @@ router.route("/")
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isAuthenticated && userObject) {
|
if (isAuthenticated && userObject) {
|
||||||
|
|
||||||
request.session.user = userObject;
|
request.session.user = userObject;
|
||||||
|
|
||||||
response.redirect(redirectURL);
|
response.redirect(redirectURL);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
response.render("login", {
|
response.render("login", {
|
||||||
userName,
|
userName,
|
||||||
message: "Login Failed",
|
message: "Login Failed",
|
||||||
|
|
@ -123,5 +121,4 @@ router.route("/")
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
|
|
@ -1,6 +1,4 @@
|
||||||
import {
|
import { Router } from "express";
|
||||||
Router
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import handler_search from "../handlers/lotOccupancies-get/search.js";
|
import handler_search from "../handlers/lotOccupancies-get/search.js";
|
||||||
import handler_doSearchLotOccupancies from "../handlers/lotOccupancies-post/doSearchLotOccupancies.js";
|
import handler_doSearchLotOccupancies from "../handlers/lotOccupancies-post/doSearchLotOccupancies.js";
|
||||||
|
|
@ -33,103 +31,128 @@ import handler_doDeleteLotOccupancyTransaction from "../handlers/lotOccupancies-
|
||||||
|
|
||||||
import * as permissionHandlers from "../handlers/permissions.js";
|
import * as permissionHandlers from "../handlers/permissions.js";
|
||||||
|
|
||||||
|
|
||||||
export const router = Router();
|
export const router = Router();
|
||||||
|
|
||||||
// Search
|
// Search
|
||||||
|
|
||||||
router.get("/",
|
router.get("/", handler_search);
|
||||||
handler_search);
|
|
||||||
|
|
||||||
router.post("/doSearchLotOccupancies",
|
router.post("/doSearchLotOccupancies", handler_doSearchLotOccupancies);
|
||||||
handler_doSearchLotOccupancies);
|
|
||||||
|
|
||||||
// Create
|
// Create
|
||||||
|
|
||||||
router.get("/new",
|
router.get("/new", permissionHandlers.updateGetHandler, handler_new);
|
||||||
permissionHandlers.updateGetHandler,
|
|
||||||
handler_new);
|
|
||||||
|
|
||||||
router.post("/doGetOccupancyTypeFields",
|
router.post(
|
||||||
|
"/doGetOccupancyTypeFields",
|
||||||
permissionHandlers.updatePostHandler,
|
permissionHandlers.updatePostHandler,
|
||||||
handler_doGetOccupancyTypeFields);
|
handler_doGetOccupancyTypeFields
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/doCreateLotOccupancy",
|
router.post(
|
||||||
|
"/doCreateLotOccupancy",
|
||||||
permissionHandlers.updatePostHandler,
|
permissionHandlers.updatePostHandler,
|
||||||
handler_doCreateLotOccupancy);
|
handler_doCreateLotOccupancy
|
||||||
|
);
|
||||||
|
|
||||||
// View
|
// View
|
||||||
|
|
||||||
router.get("/:lotOccupancyId",
|
router.get("/:lotOccupancyId", handler_view);
|
||||||
handler_view);
|
|
||||||
|
|
||||||
router.get("/:lotOccupancyId/print",
|
router.get("/:lotOccupancyId/print", handler_print);
|
||||||
handler_print);
|
|
||||||
|
|
||||||
// Edit
|
// Edit
|
||||||
|
|
||||||
router.get("/:lotOccupancyId/edit",
|
router.get(
|
||||||
|
"/:lotOccupancyId/edit",
|
||||||
permissionHandlers.updateGetHandler,
|
permissionHandlers.updateGetHandler,
|
||||||
handler_edit);
|
handler_edit
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/doUpdateLotOccupancy",
|
router.post(
|
||||||
|
"/doUpdateLotOccupancy",
|
||||||
permissionHandlers.updatePostHandler,
|
permissionHandlers.updatePostHandler,
|
||||||
handler_doUpdateLotOccupancy);
|
handler_doUpdateLotOccupancy
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/doDeleteLotOccupancy",
|
router.post(
|
||||||
|
"/doDeleteLotOccupancy",
|
||||||
permissionHandlers.updatePostHandler,
|
permissionHandlers.updatePostHandler,
|
||||||
handler_doDeleteLotOccupancy);
|
handler_doDeleteLotOccupancy
|
||||||
|
);
|
||||||
|
|
||||||
// Occupants
|
// Occupants
|
||||||
|
|
||||||
router.post("/doAddLotOccupancyOccupant",
|
router.post(
|
||||||
|
"/doAddLotOccupancyOccupant",
|
||||||
permissionHandlers.updatePostHandler,
|
permissionHandlers.updatePostHandler,
|
||||||
handler_doAddLotOccupancyOccupant);
|
handler_doAddLotOccupancyOccupant
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/doUpdateLotOccupancyOccupant",
|
router.post(
|
||||||
|
"/doUpdateLotOccupancyOccupant",
|
||||||
permissionHandlers.updatePostHandler,
|
permissionHandlers.updatePostHandler,
|
||||||
handler_doUpdateLotOccupancyOccupant);
|
handler_doUpdateLotOccupancyOccupant
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/doDeleteLotOccupancyOccupant",
|
router.post(
|
||||||
|
"/doDeleteLotOccupancyOccupant",
|
||||||
permissionHandlers.updatePostHandler,
|
permissionHandlers.updatePostHandler,
|
||||||
handler_doDeleteLotOccupancyOccupant);
|
handler_doDeleteLotOccupancyOccupant
|
||||||
|
);
|
||||||
|
|
||||||
// Comments
|
// Comments
|
||||||
|
|
||||||
router.post("/doAddLotOccupancyComment",
|
router.post(
|
||||||
|
"/doAddLotOccupancyComment",
|
||||||
permissionHandlers.updatePostHandler,
|
permissionHandlers.updatePostHandler,
|
||||||
handler_doAddLotOccupancyComment);
|
handler_doAddLotOccupancyComment
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/doUpdateLotOccupancyComment",
|
router.post(
|
||||||
|
"/doUpdateLotOccupancyComment",
|
||||||
permissionHandlers.updatePostHandler,
|
permissionHandlers.updatePostHandler,
|
||||||
handler_doUpdateLotOccupancyComment);
|
handler_doUpdateLotOccupancyComment
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/doDeleteLotOccupancyComment",
|
router.post(
|
||||||
|
"/doDeleteLotOccupancyComment",
|
||||||
permissionHandlers.updatePostHandler,
|
permissionHandlers.updatePostHandler,
|
||||||
handler_doDeleteLotOccupancyComment);
|
handler_doDeleteLotOccupancyComment
|
||||||
|
);
|
||||||
|
|
||||||
// Fees
|
// Fees
|
||||||
|
|
||||||
router.post("/doGetFees",
|
router.post(
|
||||||
|
"/doGetFees",
|
||||||
permissionHandlers.updatePostHandler,
|
permissionHandlers.updatePostHandler,
|
||||||
handler_doGetFees);
|
handler_doGetFees
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/doAddLotOccupancyFee",
|
router.post(
|
||||||
|
"/doAddLotOccupancyFee",
|
||||||
permissionHandlers.updatePostHandler,
|
permissionHandlers.updatePostHandler,
|
||||||
handler_doAddLotOccupancyFee);
|
handler_doAddLotOccupancyFee
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/doDeleteLotOccupancyFee",
|
router.post(
|
||||||
|
"/doDeleteLotOccupancyFee",
|
||||||
permissionHandlers.updatePostHandler,
|
permissionHandlers.updatePostHandler,
|
||||||
handler_doDeleteLotOccupancyFee);
|
handler_doDeleteLotOccupancyFee
|
||||||
|
);
|
||||||
|
|
||||||
// Transactions
|
// Transactions
|
||||||
|
|
||||||
router.post("/doAddLotOccupancyTransaction",
|
router.post(
|
||||||
|
"/doAddLotOccupancyTransaction",
|
||||||
permissionHandlers.updatePostHandler,
|
permissionHandlers.updatePostHandler,
|
||||||
handler_doAddLotOccupancyTransaction);
|
handler_doAddLotOccupancyTransaction
|
||||||
|
);
|
||||||
|
|
||||||
router.post("/doDeleteLotOccupancyTransaction",
|
router.post(
|
||||||
|
"/doDeleteLotOccupancyTransaction",
|
||||||
permissionHandlers.updatePostHandler,
|
permissionHandlers.updatePostHandler,
|
||||||
handler_doDeleteLotOccupancyTransaction);
|
handler_doDeleteLotOccupancyTransaction
|
||||||
|
);
|
||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
|
|
@ -19,72 +19,58 @@ import handler_doAddLotComment from "../handlers/lots-post/doAddLotComment.js";
|
||||||
import handler_doUpdateLotComment from "../handlers/lots-post/doUpdateLotComment.js";
|
import handler_doUpdateLotComment from "../handlers/lots-post/doUpdateLotComment.js";
|
||||||
import handler_doDeleteLotComment from "../handlers/lots-post/doDeleteLotComment.js";
|
import handler_doDeleteLotComment from "../handlers/lots-post/doDeleteLotComment.js";
|
||||||
|
|
||||||
|
|
||||||
export const router = Router();
|
export const router = Router();
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Lot Search
|
* Lot Search
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
router.get("/", handler_search);
|
||||||
|
|
||||||
router.get("/",
|
router.post("/doSearchLots", handler_doSearchLots);
|
||||||
handler_search);
|
|
||||||
|
|
||||||
router.post("/doSearchLots",
|
|
||||||
handler_doSearchLots);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Lot View / Edit
|
* Lot View / Edit
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
router.get("/new", permissionHandlers.updateGetHandler, handler_new);
|
||||||
|
|
||||||
router.get("/new",
|
router.get("/:lotId", handler_view);
|
||||||
permissionHandlers.updateGetHandler,
|
|
||||||
handler_new);
|
|
||||||
|
|
||||||
|
router.get("/:lotId/next", handler_next);
|
||||||
|
|
||||||
router.get("/:lotId",
|
router.get("/:lotId/previous", handler_previous);
|
||||||
handler_view);
|
|
||||||
|
|
||||||
|
router.get("/:lotId/edit", permissionHandlers.updateGetHandler, handler_edit);
|
||||||
|
|
||||||
router.get("/:lotId/next",
|
router.post(
|
||||||
handler_next);
|
"/doCreateLot",
|
||||||
|
|
||||||
|
|
||||||
router.get("/:lotId/previous",
|
|
||||||
handler_previous);
|
|
||||||
|
|
||||||
|
|
||||||
router.get("/:lotId/edit",
|
|
||||||
permissionHandlers.updateGetHandler,
|
|
||||||
handler_edit);
|
|
||||||
|
|
||||||
|
|
||||||
router.post("/doCreateLot",
|
|
||||||
permissionHandlers.updatePostHandler,
|
permissionHandlers.updatePostHandler,
|
||||||
handler_doCreateLot);
|
handler_doCreateLot
|
||||||
|
);
|
||||||
|
|
||||||
|
router.post(
|
||||||
router.post("/doUpdateLot",
|
"/doUpdateLot",
|
||||||
permissionHandlers.updatePostHandler,
|
permissionHandlers.updatePostHandler,
|
||||||
handler_doUpdateLot);
|
handler_doUpdateLot
|
||||||
|
);
|
||||||
|
|
||||||
|
router.post(
|
||||||
router.post("/doAddLotComment",
|
"/doAddLotComment",
|
||||||
permissionHandlers.updatePostHandler,
|
permissionHandlers.updatePostHandler,
|
||||||
handler_doAddLotComment);
|
handler_doAddLotComment
|
||||||
|
);
|
||||||
|
|
||||||
|
router.post(
|
||||||
router.post("/doUpdateLotComment",
|
"/doUpdateLotComment",
|
||||||
permissionHandlers.updatePostHandler,
|
permissionHandlers.updatePostHandler,
|
||||||
handler_doUpdateLotComment);
|
handler_doUpdateLotComment
|
||||||
|
);
|
||||||
|
|
||||||
|
router.post(
|
||||||
router.post("/doDeleteLotComment",
|
"/doDeleteLotComment",
|
||||||
permissionHandlers.updatePostHandler,
|
permissionHandlers.updatePostHandler,
|
||||||
handler_doDeleteLotComment);
|
handler_doDeleteLotComment
|
||||||
|
);
|
||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,4 @@
|
||||||
import {
|
import { Router } from "express";
|
||||||
Router
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import * as permissionHandlers from "../handlers/permissions.js";
|
import * as permissionHandlers from "../handlers/permissions.js";
|
||||||
|
|
||||||
|
|
@ -14,41 +12,32 @@ import handler_doCreateMap from "../handlers/maps-post/doCreateMap.js";
|
||||||
import handler_doUpdateMap from "../handlers/maps-post/doUpdateMap.js";
|
import handler_doUpdateMap from "../handlers/maps-post/doUpdateMap.js";
|
||||||
import handler_doDeleteMap from "../handlers/maps-post/doDeleteMap.js";
|
import handler_doDeleteMap from "../handlers/maps-post/doDeleteMap.js";
|
||||||
|
|
||||||
|
|
||||||
export const router = Router();
|
export const router = Router();
|
||||||
|
|
||||||
|
router.get("/", handler_search);
|
||||||
|
|
||||||
router.get("/",
|
router.get("/new", permissionHandlers.updateGetHandler, handler_new);
|
||||||
handler_search);
|
|
||||||
|
|
||||||
|
router.get("/:mapId", handler_view);
|
||||||
|
|
||||||
router.get("/new",
|
router.get("/:mapId/edit", permissionHandlers.updateGetHandler, handler_edit);
|
||||||
permissionHandlers.updateGetHandler,
|
|
||||||
handler_new);
|
|
||||||
|
|
||||||
|
router.post(
|
||||||
router.get("/:mapId",
|
"/doCreateMap",
|
||||||
handler_view);
|
|
||||||
|
|
||||||
|
|
||||||
router.get("/:mapId/edit",
|
|
||||||
permissionHandlers.updateGetHandler,
|
|
||||||
handler_edit);
|
|
||||||
|
|
||||||
|
|
||||||
router.post("/doCreateMap",
|
|
||||||
permissionHandlers.updatePostHandler,
|
permissionHandlers.updatePostHandler,
|
||||||
handler_doCreateMap);
|
handler_doCreateMap
|
||||||
|
);
|
||||||
|
|
||||||
|
router.post(
|
||||||
router.post("/doUpdateMap",
|
"/doUpdateMap",
|
||||||
permissionHandlers.updatePostHandler,
|
permissionHandlers.updatePostHandler,
|
||||||
handler_doUpdateMap);
|
handler_doUpdateMap
|
||||||
|
);
|
||||||
|
|
||||||
|
router.post(
|
||||||
router.post("/doDeleteMap",
|
"/doDeleteMap",
|
||||||
permissionHandlers.updatePostHandler,
|
permissionHandlers.updatePostHandler,
|
||||||
handler_doDeleteMap);
|
handler_doDeleteMap
|
||||||
|
);
|
||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
|
|
@ -4,23 +4,17 @@ import handler_reportName from "../handlers/reports-get/reportName.js";
|
||||||
|
|
||||||
import * as dateTimeFns from "@cityssm/expressjs-server-js/dateTimeFns.js";
|
import * as dateTimeFns from "@cityssm/expressjs-server-js/dateTimeFns.js";
|
||||||
|
|
||||||
|
|
||||||
export const router = Router();
|
export const router = Router();
|
||||||
|
|
||||||
|
|
||||||
router.get("/", (_request, response) => {
|
router.get("/", (_request, response) => {
|
||||||
|
|
||||||
const rightNow = new Date();
|
const rightNow = new Date();
|
||||||
|
|
||||||
response.render("report-search", {
|
response.render("report-search", {
|
||||||
headTitle: "Reports",
|
headTitle: "Reports",
|
||||||
todayDateString: dateTimeFns.dateToString(rightNow)
|
todayDateString: dateTimeFns.dateToString(rightNow)
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
router.all("/:reportName", handler_reportName);
|
router.all("/:reportName", handler_reportName);
|
||||||
|
|
||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,4 @@
|
||||||
import {
|
import { Router } from "express";
|
||||||
Router
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import * as permissionHandlers from "../handlers/permissions.js";
|
import * as permissionHandlers from "../handlers/permissions.js";
|
||||||
import * as configFunctions from "../helpers/functions.config.js";
|
import * as configFunctions from "../helpers/functions.config.js";
|
||||||
|
|
@ -10,20 +8,12 @@ import handler_doSearchWorkOrders from "../handlers/workOrders-post/doSearchWork
|
||||||
|
|
||||||
import handler_view from "../handlers/workOrders-get/view.js";
|
import handler_view from "../handlers/workOrders-get/view.js";
|
||||||
|
|
||||||
|
|
||||||
export const router = Router();
|
export const router = Router();
|
||||||
|
|
||||||
|
router.get("/", handler_search);
|
||||||
|
|
||||||
router.get("/",
|
router.post("/doSearchWorkOrders", handler_doSearchWorkOrders);
|
||||||
handler_search);
|
|
||||||
|
|
||||||
router.post("/doSearchWorkOrders",
|
|
||||||
handler_doSearchWorkOrders);
|
|
||||||
|
|
||||||
|
|
||||||
router.get("/:workOrderId",
|
|
||||||
handler_view);
|
|
||||||
|
|
||||||
|
|
||||||
|
router.get("/:workOrderId", handler_view);
|
||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
|
|
@ -42,13 +42,17 @@ function purgeTables() {
|
||||||
database.prepare("delete from LotOccupancies").run();
|
database.prepare("delete from LotOccupancies").run();
|
||||||
database.prepare("delete from LotComments").run();
|
database.prepare("delete from LotComments").run();
|
||||||
database.prepare("delete from Lots").run();
|
database.prepare("delete from Lots").run();
|
||||||
database.prepare("delete from sqlite_sequence where name in ('Lots', 'LotComments', 'LotOccupancies', 'LotOccupancyComments', 'WorkOrders', 'WorkOrderComments')").run();
|
database
|
||||||
|
.prepare("delete from sqlite_sequence where name in ('Lots', 'LotComments', 'LotOccupancies', 'LotOccupancyComments', 'WorkOrders', 'WorkOrderComments')")
|
||||||
|
.run();
|
||||||
database.close();
|
database.close();
|
||||||
}
|
}
|
||||||
function purgeConfigTables() {
|
function purgeConfigTables() {
|
||||||
const database = sqlite(databasePath);
|
const database = sqlite(databasePath);
|
||||||
database.prepare("delete from Maps").run();
|
database.prepare("delete from Maps").run();
|
||||||
database.prepare("delete from sqlite_sequence where name in ('Maps')").run();
|
database
|
||||||
|
.prepare("delete from sqlite_sequence where name in ('Maps')")
|
||||||
|
.run();
|
||||||
database.close();
|
database.close();
|
||||||
}
|
}
|
||||||
function getMapByMapDescription(mapDescription) {
|
function getMapByMapDescription(mapDescription) {
|
||||||
|
|
@ -56,29 +60,30 @@ function getMapByMapDescription(mapDescription) {
|
||||||
readonly: true
|
readonly: true
|
||||||
});
|
});
|
||||||
const map = database
|
const map = database
|
||||||
.prepare("select * from Maps" +
|
.prepare("select * from Maps" + " where mapDescription = ?")
|
||||||
" where mapDescription = ?")
|
|
||||||
.get(mapDescription);
|
.get(mapDescription);
|
||||||
database.close();
|
database.close();
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
function formatDateString(year, month, day) {
|
function formatDateString(year, month, day) {
|
||||||
return ("0000" + year).slice(-4) + "-" +
|
return (("0000" + year).slice(-4) +
|
||||||
("00" + month).slice(-2) + "-" +
|
"-" +
|
||||||
("00" + day).slice(-2);
|
("00" + month).slice(-2) +
|
||||||
|
"-" +
|
||||||
|
("00" + day).slice(-2));
|
||||||
}
|
}
|
||||||
const cemeteryToMapName = {
|
const cemeteryToMapName = {
|
||||||
"00": "Crematorium",
|
"00": "Crematorium",
|
||||||
"GC": "New Greenwood - Columbarium",
|
GC: "New Greenwood - Columbarium",
|
||||||
"HC": "Holy Sepulchre - Columbarium",
|
HC: "Holy Sepulchre - Columbarium",
|
||||||
"HS": "Holy Sepulchre",
|
HS: "Holy Sepulchre",
|
||||||
"MA": "Holy Sepulchre - Mausoleum",
|
MA: "Holy Sepulchre - Mausoleum",
|
||||||
"NG": "New Greenwood",
|
NG: "New Greenwood",
|
||||||
"NW": "Niche Wall",
|
NW: "Niche Wall",
|
||||||
"OG": "Old Greenwood",
|
OG: "Old Greenwood",
|
||||||
"PG": "Pine Grove",
|
PG: "Pine Grove",
|
||||||
"UG": "New Greenwood - Urn Garden",
|
UG: "New Greenwood - Urn Garden",
|
||||||
"WK": "West Korah"
|
WK: "West Korah"
|
||||||
};
|
};
|
||||||
const mapCache = new Map();
|
const mapCache = new Map();
|
||||||
function getMap(dataRow) {
|
function getMap(dataRow) {
|
||||||
|
|
@ -125,16 +130,19 @@ function getFeeIdByFeeDescription(feeDescription) {
|
||||||
return feeCache.get(feeDescription);
|
return feeCache.get(feeDescription);
|
||||||
}
|
}
|
||||||
function buildLotName(lotNamePieces) {
|
function buildLotName(lotNamePieces) {
|
||||||
return lotNamePieces.cemetery + "-" +
|
return (lotNamePieces.cemetery +
|
||||||
|
"-" +
|
||||||
(lotNamePieces.block === "" ? "" : lotNamePieces.block + "-") +
|
(lotNamePieces.block === "" ? "" : lotNamePieces.block + "-") +
|
||||||
(lotNamePieces.range1 === "0" && lotNamePieces.range2 === "" ?
|
(lotNamePieces.range1 === "0" && lotNamePieces.range2 === ""
|
||||||
"" :
|
? ""
|
||||||
(lotNamePieces.range1 + lotNamePieces.range2) + "-") +
|
: lotNamePieces.range1 + lotNamePieces.range2 + "-") +
|
||||||
(lotNamePieces.lot1 === "0" && lotNamePieces.lot2 === "" ?
|
(lotNamePieces.lot1 === "0" && lotNamePieces.lot2 === ""
|
||||||
"" :
|
? ""
|
||||||
lotNamePieces.lot1 + lotNamePieces.lot2 + "-") +
|
: lotNamePieces.lot1 + lotNamePieces.lot2 + "-") +
|
||||||
lotNamePieces.grave1 + lotNamePieces.grave2 + "-" +
|
lotNamePieces.grave1 +
|
||||||
lotNamePieces.interment;
|
lotNamePieces.grave2 +
|
||||||
|
"-" +
|
||||||
|
lotNamePieces.interment);
|
||||||
}
|
}
|
||||||
const casketLotType = cacheFunctions.getLotTypesByLotType("Casket Grave");
|
const casketLotType = cacheFunctions.getLotTypesByLotType("Casket Grave");
|
||||||
const columbariumLotType = cacheFunctions.getLotTypesByLotType("Columbarium");
|
const columbariumLotType = cacheFunctions.getLotTypesByLotType("Columbarium");
|
||||||
|
|
@ -219,16 +227,21 @@ function importFromMasterCSV() {
|
||||||
if (masterRow.CM_PRENEED_ORDER) {
|
if (masterRow.CM_PRENEED_ORDER) {
|
||||||
preneedOccupancyStartDateString = formatDateString(masterRow.CM_PURCHASE_YR, masterRow.CM_PURCHASE_MON, masterRow.CM_PURCHASE_DAY);
|
preneedOccupancyStartDateString = formatDateString(masterRow.CM_PURCHASE_YR, masterRow.CM_PURCHASE_MON, masterRow.CM_PURCHASE_DAY);
|
||||||
let occupancyEndDateString = "";
|
let occupancyEndDateString = "";
|
||||||
if (masterRow.CM_INTERMENT_YR !== "" && masterRow.CM_INTERMENT_YR !== "0") {
|
if (masterRow.CM_INTERMENT_YR !== "" &&
|
||||||
|
masterRow.CM_INTERMENT_YR !== "0") {
|
||||||
occupancyEndDateString = formatDateString(masterRow.CM_INTERMENT_YR, masterRow.CM_INTERMENT_MON, masterRow.CM_INTERMENT_DAY);
|
occupancyEndDateString = formatDateString(masterRow.CM_INTERMENT_YR, masterRow.CM_INTERMENT_MON, masterRow.CM_INTERMENT_DAY);
|
||||||
}
|
}
|
||||||
if (preneedOccupancyStartDateString === "0000-00-00" && occupancyEndDateString !== "") {
|
if (preneedOccupancyStartDateString === "0000-00-00" &&
|
||||||
|
occupancyEndDateString !== "") {
|
||||||
preneedOccupancyStartDateString = occupancyEndDateString;
|
preneedOccupancyStartDateString = occupancyEndDateString;
|
||||||
}
|
}
|
||||||
if (preneedOccupancyStartDateString === "0000-00-00" && masterRow.CM_DEATH_YR !== "" && masterRow.CM_DEATH_YR !== "0") {
|
if (preneedOccupancyStartDateString === "0000-00-00" &&
|
||||||
|
masterRow.CM_DEATH_YR !== "" &&
|
||||||
|
masterRow.CM_DEATH_YR !== "0") {
|
||||||
preneedOccupancyStartDateString = formatDateString(masterRow.CM_DEATH_YR, masterRow.CM_DEATH_MON, masterRow.CM_DEATH_DAY);
|
preneedOccupancyStartDateString = formatDateString(masterRow.CM_DEATH_YR, masterRow.CM_DEATH_MON, masterRow.CM_DEATH_DAY);
|
||||||
}
|
}
|
||||||
if (preneedOccupancyStartDateString === "" || preneedOccupancyStartDateString === "0000-00-00") {
|
if (preneedOccupancyStartDateString === "" ||
|
||||||
|
preneedOccupancyStartDateString === "0000-00-00") {
|
||||||
preneedOccupancyStartDateString = "0001-01-01";
|
preneedOccupancyStartDateString = "0001-01-01";
|
||||||
}
|
}
|
||||||
preneedLotOccupancyId = addLotOccupancy({
|
preneedLotOccupancyId = addLotOccupancy({
|
||||||
|
|
@ -238,7 +251,9 @@ function importFromMasterCSV() {
|
||||||
occupancyEndDateString,
|
occupancyEndDateString,
|
||||||
occupancyTypeFieldIds: ""
|
occupancyTypeFieldIds: ""
|
||||||
}, user);
|
}, user);
|
||||||
const occupantPostalCode = ((masterRow.CM_POST1 || "") + " " + (masterRow.CM_POST2 || "")).trim();
|
const occupantPostalCode = ((masterRow.CM_POST1 || "") +
|
||||||
|
" " +
|
||||||
|
(masterRow.CM_POST2 || "")).trim();
|
||||||
addLotOccupancyOccupant({
|
addLotOccupancyOccupant({
|
||||||
lotOccupancyId: preneedLotOccupancyId,
|
lotOccupancyId: preneedLotOccupancyId,
|
||||||
lotOccupantTypeId: preneedOwnerLotOccupantType.lotOccupantTypeId,
|
lotOccupantTypeId: preneedOwnerLotOccupantType.lotOccupantTypeId,
|
||||||
|
|
@ -275,20 +290,27 @@ function importFromMasterCSV() {
|
||||||
if (masterRow.CM_DECEASED_NAME) {
|
if (masterRow.CM_DECEASED_NAME) {
|
||||||
deceasedOccupancyStartDateString = formatDateString(masterRow.CM_INTERMENT_YR, masterRow.CM_INTERMENT_MON, masterRow.CM_INTERMENT_DAY);
|
deceasedOccupancyStartDateString = formatDateString(masterRow.CM_INTERMENT_YR, masterRow.CM_INTERMENT_MON, masterRow.CM_INTERMENT_DAY);
|
||||||
const occupancyEndDateString = "";
|
const occupancyEndDateString = "";
|
||||||
if (deceasedOccupancyStartDateString === "0000-00-00" && masterRow.CM_DEATH_YR !== "" && masterRow.CM_DEATH_YR !== "0") {
|
if (deceasedOccupancyStartDateString === "0000-00-00" &&
|
||||||
|
masterRow.CM_DEATH_YR !== "" &&
|
||||||
|
masterRow.CM_DEATH_YR !== "0") {
|
||||||
deceasedOccupancyStartDateString = formatDateString(masterRow.CM_DEATH_YR, masterRow.CM_DEATH_MON, masterRow.CM_DEATH_DAY);
|
deceasedOccupancyStartDateString = formatDateString(masterRow.CM_DEATH_YR, masterRow.CM_DEATH_MON, masterRow.CM_DEATH_DAY);
|
||||||
}
|
}
|
||||||
if (deceasedOccupancyStartDateString === "" || deceasedOccupancyStartDateString === "0000-00-00") {
|
if (deceasedOccupancyStartDateString === "" ||
|
||||||
|
deceasedOccupancyStartDateString === "0000-00-00") {
|
||||||
deceasedOccupancyStartDateString = "0001-01-01";
|
deceasedOccupancyStartDateString = "0001-01-01";
|
||||||
}
|
}
|
||||||
deceasedLotOccupancyId = addLotOccupancy({
|
deceasedLotOccupancyId = addLotOccupancy({
|
||||||
occupancyTypeId: lotId ? deceasedOccupancyType.occupancyTypeId : cremationOccupancyType.occupancyTypeId,
|
occupancyTypeId: lotId
|
||||||
|
? deceasedOccupancyType.occupancyTypeId
|
||||||
|
: cremationOccupancyType.occupancyTypeId,
|
||||||
lotId,
|
lotId,
|
||||||
occupancyStartDateString: deceasedOccupancyStartDateString,
|
occupancyStartDateString: deceasedOccupancyStartDateString,
|
||||||
occupancyEndDateString,
|
occupancyEndDateString,
|
||||||
occupancyTypeFieldIds: ""
|
occupancyTypeFieldIds: ""
|
||||||
}, user);
|
}, user);
|
||||||
const deceasedPostalCode = ((masterRow.CM_POST1 || "") + " " + (masterRow.CM_POST2 || "")).trim();
|
const deceasedPostalCode = ((masterRow.CM_POST1 || "") +
|
||||||
|
" " +
|
||||||
|
(masterRow.CM_POST2 || "")).trim();
|
||||||
addLotOccupancyOccupant({
|
addLotOccupancyOccupant({
|
||||||
lotOccupancyId: deceasedLotOccupancyId,
|
lotOccupancyId: deceasedLotOccupancyId,
|
||||||
lotOccupantTypeId: deceasedLotOccupantType.lotOccupantTypeId,
|
lotOccupantTypeId: deceasedLotOccupantType.lotOccupantTypeId,
|
||||||
|
|
@ -305,7 +327,8 @@ function importFromMasterCSV() {
|
||||||
addOrUpdateLotOccupancyField({
|
addOrUpdateLotOccupancyField({
|
||||||
lotOccupancyId: deceasedLotOccupancyId,
|
lotOccupancyId: deceasedLotOccupancyId,
|
||||||
occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => {
|
occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => {
|
||||||
return occupancyTypeField.occupancyTypeField === "Death Date";
|
return (occupancyTypeField.occupancyTypeField ===
|
||||||
|
"Death Date");
|
||||||
}).occupancyTypeFieldId,
|
}).occupancyTypeFieldId,
|
||||||
lotOccupancyFieldValue
|
lotOccupancyFieldValue
|
||||||
}, user);
|
}, user);
|
||||||
|
|
@ -314,7 +337,8 @@ function importFromMasterCSV() {
|
||||||
addOrUpdateLotOccupancyField({
|
addOrUpdateLotOccupancyField({
|
||||||
lotOccupancyId: deceasedLotOccupancyId,
|
lotOccupancyId: deceasedLotOccupancyId,
|
||||||
occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => {
|
occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => {
|
||||||
return occupancyTypeField.occupancyTypeField === "Death Age";
|
return (occupancyTypeField.occupancyTypeField ===
|
||||||
|
"Death Age");
|
||||||
}).occupancyTypeFieldId,
|
}).occupancyTypeFieldId,
|
||||||
lotOccupancyFieldValue: masterRow.CM_AGE
|
lotOccupancyFieldValue: masterRow.CM_AGE
|
||||||
}, user);
|
}, user);
|
||||||
|
|
@ -323,7 +347,8 @@ function importFromMasterCSV() {
|
||||||
addOrUpdateLotOccupancyField({
|
addOrUpdateLotOccupancyField({
|
||||||
lotOccupancyId: deceasedLotOccupancyId,
|
lotOccupancyId: deceasedLotOccupancyId,
|
||||||
occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => {
|
occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => {
|
||||||
return occupancyTypeField.occupancyTypeField === "Death Age Period";
|
return (occupancyTypeField.occupancyTypeField ===
|
||||||
|
"Death Age Period");
|
||||||
}).occupancyTypeFieldId,
|
}).occupancyTypeFieldId,
|
||||||
lotOccupancyFieldValue: masterRow.CM_PERIOD
|
lotOccupancyFieldValue: masterRow.CM_PERIOD
|
||||||
}, user);
|
}, user);
|
||||||
|
|
@ -332,7 +357,8 @@ function importFromMasterCSV() {
|
||||||
addOrUpdateLotOccupancyField({
|
addOrUpdateLotOccupancyField({
|
||||||
lotOccupancyId: deceasedLotOccupancyId,
|
lotOccupancyId: deceasedLotOccupancyId,
|
||||||
occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => {
|
occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => {
|
||||||
return occupancyTypeField.occupancyTypeField === "Funeral Home";
|
return (occupancyTypeField.occupancyTypeField ===
|
||||||
|
"Funeral Home");
|
||||||
}).occupancyTypeFieldId,
|
}).occupancyTypeFieldId,
|
||||||
lotOccupancyFieldValue: masterRow.CM_FUNERAL_HOME
|
lotOccupancyFieldValue: masterRow.CM_FUNERAL_HOME
|
||||||
}, user);
|
}, user);
|
||||||
|
|
@ -342,7 +368,8 @@ function importFromMasterCSV() {
|
||||||
addOrUpdateLotOccupancyField({
|
addOrUpdateLotOccupancyField({
|
||||||
lotOccupancyId: deceasedLotOccupancyId,
|
lotOccupancyId: deceasedLotOccupancyId,
|
||||||
occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => {
|
occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => {
|
||||||
return occupancyTypeField.occupancyTypeField === "Funeral Date";
|
return (occupancyTypeField.occupancyTypeField ===
|
||||||
|
"Funeral Date");
|
||||||
}).occupancyTypeFieldId,
|
}).occupancyTypeFieldId,
|
||||||
lotOccupancyFieldValue
|
lotOccupancyFieldValue
|
||||||
}, user);
|
}, user);
|
||||||
|
|
@ -351,7 +378,8 @@ function importFromMasterCSV() {
|
||||||
addOrUpdateLotOccupancyField({
|
addOrUpdateLotOccupancyField({
|
||||||
lotOccupancyId: deceasedLotOccupancyId,
|
lotOccupancyId: deceasedLotOccupancyId,
|
||||||
occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => {
|
occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => {
|
||||||
return occupancyTypeField.occupancyTypeField === "Container Type";
|
return (occupancyTypeField.occupancyTypeField ===
|
||||||
|
"Container Type");
|
||||||
}).occupancyTypeFieldId,
|
}).occupancyTypeFieldId,
|
||||||
lotOccupancyFieldValue: masterRow.CM_CONTAINER_TYPE
|
lotOccupancyFieldValue: masterRow.CM_CONTAINER_TYPE
|
||||||
}, user);
|
}, user);
|
||||||
|
|
@ -364,7 +392,8 @@ function importFromMasterCSV() {
|
||||||
addOrUpdateLotOccupancyField({
|
addOrUpdateLotOccupancyField({
|
||||||
lotOccupancyId: deceasedLotOccupancyId,
|
lotOccupancyId: deceasedLotOccupancyId,
|
||||||
occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => {
|
occupancyTypeFieldId: deceasedOccupancyType.occupancyTypeFields.find((occupancyTypeField) => {
|
||||||
return occupancyTypeField.occupancyTypeField === "Committal Type";
|
return (occupancyTypeField.occupancyTypeField ===
|
||||||
|
"Committal Type");
|
||||||
}).occupancyTypeFieldId,
|
}).occupancyTypeFieldId,
|
||||||
lotOccupancyFieldValue: commitalType
|
lotOccupancyFieldValue: commitalType
|
||||||
}, user);
|
}, user);
|
||||||
|
|
@ -392,7 +421,8 @@ function importFromMasterCSV() {
|
||||||
workOrderNumber: masterRow.CM_WORK_ORDER,
|
workOrderNumber: masterRow.CM_WORK_ORDER,
|
||||||
workOrderTypeId: 1,
|
workOrderTypeId: 1,
|
||||||
workOrderDescription: "",
|
workOrderDescription: "",
|
||||||
workOrderOpenDateString: deceasedOccupancyStartDateString || preneedOccupancyStartDateString
|
workOrderOpenDateString: deceasedOccupancyStartDateString ||
|
||||||
|
preneedOccupancyStartDateString
|
||||||
}, user);
|
}, user);
|
||||||
if (lotId) {
|
if (lotId) {
|
||||||
addWorkOrderLot({
|
addWorkOrderLot({
|
||||||
|
|
@ -499,7 +529,8 @@ function importFromPrepaidCSV() {
|
||||||
offset: 0
|
offset: 0
|
||||||
});
|
});
|
||||||
if (possibleLotOccupancies.lotOccupancies.length > 0) {
|
if (possibleLotOccupancies.lotOccupancies.length > 0) {
|
||||||
lotOccupancyId = possibleLotOccupancies.lotOccupancies[0].lotOccupancyId;
|
lotOccupancyId =
|
||||||
|
possibleLotOccupancies.lotOccupancies[0].lotOccupancyId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!lotOccupancyId) {
|
if (!lotOccupancyId) {
|
||||||
|
|
@ -597,7 +628,8 @@ function importFromPrepaidCSV() {
|
||||||
taxAmount: prepaidRow.CMPP_GST_NICHE
|
taxAmount: prepaidRow.CMPP_GST_NICHE
|
||||||
}, user);
|
}, user);
|
||||||
}
|
}
|
||||||
if (prepaidRow.CMPP_FEE_DISINTERMENT !== "0.0" && prepaidRow.CMPP_FEE_DISINTERMENT !== "20202.02") {
|
if (prepaidRow.CMPP_FEE_DISINTERMENT !== "0.0" &&
|
||||||
|
prepaidRow.CMPP_FEE_DISINTERMENT !== "20202.02") {
|
||||||
addLotOccupancyFee({
|
addLotOccupancyFee({
|
||||||
lotOccupancyId,
|
lotOccupancyId,
|
||||||
feeId: getFeeIdByFeeDescription("CMPP_FEE_DISINTERMENT"),
|
feeId: getFeeIdByFeeDescription("CMPP_FEE_DISINTERMENT"),
|
||||||
|
|
@ -620,8 +652,12 @@ function importFromPrepaidCSV() {
|
||||||
Number.parseFloat(prepaidRow.CMPP_GST_CREM) +
|
Number.parseFloat(prepaidRow.CMPP_GST_CREM) +
|
||||||
Number.parseFloat(prepaidRow.CMPP_FEE_NICHE) +
|
Number.parseFloat(prepaidRow.CMPP_FEE_NICHE) +
|
||||||
Number.parseFloat(prepaidRow.CMPP_GST_NICHE) +
|
Number.parseFloat(prepaidRow.CMPP_GST_NICHE) +
|
||||||
Number.parseFloat(prepaidRow.CMPP_FEE_DISINTERMENT === "20202.02" ? "0" : prepaidRow.CMPP_FEE_DISINTERMENT) +
|
Number.parseFloat(prepaidRow.CMPP_FEE_DISINTERMENT === "20202.02"
|
||||||
Number.parseFloat(prepaidRow.CMPP_GST_DISINTERMENT === "20202.02" ? "0" : prepaidRow.CMPP_GST_DISINTERMENT);
|
? "0"
|
||||||
|
: prepaidRow.CMPP_FEE_DISINTERMENT) +
|
||||||
|
Number.parseFloat(prepaidRow.CMPP_GST_DISINTERMENT === "20202.02"
|
||||||
|
? "0"
|
||||||
|
: prepaidRow.CMPP_GST_DISINTERMENT);
|
||||||
addLotOccupancyTransaction({
|
addLotOccupancyTransaction({
|
||||||
lotOccupancyId,
|
lotOccupancyId,
|
||||||
externalReceiptNumber: prepaidRow.CMPP_ORDER_NO,
|
externalReceiptNumber: prepaidRow.CMPP_ORDER_NO,
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -25,7 +25,8 @@ describe("lot-occupancy-system", () => {
|
||||||
describe("Cypress tests", () => {
|
describe("Cypress tests", () => {
|
||||||
it("should run Cypress tests", (done) => {
|
it("should run Cypress tests", (done) => {
|
||||||
let cypressCommand = "cypress run --config-file cypress.config.ts --browser chrome";
|
let cypressCommand = "cypress run --config-file cypress.config.ts --browser chrome";
|
||||||
if (process.env.CYPRESS_RECORD_KEY && process.env.CYPRESS_RECORD_KEY !== "") {
|
if (process.env.CYPRESS_RECORD_KEY &&
|
||||||
|
process.env.CYPRESS_RECORD_KEY !== "") {
|
||||||
cypressCommand += " --record";
|
cypressCommand += " --record";
|
||||||
}
|
}
|
||||||
const childProcess = exec(cypressCommand);
|
const childProcess = exec(cypressCommand);
|
||||||
|
|
|
||||||
|
|
@ -2,28 +2,19 @@
|
||||||
|
|
||||||
import * as assert from "assert";
|
import * as assert from "assert";
|
||||||
|
|
||||||
import {
|
import { portNumber } from "./_globals.js";
|
||||||
portNumber
|
|
||||||
} from "./_globals.js";
|
|
||||||
|
|
||||||
import {
|
import { exec } from "child_process";
|
||||||
exec
|
|
||||||
} from "child_process";
|
|
||||||
|
|
||||||
import * as http from "http";
|
import * as http from "http";
|
||||||
import {
|
import { app } from "../app.js";
|
||||||
app
|
|
||||||
} from "../app.js";
|
|
||||||
|
|
||||||
|
|
||||||
describe("lot-occupancy-system", () => {
|
describe("lot-occupancy-system", () => {
|
||||||
|
|
||||||
const httpServer = http.createServer(app);
|
const httpServer = http.createServer(app);
|
||||||
|
|
||||||
let serverStarted = false;
|
let serverStarted = false;
|
||||||
|
|
||||||
before(() => {
|
before(() => {
|
||||||
|
|
||||||
httpServer.listen(portNumber);
|
httpServer.listen(portNumber);
|
||||||
|
|
||||||
httpServer.on("listening", () => {
|
httpServer.on("listening", () => {
|
||||||
|
|
@ -44,12 +35,14 @@ describe("lot-occupancy-system", () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("Cypress tests", () => {
|
describe("Cypress tests", () => {
|
||||||
|
|
||||||
it("should run Cypress tests", (done) => {
|
it("should run Cypress tests", (done) => {
|
||||||
|
let cypressCommand =
|
||||||
|
"cypress run --config-file cypress.config.ts --browser chrome";
|
||||||
|
|
||||||
let cypressCommand = "cypress run --config-file cypress.config.ts --browser chrome";
|
if (
|
||||||
|
process.env.CYPRESS_RECORD_KEY &&
|
||||||
if (process.env.CYPRESS_RECORD_KEY && process.env.CYPRESS_RECORD_KEY !== "") {
|
process.env.CYPRESS_RECORD_KEY !== ""
|
||||||
|
) {
|
||||||
cypressCommand += " --record";
|
cypressCommand += " --record";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,20 +1,13 @@
|
||||||
import type {
|
import type { Request } from "express";
|
||||||
Request
|
|
||||||
} from "express";
|
|
||||||
|
|
||||||
import type {
|
|
||||||
Session
|
|
||||||
} from "express-session";
|
|
||||||
|
|
||||||
|
import type { Session } from "express-session";
|
||||||
|
|
||||||
export const testView = "*testView";
|
export const testView = "*testView";
|
||||||
export const testUpdate = "*testUpdate";
|
export const testUpdate = "*testUpdate";
|
||||||
export const testAdmin = "*testAdmin";
|
export const testAdmin = "*testAdmin";
|
||||||
|
|
||||||
|
|
||||||
export const portNumber = 7000;
|
export const portNumber = 7000;
|
||||||
|
|
||||||
|
|
||||||
export const fakeViewOnlySession: Session = {
|
export const fakeViewOnlySession: Session = {
|
||||||
id: "",
|
id: "",
|
||||||
cookie: undefined,
|
cookie: undefined,
|
||||||
|
|
@ -27,7 +20,6 @@ export const fakeViewOnlySession: Session = {
|
||||||
user: undefined
|
user: undefined
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export const fakeAdminSession: Session = {
|
export const fakeAdminSession: Session = {
|
||||||
id: "",
|
id: "",
|
||||||
cookie: undefined,
|
cookie: undefined,
|
||||||
|
|
@ -40,7 +32,6 @@ export const fakeAdminSession: Session = {
|
||||||
user: undefined
|
user: undefined
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export const fakeRequest: Request = {
|
export const fakeRequest: Request = {
|
||||||
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
||||||
async *[Symbol.asyncIterator]() {},
|
async *[Symbol.asyncIterator]() {},
|
||||||
|
|
@ -132,14 +123,10 @@ export const fakeRequest: Request = {
|
||||||
xhr: undefined
|
xhr: undefined
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const fakeViewOnlyRequest = Object.assign({}, fakeRequest, {
|
||||||
export const fakeViewOnlyRequest =
|
|
||||||
Object.assign({}, fakeRequest, {
|
|
||||||
session: fakeViewOnlySession
|
session: fakeViewOnlySession
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const fakeAdminRequest = Object.assign({}, fakeRequest, {
|
||||||
export const fakeAdminRequest =
|
|
||||||
Object.assign({}, fakeRequest, {
|
|
||||||
session: fakeAdminSession
|
session: fakeAdminSession
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -2,13 +2,9 @@ import * as assert from "assert";
|
||||||
|
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
|
|
||||||
import {
|
import { version } from "../version.js";
|
||||||
version
|
|
||||||
} from "../version.js";
|
|
||||||
|
|
||||||
|
|
||||||
describe("version", () => {
|
describe("version", () => {
|
||||||
|
|
||||||
it("has a version that matches the package.json", () => {
|
it("has a version that matches the package.json", () => {
|
||||||
const packageJSON = JSON.parse(fs.readFileSync("package.json", "utf8"));
|
const packageJSON = JSON.parse(fs.readFileSync("package.json", "utf8"));
|
||||||
assert.strictEqual(version, packageJSON.version);
|
assert.strictEqual(version, packageJSON.version);
|
||||||
|
|
|
||||||
|
|
@ -1,68 +1,66 @@
|
||||||
export interface Config {
|
export interface Config {
|
||||||
application ? : ConfigApplication;
|
application?: ConfigApplication;
|
||||||
session ? : ConfigSession;
|
session?: ConfigSession;
|
||||||
reverseProxy ? : {
|
reverseProxy?: {
|
||||||
disableCompression: boolean;
|
disableCompression: boolean;
|
||||||
disableEtag: boolean;
|
disableEtag: boolean;
|
||||||
urlPrefix: string;
|
urlPrefix: string;
|
||||||
};
|
};
|
||||||
activeDirectory ? : ConfigActiveDirectory;
|
activeDirectory?: ConfigActiveDirectory;
|
||||||
users ? : {
|
users?: {
|
||||||
testing ? : string[];
|
testing?: string[];
|
||||||
canLogin ? : string[];
|
canLogin?: string[];
|
||||||
canUpdate ? : string[];
|
canUpdate?: string[];
|
||||||
isAdmin ? : string[];
|
isAdmin?: string[];
|
||||||
};
|
};
|
||||||
aliases ? : {
|
aliases?: {
|
||||||
lot ? : string;
|
lot?: string;
|
||||||
lots ? : string;
|
lots?: string;
|
||||||
map ? : string;
|
map?: string;
|
||||||
maps ? : string;
|
maps?: string;
|
||||||
occupancy ? : string;
|
occupancy?: string;
|
||||||
occupancies ? : string;
|
occupancies?: string;
|
||||||
occupant ? : string;
|
occupant?: string;
|
||||||
occupants ? : string;
|
occupants?: string;
|
||||||
externalReceiptNumber ? : string;
|
externalReceiptNumber?: string;
|
||||||
};
|
};
|
||||||
settings ? : {
|
settings?: {
|
||||||
fees ? : {
|
fees?: {
|
||||||
taxPercentageDefault ? : number;
|
taxPercentageDefault?: number;
|
||||||
};
|
};
|
||||||
map ? : {
|
map?: {
|
||||||
mapCityDefault ? : string;
|
mapCityDefault?: string;
|
||||||
mapProvinceDefault ? : string;
|
mapProvinceDefault?: string;
|
||||||
};
|
};
|
||||||
lot ? : {
|
lot?: {
|
||||||
lotNamePattern ? : RegExp;
|
lotNamePattern?: RegExp;
|
||||||
lotNameSortNameFunction ? : (lotName: string) => string;
|
lotNameSortNameFunction?: (lotName: string) => string;
|
||||||
};
|
};
|
||||||
lotOccupancy ? : {
|
lotOccupancy?: {
|
||||||
lotIdIsRequired ? : boolean;
|
lotIdIsRequired?: boolean;
|
||||||
occupancyEndDateIsRequired ? : boolean;
|
occupancyEndDateIsRequired?: boolean;
|
||||||
occupantCityDefault ? : string;
|
occupantCityDefault?: string;
|
||||||
occupantProvinceDefault ? : string;
|
occupantProvinceDefault?: string;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ConfigApplication {
|
interface ConfigApplication {
|
||||||
applicationName ? : string;
|
applicationName?: string;
|
||||||
backgroundURL ? : string;
|
backgroundURL?: string;
|
||||||
logoURL ? : string;
|
logoURL?: string;
|
||||||
httpPort ? : number;
|
httpPort?: number;
|
||||||
userDomain ? : string;
|
userDomain?: string;
|
||||||
useTestDatabases ? : boolean;
|
useTestDatabases?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
interface ConfigSession {
|
interface ConfigSession {
|
||||||
cookieName ? : string;
|
cookieName?: string;
|
||||||
secret ? : string;
|
secret?: string;
|
||||||
maxAgeMillis ? : number;
|
maxAgeMillis?: number;
|
||||||
doKeepAlive ? : boolean;
|
doKeepAlive?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export interface ConfigActiveDirectory {
|
export interface ConfigActiveDirectory {
|
||||||
url: string;
|
url: string;
|
||||||
baseDN: string;
|
baseDN: string;
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1 @@
|
||||||
"use strict";
|
export {};
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,9 @@
|
||||||
export interface LOS {
|
export interface LOS {
|
||||||
highlightMap: (mapContainerElement: HTMLElement, mapKey: string, contextualClass: "success" | "danger") => void;
|
highlightMap: (
|
||||||
|
mapContainerElement: HTMLElement,
|
||||||
|
mapKey: string,
|
||||||
|
contextualClass: "success" | "danger"
|
||||||
|
) => void;
|
||||||
initializeUnlockFieldButtons: (containerElement: HTMLElement) => void;
|
initializeUnlockFieldButtons: (containerElement: HTMLElement) => void;
|
||||||
populateAliases: (containerElement: HTMLElement) => void;
|
populateAliases: (containerElement: HTMLElement) => void;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1 @@
|
||||||
"use strict";
|
export {};
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
|
|
|
||||||
|
|
@ -1,327 +1,303 @@
|
||||||
export interface Record {
|
export interface Record {
|
||||||
recordCreate_userName ? : string;
|
recordCreate_userName?: string;
|
||||||
recordCreate_timeMillis ? : number;
|
recordCreate_timeMillis?: number;
|
||||||
recordCreate_dateString ? : string;
|
recordCreate_dateString?: string;
|
||||||
|
|
||||||
recordUpdate_userName ? : string;
|
recordUpdate_userName?: string;
|
||||||
recordUpdate_timeMillis ? : number;
|
recordUpdate_timeMillis?: number;
|
||||||
recordUpdate_dateString ? : string;
|
recordUpdate_dateString?: string;
|
||||||
recordUpdate_timeString ? : string;
|
recordUpdate_timeString?: string;
|
||||||
|
|
||||||
recordDelete_userName ? : string;
|
recordDelete_userName?: string;
|
||||||
recordDelete_timeMillis ? : number;
|
recordDelete_timeMillis?: number;
|
||||||
recordDelete_dateString ? : string;
|
recordDelete_dateString?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* LOT OCCUPANCY DB TYPES
|
* LOT OCCUPANCY DB TYPES
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
export interface Map extends Record {
|
export interface Map extends Record {
|
||||||
mapId ? : number;
|
mapId?: number;
|
||||||
mapName ? : string;
|
mapName?: string;
|
||||||
mapDescription ? : string;
|
mapDescription?: string;
|
||||||
|
|
||||||
mapLatitude ? : number;
|
mapLatitude?: number;
|
||||||
mapLongitude ? : number;
|
mapLongitude?: number;
|
||||||
mapSVG ? : string;
|
mapSVG?: string;
|
||||||
|
|
||||||
mapAddress1 ? : string;
|
mapAddress1?: string;
|
||||||
mapAddress2 ? : string;
|
mapAddress2?: string;
|
||||||
mapCity ? : string;
|
mapCity?: string;
|
||||||
mapProvince ? : string;
|
mapProvince?: string;
|
||||||
mapPostalCode ? : string;
|
mapPostalCode?: string;
|
||||||
mapPhoneNumber ? : string;
|
mapPhoneNumber?: string;
|
||||||
|
|
||||||
lotCount ? : number;
|
lotCount?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export interface LotType extends Record {
|
export interface LotType extends Record {
|
||||||
lotTypeId ? : number;
|
lotTypeId?: number;
|
||||||
lotType ? : string;
|
lotType?: string;
|
||||||
orderNumber ? : number;
|
orderNumber?: number;
|
||||||
lotTypeFields ? : LotTypeField[];
|
lotTypeFields?: LotTypeField[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export interface LotTypeField extends Record {
|
export interface LotTypeField extends Record {
|
||||||
lotTypeFieldId ? : number;
|
lotTypeFieldId?: number;
|
||||||
lotTypeField ? : string;
|
lotTypeField?: string;
|
||||||
|
|
||||||
lotTypeId ? : number;
|
lotTypeId?: number;
|
||||||
lotType: LotType;
|
lotType: LotType;
|
||||||
|
|
||||||
lotTypeFieldValues ? : string;
|
lotTypeFieldValues?: string;
|
||||||
isRequired ? : boolean;
|
isRequired?: boolean;
|
||||||
pattern ? : string;
|
pattern?: string;
|
||||||
minimumLength ? : number;
|
minimumLength?: number;
|
||||||
maximumLength ? : number;
|
maximumLength?: number;
|
||||||
|
|
||||||
orderNumber ? : number;
|
orderNumber?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export interface LotStatus extends Record {
|
export interface LotStatus extends Record {
|
||||||
lotStatusId ? : number;
|
lotStatusId?: number;
|
||||||
lotStatus ? : string;
|
lotStatus?: string;
|
||||||
orderNumber ? : number;
|
orderNumber?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export interface Lot extends Record {
|
export interface Lot extends Record {
|
||||||
lotId ? : number;
|
lotId?: number;
|
||||||
lotName ? : string;
|
lotName?: string;
|
||||||
|
|
||||||
lotTypeId ? : number;
|
lotTypeId?: number;
|
||||||
lotType ? : LotType | string;
|
lotType?: LotType | string;
|
||||||
|
|
||||||
mapId ? : number;
|
mapId?: number;
|
||||||
mapName ? : string;
|
mapName?: string;
|
||||||
map ? : Map;
|
map?: Map;
|
||||||
mapSVG ? : string;
|
mapSVG?: string;
|
||||||
mapKey ? : string;
|
mapKey?: string;
|
||||||
|
|
||||||
lotLatitude ? : number;
|
lotLatitude?: number;
|
||||||
lotLongitude ? : number;
|
lotLongitude?: number;
|
||||||
|
|
||||||
lotStatusId ? : number;
|
lotStatusId?: number;
|
||||||
lotStatus ? : LotStatus | string;
|
lotStatus?: LotStatus | string;
|
||||||
|
|
||||||
lotOccupancyCount ? : number;
|
lotOccupancyCount?: number;
|
||||||
lotOccupancies ? : LotOccupancy[];
|
lotOccupancies?: LotOccupancy[];
|
||||||
|
|
||||||
lotComments ? : LotComment[];
|
lotComments?: LotComment[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export interface LotComment extends Record {
|
export interface LotComment extends Record {
|
||||||
lotCommentId ? : number;
|
lotCommentId?: number;
|
||||||
lotId ? : number;
|
lotId?: number;
|
||||||
|
|
||||||
lotCommentDate ? : number;
|
lotCommentDate?: number;
|
||||||
lotCommentDateString ? : string;
|
lotCommentDateString?: string;
|
||||||
|
|
||||||
lotCommentTime ? : number;
|
lotCommentTime?: number;
|
||||||
lotCommentTimeString ? : string;
|
lotCommentTimeString?: string;
|
||||||
|
|
||||||
lotComment ? : string;
|
lotComment?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export interface OccupancyType extends Record {
|
export interface OccupancyType extends Record {
|
||||||
occupancyTypeId ? : number;
|
occupancyTypeId?: number;
|
||||||
occupancyType ? : string;
|
occupancyType?: string;
|
||||||
orderNumber ? : number;
|
orderNumber?: number;
|
||||||
occupancyTypeFields ? : OccupancyTypeField[];
|
occupancyTypeFields?: OccupancyTypeField[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export interface OccupancyTypeField {
|
export interface OccupancyTypeField {
|
||||||
occupancyTypeFieldId ? : number;
|
occupancyTypeFieldId?: number;
|
||||||
occupancyTypeId ? : number;
|
occupancyTypeId?: number;
|
||||||
occupancyTypeField ? : string;
|
occupancyTypeField?: string;
|
||||||
occupancyTypeFieldValues ? : string;
|
occupancyTypeFieldValues?: string;
|
||||||
isRequired ? : boolean;
|
isRequired?: boolean;
|
||||||
pattern ? : string;
|
pattern?: string;
|
||||||
minimumLength ? : number;
|
minimumLength?: number;
|
||||||
maximumLength ? : number;
|
maximumLength?: number;
|
||||||
orderNumber ? : number;
|
orderNumber?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export interface LotOccupantType extends Record {
|
export interface LotOccupantType extends Record {
|
||||||
lotOccupantTypeId ? : number;
|
lotOccupantTypeId?: number;
|
||||||
lotOccupantType ? : string;
|
lotOccupantType?: string;
|
||||||
orderNumber ? : number;
|
orderNumber?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export interface FeeCategory extends Record {
|
export interface FeeCategory extends Record {
|
||||||
feeCategoryId ? : number;
|
feeCategoryId?: number;
|
||||||
feeCategory ? : string;
|
feeCategory?: string;
|
||||||
fees ? : Fee[];
|
fees?: Fee[];
|
||||||
orderNumber ? : number;
|
orderNumber?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export interface Fee extends Record {
|
export interface Fee extends Record {
|
||||||
feeId ? : number;
|
feeId?: number;
|
||||||
|
|
||||||
feeCategoryId ? : number;
|
feeCategoryId?: number;
|
||||||
feeCategory ? : string;
|
feeCategory?: string;
|
||||||
|
|
||||||
feeName ? : string;
|
feeName?: string;
|
||||||
feeDescription ? : string;
|
feeDescription?: string;
|
||||||
|
|
||||||
occupancyTypeId ? : number;
|
occupancyTypeId?: number;
|
||||||
occupancyType ? : string;
|
occupancyType?: string;
|
||||||
|
|
||||||
lotTypeId ? : number;
|
lotTypeId?: number;
|
||||||
lotType ? : string;
|
lotType?: string;
|
||||||
|
|
||||||
includeQuantity ? : boolean;
|
includeQuantity?: boolean;
|
||||||
quantityUnit ? : string;
|
quantityUnit?: string;
|
||||||
|
|
||||||
feeAmount ? : number;
|
feeAmount?: number;
|
||||||
feeFunction ? : string;
|
feeFunction?: string;
|
||||||
|
|
||||||
taxAmount ? : number;
|
taxAmount?: number;
|
||||||
taxPercentage ? : number;
|
taxPercentage?: number;
|
||||||
|
|
||||||
isRequired ? : boolean;
|
isRequired?: boolean;
|
||||||
|
|
||||||
orderNumber ? : number;
|
orderNumber?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export interface LotOccupancyFee extends Fee, Record {
|
export interface LotOccupancyFee extends Fee, Record {
|
||||||
lotOccupancyId ? : number;
|
lotOccupancyId?: number;
|
||||||
|
|
||||||
feeId ? : number;
|
feeId?: number;
|
||||||
feeName ? : string;
|
feeName?: string;
|
||||||
|
|
||||||
quantity ? : number;
|
quantity?: number;
|
||||||
feeAmount ? : number;
|
feeAmount?: number;
|
||||||
taxAmount ? : number;
|
taxAmount?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export interface LotOccupancyTransaction extends Record {
|
export interface LotOccupancyTransaction extends Record {
|
||||||
lotOccupancyId ? : number;
|
lotOccupancyId?: number;
|
||||||
transactionIndex ? : number;
|
transactionIndex?: number;
|
||||||
transactionDate ? : number;
|
transactionDate?: number;
|
||||||
transactionDateString ? : string;
|
transactionDateString?: string;
|
||||||
transactionTime ? : number;
|
transactionTime?: number;
|
||||||
transactionTimeString ? : string;
|
transactionTimeString?: string;
|
||||||
transactionAmount ? : number;
|
transactionAmount?: number;
|
||||||
externalReceiptNumber ? : string;
|
externalReceiptNumber?: string;
|
||||||
transactionNote ? : string;
|
transactionNote?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export interface LotOccupancyOccupant extends Record {
|
export interface LotOccupancyOccupant extends Record {
|
||||||
lotOccupancyId ? : number;
|
lotOccupancyId?: number;
|
||||||
lotOccupantIndex ? : number;
|
lotOccupantIndex?: number;
|
||||||
|
|
||||||
lotOccupantTypeId ? : number;
|
lotOccupantTypeId?: number;
|
||||||
lotOccupantType ? : string;
|
lotOccupantType?: string;
|
||||||
|
|
||||||
occupantName ? : string;
|
occupantName?: string;
|
||||||
occupantAddress1 ? : string;
|
occupantAddress1?: string;
|
||||||
occupantAddress2 ? : string;
|
occupantAddress2?: string;
|
||||||
occupantCity ? : string;
|
occupantCity?: string;
|
||||||
occupantProvince ? : string;
|
occupantProvince?: string;
|
||||||
occupantPostalCode ? : string;
|
occupantPostalCode?: string;
|
||||||
occupantPhoneNumber ? : string;
|
occupantPhoneNumber?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export interface LotOccupancyComment extends Record {
|
export interface LotOccupancyComment extends Record {
|
||||||
lotOccupancyCommentId ? : number;
|
lotOccupancyCommentId?: number;
|
||||||
lotOccupancyId ? : number;
|
lotOccupancyId?: number;
|
||||||
|
|
||||||
lotOccupancyCommentDate ? : number;
|
lotOccupancyCommentDate?: number;
|
||||||
lotOccupancyCommentDateString ? : string;
|
lotOccupancyCommentDateString?: string;
|
||||||
|
|
||||||
lotOccupancyCommentTime ? : number;
|
lotOccupancyCommentTime?: number;
|
||||||
lotOccupancyCommentTimeString ? : string;
|
lotOccupancyCommentTimeString?: string;
|
||||||
|
|
||||||
lotOccupancyComment ? : string;
|
lotOccupancyComment?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export interface LotOccupancyField extends OccupancyTypeField, Record {
|
export interface LotOccupancyField extends OccupancyTypeField, Record {
|
||||||
lotOccupancyId ? : number;
|
lotOccupancyId?: number;
|
||||||
occupancyTypeFieldId ? : number;
|
occupancyTypeFieldId?: number;
|
||||||
lotOccupancyFieldValue ? : string;
|
lotOccupancyFieldValue?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export interface LotOccupancy extends Record {
|
export interface LotOccupancy extends Record {
|
||||||
lotOccupancyId ? : number;
|
lotOccupancyId?: number;
|
||||||
|
|
||||||
occupancyTypeId ? : number;
|
occupancyTypeId?: number;
|
||||||
occupancyType ? : string;
|
occupancyType?: string;
|
||||||
|
|
||||||
lotId ? : number;
|
lotId?: number;
|
||||||
lotTypeId ? : number;
|
lotTypeId?: number;
|
||||||
lotName ? : string;
|
lotName?: string;
|
||||||
|
|
||||||
mapId ? : number;
|
mapId?: number;
|
||||||
mapName ? : string;
|
mapName?: string;
|
||||||
|
|
||||||
occupancyStartDate ? : number;
|
occupancyStartDate?: number;
|
||||||
occupancyStartDateString ? : string;
|
occupancyStartDateString?: string;
|
||||||
|
|
||||||
occupancyEndDate ? : number;
|
occupancyEndDate?: number;
|
||||||
occupancyEndDateString ? : string;
|
occupancyEndDateString?: string;
|
||||||
|
|
||||||
lotOccupancyFields ? : LotOccupancyField[];
|
lotOccupancyFields?: LotOccupancyField[];
|
||||||
lotOccupancyComments ? : LotOccupancyComment[];
|
lotOccupancyComments?: LotOccupancyComment[];
|
||||||
lotOccupancyOccupants ? : LotOccupancyOccupant[];
|
lotOccupancyOccupants?: LotOccupancyOccupant[];
|
||||||
lotOccupancyFees ? : LotOccupancyFee[];
|
lotOccupancyFees?: LotOccupancyFee[];
|
||||||
lotOccupancyTransactions ? : LotOccupancyTransaction[];
|
lotOccupancyTransactions?: LotOccupancyTransaction[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* WORK ORDERS
|
* WORK ORDERS
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
export interface WorkOrderType extends Record {
|
export interface WorkOrderType extends Record {
|
||||||
workOrderTypeId ? : number;
|
workOrderTypeId?: number;
|
||||||
workOrderType ? : string;
|
workOrderType?: string;
|
||||||
orderNumber ? : number;
|
orderNumber?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export interface WorkOrderComment extends Record {
|
export interface WorkOrderComment extends Record {
|
||||||
workOrderCommentId ? : number;
|
workOrderCommentId?: number;
|
||||||
workOrderId ? : number;
|
workOrderId?: number;
|
||||||
|
|
||||||
workOrderCommentDate ? : number;
|
workOrderCommentDate?: number;
|
||||||
workOrderCommentDateString ? : string;
|
workOrderCommentDateString?: string;
|
||||||
|
|
||||||
workOrderCommentTime ? : number;
|
workOrderCommentTime?: number;
|
||||||
workOrderCommentTimeString ? : string;
|
workOrderCommentTimeString?: string;
|
||||||
|
|
||||||
workOrderComment ? : string;
|
workOrderComment?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export interface WorkOrder extends Record {
|
export interface WorkOrder extends Record {
|
||||||
workOrderId ? : number;
|
workOrderId?: number;
|
||||||
|
|
||||||
workOrderTypeId ? : number;
|
workOrderTypeId?: number;
|
||||||
workOrderType ? : string;
|
workOrderType?: string;
|
||||||
|
|
||||||
workOrderNumber ? : string;
|
workOrderNumber?: string;
|
||||||
workOrderDescription ? : string;
|
workOrderDescription?: string;
|
||||||
|
|
||||||
workOrderOpenDate ? : number;
|
workOrderOpenDate?: number;
|
||||||
workOrderOpenDateString ? : string;
|
workOrderOpenDateString?: string;
|
||||||
|
|
||||||
workOrderCloseDate ? : number;
|
workOrderCloseDate?: number;
|
||||||
workOrderCloseDateString ? : string;
|
workOrderCloseDateString?: string;
|
||||||
|
|
||||||
workOrderComments ? : WorkOrderComment[];
|
workOrderComments?: WorkOrderComment[];
|
||||||
workOrderLots ? : Lot[];
|
workOrderLots?: Lot[];
|
||||||
workOrderLotOccupancies ? : LotOccupancy[];
|
workOrderLotOccupancies?: LotOccupancy[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* USER TYPES
|
* USER TYPES
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
export interface User {
|
export interface User {
|
||||||
userName: string;
|
userName: string;
|
||||||
userProperties ? : UserProperties;
|
userProperties?: UserProperties;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface UserProperties {
|
export interface UserProperties {
|
||||||
|
|
@ -329,7 +305,6 @@ export interface UserProperties {
|
||||||
isAdmin: boolean;
|
isAdmin: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
declare module "express-session" {
|
declare module "express-session" {
|
||||||
interface Session {
|
interface Session {
|
||||||
user: User;
|
user: User;
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,12 @@
|
||||||
<span>Fee Management</span>
|
<span>Fee Management</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="<%= (headTitle.endsWith("Type Management") ? "is-active" : "") %>" href="<%= urlPrefix %>/admin/occupancyTypes">
|
||||||
|
<span class="icon is-small"><i class="fas fa-fw fa-user-friends" aria-hidden="true"></i></span>
|
||||||
|
<span><%= configFunctions.getProperty("aliases.occupancy") %> Type Management</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a class="<%= (headTitle === "Config Table Management" ? "is-active" : "") %>" href="<%= urlPrefix %>/admin/tables">
|
<a class="<%= (headTitle === "Config Table Management" ? "is-active" : "") %>" href="<%= urlPrefix %>/admin/tables">
|
||||||
<span class="icon is-small"><i class="fas fa-fw fa-table" aria-hidden="true"></i></span>
|
<span class="icon is-small"><i class="fas fa-fw fa-table" aria-hidden="true"></i></span>
|
||||||
|
|
|
||||||
|
|
@ -145,6 +145,23 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="card-content">
|
||||||
|
<div class="media">
|
||||||
|
<div class="media-left">
|
||||||
|
<i class="fas fa-3x fa-fw fa-user-friends" aria-hidden="true"></i>
|
||||||
|
</div>
|
||||||
|
<div class="media-content has-text-black">
|
||||||
|
<h2 class="title is-4 is-marginless">
|
||||||
|
<a href="<%= urlPrefix %>/admin/occupancyTypes"><%= configFunctions.getProperty("aliases.occupancy") %> Type Management</a>
|
||||||
|
</h2>
|
||||||
|
<p>
|
||||||
|
Manage
|
||||||
|
<%= configFunctions.getProperty("aliases.occupancy").toLowerCase() %> types
|
||||||
|
and fields associated with them.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="card-content">
|
<div class="card-content">
|
||||||
<div class="media">
|
<div class="media">
|
||||||
<div class="media-left">
|
<div class="media-left">
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue