linting with mega linter

deepsource-autofix-76c6eb20
Dan Gowans 2023-01-10 11:07:50 -05:00
parent 119c325cc3
commit a4f4b353fc
108 changed files with 13118 additions and 12169 deletions

View File

@ -1,16 +1,16 @@
{ {
"ignorePaths": [ "ignorePaths": [
"**/node_modules/**", "**/node_modules/**",
"**/vscode-extension/**", "**/vscode-extension/**",
"**/.git/**", "**/.git/**",
"**/.pnpm-lock.json", "**/.pnpm-lock.json",
".vscode", ".vscode",
"megalinter", "megalinter",
"package-lock.json", "package-lock.json",
"report" "report"
], ],
"language": "en", "language": "en",
"noConfigSearch": true, "noConfigSearch": true,
"words": ["megalinter", "oxsecurity"], "words": ["megalinter", "oxsecurity"],
"version": "0.2" "version": "0.2"
} }

View File

@ -1,58 +1,58 @@
{ {
"root": true, "root": true,
"env": { "env": {
"es6": true "es6": true
}, },
"parser": "@typescript-eslint/parser", "parser": "@typescript-eslint/parser",
"parserOptions": { "parserOptions": {
"project": ["./tsconfig.json", "./tsconfig.client.json"], "project": ["./tsconfig.json", "./tsconfig.client.json"],
"ecmaVersion": 2020, "ecmaVersion": 2020,
"sourceType": "module" "sourceType": "module"
}, },
"plugins": ["@typescript-eslint", "unicorn"], "plugins": ["@typescript-eslint", "unicorn"],
"extends": [ "extends": [
"eslint:recommended", "eslint:recommended",
"plugin:import/recommended", "plugin:import/recommended",
"plugin:import/typescript", "plugin:import/typescript",
"plugin:node/recommended", "plugin:node/recommended",
"plugin:promise/recommended", "plugin:promise/recommended",
"plugin:unicorn/recommended", "plugin:unicorn/recommended",
"plugin:@typescript-eslint/recommended" "plugin:@typescript-eslint/recommended"
],
"rules": {
"@typescript-eslint/no-extra-semi": "off",
"node/no-missing-import": "off",
"node/no-unpublished-import": "off",
"unicorn/consistent-function-scoping": "warn",
"unicorn/empty-brace-spaces": "off",
"unicorn/filename-case": [
"error",
{
"case": "camelCase",
"ignore": ["DB", "URL"]
}
], ],
"rules": { "unicorn/prevent-abbreviations": [
"node/no-missing-import": "off", "error",
"node/no-unpublished-import": "off", {
"unicorn/consistent-function-scoping": "warn", "replacements": {
"unicorn/empty-brace-spaces": "off", "def": {
"unicorn/filename-case": [ "definition": true
"error", },
{ "ele": {
"case": "camelCase", "element": true
"ignore": ["DB", "URL"] },
} "eles": {
], "elements": true
"unicorn/prefer-node-protocol": "off", },
"unicorn/prevent-abbreviations": [ "fns": {
"error", "functions": true
{ },
"replacements": { "res": {
"def": { "result": false
"definition": true }
}, }
"ele": { }
"element": true ]
}, }
"eles": {
"elements": true
},
"fns": {
"functions": true
},
"res": {
"result": false
}
}
}
]
}
} }

View File

@ -1,15 +1,15 @@
{ {
"threshold": 0, "threshold": 0,
"reporters": ["html", "markdown"], "reporters": ["html", "markdown"],
"ignore": [ "ignore": [
"**/node_modules/**", "**/node_modules/**",
"**/.git/**", "**/.git/**",
"**/.rbenv/**", "**/.rbenv/**",
"**/.venv/**", "**/.venv/**",
"**/*cache*/**", "**/*cache*/**",
"**/.github/**", "**/.github/**",
"**/.idea/**", "**/.idea/**",
"**/report/**", "**/report/**",
"**/*.svg" "**/*.svg"
] ]
} }

View File

@ -1,3 +1,3 @@
{ {
"reject": ["@fortawesome/fontawesome-free"] "reject": ["@fortawesome/fontawesome-free"]
} }

View File

@ -1,7 +1,6 @@
{ {
"trailingComma": "none", "trailingComma": "none",
"tabWidth": 4, "tabWidth": 2,
"semi": true, "semi": false,
"singleQuote": false, "singleQuote": true
"printWidth": 110
} }

153
app.js
View File

@ -1,44 +1,44 @@
import createError from "http-errors"; import createError from 'http-errors';
import express from "express"; import express from 'express';
import compression from "compression"; import compression from 'compression';
import path from "node:path"; import path from 'node:path';
import cookieParser from "cookie-parser"; import cookieParser from 'cookie-parser';
import csurf from "csurf"; import csurf from 'csurf';
import rateLimit from "express-rate-limit"; import rateLimit from 'express-rate-limit';
import session from "express-session"; import session from 'express-session';
import FileStore from "session-file-store"; import FileStore from 'session-file-store';
import * as permissionHandlers from "./handlers/permissions.js"; import * as permissionHandlers from './handlers/permissions.js';
import routerLogin from "./routes/login.js"; import routerLogin from './routes/login.js';
import routerDashboard from "./routes/dashboard.js"; import routerDashboard from './routes/dashboard.js';
import routerApi from "./routes/api.js"; import routerApi from './routes/api.js';
import routerPrint from "./routes/print.js"; import routerPrint from './routes/print.js';
import routerMaps from "./routes/maps.js"; import routerMaps from './routes/maps.js';
import routerLots from "./routes/lots.js"; import routerLots from './routes/lots.js';
import routerLotOccupancies from "./routes/lotOccupancies.js"; import routerLotOccupancies from './routes/lotOccupancies.js';
import routerWorkOrders from "./routes/workOrders.js"; import routerWorkOrders from './routes/workOrders.js';
import routerReports from "./routes/reports.js"; import routerReports from './routes/reports.js';
import routerAdmin from "./routes/admin.js"; import routerAdmin from './routes/admin.js';
import * as configFunctions from "./helpers/functions.config.js"; import * as configFunctions from './helpers/functions.config.js';
import * as printFunctions from "./helpers/functions.print.js"; import * as printFunctions from './helpers/functions.print.js';
import * as dateTimeFns from "@cityssm/expressjs-server-js/dateTimeFns.js"; 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 { version } from "./version.js"; import { version } from './version.js';
import * as databaseInitializer from "./helpers/initializer.database.js"; import * as databaseInitializer from './helpers/initializer.database.js';
import { apiGetHandler } from "./handlers/permissions.js"; import { apiGetHandler } from './handlers/permissions.js';
import { getSafeRedirectURL } from "./helpers/functions.authentication.js"; import { getSafeRedirectURL } from './helpers/functions.authentication.js';
import debug from "debug"; import debug from 'debug';
const debugApp = debug("lot-occupancy-system:app"); const debugApp = debug('lot-occupancy-system:app');
databaseInitializer.initializeDatabase(); databaseInitializer.initializeDatabase();
const __dirname = "."; const __dirname = '.';
export const app = express(); export const app = express();
app.disable("X-Powered-By"); app.disable('X-Powered-By');
if (!configFunctions.getProperty("reverseProxy.disableEtag")) { if (!configFunctions.getProperty('reverseProxy.disableEtag')) {
app.set("etag", false); app.set('etag', false);
} }
app.set("views", path.join(__dirname, "views")); app.set('views', path.join(__dirname, 'views'));
app.set("view engine", "ejs"); app.set('view engine', 'ejs');
if (!configFunctions.getProperty("reverseProxy.disableCompression")) { if (!configFunctions.getProperty('reverseProxy.disableCompression')) {
app.use(compression()); app.use(compression());
} }
app.use((request, _response, next) => { app.use((request, _response, next) => {
@ -53,38 +53,37 @@ app.use(cookieParser());
app.use(csurf({ app.use(csurf({
cookie: true cookie: true
})); }));
const limiter = rateLimit({ app.use(rateLimit({
windowMs: 1000, windowMs: 10000,
max: 25 * Math.max(3, configFunctions.getProperty("users.canLogin").length) max: 200
}); }));
app.use(limiter); const urlPrefix = configFunctions.getProperty('reverseProxy.urlPrefix');
const urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix"); if (urlPrefix !== '') {
if (urlPrefix !== "") { debugApp('urlPrefix = ' + urlPrefix);
debugApp("urlPrefix = " + urlPrefix);
} }
app.use(urlPrefix, express.static(path.join("public"))); app.use(urlPrefix, express.static(path.join('public')));
app.use(urlPrefix + "/lib/bulma-calendar", express.static(path.join("node_modules", "bulma-calendar", "dist"))); app.use(urlPrefix + '/lib/bulma-calendar', express.static(path.join('node_modules', 'bulma-calendar', 'dist')));
app.use(urlPrefix + "/lib/cityssm-bulma-js", express.static(path.join("node_modules", "@cityssm", "bulma-js", "dist"))); app.use(urlPrefix + '/lib/cityssm-bulma-js', express.static(path.join('node_modules', '@cityssm', 'bulma-js', 'dist')));
app.use(urlPrefix + "/lib/cityssm-bulma-webapp-js", express.static(path.join("node_modules", "@cityssm", "bulma-webapp-js"))); app.use(urlPrefix + '/lib/cityssm-bulma-webapp-js', express.static(path.join('node_modules', '@cityssm', 'bulma-webapp-js')));
app.use(urlPrefix + "/lib/fa", express.static(path.join("node_modules", "@fortawesome", "fontawesome-free"))); app.use(urlPrefix + '/lib/fa', express.static(path.join('node_modules', '@fortawesome', 'fontawesome-free')));
app.use(urlPrefix + "/lib/leaflet", express.static(path.join("node_modules", "leaflet", "dist"))); app.use(urlPrefix + '/lib/leaflet', express.static(path.join('node_modules', 'leaflet', 'dist')));
app.use(urlPrefix + "/lib/randomcolor", express.static(path.join("node_modules", "randomcolor"))); app.use(urlPrefix + '/lib/randomcolor', express.static(path.join('node_modules', 'randomcolor')));
const sessionCookieName = configFunctions.getProperty("session.cookieName"); const sessionCookieName = configFunctions.getProperty('session.cookieName');
const FileStoreSession = FileStore(session); const FileStoreSession = FileStore(session);
app.use(session({ app.use(session({
store: new FileStoreSession({ store: new FileStoreSession({
path: "./data/sessions", path: './data/sessions',
logFn: debug("lot-occupancy-system:session"), logFn: debug('lot-occupancy-system:session'),
retries: 20 retries: 20
}), }),
name: sessionCookieName, name: sessionCookieName,
secret: configFunctions.getProperty("session.secret"), secret: configFunctions.getProperty('session.secret'),
resave: true, resave: true,
saveUninitialized: false, saveUninitialized: false,
rolling: true, rolling: true,
cookie: { cookie: {
maxAge: configFunctions.getProperty("session.maxAgeMillis"), maxAge: configFunctions.getProperty('session.maxAgeMillis'),
sameSite: "strict" sameSite: 'strict'
} }
})); }));
app.use((request, response, next) => { app.use((request, response, next) => {
@ -109,38 +108,38 @@ app.use((request, response, next) => {
response.locals.dateTimeFunctions = dateTimeFns; response.locals.dateTimeFunctions = dateTimeFns;
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');
}); });
app.use(urlPrefix + "/dashboard", sessionChecker, routerDashboard); app.use(urlPrefix + '/dashboard', sessionChecker, routerDashboard);
app.use(urlPrefix + "/api/:apiKey", apiGetHandler, routerApi); app.use(urlPrefix + '/api/:apiKey', apiGetHandler, routerApi);
app.use(urlPrefix + "/print", sessionChecker, routerPrint); app.use(urlPrefix + '/print', sessionChecker, routerPrint);
app.use(urlPrefix + "/maps", sessionChecker, routerMaps); app.use(urlPrefix + '/maps', sessionChecker, routerMaps);
app.use(urlPrefix + "/lots", sessionChecker, routerLots); app.use(urlPrefix + '/lots', sessionChecker, routerLots);
app.use(urlPrefix + "/lotOccupancies", sessionChecker, routerLotOccupancies); app.use(urlPrefix + '/lotOccupancies', sessionChecker, routerLotOccupancies);
app.use(urlPrefix + "/workOrders", sessionChecker, routerWorkOrders); app.use(urlPrefix + '/workOrders', sessionChecker, routerWorkOrders);
app.use(urlPrefix + "/reports", sessionChecker, routerReports); app.use(urlPrefix + '/reports', sessionChecker, routerReports);
app.use(urlPrefix + "/admin", sessionChecker, permissionHandlers.adminGetHandler, routerAdmin); app.use(urlPrefix + '/admin', sessionChecker, permissionHandlers.adminGetHandler, routerAdmin);
app.all(urlPrefix + "/keepAlive", (_request, response) => { app.all(urlPrefix + '/keepAlive', (_request, response) => {
response.json(true); response.json(true);
}); });
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]) {
request.session.destroy(() => { request.session.destroy(() => {
response.clearCookie(sessionCookieName); response.clearCookie(sessionCookieName);
response.redirect(urlPrefix + "/"); response.redirect(urlPrefix + '/');
}); });
} }
else { else {
response.redirect(urlPrefix + "/login"); response.redirect(urlPrefix + '/login');
} }
}); });
app.use((request, _response, next) => { app.use((request, _response, next) => {
debugApp(request.url); debugApp(request.url);
next(createError(404, "File not found.")); next(createError(404, 'File not found.'));
}); });
export default app; export default app;

305
app.ts
View File

@ -1,189 +1,182 @@
import createError from "http-errors"; import createError from 'http-errors'
import express from "express"; import express from 'express'
import compression from "compression"; import compression from 'compression'
import path from "node:path"; import path from 'node:path'
import cookieParser from "cookie-parser"; import cookieParser from 'cookie-parser'
import csurf from "csurf"; import csurf from 'csurf'
import rateLimit from "express-rate-limit"; import rateLimit from 'express-rate-limit'
import session from "express-session"; import session from 'express-session'
import FileStore from "session-file-store"; import FileStore from 'session-file-store'
import * as permissionHandlers from "./handlers/permissions.js"; import * as permissionHandlers from './handlers/permissions.js'
import routerLogin from "./routes/login.js"; import routerLogin from './routes/login.js'
import routerDashboard from "./routes/dashboard.js"; import routerDashboard from './routes/dashboard.js'
import routerApi from "./routes/api.js"; import routerApi from './routes/api.js'
import routerPrint from "./routes/print.js"; import routerPrint from './routes/print.js'
import routerMaps from "./routes/maps.js"; import routerMaps from './routes/maps.js'
import routerLots from "./routes/lots.js"; import routerLots from './routes/lots.js'
import routerLotOccupancies from "./routes/lotOccupancies.js"; import routerLotOccupancies from './routes/lotOccupancies.js'
import routerWorkOrders from "./routes/workOrders.js"; import routerWorkOrders from './routes/workOrders.js'
import routerReports from "./routes/reports.js"; import routerReports from './routes/reports.js'
import routerAdmin from "./routes/admin.js"; import routerAdmin from './routes/admin.js'
import * as configFunctions from "./helpers/functions.config.js"; import * as configFunctions from './helpers/functions.config.js'
import * as printFunctions from "./helpers/functions.print.js"; import * as printFunctions from './helpers/functions.print.js'
import * as dateTimeFns from "@cityssm/expressjs-server-js/dateTimeFns.js"; 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 { version } from "./version.js"; import { version } from './version.js'
import * as databaseInitializer from "./helpers/initializer.database.js"; import * as databaseInitializer from './helpers/initializer.database.js'
import { apiGetHandler } from "./handlers/permissions.js"; import { apiGetHandler } from './handlers/permissions.js'
import { getSafeRedirectURL } from "./helpers/functions.authentication.js"; import { getSafeRedirectURL } from './helpers/functions.authentication.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 * INITIALIZE THE DATABASE
*/ */
databaseInitializer.initializeDatabase(); databaseInitializer.initializeDatabase()
/* /*
* INITIALIZE APP * INITIALIZE APP
*/ */
const __dirname = "."; const __dirname = '.'
export const app = express(); export const app = express()
app.disable("X-Powered-By"); app.disable('X-Powered-By')
if (!configFunctions.getProperty("reverseProxy.disableEtag")) { if (!configFunctions.getProperty('reverseProxy.disableEtag')) {
app.set("etag", false); app.set('etag', false)
} }
// View engine setup // View engine setup
app.set("views", path.join(__dirname, "views")); app.set('views', path.join(__dirname, 'views'))
app.set("view engine", "ejs"); app.set('view engine', 'ejs')
if (!configFunctions.getProperty("reverseProxy.disableCompression")) { if (!configFunctions.getProperty('reverseProxy.disableCompression')) {
app.use(compression()); app.use(compression())
} }
app.use((request, _response, next) => { app.use((request, _response, next) => {
debugApp(`${request.method} ${request.url}`); debugApp(`${request.method} ${request.url}`)
next(); next()
}); })
app.use(express.json()); app.use(express.json())
app.use( app.use(
express.urlencoded({ express.urlencoded({
extended: false extended: false
}) })
); )
app.use(cookieParser()); app.use(cookieParser())
app.use( app.use(
csurf({ csurf({
cookie: true cookie: true
}) })
); )
/* /*
* Rate Limiter * Rate Limiter
*/ */
const limiter = rateLimit({ app.use(
windowMs: 1000, rateLimit({
max: 25 * Math.max(3, configFunctions.getProperty("users.canLogin").length) windowMs: 10_000,
}); max: 200
})
app.use(limiter); )
/* /*
* STATIC ROUTES * STATIC ROUTES
*/ */
const urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix"); const urlPrefix = configFunctions.getProperty('reverseProxy.urlPrefix')
if (urlPrefix !== "") { if (urlPrefix !== '') {
debugApp("urlPrefix = " + urlPrefix); debugApp('urlPrefix = ' + urlPrefix)
} }
app.use(urlPrefix, express.static(path.join("public"))); app.use(urlPrefix, express.static(path.join('public')))
app.use( app.use(
urlPrefix + "/lib/bulma-calendar", urlPrefix + '/lib/bulma-calendar',
express.static(path.join("node_modules", "bulma-calendar", "dist")) express.static(path.join('node_modules', 'bulma-calendar', 'dist'))
); )
app.use( app.use(
urlPrefix + "/lib/cityssm-bulma-js", urlPrefix + '/lib/cityssm-bulma-js',
express.static(path.join("node_modules", "@cityssm", "bulma-js", "dist")) express.static(path.join('node_modules', '@cityssm', 'bulma-js', 'dist'))
); )
app.use( app.use(
urlPrefix + "/lib/cityssm-bulma-webapp-js", urlPrefix + '/lib/cityssm-bulma-webapp-js',
express.static(path.join("node_modules", "@cityssm", "bulma-webapp-js")) express.static(path.join('node_modules', '@cityssm', 'bulma-webapp-js'))
); )
app.use( app.use(urlPrefix + '/lib/fa', 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/leaflet", express.static(path.join("node_modules", "leaflet", "dist"))); app.use(urlPrefix + '/lib/leaflet', express.static(path.join('node_modules', 'leaflet', 'dist')))
app.use(urlPrefix + "/lib/randomcolor", express.static(path.join("node_modules", "randomcolor"))); app.use(urlPrefix + '/lib/randomcolor', express.static(path.join('node_modules', 'randomcolor')))
/* /*
* 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( app.use(
session({ session({
store: new FileStoreSession({ store: new FileStoreSession({
path: "./data/sessions", path: './data/sessions',
logFn: debug("lot-occupancy-system:session"), logFn: debug('lot-occupancy-system:session'),
retries: 20 retries: 20
}), }),
name: sessionCookieName, name: sessionCookieName,
secret: configFunctions.getProperty("session.secret"), secret: configFunctions.getProperty('session.secret'),
resave: true, resave: true,
saveUninitialized: false, saveUninitialized: false,
rolling: true, rolling: true,
cookie: { cookie: {
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)
} }
next(); next()
}); })
// Redirect logged in users // Redirect logged in users
const sessionChecker = ( const sessionChecker = (request: express.Request, response: express.Response, next: express.NextFunction) => {
request: express.Request, if (request.session.user && request.cookies[sessionCookieName]) {
response: express.Response, return next()
next: express.NextFunction }
) => {
if (request.session.user && request.cookies[sessionCookieName]) {
return next();
}
const redirectUrl = getSafeRedirectURL(request.originalUrl); const redirectUrl = getSafeRedirectURL(request.originalUrl)
return response.redirect(`${urlPrefix}/login?redirect=${encodeURIComponent(redirectUrl)}`); return response.redirect(`${urlPrefix}/login?redirect=${encodeURIComponent(redirectUrl)}`)
}; }
/* /*
* ROUTES * ROUTES
@ -192,60 +185,60 @@ const sessionChecker = (
// 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
response.locals.csrfToken = request.csrfToken(); response.locals.csrfToken = request.csrfToken()
response.locals.configFunctions = configFunctions; response.locals.configFunctions = configFunctions
response.locals.printFunctions = printFunctions; response.locals.printFunctions = printFunctions
response.locals.dateTimeFunctions = dateTimeFns; response.locals.dateTimeFunctions = dateTimeFns
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')
}); })
app.use(urlPrefix + "/dashboard", sessionChecker, routerDashboard); app.use(urlPrefix + '/dashboard', sessionChecker, routerDashboard)
app.use(urlPrefix + "/api/:apiKey", apiGetHandler, routerApi); app.use(urlPrefix + '/api/:apiKey', apiGetHandler, routerApi)
app.use(urlPrefix + "/print", sessionChecker, routerPrint); app.use(urlPrefix + '/print', sessionChecker, routerPrint)
app.use(urlPrefix + "/maps", sessionChecker, routerMaps); app.use(urlPrefix + '/maps', sessionChecker, routerMaps)
app.use(urlPrefix + "/lots", sessionChecker, routerLots); app.use(urlPrefix + '/lots', sessionChecker, routerLots)
app.use(urlPrefix + "/lotOccupancies", sessionChecker, routerLotOccupancies); app.use(urlPrefix + '/lotOccupancies', sessionChecker, routerLotOccupancies)
app.use(urlPrefix + "/workOrders", sessionChecker, routerWorkOrders); app.use(urlPrefix + '/workOrders', sessionChecker, routerWorkOrders)
app.use(urlPrefix + "/reports", sessionChecker, routerReports); app.use(urlPrefix + '/reports', sessionChecker, routerReports)
app.use(urlPrefix + "/admin", sessionChecker, permissionHandlers.adminGetHandler, routerAdmin); app.use(urlPrefix + '/admin', sessionChecker, permissionHandlers.adminGetHandler, routerAdmin)
app.all(urlPrefix + "/keepAlive", (_request, response) => { app.all(urlPrefix + '/keepAlive', (_request, response) => {
response.json(true); response.json(true)
}); })
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]) {
request.session.destroy(() => { request.session.destroy(() => {
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) => {
debugApp(request.url); debugApp(request.url)
next(createError(404, "File not found.")); next(createError(404, 'File not found.'))
}); })
export default app; export default app

View File

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

View File

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

View File

@ -2,6 +2,6 @@
"feeCategory": "Cypress Test - Fee Category", "feeCategory": "Cypress Test - Fee Category",
"feeName": "Cypress Test - Fee Name", "feeName": "Cypress Test - Fee Name",
"feeDescription": "Test Description", "feeDescription": "Test Description",
"feeAmount": 10.50, "feeAmount": 10.5,
"quantityUnit": "units" "quantityUnit": "units"
} }

View File

@ -1,10 +1,10 @@
{ {
"mapName": "Cypress Test - Holy Sepulchre", "mapName": "Cypress Test - Holy Sepulchre",
"mapDescription": "Operated by the City of Sault Ste. Marie" , "mapDescription": "Operated by the City of Sault Ste. Marie",
"mapAddress1": "Fourth Line and Peoples Road", "mapAddress1": "Fourth Line and Peoples Road",
"mapAddress2": "27 Fourth Line East", "mapAddress2": "27 Fourth Line East",
"mapPostalCode": "P6A 5K8", "mapPostalCode": "P6A 5K8",
"mapPhoneNumber": "705-759-5336", "mapPhoneNumber": "705-759-5336",
"mapLatitude": 46.56874795, "mapLatitude": 46.56874795,
"mapLongitude": -84.34842824 "mapLongitude": -84.34842824
} }

View File

@ -1,59 +1,59 @@
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 include from "gulp-include"; import include from 'gulp-include';
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 return gulp
.src("public-scss/*.scss") .src('public-scss/*.scss')
.pipe(sass({ outputStyle: "compressed", includePaths: ["node_modules"] }).on("error", sass.logError)) .pipe(sass({ outputStyle: 'compressed', includePaths: ['node_modules'] }).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 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));
}; };
const publicJavascriptsAdminTablesFunction = () => { const publicJavascriptsAdminTablesFunction = () => {
return gulp return gulp
.src("public-typescript/adminTables/adminTables.js") .src('public-typescript/adminTables/adminTables.js')
.pipe(include()) .pipe(include())
.pipe(gulp.dest("public-typescript")); .pipe(gulp.dest('public-typescript'));
}; };
const publicJavascriptsLotOccupancyEditFunction = () => { const publicJavascriptsLotOccupancyEditFunction = () => {
return gulp return gulp
.src("public-typescript/lotOccupancyEdit/lotOccupancyEdit.js") .src('public-typescript/lotOccupancyEdit/lotOccupancyEdit.js')
.pipe(include()) .pipe(include())
.pipe(gulp.dest("public-typescript")); .pipe(gulp.dest('public-typescript'));
}; };
const publicJavascriptsWorkOrderEditFunction = () => { const publicJavascriptsWorkOrderEditFunction = () => {
return gulp return gulp
.src("public-typescript/workOrderEdit/workOrderEdit.js") .src('public-typescript/workOrderEdit/workOrderEdit.js')
.pipe(include()) .pipe(include())
.pipe(gulp.dest("public-typescript")); .pipe(gulp.dest('public-typescript'));
}; };
gulp.task("public-javascript-adminTables", publicJavascriptsAdminTablesFunction); gulp.task('public-javascript-adminTables', publicJavascriptsAdminTablesFunction);
gulp.task("public-javascript-lotOccupancyEdit", publicJavascriptsLotOccupancyEditFunction); gulp.task('public-javascript-lotOccupancyEdit', publicJavascriptsLotOccupancyEditFunction);
gulp.task("public-javascript-workOrderEdit", publicJavascriptsWorkOrderEditFunction); gulp.task('public-javascript-workOrderEdit', publicJavascriptsWorkOrderEditFunction);
gulp.task("public-javascript-min", publicJavascriptsMinFunction); gulp.task('public-javascript-min', publicJavascriptsMinFunction);
const watchFunction = () => { const watchFunction = () => {
gulp.watch("public-scss/*.scss", publicSCSSFunction); gulp.watch('public-scss/*.scss', publicSCSSFunction);
gulp.watch("public-typescript/adminTables/*.js", publicJavascriptsAdminTablesFunction); gulp.watch('public-typescript/adminTables/*.js', publicJavascriptsAdminTablesFunction);
gulp.watch("public-typescript/lotOccupancyEdit/*.js", publicJavascriptsLotOccupancyEditFunction); gulp.watch('public-typescript/lotOccupancyEdit/*.js', publicJavascriptsLotOccupancyEditFunction);
gulp.watch("public-typescript/workOrderEdit/*.js", publicJavascriptsWorkOrderEditFunction); gulp.watch('public-typescript/workOrderEdit/*.js', publicJavascriptsWorkOrderEditFunction);
gulp.watch("public-typescript/*.js", publicJavascriptsMinFunction); gulp.watch('public-typescript/*.js', publicJavascriptsMinFunction);
}; };
gulp.task("watch", watchFunction); gulp.task('watch', watchFunction);
gulp.task("default", () => { gulp.task('default', () => {
publicJavascriptsAdminTablesFunction(); publicJavascriptsAdminTablesFunction();
publicJavascriptsLotOccupancyEditFunction(); publicJavascriptsLotOccupancyEditFunction();
publicJavascriptsWorkOrderEditFunction(); publicJavascriptsWorkOrderEditFunction();

View File

@ -1,110 +1,102 @@
/* eslint-disable node/no-unpublished-import */ /* eslint-disable node/no-unpublished-import */
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 include from "gulp-include"; import include from 'gulp-include'
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)
/* /*
* Compile SASS * Compile SASS
*/ */
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( .pipe(sass({ outputStyle: 'compressed', includePaths: ['node_modules'] }).on('error', sass.logError))
sass({ outputStyle: "compressed", includePaths: ["node_modules"] }).on( .pipe(gulp.dest(publicSCSSDestination))
"error", }
sass.logError
)
)
.pipe(gulp.dest(publicSCSSDestination));
};
gulp.task("public-scss", publicSCSSFunction); gulp.task('public-scss', publicSCSSFunction)
/* /*
* Minify public/javascripts * Minify public/javascripts
*/ */
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( .pipe(
changed(publicJavascriptsDestination, { 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))
}; }
const publicJavascriptsAdminTablesFunction = () => { const publicJavascriptsAdminTablesFunction = () => {
return gulp return gulp
.src("public-typescript/adminTables/adminTables.js") .src('public-typescript/adminTables/adminTables.js')
.pipe(include()) .pipe(include())
.pipe(gulp.dest("public-typescript")); .pipe(gulp.dest('public-typescript'))
}; }
const publicJavascriptsLotOccupancyEditFunction = () => { const publicJavascriptsLotOccupancyEditFunction = () => {
return gulp return gulp
.src("public-typescript/lotOccupancyEdit/lotOccupancyEdit.js") .src('public-typescript/lotOccupancyEdit/lotOccupancyEdit.js')
.pipe(include()) .pipe(include())
.pipe(gulp.dest("public-typescript")); .pipe(gulp.dest('public-typescript'))
}; }
const publicJavascriptsWorkOrderEditFunction = () => { const publicJavascriptsWorkOrderEditFunction = () => {
return gulp return gulp
.src("public-typescript/workOrderEdit/workOrderEdit.js") .src('public-typescript/workOrderEdit/workOrderEdit.js')
.pipe(include()) .pipe(include())
.pipe(gulp.dest("public-typescript")); .pipe(gulp.dest('public-typescript'))
}; }
gulp.task("public-javascript-adminTables", publicJavascriptsAdminTablesFunction); gulp.task('public-javascript-adminTables', publicJavascriptsAdminTablesFunction)
gulp.task("public-javascript-lotOccupancyEdit", publicJavascriptsLotOccupancyEditFunction); gulp.task('public-javascript-lotOccupancyEdit', publicJavascriptsLotOccupancyEditFunction)
gulp.task("public-javascript-workOrderEdit", publicJavascriptsWorkOrderEditFunction); gulp.task('public-javascript-workOrderEdit', publicJavascriptsWorkOrderEditFunction)
gulp.task("public-javascript-min", publicJavascriptsMinFunction); gulp.task('public-javascript-min', publicJavascriptsMinFunction)
/* /*
* Watch * Watch
*/ */
const watchFunction = () => { const watchFunction = () => {
gulp.watch("public-scss/*.scss", publicSCSSFunction); gulp.watch('public-scss/*.scss', publicSCSSFunction)
gulp.watch("public-typescript/adminTables/*.js", publicJavascriptsAdminTablesFunction); gulp.watch('public-typescript/adminTables/*.js', publicJavascriptsAdminTablesFunction)
gulp.watch( gulp.watch('public-typescript/lotOccupancyEdit/*.js', publicJavascriptsLotOccupancyEditFunction)
"public-typescript/lotOccupancyEdit/*.js",
publicJavascriptsLotOccupancyEditFunction
);
gulp.watch("public-typescript/workOrderEdit/*.js", publicJavascriptsWorkOrderEditFunction); gulp.watch('public-typescript/workOrderEdit/*.js', publicJavascriptsWorkOrderEditFunction)
gulp.watch("public-typescript/*.js", publicJavascriptsMinFunction); gulp.watch('public-typescript/*.js', publicJavascriptsMinFunction)
}; }
gulp.task("watch", watchFunction); gulp.task('watch', watchFunction)
/* /*
* Initialize default * Initialize default
*/ */
gulp.task("default", () => { gulp.task('default', () => {
publicJavascriptsAdminTablesFunction(); publicJavascriptsAdminTablesFunction()
publicJavascriptsLotOccupancyEditFunction(); publicJavascriptsLotOccupancyEditFunction()
publicJavascriptsWorkOrderEditFunction(); publicJavascriptsWorkOrderEditFunction()
publicJavascriptsMinFunction(); publicJavascriptsMinFunction()
publicSCSSFunction(); publicSCSSFunction()
watchFunction(); watchFunction()
}); })

View File

@ -1,3 +1,3 @@
import type { RequestHandler } from "express"; import type { RequestHandler } from 'express';
export declare const handler: RequestHandler; export declare const handler: RequestHandler;
export default handler; export default handler;

View File

@ -1,4 +1,4 @@
import { getLots } from "../../helpers/lotOccupancyDB/getLots.js"; import { getLots } from '../../helpers/lotOccupancyDB/getLots.js';
export const handler = async (request, response) => { export const handler = async (request, response) => {
const result = getLots(request.body, { const result = getLots(request.body, {
limit: request.body.limit, limit: request.body.limit,

View File

@ -1,18 +1,18 @@
import type { RequestHandler } from "express"; import type { RequestHandler } from 'express';
import { getLots } from "../../helpers/lotOccupancyDB/getLots.js"; import { getLots } from '../../helpers/lotOccupancyDB/getLots.js';
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const result = getLots(request.body, { const result = getLots(request.body, {
limit: request.body.limit, limit: request.body.limit,
offset: request.body.offset offset: request.body.offset
}); });
response.json({ response.json({
count: result.count, count: result.count,
offset: Number.parseInt(request.body.offset, 10), offset: Number.parseInt(request.body.offset, 10),
lots: result.lots lots: result.lots
}); });
}; };
export default handler; export default handler;

View File

@ -1,4 +1,4 @@
import { completeWorkOrderMilestone } from "../../helpers/lotOccupancyDB/completeWorkOrderMiletstone.js"; import { completeWorkOrderMilestone } from "../../helpers/lotOccupancyDB/completeWorkOrderMilestone.js";
import { getWorkOrderMilestones } from "../../helpers/lotOccupancyDB/getWorkOrderMilestones.js"; import { getWorkOrderMilestones } from "../../helpers/lotOccupancyDB/getWorkOrderMilestones.js";
export const handler = async (request, response) => { export const handler = async (request, response) => {
const success = completeWorkOrderMilestone({ const success = completeWorkOrderMilestone({

View File

@ -1,6 +1,6 @@
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
import { completeWorkOrderMilestone } from "../../helpers/lotOccupancyDB/completeWorkOrderMiletstone.js"; import { completeWorkOrderMilestone } from "../../helpers/lotOccupancyDB/completeWorkOrderMilestone.js";
import { getWorkOrderMilestones } from "../../helpers/lotOccupancyDB/getWorkOrderMilestones.js"; import { getWorkOrderMilestones } from "../../helpers/lotOccupancyDB/getWorkOrderMilestones.js";

View File

@ -68,6 +68,7 @@ export function getLots(filters, options, connectedDatabase) {
let lots = []; let lots = [];
if (options.limit === -1 || count > 0) { if (options.limit === -1 || count > 0) {
database.function("userFn_lotNameSortName", configFunctions.getProperty("settings.lot.lotNameSortNameFunction")); database.function("userFn_lotNameSortName", configFunctions.getProperty("settings.lot.lotNameSortNameFunction"));
sqlParameters.unshift(currentDate, currentDate);
lots = database lots = database
.prepare("select l.lotId, l.lotName," + .prepare("select l.lotId, l.lotName," +
" t.lotType," + " t.lotType," +
@ -82,16 +83,13 @@ export function getLots(filters, options, connectedDatabase) {
"select lotId, count(lotOccupancyId) as lotOccupancyCount" + "select lotId, count(lotOccupancyId) as lotOccupancyCount" +
" from LotOccupancies" + " from LotOccupancies" +
" where recordDelete_timeMillis is null" + " where recordDelete_timeMillis is null" +
" and occupancyStartDate <= " + " and occupancyStartDate <= ?" +
currentDate + " and (occupancyEndDate is null or occupancyEndDate >= ?)" +
" and (occupancyEndDate is null or occupancyEndDate >= " +
currentDate +
")" +
" group by lotId" + " group by lotId" +
") o on l.lotId = o.lotId") + ") o on l.lotId = o.lotId") +
sqlWhereClause + sqlWhereClause +
" order by userFn_lotNameSortName(l.lotName), l.lotId" + " order by userFn_lotNameSortName(l.lotName), l.lotId" +
(options ? " limit " + options.limit + " offset " + options.offset : "")) (options ? ` limit ${options.limit} offset ${options.offset}` : ""))
.all(sqlParameters); .all(sqlParameters);
if (options.limit === -1) { if (options.limit === -1) {
count = lots.length; count = lots.length;

View File

@ -119,6 +119,8 @@ export function getLots(
configFunctions.getProperty("settings.lot.lotNameSortNameFunction") configFunctions.getProperty("settings.lot.lotNameSortNameFunction")
); );
sqlParameters.unshift(currentDate, currentDate);
lots = database lots = database
.prepare( .prepare(
"select l.lotId, l.lotName," + "select l.lotId, l.lotName," +
@ -134,16 +136,13 @@ export function getLots(
"select lotId, count(lotOccupancyId) as lotOccupancyCount" + "select lotId, count(lotOccupancyId) as lotOccupancyCount" +
" from LotOccupancies" + " from LotOccupancies" +
" where recordDelete_timeMillis is null" + " where recordDelete_timeMillis is null" +
" and occupancyStartDate <= " + " and occupancyStartDate <= ?" +
currentDate + " and (occupancyEndDate is null or occupancyEndDate >= ?)" +
" and (occupancyEndDate is null or occupancyEndDate >= " +
currentDate +
")" +
" group by lotId" + " group by lotId" +
") o on l.lotId = o.lotId") + ") o on l.lotId = o.lotId") +
sqlWhereClause + sqlWhereClause +
" order by userFn_lotNameSortName(l.lotName), l.lotId" + " order by userFn_lotNameSortName(l.lotName), l.lotId" +
(options ? " limit " + options.limit + " offset " + options.offset : "") (options ? ` limit ${options.limit} offset ${options.offset}` : "")
) )
.all(sqlParameters); .all(sqlParameters);

View File

@ -90,9 +90,7 @@ export function getWorkOrders(filters, options, connectedDatabase) {
.all(sqlParameters); .all(sqlParameters);
} }
if (options && if (options &&
(options.includeComments || (options.includeComments || options.includeLotsAndLotOccupancies || options.includeMilestones)) {
options.includeLotsAndLotOccupancies ||
options.includeMilestones)) {
for (const workOrder of workOrders) { for (const workOrder of workOrders) {
if (options.includeComments) { if (options.includeComments) {
workOrder.workOrderComments = getWorkOrderComments(workOrder.workOrderId, database); workOrder.workOrderComments = getWorkOrderComments(workOrder.workOrderId, database);

View File

@ -2,10 +2,7 @@ import sqlite from "better-sqlite3";
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
import { import { dateIntegerToString, dateStringToInteger } from "@cityssm/expressjs-server-js/dateTimeFns.js";
dateIntegerToString,
dateStringToInteger
} from "@cityssm/expressjs-server-js/dateTimeFns.js";
import { getWorkOrderComments } from "./getWorkOrderComments.js"; import { getWorkOrderComments } from "./getWorkOrderComments.js";
import { getLots } from "./getLots.js"; import { getLots } from "./getLots.js";
@ -16,192 +13,187 @@ import type * as recordTypes from "../../types/recordTypes";
import { getLotNameWhereClause, getOccupantNameWhereClause } from "../functions.sqlFilters.js"; import { getLotNameWhereClause, getOccupantNameWhereClause } from "../functions.sqlFilters.js";
interface GetWorkOrdersFilters { interface GetWorkOrdersFilters {
workOrderTypeId?: number | string; workOrderTypeId?: number | string;
workOrderOpenStatus?: "" | "open" | "closed"; workOrderOpenStatus?: "" | "open" | "closed";
workOrderOpenDateString?: string; workOrderOpenDateString?: string;
occupantName?: string; occupantName?: string;
lotName?: string; lotName?: string;
lotOccupancyId?: number | string; lotOccupancyId?: number | string;
} }
interface GetWorkOrdersOptions { interface GetWorkOrdersOptions {
limit: number; limit: number;
offset: number; offset: number;
includeLotsAndLotOccupancies?: boolean; includeLotsAndLotOccupancies?: boolean;
includeComments?: boolean; includeComments?: boolean;
includeMilestones?: boolean; includeMilestones?: boolean;
} }
function buildWhereClause(filters: GetWorkOrdersFilters): { function buildWhereClause(filters: GetWorkOrdersFilters): {
sqlWhereClause: string; sqlWhereClause: string;
sqlParameters: unknown[]; sqlParameters: unknown[];
} { } {
let sqlWhereClause = " where w.recordDelete_timeMillis is null"; let sqlWhereClause = " where w.recordDelete_timeMillis is null";
const sqlParameters: unknown[] = []; const sqlParameters: unknown[] = [];
if (filters.workOrderTypeId) { if (filters.workOrderTypeId) {
sqlWhereClause += " and w.workOrderTypeId = ?"; sqlWhereClause += " and w.workOrderTypeId = ?";
sqlParameters.push(filters.workOrderTypeId); sqlParameters.push(filters.workOrderTypeId);
}
if (filters.workOrderOpenStatus) {
if (filters.workOrderOpenStatus === "open") {
sqlWhereClause += " and w.workOrderCloseDate is null";
} else if (filters.workOrderOpenStatus === "closed") {
sqlWhereClause += " and w.workOrderCloseDate is not null";
} }
}
if (filters.workOrderOpenStatus) { if (filters.workOrderOpenDateString) {
if (filters.workOrderOpenStatus === "open") { sqlWhereClause += " and w.workOrderOpenDate = ?";
sqlWhereClause += " and w.workOrderCloseDate is null"; sqlParameters.push(dateStringToInteger(filters.workOrderOpenDateString));
} else if (filters.workOrderOpenStatus === "closed") { }
sqlWhereClause += " and w.workOrderCloseDate is not null";
}
}
if (filters.workOrderOpenDateString) { const occupantNameFilters = getOccupantNameWhereClause(filters.occupantName, "o");
sqlWhereClause += " and w.workOrderOpenDate = ?"; if (occupantNameFilters.sqlParameters.length > 0) {
sqlParameters.push(dateStringToInteger(filters.workOrderOpenDateString)); sqlWhereClause +=
} " and w.workOrderId in (" +
"select workOrderId from WorkOrderLotOccupancies o" +
" where recordDelete_timeMillis is null" +
" and o.lotOccupancyId in (select lotOccupancyId from LotOccupancyOccupants o where recordDelete_timeMillis is null" +
occupantNameFilters.sqlWhereClause +
")" +
")";
sqlParameters.push(...occupantNameFilters.sqlParameters);
}
const occupantNameFilters = getOccupantNameWhereClause(filters.occupantName, "o"); const lotNameFilters = getLotNameWhereClause(filters.lotName, "", "l");
if (occupantNameFilters.sqlParameters.length > 0) { if (lotNameFilters.sqlParameters.length > 0) {
sqlWhereClause += sqlWhereClause +=
" and w.workOrderId in (" + " and w.workOrderId in (" +
"select workOrderId from WorkOrderLotOccupancies o" + "select workOrderId from WorkOrderLots where recordDelete_timeMillis is null and lotId in (select lotId from Lots l where recordDelete_timeMillis is null" +
" where recordDelete_timeMillis is null" + lotNameFilters.sqlWhereClause +
" and o.lotOccupancyId in (select lotOccupancyId from LotOccupancyOccupants o where recordDelete_timeMillis is null" + "))";
occupantNameFilters.sqlWhereClause + sqlParameters.push(...lotNameFilters.sqlParameters);
")" + }
")";
sqlParameters.push(...occupantNameFilters.sqlParameters);
}
const lotNameFilters = getLotNameWhereClause(filters.lotName, "", "l"); if (filters.lotOccupancyId) {
if (lotNameFilters.sqlParameters.length > 0) { sqlWhereClause +=
sqlWhereClause += " and w.workOrderId in (select workOrderId from WorkOrderLotOccupancies where recordDelete_timeMillis is null and lotOccupancyId = ?)";
" and w.workOrderId in (" + sqlParameters.push(filters.lotOccupancyId);
"select workOrderId from WorkOrderLots where recordDelete_timeMillis is null and lotId in (select lotId from Lots l where recordDelete_timeMillis is null" + }
lotNameFilters.sqlWhereClause +
"))";
sqlParameters.push(...lotNameFilters.sqlParameters);
}
if (filters.lotOccupancyId) { return {
sqlWhereClause += sqlWhereClause,
" and w.workOrderId in (select workOrderId from WorkOrderLotOccupancies where recordDelete_timeMillis is null and lotOccupancyId = ?)"; sqlParameters
sqlParameters.push(filters.lotOccupancyId); };
}
return {
sqlWhereClause,
sqlParameters
};
} }
export function getWorkOrders( export function getWorkOrders(
filters: GetWorkOrdersFilters, filters: GetWorkOrdersFilters,
options?: GetWorkOrdersOptions, options?: GetWorkOrdersOptions,
connectedDatabase?: sqlite.Database connectedDatabase?: sqlite.Database
): { ): {
count: number; count: number;
workOrders: recordTypes.WorkOrder[]; workOrders: recordTypes.WorkOrder[];
} { } {
const database = const database =
connectedDatabase || connectedDatabase ||
sqlite(databasePath, { sqlite(databasePath, {
readonly: true readonly: true
}); });
database.function("userFn_dateIntegerToString", dateIntegerToString); database.function("userFn_dateIntegerToString", dateIntegerToString);
const { sqlWhereClause, sqlParameters } = buildWhereClause(filters); const { sqlWhereClause, sqlParameters } = buildWhereClause(filters);
const count: number = database const count: number = database
.prepare("select count(*) as recordCount from WorkOrders w" + sqlWhereClause) .prepare("select count(*) as recordCount from WorkOrders w" + sqlWhereClause)
.get(sqlParameters).recordCount; .get(sqlParameters).recordCount;
let workOrders: recordTypes.WorkOrder[] = []; let workOrders: recordTypes.WorkOrder[] = [];
if (count > 0) { if (count > 0) {
workOrders = database workOrders = database
.prepare( .prepare(
"select w.workOrderId," + "select w.workOrderId," +
" w.workOrderTypeId, t.workOrderType," + " w.workOrderTypeId, t.workOrderType," +
" w.workOrderNumber, w.workOrderDescription," + " w.workOrderNumber, w.workOrderDescription," +
" w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString," + " w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString," +
" w.workOrderCloseDate, userFn_dateIntegerToString(w.workOrderCloseDate) as workOrderCloseDateString," + " w.workOrderCloseDate, userFn_dateIntegerToString(w.workOrderCloseDate) as workOrderCloseDateString," +
" ifnull(m.workOrderMilestoneCount, 0) as workOrderMilestoneCount," + " ifnull(m.workOrderMilestoneCount, 0) as workOrderMilestoneCount," +
" ifnull(m.workOrderMilestoneCompletionCount, 0) as workOrderMilestoneCompletionCount" + " ifnull(m.workOrderMilestoneCompletionCount, 0) as workOrderMilestoneCompletionCount" +
" from WorkOrders w" + " from WorkOrders w" +
" left join WorkOrderTypes t on w.workOrderTypeId = t.workOrderTypeId" + " left join WorkOrderTypes t on w.workOrderTypeId = t.workOrderTypeId" +
(" left join (select workOrderId," + (" left join (select workOrderId," +
" count(workOrderMilestoneId) as workOrderMilestoneCount," + " count(workOrderMilestoneId) as workOrderMilestoneCount," +
" sum(case when workOrderMilestoneCompletionDate is null then 0 else 1 end) as workOrderMilestoneCompletionCount" + " sum(case when workOrderMilestoneCompletionDate is null then 0 else 1 end) as workOrderMilestoneCompletionCount" +
" from WorkOrderMilestones" + " from WorkOrderMilestones" +
" where recordDelete_timeMillis is null" + " where recordDelete_timeMillis is null" +
" group by workOrderId) m on w.workOrderId = m.workOrderId") + " group by workOrderId) m on w.workOrderId = m.workOrderId") +
sqlWhereClause + sqlWhereClause +
" order by w.workOrderOpenDate desc, w.workOrderNumber desc" + " order by w.workOrderOpenDate desc, w.workOrderNumber desc" +
(options ? " limit " + options.limit + " offset " + options.offset : "") (options ? " limit " + options.limit + " offset " + options.offset : "")
) )
.all(sqlParameters); .all(sqlParameters);
}
if (
options &&
(options.includeComments || options.includeLotsAndLotOccupancies || options.includeMilestones)
) {
for (const workOrder of workOrders) {
if (options.includeComments) {
workOrder.workOrderComments = getWorkOrderComments(workOrder.workOrderId as number, database);
}
if (options.includeLotsAndLotOccupancies) {
workOrder.workOrderLots = getLots(
{
workOrderId: workOrder.workOrderId
},
{
limit: -1,
offset: 0
},
database
).lots;
workOrder.workOrderLotOccupancies = getLotOccupancies(
{
workOrderId: workOrder.workOrderId
},
{
limit: -1,
offset: 0,
includeOccupants: true
},
database
).lotOccupancies;
}
if (options.includeMilestones) {
workOrder.workOrderMilestones = getWorkOrderMilestones(
{
workOrderId: workOrder.workOrderId
},
{
orderBy: "date"
},
database
);
}
} }
}
if ( if (!connectedDatabase) {
options && database.close();
(options.includeComments || }
options.includeLotsAndLotOccupancies ||
options.includeMilestones)
) {
for (const workOrder of workOrders) {
if (options.includeComments) {
workOrder.workOrderComments = getWorkOrderComments(
workOrder.workOrderId as number,
database
);
}
if (options.includeLotsAndLotOccupancies) { return {
workOrder.workOrderLots = getLots( count,
{ workOrders
workOrderId: workOrder.workOrderId };
},
{
limit: -1,
offset: 0
},
database
).lots;
workOrder.workOrderLotOccupancies = getLotOccupancies(
{
workOrderId: workOrder.workOrderId
},
{
limit: -1,
offset: 0,
includeOccupants: true
},
database
).lotOccupancies;
}
if (options.includeMilestones) {
workOrder.workOrderMilestones = getWorkOrderMilestones(
{
workOrderId: workOrder.workOrderId
},
{
orderBy: "date"
},
database
);
}
}
}
if (!connectedDatabase) {
database.close();
}
return {
count,
workOrders
};
} }
export default getWorkOrders; export default getWorkOrders;

164
package-lock.json generated
View File

@ -67,8 +67,8 @@
"@types/randomcolor": "^0.5.7", "@types/randomcolor": "^0.5.7",
"@types/session-file-store": "^1.2.2", "@types/session-file-store": "^1.2.2",
"@types/uuid": "^9.0.0", "@types/uuid": "^9.0.0",
"@typescript-eslint/eslint-plugin": "^5.48.0", "@typescript-eslint/eslint-plugin": "^5.48.1",
"@typescript-eslint/parser": "^5.48.0", "@typescript-eslint/parser": "^5.48.1",
"bulma": "^0.9.4", "bulma": "^0.9.4",
"bulma-divider": "^0.2.0", "bulma-divider": "^0.2.0",
"bulma-helpers": "^0.4.3", "bulma-helpers": "^0.4.3",
@ -1376,14 +1376,14 @@
} }
}, },
"node_modules/@typescript-eslint/eslint-plugin": { "node_modules/@typescript-eslint/eslint-plugin": {
"version": "5.48.0", "version": "5.48.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.1.tgz",
"integrity": "sha512-SVLafp0NXpoJY7ut6VFVUU9I+YeFsDzeQwtK0WZ+xbRN3mtxJ08je+6Oi2N89qDn087COdO0u3blKZNv9VetRQ==", "integrity": "sha512-9nY5K1Rp2ppmpb9s9S2aBiF3xo5uExCehMDmYmmFqqyxgenbHJ3qbarcLt4ITgaD6r/2ypdlcFRdcuVPnks+fQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": "5.48.0", "@typescript-eslint/scope-manager": "5.48.1",
"@typescript-eslint/type-utils": "5.48.0", "@typescript-eslint/type-utils": "5.48.1",
"@typescript-eslint/utils": "5.48.0", "@typescript-eslint/utils": "5.48.1",
"debug": "^4.3.4", "debug": "^4.3.4",
"ignore": "^5.2.0", "ignore": "^5.2.0",
"natural-compare-lite": "^1.4.0", "natural-compare-lite": "^1.4.0",
@ -1409,14 +1409,14 @@
} }
}, },
"node_modules/@typescript-eslint/parser": { "node_modules/@typescript-eslint/parser": {
"version": "5.48.0", "version": "5.48.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.48.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.48.1.tgz",
"integrity": "sha512-1mxNA8qfgxX8kBvRDIHEzrRGrKHQfQlbW6iHyfHYS0Q4X1af+S6mkLNtgCOsGVl8+/LUPrqdHMssAemkrQ01qg==", "integrity": "sha512-4yg+FJR/V1M9Xoq56SF9Iygqm+r5LMXvheo6DQ7/yUWynQ4YfCRnsKuRgqH4EQ5Ya76rVwlEpw4Xu+TgWQUcdA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": "5.48.0", "@typescript-eslint/scope-manager": "5.48.1",
"@typescript-eslint/types": "5.48.0", "@typescript-eslint/types": "5.48.1",
"@typescript-eslint/typescript-estree": "5.48.0", "@typescript-eslint/typescript-estree": "5.48.1",
"debug": "^4.3.4" "debug": "^4.3.4"
}, },
"engines": { "engines": {
@ -1436,13 +1436,13 @@
} }
}, },
"node_modules/@typescript-eslint/scope-manager": { "node_modules/@typescript-eslint/scope-manager": {
"version": "5.48.0", "version": "5.48.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.1.tgz",
"integrity": "sha512-0AA4LviDtVtZqlyUQnZMVHydDATpD9SAX/RC5qh6cBd3xmyWvmXYF+WT1oOmxkeMnWDlUVTwdODeucUnjz3gow==", "integrity": "sha512-S035ueRrbxRMKvSTv9vJKIWgr86BD8s3RqoRZmsSh/s8HhIs90g6UlK8ZabUSjUZQkhVxt7nmZ63VJ9dcZhtDQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "5.48.0", "@typescript-eslint/types": "5.48.1",
"@typescript-eslint/visitor-keys": "5.48.0" "@typescript-eslint/visitor-keys": "5.48.1"
}, },
"engines": { "engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0" "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@ -1453,13 +1453,13 @@
} }
}, },
"node_modules/@typescript-eslint/type-utils": { "node_modules/@typescript-eslint/type-utils": {
"version": "5.48.0", "version": "5.48.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.1.tgz",
"integrity": "sha512-vbtPO5sJyFjtHkGlGK4Sthmta0Bbls4Onv0bEqOGm7hP9h8UpRsHJwsrCiWtCUndTRNQO/qe6Ijz9rnT/DB+7g==", "integrity": "sha512-Hyr8HU8Alcuva1ppmqSYtM/Gp0q4JOp1F+/JH5D1IZm/bUBrV0edoewQZiEc1r6I8L4JL21broddxK8HAcZiqQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/typescript-estree": "5.48.0", "@typescript-eslint/typescript-estree": "5.48.1",
"@typescript-eslint/utils": "5.48.0", "@typescript-eslint/utils": "5.48.1",
"debug": "^4.3.4", "debug": "^4.3.4",
"tsutils": "^3.21.0" "tsutils": "^3.21.0"
}, },
@ -1480,9 +1480,9 @@
} }
}, },
"node_modules/@typescript-eslint/types": { "node_modules/@typescript-eslint/types": {
"version": "5.48.0", "version": "5.48.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.1.tgz",
"integrity": "sha512-UTe67B0Ypius0fnEE518NB2N8gGutIlTojeTg4nt0GQvikReVkurqxd2LvYa9q9M5MQ6rtpNyWTBxdscw40Xhw==", "integrity": "sha512-xHyDLU6MSuEEdIlzrrAerCGS3T7AA/L8Hggd0RCYBi0w3JMvGYxlLlXHeg50JI9Tfg5MrtsfuNxbS/3zF1/ATg==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0" "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@ -1493,13 +1493,13 @@
} }
}, },
"node_modules/@typescript-eslint/typescript-estree": { "node_modules/@typescript-eslint/typescript-estree": {
"version": "5.48.0", "version": "5.48.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.1.tgz",
"integrity": "sha512-7pjd94vvIjI1zTz6aq/5wwE/YrfIyEPLtGJmRfyNR9NYIW+rOvzzUv3Cmq2hRKpvt6e9vpvPUQ7puzX7VSmsEw==", "integrity": "sha512-Hut+Osk5FYr+sgFh8J/FHjqX6HFcDzTlWLrFqGoK5kVUN3VBHF/QzZmAsIXCQ8T/W9nQNBTqalxi1P3LSqWnRA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "5.48.0", "@typescript-eslint/types": "5.48.1",
"@typescript-eslint/visitor-keys": "5.48.0", "@typescript-eslint/visitor-keys": "5.48.1",
"debug": "^4.3.4", "debug": "^4.3.4",
"globby": "^11.1.0", "globby": "^11.1.0",
"is-glob": "^4.0.3", "is-glob": "^4.0.3",
@ -1520,16 +1520,16 @@
} }
}, },
"node_modules/@typescript-eslint/utils": { "node_modules/@typescript-eslint/utils": {
"version": "5.48.0", "version": "5.48.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.1.tgz",
"integrity": "sha512-x2jrMcPaMfsHRRIkL+x96++xdzvrdBCnYRd5QiW5Wgo1OB4kDYPbC1XjWP/TNqlfK93K/lUL92erq5zPLgFScQ==", "integrity": "sha512-SmQuSrCGUOdmGMwivW14Z0Lj8dxG1mOFZ7soeJ0TQZEJcs3n5Ndgkg0A4bcMFzBELqLJ6GTHnEU+iIoaD6hFGA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/json-schema": "^7.0.9", "@types/json-schema": "^7.0.9",
"@types/semver": "^7.3.12", "@types/semver": "^7.3.12",
"@typescript-eslint/scope-manager": "5.48.0", "@typescript-eslint/scope-manager": "5.48.1",
"@typescript-eslint/types": "5.48.0", "@typescript-eslint/types": "5.48.1",
"@typescript-eslint/typescript-estree": "5.48.0", "@typescript-eslint/typescript-estree": "5.48.1",
"eslint-scope": "^5.1.1", "eslint-scope": "^5.1.1",
"eslint-utils": "^3.0.0", "eslint-utils": "^3.0.0",
"semver": "^7.3.7" "semver": "^7.3.7"
@ -1546,12 +1546,12 @@
} }
}, },
"node_modules/@typescript-eslint/visitor-keys": { "node_modules/@typescript-eslint/visitor-keys": {
"version": "5.48.0", "version": "5.48.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.1.tgz",
"integrity": "sha512-5motVPz5EgxQ0bHjut3chzBkJ3Z3sheYVcSwS5BpHZpLqSptSmELNtGixmgj65+rIfhvtQTz5i9OP2vtzdDH7Q==", "integrity": "sha512-Ns0XBwmfuX7ZknznfXozgnydyR8F6ev/KEGePP4i74uL3ArsKbEhJ7raeKr1JSa997DBDwol/4a0Y+At82c9dA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "5.48.0", "@typescript-eslint/types": "5.48.1",
"eslint-visitor-keys": "^3.3.0" "eslint-visitor-keys": "^3.3.0"
}, },
"engines": { "engines": {
@ -13709,14 +13709,14 @@
} }
}, },
"@typescript-eslint/eslint-plugin": { "@typescript-eslint/eslint-plugin": {
"version": "5.48.0", "version": "5.48.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.1.tgz",
"integrity": "sha512-SVLafp0NXpoJY7ut6VFVUU9I+YeFsDzeQwtK0WZ+xbRN3mtxJ08je+6Oi2N89qDn087COdO0u3blKZNv9VetRQ==", "integrity": "sha512-9nY5K1Rp2ppmpb9s9S2aBiF3xo5uExCehMDmYmmFqqyxgenbHJ3qbarcLt4ITgaD6r/2ypdlcFRdcuVPnks+fQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/scope-manager": "5.48.0", "@typescript-eslint/scope-manager": "5.48.1",
"@typescript-eslint/type-utils": "5.48.0", "@typescript-eslint/type-utils": "5.48.1",
"@typescript-eslint/utils": "5.48.0", "@typescript-eslint/utils": "5.48.1",
"debug": "^4.3.4", "debug": "^4.3.4",
"ignore": "^5.2.0", "ignore": "^5.2.0",
"natural-compare-lite": "^1.4.0", "natural-compare-lite": "^1.4.0",
@ -13726,53 +13726,53 @@
} }
}, },
"@typescript-eslint/parser": { "@typescript-eslint/parser": {
"version": "5.48.0", "version": "5.48.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.48.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.48.1.tgz",
"integrity": "sha512-1mxNA8qfgxX8kBvRDIHEzrRGrKHQfQlbW6iHyfHYS0Q4X1af+S6mkLNtgCOsGVl8+/LUPrqdHMssAemkrQ01qg==", "integrity": "sha512-4yg+FJR/V1M9Xoq56SF9Iygqm+r5LMXvheo6DQ7/yUWynQ4YfCRnsKuRgqH4EQ5Ya76rVwlEpw4Xu+TgWQUcdA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/scope-manager": "5.48.0", "@typescript-eslint/scope-manager": "5.48.1",
"@typescript-eslint/types": "5.48.0", "@typescript-eslint/types": "5.48.1",
"@typescript-eslint/typescript-estree": "5.48.0", "@typescript-eslint/typescript-estree": "5.48.1",
"debug": "^4.3.4" "debug": "^4.3.4"
} }
}, },
"@typescript-eslint/scope-manager": { "@typescript-eslint/scope-manager": {
"version": "5.48.0", "version": "5.48.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.1.tgz",
"integrity": "sha512-0AA4LviDtVtZqlyUQnZMVHydDATpD9SAX/RC5qh6cBd3xmyWvmXYF+WT1oOmxkeMnWDlUVTwdODeucUnjz3gow==", "integrity": "sha512-S035ueRrbxRMKvSTv9vJKIWgr86BD8s3RqoRZmsSh/s8HhIs90g6UlK8ZabUSjUZQkhVxt7nmZ63VJ9dcZhtDQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/types": "5.48.0", "@typescript-eslint/types": "5.48.1",
"@typescript-eslint/visitor-keys": "5.48.0" "@typescript-eslint/visitor-keys": "5.48.1"
} }
}, },
"@typescript-eslint/type-utils": { "@typescript-eslint/type-utils": {
"version": "5.48.0", "version": "5.48.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.1.tgz",
"integrity": "sha512-vbtPO5sJyFjtHkGlGK4Sthmta0Bbls4Onv0bEqOGm7hP9h8UpRsHJwsrCiWtCUndTRNQO/qe6Ijz9rnT/DB+7g==", "integrity": "sha512-Hyr8HU8Alcuva1ppmqSYtM/Gp0q4JOp1F+/JH5D1IZm/bUBrV0edoewQZiEc1r6I8L4JL21broddxK8HAcZiqQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/typescript-estree": "5.48.0", "@typescript-eslint/typescript-estree": "5.48.1",
"@typescript-eslint/utils": "5.48.0", "@typescript-eslint/utils": "5.48.1",
"debug": "^4.3.4", "debug": "^4.3.4",
"tsutils": "^3.21.0" "tsutils": "^3.21.0"
} }
}, },
"@typescript-eslint/types": { "@typescript-eslint/types": {
"version": "5.48.0", "version": "5.48.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.1.tgz",
"integrity": "sha512-UTe67B0Ypius0fnEE518NB2N8gGutIlTojeTg4nt0GQvikReVkurqxd2LvYa9q9M5MQ6rtpNyWTBxdscw40Xhw==", "integrity": "sha512-xHyDLU6MSuEEdIlzrrAerCGS3T7AA/L8Hggd0RCYBi0w3JMvGYxlLlXHeg50JI9Tfg5MrtsfuNxbS/3zF1/ATg==",
"dev": true "dev": true
}, },
"@typescript-eslint/typescript-estree": { "@typescript-eslint/typescript-estree": {
"version": "5.48.0", "version": "5.48.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.1.tgz",
"integrity": "sha512-7pjd94vvIjI1zTz6aq/5wwE/YrfIyEPLtGJmRfyNR9NYIW+rOvzzUv3Cmq2hRKpvt6e9vpvPUQ7puzX7VSmsEw==", "integrity": "sha512-Hut+Osk5FYr+sgFh8J/FHjqX6HFcDzTlWLrFqGoK5kVUN3VBHF/QzZmAsIXCQ8T/W9nQNBTqalxi1P3LSqWnRA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/types": "5.48.0", "@typescript-eslint/types": "5.48.1",
"@typescript-eslint/visitor-keys": "5.48.0", "@typescript-eslint/visitor-keys": "5.48.1",
"debug": "^4.3.4", "debug": "^4.3.4",
"globby": "^11.1.0", "globby": "^11.1.0",
"is-glob": "^4.0.3", "is-glob": "^4.0.3",
@ -13781,28 +13781,28 @@
} }
}, },
"@typescript-eslint/utils": { "@typescript-eslint/utils": {
"version": "5.48.0", "version": "5.48.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.1.tgz",
"integrity": "sha512-x2jrMcPaMfsHRRIkL+x96++xdzvrdBCnYRd5QiW5Wgo1OB4kDYPbC1XjWP/TNqlfK93K/lUL92erq5zPLgFScQ==", "integrity": "sha512-SmQuSrCGUOdmGMwivW14Z0Lj8dxG1mOFZ7soeJ0TQZEJcs3n5Ndgkg0A4bcMFzBELqLJ6GTHnEU+iIoaD6hFGA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/json-schema": "^7.0.9", "@types/json-schema": "^7.0.9",
"@types/semver": "^7.3.12", "@types/semver": "^7.3.12",
"@typescript-eslint/scope-manager": "5.48.0", "@typescript-eslint/scope-manager": "5.48.1",
"@typescript-eslint/types": "5.48.0", "@typescript-eslint/types": "5.48.1",
"@typescript-eslint/typescript-estree": "5.48.0", "@typescript-eslint/typescript-estree": "5.48.1",
"eslint-scope": "^5.1.1", "eslint-scope": "^5.1.1",
"eslint-utils": "^3.0.0", "eslint-utils": "^3.0.0",
"semver": "^7.3.7" "semver": "^7.3.7"
} }
}, },
"@typescript-eslint/visitor-keys": { "@typescript-eslint/visitor-keys": {
"version": "5.48.0", "version": "5.48.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.1.tgz",
"integrity": "sha512-5motVPz5EgxQ0bHjut3chzBkJ3Z3sheYVcSwS5BpHZpLqSptSmELNtGixmgj65+rIfhvtQTz5i9OP2vtzdDH7Q==", "integrity": "sha512-Ns0XBwmfuX7ZknznfXozgnydyR8F6ev/KEGePP4i74uL3ArsKbEhJ7raeKr1JSa997DBDwol/4a0Y+At82c9dA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/types": "5.48.0", "@typescript-eslint/types": "5.48.1",
"eslint-visitor-keys": "^3.3.0" "eslint-visitor-keys": "^3.3.0"
} }
}, },

View File

@ -91,8 +91,8 @@
"@types/randomcolor": "^0.5.7", "@types/randomcolor": "^0.5.7",
"@types/session-file-store": "^1.2.2", "@types/session-file-store": "^1.2.2",
"@types/uuid": "^9.0.0", "@types/uuid": "^9.0.0",
"@typescript-eslint/eslint-plugin": "^5.48.0", "@typescript-eslint/eslint-plugin": "^5.48.1",
"@typescript-eslint/parser": "^5.48.0", "@typescript-eslint/parser": "^5.48.1",
"bulma": "^0.9.4", "bulma": "^0.9.4",
"bulma-divider": "^0.2.0", "bulma-divider": "^0.2.0",
"bulma-helpers": "^0.4.3", "bulma-helpers": "^0.4.3",

View File

@ -7,15 +7,19 @@ $white: #fff;
$black: #000; $black: #000;
.is-linethrough { .is-linethrough {
text-decoration: line-through; text-decoration: line-through;
} }
.has-width-10 { .has-width-10 {
width: 10px; width: 10px;
}
.has-width-900 {
width: 900px;
} }
.has-min-page-height { .has-min-page-height {
min-height: 100vh; min-height: 100vh;
} }
/* /*
@ -26,21 +30,21 @@ $black: #000;
.has-status-loading .is-hidden-status-loading, .has-status-loading .is-hidden-status-loading,
.has-status-view .is-hidden-status-view, .has-status-view .is-hidden-status-view,
fieldset:enabled .is-hidden-enabled { fieldset:enabled .is-hidden-enabled {
display: none; display: none;
} }
.has-status-view .is-noninteractive-status-view { .has-status-view .is-noninteractive-status-view {
pointer-events: none; pointer-events: none;
} }
/* to fix page titles inside level components, set on .level-left */ /* to fix page titles inside level components, set on .level-left */
.has-flex-shrink-1 { .has-flex-shrink-1 {
flex-shrink: 1; flex-shrink: 1;
} }
.has-border-radius-3 { .has-border-radius-3 {
border-radius: 3px; border-radius: 3px;
} }
/* /*
@ -48,28 +52,28 @@ fieldset:enabled .is-hidden-enabled {
*/ */
.tab-content { .tab-content {
display: none; display: none;
&.is-active { &.is-active {
display: block; display: block;
} }
} }
#is-login-page { #is-login-page {
overflow: auto; overflow: auto;
background-position: top center; background-position: top center;
background-size: cover; background-size: cover;
body > .columns { body > .columns {
min-height: 100vh; min-height: 100vh;
} }
} }
.button.is-xsmall { .button.is-xsmall {
height: 2em; height: 2em;
padding-top: 0; padding-top: 0;
padding-bottom: 0; padding-bottom: 0;
font-size: 0.75rem; font-size: 0.75rem;
} }
/* /*
@ -77,17 +81,17 @@ fieldset:enabled .is-hidden-enabled {
*/ */
.container.is-page { .container.is-page {
width: 8.5in; width: 8.5in;
padding: 10px 20px 20px; padding: 10px 20px 20px;
margin: 20px auto; margin: 20px auto;
background-color: $white; background-color: $white;
border: 1px solid $black; border: 1px solid $black;
@media print { @media print {
width: 100%; width: 100%;
padding: 0; padding: 0;
border: 0; border: 0;
} }
} }
/* /*
@ -95,26 +99,26 @@ fieldset:enabled .is-hidden-enabled {
*/ */
.image svg { .image svg {
display: block; display: block;
height: auto; height: auto;
width: 100%; width: 100%;
.highlight, .highlight,
.highlight path { .highlight path {
&.is-danger { &.is-danger {
stroke: $danger-dark !important; stroke: $danger-dark !important;
fill: rgba($danger-light, 0.6); fill: rgba($danger-light, 0.6);
}
&.is-success {
stroke: $success-dark !important;
fill: rgba($success, 0.6);
}
} }
text { &.is-success {
user-select: none; stroke: $success-dark !important;
fill: rgba($success, 0.6);
} }
}
text {
user-select: none;
}
} }
/* /*
@ -122,7 +126,7 @@ fieldset:enabled .is-hidden-enabled {
*/ */
.select option:disabled { .select option:disabled {
display: none; display: none;
} }
/* /*
@ -130,7 +134,7 @@ fieldset:enabled .is-hidden-enabled {
*/ */
.modal-card { .modal-card {
max-width: 100%; max-width: 100%;
} }
/* /*
@ -141,7 +145,7 @@ $black-ter: hsl(0, 0%, 14%);
.control .button.is-static, .control .button.is-static,
.menu .menu-label { .menu .menu-label {
color: $black-ter; color: $black-ter;
} }
/* /*
@ -149,11 +153,11 @@ $black-ter: hsl(0, 0%, 14%);
*/ */
.navbar.is-fixed-top { .navbar.is-fixed-top {
z-index: 1100; z-index: 1100;
} }
.modal { .modal {
z-index: 1200; z-index: 1200;
} }
/* /*
@ -161,8 +165,8 @@ $black-ter: hsl(0, 0%, 14%);
*/ */
span.button.is-static { span.button.is-static {
pointer-events: all; pointer-events: all;
cursor: default; cursor: default;
} }
/* /*
@ -170,25 +174,25 @@ span.button.is-static {
*/ */
.datetimepicker-dummy { .datetimepicker-dummy {
.datetimepicker-dummy-wrapper::before { .datetimepicker-dummy-wrapper::before {
mask: unset; mask: unset;
-webkit-mask: unset; -webkit-mask: unset;
background-color: transparent !important; background-color: transparent !important;
} }
/* fix left icon */ /* fix left icon */
.datetimepicker-dummy-wrapper .datetimepicker-dummy-input:first-child { .datetimepicker-dummy-wrapper .datetimepicker-dummy-input:first-child {
text-indent: 2rem; text-indent: 2rem;
} }
/* center the button */ /* center the button */
.datetimepicker-clear-button { .datetimepicker-clear-button {
transform: none; transform: none;
margin-right: 0.25rem; margin-right: 0.25rem;
margin-top: 0.15rem; margin-top: 0.15rem;
} }
} }
.datetimepicker.is-active { .datetimepicker.is-active {
z-index: 10; z-index: 10;
} }

View File

@ -4,30 +4,32 @@ Object.defineProperty(exports, "__esModule", { value: true });
(() => { (() => {
const los = exports.los; const los = exports.los;
const doCleanup = () => { const doCleanup = () => {
cityssm.postJSON(los.urlPrefix + "/admin/doCleanupDatabase", {}, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doCleanupDatabase', {}, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
bulmaJS.alert({ bulmaJS.alert({
title: "Database Cleaned Up Successfully", title: 'Database Cleaned Up Successfully',
message: `${responseJSON.inactivedRecordCount} records inactivated, message: `${responseJSON.inactivedRecordCount} records inactivated,
${responseJSON.purgedRecordCount} permanently deleted.`, ${responseJSON.purgedRecordCount} permanently deleted.`,
contextualColorName: "success" contextualColorName: 'success'
}); });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Cleaning Database", title: 'Error Cleaning Database',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
document.querySelector("#button--cleanupDatabase").addEventListener("click", () => { document
.querySelector('#button--cleanupDatabase')
.addEventListener('click', () => {
bulmaJS.confirm({ bulmaJS.confirm({
title: "Cleanup Database", title: 'Cleanup Database',
message: "Are you sure you want to cleanup up the database?", message: 'Are you sure you want to cleanup up the database?',
okButton: { okButton: {
text: "Yes, Cleanup Database", text: 'Yes, Cleanup Database',
callbackFunction: doCleanup callbackFunction: doCleanup
} }
}); });

View File

@ -1,53 +1,55 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
import type * as globalTypes from "../types/globalTypes"; import type * as globalTypes from '../types/globalTypes'
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
import type { BulmaJS } from "@cityssm/bulma-js/types"; import type { BulmaJS } from '@cityssm/bulma-js/types'
declare const cityssm: cityssmGlobal; declare const 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 doCleanup = () => { const doCleanup = () => {
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + "/admin/doCleanupDatabase", los.urlPrefix + '/admin/doCleanupDatabase',
{}, {},
(responseJSON: { (responseJSON: {
success: boolean; success: boolean
errorMessage?: string; errorMessage?: string
inactivedRecordCount: number; inactivedRecordCount: number
purgedRecordCount: number; purgedRecordCount: number
}) => { }) => {
if (responseJSON.success) { if (responseJSON.success) {
bulmaJS.alert({ bulmaJS.alert({
title: "Database Cleaned Up Successfully", title: 'Database Cleaned Up Successfully',
message: `${responseJSON.inactivedRecordCount} records inactivated, message: `${responseJSON.inactivedRecordCount} records inactivated,
${responseJSON.purgedRecordCount} permanently deleted.`, ${responseJSON.purgedRecordCount} permanently deleted.`,
contextualColorName: "success" contextualColorName: 'success'
}); })
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Cleaning Database", title: 'Error Cleaning Database',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); })
} }
} }
); )
}; }
document.querySelector("#button--cleanupDatabase")!.addEventListener("click", () => { document
bulmaJS.confirm({ .querySelector('#button--cleanupDatabase')!
title: "Cleanup Database", .addEventListener('click', () => {
message: "Are you sure you want to cleanup up the database?", bulmaJS.confirm({
okButton: { title: 'Cleanup Database',
text: "Yes, Cleanup Database", message: 'Are you sure you want to cleanup up the database?',
callbackFunction: doCleanup okButton: {
} text: 'Yes, Cleanup Database',
}); callbackFunction: doCleanup
}); }
})(); })
})
})()

View File

@ -3,7 +3,7 @@
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
(() => { (() => {
const los = exports.los; const los = exports.los;
const feeCategoriesContainerElement = document.querySelector("#container--feeCategories"); const feeCategoriesContainerElement = document.querySelector('#container--feeCategories');
let feeCategories = exports.feeCategories; let feeCategories = exports.feeCategories;
delete exports.feeCategories; delete exports.feeCategories;
function renderFeeCategories() { function renderFeeCategories() {
@ -13,152 +13,164 @@ Object.defineProperty(exports, "__esModule", { value: true });
</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 = "panel container--feeCategory"; feeCategoryContainerElement.className = 'panel container--feeCategory';
feeCategoryContainerElement.dataset.feeCategoryId = feeCategory.feeCategoryId.toString(); feeCategoryContainerElement.dataset.feeCategoryId =
feeCategory.feeCategoryId.toString();
feeCategoryContainerElement.innerHTML = feeCategoryContainerElement.innerHTML =
'<div class="panel-heading">' + '<div class="panel-heading">' +
'<div class="columns">' + '<div class="columns">' +
('<div class="column">' + ('<div class="column">' +
'<h2 class="title is-4">' + '<h2 class="title is-4">' +
cityssm.escapeHTML(feeCategory.feeCategory || "") + cityssm.escapeHTML(feeCategory.feeCategory || '') +
"</h2>" + '</h2>' +
"</div>") + '</div>') +
('<div class="column is-narrow">' + ('<div class="column is-narrow">' +
'<div class="field is-grouped is-justify-content-end">' + '<div class="field is-grouped is-justify-content-end">' +
(feeCategory.fees.length === 0 (feeCategory.fees.length === 0
? '<div class="control">' + ? '<div class="control">' +
'<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="control">' + ('<div class="control">' +
'<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="control">' + ('<div class="control">' +
'<button class="button is-small is-success button--addFee" data-cy="addFee" type="button">' + '<button class="button is-small is-success button--addFee" data-cy="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="control">' + ('<div class="control">' +
los.getMoveUpDownButtonFieldHTML("button--moveFeeCategoryUp", "button--moveFeeCategoryDown") + los.getMoveUpDownButtonFieldHTML('button--moveFeeCategoryUp', 'button--moveFeeCategoryDown') +
"</div>") + '</div>') +
"</div>") + '</div>') +
"</div>" + '</div>' +
"</div>"; '</div>';
if (feeCategory.fees.length === 0) { if (feeCategory.fees.length === 0) {
feeCategoryContainerElement.insertAdjacentHTML("beforeend", `<div class="panel-block is-block"> feeCategoryContainerElement.insertAdjacentHTML('beforeend', `<div class="panel-block is-block">
<div class="message is-info"> <div class="message is-info">
<p class="message-body"> <p class="message-body">
There are no fees in the There are no fees in the
"${cityssm.escapeHTML(feeCategory.feeCategory || "")}" "${cityssm.escapeHTML(feeCategory.feeCategory || '')}"
category. category.
</p> </p>
</div> </div>
</div>`); </div>`);
feeCategoryContainerElement feeCategoryContainerElement
.querySelector(".button--deleteFeeCategory") .querySelector('.button--deleteFeeCategory')
.addEventListener("click", confirmDeleteFeeCategory); .addEventListener('click', confirmDeleteFeeCategory);
} }
else { else {
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();
const hasTagsBlock = fee.isRequired || fee.occupancyTypeId || fee.lotTypeId; const hasTagsBlock = fee.isRequired || fee.occupancyTypeId || fee.lotTypeId;
panelBlockElement.innerHTML = panelBlockElement.innerHTML =
'<div class="columns">' + '<div class="columns">' +
('<div class="column is-half">' + ('<div class="column is-half">' +
"<p>" + '<p>' +
'<a class="has-text-weight-bold" href="#">' + '<a class="has-text-weight-bold" href="#">' +
cityssm.escapeHTML(fee.feeName || "") + cityssm.escapeHTML(fee.feeName || '') +
"</a><br />" + '</a><br />' +
"<small>" + '<small>' +
cityssm.escapeHTML(fee.feeDescription || "").replace(/\n/g, "<br />") + cityssm
"</small>" + .escapeHTML(fee.feeDescription || '')
"</p>" + .replace(/\n/g, '<br />') +
'</small>' +
'</p>' +
(hasTagsBlock (hasTagsBlock
? '<p class="tags">' + ? '<p class="tags">' +
(fee.isRequired ? '<span class="tag is-warning">Required</span>' : "") + (fee.isRequired
? '<span class="tag is-warning">Required</span>'
: '') +
(fee.occupancyTypeId (fee.occupancyTypeId
? ' <span class="tag has-tooltip-bottom" data-tooltip="' + ? ' <span class="tag has-tooltip-bottom" data-tooltip="' +
los.escapedAliases.Occupancy + los.escapedAliases.Occupancy +
' Type Filter">' + ' Type Filter">' +
cityssm.escapeHTML(fee.occupancyType || "") + cityssm.escapeHTML(fee.occupancyType || '') +
"</span>" '</span>'
: "") + : '') +
(fee.lotTypeId (fee.lotTypeId
? ' <span class="tag has-tooltip-bottom" data-tooltip="' + ? ' <span class="tag has-tooltip-bottom" data-tooltip="' +
los.escapedAliases.Lot + los.escapedAliases.Lot +
' Type Filter">' + ' Type Filter">' +
cityssm.escapeHTML(fee.lotType || "") + cityssm.escapeHTML(fee.lotType || '') +
"</span>" '</span>'
: "") + : '') +
"</p>" '</p>'
: "") + : '') +
"</div>") + '</div>') +
('<div class="column">' + ('<div class="column">' +
'<div class="columns is-mobile">' + '<div class="columns is-mobile">' +
('<div class="column has-text-centered">' + ('<div class="column has-text-centered">' +
(fee.feeFunction (fee.feeFunction
? cityssm.escapeHTML(fee.feeFunction) + ? cityssm.escapeHTML(fee.feeFunction) +
"<br />" + '<br />' +
"<small>Fee Function</small>" '<small>Fee Function</small>'
: "$" + fee.feeAmount.toFixed(2) + "<br />" + "<small>Fee</small>") + : '$' +
"</div>") + fee.feeAmount.toFixed(2) +
'<br />' +
'<small>Fee</small>') +
'</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 || "") + ? cityssm.escapeHTML(fee.quantityUnit || '') +
"<br />" + '<br />' +
"<small>Quantity</small>" '<small>Quantity</small>'
: "") + : '') +
"</div>") + '</div>') +
"</div>" + '</div>' +
"</div>") + '</div>') +
('<div class="column is-narrow">' + ('<div class="column is-narrow">' +
los.getMoveUpDownButtonFieldHTML("button--moveFeeUp", "button--moveFeeDown") + los.getMoveUpDownButtonFieldHTML('button--moveFeeUp', 'button--moveFeeDown') +
"</div>" + '</div>' +
"</div>") + '</div>') +
"</div>"; '</div>';
panelBlockElement.querySelector("a").addEventListener("click", openEditFee); panelBlockElement
panelBlockElement.querySelector(".button--moveFeeUp").addEventListener("click", moveFee); .querySelector('a')
panelBlockElement.querySelector(".button--moveFeeDown").addEventListener("click", moveFee); .addEventListener('click', openEditFee);
panelBlockElement.querySelector('.button--moveFeeUp').addEventListener('click', moveFee);
panelBlockElement.querySelector('.button--moveFeeDown').addEventListener('click', moveFee);
feeCategoryContainerElement.append(panelBlockElement); feeCategoryContainerElement.append(panelBlockElement);
} }
} }
feeCategoryContainerElement feeCategoryContainerElement
.querySelector(".button--editFeeCategory") .querySelector('.button--editFeeCategory')
.addEventListener("click", openEditFeeCategory); .addEventListener('click', openEditFeeCategory);
feeCategoryContainerElement feeCategoryContainerElement
.querySelector(".button--addFee") .querySelector('.button--addFee')
.addEventListener("click", openAddFee); .addEventListener('click', openAddFee);
feeCategoryContainerElement.querySelector(".button--moveFeeCategoryUp").addEventListener("click", moveFeeCategory); feeCategoryContainerElement.querySelector('.button--moveFeeCategoryUp').addEventListener('click', moveFeeCategory);
feeCategoryContainerElement.querySelector(".button--moveFeeCategoryDown").addEventListener("click", moveFeeCategory); feeCategoryContainerElement.querySelector('.button--moveFeeCategoryDown').addEventListener('click', moveFeeCategory);
feeCategoriesContainerElement.append(feeCategoryContainerElement); feeCategoriesContainerElement.append(feeCategoryContainerElement);
} }
} }
/* /*
* Fee Categories * Fee Categories
*/ */
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();
cityssm.postJSON(los.urlPrefix + "/admin/doAddFeeCategory", submitEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doAddFeeCategory', submitEvent.currentTarget, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
feeCategories = responseJSON.feeCategories; feeCategories = responseJSON.feeCategories;
addCloseModalFunction(); addCloseModalFunction();
@ -166,36 +178,37 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Creating Fee Category", title: 'Error Creating Fee Category',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
cityssm.openHtmlModal("adminFees-addFeeCategory", { cityssm.openHtmlModal('adminFees-addFeeCategory', {
onshown(modalElement, closeModalFunction) { onshown(modalElement, closeModalFunction) {
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();
document.querySelector("#button--addFeeCategory").focus(); document.querySelector('#button--addFeeCategory').focus();
} }
}); });
}); });
function openEditFeeCategory(clickEvent) { function openEditFeeCategory(clickEvent) {
const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest(".container--feeCategory") const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest('.container--feeCategory').dataset.feeCategoryId, 10);
.dataset.feeCategoryId, 10);
const feeCategory = feeCategories.find((currentFeeCategory) => { const feeCategory = feeCategories.find((currentFeeCategory) => {
return currentFeeCategory.feeCategoryId === feeCategoryId; return currentFeeCategory.feeCategoryId === feeCategoryId;
}); });
let editCloseModalFunction; let editCloseModalFunction;
function doUpdateFeeCategory(submitEvent) { function doUpdateFeeCategory(submitEvent) {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateFeeCategory", submitEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doUpdateFeeCategory', submitEvent.currentTarget, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
feeCategories = responseJSON.feeCategories; feeCategories = responseJSON.feeCategories;
editCloseModalFunction(); editCloseModalFunction();
@ -203,25 +216,26 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Updating Fee Category", title: 'Error Updating Fee Category',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
} }
cityssm.openHtmlModal("adminFees-editFeeCategory", { cityssm.openHtmlModal('adminFees-editFeeCategory', {
onshow(modalElement) { onshow(modalElement) {
modalElement.querySelector("#feeCategoryEdit--feeCategoryId").value = ;
feeCategory.feeCategoryId.toString(); modalElement.querySelector('#feeCategoryEdit--feeCategoryId').value = feeCategory.feeCategoryId.toString();
modalElement.querySelector("#feeCategoryEdit--feeCategory").value = modalElement.querySelector('#feeCategoryEdit--feeCategory').value = feeCategory.feeCategory;
feeCategory.feeCategory;
}, },
onshown(modalElement, closeModalFunction) { onshown(modalElement, closeModalFunction) {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
editCloseModalFunction = closeModalFunction; editCloseModalFunction = closeModalFunction;
modalElement.querySelector("form").addEventListener("submit", doUpdateFeeCategory); modalElement
modalElement.querySelector("#feeCategoryEdit--feeCategory").focus(); .querySelector('form')
.addEventListener('submit', doUpdateFeeCategory);
modalElement.querySelector('#feeCategoryEdit--feeCategory').focus();
}, },
onremoved: () => { onremoved: () => {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
@ -229,10 +243,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
}); });
} }
function confirmDeleteFeeCategory(clickEvent) { function confirmDeleteFeeCategory(clickEvent) {
const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest(".container--feeCategory") const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest('.container--feeCategory').dataset.feeCategoryId, 10);
.dataset.feeCategoryId, 10);
function doDelete() { function doDelete() {
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteFeeCategory", { cityssm.postJSON(los.urlPrefix + '/admin/doDeleteFeeCategory', {
feeCategoryId feeCategoryId
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
@ -241,32 +254,33 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Updating Fee Category", title: 'Error Updating Fee Category',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
} }
bulmaJS.confirm({ bulmaJS.confirm({
title: "Delete Fee Category?", title: 'Delete Fee Category?',
message: "Are you sure you want to delete this fee category?", message: 'Are you sure you want to delete this fee category?',
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: "Yes, Delete the Fee Category", text: 'Yes, Delete the Fee Category',
callbackFunction: doDelete callbackFunction: doDelete
} }
}); });
} }
function moveFeeCategory(clickEvent) { function moveFeeCategory(clickEvent) {
const buttonElement = clickEvent.currentTarget; const buttonElement = clickEvent.currentTarget;
const feeCategoryId = buttonElement.closest(".container--feeCategory").dataset const feeCategoryId = buttonElement.closest('.container--feeCategory').dataset.feeCategoryId;
.feeCategoryId;
cityssm.postJSON(los.urlPrefix + cityssm.postJSON(los.urlPrefix +
"/admin/" + '/admin/' +
(buttonElement.dataset.direction === "up" ? "doMoveFeeCategoryUp" : "doMoveFeeCategoryDown"), { (buttonElement.dataset.direction === 'up'
? 'doMoveFeeCategoryUp'
: 'doMoveFeeCategoryDown'), {
feeCategoryId, feeCategoryId,
moveToEnd: clickEvent.shiftKey ? "1" : "0" moveToEnd: clickEvent.shiftKey ? '1' : '0'
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
feeCategories = responseJSON.feeCategories; feeCategories = responseJSON.feeCategories;
@ -274,9 +288,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Moving Fee Category", title: 'Error Moving Fee Category',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
@ -285,12 +299,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
* Fees * Fees
*/ */
function openAddFee(clickEvent) { function openAddFee(clickEvent) {
const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest(".container--feeCategory") const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest('.container--feeCategory').dataset.feeCategoryId, 10);
.dataset.feeCategoryId, 10);
let addCloseModalFunction; let addCloseModalFunction;
function doAddFee(submitEvent) { function doAddFee(submitEvent) {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/admin/doAddFee", submitEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doAddFee', submitEvent.currentTarget, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
feeCategories = responseJSON.feeCategories; feeCategories = responseJSON.feeCategories;
addCloseModalFunction(); addCloseModalFunction();
@ -298,18 +311,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Adding Fee", title: 'Error Adding Fee',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
} }
cityssm.openHtmlModal("adminFees-addFee", { cityssm.openHtmlModal('adminFees-addFee', {
onshow(modalElement) { onshow(modalElement) {
const feeCategoryElement = modalElement.querySelector("#feeAdd--feeCategoryId"); const feeCategoryElement = modalElement.querySelector('#feeAdd--feeCategoryId');
for (const feeCategory of feeCategories) { for (const feeCategory of feeCategories) {
const optionElement = document.createElement("option"); const optionElement = document.createElement('option');
optionElement.value = feeCategory.feeCategoryId.toString(); optionElement.value = feeCategory.feeCategoryId.toString();
optionElement.textContent = feeCategory.feeCategory; optionElement.textContent = feeCategory.feeCategory;
if (feeCategory.feeCategoryId === feeCategoryId) { if (feeCategory.feeCategoryId === feeCategoryId) {
@ -317,60 +330,67 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
feeCategoryElement.append(optionElement); feeCategoryElement.append(optionElement);
} }
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);
} }
const lotTypeElement = modalElement.querySelector("#feeAdd--lotTypeId"); const lotTypeElement = modalElement.querySelector('#feeAdd--lotTypeId');
for (const lotType of exports.lotTypes) { for (const lotType of exports.lotTypes) {
const optionElement = document.createElement("option"); const optionElement = document.createElement('option');
optionElement.value = lotType.lotTypeId.toString(); optionElement.value = lotType.lotTypeId.toString();
optionElement.textContent = lotType.lotType; optionElement.textContent = lotType.lotType;
lotTypeElement.append(optionElement); lotTypeElement.append(optionElement);
} }
modalElement.querySelector("#feeAdd--taxPercentage").value = exports.taxPercentageDefault.toString(); ;
modalElement.querySelector('#feeAdd--taxPercentage').value = exports.taxPercentageDefault.toString();
los.populateAliases(modalElement); los.populateAliases(modalElement);
}, },
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
feeAmountElement.classList.add("is-success"); .closest('.select')
.classList.remove('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
const taxAmountElement = modalElement.querySelector("#feeAdd--taxAmount"); .querySelector('#feeAdd--taxPercentage')
const taxPercentageElement = modalElement.querySelector("#feeAdd--taxPercentage"); .addEventListener('keyup', () => {
if (taxPercentageElement.value === "") { const taxAmountElement = modalElement.querySelector('#feeAdd--taxAmount');
taxPercentageElement.classList.remove("is-success"); const taxPercentageElement = modalElement.querySelector('#feeAdd--taxPercentage');
taxAmountElement.classList.add("is-success"); if (taxPercentageElement.value === '') {
taxPercentageElement.classList.remove('is-success');
taxAmountElement.classList.add('is-success');
taxAmountElement.disabled = false; taxAmountElement.disabled = false;
} }
else { else {
taxPercentageElement.classList.add("is-success"); taxPercentageElement.classList.add('is-success');
taxAmountElement.classList.remove("is-success"); taxAmountElement.classList.remove('is-success');
taxAmountElement.disabled = true; taxAmountElement.disabled = true;
} }
}); });
modalElement.querySelector("#feeAdd--includeQuantity").addEventListener("change", () => { modalElement
modalElement.querySelector("#feeAdd--quantityUnit").disabled = .querySelector('#feeAdd--includeQuantity')
modalElement.querySelector("#feeAdd--includeQuantity") .addEventListener('change', () => {
.value === ""; ;
modalElement.querySelector('#feeAdd--quantityUnit').disabled =
modalElement.querySelector('#feeAdd--includeQuantity').value === '';
}); });
}, },
onremoved() { onremoved() {
@ -380,9 +400,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
function openEditFee(clickEvent) { function openEditFee(clickEvent) {
clickEvent.preventDefault(); clickEvent.preventDefault();
const feeContainerElement = clickEvent.currentTarget.closest(".container--fee"); const feeContainerElement = clickEvent.currentTarget.closest('.container--fee');
const feeId = Number.parseInt(feeContainerElement.dataset.feeId, 10); const feeId = Number.parseInt(feeContainerElement.dataset.feeId, 10);
const feeCategoryId = Number.parseInt(feeContainerElement.closest(".container--feeCategory").dataset.feeCategoryId); const feeCategoryId = Number.parseInt(feeContainerElement.closest('.container--feeCategory')
.dataset.feeCategoryId);
const feeCategory = feeCategories.find((currentFeeCategory) => { const feeCategory = feeCategories.find((currentFeeCategory) => {
return currentFeeCategory.feeCategoryId === feeCategoryId; return currentFeeCategory.feeCategoryId === feeCategoryId;
}); });
@ -393,7 +414,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
let editModalElement; let editModalElement;
function doUpdateFee(submitEvent) { function doUpdateFee(submitEvent) {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateFee", submitEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doUpdateFee', submitEvent.currentTarget, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
feeCategories = responseJSON.feeCategories; feeCategories = responseJSON.feeCategories;
editCloseModalFunction(); editCloseModalFunction();
@ -401,9 +422,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Updating Fee", title: 'Error Updating Fee',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
@ -411,7 +432,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
function confirmDeleteFee(clickEvent) { function confirmDeleteFee(clickEvent) {
clickEvent.preventDefault(); clickEvent.preventDefault();
const doDelete = () => { const doDelete = () => {
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteFee", { cityssm.postJSON(los.urlPrefix + '/admin/doDeleteFee', {
feeId feeId
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
@ -421,64 +442,62 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Deleting Fee", title: 'Error Deleting Fee',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
bulmaJS.confirm({ bulmaJS.confirm({
title: "Delete Fee?", title: 'Delete Fee?',
message: "Are you sure you want to delete this fee?", message: 'Are you sure you want to delete this fee?',
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: "Yes, Delete the Fee", text: 'Yes, Delete the Fee',
callbackFunction: doDelete callbackFunction: doDelete
} }
}); });
} }
function toggleFeeFields() { function toggleFeeFields() {
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;
} }
} }
function toggleTaxFields() { function toggleTaxFields() {
const taxAmountElement = editModalElement.querySelector("#feeEdit--taxAmount"); const taxAmountElement = editModalElement.querySelector('#feeEdit--taxAmount');
const taxPercentageElement = editModalElement.querySelector("#feeEdit--taxPercentage"); const taxPercentageElement = editModalElement.querySelector('#feeEdit--taxPercentage');
if (taxPercentageElement.value === "") { if (taxPercentageElement.value === '') {
taxPercentageElement.classList.remove("is-success"); taxPercentageElement.classList.remove('is-success');
taxAmountElement.classList.add("is-success"); taxAmountElement.classList.add('is-success');
taxAmountElement.disabled = false; taxAmountElement.disabled = false;
} }
else { else {
taxPercentageElement.classList.add("is-success"); taxPercentageElement.classList.add('is-success');
taxAmountElement.classList.remove("is-success"); taxAmountElement.classList.remove('is-success');
taxAmountElement.disabled = true; taxAmountElement.disabled = true;
} }
} }
function toggleQuantityFields() { function toggleQuantityFields() {
const includeQuanitityValue = editModalElement.querySelector("#feeEdit--includeQuantity").value; const includeQuanitityValue = editModalElement.querySelector('#feeEdit--includeQuantity').value;
editModalElement.querySelector("#feeEdit--quantityUnit").disabled = editModalElement.querySelector('#feeEdit--quantityUnit').disabled = includeQuanitityValue === '';
includeQuanitityValue === "";
} }
cityssm.openHtmlModal("adminFees-editFee", { cityssm.openHtmlModal('adminFees-editFee', {
onshow(modalElement) { onshow(modalElement) {
editModalElement = modalElement; editModalElement = modalElement;
modalElement.querySelector("#feeEdit--feeId").value = modalElement.querySelector('#feeEdit--feeId').value = fee.feeId.toString();
fee.feeId.toString(); const feeCategoryElement = modalElement.querySelector('#feeEdit--feeCategoryId');
const feeCategoryElement = modalElement.querySelector("#feeEdit--feeCategoryId");
for (const feeCategory of feeCategories) { for (const feeCategory of feeCategories) {
const optionElement = document.createElement("option"); const optionElement = document.createElement('option');
optionElement.value = feeCategory.feeCategoryId.toString(); optionElement.value = feeCategory.feeCategoryId.toString();
optionElement.textContent = feeCategory.feeCategory; optionElement.textContent = feeCategory.feeCategory;
if (feeCategory.feeCategoryId === feeCategoryId) { if (feeCategory.feeCategoryId === feeCategoryId) {
@ -486,12 +505,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
feeCategoryElement.append(optionElement); feeCategoryElement.append(optionElement);
} }
modalElement.querySelector("#feeEdit--feeName").value = fee.feeName; ;
modalElement.querySelector("#feeEdit--feeDescription").value = modalElement.querySelector('#feeEdit--feeName').value = fee.feeName;
fee.feeDescription; modalElement.querySelector('#feeEdit--feeDescription').value = fee.feeDescription;
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) {
@ -499,9 +518,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
occupancyTypeElement.append(optionElement); occupancyTypeElement.append(optionElement);
} }
const lotTypeElement = modalElement.querySelector("#feeEdit--lotTypeId"); const lotTypeElement = modalElement.querySelector('#feeEdit--lotTypeId');
for (const lotType of exports.lotTypes) { for (const lotType of exports.lotTypes) {
const optionElement = document.createElement("option"); const optionElement = document.createElement('option');
optionElement.value = lotType.lotTypeId.toString(); optionElement.value = lotType.lotTypeId.toString();
optionElement.textContent = lotType.lotType; optionElement.textContent = lotType.lotType;
if (lotType.lotTypeId === fee.lotTypeId) { if (lotType.lotTypeId === fee.lotTypeId) {
@ -509,39 +528,42 @@ 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 modalElement
.querySelector("#feeEdit--feeFunction") .querySelector('#feeEdit--feeFunction')
.addEventListener("change", toggleFeeFields); .addEventListener('change', toggleFeeFields);
toggleFeeFields(); toggleFeeFields();
modalElement.querySelector("#feeEdit--taxAmount").value = fee.taxAmount modalElement.querySelector('#feeEdit--taxAmount').value = fee.taxAmount ? fee.taxAmount.toFixed(2) : '';
? fee.taxAmount.toFixed(2) const taxPercentageElement = modalElement.querySelector('#feeEdit--taxPercentage');
: ""; taxPercentageElement.value = fee.taxPercentage
const taxPercentageElement = modalElement.querySelector("#feeEdit--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');
if (fee.includeQuantity) { if (fee.includeQuantity) {
includeQuantityElement.value = "1"; includeQuantityElement.value = '1';
} }
includeQuantityElement.addEventListener("change", toggleQuantityFields); includeQuantityElement.addEventListener('change', toggleQuantityFields);
modalElement.querySelector("#feeEdit--quantityUnit").value = modalElement.querySelector('#feeEdit--quantityUnit').value = fee.quantityUnit || '';
fee.quantityUnit || "";
toggleQuantityFields(); toggleQuantityFields();
if (fee.isRequired) { if (fee.isRequired) {
modalElement.querySelector("#feeEdit--isRequired").value = "1"; ;
modalElement.querySelector('#feeEdit--isRequired').value = '1';
} }
los.populateAliases(modalElement); los.populateAliases(modalElement);
}, },
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();
@ -550,13 +572,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
function moveFee(clickEvent) { function moveFee(clickEvent) {
const buttonElement = clickEvent.currentTarget; const buttonElement = clickEvent.currentTarget;
const feeContainerElement = buttonElement.closest(".container--fee"); const feeContainerElement = buttonElement.closest('.container--fee');
const feeId = feeContainerElement.dataset.feeId; const feeId = feeContainerElement.dataset.feeId;
cityssm.postJSON(los.urlPrefix + cityssm.postJSON(los.urlPrefix +
"/admin/" + '/admin/' +
(buttonElement.dataset.direction === "up" ? "doMoveFeeUp" : "doMoveFeeDown"), { (buttonElement.dataset.direction === 'up'
? 'doMoveFeeUp'
: 'doMoveFeeDown'), {
feeId, feeId,
moveToEnd: clickEvent.shiftKey ? "1" : "0" moveToEnd: clickEvent.shiftKey ? '1' : '0'
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
feeCategories = responseJSON.feeCategories; feeCategories = responseJSON.feeCategories;
@ -564,9 +588,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Moving Fee", title: 'Error Moving Fee',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });

File diff suppressed because it is too large Load Diff

View File

@ -3,13 +3,13 @@
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
(() => { (() => {
const los = exports.los; const los = exports.los;
const containerElement = document.querySelector("#container--lotTypes"); const containerElement = document.querySelector('#container--lotTypes');
let lotTypes = exports.lotTypes; let lotTypes = exports.lotTypes;
delete exports.lotTypes; delete exports.lotTypes;
const expandedLotTypes = new Set(); const expandedLotTypes = new Set();
function toggleLotTypeFields(clickEvent) { function toggleLotTypeFields(clickEvent) {
const toggleButtonElement = clickEvent.currentTarget; const toggleButtonElement = clickEvent.currentTarget;
const lotTypeElement = toggleButtonElement.closest(".container--lotType"); const lotTypeElement = toggleButtonElement.closest('.container--lotType');
const lotTypeId = Number.parseInt(lotTypeElement.dataset.lotTypeId, 10); const lotTypeId = Number.parseInt(lotTypeElement.dataset.lotTypeId, 10);
if (expandedLotTypes.has(lotTypeId)) { if (expandedLotTypes.has(lotTypeId)) {
expandedLotTypes.delete(lotTypeId); expandedLotTypes.delete(lotTypeId);
@ -20,9 +20,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
toggleButtonElement.innerHTML = expandedLotTypes.has(lotTypeId) toggleButtonElement.innerHTML = expandedLotTypes.has(lotTypeId)
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>' ? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>'; : '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>';
const panelBlockElements = lotTypeElement.querySelectorAll(".panel-block"); const panelBlockElements = lotTypeElement.querySelectorAll('.panel-block');
for (const panelBlockElement of panelBlockElements) { for (const panelBlockElement of panelBlockElements) {
panelBlockElement.classList.toggle("is-hidden"); panelBlockElement.classList.toggle('is-hidden');
} }
} }
function lotTypeResponseHandler(responseJSON) { function lotTypeResponseHandler(responseJSON) {
@ -33,23 +33,22 @@ Object.defineProperty(exports, "__esModule", { value: true });
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: `Error Updating ${exports.aliases.lot} Type`, title: `Error Updating ${exports.aliases.lot} Type`,
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
} }
function deleteLotType(clickEvent) { function deleteLotType(clickEvent) {
const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--lotType").dataset const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotType').dataset.lotTypeId, 10);
.lotTypeId, 10);
function doDelete() { function doDelete() {
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteLotType", { cityssm.postJSON(los.urlPrefix + '/admin/doDeleteLotType', {
lotTypeId lotTypeId
}, lotTypeResponseHandler); }, lotTypeResponseHandler);
} }
bulmaJS.confirm({ bulmaJS.confirm({
title: `Delete ${exports.aliases.lot} Type`, title: `Delete ${exports.aliases.lot} Type`,
message: `Are you sure you want to delete this ${exports.aliases.lot.toLowerCase()} type?`, message: `Are you sure you want to delete this ${exports.aliases.lot.toLowerCase()} type?`,
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: `Yes, Delete ${exports.aliases.lot} Type`, text: `Yes, Delete ${exports.aliases.lot} Type`,
callbackFunction: doDelete callbackFunction: doDelete
@ -57,33 +56,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
}); });
} }
function openEditLotType(clickEvent) { function openEditLotType(clickEvent) {
const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--lotType").dataset const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotType').dataset.lotTypeId, 10);
.lotTypeId, 10);
const lotType = lotTypes.find((currentLotType) => { const lotType = lotTypes.find((currentLotType) => {
return lotTypeId === currentLotType.lotTypeId; return lotTypeId === currentLotType.lotTypeId;
}); });
let editCloseModalFunction; let editCloseModalFunction;
const doEdit = (submitEvent) => { const doEdit = (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateLotType", submitEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doUpdateLotType', submitEvent.currentTarget, (responseJSON) => {
lotTypeResponseHandler(responseJSON); lotTypeResponseHandler(responseJSON);
if (responseJSON.success) { if (responseJSON.success) {
editCloseModalFunction(); editCloseModalFunction();
} }
}); });
}; };
cityssm.openHtmlModal("adminLotTypes-editLotType", { cityssm.openHtmlModal('adminLotTypes-editLotType', {
onshow(modalElement) { onshow(modalElement) {
los.populateAliases(modalElement); los.populateAliases(modalElement);
modalElement.querySelector("#lotTypeEdit--lotTypeId").value = modalElement.querySelector('#lotTypeEdit--lotTypeId').value = lotTypeId.toString();
lotTypeId.toString(); modalElement.querySelector('#lotTypeEdit--lotType').value = lotType.lotType;
modalElement.querySelector("#lotTypeEdit--lotType").value =
lotType.lotType;
}, },
onshown(modalElement, closeModalFunction) { onshown(modalElement, closeModalFunction) {
editCloseModalFunction = closeModalFunction; editCloseModalFunction = closeModalFunction;
modalElement.querySelector("#lotTypeEdit--lotType").focus(); modalElement.querySelector('#lotTypeEdit--lotType').focus();
modalElement.querySelector("form").addEventListener("submit", doEdit); modalElement.querySelector('form').addEventListener('submit', doEdit);
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
}, },
onremoved() { onremoved() {
@ -92,12 +88,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
}); });
} }
function openAddLotTypeField(clickEvent) { function openAddLotTypeField(clickEvent) {
const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--lotType").dataset const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotType').dataset.lotTypeId, 10);
.lotTypeId, 10);
let addCloseModalFunction; let addCloseModalFunction;
const doAdd = (submitEvent) => { const doAdd = (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/admin/doAddLotTypeField", submitEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doAddLotTypeField', submitEvent.currentTarget, (responseJSON) => {
expandedLotTypes.add(lotTypeId); expandedLotTypes.add(lotTypeId);
lotTypeResponseHandler(responseJSON); lotTypeResponseHandler(responseJSON);
if (responseJSON.success) { if (responseJSON.success) {
@ -106,18 +101,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
}); });
}; };
cityssm.openHtmlModal("adminLotTypes-addLotTypeField", { cityssm.openHtmlModal('adminLotTypes-addLotTypeField', {
onshow(modalElement) { onshow(modalElement) {
los.populateAliases(modalElement); los.populateAliases(modalElement);
if (lotTypeId) { if (lotTypeId) {
modalElement.querySelector("#lotTypeFieldAdd--lotTypeId").value = ;
lotTypeId.toString(); modalElement.querySelector('#lotTypeFieldAdd--lotTypeId').value = lotTypeId.toString();
} }
}, },
onshown(modalElement, closeModalFunction) { onshown(modalElement, closeModalFunction) {
addCloseModalFunction = closeModalFunction; addCloseModalFunction = closeModalFunction;
modalElement.querySelector("#lotTypeFieldAdd--lotTypeField").focus(); modalElement.querySelector('#lotTypeFieldAdd--lotTypeField').focus();
modalElement.querySelector("form").addEventListener("submit", doAdd); modalElement.querySelector('form').addEventListener('submit', doAdd);
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
}, },
onremoved() { onremoved() {
@ -127,12 +122,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
function moveLotType(clickEvent) { function moveLotType(clickEvent) {
const buttonElement = clickEvent.currentTarget; const buttonElement = clickEvent.currentTarget;
const lotTypeId = buttonElement.closest(".container--lotType").dataset.lotTypeId; const lotTypeId = buttonElement.closest('.container--lotType').dataset.lotTypeId;
cityssm.postJSON(los.urlPrefix + cityssm.postJSON(los.urlPrefix +
"/admin/" + '/admin/' +
(buttonElement.dataset.direction === "up" ? "doMoveLotTypeUp" : "doMoveLotTypeDown"), { (buttonElement.dataset.direction === 'up'
? 'doMoveLotTypeUp'
: 'doMoveLotTypeDown'), {
lotTypeId, lotTypeId,
moveToEnd: clickEvent.shiftKey ? "1" : "0" moveToEnd: clickEvent.shiftKey ? '1' : '0'
}, lotTypeResponseHandler); }, lotTypeResponseHandler);
} }
function openEditLotTypeField(lotTypeId, lotTypeFieldId) { function openEditLotTypeField(lotTypeId, lotTypeFieldId) {
@ -151,7 +148,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
maximumLengthElement.min = minimumLengthElement.value; maximumLengthElement.min = minimumLengthElement.value;
} }
function toggleInputFields() { function toggleInputFields() {
if (lotTypeFieldValuesElement.value === "") { if (lotTypeFieldValuesElement.value === '') {
minimumLengthElement.disabled = false; minimumLengthElement.disabled = false;
maximumLengthElement.disabled = false; maximumLengthElement.disabled = false;
patternElement.disabled = false; patternElement.disabled = false;
@ -164,7 +161,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
function doUpdate(submitEvent) { function doUpdate(submitEvent) {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateLotTypeField", submitEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doUpdateLotTypeField', submitEvent.currentTarget, (responseJSON) => {
lotTypeResponseHandler(responseJSON); lotTypeResponseHandler(responseJSON);
if (responseJSON.success) { if (responseJSON.success) {
editCloseModalFunction(); editCloseModalFunction();
@ -172,7 +169,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
}); });
} }
function doDelete() { function doDelete() {
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteLotTypeField", { cityssm.postJSON(los.urlPrefix + '/admin/doDeleteLotTypeField', {
lotTypeFieldId lotTypeFieldId
}, (responseJSON) => { }, (responseJSON) => {
lotTypeResponseHandler(responseJSON); lotTypeResponseHandler(responseJSON);
@ -183,31 +180,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
function confirmDoDelete() { function confirmDoDelete() {
bulmaJS.confirm({ bulmaJS.confirm({
title: "Delete Field", title: 'Delete Field',
message: "Are you sure you want to delete this field? Note that historical records that make use of this field will not be affected.", message: 'Are you sure you want to delete this field? Note that historical records that make use of this field will not be affected.',
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: "Yes, Delete Field", text: 'Yes, Delete Field',
callbackFunction: doDelete callbackFunction: doDelete
} }
}); });
} }
cityssm.openHtmlModal("adminLotTypes-editLotTypeField", { cityssm.openHtmlModal('adminLotTypes-editLotTypeField', {
onshow(modalElement) { onshow(modalElement) {
los.populateAliases(modalElement); los.populateAliases(modalElement);
modalElement.querySelector("#lotTypeFieldEdit--lotTypeFieldId").value = modalElement.querySelector('#lotTypeFieldEdit--lotTypeFieldId').value = lotTypeField.lotTypeFieldId.toString();
lotTypeField.lotTypeFieldId.toString(); modalElement.querySelector('#lotTypeFieldEdit--lotTypeField').value = lotTypeField.lotTypeField;
modalElement.querySelector("#lotTypeFieldEdit--lotTypeField").value = modalElement.querySelector('#lotTypeFieldEdit--isRequired').value = lotTypeField.isRequired ? '1' : '0';
lotTypeField.lotTypeField; minimumLengthElement = modalElement.querySelector('#lotTypeFieldEdit--minimumLength');
modalElement.querySelector("#lotTypeFieldEdit--isRequired").value =
lotTypeField.isRequired ? "1" : "0";
minimumLengthElement = modalElement.querySelector("#lotTypeFieldEdit--minimumLength");
minimumLengthElement.value = lotTypeField.minimumLength.toString(); minimumLengthElement.value = lotTypeField.minimumLength.toString();
maximumLengthElement = modalElement.querySelector("#lotTypeFieldEdit--maximumLength"); maximumLengthElement = modalElement.querySelector('#lotTypeFieldEdit--maximumLength');
maximumLengthElement.value = lotTypeField.maximumLength.toString(); maximumLengthElement.value = lotTypeField.maximumLength.toString();
patternElement = modalElement.querySelector("#lotTypeFieldEdit--pattern"); patternElement = modalElement.querySelector('#lotTypeFieldEdit--pattern');
patternElement.value = lotTypeField.pattern; patternElement.value = lotTypeField.pattern;
lotTypeFieldValuesElement = modalElement.querySelector("#lotTypeFieldEdit--lotTypeFieldValues"); lotTypeFieldValuesElement = modalElement.querySelector('#lotTypeFieldEdit--lotTypeFieldValues');
lotTypeFieldValuesElement.value = lotTypeField.lotTypeFieldValues; lotTypeFieldValuesElement.value = lotTypeField.lotTypeFieldValues;
toggleInputFields(); toggleInputFields();
}, },
@ -216,13 +210,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
bulmaJS.init(modalElement); bulmaJS.init(modalElement);
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
cityssm.enableNavBlocker(); cityssm.enableNavBlocker();
modalElement.querySelector("form").addEventListener("submit", doUpdate); modalElement.querySelector('form').addEventListener('submit', doUpdate);
minimumLengthElement.addEventListener("keyup", updateMaximumLengthMin); minimumLengthElement.addEventListener('keyup', updateMaximumLengthMin);
updateMaximumLengthMin(); updateMaximumLengthMin();
lotTypeFieldValuesElement.addEventListener("keyup", toggleInputFields); lotTypeFieldValuesElement.addEventListener('keyup', toggleInputFields);
modalElement modalElement
.querySelector("#button--deleteLotTypeField") .querySelector('#button--deleteLotTypeField')
.addEventListener("click", confirmDoDelete); .addEventListener('click', confirmDoDelete);
}, },
onremoved() { onremoved() {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
@ -232,78 +226,77 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
function openEditLotTypeFieldByClick(clickEvent) { function openEditLotTypeFieldByClick(clickEvent) {
clickEvent.preventDefault(); clickEvent.preventDefault();
const lotTypeFieldId = Number.parseInt(clickEvent.currentTarget.closest(".container--lotTypeField") const lotTypeFieldId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotTypeField').dataset.lotTypeFieldId, 10);
.dataset.lotTypeFieldId, 10); const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotType').dataset.lotTypeId, 10);
const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--lotType").dataset
.lotTypeId, 10);
openEditLotTypeField(lotTypeId, lotTypeFieldId); openEditLotTypeField(lotTypeId, lotTypeFieldId);
} }
function moveLotTypeField(clickEvent) { function moveLotTypeField(clickEvent) {
const buttonElement = clickEvent.currentTarget; const buttonElement = clickEvent.currentTarget;
const lotTypeFieldId = buttonElement.closest(".container--lotTypeField").dataset const lotTypeFieldId = buttonElement.closest('.container--lotTypeField').dataset.lotTypeFieldId;
.lotTypeFieldId;
cityssm.postJSON(los.urlPrefix + cityssm.postJSON(los.urlPrefix +
"/admin/" + '/admin/' +
(buttonElement.dataset.direction === "up" (buttonElement.dataset.direction === 'up'
? "doMoveLotTypeFieldUp" ? 'doMoveLotTypeFieldUp'
: "doMoveLotTypeFieldDown"), { : 'doMoveLotTypeFieldDown'), {
lotTypeFieldId, lotTypeFieldId,
moveToEnd: clickEvent.shiftKey ? "1" : "0" moveToEnd: clickEvent.shiftKey ? '1' : '0'
}, lotTypeResponseHandler); }, lotTypeResponseHandler);
} }
function renderLotTypeFields(panelElement, lotTypeId, lotTypeFields) { function renderLotTypeFields(panelElement, lotTypeId, lotTypeFields) {
if (lotTypeFields.length === 0) { if (lotTypeFields.length === 0) {
panelElement.insertAdjacentHTML("beforeend", '<div class="panel-block is-block' + panelElement.insertAdjacentHTML('beforeend', '<div class="panel-block is-block' +
(expandedLotTypes.has(lotTypeId) ? "" : " is-hidden") + (expandedLotTypes.has(lotTypeId) ? '' : ' is-hidden') +
'">' + '">' +
'<div class="message is-info">' + '<div class="message is-info">' +
'<p class="message-body">There are no additional fields.</p>' + '<p class="message-body">There are no additional fields.</p>' +
"</div>" + '</div>' +
"</div>"); '</div>');
} }
else { else {
for (const lotTypeField of lotTypeFields) { for (const lotTypeField of lotTypeFields) {
const panelBlockElement = document.createElement("div"); const panelBlockElement = document.createElement('div');
panelBlockElement.className = "panel-block is-block container--lotTypeField"; panelBlockElement.className =
'panel-block is-block container--lotTypeField';
if (!expandedLotTypes.has(lotTypeId)) { if (!expandedLotTypes.has(lotTypeId)) {
panelBlockElement.classList.add("is-hidden"); panelBlockElement.classList.add('is-hidden');
} }
panelBlockElement.dataset.lotTypeFieldId = lotTypeField.lotTypeFieldId.toString(); panelBlockElement.dataset.lotTypeFieldId =
lotTypeField.lotTypeFieldId.toString();
panelBlockElement.innerHTML = panelBlockElement.innerHTML =
'<div class="level is-mobile">' + '<div class="level is-mobile">' +
'<div class="level-left">' + '<div class="level-left">' +
('<div class="level-item">' + ('<div class="level-item">' +
'<a class="has-text-weight-bold button--editLotTypeField" href="#">' + '<a class="has-text-weight-bold button--editLotTypeField" href="#">' +
cityssm.escapeHTML(lotTypeField.lotTypeField || "") + cityssm.escapeHTML(lotTypeField.lotTypeField || '') +
"</a>" + '</a>' +
"</div>") + '</div>') +
"</div>" + '</div>' +
'<div class="level-right">' + '<div class="level-right">' +
('<div class="level-item">' + ('<div class="level-item">' +
los.getMoveUpDownButtonFieldHTML("button--moveLotTypeFieldUp", "button--moveLotTypeFieldDown") + los.getMoveUpDownButtonFieldHTML('button--moveLotTypeFieldUp', 'button--moveLotTypeFieldDown') +
"</div>") + '</div>') +
"</div>" + '</div>' +
"</div>"; '</div>';
panelBlockElement panelBlockElement
.querySelector(".button--editLotTypeField") .querySelector('.button--editLotTypeField')
.addEventListener("click", openEditLotTypeFieldByClick); .addEventListener('click', openEditLotTypeFieldByClick);
panelBlockElement.querySelector(".button--moveLotTypeFieldUp").addEventListener("click", moveLotTypeField); panelBlockElement.querySelector('.button--moveLotTypeFieldUp').addEventListener('click', moveLotTypeField);
panelBlockElement.querySelector(".button--moveLotTypeFieldDown").addEventListener("click", moveLotTypeField); panelBlockElement.querySelector('.button--moveLotTypeFieldDown').addEventListener('click', moveLotTypeField);
panelElement.append(panelBlockElement); panelElement.append(panelBlockElement);
} }
} }
} }
function renderLotTypes() { function renderLotTypes() {
containerElement.innerHTML = ""; containerElement.innerHTML = '';
if (lotTypes.length === 0) { if (lotTypes.length === 0) {
containerElement.insertAdjacentHTML("afterbegin", `<div class="message is-warning> containerElement.insertAdjacentHTML('afterbegin', `<div class="message is-warning>
<p class="message-body">There are no active ${los.escapedAliases.lot} types.</p> <p class="message-body">There are no active ${los.escapedAliases.lot} types.</p>
</div>`); </div>`);
return; return;
} }
for (const lotType of lotTypes) { for (const lotType of lotTypes) {
const lotTypeContainer = document.createElement("div"); const lotTypeContainer = document.createElement('div');
lotTypeContainer.className = "panel container--lotType"; lotTypeContainer.className = 'panel container--lotType';
lotTypeContainer.dataset.lotTypeId = lotType.lotTypeId.toString(); lotTypeContainer.dataset.lotTypeId = lotType.lotTypeId.toString();
lotTypeContainer.innerHTML = lotTypeContainer.innerHTML =
'<div class="panel-heading">' + '<div class="panel-heading">' +
@ -314,64 +307,66 @@ Object.defineProperty(exports, "__esModule", { value: true });
(expandedLotTypes.has(lotType.lotTypeId) (expandedLotTypes.has(lotType.lotTypeId)
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>' ? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>') + : '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>') +
"</button>" + '</button>' +
"</div>" + '</div>' +
'<div class="level-item">' + '<div class="level-item">' +
'<h2 class="title is-4">' + '<h2 class="title is-4">' +
cityssm.escapeHTML(lotType.lotType) + cityssm.escapeHTML(lotType.lotType) +
"</h2>" + '</h2>' +
"</div>" + '</div>' +
"</div>") + '</div>') +
('<div class="level-right">' + ('<div class="level-right">' +
('<div class="level-item">' + ('<div class="level-item">' +
'<button class="button is-danger is-small button--deleteLotType" type="button">' + '<button class="button is-danger is-small button--deleteLotType" 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</span>" + '<span>Delete</span>' +
"</button>" + '</button>' +
"</div>") + '</div>') +
('<div class="level-item">' + ('<div class="level-item">' +
'<button class="button is-primary is-small button--editLotType" type="button">' + '<button class="button is-primary is-small button--editLotType" 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 " + '<span>Edit ' +
exports.aliases.lot + exports.aliases.lot +
" Type</span>" + ' Type</span>' +
"</button>" + '</button>' +
"</div>") + '</div>') +
('<div class="level-item">' + ('<div class="level-item">' +
'<button class="button is-success is-small button--addLotTypeField" type="button">' + '<button class="button is-success is-small button--addLotTypeField" 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 Field</span>" + '<span>Add Field</span>' +
"</button>" + '</button>' +
"</div>") + '</div>') +
('<div class="level-item">' + ('<div class="level-item">' +
los.getMoveUpDownButtonFieldHTML("button--moveLotTypeUp", "button--moveLotTypeDown") + los.getMoveUpDownButtonFieldHTML('button--moveLotTypeUp', 'button--moveLotTypeDown') +
"</div>") + '</div>') +
"</div>") + '</div>') +
"</div>" + '</div>' +
"</div>"; '</div>';
renderLotTypeFields(lotTypeContainer, lotType.lotTypeId, lotType.lotTypeFields); renderLotTypeFields(lotTypeContainer, lotType.lotTypeId, lotType.lotTypeFields);
lotTypeContainer lotTypeContainer
.querySelector(".button--toggleLotTypeFields") .querySelector('.button--toggleLotTypeFields')
.addEventListener("click", toggleLotTypeFields); .addEventListener('click', toggleLotTypeFields);
lotTypeContainer lotTypeContainer
.querySelector(".button--deleteLotType") .querySelector('.button--deleteLotType')
.addEventListener("click", deleteLotType); .addEventListener('click', deleteLotType);
lotTypeContainer lotTypeContainer
.querySelector(".button--editLotType") .querySelector('.button--editLotType')
.addEventListener("click", openEditLotType); .addEventListener('click', openEditLotType);
lotTypeContainer lotTypeContainer
.querySelector(".button--addLotTypeField") .querySelector('.button--addLotTypeField')
.addEventListener("click", openAddLotTypeField); .addEventListener('click', openAddLotTypeField);
lotTypeContainer.querySelector(".button--moveLotTypeUp").addEventListener("click", moveLotType); lotTypeContainer.querySelector('.button--moveLotTypeUp').addEventListener('click', moveLotType);
lotTypeContainer.querySelector(".button--moveLotTypeDown").addEventListener("click", moveLotType); lotTypeContainer.querySelector('.button--moveLotTypeDown').addEventListener('click', moveLotType);
containerElement.append(lotTypeContainer); containerElement.append(lotTypeContainer);
} }
} }
document.querySelector("#button--addLotType").addEventListener("click", () => { document
.querySelector('#button--addLotType')
.addEventListener('click', () => {
let addCloseModalFunction; let addCloseModalFunction;
function doAdd(submitEvent) { function doAdd(submitEvent) {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/admin/doAddLotType", submitEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doAddLotType', submitEvent.currentTarget, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
addCloseModalFunction(); addCloseModalFunction();
lotTypes = responseJSON.lotTypes; lotTypes = responseJSON.lotTypes;
@ -380,20 +375,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: `Error Adding ${los.escapedAliases.Lot} Type`, title: `Error Adding ${los.escapedAliases.Lot} Type`,
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
} }
cityssm.openHtmlModal("adminLotTypes-addLotType", { cityssm.openHtmlModal('adminLotTypes-addLotType', {
onshow(modalElement) { onshow(modalElement) {
los.populateAliases(modalElement); los.populateAliases(modalElement);
}, },
onshown(modalElement, closeModalFunction) { onshown(modalElement, closeModalFunction) {
addCloseModalFunction = closeModalFunction; addCloseModalFunction = closeModalFunction;
modalElement.querySelector("#lotTypeAdd--lotType").focus(); modalElement.querySelector('#lotTypeAdd--lotType').focus();
modalElement.querySelector("form").addEventListener("submit", doAdd); modalElement.querySelector('form').addEventListener('submit', doAdd);
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
}, },
onremoved() { onremoved() {

File diff suppressed because it is too large Load Diff

View File

@ -3,8 +3,8 @@
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
(() => { (() => {
const los = exports.los; const los = exports.los;
const occupancyTypesContainerElement = document.querySelector("#container--occupancyTypes"); const occupancyTypesContainerElement = document.querySelector('#container--occupancyTypes');
const occupancyTypePrintsContainerElement = document.querySelector("#container--occupancyTypePrints"); const occupancyTypePrintsContainerElement = document.querySelector('#container--occupancyTypePrints');
let occupancyTypes = exports.occupancyTypes; let occupancyTypes = exports.occupancyTypes;
delete exports.occupancyTypes; delete exports.occupancyTypes;
let allOccupancyTypeFields = exports.allOccupancyTypeFields; let allOccupancyTypeFields = exports.allOccupancyTypeFields;
@ -12,7 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
const expandedOccupancyTypes = new Set(); const expandedOccupancyTypes = new Set();
function toggleOccupancyTypeFields(clickEvent) { function toggleOccupancyTypeFields(clickEvent) {
const toggleButtonElement = clickEvent.currentTarget; const toggleButtonElement = clickEvent.currentTarget;
const occupancyTypeElement = toggleButtonElement.closest(".container--occupancyType"); const occupancyTypeElement = toggleButtonElement.closest('.container--occupancyType');
const occupancyTypeId = Number.parseInt(occupancyTypeElement.dataset.occupancyTypeId, 10); const occupancyTypeId = Number.parseInt(occupancyTypeElement.dataset.occupancyTypeId, 10);
if (expandedOccupancyTypes.has(occupancyTypeId)) { if (expandedOccupancyTypes.has(occupancyTypeId)) {
expandedOccupancyTypes.delete(occupancyTypeId); expandedOccupancyTypes.delete(occupancyTypeId);
@ -23,9 +23,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
toggleButtonElement.innerHTML = expandedOccupancyTypes.has(occupancyTypeId) toggleButtonElement.innerHTML = expandedOccupancyTypes.has(occupancyTypeId)
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>' ? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>'; : '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>';
const panelBlockElements = occupancyTypeElement.querySelectorAll(".panel-block"); const panelBlockElements = occupancyTypeElement.querySelectorAll('.panel-block');
for (const panelBlockElement of panelBlockElements) { for (const panelBlockElement of panelBlockElements) {
panelBlockElement.classList.toggle("is-hidden"); panelBlockElement.classList.toggle('is-hidden');
} }
} }
function occupancyTypeResponseHandler(responseJSON) { function occupancyTypeResponseHandler(responseJSON) {
@ -36,23 +36,23 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Updating " + exports.aliases.occupancy + " Type", title: 'Error Updating ' + exports.aliases.occupancy + ' Type',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
} }
function deleteOccupancyType(clickEvent) { function deleteOccupancyType(clickEvent) {
const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId, 10); const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--occupancyType').dataset.occupancyTypeId, 10);
function doDelete() { function doDelete() {
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteOccupancyType", { cityssm.postJSON(los.urlPrefix + '/admin/doDeleteOccupancyType', {
occupancyTypeId occupancyTypeId
}, occupancyTypeResponseHandler); }, occupancyTypeResponseHandler);
} }
bulmaJS.confirm({ bulmaJS.confirm({
title: `Delete ${exports.aliases.occupancy} Type`, title: `Delete ${exports.aliases.occupancy} Type`,
message: `Are you sure you want to delete this ${exports.aliases.occupancy.toLowerCase()} type?`, message: `Are you sure you want to delete this ${exports.aliases.occupancy.toLowerCase()} type?`,
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: `Yes, Delete ${exports.aliases.occupancy} Type`, text: `Yes, Delete ${exports.aliases.occupancy} Type`,
callbackFunction: doDelete callbackFunction: doDelete
@ -60,30 +60,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
}); });
} }
function openEditOccupancyType(clickEvent) { function openEditOccupancyType(clickEvent) {
const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId, 10); const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--occupancyType').dataset.occupancyTypeId, 10);
const occupancyType = occupancyTypes.find((currentOccupancyType) => { const occupancyType = occupancyTypes.find((currentOccupancyType) => {
return occupancyTypeId === currentOccupancyType.occupancyTypeId; return occupancyTypeId === currentOccupancyType.occupancyTypeId;
}); });
let editCloseModalFunction; let editCloseModalFunction;
function doEdit(submitEvent) { function doEdit(submitEvent) {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateOccupancyType", submitEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doUpdateOccupancyType', submitEvent.currentTarget, (responseJSON) => {
occupancyTypeResponseHandler(responseJSON); occupancyTypeResponseHandler(responseJSON);
if (responseJSON.success) { if (responseJSON.success) {
editCloseModalFunction(); editCloseModalFunction();
} }
}); });
} }
cityssm.openHtmlModal("adminOccupancyTypes-editOccupancyType", { cityssm.openHtmlModal('adminOccupancyTypes-editOccupancyType', {
onshow(modalElement) { onshow(modalElement) {
los.populateAliases(modalElement); los.populateAliases(modalElement);
modalElement.querySelector("#occupancyTypeEdit--occupancyTypeId").value = occupancyTypeId.toString(); modalElement.querySelector('#occupancyTypeEdit--occupancyTypeId').value = occupancyTypeId.toString();
modalElement.querySelector("#occupancyTypeEdit--occupancyType").value = occupancyType.occupancyType; modalElement.querySelector('#occupancyTypeEdit--occupancyType').value = occupancyType.occupancyType;
}, },
onshown(modalElement, closeModalFunction) { onshown(modalElement, closeModalFunction) {
editCloseModalFunction = closeModalFunction; editCloseModalFunction = closeModalFunction;
modalElement.querySelector("#occupancyTypeEdit--occupancyType").focus(); modalElement.querySelector('#occupancyTypeEdit--occupancyType').focus();
modalElement.querySelector("form").addEventListener("submit", doEdit); modalElement.querySelector('form').addEventListener('submit', doEdit);
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
}, },
onremoved() { onremoved() {
@ -92,11 +92,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
}); });
} }
function openAddOccupancyTypeField(clickEvent) { function openAddOccupancyTypeField(clickEvent) {
const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId, 10); const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--occupancyType').dataset.occupancyTypeId, 10);
let addCloseModalFunction; let addCloseModalFunction;
function doAdd(submitEvent) { function doAdd(submitEvent) {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/admin/doAddOccupancyTypeField", submitEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doAddOccupancyTypeField', submitEvent.currentTarget, (responseJSON) => {
expandedOccupancyTypes.add(occupancyTypeId); expandedOccupancyTypes.add(occupancyTypeId);
occupancyTypeResponseHandler(responseJSON); occupancyTypeResponseHandler(responseJSON);
if (responseJSON.success) { if (responseJSON.success) {
@ -105,17 +105,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
}); });
} }
cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyTypeField", { cityssm.openHtmlModal('adminOccupancyTypes-addOccupancyTypeField', {
onshow(modalElement) { onshow(modalElement) {
los.populateAliases(modalElement); los.populateAliases(modalElement);
if (occupancyTypeId) { if (occupancyTypeId) {
modalElement.querySelector("#occupancyTypeFieldAdd--occupancyTypeId").value = occupancyTypeId.toString(); ;
modalElement.querySelector('#occupancyTypeFieldAdd--occupancyTypeId').value = occupancyTypeId.toString();
} }
}, },
onshown(modalElement, closeModalFunction) { onshown(modalElement, closeModalFunction) {
addCloseModalFunction = closeModalFunction; addCloseModalFunction = closeModalFunction;
modalElement.querySelector("#occupancyTypeFieldAdd--occupancyTypeField").focus(); modalElement.querySelector('#occupancyTypeFieldAdd--occupancyTypeField').focus();
modalElement.querySelector("form").addEventListener("submit", doAdd); modalElement.querySelector('form').addEventListener('submit', doAdd);
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
}, },
onremoved() { onremoved() {
@ -125,14 +126,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
function moveOccupancyType(clickEvent) { function moveOccupancyType(clickEvent) {
const buttonElement = clickEvent.currentTarget; const buttonElement = clickEvent.currentTarget;
const occupancyTypeId = clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId; const occupancyTypeId = clickEvent.currentTarget.closest('.container--occupancyType').dataset.occupancyTypeId;
cityssm.postJSON(los.urlPrefix + cityssm.postJSON(los.urlPrefix +
"/admin/" + '/admin/' +
(buttonElement.dataset.direction === "up" (buttonElement.dataset.direction === 'up'
? "doMoveOccupancyTypeUp" ? 'doMoveOccupancyTypeUp'
: "doMoveOccupancyTypeDown"), { : 'doMoveOccupancyTypeDown'), {
occupancyTypeId, occupancyTypeId,
moveToEnd: clickEvent.shiftKey ? "1" : "0" moveToEnd: clickEvent.shiftKey ? '1' : '0'
}, occupancyTypeResponseHandler); }, occupancyTypeResponseHandler);
} }
function openEditOccupancyTypeField(occupancyTypeId, occupancyTypeFieldId) { function openEditOccupancyTypeField(occupancyTypeId, occupancyTypeFieldId) {
@ -142,8 +143,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
return currentOccupancyType.occupancyTypeId === occupancyTypeId; return currentOccupancyType.occupancyTypeId === occupancyTypeId;
}); });
} }
const occupancyTypeField = (occupancyType ? occupancyType.occupancyTypeFields : allOccupancyTypeFields).find((currentOccupancyTypeField) => { const occupancyTypeField = (occupancyType
return currentOccupancyTypeField.occupancyTypeFieldId === occupancyTypeFieldId; ? occupancyType.occupancyTypeFields
: allOccupancyTypeFields).find((currentOccupancyTypeField) => {
return (currentOccupancyTypeField.occupancyTypeFieldId === occupancyTypeFieldId);
}); });
let minimumLengthElement; let minimumLengthElement;
let maximumLengthElement; let maximumLengthElement;
@ -154,7 +157,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
maximumLengthElement.min = minimumLengthElement.value; maximumLengthElement.min = minimumLengthElement.value;
} }
function toggleInputFields() { function toggleInputFields() {
if (occupancyTypeFieldValuesElement.value === "") { if (occupancyTypeFieldValuesElement.value === '') {
minimumLengthElement.disabled = false; minimumLengthElement.disabled = false;
maximumLengthElement.disabled = false; maximumLengthElement.disabled = false;
patternElement.disabled = false; patternElement.disabled = false;
@ -167,7 +170,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
function doUpdate(submitEvent) { function doUpdate(submitEvent) {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateOccupancyTypeField", submitEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doUpdateOccupancyTypeField', submitEvent.currentTarget, (responseJSON) => {
occupancyTypeResponseHandler(responseJSON); occupancyTypeResponseHandler(responseJSON);
if (responseJSON.success) { if (responseJSON.success) {
editCloseModalFunction(); editCloseModalFunction();
@ -175,7 +178,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
}); });
} }
function doDelete() { function doDelete() {
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteOccupancyTypeField", { cityssm.postJSON(los.urlPrefix + '/admin/doDeleteOccupancyTypeField', {
occupancyTypeFieldId occupancyTypeFieldId
}, (responseJSON) => { }, (responseJSON) => {
occupancyTypeResponseHandler(responseJSON); occupancyTypeResponseHandler(responseJSON);
@ -186,28 +189,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
function confirmDoDelete() { function confirmDoDelete() {
bulmaJS.confirm({ bulmaJS.confirm({
title: "Delete Field", title: 'Delete Field',
message: "Are you sure you want to delete this field? Note that historical records that make use of this field will not be affected.", message: 'Are you sure you want to delete this field? Note that historical records that make use of this field will not be affected.',
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: "Yes, Delete Field", text: 'Yes, Delete Field',
callbackFunction: doDelete callbackFunction: doDelete
} }
}); });
} }
cityssm.openHtmlModal("adminOccupancyTypes-editOccupancyTypeField", { cityssm.openHtmlModal('adminOccupancyTypes-editOccupancyTypeField', {
onshow: (modalElement) => { onshow: (modalElement) => {
los.populateAliases(modalElement); los.populateAliases(modalElement);
modalElement.querySelector("#occupancyTypeFieldEdit--occupancyTypeFieldId").value = occupancyTypeField.occupancyTypeFieldId.toString(); modalElement.querySelector('#occupancyTypeFieldEdit--occupancyTypeFieldId').value = occupancyTypeField.occupancyTypeFieldId.toString();
modalElement.querySelector("#occupancyTypeFieldEdit--occupancyTypeField").value = occupancyTypeField.occupancyTypeField; modalElement.querySelector('#occupancyTypeFieldEdit--occupancyTypeField').value = occupancyTypeField.occupancyTypeField;
modalElement.querySelector("#occupancyTypeFieldEdit--isRequired").value = occupancyTypeField.isRequired ? "1" : "0"; modalElement.querySelector('#occupancyTypeFieldEdit--isRequired').value = occupancyTypeField.isRequired ? '1' : '0';
minimumLengthElement = modalElement.querySelector("#occupancyTypeFieldEdit--minimumLength"); minimumLengthElement = modalElement.querySelector('#occupancyTypeFieldEdit--minimumLength');
minimumLengthElement.value = occupancyTypeField.minimumLength.toString(); minimumLengthElement.value =
maximumLengthElement = modalElement.querySelector("#occupancyTypeFieldEdit--maximumLength"); occupancyTypeField.minimumLength.toString();
maximumLengthElement.value = occupancyTypeField.maximumLength.toString(); maximumLengthElement = modalElement.querySelector('#occupancyTypeFieldEdit--maximumLength');
patternElement = modalElement.querySelector("#occupancyTypeFieldEdit--pattern"); maximumLengthElement.value =
occupancyTypeField.maximumLength.toString();
patternElement = modalElement.querySelector('#occupancyTypeFieldEdit--pattern');
patternElement.value = occupancyTypeField.pattern; patternElement.value = occupancyTypeField.pattern;
occupancyTypeFieldValuesElement = modalElement.querySelector("#occupancyTypeFieldEdit--occupancyTypeFieldValues"); occupancyTypeFieldValuesElement = modalElement.querySelector('#occupancyTypeFieldEdit--occupancyTypeFieldValues');
occupancyTypeFieldValuesElement.value = occupancyTypeFieldValuesElement.value =
occupancyTypeField.occupancyTypeFieldValues; occupancyTypeField.occupancyTypeFieldValues;
toggleInputFields(); toggleInputFields();
@ -217,13 +222,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
bulmaJS.init(modalElement); bulmaJS.init(modalElement);
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
cityssm.enableNavBlocker(); cityssm.enableNavBlocker();
modalElement.querySelector("form").addEventListener("submit", doUpdate); modalElement.querySelector('form').addEventListener('submit', doUpdate);
minimumLengthElement.addEventListener("keyup", updateMaximumLengthMin); minimumLengthElement.addEventListener('keyup', updateMaximumLengthMin);
updateMaximumLengthMin(); updateMaximumLengthMin();
occupancyTypeFieldValuesElement.addEventListener("keyup", toggleInputFields); occupancyTypeFieldValuesElement.addEventListener('keyup', toggleInputFields);
modalElement modalElement
.querySelector("#button--deleteOccupancyTypeField") .querySelector('#button--deleteOccupancyTypeField')
.addEventListener("click", confirmDoDelete); .addEventListener('click', confirmDoDelete);
}, },
onremoved: () => { onremoved: () => {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
@ -233,40 +238,41 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
function openEditOccupancyTypeFieldByClick(clickEvent) { function openEditOccupancyTypeFieldByClick(clickEvent) {
clickEvent.preventDefault(); clickEvent.preventDefault();
const occupancyTypeFieldId = Number.parseInt(clickEvent.currentTarget.closest(".container--occupancyTypeField").dataset.occupancyTypeFieldId, 10); const occupancyTypeFieldId = Number.parseInt(clickEvent.currentTarget.closest('.container--occupancyTypeField').dataset.occupancyTypeFieldId, 10);
const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId, 10); const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--occupancyType').dataset.occupancyTypeId, 10);
openEditOccupancyTypeField(occupancyTypeId, occupancyTypeFieldId); openEditOccupancyTypeField(occupancyTypeId, occupancyTypeFieldId);
} }
function moveOccupancyTypeField(clickEvent) { function moveOccupancyTypeField(clickEvent) {
const buttonElement = clickEvent.currentTarget; const buttonElement = clickEvent.currentTarget;
const occupancyTypeFieldId = clickEvent.currentTarget.closest(".container--occupancyTypeField").dataset.occupancyTypeFieldId; const occupancyTypeFieldId = clickEvent.currentTarget.closest('.container--occupancyTypeField').dataset.occupancyTypeFieldId;
cityssm.postJSON(los.urlPrefix + cityssm.postJSON(los.urlPrefix +
"/admin/" + '/admin/' +
(buttonElement.dataset.direction === "up" (buttonElement.dataset.direction === 'up'
? "doMoveOccupancyTypeFieldUp" ? 'doMoveOccupancyTypeFieldUp'
: "doMoveOccupancyTypeFieldDown"), { : 'doMoveOccupancyTypeFieldDown'), {
occupancyTypeFieldId, occupancyTypeFieldId,
moveToEnd: clickEvent.shiftKey ? "1" : "0" moveToEnd: clickEvent.shiftKey ? '1' : '0'
}, occupancyTypeResponseHandler); }, occupancyTypeResponseHandler);
} }
function renderOccupancyTypeFields(panelElement, occupancyTypeId, occupancyTypeFields) { function renderOccupancyTypeFields(panelElement, occupancyTypeId, occupancyTypeFields) {
if (occupancyTypeFields.length === 0) { if (occupancyTypeFields.length === 0) {
panelElement.insertAdjacentHTML("beforeend", '<div class="panel-block is-block' + panelElement.insertAdjacentHTML('beforeend', '<div class="panel-block is-block' +
(!occupancyTypeId || expandedOccupancyTypes.has(occupancyTypeId) (!occupancyTypeId || expandedOccupancyTypes.has(occupancyTypeId)
? "" ? ''
: " is-hidden") + : ' is-hidden') +
'">' + '">' +
'<div class="message is-info">' + '<div class="message is-info">' +
'<p class="message-body">There are no additional fields.</p>' + '<p class="message-body">There are no additional fields.</p>' +
"</div>" + '</div>' +
"</div>"); '</div>');
} }
else { else {
for (const occupancyTypeField of occupancyTypeFields) { for (const occupancyTypeField of occupancyTypeFields) {
const panelBlockElement = document.createElement("div"); const panelBlockElement = document.createElement('div');
panelBlockElement.className = "panel-block is-block container--occupancyTypeField"; panelBlockElement.className =
'panel-block is-block container--occupancyTypeField';
if (occupancyTypeId && !expandedOccupancyTypes.has(occupancyTypeId)) { if (occupancyTypeId && !expandedOccupancyTypes.has(occupancyTypeId)) {
panelBlockElement.classList.add("is-hidden"); panelBlockElement.classList.add('is-hidden');
} }
panelBlockElement.dataset.occupancyTypeFieldId = panelBlockElement.dataset.occupancyTypeFieldId =
occupancyTypeField.occupancyTypeFieldId.toString(); occupancyTypeField.occupancyTypeFieldId.toString();
@ -275,44 +281,44 @@ Object.defineProperty(exports, "__esModule", { value: true });
'<div class="level-left">' + '<div class="level-left">' +
('<div class="level-item">' + ('<div class="level-item">' +
'<a class="has-text-weight-bold button--editOccupancyTypeField" href="#">' + '<a class="has-text-weight-bold button--editOccupancyTypeField" href="#">' +
cityssm.escapeHTML(occupancyTypeField.occupancyTypeField || "") + cityssm.escapeHTML(occupancyTypeField.occupancyTypeField || '') +
"</a>" + '</a>' +
"</div>") + '</div>') +
"</div>" + '</div>' +
'<div class="level-right">' + '<div class="level-right">' +
('<div class="level-item">' + ('<div class="level-item">' +
los.getMoveUpDownButtonFieldHTML("button--moveOccupancyTypeFieldUp", "button--moveOccupancyTypeFieldDown") + los.getMoveUpDownButtonFieldHTML('button--moveOccupancyTypeFieldUp', 'button--moveOccupancyTypeFieldDown') +
"</div>") + '</div>') +
"</div>" + '</div>' +
"</div>"; '</div>';
panelBlockElement panelBlockElement
.querySelector(".button--editOccupancyTypeField") .querySelector('.button--editOccupancyTypeField')
.addEventListener("click", openEditOccupancyTypeFieldByClick); .addEventListener('click', openEditOccupancyTypeFieldByClick);
panelBlockElement.querySelector(".button--moveOccupancyTypeFieldUp").addEventListener("click", moveOccupancyTypeField); panelBlockElement.querySelector('.button--moveOccupancyTypeFieldUp').addEventListener('click', moveOccupancyTypeField);
panelBlockElement.querySelector(".button--moveOccupancyTypeFieldDown").addEventListener("click", moveOccupancyTypeField); panelBlockElement.querySelector('.button--moveOccupancyTypeFieldDown').addEventListener('click', moveOccupancyTypeField);
panelElement.append(panelBlockElement); panelElement.append(panelBlockElement);
} }
} }
} }
function openAddOccupancyTypePrint(clickEvent) { function openAddOccupancyTypePrint(clickEvent) {
const occupancyTypeId = clickEvent.currentTarget.closest(".container--occupancyTypePrintList").dataset.occupancyTypeId; const occupancyTypeId = clickEvent.currentTarget.closest('.container--occupancyTypePrintList').dataset.occupancyTypeId;
let closeAddModalFunction; let closeAddModalFunction;
function doAdd(formEvent) { function doAdd(formEvent) {
formEvent.preventDefault(); formEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/admin/doAddOccupancyTypePrint", formEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doAddOccupancyTypePrint', formEvent.currentTarget, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
closeAddModalFunction(); closeAddModalFunction();
} }
occupancyTypeResponseHandler(responseJSON); occupancyTypeResponseHandler(responseJSON);
}); });
} }
cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyTypePrint", { cityssm.openHtmlModal('adminOccupancyTypes-addOccupancyTypePrint', {
onshow(modalElement) { onshow(modalElement) {
los.populateAliases(modalElement); los.populateAliases(modalElement);
modalElement.querySelector("#occupancyTypePrintAdd--occupancyTypeId").value = occupancyTypeId; modalElement.querySelector('#occupancyTypePrintAdd--occupancyTypeId').value = occupancyTypeId;
const printSelectElement = modalElement.querySelector("#occupancyTypePrintAdd--printEJS"); const printSelectElement = modalElement.querySelector('#occupancyTypePrintAdd--printEJS');
for (const [printEJS, printTitle] of Object.entries(exports.occupancyTypePrintTitles)) { for (const [printEJS, printTitle] of Object.entries(exports.occupancyTypePrintTitles)) {
const optionElement = document.createElement("option"); const optionElement = document.createElement('option');
optionElement.value = printEJS; optionElement.value = printEJS;
optionElement.textContent = printTitle; optionElement.textContent = printTitle;
printSelectElement.append(optionElement); printSelectElement.append(optionElement);
@ -321,48 +327,47 @@ Object.defineProperty(exports, "__esModule", { value: true });
onshown(modalElement, closeModalFunction) { onshown(modalElement, closeModalFunction) {
var _a; var _a;
closeAddModalFunction = closeModalFunction; closeAddModalFunction = closeModalFunction;
(_a = modalElement.querySelector("form")) === null || _a === void 0 ? void 0 : _a.addEventListener("submit", doAdd); (_a = modalElement.querySelector('form')) === null || _a === void 0 ? void 0 : _a.addEventListener('submit', doAdd);
} }
}); });
} }
function moveOccupancyTypePrint(clickEvent) { function moveOccupancyTypePrint(clickEvent) {
const buttonElement = clickEvent.currentTarget; const buttonElement = clickEvent.currentTarget;
const printEJS = buttonElement.closest(".container--occupancyTypePrint") const printEJS = buttonElement.closest('.container--occupancyTypePrint').dataset.printEJS;
.dataset.printEJS; const occupancyTypeId = buttonElement.closest('.container--occupancyTypePrintList').dataset.occupancyTypeId;
const occupancyTypeId = buttonElement.closest(".container--occupancyTypePrintList").dataset.occupancyTypeId;
cityssm.postJSON(los.urlPrefix + cityssm.postJSON(los.urlPrefix +
"/admin/" + '/admin/' +
(buttonElement.dataset.direction === "up" (buttonElement.dataset.direction === 'up'
? "doMoveOccupancyTypePrintUp" ? 'doMoveOccupancyTypePrintUp'
: "doMoveOccupancyTypePrintDown"), { : 'doMoveOccupancyTypePrintDown'), {
occupancyTypeId, occupancyTypeId,
printEJS, printEJS,
moveToEnd: clickEvent.shiftKey ? "1" : "0" moveToEnd: clickEvent.shiftKey ? '1' : '0'
}, occupancyTypeResponseHandler); }, occupancyTypeResponseHandler);
} }
function deleteOccupancyTypePrint(clickEvent) { function deleteOccupancyTypePrint(clickEvent) {
clickEvent.preventDefault(); clickEvent.preventDefault();
const printEJS = clickEvent.currentTarget.closest(".container--occupancyTypePrint").dataset.printEJS; const printEJS = clickEvent.currentTarget.closest('.container--occupancyTypePrint').dataset.printEJS;
const occupancyTypeId = clickEvent.currentTarget.closest(".container--occupancyTypePrintList").dataset.occupancyTypeId; const occupancyTypeId = clickEvent.currentTarget.closest('.container--occupancyTypePrintList').dataset.occupancyTypeId;
function doDelete() { function doDelete() {
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteOccupancyTypePrint", { cityssm.postJSON(los.urlPrefix + '/admin/doDeleteOccupancyTypePrint', {
occupancyTypeId, occupancyTypeId,
printEJS printEJS
}, occupancyTypeResponseHandler); }, occupancyTypeResponseHandler);
} }
bulmaJS.confirm({ bulmaJS.confirm({
title: "Delete Print", title: 'Delete Print',
message: "Are you sure you want to remove this print option?", message: 'Are you sure you want to remove this print option?',
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: "Yes, Remove Print", text: 'Yes, Remove Print',
callbackFunction: doDelete callbackFunction: doDelete
} }
}); });
} }
function renderOccupancyTypePrints(panelElement, occupancyTypeId, occupancyTypePrints) { function renderOccupancyTypePrints(panelElement, occupancyTypeId, occupancyTypePrints) {
if (occupancyTypePrints.length === 0) { if (occupancyTypePrints.length === 0) {
panelElement.insertAdjacentHTML("beforeend", `<div class="panel-block is-block"> panelElement.insertAdjacentHTML('beforeend', `<div class="panel-block is-block">
<div class="message is-info"> <div class="message is-info">
<p class="message-body">There are no prints associated with this record.</p> <p class="message-body">There are no prints associated with this record.</p>
</div> </div>
@ -370,18 +375,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
else { else {
for (const printEJS of occupancyTypePrints) { for (const printEJS of occupancyTypePrints) {
const panelBlockElement = document.createElement("div"); const panelBlockElement = document.createElement('div');
panelBlockElement.className = "panel-block is-block container--occupancyTypePrint"; panelBlockElement.className =
'panel-block is-block container--occupancyTypePrint';
panelBlockElement.dataset.printEJS = printEJS; panelBlockElement.dataset.printEJS = printEJS;
const printTitle = printEJS === "*" const printTitle = printEJS === '*'
? "(All Available Prints)" ? '(All Available Prints)'
: exports.occupancyTypePrintTitles[printEJS]; : exports.occupancyTypePrintTitles[printEJS];
let printIconClass = "fa-star"; let printIconClass = 'fa-star';
if (printEJS.startsWith("pdf/")) { if (printEJS.startsWith('pdf/')) {
printIconClass = "fa-file-pdf"; printIconClass = 'fa-file-pdf';
} }
else if (printEJS.startsWith("screen/")) { else if (printEJS.startsWith('screen/')) {
printIconClass = "fa-file"; printIconClass = 'fa-file';
} }
panelBlockElement.innerHTML = panelBlockElement.innerHTML =
'<div class="level is-mobile">' + '<div class="level is-mobile">' +
@ -390,28 +396,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
'<i class="fas fa-fw ' + '<i class="fas fa-fw ' +
printIconClass + printIconClass +
'" aria-hidden="true"></i>' + '" aria-hidden="true"></i>' +
"</div>") + '</div>') +
('<div class="level-item">' + ('<div class="level-item">' +
cityssm.escapeHTML(printTitle || printEJS) + cityssm.escapeHTML(printTitle || printEJS) +
"</div>") + '</div>') +
"</div>" + '</div>' +
'<div class="level-right">' + '<div class="level-right">' +
('<div class="level-item">' + ('<div class="level-item">' +
los.getMoveUpDownButtonFieldHTML("button--moveOccupancyTypePrintUp", "button--moveOccupancyTypePrintDown") + los.getMoveUpDownButtonFieldHTML('button--moveOccupancyTypePrintUp', 'button--moveOccupancyTypePrintDown') +
"</div>") + '</div>') +
('<div class="level-item">' + ('<div class="level-item">' +
'<button class="button is-small is-danger button--deleteOccupancyTypePrint" data-tooltip="Delete" type="button" aria-label="Delete Print">' + '<button class="button is-small is-danger button--deleteOccupancyTypePrint" data-tooltip="Delete" type="button" aria-label="Delete Print">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' + '<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" + '</button>' +
"</div>" + '</div>' +
"</div>") + '</div>') +
"</div>" + '</div>' +
"</div>"; '</div>';
panelBlockElement.querySelector(".button--moveOccupancyTypePrintUp").addEventListener("click", moveOccupancyTypePrint); panelBlockElement.querySelector('.button--moveOccupancyTypePrintUp').addEventListener('click', moveOccupancyTypePrint);
panelBlockElement.querySelector(".button--moveOccupancyTypePrintDown").addEventListener("click", moveOccupancyTypePrint); panelBlockElement.querySelector('.button--moveOccupancyTypePrintDown').addEventListener('click', moveOccupancyTypePrint);
panelBlockElement panelBlockElement
.querySelector(".button--deleteOccupancyTypePrint") .querySelector('.button--deleteOccupancyTypePrint')
.addEventListener("click", deleteOccupancyTypePrint); .addEventListener('click', deleteOccupancyTypePrint);
panelElement.append(panelBlockElement); panelElement.append(panelBlockElement);
} }
} }
@ -425,30 +431,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
'<div class="level-item">' + '<div class="level-item">' +
('<h2 class="title is-4">(All ' + ('<h2 class="title is-4">(All ' +
cityssm.escapeHTML(exports.aliases.occupancy) + cityssm.escapeHTML(exports.aliases.occupancy) +
" Types)</h2>") + ' Types)</h2>') +
"</div>" + '</div>' +
"</div>") + '</div>') +
('<div class="level-right">' + ('<div class="level-right">' +
('<div class="level-item">' + ('<div class="level-item">' +
'<button class="button is-success is-small button--addOccupancyTypeField" type="button">' + '<button class="button is-success is-small button--addOccupancyTypeField" 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 Field</span>" + '<span>Add Field</span>' +
"</button>" + '</button>' +
"</div>") + '</div>') +
"</div>") + '</div>') +
"</div>") + '</div>') +
"</div>" + '</div>' +
"</div>"; '</div>';
occupancyTypePrintsContainerElement.innerHTML = ""; occupancyTypePrintsContainerElement.innerHTML = '';
renderOccupancyTypeFields(occupancyTypesContainerElement.querySelector("#container--allOccupancyTypeFields"), undefined, allOccupancyTypeFields); renderOccupancyTypeFields(occupancyTypesContainerElement.querySelector('#container--allOccupancyTypeFields'), undefined, allOccupancyTypeFields);
occupancyTypesContainerElement occupancyTypesContainerElement
.querySelector(".button--addOccupancyTypeField") .querySelector('.button--addOccupancyTypeField')
.addEventListener("click", openAddOccupancyTypeField); .addEventListener('click', openAddOccupancyTypeField);
if (occupancyTypes.length === 0) { if (occupancyTypes.length === 0) {
occupancyTypesContainerElement.insertAdjacentHTML("afterbegin", `<div class="message is-warning> occupancyTypesContainerElement.insertAdjacentHTML('afterbegin', `<div class="message is-warning>
<p class="message-body">There are no active ${los.escapedAliases.occupancy} types.</p> <p class="message-body">There are no active ${los.escapedAliases.occupancy} types.</p>
</div>`); </div>`);
occupancyTypePrintsContainerElement.insertAdjacentHTML("afterbegin", `<div class="message is-warning> occupancyTypePrintsContainerElement.insertAdjacentHTML('afterbegin', `<div class="message is-warning>
<p class="message-body">There are no active ${los.escapedAliases.occupancy} types.</p> <p class="message-body">There are no active ${los.escapedAliases.occupancy} types.</p>
</div>`); </div>`);
return; return;
@ -456,8 +462,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
for (const occupancyType of occupancyTypes) { for (const occupancyType of occupancyTypes) {
// Types and Fields // Types and Fields
{ {
const occupancyTypeContainer = document.createElement("div"); const occupancyTypeContainer = document.createElement('div');
occupancyTypeContainer.className = "panel container--occupancyType"; occupancyTypeContainer.className = 'panel container--occupancyType';
occupancyTypeContainer.dataset.occupancyTypeId = occupancyTypeContainer.dataset.occupancyTypeId =
occupancyType.occupancyTypeId.toString(); occupancyType.occupancyTypeId.toString();
occupancyTypeContainer.innerHTML = occupancyTypeContainer.innerHTML =
@ -469,62 +475,63 @@ Object.defineProperty(exports, "__esModule", { value: true });
(expandedOccupancyTypes.has(occupancyType.occupancyTypeId) (expandedOccupancyTypes.has(occupancyType.occupancyTypeId)
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>' ? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>') + : '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>') +
"</button>" + '</button>' +
"</div>" + '</div>' +
'<div class="level-item">' + '<div class="level-item">' +
'<h2 class="title is-4">' + '<h2 class="title is-4">' +
cityssm.escapeHTML(occupancyType.occupancyType) + cityssm.escapeHTML(occupancyType.occupancyType) +
"</h2>" + '</h2>' +
"</div>" + '</div>' +
"</div>") + '</div>') +
('<div class="level-right">' + ('<div class="level-right">' +
('<div class="level-item">' + ('<div class="level-item">' +
'<button class="button is-danger is-small button--deleteOccupancyType" type="button">' + '<button class="button is-danger is-small button--deleteOccupancyType" 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</span>" + '<span>Delete</span>' +
"</button>" + '</button>' +
"</div>") + '</div>') +
('<div class="level-item">' + ('<div class="level-item">' +
'<button class="button is-primary is-small button--editOccupancyType" type="button">' + '<button class="button is-primary is-small button--editOccupancyType" 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 " + '<span>Edit ' +
exports.aliases.occupancy + exports.aliases.occupancy +
" Type</span>" + ' Type</span>' +
"</button>" + '</button>' +
"</div>") + '</div>') +
('<div class="level-item">' + ('<div class="level-item">' +
'<button class="button is-success is-small button--addOccupancyTypeField" type="button">' + '<button class="button is-success is-small button--addOccupancyTypeField" 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 Field</span>" + '<span>Add Field</span>' +
"</button>" + '</button>' +
"</div>") + '</div>') +
('<div class="level-item">' + ('<div class="level-item">' +
los.getMoveUpDownButtonFieldHTML("button--moveOccupancyTypeUp", "button--moveOccupancyTypeDown") + los.getMoveUpDownButtonFieldHTML('button--moveOccupancyTypeUp', 'button--moveOccupancyTypeDown') +
"</div>") + '</div>') +
"</div>") + '</div>') +
"</div>" + '</div>' +
"</div>"; '</div>';
renderOccupancyTypeFields(occupancyTypeContainer, occupancyType.occupancyTypeId, occupancyType.occupancyTypeFields); renderOccupancyTypeFields(occupancyTypeContainer, occupancyType.occupancyTypeId, occupancyType.occupancyTypeFields);
occupancyTypeContainer occupancyTypeContainer
.querySelector(".button--toggleOccupancyTypeFields") .querySelector('.button--toggleOccupancyTypeFields')
.addEventListener("click", toggleOccupancyTypeFields); .addEventListener('click', toggleOccupancyTypeFields);
occupancyTypeContainer occupancyTypeContainer
.querySelector(".button--deleteOccupancyType") .querySelector('.button--deleteOccupancyType')
.addEventListener("click", deleteOccupancyType); .addEventListener('click', deleteOccupancyType);
occupancyTypeContainer occupancyTypeContainer
.querySelector(".button--editOccupancyType") .querySelector('.button--editOccupancyType')
.addEventListener("click", openEditOccupancyType); .addEventListener('click', openEditOccupancyType);
occupancyTypeContainer occupancyTypeContainer
.querySelector(".button--addOccupancyTypeField") .querySelector('.button--addOccupancyTypeField')
.addEventListener("click", openAddOccupancyTypeField); .addEventListener('click', openAddOccupancyTypeField);
occupancyTypeContainer.querySelector(".button--moveOccupancyTypeUp").addEventListener("click", moveOccupancyType); occupancyTypeContainer.querySelector('.button--moveOccupancyTypeUp').addEventListener('click', moveOccupancyType);
occupancyTypeContainer.querySelector(".button--moveOccupancyTypeDown").addEventListener("click", moveOccupancyType); occupancyTypeContainer.querySelector('.button--moveOccupancyTypeDown').addEventListener('click', moveOccupancyType);
occupancyTypesContainerElement.append(occupancyTypeContainer); occupancyTypesContainerElement.append(occupancyTypeContainer);
} }
// Prints // Prints
{ {
const occupancyTypePrintContainer = document.createElement("div"); const occupancyTypePrintContainer = document.createElement('div');
occupancyTypePrintContainer.className = "panel container--occupancyTypePrintList"; occupancyTypePrintContainer.className =
'panel container--occupancyTypePrintList';
occupancyTypePrintContainer.dataset.occupancyTypeId = occupancyTypePrintContainer.dataset.occupancyTypeId =
occupancyType.occupancyTypeId.toString(); occupancyType.occupancyTypeId.toString();
occupancyTypePrintContainer.innerHTML = occupancyTypePrintContainer.innerHTML =
@ -534,32 +541,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
'<div class="level-item">' + '<div class="level-item">' +
'<h2 class="title is-4">' + '<h2 class="title is-4">' +
cityssm.escapeHTML(occupancyType.occupancyType) + cityssm.escapeHTML(occupancyType.occupancyType) +
"</h2>" + '</h2>' +
"</div>" + '</div>' +
"</div>") + '</div>') +
('<div class="level-right">' + ('<div class="level-right">' +
('<div class="level-item">' + ('<div class="level-item">' +
'<button class="button is-success is-small button--addOccupancyTypePrint" type="button">' + '<button class="button is-success is-small button--addOccupancyTypePrint" 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 Print</span>" + '<span>Add Print</span>' +
"</button>" + '</button>' +
"</div>") + '</div>') +
"</div>") + '</div>') +
"</div>" + '</div>' +
"</div>"; '</div>';
renderOccupancyTypePrints(occupancyTypePrintContainer, occupancyType.occupancyTypeId, occupancyType.occupancyTypePrints); renderOccupancyTypePrints(occupancyTypePrintContainer, occupancyType.occupancyTypeId, occupancyType.occupancyTypePrints);
occupancyTypePrintContainer occupancyTypePrintContainer
.querySelector(".button--addOccupancyTypePrint") .querySelector('.button--addOccupancyTypePrint')
.addEventListener("click", openAddOccupancyTypePrint); .addEventListener('click', openAddOccupancyTypePrint);
occupancyTypePrintsContainerElement.append(occupancyTypePrintContainer); occupancyTypePrintsContainerElement.append(occupancyTypePrintContainer);
} }
} }
} }
document.querySelector("#button--addOccupancyType").addEventListener("click", () => { document
.querySelector('#button--addOccupancyType')
.addEventListener('click', () => {
let addCloseModalFunction; let addCloseModalFunction;
const doAdd = (submitEvent) => { const doAdd = (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/admin/doAddOccupancyType", submitEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doAddOccupancyType', submitEvent.currentTarget, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
addCloseModalFunction(); addCloseModalFunction();
occupancyTypes = responseJSON.occupancyTypes; occupancyTypes = responseJSON.occupancyTypes;
@ -567,21 +576,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Adding " + exports.aliases.occupancy + " Type", title: 'Error Adding ' + exports.aliases.occupancy + ' Type',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyType", { cityssm.openHtmlModal('adminOccupancyTypes-addOccupancyType', {
onshow: (modalElement) => { onshow: (modalElement) => {
los.populateAliases(modalElement); los.populateAliases(modalElement);
}, },
onshown: (modalElement, closeModalFunction) => { onshown: (modalElement, closeModalFunction) => {
addCloseModalFunction = closeModalFunction; addCloseModalFunction = closeModalFunction;
modalElement.querySelector("#occupancyTypeAdd--occupancyType").focus(); modalElement.querySelector('#occupancyTypeAdd--occupancyType').focus();
modalElement.querySelector("form").addEventListener("submit", doAdd); modalElement.querySelector('form').addEventListener('submit', doAdd);
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
}, },
onremoved: () => { onremoved: () => {

File diff suppressed because it is too large Load Diff

View File

@ -9,8 +9,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
const inputElement = changeEvent.currentTarget; const inputElement = changeEvent.currentTarget;
const fontAwesomeIconClass = inputElement.value; const fontAwesomeIconClass = inputElement.value;
inputElement inputElement
.closest(".field") .closest('.field')
.querySelectorAll(".button.is-static")[1].innerHTML = `<i class="fas fa-fw fa-${fontAwesomeIconClass}" aria-hidden="true"></i>`; .querySelectorAll('.button.is-static')[1].innerHTML = `<i class="fas fa-fw fa-${fontAwesomeIconClass}" aria-hidden="true"></i>`;
} }
"use strict"; "use strict";
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
@ -19,28 +19,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
delete exports.workOrderTypes; delete exports.workOrderTypes;
const updateWorkOrderType = (submitEvent) => { const updateWorkOrderType = (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateWorkOrderType", submitEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doUpdateWorkOrderType', submitEvent.currentTarget, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderTypes = responseJSON.workOrderTypes; workOrderTypes = responseJSON.workOrderTypes;
bulmaJS.alert({ bulmaJS.alert({
message: "Work Order Type Updated Successfully", message: 'Work Order Type Updated Successfully',
contextualColorName: "success" contextualColorName: 'success'
}); });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Updating Work Order Type", title: 'Error Updating Work Order Type',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
const deleteWorkOrderType = (clickEvent) => { const deleteWorkOrderType = (clickEvent) => {
const tableRowElement = clickEvent.currentTarget.closest("tr"); const tableRowElement = clickEvent.currentTarget.closest('tr');
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId; const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
const doDelete = () => { const doDelete = () => {
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteWorkOrderType", { cityssm.postJSON(los.urlPrefix + '/admin/doDeleteWorkOrderType', {
workOrderTypeId workOrderTypeId
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
@ -52,40 +52,40 @@ Object.defineProperty(exports, "__esModule", { value: true });
tableRowElement.remove(); tableRowElement.remove();
} }
bulmaJS.alert({ bulmaJS.alert({
message: "Work Order Type Deleted Successfully", message: 'Work Order Type Deleted Successfully',
contextualColorName: "success" contextualColorName: 'success'
}); });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Deleting Work Order Type", title: 'Error Deleting Work Order Type',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
bulmaJS.confirm({ bulmaJS.confirm({
title: "Delete Work Order Type", title: 'Delete Work Order Type',
message: `Are you sure you want to delete this work order type?<br /> message: `Are you sure you want to delete this work order type?<br />
Note that no work orders will be removed.`, Note that no work orders will be removed.`,
messageIsHtml: true, messageIsHtml: true,
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: "Yes, Delete Work Order Type", text: 'Yes, Delete Work Order Type',
callbackFunction: doDelete callbackFunction: doDelete
} }
}); });
}; };
const moveWorkOrderType = (clickEvent) => { const moveWorkOrderType = (clickEvent) => {
const buttonElement = clickEvent.currentTarget; const buttonElement = clickEvent.currentTarget;
const tableRowElement = buttonElement.closest("tr"); const tableRowElement = buttonElement.closest('tr');
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId; const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
cityssm.postJSON(los.urlPrefix + cityssm.postJSON(los.urlPrefix +
"/admin/" + '/admin/' +
(buttonElement.dataset.direction === "up" ? "doMoveWorkOrderTypeUp" : "doMoveWorkOrderTypeDown"), { (buttonElement.dataset.direction === 'up' ? 'doMoveWorkOrderTypeUp' : 'doMoveWorkOrderTypeDown'), {
workOrderTypeId, workOrderTypeId,
moveToEnd: clickEvent.shiftKey ? "1" : "0" moveToEnd: clickEvent.shiftKey ? '1' : '0'
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderTypes = responseJSON.workOrderTypes; workOrderTypes = responseJSON.workOrderTypes;
@ -93,79 +93,79 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Moving Work Order Type", title: 'Error Moving Work Order Type',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
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><td colspan="2"> containerElement.innerHTML = `<tr><td colspan="2">
<div class="message is-warning"><p class="message-body">There are no active work order types.</p></div> <div class="message is-warning"><p class="message-body">There are no active work order types.</p></div>
</td></tr>`; </td></tr>`;
return; return;
} }
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 = workOrderType.workOrderTypeId.toString();
tableRowElement.innerHTML = tableRowElement.innerHTML =
"<td>" + '<td>' +
"<form>" + '<form>' +
'<input name="workOrderTypeId" type="hidden" value="' + '<input name="workOrderTypeId" type="hidden" value="' +
workOrderType.workOrderTypeId.toString() + workOrderType.workOrderTypeId.toString() +
'" />' + '" />' +
('<div class="field has-addons">' + ('<div class="field has-addons">' +
'<div class="control">' + '<div class="control">' +
'<input class="input" name="workOrderType" type="text" value="' + '<input class="input" name="workOrderType" type="text" value="' +
cityssm.escapeHTML(workOrderType.workOrderType || "") + cityssm.escapeHTML(workOrderType.workOrderType || '') +
'" maxlength="100" aria-label="Work Order Type" required />' + '" maxlength="100" aria-label="Work Order Type" required />' +
"</div>" + '</div>' +
'<div class="control">' + '<div class="control">' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' + '<button class="button is-success" type="submit" aria-label="Save"><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">' +
los.getMoveUpDownButtonFieldHTML("button--moveWorkOrderTypeUp", "button--moveWorkOrderTypeDown", false) + los.getMoveUpDownButtonFieldHTML('button--moveWorkOrderTypeUp', 'button--moveWorkOrderTypeDown', false) +
"</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.querySelector('form').addEventListener('submit', updateWorkOrderType);
tableRowElement.querySelector(".button--moveWorkOrderTypeUp").addEventListener("click", moveWorkOrderType); tableRowElement.querySelector('.button--moveWorkOrderTypeUp').addEventListener('click', moveWorkOrderType);
tableRowElement.querySelector(".button--moveWorkOrderTypeDown").addEventListener("click", moveWorkOrderType); tableRowElement.querySelector('.button--moveWorkOrderTypeDown').addEventListener('click', moveWorkOrderType);
tableRowElement tableRowElement
.querySelector(".button--deleteWorkOrderType") .querySelector('.button--deleteWorkOrderType')
.addEventListener("click", 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(los.urlPrefix + "/admin/doAddWorkOrderType", formElement, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doAddWorkOrderType', formElement, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderTypes = responseJSON.workOrderTypes; workOrderTypes = responseJSON.workOrderTypes;
renderWorkOrderTypes(); renderWorkOrderTypes();
formElement.reset(); formElement.reset();
formElement.querySelector("input").focus(); formElement.querySelector('input').focus();
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Adding Work Order Type", title: 'Error Adding Work Order Type',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
@ -179,28 +179,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
delete exports.workOrderMilestoneTypes; delete exports.workOrderMilestoneTypes;
const updateWorkOrderMilestoneType = (submitEvent) => { const updateWorkOrderMilestoneType = (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateWorkOrderMilestoneType", submitEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doUpdateWorkOrderMilestoneType', submitEvent.currentTarget, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes; workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes;
bulmaJS.alert({ bulmaJS.alert({
message: "Work Order Milestone Type Updated Successfully", message: 'Work Order Milestone Type Updated Successfully',
contextualColorName: "success" contextualColorName: 'success'
}); });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Updating Work Order Milestone Type", title: 'Error Updating Work Order Milestone Type',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
const deleteWorkOrderMilestoneType = (clickEvent) => { const deleteWorkOrderMilestoneType = (clickEvent) => {
const tableRowElement = clickEvent.currentTarget.closest("tr"); const tableRowElement = clickEvent.currentTarget.closest('tr');
const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId; const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId;
const doDelete = () => { const doDelete = () => {
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteWorkOrderMilestoneType", { cityssm.postJSON(los.urlPrefix + '/admin/doDeleteWorkOrderMilestoneType', {
workOrderMilestoneTypeId workOrderMilestoneTypeId
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
@ -212,42 +212,42 @@ Object.defineProperty(exports, "__esModule", { value: true });
tableRowElement.remove(); tableRowElement.remove();
} }
bulmaJS.alert({ bulmaJS.alert({
message: "Work Order Milestone Type Deleted Successfully", message: 'Work Order Milestone Type Deleted Successfully',
contextualColorName: "success" contextualColorName: 'success'
}); });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Deleting Work Order Milestone Type", title: 'Error Deleting Work Order Milestone Type',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
bulmaJS.confirm({ bulmaJS.confirm({
title: "Delete Work Order Milestone Type", title: 'Delete Work Order Milestone Type',
message: `Are you sure you want to delete this work order milestone type?<br /> message: `Are you sure you want to delete this work order milestone type?<br />
Note that no work orders will be removed.`, Note that no work orders will be removed.`,
messageIsHtml: true, messageIsHtml: true,
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: "Yes, Delete Work Order Milestone Type", text: 'Yes, Delete Work Order Milestone Type',
callbackFunction: doDelete callbackFunction: doDelete
} }
}); });
}; };
const moveWorkOrderMilestoneType = (clickEvent) => { const moveWorkOrderMilestoneType = (clickEvent) => {
const buttonElement = clickEvent.currentTarget; const buttonElement = clickEvent.currentTarget;
const tableRowElement = buttonElement.closest("tr"); const tableRowElement = buttonElement.closest('tr');
const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId; const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId;
cityssm.postJSON(los.urlPrefix + cityssm.postJSON(los.urlPrefix +
"/admin/" + '/admin/' +
(buttonElement.dataset.direction === "up" (buttonElement.dataset.direction === 'up'
? "doMoveWorkOrderMilestoneTypeUp" ? 'doMoveWorkOrderMilestoneTypeUp'
: "doMoveWorkOrderMilestoneTypeDown"), { : 'doMoveWorkOrderMilestoneTypeDown'), {
workOrderMilestoneTypeId, workOrderMilestoneTypeId,
moveToEnd: clickEvent.shiftKey ? "1" : "0" moveToEnd: clickEvent.shiftKey ? '1' : '0'
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes; workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes;
@ -255,29 +255,29 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Moving Work Order Milestone Type", title: 'Error Moving Work Order Milestone Type',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
const renderWorkOrderMilestoneTypes = () => { const renderWorkOrderMilestoneTypes = () => {
const containerElement = document.querySelector("#container--workOrderMilestoneTypes"); const containerElement = document.querySelector('#container--workOrderMilestoneTypes');
if (workOrderMilestoneTypes.length === 0) { if (workOrderMilestoneTypes.length === 0) {
containerElement.innerHTML = `<tr><td colspan="2"> containerElement.innerHTML = `<tr><td colspan="2">
<div class="message is-warning"><p class="message-body">There are no active work order milestone types.</p></div> <div class="message is-warning"><p class="message-body">There are no active work order milestone types.</p></div>
</td></tr>`; </td></tr>`;
return; return;
} }
containerElement.innerHTML = ""; containerElement.innerHTML = '';
for (const workOrderMilestoneType of workOrderMilestoneTypes) { for (const workOrderMilestoneType of workOrderMilestoneTypes) {
const tableRowElement = document.createElement("tr"); const tableRowElement = document.createElement('tr');
tableRowElement.dataset.workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId =
workOrderMilestoneType.workOrderMilestoneTypeId.toString(); workOrderMilestoneType.workOrderMilestoneTypeId.toString();
tableRowElement.innerHTML = tableRowElement.innerHTML =
"<td>" + '<td>' +
"<form>" + '<form>' +
'<input name="workOrderMilestoneTypeId" type="hidden" value="' + '<input name="workOrderMilestoneTypeId" type="hidden" value="' +
workOrderMilestoneType.workOrderMilestoneTypeId.toString() + workOrderMilestoneType.workOrderMilestoneTypeId.toString() +
'" />' + '" />' +
@ -286,49 +286,49 @@ Object.defineProperty(exports, "__esModule", { value: true });
'<input class="input" name="workOrderMilestoneType" type="text" value="' + '<input class="input" name="workOrderMilestoneType" type="text" value="' +
cityssm.escapeHTML(workOrderMilestoneType.workOrderMilestoneType) + cityssm.escapeHTML(workOrderMilestoneType.workOrderMilestoneType) +
'" maxlength="100" aria-label="Work Order Milestone Type" required />' + '" maxlength="100" aria-label="Work Order Milestone Type" required />' +
"</div>" + '</div>' +
'<div class="control">' + '<div class="control">' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' + '<button class="button is-success" type="submit" aria-label="Save"><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">' +
los.getMoveUpDownButtonFieldHTML("button--moveWorkOrderMilestoneTypeUp", "button--moveWorkOrderMilestoneTypeDown", false) + los.getMoveUpDownButtonFieldHTML('button--moveWorkOrderMilestoneTypeUp', 'button--moveWorkOrderMilestoneTypeDown', false) +
"</div>" + '</div>' +
'<div class="control">' + '<div class="control">' +
'<button class="button is-danger is-light button--deleteWorkOrderMilestoneType" data-tooltip="Delete Mielstone Type" type="button" aria-label="Delete Milestone Type">' + '<button class="button is-danger is-light button--deleteWorkOrderMilestoneType" data-tooltip="Delete Mielstone Type" type="button" aria-label="Delete Milestone 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", updateWorkOrderMilestoneType); tableRowElement.querySelector('form').addEventListener('submit', updateWorkOrderMilestoneType);
tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeUp").addEventListener("click", moveWorkOrderMilestoneType); tableRowElement.querySelector('.button--moveWorkOrderMilestoneTypeUp').addEventListener('click', moveWorkOrderMilestoneType);
tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeDown").addEventListener("click", moveWorkOrderMilestoneType); tableRowElement.querySelector('.button--moveWorkOrderMilestoneTypeDown').addEventListener('click', moveWorkOrderMilestoneType);
tableRowElement tableRowElement
.querySelector(".button--deleteWorkOrderMilestoneType") .querySelector('.button--deleteWorkOrderMilestoneType')
.addEventListener("click", deleteWorkOrderMilestoneType); .addEventListener('click', deleteWorkOrderMilestoneType);
containerElement.append(tableRowElement); containerElement.append(tableRowElement);
} }
}; };
document.querySelector("#form--addWorkOrderMilestoneType").addEventListener("submit", (submitEvent) => { document.querySelector('#form--addWorkOrderMilestoneType').addEventListener('submit', (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
const formElement = submitEvent.currentTarget; const formElement = submitEvent.currentTarget;
cityssm.postJSON(los.urlPrefix + "/admin/doAddWorkOrderMilestoneType", formElement, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doAddWorkOrderMilestoneType', formElement, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes; workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes;
renderWorkOrderMilestoneTypes(); renderWorkOrderMilestoneTypes();
formElement.reset(); formElement.reset();
formElement.querySelector("input").focus(); formElement.querySelector('input').focus();
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Adding Work Order Milestone Type", title: 'Error Adding Work Order Milestone Type',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
@ -342,28 +342,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
delete exports.lotStatuses; delete exports.lotStatuses;
const updateLotStatus = (submitEvent) => { const updateLotStatus = (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateLotStatus", submitEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doUpdateLotStatus', submitEvent.currentTarget, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
lotStatuses = responseJSON.lotStatuses; lotStatuses = responseJSON.lotStatuses;
bulmaJS.alert({ bulmaJS.alert({
message: los.escapedAliases.Lot + " Status Updated Successfully", message: los.escapedAliases.Lot + ' Status Updated Successfully',
contextualColorName: "success" contextualColorName: 'success'
}); });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Updating " + los.escapedAliases.Lot + " Status", title: 'Error Updating ' + los.escapedAliases.Lot + ' Status',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
const deleteLotStatus = (clickEvent) => { const deleteLotStatus = (clickEvent) => {
const tableRowElement = clickEvent.currentTarget.closest("tr"); const tableRowElement = clickEvent.currentTarget.closest('tr');
const lotStatusId = tableRowElement.dataset.lotStatusId; const lotStatusId = tableRowElement.dataset.lotStatusId;
const doDelete = () => { const doDelete = () => {
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteLotStatus", { cityssm.postJSON(los.urlPrefix + '/admin/doDeleteLotStatus', {
lotStatusId lotStatusId
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
@ -375,15 +375,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
tableRowElement.remove(); tableRowElement.remove();
} }
bulmaJS.alert({ bulmaJS.alert({
message: los.escapedAliases.Lot + " Status Deleted Successfully", message: los.escapedAliases.Lot + ' Status Deleted Successfully',
contextualColorName: "success" contextualColorName: 'success'
}); });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Deleting " + los.escapedAliases.Lot + " Status", title: 'Error Deleting ' + los.escapedAliases.Lot + ' Status',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
@ -393,22 +393,22 @@ Object.defineProperty(exports, "__esModule", { value: true });
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 ${los.escapedAliases.lot} will be removed.`, Note that no ${los.escapedAliases.lot} will be removed.`,
messageIsHtml: true, messageIsHtml: true,
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: "Yes, Delete Status", text: 'Yes, Delete Status',
callbackFunction: doDelete callbackFunction: doDelete
} }
}); });
}; };
const moveLotStatus = (clickEvent) => { const moveLotStatus = (clickEvent) => {
const buttonElement = clickEvent.currentTarget; const buttonElement = clickEvent.currentTarget;
const tableRowElement = buttonElement.closest("tr"); const tableRowElement = buttonElement.closest('tr');
const lotStatusId = tableRowElement.dataset.lotStatusId; const lotStatusId = tableRowElement.dataset.lotStatusId;
cityssm.postJSON(los.urlPrefix + cityssm.postJSON(los.urlPrefix +
"/admin/" + '/admin/' +
(buttonElement.dataset.direction === "up" ? "doMoveLotStatusUp" : "doMoveLotStatusDown"), { (buttonElement.dataset.direction === 'up' ? 'doMoveLotStatusUp' : 'doMoveLotStatusDown'), {
lotStatusId, lotStatusId,
moveToEnd: clickEvent.shiftKey ? "1" : "0" moveToEnd: clickEvent.shiftKey ? '1' : '0'
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
lotStatuses = responseJSON.lotStatuses; lotStatuses = responseJSON.lotStatuses;
@ -416,28 +416,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Moving " + exports.aliases.lot + " Status", title: 'Error Moving ' + exports.aliases.lot + ' Status',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
const renderLotStatuses = () => { const renderLotStatuses = () => {
const containerElement = document.querySelector("#container--lotStatuses"); const containerElement = document.querySelector('#container--lotStatuses');
if (lotStatuses.length === 0) { if (lotStatuses.length === 0) {
containerElement.innerHTML = `<tr><td colspan="2"> containerElement.innerHTML = `<tr><td colspan="2">
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} statuses.</p></div> <div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} statuses.</p></div>
</td></tr>`; </td></tr>`;
return; return;
} }
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 = lotStatus.lotStatusId.toString();
tableRowElement.innerHTML = tableRowElement.innerHTML =
"<td>" + '<td>' +
"<form>" + '<form>' +
'<input name="lotStatusId" type="hidden" value="' + '<input name="lotStatusId" type="hidden" value="' +
lotStatus.lotStatusId.toString() + lotStatus.lotStatusId.toString() +
'" />' + '" />' +
@ -447,47 +447,47 @@ Object.defineProperty(exports, "__esModule", { value: true });
(' value="' + cityssm.escapeHTML(lotStatus.lotStatus) + '"') + (' value="' + cityssm.escapeHTML(lotStatus.lotStatus) + '"') +
(' aria-label="' + cityssm.escapeHTML(exports.aliases.lot) + ' Status"') + (' aria-label="' + cityssm.escapeHTML(exports.aliases.lot) + ' Status"') +
' maxlength="100" required />' + ' maxlength="100" required />' +
"</div>" + '</div>' +
'<div class="control">' + '<div class="control">' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' + '<button class="button is-success" type="submit" aria-label="Save"><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">' +
los.getMoveUpDownButtonFieldHTML("button--moveLotStatusUp", "button--moveLotStatusDown", false) + los.getMoveUpDownButtonFieldHTML('button--moveLotStatusUp', 'button--moveLotStatusDown', false) +
"</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.querySelector('form').addEventListener('submit', updateLotStatus);
tableRowElement.querySelector(".button--moveLotStatusUp").addEventListener("click", moveLotStatus); tableRowElement.querySelector('.button--moveLotStatusUp').addEventListener('click', moveLotStatus);
tableRowElement.querySelector(".button--moveLotStatusDown").addEventListener("click", moveLotStatus); tableRowElement.querySelector('.button--moveLotStatusDown').addEventListener('click', moveLotStatus);
tableRowElement.querySelector(".button--deleteLotStatus").addEventListener("click", deleteLotStatus); 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(los.urlPrefix + "/admin/doAddLotStatus", formElement, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doAddLotStatus', formElement, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
lotStatuses = responseJSON.lotStatuses; lotStatuses = responseJSON.lotStatuses;
renderLotStatuses(); renderLotStatuses();
formElement.reset(); formElement.reset();
formElement.querySelector("input").focus(); formElement.querySelector('input').focus();
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: `Error Adding ${los.escapedAliases.Lot} Status`, title: `Error Adding ${los.escapedAliases.Lot} Status`,
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
@ -501,28 +501,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
delete exports.lotOccupantTypes; delete exports.lotOccupantTypes;
const updateLotOccupantType = (submitEvent) => { const updateLotOccupantType = (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateLotOccupantType", submitEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doUpdateLotOccupantType', submitEvent.currentTarget, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
lotOccupantTypes = responseJSON.lotOccupantTypes; lotOccupantTypes = responseJSON.lotOccupantTypes;
bulmaJS.alert({ bulmaJS.alert({
message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Updated Successfully`, message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Updated Successfully`,
contextualColorName: "success" contextualColorName: 'success'
}); });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: `Error Updating ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, title: `Error Updating ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
const deleteLotOccupantType = (clickEvent) => { const deleteLotOccupantType = (clickEvent) => {
const tableRowElement = clickEvent.currentTarget.closest("tr"); const tableRowElement = clickEvent.currentTarget.closest('tr');
const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId; const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId;
const doDelete = () => { const doDelete = () => {
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteLotOccupantType", { cityssm.postJSON(los.urlPrefix + '/admin/doDeleteLotOccupantType', {
lotOccupantTypeId lotOccupantTypeId
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
@ -535,14 +535,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
bulmaJS.alert({ bulmaJS.alert({
message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Deleted Successfully`, message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Deleted Successfully`,
contextualColorName: "success" contextualColorName: 'success'
}); });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: `Error Deleting ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, title: `Error Deleting ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
@ -552,7 +552,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
message: `Are you sure you want to delete this ${los.escapedAliases.lot} ${los.escapedAliases.occupant} type?<br /> message: `Are you sure you want to delete this ${los.escapedAliases.lot} ${los.escapedAliases.occupant} type?<br />
Note that no ${los.escapedAliases.lot} ${los.escapedAliases.occupants} will be removed.`, Note that no ${los.escapedAliases.lot} ${los.escapedAliases.occupants} will be removed.`,
messageIsHtml: true, messageIsHtml: true,
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: `Yes, Delete ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, text: `Yes, Delete ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
callbackFunction: doDelete callbackFunction: doDelete
@ -561,15 +561,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
}; };
const moveLotOccupantType = (clickEvent) => { const moveLotOccupantType = (clickEvent) => {
const buttonElement = clickEvent.currentTarget; const buttonElement = clickEvent.currentTarget;
const tableRowElement = buttonElement.closest("tr"); const tableRowElement = buttonElement.closest('tr');
const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId; const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId;
cityssm.postJSON(los.urlPrefix + cityssm.postJSON(los.urlPrefix +
"/admin/" + '/admin/' +
(buttonElement.dataset.direction === "up" (buttonElement.dataset.direction === 'up' ? 'doMoveLotOccupantTypeUp' : 'doMoveLotOccupantTypeDown'), {
? "doMoveLotOccupantTypeUp"
: "doMoveLotOccupantTypeDown"), {
lotOccupantTypeId, lotOccupantTypeId,
moveToEnd: clickEvent.shiftKey ? "1" : "0" moveToEnd: clickEvent.shiftKey ? '1' : '0'
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
lotOccupantTypes = responseJSON.lotOccupantTypes; lotOccupantTypes = responseJSON.lotOccupantTypes;
@ -578,40 +576,40 @@ Object.defineProperty(exports, "__esModule", { value: true });
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: `Error Moving ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, title: `Error Moving ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
const renderLotOccupantTypes = () => { const renderLotOccupantTypes = () => {
const containerElement = document.querySelector("#container--lotOccupantTypes"); const containerElement = document.querySelector('#container--lotOccupantTypes');
if (lotOccupantTypes.length === 0) { if (lotOccupantTypes.length === 0) {
containerElement.innerHTML = `<tr><td colspan="3"> containerElement.innerHTML = `<tr><td colspan="3">
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} ${los.escapedAliases.occupant} types.</p></div> <div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} ${los.escapedAliases.occupant} types.</p></div>
</td></tr>`; </td></tr>`;
return; return;
} }
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 = lotOccupantType.lotOccupantTypeId.toString();
const formId = "form--lotOccupantType-" + lotOccupantType.lotOccupantTypeId; const formId = 'form--lotOccupantType-' + lotOccupantType.lotOccupantTypeId;
tableRowElement.innerHTML = tableRowElement.innerHTML =
"<td>" + '<td>' +
('<div class="field">' + ('<div class="field">' +
'<div class="control">' + '<div class="control">' +
'<input class="input" name="lotOccupantType" type="text"' + '<input class="input" name="lotOccupantType" type="text"' +
(' value="' + cityssm.escapeHTML(lotOccupantType.lotOccupantType) + '"') + (' value="' + cityssm.escapeHTML(lotOccupantType.lotOccupantType) + '"') +
(' form="' + formId + '"') + (' form="' + formId + '"') +
(' aria-label="' + (' aria-label="' +
cityssm.escapeHTML(exports.aliases.lot + " " + exports.aliases.occupant) + cityssm.escapeHTML(exports.aliases.lot + ' ' + exports.aliases.occupant) +
' Type"') + ' Type"') +
' maxlength="100" required />' + ' maxlength="100" required />' +
"</div>" + '</div>' +
"</div>") + '</div>') +
"</td>" + '</td>' +
"<td>" + '<td>' +
('<div class="field has-addons">' + ('<div class="field has-addons">' +
'<div class="control"><span class="button is-static">fa-</span></div>' + '<div class="control"><span class="button is-static">fa-</span></div>' +
'<div class="control">' + '<div class="control">' +
@ -621,70 +619,70 @@ Object.defineProperty(exports, "__esModule", { value: true });
' list="datalist--fontAwesomeIconClass"' + ' list="datalist--fontAwesomeIconClass"' +
' aria-label="Icon Name"' + ' aria-label="Icon Name"' +
' maxlength="50" />' + ' maxlength="50" />' +
"</div>" + '</div>' +
'<div class="control"><span class="button is-static">' + '<div class="control"><span class="button is-static">' +
'<i class="fas fa-fw fa-' + '<i class="fas fa-fw fa-' +
cityssm.escapeHTML(lotOccupantType.fontAwesomeIconClass) + cityssm.escapeHTML(lotOccupantType.fontAwesomeIconClass) +
'"></i></span></div>' + '"></i></span></div>' +
"</div>") + '</div>') +
"</td>" + '</td>' +
("<td>" + ('<td>' +
('<form id="' + formId + '">') + ('<form id="' + formId + '">') +
'<input name="lotOccupantTypeId" type="hidden"' + '<input name="lotOccupantTypeId" type="hidden"' +
(' value="' + lotOccupantType.lotOccupantTypeId.toString() + '"') + (' value="' + lotOccupantType.lotOccupantTypeId.toString() + '"') +
" />" + ' />' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' + '<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
"</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">' +
los.getMoveUpDownButtonFieldHTML("button--moveLotOccupantTypeUp", "button--moveLotOccupantTypeDown", false) + los.getMoveUpDownButtonFieldHTML('button--moveLotOccupantTypeUp', 'button--moveLotOccupantTypeDown', false) +
"</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 ' + ' data-tooltip="Delete ' +
los.escapedAliases.Lot + los.escapedAliases.Lot +
" " + ' ' +
los.escapedAliases.Occupant + los.escapedAliases.Occupant +
' Type" type="button"' + ' Type" type="button"' +
' aria-label="Delete ' + ' aria-label="Delete ' +
los.escapedAliases.Lot + los.escapedAliases.Lot +
" " + ' ' +
los.escapedAliases.Occupant + los.escapedAliases.Occupant +
' Type">' + ' 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>';
const fontAwesomeInputElement = tableRowElement.querySelector("input[name='fontAwesomeIconClass']"); const fontAwesomeInputElement = tableRowElement.querySelector("input[name='fontAwesomeIconClass']");
fontAwesomeInputElement.addEventListener("keyup", refreshFontAwesomeIcon); fontAwesomeInputElement.addEventListener('keyup', refreshFontAwesomeIcon);
fontAwesomeInputElement.addEventListener("change", refreshFontAwesomeIcon); fontAwesomeInputElement.addEventListener('change', refreshFontAwesomeIcon);
tableRowElement.querySelector("form").addEventListener("submit", updateLotOccupantType); tableRowElement.querySelector('form').addEventListener('submit', updateLotOccupantType);
tableRowElement.querySelector(".button--moveLotOccupantTypeUp").addEventListener("click", moveLotOccupantType); tableRowElement.querySelector('.button--moveLotOccupantTypeUp').addEventListener('click', moveLotOccupantType);
tableRowElement.querySelector(".button--moveLotOccupantTypeDown").addEventListener("click", moveLotOccupantType); tableRowElement.querySelector('.button--moveLotOccupantTypeDown').addEventListener('click', moveLotOccupantType);
tableRowElement tableRowElement
.querySelector(".button--deleteLotOccupantType") .querySelector('.button--deleteLotOccupantType')
.addEventListener("click", 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(los.urlPrefix + "/admin/doAddLotOccupantType", formElement, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doAddLotOccupantType', formElement, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
lotOccupantTypes = responseJSON.lotOccupantTypes; lotOccupantTypes = responseJSON.lotOccupantTypes;
renderLotOccupantTypes(); renderLotOccupantTypes();
formElement.reset(); formElement.reset();
formElement.querySelector("input").focus(); formElement.querySelector('input').focus();
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: `Error Adding ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, title: `Error Adding ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });

View File

@ -9,8 +9,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
const inputElement = changeEvent.currentTarget; const inputElement = changeEvent.currentTarget;
const fontAwesomeIconClass = inputElement.value; const fontAwesomeIconClass = inputElement.value;
inputElement inputElement
.closest(".field") .closest('.field')
.querySelectorAll(".button.is-static")[1].innerHTML = `<i class="fas fa-fw fa-${fontAwesomeIconClass}" aria-hidden="true"></i>`; .querySelectorAll('.button.is-static')[1].innerHTML = `<i class="fas fa-fw fa-${fontAwesomeIconClass}" aria-hidden="true"></i>`;
} }
//=include adminTablesWorkOrderTypes.js //=include adminTablesWorkOrderTypes.js
//=include adminTablesWorkOrderMilestoneTypes.js //=include adminTablesWorkOrderMilestoneTypes.js

View File

@ -1,26 +1,26 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
import type * as globalTypes from "../../types/globalTypes"; import type * as globalTypes from '../../types/globalTypes'
(() => { ;(() => {
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars
const los = exports.los as globalTypes.LOS; const los = exports.los as globalTypes.LOS
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars
function refreshFontAwesomeIcon(changeEvent: Event) { function refreshFontAwesomeIcon(changeEvent: Event) {
const inputElement = changeEvent.currentTarget as HTMLInputElement; const inputElement = changeEvent.currentTarget as HTMLInputElement
const fontAwesomeIconClass = inputElement.value; const fontAwesomeIconClass = inputElement.value
inputElement inputElement
.closest(".field")! .closest('.field')!
.querySelectorAll( .querySelectorAll(
".button.is-static" '.button.is-static'
)[1].innerHTML = `<i class="fas fa-fw fa-${fontAwesomeIconClass}" aria-hidden="true"></i>`; )[1].innerHTML = `<i class="fas fa-fw fa-${fontAwesomeIconClass}" aria-hidden="true"></i>`
} }
//=include adminTablesWorkOrderTypes.js //=include adminTablesWorkOrderTypes.js
//=include adminTablesWorkOrderMilestoneTypes.js //=include adminTablesWorkOrderMilestoneTypes.js
//=include adminTablesLotStatuses.js //=include adminTablesLotStatuses.js
//=include adminTablesLotOccupantTypes.js //=include adminTablesLotOccupantTypes.js
})(); })()

View File

@ -5,28 +5,28 @@ let lotOccupantTypes = exports.lotOccupantTypes;
delete exports.lotOccupantTypes; delete exports.lotOccupantTypes;
const updateLotOccupantType = (submitEvent) => { const updateLotOccupantType = (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateLotOccupantType", submitEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doUpdateLotOccupantType', submitEvent.currentTarget, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
lotOccupantTypes = responseJSON.lotOccupantTypes; lotOccupantTypes = responseJSON.lotOccupantTypes;
bulmaJS.alert({ bulmaJS.alert({
message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Updated Successfully`, message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Updated Successfully`,
contextualColorName: "success" contextualColorName: 'success'
}); });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: `Error Updating ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, title: `Error Updating ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
const deleteLotOccupantType = (clickEvent) => { const deleteLotOccupantType = (clickEvent) => {
const tableRowElement = clickEvent.currentTarget.closest("tr"); const tableRowElement = clickEvent.currentTarget.closest('tr');
const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId; const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId;
const doDelete = () => { const doDelete = () => {
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteLotOccupantType", { cityssm.postJSON(los.urlPrefix + '/admin/doDeleteLotOccupantType', {
lotOccupantTypeId lotOccupantTypeId
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
@ -39,14 +39,14 @@ const deleteLotOccupantType = (clickEvent) => {
} }
bulmaJS.alert({ bulmaJS.alert({
message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Deleted Successfully`, message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Deleted Successfully`,
contextualColorName: "success" contextualColorName: 'success'
}); });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: `Error Deleting ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, title: `Error Deleting ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
@ -56,7 +56,7 @@ const deleteLotOccupantType = (clickEvent) => {
message: `Are you sure you want to delete this ${los.escapedAliases.lot} ${los.escapedAliases.occupant} type?<br /> message: `Are you sure you want to delete this ${los.escapedAliases.lot} ${los.escapedAliases.occupant} type?<br />
Note that no ${los.escapedAliases.lot} ${los.escapedAliases.occupants} will be removed.`, Note that no ${los.escapedAliases.lot} ${los.escapedAliases.occupants} will be removed.`,
messageIsHtml: true, messageIsHtml: true,
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: `Yes, Delete ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, text: `Yes, Delete ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
callbackFunction: doDelete callbackFunction: doDelete
@ -65,15 +65,13 @@ const deleteLotOccupantType = (clickEvent) => {
}; };
const moveLotOccupantType = (clickEvent) => { const moveLotOccupantType = (clickEvent) => {
const buttonElement = clickEvent.currentTarget; const buttonElement = clickEvent.currentTarget;
const tableRowElement = buttonElement.closest("tr"); const tableRowElement = buttonElement.closest('tr');
const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId; const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId;
cityssm.postJSON(los.urlPrefix + cityssm.postJSON(los.urlPrefix +
"/admin/" + '/admin/' +
(buttonElement.dataset.direction === "up" (buttonElement.dataset.direction === 'up' ? 'doMoveLotOccupantTypeUp' : 'doMoveLotOccupantTypeDown'), {
? "doMoveLotOccupantTypeUp"
: "doMoveLotOccupantTypeDown"), {
lotOccupantTypeId, lotOccupantTypeId,
moveToEnd: clickEvent.shiftKey ? "1" : "0" moveToEnd: clickEvent.shiftKey ? '1' : '0'
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
lotOccupantTypes = responseJSON.lotOccupantTypes; lotOccupantTypes = responseJSON.lotOccupantTypes;
@ -82,40 +80,40 @@ const moveLotOccupantType = (clickEvent) => {
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: `Error Moving ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, title: `Error Moving ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
const renderLotOccupantTypes = () => { const renderLotOccupantTypes = () => {
const containerElement = document.querySelector("#container--lotOccupantTypes"); const containerElement = document.querySelector('#container--lotOccupantTypes');
if (lotOccupantTypes.length === 0) { if (lotOccupantTypes.length === 0) {
containerElement.innerHTML = `<tr><td colspan="3"> containerElement.innerHTML = `<tr><td colspan="3">
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} ${los.escapedAliases.occupant} types.</p></div> <div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} ${los.escapedAliases.occupant} types.</p></div>
</td></tr>`; </td></tr>`;
return; return;
} }
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 = lotOccupantType.lotOccupantTypeId.toString();
const formId = "form--lotOccupantType-" + lotOccupantType.lotOccupantTypeId; const formId = 'form--lotOccupantType-' + lotOccupantType.lotOccupantTypeId;
tableRowElement.innerHTML = tableRowElement.innerHTML =
"<td>" + '<td>' +
('<div class="field">' + ('<div class="field">' +
'<div class="control">' + '<div class="control">' +
'<input class="input" name="lotOccupantType" type="text"' + '<input class="input" name="lotOccupantType" type="text"' +
(' value="' + cityssm.escapeHTML(lotOccupantType.lotOccupantType) + '"') + (' value="' + cityssm.escapeHTML(lotOccupantType.lotOccupantType) + '"') +
(' form="' + formId + '"') + (' form="' + formId + '"') +
(' aria-label="' + (' aria-label="' +
cityssm.escapeHTML(exports.aliases.lot + " " + exports.aliases.occupant) + cityssm.escapeHTML(exports.aliases.lot + ' ' + exports.aliases.occupant) +
' Type"') + ' Type"') +
' maxlength="100" required />' + ' maxlength="100" required />' +
"</div>" + '</div>' +
"</div>") + '</div>') +
"</td>" + '</td>' +
"<td>" + '<td>' +
('<div class="field has-addons">' + ('<div class="field has-addons">' +
'<div class="control"><span class="button is-static">fa-</span></div>' + '<div class="control"><span class="button is-static">fa-</span></div>' +
'<div class="control">' + '<div class="control">' +
@ -125,70 +123,70 @@ const renderLotOccupantTypes = () => {
' list="datalist--fontAwesomeIconClass"' + ' list="datalist--fontAwesomeIconClass"' +
' aria-label="Icon Name"' + ' aria-label="Icon Name"' +
' maxlength="50" />' + ' maxlength="50" />' +
"</div>" + '</div>' +
'<div class="control"><span class="button is-static">' + '<div class="control"><span class="button is-static">' +
'<i class="fas fa-fw fa-' + '<i class="fas fa-fw fa-' +
cityssm.escapeHTML(lotOccupantType.fontAwesomeIconClass) + cityssm.escapeHTML(lotOccupantType.fontAwesomeIconClass) +
'"></i></span></div>' + '"></i></span></div>' +
"</div>") + '</div>') +
"</td>" + '</td>' +
("<td>" + ('<td>' +
('<form id="' + formId + '">') + ('<form id="' + formId + '">') +
'<input name="lotOccupantTypeId" type="hidden"' + '<input name="lotOccupantTypeId" type="hidden"' +
(' value="' + lotOccupantType.lotOccupantTypeId.toString() + '"') + (' value="' + lotOccupantType.lotOccupantTypeId.toString() + '"') +
" />" + ' />' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' + '<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
"</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">' +
los.getMoveUpDownButtonFieldHTML("button--moveLotOccupantTypeUp", "button--moveLotOccupantTypeDown", false) + los.getMoveUpDownButtonFieldHTML('button--moveLotOccupantTypeUp', 'button--moveLotOccupantTypeDown', false) +
"</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 ' + ' data-tooltip="Delete ' +
los.escapedAliases.Lot + los.escapedAliases.Lot +
" " + ' ' +
los.escapedAliases.Occupant + los.escapedAliases.Occupant +
' Type" type="button"' + ' Type" type="button"' +
' aria-label="Delete ' + ' aria-label="Delete ' +
los.escapedAliases.Lot + los.escapedAliases.Lot +
" " + ' ' +
los.escapedAliases.Occupant + los.escapedAliases.Occupant +
' Type">' + ' 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>';
const fontAwesomeInputElement = tableRowElement.querySelector("input[name='fontAwesomeIconClass']"); const fontAwesomeInputElement = tableRowElement.querySelector("input[name='fontAwesomeIconClass']");
fontAwesomeInputElement.addEventListener("keyup", refreshFontAwesomeIcon); fontAwesomeInputElement.addEventListener('keyup', refreshFontAwesomeIcon);
fontAwesomeInputElement.addEventListener("change", refreshFontAwesomeIcon); fontAwesomeInputElement.addEventListener('change', refreshFontAwesomeIcon);
tableRowElement.querySelector("form").addEventListener("submit", updateLotOccupantType); tableRowElement.querySelector('form').addEventListener('submit', updateLotOccupantType);
tableRowElement.querySelector(".button--moveLotOccupantTypeUp").addEventListener("click", moveLotOccupantType); tableRowElement.querySelector('.button--moveLotOccupantTypeUp').addEventListener('click', moveLotOccupantType);
tableRowElement.querySelector(".button--moveLotOccupantTypeDown").addEventListener("click", moveLotOccupantType); tableRowElement.querySelector('.button--moveLotOccupantTypeDown').addEventListener('click', moveLotOccupantType);
tableRowElement tableRowElement
.querySelector(".button--deleteLotOccupantType") .querySelector('.button--deleteLotOccupantType')
.addEventListener("click", 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(los.urlPrefix + "/admin/doAddLotOccupantType", formElement, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doAddLotOccupantType', formElement, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
lotOccupantTypes = responseJSON.lotOccupantTypes; lotOccupantTypes = responseJSON.lotOccupantTypes;
renderLotOccupantTypes(); renderLotOccupantTypes();
formElement.reset(); formElement.reset();
formElement.querySelector("input").focus(); formElement.querySelector('input').focus();
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: `Error Adding ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, title: `Error Adding ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });

View File

@ -1,280 +1,277 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
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 { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
import type { BulmaJS } from "@cityssm/bulma-js/types"; import type { BulmaJS } from '@cityssm/bulma-js/types'
declare const cityssm: cityssmGlobal; declare const cityssm: cityssmGlobal
declare const bulmaJS: BulmaJS; declare const bulmaJS: BulmaJS
declare const los: globalTypes.LOS; declare const los: globalTypes.LOS
declare const refreshFontAwesomeIcon: (changeEvent: Event) => void; declare const refreshFontAwesomeIcon: (changeEvent: Event) => void
let lotOccupantTypes: recordTypes.LotOccupantType[] = exports.lotOccupantTypes; let lotOccupantTypes: recordTypes.LotOccupantType[] = exports.lotOccupantTypes
delete exports.lotOccupantTypes; delete exports.lotOccupantTypes
const updateLotOccupantType = (submitEvent: SubmitEvent) => { const updateLotOccupantType = (submitEvent: SubmitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault()
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + "/admin/doUpdateLotOccupantType", los.urlPrefix + '/admin/doUpdateLotOccupantType',
submitEvent.currentTarget, submitEvent.currentTarget,
(responseJSON: { (responseJSON: {
success: boolean; success: boolean
errorMessage?: string; errorMessage?: string
lotOccupantTypes?: recordTypes.LotOccupantType[]; lotOccupantTypes?: recordTypes.LotOccupantType[]
}) => { }) => {
if (responseJSON.success) { if (responseJSON.success) {
lotOccupantTypes = responseJSON.lotOccupantTypes!; lotOccupantTypes = responseJSON.lotOccupantTypes!
bulmaJS.alert({ bulmaJS.alert({
message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Updated Successfully`, message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Updated Successfully`,
contextualColorName: "success" contextualColorName: 'success'
}); })
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
title: `Error Updating ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, title: `Error Updating ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); })
} }
} }
); )
}; }
const deleteLotOccupantType = (clickEvent: Event) => { const deleteLotOccupantType = (clickEvent: Event) => {
const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest("tr")!; const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest('tr')!
const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId; const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId
const doDelete = () => { const doDelete = () => {
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + "/admin/doDeleteLotOccupantType", los.urlPrefix + '/admin/doDeleteLotOccupantType',
{ {
lotOccupantTypeId lotOccupantTypeId
}, },
(responseJSON: { (responseJSON: {
success: boolean; success: boolean
errorMessage?: string; errorMessage?: string
lotOccupantTypes?: recordTypes.LotOccupantType[]; lotOccupantTypes?: recordTypes.LotOccupantType[]
}) => { }) => {
if (responseJSON.success) { if (responseJSON.success) {
lotOccupantTypes = responseJSON.lotOccupantTypes!; lotOccupantTypes = responseJSON.lotOccupantTypes!
if (lotOccupantTypes.length === 0) { if (lotOccupantTypes.length === 0) {
renderLotOccupantTypes(); renderLotOccupantTypes()
} else { } else {
tableRowElement.remove(); tableRowElement.remove()
} }
bulmaJS.alert({ bulmaJS.alert({
message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Deleted Successfully`, message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Deleted Successfully`,
contextualColorName: "success" contextualColorName: 'success'
}); })
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
title: `Error Deleting ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, title: `Error Deleting ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); })
}
}
);
};
bulmaJS.confirm({
title: `Delete ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
message: `Are you sure you want to delete this ${los.escapedAliases.lot} ${los.escapedAliases.occupant} type?<br />
Note that no ${los.escapedAliases.lot} ${los.escapedAliases.occupants} will be removed.`,
messageIsHtml: true,
contextualColorName: "warning",
okButton: {
text: `Yes, Delete ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
callbackFunction: doDelete
} }
}); }
}; )
}
bulmaJS.confirm({
title: `Delete ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
message: `Are you sure you want to delete this ${los.escapedAliases.lot} ${los.escapedAliases.occupant} type?<br />
Note that no ${los.escapedAliases.lot} ${los.escapedAliases.occupants} will be removed.`,
messageIsHtml: true,
contextualColorName: 'warning',
okButton: {
text: `Yes, Delete ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
callbackFunction: doDelete
}
})
}
const moveLotOccupantType = (clickEvent: MouseEvent) => { const moveLotOccupantType = (clickEvent: MouseEvent) => {
const buttonElement = clickEvent.currentTarget as HTMLButtonElement; const buttonElement = clickEvent.currentTarget as HTMLButtonElement
const tableRowElement = buttonElement.closest("tr")!; const tableRowElement = buttonElement.closest('tr')!
const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId; const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + los.urlPrefix +
"/admin/" + '/admin/' +
(buttonElement.dataset.direction === "up" (buttonElement.dataset.direction === 'up' ? 'doMoveLotOccupantTypeUp' : 'doMoveLotOccupantTypeDown'),
? "doMoveLotOccupantTypeUp" {
: "doMoveLotOccupantTypeDown"), lotOccupantTypeId,
{ moveToEnd: clickEvent.shiftKey ? '1' : '0'
lotOccupantTypeId, },
moveToEnd: clickEvent.shiftKey ? "1" : "0" (responseJSON: {
}, success: boolean
(responseJSON: { errorMessage?: string
success: boolean; lotOccupantTypes?: recordTypes.LotOccupantType[]
errorMessage?: string; }) => {
lotOccupantTypes?: recordTypes.LotOccupantType[]; if (responseJSON.success) {
}) => { lotOccupantTypes = responseJSON.lotOccupantTypes!
if (responseJSON.success) { renderLotOccupantTypes()
lotOccupantTypes = responseJSON.lotOccupantTypes!; } else {
renderLotOccupantTypes(); bulmaJS.alert({
} else { title: `Error Moving ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
bulmaJS.alert({ message: responseJSON.errorMessage || '',
title: `Error Moving ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, contextualColorName: 'danger'
message: responseJSON.errorMessage || "", })
contextualColorName: "danger" }
}); }
} )
} }
);
};
const renderLotOccupantTypes = () => { const renderLotOccupantTypes = () => {
const containerElement = document.querySelector( const containerElement = document.querySelector('#container--lotOccupantTypes') as HTMLTableSectionElement
"#container--lotOccupantTypes"
) as HTMLTableSectionElement;
if (lotOccupantTypes.length === 0) { if (lotOccupantTypes.length === 0) {
containerElement.innerHTML = `<tr><td colspan="3"> containerElement.innerHTML = `<tr><td colspan="3">
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} ${los.escapedAliases.occupant} types.</p></div> <div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} ${los.escapedAliases.occupant} types.</p></div>
</td></tr>`; </td></tr>`
return; return
} }
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 = lotOccupantType.lotOccupantTypeId.toString()
const formId = "form--lotOccupantType-" + lotOccupantType.lotOccupantTypeId; const formId = 'form--lotOccupantType-' + lotOccupantType.lotOccupantTypeId
tableRowElement.innerHTML = tableRowElement.innerHTML =
"<td>" + '<td>' +
('<div class="field">' + ('<div class="field">' +
'<div class="control">' + '<div class="control">' +
'<input class="input" name="lotOccupantType" type="text"' + '<input class="input" name="lotOccupantType" type="text"' +
(' value="' + cityssm.escapeHTML(lotOccupantType.lotOccupantType) + '"') + (' value="' + cityssm.escapeHTML(lotOccupantType.lotOccupantType) + '"') +
(' form="' + formId + '"') + (' form="' + formId + '"') +
(' aria-label="' + (' aria-label="' +
cityssm.escapeHTML(exports.aliases.lot + " " + exports.aliases.occupant) + cityssm.escapeHTML(exports.aliases.lot + ' ' + exports.aliases.occupant) +
' Type"') + ' Type"') +
' maxlength="100" required />' + ' maxlength="100" required />' +
"</div>" + '</div>' +
"</div>") + '</div>') +
"</td>" + '</td>' +
"<td>" + '<td>' +
('<div class="field has-addons">' + ('<div class="field has-addons">' +
'<div class="control"><span class="button is-static">fa-</span></div>' + '<div class="control"><span class="button is-static">fa-</span></div>' +
'<div class="control">' + '<div class="control">' +
'<input class="input" name="fontAwesomeIconClass" type="text"' + '<input class="input" name="fontAwesomeIconClass" type="text"' +
(' value="' + cityssm.escapeHTML(lotOccupantType.fontAwesomeIconClass) + '"') + (' value="' + cityssm.escapeHTML(lotOccupantType.fontAwesomeIconClass) + '"') +
(' form="' + formId + '"') + (' form="' + formId + '"') +
' list="datalist--fontAwesomeIconClass"' + ' list="datalist--fontAwesomeIconClass"' +
' aria-label="Icon Name"' + ' aria-label="Icon Name"' +
' maxlength="50" />' + ' maxlength="50" />' +
"</div>" + '</div>' +
'<div class="control"><span class="button is-static">' + '<div class="control"><span class="button is-static">' +
'<i class="fas fa-fw fa-' + '<i class="fas fa-fw fa-' +
cityssm.escapeHTML(lotOccupantType.fontAwesomeIconClass) + cityssm.escapeHTML(lotOccupantType.fontAwesomeIconClass) +
'"></i></span></div>' + '"></i></span></div>' +
"</div>") + '</div>') +
"</td>" + '</td>' +
("<td>" + ('<td>' +
('<form id="' + formId + '">') + ('<form id="' + formId + '">') +
'<input name="lotOccupantTypeId" type="hidden"' + '<input name="lotOccupantTypeId" type="hidden"' +
(' value="' + lotOccupantType.lotOccupantTypeId.toString() + '"') + (' value="' + lotOccupantType.lotOccupantTypeId.toString() + '"') +
" />" + ' />' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' + '<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
"</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">' +
los.getMoveUpDownButtonFieldHTML( los.getMoveUpDownButtonFieldHTML(
"button--moveLotOccupantTypeUp", 'button--moveLotOccupantTypeUp',
"button--moveLotOccupantTypeDown", 'button--moveLotOccupantTypeDown',
false false
) + ) +
"</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 ' + ' data-tooltip="Delete ' +
los.escapedAliases.Lot + los.escapedAliases.Lot +
" " + ' ' +
los.escapedAliases.Occupant + los.escapedAliases.Occupant +
' Type" type="button"' + ' Type" type="button"' +
' aria-label="Delete ' + ' aria-label="Delete ' +
los.escapedAliases.Lot + los.escapedAliases.Lot +
" " + ' ' +
los.escapedAliases.Occupant + los.escapedAliases.Occupant +
' Type">' + ' 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>'
const fontAwesomeInputElement = tableRowElement.querySelector("input[name='fontAwesomeIconClass']")!; const fontAwesomeInputElement = tableRowElement.querySelector("input[name='fontAwesomeIconClass']")!
fontAwesomeInputElement.addEventListener("keyup", refreshFontAwesomeIcon); fontAwesomeInputElement.addEventListener('keyup', refreshFontAwesomeIcon)
fontAwesomeInputElement.addEventListener("change", refreshFontAwesomeIcon); fontAwesomeInputElement.addEventListener('change', refreshFontAwesomeIcon)
tableRowElement.querySelector("form")!.addEventListener("submit", updateLotOccupantType); tableRowElement.querySelector('form')!.addEventListener('submit', updateLotOccupantType)
( ;(tableRowElement.querySelector('.button--moveLotOccupantTypeUp') as HTMLButtonElement).addEventListener(
tableRowElement.querySelector(".button--moveLotOccupantTypeUp") as HTMLButtonElement 'click',
).addEventListener("click", moveLotOccupantType); moveLotOccupantType
)
( ;(
tableRowElement.querySelector(".button--moveLotOccupantTypeDown") as HTMLButtonElement tableRowElement.querySelector('.button--moveLotOccupantTypeDown') as HTMLButtonElement
).addEventListener("click", moveLotOccupantType); ).addEventListener('click', moveLotOccupantType)
tableRowElement tableRowElement
.querySelector(".button--deleteLotOccupantType")! .querySelector('.button--deleteLotOccupantType')!
.addEventListener("click", deleteLotOccupantType); .addEventListener('click', deleteLotOccupantType)
containerElement.append(tableRowElement); containerElement.append(tableRowElement)
} }
}; }
(document.querySelector("#form--addLotOccupantType") as HTMLFormElement).addEventListener( ;(document.querySelector('#form--addLotOccupantType') as HTMLFormElement).addEventListener(
"submit", 'submit',
(submitEvent: SubmitEvent) => { (submitEvent: SubmitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault()
const formElement = submitEvent.currentTarget as HTMLFormElement; const formElement = submitEvent.currentTarget as HTMLFormElement
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + "/admin/doAddLotOccupantType", los.urlPrefix + '/admin/doAddLotOccupantType',
formElement, formElement,
(responseJSON: { (responseJSON: {
success: boolean; success: boolean
errorMessage?: string; errorMessage?: string
lotOccupantTypes?: recordTypes.LotOccupantType[]; lotOccupantTypes?: recordTypes.LotOccupantType[]
}) => { }) => {
if (responseJSON.success) { if (responseJSON.success) {
lotOccupantTypes = responseJSON.lotOccupantTypes!; lotOccupantTypes = responseJSON.lotOccupantTypes!
renderLotOccupantTypes(); renderLotOccupantTypes()
formElement.reset(); formElement.reset()
formElement.querySelector("input")!.focus(); formElement.querySelector('input')!.focus()
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
title: `Error Adding ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, title: `Error Adding ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); })
} }
} }
); )
} }
); )
renderLotOccupantTypes(); renderLotOccupantTypes()

View File

@ -5,28 +5,28 @@ let lotStatuses = exports.lotStatuses;
delete exports.lotStatuses; delete exports.lotStatuses;
const updateLotStatus = (submitEvent) => { const updateLotStatus = (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateLotStatus", submitEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doUpdateLotStatus', submitEvent.currentTarget, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
lotStatuses = responseJSON.lotStatuses; lotStatuses = responseJSON.lotStatuses;
bulmaJS.alert({ bulmaJS.alert({
message: los.escapedAliases.Lot + " Status Updated Successfully", message: los.escapedAliases.Lot + ' Status Updated Successfully',
contextualColorName: "success" contextualColorName: 'success'
}); });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Updating " + los.escapedAliases.Lot + " Status", title: 'Error Updating ' + los.escapedAliases.Lot + ' Status',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
const deleteLotStatus = (clickEvent) => { const deleteLotStatus = (clickEvent) => {
const tableRowElement = clickEvent.currentTarget.closest("tr"); const tableRowElement = clickEvent.currentTarget.closest('tr');
const lotStatusId = tableRowElement.dataset.lotStatusId; const lotStatusId = tableRowElement.dataset.lotStatusId;
const doDelete = () => { const doDelete = () => {
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteLotStatus", { cityssm.postJSON(los.urlPrefix + '/admin/doDeleteLotStatus', {
lotStatusId lotStatusId
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
@ -38,15 +38,15 @@ const deleteLotStatus = (clickEvent) => {
tableRowElement.remove(); tableRowElement.remove();
} }
bulmaJS.alert({ bulmaJS.alert({
message: los.escapedAliases.Lot + " Status Deleted Successfully", message: los.escapedAliases.Lot + ' Status Deleted Successfully',
contextualColorName: "success" contextualColorName: 'success'
}); });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Deleting " + los.escapedAliases.Lot + " Status", title: 'Error Deleting ' + los.escapedAliases.Lot + ' Status',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
@ -56,22 +56,22 @@ const deleteLotStatus = (clickEvent) => {
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 ${los.escapedAliases.lot} will be removed.`, Note that no ${los.escapedAliases.lot} will be removed.`,
messageIsHtml: true, messageIsHtml: true,
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: "Yes, Delete Status", text: 'Yes, Delete Status',
callbackFunction: doDelete callbackFunction: doDelete
} }
}); });
}; };
const moveLotStatus = (clickEvent) => { const moveLotStatus = (clickEvent) => {
const buttonElement = clickEvent.currentTarget; const buttonElement = clickEvent.currentTarget;
const tableRowElement = buttonElement.closest("tr"); const tableRowElement = buttonElement.closest('tr');
const lotStatusId = tableRowElement.dataset.lotStatusId; const lotStatusId = tableRowElement.dataset.lotStatusId;
cityssm.postJSON(los.urlPrefix + cityssm.postJSON(los.urlPrefix +
"/admin/" + '/admin/' +
(buttonElement.dataset.direction === "up" ? "doMoveLotStatusUp" : "doMoveLotStatusDown"), { (buttonElement.dataset.direction === 'up' ? 'doMoveLotStatusUp' : 'doMoveLotStatusDown'), {
lotStatusId, lotStatusId,
moveToEnd: clickEvent.shiftKey ? "1" : "0" moveToEnd: clickEvent.shiftKey ? '1' : '0'
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
lotStatuses = responseJSON.lotStatuses; lotStatuses = responseJSON.lotStatuses;
@ -79,28 +79,28 @@ const moveLotStatus = (clickEvent) => {
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Moving " + exports.aliases.lot + " Status", title: 'Error Moving ' + exports.aliases.lot + ' Status',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
const renderLotStatuses = () => { const renderLotStatuses = () => {
const containerElement = document.querySelector("#container--lotStatuses"); const containerElement = document.querySelector('#container--lotStatuses');
if (lotStatuses.length === 0) { if (lotStatuses.length === 0) {
containerElement.innerHTML = `<tr><td colspan="2"> containerElement.innerHTML = `<tr><td colspan="2">
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} statuses.</p></div> <div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} statuses.</p></div>
</td></tr>`; </td></tr>`;
return; return;
} }
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 = lotStatus.lotStatusId.toString();
tableRowElement.innerHTML = tableRowElement.innerHTML =
"<td>" + '<td>' +
"<form>" + '<form>' +
'<input name="lotStatusId" type="hidden" value="' + '<input name="lotStatusId" type="hidden" value="' +
lotStatus.lotStatusId.toString() + lotStatus.lotStatusId.toString() +
'" />' + '" />' +
@ -110,47 +110,47 @@ const renderLotStatuses = () => {
(' value="' + cityssm.escapeHTML(lotStatus.lotStatus) + '"') + (' value="' + cityssm.escapeHTML(lotStatus.lotStatus) + '"') +
(' aria-label="' + cityssm.escapeHTML(exports.aliases.lot) + ' Status"') + (' aria-label="' + cityssm.escapeHTML(exports.aliases.lot) + ' Status"') +
' maxlength="100" required />' + ' maxlength="100" required />' +
"</div>" + '</div>' +
'<div class="control">' + '<div class="control">' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' + '<button class="button is-success" type="submit" aria-label="Save"><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">' +
los.getMoveUpDownButtonFieldHTML("button--moveLotStatusUp", "button--moveLotStatusDown", false) + los.getMoveUpDownButtonFieldHTML('button--moveLotStatusUp', 'button--moveLotStatusDown', false) +
"</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.querySelector('form').addEventListener('submit', updateLotStatus);
tableRowElement.querySelector(".button--moveLotStatusUp").addEventListener("click", moveLotStatus); tableRowElement.querySelector('.button--moveLotStatusUp').addEventListener('click', moveLotStatus);
tableRowElement.querySelector(".button--moveLotStatusDown").addEventListener("click", moveLotStatus); tableRowElement.querySelector('.button--moveLotStatusDown').addEventListener('click', moveLotStatus);
tableRowElement.querySelector(".button--deleteLotStatus").addEventListener("click", deleteLotStatus); 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(los.urlPrefix + "/admin/doAddLotStatus", formElement, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doAddLotStatus', formElement, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
lotStatuses = responseJSON.lotStatuses; lotStatuses = responseJSON.lotStatuses;
renderLotStatuses(); renderLotStatuses();
formElement.reset(); formElement.reset();
formElement.querySelector("input").focus(); formElement.querySelector('input').focus();
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: `Error Adding ${los.escapedAliases.Lot} Status`, title: `Error Adding ${los.escapedAliases.Lot} Status`,
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });

View File

@ -1,234 +1,218 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
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 { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
import type { BulmaJS } from "@cityssm/bulma-js/types"; import type { BulmaJS } from '@cityssm/bulma-js/types'
declare const cityssm: cityssmGlobal; declare const cityssm: cityssmGlobal
declare const bulmaJS: BulmaJS; declare const bulmaJS: BulmaJS
declare const los: globalTypes.LOS; declare const los: globalTypes.LOS
let lotStatuses: recordTypes.LotStatus[] = exports.lotStatuses; let lotStatuses: recordTypes.LotStatus[] = exports.lotStatuses
delete exports.lotStatuses; delete exports.lotStatuses
const updateLotStatus = (submitEvent: SubmitEvent) => { const updateLotStatus = (submitEvent: SubmitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault()
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + "/admin/doUpdateLotStatus", los.urlPrefix + '/admin/doUpdateLotStatus',
submitEvent.currentTarget, submitEvent.currentTarget,
(responseJSON: { (responseJSON: { success: boolean; errorMessage?: string; lotStatuses?: recordTypes.LotStatus[] }) => {
success: boolean; if (responseJSON.success) {
errorMessage?: string; lotStatuses = responseJSON.lotStatuses!
lotStatuses?: recordTypes.LotStatus[];
}) => {
if (responseJSON.success) {
lotStatuses = responseJSON.lotStatuses!;
bulmaJS.alert({ bulmaJS.alert({
message: los.escapedAliases.Lot + " Status Updated Successfully", message: los.escapedAliases.Lot + ' Status Updated Successfully',
contextualColorName: "success" contextualColorName: 'success'
}); })
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Updating " + los.escapedAliases.Lot + " Status", title: 'Error Updating ' + los.escapedAliases.Lot + ' Status',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); })
} }
} }
); )
}; }
const deleteLotStatus = (clickEvent: Event) => { const deleteLotStatus = (clickEvent: Event) => {
const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest("tr")!; const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest('tr')!
const lotStatusId = tableRowElement.dataset.lotStatusId; const lotStatusId = tableRowElement.dataset.lotStatusId
const doDelete = () => { const doDelete = () => {
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + "/admin/doDeleteLotStatus", los.urlPrefix + '/admin/doDeleteLotStatus',
{ {
lotStatusId lotStatusId
}, },
(responseJSON: { (responseJSON: { success: boolean; errorMessage?: string; lotStatuses?: recordTypes.LotStatus[] }) => {
success: boolean; if (responseJSON.success) {
errorMessage?: string; lotStatuses = responseJSON.lotStatuses!
lotStatuses?: recordTypes.LotStatus[];
}) => {
if (responseJSON.success) {
lotStatuses = responseJSON.lotStatuses!;
if (lotStatuses.length === 0) { if (lotStatuses.length === 0) {
renderLotStatuses(); renderLotStatuses()
} else { } else {
tableRowElement.remove(); tableRowElement.remove()
} }
bulmaJS.alert({ bulmaJS.alert({
message: los.escapedAliases.Lot + " Status Deleted Successfully", message: los.escapedAliases.Lot + ' Status Deleted Successfully',
contextualColorName: "success" contextualColorName: 'success'
}); })
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Deleting " + los.escapedAliases.Lot + " Status", title: 'Error Deleting ' + los.escapedAliases.Lot + ' Status',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); })
}
}
);
};
bulmaJS.confirm({
title: `Delete ${los.escapedAliases.Lot} Status`,
message: `Are you sure you want to delete this status?<br />
Note that no ${los.escapedAliases.lot} will be removed.`,
messageIsHtml: true,
contextualColorName: "warning",
okButton: {
text: "Yes, Delete Status",
callbackFunction: doDelete
} }
}); }
}; )
}
bulmaJS.confirm({
title: `Delete ${los.escapedAliases.Lot} Status`,
message: `Are you sure you want to delete this status?<br />
Note that no ${los.escapedAliases.lot} will be removed.`,
messageIsHtml: true,
contextualColorName: 'warning',
okButton: {
text: 'Yes, Delete Status',
callbackFunction: doDelete
}
})
}
const moveLotStatus = (clickEvent: MouseEvent) => { const moveLotStatus = (clickEvent: MouseEvent) => {
const buttonElement = clickEvent.currentTarget as HTMLButtonElement; const buttonElement = clickEvent.currentTarget as HTMLButtonElement
const tableRowElement = buttonElement.closest("tr")!; const tableRowElement = buttonElement.closest('tr')!
const lotStatusId = tableRowElement.dataset.lotStatusId; const lotStatusId = tableRowElement.dataset.lotStatusId
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + los.urlPrefix +
"/admin/" + '/admin/' +
(buttonElement.dataset.direction === "up" ? "doMoveLotStatusUp" : "doMoveLotStatusDown"), (buttonElement.dataset.direction === 'up' ? 'doMoveLotStatusUp' : 'doMoveLotStatusDown'),
{ {
lotStatusId, lotStatusId,
moveToEnd: clickEvent.shiftKey ? "1" : "0" moveToEnd: clickEvent.shiftKey ? '1' : '0'
}, },
(responseJSON: { (responseJSON: { success: boolean; errorMessage?: string; lotStatuses?: recordTypes.LotStatus[] }) => {
success: boolean; if (responseJSON.success) {
errorMessage?: string; lotStatuses = responseJSON.lotStatuses!
lotStatuses?: recordTypes.LotStatus[]; renderLotStatuses()
}) => { } else {
if (responseJSON.success) { bulmaJS.alert({
lotStatuses = responseJSON.lotStatuses!; title: 'Error Moving ' + exports.aliases.lot + ' Status',
renderLotStatuses(); message: responseJSON.errorMessage || '',
} else { contextualColorName: 'danger'
bulmaJS.alert({ })
title: "Error Moving " + exports.aliases.lot + " Status", }
message: responseJSON.errorMessage || "", }
contextualColorName: "danger" )
}); }
}
}
);
};
const renderLotStatuses = () => { const renderLotStatuses = () => {
const containerElement = document.querySelector("#container--lotStatuses") as HTMLTableSectionElement; const containerElement = document.querySelector('#container--lotStatuses') as HTMLTableSectionElement
if (lotStatuses.length === 0) { if (lotStatuses.length === 0) {
containerElement.innerHTML = `<tr><td colspan="2"> containerElement.innerHTML = `<tr><td colspan="2">
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} statuses.</p></div> <div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} statuses.</p></div>
</td></tr>`; </td></tr>`
return; return
} }
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 = lotStatus.lotStatusId.toString()
tableRowElement.innerHTML = tableRowElement.innerHTML =
"<td>" + '<td>' +
"<form>" + '<form>' +
'<input name="lotStatusId" type="hidden" value="' + '<input name="lotStatusId" type="hidden" value="' +
lotStatus.lotStatusId.toString() + lotStatus.lotStatusId.toString() +
'" />' + '" />' +
('<div class="field has-addons">' + ('<div class="field has-addons">' +
'<div class="control">' + '<div class="control">' +
'<input class="input" name="lotStatus" type="text"' + '<input class="input" name="lotStatus" type="text"' +
(' value="' + cityssm.escapeHTML(lotStatus.lotStatus) + '"') + (' value="' + cityssm.escapeHTML(lotStatus.lotStatus) + '"') +
(' aria-label="' + cityssm.escapeHTML(exports.aliases.lot) + ' Status"') + (' aria-label="' + cityssm.escapeHTML(exports.aliases.lot) + ' Status"') +
' maxlength="100" required />' + ' maxlength="100" required />' +
"</div>" + '</div>' +
'<div class="control">' + '<div class="control">' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' + '<button class="button is-success" type="submit" aria-label="Save"><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">' +
los.getMoveUpDownButtonFieldHTML("button--moveLotStatusUp", "button--moveLotStatusDown", false) + los.getMoveUpDownButtonFieldHTML('button--moveLotStatusUp', 'button--moveLotStatusDown', false) +
"</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.querySelector('form')!.addEventListener('submit', updateLotStatus)
(tableRowElement.querySelector(".button--moveLotStatusUp") as HTMLButtonElement).addEventListener( ;(tableRowElement.querySelector('.button--moveLotStatusUp') as HTMLButtonElement).addEventListener(
"click", 'click',
moveLotStatus moveLotStatus
); )
(tableRowElement.querySelector(".button--moveLotStatusDown") as HTMLButtonElement).addEventListener( ;(tableRowElement.querySelector('.button--moveLotStatusDown') as HTMLButtonElement).addEventListener(
"click", 'click',
moveLotStatus moveLotStatus
); )
tableRowElement.querySelector(".button--deleteLotStatus")!.addEventListener("click", deleteLotStatus); tableRowElement.querySelector('.button--deleteLotStatus')!.addEventListener('click', deleteLotStatus)
containerElement.append(tableRowElement); containerElement.append(tableRowElement)
} }
}; }
(document.querySelector("#form--addLotStatus") as HTMLFormElement).addEventListener( ;(document.querySelector('#form--addLotStatus') as HTMLFormElement).addEventListener(
"submit", 'submit',
(submitEvent: SubmitEvent) => { (submitEvent: SubmitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault()
const formElement = submitEvent.currentTarget as HTMLFormElement; const formElement = submitEvent.currentTarget as HTMLFormElement
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + "/admin/doAddLotStatus", los.urlPrefix + '/admin/doAddLotStatus',
formElement, formElement,
(responseJSON: { (responseJSON: { success: boolean; errorMessage?: string; lotStatuses?: recordTypes.LotStatus[] }) => {
success: boolean; if (responseJSON.success) {
errorMessage?: string; lotStatuses = responseJSON.lotStatuses!
lotStatuses?: recordTypes.LotStatus[]; renderLotStatuses()
}) => { formElement.reset()
if (responseJSON.success) { formElement.querySelector('input')!.focus()
lotStatuses = responseJSON.lotStatuses!; } else {
renderLotStatuses(); bulmaJS.alert({
formElement.reset(); title: `Error Adding ${los.escapedAliases.Lot} Status`,
formElement.querySelector("input")!.focus(); message: responseJSON.errorMessage || '',
} else { contextualColorName: 'danger'
bulmaJS.alert({ })
title: `Error Adding ${los.escapedAliases.Lot} Status`, }
message: responseJSON.errorMessage || "", }
contextualColorName: "danger" )
}); }
} )
}
);
}
);
renderLotStatuses(); renderLotStatuses()

View File

@ -5,28 +5,28 @@ let workOrderMilestoneTypes = exports.workOrderMilestoneTypes;
delete exports.workOrderMilestoneTypes; delete exports.workOrderMilestoneTypes;
const updateWorkOrderMilestoneType = (submitEvent) => { const updateWorkOrderMilestoneType = (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateWorkOrderMilestoneType", submitEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doUpdateWorkOrderMilestoneType', submitEvent.currentTarget, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes; workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes;
bulmaJS.alert({ bulmaJS.alert({
message: "Work Order Milestone Type Updated Successfully", message: 'Work Order Milestone Type Updated Successfully',
contextualColorName: "success" contextualColorName: 'success'
}); });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Updating Work Order Milestone Type", title: 'Error Updating Work Order Milestone Type',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
const deleteWorkOrderMilestoneType = (clickEvent) => { const deleteWorkOrderMilestoneType = (clickEvent) => {
const tableRowElement = clickEvent.currentTarget.closest("tr"); const tableRowElement = clickEvent.currentTarget.closest('tr');
const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId; const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId;
const doDelete = () => { const doDelete = () => {
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteWorkOrderMilestoneType", { cityssm.postJSON(los.urlPrefix + '/admin/doDeleteWorkOrderMilestoneType', {
workOrderMilestoneTypeId workOrderMilestoneTypeId
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
@ -38,42 +38,42 @@ const deleteWorkOrderMilestoneType = (clickEvent) => {
tableRowElement.remove(); tableRowElement.remove();
} }
bulmaJS.alert({ bulmaJS.alert({
message: "Work Order Milestone Type Deleted Successfully", message: 'Work Order Milestone Type Deleted Successfully',
contextualColorName: "success" contextualColorName: 'success'
}); });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Deleting Work Order Milestone Type", title: 'Error Deleting Work Order Milestone Type',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
bulmaJS.confirm({ bulmaJS.confirm({
title: "Delete Work Order Milestone Type", title: 'Delete Work Order Milestone Type',
message: `Are you sure you want to delete this work order milestone type?<br /> message: `Are you sure you want to delete this work order milestone type?<br />
Note that no work orders will be removed.`, Note that no work orders will be removed.`,
messageIsHtml: true, messageIsHtml: true,
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: "Yes, Delete Work Order Milestone Type", text: 'Yes, Delete Work Order Milestone Type',
callbackFunction: doDelete callbackFunction: doDelete
} }
}); });
}; };
const moveWorkOrderMilestoneType = (clickEvent) => { const moveWorkOrderMilestoneType = (clickEvent) => {
const buttonElement = clickEvent.currentTarget; const buttonElement = clickEvent.currentTarget;
const tableRowElement = buttonElement.closest("tr"); const tableRowElement = buttonElement.closest('tr');
const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId; const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId;
cityssm.postJSON(los.urlPrefix + cityssm.postJSON(los.urlPrefix +
"/admin/" + '/admin/' +
(buttonElement.dataset.direction === "up" (buttonElement.dataset.direction === 'up'
? "doMoveWorkOrderMilestoneTypeUp" ? 'doMoveWorkOrderMilestoneTypeUp'
: "doMoveWorkOrderMilestoneTypeDown"), { : 'doMoveWorkOrderMilestoneTypeDown'), {
workOrderMilestoneTypeId, workOrderMilestoneTypeId,
moveToEnd: clickEvent.shiftKey ? "1" : "0" moveToEnd: clickEvent.shiftKey ? '1' : '0'
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes; workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes;
@ -81,29 +81,29 @@ const moveWorkOrderMilestoneType = (clickEvent) => {
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Moving Work Order Milestone Type", title: 'Error Moving Work Order Milestone Type',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
const renderWorkOrderMilestoneTypes = () => { const renderWorkOrderMilestoneTypes = () => {
const containerElement = document.querySelector("#container--workOrderMilestoneTypes"); const containerElement = document.querySelector('#container--workOrderMilestoneTypes');
if (workOrderMilestoneTypes.length === 0) { if (workOrderMilestoneTypes.length === 0) {
containerElement.innerHTML = `<tr><td colspan="2"> containerElement.innerHTML = `<tr><td colspan="2">
<div class="message is-warning"><p class="message-body">There are no active work order milestone types.</p></div> <div class="message is-warning"><p class="message-body">There are no active work order milestone types.</p></div>
</td></tr>`; </td></tr>`;
return; return;
} }
containerElement.innerHTML = ""; containerElement.innerHTML = '';
for (const workOrderMilestoneType of workOrderMilestoneTypes) { for (const workOrderMilestoneType of workOrderMilestoneTypes) {
const tableRowElement = document.createElement("tr"); const tableRowElement = document.createElement('tr');
tableRowElement.dataset.workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId =
workOrderMilestoneType.workOrderMilestoneTypeId.toString(); workOrderMilestoneType.workOrderMilestoneTypeId.toString();
tableRowElement.innerHTML = tableRowElement.innerHTML =
"<td>" + '<td>' +
"<form>" + '<form>' +
'<input name="workOrderMilestoneTypeId" type="hidden" value="' + '<input name="workOrderMilestoneTypeId" type="hidden" value="' +
workOrderMilestoneType.workOrderMilestoneTypeId.toString() + workOrderMilestoneType.workOrderMilestoneTypeId.toString() +
'" />' + '" />' +
@ -112,49 +112,49 @@ const renderWorkOrderMilestoneTypes = () => {
'<input class="input" name="workOrderMilestoneType" type="text" value="' + '<input class="input" name="workOrderMilestoneType" type="text" value="' +
cityssm.escapeHTML(workOrderMilestoneType.workOrderMilestoneType) + cityssm.escapeHTML(workOrderMilestoneType.workOrderMilestoneType) +
'" maxlength="100" aria-label="Work Order Milestone Type" required />' + '" maxlength="100" aria-label="Work Order Milestone Type" required />' +
"</div>" + '</div>' +
'<div class="control">' + '<div class="control">' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' + '<button class="button is-success" type="submit" aria-label="Save"><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">' +
los.getMoveUpDownButtonFieldHTML("button--moveWorkOrderMilestoneTypeUp", "button--moveWorkOrderMilestoneTypeDown", false) + los.getMoveUpDownButtonFieldHTML('button--moveWorkOrderMilestoneTypeUp', 'button--moveWorkOrderMilestoneTypeDown', false) +
"</div>" + '</div>' +
'<div class="control">' + '<div class="control">' +
'<button class="button is-danger is-light button--deleteWorkOrderMilestoneType" data-tooltip="Delete Mielstone Type" type="button" aria-label="Delete Milestone Type">' + '<button class="button is-danger is-light button--deleteWorkOrderMilestoneType" data-tooltip="Delete Mielstone Type" type="button" aria-label="Delete Milestone 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", updateWorkOrderMilestoneType); tableRowElement.querySelector('form').addEventListener('submit', updateWorkOrderMilestoneType);
tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeUp").addEventListener("click", moveWorkOrderMilestoneType); tableRowElement.querySelector('.button--moveWorkOrderMilestoneTypeUp').addEventListener('click', moveWorkOrderMilestoneType);
tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeDown").addEventListener("click", moveWorkOrderMilestoneType); tableRowElement.querySelector('.button--moveWorkOrderMilestoneTypeDown').addEventListener('click', moveWorkOrderMilestoneType);
tableRowElement tableRowElement
.querySelector(".button--deleteWorkOrderMilestoneType") .querySelector('.button--deleteWorkOrderMilestoneType')
.addEventListener("click", deleteWorkOrderMilestoneType); .addEventListener('click', deleteWorkOrderMilestoneType);
containerElement.append(tableRowElement); containerElement.append(tableRowElement);
} }
}; };
document.querySelector("#form--addWorkOrderMilestoneType").addEventListener("submit", (submitEvent) => { document.querySelector('#form--addWorkOrderMilestoneType').addEventListener('submit', (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
const formElement = submitEvent.currentTarget; const formElement = submitEvent.currentTarget;
cityssm.postJSON(los.urlPrefix + "/admin/doAddWorkOrderMilestoneType", formElement, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doAddWorkOrderMilestoneType', formElement, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes; workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes;
renderWorkOrderMilestoneTypes(); renderWorkOrderMilestoneTypes();
formElement.reset(); formElement.reset();
formElement.querySelector("input").focus(); formElement.querySelector('input').focus();
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Adding Work Order Milestone Type", title: 'Error Adding Work Order Milestone Type',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });

View File

@ -1,242 +1,242 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
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 { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
import type { BulmaJS } from "@cityssm/bulma-js/types"; import type { BulmaJS } from '@cityssm/bulma-js/types'
declare const cityssm: cityssmGlobal; declare const cityssm: cityssmGlobal
declare const bulmaJS: BulmaJS; declare const bulmaJS: BulmaJS
declare const los: globalTypes.LOS; declare const los: globalTypes.LOS
let workOrderMilestoneTypes: recordTypes.WorkOrderMilestoneType[] = exports.workOrderMilestoneTypes; let workOrderMilestoneTypes: recordTypes.WorkOrderMilestoneType[] = exports.workOrderMilestoneTypes
delete exports.workOrderMilestoneTypes; delete exports.workOrderMilestoneTypes
const updateWorkOrderMilestoneType = (submitEvent: SubmitEvent) => { const updateWorkOrderMilestoneType = (submitEvent: SubmitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault()
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + "/admin/doUpdateWorkOrderMilestoneType", los.urlPrefix + '/admin/doUpdateWorkOrderMilestoneType',
submitEvent.currentTarget, submitEvent.currentTarget,
(responseJSON: { (responseJSON: {
success: boolean; success: boolean
errorMessage?: string; errorMessage?: string
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]; workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]
}) => { }) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!; workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!
bulmaJS.alert({ bulmaJS.alert({
message: "Work Order Milestone Type Updated Successfully", message: 'Work Order Milestone Type Updated Successfully',
contextualColorName: "success" contextualColorName: 'success'
}); })
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Updating Work Order Milestone Type", title: 'Error Updating Work Order Milestone Type',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); })
} }
} }
); )
}; }
const deleteWorkOrderMilestoneType = (clickEvent: Event) => { const deleteWorkOrderMilestoneType = (clickEvent: Event) => {
const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest("tr")!; const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest('tr')!
const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId; const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId
const doDelete = () => { const doDelete = () => {
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + "/admin/doDeleteWorkOrderMilestoneType", los.urlPrefix + '/admin/doDeleteWorkOrderMilestoneType',
{ {
workOrderMilestoneTypeId workOrderMilestoneTypeId
}, },
(responseJSON: { (responseJSON: {
success: boolean; success: boolean
errorMessage?: string; errorMessage?: string
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]; workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]
}) => { }) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!; workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!
if (workOrderMilestoneTypes.length === 0) { if (workOrderMilestoneTypes.length === 0) {
renderWorkOrderMilestoneTypes(); renderWorkOrderMilestoneTypes()
} else { } else {
tableRowElement.remove(); tableRowElement.remove()
} }
bulmaJS.alert({ bulmaJS.alert({
message: "Work Order Milestone Type Deleted Successfully", message: 'Work Order Milestone Type Deleted Successfully',
contextualColorName: "success" contextualColorName: 'success'
}); })
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Deleting Work Order Milestone Type", title: 'Error Deleting Work Order Milestone Type',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); })
}
}
);
};
bulmaJS.confirm({
title: "Delete Work Order Milestone Type",
message: `Are you sure you want to delete this work order milestone type?<br />
Note that no work orders will be removed.`,
messageIsHtml: true,
contextualColorName: "warning",
okButton: {
text: "Yes, Delete Work Order Milestone Type",
callbackFunction: doDelete
} }
}); }
}; )
}
bulmaJS.confirm({
title: 'Delete Work Order Milestone Type',
message: `Are you sure you want to delete this work order milestone type?<br />
Note that no work orders will be removed.`,
messageIsHtml: true,
contextualColorName: 'warning',
okButton: {
text: 'Yes, Delete Work Order Milestone Type',
callbackFunction: doDelete
}
})
}
const moveWorkOrderMilestoneType = (clickEvent: MouseEvent) => { const moveWorkOrderMilestoneType = (clickEvent: MouseEvent) => {
const buttonElement = clickEvent.currentTarget as HTMLButtonElement; const buttonElement = clickEvent.currentTarget as HTMLButtonElement
const tableRowElement = buttonElement.closest("tr")!; const tableRowElement = buttonElement.closest('tr')!
const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId; const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + los.urlPrefix +
"/admin/" + '/admin/' +
(buttonElement.dataset.direction === "up" (buttonElement.dataset.direction === 'up'
? "doMoveWorkOrderMilestoneTypeUp" ? 'doMoveWorkOrderMilestoneTypeUp'
: "doMoveWorkOrderMilestoneTypeDown"), : 'doMoveWorkOrderMilestoneTypeDown'),
{ {
workOrderMilestoneTypeId, workOrderMilestoneTypeId,
moveToEnd: clickEvent.shiftKey ? "1" : "0" moveToEnd: clickEvent.shiftKey ? '1' : '0'
}, },
(responseJSON: { (responseJSON: {
success: boolean; success: boolean
errorMessage?: string; errorMessage?: string
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]; workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]
}) => { }) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!; workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!
renderWorkOrderMilestoneTypes(); renderWorkOrderMilestoneTypes()
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Moving Work Order Milestone Type", title: 'Error Moving Work Order Milestone Type',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); })
} }
} }
); )
}; }
const renderWorkOrderMilestoneTypes = () => { const renderWorkOrderMilestoneTypes = () => {
const containerElement = document.querySelector( const containerElement = document.querySelector(
"#container--workOrderMilestoneTypes" '#container--workOrderMilestoneTypes'
) as HTMLTableSectionElement; ) as HTMLTableSectionElement
if (workOrderMilestoneTypes.length === 0) { if (workOrderMilestoneTypes.length === 0) {
containerElement.innerHTML = `<tr><td colspan="2"> containerElement.innerHTML = `<tr><td colspan="2">
<div class="message is-warning"><p class="message-body">There are no active work order milestone types.</p></div> <div class="message is-warning"><p class="message-body">There are no active work order milestone types.</p></div>
</td></tr>`; </td></tr>`
return; return
} }
containerElement.innerHTML = ""; containerElement.innerHTML = ''
for (const workOrderMilestoneType of workOrderMilestoneTypes) { for (const workOrderMilestoneType of workOrderMilestoneTypes) {
const tableRowElement = document.createElement("tr"); const tableRowElement = document.createElement('tr')
tableRowElement.dataset.workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId =
workOrderMilestoneType.workOrderMilestoneTypeId.toString(); workOrderMilestoneType.workOrderMilestoneTypeId.toString()
tableRowElement.innerHTML = tableRowElement.innerHTML =
"<td>" + '<td>' +
"<form>" + '<form>' +
'<input name="workOrderMilestoneTypeId" type="hidden" value="' + '<input name="workOrderMilestoneTypeId" type="hidden" value="' +
workOrderMilestoneType.workOrderMilestoneTypeId.toString() + workOrderMilestoneType.workOrderMilestoneTypeId.toString() +
'" />' + '" />' +
('<div class="field has-addons">' + ('<div class="field has-addons">' +
'<div class="control">' + '<div class="control">' +
'<input class="input" name="workOrderMilestoneType" type="text" value="' + '<input class="input" name="workOrderMilestoneType" type="text" value="' +
cityssm.escapeHTML(workOrderMilestoneType.workOrderMilestoneType) + cityssm.escapeHTML(workOrderMilestoneType.workOrderMilestoneType) +
'" maxlength="100" aria-label="Work Order Milestone Type" required />' + '" maxlength="100" aria-label="Work Order Milestone Type" required />' +
"</div>" + '</div>' +
'<div class="control">' + '<div class="control">' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' + '<button class="button is-success" type="submit" aria-label="Save"><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">' +
los.getMoveUpDownButtonFieldHTML( los.getMoveUpDownButtonFieldHTML(
"button--moveWorkOrderMilestoneTypeUp", 'button--moveWorkOrderMilestoneTypeUp',
"button--moveWorkOrderMilestoneTypeDown", 'button--moveWorkOrderMilestoneTypeDown',
false false
) + ) +
"</div>" + '</div>' +
'<div class="control">' + '<div class="control">' +
'<button class="button is-danger is-light button--deleteWorkOrderMilestoneType" data-tooltip="Delete Mielstone Type" type="button" aria-label="Delete Milestone Type">' + '<button class="button is-danger is-light button--deleteWorkOrderMilestoneType" data-tooltip="Delete Mielstone Type" type="button" aria-label="Delete Milestone 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", updateWorkOrderMilestoneType); tableRowElement.querySelector('form')!.addEventListener('submit', updateWorkOrderMilestoneType)
( ;(
tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeUp") as HTMLButtonElement tableRowElement.querySelector('.button--moveWorkOrderMilestoneTypeUp') as HTMLButtonElement
).addEventListener("click", moveWorkOrderMilestoneType); ).addEventListener('click', moveWorkOrderMilestoneType)
( ;(
tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeDown") as HTMLButtonElement tableRowElement.querySelector('.button--moveWorkOrderMilestoneTypeDown') as HTMLButtonElement
).addEventListener("click", moveWorkOrderMilestoneType); ).addEventListener('click', moveWorkOrderMilestoneType)
tableRowElement tableRowElement
.querySelector(".button--deleteWorkOrderMilestoneType")! .querySelector('.button--deleteWorkOrderMilestoneType')!
.addEventListener("click", deleteWorkOrderMilestoneType); .addEventListener('click', deleteWorkOrderMilestoneType)
containerElement.append(tableRowElement); containerElement.append(tableRowElement)
} }
}; }
(document.querySelector("#form--addWorkOrderMilestoneType") as HTMLFormElement).addEventListener( ;(document.querySelector('#form--addWorkOrderMilestoneType') as HTMLFormElement).addEventListener(
"submit", 'submit',
(submitEvent: SubmitEvent) => { (submitEvent: SubmitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault()
const formElement = submitEvent.currentTarget as HTMLFormElement; const formElement = submitEvent.currentTarget as HTMLFormElement
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + "/admin/doAddWorkOrderMilestoneType", los.urlPrefix + '/admin/doAddWorkOrderMilestoneType',
formElement, formElement,
(responseJSON: { (responseJSON: {
success: boolean; success: boolean
errorMessage?: string; errorMessage?: string
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]; workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]
}) => { }) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!; workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!
renderWorkOrderMilestoneTypes(); renderWorkOrderMilestoneTypes()
formElement.reset(); formElement.reset()
formElement.querySelector("input")!.focus(); formElement.querySelector('input')!.focus()
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Adding Work Order Milestone Type", title: 'Error Adding Work Order Milestone Type',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); })
} }
} }
); )
} }
); )
renderWorkOrderMilestoneTypes(); renderWorkOrderMilestoneTypes()

View File

@ -5,28 +5,28 @@ let workOrderTypes = exports.workOrderTypes;
delete exports.workOrderTypes; delete exports.workOrderTypes;
const updateWorkOrderType = (submitEvent) => { const updateWorkOrderType = (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateWorkOrderType", submitEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doUpdateWorkOrderType', submitEvent.currentTarget, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderTypes = responseJSON.workOrderTypes; workOrderTypes = responseJSON.workOrderTypes;
bulmaJS.alert({ bulmaJS.alert({
message: "Work Order Type Updated Successfully", message: 'Work Order Type Updated Successfully',
contextualColorName: "success" contextualColorName: 'success'
}); });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Updating Work Order Type", title: 'Error Updating Work Order Type',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
const deleteWorkOrderType = (clickEvent) => { const deleteWorkOrderType = (clickEvent) => {
const tableRowElement = clickEvent.currentTarget.closest("tr"); const tableRowElement = clickEvent.currentTarget.closest('tr');
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId; const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
const doDelete = () => { const doDelete = () => {
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteWorkOrderType", { cityssm.postJSON(los.urlPrefix + '/admin/doDeleteWorkOrderType', {
workOrderTypeId workOrderTypeId
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
@ -38,40 +38,40 @@ const deleteWorkOrderType = (clickEvent) => {
tableRowElement.remove(); tableRowElement.remove();
} }
bulmaJS.alert({ bulmaJS.alert({
message: "Work Order Type Deleted Successfully", message: 'Work Order Type Deleted Successfully',
contextualColorName: "success" contextualColorName: 'success'
}); });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Deleting Work Order Type", title: 'Error Deleting Work Order Type',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
bulmaJS.confirm({ bulmaJS.confirm({
title: "Delete Work Order Type", title: 'Delete Work Order Type',
message: `Are you sure you want to delete this work order type?<br /> message: `Are you sure you want to delete this work order type?<br />
Note that no work orders will be removed.`, Note that no work orders will be removed.`,
messageIsHtml: true, messageIsHtml: true,
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: "Yes, Delete Work Order Type", text: 'Yes, Delete Work Order Type',
callbackFunction: doDelete callbackFunction: doDelete
} }
}); });
}; };
const moveWorkOrderType = (clickEvent) => { const moveWorkOrderType = (clickEvent) => {
const buttonElement = clickEvent.currentTarget; const buttonElement = clickEvent.currentTarget;
const tableRowElement = buttonElement.closest("tr"); const tableRowElement = buttonElement.closest('tr');
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId; const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
cityssm.postJSON(los.urlPrefix + cityssm.postJSON(los.urlPrefix +
"/admin/" + '/admin/' +
(buttonElement.dataset.direction === "up" ? "doMoveWorkOrderTypeUp" : "doMoveWorkOrderTypeDown"), { (buttonElement.dataset.direction === 'up' ? 'doMoveWorkOrderTypeUp' : 'doMoveWorkOrderTypeDown'), {
workOrderTypeId, workOrderTypeId,
moveToEnd: clickEvent.shiftKey ? "1" : "0" moveToEnd: clickEvent.shiftKey ? '1' : '0'
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderTypes = responseJSON.workOrderTypes; workOrderTypes = responseJSON.workOrderTypes;
@ -79,79 +79,79 @@ const moveWorkOrderType = (clickEvent) => {
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Moving Work Order Type", title: 'Error Moving Work Order Type',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
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><td colspan="2"> containerElement.innerHTML = `<tr><td colspan="2">
<div class="message is-warning"><p class="message-body">There are no active work order types.</p></div> <div class="message is-warning"><p class="message-body">There are no active work order types.</p></div>
</td></tr>`; </td></tr>`;
return; return;
} }
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 = workOrderType.workOrderTypeId.toString();
tableRowElement.innerHTML = tableRowElement.innerHTML =
"<td>" + '<td>' +
"<form>" + '<form>' +
'<input name="workOrderTypeId" type="hidden" value="' + '<input name="workOrderTypeId" type="hidden" value="' +
workOrderType.workOrderTypeId.toString() + workOrderType.workOrderTypeId.toString() +
'" />' + '" />' +
('<div class="field has-addons">' + ('<div class="field has-addons">' +
'<div class="control">' + '<div class="control">' +
'<input class="input" name="workOrderType" type="text" value="' + '<input class="input" name="workOrderType" type="text" value="' +
cityssm.escapeHTML(workOrderType.workOrderType || "") + cityssm.escapeHTML(workOrderType.workOrderType || '') +
'" maxlength="100" aria-label="Work Order Type" required />' + '" maxlength="100" aria-label="Work Order Type" required />' +
"</div>" + '</div>' +
'<div class="control">' + '<div class="control">' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' + '<button class="button is-success" type="submit" aria-label="Save"><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">' +
los.getMoveUpDownButtonFieldHTML("button--moveWorkOrderTypeUp", "button--moveWorkOrderTypeDown", false) + los.getMoveUpDownButtonFieldHTML('button--moveWorkOrderTypeUp', 'button--moveWorkOrderTypeDown', false) +
"</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.querySelector('form').addEventListener('submit', updateWorkOrderType);
tableRowElement.querySelector(".button--moveWorkOrderTypeUp").addEventListener("click", moveWorkOrderType); tableRowElement.querySelector('.button--moveWorkOrderTypeUp').addEventListener('click', moveWorkOrderType);
tableRowElement.querySelector(".button--moveWorkOrderTypeDown").addEventListener("click", moveWorkOrderType); tableRowElement.querySelector('.button--moveWorkOrderTypeDown').addEventListener('click', moveWorkOrderType);
tableRowElement tableRowElement
.querySelector(".button--deleteWorkOrderType") .querySelector('.button--deleteWorkOrderType')
.addEventListener("click", 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(los.urlPrefix + "/admin/doAddWorkOrderType", formElement, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/admin/doAddWorkOrderType', formElement, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderTypes = responseJSON.workOrderTypes; workOrderTypes = responseJSON.workOrderTypes;
renderWorkOrderTypes(); renderWorkOrderTypes();
formElement.reset(); formElement.reset();
formElement.querySelector("input").focus(); formElement.querySelector('input').focus();
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Adding Work Order Type", title: 'Error Adding Work Order Type',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });

View File

@ -1,238 +1,239 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
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 { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
import type { BulmaJS } from "@cityssm/bulma-js/types"; import type { BulmaJS } from '@cityssm/bulma-js/types'
declare const cityssm: cityssmGlobal; declare const cityssm: cityssmGlobal
declare const bulmaJS: BulmaJS; declare const bulmaJS: BulmaJS
declare const los: globalTypes.LOS; declare const los: globalTypes.LOS
let workOrderTypes: recordTypes.WorkOrderType[] = exports.workOrderTypes; let workOrderTypes: recordTypes.WorkOrderType[] = exports.workOrderTypes
delete exports.workOrderTypes; delete exports.workOrderTypes
const updateWorkOrderType = (submitEvent: SubmitEvent) => { const updateWorkOrderType = (submitEvent: SubmitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault()
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + "/admin/doUpdateWorkOrderType", los.urlPrefix + '/admin/doUpdateWorkOrderType',
submitEvent.currentTarget, submitEvent.currentTarget,
(responseJSON: { (responseJSON: {
success: boolean; success: boolean
errorMessage?: string; errorMessage?: string
workOrderTypes?: recordTypes.WorkOrderType[]; workOrderTypes?: recordTypes.WorkOrderType[]
}) => { }) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderTypes = responseJSON.workOrderTypes!; workOrderTypes = responseJSON.workOrderTypes!
bulmaJS.alert({ bulmaJS.alert({
message: "Work Order Type Updated Successfully", message: 'Work Order Type Updated Successfully',
contextualColorName: "success" contextualColorName: 'success'
}); })
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Updating Work Order Type", title: 'Error Updating Work Order Type',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); })
} }
} }
); )
}; }
const deleteWorkOrderType = (clickEvent: Event) => { const deleteWorkOrderType = (clickEvent: Event) => {
const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest("tr")!; const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest('tr')!
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId; const workOrderTypeId = tableRowElement.dataset.workOrderTypeId
const doDelete = () => { const doDelete = () => {
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + "/admin/doDeleteWorkOrderType", los.urlPrefix + '/admin/doDeleteWorkOrderType',
{ {
workOrderTypeId workOrderTypeId
}, },
(responseJSON: { (responseJSON: {
success: boolean; success: boolean
errorMessage?: string; errorMessage?: string
workOrderTypes?: recordTypes.WorkOrderType[]; workOrderTypes?: recordTypes.WorkOrderType[]
}) => { }) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderTypes = responseJSON.workOrderTypes!; workOrderTypes = responseJSON.workOrderTypes!
if (workOrderTypes.length === 0) { if (workOrderTypes.length === 0) {
renderWorkOrderTypes(); renderWorkOrderTypes()
} else { } else {
tableRowElement.remove(); tableRowElement.remove()
} }
bulmaJS.alert({ bulmaJS.alert({
message: "Work Order Type Deleted Successfully", message: 'Work Order Type Deleted Successfully',
contextualColorName: "success" contextualColorName: 'success'
}); })
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Deleting Work Order Type", title: 'Error Deleting Work Order Type',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); })
}
}
);
};
bulmaJS.confirm({
title: "Delete Work Order Type",
message: `Are you sure you want to delete this work order type?<br />
Note that no work orders will be removed.`,
messageIsHtml: true,
contextualColorName: "warning",
okButton: {
text: "Yes, Delete Work Order Type",
callbackFunction: doDelete
} }
}); }
}; )
}
bulmaJS.confirm({
title: 'Delete Work Order Type',
message: `Are you sure you want to delete this work order type?<br />
Note that no work orders will be removed.`,
messageIsHtml: true,
contextualColorName: 'warning',
okButton: {
text: 'Yes, Delete Work Order Type',
callbackFunction: doDelete
}
})
}
const moveWorkOrderType = (clickEvent: MouseEvent) => { const moveWorkOrderType = (clickEvent: MouseEvent) => {
const buttonElement = clickEvent.currentTarget as HTMLButtonElement; const buttonElement = clickEvent.currentTarget as HTMLButtonElement
const tableRowElement = buttonElement.closest("tr")!; const tableRowElement = buttonElement.closest('tr')!
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId; const workOrderTypeId = tableRowElement.dataset.workOrderTypeId
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + los.urlPrefix +
"/admin/" + '/admin/' +
(buttonElement.dataset.direction === "up" ? "doMoveWorkOrderTypeUp" : "doMoveWorkOrderTypeDown"), (buttonElement.dataset.direction === 'up' ? 'doMoveWorkOrderTypeUp' : 'doMoveWorkOrderTypeDown'),
{ {
workOrderTypeId, workOrderTypeId,
moveToEnd: clickEvent.shiftKey ? "1" : "0" moveToEnd: clickEvent.shiftKey ? '1' : '0'
}, },
(responseJSON: { (responseJSON: {
success: boolean; success: boolean
errorMessage?: string; errorMessage?: string
workOrderTypes?: recordTypes.WorkOrderType[]; workOrderTypes?: recordTypes.WorkOrderType[]
}) => { }) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderTypes = responseJSON.workOrderTypes!; workOrderTypes = responseJSON.workOrderTypes!
renderWorkOrderTypes(); renderWorkOrderTypes()
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Moving Work Order Type", title: 'Error Moving Work Order Type',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); })
} }
} }
); )
}; }
const renderWorkOrderTypes = () => { const renderWorkOrderTypes = () => {
const containerElement = document.querySelector("#container--workOrderTypes") as HTMLTableSectionElement; const containerElement = document.querySelector('#container--workOrderTypes') as HTMLTableSectionElement
if (workOrderTypes.length === 0) { if (workOrderTypes.length === 0) {
containerElement.innerHTML = `<tr><td colspan="2"> containerElement.innerHTML = `<tr><td colspan="2">
<div class="message is-warning"><p class="message-body">There are no active work order types.</p></div> <div class="message is-warning"><p class="message-body">There are no active work order types.</p></div>
</td></tr>`; </td></tr>`
return; return
} }
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 = workOrderType.workOrderTypeId!.toString()
tableRowElement.innerHTML = tableRowElement.innerHTML =
"<td>" + '<td>' +
"<form>" + '<form>' +
'<input name="workOrderTypeId" type="hidden" value="' + '<input name="workOrderTypeId" type="hidden" value="' +
workOrderType.workOrderTypeId!.toString() + workOrderType.workOrderTypeId!.toString() +
'" />' + '" />' +
('<div class="field has-addons">' + ('<div class="field has-addons">' +
'<div class="control">' + '<div class="control">' +
'<input class="input" name="workOrderType" type="text" value="' + '<input class="input" name="workOrderType" type="text" value="' +
cityssm.escapeHTML(workOrderType.workOrderType || "") + cityssm.escapeHTML(workOrderType.workOrderType || '') +
'" maxlength="100" aria-label="Work Order Type" required />' + '" maxlength="100" aria-label="Work Order Type" required />' +
"</div>" + '</div>' +
'<div class="control">' + '<div class="control">' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' + '<button class="button is-success" type="submit" aria-label="Save"><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">' +
los.getMoveUpDownButtonFieldHTML( los.getMoveUpDownButtonFieldHTML(
"button--moveWorkOrderTypeUp", 'button--moveWorkOrderTypeUp',
"button--moveWorkOrderTypeDown", 'button--moveWorkOrderTypeDown',
false false
) + ) +
"</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.querySelector('form')!.addEventListener('submit', updateWorkOrderType)
(tableRowElement.querySelector(".button--moveWorkOrderTypeUp") as HTMLButtonElement).addEventListener( ;(tableRowElement.querySelector('.button--moveWorkOrderTypeUp') as HTMLButtonElement).addEventListener(
"click", 'click',
moveWorkOrderType moveWorkOrderType
); )
( ;(tableRowElement.querySelector('.button--moveWorkOrderTypeDown') as HTMLButtonElement).addEventListener(
tableRowElement.querySelector(".button--moveWorkOrderTypeDown") as HTMLButtonElement 'click',
).addEventListener("click", moveWorkOrderType); moveWorkOrderType
)
tableRowElement tableRowElement
.querySelector(".button--deleteWorkOrderType")! .querySelector('.button--deleteWorkOrderType')!
.addEventListener("click", deleteWorkOrderType); .addEventListener('click', deleteWorkOrderType)
containerElement.append(tableRowElement); containerElement.append(tableRowElement)
} }
}; }
(document.querySelector("#form--addWorkOrderType") as HTMLFormElement).addEventListener( ;(document.querySelector('#form--addWorkOrderType') as HTMLFormElement).addEventListener(
"submit", 'submit',
(submitEvent: SubmitEvent) => { (submitEvent: SubmitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault()
const formElement = submitEvent.currentTarget as HTMLFormElement; const formElement = submitEvent.currentTarget as HTMLFormElement
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + "/admin/doAddWorkOrderType", los.urlPrefix + '/admin/doAddWorkOrderType',
formElement, formElement,
(responseJSON: { (responseJSON: {
success: boolean; success: boolean
errorMessage?: string; errorMessage?: string
workOrderTypes?: recordTypes.WorkOrderType[]; workOrderTypes?: recordTypes.WorkOrderType[]
}) => { }) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderTypes = responseJSON.workOrderTypes!; workOrderTypes = responseJSON.workOrderTypes!
renderWorkOrderTypes(); renderWorkOrderTypes()
formElement.reset(); formElement.reset()
formElement.querySelector("input")!.focus(); formElement.querySelector('input')!.focus()
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Adding Work Order Type", title: 'Error Adding Work Order Type',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); })
} }
} }
); )
} }
); )
renderWorkOrderTypes(); renderWorkOrderTypes()

View File

@ -3,8 +3,8 @@
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
(() => { (() => {
const los = exports.los; const los = exports.los;
const workOrderNumberCircleElements = document.querySelectorAll(".fa-circle[data-work-order-number"); const workOrderNumberCircleElements = document.querySelectorAll('.fa-circle[data-work-order-number');
for (const workOrderNumberCircleElement of workOrderNumberCircleElements) { for (const workOrderNumberCircleElement of workOrderNumberCircleElements) {
workOrderNumberCircleElement.style.color = los.getRandomColor(workOrderNumberCircleElement.dataset.workOrderNumber || ""); workOrderNumberCircleElement.style.color = los.getRandomColor(workOrderNumberCircleElement.dataset.workOrderNumber || '');
} }
})(); })();

View File

@ -1,17 +1,17 @@
/* eslint-disable unicorn/prefer-module */ /* eslint-disable unicorn/prefer-module */
import type * as globalTypes from "../types/globalTypes"; import type * as globalTypes from '../types/globalTypes'
(() => { ;(() => {
const los = exports.los as globalTypes.LOS; const los = exports.los as globalTypes.LOS
const workOrderNumberCircleElements = document.querySelectorAll( const workOrderNumberCircleElements = document.querySelectorAll(
".fa-circle[data-work-order-number" '.fa-circle[data-work-order-number'
) as NodeListOf<HTMLElement>; ) as NodeListOf<HTMLElement>
for (const workOrderNumberCircleElement of workOrderNumberCircleElements) { for (const workOrderNumberCircleElement of workOrderNumberCircleElements) {
workOrderNumberCircleElement.style.color = los.getRandomColor( workOrderNumberCircleElement.style.color = los.getRandomColor(
workOrderNumberCircleElement.dataset.workOrderNumber || "" workOrderNumberCircleElement.dataset.workOrderNumber || ''
); )
} }
})(); })()

View File

@ -4,14 +4,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
(() => { (() => {
var _a; var _a;
const los = exports.los; const los = exports.los;
const lotId = document.querySelector("#lot--lotId").value; const lotId = document.querySelector('#lot--lotId')
const isCreate = lotId === ""; .value;
const isCreate = lotId === '';
// Main form // Main form
let refreshAfterSave = isCreate; let refreshAfterSave = isCreate;
const formElement = document.querySelector("#form--lot"); const formElement = document.querySelector('#form--lot');
function updateLot(formEvent) { function updateLot(formEvent) {
formEvent.preventDefault(); formEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/lots/" + (isCreate ? "doCreateLot" : "doUpdateLot"), formElement, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/lots/' + (isCreate ? 'doCreateLot' : 'doUpdateLot'), formElement, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
los.clearUnsavedChanges(); los.clearUnsavedChanges();
if (isCreate || refreshAfterSave) { if (isCreate || refreshAfterSave) {
@ -19,30 +20,31 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
message: exports.aliases.lot + " Updated Successfully", message: exports.aliases.lot + ' Updated Successfully',
contextualColorName: "success" contextualColorName: 'success'
}); });
} }
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Updating " + exports.aliases.lot, title: 'Error Updating ' + exports.aliases.lot,
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
} }
formElement.addEventListener("submit", updateLot); formElement.addEventListener('submit', updateLot);
const formInputElements = formElement.querySelectorAll("input, select"); const formInputElements = formElement.querySelectorAll('input, select');
for (const formInputElement of formInputElements) { for (const formInputElement of formInputElements) {
formInputElement.addEventListener("change", los.setUnsavedChanges); formInputElement.addEventListener('change', los.setUnsavedChanges);
} }
los.initializeUnlockFieldButtons(formElement); los.initializeUnlockFieldButtons(formElement);
(_a = document.querySelector("#button--deleteLot")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", (clickEvent) => { (_a = document
.querySelector('#button--deleteLot')) === null || _a === void 0 ? void 0 : _a.addEventListener('click', (clickEvent) => {
clickEvent.preventDefault(); clickEvent.preventDefault();
const doDelete = () => { const doDelete = () => {
cityssm.postJSON(los.urlPrefix + "/lots/doDeleteLot", { cityssm.postJSON(los.urlPrefix + '/lots/doDeleteLot', {
lotId lotId
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
@ -52,16 +54,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: `Error Deleting ${los.escapedAliases.Lot}`, title: `Error Deleting ${los.escapedAliases.Lot}`,
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
bulmaJS.confirm({ bulmaJS.confirm({
title: "Delete " + exports.aliases.lot, title: 'Delete ' + exports.aliases.lot,
message: `Are you sure you want to delete this ${los.escapedAliases.lot}?`, message: `Are you sure you want to delete this ${los.escapedAliases.lot}?`,
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: `Yes, Delete ${los.escapedAliases.Lot}`, text: `Yes, Delete ${los.escapedAliases.Lot}`,
callbackFunction: doDelete callbackFunction: doDelete
@ -69,17 +71,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
}); });
}); });
// Lot Type // Lot Type
const lotTypeIdElement = document.querySelector("#lot--lotTypeId"); const lotTypeIdElement = document.querySelector('#lot--lotTypeId');
if (isCreate) { if (isCreate) {
const lotFieldsContainerElement = document.querySelector("#container--lotFields"); const lotFieldsContainerElement = document.querySelector('#container--lotFields');
lotTypeIdElement.addEventListener("change", () => { lotTypeIdElement.addEventListener('change', () => {
if (lotTypeIdElement.value === "") { if (lotTypeIdElement.value === '') {
lotFieldsContainerElement.innerHTML = `<div class="message is-info"> lotFieldsContainerElement.innerHTML = `<div class="message is-info">
<p class="message-body">Select the ${los.escapedAliases.lot} type to load the available fields.</p> <p class="message-body">Select the ${los.escapedAliases.lot} type to load the available fields.</p>
</div>`; </div>`;
return; return;
} }
cityssm.postJSON(los.urlPrefix + "/lots/doGetLotTypeFields", { cityssm.postJSON(los.urlPrefix + '/lots/doGetLotTypeFields', {
lotTypeId: lotTypeIdElement.value lotTypeId: lotTypeIdElement.value
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.lotTypeFields.length === 0) { if (responseJSON.lotTypeFields.length === 0) {
@ -88,41 +90,40 @@ Object.defineProperty(exports, "__esModule", { value: true });
</div>`; </div>`;
return; return;
} }
lotFieldsContainerElement.innerHTML = ""; lotFieldsContainerElement.innerHTML = '';
let lotTypeFieldIds = ""; let lotTypeFieldIds = '';
for (const lotTypeField of responseJSON.lotTypeFields) { for (const lotTypeField of responseJSON.lotTypeFields) {
lotTypeFieldIds += "," + lotTypeField.lotTypeFieldId; lotTypeFieldIds += ',' + lotTypeField.lotTypeFieldId;
const fieldName = "lotFieldValue_" + lotTypeField.lotTypeFieldId; const fieldName = 'lotFieldValue_' + lotTypeField.lotTypeFieldId;
const fieldId = "lot--" + fieldName; const fieldId = 'lot--' + fieldName;
const fieldElement = document.createElement("div"); const fieldElement = document.createElement('div');
fieldElement.className = "field"; fieldElement.className = 'field';
fieldElement.innerHTML = `<label class="label" for="${fieldId}"></label> fieldElement.innerHTML = `<label class="label" for="${fieldId}"></label>
<div class="control"></div>`; <div class="control"></div>`;
fieldElement.querySelector("label").textContent = fieldElement.querySelector('label').textContent = lotTypeField.lotTypeField;
lotTypeField.lotTypeField; if (lotTypeField.lotTypeFieldValues === '') {
if (lotTypeField.lotTypeFieldValues === "") { const inputElement = document.createElement('input');
const inputElement = document.createElement("input"); inputElement.className = 'input';
inputElement.className = "input";
inputElement.id = fieldId; inputElement.id = fieldId;
inputElement.name = fieldName; inputElement.name = fieldName;
inputElement.type = "text"; inputElement.type = 'text';
inputElement.required = lotTypeField.isRequired; inputElement.required = lotTypeField.isRequired;
inputElement.minLength = lotTypeField.minimumLength; inputElement.minLength = lotTypeField.minimumLength;
inputElement.maxLength = lotTypeField.maximumLength; inputElement.maxLength = lotTypeField.maximumLength;
if (lotTypeField.pattern && lotTypeField.pattern !== "") { if (lotTypeField.pattern && lotTypeField.pattern !== '') {
inputElement.pattern = lotTypeField.pattern; inputElement.pattern = lotTypeField.pattern;
} }
fieldElement.querySelector(".control").append(inputElement); fieldElement.querySelector('.control').append(inputElement);
} }
else { else {
fieldElement.querySelector(".control").innerHTML = `<div class="select is-fullwidth"> fieldElement.querySelector('.control').innerHTML = `<div class="select is-fullwidth">
<select id="${fieldId}" name="${fieldName}"><option value="">(Not Set)</option></select> <select id="${fieldId}" name="${fieldName}"><option value="">(Not Set)</option></select>
</div>`; </div>`;
const selectElement = fieldElement.querySelector("select"); const selectElement = fieldElement.querySelector('select');
selectElement.required = lotTypeField.isRequired; selectElement.required = lotTypeField.isRequired;
const optionValues = lotTypeField.lotTypeFieldValues.split("\n"); const optionValues = lotTypeField.lotTypeFieldValues.split('\n');
for (const optionValue of optionValues) { for (const optionValue of optionValues) {
const optionElement = document.createElement("option"); const optionElement = document.createElement('option');
optionElement.value = optionValue; optionElement.value = optionValue;
optionElement.textContent = optionValue; optionElement.textContent = optionValue;
selectElement.append(optionElement); selectElement.append(optionElement);
@ -130,28 +131,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
lotFieldsContainerElement.append(fieldElement); lotFieldsContainerElement.append(fieldElement);
} }
lotFieldsContainerElement.insertAdjacentHTML("beforeend", `<input name="lotTypeFieldIds" type="hidden" lotFieldsContainerElement.insertAdjacentHTML('beforeend', `<input name="lotTypeFieldIds" type="hidden"
value="${lotTypeFieldIds.slice(1)}" />`); value="${lotTypeFieldIds.slice(1)}" />`);
}); });
}); });
} }
else { else {
const originalLotTypeId = lotTypeIdElement.value; const originalLotTypeId = lotTypeIdElement.value;
lotTypeIdElement.addEventListener("change", () => { lotTypeIdElement.addEventListener('change', () => {
if (lotTypeIdElement.value !== originalLotTypeId) { if (lotTypeIdElement.value !== originalLotTypeId) {
bulmaJS.confirm({ bulmaJS.confirm({
title: "Confirm Change", title: 'Confirm Change',
message: `Are you sure you want to change the ${los.escapedAliases.lot} type?\n message: `Are you sure you want to change the ${los.escapedAliases.lot} type?\n
This change affects the additional fields associated with this record.`, This change affects the additional fields associated with this record.`,
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: "Yes, Keep the Change", text: 'Yes, Keep the Change',
callbackFunction: () => { callbackFunction: () => {
refreshAfterSave = true; refreshAfterSave = true;
} }
}, },
cancelButton: { cancelButton: {
text: "Revert the Change", text: 'Revert the Change',
callbackFunction: () => { callbackFunction: () => {
lotTypeIdElement.value = originalLotTypeId; lotTypeIdElement.value = originalLotTypeId;
} }
@ -164,7 +165,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
let lotComments = exports.lotComments; let lotComments = exports.lotComments;
delete exports.lotComments; delete exports.lotComments;
function openEditLotComment(clickEvent) { function 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;
}); });
@ -172,7 +174,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
let editCloseModalFunction; let editCloseModalFunction;
const editComment = (submitEvent) => { const editComment = (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/lots/doUpdateLotComment", editFormElement, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/lots/doUpdateLotComment', editFormElement, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
lotComments = responseJSON.lotComments; lotComments = responseJSON.lotComments;
editCloseModalFunction(); editCloseModalFunction();
@ -180,37 +182,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Updating Comment", title: 'Error Updating Comment',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
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").value = lotId; modalElement.querySelector('#lotCommentEdit--lotId').value = lotId;
modalElement.querySelector("#lotCommentEdit--lotCommentId").value = modalElement.querySelector('#lotCommentEdit--lotCommentId').value = lotCommentId.toString();
lotCommentId.toString(); modalElement.querySelector('#lotCommentEdit--lotComment').value = lotComment.lotComment;
modalElement.querySelector("#lotCommentEdit--lotComment").value = const lotCommentDateStringElement = modalElement.querySelector('#lotCommentEdit--lotCommentDateString');
lotComment.lotComment;
const lotCommentDateStringElement = modalElement.querySelector("#lotCommentEdit--lotCommentDateString");
lotCommentDateStringElement.value = lotComment.lotCommentDateString; lotCommentDateStringElement.value = lotComment.lotCommentDateString;
const currentDateString = cityssm.dateToString(new Date()); const currentDateString = cityssm.dateToString(new Date());
lotCommentDateStringElement.max = lotCommentDateStringElement.max =
lotComment.lotCommentDateString <= currentDateString lotComment.lotCommentDateString <= currentDateString
? currentDateString ? currentDateString
: lotComment.lotCommentDateString; : lotComment.lotCommentDateString;
modalElement.querySelector("#lotCommentEdit--lotCommentTimeString").value = lotComment.lotCommentTimeString; modalElement.querySelector('#lotCommentEdit--lotCommentTimeString').value = lotComment.lotCommentTimeString;
}, },
onshown: (modalElement, closeModalFunction) => { onshown: (modalElement, closeModalFunction) => {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
los.initializeDatePickers(modalElement); los.initializeDatePickers(modalElement);
// los.initializeTimePickers(modalElement); modalElement.querySelector('#lotCommentEdit--lotComment').focus();
modalElement.querySelector("#lotCommentEdit--lotComment").focus(); editFormElement = modalElement.querySelector('form');
editFormElement = modalElement.querySelector("form"); editFormElement.addEventListener('submit', editComment);
editFormElement.addEventListener("submit", editComment);
editCloseModalFunction = closeModalFunction; editCloseModalFunction = closeModalFunction;
}, },
onremoved: () => { onremoved: () => {
@ -219,9 +218,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
}); });
} }
function deleteLotComment(clickEvent) { function 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(los.urlPrefix + "/lots/doDeleteLotComment", { cityssm.postJSON(los.urlPrefix + '/lots/doDeleteLotComment', {
lotId, lotId,
lotCommentId lotCommentId
}, (responseJSON) => { }, (responseJSON) => {
@ -231,33 +231,33 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Removing Comment", title: 'Error Removing Comment',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
bulmaJS.confirm({ bulmaJS.confirm({
title: "Remove Comment?", title: 'Remove Comment?',
message: "Are you sure you want to remove this comment?", message: 'Are you sure you want to remove this comment?',
okButton: { okButton: {
text: "Yes, Remove Comment", text: 'Yes, Remove Comment',
callbackFunction: doDelete callbackFunction: doDelete
}, },
contextualColorName: "warning" contextualColorName: 'warning'
}); });
} }
function renderLotComments() { function 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 = `<div class="message is-info">
<p class="message-body">There are no comments to display.</p> <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>
@ -266,42 +266,48 @@ Object.defineProperty(exports, "__esModule", { value: true });
</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 = tableRowElement.innerHTML =
"<td>" + '<td>' +
cityssm.escapeHTML(lotComment.recordCreate_userName || "") + cityssm.escapeHTML(lotComment.recordCreate_userName || '') +
"</td>" + '</td>' +
"<td>" + '<td>' +
lotComment.lotCommentDateString + lotComment.lotCommentDateString +
(lotComment.lotCommentTime === 0 ? "" : " " + lotComment.lotCommentTimeString) + (lotComment.lotCommentTime === 0
"</td>" + ? ''
"<td>" + : ' ' + lotComment.lotCommentTimeString) +
cityssm.escapeHTML(lotComment.lotComment || "") + '</td>' +
"</td>" + '<td>' +
cityssm.escapeHTML(lotComment.lotComment || '') +
'</td>' +
('<td class="is-hidden-print">' + ('<td class="is-hidden-print">' +
'<div class="buttons are-small is-justify-content-end">' + '<div class="buttons are-small is-justify-content-end">' +
('<button class="button is-primary button--edit" type="button">' + ('<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 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')
tableElement.querySelector("tbody").append(tableRowElement); .addEventListener('click', openEditLotComment);
tableRowElement
.querySelector('.button--delete')
.addEventListener('click', deleteLotComment);
tableElement.querySelector('tbody').append(tableRowElement);
} }
containerElement.innerHTML = ""; containerElement.innerHTML = '';
containerElement.append(tableElement); containerElement.append(tableElement);
} }
function openAddCommentModal() { function openAddCommentModal() {
let addCommentCloseModalFunction; let addCommentCloseModalFunction;
const doAddComment = (formEvent) => { const doAddComment = (formEvent) => {
formEvent.preventDefault(); formEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/lots/doAddLotComment", formEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/lots/doAddLotComment', formEvent.currentTarget, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
lotComments = responseJSON.lotComments; lotComments = responseJSON.lotComments;
renderLotComments(); renderLotComments();
@ -309,25 +315,29 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
}); });
}; };
cityssm.openHtmlModal("lot-addComment", { cityssm.openHtmlModal('lot-addComment', {
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();
addCommentCloseModalFunction = closeModalFunction; addCommentCloseModalFunction = closeModalFunction;
modalElement.querySelector("#lotCommentAdd--lotComment").focus(); modalElement.querySelector('#lotCommentAdd--lotComment').focus();
}, },
onremoved() { onremoved() {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
document.querySelector("#lotComments--add").focus(); document.querySelector('#lotComments--add').focus();
} }
}); });
} }
if (!isCreate) { if (!isCreate) {
document.querySelector("#lotComments--add").addEventListener("click", openAddCommentModal); document
.querySelector('#lotComments--add')
.addEventListener('click', openAddCommentModal);
renderLotComments(); renderLotComments();
} }
})(); })();

View File

@ -1,461 +1,520 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
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 { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
import type { BulmaJS } from "@cityssm/bulma-js/types"; import type { BulmaJS } from '@cityssm/bulma-js/types'
declare const cityssm: cityssmGlobal; declare const 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 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
let refreshAfterSave = isCreate;
let refreshAfterSave = isCreate
const formElement = document.querySelector("#form--lot") as HTMLFormElement;
const formElement = document.querySelector('#form--lot') as HTMLFormElement
function updateLot(formEvent: SubmitEvent) {
formEvent.preventDefault(); function updateLot(formEvent: SubmitEvent) {
formEvent.preventDefault()
cityssm.postJSON(
los.urlPrefix + "/lots/" + (isCreate ? "doCreateLot" : "doUpdateLot"), cityssm.postJSON(
formElement, los.urlPrefix + '/lots/' + (isCreate ? 'doCreateLot' : 'doUpdateLot'),
(responseJSON: { success: boolean; lotId?: number; errorMessage?: string }) => { formElement,
if (responseJSON.success) { (responseJSON: {
los.clearUnsavedChanges(); success: boolean
lotId?: number
if (isCreate || refreshAfterSave) { errorMessage?: string
window.location.href = los.getLotURL(responseJSON.lotId, true, true); }) => {
} else { if (responseJSON.success) {
bulmaJS.alert({ los.clearUnsavedChanges()
message: exports.aliases.lot + " Updated Successfully",
contextualColorName: "success" if (isCreate || refreshAfterSave) {
}); window.location.href = los.getLotURL(responseJSON.lotId, true, true)
} } else {
} else { bulmaJS.alert({
bulmaJS.alert({ message: exports.aliases.lot + ' Updated Successfully',
title: "Error Updating " + exports.aliases.lot, contextualColorName: 'success'
message: responseJSON.errorMessage || "", })
contextualColorName: "danger" }
}); } else {
} bulmaJS.alert({
} title: 'Error Updating ' + exports.aliases.lot,
); message: responseJSON.errorMessage || '',
} contextualColorName: 'danger'
})
formElement.addEventListener("submit", updateLot);
const formInputElements = formElement.querySelectorAll("input, select");
for (const formInputElement of formInputElements) {
formInputElement.addEventListener("change", los.setUnsavedChanges);
}
los.initializeUnlockFieldButtons(formElement);
document.querySelector("#button--deleteLot")?.addEventListener("click", (clickEvent) => {
clickEvent.preventDefault();
const doDelete = () => {
cityssm.postJSON(
los.urlPrefix + "/lots/doDeleteLot",
{
lotId
},
(responseJSON: { success: boolean; errorMessage?: string }) => {
if (responseJSON.success) {
cityssm.disableNavBlocker();
window.location.href = los.getLotURL();
} else {
bulmaJS.alert({
title: `Error Deleting ${los.escapedAliases.Lot}`,
message: responseJSON.errorMessage || "",
contextualColorName: "danger"
});
}
}
);
};
bulmaJS.confirm({
title: "Delete " + exports.aliases.lot,
message: `Are you sure you want to delete this ${los.escapedAliases.lot}?`,
contextualColorName: "warning",
okButton: {
text: `Yes, Delete ${los.escapedAliases.Lot}`,
callbackFunction: doDelete
}
});
});
// Lot Type
const lotTypeIdElement = document.querySelector("#lot--lotTypeId") as HTMLSelectElement;
if (isCreate) {
const lotFieldsContainerElement = document.querySelector("#container--lotFields") as HTMLElement;
lotTypeIdElement.addEventListener("change", () => {
if (lotTypeIdElement.value === "") {
lotFieldsContainerElement.innerHTML = `<div class="message is-info">
<p class="message-body">Select the ${los.escapedAliases.lot} type to load the available fields.</p>
</div>`;
return;
}
cityssm.postJSON(
los.urlPrefix + "/lots/doGetLotTypeFields",
{
lotTypeId: lotTypeIdElement.value
},
(responseJSON: { lotTypeFields: recordTypes.LotTypeField[] }) => {
if (responseJSON.lotTypeFields.length === 0) {
lotFieldsContainerElement.innerHTML = `<div class="message is-info">
<p class="message-body">There are no additional fields for this ${los.escapedAliases.lot} type.</p>
</div>`;
return;
}
lotFieldsContainerElement.innerHTML = "";
let lotTypeFieldIds = "";
for (const lotTypeField of responseJSON.lotTypeFields) {
lotTypeFieldIds += "," + lotTypeField.lotTypeFieldId;
const fieldName = "lotFieldValue_" + lotTypeField.lotTypeFieldId;
const fieldId = "lot--" + fieldName;
const fieldElement = document.createElement("div");
fieldElement.className = "field";
fieldElement.innerHTML = `<label class="label" for="${fieldId}"></label>
<div class="control"></div>`;
(fieldElement.querySelector("label") as HTMLLabelElement).textContent =
lotTypeField.lotTypeField as string;
if (lotTypeField.lotTypeFieldValues === "") {
const inputElement = document.createElement("input");
inputElement.className = "input";
inputElement.id = fieldId;
inputElement.name = fieldName;
inputElement.type = "text";
inputElement.required = lotTypeField.isRequired as boolean;
inputElement.minLength = lotTypeField.minimumLength as number;
inputElement.maxLength = lotTypeField.maximumLength as number;
if (lotTypeField.pattern && lotTypeField.pattern !== "") {
inputElement.pattern = lotTypeField.pattern;
}
fieldElement.querySelector(".control")!.append(inputElement);
} else {
fieldElement.querySelector(
".control"
)!.innerHTML = `<div class="select is-fullwidth">
<select id="${fieldId}" name="${fieldName}"><option value="">(Not Set)</option></select>
</div>`;
const selectElement = fieldElement.querySelector("select") as HTMLSelectElement;
selectElement.required = lotTypeField.isRequired as boolean;
const optionValues = (lotTypeField.lotTypeFieldValues as string).split("\n");
for (const optionValue of optionValues) {
const optionElement = document.createElement("option");
optionElement.value = optionValue;
optionElement.textContent = optionValue;
selectElement.append(optionElement);
}
}
lotFieldsContainerElement.append(fieldElement);
}
lotFieldsContainerElement.insertAdjacentHTML(
"beforeend",
`<input name="lotTypeFieldIds" type="hidden"
value="${lotTypeFieldIds.slice(1)}" />`
);
}
);
});
} else {
const originalLotTypeId = lotTypeIdElement.value;
lotTypeIdElement.addEventListener("change", () => {
if (lotTypeIdElement.value !== originalLotTypeId) {
bulmaJS.confirm({
title: "Confirm Change",
message: `Are you sure you want to change the ${los.escapedAliases.lot} type?\n
This change affects the additional fields associated with this record.`,
contextualColorName: "warning",
okButton: {
text: "Yes, Keep the Change",
callbackFunction: () => {
refreshAfterSave = true;
}
},
cancelButton: {
text: "Revert the Change",
callbackFunction: () => {
lotTypeIdElement.value = originalLotTypeId;
}
}
});
}
});
}
// Comments
let lotComments: recordTypes.LotComment[] = exports.lotComments;
delete exports.lotComments;
function openEditLotComment(clickEvent: Event) {
const lotCommentId = Number.parseInt(
(clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.lotCommentId!,
10
);
const lotComment = lotComments.find((currentLotComment) => {
return currentLotComment.lotCommentId === lotCommentId;
})!;
let editFormElement: HTMLFormElement;
let editCloseModalFunction: () => void;
const editComment = (submitEvent: SubmitEvent) => {
submitEvent.preventDefault();
cityssm.postJSON(
los.urlPrefix + "/lots/doUpdateLotComment",
editFormElement,
(responseJSON: {
success: boolean;
errorMessage?: string;
lotComments?: recordTypes.LotComment[];
}) => {
if (responseJSON.success) {
lotComments = responseJSON.lotComments!;
editCloseModalFunction();
renderLotComments();
} else {
bulmaJS.alert({
title: "Error Updating Comment",
message: responseJSON.errorMessage || "",
contextualColorName: "danger"
});
}
}
);
};
cityssm.openHtmlModal("lot-editComment", {
onshow: (modalElement) => {
los.populateAliases(modalElement);
(modalElement.querySelector("#lotCommentEdit--lotId") as HTMLInputElement).value = lotId;
(modalElement.querySelector("#lotCommentEdit--lotCommentId") as HTMLInputElement).value =
lotCommentId.toString();
(modalElement.querySelector("#lotCommentEdit--lotComment") as HTMLInputElement).value =
lotComment.lotComment!;
const lotCommentDateStringElement = modalElement.querySelector(
"#lotCommentEdit--lotCommentDateString"
) as HTMLInputElement;
lotCommentDateStringElement.value = lotComment.lotCommentDateString!;
const currentDateString = cityssm.dateToString(new Date());
lotCommentDateStringElement.max =
lotComment.lotCommentDateString! <= currentDateString
? currentDateString
: lotComment.lotCommentDateString!;
(
modalElement.querySelector("#lotCommentEdit--lotCommentTimeString") as HTMLInputElement
).value = lotComment.lotCommentTimeString!;
},
onshown: (modalElement, closeModalFunction) => {
bulmaJS.toggleHtmlClipped();
los.initializeDatePickers(modalElement);
// los.initializeTimePickers(modalElement);
(modalElement.querySelector("#lotCommentEdit--lotComment") as HTMLTextAreaElement).focus();
editFormElement = modalElement.querySelector("form")!;
editFormElement.addEventListener("submit", editComment);
editCloseModalFunction = closeModalFunction;
},
onremoved: () => {
bulmaJS.toggleHtmlClipped();
}
});
}
function deleteLotComment(clickEvent: Event) {
const lotCommentId = Number.parseInt(
(clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.lotCommentId!,
10
);
const doDelete = () => {
cityssm.postJSON(
los.urlPrefix + "/lots/doDeleteLotComment",
{
lotId,
lotCommentId
},
(responseJSON: {
success: boolean;
errorMessage?: string;
lotComments: recordTypes.LotComment[];
}) => {
if (responseJSON.success) {
lotComments = responseJSON.lotComments;
renderLotComments();
} else {
bulmaJS.alert({
title: "Error Removing Comment",
message: responseJSON.errorMessage || "",
contextualColorName: "danger"
});
}
}
);
};
bulmaJS.confirm({
title: "Remove Comment?",
message: "Are you sure you want to remove this comment?",
okButton: {
text: "Yes, Remove Comment",
callbackFunction: doDelete
},
contextualColorName: "warning"
});
}
function renderLotComments() {
const containerElement = document.querySelector("#container--lotComments") as HTMLElement;
if (lotComments.length === 0) {
containerElement.innerHTML = `<div class="message is-info">
<p class="message-body">There are no comments to display.</p>
</div>`;
return;
} }
}
)
}
const tableElement = document.createElement("table"); formElement.addEventListener('submit', updateLot)
tableElement.className = "table is-fullwidth is-striped is-hoverable";
tableElement.innerHTML = `<thead><tr> const formInputElements = formElement.querySelectorAll('input, select')
for (const formInputElement of formInputElements) {
formInputElement.addEventListener('change', los.setUnsavedChanges)
}
los.initializeUnlockFieldButtons(formElement)
document
.querySelector('#button--deleteLot')
?.addEventListener('click', (clickEvent) => {
clickEvent.preventDefault()
const doDelete = () => {
cityssm.postJSON(
los.urlPrefix + '/lots/doDeleteLot',
{
lotId
},
(responseJSON: { success: boolean; errorMessage?: string }) => {
if (responseJSON.success) {
cityssm.disableNavBlocker()
window.location.href = los.getLotURL()
} else {
bulmaJS.alert({
title: `Error Deleting ${los.escapedAliases.Lot}`,
message: responseJSON.errorMessage || '',
contextualColorName: 'danger'
})
}
}
)
}
bulmaJS.confirm({
title: 'Delete ' + exports.aliases.lot,
message: `Are you sure you want to delete this ${los.escapedAliases.lot}?`,
contextualColorName: 'warning',
okButton: {
text: `Yes, Delete ${los.escapedAliases.Lot}`,
callbackFunction: doDelete
}
})
})
// Lot Type
const lotTypeIdElement = document.querySelector(
'#lot--lotTypeId'
) as HTMLSelectElement
if (isCreate) {
const lotFieldsContainerElement = document.querySelector(
'#container--lotFields'
) as HTMLElement
lotTypeIdElement.addEventListener('change', () => {
if (lotTypeIdElement.value === '') {
lotFieldsContainerElement.innerHTML = `<div class="message is-info">
<p class="message-body">Select the ${los.escapedAliases.lot} type to load the available fields.</p>
</div>`
return
}
cityssm.postJSON(
los.urlPrefix + '/lots/doGetLotTypeFields',
{
lotTypeId: lotTypeIdElement.value
},
(responseJSON: { lotTypeFields: recordTypes.LotTypeField[] }) => {
if (responseJSON.lotTypeFields.length === 0) {
lotFieldsContainerElement.innerHTML = `<div class="message is-info">
<p class="message-body">There are no additional fields for this ${los.escapedAliases.lot} type.</p>
</div>`
return
}
lotFieldsContainerElement.innerHTML = ''
let lotTypeFieldIds = ''
for (const lotTypeField of responseJSON.lotTypeFields) {
lotTypeFieldIds += ',' + lotTypeField.lotTypeFieldId
const fieldName = 'lotFieldValue_' + lotTypeField.lotTypeFieldId
const fieldId = 'lot--' + fieldName
const fieldElement = document.createElement('div')
fieldElement.className = 'field'
fieldElement.innerHTML = `<label class="label" for="${fieldId}"></label>
<div class="control"></div>`
;(
fieldElement.querySelector('label') as HTMLLabelElement
).textContent = lotTypeField.lotTypeField as string
if (lotTypeField.lotTypeFieldValues === '') {
const inputElement = document.createElement('input')
inputElement.className = 'input'
inputElement.id = fieldId
inputElement.name = fieldName
inputElement.type = 'text'
inputElement.required = lotTypeField.isRequired as boolean
inputElement.minLength = lotTypeField.minimumLength as number
inputElement.maxLength = lotTypeField.maximumLength as number
if (lotTypeField.pattern && lotTypeField.pattern !== '') {
inputElement.pattern = lotTypeField.pattern
}
fieldElement.querySelector('.control')!.append(inputElement)
} else {
fieldElement.querySelector(
'.control'
)!.innerHTML = `<div class="select is-fullwidth">
<select id="${fieldId}" name="${fieldName}"><option value="">(Not Set)</option></select>
</div>`
const selectElement = fieldElement.querySelector(
'select'
) as HTMLSelectElement
selectElement.required = lotTypeField.isRequired as boolean
const optionValues = (
lotTypeField.lotTypeFieldValues as string
).split('\n')
for (const optionValue of optionValues) {
const optionElement = document.createElement('option')
optionElement.value = optionValue
optionElement.textContent = optionValue
selectElement.append(optionElement)
}
}
lotFieldsContainerElement.append(fieldElement)
}
lotFieldsContainerElement.insertAdjacentHTML(
'beforeend',
`<input name="lotTypeFieldIds" type="hidden"
value="${lotTypeFieldIds.slice(1)}" />`
)
}
)
})
} else {
const originalLotTypeId = lotTypeIdElement.value
lotTypeIdElement.addEventListener('change', () => {
if (lotTypeIdElement.value !== originalLotTypeId) {
bulmaJS.confirm({
title: 'Confirm Change',
message: `Are you sure you want to change the ${los.escapedAliases.lot} type?\n
This change affects the additional fields associated with this record.`,
contextualColorName: 'warning',
okButton: {
text: 'Yes, Keep the Change',
callbackFunction: () => {
refreshAfterSave = true
}
},
cancelButton: {
text: 'Revert the Change',
callbackFunction: () => {
lotTypeIdElement.value = originalLotTypeId
}
}
})
}
})
}
// Comments
let lotComments: recordTypes.LotComment[] = exports.lotComments
delete exports.lotComments
function openEditLotComment(clickEvent: Event) {
const lotCommentId = Number.parseInt(
(clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset
.lotCommentId!,
10
)
const lotComment = lotComments.find((currentLotComment) => {
return currentLotComment.lotCommentId === lotCommentId
})!
let editFormElement: HTMLFormElement
let editCloseModalFunction: () => void
const editComment = (submitEvent: SubmitEvent) => {
submitEvent.preventDefault()
cityssm.postJSON(
los.urlPrefix + '/lots/doUpdateLotComment',
editFormElement,
(responseJSON: {
success: boolean
errorMessage?: string
lotComments?: recordTypes.LotComment[]
}) => {
if (responseJSON.success) {
lotComments = responseJSON.lotComments!
editCloseModalFunction()
renderLotComments()
} else {
bulmaJS.alert({
title: 'Error Updating Comment',
message: responseJSON.errorMessage || '',
contextualColorName: 'danger'
})
}
}
)
}
cityssm.openHtmlModal('lot-editComment', {
onshow: (modalElement) => {
los.populateAliases(modalElement)
;(
modalElement.querySelector(
'#lotCommentEdit--lotId'
) as HTMLInputElement
).value = lotId
;(
modalElement.querySelector(
'#lotCommentEdit--lotCommentId'
) as HTMLInputElement
).value = lotCommentId.toString()
;(
modalElement.querySelector(
'#lotCommentEdit--lotComment'
) as HTMLInputElement
).value = lotComment.lotComment!
const lotCommentDateStringElement = modalElement.querySelector(
'#lotCommentEdit--lotCommentDateString'
) as HTMLInputElement
lotCommentDateStringElement.value = lotComment.lotCommentDateString!
const currentDateString = cityssm.dateToString(new Date())
lotCommentDateStringElement.max =
lotComment.lotCommentDateString! <= currentDateString
? currentDateString
: lotComment.lotCommentDateString!
;(
modalElement.querySelector(
'#lotCommentEdit--lotCommentTimeString'
) as HTMLInputElement
).value = lotComment.lotCommentTimeString!
},
onshown: (modalElement, closeModalFunction) => {
bulmaJS.toggleHtmlClipped()
los.initializeDatePickers(modalElement)
// los.initializeTimePickers(modalElement);
;(
modalElement.querySelector(
'#lotCommentEdit--lotComment'
) as HTMLTextAreaElement
).focus()
editFormElement = modalElement.querySelector('form')!
editFormElement.addEventListener('submit', editComment)
editCloseModalFunction = closeModalFunction
},
onremoved: () => {
bulmaJS.toggleHtmlClipped()
}
})
}
function deleteLotComment(clickEvent: Event) {
const lotCommentId = Number.parseInt(
(clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset
.lotCommentId!,
10
)
const doDelete = () => {
cityssm.postJSON(
los.urlPrefix + '/lots/doDeleteLotComment',
{
lotId,
lotCommentId
},
(responseJSON: {
success: boolean
errorMessage?: string
lotComments: recordTypes.LotComment[]
}) => {
if (responseJSON.success) {
lotComments = responseJSON.lotComments
renderLotComments()
} else {
bulmaJS.alert({
title: 'Error Removing Comment',
message: responseJSON.errorMessage || '',
contextualColorName: 'danger'
})
}
}
)
}
bulmaJS.confirm({
title: 'Remove Comment?',
message: 'Are you sure you want to remove this comment?',
okButton: {
text: 'Yes, Remove Comment',
callbackFunction: doDelete
},
contextualColorName: 'warning'
})
}
function renderLotComments() {
const containerElement = document.querySelector(
'#container--lotComments'
) as HTMLElement
if (lotComments.length === 0) {
containerElement.innerHTML = `<div class="message is-info">
<p class="message-body">There are no comments to display.</p>
</div>`
return
}
const tableElement = document.createElement('table')
tableElement.className = 'table is-fullwidth is-striped is-hoverable'
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 = tableRowElement.innerHTML =
"<td>" + '<td>' +
cityssm.escapeHTML(lotComment.recordCreate_userName || "") + cityssm.escapeHTML(lotComment.recordCreate_userName || '') +
"</td>" + '</td>' +
"<td>" + '<td>' +
lotComment.lotCommentDateString + lotComment.lotCommentDateString +
(lotComment.lotCommentTime === 0 ? "" : " " + lotComment.lotCommentTimeString) + (lotComment.lotCommentTime === 0
"</td>" + ? ''
"<td>" + : ' ' + lotComment.lotCommentTimeString) +
cityssm.escapeHTML(lotComment.lotComment || "") + '</td>' +
"</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">' +
" <span>Edit</span>" + ('<button class="button is-primary button--edit" type="button">' +
"</button>") + '<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' + ' <span>Edit</span>' +
'<i class="fas fa-trash" aria-hidden="true"></i>' + '</button>') +
"</button>") + ('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
"</div>" + '<i class="fas fa-trash" aria-hidden="true"></i>' +
"</td>"); '</button>') +
'</div>' +
'</td>')
tableRowElement.querySelector(".button--edit")!.addEventListener("click", openEditLotComment); tableRowElement
.querySelector('.button--edit')!
.addEventListener('click', openEditLotComment)
tableRowElement.querySelector(".button--delete")!.addEventListener("click", deleteLotComment); tableRowElement
.querySelector('.button--delete')!
.addEventListener('click', deleteLotComment)
tableElement.querySelector("tbody")!.append(tableRowElement); tableElement.querySelector('tbody')!.append(tableRowElement)
}
containerElement.innerHTML = ''
containerElement.append(tableElement)
}
function openAddCommentModal() {
let addCommentCloseModalFunction: () => void
const doAddComment = (formEvent: SubmitEvent) => {
formEvent.preventDefault()
cityssm.postJSON(
los.urlPrefix + '/lots/doAddLotComment',
formEvent.currentTarget,
(responseJSON: {
success: boolean
lotComments?: recordTypes.LotComment[]
}) => {
if (responseJSON.success) {
lotComments = responseJSON.lotComments!
renderLotComments()
addCommentCloseModalFunction()
}
} }
)
containerElement.innerHTML = "";
containerElement.append(tableElement);
} }
function openAddCommentModal() { cityssm.openHtmlModal('lot-addComment', {
let addCommentCloseModalFunction: () => void; onshow(modalElement) {
los.populateAliases(modalElement)
;(
modalElement.querySelector(
'#lotCommentAdd--lotId'
) as HTMLInputElement
).value = lotId
modalElement
.querySelector('form')!
.addEventListener('submit', doAddComment)
},
onshown(modalElement, closeModalFunction) {
bulmaJS.toggleHtmlClipped()
addCommentCloseModalFunction = closeModalFunction
;(
modalElement.querySelector(
'#lotCommentAdd--lotComment'
) as HTMLTextAreaElement
).focus()
},
onremoved() {
bulmaJS.toggleHtmlClipped()
;(
document.querySelector('#lotComments--add') as HTMLButtonElement
).focus()
}
})
}
const doAddComment = (formEvent: SubmitEvent) => { if (!isCreate) {
formEvent.preventDefault(); document
.querySelector('#lotComments--add')!
cityssm.postJSON( .addEventListener('click', openAddCommentModal)
los.urlPrefix + "/lots/doAddLotComment", renderLotComments()
formEvent.currentTarget, }
(responseJSON: { success: boolean; lotComments?: recordTypes.LotComment[] }) => { })()
if (responseJSON.success) {
lotComments = responseJSON.lotComments!;
renderLotComments();
addCommentCloseModalFunction();
}
}
);
};
cityssm.openHtmlModal("lot-addComment", {
onshow(modalElement) {
los.populateAliases(modalElement);
(modalElement.querySelector("#lotCommentAdd--lotId") as HTMLInputElement).value = lotId;
modalElement.querySelector("form")!.addEventListener("submit", doAddComment);
},
onshown(modalElement, closeModalFunction) {
bulmaJS.toggleHtmlClipped();
addCommentCloseModalFunction = closeModalFunction;
(modalElement.querySelector("#lotCommentAdd--lotComment") as HTMLTextAreaElement).focus();
},
onremoved() {
bulmaJS.toggleHtmlClipped();
(document.querySelector("#lotComments--add") as HTMLButtonElement).focus();
}
});
}
if (!isCreate) {
document.querySelector("#lotComments--add")!.addEventListener("click", openAddCommentModal);
renderLotComments();
}
})();

File diff suppressed because it is too large Load Diff

View File

@ -4,17 +4,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
(() => { (() => {
var _a, _b, _c; var _a, _b, _c;
const los = exports.los; const los = exports.los;
const lotOccupancyId = document.querySelector("#lotOccupancy--lotOccupancyId") const lotOccupancyId = document.querySelector('#lotOccupancy--lotOccupancyId').value;
.value; const isCreate = lotOccupancyId === '';
const isCreate = lotOccupancyId === "";
/* /*
* Main form * Main form
*/ */
let refreshAfterSave = isCreate; let refreshAfterSave = isCreate;
const formElement = document.querySelector("#form--lotOccupancy"); const formElement = document.querySelector('#form--lotOccupancy');
formElement.addEventListener("submit", (formEvent) => { formElement.addEventListener('submit', (formEvent) => {
formEvent.preventDefault(); formEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/" + (isCreate ? "doCreateLotOccupancy" : "doUpdateLotOccupancy"), formElement, (responseJSON) => { cityssm.postJSON(los.urlPrefix +
'/lotOccupancies/' +
(isCreate ? 'doCreateLotOccupancy' : 'doUpdateLotOccupancy'), formElement, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
los.clearUnsavedChanges(); los.clearUnsavedChanges();
if (isCreate || refreshAfterSave) { if (isCreate || refreshAfterSave) {
@ -23,25 +24,25 @@ Object.defineProperty(exports, "__esModule", { value: true });
else { else {
bulmaJS.alert({ bulmaJS.alert({
message: `${los.escapedAliases.Occupancy} Updated Successfully`, message: `${los.escapedAliases.Occupancy} Updated Successfully`,
contextualColorName: "success" contextualColorName: 'success'
}); });
} }
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Saving " + exports.aliases.occupancy, title: 'Error Saving ' + exports.aliases.occupancy,
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}); });
const formInputElements = formElement.querySelectorAll("input, select"); const formInputElements = formElement.querySelectorAll('input, select');
for (const formInputElement of formInputElements) { for (const formInputElement of formInputElements) {
formInputElement.addEventListener("change", los.setUnsavedChanges); formInputElement.addEventListener('change', los.setUnsavedChanges);
} }
const doCopy = () => { const doCopy = () => {
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doCopyLotOccupancy", { cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doCopyLotOccupancy', {
lotOccupancyId lotOccupancyId
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
@ -50,38 +51,40 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Copying Record", title: 'Error Copying Record',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
(_a = document.querySelector("#button--copyLotOccupancy")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", (clickEvent) => { (_a = document
.querySelector('#button--copyLotOccupancy')) === null || _a === void 0 ? void 0 : _a.addEventListener('click', (clickEvent) => {
clickEvent.preventDefault(); clickEvent.preventDefault();
if (los.hasUnsavedChanges()) { if (los.hasUnsavedChanges()) {
bulmaJS.alert({ bulmaJS.alert({
title: "Unsaved Changes", title: 'Unsaved Changes',
message: "Please save all unsaved changes before continuing.", message: 'Please save all unsaved changes before continuing.',
contextualColorName: "warning" contextualColorName: 'warning'
}); });
} }
else { else {
bulmaJS.confirm({ bulmaJS.confirm({
title: `Copy ${los.escapedAliases.Occupancy} Record as New`, title: `Copy ${los.escapedAliases.Occupancy} Record as New`,
message: "Are you sure you want to copy this record to a new record?", message: 'Are you sure you want to copy this record to a new record?',
contextualColorName: "info", contextualColorName: 'info',
okButton: { okButton: {
text: "Yes, Copy", text: 'Yes, Copy',
callbackFunction: doCopy callbackFunction: doCopy
} }
}); });
} }
}); });
(_b = document.querySelector("#button--deleteLotOccupancy")) === null || _b === void 0 ? void 0 : _b.addEventListener("click", (clickEvent) => { (_b = document
.querySelector('#button--deleteLotOccupancy')) === null || _b === void 0 ? void 0 : _b.addEventListener('click', (clickEvent) => {
clickEvent.preventDefault(); clickEvent.preventDefault();
const doDelete = () => { const doDelete = () => {
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancy", { cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancy', {
lotOccupancyId lotOccupancyId
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
@ -90,65 +93,69 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Deleting Record", title: 'Error Deleting Record',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
bulmaJS.confirm({ bulmaJS.confirm({
title: "Delete " + exports.aliases.occupancy + " Record", title: 'Delete ' + exports.aliases.occupancy + ' Record',
message: "Are you sure you want to delete this record?", message: 'Are you sure you want to delete this record?',
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: "Yes, Delete", text: 'Yes, Delete',
callbackFunction: doDelete callbackFunction: doDelete
} }
}); });
}); });
(_c = document.querySelector("#button--createWorkOrder")) === null || _c === void 0 ? void 0 : _c.addEventListener("click", (clickEvent) => { (_c = document
.querySelector('#button--createWorkOrder')) === null || _c === void 0 ? void 0 : _c.addEventListener('click', (clickEvent) => {
clickEvent.preventDefault(); clickEvent.preventDefault();
let createCloseModalFunction; let createCloseModalFunction;
const doCreate = (formEvent) => { const doCreate = (formEvent) => {
formEvent.preventDefault(); formEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/workOrders/doCreateWorkOrder", formEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/workOrders/doCreateWorkOrder', formEvent.currentTarget, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
createCloseModalFunction(); createCloseModalFunction();
bulmaJS.confirm({ bulmaJS.confirm({
title: "Work Order Created Successfully", title: 'Work Order Created Successfully',
message: "Would you like to open the work order now?", message: 'Would you like to open the work order now?',
contextualColorName: "success", contextualColorName: 'success',
okButton: { okButton: {
text: "Yes, Open the Work Order", text: 'Yes, Open the Work Order',
callbackFunction: () => { callbackFunction: () => {
window.location.href = window.location.href =
los.urlPrefix + "/workOrders/" + responseJSON.workOrderId + "/edit"; los.urlPrefix +
'/workOrders/' +
responseJSON.workOrderId +
'/edit';
} }
} }
}); });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Creating Work Order", title: 'Error Creating Work Order',
message: responseJSON.errorMessage, message: responseJSON.errorMessage,
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
cityssm.openHtmlModal("lotOccupancy-createWorkOrder", { cityssm.openHtmlModal('lotOccupancy-createWorkOrder', {
onshow(modalElement) { onshow(modalElement) {
modalElement.querySelector("#workOrderCreate--lotOccupancyId").value = ;
lotOccupancyId; modalElement.querySelector('#workOrderCreate--lotOccupancyId').value = lotOccupancyId;
modalElement.querySelector("#workOrderCreate--workOrderOpenDateString").value = cityssm.dateToString(new Date()); modalElement.querySelector('#workOrderCreate--workOrderOpenDateString').value = cityssm.dateToString(new Date());
const workOrderTypeSelectElement = modalElement.querySelector("#workOrderCreate--workOrderTypeId"); const workOrderTypeSelectElement = modalElement.querySelector('#workOrderCreate--workOrderTypeId');
const workOrderTypes = exports.workOrderTypes; const workOrderTypes = exports.workOrderTypes;
if (workOrderTypes.length === 1) { if (workOrderTypes.length === 1) {
workOrderTypeSelectElement.innerHTML = ""; workOrderTypeSelectElement.innerHTML = '';
} }
for (const workOrderType of workOrderTypes) { for (const workOrderType of workOrderTypes) {
const optionElement = document.createElement("option"); const optionElement = document.createElement('option');
optionElement.value = workOrderType.workOrderTypeId.toString(); optionElement.value = workOrderType.workOrderTypeId.toString();
optionElement.textContent = workOrderType.workOrderType; optionElement.textContent = workOrderType.workOrderType;
workOrderTypeSelectElement.append(optionElement); workOrderTypeSelectElement.append(optionElement);
@ -157,22 +164,23 @@ Object.defineProperty(exports, "__esModule", { value: true });
onshown(modalElement, closeModalFunction) { onshown(modalElement, closeModalFunction) {
var _a; var _a;
createCloseModalFunction = closeModalFunction; createCloseModalFunction = closeModalFunction;
(_a = modalElement.querySelector("form")) === null || _a === void 0 ? void 0 : _a.addEventListener("submit", doCreate); (_a = modalElement
.querySelector('form')) === null || _a === void 0 ? void 0 : _a.addEventListener('submit', doCreate);
} }
}); });
}); });
// Occupancy Type // Occupancy Type
const occupancyTypeIdElement = document.querySelector("#lotOccupancy--occupancyTypeId"); const occupancyTypeIdElement = document.querySelector('#lotOccupancy--occupancyTypeId');
if (isCreate) { if (isCreate) {
const lotOccupancyFieldsContainerElement = document.querySelector("#container--lotOccupancyFields"); const lotOccupancyFieldsContainerElement = document.querySelector('#container--lotOccupancyFields');
occupancyTypeIdElement.addEventListener("change", () => { occupancyTypeIdElement.addEventListener('change', () => {
if (occupancyTypeIdElement.value === "") { if (occupancyTypeIdElement.value === '') {
lotOccupancyFieldsContainerElement.innerHTML = `<div class="message is-info"> lotOccupancyFieldsContainerElement.innerHTML = `<div class="message is-info">
<p class="message-body">Select the ${los.escapedAliases.occupancy} type to load the available fields.</p> <p class="message-body">Select the ${los.escapedAliases.occupancy} type to load the available fields.</p>
</div>`; </div>`;
return; return;
} }
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doGetOccupancyTypeFields", { cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doGetOccupancyTypeFields', {
occupancyTypeId: occupancyTypeIdElement.value occupancyTypeId: occupancyTypeIdElement.value
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.occupancyTypeFields.length === 0) { if (responseJSON.occupancyTypeFields.length === 0) {
@ -181,45 +189,51 @@ Object.defineProperty(exports, "__esModule", { value: true });
</div>`; </div>`;
return; return;
} }
lotOccupancyFieldsContainerElement.innerHTML = ""; lotOccupancyFieldsContainerElement.innerHTML = '';
let occupancyTypeFieldIds = ""; let occupancyTypeFieldIds = '';
for (const occupancyTypeField of responseJSON.occupancyTypeFields) { for (const occupancyTypeField of responseJSON.occupancyTypeFields) {
occupancyTypeFieldIds += "," + occupancyTypeField.occupancyTypeFieldId; occupancyTypeFieldIds +=
const fieldName = "lotOccupancyFieldValue_" + occupancyTypeField.occupancyTypeFieldId; ',' + occupancyTypeField.occupancyTypeFieldId;
const fieldId = "lotOccupancy--" + fieldName; const fieldName = 'lotOccupancyFieldValue_' +
const fieldElement = document.createElement("div"); occupancyTypeField.occupancyTypeFieldId;
fieldElement.className = "field"; const fieldId = 'lotOccupancy--' + fieldName;
const fieldElement = document.createElement('div');
fieldElement.className = 'field';
fieldElement.innerHTML = `<label class="label" for="${fieldId}"></label><div class="control"></div>`; fieldElement.innerHTML = `<label class="label" for="${fieldId}"></label><div class="control"></div>`;
fieldElement.querySelector("label").textContent = fieldElement.querySelector('label').textContent = occupancyTypeField.occupancyTypeField;
occupancyTypeField.occupancyTypeField; if (occupancyTypeField.occupancyTypeFieldValues === '') {
if (occupancyTypeField.occupancyTypeFieldValues === "") { const inputElement = document.createElement('input');
const inputElement = document.createElement("input"); inputElement.className = 'input';
inputElement.className = "input";
inputElement.id = fieldId; inputElement.id = fieldId;
inputElement.name = fieldName; inputElement.name = fieldName;
inputElement.type = "text"; inputElement.type = 'text';
inputElement.required = occupancyTypeField.isRequired; inputElement.required = occupancyTypeField.isRequired;
inputElement.minLength = occupancyTypeField.minimumLength; inputElement.minLength =
inputElement.maxLength = occupancyTypeField.maximumLength; occupancyTypeField.minimumLength;
if (occupancyTypeField.pattern && occupancyTypeField.pattern !== "") { inputElement.maxLength =
occupancyTypeField.maximumLength;
if (occupancyTypeField.pattern &&
occupancyTypeField.pattern !== '') {
inputElement.pattern = occupancyTypeField.pattern; inputElement.pattern = occupancyTypeField.pattern;
} }
fieldElement.querySelector(".control").append(inputElement); ;
fieldElement.querySelector('.control').append(inputElement);
} }
else { else {
fieldElement.querySelector(".control").innerHTML = ;
fieldElement.querySelector('.control').innerHTML =
'<div class="select is-fullwidth"><select id="' + '<div class="select is-fullwidth"><select id="' +
fieldId + fieldId +
'" name="' + '" name="' +
fieldName + fieldName +
'">' + '">' +
'<option value="">(Not Set)</option>' + '<option value="">(Not Set)</option>' +
"</select></div>"; '</select></div>';
const selectElement = fieldElement.querySelector("select"); const selectElement = fieldElement.querySelector('select');
selectElement.required = occupancyTypeField.isRequired; selectElement.required = occupancyTypeField.isRequired;
const optionValues = occupancyTypeField.occupancyTypeFieldValues.split("\n"); const optionValues = occupancyTypeField.occupancyTypeFieldValues.split('\n');
for (const optionValue of optionValues) { for (const optionValue of optionValues) {
const optionElement = document.createElement("option"); const optionElement = document.createElement('option');
optionElement.value = optionValue; optionElement.value = optionValue;
optionElement.textContent = optionValue; optionElement.textContent = optionValue;
selectElement.append(optionElement); selectElement.append(optionElement);
@ -227,27 +241,27 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
lotOccupancyFieldsContainerElement.append(fieldElement); lotOccupancyFieldsContainerElement.append(fieldElement);
} }
lotOccupancyFieldsContainerElement.insertAdjacentHTML("beforeend", `<input name="occupancyTypeFieldIds" type="hidden" value="${occupancyTypeFieldIds.slice(1)}" />`); lotOccupancyFieldsContainerElement.insertAdjacentHTML('beforeend', `<input name="occupancyTypeFieldIds" type="hidden" value="${occupancyTypeFieldIds.slice(1)}" />`);
}); });
}); });
} }
else { else {
const originalOccupancyTypeId = occupancyTypeIdElement.value; const originalOccupancyTypeId = occupancyTypeIdElement.value;
occupancyTypeIdElement.addEventListener("change", () => { occupancyTypeIdElement.addEventListener('change', () => {
if (occupancyTypeIdElement.value !== originalOccupancyTypeId) { if (occupancyTypeIdElement.value !== originalOccupancyTypeId) {
bulmaJS.confirm({ bulmaJS.confirm({
title: "Confirm Change", title: 'Confirm Change',
message: `Are you sure you want to change the ${los.escapedAliases.occupancy} type?\n message: `Are you sure you want to change the ${los.escapedAliases.occupancy} type?\n
This change affects the additional fields associated with this record, and may also affect the available fees.`, This change affects the additional fields associated with this record, and may also affect the available fees.`,
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: "Yes, Keep the Change", text: 'Yes, Keep the Change',
callbackFunction: () => { callbackFunction: () => {
refreshAfterSave = true; refreshAfterSave = true;
} }
}, },
cancelButton: { cancelButton: {
text: "Revert the Change", text: 'Revert the Change',
callbackFunction: () => { callbackFunction: () => {
occupancyTypeIdElement.value = originalOccupancyTypeId; occupancyTypeIdElement.value = originalOccupancyTypeId;
} }
@ -257,16 +271,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
}); });
} }
// Lot Selector // Lot Selector
const lotNameElement = document.querySelector("#lotOccupancy--lotName"); const lotNameElement = document.querySelector('#lotOccupancy--lotName');
lotNameElement.addEventListener("click", (clickEvent) => { lotNameElement.addEventListener('click', (clickEvent) => {
const currentLotName = clickEvent.currentTarget.value; const currentLotName = clickEvent.currentTarget.value;
let lotSelectCloseModalFunction; let lotSelectCloseModalFunction;
let lotSelectModalElement; let lotSelectModalElement;
let lotSelectFormElement; let lotSelectFormElement;
let lotSelectResultsElement; let lotSelectResultsElement;
const renderSelectedLotAndClose = (lotId, lotName) => { const renderSelectedLotAndClose = (lotId, lotName) => {
document.querySelector("#lotOccupancy--lotId").value = lotId.toString(); ;
document.querySelector("#lotOccupancy--lotName").value = lotName; document.querySelector('#lotOccupancy--lotId').value = lotId.toString();
document.querySelector('#lotOccupancy--lotName').value = lotName;
los.setUnsavedChanges(); los.setUnsavedChanges();
lotSelectCloseModalFunction(); lotSelectCloseModalFunction();
}; };
@ -276,64 +291,64 @@ Object.defineProperty(exports, "__esModule", { value: true });
renderSelectedLotAndClose(selectedLotElement.dataset.lotId, selectedLotElement.dataset.lotName); renderSelectedLotAndClose(selectedLotElement.dataset.lotId, selectedLotElement.dataset.lotName);
}; };
const searchLots = () => { const searchLots = () => {
lotSelectResultsElement.innerHTML = los.getLoadingParagraphHTML("Searching..."); lotSelectResultsElement.innerHTML =
cityssm.postJSON(los.urlPrefix + "/lots/doSearchLots", lotSelectFormElement, (responseJSON) => { los.getLoadingParagraphHTML('Searching...');
cityssm.postJSON(los.urlPrefix + '/lots/doSearchLots', lotSelectFormElement, (responseJSON) => {
if (responseJSON.count === 0) { if (responseJSON.count === 0) {
lotSelectResultsElement.innerHTML = `<div class="message is-info"> lotSelectResultsElement.innerHTML = `<div class="message is-info">
<p class="message-body">No results.</p> <p class="message-body">No results.</p>
</div>`; </div>`;
return; return;
} }
const panelElement = document.createElement("div"); const panelElement = document.createElement('div');
panelElement.className = "panel"; panelElement.className = 'panel';
for (const lot of responseJSON.lots) { for (const lot of responseJSON.lots) {
const panelBlockElement = document.createElement("a"); const panelBlockElement = document.createElement('a');
panelBlockElement.className = "panel-block is-block"; panelBlockElement.className = 'panel-block is-block';
panelBlockElement.href = "#"; panelBlockElement.href = '#';
panelBlockElement.dataset.lotId = lot.lotId.toString(); panelBlockElement.dataset.lotId = lot.lotId.toString();
panelBlockElement.dataset.lotName = lot.lotName; panelBlockElement.dataset.lotName = lot.lotName;
panelBlockElement.innerHTML = panelBlockElement.innerHTML =
'<div class="columns">' + '<div class="columns">' +
('<div class="column">' + ('<div class="column">' +
cityssm.escapeHTML(lot.lotName || "") + cityssm.escapeHTML(lot.lotName || '') +
"<br />" + '<br />' +
'<span class="is-size-7">' + '<span class="is-size-7">' +
cityssm.escapeHTML(lot.mapName || "") + cityssm.escapeHTML(lot.mapName || '') +
"</span>" + '</span>' +
"</div>") + '</div>') +
('<div class="column">' + ('<div class="column">' +
cityssm.escapeHTML(lot.lotStatus) + cityssm.escapeHTML(lot.lotStatus) +
"<br />" + '<br />' +
'<span class="is-size-7">' + '<span class="is-size-7">' +
(lot.lotOccupancyCount > 0 ? "Currently Occupied" : "") + (lot.lotOccupancyCount > 0 ? 'Currently Occupied' : '') +
"</span>" + '</span>' +
"</div>") + '</div>') +
"</div>"; '</div>';
panelBlockElement.addEventListener("click", selectExistingLot); panelBlockElement.addEventListener('click', selectExistingLot);
panelElement.append(panelBlockElement); panelElement.append(panelBlockElement);
} }
lotSelectResultsElement.innerHTML = ""; lotSelectResultsElement.innerHTML = '';
lotSelectResultsElement.append(panelElement); lotSelectResultsElement.append(panelElement);
}); });
}; };
const createLotAndSelect = (submitEvent) => { const createLotAndSelect = (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
const lotName = lotSelectModalElement.querySelector("#lotCreate--lotName") const lotName = lotSelectModalElement.querySelector('#lotCreate--lotName').value;
.value; cityssm.postJSON(los.urlPrefix + '/lots/doCreateLot', submitEvent.currentTarget, (responseJSON) => {
cityssm.postJSON(los.urlPrefix + "/lots/doCreateLot", submitEvent.currentTarget, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
renderSelectedLotAndClose(responseJSON.lotId, lotName); renderSelectedLotAndClose(responseJSON.lotId, lotName);
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: `Error Creating ${los.escapedAliases.Lot}`, title: `Error Creating ${los.escapedAliases.Lot}`,
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
cityssm.openHtmlModal("lotOccupancy-selectLot", { cityssm.openHtmlModal('lotOccupancy-selectLot', {
onshow: (modalElement) => { onshow: (modalElement) => {
los.populateAliases(modalElement); los.populateAliases(modalElement);
}, },
@ -343,87 +358,94 @@ Object.defineProperty(exports, "__esModule", { value: true });
lotSelectCloseModalFunction = closeModalFunction; lotSelectCloseModalFunction = closeModalFunction;
bulmaJS.init(modalElement); bulmaJS.init(modalElement);
// search Tab // search Tab
const lotNameFilterElement = modalElement.querySelector("#lotSelect--lotName"); const lotNameFilterElement = modalElement.querySelector('#lotSelect--lotName');
if (document.querySelector("#lotOccupancy--lotId").value !== "") { if (document.querySelector('#lotOccupancy--lotId')
.value !== '') {
lotNameFilterElement.value = currentLotName; lotNameFilterElement.value = currentLotName;
} }
lotNameFilterElement.focus(); lotNameFilterElement.focus();
lotNameFilterElement.addEventListener("change", searchLots); lotNameFilterElement.addEventListener('change', searchLots);
const occupancyStatusFilterElement = modalElement.querySelector("#lotSelect--occupancyStatus"); const occupancyStatusFilterElement = modalElement.querySelector('#lotSelect--occupancyStatus');
occupancyStatusFilterElement.addEventListener("change", searchLots); occupancyStatusFilterElement.addEventListener('change', searchLots);
if (currentLotName !== "") { if (currentLotName !== '') {
occupancyStatusFilterElement.value = ""; occupancyStatusFilterElement.value = '';
} }
lotSelectFormElement = modalElement.querySelector("#form--lotSelect"); lotSelectFormElement = modalElement.querySelector('#form--lotSelect');
lotSelectResultsElement = modalElement.querySelector("#resultsContainer--lotSelect"); lotSelectResultsElement = modalElement.querySelector('#resultsContainer--lotSelect');
lotSelectFormElement.addEventListener("submit", (submitEvent) => { lotSelectFormElement.addEventListener('submit', (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
}); });
searchLots(); searchLots();
// Create Tab // Create Tab
if (exports.lotNamePattern) { if (exports.lotNamePattern) {
const regex = exports.lotNamePattern; const regex = exports.lotNamePattern;
modalElement.querySelector("#lotCreate--lotName").pattern = modalElement.querySelector('#lotCreate--lotName').pattern = regex.source;
regex.source;
} }
const lotTypeElement = modalElement.querySelector("#lotCreate--lotTypeId"); const lotTypeElement = modalElement.querySelector('#lotCreate--lotTypeId');
for (const lotType of exports.lotTypes) { for (const lotType of exports.lotTypes) {
const optionElement = document.createElement("option"); const optionElement = document.createElement('option');
optionElement.value = lotType.lotTypeId.toString(); optionElement.value = lotType.lotTypeId.toString();
optionElement.textContent = lotType.lotType; optionElement.textContent = lotType.lotType;
lotTypeElement.append(optionElement); lotTypeElement.append(optionElement);
} }
const lotStatusElement = modalElement.querySelector("#lotCreate--lotStatusId"); const lotStatusElement = modalElement.querySelector('#lotCreate--lotStatusId');
for (const lotStatus of exports.lotStatuses) { for (const lotStatus of exports.lotStatuses) {
const optionElement = document.createElement("option"); const optionElement = document.createElement('option');
optionElement.value = lotStatus.lotStatusId.toString(); optionElement.value = lotStatus.lotStatusId.toString();
optionElement.textContent = lotStatus.lotStatus; optionElement.textContent = lotStatus.lotStatus;
lotStatusElement.append(optionElement); lotStatusElement.append(optionElement);
} }
const mapElement = modalElement.querySelector("#lotCreate--mapId"); const mapElement = modalElement.querySelector('#lotCreate--mapId');
for (const map of exports.maps) { for (const map of exports.maps) {
const optionElement = document.createElement("option"); const optionElement = document.createElement('option');
optionElement.value = map.mapId.toString(); optionElement.value = map.mapId.toString();
optionElement.textContent = map.mapName || "(No Name)"; optionElement.textContent = map.mapName || '(No Name)';
mapElement.append(optionElement); mapElement.append(optionElement);
} }
modalElement.querySelector("#form--lotCreate").addEventListener("submit", createLotAndSelect); ;
modalElement.querySelector('#form--lotCreate').addEventListener('submit', createLotAndSelect);
}, },
onremoved: () => { onremoved: () => {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
} }
}); });
}); });
document.querySelector(".is-lot-view-button").addEventListener("click", () => { document
const lotId = document.querySelector("#lotOccupancy--lotId").value; .querySelector('.is-lot-view-button')
.addEventListener('click', () => {
const lotId = document.querySelector('#lotOccupancy--lotId').value;
if (lotId) { if (lotId) {
window.open(los.urlPrefix + "/lots/" + lotId); window.open(los.urlPrefix + '/lots/' + lotId);
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
message: `No ${los.escapedAliases.lot} selected.`, message: `No ${los.escapedAliases.lot} selected.`,
contextualColorName: "info" contextualColorName: 'info'
}); });
} }
}); });
document.querySelector(".is-clear-lot-button").addEventListener("click", () => { document
.querySelector('.is-clear-lot-button')
.addEventListener('click', () => {
if (lotNameElement.disabled) { if (lotNameElement.disabled) {
bulmaJS.alert({ bulmaJS.alert({
message: "You need to unlock the field before clearing it.", message: 'You need to unlock the field before clearing it.',
contextualColorName: "info" contextualColorName: 'info'
}); });
} }
else { else {
lotNameElement.value = `(No ${los.escapedAliases.Lot})`; lotNameElement.value = `(No ${los.escapedAliases.Lot})`;
document.querySelector("#lotOccupancy--lotId").value = ""; document.querySelector('#lotOccupancy--lotId').value = '';
los.setUnsavedChanges(); los.setUnsavedChanges();
} }
}); });
// Start Date // Start Date
los.initializeDatePickers(formElement); los.initializeDatePickers(formElement);
document.querySelector("#lotOccupancy--occupancyStartDateString").addEventListener("change", () => { document
const endDatePicker = document.querySelector("#lotOccupancy--occupancyEndDateString").bulmaCalendar.datePicker; .querySelector('#lotOccupancy--occupancyStartDateString')
endDatePicker.min = document.querySelector("#lotOccupancy--occupancyStartDateString").value; .addEventListener('change', () => {
const endDatePicker = document.querySelector('#lotOccupancy--occupancyEndDateString').bulmaCalendar.datePicker;
endDatePicker.min = document.querySelector('#lotOccupancy--occupancyStartDateString').value;
endDatePicker.refresh(); endDatePicker.refresh();
}); });
los.initializeUnlockFieldButtons(formElement); los.initializeUnlockFieldButtons(formElement);

File diff suppressed because it is too large Load Diff

View File

@ -4,15 +4,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
let lotOccupancyComments = exports.lotOccupancyComments; let lotOccupancyComments = exports.lotOccupancyComments;
delete exports.lotOccupancyComments; delete exports.lotOccupancyComments;
const openEditLotOccupancyComment = (clickEvent) => { const openEditLotOccupancyComment = (clickEvent) => {
const lotOccupancyCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.lotOccupancyCommentId, 10); const lotOccupancyCommentId = Number.parseInt(clickEvent.currentTarget.closest('tr').dataset
.lotOccupancyCommentId, 10);
const lotOccupancyComment = lotOccupancyComments.find((currentLotOccupancyComment) => { const lotOccupancyComment = lotOccupancyComments.find((currentLotOccupancyComment) => {
return currentLotOccupancyComment.lotOccupancyCommentId === lotOccupancyCommentId; return (currentLotOccupancyComment.lotOccupancyCommentId ===
lotOccupancyCommentId);
}); });
let editFormElement; let editFormElement;
let editCloseModalFunction; let editCloseModalFunction;
const editComment = (submitEvent) => { const editComment = (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doUpdateLotOccupancyComment", editFormElement, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doUpdateLotOccupancyComment', editFormElement, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
lotOccupancyComments = responseJSON.lotOccupancyComments; lotOccupancyComments = responseJSON.lotOccupancyComments;
editCloseModalFunction(); editCloseModalFunction();
@ -20,20 +22,20 @@ const openEditLotOccupancyComment = (clickEvent) => {
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Updating Comment", title: 'Error Updating Comment',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
cityssm.openHtmlModal("lotOccupancy-editComment", { cityssm.openHtmlModal('lotOccupancy-editComment', {
onshow: (modalElement) => { onshow: (modalElement) => {
los.populateAliases(modalElement); los.populateAliases(modalElement);
modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyId").value = lotOccupancyId; modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyId').value = lotOccupancyId;
modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentId").value = lotOccupancyCommentId.toString(); modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyCommentId').value = lotOccupancyCommentId.toString();
modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyComment").value = lotOccupancyComment.lotOccupancyComment; modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyComment').value = lotOccupancyComment.lotOccupancyComment;
const lotOccupancyCommentDateStringElement = modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentDateString"); const lotOccupancyCommentDateStringElement = modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyCommentDateString');
lotOccupancyCommentDateStringElement.value = lotOccupancyCommentDateStringElement.value =
lotOccupancyComment.lotOccupancyCommentDateString; lotOccupancyComment.lotOccupancyCommentDateString;
const currentDateString = cityssm.dateToString(new Date()); const currentDateString = cityssm.dateToString(new Date());
@ -41,15 +43,14 @@ const openEditLotOccupancyComment = (clickEvent) => {
lotOccupancyComment.lotOccupancyCommentDateString <= currentDateString lotOccupancyComment.lotOccupancyCommentDateString <= currentDateString
? currentDateString ? currentDateString
: lotOccupancyComment.lotOccupancyCommentDateString; : lotOccupancyComment.lotOccupancyCommentDateString;
modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentTimeString").value = lotOccupancyComment.lotOccupancyCommentTimeString; modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyCommentTimeString').value = lotOccupancyComment.lotOccupancyCommentTimeString;
}, },
onshown: (modalElement, closeModalFunction) => { onshown: (modalElement, closeModalFunction) => {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
los.initializeDatePickers(modalElement); los.initializeDatePickers(modalElement);
// los.initializeTimePickers(modalElement); modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyComment').focus();
modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyComment").focus(); editFormElement = modalElement.querySelector('form');
editFormElement = modalElement.querySelector("form"); editFormElement.addEventListener('submit', editComment);
editFormElement.addEventListener("submit", editComment);
editCloseModalFunction = closeModalFunction; editCloseModalFunction = closeModalFunction;
}, },
onremoved: () => { onremoved: () => {
@ -58,9 +59,10 @@ const openEditLotOccupancyComment = (clickEvent) => {
}); });
}; };
const deleteLotOccupancyComment = (clickEvent) => { const deleteLotOccupancyComment = (clickEvent) => {
const lotOccupancyCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.lotOccupancyCommentId, 10); const lotOccupancyCommentId = Number.parseInt(clickEvent.currentTarget.closest('tr').dataset
.lotOccupancyCommentId, 10);
const doDelete = () => { const doDelete = () => {
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyComment", { cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyComment', {
lotOccupancyId, lotOccupancyId,
lotOccupancyCommentId lotOccupancyCommentId
}, (responseJSON) => { }, (responseJSON) => {
@ -70,87 +72,87 @@ const deleteLotOccupancyComment = (clickEvent) => {
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Removing Comment", title: 'Error Removing Comment',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
bulmaJS.confirm({ bulmaJS.confirm({
title: "Remove Comment?", title: 'Remove Comment?',
message: "Are you sure you want to remove this comment?", message: 'Are you sure you want to remove this comment?',
okButton: { okButton: {
text: "Yes, Remove Comment", text: 'Yes, Remove Comment',
callbackFunction: doDelete callbackFunction: doDelete
}, },
contextualColorName: "warning" contextualColorName: 'warning'
}); });
}; };
const renderLotOccupancyComments = () => { const renderLotOccupancyComments = () => {
const containerElement = document.querySelector("#container--lotOccupancyComments"); const containerElement = document.querySelector('#container--lotOccupancyComments');
if (lotOccupancyComments.length === 0) { if (lotOccupancyComments.length === 0) {
containerElement.innerHTML = containerElement.innerHTML =
'<div class="message is-info">' + '<div class="message is-info">' +
'<p class="message-body">There are no comments associated with this record.</p>' + '<p class="message-body">There are no comments associated with this record.</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 = tableElement.innerHTML =
"<thead><tr>" + '<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 lotOccupancyComment of lotOccupancyComments) { for (const lotOccupancyComment of lotOccupancyComments) {
const tableRowElement = document.createElement("tr"); const tableRowElement = document.createElement('tr');
tableRowElement.dataset.lotOccupancyCommentId = tableRowElement.dataset.lotOccupancyCommentId =
lotOccupancyComment.lotOccupancyCommentId.toString(); lotOccupancyComment.lotOccupancyCommentId.toString();
tableRowElement.innerHTML = tableRowElement.innerHTML =
"<td>" + '<td>' +
cityssm.escapeHTML(lotOccupancyComment.recordCreate_userName || "") + cityssm.escapeHTML(lotOccupancyComment.recordCreate_userName || '') +
"</td>" + '</td>' +
"<td>" + '<td>' +
lotOccupancyComment.lotOccupancyCommentDateString + lotOccupancyComment.lotOccupancyCommentDateString +
(lotOccupancyComment.lotOccupancyCommentTime === 0 (lotOccupancyComment.lotOccupancyCommentTime === 0
? "" ? ''
: " " + lotOccupancyComment.lotOccupancyCommentTimeString) + : ' ' + lotOccupancyComment.lotOccupancyCommentTimeString) +
"</td>" + '</td>' +
"<td>" + '<td>' +
cityssm.escapeHTML(lotOccupancyComment.lotOccupancyComment || "") + cityssm.escapeHTML(lotOccupancyComment.lotOccupancyComment || '') +
"</td>" + '</td>' +
('<td class="is-hidden-print">' + ('<td class="is-hidden-print">' +
'<div class="buttons are-small is-justify-content-end">' + '<div class="buttons are-small is-justify-content-end">' +
('<button class="button is-primary button--edit" type="button">' + ('<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 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 tableRowElement
.querySelector(".button--edit") .querySelector('.button--edit')
.addEventListener("click", openEditLotOccupancyComment); .addEventListener('click', openEditLotOccupancyComment);
tableRowElement tableRowElement
.querySelector(".button--delete") .querySelector('.button--delete')
.addEventListener("click", deleteLotOccupancyComment); .addEventListener('click', deleteLotOccupancyComment);
tableElement.querySelector("tbody").append(tableRowElement); tableElement.querySelector('tbody').append(tableRowElement);
} }
containerElement.innerHTML = ""; containerElement.innerHTML = '';
containerElement.append(tableElement); containerElement.append(tableElement);
}; };
document.querySelector("#button--addComment").addEventListener("click", () => { document.querySelector('#button--addComment').addEventListener('click', () => {
let addFormElement; let addFormElement;
let addCloseModalFunction; let addCloseModalFunction;
const addComment = (submitEvent) => { const addComment = (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doAddLotOccupancyComment", addFormElement, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doAddLotOccupancyComment', addFormElement, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
lotOccupancyComments = responseJSON.lotOccupancyComments; lotOccupancyComments = responseJSON.lotOccupancyComments;
addCloseModalFunction(); addCloseModalFunction();
@ -158,23 +160,23 @@ document.querySelector("#button--addComment").addEventListener("click", () => {
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Adding Comment", title: 'Error Adding Comment',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
cityssm.openHtmlModal("lotOccupancy-addComment", { cityssm.openHtmlModal('lotOccupancy-addComment', {
onshow: (modalElement) => { onshow: (modalElement) => {
los.populateAliases(modalElement); los.populateAliases(modalElement);
modalElement.querySelector("#lotOccupancyCommentAdd--lotOccupancyId").value = lotOccupancyId; modalElement.querySelector('#lotOccupancyCommentAdd--lotOccupancyId').value = lotOccupancyId;
}, },
onshown: (modalElement, closeModalFunction) => { onshown: (modalElement, closeModalFunction) => {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
modalElement.querySelector("#lotOccupancyCommentAdd--lotOccupancyComment").focus(); modalElement.querySelector('#lotOccupancyCommentAdd--lotOccupancyComment').focus();
addFormElement = modalElement.querySelector("form"); addFormElement = modalElement.querySelector('form');
addFormElement.addEventListener("submit", addComment); addFormElement.addEventListener('submit', addComment);
addCloseModalFunction = closeModalFunction; addCloseModalFunction = closeModalFunction;
}, },
onremoved: () => { onremoved: () => {

View File

@ -1,295 +1,303 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
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 { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
import type { BulmaJS } from "@cityssm/bulma-js/types"; import type { BulmaJS } from '@cityssm/bulma-js/types'
declare const cityssm: cityssmGlobal; declare const cityssm: cityssmGlobal
declare const bulmaJS: BulmaJS; declare const bulmaJS: BulmaJS
declare const los: globalTypes.LOS; declare const los: globalTypes.LOS
declare const lotOccupancyId: string; declare const lotOccupancyId: string
let lotOccupancyComments: recordTypes.LotOccupancyComment[] = exports.lotOccupancyComments; let lotOccupancyComments: recordTypes.LotOccupancyComment[] =
delete exports.lotOccupancyComments; exports.lotOccupancyComments
delete exports.lotOccupancyComments
const openEditLotOccupancyComment = (clickEvent: Event) => { const openEditLotOccupancyComment = (clickEvent: Event) => {
const lotOccupancyCommentId = Number.parseInt( const lotOccupancyCommentId = Number.parseInt(
(clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.lotOccupancyCommentId!, (clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset
10 .lotOccupancyCommentId!,
); 10
)
const lotOccupancyComment = lotOccupancyComments.find((currentLotOccupancyComment) => { const lotOccupancyComment = lotOccupancyComments.find(
return currentLotOccupancyComment.lotOccupancyCommentId === lotOccupancyCommentId; (currentLotOccupancyComment) => {
})!; return (
currentLotOccupancyComment.lotOccupancyCommentId ===
lotOccupancyCommentId
)
}
)!
let editFormElement: HTMLFormElement; let editFormElement: HTMLFormElement
let editCloseModalFunction: () => void; let editCloseModalFunction: () => void
const editComment = (submitEvent: SubmitEvent) => { const editComment = (submitEvent: SubmitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault()
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + "/lotOccupancies/doUpdateLotOccupancyComment", los.urlPrefix + '/lotOccupancies/doUpdateLotOccupancyComment',
editFormElement, editFormElement,
(responseJSON: { (responseJSON: {
success: boolean; success: boolean
errorMessage?: string; errorMessage?: string
lotOccupancyComments?: recordTypes.LotOccupancyComment[]; lotOccupancyComments?: recordTypes.LotOccupancyComment[]
}) => { }) => {
if (responseJSON.success) { if (responseJSON.success) {
lotOccupancyComments = responseJSON.lotOccupancyComments!; lotOccupancyComments = responseJSON.lotOccupancyComments!
editCloseModalFunction(); editCloseModalFunction()
renderLotOccupancyComments(); renderLotOccupancyComments()
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Updating Comment", title: 'Error Updating Comment',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); })
}
}
);
};
cityssm.openHtmlModal("lotOccupancy-editComment", {
onshow: (modalElement) => {
los.populateAliases(modalElement);
(
modalElement.querySelector(
"#lotOccupancyCommentEdit--lotOccupancyId"
) as HTMLInputElement
).value = lotOccupancyId;
(
modalElement.querySelector(
"#lotOccupancyCommentEdit--lotOccupancyCommentId"
) as HTMLInputElement
).value = lotOccupancyCommentId.toString();
(
modalElement.querySelector(
"#lotOccupancyCommentEdit--lotOccupancyComment"
) as HTMLInputElement
).value = lotOccupancyComment.lotOccupancyComment!;
const lotOccupancyCommentDateStringElement = modalElement.querySelector(
"#lotOccupancyCommentEdit--lotOccupancyCommentDateString"
) as HTMLInputElement;
lotOccupancyCommentDateStringElement.value =
lotOccupancyComment.lotOccupancyCommentDateString!;
const currentDateString = cityssm.dateToString(new Date());
lotOccupancyCommentDateStringElement.max =
lotOccupancyComment.lotOccupancyCommentDateString! <= currentDateString
? currentDateString
: lotOccupancyComment.lotOccupancyCommentDateString!;
(
modalElement.querySelector(
"#lotOccupancyCommentEdit--lotOccupancyCommentTimeString"
) as HTMLInputElement
).value = lotOccupancyComment.lotOccupancyCommentTimeString!;
},
onshown: (modalElement, closeModalFunction) => {
bulmaJS.toggleHtmlClipped();
los.initializeDatePickers(modalElement);
// los.initializeTimePickers(modalElement);
(
modalElement.querySelector(
"#lotOccupancyCommentEdit--lotOccupancyComment"
) as HTMLTextAreaElement
).focus();
editFormElement = modalElement.querySelector("form")!;
editFormElement.addEventListener("submit", editComment);
editCloseModalFunction = closeModalFunction;
},
onremoved: () => {
bulmaJS.toggleHtmlClipped();
} }
}); }
}; )
}
cityssm.openHtmlModal('lotOccupancy-editComment', {
onshow: (modalElement) => {
los.populateAliases(modalElement)
;(
modalElement.querySelector(
'#lotOccupancyCommentEdit--lotOccupancyId'
) as HTMLInputElement
).value = lotOccupancyId
;(
modalElement.querySelector(
'#lotOccupancyCommentEdit--lotOccupancyCommentId'
) as HTMLInputElement
).value = lotOccupancyCommentId.toString()
;(
modalElement.querySelector(
'#lotOccupancyCommentEdit--lotOccupancyComment'
) as HTMLInputElement
).value = lotOccupancyComment.lotOccupancyComment!
const lotOccupancyCommentDateStringElement = modalElement.querySelector(
'#lotOccupancyCommentEdit--lotOccupancyCommentDateString'
) as HTMLInputElement
lotOccupancyCommentDateStringElement.value =
lotOccupancyComment.lotOccupancyCommentDateString!
const currentDateString = cityssm.dateToString(new Date())
lotOccupancyCommentDateStringElement.max =
lotOccupancyComment.lotOccupancyCommentDateString! <= currentDateString
? currentDateString
: lotOccupancyComment.lotOccupancyCommentDateString!
;(
modalElement.querySelector(
'#lotOccupancyCommentEdit--lotOccupancyCommentTimeString'
) as HTMLInputElement
).value = lotOccupancyComment.lotOccupancyCommentTimeString!
},
onshown: (modalElement, closeModalFunction) => {
bulmaJS.toggleHtmlClipped()
los.initializeDatePickers(modalElement)
// los.initializeTimePickers(modalElement);
;(
modalElement.querySelector(
'#lotOccupancyCommentEdit--lotOccupancyComment'
) as HTMLTextAreaElement
).focus()
editFormElement = modalElement.querySelector('form')!
editFormElement.addEventListener('submit', editComment)
editCloseModalFunction = closeModalFunction
},
onremoved: () => {
bulmaJS.toggleHtmlClipped()
}
})
}
const deleteLotOccupancyComment = (clickEvent: Event) => { const deleteLotOccupancyComment = (clickEvent: Event) => {
const lotOccupancyCommentId = Number.parseInt( const lotOccupancyCommentId = Number.parseInt(
(clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.lotOccupancyCommentId!, (clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset
10 .lotOccupancyCommentId!,
); 10
)
const doDelete = () => { const doDelete = () => {
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyComment", los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyComment',
{ {
lotOccupancyId, lotOccupancyId,
lotOccupancyCommentId lotOccupancyCommentId
}, },
(responseJSON: { (responseJSON: {
success: boolean; success: boolean
errorMessage?: string; errorMessage?: string
lotOccupancyComments: recordTypes.LotOccupancyComment[]; lotOccupancyComments: recordTypes.LotOccupancyComment[]
}) => { }) => {
if (responseJSON.success) { if (responseJSON.success) {
lotOccupancyComments = responseJSON.lotOccupancyComments; lotOccupancyComments = responseJSON.lotOccupancyComments
renderLotOccupancyComments(); renderLotOccupancyComments()
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Removing Comment", title: 'Error Removing Comment',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); })
} }
} }
); )
}; }
bulmaJS.confirm({ bulmaJS.confirm({
title: "Remove Comment?", title: 'Remove Comment?',
message: "Are you sure you want to remove this comment?", message: 'Are you sure you want to remove this comment?',
okButton: { okButton: {
text: "Yes, Remove Comment", text: 'Yes, Remove Comment',
callbackFunction: doDelete callbackFunction: doDelete
}, },
contextualColorName: "warning" contextualColorName: 'warning'
}); })
}; }
const renderLotOccupancyComments = () => { const renderLotOccupancyComments = () => {
const containerElement = document.querySelector( const containerElement = document.querySelector(
"#container--lotOccupancyComments" '#container--lotOccupancyComments'
) as HTMLElement; ) as HTMLElement
if (lotOccupancyComments.length === 0) { if (lotOccupancyComments.length === 0) {
containerElement.innerHTML = containerElement.innerHTML =
'<div class="message is-info">' + '<div class="message is-info">' +
'<p class="message-body">There are no comments associated with this record.</p>' + '<p class="message-body">There are no comments associated with this record.</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 = tableElement.innerHTML =
"<thead><tr>" + '<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 lotOccupancyComment of lotOccupancyComments) { for (const lotOccupancyComment of lotOccupancyComments) {
const tableRowElement = document.createElement("tr"); const tableRowElement = document.createElement('tr')
tableRowElement.dataset.lotOccupancyCommentId = tableRowElement.dataset.lotOccupancyCommentId =
lotOccupancyComment.lotOccupancyCommentId!.toString(); lotOccupancyComment.lotOccupancyCommentId!.toString()
tableRowElement.innerHTML = tableRowElement.innerHTML =
"<td>" + '<td>' +
cityssm.escapeHTML(lotOccupancyComment.recordCreate_userName || "") + cityssm.escapeHTML(lotOccupancyComment.recordCreate_userName || '') +
"</td>" + '</td>' +
"<td>" + '<td>' +
lotOccupancyComment.lotOccupancyCommentDateString + lotOccupancyComment.lotOccupancyCommentDateString +
(lotOccupancyComment.lotOccupancyCommentTime === 0 (lotOccupancyComment.lotOccupancyCommentTime === 0
? "" ? ''
: " " + lotOccupancyComment.lotOccupancyCommentTimeString) + : ' ' + lotOccupancyComment.lotOccupancyCommentTimeString) +
"</td>" + '</td>' +
"<td>" + '<td>' +
cityssm.escapeHTML(lotOccupancyComment.lotOccupancyComment || "") + cityssm.escapeHTML(lotOccupancyComment.lotOccupancyComment || '') +
"</td>" + '</td>' +
('<td class="is-hidden-print">' + ('<td class="is-hidden-print">' +
'<div class="buttons are-small is-justify-content-end">' + '<div class="buttons are-small is-justify-content-end">' +
('<button class="button is-primary button--edit" type="button">' + ('<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 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 tableRowElement
.querySelector(".button--edit")! .querySelector('.button--edit')!
.addEventListener("click", openEditLotOccupancyComment); .addEventListener('click', openEditLotOccupancyComment)
tableRowElement tableRowElement
.querySelector(".button--delete")! .querySelector('.button--delete')!
.addEventListener("click", deleteLotOccupancyComment); .addEventListener('click', deleteLotOccupancyComment)
tableElement.querySelector("tbody")!.append(tableRowElement); tableElement.querySelector('tbody')!.append(tableRowElement)
} }
containerElement.innerHTML = ""; containerElement.innerHTML = ''
containerElement.append(tableElement); containerElement.append(tableElement)
}; }
document.querySelector("#button--addComment")!.addEventListener("click", () => { document.querySelector('#button--addComment')!.addEventListener('click', () => {
let addFormElement: HTMLFormElement; let addFormElement: HTMLFormElement
let addCloseModalFunction: () => void; let addCloseModalFunction: () => void
const addComment = (submitEvent: SubmitEvent) => { const addComment = (submitEvent: SubmitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault()
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + "/lotOccupancies/doAddLotOccupancyComment", los.urlPrefix + '/lotOccupancies/doAddLotOccupancyComment',
addFormElement, addFormElement,
(responseJSON: { (responseJSON: {
success: boolean; success: boolean
errorMessage?: string; errorMessage?: string
lotOccupancyComments?: recordTypes.LotOccupancyComment[]; lotOccupancyComments?: recordTypes.LotOccupancyComment[]
}) => { }) => {
if (responseJSON.success) { if (responseJSON.success) {
lotOccupancyComments = responseJSON.lotOccupancyComments!; lotOccupancyComments = responseJSON.lotOccupancyComments!
addCloseModalFunction(); addCloseModalFunction()
renderLotOccupancyComments(); renderLotOccupancyComments()
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Adding Comment", title: 'Error Adding Comment',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); })
}
}
);
};
cityssm.openHtmlModal("lotOccupancy-addComment", {
onshow: (modalElement) => {
los.populateAliases(modalElement);
(
modalElement.querySelector(
"#lotOccupancyCommentAdd--lotOccupancyId"
) as HTMLInputElement
).value = lotOccupancyId;
},
onshown: (modalElement, closeModalFunction) => {
bulmaJS.toggleHtmlClipped();
(
modalElement.querySelector(
"#lotOccupancyCommentAdd--lotOccupancyComment"
) as HTMLTextAreaElement
).focus();
addFormElement = modalElement.querySelector("form")!;
addFormElement.addEventListener("submit", addComment);
addCloseModalFunction = closeModalFunction;
},
onremoved: () => {
bulmaJS.toggleHtmlClipped();
} }
}); }
}); )
}
renderLotOccupancyComments(); cityssm.openHtmlModal('lotOccupancy-addComment', {
onshow: (modalElement) => {
los.populateAliases(modalElement)
;(
modalElement.querySelector(
'#lotOccupancyCommentAdd--lotOccupancyId'
) as HTMLInputElement
).value = lotOccupancyId
},
onshown: (modalElement, closeModalFunction) => {
bulmaJS.toggleHtmlClipped()
;(
modalElement.querySelector(
'#lotOccupancyCommentAdd--lotOccupancyComment'
) as HTMLTextAreaElement
).focus()
addFormElement = modalElement.querySelector('form')!
addFormElement.addEventListener('submit', addComment)
addCloseModalFunction = closeModalFunction
},
onremoved: () => {
bulmaJS.toggleHtmlClipped()
}
})
})
renderLotOccupancyComments()

View File

@ -3,19 +3,20 @@
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
let lotOccupancyFees = exports.lotOccupancyFees; let lotOccupancyFees = exports.lotOccupancyFees;
delete exports.lotOccupancyFees; delete exports.lotOccupancyFees;
const lotOccupancyFeesContainerElement = document.querySelector("#container--lotOccupancyFees"); const lotOccupancyFeesContainerElement = document.querySelector('#container--lotOccupancyFees');
const getFeeGrandTotal = () => { const getFeeGrandTotal = () => {
let feeGrandTotal = 0; let feeGrandTotal = 0;
for (const lotOccupancyFee of lotOccupancyFees) { for (const lotOccupancyFee of lotOccupancyFees) {
feeGrandTotal += feeGrandTotal +=
(lotOccupancyFee.feeAmount + lotOccupancyFee.taxAmount) * lotOccupancyFee.quantity; (lotOccupancyFee.feeAmount + lotOccupancyFee.taxAmount) *
lotOccupancyFee.quantity;
} }
return feeGrandTotal; return feeGrandTotal;
}; };
const deleteLotOccupancyFee = (clickEvent) => { const deleteLotOccupancyFee = (clickEvent) => {
const feeId = clickEvent.currentTarget.closest(".container--lotOccupancyFee").dataset.feeId; const feeId = clickEvent.currentTarget.closest('.container--lotOccupancyFee').dataset.feeId;
const doDelete = () => { const doDelete = () => {
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyFee", { cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyFee', {
lotOccupancyId, lotOccupancyId,
feeId feeId
}, (responseJSON) => { }, (responseJSON) => {
@ -25,19 +26,19 @@ const deleteLotOccupancyFee = (clickEvent) => {
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Deleting Fee", title: 'Error Deleting Fee',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
bulmaJS.confirm({ bulmaJS.confirm({
title: "Delete Fee", title: 'Delete Fee',
message: "Are you sure you want to delete this fee?", message: 'Are you sure you want to delete this fee?',
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: "Yes, Delete Fee", text: 'Yes, Delete Fee',
callbackFunction: doDelete callbackFunction: doDelete
} }
}); });
@ -47,74 +48,81 @@ const renderLotOccupancyFees = () => {
lotOccupancyFeesContainerElement.innerHTML = lotOccupancyFeesContainerElement.innerHTML =
'<div class="message is-info">' + '<div class="message is-info">' +
'<p class="message-body">There are no fees associated with this record.</p>' + '<p class="message-body">There are no fees associated with this record.</p>' +
"</div>"; '</div>';
renderLotOccupancyTransactions(); renderLotOccupancyTransactions();
return; return;
} }
lotOccupancyFeesContainerElement.innerHTML = lotOccupancyFeesContainerElement.innerHTML =
'<table class="table is-fullwidth is-striped is-hoverable">' + '<table class="table is-fullwidth is-striped is-hoverable">' +
("<thead><tr>" + ('<thead><tr>' +
"<th>Fee</th>" + '<th>Fee</th>' +
'<th><span class="is-sr-only">Unit Cost</span></th>' + '<th><span class="is-sr-only">Unit Cost</span></th>' +
'<th class="has-width-1"><span class="is-sr-only">&times;</span></th>' + '<th class="has-width-1"><span class="is-sr-only">&times;</span></th>' +
'<th class="has-width-1"><span class="is-sr-only">Quantity</span></th>' + '<th class="has-width-1"><span class="is-sr-only">Quantity</span></th>' +
'<th class="has-width-1"><span class="is-sr-only">equals</span></th>' + '<th class="has-width-1"><span class="is-sr-only">equals</span></th>' +
'<th class="has-width-1 has-text-right">Total</th>' + '<th class="has-width-1 has-text-right">Total</th>' +
'<th class="has-width-1 is-hidden-print"><span class="is-sr-only">Options</span></th>' + '<th class="has-width-1 is-hidden-print"><span class="is-sr-only">Options</span></th>' +
"</tr></thead>") + '</tr></thead>') +
"<tbody></tbody>" + '<tbody></tbody>' +
("<tfoot>" + ('<tfoot>' +
'<tr><th colspan="5">Subtotal</th><td class="has-text-weight-bold has-text-right" id="lotOccupancyFees--feeAmountTotal"></td><td class="is-hidden-print"></td></tr>' + '<tr><th colspan="5">Subtotal</th><td class="has-text-weight-bold has-text-right" id="lotOccupancyFees--feeAmountTotal"></td><td class="is-hidden-print"></td></tr>' +
'<tr><th colspan="5">Tax</th><td class="has-text-right" id="lotOccupancyFees--taxAmountTotal"></td><td class="is-hidden-print"></td></tr>' + '<tr><th colspan="5">Tax</th><td class="has-text-right" id="lotOccupancyFees--taxAmountTotal"></td><td class="is-hidden-print"></td></tr>' +
'<tr><th colspan="5">Grand Total</th><td class="has-text-weight-bold has-text-right" id="lotOccupancyFees--grandTotal"></td><td class="is-hidden-print"></td></tr>' + '<tr><th colspan="5">Grand Total</th><td class="has-text-weight-bold has-text-right" id="lotOccupancyFees--grandTotal"></td><td class="is-hidden-print"></td></tr>' +
"</tfoot>") + '</tfoot>') +
"</table>"; '</table>';
let feeAmountTotal = 0; let feeAmountTotal = 0;
let taxAmountTotal = 0; let taxAmountTotal = 0;
for (const lotOccupancyFee of lotOccupancyFees) { for (const lotOccupancyFee of lotOccupancyFees) {
const tableRowElement = document.createElement("tr"); const tableRowElement = document.createElement('tr');
tableRowElement.className = "container--lotOccupancyFee"; tableRowElement.className = 'container--lotOccupancyFee';
tableRowElement.dataset.feeId = lotOccupancyFee.feeId.toString(); tableRowElement.dataset.feeId = lotOccupancyFee.feeId.toString();
tableRowElement.dataset.includeQuantity = lotOccupancyFee.includeQuantity ? "1" : "0"; tableRowElement.dataset.includeQuantity = lotOccupancyFee.includeQuantity
? '1'
: '0';
tableRowElement.innerHTML = tableRowElement.innerHTML =
'<td colspan="' + '<td colspan="' +
(lotOccupancyFee.quantity === 1 ? "5" : "1") + (lotOccupancyFee.quantity === 1 ? '5' : '1') +
'">' + '">' +
cityssm.escapeHTML(lotOccupancyFee.feeName || "") + cityssm.escapeHTML(lotOccupancyFee.feeName || '') +
"</td>" + '</td>' +
(lotOccupancyFee.quantity === 1 (lotOccupancyFee.quantity === 1
? "" ? ''
: '<td class="has-text-right">$' + : '<td class="has-text-right">$' +
lotOccupancyFee.feeAmount.toFixed(2) + lotOccupancyFee.feeAmount.toFixed(2) +
"</td>" + '</td>' +
"<td>&times;</td>" + '<td>&times;</td>' +
'<td class="has-text-right">' + '<td class="has-text-right">' +
lotOccupancyFee.quantity + lotOccupancyFee.quantity +
"</td>" + '</td>' +
"<td>=</td>") + '<td>=</td>') +
'<td class="has-text-right">$' + '<td class="has-text-right">$' +
(lotOccupancyFee.feeAmount * lotOccupancyFee.quantity).toFixed(2) + (lotOccupancyFee.feeAmount * lotOccupancyFee.quantity).toFixed(2) +
"</td>" + '</td>' +
('<td class="is-hidden-print">' + ('<td class="is-hidden-print">' +
'<button class="button is-small is-danger is-light" data-tooltip="Delete Fee" type="button">' + '<button class="button is-small is-danger is-light" data-tooltip="Delete Fee" type="button">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' + '<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" + '</button>' +
"</td>"); '</td>');
tableRowElement.querySelector("button").addEventListener("click", deleteLotOccupancyFee); tableRowElement
lotOccupancyFeesContainerElement.querySelector("tbody").append(tableRowElement); .querySelector('button')
.addEventListener('click', deleteLotOccupancyFee);
lotOccupancyFeesContainerElement
.querySelector('tbody')
.append(tableRowElement);
feeAmountTotal += lotOccupancyFee.feeAmount * lotOccupancyFee.quantity; feeAmountTotal += lotOccupancyFee.feeAmount * lotOccupancyFee.quantity;
taxAmountTotal += lotOccupancyFee.taxAmount * lotOccupancyFee.quantity; taxAmountTotal += lotOccupancyFee.taxAmount * lotOccupancyFee.quantity;
} }
lotOccupancyFeesContainerElement.querySelector("#lotOccupancyFees--feeAmountTotal").textContent = "$" + feeAmountTotal.toFixed(2); ;
lotOccupancyFeesContainerElement.querySelector("#lotOccupancyFees--taxAmountTotal").textContent = "$" + taxAmountTotal.toFixed(2); lotOccupancyFeesContainerElement.querySelector('#lotOccupancyFees--feeAmountTotal').textContent = '$' + feeAmountTotal.toFixed(2);
lotOccupancyFeesContainerElement.querySelector("#lotOccupancyFees--grandTotal").textContent = "$" + (feeAmountTotal + taxAmountTotal).toFixed(2); lotOccupancyFeesContainerElement.querySelector('#lotOccupancyFees--taxAmountTotal').textContent = '$' + taxAmountTotal.toFixed(2);
lotOccupancyFeesContainerElement.querySelector('#lotOccupancyFees--grandTotal').textContent = '$' + (feeAmountTotal + taxAmountTotal).toFixed(2);
renderLotOccupancyTransactions(); renderLotOccupancyTransactions();
}; };
document.querySelector("#button--addFee").addEventListener("click", () => { document.querySelector('#button--addFee').addEventListener('click', () => {
if (hasUnsavedChanges) { if (hasUnsavedChanges) {
bulmaJS.alert({ bulmaJS.alert({
message: "Please save all unsaved changes before adding fees.", message: 'Please save all unsaved changes before adding fees.',
contextualColorName: "warning" contextualColorName: 'warning'
}); });
return; return;
} }
@ -122,7 +130,7 @@ document.querySelector("#button--addFee").addEventListener("click", () => {
let feeFilterElement; let feeFilterElement;
let feeFilterResultsElement; let feeFilterResultsElement;
const doAddFee = (feeId, quantity = 1) => { const doAddFee = (feeId, quantity = 1) => {
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doAddLotOccupancyFee", { cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doAddLotOccupancyFee', {
lotOccupancyId, lotOccupancyId,
feeId, feeId,
quantity quantity
@ -134,9 +142,9 @@ document.querySelector("#button--addFee").addEventListener("click", () => {
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Adding Fee", title: 'Error Adding Fee',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
@ -149,21 +157,24 @@ document.querySelector("#button--addFee").addEventListener("click", () => {
doAddFee(fee.feeId, quantityElement.value); doAddFee(fee.feeId, quantityElement.value);
quantityCloseModalFunction(); quantityCloseModalFunction();
}; };
cityssm.openHtmlModal("lotOccupancy-setFeeQuantity", { cityssm.openHtmlModal('lotOccupancy-setFeeQuantity', {
onshow: (modalElement) => { onshow: (modalElement) => {
modalElement.querySelector("#lotOccupancyFeeQuantity--quantityUnit").textContent = fee.quantityUnit; ;
modalElement.querySelector('#lotOccupancyFeeQuantity--quantityUnit').textContent = fee.quantityUnit;
}, },
onshown: (modalElement, closeModalFunction) => { onshown: (modalElement, closeModalFunction) => {
quantityCloseModalFunction = closeModalFunction; quantityCloseModalFunction = closeModalFunction;
quantityElement = modalElement.querySelector("#lotOccupancyFeeQuantity--quantity"); quantityElement = modalElement.querySelector('#lotOccupancyFeeQuantity--quantity');
modalElement.querySelector("form").addEventListener("submit", doSetQuantity); modalElement
.querySelector('form')
.addEventListener('submit', doSetQuantity);
} }
}); });
}; };
const tryAddFee = (clickEvent) => { const tryAddFee = (clickEvent) => {
clickEvent.preventDefault(); clickEvent.preventDefault();
const feeId = Number.parseInt(clickEvent.currentTarget.dataset.feeId, 10); const feeId = Number.parseInt(clickEvent.currentTarget.dataset.feeId, 10);
const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId, 10); const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest('.container--feeCategory').dataset.feeCategoryId, 10);
const feeCategory = feeCategories.find((currentFeeCategory) => { const feeCategory = feeCategories.find((currentFeeCategory) => {
return currentFeeCategory.feeCategoryId === feeCategoryId; return currentFeeCategory.feeCategoryId === feeCategoryId;
}); });
@ -178,16 +189,20 @@ document.querySelector("#button--addFee").addEventListener("click", () => {
} }
}; };
const filterFees = () => { const filterFees = () => {
const filterStringPieces = feeFilterElement.value.trim().toLowerCase().split(" "); const filterStringPieces = feeFilterElement.value
feeFilterResultsElement.innerHTML = ""; .trim()
.toLowerCase()
.split(' ');
feeFilterResultsElement.innerHTML = '';
for (const feeCategory of feeCategories) { for (const feeCategory of feeCategories) {
const categoryContainerElement = document.createElement("div"); const categoryContainerElement = document.createElement('div');
categoryContainerElement.className = "container--feeCategory"; categoryContainerElement.className = 'container--feeCategory';
categoryContainerElement.dataset.feeCategoryId = feeCategory.feeCategoryId.toString(); categoryContainerElement.dataset.feeCategoryId =
feeCategory.feeCategoryId.toString();
categoryContainerElement.innerHTML = categoryContainerElement.innerHTML =
'<h4 class="title is-5 mt-2">' + '<h4 class="title is-5 mt-2">' +
cityssm.escapeHTML(feeCategory.feeCategory || "") + cityssm.escapeHTML(feeCategory.feeCategory || '') +
"</h4>" + '</h4>' +
'<div class="panel mb-5"></div>'; '<div class="panel mb-5"></div>';
let hasFees = false; let hasFees = false;
for (const fee of feeCategory.fees) { for (const fee of feeCategory.fees) {
@ -207,35 +222,37 @@ document.querySelector("#button--addFee").addEventListener("click", () => {
continue; continue;
} }
hasFees = true; hasFees = true;
const panelBlockElement = document.createElement("a"); const panelBlockElement = document.createElement('a');
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.href = "#"; panelBlockElement.href = '#';
panelBlockElement.innerHTML = panelBlockElement.innerHTML =
"<strong>" + '<strong>' +
cityssm.escapeHTML(fee.feeName || "") + cityssm.escapeHTML(fee.feeName || '') +
"</strong><br />" + '</strong><br />' +
"<small>" + '<small>' +
cityssm.escapeHTML(fee.feeDescription || "").replace(/\n/g, "<br />") + cityssm
"</small>"; .escapeHTML(fee.feeDescription || '')
panelBlockElement.addEventListener("click", tryAddFee); .replace(/\n/g, '<br />') +
categoryContainerElement.querySelector(".panel").append(panelBlockElement); '</small>';
panelBlockElement.addEventListener('click', tryAddFee);
categoryContainerElement.querySelector('.panel').append(panelBlockElement);
} }
if (hasFees) { if (hasFees) {
feeFilterResultsElement.append(categoryContainerElement); feeFilterResultsElement.append(categoryContainerElement);
} }
} }
}; };
cityssm.openHtmlModal("lotOccupancy-addFee", { cityssm.openHtmlModal('lotOccupancy-addFee', {
onshow: (modalElement) => { onshow: (modalElement) => {
feeFilterElement = modalElement.querySelector("#feeSelect--feeName"); feeFilterElement = modalElement.querySelector('#feeSelect--feeName');
feeFilterResultsElement = modalElement.querySelector("#resultsContainer--feeSelect"); feeFilterResultsElement = modalElement.querySelector('#resultsContainer--feeSelect');
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doGetFees", { cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doGetFees', {
lotOccupancyId lotOccupancyId
}, (responseJSON) => { }, (responseJSON) => {
feeCategories = responseJSON.feeCategories; feeCategories = responseJSON.feeCategories;
feeFilterElement.disabled = false; feeFilterElement.disabled = false;
feeFilterElement.addEventListener("keyup", filterFees); feeFilterElement.addEventListener('keyup', filterFees);
feeFilterElement.focus(); feeFilterElement.focus();
filterFees(); filterFees();
}); });
@ -253,7 +270,7 @@ document.querySelector("#button--addFee").addEventListener("click", () => {
}); });
let lotOccupancyTransactions = exports.lotOccupancyTransactions; let lotOccupancyTransactions = exports.lotOccupancyTransactions;
delete exports.lotOccupancyTransactions; delete exports.lotOccupancyTransactions;
const lotOccupancyTransactionsContainerElement = document.querySelector("#container--lotOccupancyTransactions"); const lotOccupancyTransactionsContainerElement = document.querySelector('#container--lotOccupancyTransactions');
const getTransactionGrandTotal = () => { const getTransactionGrandTotal = () => {
let transactionGrandTotal = 0; let transactionGrandTotal = 0;
for (const lotOccupancyTransaction of lotOccupancyTransactions) { for (const lotOccupancyTransaction of lotOccupancyTransactions) {
@ -262,9 +279,9 @@ const getTransactionGrandTotal = () => {
return transactionGrandTotal; return transactionGrandTotal;
}; };
const deleteLotOccupancyTransaction = (clickEvent) => { const deleteLotOccupancyTransaction = (clickEvent) => {
const transactionIndex = clickEvent.currentTarget.closest(".container--lotOccupancyTransaction").dataset.transactionIndex; const transactionIndex = clickEvent.currentTarget.closest('.container--lotOccupancyTransaction').dataset.transactionIndex;
const doDelete = () => { const doDelete = () => {
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyTransaction", { cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyTransaction', {
lotOccupancyId, lotOccupancyId,
transactionIndex transactionIndex
}, (responseJSON) => { }, (responseJSON) => {
@ -274,19 +291,19 @@ const deleteLotOccupancyTransaction = (clickEvent) => {
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Deleting Transaction", title: 'Error Deleting Transaction',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
bulmaJS.confirm({ bulmaJS.confirm({
title: "Delete Trasnaction", title: 'Delete Trasnaction',
message: "Are you sure you want to delete this transaction?", message: 'Are you sure you want to delete this transaction?',
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: "Yes, Delete Transaction", text: 'Yes, Delete Transaction',
callbackFunction: doDelete callbackFunction: doDelete
} }
}); });
@ -295,80 +312,85 @@ const renderLotOccupancyTransactions = () => {
if (lotOccupancyTransactions.length === 0) { if (lotOccupancyTransactions.length === 0) {
lotOccupancyTransactionsContainerElement.innerHTML = lotOccupancyTransactionsContainerElement.innerHTML =
'<div class="message ' + '<div class="message ' +
(lotOccupancyFees.length === 0 ? "is-info" : "is-warning") + (lotOccupancyFees.length === 0 ? 'is-info' : 'is-warning') +
'">' + '">' +
'<p class="message-body">There are no transactions associated with this record.</p>' + '<p class="message-body">There are no transactions associated with this record.</p>' +
"</div>"; '</div>';
return; return;
} }
lotOccupancyTransactionsContainerElement.innerHTML = lotOccupancyTransactionsContainerElement.innerHTML =
'<table class="table is-fullwidth is-striped is-hoverable">' + '<table class="table is-fullwidth is-striped is-hoverable">' +
"<thead><tr>" + '<thead><tr>' +
'<th class="has-width-1">Date</th>' + '<th class="has-width-1">Date</th>' +
"<th>" + '<th>' +
cityssm.escapeHTML(exports.aliases.externalReceiptNumber) + cityssm.escapeHTML(exports.aliases.externalReceiptNumber) +
"</th>" + '</th>' +
'<th class="has-text-right has-width-1">Amount</th>' + '<th class="has-text-right has-width-1">Amount</th>' +
'<th class="has-width-1 is-hidden-print"><span class="is-sr-only">Options</span></th>' + '<th class="has-width-1 is-hidden-print"><span class="is-sr-only">Options</span></th>' +
"</tr></thead>" + '</tr></thead>' +
"<tbody></tbody>" + '<tbody></tbody>' +
("<tfoot><tr>" + ('<tfoot><tr>' +
'<th colspan="2">Transaction Total</th>' + '<th colspan="2">Transaction Total</th>' +
'<td class="has-text-weight-bold has-text-right" id="lotOccupancyTransactions--grandTotal"></td>' + '<td class="has-text-weight-bold has-text-right" id="lotOccupancyTransactions--grandTotal"></td>' +
'<td class="is-hidden-print"></td>' + '<td class="is-hidden-print"></td>' +
"</tr></tfoot>") + '</tr></tfoot>') +
"</table>"; '</table>';
let transactionGrandTotal = 0; let transactionGrandTotal = 0;
for (const lotOccupancyTransaction of lotOccupancyTransactions) { for (const lotOccupancyTransaction of lotOccupancyTransactions) {
transactionGrandTotal += lotOccupancyTransaction.transactionAmount; transactionGrandTotal += lotOccupancyTransaction.transactionAmount;
const tableRowElement = document.createElement("tr"); const tableRowElement = document.createElement('tr');
tableRowElement.className = "container--lotOccupancyTransaction"; tableRowElement.className = 'container--lotOccupancyTransaction';
tableRowElement.dataset.transactionIndex = tableRowElement.dataset.transactionIndex =
lotOccupancyTransaction.transactionIndex.toString(); lotOccupancyTransaction.transactionIndex.toString();
tableRowElement.innerHTML = tableRowElement.innerHTML =
"<td>" + '<td>' +
lotOccupancyTransaction.transactionDateString + lotOccupancyTransaction.transactionDateString +
"</td>" + '</td>' +
("<td>" + ('<td>' +
cityssm.escapeHTML(lotOccupancyTransaction.externalReceiptNumber || "") + cityssm.escapeHTML(lotOccupancyTransaction.externalReceiptNumber || '') +
"<br />" + '<br />' +
"<small>" + '<small>' +
cityssm.escapeHTML(lotOccupancyTransaction.transactionNote || "") + cityssm.escapeHTML(lotOccupancyTransaction.transactionNote || '') +
"</small>" + '</small>' +
"</td>") + '</td>') +
('<td class="has-text-right">$' + ('<td class="has-text-right">$' +
lotOccupancyTransaction.transactionAmount.toFixed(2) + lotOccupancyTransaction.transactionAmount.toFixed(2) +
"</td>") + '</td>') +
('<td class="is-hidden-print">' + ('<td class="is-hidden-print">' +
'<button class="button is-small is-danger is-light" data-tooltip="Delete Transaction" type="button">' + '<button class="button is-small is-danger is-light" data-tooltip="Delete Transaction" type="button">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' + '<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" + '</button>' +
"</td>"); '</td>');
tableRowElement tableRowElement
.querySelector("button") .querySelector('button')
.addEventListener("click", deleteLotOccupancyTransaction); .addEventListener('click', deleteLotOccupancyTransaction);
lotOccupancyTransactionsContainerElement.querySelector("tbody").append(tableRowElement); lotOccupancyTransactionsContainerElement
.querySelector('tbody')
.append(tableRowElement);
} }
lotOccupancyTransactionsContainerElement.querySelector("#lotOccupancyTransactions--grandTotal").textContent = "$" + transactionGrandTotal.toFixed(2); ;
lotOccupancyTransactionsContainerElement.querySelector('#lotOccupancyTransactions--grandTotal').textContent = '$' + transactionGrandTotal.toFixed(2);
const feeGrandTotal = getFeeGrandTotal(); const feeGrandTotal = getFeeGrandTotal();
if (feeGrandTotal > transactionGrandTotal) { if (feeGrandTotal > transactionGrandTotal) {
lotOccupancyTransactionsContainerElement.insertAdjacentHTML("afterbegin", '<div class="message is-warning">' + lotOccupancyTransactionsContainerElement.insertAdjacentHTML('afterbegin', '<div class="message is-warning">' +
'<div class="message-body">' + '<div class="message-body">' +
'<div class="level">' + '<div class="level">' +
'<div class="level-left"><div class="level-item">Outstanding Balance</div></div>' + '<div class="level-left"><div class="level-item">Outstanding Balance</div></div>' +
'<div class="level-right"><div class="level-item">$' + '<div class="level-right"><div class="level-item">$' +
(feeGrandTotal - transactionGrandTotal).toFixed(2) + (feeGrandTotal - transactionGrandTotal).toFixed(2) +
"</div></div>" + '</div></div>' +
"</div>" + '</div>' +
"</div>" + '</div>' +
"</div>"); '</div>');
} }
}; };
document.querySelector("#button--addTransaction").addEventListener("click", () => { document
.querySelector('#button--addTransaction')
.addEventListener('click', () => {
let addCloseModalFunction; let addCloseModalFunction;
const doAddTransaction = (submitEvent) => { const doAddTransaction = (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doAddLotOccupancyTransaction", submitEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doAddLotOccupancyTransaction', submitEvent.currentTarget, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
lotOccupancyTransactions = responseJSON.lotOccupancyTransactions; lotOccupancyTransactions = responseJSON.lotOccupancyTransactions;
addCloseModalFunction(); addCloseModalFunction();
@ -376,20 +398,20 @@ document.querySelector("#button--addTransaction").addEventListener("click", () =
} }
else { else {
bulmaJS.confirm({ bulmaJS.confirm({
title: "Error Adding Transaction", title: 'Error Adding Transaction',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
cityssm.openHtmlModal("lotOccupancy-addTransaction", { cityssm.openHtmlModal('lotOccupancy-addTransaction', {
onshow: (modalElement) => { onshow: (modalElement) => {
los.populateAliases(modalElement); los.populateAliases(modalElement);
modalElement.querySelector("#lotOccupancyTransactionAdd--lotOccupancyId").value = lotOccupancyId.toString(); modalElement.querySelector('#lotOccupancyTransactionAdd--lotOccupancyId').value = lotOccupancyId.toString();
const feeGrandTotal = getFeeGrandTotal(); const feeGrandTotal = getFeeGrandTotal();
const transactionGrandTotal = getTransactionGrandTotal(); const transactionGrandTotal = getTransactionGrandTotal();
const transactionAmountElement = modalElement.querySelector("#lotOccupancyTransactionAdd--transactionAmount"); const transactionAmountElement = modalElement.querySelector('#lotOccupancyTransactionAdd--transactionAmount');
transactionAmountElement.min = (-1 * transactionGrandTotal).toFixed(2); transactionAmountElement.min = (-1 * transactionGrandTotal).toFixed(2);
transactionAmountElement.max = Math.max(feeGrandTotal - transactionGrandTotal, 0).toFixed(2); transactionAmountElement.max = Math.max(feeGrandTotal - transactionGrandTotal, 0).toFixed(2);
transactionAmountElement.value = Math.max(feeGrandTotal - transactionGrandTotal, 0).toFixed(2); transactionAmountElement.value = Math.max(feeGrandTotal - transactionGrandTotal, 0).toFixed(2);
@ -397,7 +419,9 @@ document.querySelector("#button--addTransaction").addEventListener("click", () =
onshown: (modalElement, closeModalFunction) => { onshown: (modalElement, closeModalFunction) => {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
addCloseModalFunction = closeModalFunction; addCloseModalFunction = closeModalFunction;
modalElement.querySelector("form").addEventListener("submit", doAddTransaction); modalElement
.querySelector('form')
.addEventListener('submit', doAddTransaction);
}, },
onremoved: () => { onremoved: () => {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,8 @@
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
let lotOccupancyOccupants; let lotOccupancyOccupants;
const openEditLotOccupancyOccupant = (clickEvent) => { const openEditLotOccupancyOccupant = (clickEvent) => {
const lotOccupantIndex = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.lotOccupantIndex, 10); const lotOccupantIndex = Number.parseInt(clickEvent.currentTarget.closest('tr').dataset
.lotOccupantIndex, 10);
const lotOccupancyOccupant = lotOccupancyOccupants.find((currentLotOccupancyOccupant) => { const lotOccupancyOccupant = lotOccupancyOccupants.find((currentLotOccupancyOccupant) => {
return currentLotOccupancyOccupant.lotOccupantIndex === lotOccupantIndex; return currentLotOccupancyOccupant.lotOccupantIndex === lotOccupantIndex;
}); });
@ -11,7 +12,7 @@ const openEditLotOccupancyOccupant = (clickEvent) => {
let editCloseModalFunction; let editCloseModalFunction;
const editOccupant = (submitEvent) => { const editOccupant = (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doUpdateLotOccupancyOccupant", editFormElement, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doUpdateLotOccupancyOccupant', editFormElement, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
lotOccupancyOccupants = responseJSON.lotOccupancyOccupants; lotOccupancyOccupants = responseJSON.lotOccupancyOccupants;
editCloseModalFunction(); editCloseModalFunction();
@ -19,52 +20,55 @@ const openEditLotOccupancyOccupant = (clickEvent) => {
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Updating " + exports.aliases.occupant, title: 'Error Updating ' + exports.aliases.occupant,
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
cityssm.openHtmlModal("lotOccupancy-editOccupant", { cityssm.openHtmlModal('lotOccupancy-editOccupant', {
onshow: (modalElement) => { onshow: (modalElement) => {
los.populateAliases(modalElement); los.populateAliases(modalElement);
modalElement.querySelector("#lotOccupancyOccupantEdit--lotOccupancyId").value = lotOccupancyId; modalElement.querySelector('#lotOccupancyOccupantEdit--lotOccupancyId').value = lotOccupancyId;
modalElement.querySelector("#lotOccupancyOccupantEdit--lotOccupantIndex").value = lotOccupantIndex.toString(); modalElement.querySelector('#lotOccupancyOccupantEdit--lotOccupantIndex').value = lotOccupantIndex.toString();
const lotOccupantTypeSelectElement = modalElement.querySelector("#lotOccupancyOccupantEdit--lotOccupantTypeId"); const lotOccupantTypeSelectElement = modalElement.querySelector('#lotOccupancyOccupantEdit--lotOccupantTypeId');
let lotOccupantTypeSelected = false; let lotOccupantTypeSelected = false;
for (const lotOccupantType of exports.lotOccupantTypes) { for (const lotOccupantType of exports.lotOccupantTypes) {
const optionElement = document.createElement("option"); const optionElement = document.createElement('option');
optionElement.value = lotOccupantType.lotOccupantTypeId.toString(); optionElement.value = lotOccupantType.lotOccupantTypeId.toString();
optionElement.textContent = lotOccupantType.lotOccupantType; optionElement.textContent = lotOccupantType.lotOccupantType;
if (lotOccupantType.lotOccupantTypeId === lotOccupancyOccupant.lotOccupantTypeId) { if (lotOccupantType.lotOccupantTypeId ===
lotOccupancyOccupant.lotOccupantTypeId) {
optionElement.selected = true; optionElement.selected = true;
lotOccupantTypeSelected = true; lotOccupantTypeSelected = true;
} }
lotOccupantTypeSelectElement.append(optionElement); lotOccupantTypeSelectElement.append(optionElement);
} }
if (!lotOccupantTypeSelected) { if (!lotOccupantTypeSelected) {
const optionElement = document.createElement("option"); const optionElement = document.createElement('option');
optionElement.value = lotOccupancyOccupant.lotOccupantTypeId.toString(); optionElement.value = lotOccupancyOccupant.lotOccupantTypeId.toString();
optionElement.textContent = lotOccupancyOccupant.lotOccupantType; optionElement.textContent =
lotOccupancyOccupant.lotOccupantType;
optionElement.selected = true; optionElement.selected = true;
lotOccupantTypeSelectElement.append(optionElement); lotOccupantTypeSelectElement.append(optionElement);
} }
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantName").value = lotOccupancyOccupant.occupantName; ;
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantAddress1").value = lotOccupancyOccupant.occupantAddress1; modalElement.querySelector('#lotOccupancyOccupantEdit--occupantName').value = lotOccupancyOccupant.occupantName;
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantAddress2").value = lotOccupancyOccupant.occupantAddress2; modalElement.querySelector('#lotOccupancyOccupantEdit--occupantAddress1').value = lotOccupancyOccupant.occupantAddress1;
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantCity").value = lotOccupancyOccupant.occupantCity; modalElement.querySelector('#lotOccupancyOccupantEdit--occupantAddress2').value = lotOccupancyOccupant.occupantAddress2;
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantProvince").value = lotOccupancyOccupant.occupantProvince; modalElement.querySelector('#lotOccupancyOccupantEdit--occupantCity').value = lotOccupancyOccupant.occupantCity;
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantPostalCode").value = lotOccupancyOccupant.occupantPostalCode; modalElement.querySelector('#lotOccupancyOccupantEdit--occupantProvince').value = lotOccupancyOccupant.occupantProvince;
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantPhoneNumber").value = lotOccupancyOccupant.occupantPhoneNumber; modalElement.querySelector('#lotOccupancyOccupantEdit--occupantPostalCode').value = lotOccupancyOccupant.occupantPostalCode;
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantEmailAddress").value = lotOccupancyOccupant.occupantEmailAddress; modalElement.querySelector('#lotOccupancyOccupantEdit--occupantPhoneNumber').value = lotOccupancyOccupant.occupantPhoneNumber;
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantComment").value = lotOccupancyOccupant.occupantComment; modalElement.querySelector('#lotOccupancyOccupantEdit--occupantEmailAddress').value = lotOccupancyOccupant.occupantEmailAddress;
modalElement.querySelector('#lotOccupancyOccupantEdit--occupantComment').value = lotOccupancyOccupant.occupantComment;
}, },
onshown: (modalElement, closeModalFunction) => { onshown: (modalElement, closeModalFunction) => {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
modalElement.querySelector("#lotOccupancyOccupantEdit--lotOccupantTypeId").focus(); modalElement.querySelector('#lotOccupancyOccupantEdit--lotOccupantTypeId').focus();
editFormElement = modalElement.querySelector("form"); editFormElement = modalElement.querySelector('form');
editFormElement.addEventListener("submit", editOccupant); editFormElement.addEventListener('submit', editOccupant);
editCloseModalFunction = closeModalFunction; editCloseModalFunction = closeModalFunction;
}, },
onremoved: () => { onremoved: () => {
@ -73,10 +77,9 @@ const openEditLotOccupancyOccupant = (clickEvent) => {
}); });
}; };
const deleteLotOccupancyOccupant = (clickEvent) => { const deleteLotOccupancyOccupant = (clickEvent) => {
const lotOccupantIndex = clickEvent.currentTarget.closest("tr").dataset const lotOccupantIndex = clickEvent.currentTarget.closest('tr').dataset.lotOccupantIndex;
.lotOccupantIndex;
const doDelete = () => { const doDelete = () => {
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyOccupant", { cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyOccupant', {
lotOccupancyId, lotOccupancyId,
lotOccupantIndex lotOccupantIndex
}, (responseJSON) => { }, (responseJSON) => {
@ -86,128 +89,135 @@ const deleteLotOccupancyOccupant = (clickEvent) => {
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Removing " + exports.aliases.occupant, title: 'Error Removing ' + exports.aliases.occupant,
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}; };
bulmaJS.confirm({ bulmaJS.confirm({
title: "Remove " + exports.aliases.occupant + "?", title: 'Remove ' + exports.aliases.occupant + '?',
message: "Are you sure you want to remove this " + exports.aliases.occupant.toLowerCase() + "?", message: 'Are you sure you want to remove this ' +
exports.aliases.occupant.toLowerCase() +
'?',
okButton: { okButton: {
text: "Yes, Remove " + exports.aliases.occupant, text: 'Yes, Remove ' + exports.aliases.occupant,
callbackFunction: doDelete callbackFunction: doDelete
}, },
contextualColorName: "warning" contextualColorName: 'warning'
}); });
}; };
const renderLotOccupancyOccupants = () => { const renderLotOccupancyOccupants = () => {
const occupantsContainer = document.querySelector("#container--lotOccupancyOccupants"); const occupantsContainer = document.querySelector('#container--lotOccupancyOccupants');
cityssm.clearElement(occupantsContainer); cityssm.clearElement(occupantsContainer);
if (lotOccupancyOccupants.length === 0) { if (lotOccupancyOccupants.length === 0) {
occupantsContainer.innerHTML = occupantsContainer.innerHTML =
'<div class="message is-warning">' + '<div class="message is-warning">' +
'<p class="message-body">There are no ' + '<p class="message-body">There are no ' +
exports.aliases.occupants.toLowerCase() + exports.aliases.occupants.toLowerCase() +
" associated with this record.</p>" + ' associated with this record.</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 = tableElement.innerHTML =
"<thead><tr>" + '<thead><tr>' +
("<th>" + exports.aliases.occupant + "</th>") + ('<th>' + exports.aliases.occupant + '</th>') +
"<th>Address</th>" + '<th>Address</th>' +
"<th>Other Contact</th>" + '<th>Other Contact</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 lotOccupancyOccupant of lotOccupancyOccupants) { for (const lotOccupancyOccupant of lotOccupancyOccupants) {
const tableRowElement = document.createElement("tr"); const tableRowElement = document.createElement('tr');
tableRowElement.dataset.lotOccupantIndex = tableRowElement.dataset.lotOccupantIndex =
lotOccupancyOccupant.lotOccupantIndex.toString(); lotOccupancyOccupant.lotOccupantIndex.toString();
tableRowElement.innerHTML = tableRowElement.innerHTML =
"<td>" + '<td>' +
cityssm.escapeHTML(lotOccupancyOccupant.occupantName || "(No Name)") + cityssm.escapeHTML(lotOccupancyOccupant.occupantName || '(No Name)') +
"<br />" + '<br />' +
('<span class="tag">' + ('<span class="tag">' +
'<i class="fas fa-fw fa-' + '<i class="fas fa-fw fa-' +
cityssm.escapeHTML(lotOccupancyOccupant.fontAwesomeIconClass) + cityssm.escapeHTML(lotOccupancyOccupant.fontAwesomeIconClass) +
'" aria-hidden="true"></i>' + '" aria-hidden="true"></i>' +
' <span class="ml-1">' + ' <span class="ml-1">' +
cityssm.escapeHTML(lotOccupancyOccupant.lotOccupantType) + cityssm.escapeHTML(lotOccupancyOccupant.lotOccupantType) +
"</span>" + '</span>' +
"</span>") + '</span>') +
"</td>" + '</td>' +
("<td>" + ('<td>' +
(lotOccupancyOccupant.occupantAddress1 (lotOccupancyOccupant.occupantAddress1
? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress1) + "<br />" ? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress1) + '<br />'
: "") + : '') +
(lotOccupancyOccupant.occupantAddress2 (lotOccupancyOccupant.occupantAddress2
? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress2) + "<br />" ? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress2) + '<br />'
: "") + : '') +
(lotOccupancyOccupant.occupantCity (lotOccupancyOccupant.occupantCity
? cityssm.escapeHTML(lotOccupancyOccupant.occupantCity) + ", " ? cityssm.escapeHTML(lotOccupancyOccupant.occupantCity) + ', '
: "") + : '') +
cityssm.escapeHTML(lotOccupancyOccupant.occupantProvince || "") + cityssm.escapeHTML(lotOccupancyOccupant.occupantProvince || '') +
"<br />" + '<br />' +
cityssm.escapeHTML(lotOccupancyOccupant.occupantPostalCode || "") + cityssm.escapeHTML(lotOccupancyOccupant.occupantPostalCode || '') +
"</td>") + '</td>') +
("<td>" + ('<td>' +
(lotOccupancyOccupant.occupantPhoneNumber (lotOccupancyOccupant.occupantPhoneNumber
? cityssm.escapeHTML(lotOccupancyOccupant.occupantPhoneNumber) + "<br />" ? cityssm.escapeHTML(lotOccupancyOccupant.occupantPhoneNumber) +
: "") + '<br />'
: '') +
(lotOccupancyOccupant.occupantEmailAddress (lotOccupancyOccupant.occupantEmailAddress
? cityssm.escapeHTML(lotOccupancyOccupant.occupantEmailAddress) ? cityssm.escapeHTML(lotOccupancyOccupant.occupantEmailAddress)
: "") + : '') +
"</td>") + '</td>') +
("<td>" + cityssm.escapeHTML(lotOccupancyOccupant.occupantComment) + "</td>") + ('<td>' +
cityssm.escapeHTML(lotOccupancyOccupant.occupantComment) +
'</td>') +
('<td class="is-hidden-print">' + ('<td class="is-hidden-print">' +
'<div class="buttons are-small is-justify-content-end">' + '<div class="buttons are-small is-justify-content-end">' +
('<button class="button is-primary button--edit" type="button">' + ('<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 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 ' + ('<button class="button is-light is-danger button--delete" data-tooltip="Delete ' +
cityssm.escapeHTML(exports.aliases.occupant) + cityssm.escapeHTML(exports.aliases.occupant) +
'" type="button" aria-label="Delete">' + '" 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 tableRowElement
.querySelector(".button--edit") .querySelector('.button--edit')
.addEventListener("click", openEditLotOccupancyOccupant); .addEventListener('click', openEditLotOccupancyOccupant);
tableRowElement tableRowElement
.querySelector(".button--delete") .querySelector('.button--delete')
.addEventListener("click", deleteLotOccupancyOccupant); .addEventListener('click', deleteLotOccupancyOccupant);
tableElement.querySelector("tbody").append(tableRowElement); tableElement.querySelector('tbody').append(tableRowElement);
} }
occupantsContainer.append(tableElement); occupantsContainer.append(tableElement);
}; };
if (isCreate) { if (isCreate) {
const lotOccupantTypeIdElement = document.querySelector("#lotOccupancy--lotOccupantTypeId"); const lotOccupantTypeIdElement = document.querySelector('#lotOccupancy--lotOccupantTypeId');
lotOccupantTypeIdElement.addEventListener("change", () => { lotOccupantTypeIdElement.addEventListener('change', () => {
const occupantFields = formElement.querySelectorAll("[data-table='LotOccupancyOccupant']"); const occupantFields = formElement.querySelectorAll("[data-table='LotOccupancyOccupant']");
for (const occupantField of occupantFields) { for (const occupantField of occupantFields) {
occupantField.disabled = lotOccupantTypeIdElement.value === ""; occupantField.disabled = lotOccupantTypeIdElement.value === '';
} }
}); });
} }
else { else {
lotOccupancyOccupants = exports.lotOccupancyOccupants; lotOccupancyOccupants = exports.lotOccupancyOccupants;
delete exports.lotOccupancyOccupants; delete exports.lotOccupancyOccupants;
document.querySelector("#button--addOccupant").addEventListener("click", () => { document
.querySelector('#button--addOccupant')
.addEventListener('click', () => {
let addCloseModalFunction; let addCloseModalFunction;
let addFormElement; let addFormElement;
let searchFormElement; let searchFormElement;
let searchResultsElement; let searchResultsElement;
const addOccupant = (formOrObject) => { const addOccupant = (formOrObject) => {
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doAddLotOccupancyOccupant", formOrObject, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doAddLotOccupancyOccupant', formOrObject, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
lotOccupancyOccupants = responseJSON.lotOccupancyOccupants; lotOccupancyOccupants = responseJSON.lotOccupancyOccupants;
addCloseModalFunction(); addCloseModalFunction();
@ -215,9 +225,9 @@ else {
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Adding " + exports.aliases.occupant, title: 'Error Adding ' + exports.aliases.occupant,
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
@ -232,15 +242,15 @@ else {
const panelBlockElement = clickEvent.currentTarget; const panelBlockElement = clickEvent.currentTarget;
const occupant = pastOccupantSearchResults[Number.parseInt(panelBlockElement.dataset.index, 10)]; const occupant = pastOccupantSearchResults[Number.parseInt(panelBlockElement.dataset.index, 10)];
const lotOccupantTypeId = panelBlockElement const lotOccupantTypeId = panelBlockElement
.closest(".modal") .closest('.modal')
.querySelector("#lotOccupancyOccupantCopy--lotOccupantTypeId").value; .querySelector('#lotOccupancyOccupantCopy--lotOccupantTypeId').value;
if (lotOccupantTypeId === "") { if (lotOccupantTypeId === '') {
bulmaJS.alert({ bulmaJS.alert({
title: "No " + exports.aliases.occupant + " Type Selected", title: 'No ' + exports.aliases.occupant + ' Type Selected',
message: "Select a type to apply to the newly added " + message: 'Select a type to apply to the newly added ' +
exports.aliases.occupant.toLowerCase() + exports.aliases.occupant.toLowerCase() +
".", '.',
contextualColorName: "warning" contextualColorName: 'warning'
}); });
} }
else { else {
@ -251,83 +261,86 @@ else {
}; };
const searchOccupants = (event) => { const searchOccupants = (event) => {
event.preventDefault(); event.preventDefault();
if (searchFormElement.querySelector("#lotOccupancyOccupantCopy--searchFilter").value === "") { if (searchFormElement.querySelector('#lotOccupancyOccupantCopy--searchFilter').value === '') {
searchResultsElement.innerHTML = searchResultsElement.innerHTML =
'<div class="message is-info">' + '<div class="message is-info">' +
'<p class="message-body">Enter a partial name or address in the search field above.</p>' + '<p class="message-body">Enter a partial name or address in the search field above.</p>' +
"</div>"; '</div>';
return; return;
} }
searchResultsElement.innerHTML = los.getLoadingParagraphHTML("Searching..."); searchResultsElement.innerHTML =
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doSearchPastOccupants", searchFormElement, (responseJSON) => { los.getLoadingParagraphHTML('Searching...');
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doSearchPastOccupants', searchFormElement, (responseJSON) => {
pastOccupantSearchResults = responseJSON.occupants; pastOccupantSearchResults = responseJSON.occupants;
const panelElement = document.createElement("div"); const panelElement = document.createElement('div');
panelElement.className = "panel"; panelElement.className = 'panel';
for (const [index, occupant] of pastOccupantSearchResults.entries()) { for (const [index, occupant] of pastOccupantSearchResults.entries()) {
const panelBlockElement = document.createElement("a"); const panelBlockElement = document.createElement('a');
panelBlockElement.className = "panel-block is-block"; panelBlockElement.className = 'panel-block is-block';
panelBlockElement.dataset.index = index.toString(); panelBlockElement.dataset.index = index.toString();
panelBlockElement.innerHTML = panelBlockElement.innerHTML =
"<strong>" + '<strong>' +
cityssm.escapeHTML(occupant.occupantName || "") + cityssm.escapeHTML(occupant.occupantName || '') +
"</strong>" + '</strong>' +
"<br />" + '<br />' +
'<div class="columns">' + '<div class="columns">' +
('<div class="column">' + ('<div class="column">' +
cityssm.escapeHTML(occupant.occupantAddress1 || "") + cityssm.escapeHTML(occupant.occupantAddress1 || '') +
"<br />" + '<br />' +
(occupant.occupantAddress2 (occupant.occupantAddress2
? cityssm.escapeHTML(occupant.occupantAddress2) + "<br />" ? cityssm.escapeHTML(occupant.occupantAddress2) + '<br />'
: "") + : '') +
cityssm.escapeHTML(occupant.occupantCity || "") + cityssm.escapeHTML(occupant.occupantCity || '') +
", " + ', ' +
cityssm.escapeHTML(occupant.occupantProvince || "") + cityssm.escapeHTML(occupant.occupantProvince || '') +
"<br />" + '<br />' +
cityssm.escapeHTML(occupant.occupantPostalCode || "") + cityssm.escapeHTML(occupant.occupantPostalCode || '') +
"</div>") + '</div>') +
('<div class="column">' + ('<div class="column">' +
(occupant.occupantPhoneNumber (occupant.occupantPhoneNumber
? cityssm.escapeHTML(occupant.occupantPhoneNumber) + "<br />" ? cityssm.escapeHTML(occupant.occupantPhoneNumber) +
: "") + '<br />'
cityssm.escapeHTML(occupant.occupantEmailAddress || "") + : '') +
"<br />" + cityssm.escapeHTML(occupant.occupantEmailAddress || '') +
"</div>") + '<br />' +
"</div>"; '</div>') +
panelBlockElement.addEventListener("click", addOccupantFromCopy); '</div>';
panelBlockElement.addEventListener('click', addOccupantFromCopy);
panelElement.append(panelBlockElement); panelElement.append(panelBlockElement);
} }
searchResultsElement.innerHTML = ""; searchResultsElement.innerHTML = '';
searchResultsElement.append(panelElement); searchResultsElement.append(panelElement);
}); });
}; };
cityssm.openHtmlModal("lotOccupancy-addOccupant", { cityssm.openHtmlModal('lotOccupancy-addOccupant', {
onshow: (modalElement) => { onshow: (modalElement) => {
los.populateAliases(modalElement); los.populateAliases(modalElement);
modalElement.querySelector("#lotOccupancyOccupantAdd--lotOccupancyId").value = lotOccupancyId; modalElement.querySelector('#lotOccupancyOccupantAdd--lotOccupancyId').value = lotOccupancyId;
const lotOccupantTypeSelectElement = modalElement.querySelector("#lotOccupancyOccupantAdd--lotOccupantTypeId"); const lotOccupantTypeSelectElement = modalElement.querySelector('#lotOccupancyOccupantAdd--lotOccupantTypeId');
const lotOccupantTypeCopySelectElement = modalElement.querySelector("#lotOccupancyOccupantCopy--lotOccupantTypeId"); const lotOccupantTypeCopySelectElement = modalElement.querySelector('#lotOccupancyOccupantCopy--lotOccupantTypeId');
for (const lotOccupantType of exports.lotOccupantTypes) { for (const lotOccupantType of exports.lotOccupantTypes) {
const optionElement = document.createElement("option"); const optionElement = document.createElement('option');
optionElement.value = lotOccupantType.lotOccupantTypeId.toString(); optionElement.value = lotOccupantType.lotOccupantTypeId.toString();
optionElement.textContent = lotOccupantType.lotOccupantType; optionElement.textContent = lotOccupantType.lotOccupantType;
lotOccupantTypeSelectElement.append(optionElement); lotOccupantTypeSelectElement.append(optionElement);
lotOccupantTypeCopySelectElement.append(optionElement.cloneNode(true)); lotOccupantTypeCopySelectElement.append(optionElement.cloneNode(true));
} }
modalElement.querySelector("#lotOccupancyOccupantAdd--occupantCity").value = exports.occupantCityDefault; ;
modalElement.querySelector("#lotOccupancyOccupantAdd--occupantProvince").value = exports.occupantProvinceDefault; modalElement.querySelector('#lotOccupancyOccupantAdd--occupantCity').value = exports.occupantCityDefault;
modalElement.querySelector('#lotOccupancyOccupantAdd--occupantProvince').value = exports.occupantProvinceDefault;
}, },
onshown: (modalElement, closeModalFunction) => { onshown: (modalElement, closeModalFunction) => {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
bulmaJS.init(modalElement); bulmaJS.init(modalElement);
modalElement.querySelector("#lotOccupancyOccupantAdd--lotOccupantTypeId").focus(); modalElement.querySelector('#lotOccupancyOccupantAdd--lotOccupantTypeId').focus();
addFormElement = modalElement.querySelector("#form--lotOccupancyOccupantAdd"); addFormElement = modalElement.querySelector('#form--lotOccupancyOccupantAdd');
addFormElement.addEventListener("submit", addOccupantFromForm); addFormElement.addEventListener('submit', addOccupantFromForm);
searchResultsElement = modalElement.querySelector("#lotOccupancyOccupantCopy--searchResults"); searchResultsElement = modalElement.querySelector('#lotOccupancyOccupantCopy--searchResults');
searchFormElement = modalElement.querySelector("#form--lotOccupancyOccupantCopy"); searchFormElement = modalElement.querySelector('#form--lotOccupancyOccupantCopy');
searchFormElement.addEventListener("submit", (formEvent) => { searchFormElement.addEventListener('submit', (formEvent) => {
formEvent.preventDefault(); formEvent.preventDefault();
}); });
modalElement.querySelector("#lotOccupancyOccupantCopy--searchFilter").addEventListener("change", searchOccupants); modalElement.querySelector('#lotOccupancyOccupantCopy--searchFilter').addEventListener('change', searchOccupants);
addCloseModalFunction = closeModalFunction; addCloseModalFunction = closeModalFunction;
}, },
onremoved: () => { onremoved: () => {

File diff suppressed because it is too large Load Diff

View File

@ -3,10 +3,10 @@
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
(() => { (() => {
const los = exports.los; const los = exports.los;
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');
function renderLotOccupancies(responseJSON) { function renderLotOccupancies(responseJSON) {
var _a, _b; var _a, _b;
if (responseJSON.lotOccupancies.length === 0) { if (responseJSON.lotOccupancies.length === 0) {
@ -17,12 +17,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
</div>`; </div>`;
return; return;
} }
const resultsTbodyElement = document.createElement("tbody"); const resultsTbodyElement = document.createElement('tbody');
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 && if (lotOccupancy.occupancyStartDateString <= nowDateString &&
(lotOccupancy.occupancyEndDateString === "" || (lotOccupancy.occupancyEndDateString === '' ||
lotOccupancy.occupancyEndDateString >= nowDateString)) { lotOccupancy.occupancyEndDateString >= nowDateString)) {
occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Current ${los.escapedAliases.Occupancy}"> occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Current ${los.escapedAliases.Occupancy}">
<i class="fas fa-play" aria-label="Current ${los.escapedAliases.Occupancy}"></i> <i class="fas fa-play" aria-label="Current ${los.escapedAliases.Occupancy}"></i>
@ -38,63 +38,65 @@ Object.defineProperty(exports, "__esModule", { value: true });
<i class="fas fa-stop" aria-label="Past ${los.escapedAliases.Occupancy}"></i> <i class="fas fa-stop" aria-label="Past ${los.escapedAliases.Occupancy}"></i>
</span>`; </span>`;
} }
let occupantsHTML = ""; let occupantsHTML = '';
for (const occupant of lotOccupancy.lotOccupancyOccupants) { for (const occupant of lotOccupancy.lotOccupancyOccupants) {
occupantsHTML += occupantsHTML +=
'<span class="has-tooltip-left" data-tooltip="' + '<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(occupant.lotOccupantType || "") + cityssm.escapeHTML(occupant.lotOccupantType || '') +
'">' + '">' +
('<i class="fas fa-fw fa-' + ('<i class="fas fa-fw fa-' +
cityssm.escapeHTML(occupant.fontAwesomeIconClass || "user") + cityssm.escapeHTML(occupant.fontAwesomeIconClass || 'user') +
'" aria-hidden="true"></i> ') + '" aria-hidden="true"></i> ') +
cityssm.escapeHTML(occupant.occupantName || "") + cityssm.escapeHTML(occupant.occupantName || '') +
"</span><br />"; '</span><br />';
} }
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" + resultsTbodyElement.insertAdjacentHTML('beforeend', '<tr>' +
('<td class="has-width-1">' + occupancyTimeHTML + "</td>") + ('<td class="has-width-1">' + occupancyTimeHTML + '</td>') +
("<td>" + ('<td>' +
'<a class="has-text-weight-bold" href="' + '<a class="has-text-weight-bold" href="' +
los.getLotOccupancyURL(lotOccupancy.lotOccupancyId) + los.getLotOccupancyURL(lotOccupancy.lotOccupancyId) +
'">' + '">' +
cityssm.escapeHTML(lotOccupancy.occupancyType) + cityssm.escapeHTML(lotOccupancy.occupancyType) +
"</a>" + '</a>' +
"</td>") + '</td>') +
("<td>" + ('<td>' +
(lotOccupancy.lotName (lotOccupancy.lotName
? '<a class="has-tooltip-right" data-tooltip="' + ? '<a class="has-tooltip-right" data-tooltip="' +
cityssm.escapeHTML(lotOccupancy.lotType || "") + cityssm.escapeHTML(lotOccupancy.lotType || '') +
'" href="' + '" href="' +
los.getLotURL(lotOccupancy.lotId) + los.getLotURL(lotOccupancy.lotId) +
'">' + '">' +
cityssm.escapeHTML(lotOccupancy.lotName) + cityssm.escapeHTML(lotOccupancy.lotName) +
"</a>" '</a>'
: '<span class="has-text-grey">(No ' + los.escapedAliases.Lot + ")</span>") + : '<span class="has-text-grey">(No ' +
"<br />" + los.escapedAliases.Lot +
')</span>') +
'<br />' +
('<span class="is-size-7">' + ('<span class="is-size-7">' +
cityssm.escapeHTML(lotOccupancy.mapName || "") + cityssm.escapeHTML(lotOccupancy.mapName || '') +
"</span>") + '</span>') +
"</td>") + '</td>') +
("<td>" + lotOccupancy.occupancyStartDateString + "</td>") + ('<td>' + lotOccupancy.occupancyStartDateString + '</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>') +
"<td>" + '<td>' +
(lotOccupancy.printEJS (lotOccupancy.printEJS
? '<a class="button is-small" data-tooltip="Print" href="' + ? '<a class="button is-small" data-tooltip="Print" href="' +
los.urlPrefix + los.urlPrefix +
"/print/" + '/print/' +
lotOccupancy.printEJS + lotOccupancy.printEJS +
"/?lotOccupancyId=" + '/?lotOccupancyId=' +
lotOccupancy.lotOccupancyId + lotOccupancy.lotOccupancyId +
'" target="_blank">' + '" target="_blank">' +
'<i class="fas fa-print" aria-label="Print"></i>' + '<i class="fas fa-print" aria-label="Print"></i>' +
"</a>" '</a>'
: "") + : '') +
"</td>" + '</td>' +
"</tr>"); '</tr>');
} }
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header"> searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">
<thead><tr> <thead><tr>
@ -107,19 +109,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
<th class="has-width-1"><span class="is-sr-only">Print</span></th> <th class="has-width-1"><span class="is-sr-only">Print</span></th>
</tr></thead> </tr></thead>
<table>`; <table>`;
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement); searchResultsContainerElement
searchResultsContainerElement.insertAdjacentHTML("beforeend", los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count)); .querySelector('table')
.append(resultsTbodyElement);
searchResultsContainerElement.insertAdjacentHTML('beforeend', los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count));
(_a = searchResultsContainerElement (_a = searchResultsContainerElement
.querySelector("button[data-page='previous']")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", previousAndGetLotOccupancies); .querySelector("button[data-page='previous']")) === null || _a === void 0 ? void 0 : _a.addEventListener('click', previousAndGetLotOccupancies);
(_b = searchResultsContainerElement (_b = searchResultsContainerElement
.querySelector("button[data-page='next']")) === null || _b === void 0 ? void 0 : _b.addEventListener("click", nextAndGetLotOccupancies); .querySelector("button[data-page='next']")) === null || _b === void 0 ? void 0 : _b.addEventListener('click', nextAndGetLotOccupancies);
} }
function getLotOccupancies() { function getLotOccupancies() {
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(`Loading ${exports.aliases.occupancies}...`); searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(`Loading ${exports.aliases.occupancies}...`);
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doSearchLotOccupancies", searchFilterFormElement, renderLotOccupancies); cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doSearchLotOccupancies', searchFilterFormElement, renderLotOccupancies);
} }
function resetOffsetAndGetLotOccupancies() { function resetOffsetAndGetLotOccupancies() {
offsetElement.value = "0"; offsetElement.value = '0';
getLotOccupancies(); getLotOccupancies();
} }
function previousAndGetLotOccupancies() { function previousAndGetLotOccupancies() {
@ -130,11 +134,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
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"); const filterElements = searchFilterFormElement.querySelectorAll('input, select');
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) => {
formEvent.preventDefault(); formEvent.preventDefault();
resetOffsetAndGetLotOccupancies(); resetOffsetAndGetLotOccupancies();
}); });

View File

@ -1,131 +1,139 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
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 { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
declare const cityssm: cityssmGlobal; declare const cityssm: cityssmGlobal
(() => { ;(() => {
const los = exports.los as globalTypes.LOS; const los = exports.los as globalTypes.LOS
const searchFilterFormElement = document.querySelector("#form--searchFilters") as HTMLFormElement; const searchFilterFormElement = document.querySelector(
'#form--searchFilters'
) as HTMLFormElement
const searchResultsContainerElement = document.querySelector("#container--searchResults") as HTMLElement; const searchResultsContainerElement = document.querySelector(
'#container--searchResults'
) as HTMLElement
const limit = Number.parseInt( const limit = Number.parseInt(
(document.querySelector("#searchFilter--limit") as HTMLInputElement).value, (document.querySelector('#searchFilter--limit') as HTMLInputElement).value,
10 10
); )
const offsetElement = document.querySelector("#searchFilter--offset") as HTMLInputElement; const offsetElement = document.querySelector(
'#searchFilter--offset'
) as HTMLInputElement
function renderLotOccupancies(responseJSON: { function renderLotOccupancies(responseJSON: {
count: number; count: number
offset: number; offset: number
lotOccupancies: recordTypes.LotOccupancy[]; lotOccupancies: recordTypes.LotOccupancy[]
}) { }) {
if (responseJSON.lotOccupancies.length === 0) { if (responseJSON.lotOccupancies.length === 0) {
searchResultsContainerElement.innerHTML = `<div class="message is-info"> searchResultsContainerElement.innerHTML = `<div class="message is-info">
<p class="message-body"> <p class="message-body">
There are no ${los.escapedAliases.occupancy} records that meet the search criteria. There are no ${los.escapedAliases.occupancy} records that meet the search criteria.
</p> </p>
</div>`; </div>`
return; return
} }
const resultsTbodyElement = document.createElement("tbody"); const resultsTbodyElement = document.createElement('tbody')
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 ( if (
lotOccupancy.occupancyStartDateString! <= nowDateString && lotOccupancy.occupancyStartDateString! <= nowDateString &&
(lotOccupancy.occupancyEndDateString === "" || (lotOccupancy.occupancyEndDateString === '' ||
lotOccupancy.occupancyEndDateString! >= nowDateString) lotOccupancy.occupancyEndDateString! >= nowDateString)
) { ) {
occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Current ${los.escapedAliases.Occupancy}"> occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Current ${los.escapedAliases.Occupancy}">
<i class="fas fa-play" aria-label="Current ${los.escapedAliases.Occupancy}"></i> <i class="fas fa-play" aria-label="Current ${los.escapedAliases.Occupancy}"></i>
</span>`; </span>`
} else if (lotOccupancy.occupancyStartDateString! > nowDateString) { } else if (lotOccupancy.occupancyStartDateString! > nowDateString) {
occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Future ${los.escapedAliases.Occupancy}"> occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Future ${los.escapedAliases.Occupancy}">
<i class="fas fa-fast-forward" aria-label="Future ${los.escapedAliases.Occupancy}"></i> <i class="fas fa-fast-forward" aria-label="Future ${los.escapedAliases.Occupancy}"></i>
</span>`; </span>`
} else { } else {
occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Past ${los.escapedAliases.Occupancy}"> occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Past ${los.escapedAliases.Occupancy}">
<i class="fas fa-stop" aria-label="Past ${los.escapedAliases.Occupancy}"></i> <i class="fas fa-stop" aria-label="Past ${los.escapedAliases.Occupancy}"></i>
</span>`; </span>`
} }
let occupantsHTML = ""; let occupantsHTML = ''
for (const occupant of lotOccupancy.lotOccupancyOccupants!) { for (const occupant of lotOccupancy.lotOccupancyOccupants!) {
occupantsHTML += occupantsHTML +=
'<span class="has-tooltip-left" data-tooltip="' + '<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(occupant.lotOccupantType || "") + cityssm.escapeHTML(occupant.lotOccupantType || '') +
'">' + '">' +
('<i class="fas fa-fw fa-' + ('<i class="fas fa-fw fa-' +
cityssm.escapeHTML(occupant.fontAwesomeIconClass || "user") + cityssm.escapeHTML(occupant.fontAwesomeIconClass || 'user') +
'" aria-hidden="true"></i> ') + '" aria-hidden="true"></i> ') +
cityssm.escapeHTML(occupant.occupantName || "") + cityssm.escapeHTML(occupant.occupantName || '') +
"</span><br />"; '</span><br />'
} }
resultsTbodyElement.insertAdjacentHTML( resultsTbodyElement.insertAdjacentHTML(
"beforeend", 'beforeend',
"<tr>" + '<tr>' +
('<td class="has-width-1">' + occupancyTimeHTML + "</td>") + ('<td class="has-width-1">' + occupancyTimeHTML + '</td>') +
("<td>" + ('<td>' +
'<a class="has-text-weight-bold" href="' + '<a class="has-text-weight-bold" href="' +
los.getLotOccupancyURL(lotOccupancy.lotOccupancyId!) + los.getLotOccupancyURL(lotOccupancy.lotOccupancyId!) +
'">' + '">' +
cityssm.escapeHTML(lotOccupancy.occupancyType as string) + cityssm.escapeHTML(lotOccupancy.occupancyType as string) +
"</a>" + '</a>' +
"</td>") + '</td>') +
("<td>" + ('<td>' +
(lotOccupancy.lotName (lotOccupancy.lotName
? '<a class="has-tooltip-right" data-tooltip="' + ? '<a class="has-tooltip-right" data-tooltip="' +
cityssm.escapeHTML(lotOccupancy.lotType || "") + cityssm.escapeHTML(lotOccupancy.lotType || '') +
'" href="' + '" href="' +
los.getLotURL(lotOccupancy.lotId!) + los.getLotURL(lotOccupancy.lotId!) +
'">' + '">' +
cityssm.escapeHTML(lotOccupancy.lotName) + cityssm.escapeHTML(lotOccupancy.lotName) +
"</a>" '</a>'
: '<span class="has-text-grey">(No ' + los.escapedAliases.Lot + ")</span>") + : '<span class="has-text-grey">(No ' +
"<br />" + los.escapedAliases.Lot +
('<span class="is-size-7">' + ')</span>') +
cityssm.escapeHTML(lotOccupancy.mapName || "") + '<br />' +
"</span>") + ('<span class="is-size-7">' +
"</td>") + cityssm.escapeHTML(lotOccupancy.mapName || '') +
("<td>" + lotOccupancy.occupancyStartDateString + "</td>") + '</span>') +
("<td>" + '</td>') +
(lotOccupancy.occupancyEndDate ('<td>' + lotOccupancy.occupancyStartDateString + '</td>') +
? lotOccupancy.occupancyEndDateString ('<td>' +
: '<span class="has-text-grey">(No End Date)</span>') + (lotOccupancy.occupancyEndDate
"</td>") + ? lotOccupancy.occupancyEndDateString
("<td>" + occupantsHTML + "</td>") + : '<span class="has-text-grey">(No End Date)</span>') +
"<td>" + '</td>') +
(lotOccupancy.printEJS ('<td>' + occupantsHTML + '</td>') +
? '<a class="button is-small" data-tooltip="Print" href="' + '<td>' +
los.urlPrefix + (lotOccupancy.printEJS
"/print/" + ? '<a class="button is-small" data-tooltip="Print" href="' +
lotOccupancy.printEJS + los.urlPrefix +
"/?lotOccupancyId=" + '/print/' +
lotOccupancy.lotOccupancyId + lotOccupancy.printEJS +
'" target="_blank">' + '/?lotOccupancyId=' +
'<i class="fas fa-print" aria-label="Print"></i>' + lotOccupancy.lotOccupancyId +
"</a>" '" target="_blank">' +
: "") + '<i class="fas fa-print" aria-label="Print"></i>' +
"</td>" + '</a>'
"</tr>" : '') +
); '</td>' +
} '</tr>'
)
}
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header"> searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">
<thead><tr> <thead><tr>
<th class="has-width-1"></th> <th class="has-width-1"></th>
<th>${los.escapedAliases.Occupancy} Type</th> <th>${los.escapedAliases.Occupancy} Type</th>
@ -135,63 +143,74 @@ declare const cityssm: cityssmGlobal;
<th>${los.escapedAliases.Occupants}</th> <th>${los.escapedAliases.Occupants}</th>
<th class="has-width-1"><span class="is-sr-only">Print</span></th> <th class="has-width-1"><span class="is-sr-only">Print</span></th>
</tr></thead> </tr></thead>
<table>`; <table>`
searchResultsContainerElement.querySelector("table")!.append(resultsTbodyElement); searchResultsContainerElement
.querySelector('table')!
.append(resultsTbodyElement)
searchResultsContainerElement.insertAdjacentHTML( searchResultsContainerElement.insertAdjacentHTML(
"beforeend", 'beforeend',
los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count) los.getSearchResultsPagerHTML(
); limit,
responseJSON.offset,
responseJSON.count
)
)
searchResultsContainerElement searchResultsContainerElement
.querySelector("button[data-page='previous']") .querySelector("button[data-page='previous']")
?.addEventListener("click", previousAndGetLotOccupancies); ?.addEventListener('click', previousAndGetLotOccupancies)
searchResultsContainerElement searchResultsContainerElement
.querySelector("button[data-page='next']") .querySelector("button[data-page='next']")
?.addEventListener("click", nextAndGetLotOccupancies); ?.addEventListener('click', nextAndGetLotOccupancies)
} }
function getLotOccupancies() { function getLotOccupancies() {
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML( searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(
`Loading ${exports.aliases.occupancies}...` `Loading ${exports.aliases.occupancies}...`
); )
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + "/lotOccupancies/doSearchLotOccupancies", los.urlPrefix + '/lotOccupancies/doSearchLotOccupancies',
searchFilterFormElement, searchFilterFormElement,
renderLotOccupancies renderLotOccupancies
); )
} }
function resetOffsetAndGetLotOccupancies() { function resetOffsetAndGetLotOccupancies() {
offsetElement.value = "0"; offsetElement.value = '0'
getLotOccupancies(); getLotOccupancies()
} }
function previousAndGetLotOccupancies() { function previousAndGetLotOccupancies() {
offsetElement.value = Math.max(Number.parseInt(offsetElement.value, 10) - limit, 0).toString(); offsetElement.value = Math.max(
getLotOccupancies(); Number.parseInt(offsetElement.value, 10) - limit,
} 0
).toString()
getLotOccupancies()
}
function nextAndGetLotOccupancies() { function nextAndGetLotOccupancies() {
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString(); offsetElement.value = (
getLotOccupancies(); Number.parseInt(offsetElement.value, 10) + limit
} ).toString()
getLotOccupancies()
}
const filterElements = searchFilterFormElement.querySelectorAll("input, select") as NodeListOf< const filterElements = searchFilterFormElement.querySelectorAll(
HTMLInputElement | HTMLSelectElement '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) => {
formEvent.preventDefault(); formEvent.preventDefault()
resetOffsetAndGetLotOccupancies(); resetOffsetAndGetLotOccupancies()
}); })
getLotOccupancies(); getLotOccupancies()
})(); })()

View File

@ -3,10 +3,10 @@
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
(() => { (() => {
const los = exports.los; const los = exports.los;
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');
function renderLots(responseJSON) { function renderLots(responseJSON) {
var _a, _b; var _a, _b;
if (responseJSON.lots.length === 0) { if (responseJSON.lots.length === 0) {
@ -15,36 +15,36 @@ Object.defineProperty(exports, "__esModule", { value: true });
</div>`; </div>`;
return; return;
} }
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="' + '<a class="has-text-weight-bold" href="' +
los.getLotURL(lot.lotId) + los.getLotURL(lot.lotId) +
'">' + '">' +
cityssm.escapeHTML(lot.lotName || "") + cityssm.escapeHTML(lot.lotName || '') +
"</a>" + '</a>' +
"</td>") + '</td>') +
("<td>" + ('<td>' +
'<a href="' + '<a href="' +
los.getMapURL(lot.mapId) + los.getMapURL(lot.mapId) +
'">' + '">' +
(lot.mapName (lot.mapName
? cityssm.escapeHTML(lot.mapName) ? cityssm.escapeHTML(lot.mapName)
: '<span class="has-text-grey">(No Name)</span>') + : '<span class="has-text-grey">(No Name)</span>') +
"</a>" + '</a>' +
"</td>") + '</td>') +
("<td>" + cityssm.escapeHTML(lot.lotType || "") + "</td>") + ('<td>' + cityssm.escapeHTML(lot.lotType || '') + '</td>') +
("<td>" + ('<td>' +
(lot.lotStatusId (lot.lotStatusId
? cityssm.escapeHTML(lot.lotStatus || "") ? cityssm.escapeHTML(lot.lotStatus || '')
: '<span class="has-text-grey">(No Status)</span>') + : '<span class="has-text-grey">(No Status)</span>') +
"<br />" + '<br />' +
(lot.lotOccupancyCount > 0 (lot.lotOccupancyCount > 0
? '<span class="is-size-7">Currently Occupied</span>' ? '<span class="is-size-7">Currently Occupied</span>'
: "") + : '') +
"</td>") + '</td>') +
"</tr>"); '</tr>');
} }
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header"> searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">
<thead><tr> <thead><tr>
@ -54,19 +54,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
<th>Status</th> <th>Status</th>
</tr></thead> </tr></thead>
<table>`; <table>`;
searchResultsContainerElement.insertAdjacentHTML("beforeend", los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count)); searchResultsContainerElement.insertAdjacentHTML('beforeend', los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count));
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement); searchResultsContainerElement
.querySelector('table')
.append(resultsTbodyElement);
(_a = searchResultsContainerElement (_a = searchResultsContainerElement
.querySelector("button[data-page='previous']")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", previousAndGetLots); .querySelector("button[data-page='previous']")) === null || _a === void 0 ? void 0 : _a.addEventListener('click', previousAndGetLots);
(_b = searchResultsContainerElement (_b = searchResultsContainerElement
.querySelector("button[data-page='next']")) === null || _b === void 0 ? void 0 : _b.addEventListener("click", nextAndGetLots); .querySelector("button[data-page='next']")) === null || _b === void 0 ? void 0 : _b.addEventListener('click', nextAndGetLots);
} }
function getLots() { function getLots() {
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(`Loading ${los.escapedAliases.Lots}...`); searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(`Loading ${los.escapedAliases.Lots}...`);
cityssm.postJSON(los.urlPrefix + "/lots/doSearchLots", searchFilterFormElement, renderLots); cityssm.postJSON(los.urlPrefix + '/lots/doSearchLots', searchFilterFormElement, renderLots);
} }
function resetOffsetAndGetLots() { function resetOffsetAndGetLots() {
offsetElement.value = "0"; offsetElement.value = '0';
getLots(); getLots();
} }
function previousAndGetLots() { function previousAndGetLots() {
@ -77,11 +79,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
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"); const filterElements = searchFilterFormElement.querySelectorAll('input, select');
for (const filterElement of filterElements) { for (const filterElement of filterElements) {
filterElement.addEventListener("change", resetOffsetAndGetLots); filterElement.addEventListener('change', resetOffsetAndGetLots);
} }
searchFilterFormElement.addEventListener("submit", (formEvent) => { searchFilterFormElement.addEventListener('submit', (formEvent) => {
formEvent.preventDefault(); formEvent.preventDefault();
resetOffsetAndGetLots(); resetOffsetAndGetLots();
}); });

View File

@ -1,130 +1,155 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
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 { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
declare const cityssm: cityssmGlobal; declare const cityssm: cityssmGlobal
(() => { ;(() => {
const los = exports.los as globalTypes.LOS; const los = exports.los as globalTypes.LOS
const searchFilterFormElement = document.querySelector("#form--searchFilters") as HTMLFormElement; const searchFilterFormElement = document.querySelector(
'#form--searchFilters'
) as HTMLFormElement
const searchResultsContainerElement = document.querySelector("#container--searchResults") as HTMLElement; const searchResultsContainerElement = document.querySelector(
'#container--searchResults'
) as HTMLElement
const limit = Number.parseInt( const limit = Number.parseInt(
(document.querySelector("#searchFilter--limit") as HTMLInputElement).value, (document.querySelector('#searchFilter--limit') as HTMLInputElement).value,
10 10
); )
const offsetElement = document.querySelector("#searchFilter--offset") as HTMLInputElement; const offsetElement = document.querySelector(
'#searchFilter--offset'
) as HTMLInputElement
function renderLots(responseJSON: { count: number; offset: number; lots: recordTypes.Lot[] }): void { function renderLots(responseJSON: {
if (responseJSON.lots.length === 0) { count: number
searchResultsContainerElement.innerHTML = `<div class="message is-info"> offset: number
lots: recordTypes.Lot[]
}): void {
if (responseJSON.lots.length === 0) {
searchResultsContainerElement.innerHTML = `<div class="message is-info">
<p class="message-body">There are no ${los.escapedAliases.lots} that meet the search criteria.</p> <p class="message-body">There are no ${los.escapedAliases.lots} that meet the search criteria.</p>
</div>`; </div>`
return; return
} }
const resultsTbodyElement = document.createElement("tbody"); const resultsTbodyElement = document.createElement('tbody')
for (const lot of responseJSON.lots) { for (const lot of responseJSON.lots) {
resultsTbodyElement.insertAdjacentHTML( resultsTbodyElement.insertAdjacentHTML(
"beforeend", 'beforeend',
"<tr>" + '<tr>' +
("<td>" + ('<td>' +
'<a class="has-text-weight-bold" href="' + '<a class="has-text-weight-bold" href="' +
los.getLotURL(lot.lotId) + los.getLotURL(lot.lotId) +
'">' + '">' +
cityssm.escapeHTML(lot.lotName || "") + cityssm.escapeHTML(lot.lotName || '') +
"</a>" + '</a>' +
"</td>") + '</td>') +
("<td>" + ('<td>' +
'<a href="' + '<a href="' +
los.getMapURL(lot.mapId!) + los.getMapURL(lot.mapId!) +
'">' + '">' +
(lot.mapName (lot.mapName
? cityssm.escapeHTML(lot.mapName) ? cityssm.escapeHTML(lot.mapName)
: '<span class="has-text-grey">(No Name)</span>') + : '<span class="has-text-grey">(No Name)</span>') +
"</a>" + '</a>' +
"</td>") + '</td>') +
("<td>" + cityssm.escapeHTML(lot.lotType || "") + "</td>") + ('<td>' + cityssm.escapeHTML(lot.lotType || '') + '</td>') +
("<td>" + ('<td>' +
(lot.lotStatusId (lot.lotStatusId
? cityssm.escapeHTML(lot.lotStatus || "") ? cityssm.escapeHTML(lot.lotStatus || '')
: '<span class="has-text-grey">(No Status)</span>') + : '<span class="has-text-grey">(No Status)</span>') +
"<br />" + '<br />' +
(lot.lotOccupancyCount! > 0 (lot.lotOccupancyCount! > 0
? '<span class="is-size-7">Currently Occupied</span>' ? '<span class="is-size-7">Currently Occupied</span>'
: "") + : '') +
"</td>") + '</td>') +
"</tr>" '</tr>'
); )
} }
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header"> searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">
<thead><tr> <thead><tr>
<th>${los.escapedAliases.Lot}</th> <th>${los.escapedAliases.Lot}</th>
<th>${los.escapedAliases.Map}</th> <th>${los.escapedAliases.Map}</th>
<th>${los.escapedAliases.Lot} Type</th> <th>${los.escapedAliases.Lot} Type</th>
<th>Status</th> <th>Status</th>
</tr></thead> </tr></thead>
<table>`; <table>`
searchResultsContainerElement.insertAdjacentHTML( searchResultsContainerElement.insertAdjacentHTML(
"beforeend", 'beforeend',
los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count) los.getSearchResultsPagerHTML(
); limit,
responseJSON.offset,
responseJSON.count
)
)
searchResultsContainerElement.querySelector("table")!.append(resultsTbodyElement); searchResultsContainerElement
.querySelector('table')!
.append(resultsTbodyElement)
searchResultsContainerElement searchResultsContainerElement
.querySelector("button[data-page='previous']") .querySelector("button[data-page='previous']")
?.addEventListener("click", previousAndGetLots); ?.addEventListener('click', previousAndGetLots)
searchResultsContainerElement searchResultsContainerElement
.querySelector("button[data-page='next']") .querySelector("button[data-page='next']")
?.addEventListener("click", nextAndGetLots); ?.addEventListener('click', nextAndGetLots)
} }
function getLots(): void { function getLots(): void {
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML( searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(
`Loading ${los.escapedAliases.Lots}...` `Loading ${los.escapedAliases.Lots}...`
); )
cityssm.postJSON(los.urlPrefix + "/lots/doSearchLots", searchFilterFormElement, renderLots); cityssm.postJSON(
} los.urlPrefix + '/lots/doSearchLots',
searchFilterFormElement,
renderLots
)
}
function resetOffsetAndGetLots(): void { function resetOffsetAndGetLots(): void {
offsetElement.value = "0"; offsetElement.value = '0'
getLots(); getLots()
} }
function previousAndGetLots(): void { function previousAndGetLots(): void {
offsetElement.value = Math.max(Number.parseInt(offsetElement.value, 10) - limit, 0).toString(); offsetElement.value = Math.max(
getLots(); Number.parseInt(offsetElement.value, 10) - limit,
} 0
).toString()
getLots()
}
function nextAndGetLots(): void { function nextAndGetLots(): void {
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString(); offsetElement.value = (
getLots(); Number.parseInt(offsetElement.value, 10) + limit
} ).toString()
getLots()
}
const filterElements = searchFilterFormElement.querySelectorAll("input, select") as NodeListOf< const filterElements = searchFilterFormElement.querySelectorAll(
HTMLInputElement | HTMLSelectElement 'input, select'
>; ) as NodeListOf<HTMLInputElement | HTMLSelectElement>
for (const filterElement of filterElements) { for (const filterElement of filterElements) {
filterElement.addEventListener("change", resetOffsetAndGetLots); filterElement.addEventListener('change', resetOffsetAndGetLots)
} }
searchFilterFormElement.addEventListener("submit", (formEvent) => { searchFilterFormElement.addEventListener('submit', (formEvent) => {
formEvent.preventDefault(); formEvent.preventDefault()
resetOffsetAndGetLots(); resetOffsetAndGetLots()
}); })
getLots(); getLots()
})(); })()

View File

@ -2,8 +2,9 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
(() => { (() => {
const mapContainerElement = document.querySelector("#lot--map"); const mapContainerElement = document.querySelector('#lot--map');
if (mapContainerElement) { if (mapContainerElement) {
exports.los.highlightMap(mapContainerElement, mapContainerElement.dataset.mapKey, "success"); ;
exports.los.highlightMap(mapContainerElement, mapContainerElement.dataset.mapKey, 'success');
} }
})(); })();

View File

@ -1,15 +1,14 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
import * as globalTypes from "../types/globalTypes"; import * as globalTypes from '../types/globalTypes'
;(() => {
const mapContainerElement = document.querySelector('#lot--map') as HTMLElement
(() => { if (mapContainerElement) {
const mapContainerElement = document.querySelector("#lot--map") as HTMLElement; ;(exports.los as globalTypes.LOS).highlightMap(
mapContainerElement,
if (mapContainerElement) { mapContainerElement.dataset.mapKey!,
(exports.los as globalTypes.LOS).highlightMap( 'success'
mapContainerElement, )
mapContainerElement.dataset.mapKey!, }
"success" })()
);
}
})();

View File

@ -28,33 +28,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
let svgElementToHighlight; let svgElementToHighlight;
// 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;
} }
svgId = svgId.slice(0, Math.max(0, svgId.lastIndexOf("-"))); svgId = svgId.slice(0, Math.max(0, svgId.lastIndexOf('-')));
} }
if (svgElementToHighlight) { if (svgElementToHighlight) {
// eslint-disable-next-line unicorn/no-null // eslint-disable-next-line unicorn/no-null
svgElementToHighlight.style.fill = ""; svgElementToHighlight.style.fill = '';
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 = ""; pathElement.style.fill = '';
} }
} }
} }
function unlockField(clickEvent) { function unlockField(clickEvent) {
const fieldElement = clickEvent.currentTarget.closest(".field"); const fieldElement = clickEvent.currentTarget.closest('.field');
const inputOrSelectElement = fieldElement.querySelector("input, select"); const inputOrSelectElement = fieldElement.querySelector('input, select');
inputOrSelectElement.classList.remove("is-readonly"); inputOrSelectElement.classList.remove('is-readonly');
if (inputOrSelectElement.tagName === "INPUT") { if (inputOrSelectElement.tagName === 'INPUT') {
;
inputOrSelectElement.readOnly = false; inputOrSelectElement.readOnly = false;
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;
} }
@ -62,20 +63,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
inputOrSelectElement.focus(); inputOrSelectElement.focus();
} }
function initializeUnlockFieldButtons(containerElement) { function initializeUnlockFieldButtons(containerElement) {
const unlockFieldButtonElements = containerElement.querySelectorAll(".is-unlock-field-button"); const unlockFieldButtonElements = containerElement.querySelectorAll('.is-unlock-field-button');
for (const unlockFieldButtonElement of unlockFieldButtonElements) { for (const unlockFieldButtonElement of unlockFieldButtonElements) {
unlockFieldButtonElement.addEventListener("click", unlockField); unlockFieldButtonElement.addEventListener('click', unlockField);
} }
} }
/* /*
* Date Pickers * Date Pickers
*/ */
const datePickerBaseOptions = { const datePickerBaseOptions = {
type: "date", type: 'date',
dateFormat: "yyyy-MM-dd", dateFormat: 'yyyy-MM-dd',
showFooter: false, showFooter: false,
color: "info", color: 'info',
displayMode: "dialog" displayMode: 'dialog'
}; };
function initializeDatePickers(containerElement) { function initializeDatePickers(containerElement) {
const dateElements = containerElement.querySelectorAll("input[type='date']"); const dateElements = containerElement.querySelectorAll("input[type='date']");
@ -94,35 +95,35 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
const cal = exports.bulmaCalendar.attach(dateElement, datePickerOptions)[0]; const cal = exports.bulmaCalendar.attach(dateElement, datePickerOptions)[0];
// trigger change event on original element // trigger change event on original element
cal.on("save", () => { cal.on('save', () => {
dateElement.value = cal.value(); dateElement.value = cal.value();
dateElement.dispatchEvent(new Event("change")); dateElement.dispatchEvent(new Event('change'));
}); });
// Disable html scrolling when calendar is open // Disable html scrolling when calendar is open
cal.on("show", () => { cal.on('show', () => {
document.querySelector("html").classList.add("is-clipped"); document.querySelector('html').classList.add('is-clipped');
}); });
// Reenable scrolling, if a modal window is not open // Reenable scrolling, if a modal window is not open
cal.on("hide", () => { cal.on('hide', () => {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
}); });
// Get the datepicker container element // Get the datepicker container element
const datepickerElement = containerElement.querySelector("#" + cal._id); const datepickerElement = containerElement.querySelector('#' + cal._id);
// Override the previous and next month button styles // Override the previous and next month button styles
const datePickerNavButtonElements = datepickerElement.querySelectorAll(".datepicker-nav button.is-text"); const datePickerNavButtonElements = datepickerElement.querySelectorAll('.datepicker-nav button.is-text');
for (const datePickerNavButtonElement of datePickerNavButtonElements) { for (const datePickerNavButtonElement of datePickerNavButtonElements) {
datePickerNavButtonElement.classList.add("is-" + datePickerBaseOptions.color); datePickerNavButtonElement.classList.add('is-' + datePickerBaseOptions.color);
datePickerNavButtonElement.classList.remove("is-text"); datePickerNavButtonElement.classList.remove('is-text');
} }
// Override the clear button style // Override the clear button style
const clearButtonElement = datepickerElement.querySelector(".datetimepicker-clear-button"); const clearButtonElement = datepickerElement.querySelector('.datetimepicker-clear-button');
if (clearButtonElement) { if (clearButtonElement) {
if (dateElement.required) { if (dateElement.required) {
clearButtonElement.remove(); clearButtonElement.remove();
} }
else { else {
clearButtonElement.dataset.tooltip = "Clear"; clearButtonElement.dataset.tooltip = 'Clear';
clearButtonElement.ariaLabel = "Clear"; clearButtonElement.ariaLabel = 'Clear';
clearButtonElement.innerHTML = clearButtonElement.innerHTML =
'<span class="has-text-weight-bold" aria-hidden="true">&times;</span>'; '<span class="has-text-weight-bold" aria-hidden="true">&times;</span>';
} }
@ -130,119 +131,118 @@ Object.defineProperty(exports, "__esModule", { value: true });
// Apply a label // Apply a label
const labelElement = document.querySelector("label[for='" + dateElement.id + "']"); const labelElement = document.querySelector("label[for='" + dateElement.id + "']");
if (labelElement) { if (labelElement) {
datepickerElement.querySelector(".datetimepicker-dummy-input").ariaLabel = datepickerElement.querySelector('.datetimepicker-dummy-input').ariaLabel = labelElement.textContent;
labelElement.textContent;
} }
} }
} }
/* /*
const timePickerBaseOptions: BulmaCalendarOptions = { const timePickerBaseOptions: BulmaCalendarOptions = {
type: "time", type: "time",
timeFormat: "hh:mm", timeFormat: "hh:mm",
color: "info", color: "info",
displayMode: "dialog", displayMode: "dialog",
validateLabel: "Set Time", validateLabel: "Set Time",
minuteSteps: 1 minuteSteps: 1
}; };
const initializeTimePickers = (containerElement: HTMLElement) => { const initializeTimePickers = (containerElement: HTMLElement) => {
const timeElements = containerElement.querySelectorAll( const timeElements = containerElement.querySelectorAll(
"input[type='time']" "input[type='time']"
) as NodeListOf<HTMLInputElement>; ) as NodeListOf<HTMLInputElement>;
for (const timeElement of timeElements) { for (const timeElement of timeElements) {
const timePickerOptions = Object.assign({}, timePickerBaseOptions); const timePickerOptions = Object.assign({}, timePickerBaseOptions);
if (timeElement.required) { if (timeElement.required) {
timePickerOptions.showClearButton = false; timePickerOptions.showClearButton = false;
} }
const cal = exports.bulmaCalendar.attach(timeElement, timePickerOptions)[0]; const cal = exports.bulmaCalendar.attach(timeElement, timePickerOptions)[0];
// trigger change event on original element // trigger change event on original element
cal.on("save", () => { cal.on("save", () => {
timeElement.value = cal.value(); timeElement.value = cal.value();
timeElement.dispatchEvent(new Event("change")); timeElement.dispatchEvent(new Event("change"));
}); });
// Disable html scrolling when calendar is open // Disable html scrolling when calendar is open
cal.on("show", () => { cal.on("show", () => {
document.querySelector("html")!.classList.add("is-clipped"); document.querySelector("html")!.classList.add("is-clipped");
}); });
// Reenable scrolling, if a modal window is not open // Reenable scrolling, if a modal window is not open
cal.on("hide", () => { cal.on("hide", () => {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
}); });
// Get the datepicker container element // Get the datepicker container element
const timePickerElement = containerElement.querySelector("#" + cal._id) as HTMLElement; const timePickerElement = containerElement.querySelector("#" + cal._id) as HTMLElement;
// Remove "cancel" button // Remove "cancel" button
const timePickerCancelButtonElement = timePickerElement.querySelector( const timePickerCancelButtonElement = timePickerElement.querySelector(
".datetimepicker-footer-cancel" ".datetimepicker-footer-cancel"
); );
if (timePickerCancelButtonElement) { if (timePickerCancelButtonElement) {
timePickerCancelButtonElement.remove(); timePickerCancelButtonElement.remove();
} }
// Override the clear button style // Override the clear button style
const clearButtonElement = timePickerElement.querySelector( const clearButtonElement = timePickerElement.querySelector(
".datetimepicker-clear-button" ".datetimepicker-clear-button"
) as HTMLElement; ) as HTMLElement;
if (clearButtonElement) { if (clearButtonElement) {
if (timeElement.required) { if (timeElement.required) {
clearButtonElement.remove(); clearButtonElement.remove();
} else { } else {
clearButtonElement.dataset.tooltip = "Clear"; clearButtonElement.dataset.tooltip = "Clear";
clearButtonElement.innerHTML = clearButtonElement.innerHTML =
'<span class="has-text-weight-bold" aria-hidden="true">&times;</span>'; '<span class="has-text-weight-bold" aria-hidden="true">&times;</span>';
} }
} }
} }
}; };
*/ */
/* /*
* Aliases * Aliases
*/ */
function populateAliases(containerElement) { function populateAliases(containerElement) {
const aliasElements = containerElement.querySelectorAll(".alias"); const aliasElements = containerElement.querySelectorAll('.alias');
for (const aliasElement of aliasElements) { for (const aliasElement of aliasElements) {
switch (aliasElement.dataset.alias) { switch (aliasElement.dataset.alias) {
case "Map": { case 'Map': {
aliasElement.textContent = exports.aliases.map; aliasElement.textContent = exports.aliases.map;
break; break;
} }
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': {
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;
} }
@ -278,17 +278,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
/* /*
* Colours * Colours
*/ */
const hues = ["red", "green", "orange", "blue", "pink", "yellow", "purple"]; const hues = ['red', 'green', 'orange', 'blue', 'pink', 'yellow', 'purple'];
const luminosity = ["bright", "light", "dark"]; const luminosity = ['bright', 'light', 'dark'];
function getRandomColor(seedString) { function getRandomColor(seedString) {
let actualSeedString = seedString; let actualSeedString = seedString;
if (actualSeedString.length < 2) { if (actualSeedString.length < 2) {
actualSeedString = actualSeedString + "a1"; actualSeedString = actualSeedString + 'a1';
} }
return exports.randomColor({ return exports.randomColor({
seed: actualSeedString + actualSeedString, seed: actualSeedString + actualSeedString,
hue: hues[actualSeedString.codePointAt(actualSeedString.length - 1) % hues.length], hue: hues[actualSeedString.codePointAt(actualSeedString.length - 1) % hues.length],
luminosity: luminosity[actualSeedString.codePointAt(actualSeedString.length - 2) % luminosity.length] luminosity: luminosity[actualSeedString.codePointAt(actualSeedString.length - 2) %
luminosity.length]
}); });
} }
/* /*
@ -298,21 +299,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
return `<div class="field has-addons"> return `<div class="field has-addons">
<div class="control"> <div class="control">
<button <button
class="button ${isSmall ? "is-small" : ""} ${upButtonClassNames}" class="button ${isSmall ? 'is-small' : ''} ${upButtonClassNames}"
data-tooltip="Move Up" data-direction="up" type="button" aria-label="Move Up"> data-tooltip="Move Up" data-direction="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 <button
class="button ${isSmall ? "is-small" : ""} ${downButtonClassNames}" class="button ${isSmall ? 'is-small' : ''} ${downButtonClassNames}"
data-tooltip="Move Down" data-direction="down" type="button" aria-label="Move Down"> data-tooltip="Move Down" data-direction="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>`;
} }
function getLoadingParagraphHTML(captionText = "Loading...") { function getLoadingParagraphHTML(captionText = 'Loading...') {
return `<p class="has-text-centered has-text-grey"> return `<p class="has-text-centered has-text-grey">
<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 />
${cityssm.escapeHTML(captionText)} ${cityssm.escapeHTML(captionText)}
@ -322,63 +323,63 @@ Object.defineProperty(exports, "__esModule", { value: true });
return ('<div class="level">' + return ('<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 " + 'Displaying ' +
(offset + 1).toString() + (offset + 1).toString() +
" to " + ' to ' +
Math.min(count, limit + offset) + Math.min(count, limit + offset) +
" of " + ' of ' +
count + 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 < count (limit + offset < 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>');
} }
/* /*
* URLs * URLs
*/ */
const urlPrefix = document.querySelector("main").dataset.urlPrefix; const urlPrefix = document.querySelector('main').dataset.urlPrefix;
function getRecordURL(recordTypePlural, recordId, edit, time) { function getRecordURL(recordTypePlural, recordId, edit, time) {
return (urlPrefix + return (urlPrefix +
"/" + '/' +
recordTypePlural + recordTypePlural +
(recordId ? "/" + recordId : "") + (recordId ? '/' + recordId : '') +
(recordId && edit ? "/edit" : "") + (recordId && edit ? '/edit' : '') +
(time ? "/?t=" + Date.now() : "")); (time ? '/?t=' + Date.now() : ''));
} }
function getMapURL(mapId = "", edit = false, time = false) { function getMapURL(mapId = '', edit = false, time = false) {
return getRecordURL("maps", mapId, edit, time); return getRecordURL('maps', mapId, edit, time);
} }
function getLotURL(lotId = "", edit = false, time = false) { function getLotURL(lotId = '', edit = false, time = false) {
return getRecordURL("lots", lotId, edit, time); return getRecordURL('lots', lotId, edit, time);
} }
function getLotOccupancyURL(lotOccupancyId = "", edit = false, time = false) { function getLotOccupancyURL(lotOccupancyId = '', edit = false, time = false) {
return getRecordURL("lotOccupancies", lotOccupancyId, edit, time); return getRecordURL('lotOccupancies', lotOccupancyId, edit, time);
} }
function getWorkOrderURL(workOrderId = "", edit = false, time = false) { function getWorkOrderURL(workOrderId = '', edit = false, time = false) {
return getRecordURL("workOrders", workOrderId, edit, time); return getRecordURL('workOrders', workOrderId, edit, time);
} }
/* /*
* Declare LOS * Declare LOS
*/ */
const los = { const los = {
urlPrefix, urlPrefix,
apiKey: document.querySelector("main").dataset.apiKey, apiKey: document.querySelector('main').dataset.apiKey,
highlightMap, highlightMap,
initializeUnlockFieldButtons, initializeUnlockFieldButtons,
initializeDatePickers, initializeDatePickers,

View File

@ -1,196 +1,210 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
import type * as globalTypes from "../types/globalTypes"; import type * as globalTypes from '../types/globalTypes'
import type { Options as BulmaCalendarOptions } from "bulma-calendar"; import type { Options as BulmaCalendarOptions } from 'bulma-calendar'
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
import type { BulmaJS } from "@cityssm/bulma-js/types"; import type { BulmaJS } from '@cityssm/bulma-js/types'
declare const cityssm: cityssmGlobal; declare const cityssm: cityssmGlobal
declare const bulmaJS: BulmaJS; declare const bulmaJS: BulmaJS
(() => { ;(() => {
/* /*
* Unsaved Changes * Unsaved Changes
*/ */
let _hasUnsavedChanges = false; let _hasUnsavedChanges = false
function setUnsavedChanges() { function setUnsavedChanges() {
if (!hasUnsavedChanges()) { if (!hasUnsavedChanges()) {
_hasUnsavedChanges = true; _hasUnsavedChanges = true
cityssm.enableNavBlocker(); cityssm.enableNavBlocker()
} }
}
function clearUnsavedChanges() {
_hasUnsavedChanges = false
cityssm.disableNavBlocker()
}
function hasUnsavedChanges() {
return _hasUnsavedChanges
}
/*
* Mapping
*/
function highlightMap(
mapContainerElement: HTMLElement,
mapKey: string,
contextualClass: 'success' | 'danger'
): void {
// Search for ID
let svgId = mapKey
let svgElementToHighlight: SVGElement | null
// eslint-disable-next-line no-constant-condition
while (true) {
svgElementToHighlight = mapContainerElement.querySelector('#' + svgId)
if (svgElementToHighlight || !svgId.includes('-')) {
break
}
svgId = svgId.slice(0, Math.max(0, svgId.lastIndexOf('-')))
} }
function clearUnsavedChanges() { if (svgElementToHighlight) {
_hasUnsavedChanges = false; // eslint-disable-next-line unicorn/no-null
cityssm.disableNavBlocker(); svgElementToHighlight.style.fill = ''
svgElementToHighlight.classList.add('highlight', 'is-' + contextualClass)
const childPathElements = svgElementToHighlight.querySelectorAll('path')
for (const pathElement of childPathElements) {
// eslint-disable-next-line unicorn/no-null
pathElement.style.fill = ''
}
}
}
function unlockField(clickEvent: Event): void {
const fieldElement = (clickEvent.currentTarget as HTMLElement).closest(
'.field'
)!
const inputOrSelectElement = fieldElement.querySelector('input, select') as
| HTMLInputElement
| HTMLSelectElement
inputOrSelectElement.classList.remove('is-readonly')
if (inputOrSelectElement.tagName === 'INPUT') {
;(inputOrSelectElement as HTMLInputElement).readOnly = false
;(inputOrSelectElement as HTMLInputElement).disabled = false
} else {
const optionElements = inputOrSelectElement.querySelectorAll('option')
for (const optionElement of optionElements) {
optionElement.disabled = false
}
} }
function hasUnsavedChanges() { inputOrSelectElement.focus()
return _hasUnsavedChanges; }
function initializeUnlockFieldButtons(containerElement: HTMLElement): void {
const unlockFieldButtonElements = containerElement.querySelectorAll(
'.is-unlock-field-button'
)
for (const unlockFieldButtonElement of unlockFieldButtonElements) {
unlockFieldButtonElement.addEventListener('click', unlockField)
} }
}
/* /*
* Mapping * Date Pickers
*/ */
function highlightMap( const datePickerBaseOptions: BulmaCalendarOptions = {
mapContainerElement: HTMLElement, type: 'date',
mapKey: string, dateFormat: 'yyyy-MM-dd',
contextualClass: "success" | "danger" showFooter: false,
): void { color: 'info',
// Search for ID displayMode: 'dialog'
let svgId = mapKey; }
let svgElementToHighlight: SVGElement | null;
// eslint-disable-next-line no-constant-condition function initializeDatePickers(containerElement: HTMLElement): void {
while (true) { const dateElements = containerElement.querySelectorAll(
svgElementToHighlight = mapContainerElement.querySelector("#" + svgId); "input[type='date']"
) as NodeListOf<HTMLInputElement>
if (svgElementToHighlight || !svgId.includes("-")) { for (const dateElement of dateElements) {
break; const datePickerOptions = Object.assign({}, datePickerBaseOptions)
}
svgId = svgId.slice(0, Math.max(0, svgId.lastIndexOf("-"))); if (dateElement.required) {
} datePickerOptions.showClearButton = false
}
if (svgElementToHighlight) { // apply min date if set
// eslint-disable-next-line unicorn/no-null if (dateElement.min) {
svgElementToHighlight.style.fill = ""; datePickerOptions.minDate = cityssm.dateStringToDate(dateElement.min)
}
svgElementToHighlight.classList.add("highlight", "is-" + contextualClass); // apply max date if set
if (dateElement.max) {
datePickerOptions.maxDate = cityssm.dateStringToDate(dateElement.max)
}
const childPathElements = svgElementToHighlight.querySelectorAll("path"); const cal = exports.bulmaCalendar.attach(
for (const pathElement of childPathElements) { dateElement,
// eslint-disable-next-line unicorn/no-null datePickerOptions
pathElement.style.fill = ""; )[0]
}
}
}
function unlockField(clickEvent: Event): void { // trigger change event on original element
const fieldElement = (clickEvent.currentTarget as HTMLElement).closest(".field")!; cal.on('save', () => {
dateElement.value = cal.value()
dateElement.dispatchEvent(new Event('change'))
})
const inputOrSelectElement = fieldElement.querySelector("input, select") as // Disable html scrolling when calendar is open
| HTMLInputElement cal.on('show', () => {
| HTMLSelectElement; document.querySelector('html')!.classList.add('is-clipped')
})
inputOrSelectElement.classList.remove("is-readonly"); // Reenable scrolling, if a modal window is not open
cal.on('hide', () => {
bulmaJS.toggleHtmlClipped()
})
if (inputOrSelectElement.tagName === "INPUT") { // Get the datepicker container element
(inputOrSelectElement as HTMLInputElement).readOnly = false; const datepickerElement = containerElement.querySelector(
(inputOrSelectElement as HTMLInputElement).disabled = false; '#' + cal._id
) as HTMLElement
// Override the previous and next month button styles
const datePickerNavButtonElements = datepickerElement.querySelectorAll(
'.datepicker-nav button.is-text'
)
for (const datePickerNavButtonElement of datePickerNavButtonElements) {
datePickerNavButtonElement.classList.add(
'is-' + datePickerBaseOptions.color
)
datePickerNavButtonElement.classList.remove('is-text')
}
// Override the clear button style
const clearButtonElement = datepickerElement.querySelector(
'.datetimepicker-clear-button'
) as HTMLElement
if (clearButtonElement) {
if (dateElement.required) {
clearButtonElement.remove()
} else { } else {
const optionElements = inputOrSelectElement.querySelectorAll("option"); clearButtonElement.dataset.tooltip = 'Clear'
for (const optionElement of optionElements) { clearButtonElement.ariaLabel = 'Clear'
optionElement.disabled = false; clearButtonElement.innerHTML =
} '<span class="has-text-weight-bold" aria-hidden="true">&times;</span>'
} }
}
inputOrSelectElement.focus(); // Apply a label
const labelElement = document.querySelector(
"label[for='" + dateElement.id + "']"
)
if (labelElement) {
datepickerElement.querySelector(
'.datetimepicker-dummy-input'
)!.ariaLabel = labelElement.textContent
}
} }
}
function initializeUnlockFieldButtons(containerElement: HTMLElement): void { /*
const unlockFieldButtonElements = containerElement.querySelectorAll(".is-unlock-field-button");
for (const unlockFieldButtonElement of unlockFieldButtonElements) {
unlockFieldButtonElement.addEventListener("click", unlockField);
}
}
/*
* Date Pickers
*/
const datePickerBaseOptions: BulmaCalendarOptions = {
type: "date",
dateFormat: "yyyy-MM-dd",
showFooter: false,
color: "info",
displayMode: "dialog"
};
function initializeDatePickers(containerElement: HTMLElement): void {
const dateElements = containerElement.querySelectorAll(
"input[type='date']"
) as NodeListOf<HTMLInputElement>;
for (const dateElement of dateElements) {
const datePickerOptions = Object.assign({}, datePickerBaseOptions);
if (dateElement.required) {
datePickerOptions.showClearButton = false;
}
// apply min date if set
if (dateElement.min) {
datePickerOptions.minDate = cityssm.dateStringToDate(dateElement.min);
}
// apply max date if set
if (dateElement.max) {
datePickerOptions.maxDate = cityssm.dateStringToDate(dateElement.max);
}
const cal = exports.bulmaCalendar.attach(dateElement, datePickerOptions)[0];
// trigger change event on original element
cal.on("save", () => {
dateElement.value = cal.value();
dateElement.dispatchEvent(new Event("change"));
});
// Disable html scrolling when calendar is open
cal.on("show", () => {
document.querySelector("html")!.classList.add("is-clipped");
});
// Reenable scrolling, if a modal window is not open
cal.on("hide", () => {
bulmaJS.toggleHtmlClipped();
});
// Get the datepicker container element
const datepickerElement = containerElement.querySelector("#" + cal._id) as HTMLElement;
// Override the previous and next month button styles
const datePickerNavButtonElements = datepickerElement.querySelectorAll(
".datepicker-nav button.is-text"
);
for (const datePickerNavButtonElement of datePickerNavButtonElements) {
datePickerNavButtonElement.classList.add("is-" + datePickerBaseOptions.color);
datePickerNavButtonElement.classList.remove("is-text");
}
// Override the clear button style
const clearButtonElement = datepickerElement.querySelector(
".datetimepicker-clear-button"
) as HTMLElement;
if (clearButtonElement) {
if (dateElement.required) {
clearButtonElement.remove();
} else {
clearButtonElement.dataset.tooltip = "Clear";
clearButtonElement.ariaLabel = "Clear";
clearButtonElement.innerHTML =
'<span class="has-text-weight-bold" aria-hidden="true">&times;</span>';
}
}
// Apply a label
const labelElement = document.querySelector("label[for='" + dateElement.id + "']");
if (labelElement) {
datepickerElement.querySelector(".datetimepicker-dummy-input")!.ariaLabel =
labelElement.textContent;
}
}
}
/*
const timePickerBaseOptions: BulmaCalendarOptions = { const timePickerBaseOptions: BulmaCalendarOptions = {
type: "time", type: "time",
timeFormat: "hh:mm", timeFormat: "hh:mm",
@ -263,242 +277,275 @@ declare const bulmaJS: BulmaJS;
}; };
*/ */
/* /*
* Aliases * Aliases
*/ */
function populateAliases(containerElement: HTMLElement): void { function populateAliases(containerElement: HTMLElement): void {
const aliasElements = containerElement.querySelectorAll(".alias") as NodeListOf<HTMLElement>; const aliasElements = containerElement.querySelectorAll(
'.alias'
) as NodeListOf<HTMLElement>
for (const aliasElement of aliasElements) { for (const aliasElement of aliasElements) {
switch (aliasElement.dataset.alias) { switch (aliasElement.dataset.alias) {
case "Map": { case 'Map': {
aliasElement.textContent = exports.aliases.map; aliasElement.textContent = exports.aliases.map
break; break
}
case "Lot": {
aliasElement.textContent = exports.aliases.lot;
break;
}
case "lot": {
aliasElement.textContent = exports.aliases.lot.toLowerCase();
break;
}
case "Occupancy": {
aliasElement.textContent = exports.aliases.occupancy;
break;
}
case "occupancy": {
aliasElement.textContent = exports.aliases.occupancy.toLowerCase();
break;
}
case "Occupant": {
aliasElement.textContent = exports.aliases.occupant;
break;
}
case "occupant": {
aliasElement.textContent = exports.aliases.occupant.toLowerCase();
break;
}
case "ExternalReceiptNumber": {
aliasElement.textContent = exports.aliases.externalReceiptNumber;
break;
}
}
} }
case 'Lot': {
aliasElement.textContent = exports.aliases.lot
break
}
case 'lot': {
aliasElement.textContent = exports.aliases.lot.toLowerCase()
break
}
case 'Occupancy': {
aliasElement.textContent = exports.aliases.occupancy
break
}
case 'occupancy': {
aliasElement.textContent = exports.aliases.occupancy.toLowerCase()
break
}
case 'Occupant': {
aliasElement.textContent = exports.aliases.occupant
break
}
case 'occupant': {
aliasElement.textContent = exports.aliases.occupant.toLowerCase()
break
}
case 'ExternalReceiptNumber': {
aliasElement.textContent = exports.aliases.externalReceiptNumber
break
}
}
}
}
const escapedAliases = Object.freeze({
Map: cityssm.escapeHTML(exports.aliases.map),
map: cityssm.escapeHTML(exports.aliases.map.toLowerCase()),
Maps: cityssm.escapeHTML(exports.aliases.maps),
maps: cityssm.escapeHTML(exports.aliases.maps.toLowerCase()),
Lot: cityssm.escapeHTML(exports.aliases.lot),
lot: cityssm.escapeHTML(exports.aliases.lot.toLowerCase()),
Lots: cityssm.escapeHTML(exports.aliases.lots),
lots: cityssm.escapeHTML(exports.aliases.lots.toLowerCase()),
Occupancy: cityssm.escapeHTML(exports.aliases.occupancy),
occupancy: cityssm.escapeHTML(exports.aliases.occupancy.toLowerCase()),
Occupancies: cityssm.escapeHTML(exports.aliases.occupancies),
occupancies: cityssm.escapeHTML(exports.aliases.occupancies.toLowerCase()),
Occupant: cityssm.escapeHTML(exports.aliases.occupant),
occupant: cityssm.escapeHTML(exports.aliases.occupant.toLowerCase()),
Occupants: cityssm.escapeHTML(exports.aliases.occupants),
occupants: cityssm.escapeHTML(exports.aliases.occupants.toLowerCase()),
ExternalReceiptNumber: cityssm.escapeHTML(
exports.aliases.externalReceiptNumber
),
externalReceiptNumber: cityssm.escapeHTML(
exports.aliases.externalReceiptNumber.toLowerCase()
),
OccupancyStartDate: cityssm.escapeHTML(exports.aliases.occupancyStartDate),
occupancyStartDate: cityssm.escapeHTML(
exports.aliases.occupancyStartDate.toLowerCase()
),
WorkOrderOpenDate: cityssm.escapeHTML(exports.aliases.workOrderOpenDate),
workOrderOpenDate: cityssm.escapeHTML(
exports.aliases.workOrderOpenDate.toLowerCase()
),
WorkOrderCloseDate: cityssm.escapeHTML(exports.aliases.workOrderCloseDate),
workOrderCloseDate: cityssm.escapeHTML(
exports.aliases.workOrderCloseDate.toLowerCase()
)
})
/*
* Colours
*/
const hues = ['red', 'green', 'orange', 'blue', 'pink', 'yellow', 'purple']
const luminosity = ['bright', 'light', 'dark']
function getRandomColor(seedString: string) {
let actualSeedString = seedString
if (actualSeedString.length < 2) {
actualSeedString = actualSeedString + 'a1'
} }
const escapedAliases = Object.freeze({ return exports.randomColor({
Map: cityssm.escapeHTML(exports.aliases.map), seed: actualSeedString + actualSeedString,
map: cityssm.escapeHTML(exports.aliases.map.toLowerCase()), hue: hues[
Maps: cityssm.escapeHTML(exports.aliases.maps), actualSeedString.codePointAt(actualSeedString.length - 1)! % hues.length
maps: cityssm.escapeHTML(exports.aliases.maps.toLowerCase()), ],
luminosity:
luminosity[
actualSeedString.codePointAt(actualSeedString.length - 2)! %
luminosity.length
]
})
}
Lot: cityssm.escapeHTML(exports.aliases.lot), /*
lot: cityssm.escapeHTML(exports.aliases.lot.toLowerCase()), * Bulma Snippets
Lots: cityssm.escapeHTML(exports.aliases.lots), */
lots: cityssm.escapeHTML(exports.aliases.lots.toLowerCase()),
Occupancy: cityssm.escapeHTML(exports.aliases.occupancy), function getMoveUpDownButtonFieldHTML(
occupancy: cityssm.escapeHTML(exports.aliases.occupancy.toLowerCase()), upButtonClassNames: string,
Occupancies: cityssm.escapeHTML(exports.aliases.occupancies), downButtonClassNames: string,
occupancies: cityssm.escapeHTML(exports.aliases.occupancies.toLowerCase()), isSmall = true
): string {
Occupant: cityssm.escapeHTML(exports.aliases.occupant), return `<div class="field has-addons">
occupant: cityssm.escapeHTML(exports.aliases.occupant.toLowerCase()),
Occupants: cityssm.escapeHTML(exports.aliases.occupants),
occupants: cityssm.escapeHTML(exports.aliases.occupants.toLowerCase()),
ExternalReceiptNumber: cityssm.escapeHTML(exports.aliases.externalReceiptNumber),
externalReceiptNumber: cityssm.escapeHTML(exports.aliases.externalReceiptNumber.toLowerCase()),
OccupancyStartDate: cityssm.escapeHTML(exports.aliases.occupancyStartDate),
occupancyStartDate: cityssm.escapeHTML(exports.aliases.occupancyStartDate.toLowerCase()),
WorkOrderOpenDate: cityssm.escapeHTML(exports.aliases.workOrderOpenDate),
workOrderOpenDate: cityssm.escapeHTML(exports.aliases.workOrderOpenDate.toLowerCase()),
WorkOrderCloseDate: cityssm.escapeHTML(exports.aliases.workOrderCloseDate),
workOrderCloseDate: cityssm.escapeHTML(exports.aliases.workOrderCloseDate.toLowerCase())
});
/*
* Colours
*/
const hues = ["red", "green", "orange", "blue", "pink", "yellow", "purple"];
const luminosity = ["bright", "light", "dark"];
function getRandomColor(seedString: string) {
let actualSeedString = seedString;
if (actualSeedString.length < 2) {
actualSeedString = actualSeedString + "a1";
}
return exports.randomColor({
seed: actualSeedString + actualSeedString,
hue: hues[actualSeedString.codePointAt(actualSeedString.length - 1)! % hues.length],
luminosity:
luminosity[actualSeedString.codePointAt(actualSeedString.length - 2)! % luminosity.length]
});
}
/*
* Bulma Snippets
*/
function getMoveUpDownButtonFieldHTML(
upButtonClassNames: string,
downButtonClassNames: string,
isSmall = true
): string {
return `<div class="field has-addons">
<div class="control"> <div class="control">
<button <button
class="button ${isSmall ? "is-small" : ""} ${upButtonClassNames}" class="button ${
isSmall ? 'is-small' : ''
} ${upButtonClassNames}"
data-tooltip="Move Up" data-direction="up" type="button" aria-label="Move Up"> data-tooltip="Move Up" data-direction="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 <button
class="button ${isSmall ? "is-small" : ""} ${downButtonClassNames}" class="button ${
isSmall ? 'is-small' : ''
} ${downButtonClassNames}"
data-tooltip="Move Down" data-direction="down" type="button" aria-label="Move Down"> data-tooltip="Move Down" data-direction="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>`
} }
function getLoadingParagraphHTML(captionText = "Loading..."): string { function getLoadingParagraphHTML(captionText = 'Loading...'): string {
return `<p class="has-text-centered has-text-grey"> return `<p class="has-text-centered has-text-grey">
<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 />
${cityssm.escapeHTML(captionText)} ${cityssm.escapeHTML(captionText)}
</p>`; </p>`
} }
function getSearchResultsPagerHTML(limit: number, offset: number, count: number) { function getSearchResultsPagerHTML(
return ( limit: number,
'<div class="level">' + offset: number,
('<div class="level-left">' + count: number
'<div class="level-item has-text-weight-bold">' + ) {
"Displaying " + return (
(offset + 1).toString() + '<div class="level">' +
" to " + ('<div class="level-left">' +
Math.min(count, limit + offset) + '<div class="level-item has-text-weight-bold">' +
" of " + 'Displaying ' +
count + (offset + 1).toString() +
"</div>" + ' to ' +
"</div>") + Math.min(count, limit + offset) +
('<div class="level-right">' + ' of ' +
(offset > 0 count +
? '<div class="level-item">' + '</div>' +
'<button class="button is-rounded is-link is-outlined" data-page="previous" type="button" title="Previous">' + '</div>') +
'<i class="fas fa-arrow-left" aria-hidden="true"></i>' + ('<div class="level-right">' +
"</button>" + (offset > 0
"</div>" ? '<div class="level-item">' +
: "") + '<button class="button is-rounded is-link is-outlined" data-page="previous" type="button" title="Previous">' +
(limit + offset < count '<i class="fas fa-arrow-left" aria-hidden="true"></i>' +
? '<div class="level-item">' + '</button>' +
'<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' + '</div>'
"<span>Next</span>" + : '') +
'<span class="icon"><i class="fas fa-arrow-right" aria-hidden="true"></i></span>' + (limit + offset < count
"</button>" + ? '<div class="level-item">' +
"</div>" '<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
: "") + '<span>Next</span>' +
"</div>") + '<span class="icon"><i class="fas fa-arrow-right" aria-hidden="true"></i></span>' +
"</div>" '</button>' +
); '</div>'
} : '') +
'</div>') +
'</div>'
)
}
/* /*
* URLs * URLs
*/ */
const urlPrefix = document.querySelector("main")!.dataset.urlPrefix!; const urlPrefix = document.querySelector('main')!.dataset.urlPrefix!
function getRecordURL( function getRecordURL(
recordTypePlural: "maps" | "lots" | "lotOccupancies" | "workOrders", recordTypePlural: 'maps' | 'lots' | 'lotOccupancies' | 'workOrders',
recordId: number | string, recordId: number | string,
edit: boolean, edit: boolean,
time: boolean time: boolean
): string { ): string {
return ( return (
urlPrefix + urlPrefix +
"/" + '/' +
recordTypePlural + recordTypePlural +
(recordId ? "/" + recordId : "") + (recordId ? '/' + recordId : '') +
(recordId && edit ? "/edit" : "") + (recordId && edit ? '/edit' : '') +
(time ? "/?t=" + Date.now() : "") (time ? '/?t=' + Date.now() : '')
); )
} }
function getMapURL(mapId: number | string = "", edit = false, time = false) { function getMapURL(mapId: number | string = '', edit = false, time = false) {
return getRecordURL("maps", mapId, edit, time); return getRecordURL('maps', mapId, edit, time)
} }
function getLotURL(lotId: number | string = "", edit = false, time = false) { function getLotURL(lotId: number | string = '', edit = false, time = false) {
return getRecordURL("lots", lotId, edit, time); return getRecordURL('lots', lotId, edit, time)
} }
function getLotOccupancyURL(lotOccupancyId: number | string = "", edit = false, time = false) { function getLotOccupancyURL(
return getRecordURL("lotOccupancies", lotOccupancyId, edit, time); lotOccupancyId: number | string = '',
} edit = false,
time = false
) {
return getRecordURL('lotOccupancies', lotOccupancyId, edit, time)
}
function getWorkOrderURL(workOrderId: number | string = "", edit = false, time = false) { function getWorkOrderURL(
return getRecordURL("workOrders", workOrderId, edit, time); workOrderId: number | string = '',
} edit = false,
time = false
) {
return getRecordURL('workOrders', workOrderId, edit, time)
}
/* /*
* Declare LOS * Declare LOS
*/ */
const los: globalTypes.LOS = { const los: globalTypes.LOS = {
urlPrefix, urlPrefix,
apiKey: document.querySelector("main")!.dataset.apiKey!, apiKey: document.querySelector('main')!.dataset.apiKey!,
highlightMap, highlightMap,
initializeUnlockFieldButtons, initializeUnlockFieldButtons,
initializeDatePickers, initializeDatePickers,
populateAliases, populateAliases,
escapedAliases, escapedAliases,
getRandomColor, getRandomColor,
setUnsavedChanges, setUnsavedChanges,
clearUnsavedChanges, clearUnsavedChanges,
hasUnsavedChanges, hasUnsavedChanges,
getMoveUpDownButtonFieldHTML, getMoveUpDownButtonFieldHTML,
getLoadingParagraphHTML, getLoadingParagraphHTML,
getSearchResultsPagerHTML, getSearchResultsPagerHTML,
getMapURL, getMapURL,
getLotURL, getLotURL,
getLotOccupancyURL, getLotOccupancyURL,
getWorkOrderURL getWorkOrderURL
}; }
exports.los = los; exports.los = los
})(); })()

View File

@ -4,42 +4,45 @@ Object.defineProperty(exports, "__esModule", { value: true });
(() => { (() => {
var _a; var _a;
const los = exports.los; const los = exports.los;
const mapId = document.querySelector("#map--mapId").value; const mapId = document.querySelector('#map--mapId')
const isCreate = mapId === ""; .value;
const mapForm = document.querySelector("#form--map"); const isCreate = mapId === '';
const mapForm = document.querySelector('#form--map');
function updateMap(formEvent) { function updateMap(formEvent) {
formEvent.preventDefault(); formEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/maps/" + (isCreate ? "doCreateMap" : "doUpdateMap"), mapForm, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/maps/' + (isCreate ? 'doCreateMap' : 'doUpdateMap'), mapForm, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
cityssm.disableNavBlocker(); cityssm.disableNavBlocker();
if (isCreate) { if (isCreate) {
window.location.href = los.urlPrefix + "/maps/" + responseJSON.mapId + "/edit"; window.location.href =
los.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'
}); });
} }
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Updating " + exports.aliases.map, title: 'Error Updating ' + exports.aliases.map,
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
} }
mapForm.addEventListener("submit", updateMap); mapForm.addEventListener('submit', updateMap);
const inputElements = mapForm.querySelectorAll("input, select"); const inputElements = mapForm.querySelectorAll('input, select');
for (const inputElement of inputElements) { for (const inputElement of inputElements) {
inputElement.addEventListener("change", cityssm.enableNavBlocker); inputElement.addEventListener('change', cityssm.enableNavBlocker);
} }
(_a = document.querySelector("#button--deleteMap")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", (clickEvent) => { (_a = document
.querySelector('#button--deleteMap')) === null || _a === void 0 ? void 0 : _a.addEventListener('click', (clickEvent) => {
clickEvent.preventDefault(); clickEvent.preventDefault();
function doDelete() { function doDelete() {
cityssm.postJSON(los.urlPrefix + "/maps/doDeleteMap", { cityssm.postJSON(los.urlPrefix + '/maps/doDeleteMap', {
mapId mapId
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
@ -47,17 +50,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
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()} and all related ${exports.aliases.lots.toLowerCase()}?`, message: `Are you sure you want to delete this ${exports.aliases.map.toLowerCase()} and all related ${exports.aliases.lots.toLowerCase()}?`,
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: `Yes, Delete ${exports.aliases.map}`, text: `Yes, Delete ${exports.aliases.map}`,
callbackFunction: doDelete callbackFunction: doDelete

View File

@ -1,91 +1,99 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
import type * as globalTypes from "../types/globalTypes"; import type * as globalTypes from '../types/globalTypes'
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
import type { BulmaJS } from "@cityssm/bulma-js/types"; import type { BulmaJS } from '@cityssm/bulma-js/types'
declare const cityssm: cityssmGlobal; declare const 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 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
function updateMap(formEvent: SubmitEvent) { function updateMap(formEvent: SubmitEvent) {
formEvent.preventDefault(); formEvent.preventDefault()
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + "/maps/" + (isCreate ? "doCreateMap" : "doUpdateMap"), los.urlPrefix + '/maps/' + (isCreate ? 'doCreateMap' : 'doUpdateMap'),
mapForm, mapForm,
(responseJSON: { success: boolean; mapId?: number; errorMessage?: string }) => { (responseJSON: {
if (responseJSON.success) { success: boolean
cityssm.disableNavBlocker(); mapId?: number
errorMessage?: string
}) => {
if (responseJSON.success) {
cityssm.disableNavBlocker()
if (isCreate) { if (isCreate) {
window.location.href = los.urlPrefix + "/maps/" + responseJSON.mapId + "/edit"; window.location.href =
} else { los.urlPrefix + '/maps/' + responseJSON.mapId + '/edit'
bulmaJS.alert({ } else {
message: exports.aliases.map + " Updated Successfully", bulmaJS.alert({
contextualColorName: "success" message: exports.aliases.map + ' Updated Successfully',
}); contextualColorName: 'success'
} })
} else { }
bulmaJS.alert({ } else {
title: "Error Updating " + exports.aliases.map, bulmaJS.alert({
message: responseJSON.errorMessage || "", title: 'Error Updating ' + exports.aliases.map,
contextualColorName: "danger" message: responseJSON.errorMessage || '',
}); contextualColorName: 'danger'
} })
}
);
}
mapForm.addEventListener("submit", updateMap);
const inputElements = mapForm.querySelectorAll("input, select") as NodeListOf<
HTMLInputElement | HTMLSelectElement
>;
for (const inputElement of inputElements) {
inputElement.addEventListener("change", cityssm.enableNavBlocker);
}
document.querySelector("#button--deleteMap")?.addEventListener("click", (clickEvent) => {
clickEvent.preventDefault();
function doDelete() {
cityssm.postJSON(
los.urlPrefix + "/maps/doDeleteMap",
{
mapId
},
(responseJSON: { success: boolean; errorMessage?: string }) => {
if (responseJSON.success) {
window.location.href = los.getMapURL();
} else {
bulmaJS.alert({
title: "Error Deleting " + exports.aliases.map,
message: responseJSON.errorMessage || "",
contextualColorName: "danger"
});
}
}
);
} }
}
)
}
bulmaJS.confirm({ mapForm.addEventListener('submit', updateMap)
title: "Delete " + exports.aliases.map,
message: `Are you sure you want to delete this ${exports.aliases.map.toLowerCase()} and all related ${exports.aliases.lots.toLowerCase()}?`, const inputElements = mapForm.querySelectorAll('input, select') as NodeListOf<
contextualColorName: "warning", HTMLInputElement | HTMLSelectElement
okButton: { >
text: `Yes, Delete ${exports.aliases.map}`,
callbackFunction: doDelete for (const inputElement of inputElements) {
inputElement.addEventListener('change', cityssm.enableNavBlocker)
}
document
.querySelector('#button--deleteMap')
?.addEventListener('click', (clickEvent) => {
clickEvent.preventDefault()
function doDelete() {
cityssm.postJSON(
los.urlPrefix + '/maps/doDeleteMap',
{
mapId
},
(responseJSON: { success: boolean; errorMessage?: string }) => {
if (responseJSON.success) {
window.location.href = los.getMapURL()
} else {
bulmaJS.alert({
title: 'Error Deleting ' + exports.aliases.map,
message: responseJSON.errorMessage || '',
contextualColorName: 'danger'
})
} }
}); }
}); )
})(); }
bulmaJS.confirm({
title: 'Delete ' + exports.aliases.map,
message: `Are you sure you want to delete this ${exports.aliases.map.toLowerCase()} and all related ${exports.aliases.lots.toLowerCase()}?`,
contextualColorName: 'warning',
okButton: {
text: `Yes, Delete ${exports.aliases.map}`,
callbackFunction: doDelete
}
})
})
})()

View File

@ -4,13 +4,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
(() => { (() => {
const los = exports.los; const los = exports.los;
const maps = exports.maps; const maps = exports.maps;
const searchFilterElement = document.querySelector("#searchFilter--map"); const searchFilterElement = document.querySelector('#searchFilter--map');
const searchResultsContainerElement = document.querySelector("#container--searchResults"); const searchResultsContainerElement = document.querySelector('#container--searchResults');
function renderResults() { function renderResults() {
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(`Loading ${los.escapedAliases.Maps}...`); searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(`Loading ${los.escapedAliases.Maps}...`);
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} ${map.mapDescription} ${map.mapAddress1} ${map.mapAddress2}`.toLowerCase(); const mapSearchString = `${map.mapName} ${map.mapDescription} ${map.mapAddress1} ${map.mapAddress2}`.toLowerCase();
let showMap = true; let showMap = true;
@ -24,62 +27,66 @@ Object.defineProperty(exports, "__esModule", { value: true });
continue; continue;
} }
searchResultCount += 1; searchResultCount += 1;
searchResultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" + searchResultsTbodyElement.insertAdjacentHTML('beforeend', '<tr>' +
("<td>" + ('<td>' +
'<a class="has-text-weight-bold" href="' + '<a class="has-text-weight-bold" href="' +
los.urlPrefix + los.urlPrefix +
"/maps/" + '/maps/' +
map.mapId + map.mapId +
'">' + '">' +
cityssm.escapeHTML(map.mapName || "(No Name)") + cityssm.escapeHTML(map.mapName || '(No Name)') +
"</a><br />" + '</a><br />' +
'<span class="is-size-7">' + '<span class="is-size-7">' +
cityssm.escapeHTML(map.mapDescription || "") + cityssm.escapeHTML(map.mapDescription || '') +
"</span>" + '</span>' +
"</td>") + '</td>') +
("<td>" + ('<td>' +
(map.mapAddress1 ? cityssm.escapeHTML(map.mapAddress1) + "<br />" : "") + (map.mapAddress1
(map.mapAddress2 ? cityssm.escapeHTML(map.mapAddress2) + "<br />" : "") + ? cityssm.escapeHTML(map.mapAddress1) + '<br />'
: '') +
(map.mapAddress2
? cityssm.escapeHTML(map.mapAddress2) + '<br />'
: '') +
(map.mapCity || map.mapProvince (map.mapCity || map.mapProvince
? cityssm.escapeHTML(map.mapCity || "") + ? cityssm.escapeHTML(map.mapCity || '') +
", " + ', ' +
cityssm.escapeHTML(map.mapProvince || "") + cityssm.escapeHTML(map.mapProvince || '') +
"<br />" '<br />'
: "") + : '') +
(map.mapPostalCode ? cityssm.escapeHTML(map.mapPostalCode) : "") + (map.mapPostalCode ? cityssm.escapeHTML(map.mapPostalCode) : '') +
"</td>") + '</td>') +
("<td>" + cityssm.escapeHTML(map.mapPhoneNumber || "") + "</td>") + ('<td>' + cityssm.escapeHTML(map.mapPhoneNumber || '') + '</td>') +
'<td class="has-text-centered">' + '<td class="has-text-centered">' +
(map.mapLatitude && map.mapLongitude (map.mapLatitude && map.mapLongitude
? '<span data-tooltip="Has Geographic Coordinates"><i class="fas fa-map-marker-alt" aria-label="Has Geographic Coordinates"></i></span>' ? '<span data-tooltip="Has Geographic Coordinates"><i class="fas fa-map-marker-alt" aria-label="Has Geographic Coordinates"></i></span>'
: "") + : '') +
"</td>" + '</td>' +
'<td class="has-text-centered">' + '<td class="has-text-centered">' +
(map.mapSVG (map.mapSVG
? '<span data-tooltip="Has Image"><i class="fas fa-image" aria-label="Has Image"></i></span>' ? '<span data-tooltip="Has Image"><i class="fas fa-image" aria-label="Has Image"></i></span>'
: "") + : '') +
"</td>" + '</td>' +
('<td class="has-text-right">' + ('<td class="has-text-right">' +
'<a href="' + '<a href="' +
los.urlPrefix + los.urlPrefix +
"/lots?mapId=" + '/lots?mapId=' +
map.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 = `<div class="message is-info"> searchResultsContainerElement.innerHTML = `<div class="message is-info">
<p class="message-body">There are no ${los.escapedAliases.maps} that meet the search criteria.</p> <p class="message-body">There are no ${los.escapedAliases.maps} that meet the search criteria.</p>
</div>`; </div>`;
} }
else { else {
const searchResultsTableElement = document.createElement("table"); const searchResultsTableElement = document.createElement('table');
searchResultsTableElement.className = searchResultsTableElement.className =
"table is-fullwidth is-striped is-hoverable has-sticky-header"; 'table is-fullwidth is-striped is-hoverable has-sticky-header';
searchResultsTableElement.innerHTML = `<thead><tr> searchResultsTableElement.innerHTML = `<thead><tr>
<th>${los.escapedAliases.Map}</th> <th>${los.escapedAliases.Map}</th>
<th>Address</th> <th>Address</th>
@ -92,8 +99,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
searchResultsContainerElement.append(searchResultsTableElement); searchResultsContainerElement.append(searchResultsTableElement);
} }
} }
searchFilterElement.addEventListener("keyup", renderResults); searchFilterElement.addEventListener('keyup', renderResults);
document.querySelector("#form--searchFilters").addEventListener("submit", (formEvent) => { document
.querySelector('#form--searchFilters')
.addEventListener('submit', (formEvent) => {
formEvent.preventDefault(); formEvent.preventDefault();
renderResults(); renderResults();
}); });

View File

@ -1,133 +1,146 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
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 { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
declare const cityssm: cityssmGlobal; declare const cityssm: cityssmGlobal
(() => { ;(() => {
const los = exports.los as globalTypes.LOS; const los = exports.los as globalTypes.LOS
const maps: recordTypes.Map[] = exports.maps; const maps: recordTypes.Map[] = exports.maps
const searchFilterElement = document.querySelector("#searchFilter--map") as HTMLInputElement; const searchFilterElement = document.querySelector(
'#searchFilter--map'
) as HTMLInputElement
const searchResultsContainerElement = document.querySelector("#container--searchResults") as HTMLElement; const searchResultsContainerElement = document.querySelector(
'#container--searchResults'
) as HTMLElement
function renderResults(): void { function renderResults(): void {
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML( searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(
`Loading ${los.escapedAliases.Maps}...` `Loading ${los.escapedAliases.Maps}...`
); )
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.mapDescription} ${map.mapAddress1} ${map.mapAddress2}`.toLowerCase(); `${map.mapName} ${map.mapDescription} ${map.mapAddress1} ${map.mapAddress2}`.toLowerCase()
let showMap = true; let showMap = true
for (const filterStringPiece of filterStringSplit) { for (const filterStringPiece of filterStringSplit) {
if (!mapSearchString.includes(filterStringPiece)) { if (!mapSearchString.includes(filterStringPiece)) {
showMap = false; showMap = false
break; break
}
}
if (!showMap) {
continue;
}
searchResultCount += 1;
searchResultsTbodyElement.insertAdjacentHTML(
"beforeend",
"<tr>" +
("<td>" +
'<a class="has-text-weight-bold" href="' +
los.urlPrefix +
"/maps/" +
map.mapId +
'">' +
cityssm.escapeHTML(map.mapName || "(No Name)") +
"</a><br />" +
'<span class="is-size-7">' +
cityssm.escapeHTML(map.mapDescription || "") +
"</span>" +
"</td>") +
("<td>" +
(map.mapAddress1 ? cityssm.escapeHTML(map.mapAddress1) + "<br />" : "") +
(map.mapAddress2 ? cityssm.escapeHTML(map.mapAddress2) + "<br />" : "") +
(map.mapCity || map.mapProvince
? cityssm.escapeHTML(map.mapCity || "") +
", " +
cityssm.escapeHTML(map.mapProvince || "") +
"<br />"
: "") +
(map.mapPostalCode ? cityssm.escapeHTML(map.mapPostalCode) : "") +
"</td>") +
("<td>" + cityssm.escapeHTML(map.mapPhoneNumber || "") + "</td>") +
'<td class="has-text-centered">' +
(map.mapLatitude && map.mapLongitude
? '<span data-tooltip="Has Geographic Coordinates"><i class="fas fa-map-marker-alt" aria-label="Has Geographic Coordinates"></i></span>'
: "") +
"</td>" +
'<td class="has-text-centered">' +
(map.mapSVG
? '<span data-tooltip="Has Image"><i class="fas fa-image" aria-label="Has Image"></i></span>'
: "") +
"</td>" +
('<td class="has-text-right">' +
'<a href="' +
los.urlPrefix +
"/lots?mapId=" +
map.mapId +
'">' +
map.lotCount +
"</a>" +
"</td>") +
"</tr>"
);
} }
}
searchResultsContainerElement.innerHTML = ""; if (!showMap) {
continue
}
if (searchResultCount === 0) { searchResultCount += 1
searchResultsContainerElement.innerHTML = `<div class="message is-info">
searchResultsTbodyElement.insertAdjacentHTML(
'beforeend',
'<tr>' +
('<td>' +
'<a class="has-text-weight-bold" href="' +
los.urlPrefix +
'/maps/' +
map.mapId +
'">' +
cityssm.escapeHTML(map.mapName || '(No Name)') +
'</a><br />' +
'<span class="is-size-7">' +
cityssm.escapeHTML(map.mapDescription || '') +
'</span>' +
'</td>') +
('<td>' +
(map.mapAddress1
? cityssm.escapeHTML(map.mapAddress1) + '<br />'
: '') +
(map.mapAddress2
? cityssm.escapeHTML(map.mapAddress2) + '<br />'
: '') +
(map.mapCity || map.mapProvince
? cityssm.escapeHTML(map.mapCity || '') +
', ' +
cityssm.escapeHTML(map.mapProvince || '') +
'<br />'
: '') +
(map.mapPostalCode ? cityssm.escapeHTML(map.mapPostalCode) : '') +
'</td>') +
('<td>' + cityssm.escapeHTML(map.mapPhoneNumber || '') + '</td>') +
'<td class="has-text-centered">' +
(map.mapLatitude && map.mapLongitude
? '<span data-tooltip="Has Geographic Coordinates"><i class="fas fa-map-marker-alt" aria-label="Has Geographic Coordinates"></i></span>'
: '') +
'</td>' +
'<td class="has-text-centered">' +
(map.mapSVG
? '<span data-tooltip="Has Image"><i class="fas fa-image" aria-label="Has Image"></i></span>'
: '') +
'</td>' +
('<td class="has-text-right">' +
'<a href="' +
los.urlPrefix +
'/lots?mapId=' +
map.mapId +
'">' +
map.lotCount +
'</a>' +
'</td>') +
'</tr>'
)
}
searchResultsContainerElement.innerHTML = ''
if (searchResultCount === 0) {
searchResultsContainerElement.innerHTML = `<div class="message is-info">
<p class="message-body">There are no ${los.escapedAliases.maps} that meet the search criteria.</p> <p class="message-body">There are no ${los.escapedAliases.maps} that meet the search criteria.</p>
</div>`; </div>`
} else { } else {
const searchResultsTableElement = document.createElement("table"); const searchResultsTableElement = document.createElement('table')
searchResultsTableElement.className = searchResultsTableElement.className =
"table is-fullwidth is-striped is-hoverable has-sticky-header"; 'table is-fullwidth is-striped is-hoverable has-sticky-header'
searchResultsTableElement.innerHTML = `<thead><tr> searchResultsTableElement.innerHTML = `<thead><tr>
<th>${los.escapedAliases.Map}</th> <th>${los.escapedAliases.Map}</th>
<th>Address</th> <th>Address</th>
<th>Phone Number</th> <th>Phone Number</th>
<th class="has-text-centered">Coordinates</th> <th class="has-text-centered">Coordinates</th>
<th class="has-text-centered">Image</th> <th class="has-text-centered">Image</th>
<th class="has-text-right">${los.escapedAliases.Lot} Count</th> <th class="has-text-right">${los.escapedAliases.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
formEvent.preventDefault(); .querySelector('#form--searchFilters')!
renderResults(); .addEventListener('submit', (formEvent) => {
}); formEvent.preventDefault()
renderResults()
})
renderResults(); renderResults()
})(); })()

View File

@ -2,7 +2,7 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion */ /* eslint-disable @typescript-eslint/no-non-null-assertion */
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
(() => { (() => {
const mapContainerElement = document.querySelector("#map--leaflet"); const mapContainerElement = document.querySelector('#map--leaflet');
if (mapContainerElement) { if (mapContainerElement) {
const mapLatitude = Number.parseFloat(mapContainerElement.dataset.mapLatitude); const mapLatitude = Number.parseFloat(mapContainerElement.dataset.mapLatitude);
const mapLongitude = Number.parseFloat(mapContainerElement.dataset.mapLongitude); const mapLongitude = Number.parseFloat(mapContainerElement.dataset.mapLongitude);
@ -10,9 +10,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
// eslint-disable-next-line unicorn/no-array-callback-reference // eslint-disable-next-line unicorn/no-array-callback-reference
const map = L.map(mapContainerElement); const map = L.map(mapContainerElement);
map.setView(mapCoordinates, 15); map.setView(mapCoordinates, 15);
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", { L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19, maxZoom: 19,
attribution: "© OpenStreetMap" attribution: '© OpenStreetMap'
}).addTo(map); }).addTo(map);
L.marker(mapCoordinates).addTo(map); L.marker(mapCoordinates).addTo(map);
} }

View File

@ -1,33 +1,33 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion */ /* eslint-disable @typescript-eslint/no-non-null-assertion */
import type * as Leaflet from "leaflet"; import type * as Leaflet from 'leaflet'
declare const L; declare const L
(() => { ;(() => {
const mapContainerElement = document.querySelector( const mapContainerElement = document.querySelector(
"#map--leaflet" '#map--leaflet'
) as HTMLElement; ) as HTMLElement
if (mapContainerElement) { if (mapContainerElement) {
const mapLatitude = Number.parseFloat( const mapLatitude = Number.parseFloat(
mapContainerElement.dataset.mapLatitude! mapContainerElement.dataset.mapLatitude!
); )
const mapLongitude = Number.parseFloat( const mapLongitude = Number.parseFloat(
mapContainerElement.dataset.mapLongitude! mapContainerElement.dataset.mapLongitude!
); )
const mapCoordinates: Leaflet.LatLngTuple = [mapLatitude, mapLongitude]; const mapCoordinates: Leaflet.LatLngTuple = [mapLatitude, mapLongitude]
// eslint-disable-next-line unicorn/no-array-callback-reference // eslint-disable-next-line unicorn/no-array-callback-reference
const map: Leaflet.Map = L.map(mapContainerElement); const map: Leaflet.Map = L.map(mapContainerElement)
map.setView(mapCoordinates, 15); map.setView(mapCoordinates, 15)
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", { L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19, maxZoom: 19,
attribution: "© OpenStreetMap" attribution: '© OpenStreetMap'
}).addTo(map); }).addTo(map)
L.marker(mapCoordinates).addTo(map); L.marker(mapCoordinates).addTo(map)
} }
})(); })()

View File

@ -1,28 +1,29 @@
/* eslint-disable unicorn/prefer-module */ /* eslint-disable unicorn/prefer-module */
;
(() => { (() => {
const menuTabElements = document.querySelectorAll(".menu a"); const menuTabElements = document.querySelectorAll('.menu a');
const tabContainerElements = document.querySelectorAll(".tabs-container > div"); const tabContainerElements = document.querySelectorAll('.tabs-container > div');
function selectTab(clickEvent) { function selectTab(clickEvent) {
clickEvent.preventDefault(); clickEvent.preventDefault();
// Remove .is-active from all tabs // Remove .is-active from all tabs
for (const menuTabElement of menuTabElements) { for (const menuTabElement of menuTabElements) {
menuTabElement.classList.remove("is-active"); menuTabElement.classList.remove('is-active');
} }
// Set .is-active on clicked tab // Set .is-active on clicked tab
const selectedTabElement = clickEvent.currentTarget; const selectedTabElement = clickEvent.currentTarget;
selectedTabElement.classList.add("is-active"); selectedTabElement.classList.add('is-active');
// Hide all but selected tab // Hide all but selected tab
const selectedTabContainerId = selectedTabElement.href.slice(Math.max(0, selectedTabElement.href.indexOf("#") + 1)); const selectedTabContainerId = selectedTabElement.href.slice(Math.max(0, selectedTabElement.href.indexOf('#') + 1));
for (const tabContainerElement of tabContainerElements) { for (const tabContainerElement of tabContainerElements) {
if (tabContainerElement.id === selectedTabContainerId) { if (tabContainerElement.id === selectedTabContainerId) {
tabContainerElement.classList.remove("is-hidden"); tabContainerElement.classList.remove('is-hidden');
} }
else { else {
tabContainerElement.classList.add("is-hidden"); tabContainerElement.classList.add('is-hidden');
} }
} }
} }
for (const menuTabElement of menuTabElements) { for (const menuTabElement of menuTabElements) {
menuTabElement.addEventListener("click", selectTab); menuTabElement.addEventListener('click', selectTab);
} }
})(); })();

View File

@ -1,38 +1,41 @@
/* eslint-disable unicorn/prefer-module */ /* eslint-disable unicorn/prefer-module */
(() => { ;(() => {
const menuTabElements = document.querySelectorAll(".menu a") as NodeListOf<HTMLAnchorElement>; const menuTabElements = document.querySelectorAll(
const tabContainerElements = document.querySelectorAll( '.menu a'
".tabs-container > div" ) as NodeListOf<HTMLAnchorElement>
) as NodeListOf<HTMLElement>;
function selectTab(clickEvent: Event) { const tabContainerElements = document.querySelectorAll(
clickEvent.preventDefault(); '.tabs-container > div'
) as NodeListOf<HTMLElement>
// Remove .is-active from all tabs function selectTab(clickEvent: Event) {
for (const menuTabElement of menuTabElements) { clickEvent.preventDefault()
menuTabElement.classList.remove("is-active");
}
// Set .is-active on clicked tab
const selectedTabElement = clickEvent.currentTarget as HTMLAnchorElement;
selectedTabElement.classList.add("is-active");
// Hide all but selected tab
const selectedTabContainerId = selectedTabElement.href.slice(
Math.max(0, selectedTabElement.href.indexOf("#") + 1)
);
for (const tabContainerElement of tabContainerElements) {
if (tabContainerElement.id === selectedTabContainerId) {
tabContainerElement.classList.remove("is-hidden");
} else {
tabContainerElement.classList.add("is-hidden");
}
}
}
// Remove .is-active from all tabs
for (const menuTabElement of menuTabElements) { for (const menuTabElement of menuTabElements) {
menuTabElement.addEventListener("click", selectTab); menuTabElement.classList.remove('is-active')
} }
})();
// Set .is-active on clicked tab
const selectedTabElement = clickEvent.currentTarget as HTMLAnchorElement
selectedTabElement.classList.add('is-active')
// Hide all but selected tab
const selectedTabContainerId = selectedTabElement.href.slice(
Math.max(0, selectedTabElement.href.indexOf('#') + 1)
)
for (const tabContainerElement of tabContainerElements) {
if (tabContainerElement.id === selectedTabContainerId) {
tabContainerElement.classList.remove('is-hidden')
} else {
tabContainerElement.classList.add('is-hidden')
}
}
}
for (const menuTabElement of menuTabElements) {
menuTabElement.addEventListener('click', selectTab)
}
})()

File diff suppressed because it is too large Load Diff

View File

@ -4,16 +4,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
(() => { (() => {
var _a, _b; var _a, _b;
const los = exports.los; const los = exports.los;
const workOrderId = document.querySelector("#workOrderEdit--workOrderId").value; const workOrderId = document.querySelector('#workOrderEdit--workOrderId').value;
const isCreate = workOrderId === ""; const isCreate = workOrderId === '';
const workOrderFormElement = document.querySelector("#form--workOrderEdit"); const workOrderFormElement = document.querySelector('#form--workOrderEdit');
los.initializeDatePickers(workOrderFormElement los.initializeDatePickers(workOrderFormElement
.querySelector("#workOrderEdit--workOrderOpenDateString") .querySelector('#workOrderEdit--workOrderOpenDateString')
.closest(".field")); .closest('.field'));
los.initializeUnlockFieldButtons(workOrderFormElement); los.initializeUnlockFieldButtons(workOrderFormElement);
workOrderFormElement.addEventListener("submit", (submitEvent) => { workOrderFormElement.addEventListener('submit', (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/workOrders/" + (isCreate ? "doCreateWorkOrder" : "doUpdateWorkOrder"), submitEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix +
'/workOrders/' +
(isCreate ? 'doCreateWorkOrder' : 'doUpdateWorkOrder'), submitEvent.currentTarget, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
cityssm.disableNavBlocker(); cityssm.disableNavBlocker();
if (isCreate) { if (isCreate) {
@ -21,105 +23,107 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
message: "Work Order Updated Successfully", message: 'Work Order Updated Successfully',
contextualColorName: "success" contextualColorName: 'success'
}); });
} }
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Updating Work Order", title: 'Error Updating Work Order',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
}); });
const inputElements = workOrderFormElement.querySelectorAll("input, select"); const inputElements = workOrderFormElement.querySelectorAll('input, select');
for (const inputElement of inputElements) { for (const inputElement of inputElements) {
inputElement.addEventListener("change", cityssm.enableNavBlocker); inputElement.addEventListener('change', cityssm.enableNavBlocker);
} }
/* /*
* Work Order Options * Work Order Options
*/ */
function doClose() { function doClose() {
cityssm.postJSON(los.urlPrefix + "/workOrders/doCloseWorkOrder", { cityssm.postJSON(los.urlPrefix + '/workOrders/doCloseWorkOrder', {
workOrderId workOrderId
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
window.location.href = los.urlPrefix + "/workOrders/" + workOrderId; window.location.href = los.urlPrefix + '/workOrders/' + workOrderId;
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Closing Work Order", title: 'Error Closing Work Order',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
} }
function doDelete() { function doDelete() {
cityssm.postJSON(los.urlPrefix + "/workOrders/doDeleteWorkOrder", { cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrder', {
workOrderId workOrderId
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
window.location.href = los.urlPrefix + "/workOrders"; window.location.href = los.urlPrefix + '/workOrders';
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Deleting Work Order", title: 'Error Deleting Work Order',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
} }
let workOrderMilestones; let workOrderMilestones;
(_a = document.querySelector("#button--closeWorkOrder")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", () => { (_a = document
.querySelector('#button--closeWorkOrder')) === null || _a === void 0 ? void 0 : _a.addEventListener('click', () => {
const hasOpenMilestones = workOrderMilestones.some((milestone) => { const hasOpenMilestones = workOrderMilestones.some((milestone) => {
return !milestone.workOrderMilestoneCompletionDate; return !milestone.workOrderMilestoneCompletionDate;
}); });
if (hasOpenMilestones) { if (hasOpenMilestones) {
bulmaJS.alert({ bulmaJS.alert({
title: "Outstanding Milestones", title: 'Outstanding Milestones',
message: `You cannot close a work order with outstanding milestones. message: `You cannot close a work order with outstanding milestones.
Either complete the outstanding milestones, or remove them from the work order.`, Either complete the outstanding milestones, or remove them from the work order.`,
contextualColorName: "warning" contextualColorName: 'warning'
}); });
/* /*
// Disable closing work orders with open milestones // Disable closing work orders with open milestones
bulmaJS.confirm({ bulmaJS.confirm({
title: "Close Work Order with Outstanding Milestones", title: "Close Work Order with Outstanding Milestones",
message: message:
"Are you sure you want to close this work order with outstanding milestones?", "Are you sure you want to close this work order with outstanding milestones?",
contextualColorName: "danger", contextualColorName: "danger",
okButton: { okButton: {
text: "Yes, Close Work Order", text: "Yes, Close Work Order",
callbackFunction: doClose callbackFunction: doClose
} }
}); });
*/ */
} }
else { else {
bulmaJS.confirm({ bulmaJS.confirm({
title: "Close Work Order", title: 'Close Work Order',
message: "Are you sure you want to close this work order?", message: 'Are you sure you want to close this work order?',
contextualColorName: "info", contextualColorName: 'info',
okButton: { okButton: {
text: "Yes, Close Work Order", text: 'Yes, Close Work Order',
callbackFunction: doClose callbackFunction: doClose
} }
}); });
} }
}); });
(_b = document.querySelector("#button--deleteWorkOrder")) === null || _b === void 0 ? void 0 : _b.addEventListener("click", (clickEvent) => { (_b = document
.querySelector('#button--deleteWorkOrder')) === null || _b === void 0 ? void 0 : _b.addEventListener('click', (clickEvent) => {
clickEvent.preventDefault(); clickEvent.preventDefault();
bulmaJS.confirm({ bulmaJS.confirm({
title: "Delete Work Order", title: 'Delete Work Order',
message: "Are you sure you want to delete this work order?", message: 'Are you sure you want to delete this work order?',
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: "Yes, Delete Work Order", text: 'Yes, Delete Work Order',
callbackFunction: doDelete callbackFunction: doDelete
} }
}); });
@ -144,131 +148,136 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Reopening Milestone", title: 'Error Reopening Milestone',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
} }
function completeMilestone(clickEvent) { function completeMilestone(clickEvent) {
clickEvent.preventDefault(); clickEvent.preventDefault();
const currentDateString = cityssm.dateToString(new Date()); const currentDateString = cityssm.dateToString(new Date());
const workOrderMilestoneId = Number.parseInt(clickEvent.currentTarget.closest(".container--milestone") const workOrderMilestoneId = Number.parseInt(clickEvent.currentTarget.closest('.container--milestone').dataset.workOrderMilestoneId, 10);
.dataset.workOrderMilestoneId, 10);
const workOrderMilestone = workOrderMilestones.find((currentMilestone) => { const workOrderMilestone = workOrderMilestones.find((currentMilestone) => {
return currentMilestone.workOrderMilestoneId === workOrderMilestoneId; return currentMilestone.workOrderMilestoneId === workOrderMilestoneId;
}); });
const doComplete = () => { const doComplete = () => {
cityssm.postJSON(los.urlPrefix + "/workOrders/doCompleteWorkOrderMilestone", { cityssm.postJSON(los.urlPrefix + '/workOrders/doCompleteWorkOrderMilestone', {
workOrderId, workOrderId,
workOrderMilestoneId workOrderMilestoneId
}, processMilestoneResponse); }, processMilestoneResponse);
}; };
bulmaJS.confirm({ bulmaJS.confirm({
title: "Complete Milestone", title: 'Complete Milestone',
message: "Are you sure you want to complete this milestone?" + message: 'Are you sure you want to complete this milestone?' +
(workOrderMilestone.workOrderMilestoneDateString > currentDateString (workOrderMilestone.workOrderMilestoneDateString > currentDateString
? "<br /><strong>Note that this milestone is expected to be completed in the future.</strong>" ? '<br /><strong>Note that this milestone is expected to be completed in the future.</strong>'
: ""), : ''),
messageIsHtml: true, messageIsHtml: true,
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: "Yes, Complete Milestone", text: 'Yes, Complete Milestone',
callbackFunction: doComplete callbackFunction: doComplete
} }
}); });
} }
function reopenMilestone(clickEvent) { function reopenMilestone(clickEvent) {
clickEvent.preventDefault(); clickEvent.preventDefault();
const workOrderMilestoneId = clickEvent.currentTarget.closest(".container--milestone").dataset.workOrderMilestoneId; const workOrderMilestoneId = clickEvent.currentTarget.closest('.container--milestone').dataset.workOrderMilestoneId;
const doReopen = () => { const doReopen = () => {
cityssm.postJSON(los.urlPrefix + "/workOrders/doReopenWorkOrderMilestone", { cityssm.postJSON(los.urlPrefix + '/workOrders/doReopenWorkOrderMilestone', {
workOrderId, workOrderId,
workOrderMilestoneId workOrderMilestoneId
}, processMilestoneResponse); }, processMilestoneResponse);
}; };
bulmaJS.confirm({ bulmaJS.confirm({
title: "Reopen Milestone", title: 'Reopen Milestone',
message: "Are you sure you want to remove the completion status from this milestone, and reopen it?", message: 'Are you sure you want to remove the completion status from this milestone, and reopen it?',
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: "Yes, Reopen Milestone", text: 'Yes, Reopen Milestone',
callbackFunction: doReopen callbackFunction: doReopen
} }
}); });
} }
function deleteMilestone(clickEvent) { function deleteMilestone(clickEvent) {
clickEvent.preventDefault(); clickEvent.preventDefault();
const workOrderMilestoneId = clickEvent.currentTarget.closest(".container--milestone").dataset.workOrderMilestoneId; const workOrderMilestoneId = clickEvent.currentTarget.closest('.container--milestone').dataset.workOrderMilestoneId;
const doDelete = () => { const doDelete = () => {
cityssm.postJSON(los.urlPrefix + "/workOrders/doDeleteWorkOrderMilestone", { cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrderMilestone', {
workOrderMilestoneId, workOrderMilestoneId,
workOrderId workOrderId
}, processMilestoneResponse); }, processMilestoneResponse);
}; };
bulmaJS.confirm({ bulmaJS.confirm({
title: "Delete Milestone", title: 'Delete Milestone',
message: "Are you sure you want to delete this milestone?", message: 'Are you sure you want to delete this milestone?',
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: "Yes, Delete Milestone", text: 'Yes, Delete Milestone',
callbackFunction: doDelete callbackFunction: doDelete
} }
}); });
} }
function editMilestone(clickEvent) { function editMilestone(clickEvent) {
clickEvent.preventDefault(); clickEvent.preventDefault();
const workOrderMilestoneId = Number.parseInt(clickEvent.currentTarget.closest(".container--milestone") const workOrderMilestoneId = Number.parseInt(clickEvent.currentTarget.closest('.container--milestone').dataset.workOrderMilestoneId, 10);
.dataset.workOrderMilestoneId, 10);
const workOrderMilestone = workOrderMilestones.find((currentMilestone) => { const workOrderMilestone = workOrderMilestones.find((currentMilestone) => {
return currentMilestone.workOrderMilestoneId === workOrderMilestoneId; return currentMilestone.workOrderMilestoneId === workOrderMilestoneId;
}); });
let editCloseModalFunction; let editCloseModalFunction;
const doEdit = (submitEvent) => { const doEdit = (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/workOrders/doUpdateWorkOrderMilestone", submitEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/workOrders/doUpdateWorkOrderMilestone', submitEvent.currentTarget, (responseJSON) => {
processMilestoneResponse(responseJSON); processMilestoneResponse(responseJSON);
if (responseJSON.success) { if (responseJSON.success) {
editCloseModalFunction(); editCloseModalFunction();
} }
}); });
}; };
cityssm.openHtmlModal("workOrder-editMilestone", { cityssm.openHtmlModal('workOrder-editMilestone', {
onshow(modalElement) { onshow(modalElement) {
modalElement.querySelector("#milestoneEdit--workOrderId").value = ;
workOrderId; modalElement.querySelector('#milestoneEdit--workOrderId').value = workOrderId;
modalElement.querySelector("#milestoneEdit--workOrderMilestoneId").value = workOrderMilestone.workOrderMilestoneId.toString(); modalElement.querySelector('#milestoneEdit--workOrderMilestoneId').value = workOrderMilestone.workOrderMilestoneId.toString();
const milestoneTypeElement = modalElement.querySelector("#milestoneEdit--workOrderMilestoneTypeId"); const milestoneTypeElement = modalElement.querySelector('#milestoneEdit--workOrderMilestoneTypeId');
let milestoneTypeFound = false; let milestoneTypeFound = false;
for (const milestoneType of exports.workOrderMilestoneTypes) { for (const milestoneType of exports.workOrderMilestoneTypes) {
const optionElement = document.createElement("option"); const optionElement = document.createElement('option');
optionElement.value = milestoneType.workOrderMilestoneTypeId.toString(); optionElement.value =
milestoneType.workOrderMilestoneTypeId.toString();
optionElement.textContent = milestoneType.workOrderMilestoneType; optionElement.textContent = milestoneType.workOrderMilestoneType;
if (milestoneType.workOrderMilestoneTypeId === workOrderMilestone.workOrderMilestoneTypeId) { if (milestoneType.workOrderMilestoneTypeId ===
workOrderMilestone.workOrderMilestoneTypeId) {
optionElement.selected = true; optionElement.selected = true;
milestoneTypeFound = true; milestoneTypeFound = true;
} }
milestoneTypeElement.append(optionElement); milestoneTypeElement.append(optionElement);
} }
if (!milestoneTypeFound && workOrderMilestone.workOrderMilestoneTypeId) { if (!milestoneTypeFound &&
const optionElement = document.createElement("option"); workOrderMilestone.workOrderMilestoneTypeId) {
optionElement.value = workOrderMilestone.workOrderMilestoneTypeId.toString(); const optionElement = document.createElement('option');
optionElement.value =
workOrderMilestone.workOrderMilestoneTypeId.toString();
optionElement.textContent = workOrderMilestone.workOrderMilestoneType; optionElement.textContent = workOrderMilestone.workOrderMilestoneType;
optionElement.selected = true; optionElement.selected = true;
milestoneTypeElement.append(optionElement); milestoneTypeElement.append(optionElement);
} }
modalElement.querySelector("#milestoneEdit--workOrderMilestoneDateString").value = workOrderMilestone.workOrderMilestoneDateString; ;
modalElement.querySelector('#milestoneEdit--workOrderMilestoneDateString').value = workOrderMilestone.workOrderMilestoneDateString;
if (workOrderMilestone.workOrderMilestoneTime) { if (workOrderMilestone.workOrderMilestoneTime) {
modalElement.querySelector("#milestoneEdit--workOrderMilestoneTimeString").value = workOrderMilestone.workOrderMilestoneTimeString; ;
modalElement.querySelector('#milestoneEdit--workOrderMilestoneTimeString').value = workOrderMilestone.workOrderMilestoneTimeString;
} }
modalElement.querySelector("#milestoneEdit--workOrderMilestoneDescription").value = workOrderMilestone.workOrderMilestoneDescription; ;
modalElement.querySelector('#milestoneEdit--workOrderMilestoneDescription').value = workOrderMilestone.workOrderMilestoneDescription;
}, },
onshown(modalElement, closeModalFunction) { onshown(modalElement, closeModalFunction) {
editCloseModalFunction = closeModalFunction; editCloseModalFunction = closeModalFunction;
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
los.initializeDatePickers(modalElement); los.initializeDatePickers(modalElement);
// los.initializeTimePickers(modalElement); // los.initializeTimePickers(modalElement);
modalElement.querySelector("form").addEventListener("submit", doEdit); modalElement.querySelector('form').addEventListener('submit', doEdit);
}, },
onremoved() { onremoved() {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
@ -278,15 +287,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
function renderMilestones() { function renderMilestones() {
var _a, _b, _c; var _a, _b, _c;
// Clear milestones panel // Clear milestones panel
const milestonesPanelElement = document.querySelector("#panel--milestones"); const milestonesPanelElement = document.querySelector('#panel--milestones');
const panelBlockElementsToDelete = milestonesPanelElement.querySelectorAll(".panel-block"); const panelBlockElementsToDelete = milestonesPanelElement.querySelectorAll('.panel-block');
for (const panelBlockToDelete of panelBlockElementsToDelete) { for (const panelBlockToDelete of panelBlockElementsToDelete) {
panelBlockToDelete.remove(); panelBlockToDelete.remove();
} }
for (const milestone of workOrderMilestones) { for (const milestone of workOrderMilestones) {
const panelBlockElement = document.createElement("div"); const panelBlockElement = document.createElement('div');
panelBlockElement.className = "panel-block is-block container--milestone"; panelBlockElement.className = 'panel-block is-block container--milestone';
panelBlockElement.dataset.workOrderMilestoneId = milestone.workOrderMilestoneId.toString(); panelBlockElement.dataset.workOrderMilestoneId =
milestone.workOrderMilestoneId.toString();
panelBlockElement.innerHTML = panelBlockElement.innerHTML =
'<div class="columns is-mobile">' + '<div class="columns is-mobile">' +
('<div class="column is-narrow">' + ('<div class="column is-narrow">' +
@ -297,70 +307,75 @@ Object.defineProperty(exports, "__esModule", { value: true });
milestone.workOrderMilestoneCompletionDateString + milestone.workOrderMilestoneCompletionDateString +
'">' + '">' +
'<span class="icon is-small"><i class="fas fa-check" aria-hidden="true"></i></span>' + '<span class="icon is-small"><i class="fas fa-check" aria-hidden="true"></i></span>' +
"</span>" '</span>'
: '<button class="button button--completeMilestone" data-tooltip="Incomplete" type="button" aria-label="Incomplete">' + : '<button class="button button--completeMilestone" data-tooltip="Incomplete" type="button" aria-label="Incomplete">' +
'<span class="icon is-small"><i class="far fa-square" aria-hidden="true"></i></span>' + '<span class="icon is-small"><i class="far fa-square" aria-hidden="true"></i></span>' +
"</button>") + '</button>') +
"</div>") + '</div>') +
('<div class="column">' + ('<div class="column">' +
(milestone.workOrderMilestoneTypeId (milestone.workOrderMilestoneTypeId
? "<strong>" + ? '<strong>' +
cityssm.escapeHTML(milestone.workOrderMilestoneType || "") + cityssm.escapeHTML(milestone.workOrderMilestoneType || '') +
"</strong><br />" '</strong><br />'
: "") + : '') +
milestone.workOrderMilestoneDateString + milestone.workOrderMilestoneDateString +
(milestone.workOrderMilestoneTime ? " " + milestone.workOrderMilestoneTimeString : "") + (milestone.workOrderMilestoneTime
"<br />" + ? ' ' + milestone.workOrderMilestoneTimeString
: '') +
'<br />' +
'<span class="is-size-7">' + '<span class="is-size-7">' +
cityssm.escapeHTML(milestone.workOrderMilestoneDescription || "") + cityssm.escapeHTML(milestone.workOrderMilestoneDescription || '') +
"</span>" + '</span>' +
"</div>") + '</div>') +
('<div class="column is-narrow">' + ('<div class="column is-narrow">' +
'<div class="dropdown is-right">' + '<div class="dropdown is-right">' +
('<div class="dropdown-trigger">' + ('<div class="dropdown-trigger">' +
'<button class="button is-small" data-tooltip="Options" type="button" aria-label="Options">' + '<button class="button is-small" data-tooltip="Options" type="button" aria-label="Options">' +
'<i class="fas fa-ellipsis-v" aria-hidden="true"></i>' + '<i class="fas fa-ellipsis-v" aria-hidden="true"></i>' +
"</button>" + '</button>' +
"</div>") + '</div>') +
('<div class="dropdown-menu">' + ('<div class="dropdown-menu">' +
'<div class="dropdown-content">' + '<div class="dropdown-content">' +
(milestone.workOrderMilestoneCompletionDate (milestone.workOrderMilestoneCompletionDate
? '<a class="dropdown-item button--reopenMilestone" href="#">' + ? '<a class="dropdown-item button--reopenMilestone" href="#">' +
'<span class="icon is-small"><i class="fas fa-times" aria-hidden="true"></i></span>' + '<span class="icon is-small"><i class="fas fa-times" aria-hidden="true"></i></span>' +
" <span>Reopen Milestone</span>" + ' <span>Reopen Milestone</span>' +
"</a>" '</a>'
: '<a class="dropdown-item button--editMilestone" href="#">' + : '<a class="dropdown-item button--editMilestone" href="#">' +
'<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 Milestone</span>" + ' <span>Edit Milestone</span>' +
"</a>") + '</a>') +
'<hr class="dropdown-divider" />' + '<hr class="dropdown-divider" />' +
'<a class="dropdown-item button--deleteMilestone" href="#">' + '<a class="dropdown-item button--deleteMilestone" href="#">' +
'<span class="icon is-small"><i class="fas fa-trash has-text-danger" aria-hidden="true"></i></span>' + '<span class="icon is-small"><i class="fas fa-trash has-text-danger" aria-hidden="true"></i></span>' +
" <span>Delete Milestone</span>" + ' <span>Delete Milestone</span>' +
"</a>" + '</a>' +
"</div>" + '</div>' +
"</div>") + '</div>') +
"</div>" + '</div>' +
"</div>") + '</div>') +
"</div>"; '</div>';
(_a = panelBlockElement (_a = panelBlockElement
.querySelector(".button--reopenMilestone")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", reopenMilestone); .querySelector('.button--reopenMilestone')) === null || _a === void 0 ? void 0 : _a.addEventListener('click', reopenMilestone);
(_b = panelBlockElement (_b = panelBlockElement
.querySelector(".button--editMilestone")) === null || _b === void 0 ? void 0 : _b.addEventListener("click", editMilestone); .querySelector('.button--editMilestone')) === null || _b === void 0 ? void 0 : _b.addEventListener('click', editMilestone);
(_c = panelBlockElement (_c = panelBlockElement
.querySelector(".button--completeMilestone")) === null || _c === void 0 ? void 0 : _c.addEventListener("click", completeMilestone); .querySelector('.button--completeMilestone')) === null || _c === void 0 ? void 0 : _c.addEventListener('click', completeMilestone);
panelBlockElement panelBlockElement
.querySelector(".button--deleteMilestone") .querySelector('.button--deleteMilestone')
.addEventListener("click", deleteMilestone); .addEventListener('click', deleteMilestone);
milestonesPanelElement.append(panelBlockElement); milestonesPanelElement.append(panelBlockElement);
} }
bulmaJS.init(milestonesPanelElement); bulmaJS.init(milestonesPanelElement);
} }
if (!isCreate) { if (!isCreate) {
workOrderMilestones = exports.workOrderMilestones; workOrderMilestones =
exports.workOrderMilestones;
delete exports.workOrderMilestones; delete exports.workOrderMilestones;
renderMilestones(); renderMilestones();
document.querySelector("#button--addMilestone").addEventListener("click", () => { document
.querySelector('#button--addMilestone')
.addEventListener('click', () => {
let addModalElement; let addModalElement;
let addFormElement; let addFormElement;
let addCloseModalFunction; let addCloseModalFunction;
@ -370,20 +385,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
const currentDateString = cityssm.dateToString(new Date()); const currentDateString = cityssm.dateToString(new Date());
function _doAdd() { function _doAdd() {
cityssm.postJSON(los.urlPrefix + "/workOrders/doAddWorkOrderMilestone", addFormElement, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/workOrders/doAddWorkOrderMilestone', addFormElement, (responseJSON) => {
processMilestoneResponse(responseJSON); processMilestoneResponse(responseJSON);
if (responseJSON.success) { if (responseJSON.success) {
addCloseModalFunction(); addCloseModalFunction();
} }
}); });
} }
if (addModalElement.querySelector("#milestoneAdd--workOrderMilestoneDateString").value < currentDateString) { if (addModalElement.querySelector('#milestoneAdd--workOrderMilestoneDateString').value < currentDateString) {
bulmaJS.confirm({ bulmaJS.confirm({
title: "Milestone Date in the Past", title: 'Milestone Date in the Past',
message: "Are you sure you want to create a milestone with a date in the past?", message: 'Are you sure you want to create a milestone with a date in the past?',
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: "Yes, Create a Past Milestone", text: 'Yes, Create a Past Milestone',
callbackFunction: _doAdd callbackFunction: _doAdd
} }
}); });
@ -392,18 +407,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
_doAdd(); _doAdd();
} }
}; };
cityssm.openHtmlModal("workOrder-addMilestone", { cityssm.openHtmlModal('workOrder-addMilestone', {
onshow(modalElement) { onshow(modalElement) {
modalElement.querySelector("#milestoneAdd--workOrderId").value = ;
workOrderId; modalElement.querySelector('#milestoneAdd--workOrderId').value = workOrderId;
const milestoneTypeElement = modalElement.querySelector("#milestoneAdd--workOrderMilestoneTypeId"); const milestoneTypeElement = modalElement.querySelector('#milestoneAdd--workOrderMilestoneTypeId');
for (const milestoneType of exports.workOrderMilestoneTypes) { for (const milestoneType of exports.workOrderMilestoneTypes) {
const optionElement = document.createElement("option"); const optionElement = document.createElement('option');
optionElement.value = milestoneType.workOrderMilestoneTypeId.toString(); optionElement.value =
milestoneType.workOrderMilestoneTypeId.toString();
optionElement.textContent = milestoneType.workOrderMilestoneType; optionElement.textContent = milestoneType.workOrderMilestoneType;
milestoneTypeElement.append(optionElement); milestoneTypeElement.append(optionElement);
} }
modalElement.querySelector("#milestoneAdd--workOrderMilestoneDateString").valueAsDate = new Date(); ;
modalElement.querySelector('#milestoneAdd--workOrderMilestoneDateString').valueAsDate = new Date();
}, },
onshown(modalElement, closeModalFunction) { onshown(modalElement, closeModalFunction) {
addModalElement = modalElement; addModalElement = modalElement;
@ -411,8 +428,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
los.initializeDatePickers(modalElement); los.initializeDatePickers(modalElement);
// los.initializeTimePickers(modalElement); // los.initializeTimePickers(modalElement);
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
addFormElement = modalElement.querySelector("form"); addFormElement = modalElement.querySelector('form');
addFormElement.addEventListener("submit", doAdd); addFormElement.addEventListener('submit', doAdd);
}, },
onremoved() { onremoved() {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();

File diff suppressed because it is too large Load Diff

View File

@ -5,7 +5,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
let workOrderComments = exports.workOrderComments; let workOrderComments = exports.workOrderComments;
delete exports.workOrderComments; delete exports.workOrderComments;
const openEditWorkOrderComment = (clickEvent) => { const openEditWorkOrderComment = (clickEvent) => {
const workOrderCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.workOrderCommentId, 10); const workOrderCommentId = Number.parseInt(clickEvent.currentTarget.closest('tr').dataset
.workOrderCommentId, 10);
const workOrderComment = workOrderComments.find((currentComment) => { const workOrderComment = workOrderComments.find((currentComment) => {
return currentComment.workOrderCommentId === workOrderCommentId; return currentComment.workOrderCommentId === workOrderCommentId;
}); });
@ -13,7 +14,7 @@ const openEditWorkOrderComment = (clickEvent) => {
let editCloseModalFunction; let editCloseModalFunction;
function editComment(submitEvent) { function editComment(submitEvent) {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/workOrders/doUpdateWorkOrderComment", editFormElement, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/workOrders/doUpdateWorkOrderComment', editFormElement, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderComments = responseJSON.workOrderComments; workOrderComments = responseJSON.workOrderComments;
editCloseModalFunction(); editCloseModalFunction();
@ -21,35 +22,35 @@ const openEditWorkOrderComment = (clickEvent) => {
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Updating Comment", title: 'Error Updating Comment',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
} }
cityssm.openHtmlModal("workOrder-editComment", { cityssm.openHtmlModal('workOrder-editComment', {
onshow(modalElement) { onshow(modalElement) {
modalElement.querySelector("#workOrderCommentEdit--workOrderId").value = ;
workOrderId; modalElement.querySelector('#workOrderCommentEdit--workOrderId').value = workOrderId;
modalElement.querySelector("#workOrderCommentEdit--workOrderCommentId").value = workOrderCommentId.toString(); modalElement.querySelector('#workOrderCommentEdit--workOrderCommentId').value = workOrderCommentId.toString();
modalElement.querySelector("#workOrderCommentEdit--workOrderComment").value = workOrderComment.workOrderComment; modalElement.querySelector('#workOrderCommentEdit--workOrderComment').value = workOrderComment.workOrderComment;
const workOrderCommentDateStringElement = modalElement.querySelector("#workOrderCommentEdit--workOrderCommentDateString"); const workOrderCommentDateStringElement = modalElement.querySelector('#workOrderCommentEdit--workOrderCommentDateString');
workOrderCommentDateStringElement.value = workOrderComment.workOrderCommentDateString; workOrderCommentDateStringElement.value =
workOrderComment.workOrderCommentDateString;
const currentDateString = cityssm.dateToString(new Date()); const currentDateString = cityssm.dateToString(new Date());
workOrderCommentDateStringElement.max = workOrderCommentDateStringElement.max =
workOrderComment.workOrderCommentDateString <= currentDateString workOrderComment.workOrderCommentDateString <= currentDateString
? currentDateString ? currentDateString
: workOrderComment.workOrderCommentDateString; : workOrderComment.workOrderCommentDateString;
modalElement.querySelector("#workOrderCommentEdit--workOrderCommentTimeString").value = workOrderComment.workOrderCommentTimeString; modalElement.querySelector('#workOrderCommentEdit--workOrderCommentTimeString').value = workOrderComment.workOrderCommentTimeString;
}, },
onshown(modalElement, closeModalFunction) { onshown(modalElement, closeModalFunction) {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
los.initializeDatePickers(modalElement); los.initializeDatePickers(modalElement);
// los.initializeTimePickers(modalElement); modalElement.querySelector('#workOrderCommentEdit--workOrderComment').focus();
modalElement.querySelector("#workOrderCommentEdit--workOrderComment").focus(); editFormElement = modalElement.querySelector('form');
editFormElement = modalElement.querySelector("form"); editFormElement.addEventListener('submit', editComment);
editFormElement.addEventListener("submit", editComment);
editCloseModalFunction = closeModalFunction; editCloseModalFunction = closeModalFunction;
}, },
onremoved() { onremoved() {
@ -58,9 +59,10 @@ const openEditWorkOrderComment = (clickEvent) => {
}); });
}; };
function deleteWorkOrderComment(clickEvent) { function deleteWorkOrderComment(clickEvent) {
const workOrderCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.workOrderCommentId, 10); const workOrderCommentId = Number.parseInt(clickEvent.currentTarget.closest('tr').dataset
.workOrderCommentId, 10);
function doDelete() { function doDelete() {
cityssm.postJSON(los.urlPrefix + "/workOrders/doDeleteWorkOrderComment", { cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrderComment', {
workOrderId, workOrderId,
workOrderCommentId workOrderCommentId
}, (responseJSON) => { }, (responseJSON) => {
@ -70,77 +72,82 @@ function deleteWorkOrderComment(clickEvent) {
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Removing Comment", title: 'Error Removing Comment',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
} }
bulmaJS.confirm({ bulmaJS.confirm({
title: "Remove Comment?", title: 'Remove Comment?',
message: "Are you sure you want to remove this comment?", message: 'Are you sure you want to remove this comment?',
okButton: { okButton: {
text: "Yes, Remove Comment", text: 'Yes, Remove Comment',
callbackFunction: doDelete callbackFunction: doDelete
}, },
contextualColorName: "warning" contextualColorName: 'warning'
}); });
} }
function renderWorkOrderComments() { function renderWorkOrderComments() {
const containerElement = document.querySelector("#container--workOrderComments"); const containerElement = document.querySelector('#container--workOrderComments');
if (workOrderComments.length === 0) { if (workOrderComments.length === 0) {
containerElement.innerHTML = `<div class="message is-info"> containerElement.innerHTML = `<div class="message is-info">
<p class="message-body">There are no comments to display.</p> <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></tr></thead><tbody></tbody>`; <th class="is-hidden-print"><span class="is-sr-only">Options</span></th></tr></thead><tbody></tbody>`;
for (const workOrderComment of workOrderComments) { for (const workOrderComment of workOrderComments) {
const tableRowElement = document.createElement("tr"); const tableRowElement = document.createElement('tr');
tableRowElement.dataset.workOrderCommentId = workOrderComment.workOrderCommentId.toString(); tableRowElement.dataset.workOrderCommentId =
workOrderComment.workOrderCommentId.toString();
tableRowElement.innerHTML = tableRowElement.innerHTML =
"<td>" + '<td>' +
cityssm.escapeHTML(workOrderComment.recordCreate_userName || "") + cityssm.escapeHTML(workOrderComment.recordCreate_userName || '') +
"</td>" + '</td>' +
"<td>" + '<td>' +
workOrderComment.workOrderCommentDateString + workOrderComment.workOrderCommentDateString +
(workOrderComment.workOrderCommentTime === 0 (workOrderComment.workOrderCommentTime === 0
? "" ? ''
: " " + workOrderComment.workOrderCommentTimeString) + : ' ' + workOrderComment.workOrderCommentTimeString) +
"</td>" + '</td>' +
"<td>" + '<td>' +
cityssm.escapeHTML(workOrderComment.workOrderComment || "") + cityssm.escapeHTML(workOrderComment.workOrderComment || '') +
"</td>" + '</td>' +
('<td class="is-hidden-print">' + ('<td class="is-hidden-print">' +
'<div class="buttons are-small is-justify-content-end">' + '<div class="buttons are-small is-justify-content-end">' +
('<button class="button is-primary button--edit" type="button">' + ('<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 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", openEditWorkOrderComment); tableRowElement
tableRowElement.querySelector(".button--delete").addEventListener("click", deleteWorkOrderComment); .querySelector('.button--edit')
tableElement.querySelector("tbody").append(tableRowElement); .addEventListener('click', openEditWorkOrderComment);
tableRowElement
.querySelector('.button--delete')
.addEventListener('click', deleteWorkOrderComment);
tableElement.querySelector('tbody').append(tableRowElement);
} }
containerElement.innerHTML = ""; containerElement.innerHTML = '';
containerElement.append(tableElement); containerElement.append(tableElement);
} }
function openAddCommentModal() { function openAddCommentModal() {
let addCommentCloseModalFunction; let addCommentCloseModalFunction;
function doAddComment(formEvent) { function doAddComment(formEvent) {
formEvent.preventDefault(); formEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/workOrders/doAddWorkOrderComment", formEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/workOrders/doAddWorkOrderComment', formEvent.currentTarget, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderComments = responseJSON.workOrderComments; workOrderComments = responseJSON.workOrderComments;
renderWorkOrderComments(); renderWorkOrderComments();
@ -148,25 +155,27 @@ function openAddCommentModal() {
} }
}); });
} }
cityssm.openHtmlModal("workOrder-addComment", { cityssm.openHtmlModal('workOrder-addComment', {
onshow(modalElement) { onshow(modalElement) {
los.populateAliases(modalElement); los.populateAliases(modalElement);
modalElement.querySelector("#workOrderCommentAdd--workOrderId").value = modalElement.querySelector('#workOrderCommentAdd--workOrderId').value = workOrderId;
workOrderId; modalElement
modalElement.querySelector("form").addEventListener("submit", doAddComment); .querySelector('form')
.addEventListener('submit', doAddComment);
}, },
onshown(modalElement, closeModalFunction) { onshown(modalElement, closeModalFunction) {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
addCommentCloseModalFunction = closeModalFunction; addCommentCloseModalFunction = closeModalFunction;
modalElement.querySelector("#workOrderCommentAdd--workOrderComment").focus(); modalElement.querySelector('#workOrderCommentAdd--workOrderComment').focus();
}, },
onremoved() { onremoved() {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
document.querySelector("#workOrderComments--add").focus(); document.querySelector('#workOrderComments--add').focus();
} }
}); });
} }
(_a = document.querySelector("#workOrderComments--add")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", openAddCommentModal); (_a = document
.querySelector('#workOrderComments--add')) === null || _a === void 0 ? void 0 : _a.addEventListener('click', openAddCommentModal);
if (!isCreate) { if (!isCreate) {
renderWorkOrderComments(); renderWorkOrderComments();
} }

View File

@ -1,256 +1,290 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
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 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'
declare const cityssm: cityssmGlobal; declare const cityssm: cityssmGlobal
declare const bulmaJS: BulmaJS; declare const bulmaJS: BulmaJS
declare const los: globalTypes.LOS; declare const los: globalTypes.LOS
declare const workOrderId: string; declare const workOrderId: string
declare const isCreate: boolean; declare const isCreate: boolean
let workOrderComments: recordTypes.WorkOrderComment[] = exports.workOrderComments; let workOrderComments: recordTypes.WorkOrderComment[] =
delete exports.workOrderComments; exports.workOrderComments
delete exports.workOrderComments
const openEditWorkOrderComment = (clickEvent: Event) => { const openEditWorkOrderComment = (clickEvent: Event) => {
const workOrderCommentId = Number.parseInt( const workOrderCommentId = Number.parseInt(
(clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.workOrderCommentId!, (clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset
10 .workOrderCommentId!,
); 10
)
const workOrderComment = workOrderComments.find((currentComment) => { const workOrderComment = workOrderComments.find((currentComment) => {
return currentComment.workOrderCommentId === workOrderCommentId; return currentComment.workOrderCommentId === workOrderCommentId
})!; })!
let editFormElement: HTMLFormElement; let editFormElement: HTMLFormElement
let editCloseModalFunction: () => void; let editCloseModalFunction: () => void
function editComment(submitEvent: SubmitEvent): void { function editComment(submitEvent: SubmitEvent): void {
submitEvent.preventDefault(); submitEvent.preventDefault()
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + "/workOrders/doUpdateWorkOrderComment", los.urlPrefix + '/workOrders/doUpdateWorkOrderComment',
editFormElement, editFormElement,
(responseJSON: { (responseJSON: {
success: boolean; success: boolean
errorMessage?: string; errorMessage?: string
workOrderComments?: recordTypes.WorkOrderComment[]; workOrderComments?: recordTypes.WorkOrderComment[]
}) => { }) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderComments = responseJSON.workOrderComments!; workOrderComments = responseJSON.workOrderComments!
editCloseModalFunction(); editCloseModalFunction()
renderWorkOrderComments(); renderWorkOrderComments()
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Updating Comment", title: 'Error Updating Comment',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); })
}
}
);
}
cityssm.openHtmlModal("workOrder-editComment", {
onshow(modalElement) {
(modalElement.querySelector("#workOrderCommentEdit--workOrderId") as HTMLInputElement).value =
workOrderId;
(
modalElement.querySelector("#workOrderCommentEdit--workOrderCommentId") as HTMLInputElement
).value = workOrderCommentId.toString();
(
modalElement.querySelector("#workOrderCommentEdit--workOrderComment") as HTMLInputElement
).value = workOrderComment.workOrderComment!;
const workOrderCommentDateStringElement = modalElement.querySelector(
"#workOrderCommentEdit--workOrderCommentDateString"
) as HTMLInputElement;
workOrderCommentDateStringElement.value = workOrderComment.workOrderCommentDateString!;
const currentDateString = cityssm.dateToString(new Date());
workOrderCommentDateStringElement.max =
workOrderComment.workOrderCommentDateString! <= currentDateString
? currentDateString
: workOrderComment.workOrderCommentDateString!;
(
modalElement.querySelector(
"#workOrderCommentEdit--workOrderCommentTimeString"
) as HTMLInputElement
).value = workOrderComment.workOrderCommentTimeString!;
},
onshown(modalElement, closeModalFunction) {
bulmaJS.toggleHtmlClipped();
los.initializeDatePickers(modalElement);
// los.initializeTimePickers(modalElement);
(
modalElement.querySelector("#workOrderCommentEdit--workOrderComment") as HTMLTextAreaElement
).focus();
editFormElement = modalElement.querySelector("form")!;
editFormElement.addEventListener("submit", editComment);
editCloseModalFunction = closeModalFunction;
},
onremoved() {
bulmaJS.toggleHtmlClipped();
} }
}); }
}; )
}
cityssm.openHtmlModal('workOrder-editComment', {
onshow(modalElement) {
;(
modalElement.querySelector(
'#workOrderCommentEdit--workOrderId'
) as HTMLInputElement
).value = workOrderId
;(
modalElement.querySelector(
'#workOrderCommentEdit--workOrderCommentId'
) as HTMLInputElement
).value = workOrderCommentId.toString()
;(
modalElement.querySelector(
'#workOrderCommentEdit--workOrderComment'
) as HTMLInputElement
).value = workOrderComment.workOrderComment!
const workOrderCommentDateStringElement = modalElement.querySelector(
'#workOrderCommentEdit--workOrderCommentDateString'
) as HTMLInputElement
workOrderCommentDateStringElement.value =
workOrderComment.workOrderCommentDateString!
const currentDateString = cityssm.dateToString(new Date())
workOrderCommentDateStringElement.max =
workOrderComment.workOrderCommentDateString! <= currentDateString
? currentDateString
: workOrderComment.workOrderCommentDateString!
;(
modalElement.querySelector(
'#workOrderCommentEdit--workOrderCommentTimeString'
) as HTMLInputElement
).value = workOrderComment.workOrderCommentTimeString!
},
onshown(modalElement, closeModalFunction) {
bulmaJS.toggleHtmlClipped()
los.initializeDatePickers(modalElement)
// los.initializeTimePickers(modalElement);
;(
modalElement.querySelector(
'#workOrderCommentEdit--workOrderComment'
) as HTMLTextAreaElement
).focus()
editFormElement = modalElement.querySelector('form')!
editFormElement.addEventListener('submit', editComment)
editCloseModalFunction = closeModalFunction
},
onremoved() {
bulmaJS.toggleHtmlClipped()
}
})
}
function deleteWorkOrderComment(clickEvent: Event): void { function deleteWorkOrderComment(clickEvent: Event): void {
const workOrderCommentId = Number.parseInt( const workOrderCommentId = Number.parseInt(
(clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.workOrderCommentId!, (clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset
10 .workOrderCommentId!,
); 10
)
function doDelete() { function doDelete() {
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + "/workOrders/doDeleteWorkOrderComment", los.urlPrefix + '/workOrders/doDeleteWorkOrderComment',
{ {
workOrderId, workOrderId,
workOrderCommentId workOrderCommentId
}, },
(responseJSON: { (responseJSON: {
success: boolean; success: boolean
errorMessage?: string; errorMessage?: string
workOrderComments: recordTypes.WorkOrderComment[]; workOrderComments: recordTypes.WorkOrderComment[]
}) => { }) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderComments = responseJSON.workOrderComments; workOrderComments = responseJSON.workOrderComments
renderWorkOrderComments(); renderWorkOrderComments()
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Removing Comment", title: 'Error Removing Comment',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); })
} }
} }
); )
} }
bulmaJS.confirm({ bulmaJS.confirm({
title: "Remove Comment?", title: 'Remove Comment?',
message: "Are you sure you want to remove this comment?", message: 'Are you sure you want to remove this comment?',
okButton: { okButton: {
text: "Yes, Remove Comment", text: 'Yes, Remove Comment',
callbackFunction: doDelete callbackFunction: doDelete
}, },
contextualColorName: "warning" contextualColorName: 'warning'
}); })
} }
function renderWorkOrderComments() { function renderWorkOrderComments() {
const containerElement = document.querySelector("#container--workOrderComments") as HTMLElement; const containerElement = document.querySelector(
'#container--workOrderComments'
) as HTMLElement
if (workOrderComments.length === 0) { if (workOrderComments.length === 0) {
containerElement.innerHTML = `<div class="message is-info"> containerElement.innerHTML = `<div class="message is-info">
<p class="message-body">There are no comments to display.</p> <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></tr></thead><tbody></tbody>`; <th class="is-hidden-print"><span class="is-sr-only">Options</span></th></tr></thead><tbody></tbody>`
for (const workOrderComment of workOrderComments) { for (const workOrderComment of workOrderComments) {
const tableRowElement = document.createElement("tr"); const tableRowElement = document.createElement('tr')
tableRowElement.dataset.workOrderCommentId = workOrderComment.workOrderCommentId!.toString(); tableRowElement.dataset.workOrderCommentId =
workOrderComment.workOrderCommentId!.toString()
tableRowElement.innerHTML = tableRowElement.innerHTML =
"<td>" + '<td>' +
cityssm.escapeHTML(workOrderComment.recordCreate_userName || "") + cityssm.escapeHTML(workOrderComment.recordCreate_userName || '') +
"</td>" + '</td>' +
"<td>" + '<td>' +
workOrderComment.workOrderCommentDateString + workOrderComment.workOrderCommentDateString +
(workOrderComment.workOrderCommentTime === 0 (workOrderComment.workOrderCommentTime === 0
? "" ? ''
: " " + workOrderComment.workOrderCommentTimeString) + : ' ' + workOrderComment.workOrderCommentTimeString) +
"</td>" + '</td>' +
"<td>" + '<td>' +
cityssm.escapeHTML(workOrderComment.workOrderComment || "") + cityssm.escapeHTML(workOrderComment.workOrderComment || '') +
"</td>" + '</td>' +
('<td class="is-hidden-print">' + ('<td class="is-hidden-print">' +
'<div class="buttons are-small is-justify-content-end">' + '<div class="buttons are-small is-justify-content-end">' +
('<button class="button is-primary button--edit" type="button">' + ('<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 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", openEditWorkOrderComment); tableRowElement
.querySelector('.button--edit')!
.addEventListener('click', openEditWorkOrderComment)
tableRowElement.querySelector(".button--delete")!.addEventListener("click", deleteWorkOrderComment); tableRowElement
.querySelector('.button--delete')!
.addEventListener('click', deleteWorkOrderComment)
tableElement.querySelector("tbody")!.append(tableRowElement); tableElement.querySelector('tbody')!.append(tableRowElement)
} }
containerElement.innerHTML = ""; containerElement.innerHTML = ''
containerElement.append(tableElement); containerElement.append(tableElement)
} }
function openAddCommentModal() { function openAddCommentModal() {
let addCommentCloseModalFunction: () => void; let addCommentCloseModalFunction: () => void
function doAddComment(formEvent: SubmitEvent) { function doAddComment(formEvent: SubmitEvent) {
formEvent.preventDefault(); formEvent.preventDefault()
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + "/workOrders/doAddWorkOrderComment", los.urlPrefix + '/workOrders/doAddWorkOrderComment',
formEvent.currentTarget, formEvent.currentTarget,
(responseJSON: { success: boolean; workOrderComments?: recordTypes.WorkOrderComment[] }) => { (responseJSON: {
if (responseJSON.success) { success: boolean
workOrderComments = responseJSON.workOrderComments!; workOrderComments?: recordTypes.WorkOrderComment[]
renderWorkOrderComments(); }) => {
addCommentCloseModalFunction(); if (responseJSON.success) {
} workOrderComments = responseJSON.workOrderComments!
} renderWorkOrderComments()
); addCommentCloseModalFunction()
}
cityssm.openHtmlModal("workOrder-addComment", {
onshow(modalElement) {
los.populateAliases(modalElement);
(modalElement.querySelector("#workOrderCommentAdd--workOrderId") as HTMLInputElement).value =
workOrderId;
modalElement.querySelector("form")!.addEventListener("submit", doAddComment);
},
onshown(modalElement, closeModalFunction) {
bulmaJS.toggleHtmlClipped();
addCommentCloseModalFunction = closeModalFunction;
(
modalElement.querySelector("#workOrderCommentAdd--workOrderComment") as HTMLTextAreaElement
).focus();
},
onremoved() {
bulmaJS.toggleHtmlClipped();
(document.querySelector("#workOrderComments--add") as HTMLButtonElement).focus();
} }
}); }
)
}
cityssm.openHtmlModal('workOrder-addComment', {
onshow(modalElement) {
los.populateAliases(modalElement)
;(
modalElement.querySelector(
'#workOrderCommentAdd--workOrderId'
) as HTMLInputElement
).value = workOrderId
modalElement
.querySelector('form')!
.addEventListener('submit', doAddComment)
},
onshown(modalElement, closeModalFunction) {
bulmaJS.toggleHtmlClipped()
addCommentCloseModalFunction = closeModalFunction
;(
modalElement.querySelector(
'#workOrderCommentAdd--workOrderComment'
) as HTMLTextAreaElement
).focus()
},
onremoved() {
bulmaJS.toggleHtmlClipped()
;(
document.querySelector('#workOrderComments--add') as HTMLButtonElement
).focus()
}
})
} }
document.querySelector("#workOrderComments--add")?.addEventListener("click", openAddCommentModal); document
.querySelector('#workOrderComments--add')
?.addEventListener('click', openAddCommentModal)
if (!isCreate) { if (!isCreate) {
renderWorkOrderComments(); renderWorkOrderComments()
} }

View File

@ -6,9 +6,9 @@ delete exports.workOrderLots;
let workOrderLotOccupancies = exports.workOrderLotOccupancies; let workOrderLotOccupancies = exports.workOrderLotOccupancies;
delete exports.workOrderLotOccupancies; delete exports.workOrderLotOccupancies;
function deleteLotOccupancy(clickEvent) { function deleteLotOccupancy(clickEvent) {
const lotOccupancyId = clickEvent.currentTarget.closest(".container--lotOccupancy").dataset.lotOccupancyId; const lotOccupancyId = clickEvent.currentTarget.closest('.container--lotOccupancy').dataset.lotOccupancyId;
function doDelete() { function doDelete() {
cityssm.postJSON(los.urlPrefix + "/workOrders/doDeleteWorkOrderLotOccupancy", { cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrderLotOccupancy', {
workOrderId, workOrderId,
lotOccupancyId lotOccupancyId
}, (responseJSON) => { }, (responseJSON) => {
@ -18,9 +18,9 @@ function deleteLotOccupancy(clickEvent) {
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Deleting Relationship", title: 'Error Deleting Relationship',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
@ -28,15 +28,15 @@ function deleteLotOccupancy(clickEvent) {
bulmaJS.confirm({ bulmaJS.confirm({
title: `Delete ${los.escapedAliases.Occupancy} Relationship`, title: `Delete ${los.escapedAliases.Occupancy} Relationship`,
message: `Are you sure you want to remove the relationship to this ${los.escapedAliases.occupancy} record from this work order? Note that the record will remain.`, message: `Are you sure you want to remove the relationship to this ${los.escapedAliases.occupancy} record from this work order? Note that the record will remain.`,
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: "Yes, Delete Relationship", text: 'Yes, Delete Relationship',
callbackFunction: doDelete callbackFunction: doDelete
} }
}); });
} }
function addLot(lotId, callbackFunction) { function addLot(lotId, callbackFunction) {
cityssm.postJSON(los.urlPrefix + "/workOrders/doAddWorkOrderLot", { cityssm.postJSON(los.urlPrefix + '/workOrders/doAddWorkOrderLot', {
workOrderId, workOrderId,
lotId lotId
}, (responseJSON) => { }, (responseJSON) => {
@ -46,9 +46,9 @@ function addLot(lotId, callbackFunction) {
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Adding " + los.escapedAliases.Lot, title: 'Error Adding ' + los.escapedAliases.Lot,
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
if (callbackFunction) { if (callbackFunction) {
@ -57,7 +57,7 @@ function addLot(lotId, callbackFunction) {
}); });
} }
function addLotOccupancy(lotOccupancyId, callbackFunction) { function addLotOccupancy(lotOccupancyId, callbackFunction) {
cityssm.postJSON(los.urlPrefix + "/workOrders/doAddWorkOrderLotOccupancy", { cityssm.postJSON(los.urlPrefix + '/workOrders/doAddWorkOrderLotOccupancy', {
workOrderId, workOrderId,
lotOccupancyId lotOccupancyId
}, (responseJSON) => { }, (responseJSON) => {
@ -67,9 +67,9 @@ function addLotOccupancy(lotOccupancyId, callbackFunction) {
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Adding " + los.escapedAliases.Occupancy, title: 'Error Adding ' + los.escapedAliases.Occupancy,
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
if (callbackFunction) { if (callbackFunction) {
@ -83,9 +83,8 @@ function addLotFromLotOccupancy(clickEvent) {
} }
function renderRelatedOccupancies() { function renderRelatedOccupancies() {
var _a, _b; var _a, _b;
const occupanciesContainerElement = document.querySelector("#container--lotOccupancies"); const occupanciesContainerElement = document.querySelector('#container--lotOccupancies');
document.querySelector(".tabs a[href='#relatedTab--lotOccupancies'] .tag").textContent = document.querySelector(".tabs a[href='#relatedTab--lotOccupancies'] .tag").textContent = workOrderLotOccupancies.length.toString();
workOrderLotOccupancies.length.toString();
if (workOrderLotOccupancies.length === 0) { if (workOrderLotOccupancies.length === 0) {
occupanciesContainerElement.innerHTML = `<div class="message is-info"> occupanciesContainerElement.innerHTML = `<div class="message is-info">
<p class="message-body">There are no ${los.escapedAliases.occupancies} associated with this work order.</p> <p class="message-body">There are no ${los.escapedAliases.occupancies} associated with this work order.</p>
@ -103,10 +102,11 @@ function renderRelatedOccupancies() {
</table>`; </table>`;
const currentDateString = cityssm.dateToString(new Date()); const currentDateString = cityssm.dateToString(new Date());
for (const lotOccupancy of workOrderLotOccupancies) { for (const lotOccupancy of workOrderLotOccupancies) {
const rowElement = document.createElement("tr"); const rowElement = document.createElement('tr');
rowElement.className = "container--lotOccupancy"; rowElement.className = 'container--lotOccupancy';
rowElement.dataset.lotOccupancyId = lotOccupancy.lotOccupancyId.toString(); rowElement.dataset.lotOccupancyId = lotOccupancy.lotOccupancyId.toString();
const isActive = !(lotOccupancy.occupancyEndDate && lotOccupancy.occupancyEndDateString < currentDateString); const isActive = !(lotOccupancy.occupancyEndDate &&
lotOccupancy.occupancyEndDateString < currentDateString);
const hasLotRecord = lotOccupancy.lotId && const hasLotRecord = lotOccupancy.lotId &&
workOrderLots.some((lot) => { workOrderLots.some((lot) => {
return lotOccupancy.lotId === lot.lotId; return lotOccupancy.lotId === lot.lotId;
@ -114,21 +114,25 @@ function renderRelatedOccupancies() {
rowElement.innerHTML = rowElement.innerHTML =
'<td class="is-width-1 has-text-centered">' + '<td class="is-width-1 has-text-centered">' +
(isActive (isActive
? '<i class="fas fa-play" title="Current ' + los.escapedAliases.Occupancy + '"></i>' ? '<i class="fas fa-play" title="Current ' +
: '<i class="fas fa-stop" title="Previous ' + los.escapedAliases.Occupancy + '"></i>') + los.escapedAliases.Occupancy +
"</td>" + '"></i>'
("<td>" + : '<i class="fas fa-stop" title="Previous ' +
los.escapedAliases.Occupancy +
'"></i>') +
'</td>' +
('<td>' +
'<a class="has-text-weight-bold" href="' + '<a class="has-text-weight-bold" href="' +
los.getLotOccupancyURL(lotOccupancy.lotOccupancyId) + los.getLotOccupancyURL(lotOccupancy.lotOccupancyId) +
'">' + '">' +
cityssm.escapeHTML(lotOccupancy.occupancyType || "") + cityssm.escapeHTML(lotOccupancy.occupancyType || '') +
"</a>" + '</a>' +
"</td>"); '</td>');
if (lotOccupancy.lotId) { if (lotOccupancy.lotId) {
rowElement.insertAdjacentHTML("beforeend", "<td>" + rowElement.insertAdjacentHTML('beforeend', '<td>' +
cityssm.escapeHTML(lotOccupancy.lotName || "") + cityssm.escapeHTML(lotOccupancy.lotName || '') +
(hasLotRecord (hasLotRecord
? "" ? ''
: ' <button class="button is-small is-light is-success button--addLot"' + : ' <button class="button is-small is-light is-success button--addLot"' +
' data-lot-id="' + ' data-lot-id="' +
lotOccupancy.lotId + lotOccupancy.lotId +
@ -140,58 +144,61 @@ function renderRelatedOccupancies() {
los.escapedAliases.Lot + los.escapedAliases.Lot +
'" type="button">' + '" type="button">' +
'<i class="fas fa-plus" aria-hidden="true"></i>' + '<i class="fas fa-plus" aria-hidden="true"></i>' +
"</button>") + '</button>') +
"</td>"); '</td>');
} }
else { else {
rowElement.insertAdjacentHTML("beforeend", `<td><span class="has-text-grey">(No ${los.escapedAliases.Lot})</span></td>`); rowElement.insertAdjacentHTML('beforeend', `<td><span class="has-text-grey">(No ${los.escapedAliases.Lot})</span></td>`);
} }
rowElement.insertAdjacentHTML("beforeend", "<td>" + rowElement.insertAdjacentHTML('beforeend', '<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>" + ('<td>' +
(lotOccupancy.lotOccupancyOccupants.length === 0 (lotOccupancy.lotOccupancyOccupants.length === 0
? '<span class="has-text-grey">(No ' + los.escapedAliases.Occupants + ")</span>" ? '<span class="has-text-grey">(No ' +
los.escapedAliases.Occupants +
')</span>'
: (_a = lotOccupancy.lotOccupancyOccupants) === null || _a === void 0 ? void 0 : _a.reduce((soFar, occupant) => { : (_a = lotOccupancy.lotOccupancyOccupants) === null || _a === void 0 ? void 0 : _a.reduce((soFar, occupant) => {
return (soFar + return (soFar +
'<span class="has-tooltip-left" data-tooltip="' + '<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(occupant.lotOccupantType) + cityssm.escapeHTML(occupant.lotOccupantType) +
'">' + '">' +
'<i class="fas fa-fw fa-' + '<i class="fas fa-fw fa-' +
cityssm.escapeHTML(occupant.fontAwesomeIconClass || "user") + cityssm.escapeHTML(occupant.fontAwesomeIconClass || 'user') +
'" aria-label="' + '" aria-label="' +
los.escapedAliases.Occupant + los.escapedAliases.Occupant +
'"></i> ' + '"></i> ' +
cityssm.escapeHTML(occupant.occupantName) + cityssm.escapeHTML(occupant.occupantName) +
"</span><br />"); '</span><br />');
}, "")) + }, '')) +
"</td>") + '</td>') +
("<td>" + ('<td>' +
'<button class="button is-small is-light is-danger button--deleteLotOccupancy" data-tooltip="Delete Relationship" type="button">' + '<button class="button is-small is-light is-danger button--deleteLotOccupancy" data-tooltip="Delete Relationship" type="button">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' + '<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" + '</button>' +
"</td>")); '</td>'));
(_b = rowElement.querySelector(".button--addLot")) === null || _b === void 0 ? void 0 : _b.addEventListener("click", addLotFromLotOccupancy); (_b = rowElement
.querySelector('.button--addLot')) === null || _b === void 0 ? void 0 : _b.addEventListener('click', addLotFromLotOccupancy);
rowElement rowElement
.querySelector(".button--deleteLotOccupancy") .querySelector('.button--deleteLotOccupancy')
.addEventListener("click", deleteLotOccupancy); .addEventListener('click', deleteLotOccupancy);
occupanciesContainerElement.querySelector("tbody").append(rowElement); occupanciesContainerElement.querySelector('tbody').append(rowElement);
} }
} }
function openEditLotStatus(clickEvent) { function openEditLotStatus(clickEvent) {
const lotId = Number.parseInt(clickEvent.currentTarget.closest(".container--lot").dataset.lotId, 10); const lotId = Number.parseInt(clickEvent.currentTarget.closest('.container--lot').dataset.lotId, 10);
const lot = workOrderLots.find((possibleLot) => { const lot = workOrderLots.find((possibleLot) => {
return possibleLot.lotId === lotId; return possibleLot.lotId === lotId;
}); });
let editCloseModalFunction; let editCloseModalFunction;
function doUpdateLotStatus(submitEvent) { function doUpdateLotStatus(submitEvent) {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + "/workOrders/doUpdateLotStatus", submitEvent.currentTarget, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/workOrders/doUpdateLotStatus', submitEvent.currentTarget, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderLots = responseJSON.workOrderLots; workOrderLots = responseJSON.workOrderLots;
renderRelatedLotsAndOccupancies(); renderRelatedLotsAndOccupancies();
@ -199,23 +206,22 @@ function openEditLotStatus(clickEvent) {
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Deleting Relationship", title: 'Error Deleting Relationship',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
} }
cityssm.openHtmlModal("lot-editLotStatus", { cityssm.openHtmlModal('lot-editLotStatus', {
onshow(modalElement) { onshow(modalElement) {
los.populateAliases(modalElement); los.populateAliases(modalElement);
modalElement.querySelector("#lotStatusEdit--lotId").value = modalElement.querySelector('#lotStatusEdit--lotId').value = lotId.toString();
lotId.toString(); modalElement.querySelector('#lotStatusEdit--lotName').value = lot.lotName;
modalElement.querySelector("#lotStatusEdit--lotName").value = lot.lotName; const lotStatusElement = modalElement.querySelector('#lotStatusEdit--lotStatusId');
const lotStatusElement = modalElement.querySelector("#lotStatusEdit--lotStatusId");
let lotStatusFound = false; let lotStatusFound = false;
for (const lotStatus of exports.lotStatuses) { for (const lotStatus of exports.lotStatuses) {
const optionElement = document.createElement("option"); const optionElement = document.createElement('option');
optionElement.value = lotStatus.lotStatusId.toString(); optionElement.value = lotStatus.lotStatusId.toString();
optionElement.textContent = lotStatus.lotStatus; optionElement.textContent = lotStatus.lotStatus;
if (lotStatus.lotStatusId === lot.lotStatusId) { if (lotStatus.lotStatusId === lot.lotStatusId) {
@ -224,7 +230,7 @@ function openEditLotStatus(clickEvent) {
lotStatusElement.append(optionElement); lotStatusElement.append(optionElement);
} }
if (!lotStatusFound && lot.lotStatusId) { if (!lotStatusFound && lot.lotStatusId) {
const optionElement = document.createElement("option"); const optionElement = document.createElement('option');
optionElement.value = lot.lotStatusId.toString(); optionElement.value = lot.lotStatusId.toString();
optionElement.textContent = lot.lotStatus; optionElement.textContent = lot.lotStatus;
lotStatusElement.append(optionElement); lotStatusElement.append(optionElement);
@ -233,13 +239,15 @@ function openEditLotStatus(clickEvent) {
lotStatusElement.value = lot.lotStatusId.toString(); lotStatusElement.value = lot.lotStatusId.toString();
} }
modalElement modalElement
.querySelector("form") .querySelector('form')
.insertAdjacentHTML("beforeend", `<input name="workOrderId" type="hidden" value="${workOrderId}" />`); .insertAdjacentHTML('beforeend', `<input name="workOrderId" type="hidden" value="${workOrderId}" />`);
}, },
onshown(modalElement, closeModalFunction) { onshown(modalElement, closeModalFunction) {
editCloseModalFunction = closeModalFunction; editCloseModalFunction = closeModalFunction;
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
modalElement.querySelector("form").addEventListener("submit", doUpdateLotStatus); modalElement
.querySelector('form')
.addEventListener('submit', doUpdateLotStatus);
}, },
onremoved() { onremoved() {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
@ -247,10 +255,9 @@ function openEditLotStatus(clickEvent) {
}); });
} }
function deleteLot(clickEvent) { function deleteLot(clickEvent) {
const lotId = clickEvent.currentTarget.closest(".container--lot") const lotId = clickEvent.currentTarget.closest('.container--lot').dataset.lotId;
.dataset.lotId;
function doDelete() { function doDelete() {
cityssm.postJSON(los.urlPrefix + "/workOrders/doDeleteWorkOrderLot", { cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrderLot', {
workOrderId, workOrderId,
lotId lotId
}, (responseJSON) => { }, (responseJSON) => {
@ -260,9 +267,9 @@ function deleteLot(clickEvent) {
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Deleting Relationship", title: 'Error Deleting Relationship',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
@ -270,17 +277,16 @@ function deleteLot(clickEvent) {
bulmaJS.confirm({ bulmaJS.confirm({
title: `Delete ${los.escapedAliases.Occupancy} Relationship`, title: `Delete ${los.escapedAliases.Occupancy} Relationship`,
message: `Are you sure you want to remove the relationship to this ${los.escapedAliases.occupancy} record from this work order? Note that the record will remain.`, message: `Are you sure you want to remove the relationship to this ${los.escapedAliases.occupancy} record from this work order? Note that the record will remain.`,
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: "Yes, Delete Relationship", text: 'Yes, Delete Relationship',
callbackFunction: doDelete callbackFunction: doDelete
} }
}); });
} }
function renderRelatedLots() { function renderRelatedLots() {
const lotsContainerElement = document.querySelector("#container--lots"); const lotsContainerElement = document.querySelector('#container--lots');
document.querySelector(".tabs a[href='#relatedTab--lots'] .tag").textContent = document.querySelector(".tabs a[href='#relatedTab--lots'] .tag").textContent = workOrderLots.length.toString();
workOrderLots.length.toString();
if (workOrderLots.length === 0) { if (workOrderLots.length === 0) {
lotsContainerElement.innerHTML = `<div class="message is-info"> lotsContainerElement.innerHTML = `<div class="message is-info">
<p class="message-body">There are no ${los.escapedAliases.lots} associated with this work order.</p> <p class="message-body">There are no ${los.escapedAliases.lots} associated with this work order.</p>
@ -298,35 +304,39 @@ function renderRelatedLots() {
<tbody></tbody> <tbody></tbody>
</table>`; </table>`;
for (const lot of workOrderLots) { for (const lot of workOrderLots) {
const rowElement = document.createElement("tr"); const rowElement = document.createElement('tr');
rowElement.className = "container--lot"; rowElement.className = 'container--lot';
rowElement.dataset.lotId = lot.lotId.toString(); rowElement.dataset.lotId = lot.lotId.toString();
rowElement.innerHTML = rowElement.innerHTML =
"<td>" + '<td>' +
'<a class="has-text-weight-bold" href="' + '<a class="has-text-weight-bold" href="' +
los.getLotURL(lot.lotId) + los.getLotURL(lot.lotId) +
'">' + '">' +
cityssm.escapeHTML(lot.lotName || "") + cityssm.escapeHTML(lot.lotName || '') +
"</a>" + '</a>' +
"</td>" + '</td>' +
("<td>" + cityssm.escapeHTML(lot.mapName || "") + "</td>") + ('<td>' + cityssm.escapeHTML(lot.mapName || '') + '</td>') +
("<td>" + cityssm.escapeHTML(lot.lotType || "") + "</td>") + ('<td>' + cityssm.escapeHTML(lot.lotType || '') + '</td>') +
("<td>" + ('<td>' +
(lot.lotStatusId (lot.lotStatusId
? cityssm.escapeHTML(lot.lotStatus || "") ? cityssm.escapeHTML(lot.lotStatus || '')
: '<span class="has-text-grey">(No Status)</span>') + : '<span class="has-text-grey">(No Status)</span>') +
"</td>") + '</td>') +
('<td class="is-nowrap">' + ('<td class="is-nowrap">' +
'<button class="button is-small is-light is-info button--editLotStatus" data-tooltip="Update Status" type="button">' + '<button class="button is-small is-light is-info button--editLotStatus" data-tooltip="Update Status" type="button">' +
'<i class="fas fa-pencil-alt" aria-hidden="true"></i>' + '<i class="fas fa-pencil-alt" aria-hidden="true"></i>' +
"</button>" + '</button>' +
' <button class="button is-small is-light is-danger button--deleteLot" data-tooltip="Delete Relationship" type="button">' + ' <button class="button is-small is-light is-danger button--deleteLot" data-tooltip="Delete Relationship" type="button">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' + '<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" + '</button>' +
"</td>"); '</td>');
rowElement.querySelector(".button--editLotStatus").addEventListener("click", openEditLotStatus); rowElement
rowElement.querySelector(".button--deleteLot").addEventListener("click", deleteLot); .querySelector('.button--editLotStatus')
lotsContainerElement.querySelector("tbody").append(rowElement); .addEventListener('click', openEditLotStatus);
rowElement
.querySelector('.button--deleteLot')
.addEventListener('click', deleteLot);
lotsContainerElement.querySelector('tbody').append(rowElement);
} }
} }
function renderRelatedLotsAndOccupancies() { function renderRelatedLotsAndOccupancies() {
@ -335,7 +345,7 @@ function renderRelatedLotsAndOccupancies() {
} }
renderRelatedLotsAndOccupancies(); renderRelatedLotsAndOccupancies();
function doAddLotOccupancy(clickEvent) { function doAddLotOccupancy(clickEvent) {
const rowElement = clickEvent.currentTarget.closest("tr"); const rowElement = clickEvent.currentTarget.closest('tr');
const lotOccupancyId = rowElement.dataset.lotOccupancyId; const lotOccupancyId = rowElement.dataset.lotOccupancyId;
addLotOccupancy(lotOccupancyId, (success) => { addLotOccupancy(lotOccupancyId, (success) => {
if (success) { if (success) {
@ -343,15 +353,18 @@ function doAddLotOccupancy(clickEvent) {
} }
}); });
} }
document.querySelector("#button--addLotOccupancy").addEventListener("click", () => { document
.querySelector('#button--addLotOccupancy')
.addEventListener('click', () => {
let searchFormElement; let searchFormElement;
let searchResultsContainerElement; let searchResultsContainerElement;
function doSearch(event) { function doSearch(event) {
if (event) { if (event) {
event.preventDefault(); event.preventDefault();
} }
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML("Searching..."); searchResultsContainerElement.innerHTML =
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doSearchLotOccupancies", searchFormElement, (responseJSON) => { los.getLoadingParagraphHTML('Searching...');
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doSearchLotOccupancies', searchFormElement, (responseJSON) => {
if (responseJSON.lotOccupancies.length === 0) { if (responseJSON.lotOccupancies.length === 0) {
searchResultsContainerElement.innerHTML = `<div class="message is-info"> searchResultsContainerElement.innerHTML = `<div class="message is-info">
<p class="message-body">There are no records that meet the search criteria.</p> <p class="message-body">There are no records that meet the search criteria.</p>
@ -370,64 +383,69 @@ document.querySelector("#button--addLotOccupancy").addEventListener("click", ()
<tbody></tbody> <tbody></tbody>
</table>`; </table>`;
for (const lotOccupancy of responseJSON.lotOccupancies) { for (const lotOccupancy of responseJSON.lotOccupancies) {
const rowElement = document.createElement("tr"); const rowElement = document.createElement('tr');
rowElement.className = "container--lotOccupancy"; rowElement.className = 'container--lotOccupancy';
rowElement.dataset.lotOccupancyId = lotOccupancy.lotOccupancyId.toString(); rowElement.dataset.lotOccupancyId =
lotOccupancy.lotOccupancyId.toString();
rowElement.innerHTML = rowElement.innerHTML =
'<td class="has-text-centered">' + '<td class="has-text-centered">' +
'<button class="button is-small is-success button--addLotOccupancy" data-tooltip="Add" type="button" aria-label="Add">' + '<button class="button is-small is-success button--addLotOccupancy" data-tooltip="Add" type="button" aria-label="Add">' +
'<i class="fas fa-plus" aria-hidden="true"></i>' + '<i class="fas fa-plus" aria-hidden="true"></i>' +
"</button>" + '</button>' +
"</td>" + '</td>' +
('<td class="has-text-weight-bold">' + ('<td class="has-text-weight-bold">' +
cityssm.escapeHTML(lotOccupancy.occupancyType || "") + cityssm.escapeHTML(lotOccupancy.occupancyType || '') +
"</td>"); '</td>');
if (lotOccupancy.lotId) { if (lotOccupancy.lotId) {
rowElement.insertAdjacentHTML("beforeend", "<td>" + cityssm.escapeHTML(lotOccupancy.lotName || "") + "</td>"); rowElement.insertAdjacentHTML('beforeend', '<td>' +
cityssm.escapeHTML(lotOccupancy.lotName || '') +
'</td>');
} }
else { else {
rowElement.insertAdjacentHTML("beforeend", `<td><span class="has-text-grey">(No ${los.escapedAliases.Lot})</span></td>`); rowElement.insertAdjacentHTML('beforeend', `<td><span class="has-text-grey">(No ${los.escapedAliases.Lot})</span></td>`);
} }
rowElement.insertAdjacentHTML("beforeend", "<td>" + rowElement.insertAdjacentHTML('beforeend', '<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>" + ('<td>' +
(lotOccupancy.lotOccupancyOccupants.length === 0 (lotOccupancy.lotOccupancyOccupants.length === 0
? '<span class="has-text-grey">(No ' + ? '<span class="has-text-grey">(No ' +
cityssm.escapeHTML(exports.aliases.occupants) + cityssm.escapeHTML(exports.aliases.occupants) +
")</span>" ')</span>'
: cityssm.escapeHTML(lotOccupancy.lotOccupancyOccupants[0].occupantName) + : cityssm.escapeHTML(lotOccupancy.lotOccupancyOccupants[0].occupantName) +
(lotOccupancy.lotOccupancyOccupants.length > 1 (lotOccupancy.lotOccupancyOccupants.length > 1
? " plus " + (lotOccupancy.lotOccupancyOccupants.length - 1) ? ' plus ' +
: "")) + (lotOccupancy.lotOccupancyOccupants.length - 1)
"</td>")); : '')) +
'</td>'));
rowElement rowElement
.querySelector(".button--addLotOccupancy") .querySelector('.button--addLotOccupancy')
.addEventListener("click", doAddLotOccupancy); .addEventListener('click', doAddLotOccupancy);
searchResultsContainerElement.querySelector("tbody").append(rowElement); searchResultsContainerElement
.querySelector('tbody')
.append(rowElement);
} }
}); });
} }
cityssm.openHtmlModal("workOrder-addLotOccupancy", { cityssm.openHtmlModal('workOrder-addLotOccupancy', {
onshow(modalElement) { onshow(modalElement) {
los.populateAliases(modalElement); los.populateAliases(modalElement);
searchFormElement = modalElement.querySelector("form"); searchFormElement = modalElement.querySelector('form');
searchResultsContainerElement = modalElement.querySelector("#resultsContainer--lotOccupancyAdd"); searchResultsContainerElement = modalElement.querySelector('#resultsContainer--lotOccupancyAdd');
modalElement.querySelector("#lotOccupancySearch--notWorkOrderId").value = modalElement.querySelector('#lotOccupancySearch--notWorkOrderId').value = workOrderId;
workOrderId; modalElement.querySelector('#lotOccupancySearch--occupancyEffectiveDateString').value = document.querySelector('#workOrderEdit--workOrderOpenDateString').value;
modalElement.querySelector("#lotOccupancySearch--occupancyEffectiveDateString").value = document.querySelector("#workOrderEdit--workOrderOpenDateString").value;
doSearch(); doSearch();
}, },
onshown(modalElement) { onshown(modalElement) {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
modalElement.querySelector("#lotOccupancySearch--occupantName").addEventListener("change", doSearch); modalElement.querySelector('#lotOccupancySearch--occupantName').addEventListener('change', doSearch);
modalElement.querySelector("#lotOccupancySearch--lotName").addEventListener("change", doSearch); modalElement.querySelector('#lotOccupancySearch--lotName').addEventListener('change', doSearch);
searchFormElement.addEventListener("submit", doSearch); searchFormElement.addEventListener('submit', doSearch);
}, },
onremoved() { onremoved() {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
@ -435,7 +453,7 @@ document.querySelector("#button--addLotOccupancy").addEventListener("click", ()
}); });
}); });
function doAddLot(clickEvent) { function doAddLot(clickEvent) {
const rowElement = clickEvent.currentTarget.closest("tr"); const rowElement = clickEvent.currentTarget.closest('tr');
const lotId = rowElement.dataset.lotId; const lotId = rowElement.dataset.lotId;
addLot(lotId, (success) => { addLot(lotId, (success) => {
if (success) { if (success) {
@ -443,20 +461,21 @@ function doAddLot(clickEvent) {
} }
}); });
} }
document.querySelector("#button--addLot").addEventListener("click", () => { document.querySelector('#button--addLot').addEventListener('click', () => {
let searchFormElement; let searchFormElement;
let searchResultsContainerElement; let searchResultsContainerElement;
function doSearch(event) { function doSearch(event) {
if (event) { if (event) {
event.preventDefault(); event.preventDefault();
} }
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML("Searching..."); searchResultsContainerElement.innerHTML =
cityssm.postJSON(los.urlPrefix + "/lots/doSearchLots", searchFormElement, (responseJSON) => { los.getLoadingParagraphHTML('Searching...');
cityssm.postJSON(los.urlPrefix + '/lots/doSearchLots', searchFormElement, (responseJSON) => {
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 records that meet the search criteria.</p>' + '<p class="message-body">There are no records that meet the search criteria.</p>' +
"</div>"; '</div>';
return; return;
} }
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable"> searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable">
@ -470,38 +489,41 @@ document.querySelector("#button--addLot").addEventListener("click", () => {
<tbody></tbody> <tbody></tbody>
</table>`; </table>`;
for (const lot of responseJSON.lots) { for (const lot of responseJSON.lots) {
const rowElement = document.createElement("tr"); const rowElement = document.createElement('tr');
rowElement.className = "container--lot"; rowElement.className = 'container--lot';
rowElement.dataset.lotId = lot.lotId.toString(); rowElement.dataset.lotId = lot.lotId.toString();
rowElement.innerHTML = rowElement.innerHTML =
'<td class="has-text-centered">' + '<td class="has-text-centered">' +
'<button class="button is-small is-success button--addLot" data-tooltip="Add" type="button" aria-label="Add">' + '<button class="button is-small is-success button--addLot" data-tooltip="Add" type="button" aria-label="Add">' +
'<i class="fas fa-plus" aria-hidden="true"></i>' + '<i class="fas fa-plus" aria-hidden="true"></i>' +
"</button>" + '</button>' +
"</td>" + '</td>' +
('<td class="has-text-weight-bold">' + ('<td class="has-text-weight-bold">' +
cityssm.escapeHTML(lot.lotName || "") + cityssm.escapeHTML(lot.lotName || '') +
"</td>") + '</td>') +
"<td>" + '<td>' +
cityssm.escapeHTML(lot.mapName || "") + cityssm.escapeHTML(lot.mapName || '') +
"</td>" + '</td>' +
("<td>" + cityssm.escapeHTML(lot.lotType || "") + "</td>") + ('<td>' + cityssm.escapeHTML(lot.lotType || '') + '</td>') +
("<td>" + cityssm.escapeHTML(lot.lotStatus || "") + "</td>"); ('<td>' + cityssm.escapeHTML(lot.lotStatus || '') + '</td>');
rowElement.querySelector(".button--addLot").addEventListener("click", doAddLot); rowElement
searchResultsContainerElement.querySelector("tbody").append(rowElement); .querySelector('.button--addLot')
.addEventListener('click', doAddLot);
searchResultsContainerElement
.querySelector('tbody')
.append(rowElement);
} }
}); });
} }
cityssm.openHtmlModal("workOrder-addLot", { cityssm.openHtmlModal('workOrder-addLot', {
onshow(modalElement) { onshow(modalElement) {
los.populateAliases(modalElement); los.populateAliases(modalElement);
searchFormElement = modalElement.querySelector("form"); searchFormElement = modalElement.querySelector('form');
searchResultsContainerElement = modalElement.querySelector("#resultsContainer--lotAdd"); searchResultsContainerElement = modalElement.querySelector('#resultsContainer--lotAdd');
modalElement.querySelector("#lotSearch--notWorkOrderId").value = modalElement.querySelector('#lotSearch--notWorkOrderId').value = workOrderId;
workOrderId; const lotStatusElement = modalElement.querySelector('#lotSearch--lotStatusId');
const lotStatusElement = modalElement.querySelector("#lotSearch--lotStatusId");
for (const lotStatus of exports.lotStatuses) { for (const lotStatus of exports.lotStatuses) {
const optionElement = document.createElement("option"); const optionElement = document.createElement('option');
optionElement.value = lotStatus.lotStatusId.toString(); optionElement.value = lotStatus.lotStatusId.toString();
optionElement.textContent = lotStatus.lotStatus; optionElement.textContent = lotStatus.lotStatus;
lotStatusElement.append(optionElement); lotStatusElement.append(optionElement);
@ -510,9 +532,13 @@ document.querySelector("#button--addLot").addEventListener("click", () => {
}, },
onshown(modalElement) { onshown(modalElement) {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
modalElement.querySelector("#lotSearch--lotName").addEventListener("change", doSearch); modalElement
modalElement.querySelector("#lotSearch--lotStatusId").addEventListener("change", doSearch); .querySelector('#lotSearch--lotName')
searchFormElement.addEventListener("submit", doSearch); .addEventListener('change', doSearch);
modalElement
.querySelector('#lotSearch--lotStatusId')
.addEventListener('change', doSearch);
searchFormElement.addEventListener('submit', doSearch);
}, },
onremoved() { onremoved() {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();

File diff suppressed because it is too large Load Diff

View File

@ -3,62 +3,62 @@
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
(() => { (() => {
const los = exports.los; const los = exports.los;
const workOrderSearchFiltersFormElement = document.querySelector("#form--searchFilters"); const workOrderSearchFiltersFormElement = document.querySelector('#form--searchFilters');
const workOrderMilestoneDateFilterElement = workOrderSearchFiltersFormElement.querySelector("#searchFilter--workOrderMilestoneDateFilter"); const workOrderMilestoneDateFilterElement = workOrderSearchFiltersFormElement.querySelector('#searchFilter--workOrderMilestoneDateFilter');
const workOrderMilestoneDateStringElement = workOrderSearchFiltersFormElement.querySelector("#searchFilter--workOrderMilestoneDateString"); const workOrderMilestoneDateStringElement = workOrderSearchFiltersFormElement.querySelector('#searchFilter--workOrderMilestoneDateString');
const milestoneCalendarContainerElement = document.querySelector("#container--milestoneCalendar"); const milestoneCalendarContainerElement = document.querySelector('#container--milestoneCalendar');
function renderMilestones(workOrderMilestones) { function renderMilestones(workOrderMilestones) {
if (workOrderMilestones.length === 0) { if (workOrderMilestones.length === 0) {
milestoneCalendarContainerElement.innerHTML = `<div class="message is-info"> milestoneCalendarContainerElement.innerHTML = `<div class="message is-info">
<p class="message-body">There are no milestones that meet the search criteria.</p> <p class="message-body">There are no milestones that meet the search criteria.</p>
</div>`; </div>`;
return; return;
} }
milestoneCalendarContainerElement.innerHTML = ""; milestoneCalendarContainerElement.innerHTML = '';
const currentDate = cityssm.dateToString(new Date()); const currentDate = cityssm.dateToString(new Date());
let currentPanelElement; let currentPanelElement;
let currentPanelDateString = ""; let currentPanelDateString = '';
for (const milestone of workOrderMilestones) { for (const milestone of workOrderMilestones) {
if (currentPanelDateString !== milestone.workOrderMilestoneDateString) { if (currentPanelDateString !== milestone.workOrderMilestoneDateString) {
if (currentPanelElement) { if (currentPanelElement) {
milestoneCalendarContainerElement.append(currentPanelElement); milestoneCalendarContainerElement.append(currentPanelElement);
} }
currentPanelElement = document.createElement("div"); currentPanelElement = document.createElement('div');
currentPanelElement.className = "panel"; currentPanelElement.className = 'panel';
currentPanelElement.innerHTML = `<h2 class="panel-heading">${milestone.workOrderMilestoneDateString}</h2>`; currentPanelElement.innerHTML = `<h2 class="panel-heading">${milestone.workOrderMilestoneDateString}</h2>`;
currentPanelDateString = milestone.workOrderMilestoneDateString; currentPanelDateString = milestone.workOrderMilestoneDateString;
} }
const panelBlockElement = document.createElement("div"); const panelBlockElement = document.createElement('div');
panelBlockElement.className = "panel-block is-block"; panelBlockElement.className = 'panel-block is-block';
if (!milestone.workOrderMilestoneCompletionDate && if (!milestone.workOrderMilestoneCompletionDate &&
milestone.workOrderMilestoneDateString < currentDate) { milestone.workOrderMilestoneDateString < currentDate) {
panelBlockElement.classList.add("has-background-warning-light"); panelBlockElement.classList.add('has-background-warning-light');
} }
let lotOccupancyHTML = ""; let lotOccupancyHTML = '';
for (const lot of milestone.workOrderLots) { for (const lot of milestone.workOrderLots) {
lotOccupancyHTML += lotOccupancyHTML +=
'<span class="has-tooltip-left" data-tooltip="' + '<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(lot.mapName || "") + cityssm.escapeHTML(lot.mapName || '') +
'">' + '">' +
'<i class="fas fa-vector-square" aria-label="' + '<i class="fas fa-vector-square" aria-label="' +
los.escapedAliases.Lot + los.escapedAliases.Lot +
'"></i> ' + '"></i> ' +
cityssm.escapeHTML(lot.lotName || "") + cityssm.escapeHTML(lot.lotName || '') +
"</span>" + '</span>' +
"<br />"; '<br />';
} }
for (const lotOccupancy of milestone.workOrderLotOccupancies) { for (const lotOccupancy of milestone.workOrderLotOccupancies) {
for (const occupant of lotOccupancy.lotOccupancyOccupants) { for (const occupant of lotOccupancy.lotOccupancyOccupants) {
lotOccupancyHTML += lotOccupancyHTML +=
'<span class="has-tooltip-left" data-tooltip="' + '<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(occupant.lotOccupantType || "") + cityssm.escapeHTML(occupant.lotOccupantType || '') +
'">' + '">' +
'<i class="fas fa-user" aria-label="' + '<i class="fas fa-user" aria-label="' +
los.escapedAliases.Occupancy + los.escapedAliases.Occupancy +
'"></i> ' + '"></i> ' +
cityssm.escapeHTML(occupant.occupantName || "") + cityssm.escapeHTML(occupant.occupantName || '') +
"</span>" + '</span>' +
"<br />"; '<br />';
} }
} }
panelBlockElement.innerHTML = panelBlockElement.innerHTML =
@ -68,36 +68,36 @@ Object.defineProperty(exports, "__esModule", { value: true });
(milestone.workOrderMilestoneCompletionDate (milestone.workOrderMilestoneCompletionDate
? '<i class="fas fa-check" aria-label="Completed"></i>' ? '<i class="fas fa-check" aria-label="Completed"></i>'
: '<i class="far fa-square has-text-grey" aria-label="Incomplete"></i>') + : '<i class="far fa-square has-text-grey" aria-label="Incomplete"></i>') +
"</span>" + '</span>' +
"</div>") + '</div>') +
('<div class="column">' + ('<div class="column">' +
(milestone.workOrderMilestoneTime === 0 (milestone.workOrderMilestoneTime === 0
? "" ? ''
: milestone.workOrderMilestoneTimeString + "<br />") + : milestone.workOrderMilestoneTimeString + '<br />') +
(milestone.workOrderMilestoneTypeId (milestone.workOrderMilestoneTypeId
? "<strong>" + ? '<strong>' +
cityssm.escapeHTML(milestone.workOrderMilestoneType) + cityssm.escapeHTML(milestone.workOrderMilestoneType) +
"</strong><br />" '</strong><br />'
: "") + : '') +
'<span class="is-size-7">' + '<span class="is-size-7">' +
cityssm.escapeHTML(milestone.workOrderMilestoneDescription) + cityssm.escapeHTML(milestone.workOrderMilestoneDescription) +
"</span>" + '</span>' +
"</div>") + '</div>') +
('<div class="column">' + ('<div class="column">' +
'<i class="fas fa-circle" style="color:' + '<i class="fas fa-circle" style="color:' +
los.getRandomColor(milestone.workOrderNumber || "") + los.getRandomColor(milestone.workOrderNumber || '') +
'" aria-hidden="true"></i>' + '" aria-hidden="true"></i>' +
' <a class="has-text-weight-bold" href="' + ' <a class="has-text-weight-bold" href="' +
los.getWorkOrderURL(milestone.workOrderId) + los.getWorkOrderURL(milestone.workOrderId) +
'">' + '">' +
cityssm.escapeHTML(milestone.workOrderNumber || "") + cityssm.escapeHTML(milestone.workOrderNumber || '') +
"</a><br />" + '</a><br />' +
'<span class="is-size-7">' + '<span class="is-size-7">' +
cityssm.escapeHTML(milestone.workOrderDescription || "") + cityssm.escapeHTML(milestone.workOrderDescription || '') +
"</span>" + '</span>' +
"</div>") + '</div>') +
('<div class="column is-size-7">' + lotOccupancyHTML + "</div>") + ('<div class="column is-size-7">' + lotOccupancyHTML + '</div>') +
"</div>"; '</div>';
currentPanelElement.append(panelBlockElement); currentPanelElement.append(panelBlockElement);
} }
milestoneCalendarContainerElement.append(currentPanelElement); milestoneCalendarContainerElement.append(currentPanelElement);
@ -106,18 +106,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
if (event) { if (event) {
event.preventDefault(); event.preventDefault();
} }
milestoneCalendarContainerElement.innerHTML = los.getLoadingParagraphHTML("Loading Milestones..."); milestoneCalendarContainerElement.innerHTML = los.getLoadingParagraphHTML('Loading Milestones...');
cityssm.postJSON(los.urlPrefix + "/workOrders/doGetWorkOrderMilestones", workOrderSearchFiltersFormElement, (responseJSON) => { cityssm.postJSON(los.urlPrefix + '/workOrders/doGetWorkOrderMilestones', workOrderSearchFiltersFormElement, (responseJSON) => {
renderMilestones(responseJSON.workOrderMilestones); renderMilestones(responseJSON.workOrderMilestones);
}); });
} }
workOrderMilestoneDateFilterElement.addEventListener("change", () => { workOrderMilestoneDateFilterElement.addEventListener('change', () => {
workOrderMilestoneDateStringElement.closest("fieldset").disabled = workOrderMilestoneDateStringElement.closest('fieldset').disabled =
workOrderMilestoneDateFilterElement.value !== "date"; workOrderMilestoneDateFilterElement.value !== 'date';
getMilestones(); getMilestones();
}); });
los.initializeDatePickers(workOrderSearchFiltersFormElement); los.initializeDatePickers(workOrderSearchFiltersFormElement);
workOrderMilestoneDateStringElement.addEventListener("change", getMilestones); workOrderMilestoneDateStringElement.addEventListener('change', getMilestones);
workOrderSearchFiltersFormElement.addEventListener("submit", getMilestones); workOrderSearchFiltersFormElement.addEventListener('submit', getMilestones);
getMilestones(); getMilestones();
})(); })();

View File

@ -1,170 +1,176 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
import type * as recordTypes from "../types/recordTypes"; import type * as recordTypes from '../types/recordTypes'
import type * as globalTypes from "../types/globalTypes"; import type * as globalTypes from '../types/globalTypes'
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
declare const cityssm: cityssmGlobal; declare const cityssm: cityssmGlobal
;(() => {
const los = exports.los as globalTypes.LOS
(() => { const workOrderSearchFiltersFormElement = document.querySelector(
const los = exports.los as globalTypes.LOS; '#form--searchFilters'
) as HTMLFormElement
const workOrderSearchFiltersFormElement = document.querySelector( const workOrderMilestoneDateFilterElement =
"#form--searchFilters" workOrderSearchFiltersFormElement.querySelector(
) as HTMLFormElement; '#searchFilter--workOrderMilestoneDateFilter'
) as HTMLSelectElement
const workOrderMilestoneDateFilterElement = workOrderSearchFiltersFormElement.querySelector( const workOrderMilestoneDateStringElement =
"#searchFilter--workOrderMilestoneDateFilter" workOrderSearchFiltersFormElement.querySelector(
) as HTMLSelectElement; '#searchFilter--workOrderMilestoneDateString'
) as HTMLInputElement
const workOrderMilestoneDateStringElement = workOrderSearchFiltersFormElement.querySelector( const milestoneCalendarContainerElement = document.querySelector(
"#searchFilter--workOrderMilestoneDateString" '#container--milestoneCalendar'
) as HTMLInputElement; ) as HTMLElement
const milestoneCalendarContainerElement = document.querySelector( function renderMilestones(
"#container--milestoneCalendar" workOrderMilestones: recordTypes.WorkOrderMilestone[]
) as HTMLElement; ) {
if (workOrderMilestones.length === 0) {
function renderMilestones(workOrderMilestones: recordTypes.WorkOrderMilestone[]) { milestoneCalendarContainerElement.innerHTML = `<div class="message is-info">
if (workOrderMilestones.length === 0) { <p class="message-body">There are no milestones that meet the search criteria.</p>
milestoneCalendarContainerElement.innerHTML = `<div class="message is-info"> </div>`
<p class="message-body">There are no milestones that meet the search criteria.</p> return
</div>`;
return;
}
milestoneCalendarContainerElement.innerHTML = "";
const currentDate = cityssm.dateToString(new Date());
let currentPanelElement: HTMLElement | undefined;
let currentPanelDateString = "";
for (const milestone of workOrderMilestones) {
if (currentPanelDateString !== milestone.workOrderMilestoneDateString) {
if (currentPanelElement) {
milestoneCalendarContainerElement.append(currentPanelElement);
}
currentPanelElement = document.createElement("div");
currentPanelElement.className = "panel";
currentPanelElement.innerHTML = `<h2 class="panel-heading">${milestone.workOrderMilestoneDateString}</h2>`;
currentPanelDateString = milestone.workOrderMilestoneDateString!;
}
const panelBlockElement = document.createElement("div");
panelBlockElement.className = "panel-block is-block";
if (
!milestone.workOrderMilestoneCompletionDate &&
milestone.workOrderMilestoneDateString! < currentDate
) {
panelBlockElement.classList.add("has-background-warning-light");
}
let lotOccupancyHTML = "";
for (const lot of milestone.workOrderLots!) {
lotOccupancyHTML +=
'<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(lot.mapName || "") +
'">' +
'<i class="fas fa-vector-square" aria-label="' +
los.escapedAliases.Lot +
'"></i> ' +
cityssm.escapeHTML(lot.lotName || "") +
"</span>" +
"<br />";
}
for (const lotOccupancy of milestone.workOrderLotOccupancies!) {
for (const occupant of lotOccupancy.lotOccupancyOccupants!) {
lotOccupancyHTML +=
'<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(occupant.lotOccupantType || "") +
'">' +
'<i class="fas fa-user" aria-label="' +
los.escapedAliases.Occupancy +
'"></i> ' +
cityssm.escapeHTML(occupant.occupantName || "") +
"</span>" +
"<br />";
}
}
panelBlockElement.innerHTML =
'<div class="columns">' +
('<div class="column is-narrow">' +
'<span class="icon is-small">' +
(milestone.workOrderMilestoneCompletionDate
? '<i class="fas fa-check" aria-label="Completed"></i>'
: '<i class="far fa-square has-text-grey" aria-label="Incomplete"></i>') +
"</span>" +
"</div>") +
('<div class="column">' +
(milestone.workOrderMilestoneTime === 0
? ""
: milestone.workOrderMilestoneTimeString + "<br />") +
(milestone.workOrderMilestoneTypeId
? "<strong>" +
cityssm.escapeHTML(milestone.workOrderMilestoneType!) +
"</strong><br />"
: "") +
'<span class="is-size-7">' +
cityssm.escapeHTML(milestone.workOrderMilestoneDescription!) +
"</span>" +
"</div>") +
('<div class="column">' +
'<i class="fas fa-circle" style="color:' +
los.getRandomColor(milestone.workOrderNumber || "") +
'" aria-hidden="true"></i>' +
' <a class="has-text-weight-bold" href="' +
los.getWorkOrderURL(milestone.workOrderId!) +
'">' +
cityssm.escapeHTML(milestone.workOrderNumber || "") +
"</a><br />" +
'<span class="is-size-7">' +
cityssm.escapeHTML(milestone.workOrderDescription || "") +
"</span>" +
"</div>") +
('<div class="column is-size-7">' + lotOccupancyHTML + "</div>") +
"</div>";
(currentPanelElement as HTMLElement).append(panelBlockElement);
}
milestoneCalendarContainerElement.append(currentPanelElement!);
} }
function getMilestones(event?: Event) { milestoneCalendarContainerElement.innerHTML = ''
if (event) {
event.preventDefault(); const currentDate = cityssm.dateToString(new Date())
let currentPanelElement: HTMLElement | undefined
let currentPanelDateString = ''
for (const milestone of workOrderMilestones) {
if (currentPanelDateString !== milestone.workOrderMilestoneDateString) {
if (currentPanelElement) {
milestoneCalendarContainerElement.append(currentPanelElement)
} }
milestoneCalendarContainerElement.innerHTML = los.getLoadingParagraphHTML("Loading Milestones..."); currentPanelElement = document.createElement('div')
currentPanelElement.className = 'panel'
cityssm.postJSON( currentPanelElement.innerHTML = `<h2 class="panel-heading">${milestone.workOrderMilestoneDateString}</h2>`
los.urlPrefix + "/workOrders/doGetWorkOrderMilestones",
workOrderSearchFiltersFormElement, currentPanelDateString = milestone.workOrderMilestoneDateString!
(responseJSON: { workOrderMilestones: recordTypes.WorkOrderMilestone[] }) => { }
renderMilestones(responseJSON.workOrderMilestones);
} const panelBlockElement = document.createElement('div')
);
panelBlockElement.className = 'panel-block is-block'
if (
!milestone.workOrderMilestoneCompletionDate &&
milestone.workOrderMilestoneDateString! < currentDate
) {
panelBlockElement.classList.add('has-background-warning-light')
}
let lotOccupancyHTML = ''
for (const lot of milestone.workOrderLots!) {
lotOccupancyHTML +=
'<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(lot.mapName || '') +
'">' +
'<i class="fas fa-vector-square" aria-label="' +
los.escapedAliases.Lot +
'"></i> ' +
cityssm.escapeHTML(lot.lotName || '') +
'</span>' +
'<br />'
}
for (const lotOccupancy of milestone.workOrderLotOccupancies!) {
for (const occupant of lotOccupancy.lotOccupancyOccupants!) {
lotOccupancyHTML +=
'<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(occupant.lotOccupantType || '') +
'">' +
'<i class="fas fa-user" aria-label="' +
los.escapedAliases.Occupancy +
'"></i> ' +
cityssm.escapeHTML(occupant.occupantName || '') +
'</span>' +
'<br />'
}
}
panelBlockElement.innerHTML =
'<div class="columns">' +
('<div class="column is-narrow">' +
'<span class="icon is-small">' +
(milestone.workOrderMilestoneCompletionDate
? '<i class="fas fa-check" aria-label="Completed"></i>'
: '<i class="far fa-square has-text-grey" aria-label="Incomplete"></i>') +
'</span>' +
'</div>') +
('<div class="column">' +
(milestone.workOrderMilestoneTime === 0
? ''
: milestone.workOrderMilestoneTimeString + '<br />') +
(milestone.workOrderMilestoneTypeId
? '<strong>' +
cityssm.escapeHTML(milestone.workOrderMilestoneType!) +
'</strong><br />'
: '') +
'<span class="is-size-7">' +
cityssm.escapeHTML(milestone.workOrderMilestoneDescription!) +
'</span>' +
'</div>') +
('<div class="column">' +
'<i class="fas fa-circle" style="color:' +
los.getRandomColor(milestone.workOrderNumber || '') +
'" aria-hidden="true"></i>' +
' <a class="has-text-weight-bold" href="' +
los.getWorkOrderURL(milestone.workOrderId!) +
'">' +
cityssm.escapeHTML(milestone.workOrderNumber || '') +
'</a><br />' +
'<span class="is-size-7">' +
cityssm.escapeHTML(milestone.workOrderDescription || '') +
'</span>' +
'</div>') +
('<div class="column is-size-7">' + lotOccupancyHTML + '</div>') +
'</div>'
;(currentPanelElement as HTMLElement).append(panelBlockElement)
} }
workOrderMilestoneDateFilterElement.addEventListener("change", () => { milestoneCalendarContainerElement.append(currentPanelElement!)
workOrderMilestoneDateStringElement.closest("fieldset")!.disabled = }
workOrderMilestoneDateFilterElement.value !== "date";
getMilestones();
});
los.initializeDatePickers(workOrderSearchFiltersFormElement); function getMilestones(event?: Event) {
if (event) {
event.preventDefault()
}
workOrderMilestoneDateStringElement.addEventListener("change", getMilestones); milestoneCalendarContainerElement.innerHTML = los.getLoadingParagraphHTML(
workOrderSearchFiltersFormElement.addEventListener("submit", getMilestones); 'Loading Milestones...'
)
getMilestones(); cityssm.postJSON(
})(); los.urlPrefix + '/workOrders/doGetWorkOrderMilestones',
workOrderSearchFiltersFormElement,
(responseJSON: {
workOrderMilestones: recordTypes.WorkOrderMilestone[]
}) => {
renderMilestones(responseJSON.workOrderMilestones)
}
)
}
workOrderMilestoneDateFilterElement.addEventListener('change', () => {
workOrderMilestoneDateStringElement.closest('fieldset')!.disabled =
workOrderMilestoneDateFilterElement.value !== 'date'
getMilestones()
})
los.initializeDatePickers(workOrderSearchFiltersFormElement)
workOrderMilestoneDateStringElement.addEventListener('change', getMilestones)
workOrderSearchFiltersFormElement.addEventListener('submit', getMilestones)
getMilestones()
})()

View File

@ -3,47 +3,48 @@
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
(() => { (() => {
const los = exports.los; const los = exports.los;
const workOrderTypeIdsElement = document.querySelector("#icsFilters--workOrderTypeIds"); const workOrderTypeIdsElement = document.querySelector('#icsFilters--workOrderTypeIds');
const workOrderMilestoneTypeIdsElement = document.querySelector("#icsFilters--workOrderMilestoneTypeIds"); const workOrderMilestoneTypeIdsElement = document.querySelector('#icsFilters--workOrderMilestoneTypeIds');
const calendarLinkElement = document.querySelector("#icsFilters--calendarURL"); const calendarLinkElement = document.querySelector('#icsFilters--calendarURL');
function updateCalendarURL() { function updateCalendarURL() {
let url = window.location.href.slice(0, Math.max(0, window.location.href.indexOf(window.location.pathname) + 1)) + let url = window.location.href.slice(0, Math.max(0, window.location.href.indexOf(window.location.pathname) + 1)) +
los.urlPrefix + los.urlPrefix +
"api/" + 'api/' +
los.apiKey + los.apiKey +
"/" + '/' +
"milestoneICS/" + 'milestoneICS/' +
"?"; '?';
if (!workOrderTypeIdsElement.disabled && if (!workOrderTypeIdsElement.disabled &&
workOrderTypeIdsElement.selectedOptions.length > 0) { workOrderTypeIdsElement.selectedOptions.length > 0) {
url += "workOrderTypeIds="; url += 'workOrderTypeIds=';
for (const optionElement of workOrderTypeIdsElement.selectedOptions) { for (const optionElement of workOrderTypeIdsElement.selectedOptions) {
url += optionElement.value + ","; url += optionElement.value + ',';
} }
url = url.slice(0, -1) + "&"; url = url.slice(0, -1) + '&';
} }
if (!workOrderMilestoneTypeIdsElement.disabled && if (!workOrderMilestoneTypeIdsElement.disabled &&
workOrderMilestoneTypeIdsElement.selectedOptions.length > 0) { workOrderMilestoneTypeIdsElement.selectedOptions.length > 0) {
url += "workOrderMilestoneTypeIds="; url += 'workOrderMilestoneTypeIds=';
for (const optionElement of workOrderMilestoneTypeIdsElement.selectedOptions) { for (const optionElement of workOrderMilestoneTypeIdsElement.selectedOptions) {
url += optionElement.value + ","; url += optionElement.value + ',';
} }
url = url.slice(0, -1) + "&"; url = url.slice(0, -1) + '&';
} }
calendarLinkElement.value = url.slice(0, -1); calendarLinkElement.value = url.slice(0, -1);
} }
document.querySelector("#icsFilters--workOrderTypeIds-all").addEventListener("change", (changeEvent) => { ;
document.querySelector('#icsFilters--workOrderTypeIds-all').addEventListener('change', (changeEvent) => {
workOrderTypeIdsElement.disabled = changeEvent.currentTarget.checked; workOrderTypeIdsElement.disabled = changeEvent.currentTarget.checked;
}); });
document.querySelector("#icsFilters--workOrderMilestoneTypeIds-all").addEventListener("change", (changeEvent) => { document.querySelector('#icsFilters--workOrderMilestoneTypeIds-all').addEventListener('change', (changeEvent) => {
workOrderMilestoneTypeIdsElement.disabled = changeEvent.currentTarget.checked; workOrderMilestoneTypeIdsElement.disabled = changeEvent.currentTarget.checked;
}); });
const inputSelectElements = document.querySelector("#panel--icsFilters").querySelectorAll("input, select"); const inputSelectElements = document.querySelector('#panel--icsFilters').querySelectorAll('input, select');
for (const element of inputSelectElements) { for (const element of inputSelectElements) {
element.addEventListener("change", updateCalendarURL); element.addEventListener('change', updateCalendarURL);
} }
updateCalendarURL(); updateCalendarURL();
calendarLinkElement.addEventListener("click", () => { calendarLinkElement.addEventListener('click', () => {
calendarLinkElement.focus(); calendarLinkElement.focus();
calendarLinkElement.select(); calendarLinkElement.select();
}); });

View File

@ -1,85 +1,98 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
import type * as globalTypes from "../types/globalTypes"; import type * as globalTypes from '../types/globalTypes'
(() => { ;(() => {
const los = exports.los as globalTypes.LOS; const los = exports.los as globalTypes.LOS
const workOrderTypeIdsElement = document.querySelector( const workOrderTypeIdsElement = document.querySelector(
"#icsFilters--workOrderTypeIds" '#icsFilters--workOrderTypeIds'
) as HTMLSelectElement; ) as HTMLSelectElement
const workOrderMilestoneTypeIdsElement = document.querySelector( const workOrderMilestoneTypeIdsElement = document.querySelector(
"#icsFilters--workOrderMilestoneTypeIds" '#icsFilters--workOrderMilestoneTypeIds'
) as HTMLSelectElement; ) as HTMLSelectElement
const calendarLinkElement = document.querySelector( const calendarLinkElement = document.querySelector(
"#icsFilters--calendarURL" '#icsFilters--calendarURL'
) as HTMLTextAreaElement; ) as HTMLTextAreaElement
function updateCalendarURL() { function updateCalendarURL() {
let url = window.location.href.slice( let url =
0, window.location.href.slice(
Math.max(0, window.location.href.indexOf(window.location.pathname) + 1) 0,
) + Math.max(0, window.location.href.indexOf(window.location.pathname) + 1)
los.urlPrefix + ) +
"api/" + los.urlPrefix +
los.apiKey + 'api/' +
"/" + los.apiKey +
"milestoneICS/" + '/' +
"?"; 'milestoneICS/' +
'?'
if (!workOrderTypeIdsElement.disabled && if (
workOrderTypeIdsElement.selectedOptions.length > 0) { !workOrderTypeIdsElement.disabled &&
url += "workOrderTypeIds="; workOrderTypeIdsElement.selectedOptions.length > 0
) {
url += 'workOrderTypeIds='
for (const optionElement of workOrderTypeIdsElement.selectedOptions) { for (const optionElement of workOrderTypeIdsElement.selectedOptions) {
url += optionElement.value + ","; url += optionElement.value + ','
} }
url = url.slice(0, -1) + "&"; url = url.slice(0, -1) + '&'
}
if (!workOrderMilestoneTypeIdsElement.disabled &&
workOrderMilestoneTypeIdsElement.selectedOptions.length > 0) {
url += "workOrderMilestoneTypeIds=";
for (const optionElement of workOrderMilestoneTypeIdsElement.selectedOptions) {
url += optionElement.value + ",";
}
url = url.slice(0, -1) + "&";
}
calendarLinkElement.value = url.slice(0, -1);
} }
( if (
document.querySelector("#icsFilters--workOrderTypeIds-all") as HTMLInputElement !workOrderMilestoneTypeIdsElement.disabled &&
).addEventListener("change", (changeEvent) => { workOrderMilestoneTypeIdsElement.selectedOptions.length > 0
workOrderTypeIdsElement.disabled = (changeEvent.currentTarget as HTMLInputElement).checked; ) {
}); url += 'workOrderMilestoneTypeIds='
( for (const optionElement of workOrderMilestoneTypeIdsElement.selectedOptions) {
document.querySelector("#icsFilters--workOrderMilestoneTypeIds-all") as HTMLInputElement url += optionElement.value + ','
).addEventListener("change", (changeEvent) => { }
workOrderMilestoneTypeIdsElement.disabled = (
changeEvent.currentTarget as HTMLInputElement
).checked;
});
const inputSelectElements = ( url = url.slice(0, -1) + '&'
document.querySelector("#panel--icsFilters") as HTMLElement
).querySelectorAll("input, select") as NodeListOf<HTMLInputElement | HTMLSelectElement>;
for (const element of inputSelectElements) {
element.addEventListener("change", updateCalendarURL);
} }
updateCalendarURL(); calendarLinkElement.value = url.slice(0, -1)
}
calendarLinkElement.addEventListener("click", () => { ;(
calendarLinkElement.focus(); document.querySelector(
calendarLinkElement.select(); '#icsFilters--workOrderTypeIds-all'
}); ) as HTMLInputElement
})(); ).addEventListener('change', (changeEvent) => {
workOrderTypeIdsElement.disabled = (
changeEvent.currentTarget as HTMLInputElement
).checked
})
;(
document.querySelector(
'#icsFilters--workOrderMilestoneTypeIds-all'
) as HTMLInputElement
).addEventListener('change', (changeEvent) => {
workOrderMilestoneTypeIdsElement.disabled = (
changeEvent.currentTarget as HTMLInputElement
).checked
})
const inputSelectElements = (
document.querySelector('#panel--icsFilters') as HTMLElement
).querySelectorAll('input, select') as NodeListOf<
HTMLInputElement | HTMLSelectElement
>
for (const element of inputSelectElements) {
element.addEventListener('change', updateCalendarURL)
}
updateCalendarURL()
calendarLinkElement.addEventListener('click', () => {
calendarLinkElement.focus()
calendarLinkElement.select()
})
})()

View File

@ -4,67 +4,69 @@ Object.defineProperty(exports, "__esModule", { value: true });
(() => { (() => {
const los = exports.los; const los = exports.los;
const workOrderPrints = exports.workOrderPrints; const workOrderPrints = exports.workOrderPrints;
const searchFilterFormElement = document.querySelector("#form--searchFilters"); const searchFilterFormElement = document.querySelector('#form--searchFilters');
los.initializeDatePickers(searchFilterFormElement); los.initializeDatePickers(searchFilterFormElement);
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');
function renderWorkOrders(responseJSON) { function renderWorkOrders(responseJSON) {
var _a, _b; var _a, _b;
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;
} }
const resultsTbodyElement = document.createElement("tbody"); const resultsTbodyElement = document.createElement('tbody');
for (const workOrder of responseJSON.workOrders) { for (const workOrder of responseJSON.workOrders) {
let relatedHTML = ""; let relatedHTML = '';
for (const lot of workOrder.workOrderLots) { for (const lot of workOrder.workOrderLots) {
relatedHTML += relatedHTML +=
'<span class="has-tooltip-left" data-tooltip="' + '<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(lot.mapName || "") + cityssm.escapeHTML(lot.mapName || '') +
'">' + '">' +
'<i class="fas fa-fw fa-vector-square" aria-label="' + '<i class="fas fa-fw fa-vector-square" aria-label="' +
los.escapedAliases.Lot + los.escapedAliases.Lot +
'"></i> ' + '"></i> ' +
cityssm.escapeHTML(lot.lotName || "(No " + exports.aliases.Lot + " Name)") + cityssm.escapeHTML(lot.lotName || '(No ' + exports.aliases.Lot + ' Name)') +
"</span><br />"; '</span><br />';
} }
for (const occupancy of workOrder.workOrderLotOccupancies) { for (const occupancy of workOrder.workOrderLotOccupancies) {
for (const occupant of occupancy.lotOccupancyOccupants) { for (const occupant of occupancy.lotOccupancyOccupants) {
relatedHTML += relatedHTML +=
'<span class="has-tooltip-left" data-tooltip="' + '<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(occupant.lotOccupantType || "") + cityssm.escapeHTML(occupant.lotOccupantType || '') +
'">' + '">' +
'<i class="fas fa-fw fa-' + '<i class="fas fa-fw fa-' +
cityssm.escapeHTML(occupant.fontAwesomeIconClass || "user") + cityssm.escapeHTML(occupant.fontAwesomeIconClass || 'user') +
'" aria-label="' + '" aria-label="' +
los.escapedAliases.occupant + los.escapedAliases.occupant +
'"></i> ' + '"></i> ' +
cityssm.escapeHTML(occupant.occupantName || "(No Name)") + cityssm.escapeHTML(occupant.occupantName || '(No Name)') +
"</span><br />"; '</span><br />';
} }
} }
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" + resultsTbodyElement.insertAdjacentHTML('beforeend', '<tr>' +
("<td>" + ('<td>' +
'<a class="has-text-weight-bold" href="' + '<a class="has-text-weight-bold" href="' +
los.getWorkOrderURL(workOrder.workOrderId) + los.getWorkOrderURL(workOrder.workOrderId) +
'">' + '">' +
(workOrder.workOrderNumber.trim() (workOrder.workOrderNumber.trim()
? cityssm.escapeHTML(workOrder.workOrderNumber || "") ? cityssm.escapeHTML(workOrder.workOrderNumber || '')
: "(No Number)") + : '(No Number)') +
"</a>" + '</a>' +
"</td>") + '</td>') +
("<td>" + ('<td>' +
cityssm.escapeHTML(workOrder.workOrderType || "") + cityssm.escapeHTML(workOrder.workOrderType || '') +
"<br />" + '<br />' +
'<span class="is-size-7">' + '<span class="is-size-7">' +
cityssm.escapeHTML(workOrder.workOrderDescription || "") + cityssm.escapeHTML(workOrder.workOrderDescription || '') +
"</span>" + '</span>' +
"</td>") + '</td>') +
('<td class="is-nowrap"><span class="is-size-7">' + relatedHTML + "</span></td>") + ('<td class="is-nowrap"><span class="is-size-7">' +
relatedHTML +
'</span></td>') +
('<td class="is-nowrap">' + ('<td class="is-nowrap">' +
('<span class="has-tooltip-left" data-tooltip="' + ('<span class="has-tooltip-left" data-tooltip="' +
los.escapedAliases.WorkOrderOpenDate + los.escapedAliases.WorkOrderOpenDate +
@ -73,7 +75,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
los.escapedAliases.WorkOrderOpenDate + los.escapedAliases.WorkOrderOpenDate +
'"></i> ' + '"></i> ' +
workOrder.workOrderOpenDateString + workOrder.workOrderOpenDateString +
"</span><br />") + '</span><br />') +
('<span class="has-tooltip-left" data-tooltip="' + ('<span class="has-tooltip-left" data-tooltip="' +
los.escapedAliases.WorkOrderCloseDate + los.escapedAliases.WorkOrderCloseDate +
'">' + '">' +
@ -84,55 +86,57 @@ Object.defineProperty(exports, "__esModule", { value: true });
? workOrder.workOrderCloseDateString ? workOrder.workOrderCloseDateString
: '<span class="has-text-grey">(No ' + : '<span class="has-text-grey">(No ' +
los.escapedAliases.WorkOrderCloseDate + los.escapedAliases.WorkOrderCloseDate +
")</span>") + ')</span>') +
"</span>") + '</span>') +
"</td>") + '</td>') +
("<td>" + ('<td>' +
(workOrder.workOrderMilestoneCount === 0 (workOrder.workOrderMilestoneCount === 0
? "-" ? '-'
: workOrder.workOrderMilestoneCompletionCount + : workOrder.workOrderMilestoneCompletionCount +
" / " + ' / ' +
workOrder.workOrderMilestoneCount) + workOrder.workOrderMilestoneCount) +
"</td>") + '</td>') +
(workOrderPrints.length > 0 (workOrderPrints.length > 0
? "<td>" + ? '<td>' +
'<a class="button is-small" data-tooltip="Print" href="' + '<a class="button is-small" data-tooltip="Print" href="' +
los.urlPrefix + los.urlPrefix +
"/print/" + '/print/' +
workOrderPrints[0] + workOrderPrints[0] +
"/?workOrderId=" + '/?workOrderId=' +
workOrder.workOrderId + workOrder.workOrderId +
'" target="_blank">' + '" target="_blank">' +
'<i class="fas fa-print" aria-label="Print"></i>' + '<i class="fas fa-print" aria-label="Print"></i>' +
"</a>" + '</a>' +
"</td>" '</td>'
: "") + : '') +
"</tr>"); '</tr>');
} }
searchResultsContainerElement.innerHTML = searchResultsContainerElement.innerHTML =
'<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">' + '<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">' +
"<thead><tr>" + '<thead><tr>' +
"<th>Work Order Number</th>" + '<th>Work Order Number</th>' +
"<th>Description</th>" + '<th>Description</th>' +
"<th>Related</th>" + '<th>Related</th>' +
"<th>Date</th>" + '<th>Date</th>' +
'<th class="has-tooltip-bottom" data-tooltip="Completed / Total Milestones">Progress</th>' + '<th class="has-tooltip-bottom" data-tooltip="Completed / Total Milestones">Progress</th>' +
(workOrderPrints.length > 0 ? '<th class="has-width-1"></th>' : "") + (workOrderPrints.length > 0 ? '<th class="has-width-1"></th>' : '') +
"</tr></thead>" + '</tr></thead>' +
"<table>"; '<table>';
searchResultsContainerElement.insertAdjacentHTML("beforeend", los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count)); searchResultsContainerElement.insertAdjacentHTML('beforeend', los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count));
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement); searchResultsContainerElement
.querySelector('table')
.append(resultsTbodyElement);
(_a = searchResultsContainerElement (_a = searchResultsContainerElement
.querySelector("button[data-page='previous']")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", previousAndGetWorkOrders); .querySelector("button[data-page='previous']")) === null || _a === void 0 ? void 0 : _a.addEventListener('click', previousAndGetWorkOrders);
(_b = searchResultsContainerElement (_b = searchResultsContainerElement
.querySelector("button[data-page='next']")) === null || _b === void 0 ? void 0 : _b.addEventListener("click", nextAndGetWorkOrders); .querySelector("button[data-page='next']")) === null || _b === void 0 ? void 0 : _b.addEventListener('click', nextAndGetWorkOrders);
} }
function getWorkOrders() { function getWorkOrders() {
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML("Loading Work Orders..."); searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML('Loading Work Orders...');
cityssm.postJSON(los.urlPrefix + "/workOrders/doSearchWorkOrders", searchFilterFormElement, renderWorkOrders); cityssm.postJSON(los.urlPrefix + '/workOrders/doSearchWorkOrders', searchFilterFormElement, renderWorkOrders);
} }
function resetOffsetAndGetWorkOrders() { function resetOffsetAndGetWorkOrders() {
offsetElement.value = "0"; offsetElement.value = '0';
getWorkOrders(); getWorkOrders();
} }
function previousAndGetWorkOrders() { function previousAndGetWorkOrders() {
@ -143,42 +147,42 @@ Object.defineProperty(exports, "__esModule", { value: true });
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"); const filterElements = searchFilterFormElement.querySelectorAll('input, select');
for (const filterElement of filterElements) { for (const filterElement of filterElements) {
filterElement.addEventListener("change", resetOffsetAndGetWorkOrders); filterElement.addEventListener('change', resetOffsetAndGetWorkOrders);
} }
searchFilterFormElement.addEventListener("submit", (formEvent) => { searchFilterFormElement.addEventListener('submit', (formEvent) => {
formEvent.preventDefault(); formEvent.preventDefault();
resetOffsetAndGetWorkOrders(); resetOffsetAndGetWorkOrders();
}); });
/* /*
const workOrderOpenDateStringElement = document.querySelector("#searchFilter--workOrderOpenDateString") as HTMLInputElement; const workOrderOpenDateStringElement = document.querySelector("#searchFilter--workOrderOpenDateString") as HTMLInputElement;
document.querySelector("#button--workOrderOpenDateString-previous").addEventListener("click", () => { document.querySelector("#button--workOrderOpenDateString-previous").addEventListener("click", () => {
if (workOrderOpenDateStringElement.value === "") { if (workOrderOpenDateStringElement.value === "") {
workOrderOpenDateStringElement.valueAsDate = new Date(); workOrderOpenDateStringElement.valueAsDate = new Date();
} else { } else {
const openDate = workOrderOpenDateStringElement.valueAsDate; const openDate = workOrderOpenDateStringElement.valueAsDate;
openDate.setDate(openDate.getDate() - 1); openDate.setDate(openDate.getDate() - 1);
workOrderOpenDateStringElement.valueAsDate = openDate; workOrderOpenDateStringElement.valueAsDate = openDate;
} }
resetOffsetAndGetWorkOrders(); resetOffsetAndGetWorkOrders();
}); });
document.querySelector("#button--workOrderOpenDateString-next").addEventListener("click", () => { document.querySelector("#button--workOrderOpenDateString-next").addEventListener("click", () => {
if (workOrderOpenDateStringElement.value === "") { if (workOrderOpenDateStringElement.value === "") {
workOrderOpenDateStringElement.valueAsDate = new Date(); workOrderOpenDateStringElement.valueAsDate = new Date();
} else { } else {
const openDate = workOrderOpenDateStringElement.valueAsDate; const openDate = workOrderOpenDateStringElement.valueAsDate;
openDate.setDate(openDate.getDate() + 1); openDate.setDate(openDate.getDate() + 1);
workOrderOpenDateStringElement.valueAsDate = openDate; workOrderOpenDateStringElement.valueAsDate = openDate;
} }
resetOffsetAndGetWorkOrders(); resetOffsetAndGetWorkOrders();
}); });
*/ */
getWorkOrders(); getWorkOrders();
})(); })();

View File

@ -1,209 +1,232 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
import type * as recordTypes from "../types/recordTypes"; import type * as recordTypes from '../types/recordTypes'
import type * as globalTypes from "../types/globalTypes"; import type * as globalTypes from '../types/globalTypes'
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
declare const cityssm: cityssmGlobal; declare const cityssm: cityssmGlobal
(() => { ;(() => {
const los = exports.los as globalTypes.LOS; const los = exports.los as globalTypes.LOS
const workOrderPrints: string[] = exports.workOrderPrints; const workOrderPrints: string[] = exports.workOrderPrints
const searchFilterFormElement = document.querySelector("#form--searchFilters") as HTMLFormElement; const searchFilterFormElement = document.querySelector(
'#form--searchFilters'
) as HTMLFormElement
los.initializeDatePickers(searchFilterFormElement); los.initializeDatePickers(searchFilterFormElement)
const searchResultsContainerElement = document.querySelector("#container--searchResults") as HTMLElement; const searchResultsContainerElement = document.querySelector(
'#container--searchResults'
) as HTMLElement
const limit = Number.parseInt( const limit = Number.parseInt(
(document.querySelector("#searchFilter--limit") as HTMLInputElement).value, (document.querySelector('#searchFilter--limit') as HTMLInputElement).value,
10 10
); )
const offsetElement = document.querySelector("#searchFilter--offset") as HTMLInputElement; const offsetElement = document.querySelector(
'#searchFilter--offset'
) as HTMLInputElement
function renderWorkOrders(responseJSON: { function renderWorkOrders(responseJSON: {
count: number; count: number
offset: number; offset: 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
}
const resultsTbodyElement = document.createElement('tbody')
for (const workOrder of responseJSON.workOrders) {
let relatedHTML = ''
for (const lot of workOrder.workOrderLots!) {
relatedHTML +=
'<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(lot.mapName || '') +
'">' +
'<i class="fas fa-fw fa-vector-square" aria-label="' +
los.escapedAliases.Lot +
'"></i> ' +
cityssm.escapeHTML(
lot.lotName || '(No ' + exports.aliases.Lot + ' Name)'
) +
'</span><br />'
}
for (const occupancy of workOrder.workOrderLotOccupancies!) {
for (const occupant of occupancy.lotOccupancyOccupants!) {
relatedHTML +=
'<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(occupant.lotOccupantType || '') +
'">' +
'<i class="fas fa-fw fa-' +
cityssm.escapeHTML(occupant.fontAwesomeIconClass || 'user') +
'" aria-label="' +
los.escapedAliases.occupant +
'"></i> ' +
cityssm.escapeHTML(occupant.occupantName || '(No Name)') +
'</span><br />'
} }
}
const resultsTbodyElement = document.createElement("tbody"); resultsTbodyElement.insertAdjacentHTML(
'beforeend',
for (const workOrder of responseJSON.workOrders) { '<tr>' +
let relatedHTML = ""; ('<td>' +
'<a class="has-text-weight-bold" href="' +
for (const lot of workOrder.workOrderLots!) { los.getWorkOrderURL(workOrder.workOrderId!) +
relatedHTML += '">' +
'<span class="has-tooltip-left" data-tooltip="' + (workOrder.workOrderNumber!.trim()
cityssm.escapeHTML(lot.mapName || "") + ? cityssm.escapeHTML(workOrder.workOrderNumber || '')
'">' + : '(No Number)') +
'<i class="fas fa-fw fa-vector-square" aria-label="' + '</a>' +
los.escapedAliases.Lot + '</td>') +
'"></i> ' + ('<td>' +
cityssm.escapeHTML(lot.lotName || "(No " + exports.aliases.Lot + " Name)") + cityssm.escapeHTML(workOrder.workOrderType || '') +
"</span><br />"; '<br />' +
} '<span class="is-size-7">' +
cityssm.escapeHTML(workOrder.workOrderDescription || '') +
for (const occupancy of workOrder.workOrderLotOccupancies!) { '</span>' +
for (const occupant of occupancy.lotOccupancyOccupants!) { '</td>') +
relatedHTML += ('<td class="is-nowrap"><span class="is-size-7">' +
'<span class="has-tooltip-left" data-tooltip="' + relatedHTML +
cityssm.escapeHTML(occupant.lotOccupantType || "") + '</span></td>') +
'">' + ('<td class="is-nowrap">' +
'<i class="fas fa-fw fa-' + ('<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(occupant.fontAwesomeIconClass || "user") + los.escapedAliases.WorkOrderOpenDate +
'" aria-label="' + '">' +
los.escapedAliases.occupant + '<i class="fas fa-fw fa-play" aria-label="' +
'"></i> ' + los.escapedAliases.WorkOrderOpenDate +
cityssm.escapeHTML(occupant.occupantName || "(No Name)") + '"></i> ' +
"</span><br />"; workOrder.workOrderOpenDateString +
} '</span><br />') +
} ('<span class="has-tooltip-left" data-tooltip="' +
los.escapedAliases.WorkOrderCloseDate +
resultsTbodyElement.insertAdjacentHTML( '">' +
"beforeend", '<i class="fas fa-fw fa-stop" aria-label="' +
"<tr>" + los.escapedAliases.WorkOrderCloseDate +
("<td>" + '"></i> ' +
'<a class="has-text-weight-bold" href="' + (workOrder.workOrderCloseDate
los.getWorkOrderURL(workOrder.workOrderId!) + ? workOrder.workOrderCloseDateString
'">' + : '<span class="has-text-grey">(No ' +
(workOrder.workOrderNumber!.trim() los.escapedAliases.WorkOrderCloseDate +
? cityssm.escapeHTML(workOrder.workOrderNumber || "") ')</span>') +
: "(No Number)") + '</span>') +
"</a>" + '</td>') +
"</td>") + ('<td>' +
("<td>" + (workOrder.workOrderMilestoneCount === 0
cityssm.escapeHTML(workOrder.workOrderType || "") + ? '-'
"<br />" + : workOrder.workOrderMilestoneCompletionCount +
'<span class="is-size-7">' + ' / ' +
cityssm.escapeHTML(workOrder.workOrderDescription || "") + workOrder.workOrderMilestoneCount) +
"</span>" + '</td>') +
"</td>") + (workOrderPrints.length > 0
('<td class="is-nowrap"><span class="is-size-7">' + relatedHTML + "</span></td>") + ? '<td>' +
('<td class="is-nowrap">' + '<a class="button is-small" data-tooltip="Print" href="' +
('<span class="has-tooltip-left" data-tooltip="' + los.urlPrefix +
los.escapedAliases.WorkOrderOpenDate + '/print/' +
'">' + workOrderPrints[0] +
'<i class="fas fa-fw fa-play" aria-label="' + '/?workOrderId=' +
los.escapedAliases.WorkOrderOpenDate + workOrder.workOrderId +
'"></i> ' + '" target="_blank">' +
workOrder.workOrderOpenDateString + '<i class="fas fa-print" aria-label="Print"></i>' +
"</span><br />") + '</a>' +
('<span class="has-tooltip-left" data-tooltip="' + '</td>'
los.escapedAliases.WorkOrderCloseDate + : '') +
'">' + '</tr>'
'<i class="fas fa-fw fa-stop" aria-label="' + )
los.escapedAliases.WorkOrderCloseDate +
'"></i> ' +
(workOrder.workOrderCloseDate
? workOrder.workOrderCloseDateString
: '<span class="has-text-grey">(No ' +
los.escapedAliases.WorkOrderCloseDate +
")</span>") +
"</span>") +
"</td>") +
("<td>" +
(workOrder.workOrderMilestoneCount === 0
? "-"
: workOrder.workOrderMilestoneCompletionCount +
" / " +
workOrder.workOrderMilestoneCount) +
"</td>") +
(workOrderPrints.length > 0
? "<td>" +
'<a class="button is-small" data-tooltip="Print" href="' +
los.urlPrefix +
"/print/" +
workOrderPrints[0] +
"/?workOrderId=" +
workOrder.workOrderId +
'" target="_blank">' +
'<i class="fas fa-print" aria-label="Print"></i>' +
"</a>" +
"</td>"
: "") +
"</tr>"
);
}
searchResultsContainerElement.innerHTML =
'<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">' +
"<thead><tr>" +
"<th>Work Order Number</th>" +
"<th>Description</th>" +
"<th>Related</th>" +
"<th>Date</th>" +
'<th class="has-tooltip-bottom" data-tooltip="Completed / Total Milestones">Progress</th>' +
(workOrderPrints.length > 0 ? '<th class="has-width-1"></th>' : "") +
"</tr></thead>" +
"<table>";
searchResultsContainerElement.insertAdjacentHTML(
"beforeend",
los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count)
);
searchResultsContainerElement.querySelector("table")!.append(resultsTbodyElement);
searchResultsContainerElement
.querySelector("button[data-page='previous']")
?.addEventListener("click", previousAndGetWorkOrders);
searchResultsContainerElement
.querySelector("button[data-page='next']")
?.addEventListener("click", nextAndGetWorkOrders);
} }
function getWorkOrders() { searchResultsContainerElement.innerHTML =
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML("Loading Work Orders..."); '<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">' +
'<thead><tr>' +
'<th>Work Order Number</th>' +
'<th>Description</th>' +
'<th>Related</th>' +
'<th>Date</th>' +
'<th class="has-tooltip-bottom" data-tooltip="Completed / Total Milestones">Progress</th>' +
(workOrderPrints.length > 0 ? '<th class="has-width-1"></th>' : '') +
'</tr></thead>' +
'<table>'
cityssm.postJSON( searchResultsContainerElement.insertAdjacentHTML(
los.urlPrefix + "/workOrders/doSearchWorkOrders", 'beforeend',
searchFilterFormElement, los.getSearchResultsPagerHTML(
renderWorkOrders limit,
); responseJSON.offset,
} responseJSON.count
)
)
function resetOffsetAndGetWorkOrders() { searchResultsContainerElement
offsetElement.value = "0"; .querySelector('table')!
getWorkOrders(); .append(resultsTbodyElement)
}
function previousAndGetWorkOrders() { searchResultsContainerElement
offsetElement.value = Math.max(Number.parseInt(offsetElement.value, 10) - limit, 0).toString(); .querySelector("button[data-page='previous']")
getWorkOrders(); ?.addEventListener('click', previousAndGetWorkOrders)
}
function nextAndGetWorkOrders() { searchResultsContainerElement
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString(); .querySelector("button[data-page='next']")
getWorkOrders(); ?.addEventListener('click', nextAndGetWorkOrders)
} }
const filterElements = searchFilterFormElement.querySelectorAll("input, select") as NodeListOf< function getWorkOrders() {
HTMLInputElement | HTMLSelectElement searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(
>; 'Loading Work Orders...'
)
for (const filterElement of filterElements) { cityssm.postJSON(
filterElement.addEventListener("change", resetOffsetAndGetWorkOrders); los.urlPrefix + '/workOrders/doSearchWorkOrders',
} searchFilterFormElement,
renderWorkOrders
)
}
searchFilterFormElement.addEventListener("submit", (formEvent) => { function resetOffsetAndGetWorkOrders() {
formEvent.preventDefault(); offsetElement.value = '0'
resetOffsetAndGetWorkOrders(); getWorkOrders()
}); }
/* function previousAndGetWorkOrders() {
offsetElement.value = Math.max(
Number.parseInt(offsetElement.value, 10) - limit,
0
).toString()
getWorkOrders()
}
function nextAndGetWorkOrders() {
offsetElement.value = (
Number.parseInt(offsetElement.value, 10) + limit
).toString()
getWorkOrders()
}
const filterElements = searchFilterFormElement.querySelectorAll(
'input, select'
) as NodeListOf<HTMLInputElement | HTMLSelectElement>
for (const filterElement of filterElements) {
filterElement.addEventListener('change', resetOffsetAndGetWorkOrders)
}
searchFilterFormElement.addEventListener('submit', (formEvent) => {
formEvent.preventDefault()
resetOffsetAndGetWorkOrders()
})
/*
const workOrderOpenDateStringElement = document.querySelector("#searchFilter--workOrderOpenDateString") as HTMLInputElement; const workOrderOpenDateStringElement = document.querySelector("#searchFilter--workOrderOpenDateString") as HTMLInputElement;
document.querySelector("#button--workOrderOpenDateString-previous").addEventListener("click", () => { document.querySelector("#button--workOrderOpenDateString-previous").addEventListener("click", () => {
@ -233,5 +256,5 @@ declare const cityssm: cityssmGlobal;
}); });
*/ */
getWorkOrders(); getWorkOrders()
})(); })()

View File

@ -3,33 +3,32 @@
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
(() => { (() => {
const los = exports.los; const los = exports.los;
const reopenWorkOrderButtonElement = document.querySelector("#button--reopenWorkOrder"); const reopenWorkOrderButtonElement = document.querySelector('#button--reopenWorkOrder');
if (reopenWorkOrderButtonElement) { if (reopenWorkOrderButtonElement) {
const workOrderId = reopenWorkOrderButtonElement.dataset.workOrderId; const workOrderId = reopenWorkOrderButtonElement.dataset.workOrderId;
reopenWorkOrderButtonElement.addEventListener("click", () => { reopenWorkOrderButtonElement.addEventListener('click', () => {
function doReopen() { function doReopen() {
cityssm.postJSON(los.urlPrefix + "/workOrders/doReopenWorkOrder", { cityssm.postJSON(los.urlPrefix + '/workOrders/doReopenWorkOrder', {
workOrderId workOrderId
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
window.location.href = window.location.href = los.getWorkOrderURL(workOrderId, true, true);
los.getWorkOrderURL(workOrderId, true, true);
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Reopening Work Order", title: 'Error Reopening Work Order',
message: responseJSON.errorMessage || "", message: responseJSON.errorMessage || '',
contextualColorName: "danger" contextualColorName: 'danger'
}); });
} }
}); });
} }
bulmaJS.confirm({ bulmaJS.confirm({
title: "Reopen Work Order", title: 'Reopen Work Order',
message: "Are you sure you want to remove the close date from this work order and reopen it?", message: 'Are you sure you want to remove the close date from this work order and reopen it?',
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: "Yes, Reopen Work Order", text: 'Yes, Reopen Work Order',
callbackFunction: doReopen callbackFunction: doReopen
} }
}); });

View File

@ -1,56 +1,59 @@
/* eslint-disable unicorn/prefer-module, @typescript-eslint/no-non-null-assertion */ /* eslint-disable unicorn/prefer-module, @typescript-eslint/no-non-null-assertion */
import type * as globalTypes from "../types/globalTypes"; import type * as globalTypes from '../types/globalTypes'
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
import type { BulmaJS } from "@cityssm/bulma-js/types"; import type { BulmaJS } from '@cityssm/bulma-js/types'
declare const cityssm: cityssmGlobal; declare const 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 reopenWorkOrderButtonElement = document.querySelector( const reopenWorkOrderButtonElement = document.querySelector(
"#button--reopenWorkOrder" '#button--reopenWorkOrder'
) as HTMLButtonElement; ) as HTMLButtonElement
if (reopenWorkOrderButtonElement) { if (reopenWorkOrderButtonElement) {
const workOrderId = reopenWorkOrderButtonElement.dataset.workOrderId!; const workOrderId = reopenWorkOrderButtonElement.dataset.workOrderId!
reopenWorkOrderButtonElement.addEventListener("click", () => { reopenWorkOrderButtonElement.addEventListener('click', () => {
function doReopen() { function doReopen() {
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + "/workOrders/doReopenWorkOrder", los.urlPrefix + '/workOrders/doReopenWorkOrder',
{ {
workOrderId workOrderId
}, },
(responseJSON: { success: boolean; errorMessage?: string }) => { (responseJSON: { success: boolean; errorMessage?: string }) => {
if (responseJSON.success) { if (responseJSON.success) {
window.location.href = window.location.href = los.getWorkOrderURL(
los.getWorkOrderURL(workOrderId, true, true); workOrderId,
} else { true,
bulmaJS.alert({ true
title: "Error Reopening Work Order", )
message: responseJSON.errorMessage || "", } else {
contextualColorName: "danger" bulmaJS.alert({
}); title: 'Error Reopening Work Order',
} message: responseJSON.errorMessage || '',
} contextualColorName: 'danger'
); })
} }
}
)
}
bulmaJS.confirm({ bulmaJS.confirm({
title: "Reopen Work Order", title: 'Reopen Work Order',
message: message:
"Are you sure you want to remove the close date from this work order and reopen it?", 'Are you sure you want to remove the close date from this work order and reopen it?',
contextualColorName: "warning", contextualColorName: 'warning',
okButton: { okButton: {
text: "Yes, Reopen Work Order", text: 'Yes, Reopen Work Order',
callbackFunction: doReopen callbackFunction: doReopen
} }
}); })
}); })
} }
})(); })()

View File

@ -1,6 +1,6 @@
<div class="modal" role="dialog"> <div class="modal" role="dialog">
<div class="modal-background"></div> <div class="modal-background"></div>
<div class="modal-card" style="width:900px"> <div class="modal-card has-width-900">
<header class="modal-card-head"> <header class="modal-card-head">
<h3 class="modal-card-title"> <h3 class="modal-card-title">
Update Fee Update Fee

View File

@ -1,6 +1,6 @@
<div class="modal" role="dialog"> <div class="modal" role="dialog">
<div class="modal-background"></div> <div class="modal-background"></div>
<div class="modal-card" style="width:900px"> <div class="modal-card has-width-900">
<header class="modal-card-head"> <header class="modal-card-head">
<h3 class="modal-card-title"> <h3 class="modal-card-title">
Add <span class="alias" data-alias="Lot"></span> Type Add <span class="alias" data-alias="Lot"></span> Type

View File

@ -1,6 +1,6 @@
<div class="modal" role="dialog"> <div class="modal" role="dialog">
<div class="modal-background"></div> <div class="modal-background"></div>
<div class="modal-card" style="width:900px"> <div class="modal-card has-width-900">
<header class="modal-card-head"> <header class="modal-card-head">
<h3 class="modal-card-title"> <h3 class="modal-card-title">
Add <span class="alias" data-alias="Lot"></span> Type Field Add <span class="alias" data-alias="Lot"></span> Type Field

View File

@ -1,6 +1,6 @@
<div class="modal" role="dialog"> <div class="modal" role="dialog">
<div class="modal-background"></div> <div class="modal-background"></div>
<div class="modal-card" style="width:900px"> <div class="modal-card has-width-900">
<header class="modal-card-head"> <header class="modal-card-head">
<h3 class="modal-card-title"> <h3 class="modal-card-title">
Update <span class="alias" data-alias="Lot"></span> Type Update <span class="alias" data-alias="Lot"></span> Type

View File

@ -1,6 +1,6 @@
<div class="modal" role="dialog"> <div class="modal" role="dialog">
<div class="modal-background"></div> <div class="modal-background"></div>
<div class="modal-card" style="width:900px"> <div class="modal-card has-width-900">
<header class="modal-card-head"> <header class="modal-card-head">
<h3 class="modal-card-title"> <h3 class="modal-card-title">
Update <span class="alias" data-alias="Lot"></span> Type Field Update <span class="alias" data-alias="Lot"></span> Type Field

View File

@ -1,6 +1,6 @@
<div class="modal" role="dialog"> <div class="modal" role="dialog">
<div class="modal-background"></div> <div class="modal-background"></div>
<div class="modal-card" style="width:900px"> <div class="modal-card has-width-900">
<header class="modal-card-head"> <header class="modal-card-head">
<h3 class="modal-card-title"> <h3 class="modal-card-title">
Add <span class="alias" data-alias="Occupancy"></span> Type Add <span class="alias" data-alias="Occupancy"></span> Type

View File

@ -1,6 +1,6 @@
<div class="modal" role="dialog"> <div class="modal" role="dialog">
<div class="modal-background"></div> <div class="modal-background"></div>
<div class="modal-card" style="width:900px"> <div class="modal-card has-width-900">
<header class="modal-card-head"> <header class="modal-card-head">
<h3 class="modal-card-title"> <h3 class="modal-card-title">
Add <span class="alias" data-alias="Occupancy"></span> Type Field Add <span class="alias" data-alias="Occupancy"></span> Type Field

View File

@ -1,6 +1,6 @@
<div class="modal" role="dialog"> <div class="modal" role="dialog">
<div class="modal-background"></div> <div class="modal-background"></div>
<div class="modal-card" style="width:900px"> <div class="modal-card has-width-900">
<header class="modal-card-head"> <header class="modal-card-head">
<h3 class="modal-card-title"> <h3 class="modal-card-title">
Update <span class="alias" data-alias="Occupancy"></span> Type Update <span class="alias" data-alias="Occupancy"></span> Type

View File

@ -1,6 +1,6 @@
<div class="modal" role="dialog"> <div class="modal" role="dialog">
<div class="modal-background"></div> <div class="modal-background"></div>
<div class="modal-card" style="width:900px"> <div class="modal-card has-width-900">
<header class="modal-card-head"> <header class="modal-card-head">
<h3 class="modal-card-title"> <h3 class="modal-card-title">
Update <span class="alias" data-alias="Occupancy"></span> Type Field Update <span class="alias" data-alias="Occupancy"></span> Type Field

Some files were not shown because too many files have changed in this diff Show More