From a4f4b353fcd803f0c308808eb7feaabae45d0c7e Mon Sep 17 00:00:00 2001 From: Dan Gowans Date: Tue, 10 Jan 2023 11:07:50 -0500 Subject: [PATCH] linting with mega linter --- .cspell.json | 28 +- .eslintrc.json | 110 +- .jscpd.json | 26 +- .ncurc.json | 2 +- .prettierrc.json | 9 +- app.js | 153 +- app.ts | 305 ++- cypress.config.js | 8 +- cypress.config.ts | 16 +- cypress/fixtures/fee.json | 4 +- cypress/fixtures/map.json | 18 +- gulpfile.js | 62 +- gulpfile.ts | 126 +- handlers/lots-post/doSearchLots.d.ts | 2 +- handlers/lots-post/doSearchLots.js | 2 +- handlers/lots-post/doSearchLots.ts | 22 +- .../doCompleteWorkOrderMilestone.js | 2 +- .../doCompleteWorkOrderMilestone.ts | 2 +- ...e.d.ts => completeWorkOrderMilestone.d.ts} | 0 ...stone.js => completeWorkOrderMilestone.js} | 0 ...stone.ts => completeWorkOrderMilestone.ts} | 0 helpers/lotOccupancyDB/getLots.js | 10 +- helpers/lotOccupancyDB/getLots.ts | 11 +- helpers/lotOccupancyDB/getWorkOrders.js | 4 +- helpers/lotOccupancyDB/getWorkOrders.ts | 318 ++- package-lock.json | 164 +- package.json | 4 +- public-scss/style.scss | 144 +- public-typescript/adminCleanup.js | 22 +- public-typescript/adminCleanup.ts | 90 +- public-typescript/adminFees.js | 462 +++-- public-typescript/adminFees.ts | 1663 ++++++++------- public-typescript/adminLotTypes.js | 249 ++- public-typescript/adminLotTypes.ts | 1230 +++++------ public-typescript/adminOccupancyTypes.js | 403 ++-- public-typescript/adminOccupancyTypes.ts | 1835 +++++++++-------- public-typescript/adminTables.js | 412 ++-- public-typescript/adminTables/adminTables.js | 4 +- public-typescript/adminTables/adminTables.ts | 38 +- .../adminTablesLotOccupantTypes.js | 108 +- .../adminTablesLotOccupantTypes.ts | 469 +++-- .../adminTables/adminTablesLotStatuses.js | 94 +- .../adminTables/adminTablesLotStatuses.ts | 370 ++-- .../adminTablesWorkOrderMilestoneTypes.js | 104 +- .../adminTablesWorkOrderMilestoneTypes.ts | 402 ++-- .../adminTables/adminTablesWorkOrderTypes.js | 102 +- .../adminTables/adminTablesWorkOrderTypes.ts | 395 ++-- public-typescript/dashboard.js | 4 +- public-typescript/dashboard.ts | 24 +- public-typescript/lotEdit.js | 216 +- public-typescript/lotEdit.ts | 945 +++++---- public-typescript/lotOccupancyEdit.js | 1009 ++++----- .../lotOccupancyEdit/lotOccupancyEdit.js | 306 +-- .../lotOccupancyEdit/lotOccupancyEdit.ts | 1168 ++++++----- .../lotOccupancyEditComments.js | 136 +- .../lotOccupancyEditComments.ts | 530 ++--- .../lotOccupancyEdit/lotOccupancyEditFees.js | 274 +-- .../lotOccupancyEdit/lotOccupancyEditFees.ts | 1058 +++++----- .../lotOccupancyEditOccupants.js | 293 +-- .../lotOccupancyEditOccupants.ts | 1012 ++++----- public-typescript/lotOccupancySearch.js | 94 +- public-typescript/lotOccupancySearch.ts | 319 +-- public-typescript/lotSearch.js | 60 +- public-typescript/lotSearch.ts | 219 +- public-typescript/lotView.js | 5 +- public-typescript/lotView.ts | 23 +- public-typescript/main.js | 295 +-- public-typescript/main.ts | 779 +++---- public-typescript/mapEdit.js | 43 +- public-typescript/mapEdit.ts | 164 +- public-typescript/mapSearch.js | 81 +- public-typescript/mapSearch.ts | 215 +- public-typescript/mapView.js | 6 +- public-typescript/mapView.ts | 48 +- public-typescript/reportSearch.js | 17 +- public-typescript/reportSearch.ts | 65 +- public-typescript/workOrderEdit.js | 764 +++---- .../workOrderEdit/workOrderEdit.js | 301 +-- .../workOrderEdit/workOrderEdit.ts | 1180 ++++++----- .../workOrderEdit/workOrderEditComments.js | 125 +- .../workOrderEdit/workOrderEditComments.ts | 458 ++-- .../workOrderEdit/workOrderEditLots.js | 338 +-- .../workOrderEdit/workOrderEditLots.ts | 1248 +++++------ .../workOrderMilestoneCalendar.js | 92 +- .../workOrderMilestoneCalendar.ts | 310 +-- public-typescript/workOrderOutlook.js | 37 +- public-typescript/workOrderOutlook.ts | 149 +- public-typescript/workOrderSearch.js | 180 +- public-typescript/workOrderSearch.ts | 391 ++-- public-typescript/workOrderView.js | 23 +- public-typescript/workOrderView.ts | 93 +- public/html/adminFees-editFee.html | 2 +- public/html/adminLotTypes-addLotType.html | 2 +- .../html/adminLotTypes-addLotTypeField.html | 2 +- public/html/adminLotTypes-editLotType.html | 2 +- .../html/adminLotTypes-editLotTypeField.html | 2 +- .../adminOccupancyTypes-addOccupancyType.html | 2 +- ...nOccupancyTypes-addOccupancyTypeField.html | 2 +- ...adminOccupancyTypes-editOccupancyType.html | 2 +- ...OccupancyTypes-editOccupancyTypeField.html | 2 +- public/html/workOrder-addLot.html | 2 +- public/html/workOrder-addLotOccupancy.html | 2 +- .../workOrderMilestoneCalendar.min.js | 2 +- public/stylesheets/style.css | 2 +- tsconfig.json | 34 +- views/print/pdf/_workOrder-header.ejs | 40 + views/print/pdf/workOrder-commentLog.ejs | 41 +- views/print/pdf/workOrder.ejs | 45 +- 108 files changed, 13118 insertions(+), 12169 deletions(-) rename helpers/lotOccupancyDB/{completeWorkOrderMiletstone.d.ts => completeWorkOrderMilestone.d.ts} (100%) rename helpers/lotOccupancyDB/{completeWorkOrderMiletstone.js => completeWorkOrderMilestone.js} (100%) rename helpers/lotOccupancyDB/{completeWorkOrderMiletstone.ts => completeWorkOrderMilestone.ts} (100%) create mode 100644 views/print/pdf/_workOrder-header.ejs diff --git a/.cspell.json b/.cspell.json index b798d293..4553ba90 100644 --- a/.cspell.json +++ b/.cspell.json @@ -1,16 +1,16 @@ { - "ignorePaths": [ - "**/node_modules/**", - "**/vscode-extension/**", - "**/.git/**", - "**/.pnpm-lock.json", - ".vscode", - "megalinter", - "package-lock.json", - "report" - ], - "language": "en", - "noConfigSearch": true, - "words": ["megalinter", "oxsecurity"], - "version": "0.2" + "ignorePaths": [ + "**/node_modules/**", + "**/vscode-extension/**", + "**/.git/**", + "**/.pnpm-lock.json", + ".vscode", + "megalinter", + "package-lock.json", + "report" + ], + "language": "en", + "noConfigSearch": true, + "words": ["megalinter", "oxsecurity"], + "version": "0.2" } diff --git a/.eslintrc.json b/.eslintrc.json index 1e42c2b9..e3642ff4 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,58 +1,58 @@ { - "root": true, - "env": { - "es6": true - }, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "project": ["./tsconfig.json", "./tsconfig.client.json"], - "ecmaVersion": 2020, - "sourceType": "module" - }, - "plugins": ["@typescript-eslint", "unicorn"], - "extends": [ - "eslint:recommended", - "plugin:import/recommended", - "plugin:import/typescript", - "plugin:node/recommended", - "plugin:promise/recommended", - "plugin:unicorn/recommended", - "plugin:@typescript-eslint/recommended" + "root": true, + "env": { + "es6": true + }, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": ["./tsconfig.json", "./tsconfig.client.json"], + "ecmaVersion": 2020, + "sourceType": "module" + }, + "plugins": ["@typescript-eslint", "unicorn"], + "extends": [ + "eslint:recommended", + "plugin:import/recommended", + "plugin:import/typescript", + "plugin:node/recommended", + "plugin:promise/recommended", + "plugin:unicorn/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": { - "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"] - } - ], - "unicorn/prefer-node-protocol": "off", - "unicorn/prevent-abbreviations": [ - "error", - { - "replacements": { - "def": { - "definition": true - }, - "ele": { - "element": true - }, - "eles": { - "elements": true - }, - "fns": { - "functions": true - }, - "res": { - "result": false - } - } - } - ] - } + "unicorn/prevent-abbreviations": [ + "error", + { + "replacements": { + "def": { + "definition": true + }, + "ele": { + "element": true + }, + "eles": { + "elements": true + }, + "fns": { + "functions": true + }, + "res": { + "result": false + } + } + } + ] + } } diff --git a/.jscpd.json b/.jscpd.json index 2cee5f5d..93f9c310 100644 --- a/.jscpd.json +++ b/.jscpd.json @@ -1,15 +1,15 @@ { - "threshold": 0, - "reporters": ["html", "markdown"], - "ignore": [ - "**/node_modules/**", - "**/.git/**", - "**/.rbenv/**", - "**/.venv/**", - "**/*cache*/**", - "**/.github/**", - "**/.idea/**", - "**/report/**", - "**/*.svg" - ] + "threshold": 0, + "reporters": ["html", "markdown"], + "ignore": [ + "**/node_modules/**", + "**/.git/**", + "**/.rbenv/**", + "**/.venv/**", + "**/*cache*/**", + "**/.github/**", + "**/.idea/**", + "**/report/**", + "**/*.svg" + ] } diff --git a/.ncurc.json b/.ncurc.json index ddac39cd..5d40c0eb 100644 --- a/.ncurc.json +++ b/.ncurc.json @@ -1,3 +1,3 @@ { - "reject": ["@fortawesome/fontawesome-free"] + "reject": ["@fortawesome/fontawesome-free"] } diff --git a/.prettierrc.json b/.prettierrc.json index 3339ce73..c50384fb 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -1,7 +1,6 @@ { - "trailingComma": "none", - "tabWidth": 4, - "semi": true, - "singleQuote": false, - "printWidth": 110 + "trailingComma": "none", + "tabWidth": 2, + "semi": false, + "singleQuote": true } diff --git a/app.js b/app.js index 1ef276fc..6f829c64 100644 --- a/app.js +++ b/app.js @@ -1,44 +1,44 @@ -import createError from "http-errors"; -import express from "express"; -import compression from "compression"; -import path from "node:path"; -import cookieParser from "cookie-parser"; -import csurf from "csurf"; -import rateLimit from "express-rate-limit"; -import session from "express-session"; -import FileStore from "session-file-store"; -import * as permissionHandlers from "./handlers/permissions.js"; -import routerLogin from "./routes/login.js"; -import routerDashboard from "./routes/dashboard.js"; -import routerApi from "./routes/api.js"; -import routerPrint from "./routes/print.js"; -import routerMaps from "./routes/maps.js"; -import routerLots from "./routes/lots.js"; -import routerLotOccupancies from "./routes/lotOccupancies.js"; -import routerWorkOrders from "./routes/workOrders.js"; -import routerReports from "./routes/reports.js"; -import routerAdmin from "./routes/admin.js"; -import * as configFunctions from "./helpers/functions.config.js"; -import * as printFunctions from "./helpers/functions.print.js"; -import * as dateTimeFns from "@cityssm/expressjs-server-js/dateTimeFns.js"; -import * as stringFns from "@cityssm/expressjs-server-js/stringFns.js"; -import * as htmlFns from "@cityssm/expressjs-server-js/htmlFns.js"; -import { version } from "./version.js"; -import * as databaseInitializer from "./helpers/initializer.database.js"; -import { apiGetHandler } from "./handlers/permissions.js"; -import { getSafeRedirectURL } from "./helpers/functions.authentication.js"; -import debug from "debug"; -const debugApp = debug("lot-occupancy-system:app"); +import createError from 'http-errors'; +import express from 'express'; +import compression from 'compression'; +import path from 'node:path'; +import cookieParser from 'cookie-parser'; +import csurf from 'csurf'; +import rateLimit from 'express-rate-limit'; +import session from 'express-session'; +import FileStore from 'session-file-store'; +import * as permissionHandlers from './handlers/permissions.js'; +import routerLogin from './routes/login.js'; +import routerDashboard from './routes/dashboard.js'; +import routerApi from './routes/api.js'; +import routerPrint from './routes/print.js'; +import routerMaps from './routes/maps.js'; +import routerLots from './routes/lots.js'; +import routerLotOccupancies from './routes/lotOccupancies.js'; +import routerWorkOrders from './routes/workOrders.js'; +import routerReports from './routes/reports.js'; +import routerAdmin from './routes/admin.js'; +import * as configFunctions from './helpers/functions.config.js'; +import * as printFunctions from './helpers/functions.print.js'; +import * as dateTimeFns from '@cityssm/expressjs-server-js/dateTimeFns.js'; +import * as stringFns from '@cityssm/expressjs-server-js/stringFns.js'; +import * as htmlFns from '@cityssm/expressjs-server-js/htmlFns.js'; +import { version } from './version.js'; +import * as databaseInitializer from './helpers/initializer.database.js'; +import { apiGetHandler } from './handlers/permissions.js'; +import { getSafeRedirectURL } from './helpers/functions.authentication.js'; +import debug from 'debug'; +const debugApp = debug('lot-occupancy-system:app'); databaseInitializer.initializeDatabase(); -const __dirname = "."; +const __dirname = '.'; export const app = express(); -app.disable("X-Powered-By"); -if (!configFunctions.getProperty("reverseProxy.disableEtag")) { - app.set("etag", false); +app.disable('X-Powered-By'); +if (!configFunctions.getProperty('reverseProxy.disableEtag')) { + app.set('etag', false); } -app.set("views", path.join(__dirname, "views")); -app.set("view engine", "ejs"); -if (!configFunctions.getProperty("reverseProxy.disableCompression")) { +app.set('views', path.join(__dirname, 'views')); +app.set('view engine', 'ejs'); +if (!configFunctions.getProperty('reverseProxy.disableCompression')) { app.use(compression()); } app.use((request, _response, next) => { @@ -53,38 +53,37 @@ app.use(cookieParser()); app.use(csurf({ cookie: true })); -const limiter = rateLimit({ - windowMs: 1000, - max: 25 * Math.max(3, configFunctions.getProperty("users.canLogin").length) -}); -app.use(limiter); -const urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix"); -if (urlPrefix !== "") { - debugApp("urlPrefix = " + urlPrefix); +app.use(rateLimit({ + windowMs: 10000, + max: 200 +})); +const urlPrefix = configFunctions.getProperty('reverseProxy.urlPrefix'); +if (urlPrefix !== '') { + debugApp('urlPrefix = ' + urlPrefix); } -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/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/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/randomcolor", express.static(path.join("node_modules", "randomcolor"))); -const sessionCookieName = configFunctions.getProperty("session.cookieName"); +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/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/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/randomcolor', express.static(path.join('node_modules', 'randomcolor'))); +const sessionCookieName = configFunctions.getProperty('session.cookieName'); const FileStoreSession = FileStore(session); app.use(session({ store: new FileStoreSession({ - path: "./data/sessions", - logFn: debug("lot-occupancy-system:session"), + path: './data/sessions', + logFn: debug('lot-occupancy-system:session'), retries: 20 }), name: sessionCookieName, - secret: configFunctions.getProperty("session.secret"), + secret: configFunctions.getProperty('session.secret'), resave: true, saveUninitialized: false, rolling: true, cookie: { - maxAge: configFunctions.getProperty("session.maxAgeMillis"), - sameSite: "strict" + maxAge: configFunctions.getProperty('session.maxAgeMillis'), + sameSite: 'strict' } })); app.use((request, response, next) => { @@ -109,38 +108,38 @@ app.use((request, response, next) => { response.locals.dateTimeFunctions = dateTimeFns; response.locals.stringFunctions = stringFns; response.locals.htmlFunctions = htmlFns; - response.locals.urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix"); + response.locals.urlPrefix = configFunctions.getProperty('reverseProxy.urlPrefix'); next(); }); -app.get(urlPrefix + "/", sessionChecker, (_request, response) => { - response.redirect(urlPrefix + "/dashboard"); +app.get(urlPrefix + '/', sessionChecker, (_request, response) => { + response.redirect(urlPrefix + '/dashboard'); }); -app.use(urlPrefix + "/dashboard", sessionChecker, routerDashboard); -app.use(urlPrefix + "/api/:apiKey", apiGetHandler, routerApi); -app.use(urlPrefix + "/print", sessionChecker, routerPrint); -app.use(urlPrefix + "/maps", sessionChecker, routerMaps); -app.use(urlPrefix + "/lots", sessionChecker, routerLots); -app.use(urlPrefix + "/lotOccupancies", sessionChecker, routerLotOccupancies); -app.use(urlPrefix + "/workOrders", sessionChecker, routerWorkOrders); -app.use(urlPrefix + "/reports", sessionChecker, routerReports); -app.use(urlPrefix + "/admin", sessionChecker, permissionHandlers.adminGetHandler, routerAdmin); -app.all(urlPrefix + "/keepAlive", (_request, response) => { +app.use(urlPrefix + '/dashboard', sessionChecker, routerDashboard); +app.use(urlPrefix + '/api/:apiKey', apiGetHandler, routerApi); +app.use(urlPrefix + '/print', sessionChecker, routerPrint); +app.use(urlPrefix + '/maps', sessionChecker, routerMaps); +app.use(urlPrefix + '/lots', sessionChecker, routerLots); +app.use(urlPrefix + '/lotOccupancies', sessionChecker, routerLotOccupancies); +app.use(urlPrefix + '/workOrders', sessionChecker, routerWorkOrders); +app.use(urlPrefix + '/reports', sessionChecker, routerReports); +app.use(urlPrefix + '/admin', sessionChecker, permissionHandlers.adminGetHandler, routerAdmin); +app.all(urlPrefix + '/keepAlive', (_request, response) => { response.json(true); }); -app.use(urlPrefix + "/login", routerLogin); -app.get(urlPrefix + "/logout", (request, response) => { +app.use(urlPrefix + '/login', routerLogin); +app.get(urlPrefix + '/logout', (request, response) => { if (request.session.user && request.cookies[sessionCookieName]) { request.session.destroy(() => { response.clearCookie(sessionCookieName); - response.redirect(urlPrefix + "/"); + response.redirect(urlPrefix + '/'); }); } else { - response.redirect(urlPrefix + "/login"); + response.redirect(urlPrefix + '/login'); } }); app.use((request, _response, next) => { debugApp(request.url); - next(createError(404, "File not found.")); + next(createError(404, 'File not found.')); }); export default app; diff --git a/app.ts b/app.ts index 22ad0b00..a90bdc6c 100644 --- a/app.ts +++ b/app.ts @@ -1,189 +1,182 @@ -import createError from "http-errors"; -import express from "express"; +import createError from 'http-errors' +import express from 'express' -import compression from "compression"; -import path from "node:path"; -import cookieParser from "cookie-parser"; -import csurf from "csurf"; -import rateLimit from "express-rate-limit"; +import compression from 'compression' +import path from 'node:path' +import cookieParser from 'cookie-parser' +import csurf from 'csurf' +import rateLimit from 'express-rate-limit' -import session from "express-session"; -import FileStore from "session-file-store"; +import session from 'express-session' +import FileStore from 'session-file-store' -import * as permissionHandlers from "./handlers/permissions.js"; -import routerLogin from "./routes/login.js"; -import routerDashboard from "./routes/dashboard.js"; -import routerApi from "./routes/api.js"; -import routerPrint from "./routes/print.js"; -import routerMaps from "./routes/maps.js"; -import routerLots from "./routes/lots.js"; -import routerLotOccupancies from "./routes/lotOccupancies.js"; -import routerWorkOrders from "./routes/workOrders.js"; -import routerReports from "./routes/reports.js"; -import routerAdmin from "./routes/admin.js"; +import * as permissionHandlers from './handlers/permissions.js' +import routerLogin from './routes/login.js' +import routerDashboard from './routes/dashboard.js' +import routerApi from './routes/api.js' +import routerPrint from './routes/print.js' +import routerMaps from './routes/maps.js' +import routerLots from './routes/lots.js' +import routerLotOccupancies from './routes/lotOccupancies.js' +import routerWorkOrders from './routes/workOrders.js' +import routerReports from './routes/reports.js' +import routerAdmin from './routes/admin.js' -import * as configFunctions from "./helpers/functions.config.js"; -import * as printFunctions from "./helpers/functions.print.js"; -import * as dateTimeFns from "@cityssm/expressjs-server-js/dateTimeFns.js"; -import * as stringFns from "@cityssm/expressjs-server-js/stringFns.js"; -import * as htmlFns from "@cityssm/expressjs-server-js/htmlFns.js"; +import * as configFunctions from './helpers/functions.config.js' +import * as printFunctions from './helpers/functions.print.js' +import * as dateTimeFns from '@cityssm/expressjs-server-js/dateTimeFns.js' +import * as stringFns from '@cityssm/expressjs-server-js/stringFns.js' +import * as htmlFns from '@cityssm/expressjs-server-js/htmlFns.js' -import { version } from "./version.js"; +import { version } from './version.js' -import * as databaseInitializer from "./helpers/initializer.database.js"; +import * as databaseInitializer from './helpers/initializer.database.js' -import { apiGetHandler } from "./handlers/permissions.js"; -import { getSafeRedirectURL } from "./helpers/functions.authentication.js"; +import { apiGetHandler } from './handlers/permissions.js' +import { getSafeRedirectURL } from './helpers/functions.authentication.js' -import debug from "debug"; -const debugApp = debug("lot-occupancy-system:app"); +import debug from 'debug' +const debugApp = debug('lot-occupancy-system:app') /* - * INITALIZE THE DATABASE + * INITIALIZE THE DATABASE */ -databaseInitializer.initializeDatabase(); +databaseInitializer.initializeDatabase() /* * 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")) { - app.set("etag", false); +if (!configFunctions.getProperty('reverseProxy.disableEtag')) { + app.set('etag', false) } // View engine setup -app.set("views", path.join(__dirname, "views")); -app.set("view engine", "ejs"); +app.set('views', path.join(__dirname, 'views')) +app.set('view engine', 'ejs') -if (!configFunctions.getProperty("reverseProxy.disableCompression")) { - app.use(compression()); +if (!configFunctions.getProperty('reverseProxy.disableCompression')) { + app.use(compression()) } app.use((request, _response, next) => { - debugApp(`${request.method} ${request.url}`); - next(); -}); + debugApp(`${request.method} ${request.url}`) + next() +}) -app.use(express.json()); +app.use(express.json()) app.use( - express.urlencoded({ - extended: false - }) -); + express.urlencoded({ + extended: false + }) +) -app.use(cookieParser()); +app.use(cookieParser()) app.use( - csurf({ - cookie: true - }) -); + csurf({ + cookie: true + }) +) /* * Rate Limiter */ -const limiter = rateLimit({ - windowMs: 1000, - max: 25 * Math.max(3, configFunctions.getProperty("users.canLogin").length) -}); - -app.use(limiter); +app.use( + rateLimit({ + windowMs: 10_000, + max: 200 + }) +) /* * STATIC ROUTES */ -const urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix"); +const urlPrefix = configFunctions.getProperty('reverseProxy.urlPrefix') -if (urlPrefix !== "") { - debugApp("urlPrefix = " + urlPrefix); +if (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")) -); + 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")) -); + 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")) -); + 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'))) /* * 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 app.use( - session({ - store: new FileStoreSession({ - path: "./data/sessions", - logFn: debug("lot-occupancy-system:session"), - retries: 20 - }), - name: sessionCookieName, - secret: configFunctions.getProperty("session.secret"), - resave: true, - saveUninitialized: false, - rolling: true, - cookie: { - maxAge: configFunctions.getProperty("session.maxAgeMillis"), - sameSite: "strict" - } - }) -); + session({ + store: new FileStoreSession({ + path: './data/sessions', + logFn: debug('lot-occupancy-system:session'), + retries: 20 + }), + name: sessionCookieName, + secret: configFunctions.getProperty('session.secret'), + resave: true, + saveUninitialized: false, + rolling: true, + cookie: { + maxAge: configFunctions.getProperty('session.maxAgeMillis'), + sameSite: 'strict' + } + }) +) // Clear cookie if no corresponding session app.use((request, response, next) => { - if (request.cookies[sessionCookieName] && !request.session.user) { - response.clearCookie(sessionCookieName); - } + if (request.cookies[sessionCookieName] && !request.session.user) { + response.clearCookie(sessionCookieName) + } - next(); -}); + next() +}) // Redirect logged in users -const sessionChecker = ( - request: express.Request, - response: express.Response, - next: express.NextFunction -) => { - if (request.session.user && request.cookies[sessionCookieName]) { - return next(); - } +const sessionChecker = (request: express.Request, response: express.Response, 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 @@ -192,60 +185,60 @@ const sessionChecker = ( // Make the user and config objects available to the templates app.use((request, response, next) => { - response.locals.buildNumber = version; + response.locals.buildNumber = version - response.locals.user = request.session.user; - response.locals.csrfToken = request.csrfToken(); + response.locals.user = request.session.user + response.locals.csrfToken = request.csrfToken() - response.locals.configFunctions = configFunctions; - response.locals.printFunctions = printFunctions; - response.locals.dateTimeFunctions = dateTimeFns; - response.locals.stringFunctions = stringFns; - response.locals.htmlFunctions = htmlFns; + response.locals.configFunctions = configFunctions + response.locals.printFunctions = printFunctions + response.locals.dateTimeFunctions = dateTimeFns + response.locals.stringFunctions = stringFns + 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) => { - response.redirect(urlPrefix + "/dashboard"); -}); +app.get(urlPrefix + '/', sessionChecker, (_request, response) => { + 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 + "/maps", sessionChecker, routerMaps); -app.use(urlPrefix + "/lots", sessionChecker, routerLots); -app.use(urlPrefix + "/lotOccupancies", sessionChecker, routerLotOccupancies); -app.use(urlPrefix + "/workOrders", sessionChecker, routerWorkOrders); +app.use(urlPrefix + '/print', sessionChecker, routerPrint) +app.use(urlPrefix + '/maps', sessionChecker, routerMaps) +app.use(urlPrefix + '/lots', sessionChecker, routerLots) +app.use(urlPrefix + '/lotOccupancies', sessionChecker, routerLotOccupancies) +app.use(urlPrefix + '/workOrders', sessionChecker, routerWorkOrders) -app.use(urlPrefix + "/reports", sessionChecker, routerReports); -app.use(urlPrefix + "/admin", sessionChecker, permissionHandlers.adminGetHandler, routerAdmin); +app.use(urlPrefix + '/reports', sessionChecker, routerReports) +app.use(urlPrefix + '/admin', sessionChecker, permissionHandlers.adminGetHandler, routerAdmin) -app.all(urlPrefix + "/keepAlive", (_request, response) => { - response.json(true); -}); +app.all(urlPrefix + '/keepAlive', (_request, response) => { + response.json(true) +}) -app.use(urlPrefix + "/login", routerLogin); +app.use(urlPrefix + '/login', routerLogin) -app.get(urlPrefix + "/logout", (request, response) => { - if (request.session.user && request.cookies[sessionCookieName]) { - request.session.destroy(() => { - response.clearCookie(sessionCookieName); - response.redirect(urlPrefix + "/"); - }); - } else { - response.redirect(urlPrefix + "/login"); - } -}); +app.get(urlPrefix + '/logout', (request, response) => { + if (request.session.user && request.cookies[sessionCookieName]) { + request.session.destroy(() => { + response.clearCookie(sessionCookieName) + response.redirect(urlPrefix + '/') + }) + } else { + response.redirect(urlPrefix + '/login') + } +}) // Catch 404 and forward to error handler app.use((request, _response, next) => { - debugApp(request.url); - next(createError(404, "File not found.")); -}); + debugApp(request.url) + next(createError(404, 'File not found.')) +}) -export default app; +export default app diff --git a/cypress.config.js b/cypress.config.js index bc81052e..5d860a51 100644 --- a/cypress.config.js +++ b/cypress.config.js @@ -1,9 +1,9 @@ -import { defineConfig } from "cypress"; +import { defineConfig } from 'cypress'; export default defineConfig({ e2e: { - baseUrl: "http://localhost:7000", - specPattern: "cypress/e2e/**/*.cy.ts", + baseUrl: 'http://localhost:7000', + specPattern: 'cypress/e2e/**/*.cy.ts', supportFile: false, - projectId: "xya1fn" + projectId: 'xya1fn' } }); diff --git a/cypress.config.ts b/cypress.config.ts index ae084c4d..0de4dcee 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -1,10 +1,10 @@ -import { defineConfig } from "cypress"; +import { defineConfig } from 'cypress' export default defineConfig({ - e2e: { - baseUrl: "http://localhost:7000", - specPattern: "cypress/e2e/**/*.cy.ts", - supportFile: false, - projectId: "xya1fn" - } -}); + e2e: { + baseUrl: 'http://localhost:7000', + specPattern: 'cypress/e2e/**/*.cy.ts', + supportFile: false, + projectId: 'xya1fn' + } +}) diff --git a/cypress/fixtures/fee.json b/cypress/fixtures/fee.json index 3c4da779..7d60b85c 100644 --- a/cypress/fixtures/fee.json +++ b/cypress/fixtures/fee.json @@ -2,6 +2,6 @@ "feeCategory": "Cypress Test - Fee Category", "feeName": "Cypress Test - Fee Name", "feeDescription": "Test Description", - "feeAmount": 10.50, + "feeAmount": 10.5, "quantityUnit": "units" -} \ No newline at end of file +} diff --git a/cypress/fixtures/map.json b/cypress/fixtures/map.json index d72e1b50..e14b5e8a 100644 --- a/cypress/fixtures/map.json +++ b/cypress/fixtures/map.json @@ -1,10 +1,10 @@ { - "mapName": "Cypress Test - Holy Sepulchre", - "mapDescription": "Operated by the City of Sault Ste. Marie" , - "mapAddress1": "Fourth Line and Peoples Road", - "mapAddress2": "27 Fourth Line East", - "mapPostalCode": "P6A 5K8", - "mapPhoneNumber": "705-759-5336", - "mapLatitude": 46.56874795, - "mapLongitude": -84.34842824 -} \ No newline at end of file + "mapName": "Cypress Test - Holy Sepulchre", + "mapDescription": "Operated by the City of Sault Ste. Marie", + "mapAddress1": "Fourth Line and Peoples Road", + "mapAddress2": "27 Fourth Line East", + "mapPostalCode": "P6A 5K8", + "mapPhoneNumber": "705-759-5336", + "mapLatitude": 46.56874795, + "mapLongitude": -84.34842824 +} diff --git a/gulpfile.js b/gulpfile.js index fa708571..80e065fb 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,59 +1,59 @@ -import gulp from "gulp"; -import changed from "gulp-changed"; -import minify from "gulp-minify"; -import include from "gulp-include"; -import dartSass from "sass"; -import gulpSass from "gulp-sass"; +import gulp from 'gulp'; +import changed from 'gulp-changed'; +import minify from 'gulp-minify'; +import include from 'gulp-include'; +import dartSass from 'sass'; +import gulpSass from 'gulp-sass'; const sass = gulpSass(dartSass); -const publicSCSSDestination = "public/stylesheets"; +const publicSCSSDestination = 'public/stylesheets'; const publicSCSSFunction = () => { return gulp - .src("public-scss/*.scss") - .pipe(sass({ outputStyle: "compressed", includePaths: ["node_modules"] }).on("error", sass.logError)) + .src('public-scss/*.scss') + .pipe(sass({ outputStyle: 'compressed', includePaths: ['node_modules'] }).on('error', sass.logError)) .pipe(gulp.dest(publicSCSSDestination)); }; -gulp.task("public-scss", publicSCSSFunction); -const publicJavascriptsDestination = "public/javascripts"; +gulp.task('public-scss', publicSCSSFunction); +const publicJavascriptsDestination = 'public/javascripts'; const publicJavascriptsMinFunction = () => { return gulp - .src("public-typescript/*.js", { allowEmpty: true }) + .src('public-typescript/*.js', { allowEmpty: true }) .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)); }; const publicJavascriptsAdminTablesFunction = () => { return gulp - .src("public-typescript/adminTables/adminTables.js") + .src('public-typescript/adminTables/adminTables.js') .pipe(include()) - .pipe(gulp.dest("public-typescript")); + .pipe(gulp.dest('public-typescript')); }; const publicJavascriptsLotOccupancyEditFunction = () => { return gulp - .src("public-typescript/lotOccupancyEdit/lotOccupancyEdit.js") + .src('public-typescript/lotOccupancyEdit/lotOccupancyEdit.js') .pipe(include()) - .pipe(gulp.dest("public-typescript")); + .pipe(gulp.dest('public-typescript')); }; const publicJavascriptsWorkOrderEditFunction = () => { return gulp - .src("public-typescript/workOrderEdit/workOrderEdit.js") + .src('public-typescript/workOrderEdit/workOrderEdit.js') .pipe(include()) - .pipe(gulp.dest("public-typescript")); + .pipe(gulp.dest('public-typescript')); }; -gulp.task("public-javascript-adminTables", publicJavascriptsAdminTablesFunction); -gulp.task("public-javascript-lotOccupancyEdit", publicJavascriptsLotOccupancyEditFunction); -gulp.task("public-javascript-workOrderEdit", publicJavascriptsWorkOrderEditFunction); -gulp.task("public-javascript-min", publicJavascriptsMinFunction); +gulp.task('public-javascript-adminTables', publicJavascriptsAdminTablesFunction); +gulp.task('public-javascript-lotOccupancyEdit', publicJavascriptsLotOccupancyEditFunction); +gulp.task('public-javascript-workOrderEdit', publicJavascriptsWorkOrderEditFunction); +gulp.task('public-javascript-min', publicJavascriptsMinFunction); const watchFunction = () => { - gulp.watch("public-scss/*.scss", publicSCSSFunction); - gulp.watch("public-typescript/adminTables/*.js", publicJavascriptsAdminTablesFunction); - gulp.watch("public-typescript/lotOccupancyEdit/*.js", publicJavascriptsLotOccupancyEditFunction); - gulp.watch("public-typescript/workOrderEdit/*.js", publicJavascriptsWorkOrderEditFunction); - gulp.watch("public-typescript/*.js", publicJavascriptsMinFunction); + gulp.watch('public-scss/*.scss', publicSCSSFunction); + gulp.watch('public-typescript/adminTables/*.js', publicJavascriptsAdminTablesFunction); + gulp.watch('public-typescript/lotOccupancyEdit/*.js', publicJavascriptsLotOccupancyEditFunction); + gulp.watch('public-typescript/workOrderEdit/*.js', publicJavascriptsWorkOrderEditFunction); + gulp.watch('public-typescript/*.js', publicJavascriptsMinFunction); }; -gulp.task("watch", watchFunction); -gulp.task("default", () => { +gulp.task('watch', watchFunction); +gulp.task('default', () => { publicJavascriptsAdminTablesFunction(); publicJavascriptsLotOccupancyEditFunction(); publicJavascriptsWorkOrderEditFunction(); diff --git a/gulpfile.ts b/gulpfile.ts index a4ef706b..e9fe5cfc 100644 --- a/gulpfile.ts +++ b/gulpfile.ts @@ -1,110 +1,102 @@ /* eslint-disable node/no-unpublished-import */ -import gulp from "gulp"; -import changed from "gulp-changed"; -import minify from "gulp-minify"; -import include from "gulp-include"; +import gulp from 'gulp' +import changed from 'gulp-changed' +import minify from 'gulp-minify' +import include from 'gulp-include' -import dartSass from "sass"; -import gulpSass from "gulp-sass"; -const sass = gulpSass(dartSass); +import dartSass from 'sass' +import gulpSass from 'gulp-sass' +const sass = gulpSass(dartSass) /* * Compile SASS */ -const publicSCSSDestination = "public/stylesheets"; +const publicSCSSDestination = 'public/stylesheets' const publicSCSSFunction = () => { - return gulp - .src("public-scss/*.scss") - .pipe( - sass({ outputStyle: "compressed", includePaths: ["node_modules"] }).on( - "error", - sass.logError - ) - ) - .pipe(gulp.dest(publicSCSSDestination)); -}; + return gulp + .src('public-scss/*.scss') + .pipe(sass({ outputStyle: 'compressed', includePaths: ['node_modules'] }).on('error', sass.logError)) + .pipe(gulp.dest(publicSCSSDestination)) +} -gulp.task("public-scss", publicSCSSFunction); +gulp.task('public-scss', publicSCSSFunction) /* * Minify public/javascripts */ -const publicJavascriptsDestination = "public/javascripts"; +const publicJavascriptsDestination = 'public/javascripts' const publicJavascriptsMinFunction = () => { - return gulp - .src("public-typescript/*.js", { allowEmpty: true }) - .pipe( - changed(publicJavascriptsDestination, { - extension: ".min.js" - }) - ) - .pipe(minify({ noSource: true, ext: { min: ".min.js" } })) - .pipe(gulp.dest(publicJavascriptsDestination)); -}; + return gulp + .src('public-typescript/*.js', { allowEmpty: true }) + .pipe( + changed(publicJavascriptsDestination, { + extension: '.min.js' + }) + ) + .pipe(minify({ noSource: true, ext: { min: '.min.js' } })) + .pipe(gulp.dest(publicJavascriptsDestination)) +} const publicJavascriptsAdminTablesFunction = () => { - return gulp - .src("public-typescript/adminTables/adminTables.js") - .pipe(include()) - .pipe(gulp.dest("public-typescript")); -}; + return gulp + .src('public-typescript/adminTables/adminTables.js') + .pipe(include()) + .pipe(gulp.dest('public-typescript')) +} const publicJavascriptsLotOccupancyEditFunction = () => { - return gulp - .src("public-typescript/lotOccupancyEdit/lotOccupancyEdit.js") - .pipe(include()) - .pipe(gulp.dest("public-typescript")); -}; + return gulp + .src('public-typescript/lotOccupancyEdit/lotOccupancyEdit.js') + .pipe(include()) + .pipe(gulp.dest('public-typescript')) +} const publicJavascriptsWorkOrderEditFunction = () => { - return gulp - .src("public-typescript/workOrderEdit/workOrderEdit.js") - .pipe(include()) - .pipe(gulp.dest("public-typescript")); -}; + return gulp + .src('public-typescript/workOrderEdit/workOrderEdit.js') + .pipe(include()) + .pipe(gulp.dest('public-typescript')) +} -gulp.task("public-javascript-adminTables", publicJavascriptsAdminTablesFunction); -gulp.task("public-javascript-lotOccupancyEdit", publicJavascriptsLotOccupancyEditFunction); -gulp.task("public-javascript-workOrderEdit", publicJavascriptsWorkOrderEditFunction); -gulp.task("public-javascript-min", publicJavascriptsMinFunction); +gulp.task('public-javascript-adminTables', publicJavascriptsAdminTablesFunction) +gulp.task('public-javascript-lotOccupancyEdit', publicJavascriptsLotOccupancyEditFunction) +gulp.task('public-javascript-workOrderEdit', publicJavascriptsWorkOrderEditFunction) +gulp.task('public-javascript-min', publicJavascriptsMinFunction) /* * Watch */ 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) /* * Initialize default */ -gulp.task("default", () => { - publicJavascriptsAdminTablesFunction(); - publicJavascriptsLotOccupancyEditFunction(); - publicJavascriptsWorkOrderEditFunction(); - publicJavascriptsMinFunction(); +gulp.task('default', () => { + publicJavascriptsAdminTablesFunction() + publicJavascriptsLotOccupancyEditFunction() + publicJavascriptsWorkOrderEditFunction() + publicJavascriptsMinFunction() - publicSCSSFunction(); + publicSCSSFunction() - watchFunction(); -}); + watchFunction() +}) diff --git a/handlers/lots-post/doSearchLots.d.ts b/handlers/lots-post/doSearchLots.d.ts index 9621c611..7151ed90 100644 --- a/handlers/lots-post/doSearchLots.d.ts +++ b/handlers/lots-post/doSearchLots.d.ts @@ -1,3 +1,3 @@ -import type { RequestHandler } from "express"; +import type { RequestHandler } from 'express'; export declare const handler: RequestHandler; export default handler; diff --git a/handlers/lots-post/doSearchLots.js b/handlers/lots-post/doSearchLots.js index 1520a12a..bc629e84 100644 --- a/handlers/lots-post/doSearchLots.js +++ b/handlers/lots-post/doSearchLots.js @@ -1,4 +1,4 @@ -import { getLots } from "../../helpers/lotOccupancyDB/getLots.js"; +import { getLots } from '../../helpers/lotOccupancyDB/getLots.js'; export const handler = async (request, response) => { const result = getLots(request.body, { limit: request.body.limit, diff --git a/handlers/lots-post/doSearchLots.ts b/handlers/lots-post/doSearchLots.ts index f491653d..a56328c9 100644 --- a/handlers/lots-post/doSearchLots.ts +++ b/handlers/lots-post/doSearchLots.ts @@ -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) => { - const result = getLots(request.body, { - limit: request.body.limit, - offset: request.body.offset - }); + const result = getLots(request.body, { + limit: request.body.limit, + offset: request.body.offset + }); - response.json({ - count: result.count, - offset: Number.parseInt(request.body.offset, 10), - lots: result.lots - }); + response.json({ + count: result.count, + offset: Number.parseInt(request.body.offset, 10), + lots: result.lots + }); }; export default handler; diff --git a/handlers/workOrders-post/doCompleteWorkOrderMilestone.js b/handlers/workOrders-post/doCompleteWorkOrderMilestone.js index bacc1961..fc91eb08 100644 --- a/handlers/workOrders-post/doCompleteWorkOrderMilestone.js +++ b/handlers/workOrders-post/doCompleteWorkOrderMilestone.js @@ -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"; export const handler = async (request, response) => { const success = completeWorkOrderMilestone({ diff --git a/handlers/workOrders-post/doCompleteWorkOrderMilestone.ts b/handlers/workOrders-post/doCompleteWorkOrderMilestone.ts index 5318521e..a02d1050 100644 --- a/handlers/workOrders-post/doCompleteWorkOrderMilestone.ts +++ b/handlers/workOrders-post/doCompleteWorkOrderMilestone.ts @@ -1,6 +1,6 @@ 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"; diff --git a/helpers/lotOccupancyDB/completeWorkOrderMiletstone.d.ts b/helpers/lotOccupancyDB/completeWorkOrderMilestone.d.ts similarity index 100% rename from helpers/lotOccupancyDB/completeWorkOrderMiletstone.d.ts rename to helpers/lotOccupancyDB/completeWorkOrderMilestone.d.ts diff --git a/helpers/lotOccupancyDB/completeWorkOrderMiletstone.js b/helpers/lotOccupancyDB/completeWorkOrderMilestone.js similarity index 100% rename from helpers/lotOccupancyDB/completeWorkOrderMiletstone.js rename to helpers/lotOccupancyDB/completeWorkOrderMilestone.js diff --git a/helpers/lotOccupancyDB/completeWorkOrderMiletstone.ts b/helpers/lotOccupancyDB/completeWorkOrderMilestone.ts similarity index 100% rename from helpers/lotOccupancyDB/completeWorkOrderMiletstone.ts rename to helpers/lotOccupancyDB/completeWorkOrderMilestone.ts diff --git a/helpers/lotOccupancyDB/getLots.js b/helpers/lotOccupancyDB/getLots.js index 6036b513..5047c485 100644 --- a/helpers/lotOccupancyDB/getLots.js +++ b/helpers/lotOccupancyDB/getLots.js @@ -68,6 +68,7 @@ export function getLots(filters, options, connectedDatabase) { let lots = []; if (options.limit === -1 || count > 0) { database.function("userFn_lotNameSortName", configFunctions.getProperty("settings.lot.lotNameSortNameFunction")); + sqlParameters.unshift(currentDate, currentDate); lots = database .prepare("select l.lotId, l.lotName," + " t.lotType," + @@ -82,16 +83,13 @@ export function getLots(filters, options, connectedDatabase) { "select lotId, count(lotOccupancyId) as lotOccupancyCount" + " from LotOccupancies" + " where recordDelete_timeMillis is null" + - " and occupancyStartDate <= " + - currentDate + - " and (occupancyEndDate is null or occupancyEndDate >= " + - currentDate + - ")" + + " and occupancyStartDate <= ?" + + " and (occupancyEndDate is null or occupancyEndDate >= ?)" + " group by lotId" + ") o on l.lotId = o.lotId") + sqlWhereClause + " order by userFn_lotNameSortName(l.lotName), l.lotId" + - (options ? " limit " + options.limit + " offset " + options.offset : "")) + (options ? ` limit ${options.limit} offset ${options.offset}` : "")) .all(sqlParameters); if (options.limit === -1) { count = lots.length; diff --git a/helpers/lotOccupancyDB/getLots.ts b/helpers/lotOccupancyDB/getLots.ts index ccea050b..63d06f14 100644 --- a/helpers/lotOccupancyDB/getLots.ts +++ b/helpers/lotOccupancyDB/getLots.ts @@ -119,6 +119,8 @@ export function getLots( configFunctions.getProperty("settings.lot.lotNameSortNameFunction") ); + sqlParameters.unshift(currentDate, currentDate); + lots = database .prepare( "select l.lotId, l.lotName," + @@ -134,16 +136,13 @@ export function getLots( "select lotId, count(lotOccupancyId) as lotOccupancyCount" + " from LotOccupancies" + " where recordDelete_timeMillis is null" + - " and occupancyStartDate <= " + - currentDate + - " and (occupancyEndDate is null or occupancyEndDate >= " + - currentDate + - ")" + + " and occupancyStartDate <= ?" + + " and (occupancyEndDate is null or occupancyEndDate >= ?)" + " group by lotId" + ") o on l.lotId = o.lotId") + sqlWhereClause + " order by userFn_lotNameSortName(l.lotName), l.lotId" + - (options ? " limit " + options.limit + " offset " + options.offset : "") + (options ? ` limit ${options.limit} offset ${options.offset}` : "") ) .all(sqlParameters); diff --git a/helpers/lotOccupancyDB/getWorkOrders.js b/helpers/lotOccupancyDB/getWorkOrders.js index f075691f..2dfe4780 100644 --- a/helpers/lotOccupancyDB/getWorkOrders.js +++ b/helpers/lotOccupancyDB/getWorkOrders.js @@ -90,9 +90,7 @@ export function getWorkOrders(filters, options, connectedDatabase) { .all(sqlParameters); } if (options && - (options.includeComments || - options.includeLotsAndLotOccupancies || - options.includeMilestones)) { + (options.includeComments || options.includeLotsAndLotOccupancies || options.includeMilestones)) { for (const workOrder of workOrders) { if (options.includeComments) { workOrder.workOrderComments = getWorkOrderComments(workOrder.workOrderId, database); diff --git a/helpers/lotOccupancyDB/getWorkOrders.ts b/helpers/lotOccupancyDB/getWorkOrders.ts index 0ee0f23c..43464179 100644 --- a/helpers/lotOccupancyDB/getWorkOrders.ts +++ b/helpers/lotOccupancyDB/getWorkOrders.ts @@ -2,10 +2,7 @@ import sqlite from "better-sqlite3"; import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; -import { - dateIntegerToString, - dateStringToInteger -} from "@cityssm/expressjs-server-js/dateTimeFns.js"; +import { dateIntegerToString, dateStringToInteger } from "@cityssm/expressjs-server-js/dateTimeFns.js"; import { getWorkOrderComments } from "./getWorkOrderComments.js"; import { getLots } from "./getLots.js"; @@ -16,192 +13,187 @@ import type * as recordTypes from "../../types/recordTypes"; import { getLotNameWhereClause, getOccupantNameWhereClause } from "../functions.sqlFilters.js"; interface GetWorkOrdersFilters { - workOrderTypeId?: number | string; - workOrderOpenStatus?: "" | "open" | "closed"; - workOrderOpenDateString?: string; - occupantName?: string; - lotName?: string; - lotOccupancyId?: number | string; + workOrderTypeId?: number | string; + workOrderOpenStatus?: "" | "open" | "closed"; + workOrderOpenDateString?: string; + occupantName?: string; + lotName?: string; + lotOccupancyId?: number | string; } interface GetWorkOrdersOptions { - limit: number; - offset: number; - includeLotsAndLotOccupancies?: boolean; - includeComments?: boolean; - includeMilestones?: boolean; + limit: number; + offset: number; + includeLotsAndLotOccupancies?: boolean; + includeComments?: boolean; + includeMilestones?: boolean; } function buildWhereClause(filters: GetWorkOrdersFilters): { - sqlWhereClause: string; - sqlParameters: unknown[]; + sqlWhereClause: string; + sqlParameters: unknown[]; } { - let sqlWhereClause = " where w.recordDelete_timeMillis is null"; - const sqlParameters: unknown[] = []; + let sqlWhereClause = " where w.recordDelete_timeMillis is null"; + const sqlParameters: unknown[] = []; - if (filters.workOrderTypeId) { - sqlWhereClause += " and w.workOrderTypeId = ?"; - sqlParameters.push(filters.workOrderTypeId); + if (filters.workOrderTypeId) { + sqlWhereClause += " and w.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.workOrderOpenStatus === "open") { - sqlWhereClause += " and w.workOrderCloseDate is null"; - } else if (filters.workOrderOpenStatus === "closed") { - sqlWhereClause += " and w.workOrderCloseDate is not null"; - } - } + if (filters.workOrderOpenDateString) { + sqlWhereClause += " and w.workOrderOpenDate = ?"; + sqlParameters.push(dateStringToInteger(filters.workOrderOpenDateString)); + } - if (filters.workOrderOpenDateString) { - sqlWhereClause += " and w.workOrderOpenDate = ?"; - sqlParameters.push(dateStringToInteger(filters.workOrderOpenDateString)); - } + const occupantNameFilters = getOccupantNameWhereClause(filters.occupantName, "o"); + if (occupantNameFilters.sqlParameters.length > 0) { + 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"); - if (occupantNameFilters.sqlParameters.length > 0) { - 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 lotNameFilters = getLotNameWhereClause(filters.lotName, "", "l"); + if (lotNameFilters.sqlParameters.length > 0) { + sqlWhereClause += + " and w.workOrderId in (" + + "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); + } - const lotNameFilters = getLotNameWhereClause(filters.lotName, "", "l"); - if (lotNameFilters.sqlParameters.length > 0) { - sqlWhereClause += - " and w.workOrderId in (" + - "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) { + sqlWhereClause += + " and w.workOrderId in (select workOrderId from WorkOrderLotOccupancies where recordDelete_timeMillis is null and lotOccupancyId = ?)"; + sqlParameters.push(filters.lotOccupancyId); + } - if (filters.lotOccupancyId) { - sqlWhereClause += - " and w.workOrderId in (select workOrderId from WorkOrderLotOccupancies where recordDelete_timeMillis is null and lotOccupancyId = ?)"; - sqlParameters.push(filters.lotOccupancyId); - } - - return { - sqlWhereClause, - sqlParameters - }; + return { + sqlWhereClause, + sqlParameters + }; } export function getWorkOrders( - filters: GetWorkOrdersFilters, - options?: GetWorkOrdersOptions, - connectedDatabase?: sqlite.Database + filters: GetWorkOrdersFilters, + options?: GetWorkOrdersOptions, + connectedDatabase?: sqlite.Database ): { - count: number; - workOrders: recordTypes.WorkOrder[]; + count: number; + workOrders: recordTypes.WorkOrder[]; } { - const database = - connectedDatabase || - sqlite(databasePath, { - readonly: true - }); + const database = + connectedDatabase || + sqlite(databasePath, { + 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 - .prepare("select count(*) as recordCount from WorkOrders w" + sqlWhereClause) - .get(sqlParameters).recordCount; + const count: number = database + .prepare("select count(*) as recordCount from WorkOrders w" + sqlWhereClause) + .get(sqlParameters).recordCount; - let workOrders: recordTypes.WorkOrder[] = []; + let workOrders: recordTypes.WorkOrder[] = []; - if (count > 0) { - workOrders = database - .prepare( - "select w.workOrderId," + - " w.workOrderTypeId, t.workOrderType," + - " w.workOrderNumber, w.workOrderDescription," + - " w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString," + - " w.workOrderCloseDate, userFn_dateIntegerToString(w.workOrderCloseDate) as workOrderCloseDateString," + - " ifnull(m.workOrderMilestoneCount, 0) as workOrderMilestoneCount," + - " ifnull(m.workOrderMilestoneCompletionCount, 0) as workOrderMilestoneCompletionCount" + - " from WorkOrders w" + - " left join WorkOrderTypes t on w.workOrderTypeId = t.workOrderTypeId" + - (" left join (select workOrderId," + - " count(workOrderMilestoneId) as workOrderMilestoneCount," + - " sum(case when workOrderMilestoneCompletionDate is null then 0 else 1 end) as workOrderMilestoneCompletionCount" + - " from WorkOrderMilestones" + - " where recordDelete_timeMillis is null" + - " group by workOrderId) m on w.workOrderId = m.workOrderId") + - sqlWhereClause + - " order by w.workOrderOpenDate desc, w.workOrderNumber desc" + - (options ? " limit " + options.limit + " offset " + options.offset : "") - ) - .all(sqlParameters); + if (count > 0) { + workOrders = database + .prepare( + "select w.workOrderId," + + " w.workOrderTypeId, t.workOrderType," + + " w.workOrderNumber, w.workOrderDescription," + + " w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString," + + " w.workOrderCloseDate, userFn_dateIntegerToString(w.workOrderCloseDate) as workOrderCloseDateString," + + " ifnull(m.workOrderMilestoneCount, 0) as workOrderMilestoneCount," + + " ifnull(m.workOrderMilestoneCompletionCount, 0) as workOrderMilestoneCompletionCount" + + " from WorkOrders w" + + " left join WorkOrderTypes t on w.workOrderTypeId = t.workOrderTypeId" + + (" left join (select workOrderId," + + " count(workOrderMilestoneId) as workOrderMilestoneCount," + + " sum(case when workOrderMilestoneCompletionDate is null then 0 else 1 end) as workOrderMilestoneCompletionCount" + + " from WorkOrderMilestones" + + " where recordDelete_timeMillis is null" + + " group by workOrderId) m on w.workOrderId = m.workOrderId") + + sqlWhereClause + + " order by w.workOrderOpenDate desc, w.workOrderNumber desc" + + (options ? " limit " + options.limit + " offset " + options.offset : "") + ) + .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 ( - options && - (options.includeComments || - options.includeLotsAndLotOccupancies || - options.includeMilestones) - ) { - for (const workOrder of workOrders) { - if (options.includeComments) { - workOrder.workOrderComments = getWorkOrderComments( - workOrder.workOrderId as number, - database - ); - } + if (!connectedDatabase) { + database.close(); + } - 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 (!connectedDatabase) { - database.close(); - } - - return { - count, - workOrders - }; + return { + count, + workOrders + }; } export default getWorkOrders; diff --git a/package-lock.json b/package-lock.json index 313a991e..aa44d446 100644 --- a/package-lock.json +++ b/package-lock.json @@ -67,8 +67,8 @@ "@types/randomcolor": "^0.5.7", "@types/session-file-store": "^1.2.2", "@types/uuid": "^9.0.0", - "@typescript-eslint/eslint-plugin": "^5.48.0", - "@typescript-eslint/parser": "^5.48.0", + "@typescript-eslint/eslint-plugin": "^5.48.1", + "@typescript-eslint/parser": "^5.48.1", "bulma": "^0.9.4", "bulma-divider": "^0.2.0", "bulma-helpers": "^0.4.3", @@ -1376,14 +1376,14 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.0.tgz", - "integrity": "sha512-SVLafp0NXpoJY7ut6VFVUU9I+YeFsDzeQwtK0WZ+xbRN3mtxJ08je+6Oi2N89qDn087COdO0u3blKZNv9VetRQ==", + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.1.tgz", + "integrity": "sha512-9nY5K1Rp2ppmpb9s9S2aBiF3xo5uExCehMDmYmmFqqyxgenbHJ3qbarcLt4ITgaD6r/2ypdlcFRdcuVPnks+fQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.48.0", - "@typescript-eslint/type-utils": "5.48.0", - "@typescript-eslint/utils": "5.48.0", + "@typescript-eslint/scope-manager": "5.48.1", + "@typescript-eslint/type-utils": "5.48.1", + "@typescript-eslint/utils": "5.48.1", "debug": "^4.3.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", @@ -1409,14 +1409,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.48.0.tgz", - "integrity": "sha512-1mxNA8qfgxX8kBvRDIHEzrRGrKHQfQlbW6iHyfHYS0Q4X1af+S6mkLNtgCOsGVl8+/LUPrqdHMssAemkrQ01qg==", + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.48.1.tgz", + "integrity": "sha512-4yg+FJR/V1M9Xoq56SF9Iygqm+r5LMXvheo6DQ7/yUWynQ4YfCRnsKuRgqH4EQ5Ya76rVwlEpw4Xu+TgWQUcdA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.48.0", - "@typescript-eslint/types": "5.48.0", - "@typescript-eslint/typescript-estree": "5.48.0", + "@typescript-eslint/scope-manager": "5.48.1", + "@typescript-eslint/types": "5.48.1", + "@typescript-eslint/typescript-estree": "5.48.1", "debug": "^4.3.4" }, "engines": { @@ -1436,13 +1436,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.0.tgz", - "integrity": "sha512-0AA4LviDtVtZqlyUQnZMVHydDATpD9SAX/RC5qh6cBd3xmyWvmXYF+WT1oOmxkeMnWDlUVTwdODeucUnjz3gow==", + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.1.tgz", + "integrity": "sha512-S035ueRrbxRMKvSTv9vJKIWgr86BD8s3RqoRZmsSh/s8HhIs90g6UlK8ZabUSjUZQkhVxt7nmZ63VJ9dcZhtDQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.48.0", - "@typescript-eslint/visitor-keys": "5.48.0" + "@typescript-eslint/types": "5.48.1", + "@typescript-eslint/visitor-keys": "5.48.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1453,13 +1453,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.0.tgz", - "integrity": "sha512-vbtPO5sJyFjtHkGlGK4Sthmta0Bbls4Onv0bEqOGm7hP9h8UpRsHJwsrCiWtCUndTRNQO/qe6Ijz9rnT/DB+7g==", + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.1.tgz", + "integrity": "sha512-Hyr8HU8Alcuva1ppmqSYtM/Gp0q4JOp1F+/JH5D1IZm/bUBrV0edoewQZiEc1r6I8L4JL21broddxK8HAcZiqQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.48.0", - "@typescript-eslint/utils": "5.48.0", + "@typescript-eslint/typescript-estree": "5.48.1", + "@typescript-eslint/utils": "5.48.1", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1480,9 +1480,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.0.tgz", - "integrity": "sha512-UTe67B0Ypius0fnEE518NB2N8gGutIlTojeTg4nt0GQvikReVkurqxd2LvYa9q9M5MQ6rtpNyWTBxdscw40Xhw==", + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.1.tgz", + "integrity": "sha512-xHyDLU6MSuEEdIlzrrAerCGS3T7AA/L8Hggd0RCYBi0w3JMvGYxlLlXHeg50JI9Tfg5MrtsfuNxbS/3zF1/ATg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1493,13 +1493,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.0.tgz", - "integrity": "sha512-7pjd94vvIjI1zTz6aq/5wwE/YrfIyEPLtGJmRfyNR9NYIW+rOvzzUv3Cmq2hRKpvt6e9vpvPUQ7puzX7VSmsEw==", + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.1.tgz", + "integrity": "sha512-Hut+Osk5FYr+sgFh8J/FHjqX6HFcDzTlWLrFqGoK5kVUN3VBHF/QzZmAsIXCQ8T/W9nQNBTqalxi1P3LSqWnRA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.48.0", - "@typescript-eslint/visitor-keys": "5.48.0", + "@typescript-eslint/types": "5.48.1", + "@typescript-eslint/visitor-keys": "5.48.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1520,16 +1520,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.0.tgz", - "integrity": "sha512-x2jrMcPaMfsHRRIkL+x96++xdzvrdBCnYRd5QiW5Wgo1OB4kDYPbC1XjWP/TNqlfK93K/lUL92erq5zPLgFScQ==", + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.1.tgz", + "integrity": "sha512-SmQuSrCGUOdmGMwivW14Z0Lj8dxG1mOFZ7soeJ0TQZEJcs3n5Ndgkg0A4bcMFzBELqLJ6GTHnEU+iIoaD6hFGA==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.48.0", - "@typescript-eslint/types": "5.48.0", - "@typescript-eslint/typescript-estree": "5.48.0", + "@typescript-eslint/scope-manager": "5.48.1", + "@typescript-eslint/types": "5.48.1", + "@typescript-eslint/typescript-estree": "5.48.1", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" @@ -1546,12 +1546,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.0.tgz", - "integrity": "sha512-5motVPz5EgxQ0bHjut3chzBkJ3Z3sheYVcSwS5BpHZpLqSptSmELNtGixmgj65+rIfhvtQTz5i9OP2vtzdDH7Q==", + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.1.tgz", + "integrity": "sha512-Ns0XBwmfuX7ZknznfXozgnydyR8F6ev/KEGePP4i74uL3ArsKbEhJ7raeKr1JSa997DBDwol/4a0Y+At82c9dA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.48.0", + "@typescript-eslint/types": "5.48.1", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -13709,14 +13709,14 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.0.tgz", - "integrity": "sha512-SVLafp0NXpoJY7ut6VFVUU9I+YeFsDzeQwtK0WZ+xbRN3mtxJ08je+6Oi2N89qDn087COdO0u3blKZNv9VetRQ==", + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.1.tgz", + "integrity": "sha512-9nY5K1Rp2ppmpb9s9S2aBiF3xo5uExCehMDmYmmFqqyxgenbHJ3qbarcLt4ITgaD6r/2ypdlcFRdcuVPnks+fQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.48.0", - "@typescript-eslint/type-utils": "5.48.0", - "@typescript-eslint/utils": "5.48.0", + "@typescript-eslint/scope-manager": "5.48.1", + "@typescript-eslint/type-utils": "5.48.1", + "@typescript-eslint/utils": "5.48.1", "debug": "^4.3.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", @@ -13726,53 +13726,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.48.0.tgz", - "integrity": "sha512-1mxNA8qfgxX8kBvRDIHEzrRGrKHQfQlbW6iHyfHYS0Q4X1af+S6mkLNtgCOsGVl8+/LUPrqdHMssAemkrQ01qg==", + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.48.1.tgz", + "integrity": "sha512-4yg+FJR/V1M9Xoq56SF9Iygqm+r5LMXvheo6DQ7/yUWynQ4YfCRnsKuRgqH4EQ5Ya76rVwlEpw4Xu+TgWQUcdA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.48.0", - "@typescript-eslint/types": "5.48.0", - "@typescript-eslint/typescript-estree": "5.48.0", + "@typescript-eslint/scope-manager": "5.48.1", + "@typescript-eslint/types": "5.48.1", + "@typescript-eslint/typescript-estree": "5.48.1", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.0.tgz", - "integrity": "sha512-0AA4LviDtVtZqlyUQnZMVHydDATpD9SAX/RC5qh6cBd3xmyWvmXYF+WT1oOmxkeMnWDlUVTwdODeucUnjz3gow==", + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.1.tgz", + "integrity": "sha512-S035ueRrbxRMKvSTv9vJKIWgr86BD8s3RqoRZmsSh/s8HhIs90g6UlK8ZabUSjUZQkhVxt7nmZ63VJ9dcZhtDQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.48.0", - "@typescript-eslint/visitor-keys": "5.48.0" + "@typescript-eslint/types": "5.48.1", + "@typescript-eslint/visitor-keys": "5.48.1" } }, "@typescript-eslint/type-utils": { - "version": "5.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.0.tgz", - "integrity": "sha512-vbtPO5sJyFjtHkGlGK4Sthmta0Bbls4Onv0bEqOGm7hP9h8UpRsHJwsrCiWtCUndTRNQO/qe6Ijz9rnT/DB+7g==", + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.1.tgz", + "integrity": "sha512-Hyr8HU8Alcuva1ppmqSYtM/Gp0q4JOp1F+/JH5D1IZm/bUBrV0edoewQZiEc1r6I8L4JL21broddxK8HAcZiqQ==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.48.0", - "@typescript-eslint/utils": "5.48.0", + "@typescript-eslint/typescript-estree": "5.48.1", + "@typescript-eslint/utils": "5.48.1", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.0.tgz", - "integrity": "sha512-UTe67B0Ypius0fnEE518NB2N8gGutIlTojeTg4nt0GQvikReVkurqxd2LvYa9q9M5MQ6rtpNyWTBxdscw40Xhw==", + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.1.tgz", + "integrity": "sha512-xHyDLU6MSuEEdIlzrrAerCGS3T7AA/L8Hggd0RCYBi0w3JMvGYxlLlXHeg50JI9Tfg5MrtsfuNxbS/3zF1/ATg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.0.tgz", - "integrity": "sha512-7pjd94vvIjI1zTz6aq/5wwE/YrfIyEPLtGJmRfyNR9NYIW+rOvzzUv3Cmq2hRKpvt6e9vpvPUQ7puzX7VSmsEw==", + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.1.tgz", + "integrity": "sha512-Hut+Osk5FYr+sgFh8J/FHjqX6HFcDzTlWLrFqGoK5kVUN3VBHF/QzZmAsIXCQ8T/W9nQNBTqalxi1P3LSqWnRA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.48.0", - "@typescript-eslint/visitor-keys": "5.48.0", + "@typescript-eslint/types": "5.48.1", + "@typescript-eslint/visitor-keys": "5.48.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -13781,28 +13781,28 @@ } }, "@typescript-eslint/utils": { - "version": "5.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.0.tgz", - "integrity": "sha512-x2jrMcPaMfsHRRIkL+x96++xdzvrdBCnYRd5QiW5Wgo1OB4kDYPbC1XjWP/TNqlfK93K/lUL92erq5zPLgFScQ==", + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.1.tgz", + "integrity": "sha512-SmQuSrCGUOdmGMwivW14Z0Lj8dxG1mOFZ7soeJ0TQZEJcs3n5Ndgkg0A4bcMFzBELqLJ6GTHnEU+iIoaD6hFGA==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.48.0", - "@typescript-eslint/types": "5.48.0", - "@typescript-eslint/typescript-estree": "5.48.0", + "@typescript-eslint/scope-manager": "5.48.1", + "@typescript-eslint/types": "5.48.1", + "@typescript-eslint/typescript-estree": "5.48.1", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { - "version": "5.48.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.0.tgz", - "integrity": "sha512-5motVPz5EgxQ0bHjut3chzBkJ3Z3sheYVcSwS5BpHZpLqSptSmELNtGixmgj65+rIfhvtQTz5i9OP2vtzdDH7Q==", + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.1.tgz", + "integrity": "sha512-Ns0XBwmfuX7ZknznfXozgnydyR8F6ev/KEGePP4i74uL3ArsKbEhJ7raeKr1JSa997DBDwol/4a0Y+At82c9dA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.48.0", + "@typescript-eslint/types": "5.48.1", "eslint-visitor-keys": "^3.3.0" } }, diff --git a/package.json b/package.json index 10b40db5..03373262 100644 --- a/package.json +++ b/package.json @@ -91,8 +91,8 @@ "@types/randomcolor": "^0.5.7", "@types/session-file-store": "^1.2.2", "@types/uuid": "^9.0.0", - "@typescript-eslint/eslint-plugin": "^5.48.0", - "@typescript-eslint/parser": "^5.48.0", + "@typescript-eslint/eslint-plugin": "^5.48.1", + "@typescript-eslint/parser": "^5.48.1", "bulma": "^0.9.4", "bulma-divider": "^0.2.0", "bulma-helpers": "^0.4.3", diff --git a/public-scss/style.scss b/public-scss/style.scss index 1db294e7..d5d1548e 100644 --- a/public-scss/style.scss +++ b/public-scss/style.scss @@ -7,15 +7,19 @@ $white: #fff; $black: #000; .is-linethrough { - text-decoration: line-through; + text-decoration: line-through; } .has-width-10 { - width: 10px; + width: 10px; +} + +.has-width-900 { + width: 900px; } .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-view .is-hidden-status-view, fieldset:enabled .is-hidden-enabled { - display: none; + display: none; } .has-status-view .is-noninteractive-status-view { - pointer-events: none; + pointer-events: none; } /* to fix page titles inside level components, set on .level-left */ .has-flex-shrink-1 { - flex-shrink: 1; + flex-shrink: 1; } .has-border-radius-3 { - border-radius: 3px; + border-radius: 3px; } /* @@ -48,28 +52,28 @@ fieldset:enabled .is-hidden-enabled { */ .tab-content { - display: none; + display: none; - &.is-active { - display: block; - } + &.is-active { + display: block; + } } #is-login-page { - overflow: auto; - background-position: top center; - background-size: cover; + overflow: auto; + background-position: top center; + background-size: cover; - body > .columns { - min-height: 100vh; - } + body > .columns { + min-height: 100vh; + } } .button.is-xsmall { - height: 2em; - padding-top: 0; - padding-bottom: 0; - font-size: 0.75rem; + height: 2em; + padding-top: 0; + padding-bottom: 0; + font-size: 0.75rem; } /* @@ -77,17 +81,17 @@ fieldset:enabled .is-hidden-enabled { */ .container.is-page { - width: 8.5in; - padding: 10px 20px 20px; - margin: 20px auto; - background-color: $white; - border: 1px solid $black; + width: 8.5in; + padding: 10px 20px 20px; + margin: 20px auto; + background-color: $white; + border: 1px solid $black; - @media print { - width: 100%; - padding: 0; - border: 0; - } + @media print { + width: 100%; + padding: 0; + border: 0; + } } /* @@ -95,26 +99,26 @@ fieldset:enabled .is-hidden-enabled { */ .image svg { - display: block; - height: auto; - width: 100%; + display: block; + height: auto; + width: 100%; - .highlight, - .highlight path { - &.is-danger { - stroke: $danger-dark !important; - fill: rgba($danger-light, 0.6); - } - - &.is-success { - stroke: $success-dark !important; - fill: rgba($success, 0.6); - } + .highlight, + .highlight path { + &.is-danger { + stroke: $danger-dark !important; + fill: rgba($danger-light, 0.6); } - text { - user-select: none; + &.is-success { + 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 { - display: none; + display: none; } /* @@ -130,7 +134,7 @@ fieldset:enabled .is-hidden-enabled { */ .modal-card { - max-width: 100%; + max-width: 100%; } /* @@ -141,7 +145,7 @@ $black-ter: hsl(0, 0%, 14%); .control .button.is-static, .menu .menu-label { - color: $black-ter; + color: $black-ter; } /* @@ -149,11 +153,11 @@ $black-ter: hsl(0, 0%, 14%); */ .navbar.is-fixed-top { - z-index: 1100; + z-index: 1100; } .modal { - z-index: 1200; + z-index: 1200; } /* @@ -161,8 +165,8 @@ $black-ter: hsl(0, 0%, 14%); */ span.button.is-static { - pointer-events: all; - cursor: default; + pointer-events: all; + cursor: default; } /* @@ -170,25 +174,25 @@ span.button.is-static { */ .datetimepicker-dummy { - .datetimepicker-dummy-wrapper::before { - mask: unset; - -webkit-mask: unset; - background-color: transparent !important; - } + .datetimepicker-dummy-wrapper::before { + mask: unset; + -webkit-mask: unset; + background-color: transparent !important; + } - /* fix left icon */ - .datetimepicker-dummy-wrapper .datetimepicker-dummy-input:first-child { - text-indent: 2rem; - } + /* fix left icon */ + .datetimepicker-dummy-wrapper .datetimepicker-dummy-input:first-child { + text-indent: 2rem; + } - /* center the button */ - .datetimepicker-clear-button { - transform: none; - margin-right: 0.25rem; - margin-top: 0.15rem; - } + /* center the button */ + .datetimepicker-clear-button { + transform: none; + margin-right: 0.25rem; + margin-top: 0.15rem; + } } .datetimepicker.is-active { - z-index: 10; + z-index: 10; } diff --git a/public-typescript/adminCleanup.js b/public-typescript/adminCleanup.js index 3369b4ef..fb2e51fa 100644 --- a/public-typescript/adminCleanup.js +++ b/public-typescript/adminCleanup.js @@ -4,30 +4,32 @@ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; const doCleanup = () => { - cityssm.postJSON(los.urlPrefix + "/admin/doCleanupDatabase", {}, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doCleanupDatabase', {}, (responseJSON) => { if (responseJSON.success) { bulmaJS.alert({ - title: "Database Cleaned Up Successfully", + title: 'Database Cleaned Up Successfully', message: `${responseJSON.inactivedRecordCount} records inactivated, ${responseJSON.purgedRecordCount} permanently deleted.`, - contextualColorName: "success" + contextualColorName: 'success' }); } else { bulmaJS.alert({ - title: "Error Cleaning Database", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Cleaning Database', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; - document.querySelector("#button--cleanupDatabase").addEventListener("click", () => { + document + .querySelector('#button--cleanupDatabase') + .addEventListener('click', () => { bulmaJS.confirm({ - title: "Cleanup Database", - message: "Are you sure you want to cleanup up the database?", + title: 'Cleanup Database', + message: 'Are you sure you want to cleanup up the database?', okButton: { - text: "Yes, Cleanup Database", + text: 'Yes, Cleanup Database', callbackFunction: doCleanup } }); diff --git a/public-typescript/adminCleanup.ts b/public-typescript/adminCleanup.ts index 6a991b63..46f85b6d 100644 --- a/public-typescript/adminCleanup.ts +++ b/public-typescript/adminCleanup.ts @@ -1,53 +1,55 @@ /* 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 bulmaJS: BulmaJS; +declare const cityssm: cityssmGlobal +declare const bulmaJS: BulmaJS -(() => { - const los = exports.los as globalTypes.LOS; +;(() => { + const los = exports.los as globalTypes.LOS - const doCleanup = () => { - cityssm.postJSON( - los.urlPrefix + "/admin/doCleanupDatabase", - {}, - (responseJSON: { - success: boolean; - errorMessage?: string; - inactivedRecordCount: number; - purgedRecordCount: number; - }) => { - if (responseJSON.success) { - bulmaJS.alert({ - title: "Database Cleaned Up Successfully", - message: `${responseJSON.inactivedRecordCount} records inactivated, + const doCleanup = () => { + cityssm.postJSON( + los.urlPrefix + '/admin/doCleanupDatabase', + {}, + (responseJSON: { + success: boolean + errorMessage?: string + inactivedRecordCount: number + purgedRecordCount: number + }) => { + if (responseJSON.success) { + bulmaJS.alert({ + title: 'Database Cleaned Up Successfully', + message: `${responseJSON.inactivedRecordCount} records inactivated, ${responseJSON.purgedRecordCount} permanently deleted.`, - contextualColorName: "success" - }); - } else { - bulmaJS.alert({ - title: "Error Cleaning Database", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }; + contextualColorName: 'success' + }) + } else { + bulmaJS.alert({ + title: 'Error Cleaning Database', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + ) + } - document.querySelector("#button--cleanupDatabase")!.addEventListener("click", () => { - bulmaJS.confirm({ - title: "Cleanup Database", - message: "Are you sure you want to cleanup up the database?", - okButton: { - text: "Yes, Cleanup Database", - callbackFunction: doCleanup - } - }); - }); -})(); + document + .querySelector('#button--cleanupDatabase')! + .addEventListener('click', () => { + bulmaJS.confirm({ + title: 'Cleanup Database', + message: 'Are you sure you want to cleanup up the database?', + okButton: { + text: 'Yes, Cleanup Database', + callbackFunction: doCleanup + } + }) + }) +})() diff --git a/public-typescript/adminFees.js b/public-typescript/adminFees.js index 2204ad69..cbbd0498 100644 --- a/public-typescript/adminFees.js +++ b/public-typescript/adminFees.js @@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; - const feeCategoriesContainerElement = document.querySelector("#container--feeCategories"); + const feeCategoriesContainerElement = document.querySelector('#container--feeCategories'); let feeCategories = exports.feeCategories; delete exports.feeCategories; function renderFeeCategories() { @@ -13,152 +13,164 @@ Object.defineProperty(exports, "__esModule", { value: true }); `; return; } - feeCategoriesContainerElement.innerHTML = ""; + feeCategoriesContainerElement.innerHTML = ''; for (const feeCategory of feeCategories) { - const feeCategoryContainerElement = document.createElement("section"); - feeCategoryContainerElement.className = "panel container--feeCategory"; - feeCategoryContainerElement.dataset.feeCategoryId = feeCategory.feeCategoryId.toString(); + const feeCategoryContainerElement = document.createElement('section'); + feeCategoryContainerElement.className = 'panel container--feeCategory'; + feeCategoryContainerElement.dataset.feeCategoryId = + feeCategory.feeCategoryId.toString(); feeCategoryContainerElement.innerHTML = '
' + '
' + ('
' + '

' + - cityssm.escapeHTML(feeCategory.feeCategory || "") + - "

" + - "
") + + cityssm.escapeHTML(feeCategory.feeCategory || '') + + '' + + '
') + ('
' + '
' + (feeCategory.fees.length === 0 ? '
' + '" + - "
" - : "") + + 'Delete Category' + + '' + + '
' + : '') + ('
' + '" + - "
") + + 'Edit Category' + + '' + + '
') + ('
' + '" + - "
") + + 'Add Fee' + + '' + + '
') + ('
' + - los.getMoveUpDownButtonFieldHTML("button--moveFeeCategoryUp", "button--moveFeeCategoryDown") + - "
") + - "") + - "" + - ""; + los.getMoveUpDownButtonFieldHTML('button--moveFeeCategoryUp', 'button--moveFeeCategoryDown') + + '') + + '') + + '' + + ''; if (feeCategory.fees.length === 0) { - feeCategoryContainerElement.insertAdjacentHTML("beforeend", `
+ feeCategoryContainerElement.insertAdjacentHTML('beforeend', `

There are no fees in the - "${cityssm.escapeHTML(feeCategory.feeCategory || "")}" + "${cityssm.escapeHTML(feeCategory.feeCategory || '')}" category.

`); feeCategoryContainerElement - .querySelector(".button--deleteFeeCategory") - .addEventListener("click", confirmDeleteFeeCategory); + .querySelector('.button--deleteFeeCategory') + .addEventListener('click', confirmDeleteFeeCategory); } else { for (const fee of feeCategory.fees) { - const panelBlockElement = document.createElement("div"); - panelBlockElement.className = "panel-block is-block container--fee"; + const panelBlockElement = document.createElement('div'); + panelBlockElement.className = 'panel-block is-block container--fee'; panelBlockElement.dataset.feeId = fee.feeId.toString(); const hasTagsBlock = fee.isRequired || fee.occupancyTypeId || fee.lotTypeId; panelBlockElement.innerHTML = '
' + ('
' + - "

" + + '

' + '' + - cityssm.escapeHTML(fee.feeName || "") + - "
" + - "" + - cityssm.escapeHTML(fee.feeDescription || "").replace(/\n/g, "
") + - "
" + - "

" + + cityssm.escapeHTML(fee.feeName || '') + + '
' + + '' + + cityssm + .escapeHTML(fee.feeDescription || '') + .replace(/\n/g, '
') + + '
' + + '

' + (hasTagsBlock ? '

' + - (fee.isRequired ? 'Required' : "") + + (fee.isRequired + ? 'Required' + : '') + (fee.occupancyTypeId ? ' ' + - cityssm.escapeHTML(fee.occupancyType || "") + - "" - : "") + + cityssm.escapeHTML(fee.occupancyType || '') + + '' + : '') + (fee.lotTypeId ? ' ' + - cityssm.escapeHTML(fee.lotType || "") + - "" - : "") + - "

" - : "") + - "
") + + cityssm.escapeHTML(fee.lotType || '') + + '' + : '') + + '

' + : '') + + '
') + ('
' + '
' + ('
' + (fee.feeFunction ? cityssm.escapeHTML(fee.feeFunction) + - "
" + - "Fee Function" - : "$" + fee.feeAmount.toFixed(2) + "
" + "Fee") + - "
") + + '
' + + 'Fee Function' + : '$' + + fee.feeAmount.toFixed(2) + + '
' + + 'Fee') + + '
') + ('
' + (fee.taxPercentage - ? fee.taxPercentage + "%" - : "$" + fee.taxAmount.toFixed(2)) + - "
Tax" + - "
") + + ? fee.taxPercentage + '%' + : '$' + fee.taxAmount.toFixed(2)) + + '
Tax' + + '
') + ('
' + (fee.includeQuantity - ? cityssm.escapeHTML(fee.quantityUnit || "") + - "
" + - "Quantity" - : "") + - "
") + - "
" + - "") + + ? cityssm.escapeHTML(fee.quantityUnit || '') + + '
' + + 'Quantity' + : '') + + '') + + '' + + '') + ('
' + - los.getMoveUpDownButtonFieldHTML("button--moveFeeUp", "button--moveFeeDown") + - "
" + - "") + - ""; - panelBlockElement.querySelector("a").addEventListener("click", openEditFee); - panelBlockElement.querySelector(".button--moveFeeUp").addEventListener("click", moveFee); - panelBlockElement.querySelector(".button--moveFeeDown").addEventListener("click", moveFee); + los.getMoveUpDownButtonFieldHTML('button--moveFeeUp', 'button--moveFeeDown') + + '' + + '') + + ''; + panelBlockElement + .querySelector('a') + .addEventListener('click', openEditFee); + panelBlockElement.querySelector('.button--moveFeeUp').addEventListener('click', moveFee); + panelBlockElement.querySelector('.button--moveFeeDown').addEventListener('click', moveFee); feeCategoryContainerElement.append(panelBlockElement); } } feeCategoryContainerElement - .querySelector(".button--editFeeCategory") - .addEventListener("click", openEditFeeCategory); + .querySelector('.button--editFeeCategory') + .addEventListener('click', openEditFeeCategory); feeCategoryContainerElement - .querySelector(".button--addFee") - .addEventListener("click", openAddFee); - feeCategoryContainerElement.querySelector(".button--moveFeeCategoryUp").addEventListener("click", moveFeeCategory); - feeCategoryContainerElement.querySelector(".button--moveFeeCategoryDown").addEventListener("click", moveFeeCategory); + .querySelector('.button--addFee') + .addEventListener('click', openAddFee); + feeCategoryContainerElement.querySelector('.button--moveFeeCategoryUp').addEventListener('click', moveFeeCategory); + feeCategoryContainerElement.querySelector('.button--moveFeeCategoryDown').addEventListener('click', moveFeeCategory); feeCategoriesContainerElement.append(feeCategoryContainerElement); } } /* * Fee Categories */ - document.querySelector("#button--addFeeCategory").addEventListener("click", () => { + document + .querySelector('#button--addFeeCategory') + .addEventListener('click', () => { let addCloseModalFunction; const doAddFeeCategory = (submitEvent) => { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/admin/doAddFeeCategory", submitEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doAddFeeCategory', submitEvent.currentTarget, (responseJSON) => { if (responseJSON.success) { feeCategories = responseJSON.feeCategories; addCloseModalFunction(); @@ -166,36 +178,37 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Creating Fee Category", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Creating Fee Category', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; - cityssm.openHtmlModal("adminFees-addFeeCategory", { + cityssm.openHtmlModal('adminFees-addFeeCategory', { onshown(modalElement, closeModalFunction) { bulmaJS.toggleHtmlClipped(); - modalElement.querySelector("#feeCategoryAdd--feeCategory").focus(); + modalElement.querySelector('#feeCategoryAdd--feeCategory').focus(); addCloseModalFunction = closeModalFunction; - modalElement.querySelector("form").addEventListener("submit", doAddFeeCategory); + modalElement + .querySelector('form') + .addEventListener('submit', doAddFeeCategory); }, onremoved() { bulmaJS.toggleHtmlClipped(); - document.querySelector("#button--addFeeCategory").focus(); + document.querySelector('#button--addFeeCategory').focus(); } }); }); function openEditFeeCategory(clickEvent) { - 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) => { return currentFeeCategory.feeCategoryId === feeCategoryId; }); let editCloseModalFunction; function doUpdateFeeCategory(submitEvent) { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/admin/doUpdateFeeCategory", submitEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doUpdateFeeCategory', submitEvent.currentTarget, (responseJSON) => { if (responseJSON.success) { feeCategories = responseJSON.feeCategories; editCloseModalFunction(); @@ -203,25 +216,26 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Updating Fee Category", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Updating Fee Category', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); } - cityssm.openHtmlModal("adminFees-editFeeCategory", { + cityssm.openHtmlModal('adminFees-editFeeCategory', { onshow(modalElement) { - modalElement.querySelector("#feeCategoryEdit--feeCategoryId").value = - feeCategory.feeCategoryId.toString(); - modalElement.querySelector("#feeCategoryEdit--feeCategory").value = - feeCategory.feeCategory; + ; + modalElement.querySelector('#feeCategoryEdit--feeCategoryId').value = feeCategory.feeCategoryId.toString(); + modalElement.querySelector('#feeCategoryEdit--feeCategory').value = feeCategory.feeCategory; }, onshown(modalElement, closeModalFunction) { bulmaJS.toggleHtmlClipped(); editCloseModalFunction = closeModalFunction; - modalElement.querySelector("form").addEventListener("submit", doUpdateFeeCategory); - modalElement.querySelector("#feeCategoryEdit--feeCategory").focus(); + modalElement + .querySelector('form') + .addEventListener('submit', doUpdateFeeCategory); + modalElement.querySelector('#feeCategoryEdit--feeCategory').focus(); }, onremoved: () => { bulmaJS.toggleHtmlClipped(); @@ -229,10 +243,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); } function confirmDeleteFeeCategory(clickEvent) { - const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest(".container--feeCategory") - .dataset.feeCategoryId, 10); + const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest('.container--feeCategory').dataset.feeCategoryId, 10); function doDelete() { - cityssm.postJSON(los.urlPrefix + "/admin/doDeleteFeeCategory", { + cityssm.postJSON(los.urlPrefix + '/admin/doDeleteFeeCategory', { feeCategoryId }, (responseJSON) => { if (responseJSON.success) { @@ -241,32 +254,33 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Updating Fee Category", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Updating Fee Category', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); } bulmaJS.confirm({ - title: "Delete Fee Category?", - message: "Are you sure you want to delete this fee category?", - contextualColorName: "warning", + title: 'Delete Fee Category?', + message: 'Are you sure you want to delete this fee category?', + contextualColorName: 'warning', okButton: { - text: "Yes, Delete the Fee Category", + text: 'Yes, Delete the Fee Category', callbackFunction: doDelete } }); } function moveFeeCategory(clickEvent) { const buttonElement = clickEvent.currentTarget; - const feeCategoryId = buttonElement.closest(".container--feeCategory").dataset - .feeCategoryId; + const feeCategoryId = buttonElement.closest('.container--feeCategory').dataset.feeCategoryId; cityssm.postJSON(los.urlPrefix + - "/admin/" + - (buttonElement.dataset.direction === "up" ? "doMoveFeeCategoryUp" : "doMoveFeeCategoryDown"), { + '/admin/' + + (buttonElement.dataset.direction === 'up' + ? 'doMoveFeeCategoryUp' + : 'doMoveFeeCategoryDown'), { feeCategoryId, - moveToEnd: clickEvent.shiftKey ? "1" : "0" + moveToEnd: clickEvent.shiftKey ? '1' : '0' }, (responseJSON) => { if (responseJSON.success) { feeCategories = responseJSON.feeCategories; @@ -274,9 +288,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Moving Fee Category", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Moving Fee Category', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); @@ -285,12 +299,11 @@ Object.defineProperty(exports, "__esModule", { value: true }); * Fees */ function openAddFee(clickEvent) { - const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest(".container--feeCategory") - .dataset.feeCategoryId, 10); + const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest('.container--feeCategory').dataset.feeCategoryId, 10); let addCloseModalFunction; function doAddFee(submitEvent) { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/admin/doAddFee", submitEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doAddFee', submitEvent.currentTarget, (responseJSON) => { if (responseJSON.success) { feeCategories = responseJSON.feeCategories; addCloseModalFunction(); @@ -298,18 +311,18 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Adding Fee", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Adding Fee', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); } - cityssm.openHtmlModal("adminFees-addFee", { + cityssm.openHtmlModal('adminFees-addFee', { onshow(modalElement) { - const feeCategoryElement = modalElement.querySelector("#feeAdd--feeCategoryId"); + const feeCategoryElement = modalElement.querySelector('#feeAdd--feeCategoryId'); for (const feeCategory of feeCategories) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = feeCategory.feeCategoryId.toString(); optionElement.textContent = feeCategory.feeCategory; if (feeCategory.feeCategoryId === feeCategoryId) { @@ -317,60 +330,67 @@ Object.defineProperty(exports, "__esModule", { value: true }); } feeCategoryElement.append(optionElement); } - const occupancyTypeElement = modalElement.querySelector("#feeAdd--occupancyTypeId"); + const occupancyTypeElement = modalElement.querySelector('#feeAdd--occupancyTypeId'); for (const occupancyType of exports.occupancyTypes) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = occupancyType.occupancyTypeId.toString(); optionElement.textContent = occupancyType.occupancyType; occupancyTypeElement.append(optionElement); } - const lotTypeElement = modalElement.querySelector("#feeAdd--lotTypeId"); + const lotTypeElement = modalElement.querySelector('#feeAdd--lotTypeId'); for (const lotType of exports.lotTypes) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = lotType.lotTypeId.toString(); optionElement.textContent = lotType.lotType; lotTypeElement.append(optionElement); } - modalElement.querySelector("#feeAdd--taxPercentage").value = exports.taxPercentageDefault.toString(); + ; + modalElement.querySelector('#feeAdd--taxPercentage').value = exports.taxPercentageDefault.toString(); los.populateAliases(modalElement); }, onshown(modalElement, closeModalFunction) { bulmaJS.toggleHtmlClipped(); addCloseModalFunction = closeModalFunction; - modalElement.querySelector("form").addEventListener("submit", doAddFee); - modalElement.querySelector("#feeAdd--feeName").focus(); - modalElement.querySelector("#feeAdd--feeFunction").addEventListener("change", () => { - const feeAmountElement = modalElement.querySelector("#feeAdd--feeAmount"); - const feeFunctionElement = modalElement.querySelector("#feeAdd--feeFunction"); - if (feeFunctionElement.value === "") { - feeFunctionElement.closest(".select").classList.remove("is-success"); - feeAmountElement.classList.add("is-success"); + modalElement.querySelector('form').addEventListener('submit', doAddFee); + modalElement.querySelector('#feeAdd--feeName').focus(); + modalElement.querySelector('#feeAdd--feeFunction').addEventListener('change', () => { + const feeAmountElement = modalElement.querySelector('#feeAdd--feeAmount'); + const feeFunctionElement = modalElement.querySelector('#feeAdd--feeFunction'); + if (feeFunctionElement.value === '') { + feeFunctionElement + .closest('.select') + .classList.remove('is-success'); + feeAmountElement.classList.add('is-success'); feeAmountElement.disabled = false; } else { - feeFunctionElement.closest(".select").classList.add("is-success"); - feeAmountElement.classList.remove("is-success"); + feeFunctionElement.closest('.select').classList.add('is-success'); + feeAmountElement.classList.remove('is-success'); feeAmountElement.disabled = true; } }); - modalElement.querySelector("#feeAdd--taxPercentage").addEventListener("keyup", () => { - const taxAmountElement = modalElement.querySelector("#feeAdd--taxAmount"); - const taxPercentageElement = modalElement.querySelector("#feeAdd--taxPercentage"); - if (taxPercentageElement.value === "") { - taxPercentageElement.classList.remove("is-success"); - taxAmountElement.classList.add("is-success"); + modalElement + .querySelector('#feeAdd--taxPercentage') + .addEventListener('keyup', () => { + const taxAmountElement = modalElement.querySelector('#feeAdd--taxAmount'); + const taxPercentageElement = modalElement.querySelector('#feeAdd--taxPercentage'); + if (taxPercentageElement.value === '') { + taxPercentageElement.classList.remove('is-success'); + taxAmountElement.classList.add('is-success'); taxAmountElement.disabled = false; } else { - taxPercentageElement.classList.add("is-success"); - taxAmountElement.classList.remove("is-success"); + taxPercentageElement.classList.add('is-success'); + taxAmountElement.classList.remove('is-success'); taxAmountElement.disabled = true; } }); - modalElement.querySelector("#feeAdd--includeQuantity").addEventListener("change", () => { - modalElement.querySelector("#feeAdd--quantityUnit").disabled = - modalElement.querySelector("#feeAdd--includeQuantity") - .value === ""; + modalElement + .querySelector('#feeAdd--includeQuantity') + .addEventListener('change', () => { + ; + modalElement.querySelector('#feeAdd--quantityUnit').disabled = + modalElement.querySelector('#feeAdd--includeQuantity').value === ''; }); }, onremoved() { @@ -380,9 +400,10 @@ Object.defineProperty(exports, "__esModule", { value: true }); } function openEditFee(clickEvent) { 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 feeCategoryId = Number.parseInt(feeContainerElement.closest(".container--feeCategory").dataset.feeCategoryId); + const feeCategoryId = Number.parseInt(feeContainerElement.closest('.container--feeCategory') + .dataset.feeCategoryId); const feeCategory = feeCategories.find((currentFeeCategory) => { return currentFeeCategory.feeCategoryId === feeCategoryId; }); @@ -393,7 +414,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); let editModalElement; function doUpdateFee(submitEvent) { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/admin/doUpdateFee", submitEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doUpdateFee', submitEvent.currentTarget, (responseJSON) => { if (responseJSON.success) { feeCategories = responseJSON.feeCategories; editCloseModalFunction(); @@ -401,9 +422,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Updating Fee", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Updating Fee', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); @@ -411,7 +432,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); function confirmDeleteFee(clickEvent) { clickEvent.preventDefault(); const doDelete = () => { - cityssm.postJSON(los.urlPrefix + "/admin/doDeleteFee", { + cityssm.postJSON(los.urlPrefix + '/admin/doDeleteFee', { feeId }, (responseJSON) => { if (responseJSON.success) { @@ -421,64 +442,62 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Deleting Fee", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Deleting Fee', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; bulmaJS.confirm({ - title: "Delete Fee?", - message: "Are you sure you want to delete this fee?", - contextualColorName: "warning", + title: 'Delete Fee?', + message: 'Are you sure you want to delete this fee?', + contextualColorName: 'warning', okButton: { - text: "Yes, Delete the Fee", + text: 'Yes, Delete the Fee', callbackFunction: doDelete } }); } function toggleFeeFields() { - const feeAmountElement = editModalElement.querySelector("#feeEdit--feeAmount"); - const feeFunctionElement = editModalElement.querySelector("#feeEdit--feeFunction"); - if (feeFunctionElement.value === "") { - feeFunctionElement.closest(".select").classList.remove("is-success"); - feeAmountElement.classList.add("is-success"); + const feeAmountElement = editModalElement.querySelector('#feeEdit--feeAmount'); + const feeFunctionElement = editModalElement.querySelector('#feeEdit--feeFunction'); + if (feeFunctionElement.value === '') { + feeFunctionElement.closest('.select').classList.remove('is-success'); + feeAmountElement.classList.add('is-success'); feeAmountElement.disabled = false; } else { - feeFunctionElement.closest(".select").classList.add("is-success"); - feeAmountElement.classList.remove("is-success"); + feeFunctionElement.closest('.select').classList.add('is-success'); + feeAmountElement.classList.remove('is-success'); feeAmountElement.disabled = true; } } function toggleTaxFields() { - const taxAmountElement = editModalElement.querySelector("#feeEdit--taxAmount"); - const taxPercentageElement = editModalElement.querySelector("#feeEdit--taxPercentage"); - if (taxPercentageElement.value === "") { - taxPercentageElement.classList.remove("is-success"); - taxAmountElement.classList.add("is-success"); + const taxAmountElement = editModalElement.querySelector('#feeEdit--taxAmount'); + const taxPercentageElement = editModalElement.querySelector('#feeEdit--taxPercentage'); + if (taxPercentageElement.value === '') { + taxPercentageElement.classList.remove('is-success'); + taxAmountElement.classList.add('is-success'); taxAmountElement.disabled = false; } else { - taxPercentageElement.classList.add("is-success"); - taxAmountElement.classList.remove("is-success"); + taxPercentageElement.classList.add('is-success'); + taxAmountElement.classList.remove('is-success'); taxAmountElement.disabled = true; } } function toggleQuantityFields() { - const includeQuanitityValue = editModalElement.querySelector("#feeEdit--includeQuantity").value; - editModalElement.querySelector("#feeEdit--quantityUnit").disabled = - includeQuanitityValue === ""; + const includeQuanitityValue = editModalElement.querySelector('#feeEdit--includeQuantity').value; + editModalElement.querySelector('#feeEdit--quantityUnit').disabled = includeQuanitityValue === ''; } - cityssm.openHtmlModal("adminFees-editFee", { + cityssm.openHtmlModal('adminFees-editFee', { onshow(modalElement) { editModalElement = modalElement; - modalElement.querySelector("#feeEdit--feeId").value = - fee.feeId.toString(); - const feeCategoryElement = modalElement.querySelector("#feeEdit--feeCategoryId"); + modalElement.querySelector('#feeEdit--feeId').value = fee.feeId.toString(); + const feeCategoryElement = modalElement.querySelector('#feeEdit--feeCategoryId'); for (const feeCategory of feeCategories) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = feeCategory.feeCategoryId.toString(); optionElement.textContent = feeCategory.feeCategory; if (feeCategory.feeCategoryId === feeCategoryId) { @@ -486,12 +505,12 @@ Object.defineProperty(exports, "__esModule", { value: true }); } feeCategoryElement.append(optionElement); } - modalElement.querySelector("#feeEdit--feeName").value = fee.feeName; - modalElement.querySelector("#feeEdit--feeDescription").value = - fee.feeDescription; - const occupancyTypeElement = modalElement.querySelector("#feeEdit--occupancyTypeId"); + ; + modalElement.querySelector('#feeEdit--feeName').value = fee.feeName; + modalElement.querySelector('#feeEdit--feeDescription').value = fee.feeDescription; + const occupancyTypeElement = modalElement.querySelector('#feeEdit--occupancyTypeId'); for (const occupancyType of exports.occupancyTypes) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = occupancyType.occupancyTypeId.toString(); optionElement.textContent = occupancyType.occupancyType; if (occupancyType.occupancyTypeId === fee.occupancyTypeId) { @@ -499,9 +518,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); } occupancyTypeElement.append(optionElement); } - const lotTypeElement = modalElement.querySelector("#feeEdit--lotTypeId"); + const lotTypeElement = modalElement.querySelector('#feeEdit--lotTypeId'); for (const lotType of exports.lotTypes) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = lotType.lotTypeId.toString(); optionElement.textContent = lotType.lotType; if (lotType.lotTypeId === fee.lotTypeId) { @@ -509,39 +528,42 @@ Object.defineProperty(exports, "__esModule", { value: true }); } lotTypeElement.append(optionElement); } - modalElement.querySelector("#feeEdit--feeAmount").value = fee.feeAmount - ? fee.feeAmount.toFixed(2) - : ""; + ; + modalElement.querySelector('#feeEdit--feeAmount').value = fee.feeAmount ? fee.feeAmount.toFixed(2) : ''; modalElement - .querySelector("#feeEdit--feeFunction") - .addEventListener("change", toggleFeeFields); + .querySelector('#feeEdit--feeFunction') + .addEventListener('change', toggleFeeFields); toggleFeeFields(); - modalElement.querySelector("#feeEdit--taxAmount").value = fee.taxAmount - ? fee.taxAmount.toFixed(2) - : ""; - const taxPercentageElement = modalElement.querySelector("#feeEdit--taxPercentage"); - taxPercentageElement.value = fee.taxPercentage ? fee.taxPercentage.toString() : ""; - taxPercentageElement.addEventListener("keyup", toggleTaxFields); + modalElement.querySelector('#feeEdit--taxAmount').value = fee.taxAmount ? fee.taxAmount.toFixed(2) : ''; + const taxPercentageElement = modalElement.querySelector('#feeEdit--taxPercentage'); + taxPercentageElement.value = fee.taxPercentage + ? fee.taxPercentage.toString() + : ''; + taxPercentageElement.addEventListener('keyup', toggleTaxFields); toggleTaxFields(); - const includeQuantityElement = modalElement.querySelector("#feeEdit--includeQuantity"); + const includeQuantityElement = modalElement.querySelector('#feeEdit--includeQuantity'); if (fee.includeQuantity) { - includeQuantityElement.value = "1"; + includeQuantityElement.value = '1'; } - includeQuantityElement.addEventListener("change", toggleQuantityFields); - modalElement.querySelector("#feeEdit--quantityUnit").value = - fee.quantityUnit || ""; + includeQuantityElement.addEventListener('change', toggleQuantityFields); + modalElement.querySelector('#feeEdit--quantityUnit').value = fee.quantityUnit || ''; toggleQuantityFields(); if (fee.isRequired) { - modalElement.querySelector("#feeEdit--isRequired").value = "1"; + ; + modalElement.querySelector('#feeEdit--isRequired').value = '1'; } los.populateAliases(modalElement); }, onshown(modalElement, closeModalFunction) { bulmaJS.toggleHtmlClipped(); editCloseModalFunction = closeModalFunction; - modalElement.querySelector("form").addEventListener("submit", doUpdateFee); + modalElement + .querySelector('form') + .addEventListener('submit', doUpdateFee); bulmaJS.init(modalElement); - modalElement.querySelector(".button--deleteFee").addEventListener("click", confirmDeleteFee); + modalElement + .querySelector('.button--deleteFee') + .addEventListener('click', confirmDeleteFee); }, onremoved: () => { bulmaJS.toggleHtmlClipped(); @@ -550,13 +572,15 @@ Object.defineProperty(exports, "__esModule", { value: true }); } function moveFee(clickEvent) { const buttonElement = clickEvent.currentTarget; - const feeContainerElement = buttonElement.closest(".container--fee"); + const feeContainerElement = buttonElement.closest('.container--fee'); const feeId = feeContainerElement.dataset.feeId; cityssm.postJSON(los.urlPrefix + - "/admin/" + - (buttonElement.dataset.direction === "up" ? "doMoveFeeUp" : "doMoveFeeDown"), { + '/admin/' + + (buttonElement.dataset.direction === 'up' + ? 'doMoveFeeUp' + : 'doMoveFeeDown'), { feeId, - moveToEnd: clickEvent.shiftKey ? "1" : "0" + moveToEnd: clickEvent.shiftKey ? '1' : '0' }, (responseJSON) => { if (responseJSON.success) { feeCategories = responseJSON.feeCategories; @@ -564,9 +588,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Moving Fee", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Moving Fee', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); diff --git a/public-typescript/adminFees.ts b/public-typescript/adminFees.ts index 1b854d15..03a275ce 100644 --- a/public-typescript/adminFees.ts +++ b/public-typescript/adminFees.ts @@ -1,834 +1,945 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ -import type * as globalTypes from "../types/globalTypes"; -import type * as recordTypes from "../types/recordTypes"; +import type * as globalTypes from '../types/globalTypes' +import type * as recordTypes from '../types/recordTypes' -import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; +import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types' -import type { BulmaJS } from "@cityssm/bulma-js/types"; +import type { BulmaJS } from '@cityssm/bulma-js/types' -declare const cityssm: cityssmGlobal; -declare const bulmaJS: BulmaJS; +declare const cityssm: cityssmGlobal +declare const bulmaJS: BulmaJS -(() => { - const los = exports.los as globalTypes.LOS; +;(() => { + const los = exports.los as globalTypes.LOS - const feeCategoriesContainerElement = document.querySelector("#container--feeCategories") as HTMLElement; + const feeCategoriesContainerElement = document.querySelector( + '#container--feeCategories' + ) as HTMLElement - let feeCategories: recordTypes.FeeCategory[] = exports.feeCategories; - delete exports.feeCategories; + let feeCategories: recordTypes.FeeCategory[] = exports.feeCategories + delete exports.feeCategories - function renderFeeCategories(): void { - if (feeCategories.length === 0) { - feeCategoriesContainerElement.innerHTML = `
+ function renderFeeCategories(): void { + if (feeCategories.length === 0) { + feeCategoriesContainerElement.innerHTML = `

There are no available fees.

-
`; +
` - return; - } + return + } - feeCategoriesContainerElement.innerHTML = ""; + feeCategoriesContainerElement.innerHTML = '' - for (const feeCategory of feeCategories) { - const feeCategoryContainerElement = document.createElement("section"); + for (const feeCategory of feeCategories) { + 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 = - '
' + - '
' + - ('
' + - '

' + - cityssm.escapeHTML(feeCategory.feeCategory || "") + - "

" + - "
") + - ('
' + - '
' + - (feeCategory.fees!.length === 0 - ? '
' + - '" + - "
" - : "") + - ('
' + - '" + - "
") + - ('
' + - '" + - "
") + - ('
' + - los.getMoveUpDownButtonFieldHTML( - "button--moveFeeCategoryUp", - "button--moveFeeCategoryDown" - ) + - "
") + - "
") + - "
" + - "
"; + feeCategoryContainerElement.innerHTML = + '
' + + '
' + + ('
' + + '

' + + cityssm.escapeHTML(feeCategory.feeCategory || '') + + '

' + + '
') + + ('
' + + '
' + + (feeCategory.fees!.length === 0 + ? '
' + + '' + + '
' + : '') + + ('
' + + '' + + '
') + + ('
' + + '' + + '
') + + ('
' + + los.getMoveUpDownButtonFieldHTML( + 'button--moveFeeCategoryUp', + 'button--moveFeeCategoryDown' + ) + + '
') + + '
') + + '
' + + '
' - if (feeCategory.fees.length === 0) { - feeCategoryContainerElement.insertAdjacentHTML( - "beforeend", - `
+ if (feeCategory.fees.length === 0) { + feeCategoryContainerElement.insertAdjacentHTML( + 'beforeend', + `

There are no fees in the - "${cityssm.escapeHTML(feeCategory.feeCategory || "")}" + "${cityssm.escapeHTML( + feeCategory.feeCategory || '' + )}" category.

` - ); + ) - feeCategoryContainerElement - .querySelector(".button--deleteFeeCategory")! - .addEventListener("click", confirmDeleteFeeCategory); - } else { - for (const fee of feeCategory.fees) { - const panelBlockElement = document.createElement("div"); + feeCategoryContainerElement + .querySelector('.button--deleteFeeCategory')! + .addEventListener('click', confirmDeleteFeeCategory) + } else { + for (const fee of feeCategory.fees) { + const panelBlockElement = document.createElement('div') - panelBlockElement.className = "panel-block is-block container--fee"; - panelBlockElement.dataset.feeId = fee.feeId!.toString(); + panelBlockElement.className = 'panel-block is-block container--fee' + panelBlockElement.dataset.feeId = fee.feeId!.toString() - const hasTagsBlock = fee.isRequired || fee.occupancyTypeId || fee.lotTypeId; + const hasTagsBlock = + fee.isRequired || fee.occupancyTypeId || fee.lotTypeId - panelBlockElement.innerHTML = - '
' + - ('
' + - "

" + - '' + - cityssm.escapeHTML(fee.feeName || "") + - "
" + - "" + - cityssm.escapeHTML(fee.feeDescription || "").replace(/\n/g, "
") + - "
" + - "

" + - (hasTagsBlock - ? '

' + - (fee.isRequired ? 'Required' : "") + - (fee.occupancyTypeId - ? ' ' + - cityssm.escapeHTML(fee.occupancyType || "") + - "" - : "") + - (fee.lotTypeId - ? ' ' + - cityssm.escapeHTML(fee.lotType || "") + - "" - : "") + - "

" - : "") + - "
") + - ('
' + - '
' + - ('
' + - (fee.feeFunction - ? cityssm.escapeHTML(fee.feeFunction) + - "
" + - "Fee Function" - : "$" + fee.feeAmount!.toFixed(2) + "
" + "Fee") + - "
") + - ('
' + - (fee.taxPercentage - ? fee.taxPercentage + "%" - : "$" + fee.taxAmount!.toFixed(2)) + - "
Tax" + - "
") + - ('
' + - (fee.includeQuantity - ? cityssm.escapeHTML(fee.quantityUnit || "") + - "
" + - "Quantity" - : "") + - "
") + - "
" + - "
") + - ('
' + - los.getMoveUpDownButtonFieldHTML("button--moveFeeUp", "button--moveFeeDown") + - "
" + - "
") + - "
"; + panelBlockElement.innerHTML = + '
' + + ('
' + + '

' + + '' + + cityssm.escapeHTML(fee.feeName || '') + + '
' + + '' + + cityssm + .escapeHTML(fee.feeDescription || '') + .replace(/\n/g, '
') + + '
' + + '

' + + (hasTagsBlock + ? '

' + + (fee.isRequired + ? 'Required' + : '') + + (fee.occupancyTypeId + ? ' ' + + cityssm.escapeHTML(fee.occupancyType || '') + + '' + : '') + + (fee.lotTypeId + ? ' ' + + cityssm.escapeHTML(fee.lotType || '') + + '' + : '') + + '

' + : '') + + '
') + + ('
' + + '
' + + ('
' + + (fee.feeFunction + ? cityssm.escapeHTML(fee.feeFunction) + + '
' + + 'Fee Function' + : '$' + + fee.feeAmount!.toFixed(2) + + '
' + + 'Fee') + + '
') + + ('
' + + (fee.taxPercentage + ? fee.taxPercentage + '%' + : '$' + fee.taxAmount!.toFixed(2)) + + '
Tax' + + '
') + + ('
' + + (fee.includeQuantity + ? cityssm.escapeHTML(fee.quantityUnit || '') + + '
' + + 'Quantity' + : '') + + '
') + + '
' + + '
') + + ('
' + + los.getMoveUpDownButtonFieldHTML( + 'button--moveFeeUp', + 'button--moveFeeDown' + ) + + '
' + + '
') + + '
' - panelBlockElement.querySelector("a")!.addEventListener("click", openEditFee); + panelBlockElement + .querySelector('a')! + .addEventListener('click', openEditFee) - ( - panelBlockElement.querySelector(".button--moveFeeUp") as HTMLButtonElement - ).addEventListener("click", moveFee); + ;( + panelBlockElement.querySelector( + '.button--moveFeeUp' + ) as HTMLButtonElement + ).addEventListener('click', moveFee) - ( - panelBlockElement.querySelector(".button--moveFeeDown") as HTMLButtonElement - ).addEventListener("click", moveFee); + ;( + panelBlockElement.querySelector( + '.button--moveFeeDown' + ) as HTMLButtonElement + ).addEventListener('click', moveFee) - feeCategoryContainerElement.append(panelBlockElement); - } - } - - feeCategoryContainerElement - .querySelector(".button--editFeeCategory")! - .addEventListener("click", openEditFeeCategory); - - feeCategoryContainerElement - .querySelector(".button--addFee")! - .addEventListener("click", openAddFee); - - ( - feeCategoryContainerElement.querySelector(".button--moveFeeCategoryUp") as HTMLButtonElement - ).addEventListener("click", moveFeeCategory); - - ( - feeCategoryContainerElement.querySelector(".button--moveFeeCategoryDown") as HTMLButtonElement - ).addEventListener("click", moveFeeCategory); - - feeCategoriesContainerElement.append(feeCategoryContainerElement); + feeCategoryContainerElement.append(panelBlockElement) } + } + + feeCategoryContainerElement + .querySelector('.button--editFeeCategory')! + .addEventListener('click', openEditFeeCategory) + + feeCategoryContainerElement + .querySelector('.button--addFee')! + .addEventListener('click', openAddFee) + + ;( + feeCategoryContainerElement.querySelector( + '.button--moveFeeCategoryUp' + ) as HTMLButtonElement + ).addEventListener('click', moveFeeCategory) + + ;( + feeCategoryContainerElement.querySelector( + '.button--moveFeeCategoryDown' + ) as HTMLButtonElement + ).addEventListener('click', moveFeeCategory) + + feeCategoriesContainerElement.append(feeCategoryContainerElement) } + } - /* - * Fee Categories - */ + /* + * Fee Categories + */ - document.querySelector("#button--addFeeCategory")!.addEventListener("click", () => { - let addCloseModalFunction: () => void; + document + .querySelector('#button--addFeeCategory')! + .addEventListener('click', () => { + let addCloseModalFunction: () => void - const doAddFeeCategory = (submitEvent: SubmitEvent) => { - submitEvent.preventDefault(); - - cityssm.postJSON( - los.urlPrefix + "/admin/doAddFeeCategory", - submitEvent.currentTarget, - (responseJSON: { - success: boolean; - errorMessage?: string; - feeCategories: recordTypes.FeeCategory[]; - }) => { - if (responseJSON.success) { - feeCategories = responseJSON.feeCategories; - addCloseModalFunction(); - renderFeeCategories(); - } else { - bulmaJS.alert({ - title: "Error Creating Fee Category", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }; - - cityssm.openHtmlModal("adminFees-addFeeCategory", { - onshown(modalElement, closeModalFunction) { - bulmaJS.toggleHtmlClipped(); - (modalElement.querySelector("#feeCategoryAdd--feeCategory") as HTMLInputElement).focus(); - - addCloseModalFunction = closeModalFunction; - modalElement.querySelector("form")!.addEventListener("submit", doAddFeeCategory); - }, - onremoved() { - bulmaJS.toggleHtmlClipped(); - (document.querySelector("#button--addFeeCategory") as HTMLButtonElement).focus(); - } - }); - }); - - function openEditFeeCategory(clickEvent: Event): void { - const feeCategoryId = Number.parseInt( - ((clickEvent.currentTarget as HTMLElement).closest(".container--feeCategory") as HTMLElement) - .dataset.feeCategoryId!, - 10 - ); - - const feeCategory = feeCategories.find((currentFeeCategory) => { - return currentFeeCategory.feeCategoryId === feeCategoryId; - })!; - - let editCloseModalFunction: () => void; - - function doUpdateFeeCategory(submitEvent: SubmitEvent) { - submitEvent.preventDefault(); - - cityssm.postJSON( - los.urlPrefix + "/admin/doUpdateFeeCategory", - submitEvent.currentTarget, - (responseJSON: { - success: boolean; - errorMessage?: string; - feeCategories: recordTypes.FeeCategory[]; - }) => { - if (responseJSON.success) { - feeCategories = responseJSON.feeCategories; - editCloseModalFunction(); - renderFeeCategories(); - } else { - bulmaJS.alert({ - title: "Error Updating Fee Category", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - } - - cityssm.openHtmlModal("adminFees-editFeeCategory", { - onshow(modalElement) { - (modalElement.querySelector("#feeCategoryEdit--feeCategoryId") as HTMLInputElement).value = - feeCategory.feeCategoryId!.toString(); - (modalElement.querySelector("#feeCategoryEdit--feeCategory") as HTMLInputElement).value = - feeCategory.feeCategory!; - }, - onshown(modalElement, closeModalFunction) { - bulmaJS.toggleHtmlClipped(); - - editCloseModalFunction = closeModalFunction; - - modalElement.querySelector("form")!.addEventListener("submit", doUpdateFeeCategory); - - (modalElement.querySelector("#feeCategoryEdit--feeCategory") as HTMLInputElement).focus(); - }, - onremoved: () => { - bulmaJS.toggleHtmlClipped(); - } - }); - } - - function confirmDeleteFeeCategory(clickEvent: Event): void { - const feeCategoryId = Number.parseInt( - ((clickEvent.currentTarget as HTMLElement).closest(".container--feeCategory") as HTMLElement) - .dataset.feeCategoryId!, - 10 - ); - - function doDelete() { - cityssm.postJSON( - los.urlPrefix + "/admin/doDeleteFeeCategory", - { - feeCategoryId - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - feeCategories?: recordTypes.FeeCategory[]; - }) => { - if (responseJSON.success) { - feeCategories = responseJSON.feeCategories!; - renderFeeCategories(); - } else { - bulmaJS.alert({ - title: "Error Updating Fee Category", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - } - - bulmaJS.confirm({ - title: "Delete Fee Category?", - message: "Are you sure you want to delete this fee category?", - contextualColorName: "warning", - okButton: { - text: "Yes, Delete the Fee Category", - callbackFunction: doDelete - } - }); - } - - function moveFeeCategory(clickEvent: MouseEvent): void { - const buttonElement = clickEvent.currentTarget as HTMLButtonElement; - - const feeCategoryId = (buttonElement.closest(".container--feeCategory") as HTMLElement).dataset - .feeCategoryId!; + const doAddFeeCategory = (submitEvent: SubmitEvent) => { + submitEvent.preventDefault() cityssm.postJSON( - los.urlPrefix + - "/admin/" + - (buttonElement.dataset.direction === "up" ? "doMoveFeeCategoryUp" : "doMoveFeeCategoryDown"), - { - feeCategoryId, - moveToEnd: clickEvent.shiftKey ? "1" : "0" - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - feeCategories?: recordTypes.FeeCategory[]; - }) => { - if (responseJSON.success) { - feeCategories = responseJSON.feeCategories!; - renderFeeCategories(); - } else { - bulmaJS.alert({ - title: "Error Moving Fee Category", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - } - - /* - * Fees - */ - - function openAddFee(clickEvent: Event): void { - const feeCategoryId = Number.parseInt( - ((clickEvent.currentTarget as HTMLElement).closest(".container--feeCategory") as HTMLElement) - .dataset.feeCategoryId!, - 10 - ); - - let addCloseModalFunction: () => void; - - function doAddFee(submitEvent: SubmitEvent) { - submitEvent.preventDefault(); - - cityssm.postJSON( - los.urlPrefix + "/admin/doAddFee", - submitEvent.currentTarget, - (responseJSON: { - success: boolean; - errorMessage?: string; - feeCategories: recordTypes.FeeCategory[]; - }) => { - if (responseJSON.success) { - feeCategories = responseJSON.feeCategories; - addCloseModalFunction(); - renderFeeCategories(); - } else { - bulmaJS.alert({ - title: "Error Adding Fee", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - } - - cityssm.openHtmlModal("adminFees-addFee", { - onshow(modalElement) { - const feeCategoryElement = modalElement.querySelector( - "#feeAdd--feeCategoryId" - ) as HTMLSelectElement; - - for (const feeCategory of feeCategories) { - const optionElement = document.createElement("option"); - optionElement.value = feeCategory.feeCategoryId.toString(); - optionElement.textContent = feeCategory.feeCategory!; - - if (feeCategory.feeCategoryId === feeCategoryId) { - optionElement.selected = true; - } - - feeCategoryElement.append(optionElement); - } - - const occupancyTypeElement = modalElement.querySelector( - "#feeAdd--occupancyTypeId" - ) as HTMLSelectElement; - - for (const occupancyType of exports.occupancyTypes as recordTypes.OccupancyType[]) { - const optionElement = document.createElement("option"); - optionElement.value = occupancyType.occupancyTypeId.toString(); - optionElement.textContent = occupancyType.occupancyType; - occupancyTypeElement.append(optionElement); - } - - const lotTypeElement = modalElement.querySelector("#feeAdd--lotTypeId") as HTMLSelectElement; - - for (const lotType of exports.lotTypes as recordTypes.LotType[]) { - const optionElement = document.createElement("option"); - optionElement.value = lotType.lotTypeId.toString(); - optionElement.textContent = lotType.lotType; - lotTypeElement.append(optionElement); - } - - (modalElement.querySelector("#feeAdd--taxPercentage") as HTMLInputElement).value = ( - exports.taxPercentageDefault as number - ).toString(); - - los.populateAliases(modalElement); - }, - onshown(modalElement, closeModalFunction) { - bulmaJS.toggleHtmlClipped(); - - addCloseModalFunction = closeModalFunction; - - modalElement.querySelector("form")!.addEventListener("submit", doAddFee); - - (modalElement.querySelector("#feeAdd--feeName") as HTMLInputElement).focus(); - - (modalElement.querySelector("#feeAdd--feeFunction") as HTMLInputElement).addEventListener( - "change", - () => { - const feeAmountElement = modalElement.querySelector( - "#feeAdd--feeAmount" - ) as HTMLInputElement; - - const feeFunctionElement = modalElement.querySelector( - "#feeAdd--feeFunction" - ) as HTMLSelectElement; - - if (feeFunctionElement.value === "") { - feeFunctionElement.closest(".select")!.classList.remove("is-success"); - - feeAmountElement.classList.add("is-success"); - feeAmountElement.disabled = false; - } else { - feeFunctionElement.closest(".select")!.classList.add("is-success"); - - feeAmountElement.classList.remove("is-success"); - feeAmountElement.disabled = true; - } - } - ); - - modalElement.querySelector("#feeAdd--taxPercentage")!.addEventListener("keyup", () => { - const taxAmountElement = modalElement.querySelector( - "#feeAdd--taxAmount" - ) as HTMLInputElement; - - const taxPercentageElement = modalElement.querySelector( - "#feeAdd--taxPercentage" - ) as HTMLInputElement; - - if (taxPercentageElement.value === "") { - taxPercentageElement.classList.remove("is-success"); - - taxAmountElement.classList.add("is-success"); - taxAmountElement.disabled = false; - } else { - taxPercentageElement.classList.add("is-success"); - - taxAmountElement.classList.remove("is-success"); - taxAmountElement.disabled = true; - } - }); - - modalElement.querySelector("#feeAdd--includeQuantity")!.addEventListener("change", () => { - (modalElement.querySelector("#feeAdd--quantityUnit") as HTMLInputElement).disabled = - (modalElement.querySelector("#feeAdd--includeQuantity") as HTMLSelectElement) - .value === ""; - }); - }, - onremoved() { - bulmaJS.toggleHtmlClipped(); - } - }); - } - - function openEditFee(clickEvent: Event): void { - clickEvent.preventDefault(); - - const feeContainerElement = (clickEvent.currentTarget as HTMLElement).closest( - ".container--fee" - ) as HTMLElement; - - const feeId = Number.parseInt(feeContainerElement.dataset.feeId!, 10); - const feeCategoryId = Number.parseInt( - (feeContainerElement.closest(".container--feeCategory") as HTMLElement).dataset.feeCategoryId! - ); - - const feeCategory = feeCategories.find((currentFeeCategory) => { - return currentFeeCategory.feeCategoryId === feeCategoryId; - })!; - - const fee = feeCategory.fees.find((currentFee) => { - return currentFee.feeId === feeId; - })!; - - let editCloseModalFunction: () => void; - let editModalElement: HTMLElement; - - function doUpdateFee(submitEvent: SubmitEvent) { - submitEvent.preventDefault(); - - cityssm.postJSON( - los.urlPrefix + "/admin/doUpdateFee", - submitEvent.currentTarget, - (responseJSON: { - success: boolean; - errorMessage?: string; - feeCategories?: recordTypes.FeeCategory[]; - }) => { - if (responseJSON.success) { - feeCategories = responseJSON.feeCategories!; - editCloseModalFunction(); - renderFeeCategories(); - } else { - bulmaJS.alert({ - title: "Error Updating Fee", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - } - - function confirmDeleteFee(clickEvent: Event) { - clickEvent.preventDefault(); - - const doDelete = () => { - cityssm.postJSON( - los.urlPrefix + "/admin/doDeleteFee", - { - feeId - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - feeCategories?: recordTypes.FeeCategory[]; - }) => { - if (responseJSON.success) { - feeCategories = responseJSON.feeCategories!; - editCloseModalFunction(); - renderFeeCategories(); - } else { - bulmaJS.alert({ - title: "Error Deleting Fee", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }; - - bulmaJS.confirm({ - title: "Delete Fee?", - message: "Are you sure you want to delete this fee?", - contextualColorName: "warning", - okButton: { - text: "Yes, Delete the Fee", - callbackFunction: doDelete - } - }); - } - - function toggleFeeFields() { - const feeAmountElement = editModalElement.querySelector( - "#feeEdit--feeAmount" - ) as HTMLInputElement; - - const feeFunctionElement = editModalElement.querySelector( - "#feeEdit--feeFunction" - ) as HTMLSelectElement; - - if (feeFunctionElement.value === "") { - feeFunctionElement.closest(".select")!.classList.remove("is-success"); - - feeAmountElement.classList.add("is-success"); - feeAmountElement.disabled = false; + los.urlPrefix + '/admin/doAddFeeCategory', + submitEvent.currentTarget, + (responseJSON: { + success: boolean + errorMessage?: string + feeCategories: recordTypes.FeeCategory[] + }) => { + if (responseJSON.success) { + feeCategories = responseJSON.feeCategories + addCloseModalFunction() + renderFeeCategories() } else { - feeFunctionElement.closest(".select")!.classList.add("is-success"); - - feeAmountElement.classList.remove("is-success"); - feeAmountElement.disabled = true; + bulmaJS.alert({ + title: 'Error Creating Fee Category', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) } + } + ) + } + + cityssm.openHtmlModal('adminFees-addFeeCategory', { + onshown(modalElement, closeModalFunction) { + bulmaJS.toggleHtmlClipped() + ;( + modalElement.querySelector( + '#feeCategoryAdd--feeCategory' + ) as HTMLInputElement + ).focus() + + addCloseModalFunction = closeModalFunction + modalElement + .querySelector('form')! + .addEventListener('submit', doAddFeeCategory) + }, + onremoved() { + bulmaJS.toggleHtmlClipped() + ;( + document.querySelector( + '#button--addFeeCategory' + ) as HTMLButtonElement + ).focus() } + }) + }) - function toggleTaxFields() { - const taxAmountElement = editModalElement.querySelector( - "#feeEdit--taxAmount" - ) as HTMLInputElement; + function openEditFeeCategory(clickEvent: Event): void { + const feeCategoryId = Number.parseInt( + ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--feeCategory' + ) as HTMLElement + ).dataset.feeCategoryId!, + 10 + ) - const taxPercentageElement = editModalElement.querySelector( - "#feeEdit--taxPercentage" - ) as HTMLInputElement; + const feeCategory = feeCategories.find((currentFeeCategory) => { + return currentFeeCategory.feeCategoryId === feeCategoryId + })! - if (taxPercentageElement.value === "") { - taxPercentageElement.classList.remove("is-success"); + let editCloseModalFunction: () => void - taxAmountElement.classList.add("is-success"); - taxAmountElement.disabled = false; - } else { - taxPercentageElement.classList.add("is-success"); + function doUpdateFeeCategory(submitEvent: SubmitEvent) { + submitEvent.preventDefault() - taxAmountElement.classList.remove("is-success"); - taxAmountElement.disabled = true; - } + cityssm.postJSON( + los.urlPrefix + '/admin/doUpdateFeeCategory', + submitEvent.currentTarget, + (responseJSON: { + success: boolean + errorMessage?: string + feeCategories: recordTypes.FeeCategory[] + }) => { + if (responseJSON.success) { + feeCategories = responseJSON.feeCategories + editCloseModalFunction() + renderFeeCategories() + } else { + bulmaJS.alert({ + title: 'Error Updating Fee Category', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } } - - function toggleQuantityFields() { - const includeQuanitityValue = ( - editModalElement.querySelector("#feeEdit--includeQuantity") as HTMLSelectElement - ).value; - - (editModalElement.querySelector("#feeEdit--quantityUnit") as HTMLInputElement).disabled = - includeQuanitityValue === ""; - } - - cityssm.openHtmlModal("adminFees-editFee", { - onshow(modalElement) { - editModalElement = modalElement; - - (modalElement.querySelector("#feeEdit--feeId") as HTMLInputElement).value = - fee.feeId.toString(); - - const feeCategoryElement = modalElement.querySelector( - "#feeEdit--feeCategoryId" - ) as HTMLSelectElement; - - for (const feeCategory of feeCategories) { - const optionElement = document.createElement("option"); - optionElement.value = feeCategory.feeCategoryId.toString(); - optionElement.textContent = feeCategory.feeCategory!; - - if (feeCategory.feeCategoryId === feeCategoryId) { - optionElement.selected = true; - } - - feeCategoryElement.append(optionElement); - } - - (modalElement.querySelector("#feeEdit--feeName") as HTMLInputElement).value = fee.feeName!; - (modalElement.querySelector("#feeEdit--feeDescription") as HTMLTextAreaElement).value = - fee.feeDescription!; - - const occupancyTypeElement = modalElement.querySelector( - "#feeEdit--occupancyTypeId" - ) as HTMLSelectElement; - - for (const occupancyType of exports.occupancyTypes as recordTypes.OccupancyType[]) { - const optionElement = document.createElement("option"); - optionElement.value = occupancyType.occupancyTypeId.toString(); - optionElement.textContent = occupancyType.occupancyType; - - if (occupancyType.occupancyTypeId === fee.occupancyTypeId) { - optionElement.selected = true; - } - - occupancyTypeElement.append(optionElement); - } - - const lotTypeElement = modalElement.querySelector("#feeEdit--lotTypeId") as HTMLSelectElement; - - for (const lotType of exports.lotTypes as recordTypes.LotType[]) { - const optionElement = document.createElement("option"); - optionElement.value = lotType.lotTypeId.toString(); - optionElement.textContent = lotType.lotType; - - if (lotType.lotTypeId === fee.lotTypeId) { - optionElement.selected = true; - } - - lotTypeElement.append(optionElement); - } - - (modalElement.querySelector("#feeEdit--feeAmount") as HTMLInputElement).value = fee.feeAmount - ? fee.feeAmount.toFixed(2) - : ""; - - modalElement - .querySelector("#feeEdit--feeFunction")! - .addEventListener("change", toggleFeeFields); - - toggleFeeFields(); - - (modalElement.querySelector("#feeEdit--taxAmount") as HTMLInputElement).value = fee.taxAmount - ? fee.taxAmount.toFixed(2) - : ""; - - const taxPercentageElement = modalElement.querySelector( - "#feeEdit--taxPercentage" - ) as HTMLInputElement; - taxPercentageElement.value = fee.taxPercentage ? fee.taxPercentage.toString() : ""; - taxPercentageElement.addEventListener("keyup", toggleTaxFields); - - toggleTaxFields(); - - const includeQuantityElement = modalElement.querySelector( - "#feeEdit--includeQuantity" - ) as HTMLSelectElement; - - if (fee.includeQuantity) { - includeQuantityElement.value = "1"; - } - - includeQuantityElement.addEventListener("change", toggleQuantityFields); - - (modalElement.querySelector("#feeEdit--quantityUnit") as HTMLInputElement).value = - fee.quantityUnit || ""; - - toggleQuantityFields(); - - if (fee.isRequired) { - (modalElement.querySelector("#feeEdit--isRequired") as HTMLSelectElement).value = "1"; - } - - los.populateAliases(modalElement); - }, - onshown(modalElement, closeModalFunction) { - bulmaJS.toggleHtmlClipped(); - - editCloseModalFunction = closeModalFunction; - - modalElement.querySelector("form")!.addEventListener("submit", doUpdateFee); - - bulmaJS.init(modalElement); - - modalElement.querySelector(".button--deleteFee")!.addEventListener("click", confirmDeleteFee); - }, - onremoved: () => { - bulmaJS.toggleHtmlClipped(); - } - }); + ) } - function moveFee(clickEvent: MouseEvent): void { - const buttonElement = clickEvent.currentTarget as HTMLButtonElement; + cityssm.openHtmlModal('adminFees-editFeeCategory', { + onshow(modalElement) { + ;( + modalElement.querySelector( + '#feeCategoryEdit--feeCategoryId' + ) as HTMLInputElement + ).value = feeCategory.feeCategoryId!.toString() + ;( + modalElement.querySelector( + '#feeCategoryEdit--feeCategory' + ) as HTMLInputElement + ).value = feeCategory.feeCategory! + }, + onshown(modalElement, closeModalFunction) { + bulmaJS.toggleHtmlClipped() - const feeContainerElement = buttonElement.closest(".container--fee") as HTMLElement; + editCloseModalFunction = closeModalFunction - const feeId = feeContainerElement.dataset.feeId!; + modalElement + .querySelector('form')! + .addEventListener('submit', doUpdateFeeCategory) + ;( + modalElement.querySelector( + '#feeCategoryEdit--feeCategory' + ) as HTMLInputElement + ).focus() + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped() + } + }) + } + + function confirmDeleteFeeCategory(clickEvent: Event): void { + const feeCategoryId = Number.parseInt( + ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--feeCategory' + ) as HTMLElement + ).dataset.feeCategoryId!, + 10 + ) + + function doDelete() { + cityssm.postJSON( + los.urlPrefix + '/admin/doDeleteFeeCategory', + { + feeCategoryId + }, + (responseJSON: { + success: boolean + errorMessage?: string + feeCategories?: recordTypes.FeeCategory[] + }) => { + if (responseJSON.success) { + feeCategories = responseJSON.feeCategories! + renderFeeCategories() + } else { + bulmaJS.alert({ + title: 'Error Updating Fee Category', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + ) + } + + bulmaJS.confirm({ + title: 'Delete Fee Category?', + message: 'Are you sure you want to delete this fee category?', + contextualColorName: 'warning', + okButton: { + text: 'Yes, Delete the Fee Category', + callbackFunction: doDelete + } + }) + } + + function moveFeeCategory(clickEvent: MouseEvent): void { + const buttonElement = clickEvent.currentTarget as HTMLButtonElement + + const feeCategoryId = ( + buttonElement.closest('.container--feeCategory') as HTMLElement + ).dataset.feeCategoryId! + + cityssm.postJSON( + los.urlPrefix + + '/admin/' + + (buttonElement.dataset.direction === 'up' + ? 'doMoveFeeCategoryUp' + : 'doMoveFeeCategoryDown'), + { + feeCategoryId, + moveToEnd: clickEvent.shiftKey ? '1' : '0' + }, + (responseJSON: { + success: boolean + errorMessage?: string + feeCategories?: recordTypes.FeeCategory[] + }) => { + if (responseJSON.success) { + feeCategories = responseJSON.feeCategories! + renderFeeCategories() + } else { + bulmaJS.alert({ + title: 'Error Moving Fee Category', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + ) + } + + /* + * Fees + */ + + function openAddFee(clickEvent: Event): void { + const feeCategoryId = Number.parseInt( + ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--feeCategory' + ) as HTMLElement + ).dataset.feeCategoryId!, + 10 + ) + + let addCloseModalFunction: () => void + + function doAddFee(submitEvent: SubmitEvent) { + submitEvent.preventDefault() + + cityssm.postJSON( + los.urlPrefix + '/admin/doAddFee', + submitEvent.currentTarget, + (responseJSON: { + success: boolean + errorMessage?: string + feeCategories: recordTypes.FeeCategory[] + }) => { + if (responseJSON.success) { + feeCategories = responseJSON.feeCategories + addCloseModalFunction() + renderFeeCategories() + } else { + bulmaJS.alert({ + title: 'Error Adding Fee', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + ) + } + + cityssm.openHtmlModal('adminFees-addFee', { + onshow(modalElement) { + const feeCategoryElement = modalElement.querySelector( + '#feeAdd--feeCategoryId' + ) as HTMLSelectElement + + for (const feeCategory of feeCategories) { + const optionElement = document.createElement('option') + optionElement.value = feeCategory.feeCategoryId.toString() + optionElement.textContent = feeCategory.feeCategory! + + if (feeCategory.feeCategoryId === feeCategoryId) { + optionElement.selected = true + } + + feeCategoryElement.append(optionElement) + } + + const occupancyTypeElement = modalElement.querySelector( + '#feeAdd--occupancyTypeId' + ) as HTMLSelectElement + + for (const occupancyType of exports.occupancyTypes as recordTypes.OccupancyType[]) { + const optionElement = document.createElement('option') + optionElement.value = occupancyType.occupancyTypeId.toString() + optionElement.textContent = occupancyType.occupancyType + occupancyTypeElement.append(optionElement) + } + + const lotTypeElement = modalElement.querySelector( + '#feeAdd--lotTypeId' + ) as HTMLSelectElement + + for (const lotType of exports.lotTypes as recordTypes.LotType[]) { + const optionElement = document.createElement('option') + optionElement.value = lotType.lotTypeId.toString() + optionElement.textContent = lotType.lotType + lotTypeElement.append(optionElement) + } + + ;( + modalElement.querySelector( + '#feeAdd--taxPercentage' + ) as HTMLInputElement + ).value = (exports.taxPercentageDefault as number).toString() + + los.populateAliases(modalElement) + }, + onshown(modalElement, closeModalFunction) { + bulmaJS.toggleHtmlClipped() + + addCloseModalFunction = closeModalFunction + + modalElement.querySelector('form')!.addEventListener('submit', doAddFee) + + ;( + modalElement.querySelector('#feeAdd--feeName') as HTMLInputElement + ).focus() + + ;( + modalElement.querySelector('#feeAdd--feeFunction') as HTMLInputElement + ).addEventListener('change', () => { + const feeAmountElement = modalElement.querySelector( + '#feeAdd--feeAmount' + ) as HTMLInputElement + + const feeFunctionElement = modalElement.querySelector( + '#feeAdd--feeFunction' + ) as HTMLSelectElement + + if (feeFunctionElement.value === '') { + feeFunctionElement + .closest('.select')! + .classList.remove('is-success') + + feeAmountElement.classList.add('is-success') + feeAmountElement.disabled = false + } else { + feeFunctionElement.closest('.select')!.classList.add('is-success') + + feeAmountElement.classList.remove('is-success') + feeAmountElement.disabled = true + } + }) + + modalElement + .querySelector('#feeAdd--taxPercentage')! + .addEventListener('keyup', () => { + const taxAmountElement = modalElement.querySelector( + '#feeAdd--taxAmount' + ) as HTMLInputElement + + const taxPercentageElement = modalElement.querySelector( + '#feeAdd--taxPercentage' + ) as HTMLInputElement + + if (taxPercentageElement.value === '') { + taxPercentageElement.classList.remove('is-success') + + taxAmountElement.classList.add('is-success') + taxAmountElement.disabled = false + } else { + taxPercentageElement.classList.add('is-success') + + taxAmountElement.classList.remove('is-success') + taxAmountElement.disabled = true + } + }) + + modalElement + .querySelector('#feeAdd--includeQuantity')! + .addEventListener('change', () => { + ;( + modalElement.querySelector( + '#feeAdd--quantityUnit' + ) as HTMLInputElement + ).disabled = + ( + modalElement.querySelector( + '#feeAdd--includeQuantity' + ) as HTMLSelectElement + ).value === '' + }) + }, + onremoved() { + bulmaJS.toggleHtmlClipped() + } + }) + } + + function openEditFee(clickEvent: Event): void { + clickEvent.preventDefault() + + const feeContainerElement = ( + clickEvent.currentTarget as HTMLElement + ).closest('.container--fee') as HTMLElement + + const feeId = Number.parseInt(feeContainerElement.dataset.feeId!, 10) + const feeCategoryId = Number.parseInt( + (feeContainerElement.closest('.container--feeCategory') as HTMLElement) + .dataset.feeCategoryId! + ) + + const feeCategory = feeCategories.find((currentFeeCategory) => { + return currentFeeCategory.feeCategoryId === feeCategoryId + })! + + const fee = feeCategory.fees.find((currentFee) => { + return currentFee.feeId === feeId + })! + + let editCloseModalFunction: () => void + let editModalElement: HTMLElement + + function doUpdateFee(submitEvent: SubmitEvent) { + submitEvent.preventDefault() + + cityssm.postJSON( + los.urlPrefix + '/admin/doUpdateFee', + submitEvent.currentTarget, + (responseJSON: { + success: boolean + errorMessage?: string + feeCategories?: recordTypes.FeeCategory[] + }) => { + if (responseJSON.success) { + feeCategories = responseJSON.feeCategories! + editCloseModalFunction() + renderFeeCategories() + } else { + bulmaJS.alert({ + title: 'Error Updating Fee', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + ) + } + + function confirmDeleteFee(clickEvent: Event) { + clickEvent.preventDefault() + + const doDelete = () => { cityssm.postJSON( - los.urlPrefix + - "/admin/" + - (buttonElement.dataset.direction === "up" ? "doMoveFeeUp" : "doMoveFeeDown"), - { - feeId, - moveToEnd: clickEvent.shiftKey ? "1" : "0" - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - feeCategories?: recordTypes.FeeCategory[]; - }) => { - if (responseJSON.success) { - feeCategories = responseJSON.feeCategories!; - renderFeeCategories(); - } else { - bulmaJS.alert({ - title: "Error Moving Fee", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } + los.urlPrefix + '/admin/doDeleteFee', + { + feeId + }, + (responseJSON: { + success: boolean + errorMessage?: string + feeCategories?: recordTypes.FeeCategory[] + }) => { + if (responseJSON.success) { + feeCategories = responseJSON.feeCategories! + editCloseModalFunction() + renderFeeCategories() + } else { + bulmaJS.alert({ + title: 'Error Deleting Fee', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) } - ); + } + ) + } + + bulmaJS.confirm({ + title: 'Delete Fee?', + message: 'Are you sure you want to delete this fee?', + contextualColorName: 'warning', + okButton: { + text: 'Yes, Delete the Fee', + callbackFunction: doDelete + } + }) } - /* - * Initialize - */ + function toggleFeeFields() { + const feeAmountElement = editModalElement.querySelector( + '#feeEdit--feeAmount' + ) as HTMLInputElement - renderFeeCategories(); -})(); + const feeFunctionElement = editModalElement.querySelector( + '#feeEdit--feeFunction' + ) as HTMLSelectElement + + if (feeFunctionElement.value === '') { + feeFunctionElement.closest('.select')!.classList.remove('is-success') + + feeAmountElement.classList.add('is-success') + feeAmountElement.disabled = false + } else { + feeFunctionElement.closest('.select')!.classList.add('is-success') + + feeAmountElement.classList.remove('is-success') + feeAmountElement.disabled = true + } + } + + function toggleTaxFields() { + const taxAmountElement = editModalElement.querySelector( + '#feeEdit--taxAmount' + ) as HTMLInputElement + + const taxPercentageElement = editModalElement.querySelector( + '#feeEdit--taxPercentage' + ) as HTMLInputElement + + if (taxPercentageElement.value === '') { + taxPercentageElement.classList.remove('is-success') + + taxAmountElement.classList.add('is-success') + taxAmountElement.disabled = false + } else { + taxPercentageElement.classList.add('is-success') + + taxAmountElement.classList.remove('is-success') + taxAmountElement.disabled = true + } + } + + function toggleQuantityFields() { + const includeQuanitityValue = ( + editModalElement.querySelector( + '#feeEdit--includeQuantity' + ) as HTMLSelectElement + ).value + + ;( + editModalElement.querySelector( + '#feeEdit--quantityUnit' + ) as HTMLInputElement + ).disabled = includeQuanitityValue === '' + } + + cityssm.openHtmlModal('adminFees-editFee', { + onshow(modalElement) { + editModalElement = modalElement + + ;( + modalElement.querySelector('#feeEdit--feeId') as HTMLInputElement + ).value = fee.feeId.toString() + + const feeCategoryElement = modalElement.querySelector( + '#feeEdit--feeCategoryId' + ) as HTMLSelectElement + + for (const feeCategory of feeCategories) { + const optionElement = document.createElement('option') + optionElement.value = feeCategory.feeCategoryId.toString() + optionElement.textContent = feeCategory.feeCategory! + + if (feeCategory.feeCategoryId === feeCategoryId) { + optionElement.selected = true + } + + feeCategoryElement.append(optionElement) + } + + ;( + modalElement.querySelector('#feeEdit--feeName') as HTMLInputElement + ).value = fee.feeName! + ;( + modalElement.querySelector( + '#feeEdit--feeDescription' + ) as HTMLTextAreaElement + ).value = fee.feeDescription! + + const occupancyTypeElement = modalElement.querySelector( + '#feeEdit--occupancyTypeId' + ) as HTMLSelectElement + + for (const occupancyType of exports.occupancyTypes as recordTypes.OccupancyType[]) { + const optionElement = document.createElement('option') + optionElement.value = occupancyType.occupancyTypeId.toString() + optionElement.textContent = occupancyType.occupancyType + + if (occupancyType.occupancyTypeId === fee.occupancyTypeId) { + optionElement.selected = true + } + + occupancyTypeElement.append(optionElement) + } + + const lotTypeElement = modalElement.querySelector( + '#feeEdit--lotTypeId' + ) as HTMLSelectElement + + for (const lotType of exports.lotTypes as recordTypes.LotType[]) { + const optionElement = document.createElement('option') + optionElement.value = lotType.lotTypeId.toString() + optionElement.textContent = lotType.lotType + + if (lotType.lotTypeId === fee.lotTypeId) { + optionElement.selected = true + } + + lotTypeElement.append(optionElement) + } + + ;( + modalElement.querySelector('#feeEdit--feeAmount') as HTMLInputElement + ).value = fee.feeAmount ? fee.feeAmount.toFixed(2) : '' + + modalElement + .querySelector('#feeEdit--feeFunction')! + .addEventListener('change', toggleFeeFields) + + toggleFeeFields() + + ;( + modalElement.querySelector('#feeEdit--taxAmount') as HTMLInputElement + ).value = fee.taxAmount ? fee.taxAmount.toFixed(2) : '' + + const taxPercentageElement = modalElement.querySelector( + '#feeEdit--taxPercentage' + ) as HTMLInputElement + taxPercentageElement.value = fee.taxPercentage + ? fee.taxPercentage.toString() + : '' + taxPercentageElement.addEventListener('keyup', toggleTaxFields) + + toggleTaxFields() + + const includeQuantityElement = modalElement.querySelector( + '#feeEdit--includeQuantity' + ) as HTMLSelectElement + + if (fee.includeQuantity) { + includeQuantityElement.value = '1' + } + + includeQuantityElement.addEventListener('change', toggleQuantityFields) + + ;( + modalElement.querySelector( + '#feeEdit--quantityUnit' + ) as HTMLInputElement + ).value = fee.quantityUnit || '' + + toggleQuantityFields() + + if (fee.isRequired) { + ;( + modalElement.querySelector( + '#feeEdit--isRequired' + ) as HTMLSelectElement + ).value = '1' + } + + los.populateAliases(modalElement) + }, + onshown(modalElement, closeModalFunction) { + bulmaJS.toggleHtmlClipped() + + editCloseModalFunction = closeModalFunction + + modalElement + .querySelector('form')! + .addEventListener('submit', doUpdateFee) + + bulmaJS.init(modalElement) + + modalElement + .querySelector('.button--deleteFee')! + .addEventListener('click', confirmDeleteFee) + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped() + } + }) + } + + function moveFee(clickEvent: MouseEvent): void { + const buttonElement = clickEvent.currentTarget as HTMLButtonElement + + const feeContainerElement = buttonElement.closest( + '.container--fee' + ) as HTMLElement + + const feeId = feeContainerElement.dataset.feeId! + + cityssm.postJSON( + los.urlPrefix + + '/admin/' + + (buttonElement.dataset.direction === 'up' + ? 'doMoveFeeUp' + : 'doMoveFeeDown'), + { + feeId, + moveToEnd: clickEvent.shiftKey ? '1' : '0' + }, + (responseJSON: { + success: boolean + errorMessage?: string + feeCategories?: recordTypes.FeeCategory[] + }) => { + if (responseJSON.success) { + feeCategories = responseJSON.feeCategories! + renderFeeCategories() + } else { + bulmaJS.alert({ + title: 'Error Moving Fee', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + ) + } + + /* + * Initialize + */ + + renderFeeCategories() +})() diff --git a/public-typescript/adminLotTypes.js b/public-typescript/adminLotTypes.js index 07758065..1761c6bb 100644 --- a/public-typescript/adminLotTypes.js +++ b/public-typescript/adminLotTypes.js @@ -3,13 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; - const containerElement = document.querySelector("#container--lotTypes"); + const containerElement = document.querySelector('#container--lotTypes'); let lotTypes = exports.lotTypes; delete exports.lotTypes; const expandedLotTypes = new Set(); function toggleLotTypeFields(clickEvent) { const toggleButtonElement = clickEvent.currentTarget; - const lotTypeElement = toggleButtonElement.closest(".container--lotType"); + const lotTypeElement = toggleButtonElement.closest('.container--lotType'); const lotTypeId = Number.parseInt(lotTypeElement.dataset.lotTypeId, 10); if (expandedLotTypes.has(lotTypeId)) { expandedLotTypes.delete(lotTypeId); @@ -20,9 +20,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); toggleButtonElement.innerHTML = expandedLotTypes.has(lotTypeId) ? '' : ''; - const panelBlockElements = lotTypeElement.querySelectorAll(".panel-block"); + const panelBlockElements = lotTypeElement.querySelectorAll('.panel-block'); for (const panelBlockElement of panelBlockElements) { - panelBlockElement.classList.toggle("is-hidden"); + panelBlockElement.classList.toggle('is-hidden'); } } function lotTypeResponseHandler(responseJSON) { @@ -33,23 +33,22 @@ Object.defineProperty(exports, "__esModule", { value: true }); else { bulmaJS.alert({ title: `Error Updating ${exports.aliases.lot} Type`, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } } function deleteLotType(clickEvent) { - const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--lotType").dataset - .lotTypeId, 10); + const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotType').dataset.lotTypeId, 10); function doDelete() { - cityssm.postJSON(los.urlPrefix + "/admin/doDeleteLotType", { + cityssm.postJSON(los.urlPrefix + '/admin/doDeleteLotType', { lotTypeId }, lotTypeResponseHandler); } bulmaJS.confirm({ title: `Delete ${exports.aliases.lot} Type`, message: `Are you sure you want to delete this ${exports.aliases.lot.toLowerCase()} type?`, - contextualColorName: "warning", + contextualColorName: 'warning', okButton: { text: `Yes, Delete ${exports.aliases.lot} Type`, callbackFunction: doDelete @@ -57,33 +56,30 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); } function openEditLotType(clickEvent) { - const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--lotType").dataset - .lotTypeId, 10); + const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotType').dataset.lotTypeId, 10); const lotType = lotTypes.find((currentLotType) => { return lotTypeId === currentLotType.lotTypeId; }); let editCloseModalFunction; const doEdit = (submitEvent) => { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/admin/doUpdateLotType", submitEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doUpdateLotType', submitEvent.currentTarget, (responseJSON) => { lotTypeResponseHandler(responseJSON); if (responseJSON.success) { editCloseModalFunction(); } }); }; - cityssm.openHtmlModal("adminLotTypes-editLotType", { + cityssm.openHtmlModal('adminLotTypes-editLotType', { onshow(modalElement) { los.populateAliases(modalElement); - modalElement.querySelector("#lotTypeEdit--lotTypeId").value = - lotTypeId.toString(); - modalElement.querySelector("#lotTypeEdit--lotType").value = - lotType.lotType; + modalElement.querySelector('#lotTypeEdit--lotTypeId').value = lotTypeId.toString(); + modalElement.querySelector('#lotTypeEdit--lotType').value = lotType.lotType; }, onshown(modalElement, closeModalFunction) { editCloseModalFunction = closeModalFunction; - modalElement.querySelector("#lotTypeEdit--lotType").focus(); - modalElement.querySelector("form").addEventListener("submit", doEdit); + modalElement.querySelector('#lotTypeEdit--lotType').focus(); + modalElement.querySelector('form').addEventListener('submit', doEdit); bulmaJS.toggleHtmlClipped(); }, onremoved() { @@ -92,12 +88,11 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); } function openAddLotTypeField(clickEvent) { - const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--lotType").dataset - .lotTypeId, 10); + const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotType').dataset.lotTypeId, 10); let addCloseModalFunction; const doAdd = (submitEvent) => { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/admin/doAddLotTypeField", submitEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doAddLotTypeField', submitEvent.currentTarget, (responseJSON) => { expandedLotTypes.add(lotTypeId); lotTypeResponseHandler(responseJSON); if (responseJSON.success) { @@ -106,18 +101,18 @@ Object.defineProperty(exports, "__esModule", { value: true }); } }); }; - cityssm.openHtmlModal("adminLotTypes-addLotTypeField", { + cityssm.openHtmlModal('adminLotTypes-addLotTypeField', { onshow(modalElement) { los.populateAliases(modalElement); if (lotTypeId) { - modalElement.querySelector("#lotTypeFieldAdd--lotTypeId").value = - lotTypeId.toString(); + ; + modalElement.querySelector('#lotTypeFieldAdd--lotTypeId').value = lotTypeId.toString(); } }, onshown(modalElement, closeModalFunction) { addCloseModalFunction = closeModalFunction; - modalElement.querySelector("#lotTypeFieldAdd--lotTypeField").focus(); - modalElement.querySelector("form").addEventListener("submit", doAdd); + modalElement.querySelector('#lotTypeFieldAdd--lotTypeField').focus(); + modalElement.querySelector('form').addEventListener('submit', doAdd); bulmaJS.toggleHtmlClipped(); }, onremoved() { @@ -127,12 +122,14 @@ Object.defineProperty(exports, "__esModule", { value: true }); } function moveLotType(clickEvent) { const buttonElement = clickEvent.currentTarget; - const lotTypeId = buttonElement.closest(".container--lotType").dataset.lotTypeId; + const lotTypeId = buttonElement.closest('.container--lotType').dataset.lotTypeId; cityssm.postJSON(los.urlPrefix + - "/admin/" + - (buttonElement.dataset.direction === "up" ? "doMoveLotTypeUp" : "doMoveLotTypeDown"), { + '/admin/' + + (buttonElement.dataset.direction === 'up' + ? 'doMoveLotTypeUp' + : 'doMoveLotTypeDown'), { lotTypeId, - moveToEnd: clickEvent.shiftKey ? "1" : "0" + moveToEnd: clickEvent.shiftKey ? '1' : '0' }, lotTypeResponseHandler); } function openEditLotTypeField(lotTypeId, lotTypeFieldId) { @@ -151,7 +148,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); maximumLengthElement.min = minimumLengthElement.value; } function toggleInputFields() { - if (lotTypeFieldValuesElement.value === "") { + if (lotTypeFieldValuesElement.value === '') { minimumLengthElement.disabled = false; maximumLengthElement.disabled = false; patternElement.disabled = false; @@ -164,7 +161,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); } function doUpdate(submitEvent) { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/admin/doUpdateLotTypeField", submitEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doUpdateLotTypeField', submitEvent.currentTarget, (responseJSON) => { lotTypeResponseHandler(responseJSON); if (responseJSON.success) { editCloseModalFunction(); @@ -172,7 +169,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); } function doDelete() { - cityssm.postJSON(los.urlPrefix + "/admin/doDeleteLotTypeField", { + cityssm.postJSON(los.urlPrefix + '/admin/doDeleteLotTypeField', { lotTypeFieldId }, (responseJSON) => { lotTypeResponseHandler(responseJSON); @@ -183,31 +180,28 @@ Object.defineProperty(exports, "__esModule", { value: true }); } function confirmDoDelete() { bulmaJS.confirm({ - 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.", - contextualColorName: "warning", + 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.', + contextualColorName: 'warning', okButton: { - text: "Yes, Delete Field", + text: 'Yes, Delete Field', callbackFunction: doDelete } }); } - cityssm.openHtmlModal("adminLotTypes-editLotTypeField", { + cityssm.openHtmlModal('adminLotTypes-editLotTypeField', { onshow(modalElement) { los.populateAliases(modalElement); - modalElement.querySelector("#lotTypeFieldEdit--lotTypeFieldId").value = - lotTypeField.lotTypeFieldId.toString(); - modalElement.querySelector("#lotTypeFieldEdit--lotTypeField").value = - lotTypeField.lotTypeField; - modalElement.querySelector("#lotTypeFieldEdit--isRequired").value = - lotTypeField.isRequired ? "1" : "0"; - minimumLengthElement = modalElement.querySelector("#lotTypeFieldEdit--minimumLength"); + modalElement.querySelector('#lotTypeFieldEdit--lotTypeFieldId').value = lotTypeField.lotTypeFieldId.toString(); + modalElement.querySelector('#lotTypeFieldEdit--lotTypeField').value = lotTypeField.lotTypeField; + modalElement.querySelector('#lotTypeFieldEdit--isRequired').value = lotTypeField.isRequired ? '1' : '0'; + minimumLengthElement = modalElement.querySelector('#lotTypeFieldEdit--minimumLength'); minimumLengthElement.value = lotTypeField.minimumLength.toString(); - maximumLengthElement = modalElement.querySelector("#lotTypeFieldEdit--maximumLength"); + maximumLengthElement = modalElement.querySelector('#lotTypeFieldEdit--maximumLength'); maximumLengthElement.value = lotTypeField.maximumLength.toString(); - patternElement = modalElement.querySelector("#lotTypeFieldEdit--pattern"); + patternElement = modalElement.querySelector('#lotTypeFieldEdit--pattern'); patternElement.value = lotTypeField.pattern; - lotTypeFieldValuesElement = modalElement.querySelector("#lotTypeFieldEdit--lotTypeFieldValues"); + lotTypeFieldValuesElement = modalElement.querySelector('#lotTypeFieldEdit--lotTypeFieldValues'); lotTypeFieldValuesElement.value = lotTypeField.lotTypeFieldValues; toggleInputFields(); }, @@ -216,13 +210,13 @@ Object.defineProperty(exports, "__esModule", { value: true }); bulmaJS.init(modalElement); bulmaJS.toggleHtmlClipped(); cityssm.enableNavBlocker(); - modalElement.querySelector("form").addEventListener("submit", doUpdate); - minimumLengthElement.addEventListener("keyup", updateMaximumLengthMin); + modalElement.querySelector('form').addEventListener('submit', doUpdate); + minimumLengthElement.addEventListener('keyup', updateMaximumLengthMin); updateMaximumLengthMin(); - lotTypeFieldValuesElement.addEventListener("keyup", toggleInputFields); + lotTypeFieldValuesElement.addEventListener('keyup', toggleInputFields); modalElement - .querySelector("#button--deleteLotTypeField") - .addEventListener("click", confirmDoDelete); + .querySelector('#button--deleteLotTypeField') + .addEventListener('click', confirmDoDelete); }, onremoved() { bulmaJS.toggleHtmlClipped(); @@ -232,78 +226,77 @@ Object.defineProperty(exports, "__esModule", { value: true }); } function openEditLotTypeFieldByClick(clickEvent) { clickEvent.preventDefault(); - const lotTypeFieldId = Number.parseInt(clickEvent.currentTarget.closest(".container--lotTypeField") - .dataset.lotTypeFieldId, 10); - const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--lotType").dataset - .lotTypeId, 10); + const lotTypeFieldId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotTypeField').dataset.lotTypeFieldId, 10); + const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotType').dataset.lotTypeId, 10); openEditLotTypeField(lotTypeId, lotTypeFieldId); } function moveLotTypeField(clickEvent) { const buttonElement = clickEvent.currentTarget; - const lotTypeFieldId = buttonElement.closest(".container--lotTypeField").dataset - .lotTypeFieldId; + const lotTypeFieldId = buttonElement.closest('.container--lotTypeField').dataset.lotTypeFieldId; cityssm.postJSON(los.urlPrefix + - "/admin/" + - (buttonElement.dataset.direction === "up" - ? "doMoveLotTypeFieldUp" - : "doMoveLotTypeFieldDown"), { + '/admin/' + + (buttonElement.dataset.direction === 'up' + ? 'doMoveLotTypeFieldUp' + : 'doMoveLotTypeFieldDown'), { lotTypeFieldId, - moveToEnd: clickEvent.shiftKey ? "1" : "0" + moveToEnd: clickEvent.shiftKey ? '1' : '0' }, lotTypeResponseHandler); } function renderLotTypeFields(panelElement, lotTypeId, lotTypeFields) { if (lotTypeFields.length === 0) { - panelElement.insertAdjacentHTML("beforeend", '
' + '
' + '

There are no additional fields.

' + - "
" + - "
"); + '
' + + ''); } else { for (const lotTypeField of lotTypeFields) { - const panelBlockElement = document.createElement("div"); - panelBlockElement.className = "panel-block is-block container--lotTypeField"; + const panelBlockElement = document.createElement('div'); + panelBlockElement.className = + 'panel-block is-block container--lotTypeField'; 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 = '
' + '" + + cityssm.escapeHTML(lotTypeField.lotTypeField || '') + + '' + + '
') + + '' + '
' + ('
' + - los.getMoveUpDownButtonFieldHTML("button--moveLotTypeFieldUp", "button--moveLotTypeFieldDown") + - "
") + - "
" + - ""; + los.getMoveUpDownButtonFieldHTML('button--moveLotTypeFieldUp', 'button--moveLotTypeFieldDown') + + '') + + '' + + ''; panelBlockElement - .querySelector(".button--editLotTypeField") - .addEventListener("click", openEditLotTypeFieldByClick); - panelBlockElement.querySelector(".button--moveLotTypeFieldUp").addEventListener("click", moveLotTypeField); - panelBlockElement.querySelector(".button--moveLotTypeFieldDown").addEventListener("click", moveLotTypeField); + .querySelector('.button--editLotTypeField') + .addEventListener('click', openEditLotTypeFieldByClick); + panelBlockElement.querySelector('.button--moveLotTypeFieldUp').addEventListener('click', moveLotTypeField); + panelBlockElement.querySelector('.button--moveLotTypeFieldDown').addEventListener('click', moveLotTypeField); panelElement.append(panelBlockElement); } } } function renderLotTypes() { - containerElement.innerHTML = ""; + containerElement.innerHTML = ''; if (lotTypes.length === 0) { - containerElement.insertAdjacentHTML("afterbegin", `

There are no active ${los.escapedAliases.lot} types.

`); return; } for (const lotType of lotTypes) { - const lotTypeContainer = document.createElement("div"); - lotTypeContainer.className = "panel container--lotType"; + const lotTypeContainer = document.createElement('div'); + lotTypeContainer.className = 'panel container--lotType'; lotTypeContainer.dataset.lotTypeId = lotType.lotTypeId.toString(); lotTypeContainer.innerHTML = '
' + @@ -314,64 +307,66 @@ Object.defineProperty(exports, "__esModule", { value: true }); (expandedLotTypes.has(lotType.lotTypeId) ? '' : '') + - "" + - "
" + + '' + + '' + '
' + '

' + cityssm.escapeHTML(lotType.lotType) + - "

" + - "
" + - "") + + '' + + '' + + '') + ('
' + ('
' + '" + - "
") + + 'Delete' + + '' + + '
') + ('
' + '" + - "
") + + ' Type' + + '' + + '') + ('
' + '" + - "
") + + 'Add Field' + + '' + + '') + ('
' + - los.getMoveUpDownButtonFieldHTML("button--moveLotTypeUp", "button--moveLotTypeDown") + - "
") + - "") + - "" + - ""; + los.getMoveUpDownButtonFieldHTML('button--moveLotTypeUp', 'button--moveLotTypeDown') + + '') + + '') + + '' + + ''; renderLotTypeFields(lotTypeContainer, lotType.lotTypeId, lotType.lotTypeFields); lotTypeContainer - .querySelector(".button--toggleLotTypeFields") - .addEventListener("click", toggleLotTypeFields); + .querySelector('.button--toggleLotTypeFields') + .addEventListener('click', toggleLotTypeFields); lotTypeContainer - .querySelector(".button--deleteLotType") - .addEventListener("click", deleteLotType); + .querySelector('.button--deleteLotType') + .addEventListener('click', deleteLotType); lotTypeContainer - .querySelector(".button--editLotType") - .addEventListener("click", openEditLotType); + .querySelector('.button--editLotType') + .addEventListener('click', openEditLotType); lotTypeContainer - .querySelector(".button--addLotTypeField") - .addEventListener("click", openAddLotTypeField); - lotTypeContainer.querySelector(".button--moveLotTypeUp").addEventListener("click", moveLotType); - lotTypeContainer.querySelector(".button--moveLotTypeDown").addEventListener("click", moveLotType); + .querySelector('.button--addLotTypeField') + .addEventListener('click', openAddLotTypeField); + lotTypeContainer.querySelector('.button--moveLotTypeUp').addEventListener('click', moveLotType); + lotTypeContainer.querySelector('.button--moveLotTypeDown').addEventListener('click', moveLotType); containerElement.append(lotTypeContainer); } } - document.querySelector("#button--addLotType").addEventListener("click", () => { + document + .querySelector('#button--addLotType') + .addEventListener('click', () => { let addCloseModalFunction; function doAdd(submitEvent) { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/admin/doAddLotType", submitEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doAddLotType', submitEvent.currentTarget, (responseJSON) => { if (responseJSON.success) { addCloseModalFunction(); lotTypes = responseJSON.lotTypes; @@ -380,20 +375,20 @@ Object.defineProperty(exports, "__esModule", { value: true }); else { bulmaJS.alert({ title: `Error Adding ${los.escapedAliases.Lot} Type`, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); } - cityssm.openHtmlModal("adminLotTypes-addLotType", { + cityssm.openHtmlModal('adminLotTypes-addLotType', { onshow(modalElement) { los.populateAliases(modalElement); }, onshown(modalElement, closeModalFunction) { addCloseModalFunction = closeModalFunction; - modalElement.querySelector("#lotTypeAdd--lotType").focus(); - modalElement.querySelector("form").addEventListener("submit", doAdd); + modalElement.querySelector('#lotTypeAdd--lotType').focus(); + modalElement.querySelector('form').addEventListener('submit', doAdd); bulmaJS.toggleHtmlClipped(); }, onremoved() { diff --git a/public-typescript/adminLotTypes.ts b/public-typescript/adminLotTypes.ts index 38b062b9..0a77af57 100644 --- a/public-typescript/adminLotTypes.ts +++ b/public-typescript/adminLotTypes.ts @@ -1,614 +1,688 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ -import type * as globalTypes from "../types/globalTypes"; -import type * as recordTypes from "../types/recordTypes"; +import type * as globalTypes from '../types/globalTypes' +import type * as recordTypes from '../types/recordTypes' -import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; +import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types' -import type { BulmaJS } from "@cityssm/bulma-js/types"; +import type { BulmaJS } from '@cityssm/bulma-js/types' -declare const cityssm: cityssmGlobal; -declare const bulmaJS: BulmaJS; +declare const cityssm: cityssmGlobal +declare const bulmaJS: BulmaJS -(() => { - const los = exports.los as globalTypes.LOS; +;(() => { + const los = exports.los as globalTypes.LOS - const containerElement = document.querySelector("#container--lotTypes") as HTMLElement; + const containerElement = document.querySelector( + '#container--lotTypes' + ) as HTMLElement - let lotTypes: recordTypes.LotType[] = exports.lotTypes; - delete exports.lotTypes; + let lotTypes: recordTypes.LotType[] = exports.lotTypes + delete exports.lotTypes - const expandedLotTypes = new Set(); + const expandedLotTypes = new Set() - function toggleLotTypeFields(clickEvent: Event) { - const toggleButtonElement = clickEvent.currentTarget as HTMLButtonElement; + function toggleLotTypeFields(clickEvent: Event) { + const toggleButtonElement = clickEvent.currentTarget as HTMLButtonElement - const lotTypeElement = toggleButtonElement.closest(".container--lotType") as HTMLElement; + const lotTypeElement = toggleButtonElement.closest( + '.container--lotType' + ) as HTMLElement - const lotTypeId = Number.parseInt(lotTypeElement.dataset.lotTypeId!, 10); + const lotTypeId = Number.parseInt(lotTypeElement.dataset.lotTypeId!, 10) - if (expandedLotTypes.has(lotTypeId)) { - expandedLotTypes.delete(lotTypeId); - } else { - expandedLotTypes.add(lotTypeId); - } - - toggleButtonElement.innerHTML = expandedLotTypes.has(lotTypeId) - ? '' - : ''; - - const panelBlockElements = lotTypeElement.querySelectorAll(".panel-block"); - - for (const panelBlockElement of panelBlockElements) { - panelBlockElement.classList.toggle("is-hidden"); - } + if (expandedLotTypes.has(lotTypeId)) { + expandedLotTypes.delete(lotTypeId) + } else { + expandedLotTypes.add(lotTypeId) } - function lotTypeResponseHandler(responseJSON: { - success: boolean; - errorMessage?: string; - lotTypes?: recordTypes.LotType[]; - }) { - if (responseJSON.success) { - lotTypes = responseJSON.lotTypes!; - renderLotTypes(); - } else { - bulmaJS.alert({ - title: `Error Updating ${exports.aliases.lot} Type`, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } + toggleButtonElement.innerHTML = expandedLotTypes.has(lotTypeId) + ? '' + : '' + + const panelBlockElements = lotTypeElement.querySelectorAll('.panel-block') + + for (const panelBlockElement of panelBlockElements) { + panelBlockElement.classList.toggle('is-hidden') + } + } + + function lotTypeResponseHandler(responseJSON: { + success: boolean + errorMessage?: string + lotTypes?: recordTypes.LotType[] + }) { + if (responseJSON.success) { + lotTypes = responseJSON.lotTypes! + renderLotTypes() + } else { + bulmaJS.alert({ + title: `Error Updating ${exports.aliases.lot} Type`, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + + function deleteLotType(clickEvent: Event) { + const lotTypeId = Number.parseInt( + ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--lotType' + ) as HTMLElement + ).dataset.lotTypeId!, + 10 + ) + + function doDelete() { + cityssm.postJSON( + los.urlPrefix + '/admin/doDeleteLotType', + { + lotTypeId + }, + lotTypeResponseHandler + ) } - function deleteLotType(clickEvent: Event) { - const lotTypeId = Number.parseInt( - ((clickEvent.currentTarget as HTMLElement).closest(".container--lotType") as HTMLElement).dataset - .lotTypeId!, - 10 - ); + bulmaJS.confirm({ + title: `Delete ${exports.aliases.lot} Type`, + message: `Are you sure you want to delete this ${exports.aliases.lot.toLowerCase()} type?`, + contextualColorName: 'warning', + okButton: { + text: `Yes, Delete ${exports.aliases.lot} Type`, + callbackFunction: doDelete + } + }) + } - function doDelete() { - cityssm.postJSON( - los.urlPrefix + "/admin/doDeleteLotType", - { - lotTypeId - }, - lotTypeResponseHandler - ); + function openEditLotType(clickEvent: Event) { + const lotTypeId = Number.parseInt( + ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--lotType' + ) as HTMLElement + ).dataset.lotTypeId!, + 10 + ) + + const lotType = lotTypes.find((currentLotType) => { + return lotTypeId === currentLotType.lotTypeId + })! + + let editCloseModalFunction: () => void + + const doEdit = (submitEvent: SubmitEvent) => { + submitEvent.preventDefault() + + cityssm.postJSON( + los.urlPrefix + '/admin/doUpdateLotType', + submitEvent.currentTarget, + (responseJSON: { + success: boolean + errorMessage?: string + occupancyTypes?: recordTypes.OccupancyType[] + }) => { + lotTypeResponseHandler(responseJSON) + if (responseJSON.success) { + editCloseModalFunction() + } + } + ) + } + + cityssm.openHtmlModal('adminLotTypes-editLotType', { + onshow(modalElement) { + los.populateAliases(modalElement) + + ;( + modalElement.querySelector( + '#lotTypeEdit--lotTypeId' + ) as HTMLInputElement + ).value = lotTypeId.toString() + + ;( + modalElement.querySelector( + '#lotTypeEdit--lotType' + ) as HTMLInputElement + ).value = lotType.lotType + }, + onshown(modalElement, closeModalFunction) { + editCloseModalFunction = closeModalFunction + + ;( + modalElement.querySelector( + '#lotTypeEdit--lotType' + ) as HTMLInputElement + ).focus() + + modalElement.querySelector('form')!.addEventListener('submit', doEdit) + + bulmaJS.toggleHtmlClipped() + }, + onremoved() { + bulmaJS.toggleHtmlClipped() + } + }) + } + + function openAddLotTypeField(clickEvent: Event) { + const lotTypeId = Number.parseInt( + ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--lotType' + ) as HTMLElement + ).dataset.lotTypeId!, + 10 + ) + + let addCloseModalFunction: () => void + + const doAdd = (submitEvent: SubmitEvent) => { + submitEvent.preventDefault() + + cityssm.postJSON( + los.urlPrefix + '/admin/doAddLotTypeField', + submitEvent.currentTarget, + (responseJSON: { + success: boolean + errorMessage?: string + lotTypes?: recordTypes.LotType[] + lotTypeFieldId?: number + }) => { + expandedLotTypes.add(lotTypeId) + lotTypeResponseHandler(responseJSON) + + if (responseJSON.success) { + addCloseModalFunction() + openEditLotTypeField(lotTypeId, responseJSON.lotTypeFieldId!) + } + } + ) + } + + cityssm.openHtmlModal('adminLotTypes-addLotTypeField', { + onshow(modalElement) { + los.populateAliases(modalElement) + + if (lotTypeId) { + ;( + modalElement.querySelector( + '#lotTypeFieldAdd--lotTypeId' + ) as HTMLInputElement + ).value = lotTypeId.toString() + } + }, + onshown(modalElement, closeModalFunction) { + addCloseModalFunction = closeModalFunction + + ;( + modalElement.querySelector( + '#lotTypeFieldAdd--lotTypeField' + ) as HTMLInputElement + ).focus() + + modalElement.querySelector('form')!.addEventListener('submit', doAdd) + + bulmaJS.toggleHtmlClipped() + }, + onremoved() { + bulmaJS.toggleHtmlClipped() + } + }) + } + + function moveLotType(clickEvent: MouseEvent) { + const buttonElement = clickEvent.currentTarget as HTMLButtonElement + + const lotTypeId = ( + buttonElement.closest('.container--lotType') as HTMLElement + ).dataset.lotTypeId + + cityssm.postJSON( + los.urlPrefix + + '/admin/' + + (buttonElement.dataset.direction === 'up' + ? 'doMoveLotTypeUp' + : 'doMoveLotTypeDown'), + { + lotTypeId, + moveToEnd: clickEvent.shiftKey ? '1' : '0' + }, + lotTypeResponseHandler + ) + } + + function openEditLotTypeField(lotTypeId: number, lotTypeFieldId: number) { + const lotType = lotTypes.find((currentLotType) => { + return currentLotType.lotTypeId === lotTypeId + })! + + const lotTypeField = lotType.lotTypeFields!.find((currentLotTypeField) => { + return currentLotTypeField.lotTypeFieldId === lotTypeFieldId + })! + + let minimumLengthElement: HTMLInputElement + let maximumLengthElement: HTMLInputElement + let patternElement: HTMLInputElement + let lotTypeFieldValuesElement: HTMLTextAreaElement + + let editCloseModalFunction: () => void + + function updateMaximumLengthMin() { + maximumLengthElement.min = minimumLengthElement.value + } + + function toggleInputFields() { + if (lotTypeFieldValuesElement.value === '') { + minimumLengthElement.disabled = false + maximumLengthElement.disabled = false + patternElement.disabled = false + } else { + minimumLengthElement.disabled = true + maximumLengthElement.disabled = true + patternElement.disabled = true + } + } + + function doUpdate(submitEvent: SubmitEvent) { + submitEvent.preventDefault() + + cityssm.postJSON( + los.urlPrefix + '/admin/doUpdateLotTypeField', + submitEvent.currentTarget, + (responseJSON: { + success: boolean + errorMessage?: string + occupancyTypes?: recordTypes.OccupancyType[] + }) => { + lotTypeResponseHandler(responseJSON) + if (responseJSON.success) { + editCloseModalFunction() + } + } + ) + } + + function doDelete() { + cityssm.postJSON( + los.urlPrefix + '/admin/doDeleteLotTypeField', + { + lotTypeFieldId + }, + (responseJSON: { + success: boolean + errorMessage?: string + lotTypes?: recordTypes.LotType[] + }) => { + lotTypeResponseHandler(responseJSON) + if (responseJSON.success) { + editCloseModalFunction() + } + } + ) + } + + function confirmDoDelete() { + bulmaJS.confirm({ + 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.', + contextualColorName: 'warning', + okButton: { + text: 'Yes, Delete Field', + callbackFunction: doDelete + } + }) + } + + cityssm.openHtmlModal('adminLotTypes-editLotTypeField', { + onshow(modalElement) { + los.populateAliases(modalElement) + + ;( + modalElement.querySelector( + '#lotTypeFieldEdit--lotTypeFieldId' + ) as HTMLInputElement + ).value = lotTypeField.lotTypeFieldId.toString() + + ;( + modalElement.querySelector( + '#lotTypeFieldEdit--lotTypeField' + ) as HTMLInputElement + ).value = lotTypeField.lotTypeField! + + ;( + modalElement.querySelector( + '#lotTypeFieldEdit--isRequired' + ) as HTMLSelectElement + ).value = lotTypeField.isRequired ? '1' : '0' + + minimumLengthElement = modalElement.querySelector( + '#lotTypeFieldEdit--minimumLength' + ) as HTMLInputElement + + minimumLengthElement.value = lotTypeField.minimumLength!.toString() + + maximumLengthElement = modalElement.querySelector( + '#lotTypeFieldEdit--maximumLength' + ) as HTMLInputElement + + maximumLengthElement.value = lotTypeField.maximumLength!.toString() + + patternElement = modalElement.querySelector( + '#lotTypeFieldEdit--pattern' + ) as HTMLInputElement + + patternElement.value = lotTypeField.pattern! + + lotTypeFieldValuesElement = modalElement.querySelector( + '#lotTypeFieldEdit--lotTypeFieldValues' + ) as HTMLTextAreaElement + + lotTypeFieldValuesElement.value = lotTypeField.lotTypeFieldValues! + + toggleInputFields() + }, + onshown(modalElement, closeModalFunction) { + editCloseModalFunction = closeModalFunction + + bulmaJS.init(modalElement) + bulmaJS.toggleHtmlClipped() + cityssm.enableNavBlocker() + + modalElement.querySelector('form')!.addEventListener('submit', doUpdate) + + minimumLengthElement.addEventListener('keyup', updateMaximumLengthMin) + updateMaximumLengthMin() + + lotTypeFieldValuesElement.addEventListener('keyup', toggleInputFields) + + modalElement + .querySelector('#button--deleteLotTypeField')! + .addEventListener('click', confirmDoDelete) + }, + onremoved() { + bulmaJS.toggleHtmlClipped() + cityssm.disableNavBlocker() + } + }) + } + + function openEditLotTypeFieldByClick(clickEvent: Event) { + clickEvent.preventDefault() + + const lotTypeFieldId = Number.parseInt( + ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--lotTypeField' + ) as HTMLElement + ).dataset.lotTypeFieldId!, + 10 + ) + + const lotTypeId = Number.parseInt( + ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--lotType' + ) as HTMLElement + ).dataset.lotTypeId!, + 10 + ) + + openEditLotTypeField(lotTypeId, lotTypeFieldId) + } + + function moveLotTypeField(clickEvent: MouseEvent) { + const buttonElement = clickEvent.currentTarget as HTMLButtonElement + + const lotTypeFieldId = ( + buttonElement.closest('.container--lotTypeField') as HTMLElement + ).dataset.lotTypeFieldId + + cityssm.postJSON( + los.urlPrefix + + '/admin/' + + (buttonElement.dataset.direction === 'up' + ? 'doMoveLotTypeFieldUp' + : 'doMoveLotTypeFieldDown'), + { + lotTypeFieldId, + moveToEnd: clickEvent.shiftKey ? '1' : '0' + }, + lotTypeResponseHandler + ) + } + + function renderLotTypeFields( + panelElement: HTMLElement, + lotTypeId: number, + lotTypeFields: recordTypes.LotTypeField[] + ) { + if (lotTypeFields.length === 0) { + panelElement.insertAdjacentHTML( + 'beforeend', + '
' + + '
' + + '

There are no additional fields.

' + + '
' + + '
' + ) + } else { + for (const lotTypeField of lotTypeFields) { + const panelBlockElement = document.createElement('div') + panelBlockElement.className = + 'panel-block is-block container--lotTypeField' + + if (!expandedLotTypes.has(lotTypeId)) { + panelBlockElement.classList.add('is-hidden') } - bulmaJS.confirm({ - title: `Delete ${exports.aliases.lot} Type`, - message: `Are you sure you want to delete this ${exports.aliases.lot.toLowerCase()} type?`, - contextualColorName: "warning", - okButton: { - text: `Yes, Delete ${exports.aliases.lot} Type`, - callbackFunction: doDelete - } - }); + panelBlockElement.dataset.lotTypeFieldId = + lotTypeField.lotTypeFieldId.toString() + + panelBlockElement.innerHTML = + '
' + + '' + + '
' + + ('
' + + los.getMoveUpDownButtonFieldHTML( + 'button--moveLotTypeFieldUp', + 'button--moveLotTypeFieldDown' + ) + + '
') + + '
' + + '
' + + panelBlockElement + .querySelector('.button--editLotTypeField')! + .addEventListener('click', openEditLotTypeFieldByClick) + + ;( + panelBlockElement.querySelector( + '.button--moveLotTypeFieldUp' + ) as HTMLButtonElement + ).addEventListener('click', moveLotTypeField) + + ;( + panelBlockElement.querySelector( + '.button--moveLotTypeFieldDown' + ) as HTMLButtonElement + ).addEventListener('click', moveLotTypeField) + + panelElement.append(panelBlockElement) + } } + } - function openEditLotType(clickEvent: Event) { - const lotTypeId = Number.parseInt( - ((clickEvent.currentTarget as HTMLElement).closest(".container--lotType") as HTMLElement).dataset - .lotTypeId!, - 10 - ); + function renderLotTypes() { + containerElement.innerHTML = '' - const lotType = lotTypes.find((currentLotType) => { - return lotTypeId === currentLotType.lotTypeId; - })!; - - let editCloseModalFunction: () => void; - - const doEdit = (submitEvent: SubmitEvent) => { - submitEvent.preventDefault(); - - cityssm.postJSON( - los.urlPrefix + "/admin/doUpdateLotType", - submitEvent.currentTarget, - (responseJSON: { - success: boolean; - errorMessage?: string; - occupancyTypes?: recordTypes.OccupancyType[]; - }) => { - lotTypeResponseHandler(responseJSON); - if (responseJSON.success) { - editCloseModalFunction(); - } - } - ); - }; - - cityssm.openHtmlModal("adminLotTypes-editLotType", { - onshow(modalElement) { - los.populateAliases(modalElement); - - (modalElement.querySelector("#lotTypeEdit--lotTypeId") as HTMLInputElement).value = - lotTypeId.toString(); - - (modalElement.querySelector("#lotTypeEdit--lotType") as HTMLInputElement).value = - lotType.lotType; - }, - onshown(modalElement, closeModalFunction) { - editCloseModalFunction = closeModalFunction; - - (modalElement.querySelector("#lotTypeEdit--lotType") as HTMLInputElement).focus(); - - modalElement.querySelector("form")!.addEventListener("submit", doEdit); - - bulmaJS.toggleHtmlClipped(); - }, - onremoved() { - bulmaJS.toggleHtmlClipped(); - } - }); - } - - function openAddLotTypeField(clickEvent: Event) { - const lotTypeId = Number.parseInt( - ((clickEvent.currentTarget as HTMLElement).closest(".container--lotType") as HTMLElement).dataset - .lotTypeId!, - 10 - ); - - let addCloseModalFunction: () => void; - - const doAdd = (submitEvent: SubmitEvent) => { - submitEvent.preventDefault(); - - cityssm.postJSON( - los.urlPrefix + "/admin/doAddLotTypeField", - submitEvent.currentTarget, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotTypes?: recordTypes.LotType[]; - lotTypeFieldId?: number; - }) => { - expandedLotTypes.add(lotTypeId); - lotTypeResponseHandler(responseJSON); - - if (responseJSON.success) { - addCloseModalFunction(); - openEditLotTypeField(lotTypeId, responseJSON.lotTypeFieldId!); - } - } - ); - }; - - cityssm.openHtmlModal("adminLotTypes-addLotTypeField", { - onshow(modalElement) { - los.populateAliases(modalElement); - - if (lotTypeId) { - (modalElement.querySelector("#lotTypeFieldAdd--lotTypeId") as HTMLInputElement).value = - lotTypeId.toString(); - } - }, - onshown(modalElement, closeModalFunction) { - addCloseModalFunction = closeModalFunction; - - (modalElement.querySelector("#lotTypeFieldAdd--lotTypeField") as HTMLInputElement).focus(); - - modalElement.querySelector("form")!.addEventListener("submit", doAdd); - - bulmaJS.toggleHtmlClipped(); - }, - onremoved() { - bulmaJS.toggleHtmlClipped(); - } - }); - } - - function moveLotType(clickEvent: MouseEvent) { - const buttonElement = clickEvent.currentTarget as HTMLButtonElement; - - const lotTypeId = (buttonElement.closest(".container--lotType") as HTMLElement).dataset.lotTypeId; - - cityssm.postJSON( - los.urlPrefix + - "/admin/" + - (buttonElement.dataset.direction === "up" ? "doMoveLotTypeUp" : "doMoveLotTypeDown"), - { - lotTypeId, - moveToEnd: clickEvent.shiftKey ? "1" : "0" - }, - lotTypeResponseHandler - ); - } - - function openEditLotTypeField(lotTypeId: number, lotTypeFieldId: number) { - const lotType = lotTypes.find((currentLotType) => { - return currentLotType.lotTypeId === lotTypeId; - })!; - - const lotTypeField = lotType.lotTypeFields!.find((currentLotTypeField) => { - return currentLotTypeField.lotTypeFieldId === lotTypeFieldId; - })!; - - let minimumLengthElement: HTMLInputElement; - let maximumLengthElement: HTMLInputElement; - let patternElement: HTMLInputElement; - let lotTypeFieldValuesElement: HTMLTextAreaElement; - - let editCloseModalFunction: () => void; - - function updateMaximumLengthMin() { - maximumLengthElement.min = minimumLengthElement.value; - } - - function toggleInputFields() { - if (lotTypeFieldValuesElement.value === "") { - minimumLengthElement.disabled = false; - maximumLengthElement.disabled = false; - patternElement.disabled = false; - } else { - minimumLengthElement.disabled = true; - maximumLengthElement.disabled = true; - patternElement.disabled = true; - } - } - - function doUpdate(submitEvent: SubmitEvent) { - submitEvent.preventDefault(); - - cityssm.postJSON( - los.urlPrefix + "/admin/doUpdateLotTypeField", - submitEvent.currentTarget, - (responseJSON: { - success: boolean; - errorMessage?: string; - occupancyTypes?: recordTypes.OccupancyType[]; - }) => { - lotTypeResponseHandler(responseJSON); - if (responseJSON.success) { - editCloseModalFunction(); - } - } - ); - } - - function doDelete() { - cityssm.postJSON( - los.urlPrefix + "/admin/doDeleteLotTypeField", - { - lotTypeFieldId - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotTypes?: recordTypes.LotType[]; - }) => { - lotTypeResponseHandler(responseJSON); - if (responseJSON.success) { - editCloseModalFunction(); - } - } - ); - } - - function confirmDoDelete() { - bulmaJS.confirm({ - 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.", - contextualColorName: "warning", - okButton: { - text: "Yes, Delete Field", - callbackFunction: doDelete - } - }); - } - - cityssm.openHtmlModal("adminLotTypes-editLotTypeField", { - onshow(modalElement) { - los.populateAliases(modalElement); - - (modalElement.querySelector("#lotTypeFieldEdit--lotTypeFieldId") as HTMLInputElement).value = - lotTypeField.lotTypeFieldId.toString(); - - (modalElement.querySelector("#lotTypeFieldEdit--lotTypeField") as HTMLInputElement).value = - lotTypeField.lotTypeField!; - - (modalElement.querySelector("#lotTypeFieldEdit--isRequired") as HTMLSelectElement).value = - lotTypeField.isRequired ? "1" : "0"; - - minimumLengthElement = modalElement.querySelector( - "#lotTypeFieldEdit--minimumLength" - ) as HTMLInputElement; - - minimumLengthElement.value = lotTypeField.minimumLength!.toString(); - - maximumLengthElement = modalElement.querySelector( - "#lotTypeFieldEdit--maximumLength" - ) as HTMLInputElement; - - maximumLengthElement.value = lotTypeField.maximumLength!.toString(); - - patternElement = modalElement.querySelector("#lotTypeFieldEdit--pattern") as HTMLInputElement; - - patternElement.value = lotTypeField.pattern!; - - lotTypeFieldValuesElement = modalElement.querySelector( - "#lotTypeFieldEdit--lotTypeFieldValues" - ) as HTMLTextAreaElement; - - lotTypeFieldValuesElement.value = lotTypeField.lotTypeFieldValues!; - - toggleInputFields(); - }, - onshown(modalElement, closeModalFunction) { - editCloseModalFunction = closeModalFunction; - - bulmaJS.init(modalElement); - bulmaJS.toggleHtmlClipped(); - cityssm.enableNavBlocker(); - - modalElement.querySelector("form")!.addEventListener("submit", doUpdate); - - minimumLengthElement.addEventListener("keyup", updateMaximumLengthMin); - updateMaximumLengthMin(); - - lotTypeFieldValuesElement.addEventListener("keyup", toggleInputFields); - - modalElement - .querySelector("#button--deleteLotTypeField")! - .addEventListener("click", confirmDoDelete); - }, - onremoved() { - bulmaJS.toggleHtmlClipped(); - cityssm.disableNavBlocker(); - } - }); - } - - function openEditLotTypeFieldByClick(clickEvent: Event) { - clickEvent.preventDefault(); - - const lotTypeFieldId = Number.parseInt( - ((clickEvent.currentTarget as HTMLElement).closest(".container--lotTypeField") as HTMLElement) - .dataset.lotTypeFieldId!, - 10 - ); - - const lotTypeId = Number.parseInt( - ((clickEvent.currentTarget as HTMLElement).closest(".container--lotType") as HTMLElement).dataset - .lotTypeId!, - 10 - ); - - openEditLotTypeField(lotTypeId, lotTypeFieldId); - } - - function moveLotTypeField(clickEvent: MouseEvent) { - const buttonElement = clickEvent.currentTarget as HTMLButtonElement; - - const lotTypeFieldId = (buttonElement.closest(".container--lotTypeField") as HTMLElement).dataset - .lotTypeFieldId; - - cityssm.postJSON( - los.urlPrefix + - "/admin/" + - (buttonElement.dataset.direction === "up" - ? "doMoveLotTypeFieldUp" - : "doMoveLotTypeFieldDown"), - { - lotTypeFieldId, - moveToEnd: clickEvent.shiftKey ? "1" : "0" - }, - lotTypeResponseHandler - ); - } - - function renderLotTypeFields( - panelElement: HTMLElement, - lotTypeId: number, - lotTypeFields: recordTypes.LotTypeField[] - ) { - if (lotTypeFields.length === 0) { - panelElement.insertAdjacentHTML( - "beforeend", - '
' + - '
' + - '

There are no additional fields.

' + - "
" + - "
" - ); - } else { - for (const lotTypeField of lotTypeFields) { - const panelBlockElement = document.createElement("div"); - panelBlockElement.className = "panel-block is-block container--lotTypeField"; - - if (!expandedLotTypes.has(lotTypeId)) { - panelBlockElement.classList.add("is-hidden"); - } - - panelBlockElement.dataset.lotTypeFieldId = lotTypeField.lotTypeFieldId.toString(); - - panelBlockElement.innerHTML = - '
' + - '" + - '
' + - ('
' + - los.getMoveUpDownButtonFieldHTML( - "button--moveLotTypeFieldUp", - "button--moveLotTypeFieldDown" - ) + - "
") + - "
" + - "
"; - - panelBlockElement - .querySelector(".button--editLotTypeField")! - .addEventListener("click", openEditLotTypeFieldByClick); - - ( - panelBlockElement.querySelector(".button--moveLotTypeFieldUp") as HTMLButtonElement - ).addEventListener("click", moveLotTypeField); - - ( - panelBlockElement.querySelector(".button--moveLotTypeFieldDown") as HTMLButtonElement - ).addEventListener("click", moveLotTypeField); - - panelElement.append(panelBlockElement); - } - } - } - - function renderLotTypes() { - containerElement.innerHTML = ""; - - if (lotTypes.length === 0) { - containerElement.insertAdjacentHTML( - "afterbegin", - `

There are no active ${los.escapedAliases.lot} types.

` - ); + ) - return; - } - - for (const lotType of lotTypes) { - const lotTypeContainer = document.createElement("div"); - - lotTypeContainer.className = "panel container--lotType"; - - lotTypeContainer.dataset.lotTypeId = lotType.lotTypeId.toString(); - - lotTypeContainer.innerHTML = - '
' + - '
' + - ('
' + - '
' + - '" + - "
" + - '
' + - '

' + - cityssm.escapeHTML(lotType.lotType) + - "

" + - "
" + - "
") + - ('
' + - ('
' + - '" + - "
") + - ('
' + - '" + - "
") + - ('
' + - '" + - "
") + - ('
' + - los.getMoveUpDownButtonFieldHTML("button--moveLotTypeUp", "button--moveLotTypeDown") + - "
") + - "
") + - "
" + - "
"; - - renderLotTypeFields(lotTypeContainer, lotType.lotTypeId, lotType.lotTypeFields!); - - lotTypeContainer - .querySelector(".button--toggleLotTypeFields")! - .addEventListener("click", toggleLotTypeFields); - - lotTypeContainer - .querySelector(".button--deleteLotType")! - .addEventListener("click", deleteLotType); - - lotTypeContainer - .querySelector(".button--editLotType")! - .addEventListener("click", openEditLotType); - - lotTypeContainer - .querySelector(".button--addLotTypeField")! - .addEventListener("click", openAddLotTypeField); - - (lotTypeContainer.querySelector(".button--moveLotTypeUp") as HTMLButtonElement).addEventListener( - "click", - moveLotType - ); - - ( - lotTypeContainer.querySelector(".button--moveLotTypeDown") as HTMLButtonElement - ).addEventListener("click", moveLotType); - - containerElement.append(lotTypeContainer); - } + return } - document.querySelector("#button--addLotType")!.addEventListener("click", () => { - let addCloseModalFunction: () => void; + for (const lotType of lotTypes) { + const lotTypeContainer = document.createElement('div') - function doAdd(submitEvent: SubmitEvent): void { - submitEvent.preventDefault(); + lotTypeContainer.className = 'panel container--lotType' - cityssm.postJSON( - los.urlPrefix + "/admin/doAddLotType", - submitEvent.currentTarget, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotTypes?: recordTypes.LotType[]; - }) => { - if (responseJSON.success) { - addCloseModalFunction(); - lotTypes = responseJSON.lotTypes!; - renderLotTypes(); - } else { - bulmaJS.alert({ - title: `Error Adding ${los.escapedAliases.Lot} Type`, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - } + lotTypeContainer.dataset.lotTypeId = lotType.lotTypeId.toString() - cityssm.openHtmlModal("adminLotTypes-addLotType", { - onshow(modalElement) { - los.populateAliases(modalElement); - }, - onshown(modalElement, closeModalFunction) { - addCloseModalFunction = closeModalFunction; + lotTypeContainer.innerHTML = + '
' + + '
' + + ('
' + + '
' + + '' + + '
' + + '
' + + '

' + + cityssm.escapeHTML(lotType.lotType) + + '

' + + '
' + + '
') + + ('
' + + ('
' + + '' + + '
') + + ('
' + + '' + + '
') + + ('
' + + '' + + '
') + + ('
' + + los.getMoveUpDownButtonFieldHTML( + 'button--moveLotTypeUp', + 'button--moveLotTypeDown' + ) + + '
') + + '
') + + '
' + + '
' - (modalElement.querySelector("#lotTypeAdd--lotType") as HTMLInputElement).focus(); + renderLotTypeFields( + lotTypeContainer, + lotType.lotTypeId, + lotType.lotTypeFields! + ) - modalElement.querySelector("form")!.addEventListener("submit", doAdd); + lotTypeContainer + .querySelector('.button--toggleLotTypeFields')! + .addEventListener('click', toggleLotTypeFields) - bulmaJS.toggleHtmlClipped(); - }, - onremoved() { - bulmaJS.toggleHtmlClipped(); + lotTypeContainer + .querySelector('.button--deleteLotType')! + .addEventListener('click', deleteLotType) + + lotTypeContainer + .querySelector('.button--editLotType')! + .addEventListener('click', openEditLotType) + + lotTypeContainer + .querySelector('.button--addLotTypeField')! + .addEventListener('click', openAddLotTypeField) + + ;( + lotTypeContainer.querySelector( + '.button--moveLotTypeUp' + ) as HTMLButtonElement + ).addEventListener('click', moveLotType) + + ;( + lotTypeContainer.querySelector( + '.button--moveLotTypeDown' + ) as HTMLButtonElement + ).addEventListener('click', moveLotType) + + containerElement.append(lotTypeContainer) + } + } + + document + .querySelector('#button--addLotType')! + .addEventListener('click', () => { + let addCloseModalFunction: () => void + + function doAdd(submitEvent: SubmitEvent): void { + submitEvent.preventDefault() + + cityssm.postJSON( + los.urlPrefix + '/admin/doAddLotType', + submitEvent.currentTarget, + (responseJSON: { + success: boolean + errorMessage?: string + lotTypes?: recordTypes.LotType[] + }) => { + if (responseJSON.success) { + addCloseModalFunction() + lotTypes = responseJSON.lotTypes! + renderLotTypes() + } else { + bulmaJS.alert({ + title: `Error Adding ${los.escapedAliases.Lot} Type`, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) } - }); - }); + } + ) + } - renderLotTypes(); -})(); + cityssm.openHtmlModal('adminLotTypes-addLotType', { + onshow(modalElement) { + los.populateAliases(modalElement) + }, + onshown(modalElement, closeModalFunction) { + addCloseModalFunction = closeModalFunction + + ;( + modalElement.querySelector( + '#lotTypeAdd--lotType' + ) as HTMLInputElement + ).focus() + + modalElement.querySelector('form')!.addEventListener('submit', doAdd) + + bulmaJS.toggleHtmlClipped() + }, + onremoved() { + bulmaJS.toggleHtmlClipped() + } + }) + }) + + renderLotTypes() +})() diff --git a/public-typescript/adminOccupancyTypes.js b/public-typescript/adminOccupancyTypes.js index bc0aaf36..866d041d 100644 --- a/public-typescript/adminOccupancyTypes.js +++ b/public-typescript/adminOccupancyTypes.js @@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; - const occupancyTypesContainerElement = document.querySelector("#container--occupancyTypes"); - const occupancyTypePrintsContainerElement = document.querySelector("#container--occupancyTypePrints"); + const occupancyTypesContainerElement = document.querySelector('#container--occupancyTypes'); + const occupancyTypePrintsContainerElement = document.querySelector('#container--occupancyTypePrints'); let occupancyTypes = exports.occupancyTypes; delete exports.occupancyTypes; let allOccupancyTypeFields = exports.allOccupancyTypeFields; @@ -12,7 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); const expandedOccupancyTypes = new Set(); function toggleOccupancyTypeFields(clickEvent) { const toggleButtonElement = clickEvent.currentTarget; - const occupancyTypeElement = toggleButtonElement.closest(".container--occupancyType"); + const occupancyTypeElement = toggleButtonElement.closest('.container--occupancyType'); const occupancyTypeId = Number.parseInt(occupancyTypeElement.dataset.occupancyTypeId, 10); if (expandedOccupancyTypes.has(occupancyTypeId)) { expandedOccupancyTypes.delete(occupancyTypeId); @@ -23,9 +23,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); toggleButtonElement.innerHTML = expandedOccupancyTypes.has(occupancyTypeId) ? '' : ''; - const panelBlockElements = occupancyTypeElement.querySelectorAll(".panel-block"); + const panelBlockElements = occupancyTypeElement.querySelectorAll('.panel-block'); for (const panelBlockElement of panelBlockElements) { - panelBlockElement.classList.toggle("is-hidden"); + panelBlockElement.classList.toggle('is-hidden'); } } function occupancyTypeResponseHandler(responseJSON) { @@ -36,23 +36,23 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Updating " + exports.aliases.occupancy + " Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Updating ' + exports.aliases.occupancy + ' Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } } 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() { - cityssm.postJSON(los.urlPrefix + "/admin/doDeleteOccupancyType", { + cityssm.postJSON(los.urlPrefix + '/admin/doDeleteOccupancyType', { occupancyTypeId }, occupancyTypeResponseHandler); } bulmaJS.confirm({ title: `Delete ${exports.aliases.occupancy} Type`, message: `Are you sure you want to delete this ${exports.aliases.occupancy.toLowerCase()} type?`, - contextualColorName: "warning", + contextualColorName: 'warning', okButton: { text: `Yes, Delete ${exports.aliases.occupancy} Type`, callbackFunction: doDelete @@ -60,30 +60,30 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); } 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) => { return occupancyTypeId === currentOccupancyType.occupancyTypeId; }); let editCloseModalFunction; function doEdit(submitEvent) { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/admin/doUpdateOccupancyType", submitEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doUpdateOccupancyType', submitEvent.currentTarget, (responseJSON) => { occupancyTypeResponseHandler(responseJSON); if (responseJSON.success) { editCloseModalFunction(); } }); } - cityssm.openHtmlModal("adminOccupancyTypes-editOccupancyType", { + cityssm.openHtmlModal('adminOccupancyTypes-editOccupancyType', { onshow(modalElement) { los.populateAliases(modalElement); - modalElement.querySelector("#occupancyTypeEdit--occupancyTypeId").value = occupancyTypeId.toString(); - modalElement.querySelector("#occupancyTypeEdit--occupancyType").value = occupancyType.occupancyType; + modalElement.querySelector('#occupancyTypeEdit--occupancyTypeId').value = occupancyTypeId.toString(); + modalElement.querySelector('#occupancyTypeEdit--occupancyType').value = occupancyType.occupancyType; }, onshown(modalElement, closeModalFunction) { editCloseModalFunction = closeModalFunction; - modalElement.querySelector("#occupancyTypeEdit--occupancyType").focus(); - modalElement.querySelector("form").addEventListener("submit", doEdit); + modalElement.querySelector('#occupancyTypeEdit--occupancyType').focus(); + modalElement.querySelector('form').addEventListener('submit', doEdit); bulmaJS.toggleHtmlClipped(); }, onremoved() { @@ -92,11 +92,11 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); } 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; function doAdd(submitEvent) { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/admin/doAddOccupancyTypeField", submitEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doAddOccupancyTypeField', submitEvent.currentTarget, (responseJSON) => { expandedOccupancyTypes.add(occupancyTypeId); occupancyTypeResponseHandler(responseJSON); if (responseJSON.success) { @@ -105,17 +105,18 @@ Object.defineProperty(exports, "__esModule", { value: true }); } }); } - cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyTypeField", { + cityssm.openHtmlModal('adminOccupancyTypes-addOccupancyTypeField', { onshow(modalElement) { los.populateAliases(modalElement); if (occupancyTypeId) { - modalElement.querySelector("#occupancyTypeFieldAdd--occupancyTypeId").value = occupancyTypeId.toString(); + ; + modalElement.querySelector('#occupancyTypeFieldAdd--occupancyTypeId').value = occupancyTypeId.toString(); } }, onshown(modalElement, closeModalFunction) { addCloseModalFunction = closeModalFunction; - modalElement.querySelector("#occupancyTypeFieldAdd--occupancyTypeField").focus(); - modalElement.querySelector("form").addEventListener("submit", doAdd); + modalElement.querySelector('#occupancyTypeFieldAdd--occupancyTypeField').focus(); + modalElement.querySelector('form').addEventListener('submit', doAdd); bulmaJS.toggleHtmlClipped(); }, onremoved() { @@ -125,14 +126,14 @@ Object.defineProperty(exports, "__esModule", { value: true }); } function moveOccupancyType(clickEvent) { 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 + - "/admin/" + - (buttonElement.dataset.direction === "up" - ? "doMoveOccupancyTypeUp" - : "doMoveOccupancyTypeDown"), { + '/admin/' + + (buttonElement.dataset.direction === 'up' + ? 'doMoveOccupancyTypeUp' + : 'doMoveOccupancyTypeDown'), { occupancyTypeId, - moveToEnd: clickEvent.shiftKey ? "1" : "0" + moveToEnd: clickEvent.shiftKey ? '1' : '0' }, occupancyTypeResponseHandler); } function openEditOccupancyTypeField(occupancyTypeId, occupancyTypeFieldId) { @@ -142,8 +143,10 @@ Object.defineProperty(exports, "__esModule", { value: true }); return currentOccupancyType.occupancyTypeId === occupancyTypeId; }); } - const occupancyTypeField = (occupancyType ? occupancyType.occupancyTypeFields : allOccupancyTypeFields).find((currentOccupancyTypeField) => { - return currentOccupancyTypeField.occupancyTypeFieldId === occupancyTypeFieldId; + const occupancyTypeField = (occupancyType + ? occupancyType.occupancyTypeFields + : allOccupancyTypeFields).find((currentOccupancyTypeField) => { + return (currentOccupancyTypeField.occupancyTypeFieldId === occupancyTypeFieldId); }); let minimumLengthElement; let maximumLengthElement; @@ -154,7 +157,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); maximumLengthElement.min = minimumLengthElement.value; } function toggleInputFields() { - if (occupancyTypeFieldValuesElement.value === "") { + if (occupancyTypeFieldValuesElement.value === '') { minimumLengthElement.disabled = false; maximumLengthElement.disabled = false; patternElement.disabled = false; @@ -167,7 +170,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); } function doUpdate(submitEvent) { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/admin/doUpdateOccupancyTypeField", submitEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doUpdateOccupancyTypeField', submitEvent.currentTarget, (responseJSON) => { occupancyTypeResponseHandler(responseJSON); if (responseJSON.success) { editCloseModalFunction(); @@ -175,7 +178,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); } function doDelete() { - cityssm.postJSON(los.urlPrefix + "/admin/doDeleteOccupancyTypeField", { + cityssm.postJSON(los.urlPrefix + '/admin/doDeleteOccupancyTypeField', { occupancyTypeFieldId }, (responseJSON) => { occupancyTypeResponseHandler(responseJSON); @@ -186,28 +189,30 @@ Object.defineProperty(exports, "__esModule", { value: true }); } function confirmDoDelete() { bulmaJS.confirm({ - 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.", - contextualColorName: "warning", + 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.', + contextualColorName: 'warning', okButton: { - text: "Yes, Delete Field", + text: 'Yes, Delete Field', callbackFunction: doDelete } }); } - cityssm.openHtmlModal("adminOccupancyTypes-editOccupancyTypeField", { + cityssm.openHtmlModal('adminOccupancyTypes-editOccupancyTypeField', { onshow: (modalElement) => { los.populateAliases(modalElement); - modalElement.querySelector("#occupancyTypeFieldEdit--occupancyTypeFieldId").value = occupancyTypeField.occupancyTypeFieldId.toString(); - modalElement.querySelector("#occupancyTypeFieldEdit--occupancyTypeField").value = occupancyTypeField.occupancyTypeField; - modalElement.querySelector("#occupancyTypeFieldEdit--isRequired").value = occupancyTypeField.isRequired ? "1" : "0"; - minimumLengthElement = modalElement.querySelector("#occupancyTypeFieldEdit--minimumLength"); - minimumLengthElement.value = occupancyTypeField.minimumLength.toString(); - maximumLengthElement = modalElement.querySelector("#occupancyTypeFieldEdit--maximumLength"); - maximumLengthElement.value = occupancyTypeField.maximumLength.toString(); - patternElement = modalElement.querySelector("#occupancyTypeFieldEdit--pattern"); + modalElement.querySelector('#occupancyTypeFieldEdit--occupancyTypeFieldId').value = occupancyTypeField.occupancyTypeFieldId.toString(); + modalElement.querySelector('#occupancyTypeFieldEdit--occupancyTypeField').value = occupancyTypeField.occupancyTypeField; + modalElement.querySelector('#occupancyTypeFieldEdit--isRequired').value = occupancyTypeField.isRequired ? '1' : '0'; + minimumLengthElement = modalElement.querySelector('#occupancyTypeFieldEdit--minimumLength'); + minimumLengthElement.value = + occupancyTypeField.minimumLength.toString(); + maximumLengthElement = modalElement.querySelector('#occupancyTypeFieldEdit--maximumLength'); + maximumLengthElement.value = + occupancyTypeField.maximumLength.toString(); + patternElement = modalElement.querySelector('#occupancyTypeFieldEdit--pattern'); patternElement.value = occupancyTypeField.pattern; - occupancyTypeFieldValuesElement = modalElement.querySelector("#occupancyTypeFieldEdit--occupancyTypeFieldValues"); + occupancyTypeFieldValuesElement = modalElement.querySelector('#occupancyTypeFieldEdit--occupancyTypeFieldValues'); occupancyTypeFieldValuesElement.value = occupancyTypeField.occupancyTypeFieldValues; toggleInputFields(); @@ -217,13 +222,13 @@ Object.defineProperty(exports, "__esModule", { value: true }); bulmaJS.init(modalElement); bulmaJS.toggleHtmlClipped(); cityssm.enableNavBlocker(); - modalElement.querySelector("form").addEventListener("submit", doUpdate); - minimumLengthElement.addEventListener("keyup", updateMaximumLengthMin); + modalElement.querySelector('form').addEventListener('submit', doUpdate); + minimumLengthElement.addEventListener('keyup', updateMaximumLengthMin); updateMaximumLengthMin(); - occupancyTypeFieldValuesElement.addEventListener("keyup", toggleInputFields); + occupancyTypeFieldValuesElement.addEventListener('keyup', toggleInputFields); modalElement - .querySelector("#button--deleteOccupancyTypeField") - .addEventListener("click", confirmDoDelete); + .querySelector('#button--deleteOccupancyTypeField') + .addEventListener('click', confirmDoDelete); }, onremoved: () => { bulmaJS.toggleHtmlClipped(); @@ -233,40 +238,41 @@ Object.defineProperty(exports, "__esModule", { value: true }); } function openEditOccupancyTypeFieldByClick(clickEvent) { clickEvent.preventDefault(); - 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 occupancyTypeFieldId = Number.parseInt(clickEvent.currentTarget.closest('.container--occupancyTypeField').dataset.occupancyTypeFieldId, 10); + const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--occupancyType').dataset.occupancyTypeId, 10); openEditOccupancyTypeField(occupancyTypeId, occupancyTypeFieldId); } function moveOccupancyTypeField(clickEvent) { 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 + - "/admin/" + - (buttonElement.dataset.direction === "up" - ? "doMoveOccupancyTypeFieldUp" - : "doMoveOccupancyTypeFieldDown"), { + '/admin/' + + (buttonElement.dataset.direction === 'up' + ? 'doMoveOccupancyTypeFieldUp' + : 'doMoveOccupancyTypeFieldDown'), { occupancyTypeFieldId, - moveToEnd: clickEvent.shiftKey ? "1" : "0" + moveToEnd: clickEvent.shiftKey ? '1' : '0' }, occupancyTypeResponseHandler); } function renderOccupancyTypeFields(panelElement, occupancyTypeId, occupancyTypeFields) { if (occupancyTypeFields.length === 0) { - panelElement.insertAdjacentHTML("beforeend", '
' + '
' + '

There are no additional fields.

' + - "
" + - "
"); + '' + + ''); } else { for (const occupancyTypeField of occupancyTypeFields) { - const panelBlockElement = document.createElement("div"); - panelBlockElement.className = "panel-block is-block container--occupancyTypeField"; + const panelBlockElement = document.createElement('div'); + panelBlockElement.className = + 'panel-block is-block container--occupancyTypeField'; if (occupancyTypeId && !expandedOccupancyTypes.has(occupancyTypeId)) { - panelBlockElement.classList.add("is-hidden"); + panelBlockElement.classList.add('is-hidden'); } panelBlockElement.dataset.occupancyTypeFieldId = occupancyTypeField.occupancyTypeFieldId.toString(); @@ -275,44 +281,44 @@ Object.defineProperty(exports, "__esModule", { value: true }); '" + + cityssm.escapeHTML(occupancyTypeField.occupancyTypeField || '') + + '' + + '') + + '' + '
' + ('
' + - los.getMoveUpDownButtonFieldHTML("button--moveOccupancyTypeFieldUp", "button--moveOccupancyTypeFieldDown") + - "
") + - "
" + - ""; + los.getMoveUpDownButtonFieldHTML('button--moveOccupancyTypeFieldUp', 'button--moveOccupancyTypeFieldDown') + + '') + + '' + + ''; panelBlockElement - .querySelector(".button--editOccupancyTypeField") - .addEventListener("click", openEditOccupancyTypeFieldByClick); - panelBlockElement.querySelector(".button--moveOccupancyTypeFieldUp").addEventListener("click", moveOccupancyTypeField); - panelBlockElement.querySelector(".button--moveOccupancyTypeFieldDown").addEventListener("click", moveOccupancyTypeField); + .querySelector('.button--editOccupancyTypeField') + .addEventListener('click', openEditOccupancyTypeFieldByClick); + panelBlockElement.querySelector('.button--moveOccupancyTypeFieldUp').addEventListener('click', moveOccupancyTypeField); + panelBlockElement.querySelector('.button--moveOccupancyTypeFieldDown').addEventListener('click', moveOccupancyTypeField); panelElement.append(panelBlockElement); } } } function openAddOccupancyTypePrint(clickEvent) { - const occupancyTypeId = clickEvent.currentTarget.closest(".container--occupancyTypePrintList").dataset.occupancyTypeId; + const occupancyTypeId = clickEvent.currentTarget.closest('.container--occupancyTypePrintList').dataset.occupancyTypeId; let closeAddModalFunction; function doAdd(formEvent) { formEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/admin/doAddOccupancyTypePrint", formEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doAddOccupancyTypePrint', formEvent.currentTarget, (responseJSON) => { if (responseJSON.success) { closeAddModalFunction(); } occupancyTypeResponseHandler(responseJSON); }); } - cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyTypePrint", { + cityssm.openHtmlModal('adminOccupancyTypes-addOccupancyTypePrint', { onshow(modalElement) { los.populateAliases(modalElement); - modalElement.querySelector("#occupancyTypePrintAdd--occupancyTypeId").value = occupancyTypeId; - const printSelectElement = modalElement.querySelector("#occupancyTypePrintAdd--printEJS"); + modalElement.querySelector('#occupancyTypePrintAdd--occupancyTypeId').value = occupancyTypeId; + const printSelectElement = modalElement.querySelector('#occupancyTypePrintAdd--printEJS'); for (const [printEJS, printTitle] of Object.entries(exports.occupancyTypePrintTitles)) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = printEJS; optionElement.textContent = printTitle; printSelectElement.append(optionElement); @@ -321,48 +327,47 @@ Object.defineProperty(exports, "__esModule", { value: true }); onshown(modalElement, closeModalFunction) { var _a; 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) { const buttonElement = clickEvent.currentTarget; - const printEJS = buttonElement.closest(".container--occupancyTypePrint") - .dataset.printEJS; - const occupancyTypeId = buttonElement.closest(".container--occupancyTypePrintList").dataset.occupancyTypeId; + const printEJS = buttonElement.closest('.container--occupancyTypePrint').dataset.printEJS; + const occupancyTypeId = buttonElement.closest('.container--occupancyTypePrintList').dataset.occupancyTypeId; cityssm.postJSON(los.urlPrefix + - "/admin/" + - (buttonElement.dataset.direction === "up" - ? "doMoveOccupancyTypePrintUp" - : "doMoveOccupancyTypePrintDown"), { + '/admin/' + + (buttonElement.dataset.direction === 'up' + ? 'doMoveOccupancyTypePrintUp' + : 'doMoveOccupancyTypePrintDown'), { occupancyTypeId, printEJS, - moveToEnd: clickEvent.shiftKey ? "1" : "0" + moveToEnd: clickEvent.shiftKey ? '1' : '0' }, occupancyTypeResponseHandler); } function deleteOccupancyTypePrint(clickEvent) { clickEvent.preventDefault(); - const printEJS = clickEvent.currentTarget.closest(".container--occupancyTypePrint").dataset.printEJS; - const occupancyTypeId = clickEvent.currentTarget.closest(".container--occupancyTypePrintList").dataset.occupancyTypeId; + const printEJS = clickEvent.currentTarget.closest('.container--occupancyTypePrint').dataset.printEJS; + const occupancyTypeId = clickEvent.currentTarget.closest('.container--occupancyTypePrintList').dataset.occupancyTypeId; function doDelete() { - cityssm.postJSON(los.urlPrefix + "/admin/doDeleteOccupancyTypePrint", { + cityssm.postJSON(los.urlPrefix + '/admin/doDeleteOccupancyTypePrint', { occupancyTypeId, printEJS }, occupancyTypeResponseHandler); } bulmaJS.confirm({ - title: "Delete Print", - message: "Are you sure you want to remove this print option?", - contextualColorName: "warning", + title: 'Delete Print', + message: 'Are you sure you want to remove this print option?', + contextualColorName: 'warning', okButton: { - text: "Yes, Remove Print", + text: 'Yes, Remove Print', callbackFunction: doDelete } }); } function renderOccupancyTypePrints(panelElement, occupancyTypeId, occupancyTypePrints) { if (occupancyTypePrints.length === 0) { - panelElement.insertAdjacentHTML("beforeend", `
+ panelElement.insertAdjacentHTML('beforeend', `

There are no prints associated with this record.

@@ -370,18 +375,19 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { for (const printEJS of occupancyTypePrints) { - const panelBlockElement = document.createElement("div"); - panelBlockElement.className = "panel-block is-block container--occupancyTypePrint"; + const panelBlockElement = document.createElement('div'); + panelBlockElement.className = + 'panel-block is-block container--occupancyTypePrint'; panelBlockElement.dataset.printEJS = printEJS; - const printTitle = printEJS === "*" - ? "(All Available Prints)" + const printTitle = printEJS === '*' + ? '(All Available Prints)' : exports.occupancyTypePrintTitles[printEJS]; - let printIconClass = "fa-star"; - if (printEJS.startsWith("pdf/")) { - printIconClass = "fa-file-pdf"; + let printIconClass = 'fa-star'; + if (printEJS.startsWith('pdf/')) { + printIconClass = 'fa-file-pdf'; } - else if (printEJS.startsWith("screen/")) { - printIconClass = "fa-file"; + else if (printEJS.startsWith('screen/')) { + printIconClass = 'fa-file'; } panelBlockElement.innerHTML = '
' + @@ -390,28 +396,28 @@ Object.defineProperty(exports, "__esModule", { value: true }); '' + - "
") + + '
') + ('
' + cityssm.escapeHTML(printTitle || printEJS) + - "
") + - "
" + + '') + + '' + '
' + ('
' + - los.getMoveUpDownButtonFieldHTML("button--moveOccupancyTypePrintUp", "button--moveOccupancyTypePrintDown") + - "
") + + los.getMoveUpDownButtonFieldHTML('button--moveOccupancyTypePrintUp', 'button--moveOccupancyTypePrintDown') + + '
') + ('
' + '" + - "
" + - "") + - "" + - ""; - panelBlockElement.querySelector(".button--moveOccupancyTypePrintUp").addEventListener("click", moveOccupancyTypePrint); - panelBlockElement.querySelector(".button--moveOccupancyTypePrintDown").addEventListener("click", moveOccupancyTypePrint); + '' + + '' + + '') + + '' + + ''; + panelBlockElement.querySelector('.button--moveOccupancyTypePrintUp').addEventListener('click', moveOccupancyTypePrint); + panelBlockElement.querySelector('.button--moveOccupancyTypePrintDown').addEventListener('click', moveOccupancyTypePrint); panelBlockElement - .querySelector(".button--deleteOccupancyTypePrint") - .addEventListener("click", deleteOccupancyTypePrint); + .querySelector('.button--deleteOccupancyTypePrint') + .addEventListener('click', deleteOccupancyTypePrint); panelElement.append(panelBlockElement); } } @@ -425,30 +431,30 @@ Object.defineProperty(exports, "__esModule", { value: true }); '
' + ('

(All ' + cityssm.escapeHTML(exports.aliases.occupancy) + - " Types)

") + - "
" + - "") + + ' Types)') + + '' + + '') + ('
' + ('
' + '" + - "
") + - "
") + - "") + - "" + - ""; - occupancyTypePrintsContainerElement.innerHTML = ""; - renderOccupancyTypeFields(occupancyTypesContainerElement.querySelector("#container--allOccupancyTypeFields"), undefined, allOccupancyTypeFields); + 'Add Field' + + '' + + '') + + '') + + '') + + '' + + ''; + occupancyTypePrintsContainerElement.innerHTML = ''; + renderOccupancyTypeFields(occupancyTypesContainerElement.querySelector('#container--allOccupancyTypeFields'), undefined, allOccupancyTypeFields); occupancyTypesContainerElement - .querySelector(".button--addOccupancyTypeField") - .addEventListener("click", openAddOccupancyTypeField); + .querySelector('.button--addOccupancyTypeField') + .addEventListener('click', openAddOccupancyTypeField); if (occupancyTypes.length === 0) { - occupancyTypesContainerElement.insertAdjacentHTML("afterbegin", `

There are no active ${los.escapedAliases.occupancy} types.

`); - occupancyTypePrintsContainerElement.insertAdjacentHTML("afterbegin", `

There are no active ${los.escapedAliases.occupancy} types.

`); return; @@ -456,8 +462,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); for (const occupancyType of occupancyTypes) { // Types and Fields { - const occupancyTypeContainer = document.createElement("div"); - occupancyTypeContainer.className = "panel container--occupancyType"; + const occupancyTypeContainer = document.createElement('div'); + occupancyTypeContainer.className = 'panel container--occupancyType'; occupancyTypeContainer.dataset.occupancyTypeId = occupancyType.occupancyTypeId.toString(); occupancyTypeContainer.innerHTML = @@ -469,62 +475,63 @@ Object.defineProperty(exports, "__esModule", { value: true }); (expandedOccupancyTypes.has(occupancyType.occupancyTypeId) ? '' : '') + - "" + - "" + + '' + + '' + '
' + '

' + cityssm.escapeHTML(occupancyType.occupancyType) + - "

" + - "
" + - "") + + '' + + '' + + '') + ('
' + ('
' + '" + - "
") + + 'Delete' + + '' + + '
') + ('
' + '" + - "
") + + ' Type' + + '' + + '') + ('
' + '" + - "
") + + 'Add Field' + + '' + + '') + ('
' + - los.getMoveUpDownButtonFieldHTML("button--moveOccupancyTypeUp", "button--moveOccupancyTypeDown") + - "
") + - "") + - "" + - ""; + los.getMoveUpDownButtonFieldHTML('button--moveOccupancyTypeUp', 'button--moveOccupancyTypeDown') + + '') + + '') + + '' + + ''; renderOccupancyTypeFields(occupancyTypeContainer, occupancyType.occupancyTypeId, occupancyType.occupancyTypeFields); occupancyTypeContainer - .querySelector(".button--toggleOccupancyTypeFields") - .addEventListener("click", toggleOccupancyTypeFields); + .querySelector('.button--toggleOccupancyTypeFields') + .addEventListener('click', toggleOccupancyTypeFields); occupancyTypeContainer - .querySelector(".button--deleteOccupancyType") - .addEventListener("click", deleteOccupancyType); + .querySelector('.button--deleteOccupancyType') + .addEventListener('click', deleteOccupancyType); occupancyTypeContainer - .querySelector(".button--editOccupancyType") - .addEventListener("click", openEditOccupancyType); + .querySelector('.button--editOccupancyType') + .addEventListener('click', openEditOccupancyType); occupancyTypeContainer - .querySelector(".button--addOccupancyTypeField") - .addEventListener("click", openAddOccupancyTypeField); - occupancyTypeContainer.querySelector(".button--moveOccupancyTypeUp").addEventListener("click", moveOccupancyType); - occupancyTypeContainer.querySelector(".button--moveOccupancyTypeDown").addEventListener("click", moveOccupancyType); + .querySelector('.button--addOccupancyTypeField') + .addEventListener('click', openAddOccupancyTypeField); + occupancyTypeContainer.querySelector('.button--moveOccupancyTypeUp').addEventListener('click', moveOccupancyType); + occupancyTypeContainer.querySelector('.button--moveOccupancyTypeDown').addEventListener('click', moveOccupancyType); occupancyTypesContainerElement.append(occupancyTypeContainer); } // Prints { - const occupancyTypePrintContainer = document.createElement("div"); - occupancyTypePrintContainer.className = "panel container--occupancyTypePrintList"; + const occupancyTypePrintContainer = document.createElement('div'); + occupancyTypePrintContainer.className = + 'panel container--occupancyTypePrintList'; occupancyTypePrintContainer.dataset.occupancyTypeId = occupancyType.occupancyTypeId.toString(); occupancyTypePrintContainer.innerHTML = @@ -534,32 +541,34 @@ Object.defineProperty(exports, "__esModule", { value: true }); '
' + '

' + cityssm.escapeHTML(occupancyType.occupancyType) + - "

" + - "
" + - "") + + '' + + '' + + '') + ('
' + ('
' + '" + - "
") + - "
") + - "" + - ""; + 'Add Print' + + '' + + '') + + '') + + '' + + ''; renderOccupancyTypePrints(occupancyTypePrintContainer, occupancyType.occupancyTypeId, occupancyType.occupancyTypePrints); occupancyTypePrintContainer - .querySelector(".button--addOccupancyTypePrint") - .addEventListener("click", openAddOccupancyTypePrint); + .querySelector('.button--addOccupancyTypePrint') + .addEventListener('click', openAddOccupancyTypePrint); occupancyTypePrintsContainerElement.append(occupancyTypePrintContainer); } } } - document.querySelector("#button--addOccupancyType").addEventListener("click", () => { + document + .querySelector('#button--addOccupancyType') + .addEventListener('click', () => { let addCloseModalFunction; const doAdd = (submitEvent) => { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/admin/doAddOccupancyType", submitEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doAddOccupancyType', submitEvent.currentTarget, (responseJSON) => { if (responseJSON.success) { addCloseModalFunction(); occupancyTypes = responseJSON.occupancyTypes; @@ -567,21 +576,21 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Adding " + exports.aliases.occupancy + " Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Adding ' + exports.aliases.occupancy + ' Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; - cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyType", { + cityssm.openHtmlModal('adminOccupancyTypes-addOccupancyType', { onshow: (modalElement) => { los.populateAliases(modalElement); }, onshown: (modalElement, closeModalFunction) => { addCloseModalFunction = closeModalFunction; - modalElement.querySelector("#occupancyTypeAdd--occupancyType").focus(); - modalElement.querySelector("form").addEventListener("submit", doAdd); + modalElement.querySelector('#occupancyTypeAdd--occupancyType').focus(); + modalElement.querySelector('form').addEventListener('submit', doAdd); bulmaJS.toggleHtmlClipped(); }, onremoved: () => { diff --git a/public-typescript/adminOccupancyTypes.ts b/public-typescript/adminOccupancyTypes.ts index 975be2a9..523f1096 100644 --- a/public-typescript/adminOccupancyTypes.ts +++ b/public-typescript/adminOccupancyTypes.ts @@ -1,1007 +1,1030 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ -import type * as globalTypes from "../types/globalTypes"; -import type * as recordTypes from "../types/recordTypes"; +import type * as globalTypes from '../types/globalTypes' +import type * as recordTypes from '../types/recordTypes' -import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; +import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types' -import type { BulmaJS } from "@cityssm/bulma-js/types"; +import type { BulmaJS } from '@cityssm/bulma-js/types' -declare const cityssm: cityssmGlobal; -declare const bulmaJS: BulmaJS; +declare const cityssm: cityssmGlobal +declare const bulmaJS: BulmaJS -(() => { - const los = exports.los as globalTypes.LOS; +;(() => { + const los = exports.los as globalTypes.LOS - const occupancyTypesContainerElement = document.querySelector( - "#container--occupancyTypes" - ) as HTMLElement; + const occupancyTypesContainerElement = document.querySelector( + '#container--occupancyTypes' + ) as HTMLElement - const occupancyTypePrintsContainerElement = document.querySelector( - "#container--occupancyTypePrints" - ) as HTMLElement; + const occupancyTypePrintsContainerElement = document.querySelector( + '#container--occupancyTypePrints' + ) as HTMLElement - let occupancyTypes: recordTypes.OccupancyType[] = exports.occupancyTypes; - delete exports.occupancyTypes; + let occupancyTypes: recordTypes.OccupancyType[] = exports.occupancyTypes + delete exports.occupancyTypes - let allOccupancyTypeFields: recordTypes.OccupancyTypeField[] = exports.allOccupancyTypeFields; - delete exports.allOccupancyTypeFields; + let allOccupancyTypeFields: recordTypes.OccupancyTypeField[] = + exports.allOccupancyTypeFields + delete exports.allOccupancyTypeFields - const expandedOccupancyTypes = new Set(); + const expandedOccupancyTypes = new Set() - function toggleOccupancyTypeFields(clickEvent: Event): void { - const toggleButtonElement = clickEvent.currentTarget as HTMLButtonElement; + function toggleOccupancyTypeFields(clickEvent: Event): void { + const toggleButtonElement = clickEvent.currentTarget as HTMLButtonElement - const occupancyTypeElement = toggleButtonElement.closest( - ".container--occupancyType" - ) as HTMLElement; + const occupancyTypeElement = toggleButtonElement.closest( + '.container--occupancyType' + ) as HTMLElement - const occupancyTypeId = Number.parseInt(occupancyTypeElement.dataset.occupancyTypeId!, 10); + const occupancyTypeId = Number.parseInt( + occupancyTypeElement.dataset.occupancyTypeId!, + 10 + ) - if (expandedOccupancyTypes.has(occupancyTypeId)) { - expandedOccupancyTypes.delete(occupancyTypeId); - } else { - expandedOccupancyTypes.add(occupancyTypeId); - } - - toggleButtonElement.innerHTML = expandedOccupancyTypes.has(occupancyTypeId) - ? '' - : ''; - - const panelBlockElements = occupancyTypeElement.querySelectorAll(".panel-block"); - - for (const panelBlockElement of panelBlockElements) { - panelBlockElement.classList.toggle("is-hidden"); - } + if (expandedOccupancyTypes.has(occupancyTypeId)) { + expandedOccupancyTypes.delete(occupancyTypeId) + } else { + expandedOccupancyTypes.add(occupancyTypeId) } - function occupancyTypeResponseHandler(responseJSON: { - success: boolean; - errorMessage?: string; - occupancyTypes?: recordTypes.OccupancyType[]; - allOccupancyTypeFields?: recordTypes.OccupancyTypeField[]; - }) { - if (responseJSON.success) { - occupancyTypes = responseJSON.occupancyTypes!; - allOccupancyTypeFields = responseJSON.allOccupancyTypeFields!; - renderOccupancyTypes(); - } else { - bulmaJS.alert({ - title: "Error Updating " + exports.aliases.occupancy + " Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); + toggleButtonElement.innerHTML = expandedOccupancyTypes.has(occupancyTypeId) + ? '' + : '' + + const panelBlockElements = + occupancyTypeElement.querySelectorAll('.panel-block') + + for (const panelBlockElement of panelBlockElements) { + panelBlockElement.classList.toggle('is-hidden') + } + } + + function occupancyTypeResponseHandler(responseJSON: { + success: boolean + errorMessage?: string + occupancyTypes?: recordTypes.OccupancyType[] + allOccupancyTypeFields?: recordTypes.OccupancyTypeField[] + }) { + if (responseJSON.success) { + occupancyTypes = responseJSON.occupancyTypes! + allOccupancyTypeFields = responseJSON.allOccupancyTypeFields! + renderOccupancyTypes() + } else { + bulmaJS.alert({ + title: 'Error Updating ' + exports.aliases.occupancy + ' Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + + function deleteOccupancyType(clickEvent: Event) { + const occupancyTypeId = Number.parseInt( + ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--occupancyType' + ) as HTMLElement + ).dataset.occupancyTypeId!, + 10 + ) + + function doDelete(): void { + cityssm.postJSON( + los.urlPrefix + '/admin/doDeleteOccupancyType', + { + occupancyTypeId + }, + occupancyTypeResponseHandler + ) + } + + bulmaJS.confirm({ + title: `Delete ${exports.aliases.occupancy} Type`, + message: `Are you sure you want to delete this ${exports.aliases.occupancy.toLowerCase()} type?`, + contextualColorName: 'warning', + okButton: { + text: `Yes, Delete ${exports.aliases.occupancy} Type`, + callbackFunction: doDelete + } + }) + } + + function openEditOccupancyType(clickEvent: Event): void { + const occupancyTypeId = Number.parseInt( + ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--occupancyType' + ) as HTMLElement + ).dataset.occupancyTypeId!, + 10 + ) + + const occupancyType = occupancyTypes.find((currentOccupancyType) => { + return occupancyTypeId === currentOccupancyType.occupancyTypeId + })! + + let editCloseModalFunction: () => void + + function doEdit(submitEvent: SubmitEvent): void { + submitEvent.preventDefault() + + cityssm.postJSON( + los.urlPrefix + '/admin/doUpdateOccupancyType', + submitEvent.currentTarget, + (responseJSON: { + success: boolean + errorMessage?: string + occupancyTypes?: recordTypes.OccupancyType[] + allOccupancyTypeFields?: recordTypes.OccupancyTypeField[] + }) => { + occupancyTypeResponseHandler(responseJSON) + if (responseJSON.success) { + editCloseModalFunction() + } } + ) } - function deleteOccupancyType(clickEvent: Event) { - const occupancyTypeId = Number.parseInt( - ( - (clickEvent.currentTarget as HTMLElement).closest( - ".container--occupancyType" - ) as HTMLElement - ).dataset.occupancyTypeId!, - 10 - ); + cityssm.openHtmlModal('adminOccupancyTypes-editOccupancyType', { + onshow(modalElement): void { + los.populateAliases(modalElement) - function doDelete(): void { - cityssm.postJSON( - los.urlPrefix + "/admin/doDeleteOccupancyType", - { - occupancyTypeId - }, - occupancyTypeResponseHandler - ); + ;( + modalElement.querySelector( + '#occupancyTypeEdit--occupancyTypeId' + ) as HTMLInputElement + ).value = occupancyTypeId.toString() + + ;( + modalElement.querySelector( + '#occupancyTypeEdit--occupancyType' + ) as HTMLInputElement + ).value = occupancyType.occupancyType + }, + onshown(modalElement, closeModalFunction) { + editCloseModalFunction = closeModalFunction + + ;( + modalElement.querySelector( + '#occupancyTypeEdit--occupancyType' + ) as HTMLInputElement + ).focus() + + modalElement.querySelector('form')!.addEventListener('submit', doEdit) + + bulmaJS.toggleHtmlClipped() + }, + onremoved() { + bulmaJS.toggleHtmlClipped() + } + }) + } + + function openAddOccupancyTypeField(clickEvent: Event) { + const occupancyTypeId = Number.parseInt( + ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--occupancyType' + ) as HTMLElement + ).dataset.occupancyTypeId!, + 10 + ) + + let addCloseModalFunction: () => void + + function doAdd(submitEvent: SubmitEvent) { + submitEvent.preventDefault() + + cityssm.postJSON( + los.urlPrefix + '/admin/doAddOccupancyTypeField', + submitEvent.currentTarget, + (responseJSON: { + success: boolean + errorMessage?: string + occupancyTypes?: recordTypes.OccupancyType[] + allOccupancyTypeFields?: recordTypes.OccupancyTypeField[] + occupancyTypeFieldId?: number + }) => { + expandedOccupancyTypes.add(occupancyTypeId) + occupancyTypeResponseHandler(responseJSON) + + if (responseJSON.success) { + addCloseModalFunction() + openEditOccupancyTypeField( + occupancyTypeId, + responseJSON.occupancyTypeFieldId! + ) + } } - - bulmaJS.confirm({ - title: `Delete ${exports.aliases.occupancy} Type`, - message: `Are you sure you want to delete this ${exports.aliases.occupancy.toLowerCase()} type?`, - contextualColorName: "warning", - okButton: { - text: `Yes, Delete ${exports.aliases.occupancy} Type`, - callbackFunction: doDelete - } - }); + ) } - function openEditOccupancyType(clickEvent: Event): void { - const occupancyTypeId = Number.parseInt( - ( - (clickEvent.currentTarget as HTMLElement).closest( - ".container--occupancyType" - ) as HTMLElement - ).dataset.occupancyTypeId!, - 10 - ); - - const occupancyType = occupancyTypes.find((currentOccupancyType) => { - return occupancyTypeId === currentOccupancyType.occupancyTypeId; - })!; - - let editCloseModalFunction: () => void; - - function doEdit(submitEvent: SubmitEvent): void { - submitEvent.preventDefault(); - - cityssm.postJSON( - los.urlPrefix + "/admin/doUpdateOccupancyType", - submitEvent.currentTarget, - (responseJSON: { - success: boolean; - errorMessage?: string; - occupancyTypes?: recordTypes.OccupancyType[]; - allOccupancyTypeFields?: recordTypes.OccupancyTypeField[]; - }) => { - occupancyTypeResponseHandler(responseJSON); - if (responseJSON.success) { - editCloseModalFunction(); - } - } - ); - } - - cityssm.openHtmlModal("adminOccupancyTypes-editOccupancyType", { - onshow(modalElement): void { - los.populateAliases(modalElement); - - ( - modalElement.querySelector( - "#occupancyTypeEdit--occupancyTypeId" - ) as HTMLInputElement - ).value = occupancyTypeId.toString(); - - ( - modalElement.querySelector( - "#occupancyTypeEdit--occupancyType" - ) as HTMLInputElement - ).value = occupancyType.occupancyType; - }, - onshown(modalElement, closeModalFunction) { - editCloseModalFunction = closeModalFunction; - - ( - modalElement.querySelector( - "#occupancyTypeEdit--occupancyType" - ) as HTMLInputElement - ).focus(); - - modalElement.querySelector("form")!.addEventListener("submit", doEdit); - - bulmaJS.toggleHtmlClipped(); - }, - onremoved() { - bulmaJS.toggleHtmlClipped(); - } - }); - } - - function openAddOccupancyTypeField(clickEvent: Event) { - const occupancyTypeId = Number.parseInt( - ( - (clickEvent.currentTarget as HTMLElement).closest( - ".container--occupancyType" - ) as HTMLElement - ).dataset.occupancyTypeId!, - 10 - ); - - let addCloseModalFunction: () => void; - - function doAdd(submitEvent: SubmitEvent) { - submitEvent.preventDefault(); - - cityssm.postJSON( - los.urlPrefix + "/admin/doAddOccupancyTypeField", - submitEvent.currentTarget, - (responseJSON: { - success: boolean; - errorMessage?: string; - occupancyTypes?: recordTypes.OccupancyType[]; - allOccupancyTypeFields?: recordTypes.OccupancyTypeField[]; - occupancyTypeFieldId?: number; - }) => { - expandedOccupancyTypes.add(occupancyTypeId); - occupancyTypeResponseHandler(responseJSON); - - if (responseJSON.success) { - addCloseModalFunction(); - openEditOccupancyTypeField( - occupancyTypeId, - responseJSON.occupancyTypeFieldId! - ); - } - } - ); - } - - cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyTypeField", { - onshow(modalElement) { - los.populateAliases(modalElement); - - if (occupancyTypeId) { - ( - modalElement.querySelector( - "#occupancyTypeFieldAdd--occupancyTypeId" - ) as HTMLInputElement - ).value = occupancyTypeId.toString(); - } - }, - onshown(modalElement, closeModalFunction) { - addCloseModalFunction = closeModalFunction; - - ( - modalElement.querySelector( - "#occupancyTypeFieldAdd--occupancyTypeField" - ) as HTMLInputElement - ).focus(); - - modalElement.querySelector("form")!.addEventListener("submit", doAdd); - - bulmaJS.toggleHtmlClipped(); - }, - onremoved() { - bulmaJS.toggleHtmlClipped(); - } - }); - } - - function moveOccupancyType(clickEvent: MouseEvent) { - const buttonElement = clickEvent.currentTarget as HTMLButtonElement; - - const occupancyTypeId = ( - (clickEvent.currentTarget as HTMLElement).closest( - ".container--occupancyType" - ) as HTMLElement - ).dataset.occupancyTypeId; - - cityssm.postJSON( - los.urlPrefix + - "/admin/" + - (buttonElement.dataset.direction === "up" - ? "doMoveOccupancyTypeUp" - : "doMoveOccupancyTypeDown"), - { - occupancyTypeId, - moveToEnd: clickEvent.shiftKey ? "1" : "0" - }, - occupancyTypeResponseHandler - ); - } - - function openEditOccupancyTypeField(occupancyTypeId: number, occupancyTypeFieldId: number) { - let occupancyType: recordTypes.OccupancyType | undefined; + cityssm.openHtmlModal('adminOccupancyTypes-addOccupancyTypeField', { + onshow(modalElement) { + los.populateAliases(modalElement) if (occupancyTypeId) { - occupancyType = occupancyTypes.find((currentOccupancyType) => { - return currentOccupancyType.occupancyTypeId === occupancyTypeId; - }); + ;( + modalElement.querySelector( + '#occupancyTypeFieldAdd--occupancyTypeId' + ) as HTMLInputElement + ).value = occupancyTypeId.toString() } + }, + onshown(modalElement, closeModalFunction) { + addCloseModalFunction = closeModalFunction - const occupancyTypeField = ( - occupancyType ? occupancyType.occupancyTypeFields! : allOccupancyTypeFields - ).find((currentOccupancyTypeField) => { - return currentOccupancyTypeField.occupancyTypeFieldId === occupancyTypeFieldId; - })!; + ;( + modalElement.querySelector( + '#occupancyTypeFieldAdd--occupancyTypeField' + ) as HTMLInputElement + ).focus() - let minimumLengthElement: HTMLInputElement; - let maximumLengthElement: HTMLInputElement; - let patternElement: HTMLInputElement; - let occupancyTypeFieldValuesElement: HTMLTextAreaElement; + modalElement.querySelector('form')!.addEventListener('submit', doAdd) - let editCloseModalFunction: () => void; + bulmaJS.toggleHtmlClipped() + }, + onremoved() { + bulmaJS.toggleHtmlClipped() + } + }) + } - function updateMaximumLengthMin(): void { - maximumLengthElement.min = minimumLengthElement.value; - } + function moveOccupancyType(clickEvent: MouseEvent) { + const buttonElement = clickEvent.currentTarget as HTMLButtonElement - function toggleInputFields(): void { - if (occupancyTypeFieldValuesElement.value === "") { - minimumLengthElement.disabled = false; - maximumLengthElement.disabled = false; - patternElement.disabled = false; - } else { - minimumLengthElement.disabled = true; - maximumLengthElement.disabled = true; - patternElement.disabled = true; - } - } + const occupancyTypeId = ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--occupancyType' + ) as HTMLElement + ).dataset.occupancyTypeId - function doUpdate(submitEvent: SubmitEvent): void { - submitEvent.preventDefault(); + cityssm.postJSON( + los.urlPrefix + + '/admin/' + + (buttonElement.dataset.direction === 'up' + ? 'doMoveOccupancyTypeUp' + : 'doMoveOccupancyTypeDown'), + { + occupancyTypeId, + moveToEnd: clickEvent.shiftKey ? '1' : '0' + }, + occupancyTypeResponseHandler + ) + } - cityssm.postJSON( - los.urlPrefix + "/admin/doUpdateOccupancyTypeField", - submitEvent.currentTarget, - (responseJSON: { - success: boolean; - errorMessage?: string; - occupancyTypes?: recordTypes.OccupancyType[]; - }) => { - occupancyTypeResponseHandler(responseJSON); - if (responseJSON.success) { - editCloseModalFunction(); - } - } - ); - } + function openEditOccupancyTypeField( + occupancyTypeId: number, + occupancyTypeFieldId: number + ) { + let occupancyType: recordTypes.OccupancyType | undefined - function doDelete() { - cityssm.postJSON( - los.urlPrefix + "/admin/doDeleteOccupancyTypeField", - { - occupancyTypeFieldId - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - occupancyTypes?: recordTypes.OccupancyType[]; - }) => { - occupancyTypeResponseHandler(responseJSON); - if (responseJSON.success) { - editCloseModalFunction(); - } - } - ); - } - - function confirmDoDelete() { - bulmaJS.confirm({ - 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.", - contextualColorName: "warning", - okButton: { - text: "Yes, Delete Field", - callbackFunction: doDelete - } - }); - } - - cityssm.openHtmlModal("adminOccupancyTypes-editOccupancyTypeField", { - onshow: (modalElement) => { - los.populateAliases(modalElement); - - ( - modalElement.querySelector( - "#occupancyTypeFieldEdit--occupancyTypeFieldId" - ) as HTMLInputElement - ).value = occupancyTypeField.occupancyTypeFieldId!.toString(); - - ( - modalElement.querySelector( - "#occupancyTypeFieldEdit--occupancyTypeField" - ) as HTMLInputElement - ).value = occupancyTypeField.occupancyTypeField!; - - ( - modalElement.querySelector( - "#occupancyTypeFieldEdit--isRequired" - ) as HTMLSelectElement - ).value = occupancyTypeField.isRequired ? "1" : "0"; - - minimumLengthElement = modalElement.querySelector( - "#occupancyTypeFieldEdit--minimumLength" - ) as HTMLInputElement; - - minimumLengthElement.value = occupancyTypeField.minimumLength!.toString(); - - maximumLengthElement = modalElement.querySelector( - "#occupancyTypeFieldEdit--maximumLength" - ) as HTMLInputElement; - - maximumLengthElement.value = occupancyTypeField.maximumLength!.toString(); - - patternElement = modalElement.querySelector( - "#occupancyTypeFieldEdit--pattern" - ) as HTMLInputElement; - - patternElement.value = occupancyTypeField.pattern!; - - occupancyTypeFieldValuesElement = modalElement.querySelector( - "#occupancyTypeFieldEdit--occupancyTypeFieldValues" - ) as HTMLTextAreaElement; - - occupancyTypeFieldValuesElement.value = - occupancyTypeField.occupancyTypeFieldValues!; - - toggleInputFields(); - }, - onshown: (modalElement, closeModalFunction) => { - editCloseModalFunction = closeModalFunction; - - bulmaJS.init(modalElement); - bulmaJS.toggleHtmlClipped(); - cityssm.enableNavBlocker(); - - modalElement.querySelector("form")!.addEventListener("submit", doUpdate); - - minimumLengthElement.addEventListener("keyup", updateMaximumLengthMin); - updateMaximumLengthMin(); - - occupancyTypeFieldValuesElement.addEventListener("keyup", toggleInputFields); - - modalElement - .querySelector("#button--deleteOccupancyTypeField")! - .addEventListener("click", confirmDoDelete); - }, - onremoved: () => { - bulmaJS.toggleHtmlClipped(); - cityssm.disableNavBlocker(); - } - }); + if (occupancyTypeId) { + occupancyType = occupancyTypes.find((currentOccupancyType) => { + return currentOccupancyType.occupancyTypeId === occupancyTypeId + }) } - function openEditOccupancyTypeFieldByClick(clickEvent: Event) { - clickEvent.preventDefault(); + const occupancyTypeField = ( + occupancyType + ? occupancyType.occupancyTypeFields! + : allOccupancyTypeFields + ).find((currentOccupancyTypeField) => { + return ( + currentOccupancyTypeField.occupancyTypeFieldId === occupancyTypeFieldId + ) + })! - const occupancyTypeFieldId = Number.parseInt( - ( - (clickEvent.currentTarget as HTMLElement).closest( - ".container--occupancyTypeField" - ) as HTMLElement - ).dataset.occupancyTypeFieldId!, - 10 - ); + let minimumLengthElement: HTMLInputElement + let maximumLengthElement: HTMLInputElement + let patternElement: HTMLInputElement + let occupancyTypeFieldValuesElement: HTMLTextAreaElement - const occupancyTypeId = Number.parseInt( - ( - (clickEvent.currentTarget as HTMLElement).closest( - ".container--occupancyType" - ) as HTMLElement - ).dataset.occupancyTypeId!, - 10 - ); + let editCloseModalFunction: () => void - openEditOccupancyTypeField(occupancyTypeId, occupancyTypeFieldId); + function updateMaximumLengthMin(): void { + maximumLengthElement.min = minimumLengthElement.value } - function moveOccupancyTypeField(clickEvent: MouseEvent) { - const buttonElement = clickEvent.currentTarget as HTMLButtonElement; - - const occupancyTypeFieldId = ( - (clickEvent.currentTarget as HTMLElement).closest( - ".container--occupancyTypeField" - ) as HTMLElement - ).dataset.occupancyTypeFieldId; - - cityssm.postJSON( - los.urlPrefix + - "/admin/" + - (buttonElement.dataset.direction === "up" - ? "doMoveOccupancyTypeFieldUp" - : "doMoveOccupancyTypeFieldDown"), - { - occupancyTypeFieldId, - moveToEnd: clickEvent.shiftKey ? "1" : "0" - }, - occupancyTypeResponseHandler - ); + function toggleInputFields(): void { + if (occupancyTypeFieldValuesElement.value === '') { + minimumLengthElement.disabled = false + maximumLengthElement.disabled = false + patternElement.disabled = false + } else { + minimumLengthElement.disabled = true + maximumLengthElement.disabled = true + patternElement.disabled = true + } } - function renderOccupancyTypeFields( - panelElement: HTMLElement, - occupancyTypeId: number | undefined, - occupancyTypeFields: recordTypes.OccupancyTypeField[] - ) { - if (occupancyTypeFields.length === 0) { - panelElement.insertAdjacentHTML( - "beforeend", - '
' + - '
' + - '

There are no additional fields.

' + - "
" + - "
" - ); - } else { - for (const occupancyTypeField of occupancyTypeFields) { - const panelBlockElement = document.createElement("div"); - panelBlockElement.className = "panel-block is-block container--occupancyTypeField"; + function doUpdate(submitEvent: SubmitEvent): void { + submitEvent.preventDefault() - if (occupancyTypeId && !expandedOccupancyTypes.has(occupancyTypeId)) { - panelBlockElement.classList.add("is-hidden"); - } - - panelBlockElement.dataset.occupancyTypeFieldId = - occupancyTypeField.occupancyTypeFieldId!.toString(); - - panelBlockElement.innerHTML = - '
' + - '" + - '
' + - ('
' + - los.getMoveUpDownButtonFieldHTML( - "button--moveOccupancyTypeFieldUp", - "button--moveOccupancyTypeFieldDown" - ) + - "
") + - "
" + - "
"; - - panelBlockElement - .querySelector(".button--editOccupancyTypeField")! - .addEventListener("click", openEditOccupancyTypeFieldByClick); - - ( - panelBlockElement.querySelector( - ".button--moveOccupancyTypeFieldUp" - ) as HTMLButtonElement - ).addEventListener("click", moveOccupancyTypeField); - - ( - panelBlockElement.querySelector( - ".button--moveOccupancyTypeFieldDown" - ) as HTMLButtonElement - ).addEventListener("click", moveOccupancyTypeField); - - panelElement.append(panelBlockElement); - } + cityssm.postJSON( + los.urlPrefix + '/admin/doUpdateOccupancyTypeField', + submitEvent.currentTarget, + (responseJSON: { + success: boolean + errorMessage?: string + occupancyTypes?: recordTypes.OccupancyType[] + }) => { + occupancyTypeResponseHandler(responseJSON) + if (responseJSON.success) { + editCloseModalFunction() + } } + ) } - function openAddOccupancyTypePrint(clickEvent: Event): void { - const occupancyTypeId = ( - (clickEvent.currentTarget as HTMLElement).closest( - ".container--occupancyTypePrintList" - ) as HTMLElement - ).dataset.occupancyTypeId!; + function doDelete() { + cityssm.postJSON( + los.urlPrefix + '/admin/doDeleteOccupancyTypeField', + { + occupancyTypeFieldId + }, + (responseJSON: { + success: boolean + errorMessage?: string + occupancyTypes?: recordTypes.OccupancyType[] + }) => { + occupancyTypeResponseHandler(responseJSON) + if (responseJSON.success) { + editCloseModalFunction() + } + } + ) + } - let closeAddModalFunction: () => void; + function confirmDoDelete() { + bulmaJS.confirm({ + 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.', + contextualColorName: 'warning', + okButton: { + text: 'Yes, Delete Field', + callbackFunction: doDelete + } + }) + } - function doAdd(formEvent: SubmitEvent) { - formEvent.preventDefault(); + cityssm.openHtmlModal('adminOccupancyTypes-editOccupancyTypeField', { + onshow: (modalElement) => { + los.populateAliases(modalElement) - cityssm.postJSON( - los.urlPrefix + "/admin/doAddOccupancyTypePrint", - formEvent.currentTarget, - (responseJSON: { - success: boolean; - errorMessage?: string; - occupancyTypes?: recordTypes.OccupancyType[]; - allOccupancyTypeFields?: recordTypes.OccupancyTypeField[]; - }) => { - if (responseJSON.success) { - closeAddModalFunction(); - } + ;( + modalElement.querySelector( + '#occupancyTypeFieldEdit--occupancyTypeFieldId' + ) as HTMLInputElement + ).value = occupancyTypeField.occupancyTypeFieldId!.toString() - occupancyTypeResponseHandler(responseJSON); - } - ); + ;( + modalElement.querySelector( + '#occupancyTypeFieldEdit--occupancyTypeField' + ) as HTMLInputElement + ).value = occupancyTypeField.occupancyTypeField! + + ;( + modalElement.querySelector( + '#occupancyTypeFieldEdit--isRequired' + ) as HTMLSelectElement + ).value = occupancyTypeField.isRequired ? '1' : '0' + + minimumLengthElement = modalElement.querySelector( + '#occupancyTypeFieldEdit--minimumLength' + ) as HTMLInputElement + + minimumLengthElement.value = + occupancyTypeField.minimumLength!.toString() + + maximumLengthElement = modalElement.querySelector( + '#occupancyTypeFieldEdit--maximumLength' + ) as HTMLInputElement + + maximumLengthElement.value = + occupancyTypeField.maximumLength!.toString() + + patternElement = modalElement.querySelector( + '#occupancyTypeFieldEdit--pattern' + ) as HTMLInputElement + + patternElement.value = occupancyTypeField.pattern! + + occupancyTypeFieldValuesElement = modalElement.querySelector( + '#occupancyTypeFieldEdit--occupancyTypeFieldValues' + ) as HTMLTextAreaElement + + occupancyTypeFieldValuesElement.value = + occupancyTypeField.occupancyTypeFieldValues! + + toggleInputFields() + }, + onshown: (modalElement, closeModalFunction) => { + editCloseModalFunction = closeModalFunction + + bulmaJS.init(modalElement) + bulmaJS.toggleHtmlClipped() + cityssm.enableNavBlocker() + + modalElement.querySelector('form')!.addEventListener('submit', doUpdate) + + minimumLengthElement.addEventListener('keyup', updateMaximumLengthMin) + updateMaximumLengthMin() + + occupancyTypeFieldValuesElement.addEventListener( + 'keyup', + toggleInputFields + ) + + modalElement + .querySelector('#button--deleteOccupancyTypeField')! + .addEventListener('click', confirmDoDelete) + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped() + cityssm.disableNavBlocker() + } + }) + } + + function openEditOccupancyTypeFieldByClick(clickEvent: Event) { + clickEvent.preventDefault() + + const occupancyTypeFieldId = Number.parseInt( + ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--occupancyTypeField' + ) as HTMLElement + ).dataset.occupancyTypeFieldId!, + 10 + ) + + const occupancyTypeId = Number.parseInt( + ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--occupancyType' + ) as HTMLElement + ).dataset.occupancyTypeId!, + 10 + ) + + openEditOccupancyTypeField(occupancyTypeId, occupancyTypeFieldId) + } + + function moveOccupancyTypeField(clickEvent: MouseEvent) { + const buttonElement = clickEvent.currentTarget as HTMLButtonElement + + const occupancyTypeFieldId = ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--occupancyTypeField' + ) as HTMLElement + ).dataset.occupancyTypeFieldId + + cityssm.postJSON( + los.urlPrefix + + '/admin/' + + (buttonElement.dataset.direction === 'up' + ? 'doMoveOccupancyTypeFieldUp' + : 'doMoveOccupancyTypeFieldDown'), + { + occupancyTypeFieldId, + moveToEnd: clickEvent.shiftKey ? '1' : '0' + }, + occupancyTypeResponseHandler + ) + } + + function renderOccupancyTypeFields( + panelElement: HTMLElement, + occupancyTypeId: number | undefined, + occupancyTypeFields: recordTypes.OccupancyTypeField[] + ) { + if (occupancyTypeFields.length === 0) { + panelElement.insertAdjacentHTML( + 'beforeend', + '
' + + '
' + + '

There are no additional fields.

' + + '
' + + '
' + ) + } else { + for (const occupancyTypeField of occupancyTypeFields) { + const panelBlockElement = document.createElement('div') + panelBlockElement.className = + 'panel-block is-block container--occupancyTypeField' + + if (occupancyTypeId && !expandedOccupancyTypes.has(occupancyTypeId)) { + panelBlockElement.classList.add('is-hidden') } - cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyTypePrint", { - onshow(modalElement) { - los.populateAliases(modalElement); + panelBlockElement.dataset.occupancyTypeFieldId = + occupancyTypeField.occupancyTypeFieldId!.toString() - ( - modalElement.querySelector( - "#occupancyTypePrintAdd--occupancyTypeId" - ) as HTMLInputElement - ).value = occupancyTypeId; + panelBlockElement.innerHTML = + '
' + + '' + + '
' + + ('
' + + los.getMoveUpDownButtonFieldHTML( + 'button--moveOccupancyTypeFieldUp', + 'button--moveOccupancyTypeFieldDown' + ) + + '
') + + '
' + + '
' - const printSelectElement = modalElement.querySelector( - "#occupancyTypePrintAdd--printEJS" - ) as HTMLSelectElement; + panelBlockElement + .querySelector('.button--editOccupancyTypeField')! + .addEventListener('click', openEditOccupancyTypeFieldByClick) - for (const [printEJS, printTitle] of Object.entries( - exports.occupancyTypePrintTitles - )) { - const optionElement = document.createElement("option"); - optionElement.value = printEJS; - optionElement.textContent = printTitle as string; - printSelectElement.append(optionElement); - } - }, - onshown(modalElement, closeModalFunction) { - closeAddModalFunction = closeModalFunction; + ;( + panelBlockElement.querySelector( + '.button--moveOccupancyTypeFieldUp' + ) as HTMLButtonElement + ).addEventListener('click', moveOccupancyTypeField) - modalElement.querySelector("form")?.addEventListener("submit", doAdd); - } - }); + ;( + panelBlockElement.querySelector( + '.button--moveOccupancyTypeFieldDown' + ) as HTMLButtonElement + ).addEventListener('click', moveOccupancyTypeField) + + panelElement.append(panelBlockElement) + } } + } - function moveOccupancyTypePrint(clickEvent: MouseEvent): void { - const buttonElement = clickEvent.currentTarget as HTMLButtonElement; + function openAddOccupancyTypePrint(clickEvent: Event): void { + const occupancyTypeId = ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--occupancyTypePrintList' + ) as HTMLElement + ).dataset.occupancyTypeId! - const printEJS = (buttonElement.closest(".container--occupancyTypePrint") as HTMLElement) - .dataset.printEJS; + let closeAddModalFunction: () => void - const occupancyTypeId = ( - buttonElement.closest(".container--occupancyTypePrintList") as HTMLElement - ).dataset.occupancyTypeId; + function doAdd(formEvent: SubmitEvent) { + formEvent.preventDefault() - cityssm.postJSON( - los.urlPrefix + - "/admin/" + - (buttonElement.dataset.direction === "up" - ? "doMoveOccupancyTypePrintUp" - : "doMoveOccupancyTypePrintDown"), - { - occupancyTypeId, - printEJS, - moveToEnd: clickEvent.shiftKey ? "1" : "0" - }, - occupancyTypeResponseHandler - ); - } + cityssm.postJSON( + los.urlPrefix + '/admin/doAddOccupancyTypePrint', + formEvent.currentTarget, + (responseJSON: { + success: boolean + errorMessage?: string + occupancyTypes?: recordTypes.OccupancyType[] + allOccupancyTypeFields?: recordTypes.OccupancyTypeField[] + }) => { + if (responseJSON.success) { + closeAddModalFunction() + } - function deleteOccupancyTypePrint(clickEvent: Event): void { - clickEvent.preventDefault(); - - const printEJS = ( - (clickEvent.currentTarget as HTMLElement).closest( - ".container--occupancyTypePrint" - ) as HTMLElement - ).dataset.printEJS; - - const occupancyTypeId = ( - (clickEvent.currentTarget as HTMLElement).closest( - ".container--occupancyTypePrintList" - ) as HTMLElement - ).dataset.occupancyTypeId; - - function doDelete() { - cityssm.postJSON( - los.urlPrefix + "/admin/doDeleteOccupancyTypePrint", - { - occupancyTypeId, - printEJS - }, - occupancyTypeResponseHandler - ); + occupancyTypeResponseHandler(responseJSON) } - - bulmaJS.confirm({ - title: "Delete Print", - message: "Are you sure you want to remove this print option?", - contextualColorName: "warning", - okButton: { - text: "Yes, Remove Print", - callbackFunction: doDelete - } - }); + ) } - function renderOccupancyTypePrints( - panelElement: HTMLElement, - occupancyTypeId: number, - occupancyTypePrints: string[] - ): void { - if (occupancyTypePrints.length === 0) { - panelElement.insertAdjacentHTML( - "beforeend", - `
+ cityssm.openHtmlModal('adminOccupancyTypes-addOccupancyTypePrint', { + onshow(modalElement) { + los.populateAliases(modalElement) + + ;( + modalElement.querySelector( + '#occupancyTypePrintAdd--occupancyTypeId' + ) as HTMLInputElement + ).value = occupancyTypeId + + const printSelectElement = modalElement.querySelector( + '#occupancyTypePrintAdd--printEJS' + ) as HTMLSelectElement + + for (const [printEJS, printTitle] of Object.entries( + exports.occupancyTypePrintTitles + )) { + const optionElement = document.createElement('option') + optionElement.value = printEJS + optionElement.textContent = printTitle as string + printSelectElement.append(optionElement) + } + }, + onshown(modalElement, closeModalFunction) { + closeAddModalFunction = closeModalFunction + + modalElement.querySelector('form')?.addEventListener('submit', doAdd) + } + }) + } + + function moveOccupancyTypePrint(clickEvent: MouseEvent): void { + const buttonElement = clickEvent.currentTarget as HTMLButtonElement + + const printEJS = ( + buttonElement.closest('.container--occupancyTypePrint') as HTMLElement + ).dataset.printEJS + + const occupancyTypeId = ( + buttonElement.closest('.container--occupancyTypePrintList') as HTMLElement + ).dataset.occupancyTypeId + + cityssm.postJSON( + los.urlPrefix + + '/admin/' + + (buttonElement.dataset.direction === 'up' + ? 'doMoveOccupancyTypePrintUp' + : 'doMoveOccupancyTypePrintDown'), + { + occupancyTypeId, + printEJS, + moveToEnd: clickEvent.shiftKey ? '1' : '0' + }, + occupancyTypeResponseHandler + ) + } + + function deleteOccupancyTypePrint(clickEvent: Event): void { + clickEvent.preventDefault() + + const printEJS = ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--occupancyTypePrint' + ) as HTMLElement + ).dataset.printEJS + + const occupancyTypeId = ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--occupancyTypePrintList' + ) as HTMLElement + ).dataset.occupancyTypeId + + function doDelete() { + cityssm.postJSON( + los.urlPrefix + '/admin/doDeleteOccupancyTypePrint', + { + occupancyTypeId, + printEJS + }, + occupancyTypeResponseHandler + ) + } + + bulmaJS.confirm({ + title: 'Delete Print', + message: 'Are you sure you want to remove this print option?', + contextualColorName: 'warning', + okButton: { + text: 'Yes, Remove Print', + callbackFunction: doDelete + } + }) + } + + function renderOccupancyTypePrints( + panelElement: HTMLElement, + occupancyTypeId: number, + occupancyTypePrints: string[] + ): void { + if (occupancyTypePrints.length === 0) { + panelElement.insertAdjacentHTML( + 'beforeend', + `

There are no prints associated with this record.

` - ); - } else { - for (const printEJS of occupancyTypePrints) { - const panelBlockElement = document.createElement("div"); - panelBlockElement.className = "panel-block is-block container--occupancyTypePrint"; + ) + } else { + for (const printEJS of occupancyTypePrints) { + const panelBlockElement = document.createElement('div') + panelBlockElement.className = + 'panel-block is-block container--occupancyTypePrint' - panelBlockElement.dataset.printEJS = printEJS; + panelBlockElement.dataset.printEJS = printEJS - const printTitle = - printEJS === "*" - ? "(All Available Prints)" - : (exports.occupancyTypePrintTitles[printEJS] as string); + const printTitle = + printEJS === '*' + ? '(All Available Prints)' + : (exports.occupancyTypePrintTitles[printEJS] as string) - let printIconClass = "fa-star"; + let printIconClass = 'fa-star' - if (printEJS.startsWith("pdf/")) { - printIconClass = "fa-file-pdf"; - } else if (printEJS.startsWith("screen/")) { - printIconClass = "fa-file"; - } - - panelBlockElement.innerHTML = - '
' + - '
' + - ('
' + - '' + - "
") + - ('
' + - cityssm.escapeHTML(printTitle || printEJS) + - "
") + - "
" + - '
' + - ('
' + - los.getMoveUpDownButtonFieldHTML( - "button--moveOccupancyTypePrintUp", - "button--moveOccupancyTypePrintDown" - ) + - "
") + - ('
' + - '" + - "
" + - "
") + - "
" + - "
"; - - ( - panelBlockElement.querySelector( - ".button--moveOccupancyTypePrintUp" - ) as HTMLButtonElement - ).addEventListener("click", moveOccupancyTypePrint); - - ( - panelBlockElement.querySelector( - ".button--moveOccupancyTypePrintDown" - ) as HTMLButtonElement - ).addEventListener("click", moveOccupancyTypePrint); - - panelBlockElement - .querySelector(".button--deleteOccupancyTypePrint")! - .addEventListener("click", deleteOccupancyTypePrint); - - panelElement.append(panelBlockElement); - } + if (printEJS.startsWith('pdf/')) { + printIconClass = 'fa-file-pdf' + } else if (printEJS.startsWith('screen/')) { + printIconClass = 'fa-file' } + + panelBlockElement.innerHTML = + '
' + + '
' + + ('
' + + '' + + '
') + + ('
' + + cityssm.escapeHTML(printTitle || printEJS) + + '
') + + '
' + + '
' + + ('
' + + los.getMoveUpDownButtonFieldHTML( + 'button--moveOccupancyTypePrintUp', + 'button--moveOccupancyTypePrintDown' + ) + + '
') + + ('
' + + '' + + '
' + + '
') + + '
' + + '' + + ;( + panelBlockElement.querySelector( + '.button--moveOccupancyTypePrintUp' + ) as HTMLButtonElement + ).addEventListener('click', moveOccupancyTypePrint) + + ;( + panelBlockElement.querySelector( + '.button--moveOccupancyTypePrintDown' + ) as HTMLButtonElement + ).addEventListener('click', moveOccupancyTypePrint) + + panelBlockElement + .querySelector('.button--deleteOccupancyTypePrint')! + .addEventListener('click', deleteOccupancyTypePrint) + + panelElement.append(panelBlockElement) + } + } + } + + function renderOccupancyTypes(): void { + occupancyTypesContainerElement.innerHTML = + '
' + + '
' + + ('
' + + ('
' + + '
' + + ('

(All ' + + cityssm.escapeHTML(exports.aliases.occupancy) + + ' Types)

') + + '
' + + '
') + + ('
' + + ('
' + + '' + + '
') + + '
') + + '
') + + '
' + + '
' + + occupancyTypePrintsContainerElement.innerHTML = '' + + renderOccupancyTypeFields( + occupancyTypesContainerElement.querySelector( + '#container--allOccupancyTypeFields' + ) as HTMLElement, + undefined, + allOccupancyTypeFields + ) + + occupancyTypesContainerElement + .querySelector('.button--addOccupancyTypeField')! + .addEventListener('click', openAddOccupancyTypeField) + + if (occupancyTypes.length === 0) { + occupancyTypesContainerElement.insertAdjacentHTML( + 'afterbegin', + `
There are no active ${los.escapedAliases.occupancy} types.

+
` + ) + + occupancyTypePrintsContainerElement.insertAdjacentHTML( + 'afterbegin', + `
There are no active ${los.escapedAliases.occupancy} types.

+
` + ) + + return } - function renderOccupancyTypes(): void { - occupancyTypesContainerElement.innerHTML = - '
' + - '
' + - ('
' + - ('
' + - '
' + - ('

(All ' + - cityssm.escapeHTML(exports.aliases.occupancy) + - " Types)

") + - "
" + - "
") + - ('
' + - ('
' + - '" + - "
") + - "
") + - "
") + - "
" + - "
"; + for (const occupancyType of occupancyTypes) { + // Types and Fields + { + const occupancyTypeContainer = document.createElement('div') - occupancyTypePrintsContainerElement.innerHTML = ""; + occupancyTypeContainer.className = 'panel container--occupancyType' + + occupancyTypeContainer.dataset.occupancyTypeId = + occupancyType.occupancyTypeId.toString() + + occupancyTypeContainer.innerHTML = + '
' + + '
' + + ('
' + + '
' + + '' + + '
' + + '
' + + '

' + + cityssm.escapeHTML(occupancyType.occupancyType) + + '

' + + '
' + + '
') + + ('
' + + ('
' + + '' + + '
') + + ('
' + + '' + + '
') + + ('
' + + '' + + '
') + + ('
' + + los.getMoveUpDownButtonFieldHTML( + 'button--moveOccupancyTypeUp', + 'button--moveOccupancyTypeDown' + ) + + '
') + + '
') + + '
' + + '
' renderOccupancyTypeFields( - occupancyTypesContainerElement.querySelector( - "#container--allOccupancyTypeFields" - ) as HTMLElement, - undefined, - allOccupancyTypeFields - ); + occupancyTypeContainer, + occupancyType.occupancyTypeId, + occupancyType.occupancyTypeFields! + ) - occupancyTypesContainerElement - .querySelector(".button--addOccupancyTypeField")! - .addEventListener("click", openAddOccupancyTypeField); + occupancyTypeContainer + .querySelector('.button--toggleOccupancyTypeFields')! + .addEventListener('click', toggleOccupancyTypeFields) - if (occupancyTypes.length === 0) { - occupancyTypesContainerElement.insertAdjacentHTML( - "afterbegin", - `
There are no active ${los.escapedAliases.occupancy} types.

-
` - ); + occupancyTypeContainer + .querySelector('.button--deleteOccupancyType')! + .addEventListener('click', deleteOccupancyType) - occupancyTypePrintsContainerElement.insertAdjacentHTML( - "afterbegin", - `
There are no active ${los.escapedAliases.occupancy} types.

-
` - ); + occupancyTypeContainer + .querySelector('.button--editOccupancyType')! + .addEventListener('click', openEditOccupancyType) - return; - } + occupancyTypeContainer + .querySelector('.button--addOccupancyTypeField')! + .addEventListener('click', openAddOccupancyTypeField) - for (const occupancyType of occupancyTypes) { - // Types and Fields - { - const occupancyTypeContainer = document.createElement("div"); + ;( + occupancyTypeContainer.querySelector( + '.button--moveOccupancyTypeUp' + ) as HTMLButtonElement + ).addEventListener('click', moveOccupancyType) - occupancyTypeContainer.className = "panel container--occupancyType"; + ;( + occupancyTypeContainer.querySelector( + '.button--moveOccupancyTypeDown' + ) as HTMLButtonElement + ).addEventListener('click', moveOccupancyType) - occupancyTypeContainer.dataset.occupancyTypeId = - occupancyType.occupancyTypeId.toString(); + occupancyTypesContainerElement.append(occupancyTypeContainer) + } - occupancyTypeContainer.innerHTML = - '
' + - '
' + - ('
' + - '
' + - '" + - "
" + - '
' + - '

' + - cityssm.escapeHTML(occupancyType.occupancyType) + - "

" + - "
" + - "
") + - ('
' + - ('
' + - '" + - "
") + - ('
' + - '" + - "
") + - ('
' + - '" + - "
") + - ('
' + - los.getMoveUpDownButtonFieldHTML( - "button--moveOccupancyTypeUp", - "button--moveOccupancyTypeDown" - ) + - "
") + - "
") + - "
" + - "
"; + // Prints + { + const occupancyTypePrintContainer = document.createElement('div') - renderOccupancyTypeFields( - occupancyTypeContainer, - occupancyType.occupancyTypeId, - occupancyType.occupancyTypeFields! - ); + occupancyTypePrintContainer.className = + 'panel container--occupancyTypePrintList' - occupancyTypeContainer - .querySelector(".button--toggleOccupancyTypeFields")! - .addEventListener("click", toggleOccupancyTypeFields); + occupancyTypePrintContainer.dataset.occupancyTypeId = + occupancyType.occupancyTypeId.toString() - occupancyTypeContainer - .querySelector(".button--deleteOccupancyType")! - .addEventListener("click", deleteOccupancyType); + occupancyTypePrintContainer.innerHTML = + '
' + + '
' + + ('
' + + '
' + + '

' + + cityssm.escapeHTML(occupancyType.occupancyType) + + '

' + + '
' + + '
') + + ('
' + + ('
' + + '' + + '
') + + '
') + + '
' + + '
' - occupancyTypeContainer - .querySelector(".button--editOccupancyType")! - .addEventListener("click", openEditOccupancyType); + renderOccupancyTypePrints( + occupancyTypePrintContainer, + occupancyType.occupancyTypeId, + occupancyType.occupancyTypePrints! + ) - occupancyTypeContainer - .querySelector(".button--addOccupancyTypeField")! - .addEventListener("click", openAddOccupancyTypeField); + occupancyTypePrintContainer + .querySelector('.button--addOccupancyTypePrint')! + .addEventListener('click', openAddOccupancyTypePrint) - ( - occupancyTypeContainer.querySelector( - ".button--moveOccupancyTypeUp" - ) as HTMLButtonElement - ).addEventListener("click", moveOccupancyType); - - ( - occupancyTypeContainer.querySelector( - ".button--moveOccupancyTypeDown" - ) as HTMLButtonElement - ).addEventListener("click", moveOccupancyType); - - occupancyTypesContainerElement.append(occupancyTypeContainer); - } - - // Prints - { - const occupancyTypePrintContainer = document.createElement("div"); - - occupancyTypePrintContainer.className = "panel container--occupancyTypePrintList"; - - occupancyTypePrintContainer.dataset.occupancyTypeId = - occupancyType.occupancyTypeId.toString(); - - occupancyTypePrintContainer.innerHTML = - '
' + - '
' + - ('
' + - '
' + - '

' + - cityssm.escapeHTML(occupancyType.occupancyType) + - "

" + - "
" + - "
") + - ('
' + - ('
' + - '" + - "
") + - "
") + - "
" + - "
"; - - renderOccupancyTypePrints( - occupancyTypePrintContainer, - occupancyType.occupancyTypeId, - occupancyType.occupancyTypePrints! - ); - - occupancyTypePrintContainer - .querySelector(".button--addOccupancyTypePrint")! - .addEventListener("click", openAddOccupancyTypePrint); - - occupancyTypePrintsContainerElement.append(occupancyTypePrintContainer); - } - } + occupancyTypePrintsContainerElement.append(occupancyTypePrintContainer) + } } + } - document.querySelector("#button--addOccupancyType")!.addEventListener("click", () => { - let addCloseModalFunction: () => void; + document + .querySelector('#button--addOccupancyType')! + .addEventListener('click', () => { + let addCloseModalFunction: () => void - const doAdd = (submitEvent: SubmitEvent) => { - submitEvent.preventDefault(); + const doAdd = (submitEvent: SubmitEvent) => { + submitEvent.preventDefault() - cityssm.postJSON( - los.urlPrefix + "/admin/doAddOccupancyType", - submitEvent.currentTarget, - (responseJSON: { - success: boolean; - errorMessage?: string; - occupancyTypes?: recordTypes.OccupancyType[]; - }) => { - if (responseJSON.success) { - addCloseModalFunction(); - occupancyTypes = responseJSON.occupancyTypes!; - renderOccupancyTypes(); - } else { - bulmaJS.alert({ - title: "Error Adding " + exports.aliases.occupancy + " Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }; - - cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyType", { - onshow: (modalElement) => { - los.populateAliases(modalElement); - }, - onshown: (modalElement, closeModalFunction) => { - addCloseModalFunction = closeModalFunction; - - ( - modalElement.querySelector( - "#occupancyTypeAdd--occupancyType" - ) as HTMLInputElement - ).focus(); - - modalElement.querySelector("form")!.addEventListener("submit", doAdd); - - bulmaJS.toggleHtmlClipped(); - }, - onremoved: () => { - bulmaJS.toggleHtmlClipped(); + cityssm.postJSON( + los.urlPrefix + '/admin/doAddOccupancyType', + submitEvent.currentTarget, + (responseJSON: { + success: boolean + errorMessage?: string + occupancyTypes?: recordTypes.OccupancyType[] + }) => { + if (responseJSON.success) { + addCloseModalFunction() + occupancyTypes = responseJSON.occupancyTypes! + renderOccupancyTypes() + } else { + bulmaJS.alert({ + title: 'Error Adding ' + exports.aliases.occupancy + ' Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) } - }); - }); + } + ) + } - renderOccupancyTypes(); -})(); + cityssm.openHtmlModal('adminOccupancyTypes-addOccupancyType', { + onshow: (modalElement) => { + los.populateAliases(modalElement) + }, + onshown: (modalElement, closeModalFunction) => { + addCloseModalFunction = closeModalFunction + + ;( + modalElement.querySelector( + '#occupancyTypeAdd--occupancyType' + ) as HTMLInputElement + ).focus() + + modalElement.querySelector('form')!.addEventListener('submit', doAdd) + + bulmaJS.toggleHtmlClipped() + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped() + } + }) + }) + + renderOccupancyTypes() +})() diff --git a/public-typescript/adminTables.js b/public-typescript/adminTables.js index c6ac93d8..9237b862 100644 --- a/public-typescript/adminTables.js +++ b/public-typescript/adminTables.js @@ -9,8 +9,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); const inputElement = changeEvent.currentTarget; const fontAwesomeIconClass = inputElement.value; inputElement - .closest(".field") - .querySelectorAll(".button.is-static")[1].innerHTML = ``; + .closest('.field') + .querySelectorAll('.button.is-static')[1].innerHTML = ``; } "use strict"; /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ @@ -19,28 +19,28 @@ Object.defineProperty(exports, "__esModule", { value: true }); delete exports.workOrderTypes; const updateWorkOrderType = (submitEvent) => { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/admin/doUpdateWorkOrderType", submitEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doUpdateWorkOrderType', submitEvent.currentTarget, (responseJSON) => { if (responseJSON.success) { workOrderTypes = responseJSON.workOrderTypes; bulmaJS.alert({ - message: "Work Order Type Updated Successfully", - contextualColorName: "success" + message: 'Work Order Type Updated Successfully', + contextualColorName: 'success' }); } else { bulmaJS.alert({ - title: "Error Updating Work Order Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Updating Work Order Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; const deleteWorkOrderType = (clickEvent) => { - const tableRowElement = clickEvent.currentTarget.closest("tr"); + const tableRowElement = clickEvent.currentTarget.closest('tr'); const workOrderTypeId = tableRowElement.dataset.workOrderTypeId; const doDelete = () => { - cityssm.postJSON(los.urlPrefix + "/admin/doDeleteWorkOrderType", { + cityssm.postJSON(los.urlPrefix + '/admin/doDeleteWorkOrderType', { workOrderTypeId }, (responseJSON) => { if (responseJSON.success) { @@ -52,40 +52,40 @@ Object.defineProperty(exports, "__esModule", { value: true }); tableRowElement.remove(); } bulmaJS.alert({ - message: "Work Order Type Deleted Successfully", - contextualColorName: "success" + message: 'Work Order Type Deleted Successfully', + contextualColorName: 'success' }); } else { bulmaJS.alert({ - title: "Error Deleting Work Order Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Deleting Work Order Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; bulmaJS.confirm({ - title: "Delete Work Order Type", + title: 'Delete Work Order Type', message: `Are you sure you want to delete this work order type?
Note that no work orders will be removed.`, messageIsHtml: true, - contextualColorName: "warning", + contextualColorName: 'warning', okButton: { - text: "Yes, Delete Work Order Type", + text: 'Yes, Delete Work Order Type', callbackFunction: doDelete } }); }; const moveWorkOrderType = (clickEvent) => { const buttonElement = clickEvent.currentTarget; - const tableRowElement = buttonElement.closest("tr"); + const tableRowElement = buttonElement.closest('tr'); const workOrderTypeId = tableRowElement.dataset.workOrderTypeId; cityssm.postJSON(los.urlPrefix + - "/admin/" + - (buttonElement.dataset.direction === "up" ? "doMoveWorkOrderTypeUp" : "doMoveWorkOrderTypeDown"), { + '/admin/' + + (buttonElement.dataset.direction === 'up' ? 'doMoveWorkOrderTypeUp' : 'doMoveWorkOrderTypeDown'), { workOrderTypeId, - moveToEnd: clickEvent.shiftKey ? "1" : "0" + moveToEnd: clickEvent.shiftKey ? '1' : '0' }, (responseJSON) => { if (responseJSON.success) { workOrderTypes = responseJSON.workOrderTypes; @@ -93,79 +93,79 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Moving Work Order Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Moving Work Order Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; const renderWorkOrderTypes = () => { - const containerElement = document.querySelector("#container--workOrderTypes"); + const containerElement = document.querySelector('#container--workOrderTypes'); if (workOrderTypes.length === 0) { containerElement.innerHTML = `

There are no active work order types.

`; return; } - containerElement.innerHTML = ""; + containerElement.innerHTML = ''; for (const workOrderType of workOrderTypes) { - const tableRowElement = document.createElement("tr"); + const tableRowElement = document.createElement('tr'); tableRowElement.dataset.workOrderTypeId = workOrderType.workOrderTypeId.toString(); tableRowElement.innerHTML = - "" + - "
" + + '' + + '' + '' + ('
' + '
' + '' + - "
" + + '
' + '
' + '' + - "
" + - "") + - "
" + - "" + + '' + + '') + + '' + + '' + '' + '
' + '
' + - los.getMoveUpDownButtonFieldHTML("button--moveWorkOrderTypeUp", "button--moveWorkOrderTypeDown", false) + - "
" + + los.getMoveUpDownButtonFieldHTML('button--moveWorkOrderTypeUp', 'button--moveWorkOrderTypeDown', false) + + '
' + '
' + '" + - "
" + - "" + - ""; - tableRowElement.querySelector("form").addEventListener("submit", updateWorkOrderType); - tableRowElement.querySelector(".button--moveWorkOrderTypeUp").addEventListener("click", moveWorkOrderType); - tableRowElement.querySelector(".button--moveWorkOrderTypeDown").addEventListener("click", moveWorkOrderType); + '' + + '' + + '' + + ''; + tableRowElement.querySelector('form').addEventListener('submit', updateWorkOrderType); + tableRowElement.querySelector('.button--moveWorkOrderTypeUp').addEventListener('click', moveWorkOrderType); + tableRowElement.querySelector('.button--moveWorkOrderTypeDown').addEventListener('click', moveWorkOrderType); tableRowElement - .querySelector(".button--deleteWorkOrderType") - .addEventListener("click", deleteWorkOrderType); + .querySelector('.button--deleteWorkOrderType') + .addEventListener('click', deleteWorkOrderType); containerElement.append(tableRowElement); } }; - document.querySelector("#form--addWorkOrderType").addEventListener("submit", (submitEvent) => { + document.querySelector('#form--addWorkOrderType').addEventListener('submit', (submitEvent) => { submitEvent.preventDefault(); const formElement = submitEvent.currentTarget; - cityssm.postJSON(los.urlPrefix + "/admin/doAddWorkOrderType", formElement, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doAddWorkOrderType', formElement, (responseJSON) => { if (responseJSON.success) { workOrderTypes = responseJSON.workOrderTypes; renderWorkOrderTypes(); formElement.reset(); - formElement.querySelector("input").focus(); + formElement.querySelector('input').focus(); } else { bulmaJS.alert({ - title: "Error Adding Work Order Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Adding Work Order Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); @@ -179,28 +179,28 @@ Object.defineProperty(exports, "__esModule", { value: true }); delete exports.workOrderMilestoneTypes; const updateWorkOrderMilestoneType = (submitEvent) => { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/admin/doUpdateWorkOrderMilestoneType", submitEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doUpdateWorkOrderMilestoneType', submitEvent.currentTarget, (responseJSON) => { if (responseJSON.success) { workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes; bulmaJS.alert({ - message: "Work Order Milestone Type Updated Successfully", - contextualColorName: "success" + message: 'Work Order Milestone Type Updated Successfully', + contextualColorName: 'success' }); } else { bulmaJS.alert({ - title: "Error Updating Work Order Milestone Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Updating Work Order Milestone Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; const deleteWorkOrderMilestoneType = (clickEvent) => { - const tableRowElement = clickEvent.currentTarget.closest("tr"); + const tableRowElement = clickEvent.currentTarget.closest('tr'); const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId; const doDelete = () => { - cityssm.postJSON(los.urlPrefix + "/admin/doDeleteWorkOrderMilestoneType", { + cityssm.postJSON(los.urlPrefix + '/admin/doDeleteWorkOrderMilestoneType', { workOrderMilestoneTypeId }, (responseJSON) => { if (responseJSON.success) { @@ -212,42 +212,42 @@ Object.defineProperty(exports, "__esModule", { value: true }); tableRowElement.remove(); } bulmaJS.alert({ - message: "Work Order Milestone Type Deleted Successfully", - contextualColorName: "success" + message: 'Work Order Milestone Type Deleted Successfully', + contextualColorName: 'success' }); } else { bulmaJS.alert({ - title: "Error Deleting Work Order Milestone Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Deleting Work Order Milestone Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; 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?
Note that no work orders will be removed.`, messageIsHtml: true, - contextualColorName: "warning", + contextualColorName: 'warning', okButton: { - text: "Yes, Delete Work Order Milestone Type", + text: 'Yes, Delete Work Order Milestone Type', callbackFunction: doDelete } }); }; const moveWorkOrderMilestoneType = (clickEvent) => { const buttonElement = clickEvent.currentTarget; - const tableRowElement = buttonElement.closest("tr"); + const tableRowElement = buttonElement.closest('tr'); const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId; cityssm.postJSON(los.urlPrefix + - "/admin/" + - (buttonElement.dataset.direction === "up" - ? "doMoveWorkOrderMilestoneTypeUp" - : "doMoveWorkOrderMilestoneTypeDown"), { + '/admin/' + + (buttonElement.dataset.direction === 'up' + ? 'doMoveWorkOrderMilestoneTypeUp' + : 'doMoveWorkOrderMilestoneTypeDown'), { workOrderMilestoneTypeId, - moveToEnd: clickEvent.shiftKey ? "1" : "0" + moveToEnd: clickEvent.shiftKey ? '1' : '0' }, (responseJSON) => { if (responseJSON.success) { workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes; @@ -255,29 +255,29 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Moving Work Order Milestone Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Moving Work Order Milestone Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; const renderWorkOrderMilestoneTypes = () => { - const containerElement = document.querySelector("#container--workOrderMilestoneTypes"); + const containerElement = document.querySelector('#container--workOrderMilestoneTypes'); if (workOrderMilestoneTypes.length === 0) { containerElement.innerHTML = `

There are no active work order milestone types.

`; return; } - containerElement.innerHTML = ""; + containerElement.innerHTML = ''; for (const workOrderMilestoneType of workOrderMilestoneTypes) { - const tableRowElement = document.createElement("tr"); + const tableRowElement = document.createElement('tr'); tableRowElement.dataset.workOrderMilestoneTypeId = workOrderMilestoneType.workOrderMilestoneTypeId.toString(); tableRowElement.innerHTML = - "" + - "
" + + '' + + '' + '' + @@ -286,49 +286,49 @@ Object.defineProperty(exports, "__esModule", { value: true }); '' + - "" + + '' + '
' + '' + - "
" + - "") + - "
" + - "" + + '' + + '') + + '' + + '' + '' + '
' + '
' + - los.getMoveUpDownButtonFieldHTML("button--moveWorkOrderMilestoneTypeUp", "button--moveWorkOrderMilestoneTypeDown", false) + - "
" + + los.getMoveUpDownButtonFieldHTML('button--moveWorkOrderMilestoneTypeUp', 'button--moveWorkOrderMilestoneTypeDown', false) + + '
' + '
' + '" + - "
" + - "" + - ""; - tableRowElement.querySelector("form").addEventListener("submit", updateWorkOrderMilestoneType); - tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeUp").addEventListener("click", moveWorkOrderMilestoneType); - tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeDown").addEventListener("click", moveWorkOrderMilestoneType); + '' + + '' + + '' + + ''; + tableRowElement.querySelector('form').addEventListener('submit', updateWorkOrderMilestoneType); + tableRowElement.querySelector('.button--moveWorkOrderMilestoneTypeUp').addEventListener('click', moveWorkOrderMilestoneType); + tableRowElement.querySelector('.button--moveWorkOrderMilestoneTypeDown').addEventListener('click', moveWorkOrderMilestoneType); tableRowElement - .querySelector(".button--deleteWorkOrderMilestoneType") - .addEventListener("click", deleteWorkOrderMilestoneType); + .querySelector('.button--deleteWorkOrderMilestoneType') + .addEventListener('click', deleteWorkOrderMilestoneType); containerElement.append(tableRowElement); } }; - document.querySelector("#form--addWorkOrderMilestoneType").addEventListener("submit", (submitEvent) => { + document.querySelector('#form--addWorkOrderMilestoneType').addEventListener('submit', (submitEvent) => { submitEvent.preventDefault(); const formElement = submitEvent.currentTarget; - cityssm.postJSON(los.urlPrefix + "/admin/doAddWorkOrderMilestoneType", formElement, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doAddWorkOrderMilestoneType', formElement, (responseJSON) => { if (responseJSON.success) { workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes; renderWorkOrderMilestoneTypes(); formElement.reset(); - formElement.querySelector("input").focus(); + formElement.querySelector('input').focus(); } else { bulmaJS.alert({ - title: "Error Adding Work Order Milestone Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Adding Work Order Milestone Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); @@ -342,28 +342,28 @@ Object.defineProperty(exports, "__esModule", { value: true }); delete exports.lotStatuses; const updateLotStatus = (submitEvent) => { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/admin/doUpdateLotStatus", submitEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doUpdateLotStatus', submitEvent.currentTarget, (responseJSON) => { if (responseJSON.success) { lotStatuses = responseJSON.lotStatuses; bulmaJS.alert({ - message: los.escapedAliases.Lot + " Status Updated Successfully", - contextualColorName: "success" + message: los.escapedAliases.Lot + ' Status Updated Successfully', + contextualColorName: 'success' }); } else { bulmaJS.alert({ - title: "Error Updating " + los.escapedAliases.Lot + " Status", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Updating ' + los.escapedAliases.Lot + ' Status', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; const deleteLotStatus = (clickEvent) => { - const tableRowElement = clickEvent.currentTarget.closest("tr"); + const tableRowElement = clickEvent.currentTarget.closest('tr'); const lotStatusId = tableRowElement.dataset.lotStatusId; const doDelete = () => { - cityssm.postJSON(los.urlPrefix + "/admin/doDeleteLotStatus", { + cityssm.postJSON(los.urlPrefix + '/admin/doDeleteLotStatus', { lotStatusId }, (responseJSON) => { if (responseJSON.success) { @@ -375,15 +375,15 @@ Object.defineProperty(exports, "__esModule", { value: true }); tableRowElement.remove(); } bulmaJS.alert({ - message: los.escapedAliases.Lot + " Status Deleted Successfully", - contextualColorName: "success" + message: los.escapedAliases.Lot + ' Status Deleted Successfully', + contextualColorName: 'success' }); } else { bulmaJS.alert({ - title: "Error Deleting " + los.escapedAliases.Lot + " Status", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Deleting ' + los.escapedAliases.Lot + ' Status', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); @@ -393,22 +393,22 @@ Object.defineProperty(exports, "__esModule", { value: true }); message: `Are you sure you want to delete this status?
Note that no ${los.escapedAliases.lot} will be removed.`, messageIsHtml: true, - contextualColorName: "warning", + contextualColorName: 'warning', okButton: { - text: "Yes, Delete Status", + text: 'Yes, Delete Status', callbackFunction: doDelete } }); }; const moveLotStatus = (clickEvent) => { const buttonElement = clickEvent.currentTarget; - const tableRowElement = buttonElement.closest("tr"); + const tableRowElement = buttonElement.closest('tr'); const lotStatusId = tableRowElement.dataset.lotStatusId; cityssm.postJSON(los.urlPrefix + - "/admin/" + - (buttonElement.dataset.direction === "up" ? "doMoveLotStatusUp" : "doMoveLotStatusDown"), { + '/admin/' + + (buttonElement.dataset.direction === 'up' ? 'doMoveLotStatusUp' : 'doMoveLotStatusDown'), { lotStatusId, - moveToEnd: clickEvent.shiftKey ? "1" : "0" + moveToEnd: clickEvent.shiftKey ? '1' : '0' }, (responseJSON) => { if (responseJSON.success) { lotStatuses = responseJSON.lotStatuses; @@ -416,28 +416,28 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Moving " + exports.aliases.lot + " Status", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Moving ' + exports.aliases.lot + ' Status', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; const renderLotStatuses = () => { - const containerElement = document.querySelector("#container--lotStatuses"); + const containerElement = document.querySelector('#container--lotStatuses'); if (lotStatuses.length === 0) { containerElement.innerHTML = `

There are no active ${los.escapedAliases.lot} statuses.

`; return; } - containerElement.innerHTML = ""; + containerElement.innerHTML = ''; for (const lotStatus of lotStatuses) { - const tableRowElement = document.createElement("tr"); + const tableRowElement = document.createElement('tr'); tableRowElement.dataset.lotStatusId = lotStatus.lotStatusId.toString(); tableRowElement.innerHTML = - "" + - "
" + + '' + + '' + '' + @@ -447,47 +447,47 @@ Object.defineProperty(exports, "__esModule", { value: true }); (' value="' + cityssm.escapeHTML(lotStatus.lotStatus) + '"') + (' aria-label="' + cityssm.escapeHTML(exports.aliases.lot) + ' Status"') + ' maxlength="100" required />' + - "" + + '' + '
' + '' + - "
" + - "") + - "
" + - "" + + '' + + '') + + '' + + '' + '' + '
' + '
' + - los.getMoveUpDownButtonFieldHTML("button--moveLotStatusUp", "button--moveLotStatusDown", false) + - "
" + + los.getMoveUpDownButtonFieldHTML('button--moveLotStatusUp', 'button--moveLotStatusDown', false) + + '
' + '
' + '" + - "
" + - "" + - ""; - tableRowElement.querySelector("form").addEventListener("submit", updateLotStatus); - tableRowElement.querySelector(".button--moveLotStatusUp").addEventListener("click", moveLotStatus); - tableRowElement.querySelector(".button--moveLotStatusDown").addEventListener("click", moveLotStatus); - tableRowElement.querySelector(".button--deleteLotStatus").addEventListener("click", deleteLotStatus); + '' + + '' + + '' + + ''; + tableRowElement.querySelector('form').addEventListener('submit', updateLotStatus); + tableRowElement.querySelector('.button--moveLotStatusUp').addEventListener('click', moveLotStatus); + tableRowElement.querySelector('.button--moveLotStatusDown').addEventListener('click', moveLotStatus); + tableRowElement.querySelector('.button--deleteLotStatus').addEventListener('click', deleteLotStatus); containerElement.append(tableRowElement); } }; - document.querySelector("#form--addLotStatus").addEventListener("submit", (submitEvent) => { + document.querySelector('#form--addLotStatus').addEventListener('submit', (submitEvent) => { submitEvent.preventDefault(); const formElement = submitEvent.currentTarget; - cityssm.postJSON(los.urlPrefix + "/admin/doAddLotStatus", formElement, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doAddLotStatus', formElement, (responseJSON) => { if (responseJSON.success) { lotStatuses = responseJSON.lotStatuses; renderLotStatuses(); formElement.reset(); - formElement.querySelector("input").focus(); + formElement.querySelector('input').focus(); } else { bulmaJS.alert({ title: `Error Adding ${los.escapedAliases.Lot} Status`, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); @@ -501,28 +501,28 @@ Object.defineProperty(exports, "__esModule", { value: true }); delete exports.lotOccupantTypes; const updateLotOccupantType = (submitEvent) => { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/admin/doUpdateLotOccupantType", submitEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doUpdateLotOccupantType', submitEvent.currentTarget, (responseJSON) => { if (responseJSON.success) { lotOccupantTypes = responseJSON.lotOccupantTypes; bulmaJS.alert({ message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Updated Successfully`, - contextualColorName: "success" + contextualColorName: 'success' }); } else { bulmaJS.alert({ title: `Error Updating ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; const deleteLotOccupantType = (clickEvent) => { - const tableRowElement = clickEvent.currentTarget.closest("tr"); + const tableRowElement = clickEvent.currentTarget.closest('tr'); const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId; const doDelete = () => { - cityssm.postJSON(los.urlPrefix + "/admin/doDeleteLotOccupantType", { + cityssm.postJSON(los.urlPrefix + '/admin/doDeleteLotOccupantType', { lotOccupantTypeId }, (responseJSON) => { if (responseJSON.success) { @@ -535,14 +535,14 @@ Object.defineProperty(exports, "__esModule", { value: true }); } bulmaJS.alert({ message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Deleted Successfully`, - contextualColorName: "success" + contextualColorName: 'success' }); } else { bulmaJS.alert({ title: `Error Deleting ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + message: responseJSON.errorMessage || '', + 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?
Note that no ${los.escapedAliases.lot} ${los.escapedAliases.occupants} will be removed.`, messageIsHtml: true, - contextualColorName: "warning", + contextualColorName: 'warning', okButton: { text: `Yes, Delete ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, callbackFunction: doDelete @@ -561,15 +561,13 @@ Object.defineProperty(exports, "__esModule", { value: true }); }; const moveLotOccupantType = (clickEvent) => { const buttonElement = clickEvent.currentTarget; - const tableRowElement = buttonElement.closest("tr"); + const tableRowElement = buttonElement.closest('tr'); const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId; cityssm.postJSON(los.urlPrefix + - "/admin/" + - (buttonElement.dataset.direction === "up" - ? "doMoveLotOccupantTypeUp" - : "doMoveLotOccupantTypeDown"), { + '/admin/' + + (buttonElement.dataset.direction === 'up' ? 'doMoveLotOccupantTypeUp' : 'doMoveLotOccupantTypeDown'), { lotOccupantTypeId, - moveToEnd: clickEvent.shiftKey ? "1" : "0" + moveToEnd: clickEvent.shiftKey ? '1' : '0' }, (responseJSON) => { if (responseJSON.success) { lotOccupantTypes = responseJSON.lotOccupantTypes; @@ -578,40 +576,40 @@ Object.defineProperty(exports, "__esModule", { value: true }); else { bulmaJS.alert({ title: `Error Moving ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; const renderLotOccupantTypes = () => { - const containerElement = document.querySelector("#container--lotOccupantTypes"); + const containerElement = document.querySelector('#container--lotOccupantTypes'); if (lotOccupantTypes.length === 0) { containerElement.innerHTML = `

There are no active ${los.escapedAliases.lot} ${los.escapedAliases.occupant} types.

`; return; } - containerElement.innerHTML = ""; + containerElement.innerHTML = ''; for (const lotOccupantType of lotOccupantTypes) { - const tableRowElement = document.createElement("tr"); + const tableRowElement = document.createElement('tr'); tableRowElement.dataset.lotOccupantTypeId = lotOccupantType.lotOccupantTypeId.toString(); - const formId = "form--lotOccupantType-" + lotOccupantType.lotOccupantTypeId; + const formId = 'form--lotOccupantType-' + lotOccupantType.lotOccupantTypeId; tableRowElement.innerHTML = - "" + + '' + ('
' + '
' + '' + - "
" + - "
") + - "" + - "" + + '' + + '') + + '' + + '' + ('
' + '
fa-
' + '
' + @@ -621,70 +619,70 @@ Object.defineProperty(exports, "__esModule", { value: true }); ' list="datalist--fontAwesomeIconClass"' + ' aria-label="Icon Name"' + ' maxlength="50" />' + - "
" + + '
' + '
' + '
' + - "") + - "" + - ("" + + '') + + '' + + ('' + ('
') + '" + + ' />' + '' + - "
" + - "") + + '' + + '') + '' + '
' + '
' + - los.getMoveUpDownButtonFieldHTML("button--moveLotOccupantTypeUp", "button--moveLotOccupantTypeDown", false) + - "
" + + los.getMoveUpDownButtonFieldHTML('button--moveLotOccupantTypeUp', 'button--moveLotOccupantTypeDown', false) + + '
' + '
' + '" + - "
" + - "" + - ""; + '' + + '' + + '' + + ''; const fontAwesomeInputElement = tableRowElement.querySelector("input[name='fontAwesomeIconClass']"); - fontAwesomeInputElement.addEventListener("keyup", refreshFontAwesomeIcon); - fontAwesomeInputElement.addEventListener("change", refreshFontAwesomeIcon); - tableRowElement.querySelector("form").addEventListener("submit", updateLotOccupantType); - tableRowElement.querySelector(".button--moveLotOccupantTypeUp").addEventListener("click", moveLotOccupantType); - tableRowElement.querySelector(".button--moveLotOccupantTypeDown").addEventListener("click", moveLotOccupantType); + fontAwesomeInputElement.addEventListener('keyup', refreshFontAwesomeIcon); + fontAwesomeInputElement.addEventListener('change', refreshFontAwesomeIcon); + tableRowElement.querySelector('form').addEventListener('submit', updateLotOccupantType); + tableRowElement.querySelector('.button--moveLotOccupantTypeUp').addEventListener('click', moveLotOccupantType); + tableRowElement.querySelector('.button--moveLotOccupantTypeDown').addEventListener('click', moveLotOccupantType); tableRowElement - .querySelector(".button--deleteLotOccupantType") - .addEventListener("click", deleteLotOccupantType); + .querySelector('.button--deleteLotOccupantType') + .addEventListener('click', deleteLotOccupantType); containerElement.append(tableRowElement); } }; - document.querySelector("#form--addLotOccupantType").addEventListener("submit", (submitEvent) => { + document.querySelector('#form--addLotOccupantType').addEventListener('submit', (submitEvent) => { submitEvent.preventDefault(); const formElement = submitEvent.currentTarget; - cityssm.postJSON(los.urlPrefix + "/admin/doAddLotOccupantType", formElement, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doAddLotOccupantType', formElement, (responseJSON) => { if (responseJSON.success) { lotOccupantTypes = responseJSON.lotOccupantTypes; renderLotOccupantTypes(); formElement.reset(); - formElement.querySelector("input").focus(); + formElement.querySelector('input').focus(); } else { bulmaJS.alert({ title: `Error Adding ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); diff --git a/public-typescript/adminTables/adminTables.js b/public-typescript/adminTables/adminTables.js index c3ca4c3f..44288e47 100644 --- a/public-typescript/adminTables/adminTables.js +++ b/public-typescript/adminTables/adminTables.js @@ -9,8 +9,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); const inputElement = changeEvent.currentTarget; const fontAwesomeIconClass = inputElement.value; inputElement - .closest(".field") - .querySelectorAll(".button.is-static")[1].innerHTML = ``; + .closest('.field') + .querySelectorAll('.button.is-static')[1].innerHTML = ``; } //=include adminTablesWorkOrderTypes.js //=include adminTablesWorkOrderMilestoneTypes.js diff --git a/public-typescript/adminTables/adminTables.ts b/public-typescript/adminTables/adminTables.ts index 08f939d2..526b09b6 100644 --- a/public-typescript/adminTables/adminTables.ts +++ b/public-typescript/adminTables/adminTables.ts @@ -1,26 +1,26 @@ /* 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 - const los = exports.los as globalTypes.LOS; +;(() => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const los = exports.los as globalTypes.LOS - // eslint-disable-next-line @typescript-eslint/no-unused-vars - function refreshFontAwesomeIcon(changeEvent: Event) { - const inputElement = changeEvent.currentTarget as HTMLInputElement; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + function refreshFontAwesomeIcon(changeEvent: Event) { + const inputElement = changeEvent.currentTarget as HTMLInputElement - const fontAwesomeIconClass = inputElement.value; + const fontAwesomeIconClass = inputElement.value - inputElement - .closest(".field")! - .querySelectorAll( - ".button.is-static" - )[1].innerHTML = ``; - } + inputElement + .closest('.field')! + .querySelectorAll( + '.button.is-static' + )[1].innerHTML = `` + } - //=include adminTablesWorkOrderTypes.js - //=include adminTablesWorkOrderMilestoneTypes.js - //=include adminTablesLotStatuses.js - //=include adminTablesLotOccupantTypes.js -})(); + //=include adminTablesWorkOrderTypes.js + //=include adminTablesWorkOrderMilestoneTypes.js + //=include adminTablesLotStatuses.js + //=include adminTablesLotOccupantTypes.js +})() diff --git a/public-typescript/adminTables/adminTablesLotOccupantTypes.js b/public-typescript/adminTables/adminTablesLotOccupantTypes.js index 41afaa16..ef682082 100644 --- a/public-typescript/adminTables/adminTablesLotOccupantTypes.js +++ b/public-typescript/adminTables/adminTablesLotOccupantTypes.js @@ -5,28 +5,28 @@ let lotOccupantTypes = exports.lotOccupantTypes; delete exports.lotOccupantTypes; const updateLotOccupantType = (submitEvent) => { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/admin/doUpdateLotOccupantType", submitEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doUpdateLotOccupantType', submitEvent.currentTarget, (responseJSON) => { if (responseJSON.success) { lotOccupantTypes = responseJSON.lotOccupantTypes; bulmaJS.alert({ message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Updated Successfully`, - contextualColorName: "success" + contextualColorName: 'success' }); } else { bulmaJS.alert({ title: `Error Updating ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; const deleteLotOccupantType = (clickEvent) => { - const tableRowElement = clickEvent.currentTarget.closest("tr"); + const tableRowElement = clickEvent.currentTarget.closest('tr'); const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId; const doDelete = () => { - cityssm.postJSON(los.urlPrefix + "/admin/doDeleteLotOccupantType", { + cityssm.postJSON(los.urlPrefix + '/admin/doDeleteLotOccupantType', { lotOccupantTypeId }, (responseJSON) => { if (responseJSON.success) { @@ -39,14 +39,14 @@ const deleteLotOccupantType = (clickEvent) => { } bulmaJS.alert({ message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Deleted Successfully`, - contextualColorName: "success" + contextualColorName: 'success' }); } else { bulmaJS.alert({ title: `Error Deleting ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + message: responseJSON.errorMessage || '', + 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?
Note that no ${los.escapedAliases.lot} ${los.escapedAliases.occupants} will be removed.`, messageIsHtml: true, - contextualColorName: "warning", + contextualColorName: 'warning', okButton: { text: `Yes, Delete ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, callbackFunction: doDelete @@ -65,15 +65,13 @@ const deleteLotOccupantType = (clickEvent) => { }; const moveLotOccupantType = (clickEvent) => { const buttonElement = clickEvent.currentTarget; - const tableRowElement = buttonElement.closest("tr"); + const tableRowElement = buttonElement.closest('tr'); const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId; cityssm.postJSON(los.urlPrefix + - "/admin/" + - (buttonElement.dataset.direction === "up" - ? "doMoveLotOccupantTypeUp" - : "doMoveLotOccupantTypeDown"), { + '/admin/' + + (buttonElement.dataset.direction === 'up' ? 'doMoveLotOccupantTypeUp' : 'doMoveLotOccupantTypeDown'), { lotOccupantTypeId, - moveToEnd: clickEvent.shiftKey ? "1" : "0" + moveToEnd: clickEvent.shiftKey ? '1' : '0' }, (responseJSON) => { if (responseJSON.success) { lotOccupantTypes = responseJSON.lotOccupantTypes; @@ -82,40 +80,40 @@ const moveLotOccupantType = (clickEvent) => { else { bulmaJS.alert({ title: `Error Moving ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; const renderLotOccupantTypes = () => { - const containerElement = document.querySelector("#container--lotOccupantTypes"); + const containerElement = document.querySelector('#container--lotOccupantTypes'); if (lotOccupantTypes.length === 0) { containerElement.innerHTML = `

There are no active ${los.escapedAliases.lot} ${los.escapedAliases.occupant} types.

`; return; } - containerElement.innerHTML = ""; + containerElement.innerHTML = ''; for (const lotOccupantType of lotOccupantTypes) { - const tableRowElement = document.createElement("tr"); + const tableRowElement = document.createElement('tr'); tableRowElement.dataset.lotOccupantTypeId = lotOccupantType.lotOccupantTypeId.toString(); - const formId = "form--lotOccupantType-" + lotOccupantType.lotOccupantTypeId; + const formId = 'form--lotOccupantType-' + lotOccupantType.lotOccupantTypeId; tableRowElement.innerHTML = - "" + + '' + ('
' + '
' + '' + - "
" + - "
") + - "" + - "" + + '' + + '') + + '' + + '' + ('
' + '
fa-
' + '
' + @@ -125,70 +123,70 @@ const renderLotOccupantTypes = () => { ' list="datalist--fontAwesomeIconClass"' + ' aria-label="Icon Name"' + ' maxlength="50" />' + - "
" + + '
' + '
' + '
' + - "") + - "" + - ("" + + '') + + '' + + ('' + ('
') + '" + + ' />' + '' + - "
" + - "") + + '' + + '') + '' + '
' + '
' + - los.getMoveUpDownButtonFieldHTML("button--moveLotOccupantTypeUp", "button--moveLotOccupantTypeDown", false) + - "
" + + los.getMoveUpDownButtonFieldHTML('button--moveLotOccupantTypeUp', 'button--moveLotOccupantTypeDown', false) + + '
' + '
' + '" + - "
" + - "" + - ""; + '' + + '' + + '' + + ''; const fontAwesomeInputElement = tableRowElement.querySelector("input[name='fontAwesomeIconClass']"); - fontAwesomeInputElement.addEventListener("keyup", refreshFontAwesomeIcon); - fontAwesomeInputElement.addEventListener("change", refreshFontAwesomeIcon); - tableRowElement.querySelector("form").addEventListener("submit", updateLotOccupantType); - tableRowElement.querySelector(".button--moveLotOccupantTypeUp").addEventListener("click", moveLotOccupantType); - tableRowElement.querySelector(".button--moveLotOccupantTypeDown").addEventListener("click", moveLotOccupantType); + fontAwesomeInputElement.addEventListener('keyup', refreshFontAwesomeIcon); + fontAwesomeInputElement.addEventListener('change', refreshFontAwesomeIcon); + tableRowElement.querySelector('form').addEventListener('submit', updateLotOccupantType); + tableRowElement.querySelector('.button--moveLotOccupantTypeUp').addEventListener('click', moveLotOccupantType); + tableRowElement.querySelector('.button--moveLotOccupantTypeDown').addEventListener('click', moveLotOccupantType); tableRowElement - .querySelector(".button--deleteLotOccupantType") - .addEventListener("click", deleteLotOccupantType); + .querySelector('.button--deleteLotOccupantType') + .addEventListener('click', deleteLotOccupantType); containerElement.append(tableRowElement); } }; -document.querySelector("#form--addLotOccupantType").addEventListener("submit", (submitEvent) => { +document.querySelector('#form--addLotOccupantType').addEventListener('submit', (submitEvent) => { submitEvent.preventDefault(); const formElement = submitEvent.currentTarget; - cityssm.postJSON(los.urlPrefix + "/admin/doAddLotOccupantType", formElement, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doAddLotOccupantType', formElement, (responseJSON) => { if (responseJSON.success) { lotOccupantTypes = responseJSON.lotOccupantTypes; renderLotOccupantTypes(); formElement.reset(); - formElement.querySelector("input").focus(); + formElement.querySelector('input').focus(); } else { bulmaJS.alert({ title: `Error Adding ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); diff --git a/public-typescript/adminTables/adminTablesLotOccupantTypes.ts b/public-typescript/adminTables/adminTablesLotOccupantTypes.ts index 7bc633ad..9afec509 100644 --- a/public-typescript/adminTables/adminTablesLotOccupantTypes.ts +++ b/public-typescript/adminTables/adminTablesLotOccupantTypes.ts @@ -1,280 +1,277 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ -import type * as globalTypes from "../../types/globalTypes"; -import type * as recordTypes from "../../types/recordTypes"; +import type * as globalTypes from '../../types/globalTypes' +import type * as recordTypes from '../../types/recordTypes' -import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; +import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types' -import type { BulmaJS } from "@cityssm/bulma-js/types"; +import type { BulmaJS } from '@cityssm/bulma-js/types' -declare const cityssm: cityssmGlobal; -declare const bulmaJS: BulmaJS; +declare const cityssm: cityssmGlobal +declare const bulmaJS: BulmaJS -declare const los: globalTypes.LOS; -declare const refreshFontAwesomeIcon: (changeEvent: Event) => void; +declare const los: globalTypes.LOS +declare const refreshFontAwesomeIcon: (changeEvent: Event) => void -let lotOccupantTypes: recordTypes.LotOccupantType[] = exports.lotOccupantTypes; -delete exports.lotOccupantTypes; +let lotOccupantTypes: recordTypes.LotOccupantType[] = exports.lotOccupantTypes +delete exports.lotOccupantTypes const updateLotOccupantType = (submitEvent: SubmitEvent) => { - submitEvent.preventDefault(); + submitEvent.preventDefault() - cityssm.postJSON( - los.urlPrefix + "/admin/doUpdateLotOccupantType", - submitEvent.currentTarget, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotOccupantTypes?: recordTypes.LotOccupantType[]; - }) => { - if (responseJSON.success) { - lotOccupantTypes = responseJSON.lotOccupantTypes!; + cityssm.postJSON( + los.urlPrefix + '/admin/doUpdateLotOccupantType', + submitEvent.currentTarget, + (responseJSON: { + success: boolean + errorMessage?: string + lotOccupantTypes?: recordTypes.LotOccupantType[] + }) => { + if (responseJSON.success) { + lotOccupantTypes = responseJSON.lotOccupantTypes! - bulmaJS.alert({ - message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Updated Successfully`, - contextualColorName: "success" - }); - } else { - bulmaJS.alert({ - title: `Error Updating ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); -}; + bulmaJS.alert({ + message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Updated Successfully`, + contextualColorName: 'success' + }) + } else { + bulmaJS.alert({ + title: `Error Updating ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + ) +} 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 = () => { - cityssm.postJSON( - los.urlPrefix + "/admin/doDeleteLotOccupantType", - { - lotOccupantTypeId - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotOccupantTypes?: recordTypes.LotOccupantType[]; - }) => { - if (responseJSON.success) { - lotOccupantTypes = responseJSON.lotOccupantTypes!; + const doDelete = () => { + cityssm.postJSON( + los.urlPrefix + '/admin/doDeleteLotOccupantType', + { + lotOccupantTypeId + }, + (responseJSON: { + success: boolean + errorMessage?: string + lotOccupantTypes?: recordTypes.LotOccupantType[] + }) => { + if (responseJSON.success) { + lotOccupantTypes = responseJSON.lotOccupantTypes! - if (lotOccupantTypes.length === 0) { - renderLotOccupantTypes(); - } else { - tableRowElement.remove(); - } + if (lotOccupantTypes.length === 0) { + renderLotOccupantTypes() + } else { + tableRowElement.remove() + } - bulmaJS.alert({ - message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Deleted Successfully`, - contextualColorName: "success" - }); - } else { - bulmaJS.alert({ - title: `Error Deleting ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, - message: responseJSON.errorMessage || "", - 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?
- 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.alert({ + message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Deleted Successfully`, + contextualColorName: 'success' + }) + } else { + bulmaJS.alert({ + title: `Error Deleting ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, + message: responseJSON.errorMessage || '', + 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?
+ 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 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( - los.urlPrefix + - "/admin/" + - (buttonElement.dataset.direction === "up" - ? "doMoveLotOccupantTypeUp" - : "doMoveLotOccupantTypeDown"), - { - lotOccupantTypeId, - moveToEnd: clickEvent.shiftKey ? "1" : "0" - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotOccupantTypes?: recordTypes.LotOccupantType[]; - }) => { - if (responseJSON.success) { - lotOccupantTypes = responseJSON.lotOccupantTypes!; - renderLotOccupantTypes(); - } else { - bulmaJS.alert({ - title: `Error Moving ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); -}; + cityssm.postJSON( + los.urlPrefix + + '/admin/' + + (buttonElement.dataset.direction === 'up' ? 'doMoveLotOccupantTypeUp' : 'doMoveLotOccupantTypeDown'), + { + lotOccupantTypeId, + moveToEnd: clickEvent.shiftKey ? '1' : '0' + }, + (responseJSON: { + success: boolean + errorMessage?: string + lotOccupantTypes?: recordTypes.LotOccupantType[] + }) => { + if (responseJSON.success) { + lotOccupantTypes = responseJSON.lotOccupantTypes! + renderLotOccupantTypes() + } else { + bulmaJS.alert({ + title: `Error Moving ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + ) +} const renderLotOccupantTypes = () => { - const containerElement = document.querySelector( - "#container--lotOccupantTypes" - ) as HTMLTableSectionElement; + const containerElement = document.querySelector('#container--lotOccupantTypes') as HTMLTableSectionElement - if (lotOccupantTypes.length === 0) { - containerElement.innerHTML = ` + if (lotOccupantTypes.length === 0) { + containerElement.innerHTML = `

There are no active ${los.escapedAliases.lot} ${los.escapedAliases.occupant} types.

- `; + ` - return; - } + return + } - containerElement.innerHTML = ""; + containerElement.innerHTML = '' - for (const lotOccupantType of lotOccupantTypes) { - const tableRowElement = document.createElement("tr"); + for (const lotOccupantType of lotOccupantTypes) { + 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 = - "" + - ('
' + - '
' + - '' + - "
" + - "
") + - "" + - "" + - ('
' + - '
fa-
' + - '
' + - '' + - "
" + - '
' + - '
' + - "
") + - "" + - ("" + - ('
') + - '" + - '' + - "
" + - "") + - '' + - '
' + - '
' + - los.getMoveUpDownButtonFieldHTML( - "button--moveLotOccupantTypeUp", - "button--moveLotOccupantTypeDown", - false - ) + - "
" + - '
' + - '" + - "
" + - "
" + - ""; + tableRowElement.innerHTML = + '' + + ('
' + + '
' + + '' + + '
' + + '
') + + '' + + '' + + ('
' + + '
fa-
' + + '
' + + '' + + '
' + + '
' + + '
' + + '
') + + '' + + ('' + + ('
') + + '' + + '' + + '
' + + '') + + '' + + '
' + + '
' + + los.getMoveUpDownButtonFieldHTML( + 'button--moveLotOccupantTypeUp', + 'button--moveLotOccupantTypeDown', + false + ) + + '
' + + '
' + + '' + + '
' + + '
' + + '' - const fontAwesomeInputElement = tableRowElement.querySelector("input[name='fontAwesomeIconClass']")!; + const fontAwesomeInputElement = tableRowElement.querySelector("input[name='fontAwesomeIconClass']")! - fontAwesomeInputElement.addEventListener("keyup", refreshFontAwesomeIcon); - fontAwesomeInputElement.addEventListener("change", refreshFontAwesomeIcon); + fontAwesomeInputElement.addEventListener('keyup', refreshFontAwesomeIcon) + fontAwesomeInputElement.addEventListener('change', refreshFontAwesomeIcon) - tableRowElement.querySelector("form")!.addEventListener("submit", updateLotOccupantType); + tableRowElement.querySelector('form')!.addEventListener('submit', updateLotOccupantType) - ( - tableRowElement.querySelector(".button--moveLotOccupantTypeUp") as HTMLButtonElement - ).addEventListener("click", moveLotOccupantType); + ;(tableRowElement.querySelector('.button--moveLotOccupantTypeUp') as HTMLButtonElement).addEventListener( + 'click', + moveLotOccupantType + ) - ( - tableRowElement.querySelector(".button--moveLotOccupantTypeDown") as HTMLButtonElement - ).addEventListener("click", moveLotOccupantType); + ;( + tableRowElement.querySelector('.button--moveLotOccupantTypeDown') as HTMLButtonElement + ).addEventListener('click', moveLotOccupantType) - tableRowElement - .querySelector(".button--deleteLotOccupantType")! - .addEventListener("click", deleteLotOccupantType); + tableRowElement + .querySelector('.button--deleteLotOccupantType')! + .addEventListener('click', deleteLotOccupantType) - containerElement.append(tableRowElement); - } -}; + containerElement.append(tableRowElement) + } +} -(document.querySelector("#form--addLotOccupantType") as HTMLFormElement).addEventListener( - "submit", - (submitEvent: SubmitEvent) => { - submitEvent.preventDefault(); +;(document.querySelector('#form--addLotOccupantType') as HTMLFormElement).addEventListener( + 'submit', + (submitEvent: SubmitEvent) => { + submitEvent.preventDefault() - const formElement = submitEvent.currentTarget as HTMLFormElement; + const formElement = submitEvent.currentTarget as HTMLFormElement - cityssm.postJSON( - los.urlPrefix + "/admin/doAddLotOccupantType", - formElement, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotOccupantTypes?: recordTypes.LotOccupantType[]; - }) => { - if (responseJSON.success) { - lotOccupantTypes = responseJSON.lotOccupantTypes!; - renderLotOccupantTypes(); - formElement.reset(); - formElement.querySelector("input")!.focus(); - } else { - bulmaJS.alert({ - title: `Error Adding ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - } -); + cityssm.postJSON( + los.urlPrefix + '/admin/doAddLotOccupantType', + formElement, + (responseJSON: { + success: boolean + errorMessage?: string + lotOccupantTypes?: recordTypes.LotOccupantType[] + }) => { + if (responseJSON.success) { + lotOccupantTypes = responseJSON.lotOccupantTypes! + renderLotOccupantTypes() + formElement.reset() + formElement.querySelector('input')!.focus() + } else { + bulmaJS.alert({ + title: `Error Adding ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + ) + } +) -renderLotOccupantTypes(); +renderLotOccupantTypes() diff --git a/public-typescript/adminTables/adminTablesLotStatuses.js b/public-typescript/adminTables/adminTablesLotStatuses.js index c0c9b61a..eb0f9b4d 100644 --- a/public-typescript/adminTables/adminTablesLotStatuses.js +++ b/public-typescript/adminTables/adminTablesLotStatuses.js @@ -5,28 +5,28 @@ let lotStatuses = exports.lotStatuses; delete exports.lotStatuses; const updateLotStatus = (submitEvent) => { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/admin/doUpdateLotStatus", submitEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doUpdateLotStatus', submitEvent.currentTarget, (responseJSON) => { if (responseJSON.success) { lotStatuses = responseJSON.lotStatuses; bulmaJS.alert({ - message: los.escapedAliases.Lot + " Status Updated Successfully", - contextualColorName: "success" + message: los.escapedAliases.Lot + ' Status Updated Successfully', + contextualColorName: 'success' }); } else { bulmaJS.alert({ - title: "Error Updating " + los.escapedAliases.Lot + " Status", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Updating ' + los.escapedAliases.Lot + ' Status', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; const deleteLotStatus = (clickEvent) => { - const tableRowElement = clickEvent.currentTarget.closest("tr"); + const tableRowElement = clickEvent.currentTarget.closest('tr'); const lotStatusId = tableRowElement.dataset.lotStatusId; const doDelete = () => { - cityssm.postJSON(los.urlPrefix + "/admin/doDeleteLotStatus", { + cityssm.postJSON(los.urlPrefix + '/admin/doDeleteLotStatus', { lotStatusId }, (responseJSON) => { if (responseJSON.success) { @@ -38,15 +38,15 @@ const deleteLotStatus = (clickEvent) => { tableRowElement.remove(); } bulmaJS.alert({ - message: los.escapedAliases.Lot + " Status Deleted Successfully", - contextualColorName: "success" + message: los.escapedAliases.Lot + ' Status Deleted Successfully', + contextualColorName: 'success' }); } else { bulmaJS.alert({ - title: "Error Deleting " + los.escapedAliases.Lot + " Status", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Deleting ' + los.escapedAliases.Lot + ' Status', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); @@ -56,22 +56,22 @@ const deleteLotStatus = (clickEvent) => { message: `Are you sure you want to delete this status?
Note that no ${los.escapedAliases.lot} will be removed.`, messageIsHtml: true, - contextualColorName: "warning", + contextualColorName: 'warning', okButton: { - text: "Yes, Delete Status", + text: 'Yes, Delete Status', callbackFunction: doDelete } }); }; const moveLotStatus = (clickEvent) => { const buttonElement = clickEvent.currentTarget; - const tableRowElement = buttonElement.closest("tr"); + const tableRowElement = buttonElement.closest('tr'); const lotStatusId = tableRowElement.dataset.lotStatusId; cityssm.postJSON(los.urlPrefix + - "/admin/" + - (buttonElement.dataset.direction === "up" ? "doMoveLotStatusUp" : "doMoveLotStatusDown"), { + '/admin/' + + (buttonElement.dataset.direction === 'up' ? 'doMoveLotStatusUp' : 'doMoveLotStatusDown'), { lotStatusId, - moveToEnd: clickEvent.shiftKey ? "1" : "0" + moveToEnd: clickEvent.shiftKey ? '1' : '0' }, (responseJSON) => { if (responseJSON.success) { lotStatuses = responseJSON.lotStatuses; @@ -79,28 +79,28 @@ const moveLotStatus = (clickEvent) => { } else { bulmaJS.alert({ - title: "Error Moving " + exports.aliases.lot + " Status", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Moving ' + exports.aliases.lot + ' Status', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; const renderLotStatuses = () => { - const containerElement = document.querySelector("#container--lotStatuses"); + const containerElement = document.querySelector('#container--lotStatuses'); if (lotStatuses.length === 0) { containerElement.innerHTML = `

There are no active ${los.escapedAliases.lot} statuses.

`; return; } - containerElement.innerHTML = ""; + containerElement.innerHTML = ''; for (const lotStatus of lotStatuses) { - const tableRowElement = document.createElement("tr"); + const tableRowElement = document.createElement('tr'); tableRowElement.dataset.lotStatusId = lotStatus.lotStatusId.toString(); tableRowElement.innerHTML = - "" + - "
" + + '' + + '' + '' + @@ -110,47 +110,47 @@ const renderLotStatuses = () => { (' value="' + cityssm.escapeHTML(lotStatus.lotStatus) + '"') + (' aria-label="' + cityssm.escapeHTML(exports.aliases.lot) + ' Status"') + ' maxlength="100" required />' + - "" + + '' + '
' + '' + - "
" + - "") + - "
" + - "" + + '' + + '') + + '' + + '' + '' + '
' + '
' + - los.getMoveUpDownButtonFieldHTML("button--moveLotStatusUp", "button--moveLotStatusDown", false) + - "
" + + los.getMoveUpDownButtonFieldHTML('button--moveLotStatusUp', 'button--moveLotStatusDown', false) + + '
' + '
' + '" + - "
" + - "" + - ""; - tableRowElement.querySelector("form").addEventListener("submit", updateLotStatus); - tableRowElement.querySelector(".button--moveLotStatusUp").addEventListener("click", moveLotStatus); - tableRowElement.querySelector(".button--moveLotStatusDown").addEventListener("click", moveLotStatus); - tableRowElement.querySelector(".button--deleteLotStatus").addEventListener("click", deleteLotStatus); + '' + + '' + + '' + + ''; + tableRowElement.querySelector('form').addEventListener('submit', updateLotStatus); + tableRowElement.querySelector('.button--moveLotStatusUp').addEventListener('click', moveLotStatus); + tableRowElement.querySelector('.button--moveLotStatusDown').addEventListener('click', moveLotStatus); + tableRowElement.querySelector('.button--deleteLotStatus').addEventListener('click', deleteLotStatus); containerElement.append(tableRowElement); } }; -document.querySelector("#form--addLotStatus").addEventListener("submit", (submitEvent) => { +document.querySelector('#form--addLotStatus').addEventListener('submit', (submitEvent) => { submitEvent.preventDefault(); const formElement = submitEvent.currentTarget; - cityssm.postJSON(los.urlPrefix + "/admin/doAddLotStatus", formElement, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doAddLotStatus', formElement, (responseJSON) => { if (responseJSON.success) { lotStatuses = responseJSON.lotStatuses; renderLotStatuses(); formElement.reset(); - formElement.querySelector("input").focus(); + formElement.querySelector('input').focus(); } else { bulmaJS.alert({ title: `Error Adding ${los.escapedAliases.Lot} Status`, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); diff --git a/public-typescript/adminTables/adminTablesLotStatuses.ts b/public-typescript/adminTables/adminTablesLotStatuses.ts index 9f9d0232..d6f3d87c 100644 --- a/public-typescript/adminTables/adminTablesLotStatuses.ts +++ b/public-typescript/adminTables/adminTablesLotStatuses.ts @@ -1,234 +1,218 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ -import type * as globalTypes from "../../types/globalTypes"; -import type * as recordTypes from "../../types/recordTypes"; +import type * as globalTypes from '../../types/globalTypes' +import type * as recordTypes from '../../types/recordTypes' -import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; +import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types' -import type { BulmaJS } from "@cityssm/bulma-js/types"; +import type { BulmaJS } from '@cityssm/bulma-js/types' -declare const cityssm: cityssmGlobal; -declare const bulmaJS: BulmaJS; +declare const cityssm: cityssmGlobal +declare const bulmaJS: BulmaJS -declare const los: globalTypes.LOS; +declare const los: globalTypes.LOS -let lotStatuses: recordTypes.LotStatus[] = exports.lotStatuses; -delete exports.lotStatuses; +let lotStatuses: recordTypes.LotStatus[] = exports.lotStatuses +delete exports.lotStatuses const updateLotStatus = (submitEvent: SubmitEvent) => { - submitEvent.preventDefault(); + submitEvent.preventDefault() - cityssm.postJSON( - los.urlPrefix + "/admin/doUpdateLotStatus", - submitEvent.currentTarget, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotStatuses?: recordTypes.LotStatus[]; - }) => { - if (responseJSON.success) { - lotStatuses = responseJSON.lotStatuses!; + cityssm.postJSON( + los.urlPrefix + '/admin/doUpdateLotStatus', + submitEvent.currentTarget, + (responseJSON: { success: boolean; errorMessage?: string; lotStatuses?: recordTypes.LotStatus[] }) => { + if (responseJSON.success) { + lotStatuses = responseJSON.lotStatuses! - bulmaJS.alert({ - message: los.escapedAliases.Lot + " Status Updated Successfully", - contextualColorName: "success" - }); - } else { - bulmaJS.alert({ - title: "Error Updating " + los.escapedAliases.Lot + " Status", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); -}; + bulmaJS.alert({ + message: los.escapedAliases.Lot + ' Status Updated Successfully', + contextualColorName: 'success' + }) + } else { + bulmaJS.alert({ + title: 'Error Updating ' + los.escapedAliases.Lot + ' Status', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + ) +} 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 = () => { - cityssm.postJSON( - los.urlPrefix + "/admin/doDeleteLotStatus", - { - lotStatusId - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotStatuses?: recordTypes.LotStatus[]; - }) => { - if (responseJSON.success) { - lotStatuses = responseJSON.lotStatuses!; + const doDelete = () => { + cityssm.postJSON( + los.urlPrefix + '/admin/doDeleteLotStatus', + { + lotStatusId + }, + (responseJSON: { success: boolean; errorMessage?: string; lotStatuses?: recordTypes.LotStatus[] }) => { + if (responseJSON.success) { + lotStatuses = responseJSON.lotStatuses! - if (lotStatuses.length === 0) { - renderLotStatuses(); - } else { - tableRowElement.remove(); - } + if (lotStatuses.length === 0) { + renderLotStatuses() + } else { + tableRowElement.remove() + } - bulmaJS.alert({ - message: los.escapedAliases.Lot + " Status Deleted Successfully", - contextualColorName: "success" - }); - } else { - bulmaJS.alert({ - title: "Error Deleting " + los.escapedAliases.Lot + " Status", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }; - - bulmaJS.confirm({ - title: `Delete ${los.escapedAliases.Lot} Status`, - message: `Are you sure you want to delete this status?
- Note that no ${los.escapedAliases.lot} will be removed.`, - messageIsHtml: true, - contextualColorName: "warning", - okButton: { - text: "Yes, Delete Status", - callbackFunction: doDelete + bulmaJS.alert({ + message: los.escapedAliases.Lot + ' Status Deleted Successfully', + contextualColorName: 'success' + }) + } else { + bulmaJS.alert({ + title: 'Error Deleting ' + los.escapedAliases.Lot + ' Status', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) } - }); -}; + } + ) + } + + bulmaJS.confirm({ + title: `Delete ${los.escapedAliases.Lot} Status`, + message: `Are you sure you want to delete this status?
+ 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 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( - los.urlPrefix + - "/admin/" + - (buttonElement.dataset.direction === "up" ? "doMoveLotStatusUp" : "doMoveLotStatusDown"), - { - lotStatusId, - moveToEnd: clickEvent.shiftKey ? "1" : "0" - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotStatuses?: recordTypes.LotStatus[]; - }) => { - if (responseJSON.success) { - lotStatuses = responseJSON.lotStatuses!; - renderLotStatuses(); - } else { - bulmaJS.alert({ - title: "Error Moving " + exports.aliases.lot + " Status", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); -}; + cityssm.postJSON( + los.urlPrefix + + '/admin/' + + (buttonElement.dataset.direction === 'up' ? 'doMoveLotStatusUp' : 'doMoveLotStatusDown'), + { + lotStatusId, + moveToEnd: clickEvent.shiftKey ? '1' : '0' + }, + (responseJSON: { success: boolean; errorMessage?: string; lotStatuses?: recordTypes.LotStatus[] }) => { + if (responseJSON.success) { + lotStatuses = responseJSON.lotStatuses! + renderLotStatuses() + } else { + bulmaJS.alert({ + title: 'Error Moving ' + exports.aliases.lot + ' Status', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + ) +} const renderLotStatuses = () => { - const containerElement = document.querySelector("#container--lotStatuses") as HTMLTableSectionElement; + const containerElement = document.querySelector('#container--lotStatuses') as HTMLTableSectionElement - if (lotStatuses.length === 0) { - containerElement.innerHTML = ` + if (lotStatuses.length === 0) { + containerElement.innerHTML = `

There are no active ${los.escapedAliases.lot} statuses.

- `; + ` - return; - } + return + } - containerElement.innerHTML = ""; + containerElement.innerHTML = '' - for (const lotStatus of lotStatuses) { - const tableRowElement = document.createElement("tr"); + for (const lotStatus of lotStatuses) { + const tableRowElement = document.createElement('tr') - tableRowElement.dataset.lotStatusId = lotStatus.lotStatusId.toString(); + tableRowElement.dataset.lotStatusId = lotStatus.lotStatusId.toString() - tableRowElement.innerHTML = - "" + - "
" + - '' + - ('
' + - '
' + - '' + - "
" + - '
' + - '' + - "
" + - "
") + - "
" + - "" + - '' + - '
' + - '
' + - los.getMoveUpDownButtonFieldHTML("button--moveLotStatusUp", "button--moveLotStatusDown", false) + - "
" + - '
' + - '" + - "
" + - "
" + - ""; + tableRowElement.innerHTML = + '' + + '
' + + '' + + ('
' + + '
' + + '' + + '
' + + '
' + + '' + + '
' + + '
') + + '
' + + '' + + '' + + '
' + + '
' + + los.getMoveUpDownButtonFieldHTML('button--moveLotStatusUp', 'button--moveLotStatusDown', false) + + '
' + + '
' + + '' + + '
' + + '
' + + '' - tableRowElement.querySelector("form")!.addEventListener("submit", updateLotStatus); + tableRowElement.querySelector('form')!.addEventListener('submit', updateLotStatus) - (tableRowElement.querySelector(".button--moveLotStatusUp") as HTMLButtonElement).addEventListener( - "click", - moveLotStatus - ); + ;(tableRowElement.querySelector('.button--moveLotStatusUp') as HTMLButtonElement).addEventListener( + 'click', + moveLotStatus + ) - (tableRowElement.querySelector(".button--moveLotStatusDown") as HTMLButtonElement).addEventListener( - "click", - moveLotStatus - ); + ;(tableRowElement.querySelector('.button--moveLotStatusDown') as HTMLButtonElement).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") as HTMLFormElement).addEventListener( - "submit", - (submitEvent: SubmitEvent) => { - submitEvent.preventDefault(); +;(document.querySelector('#form--addLotStatus') as HTMLFormElement).addEventListener( + 'submit', + (submitEvent: SubmitEvent) => { + submitEvent.preventDefault() - const formElement = submitEvent.currentTarget as HTMLFormElement; + const formElement = submitEvent.currentTarget as HTMLFormElement - cityssm.postJSON( - los.urlPrefix + "/admin/doAddLotStatus", - formElement, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotStatuses?: recordTypes.LotStatus[]; - }) => { - if (responseJSON.success) { - lotStatuses = responseJSON.lotStatuses!; - renderLotStatuses(); - formElement.reset(); - formElement.querySelector("input")!.focus(); - } else { - bulmaJS.alert({ - title: `Error Adding ${los.escapedAliases.Lot} Status`, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - } -); + cityssm.postJSON( + los.urlPrefix + '/admin/doAddLotStatus', + formElement, + (responseJSON: { success: boolean; errorMessage?: string; lotStatuses?: recordTypes.LotStatus[] }) => { + if (responseJSON.success) { + lotStatuses = responseJSON.lotStatuses! + renderLotStatuses() + formElement.reset() + formElement.querySelector('input')!.focus() + } else { + bulmaJS.alert({ + title: `Error Adding ${los.escapedAliases.Lot} Status`, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + ) + } +) -renderLotStatuses(); +renderLotStatuses() diff --git a/public-typescript/adminTables/adminTablesWorkOrderMilestoneTypes.js b/public-typescript/adminTables/adminTablesWorkOrderMilestoneTypes.js index b7dcafbf..f73ec4da 100644 --- a/public-typescript/adminTables/adminTablesWorkOrderMilestoneTypes.js +++ b/public-typescript/adminTables/adminTablesWorkOrderMilestoneTypes.js @@ -5,28 +5,28 @@ let workOrderMilestoneTypes = exports.workOrderMilestoneTypes; delete exports.workOrderMilestoneTypes; const updateWorkOrderMilestoneType = (submitEvent) => { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/admin/doUpdateWorkOrderMilestoneType", submitEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doUpdateWorkOrderMilestoneType', submitEvent.currentTarget, (responseJSON) => { if (responseJSON.success) { workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes; bulmaJS.alert({ - message: "Work Order Milestone Type Updated Successfully", - contextualColorName: "success" + message: 'Work Order Milestone Type Updated Successfully', + contextualColorName: 'success' }); } else { bulmaJS.alert({ - title: "Error Updating Work Order Milestone Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Updating Work Order Milestone Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; const deleteWorkOrderMilestoneType = (clickEvent) => { - const tableRowElement = clickEvent.currentTarget.closest("tr"); + const tableRowElement = clickEvent.currentTarget.closest('tr'); const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId; const doDelete = () => { - cityssm.postJSON(los.urlPrefix + "/admin/doDeleteWorkOrderMilestoneType", { + cityssm.postJSON(los.urlPrefix + '/admin/doDeleteWorkOrderMilestoneType', { workOrderMilestoneTypeId }, (responseJSON) => { if (responseJSON.success) { @@ -38,42 +38,42 @@ const deleteWorkOrderMilestoneType = (clickEvent) => { tableRowElement.remove(); } bulmaJS.alert({ - message: "Work Order Milestone Type Deleted Successfully", - contextualColorName: "success" + message: 'Work Order Milestone Type Deleted Successfully', + contextualColorName: 'success' }); } else { bulmaJS.alert({ - title: "Error Deleting Work Order Milestone Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Deleting Work Order Milestone Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; 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?
Note that no work orders will be removed.`, messageIsHtml: true, - contextualColorName: "warning", + contextualColorName: 'warning', okButton: { - text: "Yes, Delete Work Order Milestone Type", + text: 'Yes, Delete Work Order Milestone Type', callbackFunction: doDelete } }); }; const moveWorkOrderMilestoneType = (clickEvent) => { const buttonElement = clickEvent.currentTarget; - const tableRowElement = buttonElement.closest("tr"); + const tableRowElement = buttonElement.closest('tr'); const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId; cityssm.postJSON(los.urlPrefix + - "/admin/" + - (buttonElement.dataset.direction === "up" - ? "doMoveWorkOrderMilestoneTypeUp" - : "doMoveWorkOrderMilestoneTypeDown"), { + '/admin/' + + (buttonElement.dataset.direction === 'up' + ? 'doMoveWorkOrderMilestoneTypeUp' + : 'doMoveWorkOrderMilestoneTypeDown'), { workOrderMilestoneTypeId, - moveToEnd: clickEvent.shiftKey ? "1" : "0" + moveToEnd: clickEvent.shiftKey ? '1' : '0' }, (responseJSON) => { if (responseJSON.success) { workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes; @@ -81,29 +81,29 @@ const moveWorkOrderMilestoneType = (clickEvent) => { } else { bulmaJS.alert({ - title: "Error Moving Work Order Milestone Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Moving Work Order Milestone Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; const renderWorkOrderMilestoneTypes = () => { - const containerElement = document.querySelector("#container--workOrderMilestoneTypes"); + const containerElement = document.querySelector('#container--workOrderMilestoneTypes'); if (workOrderMilestoneTypes.length === 0) { containerElement.innerHTML = `

There are no active work order milestone types.

`; return; } - containerElement.innerHTML = ""; + containerElement.innerHTML = ''; for (const workOrderMilestoneType of workOrderMilestoneTypes) { - const tableRowElement = document.createElement("tr"); + const tableRowElement = document.createElement('tr'); tableRowElement.dataset.workOrderMilestoneTypeId = workOrderMilestoneType.workOrderMilestoneTypeId.toString(); tableRowElement.innerHTML = - "" + - "
" + + '' + + '' + '' + @@ -112,49 +112,49 @@ const renderWorkOrderMilestoneTypes = () => { '' + - "" + + '' + '
' + '' + - "
" + - "") + - "
" + - "" + + '' + + '') + + '' + + '' + '' + '
' + '
' + - los.getMoveUpDownButtonFieldHTML("button--moveWorkOrderMilestoneTypeUp", "button--moveWorkOrderMilestoneTypeDown", false) + - "
" + + los.getMoveUpDownButtonFieldHTML('button--moveWorkOrderMilestoneTypeUp', 'button--moveWorkOrderMilestoneTypeDown', false) + + '
' + '
' + '" + - "
" + - "" + - ""; - tableRowElement.querySelector("form").addEventListener("submit", updateWorkOrderMilestoneType); - tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeUp").addEventListener("click", moveWorkOrderMilestoneType); - tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeDown").addEventListener("click", moveWorkOrderMilestoneType); + '' + + '' + + '' + + ''; + tableRowElement.querySelector('form').addEventListener('submit', updateWorkOrderMilestoneType); + tableRowElement.querySelector('.button--moveWorkOrderMilestoneTypeUp').addEventListener('click', moveWorkOrderMilestoneType); + tableRowElement.querySelector('.button--moveWorkOrderMilestoneTypeDown').addEventListener('click', moveWorkOrderMilestoneType); tableRowElement - .querySelector(".button--deleteWorkOrderMilestoneType") - .addEventListener("click", deleteWorkOrderMilestoneType); + .querySelector('.button--deleteWorkOrderMilestoneType') + .addEventListener('click', deleteWorkOrderMilestoneType); containerElement.append(tableRowElement); } }; -document.querySelector("#form--addWorkOrderMilestoneType").addEventListener("submit", (submitEvent) => { +document.querySelector('#form--addWorkOrderMilestoneType').addEventListener('submit', (submitEvent) => { submitEvent.preventDefault(); const formElement = submitEvent.currentTarget; - cityssm.postJSON(los.urlPrefix + "/admin/doAddWorkOrderMilestoneType", formElement, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doAddWorkOrderMilestoneType', formElement, (responseJSON) => { if (responseJSON.success) { workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes; renderWorkOrderMilestoneTypes(); formElement.reset(); - formElement.querySelector("input").focus(); + formElement.querySelector('input').focus(); } else { bulmaJS.alert({ - title: "Error Adding Work Order Milestone Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Adding Work Order Milestone Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); diff --git a/public-typescript/adminTables/adminTablesWorkOrderMilestoneTypes.ts b/public-typescript/adminTables/adminTablesWorkOrderMilestoneTypes.ts index ec342972..3cd02c39 100644 --- a/public-typescript/adminTables/adminTablesWorkOrderMilestoneTypes.ts +++ b/public-typescript/adminTables/adminTablesWorkOrderMilestoneTypes.ts @@ -1,242 +1,242 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ -import type * as globalTypes from "../../types/globalTypes"; -import type * as recordTypes from "../../types/recordTypes"; +import type * as globalTypes from '../../types/globalTypes' +import type * as recordTypes from '../../types/recordTypes' -import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; +import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types' -import type { BulmaJS } from "@cityssm/bulma-js/types"; +import type { BulmaJS } from '@cityssm/bulma-js/types' -declare const cityssm: cityssmGlobal; -declare const bulmaJS: BulmaJS; +declare const cityssm: cityssmGlobal +declare const bulmaJS: BulmaJS -declare const los: globalTypes.LOS; +declare const los: globalTypes.LOS -let workOrderMilestoneTypes: recordTypes.WorkOrderMilestoneType[] = exports.workOrderMilestoneTypes; -delete exports.workOrderMilestoneTypes; +let workOrderMilestoneTypes: recordTypes.WorkOrderMilestoneType[] = exports.workOrderMilestoneTypes +delete exports.workOrderMilestoneTypes const updateWorkOrderMilestoneType = (submitEvent: SubmitEvent) => { - submitEvent.preventDefault(); + submitEvent.preventDefault() - cityssm.postJSON( - los.urlPrefix + "/admin/doUpdateWorkOrderMilestoneType", - submitEvent.currentTarget, - (responseJSON: { - success: boolean; - errorMessage?: string; - workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]; - }) => { - if (responseJSON.success) { - workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!; + cityssm.postJSON( + los.urlPrefix + '/admin/doUpdateWorkOrderMilestoneType', + submitEvent.currentTarget, + (responseJSON: { + success: boolean + errorMessage?: string + workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[] + }) => { + if (responseJSON.success) { + workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes! - bulmaJS.alert({ - message: "Work Order Milestone Type Updated Successfully", - contextualColorName: "success" - }); - } else { - bulmaJS.alert({ - title: "Error Updating Work Order Milestone Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); -}; + bulmaJS.alert({ + message: 'Work Order Milestone Type Updated Successfully', + contextualColorName: 'success' + }) + } else { + bulmaJS.alert({ + title: 'Error Updating Work Order Milestone Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + ) +} 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 = () => { - cityssm.postJSON( - los.urlPrefix + "/admin/doDeleteWorkOrderMilestoneType", - { - workOrderMilestoneTypeId - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]; - }) => { - if (responseJSON.success) { - workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!; + const doDelete = () => { + cityssm.postJSON( + los.urlPrefix + '/admin/doDeleteWorkOrderMilestoneType', + { + workOrderMilestoneTypeId + }, + (responseJSON: { + success: boolean + errorMessage?: string + workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[] + }) => { + if (responseJSON.success) { + workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes! - if (workOrderMilestoneTypes.length === 0) { - renderWorkOrderMilestoneTypes(); - } else { - tableRowElement.remove(); - } + if (workOrderMilestoneTypes.length === 0) { + renderWorkOrderMilestoneTypes() + } else { + tableRowElement.remove() + } - bulmaJS.alert({ - message: "Work Order Milestone Type Deleted Successfully", - contextualColorName: "success" - }); - } else { - bulmaJS.alert({ - title: "Error Deleting Work Order Milestone Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }; - - bulmaJS.confirm({ - title: "Delete Work Order Milestone Type", - message: `Are you sure you want to delete this work order milestone type?
- Note that no work orders will be removed.`, - messageIsHtml: true, - contextualColorName: "warning", - okButton: { - text: "Yes, Delete Work Order Milestone Type", - callbackFunction: doDelete + bulmaJS.alert({ + message: 'Work Order Milestone Type Deleted Successfully', + contextualColorName: 'success' + }) + } else { + bulmaJS.alert({ + title: 'Error Deleting Work Order Milestone Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) } - }); -}; + } + ) + } + + bulmaJS.confirm({ + title: 'Delete Work Order Milestone Type', + message: `Are you sure you want to delete this work order milestone type?
+ 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 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( - los.urlPrefix + - "/admin/" + - (buttonElement.dataset.direction === "up" - ? "doMoveWorkOrderMilestoneTypeUp" - : "doMoveWorkOrderMilestoneTypeDown"), - { - workOrderMilestoneTypeId, - moveToEnd: clickEvent.shiftKey ? "1" : "0" - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]; - }) => { - if (responseJSON.success) { - workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!; - renderWorkOrderMilestoneTypes(); - } else { - bulmaJS.alert({ - title: "Error Moving Work Order Milestone Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); -}; + cityssm.postJSON( + los.urlPrefix + + '/admin/' + + (buttonElement.dataset.direction === 'up' + ? 'doMoveWorkOrderMilestoneTypeUp' + : 'doMoveWorkOrderMilestoneTypeDown'), + { + workOrderMilestoneTypeId, + moveToEnd: clickEvent.shiftKey ? '1' : '0' + }, + (responseJSON: { + success: boolean + errorMessage?: string + workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[] + }) => { + if (responseJSON.success) { + workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes! + renderWorkOrderMilestoneTypes() + } else { + bulmaJS.alert({ + title: 'Error Moving Work Order Milestone Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + ) +} const renderWorkOrderMilestoneTypes = () => { - const containerElement = document.querySelector( - "#container--workOrderMilestoneTypes" - ) as HTMLTableSectionElement; + const containerElement = document.querySelector( + '#container--workOrderMilestoneTypes' + ) as HTMLTableSectionElement - if (workOrderMilestoneTypes.length === 0) { - containerElement.innerHTML = ` + if (workOrderMilestoneTypes.length === 0) { + containerElement.innerHTML = `

There are no active work order milestone types.

- `; + ` - return; - } + return + } - containerElement.innerHTML = ""; + containerElement.innerHTML = '' - for (const workOrderMilestoneType of workOrderMilestoneTypes) { - const tableRowElement = document.createElement("tr"); + for (const workOrderMilestoneType of workOrderMilestoneTypes) { + const tableRowElement = document.createElement('tr') - tableRowElement.dataset.workOrderMilestoneTypeId = - workOrderMilestoneType.workOrderMilestoneTypeId.toString(); + tableRowElement.dataset.workOrderMilestoneTypeId = + workOrderMilestoneType.workOrderMilestoneTypeId.toString() - tableRowElement.innerHTML = - "" + - "
" + - '' + - ('
' + - '
' + - '' + - "
" + - '
' + - '' + - "
" + - "
") + - "
" + - "" + - '' + - '
' + - '
' + - los.getMoveUpDownButtonFieldHTML( - "button--moveWorkOrderMilestoneTypeUp", - "button--moveWorkOrderMilestoneTypeDown", - false - ) + - "
" + - '
' + - '" + - "
" + - "
" + - ""; + tableRowElement.innerHTML = + '' + + '
' + + '' + + ('
' + + '
' + + '' + + '
' + + '
' + + '' + + '
' + + '
') + + '
' + + '' + + '' + + '
' + + '
' + + los.getMoveUpDownButtonFieldHTML( + 'button--moveWorkOrderMilestoneTypeUp', + 'button--moveWorkOrderMilestoneTypeDown', + false + ) + + '
' + + '
' + + '' + + '
' + + '
' + + '' - tableRowElement.querySelector("form")!.addEventListener("submit", updateWorkOrderMilestoneType); + tableRowElement.querySelector('form')!.addEventListener('submit', updateWorkOrderMilestoneType) - ( - tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeUp") as HTMLButtonElement - ).addEventListener("click", moveWorkOrderMilestoneType); + ;( + tableRowElement.querySelector('.button--moveWorkOrderMilestoneTypeUp') as HTMLButtonElement + ).addEventListener('click', moveWorkOrderMilestoneType) - ( - tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeDown") as HTMLButtonElement - ).addEventListener("click", moveWorkOrderMilestoneType); + ;( + tableRowElement.querySelector('.button--moveWorkOrderMilestoneTypeDown') as HTMLButtonElement + ).addEventListener('click', moveWorkOrderMilestoneType) - tableRowElement - .querySelector(".button--deleteWorkOrderMilestoneType")! - .addEventListener("click", deleteWorkOrderMilestoneType); + tableRowElement + .querySelector('.button--deleteWorkOrderMilestoneType')! + .addEventListener('click', deleteWorkOrderMilestoneType) - containerElement.append(tableRowElement); - } -}; + containerElement.append(tableRowElement) + } +} -(document.querySelector("#form--addWorkOrderMilestoneType") as HTMLFormElement).addEventListener( - "submit", - (submitEvent: SubmitEvent) => { - submitEvent.preventDefault(); +;(document.querySelector('#form--addWorkOrderMilestoneType') as HTMLFormElement).addEventListener( + 'submit', + (submitEvent: SubmitEvent) => { + submitEvent.preventDefault() - const formElement = submitEvent.currentTarget as HTMLFormElement; + const formElement = submitEvent.currentTarget as HTMLFormElement - cityssm.postJSON( - los.urlPrefix + "/admin/doAddWorkOrderMilestoneType", - formElement, - (responseJSON: { - success: boolean; - errorMessage?: string; - workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]; - }) => { - if (responseJSON.success) { - workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!; - renderWorkOrderMilestoneTypes(); - formElement.reset(); - formElement.querySelector("input")!.focus(); - } else { - bulmaJS.alert({ - title: "Error Adding Work Order Milestone Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - } -); + cityssm.postJSON( + los.urlPrefix + '/admin/doAddWorkOrderMilestoneType', + formElement, + (responseJSON: { + success: boolean + errorMessage?: string + workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[] + }) => { + if (responseJSON.success) { + workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes! + renderWorkOrderMilestoneTypes() + formElement.reset() + formElement.querySelector('input')!.focus() + } else { + bulmaJS.alert({ + title: 'Error Adding Work Order Milestone Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + ) + } +) -renderWorkOrderMilestoneTypes(); +renderWorkOrderMilestoneTypes() diff --git a/public-typescript/adminTables/adminTablesWorkOrderTypes.js b/public-typescript/adminTables/adminTablesWorkOrderTypes.js index 53b9d854..0c9e8cba 100644 --- a/public-typescript/adminTables/adminTablesWorkOrderTypes.js +++ b/public-typescript/adminTables/adminTablesWorkOrderTypes.js @@ -5,28 +5,28 @@ let workOrderTypes = exports.workOrderTypes; delete exports.workOrderTypes; const updateWorkOrderType = (submitEvent) => { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/admin/doUpdateWorkOrderType", submitEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doUpdateWorkOrderType', submitEvent.currentTarget, (responseJSON) => { if (responseJSON.success) { workOrderTypes = responseJSON.workOrderTypes; bulmaJS.alert({ - message: "Work Order Type Updated Successfully", - contextualColorName: "success" + message: 'Work Order Type Updated Successfully', + contextualColorName: 'success' }); } else { bulmaJS.alert({ - title: "Error Updating Work Order Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Updating Work Order Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; const deleteWorkOrderType = (clickEvent) => { - const tableRowElement = clickEvent.currentTarget.closest("tr"); + const tableRowElement = clickEvent.currentTarget.closest('tr'); const workOrderTypeId = tableRowElement.dataset.workOrderTypeId; const doDelete = () => { - cityssm.postJSON(los.urlPrefix + "/admin/doDeleteWorkOrderType", { + cityssm.postJSON(los.urlPrefix + '/admin/doDeleteWorkOrderType', { workOrderTypeId }, (responseJSON) => { if (responseJSON.success) { @@ -38,40 +38,40 @@ const deleteWorkOrderType = (clickEvent) => { tableRowElement.remove(); } bulmaJS.alert({ - message: "Work Order Type Deleted Successfully", - contextualColorName: "success" + message: 'Work Order Type Deleted Successfully', + contextualColorName: 'success' }); } else { bulmaJS.alert({ - title: "Error Deleting Work Order Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Deleting Work Order Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; bulmaJS.confirm({ - title: "Delete Work Order Type", + title: 'Delete Work Order Type', message: `Are you sure you want to delete this work order type?
Note that no work orders will be removed.`, messageIsHtml: true, - contextualColorName: "warning", + contextualColorName: 'warning', okButton: { - text: "Yes, Delete Work Order Type", + text: 'Yes, Delete Work Order Type', callbackFunction: doDelete } }); }; const moveWorkOrderType = (clickEvent) => { const buttonElement = clickEvent.currentTarget; - const tableRowElement = buttonElement.closest("tr"); + const tableRowElement = buttonElement.closest('tr'); const workOrderTypeId = tableRowElement.dataset.workOrderTypeId; cityssm.postJSON(los.urlPrefix + - "/admin/" + - (buttonElement.dataset.direction === "up" ? "doMoveWorkOrderTypeUp" : "doMoveWorkOrderTypeDown"), { + '/admin/' + + (buttonElement.dataset.direction === 'up' ? 'doMoveWorkOrderTypeUp' : 'doMoveWorkOrderTypeDown'), { workOrderTypeId, - moveToEnd: clickEvent.shiftKey ? "1" : "0" + moveToEnd: clickEvent.shiftKey ? '1' : '0' }, (responseJSON) => { if (responseJSON.success) { workOrderTypes = responseJSON.workOrderTypes; @@ -79,79 +79,79 @@ const moveWorkOrderType = (clickEvent) => { } else { bulmaJS.alert({ - title: "Error Moving Work Order Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Moving Work Order Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; const renderWorkOrderTypes = () => { - const containerElement = document.querySelector("#container--workOrderTypes"); + const containerElement = document.querySelector('#container--workOrderTypes'); if (workOrderTypes.length === 0) { containerElement.innerHTML = `

There are no active work order types.

`; return; } - containerElement.innerHTML = ""; + containerElement.innerHTML = ''; for (const workOrderType of workOrderTypes) { - const tableRowElement = document.createElement("tr"); + const tableRowElement = document.createElement('tr'); tableRowElement.dataset.workOrderTypeId = workOrderType.workOrderTypeId.toString(); tableRowElement.innerHTML = - "" + - "
" + + '' + + '' + '' + ('
' + '
' + '' + - "
" + + '
' + '
' + '' + - "
" + - "") + - "
" + - "" + + '' + + '') + + '' + + '' + '' + '
' + '
' + - los.getMoveUpDownButtonFieldHTML("button--moveWorkOrderTypeUp", "button--moveWorkOrderTypeDown", false) + - "
" + + los.getMoveUpDownButtonFieldHTML('button--moveWorkOrderTypeUp', 'button--moveWorkOrderTypeDown', false) + + '
' + '
' + '" + - "
" + - "" + - ""; - tableRowElement.querySelector("form").addEventListener("submit", updateWorkOrderType); - tableRowElement.querySelector(".button--moveWorkOrderTypeUp").addEventListener("click", moveWorkOrderType); - tableRowElement.querySelector(".button--moveWorkOrderTypeDown").addEventListener("click", moveWorkOrderType); + '' + + '' + + '' + + ''; + tableRowElement.querySelector('form').addEventListener('submit', updateWorkOrderType); + tableRowElement.querySelector('.button--moveWorkOrderTypeUp').addEventListener('click', moveWorkOrderType); + tableRowElement.querySelector('.button--moveWorkOrderTypeDown').addEventListener('click', moveWorkOrderType); tableRowElement - .querySelector(".button--deleteWorkOrderType") - .addEventListener("click", deleteWorkOrderType); + .querySelector('.button--deleteWorkOrderType') + .addEventListener('click', deleteWorkOrderType); containerElement.append(tableRowElement); } }; -document.querySelector("#form--addWorkOrderType").addEventListener("submit", (submitEvent) => { +document.querySelector('#form--addWorkOrderType').addEventListener('submit', (submitEvent) => { submitEvent.preventDefault(); const formElement = submitEvent.currentTarget; - cityssm.postJSON(los.urlPrefix + "/admin/doAddWorkOrderType", formElement, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/admin/doAddWorkOrderType', formElement, (responseJSON) => { if (responseJSON.success) { workOrderTypes = responseJSON.workOrderTypes; renderWorkOrderTypes(); formElement.reset(); - formElement.querySelector("input").focus(); + formElement.querySelector('input').focus(); } else { bulmaJS.alert({ - title: "Error Adding Work Order Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Adding Work Order Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); diff --git a/public-typescript/adminTables/adminTablesWorkOrderTypes.ts b/public-typescript/adminTables/adminTablesWorkOrderTypes.ts index 68f7ba57..ce21b1ba 100644 --- a/public-typescript/adminTables/adminTablesWorkOrderTypes.ts +++ b/public-typescript/adminTables/adminTablesWorkOrderTypes.ts @@ -1,238 +1,239 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ -import type * as globalTypes from "../../types/globalTypes"; -import type * as recordTypes from "../../types/recordTypes"; +import type * as globalTypes from '../../types/globalTypes' +import type * as recordTypes from '../../types/recordTypes' -import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; +import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types' -import type { BulmaJS } from "@cityssm/bulma-js/types"; +import type { BulmaJS } from '@cityssm/bulma-js/types' -declare const cityssm: cityssmGlobal; -declare const bulmaJS: BulmaJS; +declare const cityssm: cityssmGlobal +declare const bulmaJS: BulmaJS -declare const los: globalTypes.LOS; +declare const los: globalTypes.LOS -let workOrderTypes: recordTypes.WorkOrderType[] = exports.workOrderTypes; -delete exports.workOrderTypes; +let workOrderTypes: recordTypes.WorkOrderType[] = exports.workOrderTypes +delete exports.workOrderTypes const updateWorkOrderType = (submitEvent: SubmitEvent) => { - submitEvent.preventDefault(); + submitEvent.preventDefault() - cityssm.postJSON( - los.urlPrefix + "/admin/doUpdateWorkOrderType", - submitEvent.currentTarget, - (responseJSON: { - success: boolean; - errorMessage?: string; - workOrderTypes?: recordTypes.WorkOrderType[]; - }) => { - if (responseJSON.success) { - workOrderTypes = responseJSON.workOrderTypes!; + cityssm.postJSON( + los.urlPrefix + '/admin/doUpdateWorkOrderType', + submitEvent.currentTarget, + (responseJSON: { + success: boolean + errorMessage?: string + workOrderTypes?: recordTypes.WorkOrderType[] + }) => { + if (responseJSON.success) { + workOrderTypes = responseJSON.workOrderTypes! - bulmaJS.alert({ - message: "Work Order Type Updated Successfully", - contextualColorName: "success" - }); - } else { - bulmaJS.alert({ - title: "Error Updating Work Order Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); -}; + bulmaJS.alert({ + message: 'Work Order Type Updated Successfully', + contextualColorName: 'success' + }) + } else { + bulmaJS.alert({ + title: 'Error Updating Work Order Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + ) +} 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 = () => { - cityssm.postJSON( - los.urlPrefix + "/admin/doDeleteWorkOrderType", - { - workOrderTypeId - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - workOrderTypes?: recordTypes.WorkOrderType[]; - }) => { - if (responseJSON.success) { - workOrderTypes = responseJSON.workOrderTypes!; + const doDelete = () => { + cityssm.postJSON( + los.urlPrefix + '/admin/doDeleteWorkOrderType', + { + workOrderTypeId + }, + (responseJSON: { + success: boolean + errorMessage?: string + workOrderTypes?: recordTypes.WorkOrderType[] + }) => { + if (responseJSON.success) { + workOrderTypes = responseJSON.workOrderTypes! - if (workOrderTypes.length === 0) { - renderWorkOrderTypes(); - } else { - tableRowElement.remove(); - } + if (workOrderTypes.length === 0) { + renderWorkOrderTypes() + } else { + tableRowElement.remove() + } - bulmaJS.alert({ - message: "Work Order Type Deleted Successfully", - contextualColorName: "success" - }); - } else { - bulmaJS.alert({ - title: "Error Deleting Work Order Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }; - - bulmaJS.confirm({ - title: "Delete Work Order Type", - message: `Are you sure you want to delete this work order type?
- Note that no work orders will be removed.`, - messageIsHtml: true, - contextualColorName: "warning", - okButton: { - text: "Yes, Delete Work Order Type", - callbackFunction: doDelete + bulmaJS.alert({ + message: 'Work Order Type Deleted Successfully', + contextualColorName: 'success' + }) + } else { + bulmaJS.alert({ + title: 'Error Deleting Work Order Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) } - }); -}; + } + ) + } + + bulmaJS.confirm({ + title: 'Delete Work Order Type', + message: `Are you sure you want to delete this work order type?
+ 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 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( - los.urlPrefix + - "/admin/" + - (buttonElement.dataset.direction === "up" ? "doMoveWorkOrderTypeUp" : "doMoveWorkOrderTypeDown"), - { - workOrderTypeId, - moveToEnd: clickEvent.shiftKey ? "1" : "0" - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - workOrderTypes?: recordTypes.WorkOrderType[]; - }) => { - if (responseJSON.success) { - workOrderTypes = responseJSON.workOrderTypes!; - renderWorkOrderTypes(); - } else { - bulmaJS.alert({ - title: "Error Moving Work Order Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); -}; + cityssm.postJSON( + los.urlPrefix + + '/admin/' + + (buttonElement.dataset.direction === 'up' ? 'doMoveWorkOrderTypeUp' : 'doMoveWorkOrderTypeDown'), + { + workOrderTypeId, + moveToEnd: clickEvent.shiftKey ? '1' : '0' + }, + (responseJSON: { + success: boolean + errorMessage?: string + workOrderTypes?: recordTypes.WorkOrderType[] + }) => { + if (responseJSON.success) { + workOrderTypes = responseJSON.workOrderTypes! + renderWorkOrderTypes() + } else { + bulmaJS.alert({ + title: 'Error Moving Work Order Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + ) +} const renderWorkOrderTypes = () => { - const containerElement = document.querySelector("#container--workOrderTypes") as HTMLTableSectionElement; + const containerElement = document.querySelector('#container--workOrderTypes') as HTMLTableSectionElement - if (workOrderTypes.length === 0) { - containerElement.innerHTML = ` + if (workOrderTypes.length === 0) { + containerElement.innerHTML = `

There are no active work order types.

- `; + ` - return; - } + return + } - containerElement.innerHTML = ""; + containerElement.innerHTML = '' - for (const workOrderType of workOrderTypes) { - const tableRowElement = document.createElement("tr"); + for (const workOrderType of workOrderTypes) { + const tableRowElement = document.createElement('tr') - tableRowElement.dataset.workOrderTypeId = workOrderType.workOrderTypeId!.toString(); + tableRowElement.dataset.workOrderTypeId = workOrderType.workOrderTypeId!.toString() - tableRowElement.innerHTML = - "" + - "
" + - '' + - ('
' + - '
' + - '' + - "
" + - '
' + - '' + - "
" + - "
") + - "
" + - "" + - '' + - '
' + - '
' + - los.getMoveUpDownButtonFieldHTML( - "button--moveWorkOrderTypeUp", - "button--moveWorkOrderTypeDown", - false - ) + - "
" + - '
' + - '" + - "
" + - "
" + - ""; + tableRowElement.innerHTML = + '' + + '
' + + '' + + ('
' + + '
' + + '' + + '
' + + '
' + + '' + + '
' + + '
') + + '
' + + '' + + '' + + '
' + + '
' + + los.getMoveUpDownButtonFieldHTML( + 'button--moveWorkOrderTypeUp', + 'button--moveWorkOrderTypeDown', + false + ) + + '
' + + '
' + + '' + + '
' + + '
' + + '' - tableRowElement.querySelector("form")!.addEventListener("submit", updateWorkOrderType); + tableRowElement.querySelector('form')!.addEventListener('submit', updateWorkOrderType) - (tableRowElement.querySelector(".button--moveWorkOrderTypeUp") as HTMLButtonElement).addEventListener( - "click", - moveWorkOrderType - ); + ;(tableRowElement.querySelector('.button--moveWorkOrderTypeUp') as HTMLButtonElement).addEventListener( + 'click', + moveWorkOrderType + ) - ( - tableRowElement.querySelector(".button--moveWorkOrderTypeDown") as HTMLButtonElement - ).addEventListener("click", moveWorkOrderType); + ;(tableRowElement.querySelector('.button--moveWorkOrderTypeDown') as HTMLButtonElement).addEventListener( + 'click', + moveWorkOrderType + ) - tableRowElement - .querySelector(".button--deleteWorkOrderType")! - .addEventListener("click", deleteWorkOrderType); + tableRowElement + .querySelector('.button--deleteWorkOrderType')! + .addEventListener('click', deleteWorkOrderType) - containerElement.append(tableRowElement); - } -}; + containerElement.append(tableRowElement) + } +} -(document.querySelector("#form--addWorkOrderType") as HTMLFormElement).addEventListener( - "submit", - (submitEvent: SubmitEvent) => { - submitEvent.preventDefault(); +;(document.querySelector('#form--addWorkOrderType') as HTMLFormElement).addEventListener( + 'submit', + (submitEvent: SubmitEvent) => { + submitEvent.preventDefault() - const formElement = submitEvent.currentTarget as HTMLFormElement; + const formElement = submitEvent.currentTarget as HTMLFormElement - cityssm.postJSON( - los.urlPrefix + "/admin/doAddWorkOrderType", - formElement, - (responseJSON: { - success: boolean; - errorMessage?: string; - workOrderTypes?: recordTypes.WorkOrderType[]; - }) => { - if (responseJSON.success) { - workOrderTypes = responseJSON.workOrderTypes!; - renderWorkOrderTypes(); - formElement.reset(); - formElement.querySelector("input")!.focus(); - } else { - bulmaJS.alert({ - title: "Error Adding Work Order Type", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - } -); + cityssm.postJSON( + los.urlPrefix + '/admin/doAddWorkOrderType', + formElement, + (responseJSON: { + success: boolean + errorMessage?: string + workOrderTypes?: recordTypes.WorkOrderType[] + }) => { + if (responseJSON.success) { + workOrderTypes = responseJSON.workOrderTypes! + renderWorkOrderTypes() + formElement.reset() + formElement.querySelector('input')!.focus() + } else { + bulmaJS.alert({ + title: 'Error Adding Work Order Type', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + ) + } +) -renderWorkOrderTypes(); +renderWorkOrderTypes() diff --git a/public-typescript/dashboard.js b/public-typescript/dashboard.js index 396af7f2..3612a1e0 100644 --- a/public-typescript/dashboard.js +++ b/public-typescript/dashboard.js @@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); (() => { 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) { - workOrderNumberCircleElement.style.color = los.getRandomColor(workOrderNumberCircleElement.dataset.workOrderNumber || ""); + workOrderNumberCircleElement.style.color = los.getRandomColor(workOrderNumberCircleElement.dataset.workOrderNumber || ''); } })(); diff --git a/public-typescript/dashboard.ts b/public-typescript/dashboard.ts index f0d34acd..76333a68 100644 --- a/public-typescript/dashboard.ts +++ b/public-typescript/dashboard.ts @@ -1,17 +1,17 @@ /* 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( - ".fa-circle[data-work-order-number" - ) as NodeListOf; + const workOrderNumberCircleElements = document.querySelectorAll( + '.fa-circle[data-work-order-number' + ) as NodeListOf - for (const workOrderNumberCircleElement of workOrderNumberCircleElements) { - workOrderNumberCircleElement.style.color = los.getRandomColor( - workOrderNumberCircleElement.dataset.workOrderNumber || "" - ); - } -})(); + for (const workOrderNumberCircleElement of workOrderNumberCircleElements) { + workOrderNumberCircleElement.style.color = los.getRandomColor( + workOrderNumberCircleElement.dataset.workOrderNumber || '' + ) + } +})() diff --git a/public-typescript/lotEdit.js b/public-typescript/lotEdit.js index a9975ad2..f9cc92c4 100644 --- a/public-typescript/lotEdit.js +++ b/public-typescript/lotEdit.js @@ -4,14 +4,15 @@ Object.defineProperty(exports, "__esModule", { value: true }); (() => { var _a; const los = exports.los; - const lotId = document.querySelector("#lot--lotId").value; - const isCreate = lotId === ""; + const lotId = document.querySelector('#lot--lotId') + .value; + const isCreate = lotId === ''; // Main form let refreshAfterSave = isCreate; - const formElement = document.querySelector("#form--lot"); + const formElement = document.querySelector('#form--lot'); function updateLot(formEvent) { 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) { los.clearUnsavedChanges(); if (isCreate || refreshAfterSave) { @@ -19,30 +20,31 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - message: exports.aliases.lot + " Updated Successfully", - contextualColorName: "success" + message: exports.aliases.lot + ' Updated Successfully', + contextualColorName: 'success' }); } } else { bulmaJS.alert({ - title: "Error Updating " + exports.aliases.lot, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Updating ' + exports.aliases.lot, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); } - formElement.addEventListener("submit", updateLot); - const formInputElements = formElement.querySelectorAll("input, select"); + formElement.addEventListener('submit', updateLot); + const formInputElements = formElement.querySelectorAll('input, select'); for (const formInputElement of formInputElements) { - formInputElement.addEventListener("change", los.setUnsavedChanges); + formInputElement.addEventListener('change', los.setUnsavedChanges); } 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(); const doDelete = () => { - cityssm.postJSON(los.urlPrefix + "/lots/doDeleteLot", { + cityssm.postJSON(los.urlPrefix + '/lots/doDeleteLot', { lotId }, (responseJSON) => { if (responseJSON.success) { @@ -52,16 +54,16 @@ Object.defineProperty(exports, "__esModule", { value: true }); else { bulmaJS.alert({ title: `Error Deleting ${los.escapedAliases.Lot}`, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; bulmaJS.confirm({ - title: "Delete " + exports.aliases.lot, + title: 'Delete ' + exports.aliases.lot, message: `Are you sure you want to delete this ${los.escapedAliases.lot}?`, - contextualColorName: "warning", + contextualColorName: 'warning', okButton: { text: `Yes, Delete ${los.escapedAliases.Lot}`, callbackFunction: doDelete @@ -69,17 +71,17 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); }); // Lot Type - const lotTypeIdElement = document.querySelector("#lot--lotTypeId"); + const lotTypeIdElement = document.querySelector('#lot--lotTypeId'); if (isCreate) { - const lotFieldsContainerElement = document.querySelector("#container--lotFields"); - lotTypeIdElement.addEventListener("change", () => { - if (lotTypeIdElement.value === "") { + const lotFieldsContainerElement = document.querySelector('#container--lotFields'); + lotTypeIdElement.addEventListener('change', () => { + if (lotTypeIdElement.value === '') { lotFieldsContainerElement.innerHTML = `

Select the ${los.escapedAliases.lot} type to load the available fields.

`; return; } - cityssm.postJSON(los.urlPrefix + "/lots/doGetLotTypeFields", { + cityssm.postJSON(los.urlPrefix + '/lots/doGetLotTypeFields', { lotTypeId: lotTypeIdElement.value }, (responseJSON) => { if (responseJSON.lotTypeFields.length === 0) { @@ -88,41 +90,40 @@ Object.defineProperty(exports, "__esModule", { value: true }); `; return; } - lotFieldsContainerElement.innerHTML = ""; - let lotTypeFieldIds = ""; + 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"; + lotTypeFieldIds += ',' + lotTypeField.lotTypeFieldId; + const fieldName = 'lotFieldValue_' + lotTypeField.lotTypeFieldId; + const fieldId = 'lot--' + fieldName; + const fieldElement = document.createElement('div'); + fieldElement.className = 'field'; fieldElement.innerHTML = `
`; - fieldElement.querySelector("label").textContent = - lotTypeField.lotTypeField; - if (lotTypeField.lotTypeFieldValues === "") { - const inputElement = document.createElement("input"); - inputElement.className = "input"; + fieldElement.querySelector('label').textContent = lotTypeField.lotTypeField; + if (lotTypeField.lotTypeFieldValues === '') { + const inputElement = document.createElement('input'); + inputElement.className = 'input'; inputElement.id = fieldId; inputElement.name = fieldName; - inputElement.type = "text"; + inputElement.type = 'text'; inputElement.required = lotTypeField.isRequired; inputElement.minLength = lotTypeField.minimumLength; inputElement.maxLength = lotTypeField.maximumLength; - if (lotTypeField.pattern && lotTypeField.pattern !== "") { + if (lotTypeField.pattern && lotTypeField.pattern !== '') { inputElement.pattern = lotTypeField.pattern; } - fieldElement.querySelector(".control").append(inputElement); + fieldElement.querySelector('.control').append(inputElement); } else { - fieldElement.querySelector(".control").innerHTML = `
+ fieldElement.querySelector('.control').innerHTML = `
`; - const selectElement = fieldElement.querySelector("select"); + const selectElement = fieldElement.querySelector('select'); selectElement.required = lotTypeField.isRequired; - const optionValues = lotTypeField.lotTypeFieldValues.split("\n"); + const optionValues = lotTypeField.lotTypeFieldValues.split('\n'); for (const optionValue of optionValues) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = optionValue; optionElement.textContent = optionValue; selectElement.append(optionElement); @@ -130,28 +131,28 @@ Object.defineProperty(exports, "__esModule", { value: true }); } lotFieldsContainerElement.append(fieldElement); } - lotFieldsContainerElement.insertAdjacentHTML("beforeend", ``); }); }); } else { const originalLotTypeId = lotTypeIdElement.value; - lotTypeIdElement.addEventListener("change", () => { + lotTypeIdElement.addEventListener('change', () => { if (lotTypeIdElement.value !== originalLotTypeId) { bulmaJS.confirm({ - title: "Confirm Change", + 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", + contextualColorName: 'warning', okButton: { - text: "Yes, Keep the Change", + text: 'Yes, Keep the Change', callbackFunction: () => { refreshAfterSave = true; } }, cancelButton: { - text: "Revert the Change", + text: 'Revert the Change', callbackFunction: () => { lotTypeIdElement.value = originalLotTypeId; } @@ -164,7 +165,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); let lotComments = exports.lotComments; delete exports.lotComments; 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) => { return currentLotComment.lotCommentId === lotCommentId; }); @@ -172,7 +174,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); let editCloseModalFunction; const editComment = (submitEvent) => { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/lots/doUpdateLotComment", editFormElement, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/lots/doUpdateLotComment', editFormElement, (responseJSON) => { if (responseJSON.success) { lotComments = responseJSON.lotComments; editCloseModalFunction(); @@ -180,37 +182,34 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Updating Comment", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Updating Comment', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; - cityssm.openHtmlModal("lot-editComment", { + cityssm.openHtmlModal('lot-editComment', { onshow: (modalElement) => { los.populateAliases(modalElement); - modalElement.querySelector("#lotCommentEdit--lotId").value = lotId; - modalElement.querySelector("#lotCommentEdit--lotCommentId").value = - lotCommentId.toString(); - modalElement.querySelector("#lotCommentEdit--lotComment").value = - lotComment.lotComment; - const lotCommentDateStringElement = modalElement.querySelector("#lotCommentEdit--lotCommentDateString"); + modalElement.querySelector('#lotCommentEdit--lotId').value = lotId; + modalElement.querySelector('#lotCommentEdit--lotCommentId').value = lotCommentId.toString(); + modalElement.querySelector('#lotCommentEdit--lotComment').value = lotComment.lotComment; + const lotCommentDateStringElement = modalElement.querySelector('#lotCommentEdit--lotCommentDateString'); lotCommentDateStringElement.value = lotComment.lotCommentDateString; const currentDateString = cityssm.dateToString(new Date()); lotCommentDateStringElement.max = lotComment.lotCommentDateString <= currentDateString ? currentDateString : lotComment.lotCommentDateString; - modalElement.querySelector("#lotCommentEdit--lotCommentTimeString").value = lotComment.lotCommentTimeString; + modalElement.querySelector('#lotCommentEdit--lotCommentTimeString').value = lotComment.lotCommentTimeString; }, onshown: (modalElement, closeModalFunction) => { bulmaJS.toggleHtmlClipped(); los.initializeDatePickers(modalElement); - // los.initializeTimePickers(modalElement); - modalElement.querySelector("#lotCommentEdit--lotComment").focus(); - editFormElement = modalElement.querySelector("form"); - editFormElement.addEventListener("submit", editComment); + modalElement.querySelector('#lotCommentEdit--lotComment').focus(); + editFormElement = modalElement.querySelector('form'); + editFormElement.addEventListener('submit', editComment); editCloseModalFunction = closeModalFunction; }, onremoved: () => { @@ -219,9 +218,10 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); } 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 = () => { - cityssm.postJSON(los.urlPrefix + "/lots/doDeleteLotComment", { + cityssm.postJSON(los.urlPrefix + '/lots/doDeleteLotComment', { lotId, lotCommentId }, (responseJSON) => { @@ -231,33 +231,33 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Removing Comment", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Removing Comment', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; bulmaJS.confirm({ - title: "Remove Comment?", - message: "Are you sure you want to remove this comment?", + title: 'Remove Comment?', + message: 'Are you sure you want to remove this comment?', okButton: { - text: "Yes, Remove Comment", + text: 'Yes, Remove Comment', callbackFunction: doDelete }, - contextualColorName: "warning" + contextualColorName: 'warning' }); } function renderLotComments() { - const containerElement = document.querySelector("#container--lotComments"); + const containerElement = document.querySelector('#container--lotComments'); if (lotComments.length === 0) { containerElement.innerHTML = `

There are no comments to display.

`; return; } - const tableElement = document.createElement("table"); - tableElement.className = "table is-fullwidth is-striped is-hoverable"; + const tableElement = document.createElement('table'); + tableElement.className = 'table is-fullwidth is-striped is-hoverable'; tableElement.innerHTML = ` Commentor Comment Date @@ -266,42 +266,48 @@ Object.defineProperty(exports, "__esModule", { value: true }); `; for (const lotComment of lotComments) { - const tableRowElement = document.createElement("tr"); + const tableRowElement = document.createElement('tr'); tableRowElement.dataset.lotCommentId = lotComment.lotCommentId.toString(); tableRowElement.innerHTML = - "" + - cityssm.escapeHTML(lotComment.recordCreate_userName || "") + - "" + - "" + + '' + + cityssm.escapeHTML(lotComment.recordCreate_userName || '') + + '' + + '' + lotComment.lotCommentDateString + - (lotComment.lotCommentTime === 0 ? "" : " " + lotComment.lotCommentTimeString) + - "" + - "" + - cityssm.escapeHTML(lotComment.lotComment || "") + - "" + + (lotComment.lotCommentTime === 0 + ? '' + : ' ' + lotComment.lotCommentTimeString) + + '' + + '' + + cityssm.escapeHTML(lotComment.lotComment || '') + + '' + ('' + '
' + ('") + + ' Edit' + + '') + ('") + - "
" + - ""); - tableRowElement.querySelector(".button--edit").addEventListener("click", openEditLotComment); - tableRowElement.querySelector(".button--delete").addEventListener("click", deleteLotComment); - tableElement.querySelector("tbody").append(tableRowElement); + '') + + '
' + + ''); + tableRowElement + .querySelector('.button--edit') + .addEventListener('click', openEditLotComment); + tableRowElement + .querySelector('.button--delete') + .addEventListener('click', deleteLotComment); + tableElement.querySelector('tbody').append(tableRowElement); } - containerElement.innerHTML = ""; + containerElement.innerHTML = ''; containerElement.append(tableElement); } function openAddCommentModal() { let addCommentCloseModalFunction; const doAddComment = (formEvent) => { formEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/lots/doAddLotComment", formEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/lots/doAddLotComment', formEvent.currentTarget, (responseJSON) => { if (responseJSON.success) { lotComments = responseJSON.lotComments; renderLotComments(); @@ -309,25 +315,29 @@ Object.defineProperty(exports, "__esModule", { value: true }); } }); }; - cityssm.openHtmlModal("lot-addComment", { + cityssm.openHtmlModal('lot-addComment', { onshow(modalElement) { los.populateAliases(modalElement); - modalElement.querySelector("#lotCommentAdd--lotId").value = lotId; - modalElement.querySelector("form").addEventListener("submit", doAddComment); + modalElement.querySelector('#lotCommentAdd--lotId').value = lotId; + modalElement + .querySelector('form') + .addEventListener('submit', doAddComment); }, onshown(modalElement, closeModalFunction) { bulmaJS.toggleHtmlClipped(); addCommentCloseModalFunction = closeModalFunction; - modalElement.querySelector("#lotCommentAdd--lotComment").focus(); + modalElement.querySelector('#lotCommentAdd--lotComment').focus(); }, onremoved() { bulmaJS.toggleHtmlClipped(); - document.querySelector("#lotComments--add").focus(); + document.querySelector('#lotComments--add').focus(); } }); } if (!isCreate) { - document.querySelector("#lotComments--add").addEventListener("click", openAddCommentModal); + document + .querySelector('#lotComments--add') + .addEventListener('click', openAddCommentModal); renderLotComments(); } })(); diff --git a/public-typescript/lotEdit.ts b/public-typescript/lotEdit.ts index 57fc3caf..15c0cde6 100644 --- a/public-typescript/lotEdit.ts +++ b/public-typescript/lotEdit.ts @@ -1,461 +1,520 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ -import type * as globalTypes from "../types/globalTypes"; -import type * as recordTypes from "../types/recordTypes"; - -import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; - -import type { BulmaJS } from "@cityssm/bulma-js/types"; - -declare const cityssm: cityssmGlobal; -declare const bulmaJS: BulmaJS; - -(() => { - const los = exports.los as globalTypes.LOS; - - const lotId = (document.querySelector("#lot--lotId") as HTMLInputElement).value; - const isCreate = lotId === ""; - - // Main form - - let refreshAfterSave = isCreate; - - const formElement = document.querySelector("#form--lot") as HTMLFormElement; - - function updateLot(formEvent: SubmitEvent) { - formEvent.preventDefault(); - - cityssm.postJSON( - los.urlPrefix + "/lots/" + (isCreate ? "doCreateLot" : "doUpdateLot"), - formElement, - (responseJSON: { success: boolean; lotId?: number; errorMessage?: string }) => { - if (responseJSON.success) { - los.clearUnsavedChanges(); - - if (isCreate || refreshAfterSave) { - window.location.href = los.getLotURL(responseJSON.lotId, true, true); - } else { - bulmaJS.alert({ - message: exports.aliases.lot + " Updated Successfully", - contextualColorName: "success" - }); - } - } 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 = `
-

Select the ${los.escapedAliases.lot} type to load the available fields.

-
`; - - return; - } - - cityssm.postJSON( - los.urlPrefix + "/lots/doGetLotTypeFields", - { - lotTypeId: lotTypeIdElement.value - }, - (responseJSON: { lotTypeFields: recordTypes.LotTypeField[] }) => { - if (responseJSON.lotTypeFields.length === 0) { - lotFieldsContainerElement.innerHTML = `
-

There are no additional fields for this ${los.escapedAliases.lot} type.

-
`; - - 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 = ` -
`; - - (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 = `
- -
`; - - 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", - `` - ); - } - ); - }); - } 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 = `
-

There are no comments to display.

-
`; - return; +import type * as globalTypes from '../types/globalTypes' +import type * as recordTypes from '../types/recordTypes' + +import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types' + +import type { BulmaJS } from '@cityssm/bulma-js/types' + +declare const cityssm: cityssmGlobal +declare const bulmaJS: BulmaJS + +;(() => { + const los = exports.los as globalTypes.LOS + + const lotId = (document.querySelector('#lot--lotId') as HTMLInputElement) + .value + const isCreate = lotId === '' + + // Main form + + let refreshAfterSave = isCreate + + const formElement = document.querySelector('#form--lot') as HTMLFormElement + + function updateLot(formEvent: SubmitEvent) { + formEvent.preventDefault() + + cityssm.postJSON( + los.urlPrefix + '/lots/' + (isCreate ? 'doCreateLot' : 'doUpdateLot'), + formElement, + (responseJSON: { + success: boolean + lotId?: number + errorMessage?: string + }) => { + if (responseJSON.success) { + los.clearUnsavedChanges() + + if (isCreate || refreshAfterSave) { + window.location.href = los.getLotURL(responseJSON.lotId, true, true) + } else { + bulmaJS.alert({ + message: exports.aliases.lot + ' Updated Successfully', + contextualColorName: 'success' + }) + } + } else { + bulmaJS.alert({ + title: 'Error Updating ' + exports.aliases.lot, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) } + } + ) + } - const tableElement = document.createElement("table"); - tableElement.className = "table is-fullwidth is-striped is-hoverable"; - tableElement.innerHTML = ` + 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 = `
+

Select the ${los.escapedAliases.lot} type to load the available fields.

+
` + + return + } + + cityssm.postJSON( + los.urlPrefix + '/lots/doGetLotTypeFields', + { + lotTypeId: lotTypeIdElement.value + }, + (responseJSON: { lotTypeFields: recordTypes.LotTypeField[] }) => { + if (responseJSON.lotTypeFields.length === 0) { + lotFieldsContainerElement.innerHTML = `
+

There are no additional fields for this ${los.escapedAliases.lot} type.

+
` + + 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 = ` +
` + + ;( + 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 = `
+ +
` + + 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', + `` + ) + } + ) + }) + } 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 = `
+

There are no comments to display.

+
` + return + } + + const tableElement = document.createElement('table') + tableElement.className = 'table is-fullwidth is-striped is-hoverable' + tableElement.innerHTML = ` Commentor Comment Date Comment Options - `; + ` - for (const lotComment of lotComments) { - const tableRowElement = document.createElement("tr"); - tableRowElement.dataset.lotCommentId = lotComment.lotCommentId!.toString(); + for (const lotComment of lotComments) { + const tableRowElement = document.createElement('tr') + tableRowElement.dataset.lotCommentId = lotComment.lotCommentId!.toString() - tableRowElement.innerHTML = - "" + - cityssm.escapeHTML(lotComment.recordCreate_userName || "") + - "" + - "" + - lotComment.lotCommentDateString + - (lotComment.lotCommentTime === 0 ? "" : " " + lotComment.lotCommentTimeString) + - "" + - "" + - cityssm.escapeHTML(lotComment.lotComment || "") + - "" + - ('' + - '
' + - ('") + - ('") + - "
" + - ""); + tableRowElement.innerHTML = + '' + + cityssm.escapeHTML(lotComment.recordCreate_userName || '') + + '' + + '' + + lotComment.lotCommentDateString + + (lotComment.lotCommentTime === 0 + ? '' + : ' ' + lotComment.lotCommentTimeString) + + '' + + '' + + cityssm.escapeHTML(lotComment.lotComment || '') + + '' + + ('' + + '
' + + ('') + + ('') + + '
' + + '') - 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() { - let addCommentCloseModalFunction: () => void; + 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() + } + }) + } - 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(); - } - } - ); - }; - - 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(); - } -})(); + if (!isCreate) { + document + .querySelector('#lotComments--add')! + .addEventListener('click', openAddCommentModal) + renderLotComments() + } +})() diff --git a/public-typescript/lotOccupancyEdit.js b/public-typescript/lotOccupancyEdit.js index 93bf4595..4346b923 100644 --- a/public-typescript/lotOccupancyEdit.js +++ b/public-typescript/lotOccupancyEdit.js @@ -4,17 +4,18 @@ Object.defineProperty(exports, "__esModule", { value: true }); (() => { var _a, _b, _c; const los = exports.los; - const lotOccupancyId = document.querySelector("#lotOccupancy--lotOccupancyId") - .value; - const isCreate = lotOccupancyId === ""; + const lotOccupancyId = document.querySelector('#lotOccupancy--lotOccupancyId').value; + const isCreate = lotOccupancyId === ''; /* * Main form */ let refreshAfterSave = isCreate; - const formElement = document.querySelector("#form--lotOccupancy"); - formElement.addEventListener("submit", (formEvent) => { + const formElement = document.querySelector('#form--lotOccupancy'); + formElement.addEventListener('submit', (formEvent) => { 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) { los.clearUnsavedChanges(); if (isCreate || refreshAfterSave) { @@ -23,25 +24,25 @@ Object.defineProperty(exports, "__esModule", { value: true }); else { bulmaJS.alert({ message: `${los.escapedAliases.Occupancy} Updated Successfully`, - contextualColorName: "success" + contextualColorName: 'success' }); } } else { bulmaJS.alert({ - title: "Error Saving " + exports.aliases.occupancy, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Saving ' + exports.aliases.occupancy, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }); - const formInputElements = formElement.querySelectorAll("input, select"); + const formInputElements = formElement.querySelectorAll('input, select'); for (const formInputElement of formInputElements) { - formInputElement.addEventListener("change", los.setUnsavedChanges); + formInputElement.addEventListener('change', los.setUnsavedChanges); } const doCopy = () => { - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doCopyLotOccupancy", { + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doCopyLotOccupancy', { lotOccupancyId }, (responseJSON) => { if (responseJSON.success) { @@ -50,38 +51,40 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Copying Record", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Copying Record', + message: responseJSON.errorMessage || '', + 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(); if (los.hasUnsavedChanges()) { bulmaJS.alert({ - title: "Unsaved Changes", - message: "Please save all unsaved changes before continuing.", - contextualColorName: "warning" + title: 'Unsaved Changes', + message: 'Please save all unsaved changes before continuing.', + contextualColorName: 'warning' }); } else { bulmaJS.confirm({ title: `Copy ${los.escapedAliases.Occupancy} Record as New`, - message: "Are you sure you want to copy this record to a new record?", - contextualColorName: "info", + message: 'Are you sure you want to copy this record to a new record?', + contextualColorName: 'info', okButton: { - text: "Yes, Copy", + text: 'Yes, Copy', 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(); const doDelete = () => { - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancy", { + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancy', { lotOccupancyId }, (responseJSON) => { if (responseJSON.success) { @@ -90,65 +93,69 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Deleting Record", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Deleting Record', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; bulmaJS.confirm({ - title: "Delete " + exports.aliases.occupancy + " Record", - message: "Are you sure you want to delete this record?", - contextualColorName: "warning", + title: 'Delete ' + exports.aliases.occupancy + ' Record', + message: 'Are you sure you want to delete this record?', + contextualColorName: 'warning', okButton: { - text: "Yes, Delete", + text: 'Yes, Delete', 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(); let createCloseModalFunction; const doCreate = (formEvent) => { formEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/workOrders/doCreateWorkOrder", formEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/workOrders/doCreateWorkOrder', formEvent.currentTarget, (responseJSON) => { if (responseJSON.success) { createCloseModalFunction(); bulmaJS.confirm({ - title: "Work Order Created Successfully", - message: "Would you like to open the work order now?", - contextualColorName: "success", + title: 'Work Order Created Successfully', + message: 'Would you like to open the work order now?', + contextualColorName: 'success', okButton: { - text: "Yes, Open the Work Order", + text: 'Yes, Open the Work Order', callbackFunction: () => { window.location.href = - los.urlPrefix + "/workOrders/" + responseJSON.workOrderId + "/edit"; + los.urlPrefix + + '/workOrders/' + + responseJSON.workOrderId + + '/edit'; } } }); } else { bulmaJS.alert({ - title: "Error Creating Work Order", + title: 'Error Creating Work Order', message: responseJSON.errorMessage, - contextualColorName: "danger" + contextualColorName: 'danger' }); } }); }; - cityssm.openHtmlModal("lotOccupancy-createWorkOrder", { + cityssm.openHtmlModal('lotOccupancy-createWorkOrder', { onshow(modalElement) { - modalElement.querySelector("#workOrderCreate--lotOccupancyId").value = - lotOccupancyId; - modalElement.querySelector("#workOrderCreate--workOrderOpenDateString").value = cityssm.dateToString(new Date()); - const workOrderTypeSelectElement = modalElement.querySelector("#workOrderCreate--workOrderTypeId"); + ; + modalElement.querySelector('#workOrderCreate--lotOccupancyId').value = lotOccupancyId; + modalElement.querySelector('#workOrderCreate--workOrderOpenDateString').value = cityssm.dateToString(new Date()); + const workOrderTypeSelectElement = modalElement.querySelector('#workOrderCreate--workOrderTypeId'); const workOrderTypes = exports.workOrderTypes; if (workOrderTypes.length === 1) { - workOrderTypeSelectElement.innerHTML = ""; + workOrderTypeSelectElement.innerHTML = ''; } for (const workOrderType of workOrderTypes) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = workOrderType.workOrderTypeId.toString(); optionElement.textContent = workOrderType.workOrderType; workOrderTypeSelectElement.append(optionElement); @@ -157,22 +164,23 @@ Object.defineProperty(exports, "__esModule", { value: true }); onshown(modalElement, closeModalFunction) { var _a; 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 - const occupancyTypeIdElement = document.querySelector("#lotOccupancy--occupancyTypeId"); + const occupancyTypeIdElement = document.querySelector('#lotOccupancy--occupancyTypeId'); if (isCreate) { - const lotOccupancyFieldsContainerElement = document.querySelector("#container--lotOccupancyFields"); - occupancyTypeIdElement.addEventListener("change", () => { - if (occupancyTypeIdElement.value === "") { + const lotOccupancyFieldsContainerElement = document.querySelector('#container--lotOccupancyFields'); + occupancyTypeIdElement.addEventListener('change', () => { + if (occupancyTypeIdElement.value === '') { lotOccupancyFieldsContainerElement.innerHTML = `

Select the ${los.escapedAliases.occupancy} type to load the available fields.

`; return; } - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doGetOccupancyTypeFields", { + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doGetOccupancyTypeFields', { occupancyTypeId: occupancyTypeIdElement.value }, (responseJSON) => { if (responseJSON.occupancyTypeFields.length === 0) { @@ -181,45 +189,51 @@ Object.defineProperty(exports, "__esModule", { value: true }); `; return; } - lotOccupancyFieldsContainerElement.innerHTML = ""; - let occupancyTypeFieldIds = ""; + lotOccupancyFieldsContainerElement.innerHTML = ''; + let occupancyTypeFieldIds = ''; for (const occupancyTypeField of responseJSON.occupancyTypeFields) { - occupancyTypeFieldIds += "," + occupancyTypeField.occupancyTypeFieldId; - const fieldName = "lotOccupancyFieldValue_" + occupancyTypeField.occupancyTypeFieldId; - const fieldId = "lotOccupancy--" + fieldName; - const fieldElement = document.createElement("div"); - fieldElement.className = "field"; + occupancyTypeFieldIds += + ',' + occupancyTypeField.occupancyTypeFieldId; + const fieldName = 'lotOccupancyFieldValue_' + + occupancyTypeField.occupancyTypeFieldId; + const fieldId = 'lotOccupancy--' + fieldName; + const fieldElement = document.createElement('div'); + fieldElement.className = 'field'; fieldElement.innerHTML = `
`; - fieldElement.querySelector("label").textContent = - occupancyTypeField.occupancyTypeField; - if (occupancyTypeField.occupancyTypeFieldValues === "") { - const inputElement = document.createElement("input"); - inputElement.className = "input"; + fieldElement.querySelector('label').textContent = occupancyTypeField.occupancyTypeField; + if (occupancyTypeField.occupancyTypeFieldValues === '') { + const inputElement = document.createElement('input'); + inputElement.className = 'input'; inputElement.id = fieldId; inputElement.name = fieldName; - inputElement.type = "text"; + inputElement.type = 'text'; inputElement.required = occupancyTypeField.isRequired; - inputElement.minLength = occupancyTypeField.minimumLength; - inputElement.maxLength = occupancyTypeField.maximumLength; - if (occupancyTypeField.pattern && occupancyTypeField.pattern !== "") { + inputElement.minLength = + occupancyTypeField.minimumLength; + inputElement.maxLength = + occupancyTypeField.maximumLength; + if (occupancyTypeField.pattern && + occupancyTypeField.pattern !== '') { inputElement.pattern = occupancyTypeField.pattern; } - fieldElement.querySelector(".control").append(inputElement); + ; + fieldElement.querySelector('.control').append(inputElement); } else { - fieldElement.querySelector(".control").innerHTML = + ; + fieldElement.querySelector('.control').innerHTML = '
"; - const selectElement = fieldElement.querySelector("select"); + ''; + const selectElement = fieldElement.querySelector('select'); selectElement.required = occupancyTypeField.isRequired; - const optionValues = occupancyTypeField.occupancyTypeFieldValues.split("\n"); + const optionValues = occupancyTypeField.occupancyTypeFieldValues.split('\n'); for (const optionValue of optionValues) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = optionValue; optionElement.textContent = optionValue; selectElement.append(optionElement); @@ -227,27 +241,27 @@ Object.defineProperty(exports, "__esModule", { value: true }); } lotOccupancyFieldsContainerElement.append(fieldElement); } - lotOccupancyFieldsContainerElement.insertAdjacentHTML("beforeend", ``); + lotOccupancyFieldsContainerElement.insertAdjacentHTML('beforeend', ``); }); }); } else { const originalOccupancyTypeId = occupancyTypeIdElement.value; - occupancyTypeIdElement.addEventListener("change", () => { + occupancyTypeIdElement.addEventListener('change', () => { if (occupancyTypeIdElement.value !== originalOccupancyTypeId) { bulmaJS.confirm({ - title: "Confirm Change", + title: 'Confirm Change', 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.`, - contextualColorName: "warning", + contextualColorName: 'warning', okButton: { - text: "Yes, Keep the Change", + text: 'Yes, Keep the Change', callbackFunction: () => { refreshAfterSave = true; } }, cancelButton: { - text: "Revert the Change", + text: 'Revert the Change', callbackFunction: () => { occupancyTypeIdElement.value = originalOccupancyTypeId; } @@ -257,16 +271,17 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); } // Lot Selector - const lotNameElement = document.querySelector("#lotOccupancy--lotName"); - lotNameElement.addEventListener("click", (clickEvent) => { + const lotNameElement = document.querySelector('#lotOccupancy--lotName'); + lotNameElement.addEventListener('click', (clickEvent) => { const currentLotName = clickEvent.currentTarget.value; let lotSelectCloseModalFunction; let lotSelectModalElement; let lotSelectFormElement; let lotSelectResultsElement; 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(); lotSelectCloseModalFunction(); }; @@ -276,64 +291,64 @@ Object.defineProperty(exports, "__esModule", { value: true }); renderSelectedLotAndClose(selectedLotElement.dataset.lotId, selectedLotElement.dataset.lotName); }; const searchLots = () => { - lotSelectResultsElement.innerHTML = los.getLoadingParagraphHTML("Searching..."); - cityssm.postJSON(los.urlPrefix + "/lots/doSearchLots", lotSelectFormElement, (responseJSON) => { + lotSelectResultsElement.innerHTML = + los.getLoadingParagraphHTML('Searching...'); + cityssm.postJSON(los.urlPrefix + '/lots/doSearchLots', lotSelectFormElement, (responseJSON) => { if (responseJSON.count === 0) { lotSelectResultsElement.innerHTML = `

No results.

`; return; } - const panelElement = document.createElement("div"); - panelElement.className = "panel"; + const panelElement = document.createElement('div'); + panelElement.className = 'panel'; for (const lot of responseJSON.lots) { - const panelBlockElement = document.createElement("a"); - panelBlockElement.className = "panel-block is-block"; - panelBlockElement.href = "#"; + const panelBlockElement = document.createElement('a'); + panelBlockElement.className = 'panel-block is-block'; + panelBlockElement.href = '#'; panelBlockElement.dataset.lotId = lot.lotId.toString(); panelBlockElement.dataset.lotName = lot.lotName; panelBlockElement.innerHTML = '
' + ('
' + - cityssm.escapeHTML(lot.lotName || "") + - "
" + + cityssm.escapeHTML(lot.lotName || '') + + '
' + '' + - cityssm.escapeHTML(lot.mapName || "") + - "" + - "
") + + cityssm.escapeHTML(lot.mapName || '') + + '' + + '
') + ('
' + cityssm.escapeHTML(lot.lotStatus) + - "
" + + '
' + '' + - (lot.lotOccupancyCount > 0 ? "Currently Occupied" : "") + - "" + - "
") + - ""; - panelBlockElement.addEventListener("click", selectExistingLot); + (lot.lotOccupancyCount > 0 ? 'Currently Occupied' : '') + + '' + + '') + + ''; + panelBlockElement.addEventListener('click', selectExistingLot); panelElement.append(panelBlockElement); } - lotSelectResultsElement.innerHTML = ""; + lotSelectResultsElement.innerHTML = ''; lotSelectResultsElement.append(panelElement); }); }; const createLotAndSelect = (submitEvent) => { submitEvent.preventDefault(); - const lotName = lotSelectModalElement.querySelector("#lotCreate--lotName") - .value; - cityssm.postJSON(los.urlPrefix + "/lots/doCreateLot", submitEvent.currentTarget, (responseJSON) => { + const lotName = lotSelectModalElement.querySelector('#lotCreate--lotName').value; + cityssm.postJSON(los.urlPrefix + '/lots/doCreateLot', submitEvent.currentTarget, (responseJSON) => { if (responseJSON.success) { renderSelectedLotAndClose(responseJSON.lotId, lotName); } else { bulmaJS.alert({ title: `Error Creating ${los.escapedAliases.Lot}`, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; - cityssm.openHtmlModal("lotOccupancy-selectLot", { + cityssm.openHtmlModal('lotOccupancy-selectLot', { onshow: (modalElement) => { los.populateAliases(modalElement); }, @@ -343,87 +358,94 @@ Object.defineProperty(exports, "__esModule", { value: true }); lotSelectCloseModalFunction = closeModalFunction; bulmaJS.init(modalElement); // search Tab - const lotNameFilterElement = modalElement.querySelector("#lotSelect--lotName"); - if (document.querySelector("#lotOccupancy--lotId").value !== "") { + const lotNameFilterElement = modalElement.querySelector('#lotSelect--lotName'); + if (document.querySelector('#lotOccupancy--lotId') + .value !== '') { lotNameFilterElement.value = currentLotName; } lotNameFilterElement.focus(); - lotNameFilterElement.addEventListener("change", searchLots); - const occupancyStatusFilterElement = modalElement.querySelector("#lotSelect--occupancyStatus"); - occupancyStatusFilterElement.addEventListener("change", searchLots); - if (currentLotName !== "") { - occupancyStatusFilterElement.value = ""; + lotNameFilterElement.addEventListener('change', searchLots); + const occupancyStatusFilterElement = modalElement.querySelector('#lotSelect--occupancyStatus'); + occupancyStatusFilterElement.addEventListener('change', searchLots); + if (currentLotName !== '') { + occupancyStatusFilterElement.value = ''; } - lotSelectFormElement = modalElement.querySelector("#form--lotSelect"); - lotSelectResultsElement = modalElement.querySelector("#resultsContainer--lotSelect"); - lotSelectFormElement.addEventListener("submit", (submitEvent) => { + lotSelectFormElement = modalElement.querySelector('#form--lotSelect'); + lotSelectResultsElement = modalElement.querySelector('#resultsContainer--lotSelect'); + lotSelectFormElement.addEventListener('submit', (submitEvent) => { submitEvent.preventDefault(); }); searchLots(); // Create Tab if (exports.lotNamePattern) { const regex = exports.lotNamePattern; - modalElement.querySelector("#lotCreate--lotName").pattern = - regex.source; + modalElement.querySelector('#lotCreate--lotName').pattern = regex.source; } - const lotTypeElement = modalElement.querySelector("#lotCreate--lotTypeId"); + const lotTypeElement = modalElement.querySelector('#lotCreate--lotTypeId'); for (const lotType of exports.lotTypes) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = lotType.lotTypeId.toString(); optionElement.textContent = lotType.lotType; lotTypeElement.append(optionElement); } - const lotStatusElement = modalElement.querySelector("#lotCreate--lotStatusId"); + const lotStatusElement = modalElement.querySelector('#lotCreate--lotStatusId'); for (const lotStatus of exports.lotStatuses) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = lotStatus.lotStatusId.toString(); optionElement.textContent = lotStatus.lotStatus; lotStatusElement.append(optionElement); } - const mapElement = modalElement.querySelector("#lotCreate--mapId"); + const mapElement = modalElement.querySelector('#lotCreate--mapId'); for (const map of exports.maps) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = map.mapId.toString(); - optionElement.textContent = map.mapName || "(No Name)"; + optionElement.textContent = map.mapName || '(No Name)'; mapElement.append(optionElement); } - modalElement.querySelector("#form--lotCreate").addEventListener("submit", createLotAndSelect); + ; + modalElement.querySelector('#form--lotCreate').addEventListener('submit', createLotAndSelect); }, onremoved: () => { bulmaJS.toggleHtmlClipped(); } }); }); - document.querySelector(".is-lot-view-button").addEventListener("click", () => { - const lotId = document.querySelector("#lotOccupancy--lotId").value; + document + .querySelector('.is-lot-view-button') + .addEventListener('click', () => { + const lotId = document.querySelector('#lotOccupancy--lotId').value; if (lotId) { - window.open(los.urlPrefix + "/lots/" + lotId); + window.open(los.urlPrefix + '/lots/' + lotId); } else { bulmaJS.alert({ 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) { bulmaJS.alert({ - message: "You need to unlock the field before clearing it.", - contextualColorName: "info" + message: 'You need to unlock the field before clearing it.', + contextualColorName: 'info' }); } else { lotNameElement.value = `(No ${los.escapedAliases.Lot})`; - document.querySelector("#lotOccupancy--lotId").value = ""; + document.querySelector('#lotOccupancy--lotId').value = ''; los.setUnsavedChanges(); } }); // Start Date los.initializeDatePickers(formElement); - document.querySelector("#lotOccupancy--occupancyStartDateString").addEventListener("change", () => { - const endDatePicker = document.querySelector("#lotOccupancy--occupancyEndDateString").bulmaCalendar.datePicker; - endDatePicker.min = document.querySelector("#lotOccupancy--occupancyStartDateString").value; + document + .querySelector('#lotOccupancy--occupancyStartDateString') + .addEventListener('change', () => { + const endDatePicker = document.querySelector('#lotOccupancy--occupancyEndDateString').bulmaCalendar.datePicker; + endDatePicker.min = document.querySelector('#lotOccupancy--occupancyStartDateString').value; endDatePicker.refresh(); }); los.initializeUnlockFieldButtons(formElement); @@ -435,7 +457,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true }); let lotOccupancyOccupants; 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) => { return currentLotOccupancyOccupant.lotOccupantIndex === lotOccupantIndex; }); @@ -443,7 +466,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); let editCloseModalFunction; const editOccupant = (submitEvent) => { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doUpdateLotOccupancyOccupant", editFormElement, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doUpdateLotOccupancyOccupant', editFormElement, (responseJSON) => { if (responseJSON.success) { lotOccupancyOccupants = responseJSON.lotOccupancyOccupants; editCloseModalFunction(); @@ -451,52 +474,55 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Updating " + exports.aliases.occupant, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Updating ' + exports.aliases.occupant, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; - cityssm.openHtmlModal("lotOccupancy-editOccupant", { + cityssm.openHtmlModal('lotOccupancy-editOccupant', { onshow: (modalElement) => { los.populateAliases(modalElement); - modalElement.querySelector("#lotOccupancyOccupantEdit--lotOccupancyId").value = lotOccupancyId; - modalElement.querySelector("#lotOccupancyOccupantEdit--lotOccupantIndex").value = lotOccupantIndex.toString(); - const lotOccupantTypeSelectElement = modalElement.querySelector("#lotOccupancyOccupantEdit--lotOccupantTypeId"); + modalElement.querySelector('#lotOccupancyOccupantEdit--lotOccupancyId').value = lotOccupancyId; + modalElement.querySelector('#lotOccupancyOccupantEdit--lotOccupantIndex').value = lotOccupantIndex.toString(); + const lotOccupantTypeSelectElement = modalElement.querySelector('#lotOccupancyOccupantEdit--lotOccupantTypeId'); let lotOccupantTypeSelected = false; for (const lotOccupantType of exports.lotOccupantTypes) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = lotOccupantType.lotOccupantTypeId.toString(); optionElement.textContent = lotOccupantType.lotOccupantType; - if (lotOccupantType.lotOccupantTypeId === lotOccupancyOccupant.lotOccupantTypeId) { + if (lotOccupantType.lotOccupantTypeId === + lotOccupancyOccupant.lotOccupantTypeId) { optionElement.selected = true; lotOccupantTypeSelected = true; } lotOccupantTypeSelectElement.append(optionElement); } if (!lotOccupantTypeSelected) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = lotOccupancyOccupant.lotOccupantTypeId.toString(); - optionElement.textContent = lotOccupancyOccupant.lotOccupantType; + optionElement.textContent = + lotOccupancyOccupant.lotOccupantType; optionElement.selected = true; lotOccupantTypeSelectElement.append(optionElement); } - modalElement.querySelector("#lotOccupancyOccupantEdit--occupantName").value = lotOccupancyOccupant.occupantName; - modalElement.querySelector("#lotOccupancyOccupantEdit--occupantAddress1").value = lotOccupancyOccupant.occupantAddress1; - modalElement.querySelector("#lotOccupancyOccupantEdit--occupantAddress2").value = lotOccupancyOccupant.occupantAddress2; - modalElement.querySelector("#lotOccupancyOccupantEdit--occupantCity").value = lotOccupancyOccupant.occupantCity; - modalElement.querySelector("#lotOccupancyOccupantEdit--occupantProvince").value = lotOccupancyOccupant.occupantProvince; - modalElement.querySelector("#lotOccupancyOccupantEdit--occupantPostalCode").value = lotOccupancyOccupant.occupantPostalCode; - modalElement.querySelector("#lotOccupancyOccupantEdit--occupantPhoneNumber").value = lotOccupancyOccupant.occupantPhoneNumber; - modalElement.querySelector("#lotOccupancyOccupantEdit--occupantEmailAddress").value = lotOccupancyOccupant.occupantEmailAddress; - modalElement.querySelector("#lotOccupancyOccupantEdit--occupantComment").value = lotOccupancyOccupant.occupantComment; + ; + modalElement.querySelector('#lotOccupancyOccupantEdit--occupantName').value = lotOccupancyOccupant.occupantName; + modalElement.querySelector('#lotOccupancyOccupantEdit--occupantAddress1').value = lotOccupancyOccupant.occupantAddress1; + modalElement.querySelector('#lotOccupancyOccupantEdit--occupantAddress2').value = lotOccupancyOccupant.occupantAddress2; + modalElement.querySelector('#lotOccupancyOccupantEdit--occupantCity').value = lotOccupancyOccupant.occupantCity; + modalElement.querySelector('#lotOccupancyOccupantEdit--occupantProvince').value = lotOccupancyOccupant.occupantProvince; + modalElement.querySelector('#lotOccupancyOccupantEdit--occupantPostalCode').value = lotOccupancyOccupant.occupantPostalCode; + modalElement.querySelector('#lotOccupancyOccupantEdit--occupantPhoneNumber').value = lotOccupancyOccupant.occupantPhoneNumber; + modalElement.querySelector('#lotOccupancyOccupantEdit--occupantEmailAddress').value = lotOccupancyOccupant.occupantEmailAddress; + modalElement.querySelector('#lotOccupancyOccupantEdit--occupantComment').value = lotOccupancyOccupant.occupantComment; }, onshown: (modalElement, closeModalFunction) => { bulmaJS.toggleHtmlClipped(); - modalElement.querySelector("#lotOccupancyOccupantEdit--lotOccupantTypeId").focus(); - editFormElement = modalElement.querySelector("form"); - editFormElement.addEventListener("submit", editOccupant); + modalElement.querySelector('#lotOccupancyOccupantEdit--lotOccupantTypeId').focus(); + editFormElement = modalElement.querySelector('form'); + editFormElement.addEventListener('submit', editOccupant); editCloseModalFunction = closeModalFunction; }, onremoved: () => { @@ -505,10 +531,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); }; const deleteLotOccupancyOccupant = (clickEvent) => { - const lotOccupantIndex = clickEvent.currentTarget.closest("tr").dataset - .lotOccupantIndex; + const lotOccupantIndex = clickEvent.currentTarget.closest('tr').dataset.lotOccupantIndex; const doDelete = () => { - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyOccupant", { + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyOccupant', { lotOccupancyId, lotOccupantIndex }, (responseJSON) => { @@ -518,128 +543,135 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Removing " + exports.aliases.occupant, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Removing ' + exports.aliases.occupant, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; bulmaJS.confirm({ - title: "Remove " + exports.aliases.occupant + "?", - message: "Are you sure you want to remove this " + exports.aliases.occupant.toLowerCase() + "?", + title: 'Remove ' + exports.aliases.occupant + '?', + message: 'Are you sure you want to remove this ' + + exports.aliases.occupant.toLowerCase() + + '?', okButton: { - text: "Yes, Remove " + exports.aliases.occupant, + text: 'Yes, Remove ' + exports.aliases.occupant, callbackFunction: doDelete }, - contextualColorName: "warning" + contextualColorName: 'warning' }); }; const renderLotOccupancyOccupants = () => { - const occupantsContainer = document.querySelector("#container--lotOccupancyOccupants"); + const occupantsContainer = document.querySelector('#container--lotOccupancyOccupants'); cityssm.clearElement(occupantsContainer); if (lotOccupancyOccupants.length === 0) { occupantsContainer.innerHTML = '
' + '

There are no ' + exports.aliases.occupants.toLowerCase() + - " associated with this record.

" + - "
"; + ' associated with this record.

' + + ''; return; } - const tableElement = document.createElement("table"); - tableElement.className = "table is-fullwidth is-striped is-hoverable"; + const tableElement = document.createElement('table'); + tableElement.className = 'table is-fullwidth is-striped is-hoverable'; tableElement.innerHTML = - "" + - ("" + exports.aliases.occupant + "") + - "Address" + - "Other Contact" + - "Comment" + + '' + + ('' + exports.aliases.occupant + '') + + 'Address' + + 'Other Contact' + + 'Comment' + 'Options' + - "" + - ""; + '' + + ''; for (const lotOccupancyOccupant of lotOccupancyOccupants) { - const tableRowElement = document.createElement("tr"); + const tableRowElement = document.createElement('tr'); tableRowElement.dataset.lotOccupantIndex = lotOccupancyOccupant.lotOccupantIndex.toString(); tableRowElement.innerHTML = - "" + - cityssm.escapeHTML(lotOccupancyOccupant.occupantName || "(No Name)") + - "
" + + '' + + cityssm.escapeHTML(lotOccupancyOccupant.occupantName || '(No Name)') + + '
' + ('' + '' + ' ' + cityssm.escapeHTML(lotOccupancyOccupant.lotOccupantType) + - "" + - "") + - "" + - ("" + + '' + + '') + + '' + + ('' + (lotOccupancyOccupant.occupantAddress1 - ? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress1) + "
" - : "") + + ? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress1) + '
' + : '') + (lotOccupancyOccupant.occupantAddress2 - ? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress2) + "
" - : "") + + ? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress2) + '
' + : '') + (lotOccupancyOccupant.occupantCity - ? cityssm.escapeHTML(lotOccupancyOccupant.occupantCity) + ", " - : "") + - cityssm.escapeHTML(lotOccupancyOccupant.occupantProvince || "") + - "
" + - cityssm.escapeHTML(lotOccupancyOccupant.occupantPostalCode || "") + - "") + - ("" + + ? cityssm.escapeHTML(lotOccupancyOccupant.occupantCity) + ', ' + : '') + + cityssm.escapeHTML(lotOccupancyOccupant.occupantProvince || '') + + '
' + + cityssm.escapeHTML(lotOccupancyOccupant.occupantPostalCode || '') + + '') + + ('' + (lotOccupancyOccupant.occupantPhoneNumber - ? cityssm.escapeHTML(lotOccupancyOccupant.occupantPhoneNumber) + "
" - : "") + + ? cityssm.escapeHTML(lotOccupancyOccupant.occupantPhoneNumber) + + '
' + : '') + (lotOccupancyOccupant.occupantEmailAddress ? cityssm.escapeHTML(lotOccupancyOccupant.occupantEmailAddress) - : "") + - "") + - ("" + cityssm.escapeHTML(lotOccupancyOccupant.occupantComment) + "") + + : '') + + '') + + ('' + + cityssm.escapeHTML(lotOccupancyOccupant.occupantComment) + + '') + ('' + '
' + ('") + + ' Edit' + + '') + ('") + - "
" + - ""); + '') + + '' + + ''); tableRowElement - .querySelector(".button--edit") - .addEventListener("click", openEditLotOccupancyOccupant); + .querySelector('.button--edit') + .addEventListener('click', openEditLotOccupancyOccupant); tableRowElement - .querySelector(".button--delete") - .addEventListener("click", deleteLotOccupancyOccupant); - tableElement.querySelector("tbody").append(tableRowElement); + .querySelector('.button--delete') + .addEventListener('click', deleteLotOccupancyOccupant); + tableElement.querySelector('tbody').append(tableRowElement); } occupantsContainer.append(tableElement); }; if (isCreate) { - const lotOccupantTypeIdElement = document.querySelector("#lotOccupancy--lotOccupantTypeId"); - lotOccupantTypeIdElement.addEventListener("change", () => { + const lotOccupantTypeIdElement = document.querySelector('#lotOccupancy--lotOccupantTypeId'); + lotOccupantTypeIdElement.addEventListener('change', () => { const occupantFields = formElement.querySelectorAll("[data-table='LotOccupancyOccupant']"); for (const occupantField of occupantFields) { - occupantField.disabled = lotOccupantTypeIdElement.value === ""; + occupantField.disabled = lotOccupantTypeIdElement.value === ''; } }); } else { lotOccupancyOccupants = exports.lotOccupancyOccupants; delete exports.lotOccupancyOccupants; - document.querySelector("#button--addOccupant").addEventListener("click", () => { + document + .querySelector('#button--addOccupant') + .addEventListener('click', () => { let addCloseModalFunction; let addFormElement; let searchFormElement; let searchResultsElement; const addOccupant = (formOrObject) => { - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doAddLotOccupancyOccupant", formOrObject, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doAddLotOccupancyOccupant', formOrObject, (responseJSON) => { if (responseJSON.success) { lotOccupancyOccupants = responseJSON.lotOccupancyOccupants; addCloseModalFunction(); @@ -647,9 +679,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Adding " + exports.aliases.occupant, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Adding ' + exports.aliases.occupant, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); @@ -664,15 +696,15 @@ Object.defineProperty(exports, "__esModule", { value: true }); const panelBlockElement = clickEvent.currentTarget; const occupant = pastOccupantSearchResults[Number.parseInt(panelBlockElement.dataset.index, 10)]; const lotOccupantTypeId = panelBlockElement - .closest(".modal") - .querySelector("#lotOccupancyOccupantCopy--lotOccupantTypeId").value; - if (lotOccupantTypeId === "") { + .closest('.modal') + .querySelector('#lotOccupancyOccupantCopy--lotOccupantTypeId').value; + if (lotOccupantTypeId === '') { bulmaJS.alert({ - title: "No " + exports.aliases.occupant + " Type Selected", - message: "Select a type to apply to the newly added " + + title: 'No ' + exports.aliases.occupant + ' Type Selected', + message: 'Select a type to apply to the newly added ' + exports.aliases.occupant.toLowerCase() + - ".", - contextualColorName: "warning" + '.', + contextualColorName: 'warning' }); } else { @@ -683,83 +715,86 @@ Object.defineProperty(exports, "__esModule", { value: true }); }; const searchOccupants = (event) => { event.preventDefault(); - if (searchFormElement.querySelector("#lotOccupancyOccupantCopy--searchFilter").value === "") { + if (searchFormElement.querySelector('#lotOccupancyOccupantCopy--searchFilter').value === '') { searchResultsElement.innerHTML = '
' + '

Enter a partial name or address in the search field above.

' + - "
"; + ''; return; } - searchResultsElement.innerHTML = los.getLoadingParagraphHTML("Searching..."); - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doSearchPastOccupants", searchFormElement, (responseJSON) => { + searchResultsElement.innerHTML = + los.getLoadingParagraphHTML('Searching...'); + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doSearchPastOccupants', searchFormElement, (responseJSON) => { pastOccupantSearchResults = responseJSON.occupants; - const panelElement = document.createElement("div"); - panelElement.className = "panel"; + const panelElement = document.createElement('div'); + panelElement.className = 'panel'; for (const [index, occupant] of pastOccupantSearchResults.entries()) { - const panelBlockElement = document.createElement("a"); - panelBlockElement.className = "panel-block is-block"; + const panelBlockElement = document.createElement('a'); + panelBlockElement.className = 'panel-block is-block'; panelBlockElement.dataset.index = index.toString(); panelBlockElement.innerHTML = - "" + - cityssm.escapeHTML(occupant.occupantName || "") + - "" + - "
" + + '' + + cityssm.escapeHTML(occupant.occupantName || '') + + '' + + '
' + '
' + ('
' + - cityssm.escapeHTML(occupant.occupantAddress1 || "") + - "
" + + cityssm.escapeHTML(occupant.occupantAddress1 || '') + + '
' + (occupant.occupantAddress2 - ? cityssm.escapeHTML(occupant.occupantAddress2) + "
" - : "") + - cityssm.escapeHTML(occupant.occupantCity || "") + - ", " + - cityssm.escapeHTML(occupant.occupantProvince || "") + - "
" + - cityssm.escapeHTML(occupant.occupantPostalCode || "") + - "
") + + ? cityssm.escapeHTML(occupant.occupantAddress2) + '
' + : '') + + cityssm.escapeHTML(occupant.occupantCity || '') + + ', ' + + cityssm.escapeHTML(occupant.occupantProvince || '') + + '
' + + cityssm.escapeHTML(occupant.occupantPostalCode || '') + + '
') + ('
' + (occupant.occupantPhoneNumber - ? cityssm.escapeHTML(occupant.occupantPhoneNumber) + "
" - : "") + - cityssm.escapeHTML(occupant.occupantEmailAddress || "") + - "
" + - "
") + - ""; - panelBlockElement.addEventListener("click", addOccupantFromCopy); + ? cityssm.escapeHTML(occupant.occupantPhoneNumber) + + '
' + : '') + + cityssm.escapeHTML(occupant.occupantEmailAddress || '') + + '
' + + '') + + ''; + panelBlockElement.addEventListener('click', addOccupantFromCopy); panelElement.append(panelBlockElement); } - searchResultsElement.innerHTML = ""; + searchResultsElement.innerHTML = ''; searchResultsElement.append(panelElement); }); }; - cityssm.openHtmlModal("lotOccupancy-addOccupant", { + cityssm.openHtmlModal('lotOccupancy-addOccupant', { onshow: (modalElement) => { los.populateAliases(modalElement); - modalElement.querySelector("#lotOccupancyOccupantAdd--lotOccupancyId").value = lotOccupancyId; - const lotOccupantTypeSelectElement = modalElement.querySelector("#lotOccupancyOccupantAdd--lotOccupantTypeId"); - const lotOccupantTypeCopySelectElement = modalElement.querySelector("#lotOccupancyOccupantCopy--lotOccupantTypeId"); + modalElement.querySelector('#lotOccupancyOccupantAdd--lotOccupancyId').value = lotOccupancyId; + const lotOccupantTypeSelectElement = modalElement.querySelector('#lotOccupancyOccupantAdd--lotOccupantTypeId'); + const lotOccupantTypeCopySelectElement = modalElement.querySelector('#lotOccupancyOccupantCopy--lotOccupantTypeId'); for (const lotOccupantType of exports.lotOccupantTypes) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = lotOccupantType.lotOccupantTypeId.toString(); optionElement.textContent = lotOccupantType.lotOccupantType; lotOccupantTypeSelectElement.append(optionElement); 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) => { bulmaJS.toggleHtmlClipped(); bulmaJS.init(modalElement); - modalElement.querySelector("#lotOccupancyOccupantAdd--lotOccupantTypeId").focus(); - addFormElement = modalElement.querySelector("#form--lotOccupancyOccupantAdd"); - addFormElement.addEventListener("submit", addOccupantFromForm); - searchResultsElement = modalElement.querySelector("#lotOccupancyOccupantCopy--searchResults"); - searchFormElement = modalElement.querySelector("#form--lotOccupancyOccupantCopy"); - searchFormElement.addEventListener("submit", (formEvent) => { + modalElement.querySelector('#lotOccupancyOccupantAdd--lotOccupantTypeId').focus(); + addFormElement = modalElement.querySelector('#form--lotOccupancyOccupantAdd'); + addFormElement.addEventListener('submit', addOccupantFromForm); + searchResultsElement = modalElement.querySelector('#lotOccupancyOccupantCopy--searchResults'); + searchFormElement = modalElement.querySelector('#form--lotOccupancyOccupantCopy'); + searchFormElement.addEventListener('submit', (formEvent) => { formEvent.preventDefault(); }); - modalElement.querySelector("#lotOccupancyOccupantCopy--searchFilter").addEventListener("change", searchOccupants); + modalElement.querySelector('#lotOccupancyOccupantCopy--searchFilter').addEventListener('change', searchOccupants); addCloseModalFunction = closeModalFunction; }, onremoved: () => { @@ -777,15 +812,17 @@ Object.defineProperty(exports, "__esModule", { value: true }); let lotOccupancyComments = exports.lotOccupancyComments; delete exports.lotOccupancyComments; 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) => { - return currentLotOccupancyComment.lotOccupancyCommentId === lotOccupancyCommentId; + return (currentLotOccupancyComment.lotOccupancyCommentId === + lotOccupancyCommentId); }); let editFormElement; let editCloseModalFunction; const editComment = (submitEvent) => { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doUpdateLotOccupancyComment", editFormElement, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doUpdateLotOccupancyComment', editFormElement, (responseJSON) => { if (responseJSON.success) { lotOccupancyComments = responseJSON.lotOccupancyComments; editCloseModalFunction(); @@ -793,20 +830,20 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Updating Comment", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Updating Comment', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; - cityssm.openHtmlModal("lotOccupancy-editComment", { + cityssm.openHtmlModal('lotOccupancy-editComment', { onshow: (modalElement) => { los.populateAliases(modalElement); - modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyId").value = lotOccupancyId; - modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentId").value = lotOccupancyCommentId.toString(); - modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyComment").value = lotOccupancyComment.lotOccupancyComment; - const lotOccupancyCommentDateStringElement = modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentDateString"); + modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyId').value = lotOccupancyId; + modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyCommentId').value = lotOccupancyCommentId.toString(); + modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyComment').value = lotOccupancyComment.lotOccupancyComment; + const lotOccupancyCommentDateStringElement = modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyCommentDateString'); lotOccupancyCommentDateStringElement.value = lotOccupancyComment.lotOccupancyCommentDateString; const currentDateString = cityssm.dateToString(new Date()); @@ -814,15 +851,14 @@ Object.defineProperty(exports, "__esModule", { value: true }); lotOccupancyComment.lotOccupancyCommentDateString <= currentDateString ? currentDateString : lotOccupancyComment.lotOccupancyCommentDateString; - modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentTimeString").value = lotOccupancyComment.lotOccupancyCommentTimeString; + modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyCommentTimeString').value = lotOccupancyComment.lotOccupancyCommentTimeString; }, onshown: (modalElement, closeModalFunction) => { bulmaJS.toggleHtmlClipped(); los.initializeDatePickers(modalElement); - // los.initializeTimePickers(modalElement); - modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyComment").focus(); - editFormElement = modalElement.querySelector("form"); - editFormElement.addEventListener("submit", editComment); + modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyComment').focus(); + editFormElement = modalElement.querySelector('form'); + editFormElement.addEventListener('submit', editComment); editCloseModalFunction = closeModalFunction; }, onremoved: () => { @@ -831,9 +867,10 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); }; 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 = () => { - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyComment", { + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyComment', { lotOccupancyId, lotOccupancyCommentId }, (responseJSON) => { @@ -843,87 +880,87 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Removing Comment", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Removing Comment', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; bulmaJS.confirm({ - title: "Remove Comment?", - message: "Are you sure you want to remove this comment?", + title: 'Remove Comment?', + message: 'Are you sure you want to remove this comment?', okButton: { - text: "Yes, Remove Comment", + text: 'Yes, Remove Comment', callbackFunction: doDelete }, - contextualColorName: "warning" + contextualColorName: 'warning' }); }; const renderLotOccupancyComments = () => { - const containerElement = document.querySelector("#container--lotOccupancyComments"); + const containerElement = document.querySelector('#container--lotOccupancyComments'); if (lotOccupancyComments.length === 0) { containerElement.innerHTML = '
' + '

There are no comments associated with this record.

' + - "
"; + ''; return; } - const tableElement = document.createElement("table"); - tableElement.className = "table is-fullwidth is-striped is-hoverable"; + const tableElement = document.createElement('table'); + tableElement.className = 'table is-fullwidth is-striped is-hoverable'; tableElement.innerHTML = - "" + - "Commentor" + - "Comment Date" + - "Comment" + + '' + + 'Commentor' + + 'Comment Date' + + 'Comment' + 'Options' + - "" + - ""; + '' + + ''; for (const lotOccupancyComment of lotOccupancyComments) { - const tableRowElement = document.createElement("tr"); + const tableRowElement = document.createElement('tr'); tableRowElement.dataset.lotOccupancyCommentId = lotOccupancyComment.lotOccupancyCommentId.toString(); tableRowElement.innerHTML = - "" + - cityssm.escapeHTML(lotOccupancyComment.recordCreate_userName || "") + - "" + - "" + + '' + + cityssm.escapeHTML(lotOccupancyComment.recordCreate_userName || '') + + '' + + '' + lotOccupancyComment.lotOccupancyCommentDateString + (lotOccupancyComment.lotOccupancyCommentTime === 0 - ? "" - : " " + lotOccupancyComment.lotOccupancyCommentTimeString) + - "" + - "" + - cityssm.escapeHTML(lotOccupancyComment.lotOccupancyComment || "") + - "" + + ? '' + : ' ' + lotOccupancyComment.lotOccupancyCommentTimeString) + + '' + + '' + + cityssm.escapeHTML(lotOccupancyComment.lotOccupancyComment || '') + + '' + ('' + '
' + ('") + + ' Edit' + + '') + ('") + - "
" + - ""); + '') + + '' + + ''); tableRowElement - .querySelector(".button--edit") - .addEventListener("click", openEditLotOccupancyComment); + .querySelector('.button--edit') + .addEventListener('click', openEditLotOccupancyComment); tableRowElement - .querySelector(".button--delete") - .addEventListener("click", deleteLotOccupancyComment); - tableElement.querySelector("tbody").append(tableRowElement); + .querySelector('.button--delete') + .addEventListener('click', deleteLotOccupancyComment); + tableElement.querySelector('tbody').append(tableRowElement); } - containerElement.innerHTML = ""; + containerElement.innerHTML = ''; containerElement.append(tableElement); }; - document.querySelector("#button--addComment").addEventListener("click", () => { + document.querySelector('#button--addComment').addEventListener('click', () => { let addFormElement; let addCloseModalFunction; const addComment = (submitEvent) => { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doAddLotOccupancyComment", addFormElement, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doAddLotOccupancyComment', addFormElement, (responseJSON) => { if (responseJSON.success) { lotOccupancyComments = responseJSON.lotOccupancyComments; addCloseModalFunction(); @@ -931,23 +968,23 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Adding Comment", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Adding Comment', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; - cityssm.openHtmlModal("lotOccupancy-addComment", { + cityssm.openHtmlModal('lotOccupancy-addComment', { onshow: (modalElement) => { los.populateAliases(modalElement); - modalElement.querySelector("#lotOccupancyCommentAdd--lotOccupancyId").value = lotOccupancyId; + modalElement.querySelector('#lotOccupancyCommentAdd--lotOccupancyId').value = lotOccupancyId; }, onshown: (modalElement, closeModalFunction) => { bulmaJS.toggleHtmlClipped(); - modalElement.querySelector("#lotOccupancyCommentAdd--lotOccupancyComment").focus(); - addFormElement = modalElement.querySelector("form"); - addFormElement.addEventListener("submit", addComment); + modalElement.querySelector('#lotOccupancyCommentAdd--lotOccupancyComment').focus(); + addFormElement = modalElement.querySelector('form'); + addFormElement.addEventListener('submit', addComment); addCloseModalFunction = closeModalFunction; }, onremoved: () => { @@ -962,19 +999,20 @@ Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true }); let lotOccupancyFees = exports.lotOccupancyFees; delete exports.lotOccupancyFees; - const lotOccupancyFeesContainerElement = document.querySelector("#container--lotOccupancyFees"); + const lotOccupancyFeesContainerElement = document.querySelector('#container--lotOccupancyFees'); const getFeeGrandTotal = () => { let feeGrandTotal = 0; for (const lotOccupancyFee of lotOccupancyFees) { feeGrandTotal += - (lotOccupancyFee.feeAmount + lotOccupancyFee.taxAmount) * lotOccupancyFee.quantity; + (lotOccupancyFee.feeAmount + lotOccupancyFee.taxAmount) * + lotOccupancyFee.quantity; } return feeGrandTotal; }; const deleteLotOccupancyFee = (clickEvent) => { - const feeId = clickEvent.currentTarget.closest(".container--lotOccupancyFee").dataset.feeId; + const feeId = clickEvent.currentTarget.closest('.container--lotOccupancyFee').dataset.feeId; const doDelete = () => { - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyFee", { + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyFee', { lotOccupancyId, feeId }, (responseJSON) => { @@ -984,19 +1022,19 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Deleting Fee", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Deleting Fee', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; bulmaJS.confirm({ - title: "Delete Fee", - message: "Are you sure you want to delete this fee?", - contextualColorName: "warning", + title: 'Delete Fee', + message: 'Are you sure you want to delete this fee?', + contextualColorName: 'warning', okButton: { - text: "Yes, Delete Fee", + text: 'Yes, Delete Fee', callbackFunction: doDelete } }); @@ -1006,74 +1044,81 @@ Object.defineProperty(exports, "__esModule", { value: true }); lotOccupancyFeesContainerElement.innerHTML = '
' + '

There are no fees associated with this record.

' + - "
"; + ''; renderLotOccupancyTransactions(); return; } lotOccupancyFeesContainerElement.innerHTML = '' + - ("" + - "" + + ('' + + '' + '' + '' + '' + '' + '' + '' + - "") + - "" + - ("" + + '') + + '' + + ('' + '' + '' + '' + - "") + - "
Fee
FeeUnit Cost×QuantityequalsTotalOptions
Subtotal
Tax
Grand Total
"; + '') + + ''; let feeAmountTotal = 0; let taxAmountTotal = 0; for (const lotOccupancyFee of lotOccupancyFees) { - const tableRowElement = document.createElement("tr"); - tableRowElement.className = "container--lotOccupancyFee"; + const tableRowElement = document.createElement('tr'); + tableRowElement.className = 'container--lotOccupancyFee'; tableRowElement.dataset.feeId = lotOccupancyFee.feeId.toString(); - tableRowElement.dataset.includeQuantity = lotOccupancyFee.includeQuantity ? "1" : "0"; + tableRowElement.dataset.includeQuantity = lotOccupancyFee.includeQuantity + ? '1' + : '0'; tableRowElement.innerHTML = '' + - cityssm.escapeHTML(lotOccupancyFee.feeName || "") + - "" + + cityssm.escapeHTML(lotOccupancyFee.feeName || '') + + '' + (lotOccupancyFee.quantity === 1 - ? "" + ? '' : '$' + lotOccupancyFee.feeAmount.toFixed(2) + - "" + - "×" + + '' + + '×' + '' + lotOccupancyFee.quantity + - "" + - "=") + + '' + + '=') + '$' + (lotOccupancyFee.feeAmount * lotOccupancyFee.quantity).toFixed(2) + - "" + + '' + ('' + '" + - ""); - tableRowElement.querySelector("button").addEventListener("click", deleteLotOccupancyFee); - lotOccupancyFeesContainerElement.querySelector("tbody").append(tableRowElement); + '' + + ''); + tableRowElement + .querySelector('button') + .addEventListener('click', deleteLotOccupancyFee); + lotOccupancyFeesContainerElement + .querySelector('tbody') + .append(tableRowElement); feeAmountTotal += lotOccupancyFee.feeAmount * 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--grandTotal").textContent = "$" + (feeAmountTotal + taxAmountTotal).toFixed(2); + ; + lotOccupancyFeesContainerElement.querySelector('#lotOccupancyFees--feeAmountTotal').textContent = '$' + feeAmountTotal.toFixed(2); + lotOccupancyFeesContainerElement.querySelector('#lotOccupancyFees--taxAmountTotal').textContent = '$' + taxAmountTotal.toFixed(2); + lotOccupancyFeesContainerElement.querySelector('#lotOccupancyFees--grandTotal').textContent = '$' + (feeAmountTotal + taxAmountTotal).toFixed(2); renderLotOccupancyTransactions(); }; - document.querySelector("#button--addFee").addEventListener("click", () => { + document.querySelector('#button--addFee').addEventListener('click', () => { if (hasUnsavedChanges) { bulmaJS.alert({ - message: "Please save all unsaved changes before adding fees.", - contextualColorName: "warning" + message: 'Please save all unsaved changes before adding fees.', + contextualColorName: 'warning' }); return; } @@ -1081,7 +1126,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); let feeFilterElement; let feeFilterResultsElement; const doAddFee = (feeId, quantity = 1) => { - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doAddLotOccupancyFee", { + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doAddLotOccupancyFee', { lotOccupancyId, feeId, quantity @@ -1093,9 +1138,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Adding Fee", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Adding Fee', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); @@ -1108,21 +1153,24 @@ Object.defineProperty(exports, "__esModule", { value: true }); doAddFee(fee.feeId, quantityElement.value); quantityCloseModalFunction(); }; - cityssm.openHtmlModal("lotOccupancy-setFeeQuantity", { + cityssm.openHtmlModal('lotOccupancy-setFeeQuantity', { onshow: (modalElement) => { - modalElement.querySelector("#lotOccupancyFeeQuantity--quantityUnit").textContent = fee.quantityUnit; + ; + modalElement.querySelector('#lotOccupancyFeeQuantity--quantityUnit').textContent = fee.quantityUnit; }, onshown: (modalElement, closeModalFunction) => { quantityCloseModalFunction = closeModalFunction; - quantityElement = modalElement.querySelector("#lotOccupancyFeeQuantity--quantity"); - modalElement.querySelector("form").addEventListener("submit", doSetQuantity); + quantityElement = modalElement.querySelector('#lotOccupancyFeeQuantity--quantity'); + modalElement + .querySelector('form') + .addEventListener('submit', doSetQuantity); } }); }; const tryAddFee = (clickEvent) => { clickEvent.preventDefault(); 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) => { return currentFeeCategory.feeCategoryId === feeCategoryId; }); @@ -1137,16 +1185,20 @@ Object.defineProperty(exports, "__esModule", { value: true }); } }; const filterFees = () => { - const filterStringPieces = feeFilterElement.value.trim().toLowerCase().split(" "); - feeFilterResultsElement.innerHTML = ""; + const filterStringPieces = feeFilterElement.value + .trim() + .toLowerCase() + .split(' '); + feeFilterResultsElement.innerHTML = ''; for (const feeCategory of feeCategories) { - const categoryContainerElement = document.createElement("div"); - categoryContainerElement.className = "container--feeCategory"; - categoryContainerElement.dataset.feeCategoryId = feeCategory.feeCategoryId.toString(); + const categoryContainerElement = document.createElement('div'); + categoryContainerElement.className = 'container--feeCategory'; + categoryContainerElement.dataset.feeCategoryId = + feeCategory.feeCategoryId.toString(); categoryContainerElement.innerHTML = '

' + - cityssm.escapeHTML(feeCategory.feeCategory || "") + - "

" + + cityssm.escapeHTML(feeCategory.feeCategory || '') + + '' + '
'; let hasFees = false; for (const fee of feeCategory.fees) { @@ -1166,35 +1218,37 @@ Object.defineProperty(exports, "__esModule", { value: true }); continue; } hasFees = true; - const panelBlockElement = document.createElement("a"); - panelBlockElement.className = "panel-block is-block container--fee"; + const panelBlockElement = document.createElement('a'); + panelBlockElement.className = 'panel-block is-block container--fee'; panelBlockElement.dataset.feeId = fee.feeId.toString(); - panelBlockElement.href = "#"; + panelBlockElement.href = '#'; panelBlockElement.innerHTML = - "" + - cityssm.escapeHTML(fee.feeName || "") + - "
" + - "" + - cityssm.escapeHTML(fee.feeDescription || "").replace(/\n/g, "
") + - "
"; - panelBlockElement.addEventListener("click", tryAddFee); - categoryContainerElement.querySelector(".panel").append(panelBlockElement); + '' + + cityssm.escapeHTML(fee.feeName || '') + + '
' + + '' + + cityssm + .escapeHTML(fee.feeDescription || '') + .replace(/\n/g, '
') + + '
'; + panelBlockElement.addEventListener('click', tryAddFee); + categoryContainerElement.querySelector('.panel').append(panelBlockElement); } if (hasFees) { feeFilterResultsElement.append(categoryContainerElement); } } }; - cityssm.openHtmlModal("lotOccupancy-addFee", { + cityssm.openHtmlModal('lotOccupancy-addFee', { onshow: (modalElement) => { - feeFilterElement = modalElement.querySelector("#feeSelect--feeName"); - feeFilterResultsElement = modalElement.querySelector("#resultsContainer--feeSelect"); - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doGetFees", { + feeFilterElement = modalElement.querySelector('#feeSelect--feeName'); + feeFilterResultsElement = modalElement.querySelector('#resultsContainer--feeSelect'); + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doGetFees', { lotOccupancyId }, (responseJSON) => { feeCategories = responseJSON.feeCategories; feeFilterElement.disabled = false; - feeFilterElement.addEventListener("keyup", filterFees); + feeFilterElement.addEventListener('keyup', filterFees); feeFilterElement.focus(); filterFees(); }); @@ -1212,7 +1266,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); let lotOccupancyTransactions = exports.lotOccupancyTransactions; delete exports.lotOccupancyTransactions; - const lotOccupancyTransactionsContainerElement = document.querySelector("#container--lotOccupancyTransactions"); + const lotOccupancyTransactionsContainerElement = document.querySelector('#container--lotOccupancyTransactions'); const getTransactionGrandTotal = () => { let transactionGrandTotal = 0; for (const lotOccupancyTransaction of lotOccupancyTransactions) { @@ -1221,9 +1275,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); return transactionGrandTotal; }; const deleteLotOccupancyTransaction = (clickEvent) => { - const transactionIndex = clickEvent.currentTarget.closest(".container--lotOccupancyTransaction").dataset.transactionIndex; + const transactionIndex = clickEvent.currentTarget.closest('.container--lotOccupancyTransaction').dataset.transactionIndex; const doDelete = () => { - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyTransaction", { + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyTransaction', { lotOccupancyId, transactionIndex }, (responseJSON) => { @@ -1233,19 +1287,19 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Deleting Transaction", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Deleting Transaction', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; bulmaJS.confirm({ - title: "Delete Trasnaction", - message: "Are you sure you want to delete this transaction?", - contextualColorName: "warning", + title: 'Delete Trasnaction', + message: 'Are you sure you want to delete this transaction?', + contextualColorName: 'warning', okButton: { - text: "Yes, Delete Transaction", + text: 'Yes, Delete Transaction', callbackFunction: doDelete } }); @@ -1254,80 +1308,85 @@ Object.defineProperty(exports, "__esModule", { value: true }); if (lotOccupancyTransactions.length === 0) { lotOccupancyTransactionsContainerElement.innerHTML = '
' + '

There are no transactions associated with this record.

' + - "
"; + ''; return; } lotOccupancyTransactionsContainerElement.innerHTML = '' + - "" + + '' + '' + - "" + + '' + '' + '' + - "" + - "" + - ("" + + '' + + '' + + ('' + '' + '' + '' + - "") + - "
Date" + + '' + cityssm.escapeHTML(exports.aliases.externalReceiptNumber) + - "AmountOptions
Transaction Total
"; + '') + + ''; let transactionGrandTotal = 0; for (const lotOccupancyTransaction of lotOccupancyTransactions) { transactionGrandTotal += lotOccupancyTransaction.transactionAmount; - const tableRowElement = document.createElement("tr"); - tableRowElement.className = "container--lotOccupancyTransaction"; + const tableRowElement = document.createElement('tr'); + tableRowElement.className = 'container--lotOccupancyTransaction'; tableRowElement.dataset.transactionIndex = lotOccupancyTransaction.transactionIndex.toString(); tableRowElement.innerHTML = - "" + + '' + lotOccupancyTransaction.transactionDateString + - "" + - ("" + - cityssm.escapeHTML(lotOccupancyTransaction.externalReceiptNumber || "") + - "
" + - "" + - cityssm.escapeHTML(lotOccupancyTransaction.transactionNote || "") + - "" + - "") + + '' + + ('' + + cityssm.escapeHTML(lotOccupancyTransaction.externalReceiptNumber || '') + + '
' + + '' + + cityssm.escapeHTML(lotOccupancyTransaction.transactionNote || '') + + '' + + '') + ('$' + lotOccupancyTransaction.transactionAmount.toFixed(2) + - "") + + '') + ('' + '" + - ""); + '' + + ''); tableRowElement - .querySelector("button") - .addEventListener("click", deleteLotOccupancyTransaction); - lotOccupancyTransactionsContainerElement.querySelector("tbody").append(tableRowElement); + .querySelector('button') + .addEventListener('click', deleteLotOccupancyTransaction); + lotOccupancyTransactionsContainerElement + .querySelector('tbody') + .append(tableRowElement); } - lotOccupancyTransactionsContainerElement.querySelector("#lotOccupancyTransactions--grandTotal").textContent = "$" + transactionGrandTotal.toFixed(2); + ; + lotOccupancyTransactionsContainerElement.querySelector('#lotOccupancyTransactions--grandTotal').textContent = '$' + transactionGrandTotal.toFixed(2); const feeGrandTotal = getFeeGrandTotal(); if (feeGrandTotal > transactionGrandTotal) { - lotOccupancyTransactionsContainerElement.insertAdjacentHTML("afterbegin", '
' + + lotOccupancyTransactionsContainerElement.insertAdjacentHTML('afterbegin', '
' + '
' + '
' + '
Outstanding Balance
' + '
$' + (feeGrandTotal - transactionGrandTotal).toFixed(2) + - "
" + - "
" + - "
" + - "
"); + '
' + + '' + + '' + + ''); } }; - document.querySelector("#button--addTransaction").addEventListener("click", () => { + document + .querySelector('#button--addTransaction') + .addEventListener('click', () => { let addCloseModalFunction; const doAddTransaction = (submitEvent) => { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doAddLotOccupancyTransaction", submitEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doAddLotOccupancyTransaction', submitEvent.currentTarget, (responseJSON) => { if (responseJSON.success) { lotOccupancyTransactions = responseJSON.lotOccupancyTransactions; addCloseModalFunction(); @@ -1335,20 +1394,20 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.confirm({ - title: "Error Adding Transaction", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Adding Transaction', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; - cityssm.openHtmlModal("lotOccupancy-addTransaction", { + cityssm.openHtmlModal('lotOccupancy-addTransaction', { onshow: (modalElement) => { los.populateAliases(modalElement); - modalElement.querySelector("#lotOccupancyTransactionAdd--lotOccupancyId").value = lotOccupancyId.toString(); + modalElement.querySelector('#lotOccupancyTransactionAdd--lotOccupancyId').value = lotOccupancyId.toString(); const feeGrandTotal = getFeeGrandTotal(); const transactionGrandTotal = getTransactionGrandTotal(); - const transactionAmountElement = modalElement.querySelector("#lotOccupancyTransactionAdd--transactionAmount"); + const transactionAmountElement = modalElement.querySelector('#lotOccupancyTransactionAdd--transactionAmount'); transactionAmountElement.min = (-1 * transactionGrandTotal).toFixed(2); transactionAmountElement.max = Math.max(feeGrandTotal - transactionGrandTotal, 0).toFixed(2); transactionAmountElement.value = Math.max(feeGrandTotal - transactionGrandTotal, 0).toFixed(2); @@ -1356,7 +1415,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); onshown: (modalElement, closeModalFunction) => { bulmaJS.toggleHtmlClipped(); addCloseModalFunction = closeModalFunction; - modalElement.querySelector("form").addEventListener("submit", doAddTransaction); + modalElement + .querySelector('form') + .addEventListener('submit', doAddTransaction); }, onremoved: () => { bulmaJS.toggleHtmlClipped(); diff --git a/public-typescript/lotOccupancyEdit/lotOccupancyEdit.js b/public-typescript/lotOccupancyEdit/lotOccupancyEdit.js index e75d3b68..60252ae4 100644 --- a/public-typescript/lotOccupancyEdit/lotOccupancyEdit.js +++ b/public-typescript/lotOccupancyEdit/lotOccupancyEdit.js @@ -4,17 +4,18 @@ Object.defineProperty(exports, "__esModule", { value: true }); (() => { var _a, _b, _c; const los = exports.los; - const lotOccupancyId = document.querySelector("#lotOccupancy--lotOccupancyId") - .value; - const isCreate = lotOccupancyId === ""; + const lotOccupancyId = document.querySelector('#lotOccupancy--lotOccupancyId').value; + const isCreate = lotOccupancyId === ''; /* * Main form */ let refreshAfterSave = isCreate; - const formElement = document.querySelector("#form--lotOccupancy"); - formElement.addEventListener("submit", (formEvent) => { + const formElement = document.querySelector('#form--lotOccupancy'); + formElement.addEventListener('submit', (formEvent) => { 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) { los.clearUnsavedChanges(); if (isCreate || refreshAfterSave) { @@ -23,25 +24,25 @@ Object.defineProperty(exports, "__esModule", { value: true }); else { bulmaJS.alert({ message: `${los.escapedAliases.Occupancy} Updated Successfully`, - contextualColorName: "success" + contextualColorName: 'success' }); } } else { bulmaJS.alert({ - title: "Error Saving " + exports.aliases.occupancy, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Saving ' + exports.aliases.occupancy, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }); - const formInputElements = formElement.querySelectorAll("input, select"); + const formInputElements = formElement.querySelectorAll('input, select'); for (const formInputElement of formInputElements) { - formInputElement.addEventListener("change", los.setUnsavedChanges); + formInputElement.addEventListener('change', los.setUnsavedChanges); } const doCopy = () => { - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doCopyLotOccupancy", { + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doCopyLotOccupancy', { lotOccupancyId }, (responseJSON) => { if (responseJSON.success) { @@ -50,38 +51,40 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Copying Record", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Copying Record', + message: responseJSON.errorMessage || '', + 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(); if (los.hasUnsavedChanges()) { bulmaJS.alert({ - title: "Unsaved Changes", - message: "Please save all unsaved changes before continuing.", - contextualColorName: "warning" + title: 'Unsaved Changes', + message: 'Please save all unsaved changes before continuing.', + contextualColorName: 'warning' }); } else { bulmaJS.confirm({ title: `Copy ${los.escapedAliases.Occupancy} Record as New`, - message: "Are you sure you want to copy this record to a new record?", - contextualColorName: "info", + message: 'Are you sure you want to copy this record to a new record?', + contextualColorName: 'info', okButton: { - text: "Yes, Copy", + text: 'Yes, Copy', 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(); const doDelete = () => { - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancy", { + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancy', { lotOccupancyId }, (responseJSON) => { if (responseJSON.success) { @@ -90,65 +93,69 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Deleting Record", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Deleting Record', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; bulmaJS.confirm({ - title: "Delete " + exports.aliases.occupancy + " Record", - message: "Are you sure you want to delete this record?", - contextualColorName: "warning", + title: 'Delete ' + exports.aliases.occupancy + ' Record', + message: 'Are you sure you want to delete this record?', + contextualColorName: 'warning', okButton: { - text: "Yes, Delete", + text: 'Yes, Delete', 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(); let createCloseModalFunction; const doCreate = (formEvent) => { formEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/workOrders/doCreateWorkOrder", formEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/workOrders/doCreateWorkOrder', formEvent.currentTarget, (responseJSON) => { if (responseJSON.success) { createCloseModalFunction(); bulmaJS.confirm({ - title: "Work Order Created Successfully", - message: "Would you like to open the work order now?", - contextualColorName: "success", + title: 'Work Order Created Successfully', + message: 'Would you like to open the work order now?', + contextualColorName: 'success', okButton: { - text: "Yes, Open the Work Order", + text: 'Yes, Open the Work Order', callbackFunction: () => { window.location.href = - los.urlPrefix + "/workOrders/" + responseJSON.workOrderId + "/edit"; + los.urlPrefix + + '/workOrders/' + + responseJSON.workOrderId + + '/edit'; } } }); } else { bulmaJS.alert({ - title: "Error Creating Work Order", + title: 'Error Creating Work Order', message: responseJSON.errorMessage, - contextualColorName: "danger" + contextualColorName: 'danger' }); } }); }; - cityssm.openHtmlModal("lotOccupancy-createWorkOrder", { + cityssm.openHtmlModal('lotOccupancy-createWorkOrder', { onshow(modalElement) { - modalElement.querySelector("#workOrderCreate--lotOccupancyId").value = - lotOccupancyId; - modalElement.querySelector("#workOrderCreate--workOrderOpenDateString").value = cityssm.dateToString(new Date()); - const workOrderTypeSelectElement = modalElement.querySelector("#workOrderCreate--workOrderTypeId"); + ; + modalElement.querySelector('#workOrderCreate--lotOccupancyId').value = lotOccupancyId; + modalElement.querySelector('#workOrderCreate--workOrderOpenDateString').value = cityssm.dateToString(new Date()); + const workOrderTypeSelectElement = modalElement.querySelector('#workOrderCreate--workOrderTypeId'); const workOrderTypes = exports.workOrderTypes; if (workOrderTypes.length === 1) { - workOrderTypeSelectElement.innerHTML = ""; + workOrderTypeSelectElement.innerHTML = ''; } for (const workOrderType of workOrderTypes) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = workOrderType.workOrderTypeId.toString(); optionElement.textContent = workOrderType.workOrderType; workOrderTypeSelectElement.append(optionElement); @@ -157,22 +164,23 @@ Object.defineProperty(exports, "__esModule", { value: true }); onshown(modalElement, closeModalFunction) { var _a; 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 - const occupancyTypeIdElement = document.querySelector("#lotOccupancy--occupancyTypeId"); + const occupancyTypeIdElement = document.querySelector('#lotOccupancy--occupancyTypeId'); if (isCreate) { - const lotOccupancyFieldsContainerElement = document.querySelector("#container--lotOccupancyFields"); - occupancyTypeIdElement.addEventListener("change", () => { - if (occupancyTypeIdElement.value === "") { + const lotOccupancyFieldsContainerElement = document.querySelector('#container--lotOccupancyFields'); + occupancyTypeIdElement.addEventListener('change', () => { + if (occupancyTypeIdElement.value === '') { lotOccupancyFieldsContainerElement.innerHTML = `

Select the ${los.escapedAliases.occupancy} type to load the available fields.

`; return; } - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doGetOccupancyTypeFields", { + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doGetOccupancyTypeFields', { occupancyTypeId: occupancyTypeIdElement.value }, (responseJSON) => { if (responseJSON.occupancyTypeFields.length === 0) { @@ -181,45 +189,51 @@ Object.defineProperty(exports, "__esModule", { value: true }); `; return; } - lotOccupancyFieldsContainerElement.innerHTML = ""; - let occupancyTypeFieldIds = ""; + lotOccupancyFieldsContainerElement.innerHTML = ''; + let occupancyTypeFieldIds = ''; for (const occupancyTypeField of responseJSON.occupancyTypeFields) { - occupancyTypeFieldIds += "," + occupancyTypeField.occupancyTypeFieldId; - const fieldName = "lotOccupancyFieldValue_" + occupancyTypeField.occupancyTypeFieldId; - const fieldId = "lotOccupancy--" + fieldName; - const fieldElement = document.createElement("div"); - fieldElement.className = "field"; + occupancyTypeFieldIds += + ',' + occupancyTypeField.occupancyTypeFieldId; + const fieldName = 'lotOccupancyFieldValue_' + + occupancyTypeField.occupancyTypeFieldId; + const fieldId = 'lotOccupancy--' + fieldName; + const fieldElement = document.createElement('div'); + fieldElement.className = 'field'; fieldElement.innerHTML = `
`; - fieldElement.querySelector("label").textContent = - occupancyTypeField.occupancyTypeField; - if (occupancyTypeField.occupancyTypeFieldValues === "") { - const inputElement = document.createElement("input"); - inputElement.className = "input"; + fieldElement.querySelector('label').textContent = occupancyTypeField.occupancyTypeField; + if (occupancyTypeField.occupancyTypeFieldValues === '') { + const inputElement = document.createElement('input'); + inputElement.className = 'input'; inputElement.id = fieldId; inputElement.name = fieldName; - inputElement.type = "text"; + inputElement.type = 'text'; inputElement.required = occupancyTypeField.isRequired; - inputElement.minLength = occupancyTypeField.minimumLength; - inputElement.maxLength = occupancyTypeField.maximumLength; - if (occupancyTypeField.pattern && occupancyTypeField.pattern !== "") { + inputElement.minLength = + occupancyTypeField.minimumLength; + inputElement.maxLength = + occupancyTypeField.maximumLength; + if (occupancyTypeField.pattern && + occupancyTypeField.pattern !== '') { inputElement.pattern = occupancyTypeField.pattern; } - fieldElement.querySelector(".control").append(inputElement); + ; + fieldElement.querySelector('.control').append(inputElement); } else { - fieldElement.querySelector(".control").innerHTML = + ; + fieldElement.querySelector('.control').innerHTML = '
"; - const selectElement = fieldElement.querySelector("select"); + ''; + const selectElement = fieldElement.querySelector('select'); selectElement.required = occupancyTypeField.isRequired; - const optionValues = occupancyTypeField.occupancyTypeFieldValues.split("\n"); + const optionValues = occupancyTypeField.occupancyTypeFieldValues.split('\n'); for (const optionValue of optionValues) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = optionValue; optionElement.textContent = optionValue; selectElement.append(optionElement); @@ -227,27 +241,27 @@ Object.defineProperty(exports, "__esModule", { value: true }); } lotOccupancyFieldsContainerElement.append(fieldElement); } - lotOccupancyFieldsContainerElement.insertAdjacentHTML("beforeend", ``); + lotOccupancyFieldsContainerElement.insertAdjacentHTML('beforeend', ``); }); }); } else { const originalOccupancyTypeId = occupancyTypeIdElement.value; - occupancyTypeIdElement.addEventListener("change", () => { + occupancyTypeIdElement.addEventListener('change', () => { if (occupancyTypeIdElement.value !== originalOccupancyTypeId) { bulmaJS.confirm({ - title: "Confirm Change", + title: 'Confirm Change', 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.`, - contextualColorName: "warning", + contextualColorName: 'warning', okButton: { - text: "Yes, Keep the Change", + text: 'Yes, Keep the Change', callbackFunction: () => { refreshAfterSave = true; } }, cancelButton: { - text: "Revert the Change", + text: 'Revert the Change', callbackFunction: () => { occupancyTypeIdElement.value = originalOccupancyTypeId; } @@ -257,16 +271,17 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); } // Lot Selector - const lotNameElement = document.querySelector("#lotOccupancy--lotName"); - lotNameElement.addEventListener("click", (clickEvent) => { + const lotNameElement = document.querySelector('#lotOccupancy--lotName'); + lotNameElement.addEventListener('click', (clickEvent) => { const currentLotName = clickEvent.currentTarget.value; let lotSelectCloseModalFunction; let lotSelectModalElement; let lotSelectFormElement; let lotSelectResultsElement; 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(); lotSelectCloseModalFunction(); }; @@ -276,64 +291,64 @@ Object.defineProperty(exports, "__esModule", { value: true }); renderSelectedLotAndClose(selectedLotElement.dataset.lotId, selectedLotElement.dataset.lotName); }; const searchLots = () => { - lotSelectResultsElement.innerHTML = los.getLoadingParagraphHTML("Searching..."); - cityssm.postJSON(los.urlPrefix + "/lots/doSearchLots", lotSelectFormElement, (responseJSON) => { + lotSelectResultsElement.innerHTML = + los.getLoadingParagraphHTML('Searching...'); + cityssm.postJSON(los.urlPrefix + '/lots/doSearchLots', lotSelectFormElement, (responseJSON) => { if (responseJSON.count === 0) { lotSelectResultsElement.innerHTML = `

No results.

`; return; } - const panelElement = document.createElement("div"); - panelElement.className = "panel"; + const panelElement = document.createElement('div'); + panelElement.className = 'panel'; for (const lot of responseJSON.lots) { - const panelBlockElement = document.createElement("a"); - panelBlockElement.className = "panel-block is-block"; - panelBlockElement.href = "#"; + const panelBlockElement = document.createElement('a'); + panelBlockElement.className = 'panel-block is-block'; + panelBlockElement.href = '#'; panelBlockElement.dataset.lotId = lot.lotId.toString(); panelBlockElement.dataset.lotName = lot.lotName; panelBlockElement.innerHTML = '
' + ('
' + - cityssm.escapeHTML(lot.lotName || "") + - "
" + + cityssm.escapeHTML(lot.lotName || '') + + '
' + '' + - cityssm.escapeHTML(lot.mapName || "") + - "" + - "
") + + cityssm.escapeHTML(lot.mapName || '') + + '' + + '
') + ('
' + cityssm.escapeHTML(lot.lotStatus) + - "
" + + '
' + '' + - (lot.lotOccupancyCount > 0 ? "Currently Occupied" : "") + - "" + - "
") + - ""; - panelBlockElement.addEventListener("click", selectExistingLot); + (lot.lotOccupancyCount > 0 ? 'Currently Occupied' : '') + + '' + + '') + + ''; + panelBlockElement.addEventListener('click', selectExistingLot); panelElement.append(panelBlockElement); } - lotSelectResultsElement.innerHTML = ""; + lotSelectResultsElement.innerHTML = ''; lotSelectResultsElement.append(panelElement); }); }; const createLotAndSelect = (submitEvent) => { submitEvent.preventDefault(); - const lotName = lotSelectModalElement.querySelector("#lotCreate--lotName") - .value; - cityssm.postJSON(los.urlPrefix + "/lots/doCreateLot", submitEvent.currentTarget, (responseJSON) => { + const lotName = lotSelectModalElement.querySelector('#lotCreate--lotName').value; + cityssm.postJSON(los.urlPrefix + '/lots/doCreateLot', submitEvent.currentTarget, (responseJSON) => { if (responseJSON.success) { renderSelectedLotAndClose(responseJSON.lotId, lotName); } else { bulmaJS.alert({ title: `Error Creating ${los.escapedAliases.Lot}`, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; - cityssm.openHtmlModal("lotOccupancy-selectLot", { + cityssm.openHtmlModal('lotOccupancy-selectLot', { onshow: (modalElement) => { los.populateAliases(modalElement); }, @@ -343,87 +358,94 @@ Object.defineProperty(exports, "__esModule", { value: true }); lotSelectCloseModalFunction = closeModalFunction; bulmaJS.init(modalElement); // search Tab - const lotNameFilterElement = modalElement.querySelector("#lotSelect--lotName"); - if (document.querySelector("#lotOccupancy--lotId").value !== "") { + const lotNameFilterElement = modalElement.querySelector('#lotSelect--lotName'); + if (document.querySelector('#lotOccupancy--lotId') + .value !== '') { lotNameFilterElement.value = currentLotName; } lotNameFilterElement.focus(); - lotNameFilterElement.addEventListener("change", searchLots); - const occupancyStatusFilterElement = modalElement.querySelector("#lotSelect--occupancyStatus"); - occupancyStatusFilterElement.addEventListener("change", searchLots); - if (currentLotName !== "") { - occupancyStatusFilterElement.value = ""; + lotNameFilterElement.addEventListener('change', searchLots); + const occupancyStatusFilterElement = modalElement.querySelector('#lotSelect--occupancyStatus'); + occupancyStatusFilterElement.addEventListener('change', searchLots); + if (currentLotName !== '') { + occupancyStatusFilterElement.value = ''; } - lotSelectFormElement = modalElement.querySelector("#form--lotSelect"); - lotSelectResultsElement = modalElement.querySelector("#resultsContainer--lotSelect"); - lotSelectFormElement.addEventListener("submit", (submitEvent) => { + lotSelectFormElement = modalElement.querySelector('#form--lotSelect'); + lotSelectResultsElement = modalElement.querySelector('#resultsContainer--lotSelect'); + lotSelectFormElement.addEventListener('submit', (submitEvent) => { submitEvent.preventDefault(); }); searchLots(); // Create Tab if (exports.lotNamePattern) { const regex = exports.lotNamePattern; - modalElement.querySelector("#lotCreate--lotName").pattern = - regex.source; + modalElement.querySelector('#lotCreate--lotName').pattern = regex.source; } - const lotTypeElement = modalElement.querySelector("#lotCreate--lotTypeId"); + const lotTypeElement = modalElement.querySelector('#lotCreate--lotTypeId'); for (const lotType of exports.lotTypes) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = lotType.lotTypeId.toString(); optionElement.textContent = lotType.lotType; lotTypeElement.append(optionElement); } - const lotStatusElement = modalElement.querySelector("#lotCreate--lotStatusId"); + const lotStatusElement = modalElement.querySelector('#lotCreate--lotStatusId'); for (const lotStatus of exports.lotStatuses) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = lotStatus.lotStatusId.toString(); optionElement.textContent = lotStatus.lotStatus; lotStatusElement.append(optionElement); } - const mapElement = modalElement.querySelector("#lotCreate--mapId"); + const mapElement = modalElement.querySelector('#lotCreate--mapId'); for (const map of exports.maps) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = map.mapId.toString(); - optionElement.textContent = map.mapName || "(No Name)"; + optionElement.textContent = map.mapName || '(No Name)'; mapElement.append(optionElement); } - modalElement.querySelector("#form--lotCreate").addEventListener("submit", createLotAndSelect); + ; + modalElement.querySelector('#form--lotCreate').addEventListener('submit', createLotAndSelect); }, onremoved: () => { bulmaJS.toggleHtmlClipped(); } }); }); - document.querySelector(".is-lot-view-button").addEventListener("click", () => { - const lotId = document.querySelector("#lotOccupancy--lotId").value; + document + .querySelector('.is-lot-view-button') + .addEventListener('click', () => { + const lotId = document.querySelector('#lotOccupancy--lotId').value; if (lotId) { - window.open(los.urlPrefix + "/lots/" + lotId); + window.open(los.urlPrefix + '/lots/' + lotId); } else { bulmaJS.alert({ 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) { bulmaJS.alert({ - message: "You need to unlock the field before clearing it.", - contextualColorName: "info" + message: 'You need to unlock the field before clearing it.', + contextualColorName: 'info' }); } else { lotNameElement.value = `(No ${los.escapedAliases.Lot})`; - document.querySelector("#lotOccupancy--lotId").value = ""; + document.querySelector('#lotOccupancy--lotId').value = ''; los.setUnsavedChanges(); } }); // Start Date los.initializeDatePickers(formElement); - document.querySelector("#lotOccupancy--occupancyStartDateString").addEventListener("change", () => { - const endDatePicker = document.querySelector("#lotOccupancy--occupancyEndDateString").bulmaCalendar.datePicker; - endDatePicker.min = document.querySelector("#lotOccupancy--occupancyStartDateString").value; + document + .querySelector('#lotOccupancy--occupancyStartDateString') + .addEventListener('change', () => { + const endDatePicker = document.querySelector('#lotOccupancy--occupancyEndDateString').bulmaCalendar.datePicker; + endDatePicker.min = document.querySelector('#lotOccupancy--occupancyStartDateString').value; endDatePicker.refresh(); }); los.initializeUnlockFieldButtons(formElement); diff --git a/public-typescript/lotOccupancyEdit/lotOccupancyEdit.ts b/public-typescript/lotOccupancyEdit/lotOccupancyEdit.ts index a3872139..728c6ae9 100644 --- a/public-typescript/lotOccupancyEdit/lotOccupancyEdit.ts +++ b/public-typescript/lotOccupancyEdit/lotOccupancyEdit.ts @@ -1,613 +1,707 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ -import type * as globalTypes from "../../types/globalTypes"; -import type * as recordTypes from "../../types/recordTypes"; +import type * as globalTypes from '../../types/globalTypes' +import type * as recordTypes from '../../types/recordTypes' -import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; +import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types' -import type { BulmaJS } from "@cityssm/bulma-js/types"; +import type { BulmaJS } from '@cityssm/bulma-js/types' -declare const cityssm: cityssmGlobal; -declare const bulmaJS: BulmaJS; +declare const cityssm: cityssmGlobal +declare const bulmaJS: BulmaJS +;(() => { + const los = exports.los as globalTypes.LOS -(() => { - const los = exports.los as globalTypes.LOS; + const lotOccupancyId = ( + document.querySelector('#lotOccupancy--lotOccupancyId') as HTMLInputElement + ).value + const isCreate = lotOccupancyId === '' - const lotOccupancyId = (document.querySelector("#lotOccupancy--lotOccupancyId") as HTMLInputElement) - .value; - const isCreate = lotOccupancyId === ""; + /* + * Main form + */ - /* - * Main form - */ + let refreshAfterSave = isCreate - let refreshAfterSave = isCreate; + const formElement = document.querySelector( + '#form--lotOccupancy' + ) as HTMLFormElement - const formElement = document.querySelector("#form--lotOccupancy") as HTMLFormElement; + formElement.addEventListener('submit', (formEvent) => { + formEvent.preventDefault() - formElement.addEventListener("submit", (formEvent) => { - formEvent.preventDefault(); + cityssm.postJSON( + los.urlPrefix + + '/lotOccupancies/' + + (isCreate ? 'doCreateLotOccupancy' : 'doUpdateLotOccupancy'), + formElement, + (responseJSON: { + success: boolean + lotOccupancyId?: number + errorMessage?: string + }) => { + if (responseJSON.success) { + los.clearUnsavedChanges() - cityssm.postJSON( - los.urlPrefix + "/lotOccupancies/" + (isCreate ? "doCreateLotOccupancy" : "doUpdateLotOccupancy"), - formElement, - (responseJSON: { success: boolean; lotOccupancyId?: number; errorMessage?: string }) => { - if (responseJSON.success) { - los.clearUnsavedChanges(); - - if (isCreate || refreshAfterSave) { - window.location.href = los.getLotOccupancyURL( - responseJSON.lotOccupancyId, - true, - true - ); - } else { - bulmaJS.alert({ - message: `${los.escapedAliases.Occupancy} Updated Successfully`, - contextualColorName: "success" - }); - } - } else { - bulmaJS.alert({ - title: "Error Saving " + exports.aliases.occupancy, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }); - - const formInputElements = formElement.querySelectorAll("input, select"); - - for (const formInputElement of formInputElements) { - formInputElement.addEventListener("change", los.setUnsavedChanges); - } - - const doCopy = () => { - cityssm.postJSON( - los.urlPrefix + "/lotOccupancies/doCopyLotOccupancy", - { - lotOccupancyId - }, - (responseJSON: { success: boolean; errorMessage?: string; lotOccupancyId?: number }) => { - if (responseJSON.success) { - cityssm.disableNavBlocker(); - window.location.href = los.getLotOccupancyURL(responseJSON.lotOccupancyId, true); - } else { - bulmaJS.alert({ - title: "Error Copying Record", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }; - - document.querySelector("#button--copyLotOccupancy")?.addEventListener("click", (clickEvent) => { - clickEvent.preventDefault(); - - if (los.hasUnsavedChanges()) { + if (isCreate || refreshAfterSave) { + window.location.href = los.getLotOccupancyURL( + responseJSON.lotOccupancyId, + true, + true + ) + } else { bulmaJS.alert({ - title: "Unsaved Changes", - message: "Please save all unsaved changes before continuing.", - contextualColorName: "warning" - }); + message: `${los.escapedAliases.Occupancy} Updated Successfully`, + contextualColorName: 'success' + }) + } } else { - bulmaJS.confirm({ - title: `Copy ${los.escapedAliases.Occupancy} Record as New`, - message: "Are you sure you want to copy this record to a new record?", - contextualColorName: "info", - okButton: { - text: "Yes, Copy", - callbackFunction: doCopy - } - }); + bulmaJS.alert({ + title: 'Error Saving ' + exports.aliases.occupancy, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) } - }); + } + ) + }) - document.querySelector("#button--deleteLotOccupancy")?.addEventListener("click", (clickEvent) => { - clickEvent.preventDefault(); + const formInputElements = formElement.querySelectorAll('input, select') - const doDelete = () => { - cityssm.postJSON( - los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancy", - { - lotOccupancyId - }, - (responseJSON: { success: boolean; errorMessage?: string }) => { - if (responseJSON.success) { - cityssm.disableNavBlocker(); - window.location.href = los.getLotOccupancyURL(); - } else { - bulmaJS.alert({ - title: "Error Deleting Record", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }; + for (const formInputElement of formInputElements) { + formInputElement.addEventListener('change', los.setUnsavedChanges) + } + const doCopy = () => { + cityssm.postJSON( + los.urlPrefix + '/lotOccupancies/doCopyLotOccupancy', + { + lotOccupancyId + }, + (responseJSON: { + success: boolean + errorMessage?: string + lotOccupancyId?: number + }) => { + if (responseJSON.success) { + cityssm.disableNavBlocker() + window.location.href = los.getLotOccupancyURL( + responseJSON.lotOccupancyId, + true + ) + } else { + bulmaJS.alert({ + title: 'Error Copying Record', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + ) + } + + document + .querySelector('#button--copyLotOccupancy') + ?.addEventListener('click', (clickEvent) => { + clickEvent.preventDefault() + + if (los.hasUnsavedChanges()) { + bulmaJS.alert({ + title: 'Unsaved Changes', + message: 'Please save all unsaved changes before continuing.', + contextualColorName: 'warning' + }) + } else { bulmaJS.confirm({ - title: "Delete " + exports.aliases.occupancy + " Record", - message: "Are you sure you want to delete this record?", - contextualColorName: "warning", - okButton: { - text: "Yes, Delete", - callbackFunction: doDelete + title: `Copy ${los.escapedAliases.Occupancy} Record as New`, + message: 'Are you sure you want to copy this record to a new record?', + contextualColorName: 'info', + okButton: { + text: 'Yes, Copy', + callbackFunction: doCopy + } + }) + } + }) + + document + .querySelector('#button--deleteLotOccupancy') + ?.addEventListener('click', (clickEvent) => { + clickEvent.preventDefault() + + const doDelete = () => { + cityssm.postJSON( + los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancy', + { + lotOccupancyId + }, + (responseJSON: { success: boolean; errorMessage?: string }) => { + if (responseJSON.success) { + cityssm.disableNavBlocker() + window.location.href = los.getLotOccupancyURL() + } else { + bulmaJS.alert({ + title: 'Error Deleting Record', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) } - }); - }); + } + ) + } - document.querySelector("#button--createWorkOrder")?.addEventListener("click", (clickEvent) => { - clickEvent.preventDefault(); + bulmaJS.confirm({ + title: 'Delete ' + exports.aliases.occupancy + ' Record', + message: 'Are you sure you want to delete this record?', + contextualColorName: 'warning', + okButton: { + text: 'Yes, Delete', + callbackFunction: doDelete + } + }) + }) - let createCloseModalFunction: () => void; + document + .querySelector('#button--createWorkOrder') + ?.addEventListener('click', (clickEvent) => { + clickEvent.preventDefault() - const doCreate = (formEvent: SubmitEvent) => { - formEvent.preventDefault(); + let createCloseModalFunction: () => void - cityssm.postJSON( - los.urlPrefix + "/workOrders/doCreateWorkOrder", - formEvent.currentTarget, - (responseJSON: { success: boolean; errorMessage?: string; workOrderId?: number }) => { - if (responseJSON.success) { - createCloseModalFunction(); + const doCreate = (formEvent: SubmitEvent) => { + formEvent.preventDefault() - bulmaJS.confirm({ - title: "Work Order Created Successfully", - message: "Would you like to open the work order now?", - contextualColorName: "success", - okButton: { - text: "Yes, Open the Work Order", - callbackFunction: () => { - window.location.href = - los.urlPrefix + "/workOrders/" + responseJSON.workOrderId + "/edit"; - } - } - }); - } else { - bulmaJS.alert({ - title: "Error Creating Work Order", - message: responseJSON.errorMessage as string, - contextualColorName: "danger" - }); - } + cityssm.postJSON( + los.urlPrefix + '/workOrders/doCreateWorkOrder', + formEvent.currentTarget, + (responseJSON: { + success: boolean + errorMessage?: string + workOrderId?: number + }) => { + if (responseJSON.success) { + createCloseModalFunction() + + bulmaJS.confirm({ + title: 'Work Order Created Successfully', + message: 'Would you like to open the work order now?', + contextualColorName: 'success', + okButton: { + text: 'Yes, Open the Work Order', + callbackFunction: () => { + window.location.href = + los.urlPrefix + + '/workOrders/' + + responseJSON.workOrderId + + '/edit' + } } - ); - }; - - cityssm.openHtmlModal("lotOccupancy-createWorkOrder", { - onshow(modalElement) { - (modalElement.querySelector("#workOrderCreate--lotOccupancyId") as HTMLInputElement).value = - lotOccupancyId; - - ( - modalElement.querySelector( - "#workOrderCreate--workOrderOpenDateString" - ) as HTMLInputElement - ).value = cityssm.dateToString(new Date()); - - const workOrderTypeSelectElement = modalElement.querySelector( - "#workOrderCreate--workOrderTypeId" - ) as HTMLSelectElement; - - const workOrderTypes = exports.workOrderTypes as recordTypes.WorkOrderType[]; - - if (workOrderTypes.length === 1) { - workOrderTypeSelectElement.innerHTML = ""; - } - - for (const workOrderType of workOrderTypes) { - const optionElement = document.createElement("option"); - optionElement.value = (workOrderType.workOrderTypeId as number).toString(); - optionElement.textContent = workOrderType.workOrderType as string; - workOrderTypeSelectElement.append(optionElement); - } - }, - onshown(modalElement, closeModalFunction) { - createCloseModalFunction = closeModalFunction; - - modalElement.querySelector("form")?.addEventListener("submit", doCreate); + }) + } else { + bulmaJS.alert({ + title: 'Error Creating Work Order', + message: responseJSON.errorMessage as string, + contextualColorName: 'danger' + }) } - }); - }); + } + ) + } - // Occupancy Type + cityssm.openHtmlModal('lotOccupancy-createWorkOrder', { + onshow(modalElement) { + ;( + modalElement.querySelector( + '#workOrderCreate--lotOccupancyId' + ) as HTMLInputElement + ).value = lotOccupancyId + ;( + modalElement.querySelector( + '#workOrderCreate--workOrderOpenDateString' + ) as HTMLInputElement + ).value = cityssm.dateToString(new Date()) - const occupancyTypeIdElement = document.querySelector( - "#lotOccupancy--occupancyTypeId" - ) as HTMLSelectElement; + const workOrderTypeSelectElement = modalElement.querySelector( + '#workOrderCreate--workOrderTypeId' + ) as HTMLSelectElement - if (isCreate) { - const lotOccupancyFieldsContainerElement = document.querySelector( - "#container--lotOccupancyFields" - ) as HTMLElement; + const workOrderTypes = + exports.workOrderTypes as recordTypes.WorkOrderType[] - occupancyTypeIdElement.addEventListener("change", () => { - if (occupancyTypeIdElement.value === "") { - lotOccupancyFieldsContainerElement.innerHTML = `
+ if (workOrderTypes.length === 1) { + workOrderTypeSelectElement.innerHTML = '' + } + + for (const workOrderType of workOrderTypes) { + const optionElement = document.createElement('option') + optionElement.value = ( + workOrderType.workOrderTypeId as number + ).toString() + optionElement.textContent = workOrderType.workOrderType as string + workOrderTypeSelectElement.append(optionElement) + } + }, + onshown(modalElement, closeModalFunction) { + createCloseModalFunction = closeModalFunction + + modalElement + .querySelector('form') + ?.addEventListener('submit', doCreate) + } + }) + }) + + // Occupancy Type + + const occupancyTypeIdElement = document.querySelector( + '#lotOccupancy--occupancyTypeId' + ) as HTMLSelectElement + + if (isCreate) { + const lotOccupancyFieldsContainerElement = document.querySelector( + '#container--lotOccupancyFields' + ) as HTMLElement + + occupancyTypeIdElement.addEventListener('change', () => { + if (occupancyTypeIdElement.value === '') { + lotOccupancyFieldsContainerElement.innerHTML = `

Select the ${los.escapedAliases.occupancy} type to load the available fields.

-
`; +
` - return; - } + return + } - cityssm.postJSON( - los.urlPrefix + "/lotOccupancies/doGetOccupancyTypeFields", - { - occupancyTypeId: occupancyTypeIdElement.value - }, - (responseJSON: { occupancyTypeFields: recordTypes.OccupancyTypeField[] }) => { - if (responseJSON.occupancyTypeFields.length === 0) { - lotOccupancyFieldsContainerElement.innerHTML = `
+ cityssm.postJSON( + los.urlPrefix + '/lotOccupancies/doGetOccupancyTypeFields', + { + occupancyTypeId: occupancyTypeIdElement.value + }, + (responseJSON: { + occupancyTypeFields: recordTypes.OccupancyTypeField[] + }) => { + if (responseJSON.occupancyTypeFields.length === 0) { + lotOccupancyFieldsContainerElement.innerHTML = `

There are no additional fields for this ${los.escapedAliases.occupancy} type.

-
`; +
` - return; - } + return + } - lotOccupancyFieldsContainerElement.innerHTML = ""; + lotOccupancyFieldsContainerElement.innerHTML = '' - let occupancyTypeFieldIds = ""; + let occupancyTypeFieldIds = '' - for (const occupancyTypeField of responseJSON.occupancyTypeFields) { - occupancyTypeFieldIds += "," + occupancyTypeField.occupancyTypeFieldId; + for (const occupancyTypeField of responseJSON.occupancyTypeFields) { + occupancyTypeFieldIds += + ',' + occupancyTypeField.occupancyTypeFieldId - const fieldName = "lotOccupancyFieldValue_" + occupancyTypeField.occupancyTypeFieldId; + const fieldName = + 'lotOccupancyFieldValue_' + + occupancyTypeField.occupancyTypeFieldId - const fieldId = "lotOccupancy--" + fieldName; + const fieldId = 'lotOccupancy--' + fieldName - const fieldElement = document.createElement("div"); - fieldElement.className = "field"; - fieldElement.innerHTML = `
`; + const fieldElement = document.createElement('div') + fieldElement.className = 'field' + fieldElement.innerHTML = `
` + ;( + fieldElement.querySelector('label') as HTMLLabelElement + ).textContent = occupancyTypeField.occupancyTypeField as string - (fieldElement.querySelector("label") as HTMLLabelElement).textContent = - occupancyTypeField.occupancyTypeField as string; + if (occupancyTypeField.occupancyTypeFieldValues === '') { + const inputElement = document.createElement('input') - if (occupancyTypeField.occupancyTypeFieldValues === "") { - 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 as boolean + inputElement.minLength = + occupancyTypeField.minimumLength as number + inputElement.maxLength = + occupancyTypeField.maximumLength as number - inputElement.required = occupancyTypeField.isRequired as boolean; - inputElement.minLength = occupancyTypeField.minimumLength as number; - inputElement.maxLength = occupancyTypeField.maximumLength as number; + if ( + occupancyTypeField.pattern && + occupancyTypeField.pattern !== '' + ) { + inputElement.pattern = occupancyTypeField.pattern + } - if (occupancyTypeField.pattern && occupancyTypeField.pattern !== "") { - inputElement.pattern = occupancyTypeField.pattern; - } + ;(fieldElement.querySelector('.control') as HTMLElement).append( + inputElement + ) + } else { + ;( + fieldElement.querySelector('.control') as HTMLElement + ).innerHTML = + '
' - (fieldElement.querySelector(".control") as HTMLElement).append(inputElement); - } else { - (fieldElement.querySelector(".control") as HTMLElement).innerHTML = - '
"; + const selectElement = fieldElement.querySelector( + 'select' + ) as HTMLSelectElement - const selectElement = fieldElement.querySelector("select") as HTMLSelectElement; + selectElement.required = occupancyTypeField.isRequired as boolean - selectElement.required = occupancyTypeField.isRequired as boolean; + const optionValues = ( + occupancyTypeField.occupancyTypeFieldValues as string + ).split('\n') - const optionValues = ( - occupancyTypeField.occupancyTypeFieldValues as string - ).split("\n"); + for (const optionValue of optionValues) { + const optionElement = document.createElement('option') + optionElement.value = optionValue + optionElement.textContent = optionValue + selectElement.append(optionElement) + } + } - for (const optionValue of optionValues) { - const optionElement = document.createElement("option"); - optionElement.value = optionValue; - optionElement.textContent = optionValue; - selectElement.append(optionElement); - } - } + lotOccupancyFieldsContainerElement.append(fieldElement) + } - lotOccupancyFieldsContainerElement.append(fieldElement); - } + lotOccupancyFieldsContainerElement.insertAdjacentHTML( + 'beforeend', + `` + ) + } + ) + }) + } else { + const originalOccupancyTypeId = occupancyTypeIdElement.value - lotOccupancyFieldsContainerElement.insertAdjacentHTML( - "beforeend", - `` - ); - } - ); - }); - } else { - const originalOccupancyTypeId = occupancyTypeIdElement.value; - - occupancyTypeIdElement.addEventListener("change", () => { - if (occupancyTypeIdElement.value !== originalOccupancyTypeId) { - bulmaJS.confirm({ - title: "Confirm Change", - message: `Are you sure you want to change the ${los.escapedAliases.occupancy} type?\n + occupancyTypeIdElement.addEventListener('change', () => { + if (occupancyTypeIdElement.value !== originalOccupancyTypeId) { + bulmaJS.confirm({ + title: 'Confirm Change', + 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.`, - contextualColorName: "warning", - okButton: { - text: "Yes, Keep the Change", - callbackFunction: () => { - refreshAfterSave = true; - } - }, - cancelButton: { - text: "Revert the Change", - callbackFunction: () => { - occupancyTypeIdElement.value = originalOccupancyTypeId; - } - } - }); + contextualColorName: 'warning', + okButton: { + text: 'Yes, Keep the Change', + callbackFunction: () => { + refreshAfterSave = true } - }); + }, + cancelButton: { + text: 'Revert the Change', + callbackFunction: () => { + occupancyTypeIdElement.value = originalOccupancyTypeId + } + } + }) + } + }) + } + + // Lot Selector + + const lotNameElement = document.querySelector( + '#lotOccupancy--lotName' + ) as HTMLInputElement + + lotNameElement.addEventListener('click', (clickEvent) => { + const currentLotName = (clickEvent.currentTarget as HTMLInputElement).value + + let lotSelectCloseModalFunction: () => void + let lotSelectModalElement: HTMLElement + + let lotSelectFormElement: HTMLFormElement + let lotSelectResultsElement: HTMLElement + + const renderSelectedLotAndClose = ( + lotId: number | string, + lotName: string + ) => { + ;( + document.querySelector('#lotOccupancy--lotId') as HTMLInputElement + ).value = lotId.toString() + ;( + document.querySelector('#lotOccupancy--lotName') as HTMLInputElement + ).value = lotName + + los.setUnsavedChanges() + lotSelectCloseModalFunction() } - // Lot Selector + const selectExistingLot = (clickEvent: Event) => { + clickEvent.preventDefault() - const lotNameElement = document.querySelector("#lotOccupancy--lotName") as HTMLInputElement; + const selectedLotElement = clickEvent.currentTarget as HTMLElement - lotNameElement.addEventListener("click", (clickEvent) => { - const currentLotName = (clickEvent.currentTarget as HTMLInputElement).value; + renderSelectedLotAndClose( + selectedLotElement.dataset.lotId!, + selectedLotElement.dataset.lotName! + ) + } - let lotSelectCloseModalFunction: () => void; - let lotSelectModalElement: HTMLElement; + const searchLots = () => { + lotSelectResultsElement.innerHTML = + los.getLoadingParagraphHTML('Searching...') - let lotSelectFormElement: HTMLFormElement; - let lotSelectResultsElement: HTMLElement; - - const renderSelectedLotAndClose = (lotId: number | string, lotName: string) => { - (document.querySelector("#lotOccupancy--lotId") as HTMLInputElement).value = lotId.toString(); - (document.querySelector("#lotOccupancy--lotName") as HTMLInputElement).value = lotName; - - los.setUnsavedChanges(); - lotSelectCloseModalFunction(); - }; - - const selectExistingLot = (clickEvent: Event) => { - clickEvent.preventDefault(); - - const selectedLotElement = clickEvent.currentTarget as HTMLElement; - - renderSelectedLotAndClose(selectedLotElement.dataset.lotId!, selectedLotElement.dataset.lotName!); - }; - - const searchLots = () => { - lotSelectResultsElement.innerHTML = los.getLoadingParagraphHTML("Searching..."); - - cityssm.postJSON( - los.urlPrefix + "/lots/doSearchLots", - lotSelectFormElement, - (responseJSON: { count: number; lots: recordTypes.Lot[] }) => { - if (responseJSON.count === 0) { - lotSelectResultsElement.innerHTML = `
+ cityssm.postJSON( + los.urlPrefix + '/lots/doSearchLots', + lotSelectFormElement, + (responseJSON: { count: number; lots: recordTypes.Lot[] }) => { + if (responseJSON.count === 0) { + lotSelectResultsElement.innerHTML = `

No results.

-
`; +
` - return; - } + return + } - const panelElement = document.createElement("div"); - panelElement.className = "panel"; + const panelElement = document.createElement('div') + panelElement.className = 'panel' - for (const lot of responseJSON.lots) { - const panelBlockElement = document.createElement("a"); - panelBlockElement.className = "panel-block is-block"; - panelBlockElement.href = "#"; + for (const lot of responseJSON.lots) { + const panelBlockElement = document.createElement('a') + panelBlockElement.className = 'panel-block is-block' + panelBlockElement.href = '#' - panelBlockElement.dataset.lotId = lot.lotId.toString(); - panelBlockElement.dataset.lotName = lot.lotName; + panelBlockElement.dataset.lotId = lot.lotId.toString() + panelBlockElement.dataset.lotName = lot.lotName - panelBlockElement.innerHTML = - '
' + - ('
' + - cityssm.escapeHTML(lot.lotName || "") + - "
" + - '' + - cityssm.escapeHTML(lot.mapName || "") + - "" + - "
") + - ('
' + - cityssm.escapeHTML(lot.lotStatus as string) + - "
" + - '' + - (lot.lotOccupancyCount! > 0 ? "Currently Occupied" : "") + - "" + - "
") + - "
"; + panelBlockElement.innerHTML = + '
' + + ('
' + + cityssm.escapeHTML(lot.lotName || '') + + '
' + + '' + + cityssm.escapeHTML(lot.mapName || '') + + '' + + '
') + + ('
' + + cityssm.escapeHTML(lot.lotStatus as string) + + '
' + + '' + + (lot.lotOccupancyCount! > 0 ? 'Currently Occupied' : '') + + '' + + '
') + + '
' - panelBlockElement.addEventListener("click", selectExistingLot); + panelBlockElement.addEventListener('click', selectExistingLot) - panelElement.append(panelBlockElement); - } + panelElement.append(panelBlockElement) + } - lotSelectResultsElement.innerHTML = ""; - lotSelectResultsElement.append(panelElement); - } - ); - }; - - const createLotAndSelect = (submitEvent: SubmitEvent) => { - submitEvent.preventDefault(); - - const lotName = (lotSelectModalElement.querySelector("#lotCreate--lotName") as HTMLInputElement) - .value; - - cityssm.postJSON( - los.urlPrefix + "/lots/doCreateLot", - submitEvent.currentTarget, - (responseJSON: { success: boolean; errorMessage?: string; lotId?: number }) => { - if (responseJSON.success) { - renderSelectedLotAndClose(responseJSON.lotId!, lotName); - } else { - bulmaJS.alert({ - title: `Error Creating ${los.escapedAliases.Lot}`, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }; - - cityssm.openHtmlModal("lotOccupancy-selectLot", { - onshow: (modalElement) => { - los.populateAliases(modalElement); - }, - onshown: (modalElement, closeModalFunction) => { - bulmaJS.toggleHtmlClipped(); - - lotSelectModalElement = modalElement; - lotSelectCloseModalFunction = closeModalFunction; - - bulmaJS.init(modalElement); - - // search Tab - - const lotNameFilterElement = modalElement.querySelector( - "#lotSelect--lotName" - ) as HTMLInputElement; - - if ((document.querySelector("#lotOccupancy--lotId") as HTMLInputElement).value !== "") { - lotNameFilterElement.value = currentLotName; - } - - lotNameFilterElement.focus(); - lotNameFilterElement.addEventListener("change", searchLots); - - const occupancyStatusFilterElement = modalElement.querySelector( - "#lotSelect--occupancyStatus" - ) as HTMLSelectElement; - occupancyStatusFilterElement.addEventListener("change", searchLots); - - if (currentLotName !== "") { - occupancyStatusFilterElement.value = ""; - } - - lotSelectFormElement = modalElement.querySelector("#form--lotSelect") as HTMLFormElement; - lotSelectResultsElement = modalElement.querySelector( - "#resultsContainer--lotSelect" - ) as HTMLElement; - - lotSelectFormElement.addEventListener("submit", (submitEvent) => { - submitEvent.preventDefault(); - }); - - searchLots(); - - // Create Tab - - if (exports.lotNamePattern) { - const regex = exports.lotNamePattern as RegExp; - - (modalElement.querySelector("#lotCreate--lotName") as HTMLInputElement).pattern = - regex.source; - } - - const lotTypeElement = modalElement.querySelector( - "#lotCreate--lotTypeId" - ) as HTMLSelectElement; - - for (const lotType of exports.lotTypes as recordTypes.LotType[]) { - const optionElement = document.createElement("option"); - optionElement.value = lotType.lotTypeId.toString(); - optionElement.textContent = lotType.lotType; - lotTypeElement.append(optionElement); - } - - const lotStatusElement = modalElement.querySelector( - "#lotCreate--lotStatusId" - ) as HTMLSelectElement; - - for (const lotStatus of exports.lotStatuses as recordTypes.LotStatus[]) { - const optionElement = document.createElement("option"); - optionElement.value = lotStatus.lotStatusId.toString(); - optionElement.textContent = lotStatus.lotStatus; - lotStatusElement.append(optionElement); - } - - const mapElement = modalElement.querySelector("#lotCreate--mapId") as HTMLSelectElement; - - for (const map of exports.maps as recordTypes.Map[]) { - const optionElement = document.createElement("option"); - optionElement.value = map.mapId!.toString(); - optionElement.textContent = map.mapName || "(No Name)"; - mapElement.append(optionElement); - } - - (modalElement.querySelector("#form--lotCreate") as HTMLFormElement).addEventListener( - "submit", - createLotAndSelect - ); - }, - onremoved: () => { - bulmaJS.toggleHtmlClipped(); - } - }); - }); - - document.querySelector(".is-lot-view-button")!.addEventListener("click", () => { - const lotId = (document.querySelector("#lotOccupancy--lotId") as HTMLInputElement).value; - - if (lotId) { - window.open(los.urlPrefix + "/lots/" + lotId); - } else { - bulmaJS.alert({ - message: `No ${los.escapedAliases.lot} selected.`, - contextualColorName: "info" - }); + lotSelectResultsElement.innerHTML = '' + lotSelectResultsElement.append(panelElement) } - }); - - document.querySelector(".is-clear-lot-button")!.addEventListener("click", () => { - if (lotNameElement.disabled) { - bulmaJS.alert({ - message: "You need to unlock the field before clearing it.", - contextualColorName: "info" - }); - } else { - lotNameElement.value = `(No ${los.escapedAliases.Lot})`; - (document.querySelector("#lotOccupancy--lotId") as HTMLInputElement).value = ""; - los.setUnsavedChanges(); - } - }); - - // Start Date - - los.initializeDatePickers(formElement); - - document.querySelector("#lotOccupancy--occupancyStartDateString")!.addEventListener("change", () => { - const endDatePicker = ( - document.querySelector("#lotOccupancy--occupancyEndDateString") as HTMLInputElement - ).bulmaCalendar.datePicker; - - endDatePicker.min = ( - document.querySelector("#lotOccupancy--occupancyStartDateString") as HTMLInputElement - ).value; - - endDatePicker.refresh(); - }); - - los.initializeUnlockFieldButtons(formElement); - - /* - * Occupants - */ - - //=include lotOccupancyEditOccupants.js - - if (!isCreate) { - //=include lotOccupancyEditComments.js - //=include lotOccupancyEditFees.js + ) } -})(); + + const createLotAndSelect = (submitEvent: SubmitEvent) => { + submitEvent.preventDefault() + + const lotName = ( + lotSelectModalElement.querySelector( + '#lotCreate--lotName' + ) as HTMLInputElement + ).value + + cityssm.postJSON( + los.urlPrefix + '/lots/doCreateLot', + submitEvent.currentTarget, + (responseJSON: { + success: boolean + errorMessage?: string + lotId?: number + }) => { + if (responseJSON.success) { + renderSelectedLotAndClose(responseJSON.lotId!, lotName) + } else { + bulmaJS.alert({ + title: `Error Creating ${los.escapedAliases.Lot}`, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + ) + } + + cityssm.openHtmlModal('lotOccupancy-selectLot', { + onshow: (modalElement) => { + los.populateAliases(modalElement) + }, + onshown: (modalElement, closeModalFunction) => { + bulmaJS.toggleHtmlClipped() + + lotSelectModalElement = modalElement + lotSelectCloseModalFunction = closeModalFunction + + bulmaJS.init(modalElement) + + // search Tab + + const lotNameFilterElement = modalElement.querySelector( + '#lotSelect--lotName' + ) as HTMLInputElement + + if ( + (document.querySelector('#lotOccupancy--lotId') as HTMLInputElement) + .value !== '' + ) { + lotNameFilterElement.value = currentLotName + } + + lotNameFilterElement.focus() + lotNameFilterElement.addEventListener('change', searchLots) + + const occupancyStatusFilterElement = modalElement.querySelector( + '#lotSelect--occupancyStatus' + ) as HTMLSelectElement + occupancyStatusFilterElement.addEventListener('change', searchLots) + + if (currentLotName !== '') { + occupancyStatusFilterElement.value = '' + } + + lotSelectFormElement = modalElement.querySelector( + '#form--lotSelect' + ) as HTMLFormElement + lotSelectResultsElement = modalElement.querySelector( + '#resultsContainer--lotSelect' + ) as HTMLElement + + lotSelectFormElement.addEventListener('submit', (submitEvent) => { + submitEvent.preventDefault() + }) + + searchLots() + + // Create Tab + + if (exports.lotNamePattern) { + const regex = exports.lotNamePattern as RegExp + + ;( + modalElement.querySelector( + '#lotCreate--lotName' + ) as HTMLInputElement + ).pattern = regex.source + } + + const lotTypeElement = modalElement.querySelector( + '#lotCreate--lotTypeId' + ) as HTMLSelectElement + + for (const lotType of exports.lotTypes as recordTypes.LotType[]) { + const optionElement = document.createElement('option') + optionElement.value = lotType.lotTypeId.toString() + optionElement.textContent = lotType.lotType + lotTypeElement.append(optionElement) + } + + const lotStatusElement = modalElement.querySelector( + '#lotCreate--lotStatusId' + ) as HTMLSelectElement + + for (const lotStatus of exports.lotStatuses as recordTypes.LotStatus[]) { + const optionElement = document.createElement('option') + optionElement.value = lotStatus.lotStatusId.toString() + optionElement.textContent = lotStatus.lotStatus + lotStatusElement.append(optionElement) + } + + const mapElement = modalElement.querySelector( + '#lotCreate--mapId' + ) as HTMLSelectElement + + for (const map of exports.maps as recordTypes.Map[]) { + const optionElement = document.createElement('option') + optionElement.value = map.mapId!.toString() + optionElement.textContent = map.mapName || '(No Name)' + mapElement.append(optionElement) + } + + ;( + modalElement.querySelector('#form--lotCreate') as HTMLFormElement + ).addEventListener('submit', createLotAndSelect) + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped() + } + }) + }) + + document + .querySelector('.is-lot-view-button')! + .addEventListener('click', () => { + const lotId = ( + document.querySelector('#lotOccupancy--lotId') as HTMLInputElement + ).value + + if (lotId) { + window.open(los.urlPrefix + '/lots/' + lotId) + } else { + bulmaJS.alert({ + message: `No ${los.escapedAliases.lot} selected.`, + contextualColorName: 'info' + }) + } + }) + + document + .querySelector('.is-clear-lot-button')! + .addEventListener('click', () => { + if (lotNameElement.disabled) { + bulmaJS.alert({ + message: 'You need to unlock the field before clearing it.', + contextualColorName: 'info' + }) + } else { + lotNameElement.value = `(No ${los.escapedAliases.Lot})` + ;( + document.querySelector('#lotOccupancy--lotId') as HTMLInputElement + ).value = '' + los.setUnsavedChanges() + } + }) + + // Start Date + + los.initializeDatePickers(formElement) + + document + .querySelector('#lotOccupancy--occupancyStartDateString')! + .addEventListener('change', () => { + const endDatePicker = ( + document.querySelector( + '#lotOccupancy--occupancyEndDateString' + ) as HTMLInputElement + ).bulmaCalendar.datePicker + + endDatePicker.min = ( + document.querySelector( + '#lotOccupancy--occupancyStartDateString' + ) as HTMLInputElement + ).value + + endDatePicker.refresh() + }) + + los.initializeUnlockFieldButtons(formElement) + + /* + * Occupants + */ + + //=include lotOccupancyEditOccupants.js + + if (!isCreate) { + //=include lotOccupancyEditComments.js + //=include lotOccupancyEditFees.js + } +})() diff --git a/public-typescript/lotOccupancyEdit/lotOccupancyEditComments.js b/public-typescript/lotOccupancyEdit/lotOccupancyEditComments.js index b4940d61..20741725 100644 --- a/public-typescript/lotOccupancyEdit/lotOccupancyEditComments.js +++ b/public-typescript/lotOccupancyEdit/lotOccupancyEditComments.js @@ -4,15 +4,17 @@ Object.defineProperty(exports, "__esModule", { value: true }); let lotOccupancyComments = exports.lotOccupancyComments; delete exports.lotOccupancyComments; 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) => { - return currentLotOccupancyComment.lotOccupancyCommentId === lotOccupancyCommentId; + return (currentLotOccupancyComment.lotOccupancyCommentId === + lotOccupancyCommentId); }); let editFormElement; let editCloseModalFunction; const editComment = (submitEvent) => { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doUpdateLotOccupancyComment", editFormElement, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doUpdateLotOccupancyComment', editFormElement, (responseJSON) => { if (responseJSON.success) { lotOccupancyComments = responseJSON.lotOccupancyComments; editCloseModalFunction(); @@ -20,20 +22,20 @@ const openEditLotOccupancyComment = (clickEvent) => { } else { bulmaJS.alert({ - title: "Error Updating Comment", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Updating Comment', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; - cityssm.openHtmlModal("lotOccupancy-editComment", { + cityssm.openHtmlModal('lotOccupancy-editComment', { onshow: (modalElement) => { los.populateAliases(modalElement); - modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyId").value = lotOccupancyId; - modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentId").value = lotOccupancyCommentId.toString(); - modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyComment").value = lotOccupancyComment.lotOccupancyComment; - const lotOccupancyCommentDateStringElement = modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentDateString"); + modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyId').value = lotOccupancyId; + modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyCommentId').value = lotOccupancyCommentId.toString(); + modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyComment').value = lotOccupancyComment.lotOccupancyComment; + const lotOccupancyCommentDateStringElement = modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyCommentDateString'); lotOccupancyCommentDateStringElement.value = lotOccupancyComment.lotOccupancyCommentDateString; const currentDateString = cityssm.dateToString(new Date()); @@ -41,15 +43,14 @@ const openEditLotOccupancyComment = (clickEvent) => { lotOccupancyComment.lotOccupancyCommentDateString <= currentDateString ? currentDateString : lotOccupancyComment.lotOccupancyCommentDateString; - modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentTimeString").value = lotOccupancyComment.lotOccupancyCommentTimeString; + modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyCommentTimeString').value = lotOccupancyComment.lotOccupancyCommentTimeString; }, onshown: (modalElement, closeModalFunction) => { bulmaJS.toggleHtmlClipped(); los.initializeDatePickers(modalElement); - // los.initializeTimePickers(modalElement); - modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyComment").focus(); - editFormElement = modalElement.querySelector("form"); - editFormElement.addEventListener("submit", editComment); + modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyComment').focus(); + editFormElement = modalElement.querySelector('form'); + editFormElement.addEventListener('submit', editComment); editCloseModalFunction = closeModalFunction; }, onremoved: () => { @@ -58,9 +59,10 @@ const openEditLotOccupancyComment = (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 = () => { - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyComment", { + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyComment', { lotOccupancyId, lotOccupancyCommentId }, (responseJSON) => { @@ -70,87 +72,87 @@ const deleteLotOccupancyComment = (clickEvent) => { } else { bulmaJS.alert({ - title: "Error Removing Comment", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Removing Comment', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; bulmaJS.confirm({ - title: "Remove Comment?", - message: "Are you sure you want to remove this comment?", + title: 'Remove Comment?', + message: 'Are you sure you want to remove this comment?', okButton: { - text: "Yes, Remove Comment", + text: 'Yes, Remove Comment', callbackFunction: doDelete }, - contextualColorName: "warning" + contextualColorName: 'warning' }); }; const renderLotOccupancyComments = () => { - const containerElement = document.querySelector("#container--lotOccupancyComments"); + const containerElement = document.querySelector('#container--lotOccupancyComments'); if (lotOccupancyComments.length === 0) { containerElement.innerHTML = '
' + '

There are no comments associated with this record.

' + - "
"; + ''; return; } - const tableElement = document.createElement("table"); - tableElement.className = "table is-fullwidth is-striped is-hoverable"; + const tableElement = document.createElement('table'); + tableElement.className = 'table is-fullwidth is-striped is-hoverable'; tableElement.innerHTML = - "" + - "Commentor" + - "Comment Date" + - "Comment" + + '' + + 'Commentor' + + 'Comment Date' + + 'Comment' + 'Options' + - "" + - ""; + '' + + ''; for (const lotOccupancyComment of lotOccupancyComments) { - const tableRowElement = document.createElement("tr"); + const tableRowElement = document.createElement('tr'); tableRowElement.dataset.lotOccupancyCommentId = lotOccupancyComment.lotOccupancyCommentId.toString(); tableRowElement.innerHTML = - "" + - cityssm.escapeHTML(lotOccupancyComment.recordCreate_userName || "") + - "" + - "" + + '' + + cityssm.escapeHTML(lotOccupancyComment.recordCreate_userName || '') + + '' + + '' + lotOccupancyComment.lotOccupancyCommentDateString + (lotOccupancyComment.lotOccupancyCommentTime === 0 - ? "" - : " " + lotOccupancyComment.lotOccupancyCommentTimeString) + - "" + - "" + - cityssm.escapeHTML(lotOccupancyComment.lotOccupancyComment || "") + - "" + + ? '' + : ' ' + lotOccupancyComment.lotOccupancyCommentTimeString) + + '' + + '' + + cityssm.escapeHTML(lotOccupancyComment.lotOccupancyComment || '') + + '' + ('' + '
' + ('") + + ' Edit' + + '') + ('") + - "
" + - ""); + '') + + '' + + ''); tableRowElement - .querySelector(".button--edit") - .addEventListener("click", openEditLotOccupancyComment); + .querySelector('.button--edit') + .addEventListener('click', openEditLotOccupancyComment); tableRowElement - .querySelector(".button--delete") - .addEventListener("click", deleteLotOccupancyComment); - tableElement.querySelector("tbody").append(tableRowElement); + .querySelector('.button--delete') + .addEventListener('click', deleteLotOccupancyComment); + tableElement.querySelector('tbody').append(tableRowElement); } - containerElement.innerHTML = ""; + containerElement.innerHTML = ''; containerElement.append(tableElement); }; -document.querySelector("#button--addComment").addEventListener("click", () => { +document.querySelector('#button--addComment').addEventListener('click', () => { let addFormElement; let addCloseModalFunction; const addComment = (submitEvent) => { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doAddLotOccupancyComment", addFormElement, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doAddLotOccupancyComment', addFormElement, (responseJSON) => { if (responseJSON.success) { lotOccupancyComments = responseJSON.lotOccupancyComments; addCloseModalFunction(); @@ -158,23 +160,23 @@ document.querySelector("#button--addComment").addEventListener("click", () => { } else { bulmaJS.alert({ - title: "Error Adding Comment", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Adding Comment', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; - cityssm.openHtmlModal("lotOccupancy-addComment", { + cityssm.openHtmlModal('lotOccupancy-addComment', { onshow: (modalElement) => { los.populateAliases(modalElement); - modalElement.querySelector("#lotOccupancyCommentAdd--lotOccupancyId").value = lotOccupancyId; + modalElement.querySelector('#lotOccupancyCommentAdd--lotOccupancyId').value = lotOccupancyId; }, onshown: (modalElement, closeModalFunction) => { bulmaJS.toggleHtmlClipped(); - modalElement.querySelector("#lotOccupancyCommentAdd--lotOccupancyComment").focus(); - addFormElement = modalElement.querySelector("form"); - addFormElement.addEventListener("submit", addComment); + modalElement.querySelector('#lotOccupancyCommentAdd--lotOccupancyComment').focus(); + addFormElement = modalElement.querySelector('form'); + addFormElement.addEventListener('submit', addComment); addCloseModalFunction = closeModalFunction; }, onremoved: () => { diff --git a/public-typescript/lotOccupancyEdit/lotOccupancyEditComments.ts b/public-typescript/lotOccupancyEdit/lotOccupancyEditComments.ts index f8b5b798..d7066567 100644 --- a/public-typescript/lotOccupancyEdit/lotOccupancyEditComments.ts +++ b/public-typescript/lotOccupancyEdit/lotOccupancyEditComments.ts @@ -1,295 +1,303 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ -import type * as globalTypes from "../../types/globalTypes"; -import type * as recordTypes from "../../types/recordTypes"; +import type * as globalTypes from '../../types/globalTypes' +import type * as recordTypes from '../../types/recordTypes' -import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; +import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types' -import type { BulmaJS } from "@cityssm/bulma-js/types"; +import type { BulmaJS } from '@cityssm/bulma-js/types' -declare const cityssm: cityssmGlobal; -declare const bulmaJS: BulmaJS; +declare const cityssm: cityssmGlobal +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; -delete exports.lotOccupancyComments; +let lotOccupancyComments: recordTypes.LotOccupancyComment[] = + exports.lotOccupancyComments +delete exports.lotOccupancyComments const openEditLotOccupancyComment = (clickEvent: Event) => { - const lotOccupancyCommentId = Number.parseInt( - (clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.lotOccupancyCommentId!, - 10 - ); + const lotOccupancyCommentId = Number.parseInt( + (clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset + .lotOccupancyCommentId!, + 10 + ) - const lotOccupancyComment = lotOccupancyComments.find((currentLotOccupancyComment) => { - return currentLotOccupancyComment.lotOccupancyCommentId === lotOccupancyCommentId; - })!; + const lotOccupancyComment = lotOccupancyComments.find( + (currentLotOccupancyComment) => { + return ( + currentLotOccupancyComment.lotOccupancyCommentId === + lotOccupancyCommentId + ) + } + )! - let editFormElement: HTMLFormElement; - let editCloseModalFunction: () => void; + let editFormElement: HTMLFormElement + let editCloseModalFunction: () => void - const editComment = (submitEvent: SubmitEvent) => { - submitEvent.preventDefault(); + const editComment = (submitEvent: SubmitEvent) => { + submitEvent.preventDefault() - cityssm.postJSON( - los.urlPrefix + "/lotOccupancies/doUpdateLotOccupancyComment", - editFormElement, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotOccupancyComments?: recordTypes.LotOccupancyComment[]; - }) => { - if (responseJSON.success) { - lotOccupancyComments = responseJSON.lotOccupancyComments!; - editCloseModalFunction(); - renderLotOccupancyComments(); - } else { - bulmaJS.alert({ - title: "Error Updating Comment", - message: responseJSON.errorMessage || "", - 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.postJSON( + los.urlPrefix + '/lotOccupancies/doUpdateLotOccupancyComment', + editFormElement, + (responseJSON: { + success: boolean + errorMessage?: string + lotOccupancyComments?: recordTypes.LotOccupancyComment[] + }) => { + if (responseJSON.success) { + lotOccupancyComments = responseJSON.lotOccupancyComments! + editCloseModalFunction() + renderLotOccupancyComments() + } else { + bulmaJS.alert({ + title: 'Error Updating Comment', + message: responseJSON.errorMessage || '', + 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() + } + }) +} const deleteLotOccupancyComment = (clickEvent: Event) => { - const lotOccupancyCommentId = Number.parseInt( - (clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.lotOccupancyCommentId!, - 10 - ); + const lotOccupancyCommentId = Number.parseInt( + (clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset + .lotOccupancyCommentId!, + 10 + ) - const doDelete = () => { - cityssm.postJSON( - los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyComment", - { - lotOccupancyId, - lotOccupancyCommentId - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotOccupancyComments: recordTypes.LotOccupancyComment[]; - }) => { - if (responseJSON.success) { - lotOccupancyComments = responseJSON.lotOccupancyComments; - renderLotOccupancyComments(); - } else { - bulmaJS.alert({ - title: "Error Removing Comment", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }; + const doDelete = () => { + cityssm.postJSON( + los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyComment', + { + lotOccupancyId, + lotOccupancyCommentId + }, + (responseJSON: { + success: boolean + errorMessage?: string + lotOccupancyComments: recordTypes.LotOccupancyComment[] + }) => { + if (responseJSON.success) { + lotOccupancyComments = responseJSON.lotOccupancyComments + renderLotOccupancyComments() + } 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" - }); -}; + bulmaJS.confirm({ + title: 'Remove Comment?', + message: 'Are you sure you want to remove this comment?', + okButton: { + text: 'Yes, Remove Comment', + callbackFunction: doDelete + }, + contextualColorName: 'warning' + }) +} const renderLotOccupancyComments = () => { - const containerElement = document.querySelector( - "#container--lotOccupancyComments" - ) as HTMLElement; + const containerElement = document.querySelector( + '#container--lotOccupancyComments' + ) as HTMLElement - if (lotOccupancyComments.length === 0) { - containerElement.innerHTML = - '
' + - '

There are no comments associated with this record.

' + - "
"; - return; - } + if (lotOccupancyComments.length === 0) { + containerElement.innerHTML = + '
' + + '

There are no comments associated with this record.

' + + '
' + return + } - const tableElement = document.createElement("table"); - tableElement.className = "table is-fullwidth is-striped is-hoverable"; - tableElement.innerHTML = - "" + - "Commentor" + - "Comment Date" + - "Comment" + - 'Options' + - "" + - ""; + const tableElement = document.createElement('table') + tableElement.className = 'table is-fullwidth is-striped is-hoverable' + tableElement.innerHTML = + '' + + 'Commentor' + + 'Comment Date' + + 'Comment' + + 'Options' + + '' + + '' - for (const lotOccupancyComment of lotOccupancyComments) { - const tableRowElement = document.createElement("tr"); - tableRowElement.dataset.lotOccupancyCommentId = - lotOccupancyComment.lotOccupancyCommentId!.toString(); + for (const lotOccupancyComment of lotOccupancyComments) { + const tableRowElement = document.createElement('tr') + tableRowElement.dataset.lotOccupancyCommentId = + lotOccupancyComment.lotOccupancyCommentId!.toString() - tableRowElement.innerHTML = - "" + - cityssm.escapeHTML(lotOccupancyComment.recordCreate_userName || "") + - "" + - "" + - lotOccupancyComment.lotOccupancyCommentDateString + - (lotOccupancyComment.lotOccupancyCommentTime === 0 - ? "" - : " " + lotOccupancyComment.lotOccupancyCommentTimeString) + - "" + - "" + - cityssm.escapeHTML(lotOccupancyComment.lotOccupancyComment || "") + - "" + - ('' + - '
' + - ('") + - ('") + - "
" + - ""); + tableRowElement.innerHTML = + '' + + cityssm.escapeHTML(lotOccupancyComment.recordCreate_userName || '') + + '' + + '' + + lotOccupancyComment.lotOccupancyCommentDateString + + (lotOccupancyComment.lotOccupancyCommentTime === 0 + ? '' + : ' ' + lotOccupancyComment.lotOccupancyCommentTimeString) + + '' + + '' + + cityssm.escapeHTML(lotOccupancyComment.lotOccupancyComment || '') + + '' + + ('' + + '
' + + ('') + + ('') + + '
' + + '') - tableRowElement - .querySelector(".button--edit")! - .addEventListener("click", openEditLotOccupancyComment); + tableRowElement + .querySelector('.button--edit')! + .addEventListener('click', openEditLotOccupancyComment) - tableRowElement - .querySelector(".button--delete")! - .addEventListener("click", deleteLotOccupancyComment); + tableRowElement + .querySelector('.button--delete')! + .addEventListener('click', deleteLotOccupancyComment) - tableElement.querySelector("tbody")!.append(tableRowElement); - } + tableElement.querySelector('tbody')!.append(tableRowElement) + } - containerElement.innerHTML = ""; - containerElement.append(tableElement); -}; + containerElement.innerHTML = '' + containerElement.append(tableElement) +} -document.querySelector("#button--addComment")!.addEventListener("click", () => { - let addFormElement: HTMLFormElement; - let addCloseModalFunction: () => void; +document.querySelector('#button--addComment')!.addEventListener('click', () => { + let addFormElement: HTMLFormElement + let addCloseModalFunction: () => void - const addComment = (submitEvent: SubmitEvent) => { - submitEvent.preventDefault(); + const addComment = (submitEvent: SubmitEvent) => { + submitEvent.preventDefault() - cityssm.postJSON( - los.urlPrefix + "/lotOccupancies/doAddLotOccupancyComment", - addFormElement, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotOccupancyComments?: recordTypes.LotOccupancyComment[]; - }) => { - if (responseJSON.success) { - lotOccupancyComments = responseJSON.lotOccupancyComments!; - addCloseModalFunction(); - renderLotOccupancyComments(); - } else { - bulmaJS.alert({ - title: "Error Adding Comment", - message: responseJSON.errorMessage || "", - 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(); + cityssm.postJSON( + los.urlPrefix + '/lotOccupancies/doAddLotOccupancyComment', + addFormElement, + (responseJSON: { + success: boolean + errorMessage?: string + lotOccupancyComments?: recordTypes.LotOccupancyComment[] + }) => { + if (responseJSON.success) { + lotOccupancyComments = responseJSON.lotOccupancyComments! + addCloseModalFunction() + renderLotOccupancyComments() + } else { + bulmaJS.alert({ + title: 'Error Adding Comment', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) } - }); -}); + } + ) + } -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() diff --git a/public-typescript/lotOccupancyEdit/lotOccupancyEditFees.js b/public-typescript/lotOccupancyEdit/lotOccupancyEditFees.js index d659351d..684610a0 100644 --- a/public-typescript/lotOccupancyEdit/lotOccupancyEditFees.js +++ b/public-typescript/lotOccupancyEdit/lotOccupancyEditFees.js @@ -3,19 +3,20 @@ Object.defineProperty(exports, "__esModule", { value: true }); let lotOccupancyFees = exports.lotOccupancyFees; delete exports.lotOccupancyFees; -const lotOccupancyFeesContainerElement = document.querySelector("#container--lotOccupancyFees"); +const lotOccupancyFeesContainerElement = document.querySelector('#container--lotOccupancyFees'); const getFeeGrandTotal = () => { let feeGrandTotal = 0; for (const lotOccupancyFee of lotOccupancyFees) { feeGrandTotal += - (lotOccupancyFee.feeAmount + lotOccupancyFee.taxAmount) * lotOccupancyFee.quantity; + (lotOccupancyFee.feeAmount + lotOccupancyFee.taxAmount) * + lotOccupancyFee.quantity; } return feeGrandTotal; }; const deleteLotOccupancyFee = (clickEvent) => { - const feeId = clickEvent.currentTarget.closest(".container--lotOccupancyFee").dataset.feeId; + const feeId = clickEvent.currentTarget.closest('.container--lotOccupancyFee').dataset.feeId; const doDelete = () => { - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyFee", { + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyFee', { lotOccupancyId, feeId }, (responseJSON) => { @@ -25,19 +26,19 @@ const deleteLotOccupancyFee = (clickEvent) => { } else { bulmaJS.alert({ - title: "Error Deleting Fee", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Deleting Fee', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; bulmaJS.confirm({ - title: "Delete Fee", - message: "Are you sure you want to delete this fee?", - contextualColorName: "warning", + title: 'Delete Fee', + message: 'Are you sure you want to delete this fee?', + contextualColorName: 'warning', okButton: { - text: "Yes, Delete Fee", + text: 'Yes, Delete Fee', callbackFunction: doDelete } }); @@ -47,74 +48,81 @@ const renderLotOccupancyFees = () => { lotOccupancyFeesContainerElement.innerHTML = '
' + '

There are no fees associated with this record.

' + - "
"; + ''; renderLotOccupancyTransactions(); return; } lotOccupancyFeesContainerElement.innerHTML = '' + - ("" + - "" + + ('' + + '' + '' + '' + '' + '' + '' + '' + - "") + - "" + - ("" + + '') + + '' + + ('' + '' + '' + '' + - "") + - "
Fee
FeeUnit Cost×QuantityequalsTotalOptions
Subtotal
Tax
Grand Total
"; + '') + + ''; let feeAmountTotal = 0; let taxAmountTotal = 0; for (const lotOccupancyFee of lotOccupancyFees) { - const tableRowElement = document.createElement("tr"); - tableRowElement.className = "container--lotOccupancyFee"; + const tableRowElement = document.createElement('tr'); + tableRowElement.className = 'container--lotOccupancyFee'; tableRowElement.dataset.feeId = lotOccupancyFee.feeId.toString(); - tableRowElement.dataset.includeQuantity = lotOccupancyFee.includeQuantity ? "1" : "0"; + tableRowElement.dataset.includeQuantity = lotOccupancyFee.includeQuantity + ? '1' + : '0'; tableRowElement.innerHTML = '' + - cityssm.escapeHTML(lotOccupancyFee.feeName || "") + - "" + + cityssm.escapeHTML(lotOccupancyFee.feeName || '') + + '' + (lotOccupancyFee.quantity === 1 - ? "" + ? '' : '$' + lotOccupancyFee.feeAmount.toFixed(2) + - "" + - "×" + + '' + + '×' + '' + lotOccupancyFee.quantity + - "" + - "=") + + '' + + '=') + '$' + (lotOccupancyFee.feeAmount * lotOccupancyFee.quantity).toFixed(2) + - "" + + '' + ('' + '" + - ""); - tableRowElement.querySelector("button").addEventListener("click", deleteLotOccupancyFee); - lotOccupancyFeesContainerElement.querySelector("tbody").append(tableRowElement); + '' + + ''); + tableRowElement + .querySelector('button') + .addEventListener('click', deleteLotOccupancyFee); + lotOccupancyFeesContainerElement + .querySelector('tbody') + .append(tableRowElement); feeAmountTotal += lotOccupancyFee.feeAmount * 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--grandTotal").textContent = "$" + (feeAmountTotal + taxAmountTotal).toFixed(2); + ; + lotOccupancyFeesContainerElement.querySelector('#lotOccupancyFees--feeAmountTotal').textContent = '$' + feeAmountTotal.toFixed(2); + lotOccupancyFeesContainerElement.querySelector('#lotOccupancyFees--taxAmountTotal').textContent = '$' + taxAmountTotal.toFixed(2); + lotOccupancyFeesContainerElement.querySelector('#lotOccupancyFees--grandTotal').textContent = '$' + (feeAmountTotal + taxAmountTotal).toFixed(2); renderLotOccupancyTransactions(); }; -document.querySelector("#button--addFee").addEventListener("click", () => { +document.querySelector('#button--addFee').addEventListener('click', () => { if (hasUnsavedChanges) { bulmaJS.alert({ - message: "Please save all unsaved changes before adding fees.", - contextualColorName: "warning" + message: 'Please save all unsaved changes before adding fees.', + contextualColorName: 'warning' }); return; } @@ -122,7 +130,7 @@ document.querySelector("#button--addFee").addEventListener("click", () => { let feeFilterElement; let feeFilterResultsElement; const doAddFee = (feeId, quantity = 1) => { - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doAddLotOccupancyFee", { + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doAddLotOccupancyFee', { lotOccupancyId, feeId, quantity @@ -134,9 +142,9 @@ document.querySelector("#button--addFee").addEventListener("click", () => { } else { bulmaJS.alert({ - title: "Error Adding Fee", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Adding Fee', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); @@ -149,21 +157,24 @@ document.querySelector("#button--addFee").addEventListener("click", () => { doAddFee(fee.feeId, quantityElement.value); quantityCloseModalFunction(); }; - cityssm.openHtmlModal("lotOccupancy-setFeeQuantity", { + cityssm.openHtmlModal('lotOccupancy-setFeeQuantity', { onshow: (modalElement) => { - modalElement.querySelector("#lotOccupancyFeeQuantity--quantityUnit").textContent = fee.quantityUnit; + ; + modalElement.querySelector('#lotOccupancyFeeQuantity--quantityUnit').textContent = fee.quantityUnit; }, onshown: (modalElement, closeModalFunction) => { quantityCloseModalFunction = closeModalFunction; - quantityElement = modalElement.querySelector("#lotOccupancyFeeQuantity--quantity"); - modalElement.querySelector("form").addEventListener("submit", doSetQuantity); + quantityElement = modalElement.querySelector('#lotOccupancyFeeQuantity--quantity'); + modalElement + .querySelector('form') + .addEventListener('submit', doSetQuantity); } }); }; const tryAddFee = (clickEvent) => { clickEvent.preventDefault(); 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) => { return currentFeeCategory.feeCategoryId === feeCategoryId; }); @@ -178,16 +189,20 @@ document.querySelector("#button--addFee").addEventListener("click", () => { } }; const filterFees = () => { - const filterStringPieces = feeFilterElement.value.trim().toLowerCase().split(" "); - feeFilterResultsElement.innerHTML = ""; + const filterStringPieces = feeFilterElement.value + .trim() + .toLowerCase() + .split(' '); + feeFilterResultsElement.innerHTML = ''; for (const feeCategory of feeCategories) { - const categoryContainerElement = document.createElement("div"); - categoryContainerElement.className = "container--feeCategory"; - categoryContainerElement.dataset.feeCategoryId = feeCategory.feeCategoryId.toString(); + const categoryContainerElement = document.createElement('div'); + categoryContainerElement.className = 'container--feeCategory'; + categoryContainerElement.dataset.feeCategoryId = + feeCategory.feeCategoryId.toString(); categoryContainerElement.innerHTML = '

' + - cityssm.escapeHTML(feeCategory.feeCategory || "") + - "

" + + cityssm.escapeHTML(feeCategory.feeCategory || '') + + '' + '
'; let hasFees = false; for (const fee of feeCategory.fees) { @@ -207,35 +222,37 @@ document.querySelector("#button--addFee").addEventListener("click", () => { continue; } hasFees = true; - const panelBlockElement = document.createElement("a"); - panelBlockElement.className = "panel-block is-block container--fee"; + const panelBlockElement = document.createElement('a'); + panelBlockElement.className = 'panel-block is-block container--fee'; panelBlockElement.dataset.feeId = fee.feeId.toString(); - panelBlockElement.href = "#"; + panelBlockElement.href = '#'; panelBlockElement.innerHTML = - "" + - cityssm.escapeHTML(fee.feeName || "") + - "
" + - "" + - cityssm.escapeHTML(fee.feeDescription || "").replace(/\n/g, "
") + - "
"; - panelBlockElement.addEventListener("click", tryAddFee); - categoryContainerElement.querySelector(".panel").append(panelBlockElement); + '' + + cityssm.escapeHTML(fee.feeName || '') + + '
' + + '' + + cityssm + .escapeHTML(fee.feeDescription || '') + .replace(/\n/g, '
') + + '
'; + panelBlockElement.addEventListener('click', tryAddFee); + categoryContainerElement.querySelector('.panel').append(panelBlockElement); } if (hasFees) { feeFilterResultsElement.append(categoryContainerElement); } } }; - cityssm.openHtmlModal("lotOccupancy-addFee", { + cityssm.openHtmlModal('lotOccupancy-addFee', { onshow: (modalElement) => { - feeFilterElement = modalElement.querySelector("#feeSelect--feeName"); - feeFilterResultsElement = modalElement.querySelector("#resultsContainer--feeSelect"); - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doGetFees", { + feeFilterElement = modalElement.querySelector('#feeSelect--feeName'); + feeFilterResultsElement = modalElement.querySelector('#resultsContainer--feeSelect'); + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doGetFees', { lotOccupancyId }, (responseJSON) => { feeCategories = responseJSON.feeCategories; feeFilterElement.disabled = false; - feeFilterElement.addEventListener("keyup", filterFees); + feeFilterElement.addEventListener('keyup', filterFees); feeFilterElement.focus(); filterFees(); }); @@ -253,7 +270,7 @@ document.querySelector("#button--addFee").addEventListener("click", () => { }); let lotOccupancyTransactions = exports.lotOccupancyTransactions; delete exports.lotOccupancyTransactions; -const lotOccupancyTransactionsContainerElement = document.querySelector("#container--lotOccupancyTransactions"); +const lotOccupancyTransactionsContainerElement = document.querySelector('#container--lotOccupancyTransactions'); const getTransactionGrandTotal = () => { let transactionGrandTotal = 0; for (const lotOccupancyTransaction of lotOccupancyTransactions) { @@ -262,9 +279,9 @@ const getTransactionGrandTotal = () => { return transactionGrandTotal; }; const deleteLotOccupancyTransaction = (clickEvent) => { - const transactionIndex = clickEvent.currentTarget.closest(".container--lotOccupancyTransaction").dataset.transactionIndex; + const transactionIndex = clickEvent.currentTarget.closest('.container--lotOccupancyTransaction').dataset.transactionIndex; const doDelete = () => { - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyTransaction", { + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyTransaction', { lotOccupancyId, transactionIndex }, (responseJSON) => { @@ -274,19 +291,19 @@ const deleteLotOccupancyTransaction = (clickEvent) => { } else { bulmaJS.alert({ - title: "Error Deleting Transaction", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Deleting Transaction', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; bulmaJS.confirm({ - title: "Delete Trasnaction", - message: "Are you sure you want to delete this transaction?", - contextualColorName: "warning", + title: 'Delete Trasnaction', + message: 'Are you sure you want to delete this transaction?', + contextualColorName: 'warning', okButton: { - text: "Yes, Delete Transaction", + text: 'Yes, Delete Transaction', callbackFunction: doDelete } }); @@ -295,80 +312,85 @@ const renderLotOccupancyTransactions = () => { if (lotOccupancyTransactions.length === 0) { lotOccupancyTransactionsContainerElement.innerHTML = '
' + '

There are no transactions associated with this record.

' + - "
"; + ''; return; } lotOccupancyTransactionsContainerElement.innerHTML = '' + - "" + + '' + '' + - "" + + '' + '' + '' + - "" + - "" + - ("" + + '' + + '' + + ('' + '' + '' + '' + - "") + - "
Date" + + '' + cityssm.escapeHTML(exports.aliases.externalReceiptNumber) + - "AmountOptions
Transaction Total
"; + '') + + ''; let transactionGrandTotal = 0; for (const lotOccupancyTransaction of lotOccupancyTransactions) { transactionGrandTotal += lotOccupancyTransaction.transactionAmount; - const tableRowElement = document.createElement("tr"); - tableRowElement.className = "container--lotOccupancyTransaction"; + const tableRowElement = document.createElement('tr'); + tableRowElement.className = 'container--lotOccupancyTransaction'; tableRowElement.dataset.transactionIndex = lotOccupancyTransaction.transactionIndex.toString(); tableRowElement.innerHTML = - "" + + '' + lotOccupancyTransaction.transactionDateString + - "" + - ("" + - cityssm.escapeHTML(lotOccupancyTransaction.externalReceiptNumber || "") + - "
" + - "" + - cityssm.escapeHTML(lotOccupancyTransaction.transactionNote || "") + - "" + - "") + + '' + + ('' + + cityssm.escapeHTML(lotOccupancyTransaction.externalReceiptNumber || '') + + '
' + + '' + + cityssm.escapeHTML(lotOccupancyTransaction.transactionNote || '') + + '' + + '') + ('$' + lotOccupancyTransaction.transactionAmount.toFixed(2) + - "") + + '') + ('' + '" + - ""); + '' + + ''); tableRowElement - .querySelector("button") - .addEventListener("click", deleteLotOccupancyTransaction); - lotOccupancyTransactionsContainerElement.querySelector("tbody").append(tableRowElement); + .querySelector('button') + .addEventListener('click', deleteLotOccupancyTransaction); + lotOccupancyTransactionsContainerElement + .querySelector('tbody') + .append(tableRowElement); } - lotOccupancyTransactionsContainerElement.querySelector("#lotOccupancyTransactions--grandTotal").textContent = "$" + transactionGrandTotal.toFixed(2); + ; + lotOccupancyTransactionsContainerElement.querySelector('#lotOccupancyTransactions--grandTotal').textContent = '$' + transactionGrandTotal.toFixed(2); const feeGrandTotal = getFeeGrandTotal(); if (feeGrandTotal > transactionGrandTotal) { - lotOccupancyTransactionsContainerElement.insertAdjacentHTML("afterbegin", '
' + + lotOccupancyTransactionsContainerElement.insertAdjacentHTML('afterbegin', '
' + '
' + '
' + '
Outstanding Balance
' + '
$' + (feeGrandTotal - transactionGrandTotal).toFixed(2) + - "
" + - "
" + - "
" + - "
"); + '
' + + '' + + '' + + ''); } }; -document.querySelector("#button--addTransaction").addEventListener("click", () => { +document + .querySelector('#button--addTransaction') + .addEventListener('click', () => { let addCloseModalFunction; const doAddTransaction = (submitEvent) => { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doAddLotOccupancyTransaction", submitEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doAddLotOccupancyTransaction', submitEvent.currentTarget, (responseJSON) => { if (responseJSON.success) { lotOccupancyTransactions = responseJSON.lotOccupancyTransactions; addCloseModalFunction(); @@ -376,20 +398,20 @@ document.querySelector("#button--addTransaction").addEventListener("click", () = } else { bulmaJS.confirm({ - title: "Error Adding Transaction", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Adding Transaction', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; - cityssm.openHtmlModal("lotOccupancy-addTransaction", { + cityssm.openHtmlModal('lotOccupancy-addTransaction', { onshow: (modalElement) => { los.populateAliases(modalElement); - modalElement.querySelector("#lotOccupancyTransactionAdd--lotOccupancyId").value = lotOccupancyId.toString(); + modalElement.querySelector('#lotOccupancyTransactionAdd--lotOccupancyId').value = lotOccupancyId.toString(); const feeGrandTotal = getFeeGrandTotal(); const transactionGrandTotal = getTransactionGrandTotal(); - const transactionAmountElement = modalElement.querySelector("#lotOccupancyTransactionAdd--transactionAmount"); + const transactionAmountElement = modalElement.querySelector('#lotOccupancyTransactionAdd--transactionAmount'); transactionAmountElement.min = (-1 * transactionGrandTotal).toFixed(2); transactionAmountElement.max = 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) => { bulmaJS.toggleHtmlClipped(); addCloseModalFunction = closeModalFunction; - modalElement.querySelector("form").addEventListener("submit", doAddTransaction); + modalElement + .querySelector('form') + .addEventListener('submit', doAddTransaction); }, onremoved: () => { bulmaJS.toggleHtmlClipped(); diff --git a/public-typescript/lotOccupancyEdit/lotOccupancyEditFees.ts b/public-typescript/lotOccupancyEdit/lotOccupancyEditFees.ts index e8e745f8..97dc0142 100644 --- a/public-typescript/lotOccupancyEdit/lotOccupancyEditFees.ts +++ b/public-typescript/lotOccupancyEdit/lotOccupancyEditFees.ts @@ -1,602 +1,628 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ -import type * as globalTypes from "../../types/globalTypes"; -import type * as recordTypes from "../../types/recordTypes"; +import type * as globalTypes from '../../types/globalTypes' +import type * as recordTypes from '../../types/recordTypes' -import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; +import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types' -import type { BulmaJS } from "@cityssm/bulma-js/types"; +import type { BulmaJS } from '@cityssm/bulma-js/types' -declare const cityssm: cityssmGlobal; -declare const bulmaJS: BulmaJS; +declare const cityssm: cityssmGlobal +declare const bulmaJS: BulmaJS -declare const los: globalTypes.LOS; +declare const los: globalTypes.LOS -declare const lotOccupancyId: string; -declare const hasUnsavedChanges: boolean; +declare const lotOccupancyId: string +declare const hasUnsavedChanges: boolean -let lotOccupancyFees: recordTypes.LotOccupancyFee[] = exports.lotOccupancyFees; -delete exports.lotOccupancyFees; +let lotOccupancyFees: recordTypes.LotOccupancyFee[] = exports.lotOccupancyFees +delete exports.lotOccupancyFees const lotOccupancyFeesContainerElement = document.querySelector( - "#container--lotOccupancyFees" -) as HTMLElement; + '#container--lotOccupancyFees' +) as HTMLElement const getFeeGrandTotal = (): number => { - let feeGrandTotal = 0; + let feeGrandTotal = 0 - for (const lotOccupancyFee of lotOccupancyFees) { - feeGrandTotal += - (lotOccupancyFee.feeAmount! + lotOccupancyFee.taxAmount!) * lotOccupancyFee.quantity!; - } + for (const lotOccupancyFee of lotOccupancyFees) { + feeGrandTotal += + (lotOccupancyFee.feeAmount! + lotOccupancyFee.taxAmount!) * + lotOccupancyFee.quantity! + } - return feeGrandTotal; -}; + return feeGrandTotal +} const deleteLotOccupancyFee = (clickEvent: Event) => { - const feeId = ( - (clickEvent.currentTarget as HTMLElement).closest( - ".container--lotOccupancyFee" - ) as HTMLElement - ).dataset.feeId; + const feeId = ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--lotOccupancyFee' + ) as HTMLElement + ).dataset.feeId - const doDelete = () => { - cityssm.postJSON( - los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyFee", - { - lotOccupancyId, - feeId - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotOccupancyFees?: recordTypes.LotOccupancyFee[]; - }) => { - if (responseJSON.success) { - lotOccupancyFees = responseJSON.lotOccupancyFees!; - renderLotOccupancyFees(); - } else { - bulmaJS.alert({ - title: "Error Deleting Fee", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }; - - bulmaJS.confirm({ - title: "Delete Fee", - message: "Are you sure you want to delete this fee?", - contextualColorName: "warning", - okButton: { - text: "Yes, Delete Fee", - callbackFunction: doDelete + const doDelete = () => { + cityssm.postJSON( + los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyFee', + { + lotOccupancyId, + feeId + }, + (responseJSON: { + success: boolean + errorMessage?: string + lotOccupancyFees?: recordTypes.LotOccupancyFee[] + }) => { + if (responseJSON.success) { + lotOccupancyFees = responseJSON.lotOccupancyFees! + renderLotOccupancyFees() + } else { + bulmaJS.alert({ + title: 'Error Deleting Fee', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) } - }); -}; + } + ) + } + + bulmaJS.confirm({ + title: 'Delete Fee', + message: 'Are you sure you want to delete this fee?', + contextualColorName: 'warning', + okButton: { + text: 'Yes, Delete Fee', + callbackFunction: doDelete + } + }) +} const renderLotOccupancyFees = () => { - if (lotOccupancyFees.length === 0) { - lotOccupancyFeesContainerElement.innerHTML = - '
' + - '

There are no fees associated with this record.

' + - "
"; - - renderLotOccupancyTransactions(); - - return; - } - + if (lotOccupancyFees.length === 0) { lotOccupancyFeesContainerElement.innerHTML = - '' + - ("" + - "" + - '' + - '' + - '' + - '' + - '' + - '' + - "") + - "" + - ("" + - '' + - '' + - '' + - "") + - "
FeeUnit Cost×QuantityequalsTotalOptions
Subtotal
Tax
Grand Total
"; + '
' + + '

There are no fees associated with this record.

' + + '
' - let feeAmountTotal = 0; - let taxAmountTotal = 0; + renderLotOccupancyTransactions() - for (const lotOccupancyFee of lotOccupancyFees) { - const tableRowElement = document.createElement("tr"); - tableRowElement.className = "container--lotOccupancyFee"; - tableRowElement.dataset.feeId = lotOccupancyFee.feeId!.toString(); - tableRowElement.dataset.includeQuantity = lotOccupancyFee.includeQuantity ? "1" : "0"; + return + } - tableRowElement.innerHTML = - '' + - cityssm.escapeHTML(lotOccupancyFee.feeName || "") + - "" + - (lotOccupancyFee.quantity === 1 - ? "" - : '$' + - lotOccupancyFee.feeAmount!.toFixed(2) + - "" + - "×" + - '' + - lotOccupancyFee.quantity + - "" + - "=") + - '$' + - (lotOccupancyFee.feeAmount! * lotOccupancyFee.quantity!).toFixed(2) + - "" + - ('' + - '" + - ""); + lotOccupancyFeesContainerElement.innerHTML = + '' + + ('' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '') + + '' + + ('' + + '' + + '' + + '' + + '') + + '
FeeUnit Cost×QuantityequalsTotalOptions
Subtotal
Tax
Grand Total
' - tableRowElement.querySelector("button")!.addEventListener("click", deleteLotOccupancyFee); + let feeAmountTotal = 0 + let taxAmountTotal = 0 - lotOccupancyFeesContainerElement.querySelector("tbody")!.append(tableRowElement); + for (const lotOccupancyFee of lotOccupancyFees) { + const tableRowElement = document.createElement('tr') + tableRowElement.className = 'container--lotOccupancyFee' + tableRowElement.dataset.feeId = lotOccupancyFee.feeId!.toString() + tableRowElement.dataset.includeQuantity = lotOccupancyFee.includeQuantity + ? '1' + : '0' - feeAmountTotal += lotOccupancyFee.feeAmount! * lotOccupancyFee.quantity!; - taxAmountTotal += lotOccupancyFee.taxAmount! * lotOccupancyFee.quantity!; - } + tableRowElement.innerHTML = + '' + + cityssm.escapeHTML(lotOccupancyFee.feeName || '') + + '' + + (lotOccupancyFee.quantity === 1 + ? '' + : '$' + + lotOccupancyFee.feeAmount!.toFixed(2) + + '' + + '×' + + '' + + lotOccupancyFee.quantity + + '' + + '=') + + '$' + + (lotOccupancyFee.feeAmount! * lotOccupancyFee.quantity!).toFixed(2) + + '' + + ('' + + '' + + '') - ( - lotOccupancyFeesContainerElement.querySelector( - "#lotOccupancyFees--feeAmountTotal" - ) as HTMLElement - ).textContent = "$" + feeAmountTotal.toFixed(2); - ( - lotOccupancyFeesContainerElement.querySelector( - "#lotOccupancyFees--taxAmountTotal" - ) as HTMLElement - ).textContent = "$" + taxAmountTotal.toFixed(2); - ( - lotOccupancyFeesContainerElement.querySelector( - "#lotOccupancyFees--grandTotal" - ) as HTMLElement - ).textContent = "$" + (feeAmountTotal + taxAmountTotal).toFixed(2); + tableRowElement + .querySelector('button')! + .addEventListener('click', deleteLotOccupancyFee) - renderLotOccupancyTransactions(); -}; + lotOccupancyFeesContainerElement + .querySelector('tbody')! + .append(tableRowElement) -document.querySelector("#button--addFee")!.addEventListener("click", () => { - if (hasUnsavedChanges) { - bulmaJS.alert({ - message: "Please save all unsaved changes before adding fees.", - contextualColorName: "warning" - }); - return; - } + feeAmountTotal += lotOccupancyFee.feeAmount! * lotOccupancyFee.quantity! + taxAmountTotal += lotOccupancyFee.taxAmount! * lotOccupancyFee.quantity! + } - let feeCategories: recordTypes.FeeCategory[]; + ;( + lotOccupancyFeesContainerElement.querySelector( + '#lotOccupancyFees--feeAmountTotal' + ) as HTMLElement + ).textContent = '$' + feeAmountTotal.toFixed(2) + ;( + lotOccupancyFeesContainerElement.querySelector( + '#lotOccupancyFees--taxAmountTotal' + ) as HTMLElement + ).textContent = '$' + taxAmountTotal.toFixed(2) + ;( + lotOccupancyFeesContainerElement.querySelector( + '#lotOccupancyFees--grandTotal' + ) as HTMLElement + ).textContent = '$' + (feeAmountTotal + taxAmountTotal).toFixed(2) - let feeFilterElement: HTMLInputElement; - let feeFilterResultsElement: HTMLElement; + renderLotOccupancyTransactions() +} - const doAddFee = (feeId: number, quantity: number | string = 1) => { - cityssm.postJSON( - los.urlPrefix + "/lotOccupancies/doAddLotOccupancyFee", - { - lotOccupancyId, - feeId, - quantity - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotOccupancyFees?: recordTypes.LotOccupancyFee[]; - }) => { - if (responseJSON.success) { - lotOccupancyFees = responseJSON.lotOccupancyFees!; - renderLotOccupancyFees(); - filterFees(); - } else { - bulmaJS.alert({ - title: "Error Adding Fee", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }; +document.querySelector('#button--addFee')!.addEventListener('click', () => { + if (hasUnsavedChanges) { + bulmaJS.alert({ + message: 'Please save all unsaved changes before adding fees.', + contextualColorName: 'warning' + }) + return + } - const doSetQuantityAndAddFee = (fee: recordTypes.Fee) => { - let quantityElement: HTMLInputElement; - let quantityCloseModalFunction: () => void; + let feeCategories: recordTypes.FeeCategory[] - const doSetQuantity = (submitEvent: SubmitEvent) => { - submitEvent.preventDefault(); - doAddFee(fee.feeId!, quantityElement.value); - quantityCloseModalFunction(); - }; + let feeFilterElement: HTMLInputElement + let feeFilterResultsElement: HTMLElement - cityssm.openHtmlModal("lotOccupancy-setFeeQuantity", { - onshow: (modalElement) => { - ( - modalElement.querySelector( - "#lotOccupancyFeeQuantity--quantityUnit" - ) as HTMLElement - ).textContent = fee.quantityUnit!; - }, - onshown: (modalElement, closeModalFunction) => { - quantityCloseModalFunction = closeModalFunction; - - quantityElement = modalElement.querySelector( - "#lotOccupancyFeeQuantity--quantity" - ) as HTMLInputElement; - - modalElement.querySelector("form")!.addEventListener("submit", doSetQuantity); - } - }); - }; - - const tryAddFee = (clickEvent: Event) => { - clickEvent.preventDefault(); - - const feeId = Number.parseInt((clickEvent.currentTarget as HTMLElement).dataset.feeId!, 10); - const feeCategoryId = Number.parseInt( - ( - (clickEvent.currentTarget as HTMLElement).closest( - ".container--feeCategory" - ) as HTMLElement - ).dataset.feeCategoryId!, - 10 - ); - - const feeCategory = feeCategories.find((currentFeeCategory) => { - return currentFeeCategory.feeCategoryId === feeCategoryId; - })!; - - const fee = feeCategory.fees!.find((currentFee) => { - return currentFee.feeId === feeId; - })!; - - if (fee.includeQuantity) { - doSetQuantityAndAddFee(fee); + const doAddFee = (feeId: number, quantity: number | string = 1) => { + cityssm.postJSON( + los.urlPrefix + '/lotOccupancies/doAddLotOccupancyFee', + { + lotOccupancyId, + feeId, + quantity + }, + (responseJSON: { + success: boolean + errorMessage?: string + lotOccupancyFees?: recordTypes.LotOccupancyFee[] + }) => { + if (responseJSON.success) { + lotOccupancyFees = responseJSON.lotOccupancyFees! + renderLotOccupancyFees() + filterFees() } else { - doAddFee(feeId); + bulmaJS.alert({ + title: 'Error Adding Fee', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) } - }; + } + ) + } - const filterFees = () => { - const filterStringPieces = feeFilterElement.value.trim().toLowerCase().split(" "); + const doSetQuantityAndAddFee = (fee: recordTypes.Fee) => { + let quantityElement: HTMLInputElement + let quantityCloseModalFunction: () => void - feeFilterResultsElement.innerHTML = ""; + const doSetQuantity = (submitEvent: SubmitEvent) => { + submitEvent.preventDefault() + doAddFee(fee.feeId!, quantityElement.value) + quantityCloseModalFunction() + } - for (const feeCategory of feeCategories) { - const categoryContainerElement = document.createElement("div"); - categoryContainerElement.className = "container--feeCategory"; - categoryContainerElement.dataset.feeCategoryId = feeCategory.feeCategoryId!.toString(); - categoryContainerElement.innerHTML = - '

' + - cityssm.escapeHTML(feeCategory.feeCategory || "") + - "

" + - '
'; + cityssm.openHtmlModal('lotOccupancy-setFeeQuantity', { + onshow: (modalElement) => { + ;( + modalElement.querySelector( + '#lotOccupancyFeeQuantity--quantityUnit' + ) as HTMLElement + ).textContent = fee.quantityUnit! + }, + onshown: (modalElement, closeModalFunction) => { + quantityCloseModalFunction = closeModalFunction - let hasFees = false; + quantityElement = modalElement.querySelector( + '#lotOccupancyFeeQuantity--quantity' + ) as HTMLInputElement - for (const fee of feeCategory.fees!) { - if ( - lotOccupancyFeesContainerElement.querySelector( - ".container--lotOccupancyFee[data-fee-id='" + - fee.feeId + - "'][data-include-quantity='0']" - ) - ) { - continue; - } + modalElement + .querySelector('form')! + .addEventListener('submit', doSetQuantity) + } + }) + } - let includeFee = true; + const tryAddFee = (clickEvent: Event) => { + clickEvent.preventDefault() - for (const filterStringPiece of filterStringPieces) { - if (!fee.feeName!.toLowerCase().includes(filterStringPiece)) { - includeFee = false; - break; - } - } + const feeId = Number.parseInt( + (clickEvent.currentTarget as HTMLElement).dataset.feeId!, + 10 + ) + const feeCategoryId = Number.parseInt( + ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--feeCategory' + ) as HTMLElement + ).dataset.feeCategoryId!, + 10 + ) - if (!includeFee) { - continue; - } + const feeCategory = feeCategories.find((currentFeeCategory) => { + return currentFeeCategory.feeCategoryId === feeCategoryId + })! - hasFees = true; + const fee = feeCategory.fees!.find((currentFee) => { + return currentFee.feeId === feeId + })! - const panelBlockElement = document.createElement("a"); - panelBlockElement.className = "panel-block is-block container--fee"; - panelBlockElement.dataset.feeId = fee.feeId!.toString(); - panelBlockElement.href = "#"; + if (fee.includeQuantity) { + doSetQuantityAndAddFee(fee) + } else { + doAddFee(feeId) + } + } - panelBlockElement.innerHTML = - "" + - cityssm.escapeHTML(fee.feeName || "") + - "
" + - "" + - cityssm.escapeHTML(fee.feeDescription || "").replace(/\n/g, "
") + - "
"; + const filterFees = () => { + const filterStringPieces = feeFilterElement.value + .trim() + .toLowerCase() + .split(' ') - panelBlockElement.addEventListener("click", tryAddFee); + feeFilterResultsElement.innerHTML = '' - (categoryContainerElement.querySelector(".panel") as HTMLElement).append( - panelBlockElement - ); - } + for (const feeCategory of feeCategories) { + const categoryContainerElement = document.createElement('div') + categoryContainerElement.className = 'container--feeCategory' + categoryContainerElement.dataset.feeCategoryId = + feeCategory.feeCategoryId!.toString() + categoryContainerElement.innerHTML = + '

' + + cityssm.escapeHTML(feeCategory.feeCategory || '') + + '

' + + '
' - if (hasFees) { - feeFilterResultsElement.append(categoryContainerElement); - } + let hasFees = false + + for (const fee of feeCategory.fees!) { + if ( + lotOccupancyFeesContainerElement.querySelector( + ".container--lotOccupancyFee[data-fee-id='" + + fee.feeId + + "'][data-include-quantity='0']" + ) + ) { + continue } - }; - cityssm.openHtmlModal("lotOccupancy-addFee", { - onshow: (modalElement) => { - feeFilterElement = modalElement.querySelector( - "#feeSelect--feeName" - ) as HTMLInputElement; + let includeFee = true - feeFilterResultsElement = modalElement.querySelector( - "#resultsContainer--feeSelect" - ) as HTMLElement; - - cityssm.postJSON( - los.urlPrefix + "/lotOccupancies/doGetFees", - { - lotOccupancyId - }, - (responseJSON: { feeCategories: recordTypes.FeeCategory[] }) => { - feeCategories = responseJSON.feeCategories; - - feeFilterElement.disabled = false; - feeFilterElement.addEventListener("keyup", filterFees); - feeFilterElement.focus(); - - filterFees(); - } - ); - }, - onshown: () => { - bulmaJS.toggleHtmlClipped(); - }, - onhidden: () => { - renderLotOccupancyFees(); - }, - onremoved: () => { - bulmaJS.toggleHtmlClipped(); + for (const filterStringPiece of filterStringPieces) { + if (!fee.feeName!.toLowerCase().includes(filterStringPiece)) { + includeFee = false + break + } } - }); -}); + + if (!includeFee) { + continue + } + + hasFees = true + + const panelBlockElement = document.createElement('a') + panelBlockElement.className = 'panel-block is-block container--fee' + panelBlockElement.dataset.feeId = fee.feeId!.toString() + panelBlockElement.href = '#' + + panelBlockElement.innerHTML = + '' + + cityssm.escapeHTML(fee.feeName || '') + + '
' + + '' + + cityssm + .escapeHTML(fee.feeDescription || '') + .replace(/\n/g, '
') + + '
' + + panelBlockElement.addEventListener('click', tryAddFee) + + ;( + categoryContainerElement.querySelector('.panel') as HTMLElement + ).append(panelBlockElement) + } + + if (hasFees) { + feeFilterResultsElement.append(categoryContainerElement) + } + } + } + + cityssm.openHtmlModal('lotOccupancy-addFee', { + onshow: (modalElement) => { + feeFilterElement = modalElement.querySelector( + '#feeSelect--feeName' + ) as HTMLInputElement + + feeFilterResultsElement = modalElement.querySelector( + '#resultsContainer--feeSelect' + ) as HTMLElement + + cityssm.postJSON( + los.urlPrefix + '/lotOccupancies/doGetFees', + { + lotOccupancyId + }, + (responseJSON: { feeCategories: recordTypes.FeeCategory[] }) => { + feeCategories = responseJSON.feeCategories + + feeFilterElement.disabled = false + feeFilterElement.addEventListener('keyup', filterFees) + feeFilterElement.focus() + + filterFees() + } + ) + }, + onshown: () => { + bulmaJS.toggleHtmlClipped() + }, + onhidden: () => { + renderLotOccupancyFees() + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped() + } + }) +}) let lotOccupancyTransactions: recordTypes.LotOccupancyTransaction[] = - exports.lotOccupancyTransactions; -delete exports.lotOccupancyTransactions; + exports.lotOccupancyTransactions +delete exports.lotOccupancyTransactions const lotOccupancyTransactionsContainerElement = document.querySelector( - "#container--lotOccupancyTransactions" -) as HTMLElement; + '#container--lotOccupancyTransactions' +) as HTMLElement const getTransactionGrandTotal = (): number => { - let transactionGrandTotal = 0; + let transactionGrandTotal = 0 - for (const lotOccupancyTransaction of lotOccupancyTransactions) { - transactionGrandTotal += lotOccupancyTransaction.transactionAmount; - } + for (const lotOccupancyTransaction of lotOccupancyTransactions) { + transactionGrandTotal += lotOccupancyTransaction.transactionAmount + } - return transactionGrandTotal; -}; + return transactionGrandTotal +} const deleteLotOccupancyTransaction = (clickEvent: Event) => { - const transactionIndex = ( - (clickEvent.currentTarget as HTMLElement).closest( - ".container--lotOccupancyTransaction" - ) as HTMLElement - ).dataset.transactionIndex; + const transactionIndex = ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--lotOccupancyTransaction' + ) as HTMLElement + ).dataset.transactionIndex - const doDelete = () => { - cityssm.postJSON( - los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyTransaction", - { - lotOccupancyId, - transactionIndex - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotOccupancyTransactions?: recordTypes.LotOccupancyTransaction[]; - }) => { - if (responseJSON.success) { - lotOccupancyTransactions = responseJSON.lotOccupancyTransactions!; - renderLotOccupancyTransactions(); - } else { - bulmaJS.alert({ - title: "Error Deleting Transaction", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }; - - bulmaJS.confirm({ - title: "Delete Trasnaction", - message: "Are you sure you want to delete this transaction?", - contextualColorName: "warning", - okButton: { - text: "Yes, Delete Transaction", - callbackFunction: doDelete + const doDelete = () => { + cityssm.postJSON( + los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyTransaction', + { + lotOccupancyId, + transactionIndex + }, + (responseJSON: { + success: boolean + errorMessage?: string + lotOccupancyTransactions?: recordTypes.LotOccupancyTransaction[] + }) => { + if (responseJSON.success) { + lotOccupancyTransactions = responseJSON.lotOccupancyTransactions! + renderLotOccupancyTransactions() + } else { + bulmaJS.alert({ + title: 'Error Deleting Transaction', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) } - }); -}; + } + ) + } + + bulmaJS.confirm({ + title: 'Delete Trasnaction', + message: 'Are you sure you want to delete this transaction?', + contextualColorName: 'warning', + okButton: { + text: 'Yes, Delete Transaction', + callbackFunction: doDelete + } + }) +} const renderLotOccupancyTransactions = () => { - if (lotOccupancyTransactions.length === 0) { - lotOccupancyTransactionsContainerElement.innerHTML = - '
' + - '

There are no transactions associated with this record.

' + - "
"; - - return; - } - + if (lotOccupancyTransactions.length === 0) { lotOccupancyTransactionsContainerElement.innerHTML = - '' + - "" + - '' + - "" + - '' + - '' + - "" + - "" + - ("" + - '' + - '' + - '' + - "") + - "
Date" + - cityssm.escapeHTML(exports.aliases.externalReceiptNumber) + - "AmountOptions
Transaction Total
"; + '
' + + '

There are no transactions associated with this record.

' + + '
' - let transactionGrandTotal = 0; + return + } - for (const lotOccupancyTransaction of lotOccupancyTransactions) { - transactionGrandTotal += lotOccupancyTransaction.transactionAmount; + lotOccupancyTransactionsContainerElement.innerHTML = + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + ('' + + '' + + '' + + '' + + '') + + '
Date' + + cityssm.escapeHTML(exports.aliases.externalReceiptNumber) + + 'AmountOptions
Transaction Total
' - const tableRowElement = document.createElement("tr"); - tableRowElement.className = "container--lotOccupancyTransaction"; - tableRowElement.dataset.transactionIndex = - lotOccupancyTransaction.transactionIndex!.toString(); + let transactionGrandTotal = 0 - tableRowElement.innerHTML = - "" + - lotOccupancyTransaction.transactionDateString + - "" + - ("" + - cityssm.escapeHTML(lotOccupancyTransaction.externalReceiptNumber || "") + - "
" + - "" + - cityssm.escapeHTML(lotOccupancyTransaction.transactionNote || "") + - "" + - "") + - ('$' + - lotOccupancyTransaction.transactionAmount.toFixed(2) + - "") + - ('' + - '" + - ""); + for (const lotOccupancyTransaction of lotOccupancyTransactions) { + transactionGrandTotal += lotOccupancyTransaction.transactionAmount - tableRowElement - .querySelector("button")! - .addEventListener("click", deleteLotOccupancyTransaction); + const tableRowElement = document.createElement('tr') + tableRowElement.className = 'container--lotOccupancyTransaction' + tableRowElement.dataset.transactionIndex = + lotOccupancyTransaction.transactionIndex!.toString() - lotOccupancyTransactionsContainerElement.querySelector("tbody")!.append(tableRowElement); - } + tableRowElement.innerHTML = + '' + + lotOccupancyTransaction.transactionDateString + + '' + + ('' + + cityssm.escapeHTML( + lotOccupancyTransaction.externalReceiptNumber || '' + ) + + '
' + + '' + + cityssm.escapeHTML(lotOccupancyTransaction.transactionNote || '') + + '' + + '') + + ('$' + + lotOccupancyTransaction.transactionAmount.toFixed(2) + + '') + + ('' + + '' + + '') - ( - lotOccupancyTransactionsContainerElement.querySelector( - "#lotOccupancyTransactions--grandTotal" - ) as HTMLElement - ).textContent = "$" + transactionGrandTotal.toFixed(2); + tableRowElement + .querySelector('button')! + .addEventListener('click', deleteLotOccupancyTransaction) - const feeGrandTotal = getFeeGrandTotal(); + lotOccupancyTransactionsContainerElement + .querySelector('tbody')! + .append(tableRowElement) + } - if (feeGrandTotal > transactionGrandTotal) { - lotOccupancyTransactionsContainerElement.insertAdjacentHTML( - "afterbegin", - '
' + - '
' + - '
' + - '
Outstanding Balance
' + - '
$' + - (feeGrandTotal - transactionGrandTotal).toFixed(2) + - "
" + - "
" + - "
" + - "
" - ); - } -}; + ;( + lotOccupancyTransactionsContainerElement.querySelector( + '#lotOccupancyTransactions--grandTotal' + ) as HTMLElement + ).textContent = '$' + transactionGrandTotal.toFixed(2) -document.querySelector("#button--addTransaction")!.addEventListener("click", () => { - let addCloseModalFunction: () => void; + const feeGrandTotal = getFeeGrandTotal() + + if (feeGrandTotal > transactionGrandTotal) { + lotOccupancyTransactionsContainerElement.insertAdjacentHTML( + 'afterbegin', + '
' + + '
' + + '
' + + '
Outstanding Balance
' + + '
$' + + (feeGrandTotal - transactionGrandTotal).toFixed(2) + + '
' + + '
' + + '
' + + '
' + ) + } +} + +document + .querySelector('#button--addTransaction')! + .addEventListener('click', () => { + let addCloseModalFunction: () => void const doAddTransaction = (submitEvent: SubmitEvent) => { - submitEvent.preventDefault(); + submitEvent.preventDefault() - cityssm.postJSON( - los.urlPrefix + "/lotOccupancies/doAddLotOccupancyTransaction", - submitEvent.currentTarget, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotOccupancyTransactions?: recordTypes.LotOccupancyTransaction[]; - }) => { - if (responseJSON.success) { - lotOccupancyTransactions = responseJSON.lotOccupancyTransactions!; - addCloseModalFunction(); - renderLotOccupancyTransactions(); - } else { - bulmaJS.confirm({ - title: "Error Adding Transaction", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }; - - cityssm.openHtmlModal("lotOccupancy-addTransaction", { - onshow: (modalElement) => { - los.populateAliases(modalElement); - - ( - modalElement.querySelector( - "#lotOccupancyTransactionAdd--lotOccupancyId" - ) as HTMLInputElement - ).value = lotOccupancyId.toString(); - - const feeGrandTotal = getFeeGrandTotal(); - const transactionGrandTotal = getTransactionGrandTotal(); - - const transactionAmountElement = modalElement.querySelector( - "#lotOccupancyTransactionAdd--transactionAmount" - ) as HTMLInputElement; - - transactionAmountElement.min = (-1 * transactionGrandTotal).toFixed(2); - transactionAmountElement.max = Math.max( - feeGrandTotal - transactionGrandTotal, - 0 - ).toFixed(2); - transactionAmountElement.value = Math.max( - feeGrandTotal - transactionGrandTotal, - 0 - ).toFixed(2); - }, - onshown: (modalElement, closeModalFunction) => { - bulmaJS.toggleHtmlClipped(); - - addCloseModalFunction = closeModalFunction; - - modalElement.querySelector("form")!.addEventListener("submit", doAddTransaction); - }, - onremoved: () => { - bulmaJS.toggleHtmlClipped(); + cityssm.postJSON( + los.urlPrefix + '/lotOccupancies/doAddLotOccupancyTransaction', + submitEvent.currentTarget, + (responseJSON: { + success: boolean + errorMessage?: string + lotOccupancyTransactions?: recordTypes.LotOccupancyTransaction[] + }) => { + if (responseJSON.success) { + lotOccupancyTransactions = responseJSON.lotOccupancyTransactions! + addCloseModalFunction() + renderLotOccupancyTransactions() + } else { + bulmaJS.confirm({ + title: 'Error Adding Transaction', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } } - }); -}); + ) + } -renderLotOccupancyFees(); + cityssm.openHtmlModal('lotOccupancy-addTransaction', { + onshow: (modalElement) => { + los.populateAliases(modalElement) + + ;( + modalElement.querySelector( + '#lotOccupancyTransactionAdd--lotOccupancyId' + ) as HTMLInputElement + ).value = lotOccupancyId.toString() + + const feeGrandTotal = getFeeGrandTotal() + const transactionGrandTotal = getTransactionGrandTotal() + + const transactionAmountElement = modalElement.querySelector( + '#lotOccupancyTransactionAdd--transactionAmount' + ) as HTMLInputElement + + transactionAmountElement.min = (-1 * transactionGrandTotal).toFixed(2) + transactionAmountElement.max = Math.max( + feeGrandTotal - transactionGrandTotal, + 0 + ).toFixed(2) + transactionAmountElement.value = Math.max( + feeGrandTotal - transactionGrandTotal, + 0 + ).toFixed(2) + }, + onshown: (modalElement, closeModalFunction) => { + bulmaJS.toggleHtmlClipped() + + addCloseModalFunction = closeModalFunction + + modalElement + .querySelector('form')! + .addEventListener('submit', doAddTransaction) + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped() + } + }) + }) + +renderLotOccupancyFees() diff --git a/public-typescript/lotOccupancyEdit/lotOccupancyEditOccupants.js b/public-typescript/lotOccupancyEdit/lotOccupancyEditOccupants.js index ac635cda..2fa6c869 100644 --- a/public-typescript/lotOccupancyEdit/lotOccupancyEditOccupants.js +++ b/public-typescript/lotOccupancyEdit/lotOccupancyEditOccupants.js @@ -3,7 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); let lotOccupancyOccupants; 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) => { return currentLotOccupancyOccupant.lotOccupantIndex === lotOccupantIndex; }); @@ -11,7 +12,7 @@ const openEditLotOccupancyOccupant = (clickEvent) => { let editCloseModalFunction; const editOccupant = (submitEvent) => { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doUpdateLotOccupancyOccupant", editFormElement, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doUpdateLotOccupancyOccupant', editFormElement, (responseJSON) => { if (responseJSON.success) { lotOccupancyOccupants = responseJSON.lotOccupancyOccupants; editCloseModalFunction(); @@ -19,52 +20,55 @@ const openEditLotOccupancyOccupant = (clickEvent) => { } else { bulmaJS.alert({ - title: "Error Updating " + exports.aliases.occupant, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Updating ' + exports.aliases.occupant, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; - cityssm.openHtmlModal("lotOccupancy-editOccupant", { + cityssm.openHtmlModal('lotOccupancy-editOccupant', { onshow: (modalElement) => { los.populateAliases(modalElement); - modalElement.querySelector("#lotOccupancyOccupantEdit--lotOccupancyId").value = lotOccupancyId; - modalElement.querySelector("#lotOccupancyOccupantEdit--lotOccupantIndex").value = lotOccupantIndex.toString(); - const lotOccupantTypeSelectElement = modalElement.querySelector("#lotOccupancyOccupantEdit--lotOccupantTypeId"); + modalElement.querySelector('#lotOccupancyOccupantEdit--lotOccupancyId').value = lotOccupancyId; + modalElement.querySelector('#lotOccupancyOccupantEdit--lotOccupantIndex').value = lotOccupantIndex.toString(); + const lotOccupantTypeSelectElement = modalElement.querySelector('#lotOccupancyOccupantEdit--lotOccupantTypeId'); let lotOccupantTypeSelected = false; for (const lotOccupantType of exports.lotOccupantTypes) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = lotOccupantType.lotOccupantTypeId.toString(); optionElement.textContent = lotOccupantType.lotOccupantType; - if (lotOccupantType.lotOccupantTypeId === lotOccupancyOccupant.lotOccupantTypeId) { + if (lotOccupantType.lotOccupantTypeId === + lotOccupancyOccupant.lotOccupantTypeId) { optionElement.selected = true; lotOccupantTypeSelected = true; } lotOccupantTypeSelectElement.append(optionElement); } if (!lotOccupantTypeSelected) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = lotOccupancyOccupant.lotOccupantTypeId.toString(); - optionElement.textContent = lotOccupancyOccupant.lotOccupantType; + optionElement.textContent = + lotOccupancyOccupant.lotOccupantType; optionElement.selected = true; lotOccupantTypeSelectElement.append(optionElement); } - modalElement.querySelector("#lotOccupancyOccupantEdit--occupantName").value = lotOccupancyOccupant.occupantName; - modalElement.querySelector("#lotOccupancyOccupantEdit--occupantAddress1").value = lotOccupancyOccupant.occupantAddress1; - modalElement.querySelector("#lotOccupancyOccupantEdit--occupantAddress2").value = lotOccupancyOccupant.occupantAddress2; - modalElement.querySelector("#lotOccupancyOccupantEdit--occupantCity").value = lotOccupancyOccupant.occupantCity; - modalElement.querySelector("#lotOccupancyOccupantEdit--occupantProvince").value = lotOccupancyOccupant.occupantProvince; - modalElement.querySelector("#lotOccupancyOccupantEdit--occupantPostalCode").value = lotOccupancyOccupant.occupantPostalCode; - modalElement.querySelector("#lotOccupancyOccupantEdit--occupantPhoneNumber").value = lotOccupancyOccupant.occupantPhoneNumber; - modalElement.querySelector("#lotOccupancyOccupantEdit--occupantEmailAddress").value = lotOccupancyOccupant.occupantEmailAddress; - modalElement.querySelector("#lotOccupancyOccupantEdit--occupantComment").value = lotOccupancyOccupant.occupantComment; + ; + modalElement.querySelector('#lotOccupancyOccupantEdit--occupantName').value = lotOccupancyOccupant.occupantName; + modalElement.querySelector('#lotOccupancyOccupantEdit--occupantAddress1').value = lotOccupancyOccupant.occupantAddress1; + modalElement.querySelector('#lotOccupancyOccupantEdit--occupantAddress2').value = lotOccupancyOccupant.occupantAddress2; + modalElement.querySelector('#lotOccupancyOccupantEdit--occupantCity').value = lotOccupancyOccupant.occupantCity; + modalElement.querySelector('#lotOccupancyOccupantEdit--occupantProvince').value = lotOccupancyOccupant.occupantProvince; + modalElement.querySelector('#lotOccupancyOccupantEdit--occupantPostalCode').value = lotOccupancyOccupant.occupantPostalCode; + modalElement.querySelector('#lotOccupancyOccupantEdit--occupantPhoneNumber').value = lotOccupancyOccupant.occupantPhoneNumber; + modalElement.querySelector('#lotOccupancyOccupantEdit--occupantEmailAddress').value = lotOccupancyOccupant.occupantEmailAddress; + modalElement.querySelector('#lotOccupancyOccupantEdit--occupantComment').value = lotOccupancyOccupant.occupantComment; }, onshown: (modalElement, closeModalFunction) => { bulmaJS.toggleHtmlClipped(); - modalElement.querySelector("#lotOccupancyOccupantEdit--lotOccupantTypeId").focus(); - editFormElement = modalElement.querySelector("form"); - editFormElement.addEventListener("submit", editOccupant); + modalElement.querySelector('#lotOccupancyOccupantEdit--lotOccupantTypeId').focus(); + editFormElement = modalElement.querySelector('form'); + editFormElement.addEventListener('submit', editOccupant); editCloseModalFunction = closeModalFunction; }, onremoved: () => { @@ -73,10 +77,9 @@ const openEditLotOccupancyOccupant = (clickEvent) => { }); }; const deleteLotOccupancyOccupant = (clickEvent) => { - const lotOccupantIndex = clickEvent.currentTarget.closest("tr").dataset - .lotOccupantIndex; + const lotOccupantIndex = clickEvent.currentTarget.closest('tr').dataset.lotOccupantIndex; const doDelete = () => { - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyOccupant", { + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyOccupant', { lotOccupancyId, lotOccupantIndex }, (responseJSON) => { @@ -86,128 +89,135 @@ const deleteLotOccupancyOccupant = (clickEvent) => { } else { bulmaJS.alert({ - title: "Error Removing " + exports.aliases.occupant, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Removing ' + exports.aliases.occupant, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }; bulmaJS.confirm({ - title: "Remove " + exports.aliases.occupant + "?", - message: "Are you sure you want to remove this " + exports.aliases.occupant.toLowerCase() + "?", + title: 'Remove ' + exports.aliases.occupant + '?', + message: 'Are you sure you want to remove this ' + + exports.aliases.occupant.toLowerCase() + + '?', okButton: { - text: "Yes, Remove " + exports.aliases.occupant, + text: 'Yes, Remove ' + exports.aliases.occupant, callbackFunction: doDelete }, - contextualColorName: "warning" + contextualColorName: 'warning' }); }; const renderLotOccupancyOccupants = () => { - const occupantsContainer = document.querySelector("#container--lotOccupancyOccupants"); + const occupantsContainer = document.querySelector('#container--lotOccupancyOccupants'); cityssm.clearElement(occupantsContainer); if (lotOccupancyOccupants.length === 0) { occupantsContainer.innerHTML = '
' + '

There are no ' + exports.aliases.occupants.toLowerCase() + - " associated with this record.

" + - "
"; + ' associated with this record.

' + + ''; return; } - const tableElement = document.createElement("table"); - tableElement.className = "table is-fullwidth is-striped is-hoverable"; + const tableElement = document.createElement('table'); + tableElement.className = 'table is-fullwidth is-striped is-hoverable'; tableElement.innerHTML = - "" + - ("" + exports.aliases.occupant + "") + - "Address" + - "Other Contact" + - "Comment" + + '' + + ('' + exports.aliases.occupant + '') + + 'Address' + + 'Other Contact' + + 'Comment' + 'Options' + - "" + - ""; + '' + + ''; for (const lotOccupancyOccupant of lotOccupancyOccupants) { - const tableRowElement = document.createElement("tr"); + const tableRowElement = document.createElement('tr'); tableRowElement.dataset.lotOccupantIndex = lotOccupancyOccupant.lotOccupantIndex.toString(); tableRowElement.innerHTML = - "" + - cityssm.escapeHTML(lotOccupancyOccupant.occupantName || "(No Name)") + - "
" + + '' + + cityssm.escapeHTML(lotOccupancyOccupant.occupantName || '(No Name)') + + '
' + ('' + '' + ' ' + cityssm.escapeHTML(lotOccupancyOccupant.lotOccupantType) + - "" + - "") + - "" + - ("" + + '' + + '') + + '' + + ('' + (lotOccupancyOccupant.occupantAddress1 - ? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress1) + "
" - : "") + + ? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress1) + '
' + : '') + (lotOccupancyOccupant.occupantAddress2 - ? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress2) + "
" - : "") + + ? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress2) + '
' + : '') + (lotOccupancyOccupant.occupantCity - ? cityssm.escapeHTML(lotOccupancyOccupant.occupantCity) + ", " - : "") + - cityssm.escapeHTML(lotOccupancyOccupant.occupantProvince || "") + - "
" + - cityssm.escapeHTML(lotOccupancyOccupant.occupantPostalCode || "") + - "") + - ("" + + ? cityssm.escapeHTML(lotOccupancyOccupant.occupantCity) + ', ' + : '') + + cityssm.escapeHTML(lotOccupancyOccupant.occupantProvince || '') + + '
' + + cityssm.escapeHTML(lotOccupancyOccupant.occupantPostalCode || '') + + '') + + ('' + (lotOccupancyOccupant.occupantPhoneNumber - ? cityssm.escapeHTML(lotOccupancyOccupant.occupantPhoneNumber) + "
" - : "") + + ? cityssm.escapeHTML(lotOccupancyOccupant.occupantPhoneNumber) + + '
' + : '') + (lotOccupancyOccupant.occupantEmailAddress ? cityssm.escapeHTML(lotOccupancyOccupant.occupantEmailAddress) - : "") + - "") + - ("" + cityssm.escapeHTML(lotOccupancyOccupant.occupantComment) + "") + + : '') + + '') + + ('' + + cityssm.escapeHTML(lotOccupancyOccupant.occupantComment) + + '') + ('' + '
' + ('") + + ' Edit' + + '') + ('") + - "
" + - ""); + '') + + '' + + ''); tableRowElement - .querySelector(".button--edit") - .addEventListener("click", openEditLotOccupancyOccupant); + .querySelector('.button--edit') + .addEventListener('click', openEditLotOccupancyOccupant); tableRowElement - .querySelector(".button--delete") - .addEventListener("click", deleteLotOccupancyOccupant); - tableElement.querySelector("tbody").append(tableRowElement); + .querySelector('.button--delete') + .addEventListener('click', deleteLotOccupancyOccupant); + tableElement.querySelector('tbody').append(tableRowElement); } occupantsContainer.append(tableElement); }; if (isCreate) { - const lotOccupantTypeIdElement = document.querySelector("#lotOccupancy--lotOccupantTypeId"); - lotOccupantTypeIdElement.addEventListener("change", () => { + const lotOccupantTypeIdElement = document.querySelector('#lotOccupancy--lotOccupantTypeId'); + lotOccupantTypeIdElement.addEventListener('change', () => { const occupantFields = formElement.querySelectorAll("[data-table='LotOccupancyOccupant']"); for (const occupantField of occupantFields) { - occupantField.disabled = lotOccupantTypeIdElement.value === ""; + occupantField.disabled = lotOccupantTypeIdElement.value === ''; } }); } else { lotOccupancyOccupants = exports.lotOccupancyOccupants; delete exports.lotOccupancyOccupants; - document.querySelector("#button--addOccupant").addEventListener("click", () => { + document + .querySelector('#button--addOccupant') + .addEventListener('click', () => { let addCloseModalFunction; let addFormElement; let searchFormElement; let searchResultsElement; const addOccupant = (formOrObject) => { - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doAddLotOccupancyOccupant", formOrObject, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doAddLotOccupancyOccupant', formOrObject, (responseJSON) => { if (responseJSON.success) { lotOccupancyOccupants = responseJSON.lotOccupancyOccupants; addCloseModalFunction(); @@ -215,9 +225,9 @@ else { } else { bulmaJS.alert({ - title: "Error Adding " + exports.aliases.occupant, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Adding ' + exports.aliases.occupant, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); @@ -232,15 +242,15 @@ else { const panelBlockElement = clickEvent.currentTarget; const occupant = pastOccupantSearchResults[Number.parseInt(panelBlockElement.dataset.index, 10)]; const lotOccupantTypeId = panelBlockElement - .closest(".modal") - .querySelector("#lotOccupancyOccupantCopy--lotOccupantTypeId").value; - if (lotOccupantTypeId === "") { + .closest('.modal') + .querySelector('#lotOccupancyOccupantCopy--lotOccupantTypeId').value; + if (lotOccupantTypeId === '') { bulmaJS.alert({ - title: "No " + exports.aliases.occupant + " Type Selected", - message: "Select a type to apply to the newly added " + + title: 'No ' + exports.aliases.occupant + ' Type Selected', + message: 'Select a type to apply to the newly added ' + exports.aliases.occupant.toLowerCase() + - ".", - contextualColorName: "warning" + '.', + contextualColorName: 'warning' }); } else { @@ -251,83 +261,86 @@ else { }; const searchOccupants = (event) => { event.preventDefault(); - if (searchFormElement.querySelector("#lotOccupancyOccupantCopy--searchFilter").value === "") { + if (searchFormElement.querySelector('#lotOccupancyOccupantCopy--searchFilter').value === '') { searchResultsElement.innerHTML = '
' + '

Enter a partial name or address in the search field above.

' + - "
"; + ''; return; } - searchResultsElement.innerHTML = los.getLoadingParagraphHTML("Searching..."); - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doSearchPastOccupants", searchFormElement, (responseJSON) => { + searchResultsElement.innerHTML = + los.getLoadingParagraphHTML('Searching...'); + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doSearchPastOccupants', searchFormElement, (responseJSON) => { pastOccupantSearchResults = responseJSON.occupants; - const panelElement = document.createElement("div"); - panelElement.className = "panel"; + const panelElement = document.createElement('div'); + panelElement.className = 'panel'; for (const [index, occupant] of pastOccupantSearchResults.entries()) { - const panelBlockElement = document.createElement("a"); - panelBlockElement.className = "panel-block is-block"; + const panelBlockElement = document.createElement('a'); + panelBlockElement.className = 'panel-block is-block'; panelBlockElement.dataset.index = index.toString(); panelBlockElement.innerHTML = - "" + - cityssm.escapeHTML(occupant.occupantName || "") + - "" + - "
" + + '' + + cityssm.escapeHTML(occupant.occupantName || '') + + '' + + '
' + '
' + ('
' + - cityssm.escapeHTML(occupant.occupantAddress1 || "") + - "
" + + cityssm.escapeHTML(occupant.occupantAddress1 || '') + + '
' + (occupant.occupantAddress2 - ? cityssm.escapeHTML(occupant.occupantAddress2) + "
" - : "") + - cityssm.escapeHTML(occupant.occupantCity || "") + - ", " + - cityssm.escapeHTML(occupant.occupantProvince || "") + - "
" + - cityssm.escapeHTML(occupant.occupantPostalCode || "") + - "
") + + ? cityssm.escapeHTML(occupant.occupantAddress2) + '
' + : '') + + cityssm.escapeHTML(occupant.occupantCity || '') + + ', ' + + cityssm.escapeHTML(occupant.occupantProvince || '') + + '
' + + cityssm.escapeHTML(occupant.occupantPostalCode || '') + + '
') + ('
' + (occupant.occupantPhoneNumber - ? cityssm.escapeHTML(occupant.occupantPhoneNumber) + "
" - : "") + - cityssm.escapeHTML(occupant.occupantEmailAddress || "") + - "
" + - "
") + - ""; - panelBlockElement.addEventListener("click", addOccupantFromCopy); + ? cityssm.escapeHTML(occupant.occupantPhoneNumber) + + '
' + : '') + + cityssm.escapeHTML(occupant.occupantEmailAddress || '') + + '
' + + '') + + ''; + panelBlockElement.addEventListener('click', addOccupantFromCopy); panelElement.append(panelBlockElement); } - searchResultsElement.innerHTML = ""; + searchResultsElement.innerHTML = ''; searchResultsElement.append(panelElement); }); }; - cityssm.openHtmlModal("lotOccupancy-addOccupant", { + cityssm.openHtmlModal('lotOccupancy-addOccupant', { onshow: (modalElement) => { los.populateAliases(modalElement); - modalElement.querySelector("#lotOccupancyOccupantAdd--lotOccupancyId").value = lotOccupancyId; - const lotOccupantTypeSelectElement = modalElement.querySelector("#lotOccupancyOccupantAdd--lotOccupantTypeId"); - const lotOccupantTypeCopySelectElement = modalElement.querySelector("#lotOccupancyOccupantCopy--lotOccupantTypeId"); + modalElement.querySelector('#lotOccupancyOccupantAdd--lotOccupancyId').value = lotOccupancyId; + const lotOccupantTypeSelectElement = modalElement.querySelector('#lotOccupancyOccupantAdd--lotOccupantTypeId'); + const lotOccupantTypeCopySelectElement = modalElement.querySelector('#lotOccupancyOccupantCopy--lotOccupantTypeId'); for (const lotOccupantType of exports.lotOccupantTypes) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = lotOccupantType.lotOccupantTypeId.toString(); optionElement.textContent = lotOccupantType.lotOccupantType; lotOccupantTypeSelectElement.append(optionElement); 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) => { bulmaJS.toggleHtmlClipped(); bulmaJS.init(modalElement); - modalElement.querySelector("#lotOccupancyOccupantAdd--lotOccupantTypeId").focus(); - addFormElement = modalElement.querySelector("#form--lotOccupancyOccupantAdd"); - addFormElement.addEventListener("submit", addOccupantFromForm); - searchResultsElement = modalElement.querySelector("#lotOccupancyOccupantCopy--searchResults"); - searchFormElement = modalElement.querySelector("#form--lotOccupancyOccupantCopy"); - searchFormElement.addEventListener("submit", (formEvent) => { + modalElement.querySelector('#lotOccupancyOccupantAdd--lotOccupantTypeId').focus(); + addFormElement = modalElement.querySelector('#form--lotOccupancyOccupantAdd'); + addFormElement.addEventListener('submit', addOccupantFromForm); + searchResultsElement = modalElement.querySelector('#lotOccupancyOccupantCopy--searchResults'); + searchFormElement = modalElement.querySelector('#form--lotOccupancyOccupantCopy'); + searchFormElement.addEventListener('submit', (formEvent) => { formEvent.preventDefault(); }); - modalElement.querySelector("#lotOccupancyOccupantCopy--searchFilter").addEventListener("change", searchOccupants); + modalElement.querySelector('#lotOccupancyOccupantCopy--searchFilter').addEventListener('change', searchOccupants); addCloseModalFunction = closeModalFunction; }, onremoved: () => { diff --git a/public-typescript/lotOccupancyEdit/lotOccupancyEditOccupants.ts b/public-typescript/lotOccupancyEdit/lotOccupancyEditOccupants.ts index 3abd5a56..064124c2 100644 --- a/public-typescript/lotOccupancyEdit/lotOccupancyEditOccupants.ts +++ b/public-typescript/lotOccupancyEdit/lotOccupancyEditOccupants.ts @@ -1,558 +1,584 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ -import type * as globalTypes from "../../types/globalTypes"; -import type * as recordTypes from "../../types/recordTypes"; +import type * as globalTypes from '../../types/globalTypes' +import type * as recordTypes from '../../types/recordTypes' -import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; +import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types' -import type { BulmaJS } from "@cityssm/bulma-js/types"; +import type { BulmaJS } from '@cityssm/bulma-js/types' -declare const cityssm: cityssmGlobal; -declare const bulmaJS: BulmaJS; +declare const cityssm: cityssmGlobal +declare const bulmaJS: BulmaJS -declare const los: globalTypes.LOS; +declare const los: globalTypes.LOS -declare const lotOccupancyId: string; -declare const isCreate: boolean; -declare const formElement: HTMLFormElement; +declare const lotOccupancyId: string +declare const isCreate: boolean +declare const formElement: HTMLFormElement -let lotOccupancyOccupants: recordTypes.LotOccupancyOccupant[]; +let lotOccupancyOccupants: recordTypes.LotOccupancyOccupant[] const openEditLotOccupancyOccupant = (clickEvent: Event) => { - const lotOccupantIndex = Number.parseInt( - (clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.lotOccupantIndex!, - 10 - ); + const lotOccupantIndex = Number.parseInt( + (clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset + .lotOccupantIndex!, + 10 + ) - const lotOccupancyOccupant = lotOccupancyOccupants.find((currentLotOccupancyOccupant) => { - return currentLotOccupancyOccupant.lotOccupantIndex === lotOccupantIndex; - })!; + const lotOccupancyOccupant = lotOccupancyOccupants.find( + (currentLotOccupancyOccupant) => { + return currentLotOccupancyOccupant.lotOccupantIndex === lotOccupantIndex + } + )! - let editFormElement: HTMLFormElement; - let editCloseModalFunction: () => void; + let editFormElement: HTMLFormElement + let editCloseModalFunction: () => void - const editOccupant = (submitEvent: SubmitEvent) => { - submitEvent.preventDefault(); + const editOccupant = (submitEvent: SubmitEvent) => { + submitEvent.preventDefault() - cityssm.postJSON( - los.urlPrefix + "/lotOccupancies/doUpdateLotOccupancyOccupant", - editFormElement, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotOccupancyOccupants?: recordTypes.LotOccupancyOccupant[]; - }) => { - if (responseJSON.success) { - lotOccupancyOccupants = responseJSON.lotOccupancyOccupants!; - editCloseModalFunction(); - renderLotOccupancyOccupants(); - } else { - bulmaJS.alert({ - title: "Error Updating " + exports.aliases.occupant, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }; - - cityssm.openHtmlModal("lotOccupancy-editOccupant", { - onshow: (modalElement) => { - los.populateAliases(modalElement); - - ( - modalElement.querySelector( - "#lotOccupancyOccupantEdit--lotOccupancyId" - ) as HTMLInputElement - ).value = lotOccupancyId; - ( - modalElement.querySelector( - "#lotOccupancyOccupantEdit--lotOccupantIndex" - ) as HTMLInputElement - ).value = lotOccupantIndex.toString(); - - const lotOccupantTypeSelectElement = modalElement.querySelector( - "#lotOccupancyOccupantEdit--lotOccupantTypeId" - ) as HTMLSelectElement; - - let lotOccupantTypeSelected = false; - - for (const lotOccupantType of exports.lotOccupantTypes as recordTypes.LotOccupantType[]) { - const optionElement = document.createElement("option"); - optionElement.value = lotOccupantType.lotOccupantTypeId.toString(); - optionElement.textContent = lotOccupantType.lotOccupantType; - - if (lotOccupantType.lotOccupantTypeId === lotOccupancyOccupant.lotOccupantTypeId) { - optionElement.selected = true; - lotOccupantTypeSelected = true; - } - - lotOccupantTypeSelectElement.append(optionElement); - } - - if (!lotOccupantTypeSelected) { - const optionElement = document.createElement("option"); - - optionElement.value = lotOccupancyOccupant.lotOccupantTypeId!.toString(); - optionElement.textContent = lotOccupancyOccupant.lotOccupantType as string; - optionElement.selected = true; - - lotOccupantTypeSelectElement.append(optionElement); - } - - ( - modalElement.querySelector( - "#lotOccupancyOccupantEdit--occupantName" - ) as HTMLInputElement - ).value = lotOccupancyOccupant.occupantName!; - ( - modalElement.querySelector( - "#lotOccupancyOccupantEdit--occupantAddress1" - ) as HTMLInputElement - ).value = lotOccupancyOccupant.occupantAddress1!; - ( - modalElement.querySelector( - "#lotOccupancyOccupantEdit--occupantAddress2" - ) as HTMLInputElement - ).value = lotOccupancyOccupant.occupantAddress2!; - ( - modalElement.querySelector( - "#lotOccupancyOccupantEdit--occupantCity" - ) as HTMLInputElement - ).value = lotOccupancyOccupant.occupantCity!; - ( - modalElement.querySelector( - "#lotOccupancyOccupantEdit--occupantProvince" - ) as HTMLInputElement - ).value = lotOccupancyOccupant.occupantProvince!; - - ( - modalElement.querySelector( - "#lotOccupancyOccupantEdit--occupantPostalCode" - ) as HTMLInputElement - ).value = lotOccupancyOccupant.occupantPostalCode!; - - ( - modalElement.querySelector( - "#lotOccupancyOccupantEdit--occupantPhoneNumber" - ) as HTMLInputElement - ).value = lotOccupancyOccupant.occupantPhoneNumber!; - - ( - modalElement.querySelector( - "#lotOccupancyOccupantEdit--occupantEmailAddress" - ) as HTMLInputElement - ).value = lotOccupancyOccupant.occupantEmailAddress!; - - ( - modalElement.querySelector( - "#lotOccupancyOccupantEdit--occupantComment" - ) as HTMLTextAreaElement - ).value = lotOccupancyOccupant.occupantComment!; - }, - onshown: (modalElement, closeModalFunction) => { - bulmaJS.toggleHtmlClipped(); - - ( - modalElement.querySelector( - "#lotOccupancyOccupantEdit--lotOccupantTypeId" - ) as HTMLInputElement - ).focus(); - - editFormElement = modalElement.querySelector("form")!; - editFormElement.addEventListener("submit", editOccupant); - - editCloseModalFunction = closeModalFunction; - }, - onremoved: () => { - bulmaJS.toggleHtmlClipped(); + cityssm.postJSON( + los.urlPrefix + '/lotOccupancies/doUpdateLotOccupancyOccupant', + editFormElement, + (responseJSON: { + success: boolean + errorMessage?: string + lotOccupancyOccupants?: recordTypes.LotOccupancyOccupant[] + }) => { + if (responseJSON.success) { + lotOccupancyOccupants = responseJSON.lotOccupancyOccupants! + editCloseModalFunction() + renderLotOccupancyOccupants() + } else { + bulmaJS.alert({ + title: 'Error Updating ' + exports.aliases.occupant, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) } - }); -}; + } + ) + } + + cityssm.openHtmlModal('lotOccupancy-editOccupant', { + onshow: (modalElement) => { + los.populateAliases(modalElement) + + ;( + modalElement.querySelector( + '#lotOccupancyOccupantEdit--lotOccupancyId' + ) as HTMLInputElement + ).value = lotOccupancyId + ;( + modalElement.querySelector( + '#lotOccupancyOccupantEdit--lotOccupantIndex' + ) as HTMLInputElement + ).value = lotOccupantIndex.toString() + + const lotOccupantTypeSelectElement = modalElement.querySelector( + '#lotOccupancyOccupantEdit--lotOccupantTypeId' + ) as HTMLSelectElement + + let lotOccupantTypeSelected = false + + for (const lotOccupantType of exports.lotOccupantTypes as recordTypes.LotOccupantType[]) { + const optionElement = document.createElement('option') + optionElement.value = lotOccupantType.lotOccupantTypeId.toString() + optionElement.textContent = lotOccupantType.lotOccupantType + + if ( + lotOccupantType.lotOccupantTypeId === + lotOccupancyOccupant.lotOccupantTypeId + ) { + optionElement.selected = true + lotOccupantTypeSelected = true + } + + lotOccupantTypeSelectElement.append(optionElement) + } + + if (!lotOccupantTypeSelected) { + const optionElement = document.createElement('option') + + optionElement.value = lotOccupancyOccupant.lotOccupantTypeId!.toString() + optionElement.textContent = + lotOccupancyOccupant.lotOccupantType as string + optionElement.selected = true + + lotOccupantTypeSelectElement.append(optionElement) + } + + ;( + modalElement.querySelector( + '#lotOccupancyOccupantEdit--occupantName' + ) as HTMLInputElement + ).value = lotOccupancyOccupant.occupantName! + ;( + modalElement.querySelector( + '#lotOccupancyOccupantEdit--occupantAddress1' + ) as HTMLInputElement + ).value = lotOccupancyOccupant.occupantAddress1! + ;( + modalElement.querySelector( + '#lotOccupancyOccupantEdit--occupantAddress2' + ) as HTMLInputElement + ).value = lotOccupancyOccupant.occupantAddress2! + ;( + modalElement.querySelector( + '#lotOccupancyOccupantEdit--occupantCity' + ) as HTMLInputElement + ).value = lotOccupancyOccupant.occupantCity! + ;( + modalElement.querySelector( + '#lotOccupancyOccupantEdit--occupantProvince' + ) as HTMLInputElement + ).value = lotOccupancyOccupant.occupantProvince! + + ;( + modalElement.querySelector( + '#lotOccupancyOccupantEdit--occupantPostalCode' + ) as HTMLInputElement + ).value = lotOccupancyOccupant.occupantPostalCode! + + ;( + modalElement.querySelector( + '#lotOccupancyOccupantEdit--occupantPhoneNumber' + ) as HTMLInputElement + ).value = lotOccupancyOccupant.occupantPhoneNumber! + + ;( + modalElement.querySelector( + '#lotOccupancyOccupantEdit--occupantEmailAddress' + ) as HTMLInputElement + ).value = lotOccupancyOccupant.occupantEmailAddress! + + ;( + modalElement.querySelector( + '#lotOccupancyOccupantEdit--occupantComment' + ) as HTMLTextAreaElement + ).value = lotOccupancyOccupant.occupantComment! + }, + onshown: (modalElement, closeModalFunction) => { + bulmaJS.toggleHtmlClipped() + + ;( + modalElement.querySelector( + '#lotOccupancyOccupantEdit--lotOccupantTypeId' + ) as HTMLInputElement + ).focus() + + editFormElement = modalElement.querySelector('form')! + editFormElement.addEventListener('submit', editOccupant) + + editCloseModalFunction = closeModalFunction + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped() + } + }) +} const deleteLotOccupancyOccupant = (clickEvent: Event) => { - const lotOccupantIndex = (clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset - .lotOccupantIndex; + const lotOccupantIndex = (clickEvent.currentTarget as HTMLElement).closest( + 'tr' + )!.dataset.lotOccupantIndex - const doDelete = () => { - cityssm.postJSON( - los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyOccupant", - { - lotOccupancyId, - lotOccupantIndex - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotOccupancyOccupants: recordTypes.LotOccupancyOccupant[]; - }) => { - if (responseJSON.success) { - lotOccupancyOccupants = responseJSON.lotOccupancyOccupants; - renderLotOccupancyOccupants(); - } else { - bulmaJS.alert({ - title: "Error Removing " + exports.aliases.occupant, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }; + const doDelete = () => { + cityssm.postJSON( + los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyOccupant', + { + lotOccupancyId, + lotOccupantIndex + }, + (responseJSON: { + success: boolean + errorMessage?: string + lotOccupancyOccupants: recordTypes.LotOccupancyOccupant[] + }) => { + if (responseJSON.success) { + lotOccupancyOccupants = responseJSON.lotOccupancyOccupants + renderLotOccupancyOccupants() + } else { + bulmaJS.alert({ + title: 'Error Removing ' + exports.aliases.occupant, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + ) + } - bulmaJS.confirm({ - title: "Remove " + exports.aliases.occupant + "?", - message: - "Are you sure you want to remove this " + exports.aliases.occupant.toLowerCase() + "?", - okButton: { - text: "Yes, Remove " + exports.aliases.occupant, - callbackFunction: doDelete - }, - contextualColorName: "warning" - }); -}; + bulmaJS.confirm({ + title: 'Remove ' + exports.aliases.occupant + '?', + message: + 'Are you sure you want to remove this ' + + exports.aliases.occupant.toLowerCase() + + '?', + okButton: { + text: 'Yes, Remove ' + exports.aliases.occupant, + callbackFunction: doDelete + }, + contextualColorName: 'warning' + }) +} const renderLotOccupancyOccupants = () => { - const occupantsContainer = document.querySelector( - "#container--lotOccupancyOccupants" - ) as HTMLElement; + const occupantsContainer = document.querySelector( + '#container--lotOccupancyOccupants' + ) as HTMLElement - cityssm.clearElement(occupantsContainer); + cityssm.clearElement(occupantsContainer) - if (lotOccupancyOccupants.length === 0) { - occupantsContainer.innerHTML = - '
' + - '

There are no ' + - exports.aliases.occupants.toLowerCase() + - " associated with this record.

" + - "
"; + if (lotOccupancyOccupants.length === 0) { + occupantsContainer.innerHTML = + '
' + + '

There are no ' + + exports.aliases.occupants.toLowerCase() + + ' associated with this record.

' + + '
' - return; - } + return + } - const tableElement = document.createElement("table"); - tableElement.className = "table is-fullwidth is-striped is-hoverable"; + const tableElement = document.createElement('table') + tableElement.className = 'table is-fullwidth is-striped is-hoverable' - tableElement.innerHTML = - "" + - ("" + exports.aliases.occupant + "") + - "Address" + - "Other Contact" + - "Comment" + - 'Options' + - "" + - ""; + tableElement.innerHTML = + '' + + ('' + exports.aliases.occupant + '') + + 'Address' + + 'Other Contact' + + 'Comment' + + 'Options' + + '' + + '' - for (const lotOccupancyOccupant of lotOccupancyOccupants) { - const tableRowElement = document.createElement("tr"); - tableRowElement.dataset.lotOccupantIndex = - lotOccupancyOccupant.lotOccupantIndex!.toString(); + for (const lotOccupancyOccupant of lotOccupancyOccupants) { + const tableRowElement = document.createElement('tr') + tableRowElement.dataset.lotOccupantIndex = + lotOccupancyOccupant.lotOccupantIndex!.toString() - tableRowElement.innerHTML = - "" + - cityssm.escapeHTML(lotOccupancyOccupant.occupantName || "(No Name)") + - "
" + - ('' + - '' + - ' ' + - cityssm.escapeHTML(lotOccupancyOccupant.lotOccupantType!) + - "" + - "") + - "" + - ("" + - (lotOccupancyOccupant.occupantAddress1 - ? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress1) + "
" - : "") + - (lotOccupancyOccupant.occupantAddress2 - ? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress2) + "
" - : "") + - (lotOccupancyOccupant.occupantCity - ? cityssm.escapeHTML(lotOccupancyOccupant.occupantCity) + ", " - : "") + - cityssm.escapeHTML(lotOccupancyOccupant.occupantProvince || "") + - "
" + - cityssm.escapeHTML(lotOccupancyOccupant.occupantPostalCode || "") + - "") + - ("" + - (lotOccupancyOccupant.occupantPhoneNumber - ? cityssm.escapeHTML(lotOccupancyOccupant.occupantPhoneNumber) + "
" - : "") + - (lotOccupancyOccupant.occupantEmailAddress - ? cityssm.escapeHTML(lotOccupancyOccupant.occupantEmailAddress) - : "") + - "") + - ("" + cityssm.escapeHTML(lotOccupancyOccupant.occupantComment!) + "") + - ('' + - '
' + - ('") + - ('") + - "
" + - ""); + tableRowElement.innerHTML = + '' + + cityssm.escapeHTML(lotOccupancyOccupant.occupantName || '(No Name)') + + '
' + + ('' + + '' + + ' ' + + cityssm.escapeHTML(lotOccupancyOccupant.lotOccupantType!) + + '' + + '') + + '' + + ('' + + (lotOccupancyOccupant.occupantAddress1 + ? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress1) + '
' + : '') + + (lotOccupancyOccupant.occupantAddress2 + ? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress2) + '
' + : '') + + (lotOccupancyOccupant.occupantCity + ? cityssm.escapeHTML(lotOccupancyOccupant.occupantCity) + ', ' + : '') + + cityssm.escapeHTML(lotOccupancyOccupant.occupantProvince || '') + + '
' + + cityssm.escapeHTML(lotOccupancyOccupant.occupantPostalCode || '') + + '') + + ('' + + (lotOccupancyOccupant.occupantPhoneNumber + ? cityssm.escapeHTML(lotOccupancyOccupant.occupantPhoneNumber) + + '
' + : '') + + (lotOccupancyOccupant.occupantEmailAddress + ? cityssm.escapeHTML(lotOccupancyOccupant.occupantEmailAddress) + : '') + + '') + + ('' + + cityssm.escapeHTML(lotOccupancyOccupant.occupantComment!) + + '') + + ('' + + '
' + + ('') + + ('') + + '
' + + '') - tableRowElement - .querySelector(".button--edit")! - .addEventListener("click", openEditLotOccupancyOccupant); + tableRowElement + .querySelector('.button--edit')! + .addEventListener('click', openEditLotOccupancyOccupant) - tableRowElement - .querySelector(".button--delete")! - .addEventListener("click", deleteLotOccupancyOccupant); + tableRowElement + .querySelector('.button--delete')! + .addEventListener('click', deleteLotOccupancyOccupant) - tableElement.querySelector("tbody")!.append(tableRowElement); - } + tableElement.querySelector('tbody')!.append(tableRowElement) + } - occupantsContainer.append(tableElement); -}; + occupantsContainer.append(tableElement) +} if (isCreate) { - const lotOccupantTypeIdElement = document.querySelector( - "#lotOccupancy--lotOccupantTypeId" - ) as HTMLSelectElement; + const lotOccupantTypeIdElement = document.querySelector( + '#lotOccupancy--lotOccupantTypeId' + ) as HTMLSelectElement - lotOccupantTypeIdElement.addEventListener("change", () => { - const occupantFields = formElement.querySelectorAll( - "[data-table='LotOccupancyOccupant']" - ) as NodeListOf; + lotOccupantTypeIdElement.addEventListener('change', () => { + const occupantFields = formElement.querySelectorAll( + "[data-table='LotOccupancyOccupant']" + ) as NodeListOf - for (const occupantField of occupantFields) { - occupantField.disabled = lotOccupantTypeIdElement.value === ""; - } - }); + for (const occupantField of occupantFields) { + occupantField.disabled = lotOccupantTypeIdElement.value === '' + } + }) } else { - lotOccupancyOccupants = exports.lotOccupancyOccupants; - delete exports.lotOccupancyOccupants; + lotOccupancyOccupants = exports.lotOccupancyOccupants + delete exports.lotOccupancyOccupants - document.querySelector("#button--addOccupant")!.addEventListener("click", () => { - let addCloseModalFunction: () => void; + document + .querySelector('#button--addOccupant')! + .addEventListener('click', () => { + let addCloseModalFunction: () => void - let addFormElement: HTMLFormElement; + let addFormElement: HTMLFormElement - let searchFormElement: HTMLFormElement; - let searchResultsElement: HTMLElement; + let searchFormElement: HTMLFormElement + let searchResultsElement: HTMLElement - const addOccupant = (formOrObject: HTMLFormElement | recordTypes.LotOccupancyOccupant) => { - cityssm.postJSON( - los.urlPrefix + "/lotOccupancies/doAddLotOccupancyOccupant", - formOrObject, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotOccupancyOccupants?: recordTypes.LotOccupancyOccupant[]; - }) => { - if (responseJSON.success) { - lotOccupancyOccupants = responseJSON.lotOccupancyOccupants!; - addCloseModalFunction(); - renderLotOccupancyOccupants(); - } else { - bulmaJS.alert({ - title: "Error Adding " + exports.aliases.occupant, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }; - - const addOccupantFromForm = (submitEvent: SubmitEvent) => { - submitEvent.preventDefault(); - addOccupant(addFormElement); - }; - - let pastOccupantSearchResults: recordTypes.LotOccupancyOccupant[] = []; - - const addOccupantFromCopy = (clickEvent: MouseEvent) => { - clickEvent.preventDefault(); - - const panelBlockElement = clickEvent.currentTarget as HTMLElement; - - const occupant = - pastOccupantSearchResults[Number.parseInt(panelBlockElement.dataset.index!, 10)]; - - const lotOccupantTypeId = ( - panelBlockElement - .closest(".modal")! - .querySelector( - "#lotOccupancyOccupantCopy--lotOccupantTypeId" - ) as HTMLSelectElement - ).value; - - if (lotOccupantTypeId === "") { - bulmaJS.alert({ - title: "No " + exports.aliases.occupant + " Type Selected", - message: - "Select a type to apply to the newly added " + - exports.aliases.occupant.toLowerCase() + - ".", - contextualColorName: "warning" - }); + const addOccupant = ( + formOrObject: HTMLFormElement | recordTypes.LotOccupancyOccupant + ) => { + cityssm.postJSON( + los.urlPrefix + '/lotOccupancies/doAddLotOccupancyOccupant', + formOrObject, + (responseJSON: { + success: boolean + errorMessage?: string + lotOccupancyOccupants?: recordTypes.LotOccupancyOccupant[] + }) => { + if (responseJSON.success) { + lotOccupancyOccupants = responseJSON.lotOccupancyOccupants! + addCloseModalFunction() + renderLotOccupancyOccupants() } else { - occupant.lotOccupantTypeId = Number.parseInt(lotOccupantTypeId, 10); - occupant.lotOccupancyId = Number.parseInt(lotOccupancyId, 10); - addOccupant(occupant); + bulmaJS.alert({ + title: 'Error Adding ' + exports.aliases.occupant, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) } - }; + } + ) + } - const searchOccupants = (event: Event) => { - event.preventDefault(); + const addOccupantFromForm = (submitEvent: SubmitEvent) => { + submitEvent.preventDefault() + addOccupant(addFormElement) + } - if ( - ( - searchFormElement.querySelector( - "#lotOccupancyOccupantCopy--searchFilter" - ) as HTMLInputElement - ).value === "" - ) { - searchResultsElement.innerHTML = - '
' + - '

Enter a partial name or address in the search field above.

' + - "
"; + let pastOccupantSearchResults: recordTypes.LotOccupancyOccupant[] = [] - return; + const addOccupantFromCopy = (clickEvent: MouseEvent) => { + clickEvent.preventDefault() + + const panelBlockElement = clickEvent.currentTarget as HTMLElement + + const occupant = + pastOccupantSearchResults[ + Number.parseInt(panelBlockElement.dataset.index!, 10) + ] + + const lotOccupantTypeId = ( + panelBlockElement + .closest('.modal')! + .querySelector( + '#lotOccupancyOccupantCopy--lotOccupantTypeId' + ) as HTMLSelectElement + ).value + + if (lotOccupantTypeId === '') { + bulmaJS.alert({ + title: 'No ' + exports.aliases.occupant + ' Type Selected', + message: + 'Select a type to apply to the newly added ' + + exports.aliases.occupant.toLowerCase() + + '.', + contextualColorName: 'warning' + }) + } else { + occupant.lotOccupantTypeId = Number.parseInt(lotOccupantTypeId, 10) + occupant.lotOccupancyId = Number.parseInt(lotOccupancyId, 10) + addOccupant(occupant) + } + } + + const searchOccupants = (event: Event) => { + event.preventDefault() + + if ( + ( + searchFormElement.querySelector( + '#lotOccupancyOccupantCopy--searchFilter' + ) as HTMLInputElement + ).value === '' + ) { + searchResultsElement.innerHTML = + '
' + + '

Enter a partial name or address in the search field above.

' + + '
' + + return + } + + searchResultsElement.innerHTML = + los.getLoadingParagraphHTML('Searching...') + + cityssm.postJSON( + los.urlPrefix + '/lotOccupancies/doSearchPastOccupants', + searchFormElement, + (responseJSON: { occupants: recordTypes.LotOccupancyOccupant[] }) => { + pastOccupantSearchResults = responseJSON.occupants + + const panelElement = document.createElement('div') + panelElement.className = 'panel' + + for (const [ + index, + occupant + ] of pastOccupantSearchResults.entries()) { + const panelBlockElement = document.createElement('a') + panelBlockElement.className = 'panel-block is-block' + panelBlockElement.dataset.index = index.toString() + + panelBlockElement.innerHTML = + '' + + cityssm.escapeHTML(occupant.occupantName || '') + + '' + + '
' + + '
' + + ('
' + + cityssm.escapeHTML(occupant.occupantAddress1 || '') + + '
' + + (occupant.occupantAddress2 + ? cityssm.escapeHTML(occupant.occupantAddress2) + '
' + : '') + + cityssm.escapeHTML(occupant.occupantCity || '') + + ', ' + + cityssm.escapeHTML(occupant.occupantProvince || '') + + '
' + + cityssm.escapeHTML(occupant.occupantPostalCode || '') + + '
') + + ('
' + + (occupant.occupantPhoneNumber + ? cityssm.escapeHTML(occupant.occupantPhoneNumber) + + '
' + : '') + + cityssm.escapeHTML(occupant.occupantEmailAddress || '') + + '
' + + '
') + + '
' + + panelBlockElement.addEventListener('click', addOccupantFromCopy) + + panelElement.append(panelBlockElement) } - searchResultsElement.innerHTML = los.getLoadingParagraphHTML("Searching..."); + searchResultsElement.innerHTML = '' + searchResultsElement.append(panelElement) + } + ) + } - cityssm.postJSON( - los.urlPrefix + "/lotOccupancies/doSearchPastOccupants", - searchFormElement, - (responseJSON: { occupants: recordTypes.LotOccupancyOccupant[] }) => { - pastOccupantSearchResults = responseJSON.occupants; + cityssm.openHtmlModal('lotOccupancy-addOccupant', { + onshow: (modalElement) => { + los.populateAliases(modalElement) - const panelElement = document.createElement("div"); - panelElement.className = "panel"; + ;( + modalElement.querySelector( + '#lotOccupancyOccupantAdd--lotOccupancyId' + ) as HTMLInputElement + ).value = lotOccupancyId - for (const [index, occupant] of pastOccupantSearchResults.entries()) { - const panelBlockElement = document.createElement("a"); - panelBlockElement.className = "panel-block is-block"; - panelBlockElement.dataset.index = index.toString(); + const lotOccupantTypeSelectElement = modalElement.querySelector( + '#lotOccupancyOccupantAdd--lotOccupantTypeId' + ) as HTMLSelectElement - panelBlockElement.innerHTML = - "" + - cityssm.escapeHTML(occupant.occupantName || "") + - "" + - "
" + - '
' + - ('
' + - cityssm.escapeHTML(occupant.occupantAddress1 || "") + - "
" + - (occupant.occupantAddress2 - ? cityssm.escapeHTML(occupant.occupantAddress2) + "
" - : "") + - cityssm.escapeHTML(occupant.occupantCity || "") + - ", " + - cityssm.escapeHTML(occupant.occupantProvince || "") + - "
" + - cityssm.escapeHTML(occupant.occupantPostalCode || "") + - "
") + - ('
' + - (occupant.occupantPhoneNumber - ? cityssm.escapeHTML(occupant.occupantPhoneNumber) + "
" - : "") + - cityssm.escapeHTML(occupant.occupantEmailAddress || "") + - "
" + - "
") + - "
"; + const lotOccupantTypeCopySelectElement = modalElement.querySelector( + '#lotOccupancyOccupantCopy--lotOccupantTypeId' + ) as HTMLSelectElement - panelBlockElement.addEventListener("click", addOccupantFromCopy); + for (const lotOccupantType of exports.lotOccupantTypes as recordTypes.LotOccupantType[]) { + const optionElement = document.createElement('option') + optionElement.value = lotOccupantType.lotOccupantTypeId.toString() + optionElement.textContent = lotOccupantType.lotOccupantType - panelElement.append(panelBlockElement); - } + lotOccupantTypeSelectElement.append(optionElement) - searchResultsElement.innerHTML = ""; - searchResultsElement.append(panelElement); - } - ); - }; + lotOccupantTypeCopySelectElement.append( + optionElement.cloneNode(true) + ) + } - cityssm.openHtmlModal("lotOccupancy-addOccupant", { - onshow: (modalElement) => { - los.populateAliases(modalElement); + ;( + modalElement.querySelector( + '#lotOccupancyOccupantAdd--occupantCity' + ) as HTMLInputElement + ).value = exports.occupantCityDefault - ( - modalElement.querySelector( - "#lotOccupancyOccupantAdd--lotOccupancyId" - ) as HTMLInputElement - ).value = lotOccupancyId; + ;( + modalElement.querySelector( + '#lotOccupancyOccupantAdd--occupantProvince' + ) as HTMLInputElement + ).value = exports.occupantProvinceDefault + }, + onshown: (modalElement, closeModalFunction) => { + bulmaJS.toggleHtmlClipped() + bulmaJS.init(modalElement) - const lotOccupantTypeSelectElement = modalElement.querySelector( - "#lotOccupancyOccupantAdd--lotOccupantTypeId" - ) as HTMLSelectElement; + ;( + modalElement.querySelector( + '#lotOccupancyOccupantAdd--lotOccupantTypeId' + ) as HTMLInputElement + ).focus() - const lotOccupantTypeCopySelectElement = modalElement.querySelector( - "#lotOccupancyOccupantCopy--lotOccupantTypeId" - ) as HTMLSelectElement; + addFormElement = modalElement.querySelector( + '#form--lotOccupancyOccupantAdd' + ) as HTMLFormElement + addFormElement.addEventListener('submit', addOccupantFromForm) - for (const lotOccupantType of exports.lotOccupantTypes as recordTypes.LotOccupantType[]) { - const optionElement = document.createElement("option"); - optionElement.value = lotOccupantType.lotOccupantTypeId.toString(); - optionElement.textContent = lotOccupantType.lotOccupantType; + searchResultsElement = modalElement.querySelector( + '#lotOccupancyOccupantCopy--searchResults' + ) as HTMLElement - lotOccupantTypeSelectElement.append(optionElement); + searchFormElement = modalElement.querySelector( + '#form--lotOccupancyOccupantCopy' + ) as HTMLFormElement + searchFormElement.addEventListener('submit', (formEvent) => { + formEvent.preventDefault() + }) - lotOccupantTypeCopySelectElement.append(optionElement.cloneNode(true)); - } + ;( + modalElement.querySelector( + '#lotOccupancyOccupantCopy--searchFilter' + ) as HTMLInputElement + ).addEventListener('change', searchOccupants) - ( - modalElement.querySelector( - "#lotOccupancyOccupantAdd--occupantCity" - ) as HTMLInputElement - ).value = exports.occupantCityDefault; + addCloseModalFunction = closeModalFunction + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped() + } + }) + }) - ( - modalElement.querySelector( - "#lotOccupancyOccupantAdd--occupantProvince" - ) as HTMLInputElement - ).value = exports.occupantProvinceDefault; - }, - onshown: (modalElement, closeModalFunction) => { - bulmaJS.toggleHtmlClipped(); - bulmaJS.init(modalElement); - - ( - modalElement.querySelector( - "#lotOccupancyOccupantAdd--lotOccupantTypeId" - ) as HTMLInputElement - ).focus(); - - addFormElement = modalElement.querySelector( - "#form--lotOccupancyOccupantAdd" - ) as HTMLFormElement; - addFormElement.addEventListener("submit", addOccupantFromForm); - - searchResultsElement = modalElement.querySelector( - "#lotOccupancyOccupantCopy--searchResults" - ) as HTMLElement; - - searchFormElement = modalElement.querySelector( - "#form--lotOccupancyOccupantCopy" - ) as HTMLFormElement; - searchFormElement.addEventListener("submit", (formEvent) => { - formEvent.preventDefault(); - }); - - ( - modalElement.querySelector( - "#lotOccupancyOccupantCopy--searchFilter" - ) as HTMLInputElement - ).addEventListener("change", searchOccupants); - - addCloseModalFunction = closeModalFunction; - }, - onremoved: () => { - bulmaJS.toggleHtmlClipped(); - } - }); - }); - - renderLotOccupancyOccupants(); + renderLotOccupancyOccupants() } diff --git a/public-typescript/lotOccupancySearch.js b/public-typescript/lotOccupancySearch.js index 3f8646ed..0e9da8e6 100644 --- a/public-typescript/lotOccupancySearch.js +++ b/public-typescript/lotOccupancySearch.js @@ -3,10 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; - const searchFilterFormElement = document.querySelector("#form--searchFilters"); - const searchResultsContainerElement = document.querySelector("#container--searchResults"); - const limit = Number.parseInt(document.querySelector("#searchFilter--limit").value, 10); - const offsetElement = document.querySelector("#searchFilter--offset"); + const searchFilterFormElement = document.querySelector('#form--searchFilters'); + const searchResultsContainerElement = document.querySelector('#container--searchResults'); + const limit = Number.parseInt(document.querySelector('#searchFilter--limit').value, 10); + const offsetElement = document.querySelector('#searchFilter--offset'); function renderLotOccupancies(responseJSON) { var _a, _b; if (responseJSON.lotOccupancies.length === 0) { @@ -17,12 +17,12 @@ Object.defineProperty(exports, "__esModule", { value: true }); `; return; } - const resultsTbodyElement = document.createElement("tbody"); + const resultsTbodyElement = document.createElement('tbody'); const nowDateString = cityssm.dateToString(new Date()); for (const lotOccupancy of responseJSON.lotOccupancies) { - let occupancyTimeHTML = ""; + let occupancyTimeHTML = ''; if (lotOccupancy.occupancyStartDateString <= nowDateString && - (lotOccupancy.occupancyEndDateString === "" || + (lotOccupancy.occupancyEndDateString === '' || lotOccupancy.occupancyEndDateString >= nowDateString)) { occupancyTimeHTML = ` @@ -38,63 +38,65 @@ Object.defineProperty(exports, "__esModule", { value: true }); `; } - let occupantsHTML = ""; + let occupantsHTML = ''; for (const occupant of lotOccupancy.lotOccupancyOccupants) { occupantsHTML += '' + (' ') + - cityssm.escapeHTML(occupant.occupantName || "") + - "
"; + cityssm.escapeHTML(occupant.occupantName || '') + + '
'; } - resultsTbodyElement.insertAdjacentHTML("beforeend", "" + - ('' + occupancyTimeHTML + "") + - ("" + + resultsTbodyElement.insertAdjacentHTML('beforeend', '' + + ('' + occupancyTimeHTML + '') + + ('' + '' + cityssm.escapeHTML(lotOccupancy.occupancyType) + - "" + - "") + - ("" + + '' + + '') + + ('' + (lotOccupancy.lotName ? '' + cityssm.escapeHTML(lotOccupancy.lotName) + - "" - : '(No ' + los.escapedAliases.Lot + ")") + - "
" + + '' + : '(No ' + + los.escapedAliases.Lot + + ')') + + '
' + ('' + - cityssm.escapeHTML(lotOccupancy.mapName || "") + - "") + - "") + - ("" + lotOccupancy.occupancyStartDateString + "") + - ("" + + cityssm.escapeHTML(lotOccupancy.mapName || '') + + '') + + '') + + ('' + lotOccupancy.occupancyStartDateString + '') + + ('' + (lotOccupancy.occupancyEndDate ? lotOccupancy.occupancyEndDateString : '(No End Date)') + - "") + - ("" + occupantsHTML + "") + - "" + + '') + + ('' + occupantsHTML + '') + + '' + (lotOccupancy.printEJS ? '' + '' + - "" - : "") + - "" + - ""); + '' + : '') + + '' + + ''); } searchResultsContainerElement.innerHTML = ` @@ -107,19 +109,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
Print
`; - searchResultsContainerElement.querySelector("table").append(resultsTbodyElement); - searchResultsContainerElement.insertAdjacentHTML("beforeend", los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count)); + searchResultsContainerElement + .querySelector('table') + .append(resultsTbodyElement); + searchResultsContainerElement.insertAdjacentHTML('beforeend', los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count)); (_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 - .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() { 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() { - offsetElement.value = "0"; + offsetElement.value = '0'; getLotOccupancies(); } function previousAndGetLotOccupancies() { @@ -130,11 +134,11 @@ Object.defineProperty(exports, "__esModule", { value: true }); offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString(); getLotOccupancies(); } - const filterElements = searchFilterFormElement.querySelectorAll("input, select"); + const filterElements = searchFilterFormElement.querySelectorAll('input, select'); for (const filterElement of filterElements) { - filterElement.addEventListener("change", resetOffsetAndGetLotOccupancies); + filterElement.addEventListener('change', resetOffsetAndGetLotOccupancies); } - searchFilterFormElement.addEventListener("submit", (formEvent) => { + searchFilterFormElement.addEventListener('submit', (formEvent) => { formEvent.preventDefault(); resetOffsetAndGetLotOccupancies(); }); diff --git a/public-typescript/lotOccupancySearch.ts b/public-typescript/lotOccupancySearch.ts index 8aae4705..d80516e2 100644 --- a/public-typescript/lotOccupancySearch.ts +++ b/public-typescript/lotOccupancySearch.ts @@ -1,131 +1,139 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ -import type * as globalTypes from "../types/globalTypes"; -import type * as recordTypes from "../types/recordTypes"; +import type * as globalTypes from '../types/globalTypes' +import type * as recordTypes from '../types/recordTypes' -import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; +import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types' -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( - (document.querySelector("#searchFilter--limit") as HTMLInputElement).value, - 10 - ); + const limit = Number.parseInt( + (document.querySelector('#searchFilter--limit') as HTMLInputElement).value, + 10 + ) - const offsetElement = document.querySelector("#searchFilter--offset") as HTMLInputElement; + const offsetElement = document.querySelector( + '#searchFilter--offset' + ) as HTMLInputElement - function renderLotOccupancies(responseJSON: { - count: number; - offset: number; - lotOccupancies: recordTypes.LotOccupancy[]; - }) { - if (responseJSON.lotOccupancies.length === 0) { - searchResultsContainerElement.innerHTML = `
+ function renderLotOccupancies(responseJSON: { + count: number + offset: number + lotOccupancies: recordTypes.LotOccupancy[] + }) { + if (responseJSON.lotOccupancies.length === 0) { + searchResultsContainerElement.innerHTML = `

There are no ${los.escapedAliases.occupancy} records that meet the search criteria.

-
`; +
` - 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) { - let occupancyTimeHTML = ""; + for (const lotOccupancy of responseJSON.lotOccupancies) { + let occupancyTimeHTML = '' - if ( - lotOccupancy.occupancyStartDateString! <= nowDateString && - (lotOccupancy.occupancyEndDateString === "" || - lotOccupancy.occupancyEndDateString! >= nowDateString) - ) { - occupancyTimeHTML = ` + if ( + lotOccupancy.occupancyStartDateString! <= nowDateString && + (lotOccupancy.occupancyEndDateString === '' || + lotOccupancy.occupancyEndDateString! >= nowDateString) + ) { + occupancyTimeHTML = ` - `; - } else if (lotOccupancy.occupancyStartDateString! > nowDateString) { - occupancyTimeHTML = ` + ` + } else if (lotOccupancy.occupancyStartDateString! > nowDateString) { + occupancyTimeHTML = ` - `; - } else { - occupancyTimeHTML = ` + ` + } else { + occupancyTimeHTML = ` - `; - } + ` + } - let occupantsHTML = ""; + let occupantsHTML = '' - for (const occupant of lotOccupancy.lotOccupancyOccupants!) { - occupantsHTML += - '' + - (' ') + - cityssm.escapeHTML(occupant.occupantName || "") + - "
"; - } + for (const occupant of lotOccupancy.lotOccupancyOccupants!) { + occupantsHTML += + '' + + (' ') + + cityssm.escapeHTML(occupant.occupantName || '') + + '
' + } - resultsTbodyElement.insertAdjacentHTML( - "beforeend", - "" + - ('") + - ("") + - ("") + - ("") + - ("") + - ("") + - "" + - "" - ); - } + resultsTbodyElement.insertAdjacentHTML( + 'beforeend', + '' + + ('') + + ('') + + ('') + + ('') + + ('') + + ('') + + '' + + '' + ) + } - searchResultsContainerElement.innerHTML = `
' + occupancyTimeHTML + "" + - '' + - cityssm.escapeHTML(lotOccupancy.occupancyType as string) + - "" + - "" + - (lotOccupancy.lotName - ? '' + - cityssm.escapeHTML(lotOccupancy.lotName) + - "" - : '(No ' + los.escapedAliases.Lot + ")") + - "
" + - ('' + - cityssm.escapeHTML(lotOccupancy.mapName || "") + - "") + - "
" + lotOccupancy.occupancyStartDateString + "" + - (lotOccupancy.occupancyEndDate - ? lotOccupancy.occupancyEndDateString - : '(No End Date)') + - "" + occupantsHTML + "" + - (lotOccupancy.printEJS - ? '' + - '' + - "" - : "") + - "
' + occupancyTimeHTML + '' + + '' + + cityssm.escapeHTML(lotOccupancy.occupancyType as string) + + '' + + '' + + (lotOccupancy.lotName + ? '' + + cityssm.escapeHTML(lotOccupancy.lotName) + + '' + : '(No ' + + los.escapedAliases.Lot + + ')') + + '
' + + ('' + + cityssm.escapeHTML(lotOccupancy.mapName || '') + + '') + + '
' + lotOccupancy.occupancyStartDateString + '' + + (lotOccupancy.occupancyEndDate + ? lotOccupancy.occupancyEndDateString + : '(No End Date)') + + '' + occupantsHTML + '' + + (lotOccupancy.printEJS + ? '' + + '' + + '' + : '') + + '
+ searchResultsContainerElement.innerHTML = `
@@ -135,63 +143,74 @@ declare const cityssm: cityssmGlobal; -
${los.escapedAliases.Occupancy} Type${los.escapedAliases.Occupants} Print
`; +
` - searchResultsContainerElement.querySelector("table")!.append(resultsTbodyElement); + searchResultsContainerElement + .querySelector('table')! + .append(resultsTbodyElement) - searchResultsContainerElement.insertAdjacentHTML( - "beforeend", - los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count) - ); + searchResultsContainerElement.insertAdjacentHTML( + 'beforeend', + los.getSearchResultsPagerHTML( + limit, + responseJSON.offset, + responseJSON.count + ) + ) - searchResultsContainerElement - .querySelector("button[data-page='previous']") - ?.addEventListener("click", previousAndGetLotOccupancies); + searchResultsContainerElement + .querySelector("button[data-page='previous']") + ?.addEventListener('click', previousAndGetLotOccupancies) - searchResultsContainerElement - .querySelector("button[data-page='next']") - ?.addEventListener("click", nextAndGetLotOccupancies); - } + searchResultsContainerElement + .querySelector("button[data-page='next']") + ?.addEventListener('click', nextAndGetLotOccupancies) + } - function getLotOccupancies() { - searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML( - `Loading ${exports.aliases.occupancies}...` - ); + function getLotOccupancies() { + 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() { - offsetElement.value = "0"; - getLotOccupancies(); - } + function resetOffsetAndGetLotOccupancies() { + offsetElement.value = '0' + getLotOccupancies() + } - function previousAndGetLotOccupancies() { - offsetElement.value = Math.max(Number.parseInt(offsetElement.value, 10) - limit, 0).toString(); - getLotOccupancies(); - } + function previousAndGetLotOccupancies() { + offsetElement.value = Math.max( + Number.parseInt(offsetElement.value, 10) - limit, + 0 + ).toString() + getLotOccupancies() + } - function nextAndGetLotOccupancies() { - offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString(); - getLotOccupancies(); - } + function nextAndGetLotOccupancies() { + offsetElement.value = ( + Number.parseInt(offsetElement.value, 10) + limit + ).toString() + getLotOccupancies() + } - const filterElements = searchFilterFormElement.querySelectorAll("input, select") as NodeListOf< - HTMLInputElement | HTMLSelectElement - >; + const filterElements = searchFilterFormElement.querySelectorAll( + 'input, select' + ) as NodeListOf - for (const filterElement of filterElements) { - filterElement.addEventListener("change", resetOffsetAndGetLotOccupancies); - } + for (const filterElement of filterElements) { + filterElement.addEventListener('change', resetOffsetAndGetLotOccupancies) + } - searchFilterFormElement.addEventListener("submit", (formEvent) => { - formEvent.preventDefault(); - resetOffsetAndGetLotOccupancies(); - }); + searchFilterFormElement.addEventListener('submit', (formEvent) => { + formEvent.preventDefault() + resetOffsetAndGetLotOccupancies() + }) - getLotOccupancies(); -})(); + getLotOccupancies() +})() diff --git a/public-typescript/lotSearch.js b/public-typescript/lotSearch.js index 2f5cf91f..8c6f3b33 100644 --- a/public-typescript/lotSearch.js +++ b/public-typescript/lotSearch.js @@ -3,10 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; - const searchFilterFormElement = document.querySelector("#form--searchFilters"); - const searchResultsContainerElement = document.querySelector("#container--searchResults"); - const limit = Number.parseInt(document.querySelector("#searchFilter--limit").value, 10); - const offsetElement = document.querySelector("#searchFilter--offset"); + const searchFilterFormElement = document.querySelector('#form--searchFilters'); + const searchResultsContainerElement = document.querySelector('#container--searchResults'); + const limit = Number.parseInt(document.querySelector('#searchFilter--limit').value, 10); + const offsetElement = document.querySelector('#searchFilter--offset'); function renderLots(responseJSON) { var _a, _b; if (responseJSON.lots.length === 0) { @@ -15,36 +15,36 @@ Object.defineProperty(exports, "__esModule", { value: true }); `; return; } - const resultsTbodyElement = document.createElement("tbody"); + const resultsTbodyElement = document.createElement('tbody'); for (const lot of responseJSON.lots) { - resultsTbodyElement.insertAdjacentHTML("beforeend", "" + - ("' + + ('") + - ("') + + ('") + - ("") + - ("') + + ('') + + ('") + - ""); + : '') + + '') + + ''); } searchResultsContainerElement.innerHTML = `
" + + resultsTbodyElement.insertAdjacentHTML('beforeend', '
' + '' + - cityssm.escapeHTML(lot.lotName || "") + - "" + - "" + + cityssm.escapeHTML(lot.lotName || '') + + '' + + '' + '' + (lot.mapName ? cityssm.escapeHTML(lot.mapName) : '(No Name)') + - "" + - "" + cityssm.escapeHTML(lot.lotType || "") + "" + + '' + + '' + cityssm.escapeHTML(lot.lotType || '') + '' + (lot.lotStatusId - ? cityssm.escapeHTML(lot.lotStatus || "") + ? cityssm.escapeHTML(lot.lotStatus || '') : '(No Status)') + - "
" + + '
' + (lot.lotOccupancyCount > 0 ? 'Currently Occupied' - : "") + - "
@@ -54,19 +54,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
Status
`; - searchResultsContainerElement.insertAdjacentHTML("beforeend", los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count)); - searchResultsContainerElement.querySelector("table").append(resultsTbodyElement); + searchResultsContainerElement.insertAdjacentHTML('beforeend', los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count)); + searchResultsContainerElement + .querySelector('table') + .append(resultsTbodyElement); (_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 - .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() { 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() { - offsetElement.value = "0"; + offsetElement.value = '0'; getLots(); } function previousAndGetLots() { @@ -77,11 +79,11 @@ Object.defineProperty(exports, "__esModule", { value: true }); offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString(); getLots(); } - const filterElements = searchFilterFormElement.querySelectorAll("input, select"); + const filterElements = searchFilterFormElement.querySelectorAll('input, select'); for (const filterElement of filterElements) { - filterElement.addEventListener("change", resetOffsetAndGetLots); + filterElement.addEventListener('change', resetOffsetAndGetLots); } - searchFilterFormElement.addEventListener("submit", (formEvent) => { + searchFilterFormElement.addEventListener('submit', (formEvent) => { formEvent.preventDefault(); resetOffsetAndGetLots(); }); diff --git a/public-typescript/lotSearch.ts b/public-typescript/lotSearch.ts index d5055e8e..1c1fa293 100644 --- a/public-typescript/lotSearch.ts +++ b/public-typescript/lotSearch.ts @@ -1,130 +1,155 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ -import type * as globalTypes from "../types/globalTypes"; -import type * as recordTypes from "../types/recordTypes"; +import type * as globalTypes from '../types/globalTypes' +import type * as recordTypes from '../types/recordTypes' -import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; +import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types' -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( - (document.querySelector("#searchFilter--limit") as HTMLInputElement).value, - 10 - ); - const offsetElement = document.querySelector("#searchFilter--offset") as HTMLInputElement; + const limit = Number.parseInt( + (document.querySelector('#searchFilter--limit') as HTMLInputElement).value, + 10 + ) + const offsetElement = document.querySelector( + '#searchFilter--offset' + ) as HTMLInputElement - function renderLots(responseJSON: { count: number; offset: number; lots: recordTypes.Lot[] }): void { - if (responseJSON.lots.length === 0) { - searchResultsContainerElement.innerHTML = `
+ function renderLots(responseJSON: { + count: number + offset: number + lots: recordTypes.Lot[] + }): void { + if (responseJSON.lots.length === 0) { + searchResultsContainerElement.innerHTML = `

There are no ${los.escapedAliases.lots} that meet the search criteria.

-
`; +
` - return; - } + return + } - const resultsTbodyElement = document.createElement("tbody"); + const resultsTbodyElement = document.createElement('tbody') - for (const lot of responseJSON.lots) { - resultsTbodyElement.insertAdjacentHTML( - "beforeend", - "" + - ("") + - ("") + - ("") + - ("") + - "" - ); - } + for (const lot of responseJSON.lots) { + resultsTbodyElement.insertAdjacentHTML( + 'beforeend', + '' + + ('') + + ('') + + ('') + + ('') + + '' + ) + } - searchResultsContainerElement.innerHTML = `
" + - '' + - cityssm.escapeHTML(lot.lotName || "") + - "" + - "" + - '' + - (lot.mapName - ? cityssm.escapeHTML(lot.mapName) - : '(No Name)') + - "" + - "" + cityssm.escapeHTML(lot.lotType || "") + "" + - (lot.lotStatusId - ? cityssm.escapeHTML(lot.lotStatus || "") - : '(No Status)') + - "
" + - (lot.lotOccupancyCount! > 0 - ? 'Currently Occupied' - : "") + - "
' + + '' + + cityssm.escapeHTML(lot.lotName || '') + + '' + + '' + + '' + + (lot.mapName + ? cityssm.escapeHTML(lot.mapName) + : '(No Name)') + + '' + + '' + cityssm.escapeHTML(lot.lotType || '') + '' + + (lot.lotStatusId + ? cityssm.escapeHTML(lot.lotStatus || '') + : '(No Status)') + + '
' + + (lot.lotOccupancyCount! > 0 + ? 'Currently Occupied' + : '') + + '
+ searchResultsContainerElement.innerHTML = `
-
${los.escapedAliases.Lot} ${los.escapedAliases.Map} ${los.escapedAliases.Lot} Type Status
`; +
` - 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) - searchResultsContainerElement - .querySelector("button[data-page='previous']") - ?.addEventListener("click", previousAndGetLots); + searchResultsContainerElement + .querySelector("button[data-page='previous']") + ?.addEventListener('click', previousAndGetLots) - searchResultsContainerElement - .querySelector("button[data-page='next']") - ?.addEventListener("click", nextAndGetLots); - } + searchResultsContainerElement + .querySelector("button[data-page='next']") + ?.addEventListener('click', nextAndGetLots) + } - function getLots(): void { - searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML( - `Loading ${los.escapedAliases.Lots}...` - ); + function getLots(): void { + 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(): void { - offsetElement.value = "0"; - getLots(); - } + function resetOffsetAndGetLots(): void { + offsetElement.value = '0' + getLots() + } - function previousAndGetLots(): void { - offsetElement.value = Math.max(Number.parseInt(offsetElement.value, 10) - limit, 0).toString(); - getLots(); - } + function previousAndGetLots(): void { + offsetElement.value = Math.max( + Number.parseInt(offsetElement.value, 10) - limit, + 0 + ).toString() + getLots() + } - function nextAndGetLots(): void { - offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString(); - getLots(); - } + function nextAndGetLots(): void { + offsetElement.value = ( + Number.parseInt(offsetElement.value, 10) + limit + ).toString() + getLots() + } - const filterElements = searchFilterFormElement.querySelectorAll("input, select") as NodeListOf< - HTMLInputElement | HTMLSelectElement - >; + const filterElements = searchFilterFormElement.querySelectorAll( + 'input, select' + ) as NodeListOf - for (const filterElement of filterElements) { - filterElement.addEventListener("change", resetOffsetAndGetLots); - } + for (const filterElement of filterElements) { + filterElement.addEventListener('change', resetOffsetAndGetLots) + } - searchFilterFormElement.addEventListener("submit", (formEvent) => { - formEvent.preventDefault(); - resetOffsetAndGetLots(); - }); + searchFilterFormElement.addEventListener('submit', (formEvent) => { + formEvent.preventDefault() + resetOffsetAndGetLots() + }) - getLots(); -})(); + getLots() +})() diff --git a/public-typescript/lotView.js b/public-typescript/lotView.js index f895e781..b0b4c5aa 100644 --- a/public-typescript/lotView.js +++ b/public-typescript/lotView.js @@ -2,8 +2,9 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ Object.defineProperty(exports, "__esModule", { value: true }); (() => { - const mapContainerElement = document.querySelector("#lot--map"); + const mapContainerElement = document.querySelector('#lot--map'); if (mapContainerElement) { - exports.los.highlightMap(mapContainerElement, mapContainerElement.dataset.mapKey, "success"); + ; + exports.los.highlightMap(mapContainerElement, mapContainerElement.dataset.mapKey, 'success'); } })(); diff --git a/public-typescript/lotView.ts b/public-typescript/lotView.ts index f39189d2..b7109684 100644 --- a/public-typescript/lotView.ts +++ b/public-typescript/lotView.ts @@ -1,15 +1,14 @@ /* 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 -(() => { - const mapContainerElement = document.querySelector("#lot--map") as HTMLElement; - - if (mapContainerElement) { - (exports.los as globalTypes.LOS).highlightMap( - mapContainerElement, - mapContainerElement.dataset.mapKey!, - "success" - ); - } -})(); + if (mapContainerElement) { + ;(exports.los as globalTypes.LOS).highlightMap( + mapContainerElement, + mapContainerElement.dataset.mapKey!, + 'success' + ) + } +})() diff --git a/public-typescript/main.js b/public-typescript/main.js index 1bbff331..b591cd5f 100644 --- a/public-typescript/main.js +++ b/public-typescript/main.js @@ -28,33 +28,34 @@ Object.defineProperty(exports, "__esModule", { value: true }); let svgElementToHighlight; // eslint-disable-next-line no-constant-condition while (true) { - svgElementToHighlight = mapContainerElement.querySelector("#" + svgId); - if (svgElementToHighlight || !svgId.includes("-")) { + svgElementToHighlight = mapContainerElement.querySelector('#' + svgId); + if (svgElementToHighlight || !svgId.includes('-')) { break; } - svgId = svgId.slice(0, Math.max(0, svgId.lastIndexOf("-"))); + svgId = svgId.slice(0, Math.max(0, svgId.lastIndexOf('-'))); } if (svgElementToHighlight) { // eslint-disable-next-line unicorn/no-null - svgElementToHighlight.style.fill = ""; - svgElementToHighlight.classList.add("highlight", "is-" + contextualClass); - const childPathElements = svgElementToHighlight.querySelectorAll("path"); + 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 = ""; + pathElement.style.fill = ''; } } } function unlockField(clickEvent) { - const fieldElement = clickEvent.currentTarget.closest(".field"); - const inputOrSelectElement = fieldElement.querySelector("input, select"); - inputOrSelectElement.classList.remove("is-readonly"); - if (inputOrSelectElement.tagName === "INPUT") { + const fieldElement = clickEvent.currentTarget.closest('.field'); + const inputOrSelectElement = fieldElement.querySelector('input, select'); + inputOrSelectElement.classList.remove('is-readonly'); + if (inputOrSelectElement.tagName === 'INPUT') { + ; inputOrSelectElement.readOnly = false; inputOrSelectElement.disabled = false; } else { - const optionElements = inputOrSelectElement.querySelectorAll("option"); + const optionElements = inputOrSelectElement.querySelectorAll('option'); for (const optionElement of optionElements) { optionElement.disabled = false; } @@ -62,20 +63,20 @@ Object.defineProperty(exports, "__esModule", { value: true }); inputOrSelectElement.focus(); } function initializeUnlockFieldButtons(containerElement) { - const unlockFieldButtonElements = containerElement.querySelectorAll(".is-unlock-field-button"); + const unlockFieldButtonElements = containerElement.querySelectorAll('.is-unlock-field-button'); for (const unlockFieldButtonElement of unlockFieldButtonElements) { - unlockFieldButtonElement.addEventListener("click", unlockField); + unlockFieldButtonElement.addEventListener('click', unlockField); } } /* * Date Pickers */ const datePickerBaseOptions = { - type: "date", - dateFormat: "yyyy-MM-dd", + type: 'date', + dateFormat: 'yyyy-MM-dd', showFooter: false, - color: "info", - displayMode: "dialog" + color: 'info', + displayMode: 'dialog' }; function initializeDatePickers(containerElement) { 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]; // trigger change event on original element - cal.on("save", () => { + cal.on('save', () => { dateElement.value = cal.value(); - dateElement.dispatchEvent(new Event("change")); + dateElement.dispatchEvent(new Event('change')); }); // Disable html scrolling when calendar is open - cal.on("show", () => { - document.querySelector("html").classList.add("is-clipped"); + cal.on('show', () => { + document.querySelector('html').classList.add('is-clipped'); }); // Reenable scrolling, if a modal window is not open - cal.on("hide", () => { + cal.on('hide', () => { bulmaJS.toggleHtmlClipped(); }); // 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 - const datePickerNavButtonElements = datepickerElement.querySelectorAll(".datepicker-nav button.is-text"); + 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"); + datePickerNavButtonElement.classList.add('is-' + datePickerBaseOptions.color); + datePickerNavButtonElement.classList.remove('is-text'); } // Override the clear button style - const clearButtonElement = datepickerElement.querySelector(".datetimepicker-clear-button"); + const clearButtonElement = datepickerElement.querySelector('.datetimepicker-clear-button'); if (clearButtonElement) { if (dateElement.required) { clearButtonElement.remove(); } else { - clearButtonElement.dataset.tooltip = "Clear"; - clearButtonElement.ariaLabel = "Clear"; + clearButtonElement.dataset.tooltip = 'Clear'; + clearButtonElement.ariaLabel = 'Clear'; clearButtonElement.innerHTML = ''; } @@ -130,119 +131,118 @@ Object.defineProperty(exports, "__esModule", { value: true }); // Apply a label const labelElement = document.querySelector("label[for='" + dateElement.id + "']"); if (labelElement) { - datepickerElement.querySelector(".datetimepicker-dummy-input").ariaLabel = - labelElement.textContent; + datepickerElement.querySelector('.datetimepicker-dummy-input').ariaLabel = labelElement.textContent; } } } /* - const timePickerBaseOptions: BulmaCalendarOptions = { - type: "time", - timeFormat: "hh:mm", - color: "info", - displayMode: "dialog", - validateLabel: "Set Time", - minuteSteps: 1 - }; - - const initializeTimePickers = (containerElement: HTMLElement) => { - - const timeElements = containerElement.querySelectorAll( - "input[type='time']" - ) as NodeListOf; - - for (const timeElement of timeElements) { - const timePickerOptions = Object.assign({}, timePickerBaseOptions); - - if (timeElement.required) { - timePickerOptions.showClearButton = false; - } - - const cal = exports.bulmaCalendar.attach(timeElement, timePickerOptions)[0]; - - // trigger change event on original element - cal.on("save", () => { - timeElement.value = cal.value(); - timeElement.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 timePickerElement = containerElement.querySelector("#" + cal._id) as HTMLElement; - - // Remove "cancel" button - - const timePickerCancelButtonElement = timePickerElement.querySelector( - ".datetimepicker-footer-cancel" - ); - - if (timePickerCancelButtonElement) { - timePickerCancelButtonElement.remove(); - } - - // Override the clear button style - - const clearButtonElement = timePickerElement.querySelector( - ".datetimepicker-clear-button" - ) as HTMLElement; - - if (clearButtonElement) { - if (timeElement.required) { - clearButtonElement.remove(); - } else { - clearButtonElement.dataset.tooltip = "Clear"; - clearButtonElement.innerHTML = - ''; - } - } - } - }; - */ + const timePickerBaseOptions: BulmaCalendarOptions = { + type: "time", + timeFormat: "hh:mm", + color: "info", + displayMode: "dialog", + validateLabel: "Set Time", + minuteSteps: 1 + }; + + const initializeTimePickers = (containerElement: HTMLElement) => { + + const timeElements = containerElement.querySelectorAll( + "input[type='time']" + ) as NodeListOf; + + for (const timeElement of timeElements) { + const timePickerOptions = Object.assign({}, timePickerBaseOptions); + + if (timeElement.required) { + timePickerOptions.showClearButton = false; + } + + const cal = exports.bulmaCalendar.attach(timeElement, timePickerOptions)[0]; + + // trigger change event on original element + cal.on("save", () => { + timeElement.value = cal.value(); + timeElement.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 timePickerElement = containerElement.querySelector("#" + cal._id) as HTMLElement; + + // Remove "cancel" button + + const timePickerCancelButtonElement = timePickerElement.querySelector( + ".datetimepicker-footer-cancel" + ); + + if (timePickerCancelButtonElement) { + timePickerCancelButtonElement.remove(); + } + + // Override the clear button style + + const clearButtonElement = timePickerElement.querySelector( + ".datetimepicker-clear-button" + ) as HTMLElement; + + if (clearButtonElement) { + if (timeElement.required) { + clearButtonElement.remove(); + } else { + clearButtonElement.dataset.tooltip = "Clear"; + clearButtonElement.innerHTML = + ''; + } + } + } + }; + */ /* * Aliases */ function populateAliases(containerElement) { - const aliasElements = containerElement.querySelectorAll(".alias"); + const aliasElements = containerElement.querySelectorAll('.alias'); for (const aliasElement of aliasElements) { switch (aliasElement.dataset.alias) { - case "Map": { + case 'Map': { aliasElement.textContent = exports.aliases.map; break; } - case "Lot": { + case 'Lot': { aliasElement.textContent = exports.aliases.lot; break; } - case "lot": { + case 'lot': { aliasElement.textContent = exports.aliases.lot.toLowerCase(); break; } - case "Occupancy": { + case 'Occupancy': { aliasElement.textContent = exports.aliases.occupancy; break; } - case "occupancy": { + case 'occupancy': { aliasElement.textContent = exports.aliases.occupancy.toLowerCase(); break; } - case "Occupant": { + case 'Occupant': { aliasElement.textContent = exports.aliases.occupant; break; } - case "occupant": { + case 'occupant': { aliasElement.textContent = exports.aliases.occupant.toLowerCase(); break; } - case "ExternalReceiptNumber": { + case 'ExternalReceiptNumber': { aliasElement.textContent = exports.aliases.externalReceiptNumber; break; } @@ -278,17 +278,18 @@ Object.defineProperty(exports, "__esModule", { value: true }); /* * Colours */ - const hues = ["red", "green", "orange", "blue", "pink", "yellow", "purple"]; - const luminosity = ["bright", "light", "dark"]; + const hues = ['red', 'green', 'orange', 'blue', 'pink', 'yellow', 'purple']; + const luminosity = ['bright', 'light', 'dark']; function getRandomColor(seedString) { let actualSeedString = seedString; if (actualSeedString.length < 2) { - actualSeedString = actualSeedString + "a1"; + 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] + luminosity: luminosity[actualSeedString.codePointAt(actualSeedString.length - 2) % + luminosity.length] }); } /* @@ -298,21 +299,21 @@ Object.defineProperty(exports, "__esModule", { value: true }); return `
`; } - function getLoadingParagraphHTML(captionText = "Loading...") { + function getLoadingParagraphHTML(captionText = 'Loading...') { return `


${cityssm.escapeHTML(captionText)} @@ -322,63 +323,63 @@ Object.defineProperty(exports, "__esModule", { value: true }); return ('

' + ('
' + '
' + - "Displaying " + + 'Displaying ' + (offset + 1).toString() + - " to " + + ' to ' + Math.min(count, limit + offset) + - " of " + + ' of ' + count + - "
" + - "
") + + '
' + + '') + ('
' + (offset > 0 ? '
' + '" + - "
" - : "") + + '' + + '
' + : '') + (limit + offset < count ? '
' + '" + - "
" - : "") + - "") + - ""); + '' + + '' + : '') + + '') + + ''); } /* * URLs */ - const urlPrefix = document.querySelector("main").dataset.urlPrefix; + const urlPrefix = document.querySelector('main').dataset.urlPrefix; function getRecordURL(recordTypePlural, recordId, edit, time) { return (urlPrefix + - "/" + + '/' + recordTypePlural + - (recordId ? "/" + recordId : "") + - (recordId && edit ? "/edit" : "") + - (time ? "/?t=" + Date.now() : "")); + (recordId ? '/' + recordId : '') + + (recordId && edit ? '/edit' : '') + + (time ? '/?t=' + Date.now() : '')); } - function getMapURL(mapId = "", edit = false, time = false) { - return getRecordURL("maps", mapId, edit, time); + function getMapURL(mapId = '', edit = false, time = false) { + return getRecordURL('maps', mapId, edit, time); } - function getLotURL(lotId = "", edit = false, time = false) { - return getRecordURL("lots", lotId, edit, time); + function getLotURL(lotId = '', edit = false, time = false) { + return getRecordURL('lots', lotId, edit, time); } - function getLotOccupancyURL(lotOccupancyId = "", edit = false, time = false) { - return getRecordURL("lotOccupancies", lotOccupancyId, edit, time); + function getLotOccupancyURL(lotOccupancyId = '', edit = false, time = false) { + return getRecordURL('lotOccupancies', lotOccupancyId, edit, time); } - function getWorkOrderURL(workOrderId = "", edit = false, time = false) { - return getRecordURL("workOrders", workOrderId, edit, time); + function getWorkOrderURL(workOrderId = '', edit = false, time = false) { + return getRecordURL('workOrders', workOrderId, edit, time); } /* * Declare LOS */ const los = { urlPrefix, - apiKey: document.querySelector("main").dataset.apiKey, + apiKey: document.querySelector('main').dataset.apiKey, highlightMap, initializeUnlockFieldButtons, initializeDatePickers, diff --git a/public-typescript/main.ts b/public-typescript/main.ts index 20e9ae66..b44ddb3e 100644 --- a/public-typescript/main.ts +++ b/public-typescript/main.ts @@ -1,196 +1,210 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ -import type * as globalTypes from "../types/globalTypes"; -import type { Options as BulmaCalendarOptions } from "bulma-calendar"; -import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; -import type { BulmaJS } from "@cityssm/bulma-js/types"; +import type * as globalTypes from '../types/globalTypes' +import type { Options as BulmaCalendarOptions } from 'bulma-calendar' +import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types' +import type { BulmaJS } from '@cityssm/bulma-js/types' -declare const cityssm: cityssmGlobal; -declare const bulmaJS: BulmaJS; +declare const cityssm: cityssmGlobal +declare const bulmaJS: BulmaJS -(() => { - /* - * Unsaved Changes - */ +;(() => { + /* + * Unsaved Changes + */ - let _hasUnsavedChanges = false; + let _hasUnsavedChanges = false - function setUnsavedChanges() { - if (!hasUnsavedChanges()) { - _hasUnsavedChanges = true; - cityssm.enableNavBlocker(); - } + function setUnsavedChanges() { + if (!hasUnsavedChanges()) { + _hasUnsavedChanges = true + 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() { - _hasUnsavedChanges = false; - cityssm.disableNavBlocker(); + if (svgElementToHighlight) { + // eslint-disable-next-line unicorn/no-null + 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() { - return _hasUnsavedChanges; + inputOrSelectElement.focus() + } + + 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( - mapContainerElement: HTMLElement, - mapKey: string, - contextualClass: "success" | "danger" - ): void { - // Search for ID - let svgId = mapKey; - let svgElementToHighlight: SVGElement | null; + const datePickerBaseOptions: BulmaCalendarOptions = { + type: 'date', + dateFormat: 'yyyy-MM-dd', + showFooter: false, + color: 'info', + displayMode: 'dialog' + } - // eslint-disable-next-line no-constant-condition - while (true) { - svgElementToHighlight = mapContainerElement.querySelector("#" + svgId); + function initializeDatePickers(containerElement: HTMLElement): void { + const dateElements = containerElement.querySelectorAll( + "input[type='date']" + ) as NodeListOf - if (svgElementToHighlight || !svgId.includes("-")) { - break; - } + for (const dateElement of dateElements) { + const datePickerOptions = Object.assign({}, datePickerBaseOptions) - svgId = svgId.slice(0, Math.max(0, svgId.lastIndexOf("-"))); - } + if (dateElement.required) { + datePickerOptions.showClearButton = false + } - if (svgElementToHighlight) { - // eslint-disable-next-line unicorn/no-null - svgElementToHighlight.style.fill = ""; + // apply min date if set + if (dateElement.min) { + 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"); - for (const pathElement of childPathElements) { - // eslint-disable-next-line unicorn/no-null - pathElement.style.fill = ""; - } - } - } + const cal = exports.bulmaCalendar.attach( + dateElement, + datePickerOptions + )[0] - function unlockField(clickEvent: Event): void { - const fieldElement = (clickEvent.currentTarget as HTMLElement).closest(".field")!; + // trigger change event on original element + cal.on('save', () => { + dateElement.value = cal.value() + dateElement.dispatchEvent(new Event('change')) + }) - const inputOrSelectElement = fieldElement.querySelector("input, select") as - | HTMLInputElement - | HTMLSelectElement; + // Disable html scrolling when calendar is open + cal.on('show', () => { + 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") { - (inputOrSelectElement as HTMLInputElement).readOnly = false; - (inputOrSelectElement as HTMLInputElement).disabled = false; + // 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 { - const optionElements = inputOrSelectElement.querySelectorAll("option"); - for (const optionElement of optionElements) { - optionElement.disabled = false; - } + clearButtonElement.dataset.tooltip = 'Clear' + clearButtonElement.ariaLabel = 'Clear' + clearButtonElement.innerHTML = + '' } + } - 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; - - 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 = - ''; - } - } - - // Apply a label - const labelElement = document.querySelector("label[for='" + dateElement.id + "']"); - - if (labelElement) { - datepickerElement.querySelector(".datetimepicker-dummy-input")!.ariaLabel = - labelElement.textContent; - } - } - } - - /* + /* const timePickerBaseOptions: BulmaCalendarOptions = { type: "time", timeFormat: "hh:mm", @@ -263,242 +277,275 @@ declare const bulmaJS: BulmaJS; }; */ - /* - * Aliases - */ + /* + * Aliases + */ - function populateAliases(containerElement: HTMLElement): void { - const aliasElements = containerElement.querySelectorAll(".alias") as NodeListOf; + function populateAliases(containerElement: HTMLElement): void { + const aliasElements = containerElement.querySelectorAll( + '.alias' + ) as NodeListOf - for (const aliasElement of aliasElements) { - switch (aliasElement.dataset.alias) { - case "Map": { - aliasElement.textContent = exports.aliases.map; - 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; - } - } + for (const aliasElement of aliasElements) { + switch (aliasElement.dataset.alias) { + case 'Map': { + aliasElement.textContent = exports.aliases.map + 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({ - 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()), + return exports.randomColor({ + seed: actualSeedString + actualSeedString, + hue: hues[ + actualSeedString.codePointAt(actualSeedString.length - 1)! % hues.length + ], + luminosity: + luminosity[ + actualSeedString.codePointAt(actualSeedString.length - 2)! % + luminosity.length + ] + }) + } - 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()), + /* + * Bulma Snippets + */ - 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"; - } - - 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 `
+ function getMoveUpDownButtonFieldHTML( + upButtonClassNames: string, + downButtonClassNames: string, + isSmall = true + ): string { + return `
-
`; - } +
` + } - function getLoadingParagraphHTML(captionText = "Loading..."): string { - return `

+ function getLoadingParagraphHTML(captionText = 'Loading...'): string { + return `


${cityssm.escapeHTML(captionText)} -

`; - } +

` + } - function getSearchResultsPagerHTML(limit: number, offset: number, count: number) { - return ( - '
' + - ('
' + - '
' + - "Displaying " + - (offset + 1).toString() + - " to " + - Math.min(count, limit + offset) + - " of " + - count + - "
" + - "
") + - ('
' + - (offset > 0 - ? '
' + - '" + - "
" - : "") + - (limit + offset < count - ? '
' + - '" + - "
" - : "") + - "
") + - "
" - ); - } + function getSearchResultsPagerHTML( + limit: number, + offset: number, + count: number + ) { + return ( + '
' + + ('
' + + '
' + + 'Displaying ' + + (offset + 1).toString() + + ' to ' + + Math.min(count, limit + offset) + + ' of ' + + count + + '
' + + '
') + + ('
' + + (offset > 0 + ? '
' + + '' + + '
' + : '') + + (limit + offset < count + ? '
' + + '' + + '
' + : '') + + '
') + + '
' + ) + } - /* - * URLs - */ + /* + * URLs + */ - const urlPrefix = document.querySelector("main")!.dataset.urlPrefix!; + const urlPrefix = document.querySelector('main')!.dataset.urlPrefix! - function getRecordURL( - recordTypePlural: "maps" | "lots" | "lotOccupancies" | "workOrders", - recordId: number | string, - edit: boolean, - time: boolean - ): string { - return ( - urlPrefix + - "/" + - recordTypePlural + - (recordId ? "/" + recordId : "") + - (recordId && edit ? "/edit" : "") + - (time ? "/?t=" + Date.now() : "") - ); - } + function getRecordURL( + recordTypePlural: 'maps' | 'lots' | 'lotOccupancies' | 'workOrders', + recordId: number | string, + edit: boolean, + time: boolean + ): string { + return ( + urlPrefix + + '/' + + recordTypePlural + + (recordId ? '/' + recordId : '') + + (recordId && edit ? '/edit' : '') + + (time ? '/?t=' + Date.now() : '') + ) + } - function getMapURL(mapId: number | string = "", edit = false, time = false) { - return getRecordURL("maps", mapId, edit, time); - } + function getMapURL(mapId: number | string = '', edit = false, time = false) { + return getRecordURL('maps', mapId, edit, time) + } - function getLotURL(lotId: number | string = "", edit = false, time = false) { - return getRecordURL("lots", lotId, edit, time); - } + function getLotURL(lotId: number | string = '', edit = false, time = false) { + return getRecordURL('lots', lotId, edit, time) + } - function getLotOccupancyURL(lotOccupancyId: number | string = "", edit = false, time = false) { - return getRecordURL("lotOccupancies", lotOccupancyId, edit, time); - } + function getLotOccupancyURL( + lotOccupancyId: number | string = '', + edit = false, + time = false + ) { + return getRecordURL('lotOccupancies', lotOccupancyId, edit, time) + } - function getWorkOrderURL(workOrderId: number | string = "", edit = false, time = false) { - return getRecordURL("workOrders", workOrderId, edit, time); - } + function getWorkOrderURL( + workOrderId: number | string = '', + edit = false, + time = false + ) { + return getRecordURL('workOrders', workOrderId, edit, time) + } - /* - * Declare LOS - */ + /* + * Declare LOS + */ - const los: globalTypes.LOS = { - urlPrefix, - apiKey: document.querySelector("main")!.dataset.apiKey!, - highlightMap, - initializeUnlockFieldButtons, - initializeDatePickers, + const los: globalTypes.LOS = { + urlPrefix, + apiKey: document.querySelector('main')!.dataset.apiKey!, + highlightMap, + initializeUnlockFieldButtons, + initializeDatePickers, - populateAliases, - escapedAliases, + populateAliases, + escapedAliases, - getRandomColor, + getRandomColor, - setUnsavedChanges, - clearUnsavedChanges, - hasUnsavedChanges, + setUnsavedChanges, + clearUnsavedChanges, + hasUnsavedChanges, - getMoveUpDownButtonFieldHTML, - getLoadingParagraphHTML, - getSearchResultsPagerHTML, + getMoveUpDownButtonFieldHTML, + getLoadingParagraphHTML, + getSearchResultsPagerHTML, - getMapURL, - getLotURL, - getLotOccupancyURL, - getWorkOrderURL - }; + getMapURL, + getLotURL, + getLotOccupancyURL, + getWorkOrderURL + } - exports.los = los; -})(); + exports.los = los +})() diff --git a/public-typescript/mapEdit.js b/public-typescript/mapEdit.js index 125b4f11..ad4d158b 100644 --- a/public-typescript/mapEdit.js +++ b/public-typescript/mapEdit.js @@ -4,42 +4,45 @@ Object.defineProperty(exports, "__esModule", { value: true }); (() => { var _a; const los = exports.los; - const mapId = document.querySelector("#map--mapId").value; - const isCreate = mapId === ""; - const mapForm = document.querySelector("#form--map"); + const mapId = document.querySelector('#map--mapId') + .value; + const isCreate = mapId === ''; + const mapForm = document.querySelector('#form--map'); function updateMap(formEvent) { 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) { cityssm.disableNavBlocker(); if (isCreate) { - window.location.href = los.urlPrefix + "/maps/" + responseJSON.mapId + "/edit"; + window.location.href = + los.urlPrefix + '/maps/' + responseJSON.mapId + '/edit'; } else { bulmaJS.alert({ - message: exports.aliases.map + " Updated Successfully", - contextualColorName: "success" + message: exports.aliases.map + ' Updated Successfully', + contextualColorName: 'success' }); } } else { bulmaJS.alert({ - title: "Error Updating " + exports.aliases.map, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Updating ' + exports.aliases.map, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); } - mapForm.addEventListener("submit", updateMap); - const inputElements = mapForm.querySelectorAll("input, select"); + mapForm.addEventListener('submit', updateMap); + const inputElements = mapForm.querySelectorAll('input, select'); 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(); function doDelete() { - cityssm.postJSON(los.urlPrefix + "/maps/doDeleteMap", { + cityssm.postJSON(los.urlPrefix + '/maps/doDeleteMap', { mapId }, (responseJSON) => { if (responseJSON.success) { @@ -47,17 +50,17 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Deleting " + exports.aliases.map, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Deleting ' + exports.aliases.map, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); } 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()}?`, - contextualColorName: "warning", + contextualColorName: 'warning', okButton: { text: `Yes, Delete ${exports.aliases.map}`, callbackFunction: doDelete diff --git a/public-typescript/mapEdit.ts b/public-typescript/mapEdit.ts index efe33fe9..9878dfa8 100644 --- a/public-typescript/mapEdit.ts +++ b/public-typescript/mapEdit.ts @@ -1,91 +1,99 @@ /* 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 { BulmaJS } from "@cityssm/bulma-js/types"; +import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types' +import type { BulmaJS } from '@cityssm/bulma-js/types' -declare const cityssm: cityssmGlobal; -declare const bulmaJS: BulmaJS; +declare const cityssm: cityssmGlobal +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 isCreate = mapId === ""; + const mapId = (document.querySelector('#map--mapId') as HTMLInputElement) + .value + const isCreate = mapId === '' - const mapForm = document.querySelector("#form--map") as HTMLFormElement; + const mapForm = document.querySelector('#form--map') as HTMLFormElement - function updateMap(formEvent: SubmitEvent) { - formEvent.preventDefault(); + function updateMap(formEvent: SubmitEvent) { + formEvent.preventDefault() - cityssm.postJSON( - los.urlPrefix + "/maps/" + (isCreate ? "doCreateMap" : "doUpdateMap"), - mapForm, - (responseJSON: { success: boolean; mapId?: number; errorMessage?: string }) => { - if (responseJSON.success) { - cityssm.disableNavBlocker(); + cityssm.postJSON( + los.urlPrefix + '/maps/' + (isCreate ? 'doCreateMap' : 'doUpdateMap'), + mapForm, + (responseJSON: { + success: boolean + mapId?: number + errorMessage?: string + }) => { + if (responseJSON.success) { + cityssm.disableNavBlocker() - if (isCreate) { - window.location.href = los.urlPrefix + "/maps/" + responseJSON.mapId + "/edit"; - } else { - bulmaJS.alert({ - message: exports.aliases.map + " Updated Successfully", - contextualColorName: "success" - }); - } - } else { - bulmaJS.alert({ - title: "Error Updating " + exports.aliases.map, - 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" - }); - } - } - ); + if (isCreate) { + window.location.href = + los.urlPrefix + '/maps/' + responseJSON.mapId + '/edit' + } else { + bulmaJS.alert({ + message: exports.aliases.map + ' Updated Successfully', + contextualColorName: 'success' + }) + } + } else { + bulmaJS.alert({ + title: 'Error Updating ' + 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 + 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({ + 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 + } + }) + }) +})() diff --git a/public-typescript/mapSearch.js b/public-typescript/mapSearch.js index 8d3af172..9c4e2232 100644 --- a/public-typescript/mapSearch.js +++ b/public-typescript/mapSearch.js @@ -4,13 +4,16 @@ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; const maps = exports.maps; - const searchFilterElement = document.querySelector("#searchFilter--map"); - const searchResultsContainerElement = document.querySelector("#container--searchResults"); + const searchFilterElement = document.querySelector('#searchFilter--map'); + const searchResultsContainerElement = document.querySelector('#container--searchResults'); function renderResults() { searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(`Loading ${los.escapedAliases.Maps}...`); let searchResultCount = 0; - const searchResultsTbodyElement = document.createElement("tbody"); - const filterStringSplit = searchFilterElement.value.trim().toLowerCase().split(" "); + const searchResultsTbodyElement = document.createElement('tbody'); + const filterStringSplit = searchFilterElement.value + .trim() + .toLowerCase() + .split(' '); for (const map of maps) { const mapSearchString = `${map.mapName} ${map.mapDescription} ${map.mapAddress1} ${map.mapAddress2}`.toLowerCase(); let showMap = true; @@ -24,62 +27,66 @@ Object.defineProperty(exports, "__esModule", { value: true }); continue; } searchResultCount += 1; - searchResultsTbodyElement.insertAdjacentHTML("beforeend", "
" + - ("' + + ('") + - ("') + + ('") + - ("") + + ? cityssm.escapeHTML(map.mapCity || '') + + ', ' + + cityssm.escapeHTML(map.mapProvince || '') + + '
' + : '') + + (map.mapPostalCode ? cityssm.escapeHTML(map.mapPostalCode) : '') + + '') + + ('') + '" + + : '') + + '' + '" + + : '') + + '' + ('") + - ""); + '' + + '') + + ''); } - searchResultsContainerElement.innerHTML = ""; + searchResultsContainerElement.innerHTML = ''; if (searchResultCount === 0) { searchResultsContainerElement.innerHTML = `

There are no ${los.escapedAliases.maps} that meet the search criteria.

`; } else { - const searchResultsTableElement = document.createElement("table"); + const searchResultsTableElement = document.createElement('table'); searchResultsTableElement.className = - "table is-fullwidth is-striped is-hoverable has-sticky-header"; + 'table is-fullwidth is-striped is-hoverable has-sticky-header'; searchResultsTableElement.innerHTML = ` @@ -92,8 +99,10 @@ Object.defineProperty(exports, "__esModule", { value: true }); searchResultsContainerElement.append(searchResultsTableElement); } } - searchFilterElement.addEventListener("keyup", renderResults); - document.querySelector("#form--searchFilters").addEventListener("submit", (formEvent) => { + searchFilterElement.addEventListener('keyup', renderResults); + document + .querySelector('#form--searchFilters') + .addEventListener('submit', (formEvent) => { formEvent.preventDefault(); renderResults(); }); diff --git a/public-typescript/mapSearch.ts b/public-typescript/mapSearch.ts index 3d5db3e5..593edf78 100644 --- a/public-typescript/mapSearch.ts +++ b/public-typescript/mapSearch.ts @@ -1,133 +1,146 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ -import type * as globalTypes from "../types/globalTypes"; -import type * as recordTypes from "../types/recordTypes"; +import type * as globalTypes from '../types/globalTypes' +import type * as recordTypes from '../types/recordTypes' -import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; +import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types' -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 { - searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML( - `Loading ${los.escapedAliases.Maps}...` - ); + function renderResults(): void { + searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML( + `Loading ${los.escapedAliases.Maps}...` + ) - let searchResultCount = 0; - const searchResultsTbodyElement = document.createElement("tbody"); + let searchResultCount = 0 + const searchResultsTbodyElement = document.createElement('tbody') - const filterStringSplit = searchFilterElement.value.trim().toLowerCase().split(" "); + const filterStringSplit = searchFilterElement.value + .trim() + .toLowerCase() + .split(' ') - for (const map of maps) { - const mapSearchString = - `${map.mapName} ${map.mapDescription} ${map.mapAddress1} ${map.mapAddress2}`.toLowerCase(); + for (const map of maps) { + const mapSearchString = + `${map.mapName} ${map.mapDescription} ${map.mapAddress1} ${map.mapAddress2}`.toLowerCase() - let showMap = true; + let showMap = true - for (const filterStringPiece of filterStringSplit) { - if (!mapSearchString.includes(filterStringPiece)) { - showMap = false; - break; - } - } - - if (!showMap) { - continue; - } - - searchResultCount += 1; - - searchResultsTbodyElement.insertAdjacentHTML( - "beforeend", - "" + - ("") + - ("") + - ("") + - '" + - '" + - ('") + - "" - ); + for (const filterStringPiece of filterStringSplit) { + if (!mapSearchString.includes(filterStringPiece)) { + showMap = false + break } + } - searchResultsContainerElement.innerHTML = ""; + if (!showMap) { + continue + } - if (searchResultCount === 0) { - searchResultsContainerElement.innerHTML = `
+ searchResultCount += 1 + + searchResultsTbodyElement.insertAdjacentHTML( + 'beforeend', + '
' + + ('') + + ('') + + ('') + + '' + + '' + + ('') + + '' + ) + } + + searchResultsContainerElement.innerHTML = '' + + if (searchResultCount === 0) { + searchResultsContainerElement.innerHTML = `

There are no ${los.escapedAliases.maps} that meet the search criteria.

-
`; - } else { - const searchResultsTableElement = document.createElement("table"); + ` + } else { + const searchResultsTableElement = document.createElement('table') - searchResultsTableElement.className = - "table is-fullwidth is-striped is-hoverable has-sticky-header"; + searchResultsTableElement.className = + 'table is-fullwidth is-striped is-hoverable has-sticky-header' - searchResultsTableElement.innerHTML = ` + searchResultsTableElement.innerHTML = ` - `; + ` - 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) => { - formEvent.preventDefault(); - renderResults(); - }); + document + .querySelector('#form--searchFilters')! + .addEventListener('submit', (formEvent) => { + formEvent.preventDefault() + renderResults() + }) - renderResults(); -})(); + renderResults() +})() diff --git a/public-typescript/mapView.js b/public-typescript/mapView.js index 139bcafb..98f537cd 100644 --- a/public-typescript/mapView.js +++ b/public-typescript/mapView.js @@ -2,7 +2,7 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ Object.defineProperty(exports, "__esModule", { value: true }); (() => { - const mapContainerElement = document.querySelector("#map--leaflet"); + const mapContainerElement = document.querySelector('#map--leaflet'); if (mapContainerElement) { const mapLatitude = Number.parseFloat(mapContainerElement.dataset.mapLatitude); 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 const map = L.map(mapContainerElement); map.setView(mapCoordinates, 15); - L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", { + L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: 19, - attribution: "© OpenStreetMap" + attribution: '© OpenStreetMap' }).addTo(map); L.marker(mapCoordinates).addTo(map); } diff --git a/public-typescript/mapView.ts b/public-typescript/mapView.ts index a2ee881e..d347f23c 100644 --- a/public-typescript/mapView.ts +++ b/public-typescript/mapView.ts @@ -1,33 +1,33 @@ /* 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( - "#map--leaflet" - ) as HTMLElement; +;(() => { + const mapContainerElement = document.querySelector( + '#map--leaflet' + ) as HTMLElement - if (mapContainerElement) { - const mapLatitude = Number.parseFloat( - mapContainerElement.dataset.mapLatitude! - ); - const mapLongitude = Number.parseFloat( - mapContainerElement.dataset.mapLongitude! - ); + if (mapContainerElement) { + const mapLatitude = Number.parseFloat( + mapContainerElement.dataset.mapLatitude! + ) + const mapLongitude = Number.parseFloat( + mapContainerElement.dataset.mapLongitude! + ) - const mapCoordinates: Leaflet.LatLngTuple = [mapLatitude, mapLongitude]; + const mapCoordinates: Leaflet.LatLngTuple = [mapLatitude, mapLongitude] - // eslint-disable-next-line unicorn/no-array-callback-reference - const map: Leaflet.Map = L.map(mapContainerElement); - map.setView(mapCoordinates, 15); + // eslint-disable-next-line unicorn/no-array-callback-reference + const map: Leaflet.Map = L.map(mapContainerElement) + map.setView(mapCoordinates, 15) - L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", { - maxZoom: 19, - attribution: "© OpenStreetMap" - }).addTo(map); + L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { + maxZoom: 19, + attribution: '© OpenStreetMap' + }).addTo(map) - L.marker(mapCoordinates).addTo(map); - } -})(); + L.marker(mapCoordinates).addTo(map) + } +})() diff --git a/public-typescript/reportSearch.js b/public-typescript/reportSearch.js index 5b9903e3..c8df8dc2 100644 --- a/public-typescript/reportSearch.js +++ b/public-typescript/reportSearch.js @@ -1,28 +1,29 @@ /* eslint-disable unicorn/prefer-module */ +; (() => { - const menuTabElements = document.querySelectorAll(".menu a"); - const tabContainerElements = document.querySelectorAll(".tabs-container > div"); + const menuTabElements = document.querySelectorAll('.menu a'); + const tabContainerElements = document.querySelectorAll('.tabs-container > div'); function selectTab(clickEvent) { clickEvent.preventDefault(); // Remove .is-active from all tabs for (const menuTabElement of menuTabElements) { - menuTabElement.classList.remove("is-active"); + menuTabElement.classList.remove('is-active'); } // Set .is-active on clicked tab const selectedTabElement = clickEvent.currentTarget; - selectedTabElement.classList.add("is-active"); + selectedTabElement.classList.add('is-active'); // 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) { if (tabContainerElement.id === selectedTabContainerId) { - tabContainerElement.classList.remove("is-hidden"); + tabContainerElement.classList.remove('is-hidden'); } else { - tabContainerElement.classList.add("is-hidden"); + tabContainerElement.classList.add('is-hidden'); } } } for (const menuTabElement of menuTabElements) { - menuTabElement.addEventListener("click", selectTab); + menuTabElement.addEventListener('click', selectTab); } })(); diff --git a/public-typescript/reportSearch.ts b/public-typescript/reportSearch.ts index 1ecb3100..e4af773e 100644 --- a/public-typescript/reportSearch.ts +++ b/public-typescript/reportSearch.ts @@ -1,38 +1,41 @@ /* eslint-disable unicorn/prefer-module */ -(() => { - const menuTabElements = document.querySelectorAll(".menu a") as NodeListOf; - const tabContainerElements = document.querySelectorAll( - ".tabs-container > div" - ) as NodeListOf; +;(() => { + const menuTabElements = document.querySelectorAll( + '.menu a' + ) as NodeListOf - function selectTab(clickEvent: Event) { - clickEvent.preventDefault(); + const tabContainerElements = document.querySelectorAll( + '.tabs-container > div' + ) as NodeListOf - // Remove .is-active from all tabs - for (const menuTabElement of menuTabElements) { - 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"); - } - } - } + function selectTab(clickEvent: Event) { + clickEvent.preventDefault() + // Remove .is-active from all tabs 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) + } +})() diff --git a/public-typescript/workOrderEdit.js b/public-typescript/workOrderEdit.js index b20f52e9..2d85c11d 100644 --- a/public-typescript/workOrderEdit.js +++ b/public-typescript/workOrderEdit.js @@ -4,16 +4,18 @@ Object.defineProperty(exports, "__esModule", { value: true }); (() => { var _a, _b; const los = exports.los; - const workOrderId = document.querySelector("#workOrderEdit--workOrderId").value; - const isCreate = workOrderId === ""; - const workOrderFormElement = document.querySelector("#form--workOrderEdit"); + const workOrderId = document.querySelector('#workOrderEdit--workOrderId').value; + const isCreate = workOrderId === ''; + const workOrderFormElement = document.querySelector('#form--workOrderEdit'); los.initializeDatePickers(workOrderFormElement - .querySelector("#workOrderEdit--workOrderOpenDateString") - .closest(".field")); + .querySelector('#workOrderEdit--workOrderOpenDateString') + .closest('.field')); los.initializeUnlockFieldButtons(workOrderFormElement); - workOrderFormElement.addEventListener("submit", (submitEvent) => { + workOrderFormElement.addEventListener('submit', (submitEvent) => { 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) { cityssm.disableNavBlocker(); if (isCreate) { @@ -21,105 +23,107 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - message: "Work Order Updated Successfully", - contextualColorName: "success" + message: 'Work Order Updated Successfully', + contextualColorName: 'success' }); } } else { bulmaJS.alert({ - title: "Error Updating Work Order", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Updating Work Order', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }); - const inputElements = workOrderFormElement.querySelectorAll("input, select"); + const inputElements = workOrderFormElement.querySelectorAll('input, select'); for (const inputElement of inputElements) { - inputElement.addEventListener("change", cityssm.enableNavBlocker); + inputElement.addEventListener('change', cityssm.enableNavBlocker); } /* * Work Order Options */ function doClose() { - cityssm.postJSON(los.urlPrefix + "/workOrders/doCloseWorkOrder", { + cityssm.postJSON(los.urlPrefix + '/workOrders/doCloseWorkOrder', { workOrderId }, (responseJSON) => { if (responseJSON.success) { - window.location.href = los.urlPrefix + "/workOrders/" + workOrderId; + window.location.href = los.urlPrefix + '/workOrders/' + workOrderId; } else { bulmaJS.alert({ - title: "Error Closing Work Order", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Closing Work Order', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); } function doDelete() { - cityssm.postJSON(los.urlPrefix + "/workOrders/doDeleteWorkOrder", { + cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrder', { workOrderId }, (responseJSON) => { if (responseJSON.success) { - window.location.href = los.urlPrefix + "/workOrders"; + window.location.href = los.urlPrefix + '/workOrders'; } else { bulmaJS.alert({ - title: "Error Deleting Work Order", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Deleting Work Order', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); } 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) => { return !milestone.workOrderMilestoneCompletionDate; }); if (hasOpenMilestones) { bulmaJS.alert({ - title: "Outstanding Milestones", + title: 'Outstanding Milestones', message: `You cannot close a work order with outstanding milestones. Either complete the outstanding milestones, or remove them from the work order.`, - contextualColorName: "warning" + contextualColorName: 'warning' }); /* - // Disable closing work orders with open milestones - bulmaJS.confirm({ - title: "Close Work Order with Outstanding Milestones", - message: - "Are you sure you want to close this work order with outstanding milestones?", - contextualColorName: "danger", - okButton: { - text: "Yes, Close Work Order", - callbackFunction: doClose - } - }); - */ + // Disable closing work orders with open milestones + bulmaJS.confirm({ + title: "Close Work Order with Outstanding Milestones", + message: + "Are you sure you want to close this work order with outstanding milestones?", + contextualColorName: "danger", + okButton: { + text: "Yes, Close Work Order", + callbackFunction: doClose + } + }); + */ } else { bulmaJS.confirm({ - title: "Close Work Order", - message: "Are you sure you want to close this work order?", - contextualColorName: "info", + title: 'Close Work Order', + message: 'Are you sure you want to close this work order?', + contextualColorName: 'info', okButton: { - text: "Yes, Close Work Order", + text: 'Yes, Close Work Order', 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(); bulmaJS.confirm({ - title: "Delete Work Order", - message: "Are you sure you want to delete this work order?", - contextualColorName: "warning", + title: 'Delete Work Order', + message: 'Are you sure you want to delete this work order?', + contextualColorName: 'warning', okButton: { - text: "Yes, Delete Work Order", + text: 'Yes, Delete Work Order', callbackFunction: doDelete } }); @@ -136,9 +140,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); let workOrderLotOccupancies = exports.workOrderLotOccupancies; delete exports.workOrderLotOccupancies; function deleteLotOccupancy(clickEvent) { - const lotOccupancyId = clickEvent.currentTarget.closest(".container--lotOccupancy").dataset.lotOccupancyId; + const lotOccupancyId = clickEvent.currentTarget.closest('.container--lotOccupancy').dataset.lotOccupancyId; function doDelete() { - cityssm.postJSON(los.urlPrefix + "/workOrders/doDeleteWorkOrderLotOccupancy", { + cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrderLotOccupancy', { workOrderId, lotOccupancyId }, (responseJSON) => { @@ -148,9 +152,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Deleting Relationship", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Deleting Relationship', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); @@ -158,15 +162,15 @@ Object.defineProperty(exports, "__esModule", { value: true }); bulmaJS.confirm({ 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.`, - contextualColorName: "warning", + contextualColorName: 'warning', okButton: { - text: "Yes, Delete Relationship", + text: 'Yes, Delete Relationship', callbackFunction: doDelete } }); } function addLot(lotId, callbackFunction) { - cityssm.postJSON(los.urlPrefix + "/workOrders/doAddWorkOrderLot", { + cityssm.postJSON(los.urlPrefix + '/workOrders/doAddWorkOrderLot', { workOrderId, lotId }, (responseJSON) => { @@ -176,9 +180,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Adding " + los.escapedAliases.Lot, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Adding ' + los.escapedAliases.Lot, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } if (callbackFunction) { @@ -187,7 +191,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); } function addLotOccupancy(lotOccupancyId, callbackFunction) { - cityssm.postJSON(los.urlPrefix + "/workOrders/doAddWorkOrderLotOccupancy", { + cityssm.postJSON(los.urlPrefix + '/workOrders/doAddWorkOrderLotOccupancy', { workOrderId, lotOccupancyId }, (responseJSON) => { @@ -197,9 +201,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Adding " + los.escapedAliases.Occupancy, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Adding ' + los.escapedAliases.Occupancy, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } if (callbackFunction) { @@ -213,9 +217,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); } function renderRelatedOccupancies() { var _a, _b; - const occupanciesContainerElement = document.querySelector("#container--lotOccupancies"); - document.querySelector(".tabs a[href='#relatedTab--lotOccupancies'] .tag").textContent = - workOrderLotOccupancies.length.toString(); + const occupanciesContainerElement = document.querySelector('#container--lotOccupancies'); + document.querySelector(".tabs a[href='#relatedTab--lotOccupancies'] .tag").textContent = workOrderLotOccupancies.length.toString(); if (workOrderLotOccupancies.length === 0) { occupanciesContainerElement.innerHTML = `

There are no ${los.escapedAliases.occupancies} associated with this work order.

@@ -233,10 +236,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
" + + searchResultsTbodyElement.insertAdjacentHTML('beforeend', '
' + '' + - cityssm.escapeHTML(map.mapName || "(No Name)") + - "
" + + cityssm.escapeHTML(map.mapName || '(No Name)') + + '
' + '' + - cityssm.escapeHTML(map.mapDescription || "") + - "" + - "
" + - (map.mapAddress1 ? cityssm.escapeHTML(map.mapAddress1) + "
" : "") + - (map.mapAddress2 ? cityssm.escapeHTML(map.mapAddress2) + "
" : "") + + cityssm.escapeHTML(map.mapDescription || '') + + '' + + '
' + + (map.mapAddress1 + ? cityssm.escapeHTML(map.mapAddress1) + '
' + : '') + + (map.mapAddress2 + ? cityssm.escapeHTML(map.mapAddress2) + '
' + : '') + (map.mapCity || map.mapProvince - ? cityssm.escapeHTML(map.mapCity || "") + - ", " + - cityssm.escapeHTML(map.mapProvince || "") + - "
" - : "") + - (map.mapPostalCode ? cityssm.escapeHTML(map.mapPostalCode) : "") + - "
" + cityssm.escapeHTML(map.mapPhoneNumber || "") + "' + cityssm.escapeHTML(map.mapPhoneNumber || '') + '' + (map.mapLatitude && map.mapLongitude ? '' - : "") + - "' + (map.mapSVG ? '' - : "") + - "' + '' + map.lotCount + - "" + - "
${los.escapedAliases.Map} Address
" + - '' + - cityssm.escapeHTML(map.mapName || "(No Name)") + - "
" + - '' + - cityssm.escapeHTML(map.mapDescription || "") + - "" + - "
" + - (map.mapAddress1 ? cityssm.escapeHTML(map.mapAddress1) + "
" : "") + - (map.mapAddress2 ? cityssm.escapeHTML(map.mapAddress2) + "
" : "") + - (map.mapCity || map.mapProvince - ? cityssm.escapeHTML(map.mapCity || "") + - ", " + - cityssm.escapeHTML(map.mapProvince || "") + - "
" - : "") + - (map.mapPostalCode ? cityssm.escapeHTML(map.mapPostalCode) : "") + - "
" + cityssm.escapeHTML(map.mapPhoneNumber || "") + "' + - (map.mapLatitude && map.mapLongitude - ? '' - : "") + - "' + - (map.mapSVG - ? '' - : "") + - "' + - '' + - map.lotCount + - "" + - "
' + + '' + + cityssm.escapeHTML(map.mapName || '(No Name)') + + '
' + + '' + + cityssm.escapeHTML(map.mapDescription || '') + + '' + + '
' + + (map.mapAddress1 + ? cityssm.escapeHTML(map.mapAddress1) + '
' + : '') + + (map.mapAddress2 + ? cityssm.escapeHTML(map.mapAddress2) + '
' + : '') + + (map.mapCity || map.mapProvince + ? cityssm.escapeHTML(map.mapCity || '') + + ', ' + + cityssm.escapeHTML(map.mapProvince || '') + + '
' + : '') + + (map.mapPostalCode ? cityssm.escapeHTML(map.mapPostalCode) : '') + + '
' + cityssm.escapeHTML(map.mapPhoneNumber || '') + '' + + (map.mapLatitude && map.mapLongitude + ? '' + : '') + + '' + + (map.mapSVG + ? '' + : '') + + '' + + '' + + map.lotCount + + '' + + '
${los.escapedAliases.Map} Address Phone Number Coordinates Image ${los.escapedAliases.Lot} Count
`; const currentDateString = cityssm.dateToString(new Date()); for (const lotOccupancy of workOrderLotOccupancies) { - const rowElement = document.createElement("tr"); - rowElement.className = "container--lotOccupancy"; + const rowElement = document.createElement('tr'); + rowElement.className = 'container--lotOccupancy'; rowElement.dataset.lotOccupancyId = lotOccupancy.lotOccupancyId.toString(); - const isActive = !(lotOccupancy.occupancyEndDate && lotOccupancy.occupancyEndDateString < currentDateString); + const isActive = !(lotOccupancy.occupancyEndDate && + lotOccupancy.occupancyEndDateString < currentDateString); const hasLotRecord = lotOccupancy.lotId && workOrderLots.some((lot) => { return lotOccupancy.lotId === lot.lotId; @@ -244,21 +248,25 @@ Object.defineProperty(exports, "__esModule", { value: true }); rowElement.innerHTML = '' + (isActive - ? '' - : '') + - "" + - ("" + + ? '' + : '') + + '' + + ('' + '' + - cityssm.escapeHTML(lotOccupancy.occupancyType || "") + - "" + - ""); + cityssm.escapeHTML(lotOccupancy.occupancyType || '') + + '' + + ''); if (lotOccupancy.lotId) { - rowElement.insertAdjacentHTML("beforeend", "" + - cityssm.escapeHTML(lotOccupancy.lotName || "") + + rowElement.insertAdjacentHTML('beforeend', '' + + cityssm.escapeHTML(lotOccupancy.lotName || '') + (hasLotRecord - ? "" + ? '' : ' ") + - ""); + '') + + ''); } else { - rowElement.insertAdjacentHTML("beforeend", `(No ${los.escapedAliases.Lot})`); + rowElement.insertAdjacentHTML('beforeend', `(No ${los.escapedAliases.Lot})`); } - rowElement.insertAdjacentHTML("beforeend", "" + + rowElement.insertAdjacentHTML('beforeend', '' + lotOccupancy.occupancyStartDateString + - "" + - ("" + + '' + + ('' + (lotOccupancy.occupancyEndDate ? lotOccupancy.occupancyEndDateString : '(No End Date)') + - "") + - ("" + + '') + + ('' + (lotOccupancy.lotOccupancyOccupants.length === 0 - ? '(No ' + los.escapedAliases.Occupants + ")" + ? '(No ' + + los.escapedAliases.Occupants + + ')' : (_a = lotOccupancy.lotOccupancyOccupants) === null || _a === void 0 ? void 0 : _a.reduce((soFar, occupant) => { return (soFar + '' + ' ' + cityssm.escapeHTML(occupant.occupantName) + - "
"); - }, "")) + - "") + - ("" + + '
'); + }, '')) + + '') + + ('' + '" + - "")); - (_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 - .querySelector(".button--deleteLotOccupancy") - .addEventListener("click", deleteLotOccupancy); - occupanciesContainerElement.querySelector("tbody").append(rowElement); + .querySelector('.button--deleteLotOccupancy') + .addEventListener('click', deleteLotOccupancy); + occupanciesContainerElement.querySelector('tbody').append(rowElement); } } 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) => { return possibleLot.lotId === lotId; }); let editCloseModalFunction; function doUpdateLotStatus(submitEvent) { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/workOrders/doUpdateLotStatus", submitEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/workOrders/doUpdateLotStatus', submitEvent.currentTarget, (responseJSON) => { if (responseJSON.success) { workOrderLots = responseJSON.workOrderLots; renderRelatedLotsAndOccupancies(); @@ -329,23 +340,22 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Deleting Relationship", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Deleting Relationship', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); } - cityssm.openHtmlModal("lot-editLotStatus", { + cityssm.openHtmlModal('lot-editLotStatus', { onshow(modalElement) { los.populateAliases(modalElement); - modalElement.querySelector("#lotStatusEdit--lotId").value = - lotId.toString(); - modalElement.querySelector("#lotStatusEdit--lotName").value = lot.lotName; - const lotStatusElement = modalElement.querySelector("#lotStatusEdit--lotStatusId"); + modalElement.querySelector('#lotStatusEdit--lotId').value = lotId.toString(); + modalElement.querySelector('#lotStatusEdit--lotName').value = lot.lotName; + const lotStatusElement = modalElement.querySelector('#lotStatusEdit--lotStatusId'); let lotStatusFound = false; for (const lotStatus of exports.lotStatuses) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = lotStatus.lotStatusId.toString(); optionElement.textContent = lotStatus.lotStatus; if (lotStatus.lotStatusId === lot.lotStatusId) { @@ -354,7 +364,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); lotStatusElement.append(optionElement); } if (!lotStatusFound && lot.lotStatusId) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = lot.lotStatusId.toString(); optionElement.textContent = lot.lotStatus; lotStatusElement.append(optionElement); @@ -363,13 +373,15 @@ Object.defineProperty(exports, "__esModule", { value: true }); lotStatusElement.value = lot.lotStatusId.toString(); } modalElement - .querySelector("form") - .insertAdjacentHTML("beforeend", ``); + .querySelector('form') + .insertAdjacentHTML('beforeend', ``); }, onshown(modalElement, closeModalFunction) { editCloseModalFunction = closeModalFunction; bulmaJS.toggleHtmlClipped(); - modalElement.querySelector("form").addEventListener("submit", doUpdateLotStatus); + modalElement + .querySelector('form') + .addEventListener('submit', doUpdateLotStatus); }, onremoved() { bulmaJS.toggleHtmlClipped(); @@ -377,10 +389,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); } function deleteLot(clickEvent) { - const lotId = clickEvent.currentTarget.closest(".container--lot") - .dataset.lotId; + const lotId = clickEvent.currentTarget.closest('.container--lot').dataset.lotId; function doDelete() { - cityssm.postJSON(los.urlPrefix + "/workOrders/doDeleteWorkOrderLot", { + cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrderLot', { workOrderId, lotId }, (responseJSON) => { @@ -390,9 +401,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Deleting Relationship", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Deleting Relationship', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); @@ -400,17 +411,16 @@ Object.defineProperty(exports, "__esModule", { value: true }); bulmaJS.confirm({ 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.`, - contextualColorName: "warning", + contextualColorName: 'warning', okButton: { - text: "Yes, Delete Relationship", + text: 'Yes, Delete Relationship', callbackFunction: doDelete } }); } function renderRelatedLots() { - const lotsContainerElement = document.querySelector("#container--lots"); - document.querySelector(".tabs a[href='#relatedTab--lots'] .tag").textContent = - workOrderLots.length.toString(); + const lotsContainerElement = document.querySelector('#container--lots'); + document.querySelector(".tabs a[href='#relatedTab--lots'] .tag").textContent = workOrderLots.length.toString(); if (workOrderLots.length === 0) { lotsContainerElement.innerHTML = `

There are no ${los.escapedAliases.lots} associated with this work order.

@@ -428,35 +438,39 @@ Object.defineProperty(exports, "__esModule", { value: true }); `; for (const lot of workOrderLots) { - const rowElement = document.createElement("tr"); - rowElement.className = "container--lot"; + const rowElement = document.createElement('tr'); + rowElement.className = 'container--lot'; rowElement.dataset.lotId = lot.lotId.toString(); rowElement.innerHTML = - "" + + '' + '' + - cityssm.escapeHTML(lot.lotName || "") + - "" + - "" + - ("" + cityssm.escapeHTML(lot.mapName || "") + "") + - ("" + cityssm.escapeHTML(lot.lotType || "") + "") + - ("" + + cityssm.escapeHTML(lot.lotName || '') + + '' + + '' + + ('' + cityssm.escapeHTML(lot.mapName || '') + '') + + ('' + cityssm.escapeHTML(lot.lotType || '') + '') + + ('' + (lot.lotStatusId - ? cityssm.escapeHTML(lot.lotStatus || "") + ? cityssm.escapeHTML(lot.lotStatus || '') : '(No Status)') + - "") + + '') + ('' + '" + + '' + ' " + - ""); - rowElement.querySelector(".button--editLotStatus").addEventListener("click", openEditLotStatus); - rowElement.querySelector(".button--deleteLot").addEventListener("click", deleteLot); - lotsContainerElement.querySelector("tbody").append(rowElement); + '' + + ''); + rowElement + .querySelector('.button--editLotStatus') + .addEventListener('click', openEditLotStatus); + rowElement + .querySelector('.button--deleteLot') + .addEventListener('click', deleteLot); + lotsContainerElement.querySelector('tbody').append(rowElement); } } function renderRelatedLotsAndOccupancies() { @@ -465,7 +479,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); } renderRelatedLotsAndOccupancies(); function doAddLotOccupancy(clickEvent) { - const rowElement = clickEvent.currentTarget.closest("tr"); + const rowElement = clickEvent.currentTarget.closest('tr'); const lotOccupancyId = rowElement.dataset.lotOccupancyId; addLotOccupancy(lotOccupancyId, (success) => { if (success) { @@ -473,15 +487,18 @@ Object.defineProperty(exports, "__esModule", { value: true }); } }); } - document.querySelector("#button--addLotOccupancy").addEventListener("click", () => { + document + .querySelector('#button--addLotOccupancy') + .addEventListener('click', () => { let searchFormElement; let searchResultsContainerElement; function doSearch(event) { if (event) { event.preventDefault(); } - searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML("Searching..."); - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doSearchLotOccupancies", searchFormElement, (responseJSON) => { + searchResultsContainerElement.innerHTML = + los.getLoadingParagraphHTML('Searching...'); + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doSearchLotOccupancies', searchFormElement, (responseJSON) => { if (responseJSON.lotOccupancies.length === 0) { searchResultsContainerElement.innerHTML = `

There are no records that meet the search criteria.

@@ -500,64 +517,69 @@ Object.defineProperty(exports, "__esModule", { value: true }); `; for (const lotOccupancy of responseJSON.lotOccupancies) { - const rowElement = document.createElement("tr"); - rowElement.className = "container--lotOccupancy"; - rowElement.dataset.lotOccupancyId = lotOccupancy.lotOccupancyId.toString(); + const rowElement = document.createElement('tr'); + rowElement.className = 'container--lotOccupancy'; + rowElement.dataset.lotOccupancyId = + lotOccupancy.lotOccupancyId.toString(); rowElement.innerHTML = '' + '" + - "" + + '' + + '' + ('' + - cityssm.escapeHTML(lotOccupancy.occupancyType || "") + - ""); + cityssm.escapeHTML(lotOccupancy.occupancyType || '') + + ''); if (lotOccupancy.lotId) { - rowElement.insertAdjacentHTML("beforeend", "" + cityssm.escapeHTML(lotOccupancy.lotName || "") + ""); + rowElement.insertAdjacentHTML('beforeend', '' + + cityssm.escapeHTML(lotOccupancy.lotName || '') + + ''); } else { - rowElement.insertAdjacentHTML("beforeend", `(No ${los.escapedAliases.Lot})`); + rowElement.insertAdjacentHTML('beforeend', `(No ${los.escapedAliases.Lot})`); } - rowElement.insertAdjacentHTML("beforeend", "" + + rowElement.insertAdjacentHTML('beforeend', '' + lotOccupancy.occupancyStartDateString + - "" + - ("" + + '' + + ('' + (lotOccupancy.occupancyEndDate ? lotOccupancy.occupancyEndDateString : '(No End Date)') + - "") + - ("" + + '') + + ('' + (lotOccupancy.lotOccupancyOccupants.length === 0 ? '(No ' + cityssm.escapeHTML(exports.aliases.occupants) + - ")" + ')' : cityssm.escapeHTML(lotOccupancy.lotOccupancyOccupants[0].occupantName) + (lotOccupancy.lotOccupancyOccupants.length > 1 - ? " plus " + (lotOccupancy.lotOccupancyOccupants.length - 1) - : "")) + - "")); + ? ' plus ' + + (lotOccupancy.lotOccupancyOccupants.length - 1) + : '')) + + '')); rowElement - .querySelector(".button--addLotOccupancy") - .addEventListener("click", doAddLotOccupancy); - searchResultsContainerElement.querySelector("tbody").append(rowElement); + .querySelector('.button--addLotOccupancy') + .addEventListener('click', doAddLotOccupancy); + searchResultsContainerElement + .querySelector('tbody') + .append(rowElement); } }); } - cityssm.openHtmlModal("workOrder-addLotOccupancy", { + cityssm.openHtmlModal('workOrder-addLotOccupancy', { onshow(modalElement) { los.populateAliases(modalElement); - searchFormElement = modalElement.querySelector("form"); - searchResultsContainerElement = modalElement.querySelector("#resultsContainer--lotOccupancyAdd"); - modalElement.querySelector("#lotOccupancySearch--notWorkOrderId").value = - workOrderId; - modalElement.querySelector("#lotOccupancySearch--occupancyEffectiveDateString").value = document.querySelector("#workOrderEdit--workOrderOpenDateString").value; + searchFormElement = modalElement.querySelector('form'); + searchResultsContainerElement = modalElement.querySelector('#resultsContainer--lotOccupancyAdd'); + modalElement.querySelector('#lotOccupancySearch--notWorkOrderId').value = workOrderId; + modalElement.querySelector('#lotOccupancySearch--occupancyEffectiveDateString').value = document.querySelector('#workOrderEdit--workOrderOpenDateString').value; doSearch(); }, onshown(modalElement) { bulmaJS.toggleHtmlClipped(); - modalElement.querySelector("#lotOccupancySearch--occupantName").addEventListener("change", doSearch); - modalElement.querySelector("#lotOccupancySearch--lotName").addEventListener("change", doSearch); - searchFormElement.addEventListener("submit", doSearch); + modalElement.querySelector('#lotOccupancySearch--occupantName').addEventListener('change', doSearch); + modalElement.querySelector('#lotOccupancySearch--lotName').addEventListener('change', doSearch); + searchFormElement.addEventListener('submit', doSearch); }, onremoved() { bulmaJS.toggleHtmlClipped(); @@ -565,7 +587,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); }); function doAddLot(clickEvent) { - const rowElement = clickEvent.currentTarget.closest("tr"); + const rowElement = clickEvent.currentTarget.closest('tr'); const lotId = rowElement.dataset.lotId; addLot(lotId, (success) => { if (success) { @@ -573,20 +595,21 @@ Object.defineProperty(exports, "__esModule", { value: true }); } }); } - document.querySelector("#button--addLot").addEventListener("click", () => { + document.querySelector('#button--addLot').addEventListener('click', () => { let searchFormElement; let searchResultsContainerElement; function doSearch(event) { if (event) { event.preventDefault(); } - searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML("Searching..."); - cityssm.postJSON(los.urlPrefix + "/lots/doSearchLots", searchFormElement, (responseJSON) => { + searchResultsContainerElement.innerHTML = + los.getLoadingParagraphHTML('Searching...'); + cityssm.postJSON(los.urlPrefix + '/lots/doSearchLots', searchFormElement, (responseJSON) => { if (responseJSON.lots.length === 0) { searchResultsContainerElement.innerHTML = '
' + '

There are no records that meet the search criteria.

' + - "
"; + '
'; return; } searchResultsContainerElement.innerHTML = ` @@ -600,38 +623,41 @@ Object.defineProperty(exports, "__esModule", { value: true });
`; for (const lot of responseJSON.lots) { - const rowElement = document.createElement("tr"); - rowElement.className = "container--lot"; + const rowElement = document.createElement('tr'); + rowElement.className = 'container--lot'; rowElement.dataset.lotId = lot.lotId.toString(); rowElement.innerHTML = '' + '" + - "" + + '' + + '' + ('' + - cityssm.escapeHTML(lot.lotName || "") + - "") + - "" + - cityssm.escapeHTML(lot.mapName || "") + - "" + - ("" + cityssm.escapeHTML(lot.lotType || "") + "") + - ("" + cityssm.escapeHTML(lot.lotStatus || "") + ""); - rowElement.querySelector(".button--addLot").addEventListener("click", doAddLot); - searchResultsContainerElement.querySelector("tbody").append(rowElement); + cityssm.escapeHTML(lot.lotName || '') + + '') + + '' + + cityssm.escapeHTML(lot.mapName || '') + + '' + + ('' + cityssm.escapeHTML(lot.lotType || '') + '') + + ('' + cityssm.escapeHTML(lot.lotStatus || '') + ''); + rowElement + .querySelector('.button--addLot') + .addEventListener('click', doAddLot); + searchResultsContainerElement + .querySelector('tbody') + .append(rowElement); } }); } - cityssm.openHtmlModal("workOrder-addLot", { + cityssm.openHtmlModal('workOrder-addLot', { onshow(modalElement) { los.populateAliases(modalElement); - searchFormElement = modalElement.querySelector("form"); - searchResultsContainerElement = modalElement.querySelector("#resultsContainer--lotAdd"); - modalElement.querySelector("#lotSearch--notWorkOrderId").value = - workOrderId; - const lotStatusElement = modalElement.querySelector("#lotSearch--lotStatusId"); + searchFormElement = modalElement.querySelector('form'); + searchResultsContainerElement = modalElement.querySelector('#resultsContainer--lotAdd'); + modalElement.querySelector('#lotSearch--notWorkOrderId').value = workOrderId; + const lotStatusElement = modalElement.querySelector('#lotSearch--lotStatusId'); for (const lotStatus of exports.lotStatuses) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = lotStatus.lotStatusId.toString(); optionElement.textContent = lotStatus.lotStatus; lotStatusElement.append(optionElement); @@ -640,9 +666,13 @@ Object.defineProperty(exports, "__esModule", { value: true }); }, onshown(modalElement) { bulmaJS.toggleHtmlClipped(); - modalElement.querySelector("#lotSearch--lotName").addEventListener("change", doSearch); - modalElement.querySelector("#lotSearch--lotStatusId").addEventListener("change", doSearch); - searchFormElement.addEventListener("submit", doSearch); + modalElement + .querySelector('#lotSearch--lotName') + .addEventListener('change', doSearch); + modalElement + .querySelector('#lotSearch--lotStatusId') + .addEventListener('change', doSearch); + searchFormElement.addEventListener('submit', doSearch); }, onremoved() { bulmaJS.toggleHtmlClipped(); @@ -661,7 +691,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); let workOrderComments = exports.workOrderComments; delete exports.workOrderComments; 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) => { return currentComment.workOrderCommentId === workOrderCommentId; }); @@ -669,7 +700,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); let editCloseModalFunction; function editComment(submitEvent) { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/workOrders/doUpdateWorkOrderComment", editFormElement, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/workOrders/doUpdateWorkOrderComment', editFormElement, (responseJSON) => { if (responseJSON.success) { workOrderComments = responseJSON.workOrderComments; editCloseModalFunction(); @@ -677,35 +708,35 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Updating Comment", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Updating Comment', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); } - cityssm.openHtmlModal("workOrder-editComment", { + cityssm.openHtmlModal('workOrder-editComment', { onshow(modalElement) { - modalElement.querySelector("#workOrderCommentEdit--workOrderId").value = - workOrderId; - modalElement.querySelector("#workOrderCommentEdit--workOrderCommentId").value = workOrderCommentId.toString(); - modalElement.querySelector("#workOrderCommentEdit--workOrderComment").value = workOrderComment.workOrderComment; - const workOrderCommentDateStringElement = modalElement.querySelector("#workOrderCommentEdit--workOrderCommentDateString"); - workOrderCommentDateStringElement.value = workOrderComment.workOrderCommentDateString; + ; + modalElement.querySelector('#workOrderCommentEdit--workOrderId').value = workOrderId; + modalElement.querySelector('#workOrderCommentEdit--workOrderCommentId').value = workOrderCommentId.toString(); + modalElement.querySelector('#workOrderCommentEdit--workOrderComment').value = workOrderComment.workOrderComment; + const workOrderCommentDateStringElement = modalElement.querySelector('#workOrderCommentEdit--workOrderCommentDateString'); + workOrderCommentDateStringElement.value = + workOrderComment.workOrderCommentDateString; const currentDateString = cityssm.dateToString(new Date()); workOrderCommentDateStringElement.max = workOrderComment.workOrderCommentDateString <= currentDateString ? currentDateString : workOrderComment.workOrderCommentDateString; - modalElement.querySelector("#workOrderCommentEdit--workOrderCommentTimeString").value = workOrderComment.workOrderCommentTimeString; + modalElement.querySelector('#workOrderCommentEdit--workOrderCommentTimeString').value = workOrderComment.workOrderCommentTimeString; }, onshown(modalElement, closeModalFunction) { bulmaJS.toggleHtmlClipped(); los.initializeDatePickers(modalElement); - // los.initializeTimePickers(modalElement); - modalElement.querySelector("#workOrderCommentEdit--workOrderComment").focus(); - editFormElement = modalElement.querySelector("form"); - editFormElement.addEventListener("submit", editComment); + modalElement.querySelector('#workOrderCommentEdit--workOrderComment').focus(); + editFormElement = modalElement.querySelector('form'); + editFormElement.addEventListener('submit', editComment); editCloseModalFunction = closeModalFunction; }, onremoved() { @@ -714,9 +745,10 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); }; 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() { - cityssm.postJSON(los.urlPrefix + "/workOrders/doDeleteWorkOrderComment", { + cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrderComment', { workOrderId, workOrderCommentId }, (responseJSON) => { @@ -726,77 +758,82 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Removing Comment", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Removing Comment', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); } bulmaJS.confirm({ - title: "Remove Comment?", - message: "Are you sure you want to remove this comment?", + title: 'Remove Comment?', + message: 'Are you sure you want to remove this comment?', okButton: { - text: "Yes, Remove Comment", + text: 'Yes, Remove Comment', callbackFunction: doDelete }, - contextualColorName: "warning" + contextualColorName: 'warning' }); } function renderWorkOrderComments() { - const containerElement = document.querySelector("#container--workOrderComments"); + const containerElement = document.querySelector('#container--workOrderComments'); if (workOrderComments.length === 0) { containerElement.innerHTML = `

There are no comments to display.

`; return; } - const tableElement = document.createElement("table"); - tableElement.className = "table is-fullwidth is-striped is-hoverable"; + const tableElement = document.createElement('table'); + tableElement.className = 'table is-fullwidth is-striped is-hoverable'; tableElement.innerHTML = ` Commentor Comment Date Comment Options`; for (const workOrderComment of workOrderComments) { - const tableRowElement = document.createElement("tr"); - tableRowElement.dataset.workOrderCommentId = workOrderComment.workOrderCommentId.toString(); + const tableRowElement = document.createElement('tr'); + tableRowElement.dataset.workOrderCommentId = + workOrderComment.workOrderCommentId.toString(); tableRowElement.innerHTML = - "" + - cityssm.escapeHTML(workOrderComment.recordCreate_userName || "") + - "" + - "" + + '' + + cityssm.escapeHTML(workOrderComment.recordCreate_userName || '') + + '' + + '' + workOrderComment.workOrderCommentDateString + (workOrderComment.workOrderCommentTime === 0 - ? "" - : " " + workOrderComment.workOrderCommentTimeString) + - "" + - "" + - cityssm.escapeHTML(workOrderComment.workOrderComment || "") + - "" + + ? '' + : ' ' + workOrderComment.workOrderCommentTimeString) + + '' + + '' + + cityssm.escapeHTML(workOrderComment.workOrderComment || '') + + '' + ('' + '
' + ('") + + ' Edit' + + '') + ('") + - "
" + - ""); - tableRowElement.querySelector(".button--edit").addEventListener("click", openEditWorkOrderComment); - tableRowElement.querySelector(".button--delete").addEventListener("click", deleteWorkOrderComment); - tableElement.querySelector("tbody").append(tableRowElement); + '') + + '
' + + ''); + tableRowElement + .querySelector('.button--edit') + .addEventListener('click', openEditWorkOrderComment); + tableRowElement + .querySelector('.button--delete') + .addEventListener('click', deleteWorkOrderComment); + tableElement.querySelector('tbody').append(tableRowElement); } - containerElement.innerHTML = ""; + containerElement.innerHTML = ''; containerElement.append(tableElement); } function openAddCommentModal() { let addCommentCloseModalFunction; function doAddComment(formEvent) { formEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/workOrders/doAddWorkOrderComment", formEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/workOrders/doAddWorkOrderComment', formEvent.currentTarget, (responseJSON) => { if (responseJSON.success) { workOrderComments = responseJSON.workOrderComments; renderWorkOrderComments(); @@ -804,25 +841,27 @@ Object.defineProperty(exports, "__esModule", { value: true }); } }); } - cityssm.openHtmlModal("workOrder-addComment", { + cityssm.openHtmlModal('workOrder-addComment', { onshow(modalElement) { los.populateAliases(modalElement); - modalElement.querySelector("#workOrderCommentAdd--workOrderId").value = - workOrderId; - modalElement.querySelector("form").addEventListener("submit", doAddComment); + modalElement.querySelector('#workOrderCommentAdd--workOrderId').value = workOrderId; + modalElement + .querySelector('form') + .addEventListener('submit', doAddComment); }, onshown(modalElement, closeModalFunction) { bulmaJS.toggleHtmlClipped(); addCommentCloseModalFunction = closeModalFunction; - modalElement.querySelector("#workOrderCommentAdd--workOrderComment").focus(); + modalElement.querySelector('#workOrderCommentAdd--workOrderComment').focus(); }, onremoved() { 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) { renderWorkOrderComments(); } @@ -837,131 +876,136 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Reopening Milestone", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Reopening Milestone', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } } function completeMilestone(clickEvent) { clickEvent.preventDefault(); const currentDateString = cityssm.dateToString(new Date()); - const workOrderMilestoneId = Number.parseInt(clickEvent.currentTarget.closest(".container--milestone") - .dataset.workOrderMilestoneId, 10); + const workOrderMilestoneId = Number.parseInt(clickEvent.currentTarget.closest('.container--milestone').dataset.workOrderMilestoneId, 10); const workOrderMilestone = workOrderMilestones.find((currentMilestone) => { return currentMilestone.workOrderMilestoneId === workOrderMilestoneId; }); const doComplete = () => { - cityssm.postJSON(los.urlPrefix + "/workOrders/doCompleteWorkOrderMilestone", { + cityssm.postJSON(los.urlPrefix + '/workOrders/doCompleteWorkOrderMilestone', { workOrderId, workOrderMilestoneId }, processMilestoneResponse); }; bulmaJS.confirm({ - title: "Complete Milestone", - message: "Are you sure you want to complete this milestone?" + + title: 'Complete Milestone', + message: 'Are you sure you want to complete this milestone?' + (workOrderMilestone.workOrderMilestoneDateString > currentDateString - ? "
Note that this milestone is expected to be completed in the future." - : ""), + ? '
Note that this milestone is expected to be completed in the future.' + : ''), messageIsHtml: true, - contextualColorName: "warning", + contextualColorName: 'warning', okButton: { - text: "Yes, Complete Milestone", + text: 'Yes, Complete Milestone', callbackFunction: doComplete } }); } function reopenMilestone(clickEvent) { clickEvent.preventDefault(); - const workOrderMilestoneId = clickEvent.currentTarget.closest(".container--milestone").dataset.workOrderMilestoneId; + const workOrderMilestoneId = clickEvent.currentTarget.closest('.container--milestone').dataset.workOrderMilestoneId; const doReopen = () => { - cityssm.postJSON(los.urlPrefix + "/workOrders/doReopenWorkOrderMilestone", { + cityssm.postJSON(los.urlPrefix + '/workOrders/doReopenWorkOrderMilestone', { workOrderId, workOrderMilestoneId }, processMilestoneResponse); }; bulmaJS.confirm({ - title: "Reopen Milestone", - message: "Are you sure you want to remove the completion status from this milestone, and reopen it?", - contextualColorName: "warning", + title: 'Reopen Milestone', + message: 'Are you sure you want to remove the completion status from this milestone, and reopen it?', + contextualColorName: 'warning', okButton: { - text: "Yes, Reopen Milestone", + text: 'Yes, Reopen Milestone', callbackFunction: doReopen } }); } function deleteMilestone(clickEvent) { clickEvent.preventDefault(); - const workOrderMilestoneId = clickEvent.currentTarget.closest(".container--milestone").dataset.workOrderMilestoneId; + const workOrderMilestoneId = clickEvent.currentTarget.closest('.container--milestone').dataset.workOrderMilestoneId; const doDelete = () => { - cityssm.postJSON(los.urlPrefix + "/workOrders/doDeleteWorkOrderMilestone", { + cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrderMilestone', { workOrderMilestoneId, workOrderId }, processMilestoneResponse); }; bulmaJS.confirm({ - title: "Delete Milestone", - message: "Are you sure you want to delete this milestone?", - contextualColorName: "warning", + title: 'Delete Milestone', + message: 'Are you sure you want to delete this milestone?', + contextualColorName: 'warning', okButton: { - text: "Yes, Delete Milestone", + text: 'Yes, Delete Milestone', callbackFunction: doDelete } }); } function editMilestone(clickEvent) { clickEvent.preventDefault(); - const workOrderMilestoneId = Number.parseInt(clickEvent.currentTarget.closest(".container--milestone") - .dataset.workOrderMilestoneId, 10); + const workOrderMilestoneId = Number.parseInt(clickEvent.currentTarget.closest('.container--milestone').dataset.workOrderMilestoneId, 10); const workOrderMilestone = workOrderMilestones.find((currentMilestone) => { return currentMilestone.workOrderMilestoneId === workOrderMilestoneId; }); let editCloseModalFunction; const doEdit = (submitEvent) => { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/workOrders/doUpdateWorkOrderMilestone", submitEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/workOrders/doUpdateWorkOrderMilestone', submitEvent.currentTarget, (responseJSON) => { processMilestoneResponse(responseJSON); if (responseJSON.success) { editCloseModalFunction(); } }); }; - cityssm.openHtmlModal("workOrder-editMilestone", { + cityssm.openHtmlModal('workOrder-editMilestone', { onshow(modalElement) { - modalElement.querySelector("#milestoneEdit--workOrderId").value = - workOrderId; - modalElement.querySelector("#milestoneEdit--workOrderMilestoneId").value = workOrderMilestone.workOrderMilestoneId.toString(); - const milestoneTypeElement = modalElement.querySelector("#milestoneEdit--workOrderMilestoneTypeId"); + ; + modalElement.querySelector('#milestoneEdit--workOrderId').value = workOrderId; + modalElement.querySelector('#milestoneEdit--workOrderMilestoneId').value = workOrderMilestone.workOrderMilestoneId.toString(); + const milestoneTypeElement = modalElement.querySelector('#milestoneEdit--workOrderMilestoneTypeId'); let milestoneTypeFound = false; for (const milestoneType of exports.workOrderMilestoneTypes) { - const optionElement = document.createElement("option"); - optionElement.value = milestoneType.workOrderMilestoneTypeId.toString(); + const optionElement = document.createElement('option'); + optionElement.value = + milestoneType.workOrderMilestoneTypeId.toString(); optionElement.textContent = milestoneType.workOrderMilestoneType; - if (milestoneType.workOrderMilestoneTypeId === workOrderMilestone.workOrderMilestoneTypeId) { + if (milestoneType.workOrderMilestoneTypeId === + workOrderMilestone.workOrderMilestoneTypeId) { optionElement.selected = true; milestoneTypeFound = true; } milestoneTypeElement.append(optionElement); } - if (!milestoneTypeFound && workOrderMilestone.workOrderMilestoneTypeId) { - const optionElement = document.createElement("option"); - optionElement.value = workOrderMilestone.workOrderMilestoneTypeId.toString(); + if (!milestoneTypeFound && + workOrderMilestone.workOrderMilestoneTypeId) { + const optionElement = document.createElement('option'); + optionElement.value = + workOrderMilestone.workOrderMilestoneTypeId.toString(); optionElement.textContent = workOrderMilestone.workOrderMilestoneType; optionElement.selected = true; milestoneTypeElement.append(optionElement); } - modalElement.querySelector("#milestoneEdit--workOrderMilestoneDateString").value = workOrderMilestone.workOrderMilestoneDateString; + ; + modalElement.querySelector('#milestoneEdit--workOrderMilestoneDateString').value = workOrderMilestone.workOrderMilestoneDateString; 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) { editCloseModalFunction = closeModalFunction; bulmaJS.toggleHtmlClipped(); los.initializeDatePickers(modalElement); // los.initializeTimePickers(modalElement); - modalElement.querySelector("form").addEventListener("submit", doEdit); + modalElement.querySelector('form').addEventListener('submit', doEdit); }, onremoved() { bulmaJS.toggleHtmlClipped(); @@ -971,15 +1015,16 @@ Object.defineProperty(exports, "__esModule", { value: true }); function renderMilestones() { var _a, _b, _c; // Clear milestones panel - const milestonesPanelElement = document.querySelector("#panel--milestones"); - const panelBlockElementsToDelete = milestonesPanelElement.querySelectorAll(".panel-block"); + const milestonesPanelElement = document.querySelector('#panel--milestones'); + const panelBlockElementsToDelete = milestonesPanelElement.querySelectorAll('.panel-block'); for (const panelBlockToDelete of panelBlockElementsToDelete) { panelBlockToDelete.remove(); } for (const milestone of workOrderMilestones) { - const panelBlockElement = document.createElement("div"); - panelBlockElement.className = "panel-block is-block container--milestone"; - panelBlockElement.dataset.workOrderMilestoneId = milestone.workOrderMilestoneId.toString(); + const panelBlockElement = document.createElement('div'); + panelBlockElement.className = 'panel-block is-block container--milestone'; + panelBlockElement.dataset.workOrderMilestoneId = + milestone.workOrderMilestoneId.toString(); panelBlockElement.innerHTML = '
' + ('
' + @@ -990,70 +1035,75 @@ Object.defineProperty(exports, "__esModule", { value: true }); milestone.workOrderMilestoneCompletionDateString + '">' + '' + - "" + '' : '") + - "
") + + '') + + '
') + ('
' + (milestone.workOrderMilestoneTypeId - ? "" + - cityssm.escapeHTML(milestone.workOrderMilestoneType || "") + - "
" - : "") + + ? '' + + cityssm.escapeHTML(milestone.workOrderMilestoneType || '') + + '
' + : '') + milestone.workOrderMilestoneDateString + - (milestone.workOrderMilestoneTime ? " " + milestone.workOrderMilestoneTimeString : "") + - "
" + + (milestone.workOrderMilestoneTime + ? ' ' + milestone.workOrderMilestoneTimeString + : '') + + '
' + '' + - cityssm.escapeHTML(milestone.workOrderMilestoneDescription || "") + - "" + - "
") + + cityssm.escapeHTML(milestone.workOrderMilestoneDescription || '') + + '' + + '') + ('
' + '') + ('") + - "
" + - "") + - ""; + ' Delete Milestone' + + '' + + '' + + '') + + '' + + '') + + ''; (_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 - .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 - .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 - .querySelector(".button--deleteMilestone") - .addEventListener("click", deleteMilestone); + .querySelector('.button--deleteMilestone') + .addEventListener('click', deleteMilestone); milestonesPanelElement.append(panelBlockElement); } bulmaJS.init(milestonesPanelElement); } if (!isCreate) { - workOrderMilestones = exports.workOrderMilestones; + workOrderMilestones = + exports.workOrderMilestones; delete exports.workOrderMilestones; renderMilestones(); - document.querySelector("#button--addMilestone").addEventListener("click", () => { + document + .querySelector('#button--addMilestone') + .addEventListener('click', () => { let addModalElement; let addFormElement; let addCloseModalFunction; @@ -1063,20 +1113,20 @@ Object.defineProperty(exports, "__esModule", { value: true }); } const currentDateString = cityssm.dateToString(new Date()); function _doAdd() { - cityssm.postJSON(los.urlPrefix + "/workOrders/doAddWorkOrderMilestone", addFormElement, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/workOrders/doAddWorkOrderMilestone', addFormElement, (responseJSON) => { processMilestoneResponse(responseJSON); if (responseJSON.success) { addCloseModalFunction(); } }); } - if (addModalElement.querySelector("#milestoneAdd--workOrderMilestoneDateString").value < currentDateString) { + if (addModalElement.querySelector('#milestoneAdd--workOrderMilestoneDateString').value < currentDateString) { bulmaJS.confirm({ - title: "Milestone Date in the Past", - message: "Are you sure you want to create a milestone with a date in the past?", - contextualColorName: "warning", + title: 'Milestone Date in the Past', + message: 'Are you sure you want to create a milestone with a date in the past?', + contextualColorName: 'warning', okButton: { - text: "Yes, Create a Past Milestone", + text: 'Yes, Create a Past Milestone', callbackFunction: _doAdd } }); @@ -1085,18 +1135,20 @@ Object.defineProperty(exports, "__esModule", { value: true }); _doAdd(); } }; - cityssm.openHtmlModal("workOrder-addMilestone", { + cityssm.openHtmlModal('workOrder-addMilestone', { onshow(modalElement) { - modalElement.querySelector("#milestoneAdd--workOrderId").value = - workOrderId; - const milestoneTypeElement = modalElement.querySelector("#milestoneAdd--workOrderMilestoneTypeId"); + ; + modalElement.querySelector('#milestoneAdd--workOrderId').value = workOrderId; + const milestoneTypeElement = modalElement.querySelector('#milestoneAdd--workOrderMilestoneTypeId'); for (const milestoneType of exports.workOrderMilestoneTypes) { - const optionElement = document.createElement("option"); - optionElement.value = milestoneType.workOrderMilestoneTypeId.toString(); + const optionElement = document.createElement('option'); + optionElement.value = + milestoneType.workOrderMilestoneTypeId.toString(); optionElement.textContent = milestoneType.workOrderMilestoneType; milestoneTypeElement.append(optionElement); } - modalElement.querySelector("#milestoneAdd--workOrderMilestoneDateString").valueAsDate = new Date(); + ; + modalElement.querySelector('#milestoneAdd--workOrderMilestoneDateString').valueAsDate = new Date(); }, onshown(modalElement, closeModalFunction) { addModalElement = modalElement; @@ -1104,8 +1156,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); los.initializeDatePickers(modalElement); // los.initializeTimePickers(modalElement); bulmaJS.toggleHtmlClipped(); - addFormElement = modalElement.querySelector("form"); - addFormElement.addEventListener("submit", doAdd); + addFormElement = modalElement.querySelector('form'); + addFormElement.addEventListener('submit', doAdd); }, onremoved() { bulmaJS.toggleHtmlClipped(); diff --git a/public-typescript/workOrderEdit/workOrderEdit.js b/public-typescript/workOrderEdit/workOrderEdit.js index 097a14d0..28b74b76 100644 --- a/public-typescript/workOrderEdit/workOrderEdit.js +++ b/public-typescript/workOrderEdit/workOrderEdit.js @@ -4,16 +4,18 @@ Object.defineProperty(exports, "__esModule", { value: true }); (() => { var _a, _b; const los = exports.los; - const workOrderId = document.querySelector("#workOrderEdit--workOrderId").value; - const isCreate = workOrderId === ""; - const workOrderFormElement = document.querySelector("#form--workOrderEdit"); + const workOrderId = document.querySelector('#workOrderEdit--workOrderId').value; + const isCreate = workOrderId === ''; + const workOrderFormElement = document.querySelector('#form--workOrderEdit'); los.initializeDatePickers(workOrderFormElement - .querySelector("#workOrderEdit--workOrderOpenDateString") - .closest(".field")); + .querySelector('#workOrderEdit--workOrderOpenDateString') + .closest('.field')); los.initializeUnlockFieldButtons(workOrderFormElement); - workOrderFormElement.addEventListener("submit", (submitEvent) => { + workOrderFormElement.addEventListener('submit', (submitEvent) => { 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) { cityssm.disableNavBlocker(); if (isCreate) { @@ -21,105 +23,107 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - message: "Work Order Updated Successfully", - contextualColorName: "success" + message: 'Work Order Updated Successfully', + contextualColorName: 'success' }); } } else { bulmaJS.alert({ - title: "Error Updating Work Order", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Updating Work Order', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); }); - const inputElements = workOrderFormElement.querySelectorAll("input, select"); + const inputElements = workOrderFormElement.querySelectorAll('input, select'); for (const inputElement of inputElements) { - inputElement.addEventListener("change", cityssm.enableNavBlocker); + inputElement.addEventListener('change', cityssm.enableNavBlocker); } /* * Work Order Options */ function doClose() { - cityssm.postJSON(los.urlPrefix + "/workOrders/doCloseWorkOrder", { + cityssm.postJSON(los.urlPrefix + '/workOrders/doCloseWorkOrder', { workOrderId }, (responseJSON) => { if (responseJSON.success) { - window.location.href = los.urlPrefix + "/workOrders/" + workOrderId; + window.location.href = los.urlPrefix + '/workOrders/' + workOrderId; } else { bulmaJS.alert({ - title: "Error Closing Work Order", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Closing Work Order', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); } function doDelete() { - cityssm.postJSON(los.urlPrefix + "/workOrders/doDeleteWorkOrder", { + cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrder', { workOrderId }, (responseJSON) => { if (responseJSON.success) { - window.location.href = los.urlPrefix + "/workOrders"; + window.location.href = los.urlPrefix + '/workOrders'; } else { bulmaJS.alert({ - title: "Error Deleting Work Order", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Deleting Work Order', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); } 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) => { return !milestone.workOrderMilestoneCompletionDate; }); if (hasOpenMilestones) { bulmaJS.alert({ - title: "Outstanding Milestones", + title: 'Outstanding Milestones', message: `You cannot close a work order with outstanding milestones. Either complete the outstanding milestones, or remove them from the work order.`, - contextualColorName: "warning" + contextualColorName: 'warning' }); /* - // Disable closing work orders with open milestones - bulmaJS.confirm({ - title: "Close Work Order with Outstanding Milestones", - message: - "Are you sure you want to close this work order with outstanding milestones?", - contextualColorName: "danger", - okButton: { - text: "Yes, Close Work Order", - callbackFunction: doClose - } - }); - */ + // Disable closing work orders with open milestones + bulmaJS.confirm({ + title: "Close Work Order with Outstanding Milestones", + message: + "Are you sure you want to close this work order with outstanding milestones?", + contextualColorName: "danger", + okButton: { + text: "Yes, Close Work Order", + callbackFunction: doClose + } + }); + */ } else { bulmaJS.confirm({ - title: "Close Work Order", - message: "Are you sure you want to close this work order?", - contextualColorName: "info", + title: 'Close Work Order', + message: 'Are you sure you want to close this work order?', + contextualColorName: 'info', okButton: { - text: "Yes, Close Work Order", + text: 'Yes, Close Work Order', 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(); bulmaJS.confirm({ - title: "Delete Work Order", - message: "Are you sure you want to delete this work order?", - contextualColorName: "warning", + title: 'Delete Work Order', + message: 'Are you sure you want to delete this work order?', + contextualColorName: 'warning', okButton: { - text: "Yes, Delete Work Order", + text: 'Yes, Delete Work Order', callbackFunction: doDelete } }); @@ -144,131 +148,136 @@ Object.defineProperty(exports, "__esModule", { value: true }); } else { bulmaJS.alert({ - title: "Error Reopening Milestone", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Reopening Milestone', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } } function completeMilestone(clickEvent) { clickEvent.preventDefault(); const currentDateString = cityssm.dateToString(new Date()); - const workOrderMilestoneId = Number.parseInt(clickEvent.currentTarget.closest(".container--milestone") - .dataset.workOrderMilestoneId, 10); + const workOrderMilestoneId = Number.parseInt(clickEvent.currentTarget.closest('.container--milestone').dataset.workOrderMilestoneId, 10); const workOrderMilestone = workOrderMilestones.find((currentMilestone) => { return currentMilestone.workOrderMilestoneId === workOrderMilestoneId; }); const doComplete = () => { - cityssm.postJSON(los.urlPrefix + "/workOrders/doCompleteWorkOrderMilestone", { + cityssm.postJSON(los.urlPrefix + '/workOrders/doCompleteWorkOrderMilestone', { workOrderId, workOrderMilestoneId }, processMilestoneResponse); }; bulmaJS.confirm({ - title: "Complete Milestone", - message: "Are you sure you want to complete this milestone?" + + title: 'Complete Milestone', + message: 'Are you sure you want to complete this milestone?' + (workOrderMilestone.workOrderMilestoneDateString > currentDateString - ? "
Note that this milestone is expected to be completed in the future." - : ""), + ? '
Note that this milestone is expected to be completed in the future.' + : ''), messageIsHtml: true, - contextualColorName: "warning", + contextualColorName: 'warning', okButton: { - text: "Yes, Complete Milestone", + text: 'Yes, Complete Milestone', callbackFunction: doComplete } }); } function reopenMilestone(clickEvent) { clickEvent.preventDefault(); - const workOrderMilestoneId = clickEvent.currentTarget.closest(".container--milestone").dataset.workOrderMilestoneId; + const workOrderMilestoneId = clickEvent.currentTarget.closest('.container--milestone').dataset.workOrderMilestoneId; const doReopen = () => { - cityssm.postJSON(los.urlPrefix + "/workOrders/doReopenWorkOrderMilestone", { + cityssm.postJSON(los.urlPrefix + '/workOrders/doReopenWorkOrderMilestone', { workOrderId, workOrderMilestoneId }, processMilestoneResponse); }; bulmaJS.confirm({ - title: "Reopen Milestone", - message: "Are you sure you want to remove the completion status from this milestone, and reopen it?", - contextualColorName: "warning", + title: 'Reopen Milestone', + message: 'Are you sure you want to remove the completion status from this milestone, and reopen it?', + contextualColorName: 'warning', okButton: { - text: "Yes, Reopen Milestone", + text: 'Yes, Reopen Milestone', callbackFunction: doReopen } }); } function deleteMilestone(clickEvent) { clickEvent.preventDefault(); - const workOrderMilestoneId = clickEvent.currentTarget.closest(".container--milestone").dataset.workOrderMilestoneId; + const workOrderMilestoneId = clickEvent.currentTarget.closest('.container--milestone').dataset.workOrderMilestoneId; const doDelete = () => { - cityssm.postJSON(los.urlPrefix + "/workOrders/doDeleteWorkOrderMilestone", { + cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrderMilestone', { workOrderMilestoneId, workOrderId }, processMilestoneResponse); }; bulmaJS.confirm({ - title: "Delete Milestone", - message: "Are you sure you want to delete this milestone?", - contextualColorName: "warning", + title: 'Delete Milestone', + message: 'Are you sure you want to delete this milestone?', + contextualColorName: 'warning', okButton: { - text: "Yes, Delete Milestone", + text: 'Yes, Delete Milestone', callbackFunction: doDelete } }); } function editMilestone(clickEvent) { clickEvent.preventDefault(); - const workOrderMilestoneId = Number.parseInt(clickEvent.currentTarget.closest(".container--milestone") - .dataset.workOrderMilestoneId, 10); + const workOrderMilestoneId = Number.parseInt(clickEvent.currentTarget.closest('.container--milestone').dataset.workOrderMilestoneId, 10); const workOrderMilestone = workOrderMilestones.find((currentMilestone) => { return currentMilestone.workOrderMilestoneId === workOrderMilestoneId; }); let editCloseModalFunction; const doEdit = (submitEvent) => { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/workOrders/doUpdateWorkOrderMilestone", submitEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/workOrders/doUpdateWorkOrderMilestone', submitEvent.currentTarget, (responseJSON) => { processMilestoneResponse(responseJSON); if (responseJSON.success) { editCloseModalFunction(); } }); }; - cityssm.openHtmlModal("workOrder-editMilestone", { + cityssm.openHtmlModal('workOrder-editMilestone', { onshow(modalElement) { - modalElement.querySelector("#milestoneEdit--workOrderId").value = - workOrderId; - modalElement.querySelector("#milestoneEdit--workOrderMilestoneId").value = workOrderMilestone.workOrderMilestoneId.toString(); - const milestoneTypeElement = modalElement.querySelector("#milestoneEdit--workOrderMilestoneTypeId"); + ; + modalElement.querySelector('#milestoneEdit--workOrderId').value = workOrderId; + modalElement.querySelector('#milestoneEdit--workOrderMilestoneId').value = workOrderMilestone.workOrderMilestoneId.toString(); + const milestoneTypeElement = modalElement.querySelector('#milestoneEdit--workOrderMilestoneTypeId'); let milestoneTypeFound = false; for (const milestoneType of exports.workOrderMilestoneTypes) { - const optionElement = document.createElement("option"); - optionElement.value = milestoneType.workOrderMilestoneTypeId.toString(); + const optionElement = document.createElement('option'); + optionElement.value = + milestoneType.workOrderMilestoneTypeId.toString(); optionElement.textContent = milestoneType.workOrderMilestoneType; - if (milestoneType.workOrderMilestoneTypeId === workOrderMilestone.workOrderMilestoneTypeId) { + if (milestoneType.workOrderMilestoneTypeId === + workOrderMilestone.workOrderMilestoneTypeId) { optionElement.selected = true; milestoneTypeFound = true; } milestoneTypeElement.append(optionElement); } - if (!milestoneTypeFound && workOrderMilestone.workOrderMilestoneTypeId) { - const optionElement = document.createElement("option"); - optionElement.value = workOrderMilestone.workOrderMilestoneTypeId.toString(); + if (!milestoneTypeFound && + workOrderMilestone.workOrderMilestoneTypeId) { + const optionElement = document.createElement('option'); + optionElement.value = + workOrderMilestone.workOrderMilestoneTypeId.toString(); optionElement.textContent = workOrderMilestone.workOrderMilestoneType; optionElement.selected = true; milestoneTypeElement.append(optionElement); } - modalElement.querySelector("#milestoneEdit--workOrderMilestoneDateString").value = workOrderMilestone.workOrderMilestoneDateString; + ; + modalElement.querySelector('#milestoneEdit--workOrderMilestoneDateString').value = workOrderMilestone.workOrderMilestoneDateString; 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) { editCloseModalFunction = closeModalFunction; bulmaJS.toggleHtmlClipped(); los.initializeDatePickers(modalElement); // los.initializeTimePickers(modalElement); - modalElement.querySelector("form").addEventListener("submit", doEdit); + modalElement.querySelector('form').addEventListener('submit', doEdit); }, onremoved() { bulmaJS.toggleHtmlClipped(); @@ -278,15 +287,16 @@ Object.defineProperty(exports, "__esModule", { value: true }); function renderMilestones() { var _a, _b, _c; // Clear milestones panel - const milestonesPanelElement = document.querySelector("#panel--milestones"); - const panelBlockElementsToDelete = milestonesPanelElement.querySelectorAll(".panel-block"); + const milestonesPanelElement = document.querySelector('#panel--milestones'); + const panelBlockElementsToDelete = milestonesPanelElement.querySelectorAll('.panel-block'); for (const panelBlockToDelete of panelBlockElementsToDelete) { panelBlockToDelete.remove(); } for (const milestone of workOrderMilestones) { - const panelBlockElement = document.createElement("div"); - panelBlockElement.className = "panel-block is-block container--milestone"; - panelBlockElement.dataset.workOrderMilestoneId = milestone.workOrderMilestoneId.toString(); + const panelBlockElement = document.createElement('div'); + panelBlockElement.className = 'panel-block is-block container--milestone'; + panelBlockElement.dataset.workOrderMilestoneId = + milestone.workOrderMilestoneId.toString(); panelBlockElement.innerHTML = '
' + ('
' + @@ -297,70 +307,75 @@ Object.defineProperty(exports, "__esModule", { value: true }); milestone.workOrderMilestoneCompletionDateString + '">' + '' + - "" + '' : '") + - "
") + + '') + + '
') + ('
' + (milestone.workOrderMilestoneTypeId - ? "" + - cityssm.escapeHTML(milestone.workOrderMilestoneType || "") + - "
" - : "") + + ? '' + + cityssm.escapeHTML(milestone.workOrderMilestoneType || '') + + '
' + : '') + milestone.workOrderMilestoneDateString + - (milestone.workOrderMilestoneTime ? " " + milestone.workOrderMilestoneTimeString : "") + - "
" + + (milestone.workOrderMilestoneTime + ? ' ' + milestone.workOrderMilestoneTimeString + : '') + + '
' + '' + - cityssm.escapeHTML(milestone.workOrderMilestoneDescription || "") + - "" + - "
") + + cityssm.escapeHTML(milestone.workOrderMilestoneDescription || '') + + '' + + '') + ('
' + '') + ('") + - "
" + - "") + - ""; + ' Delete Milestone' + + '' + + '' + + '') + + '' + + '') + + ''; (_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 - .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 - .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 - .querySelector(".button--deleteMilestone") - .addEventListener("click", deleteMilestone); + .querySelector('.button--deleteMilestone') + .addEventListener('click', deleteMilestone); milestonesPanelElement.append(panelBlockElement); } bulmaJS.init(milestonesPanelElement); } if (!isCreate) { - workOrderMilestones = exports.workOrderMilestones; + workOrderMilestones = + exports.workOrderMilestones; delete exports.workOrderMilestones; renderMilestones(); - document.querySelector("#button--addMilestone").addEventListener("click", () => { + document + .querySelector('#button--addMilestone') + .addEventListener('click', () => { let addModalElement; let addFormElement; let addCloseModalFunction; @@ -370,20 +385,20 @@ Object.defineProperty(exports, "__esModule", { value: true }); } const currentDateString = cityssm.dateToString(new Date()); function _doAdd() { - cityssm.postJSON(los.urlPrefix + "/workOrders/doAddWorkOrderMilestone", addFormElement, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/workOrders/doAddWorkOrderMilestone', addFormElement, (responseJSON) => { processMilestoneResponse(responseJSON); if (responseJSON.success) { addCloseModalFunction(); } }); } - if (addModalElement.querySelector("#milestoneAdd--workOrderMilestoneDateString").value < currentDateString) { + if (addModalElement.querySelector('#milestoneAdd--workOrderMilestoneDateString').value < currentDateString) { bulmaJS.confirm({ - title: "Milestone Date in the Past", - message: "Are you sure you want to create a milestone with a date in the past?", - contextualColorName: "warning", + title: 'Milestone Date in the Past', + message: 'Are you sure you want to create a milestone with a date in the past?', + contextualColorName: 'warning', okButton: { - text: "Yes, Create a Past Milestone", + text: 'Yes, Create a Past Milestone', callbackFunction: _doAdd } }); @@ -392,18 +407,20 @@ Object.defineProperty(exports, "__esModule", { value: true }); _doAdd(); } }; - cityssm.openHtmlModal("workOrder-addMilestone", { + cityssm.openHtmlModal('workOrder-addMilestone', { onshow(modalElement) { - modalElement.querySelector("#milestoneAdd--workOrderId").value = - workOrderId; - const milestoneTypeElement = modalElement.querySelector("#milestoneAdd--workOrderMilestoneTypeId"); + ; + modalElement.querySelector('#milestoneAdd--workOrderId').value = workOrderId; + const milestoneTypeElement = modalElement.querySelector('#milestoneAdd--workOrderMilestoneTypeId'); for (const milestoneType of exports.workOrderMilestoneTypes) { - const optionElement = document.createElement("option"); - optionElement.value = milestoneType.workOrderMilestoneTypeId.toString(); + const optionElement = document.createElement('option'); + optionElement.value = + milestoneType.workOrderMilestoneTypeId.toString(); optionElement.textContent = milestoneType.workOrderMilestoneType; milestoneTypeElement.append(optionElement); } - modalElement.querySelector("#milestoneAdd--workOrderMilestoneDateString").valueAsDate = new Date(); + ; + modalElement.querySelector('#milestoneAdd--workOrderMilestoneDateString').valueAsDate = new Date(); }, onshown(modalElement, closeModalFunction) { addModalElement = modalElement; @@ -411,8 +428,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); los.initializeDatePickers(modalElement); // los.initializeTimePickers(modalElement); bulmaJS.toggleHtmlClipped(); - addFormElement = modalElement.querySelector("form"); - addFormElement.addEventListener("submit", doAdd); + addFormElement = modalElement.querySelector('form'); + addFormElement.addEventListener('submit', doAdd); }, onremoved() { bulmaJS.toggleHtmlClipped(); diff --git a/public-typescript/workOrderEdit/workOrderEdit.ts b/public-typescript/workOrderEdit/workOrderEdit.ts index 6de438e4..81e20272 100644 --- a/public-typescript/workOrderEdit/workOrderEdit.ts +++ b/public-typescript/workOrderEdit/workOrderEdit.ts @@ -1,127 +1,142 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ -import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; -import type { BulmaJS } from "@cityssm/bulma-js/types"; +import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types' +import type { BulmaJS } from '@cityssm/bulma-js/types' -import type * as globalTypes from "../../types/globalTypes"; -import type * as recordTypes from "../../types/recordTypes"; +import type * as globalTypes from '../../types/globalTypes' +import type * as recordTypes from '../../types/recordTypes' -declare const cityssm: cityssmGlobal; -declare const bulmaJS: BulmaJS; +declare const cityssm: cityssmGlobal +declare const bulmaJS: BulmaJS -(() => { - const los = exports.los as globalTypes.LOS; +;(() => { + const los = exports.los as globalTypes.LOS - const workOrderId = (document.querySelector("#workOrderEdit--workOrderId") as HTMLInputElement).value; + const workOrderId = ( + document.querySelector('#workOrderEdit--workOrderId') as HTMLInputElement + ).value - const isCreate = workOrderId === ""; + const isCreate = workOrderId === '' - const workOrderFormElement = document.querySelector("#form--workOrderEdit") as HTMLFormElement; + const workOrderFormElement = document.querySelector( + '#form--workOrderEdit' + ) as HTMLFormElement - los.initializeDatePickers( - workOrderFormElement - .querySelector("#workOrderEdit--workOrderOpenDateString")! - .closest(".field") as HTMLElement - ); - los.initializeUnlockFieldButtons(workOrderFormElement); + los.initializeDatePickers( + workOrderFormElement + .querySelector('#workOrderEdit--workOrderOpenDateString')! + .closest('.field') as HTMLElement + ) + los.initializeUnlockFieldButtons(workOrderFormElement) - workOrderFormElement.addEventListener("submit", (submitEvent) => { - submitEvent.preventDefault(); + workOrderFormElement.addEventListener('submit', (submitEvent) => { + submitEvent.preventDefault() - cityssm.postJSON( - los.urlPrefix + "/workOrders/" + (isCreate ? "doCreateWorkOrder" : "doUpdateWorkOrder"), - submitEvent.currentTarget, - (responseJSON: { success: boolean; workOrderId?: number; errorMessage?: string }) => { - if (responseJSON.success) { - cityssm.disableNavBlocker(); + cityssm.postJSON( + los.urlPrefix + + '/workOrders/' + + (isCreate ? 'doCreateWorkOrder' : 'doUpdateWorkOrder'), + submitEvent.currentTarget, + (responseJSON: { + success: boolean + workOrderId?: number + errorMessage?: string + }) => { + if (responseJSON.success) { + cityssm.disableNavBlocker() - if (isCreate) { - window.location.href = los.getWorkOrderURL(responseJSON.workOrderId!, true); - } else { - bulmaJS.alert({ - message: "Work Order Updated Successfully", - contextualColorName: "success" - }); - } - } else { - bulmaJS.alert({ - title: "Error Updating Work Order", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }); - - const inputElements = workOrderFormElement.querySelectorAll("input, select") as NodeListOf< - HTMLInputElement | HTMLSelectElement - >; - - for (const inputElement of inputElements) { - inputElement.addEventListener("change", cityssm.enableNavBlocker); - } - - /* - * Work Order Options - */ - - function doClose() { - cityssm.postJSON( - los.urlPrefix + "/workOrders/doCloseWorkOrder", - { - workOrderId - }, - (responseJSON: { success: boolean; errorMessage?: string }) => { - if (responseJSON.success) { - window.location.href = los.urlPrefix + "/workOrders/" + workOrderId; - } else { - bulmaJS.alert({ - title: "Error Closing Work Order", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - } - - function doDelete() { - cityssm.postJSON( - los.urlPrefix + "/workOrders/doDeleteWorkOrder", - { - workOrderId - }, - (responseJSON: { success: boolean; errorMessage?: string }) => { - if (responseJSON.success) { - window.location.href = los.urlPrefix + "/workOrders"; - } else { - bulmaJS.alert({ - title: "Error Deleting Work Order", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - } - - let workOrderMilestones: recordTypes.WorkOrderMilestone[]; - - document.querySelector("#button--closeWorkOrder")?.addEventListener("click", () => { - const hasOpenMilestones = workOrderMilestones.some((milestone) => { - return !milestone.workOrderMilestoneCompletionDate; - }); - - if (hasOpenMilestones) { + if (isCreate) { + window.location.href = los.getWorkOrderURL( + responseJSON.workOrderId!, + true + ) + } else { bulmaJS.alert({ - title: "Outstanding Milestones", - message: `You cannot close a work order with outstanding milestones. - Either complete the outstanding milestones, or remove them from the work order.`, - contextualColorName: "warning" - }); + message: 'Work Order Updated Successfully', + contextualColorName: 'success' + }) + } + } else { + bulmaJS.alert({ + title: 'Error Updating Work Order', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + ) + }) - /* + const inputElements = workOrderFormElement.querySelectorAll( + 'input, select' + ) as NodeListOf + + for (const inputElement of inputElements) { + inputElement.addEventListener('change', cityssm.enableNavBlocker) + } + + /* + * Work Order Options + */ + + function doClose() { + cityssm.postJSON( + los.urlPrefix + '/workOrders/doCloseWorkOrder', + { + workOrderId + }, + (responseJSON: { success: boolean; errorMessage?: string }) => { + if (responseJSON.success) { + window.location.href = los.urlPrefix + '/workOrders/' + workOrderId + } else { + bulmaJS.alert({ + title: 'Error Closing Work Order', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + ) + } + + function doDelete() { + cityssm.postJSON( + los.urlPrefix + '/workOrders/doDeleteWorkOrder', + { + workOrderId + }, + (responseJSON: { success: boolean; errorMessage?: string }) => { + if (responseJSON.success) { + window.location.href = los.urlPrefix + '/workOrders' + } else { + bulmaJS.alert({ + title: 'Error Deleting Work Order', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + ) + } + + let workOrderMilestones: recordTypes.WorkOrderMilestone[] + + document + .querySelector('#button--closeWorkOrder') + ?.addEventListener('click', () => { + const hasOpenMilestones = workOrderMilestones.some((milestone) => { + return !milestone.workOrderMilestoneCompletionDate + }) + + if (hasOpenMilestones) { + bulmaJS.alert({ + title: 'Outstanding Milestones', + message: `You cannot close a work order with outstanding milestones. + Either complete the outstanding milestones, or remove them from the work order.`, + contextualColorName: 'warning' + }) + + /* // Disable closing work orders with open milestones bulmaJS.confirm({ title: "Close Work Order with Outstanding Milestones", @@ -134,468 +149,505 @@ declare const bulmaJS: BulmaJS; } }); */ - } else { + } else { + bulmaJS.confirm({ + title: 'Close Work Order', + message: 'Are you sure you want to close this work order?', + contextualColorName: 'info', + okButton: { + text: 'Yes, Close Work Order', + callbackFunction: doClose + } + }) + } + }) + + document + .querySelector('#button--deleteWorkOrder') + ?.addEventListener('click', (clickEvent: Event) => { + clickEvent.preventDefault() + + bulmaJS.confirm({ + title: 'Delete Work Order', + message: 'Are you sure you want to delete this work order?', + contextualColorName: 'warning', + okButton: { + text: 'Yes, Delete Work Order', + callbackFunction: doDelete + } + }) + }) + + /* + * Related Lots + */ + + if (!isCreate) { + //=include workOrderEditLots.js + } + + /* + * Comments + */ + + //=include workOrderEditComments.js + + /* + * Milestones + */ + + function processMilestoneResponse(responseJSON: { + success: boolean + errorMessage?: string + workOrderMilestones?: recordTypes.WorkOrderMilestone[] + }) { + if (responseJSON.success) { + workOrderMilestones = responseJSON.workOrderMilestones! + renderMilestones() + } else { + bulmaJS.alert({ + title: 'Error Reopening Milestone', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } + } + + function completeMilestone(clickEvent: Event) { + clickEvent.preventDefault() + + const currentDateString = cityssm.dateToString(new Date()) + + const workOrderMilestoneId = Number.parseInt( + ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--milestone' + ) as HTMLElement + ).dataset.workOrderMilestoneId!, + 10 + ) + + const workOrderMilestone = workOrderMilestones.find((currentMilestone) => { + return currentMilestone.workOrderMilestoneId === workOrderMilestoneId + })! + + const doComplete = () => { + cityssm.postJSON( + los.urlPrefix + '/workOrders/doCompleteWorkOrderMilestone', + { + workOrderId, + workOrderMilestoneId + }, + processMilestoneResponse + ) + } + + bulmaJS.confirm({ + title: 'Complete Milestone', + message: + 'Are you sure you want to complete this milestone?' + + (workOrderMilestone.workOrderMilestoneDateString! > currentDateString + ? '
Note that this milestone is expected to be completed in the future.' + : ''), + messageIsHtml: true, + contextualColorName: 'warning', + okButton: { + text: 'Yes, Complete Milestone', + callbackFunction: doComplete + } + }) + } + + function reopenMilestone(clickEvent: Event) { + clickEvent.preventDefault() + + const workOrderMilestoneId = ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--milestone' + ) as HTMLElement + ).dataset.workOrderMilestoneId + + const doReopen = () => { + cityssm.postJSON( + los.urlPrefix + '/workOrders/doReopenWorkOrderMilestone', + { + workOrderId, + workOrderMilestoneId + }, + processMilestoneResponse + ) + } + + bulmaJS.confirm({ + title: 'Reopen Milestone', + message: + 'Are you sure you want to remove the completion status from this milestone, and reopen it?', + contextualColorName: 'warning', + okButton: { + text: 'Yes, Reopen Milestone', + callbackFunction: doReopen + } + }) + } + + function deleteMilestone(clickEvent: Event) { + clickEvent.preventDefault() + + const workOrderMilestoneId = ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--milestone' + ) as HTMLElement + ).dataset.workOrderMilestoneId + + const doDelete = () => { + cityssm.postJSON( + los.urlPrefix + '/workOrders/doDeleteWorkOrderMilestone', + { + workOrderMilestoneId, + workOrderId + }, + processMilestoneResponse + ) + } + + bulmaJS.confirm({ + title: 'Delete Milestone', + message: 'Are you sure you want to delete this milestone?', + contextualColorName: 'warning', + okButton: { + text: 'Yes, Delete Milestone', + callbackFunction: doDelete + } + }) + } + + function editMilestone(clickEvent: Event) { + clickEvent.preventDefault() + + const workOrderMilestoneId = Number.parseInt( + ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--milestone' + ) as HTMLElement + ).dataset.workOrderMilestoneId!, + 10 + ) + + const workOrderMilestone = workOrderMilestones.find((currentMilestone) => { + return currentMilestone.workOrderMilestoneId === workOrderMilestoneId + })! + + let editCloseModalFunction: () => void + + const doEdit = (submitEvent: SubmitEvent) => { + submitEvent.preventDefault() + + cityssm.postJSON( + los.urlPrefix + '/workOrders/doUpdateWorkOrderMilestone', + submitEvent.currentTarget, + (responseJSON: { + success: boolean + errorMessage?: string + workOrderMilestones?: recordTypes.WorkOrderMilestone[] + }) => { + processMilestoneResponse(responseJSON) + if (responseJSON.success) { + editCloseModalFunction() + } + } + ) + } + + cityssm.openHtmlModal('workOrder-editMilestone', { + onshow(modalElement) { + ;( + modalElement.querySelector( + '#milestoneEdit--workOrderId' + ) as HTMLInputElement + ).value = workOrderId + + ;( + modalElement.querySelector( + '#milestoneEdit--workOrderMilestoneId' + ) as HTMLInputElement + ).value = workOrderMilestone.workOrderMilestoneId!.toString() + + const milestoneTypeElement = modalElement.querySelector( + '#milestoneEdit--workOrderMilestoneTypeId' + ) as HTMLSelectElement + + let milestoneTypeFound = false + + for (const milestoneType of exports.workOrderMilestoneTypes as recordTypes.WorkOrderMilestoneType[]) { + const optionElement = document.createElement('option') + + optionElement.value = + milestoneType.workOrderMilestoneTypeId.toString() + optionElement.textContent = milestoneType.workOrderMilestoneType + + if ( + milestoneType.workOrderMilestoneTypeId === + workOrderMilestone.workOrderMilestoneTypeId + ) { + optionElement.selected = true + milestoneTypeFound = true + } + + milestoneTypeElement.append(optionElement) + } + + if ( + !milestoneTypeFound && + workOrderMilestone.workOrderMilestoneTypeId + ) { + const optionElement = document.createElement('option') + optionElement.value = + workOrderMilestone.workOrderMilestoneTypeId.toString() + optionElement.textContent = workOrderMilestone.workOrderMilestoneType! + optionElement.selected = true + milestoneTypeElement.append(optionElement) + } + + ;( + modalElement.querySelector( + '#milestoneEdit--workOrderMilestoneDateString' + ) as HTMLInputElement + ).value = workOrderMilestone.workOrderMilestoneDateString! + + if (workOrderMilestone.workOrderMilestoneTime) { + ;( + modalElement.querySelector( + '#milestoneEdit--workOrderMilestoneTimeString' + ) as HTMLInputElement + ).value = workOrderMilestone.workOrderMilestoneTimeString! + } + + ;( + modalElement.querySelector( + '#milestoneEdit--workOrderMilestoneDescription' + ) as HTMLTextAreaElement + ).value = workOrderMilestone.workOrderMilestoneDescription! + }, + onshown(modalElement, closeModalFunction) { + editCloseModalFunction = closeModalFunction + + bulmaJS.toggleHtmlClipped() + + los.initializeDatePickers(modalElement) + // los.initializeTimePickers(modalElement); + modalElement.querySelector('form')!.addEventListener('submit', doEdit) + }, + onremoved() { + bulmaJS.toggleHtmlClipped() + } + }) + } + + function renderMilestones() { + // Clear milestones panel + const milestonesPanelElement = document.querySelector( + '#panel--milestones' + ) as HTMLElement + + const panelBlockElementsToDelete = + milestonesPanelElement.querySelectorAll('.panel-block') + + for (const panelBlockToDelete of panelBlockElementsToDelete) { + panelBlockToDelete.remove() + } + + for (const milestone of workOrderMilestones) { + const panelBlockElement = document.createElement('div') + panelBlockElement.className = 'panel-block is-block container--milestone' + + panelBlockElement.dataset.workOrderMilestoneId = + milestone.workOrderMilestoneId!.toString() + + panelBlockElement.innerHTML = + '
' + + ('
' + + (milestone.workOrderMilestoneCompletionDate + ? '' + + '' + + '' + : '') + + '
') + + ('
' + + (milestone.workOrderMilestoneTypeId + ? '' + + cityssm.escapeHTML(milestone.workOrderMilestoneType || '') + + '
' + : '') + + milestone.workOrderMilestoneDateString + + (milestone.workOrderMilestoneTime + ? ' ' + milestone.workOrderMilestoneTimeString + : '') + + '
' + + '' + + cityssm.escapeHTML(milestone.workOrderMilestoneDescription || '') + + '' + + '
') + + ('
' + + '' + + '
') + + '
' + + panelBlockElement + .querySelector('.button--reopenMilestone') + ?.addEventListener('click', reopenMilestone) + panelBlockElement + .querySelector('.button--editMilestone') + ?.addEventListener('click', editMilestone) + + panelBlockElement + .querySelector('.button--completeMilestone') + ?.addEventListener('click', completeMilestone) + + panelBlockElement + .querySelector('.button--deleteMilestone')! + .addEventListener('click', deleteMilestone) + + milestonesPanelElement.append(panelBlockElement) + } + + bulmaJS.init(milestonesPanelElement) + } + + if (!isCreate) { + workOrderMilestones = + exports.workOrderMilestones as recordTypes.WorkOrderMilestone[] + delete exports.workOrderMilestones + + renderMilestones() + + document + .querySelector('#button--addMilestone')! + .addEventListener('click', () => { + let addModalElement: HTMLElement + let addFormElement: HTMLFormElement + let addCloseModalFunction: () => void + + const doAdd = (submitEvent: SubmitEvent) => { + if (submitEvent) { + submitEvent.preventDefault() + } + + const currentDateString = cityssm.dateToString(new Date()) + + function _doAdd() { + cityssm.postJSON( + los.urlPrefix + '/workOrders/doAddWorkOrderMilestone', + addFormElement, + (responseJSON: { + success: boolean + errorMessage?: string + workOrderMilestones?: recordTypes.WorkOrderMilestone[] + }) => { + processMilestoneResponse(responseJSON) + + if (responseJSON.success) { + addCloseModalFunction() + } + } + ) + } + + if ( + ( + addModalElement.querySelector( + '#milestoneAdd--workOrderMilestoneDateString' + ) as HTMLInputElement + ).value < currentDateString + ) { bulmaJS.confirm({ - title: "Close Work Order", - message: "Are you sure you want to close this work order?", - contextualColorName: "info", - okButton: { - text: "Yes, Close Work Order", - callbackFunction: doClose - } - }); - } - }); - - document.querySelector("#button--deleteWorkOrder")?.addEventListener("click", (clickEvent: Event) => { - clickEvent.preventDefault(); - - bulmaJS.confirm({ - title: "Delete Work Order", - message: "Are you sure you want to delete this work order?", - contextualColorName: "warning", - okButton: { - text: "Yes, Delete Work Order", - callbackFunction: doDelete - } - }); - }); - - /* - * Related Lots - */ - - if (!isCreate) { - //=include workOrderEditLots.js - } - - /* - * Comments - */ - - //=include workOrderEditComments.js - - /* - * Milestones - */ - - function processMilestoneResponse(responseJSON: { - success: boolean; - errorMessage?: string; - workOrderMilestones?: recordTypes.WorkOrderMilestone[]; - }) { - if (responseJSON.success) { - workOrderMilestones = responseJSON.workOrderMilestones!; - renderMilestones(); - } else { - bulmaJS.alert({ - title: "Error Reopening Milestone", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - - function completeMilestone(clickEvent: Event) { - clickEvent.preventDefault(); - - const currentDateString = cityssm.dateToString(new Date()); - - const workOrderMilestoneId = Number.parseInt( - ((clickEvent.currentTarget as HTMLElement).closest(".container--milestone") as HTMLElement) - .dataset.workOrderMilestoneId!, - 10 - ); - - const workOrderMilestone = workOrderMilestones.find((currentMilestone) => { - return currentMilestone.workOrderMilestoneId === workOrderMilestoneId; - })!; - - const doComplete = () => { - cityssm.postJSON( - los.urlPrefix + "/workOrders/doCompleteWorkOrderMilestone", - { - workOrderId, - workOrderMilestoneId - }, - processMilestoneResponse - ); - }; - - bulmaJS.confirm({ - title: "Complete Milestone", - message: - "Are you sure you want to complete this milestone?" + - (workOrderMilestone.workOrderMilestoneDateString! > currentDateString - ? "
Note that this milestone is expected to be completed in the future." - : ""), - messageIsHtml: true, - contextualColorName: "warning", - okButton: { - text: "Yes, Complete Milestone", - callbackFunction: doComplete - } - }); - } - - function reopenMilestone(clickEvent: Event) { - clickEvent.preventDefault(); - - const workOrderMilestoneId = ( - (clickEvent.currentTarget as HTMLElement).closest(".container--milestone") as HTMLElement - ).dataset.workOrderMilestoneId; - - const doReopen = () => { - cityssm.postJSON( - los.urlPrefix + "/workOrders/doReopenWorkOrderMilestone", - { - workOrderId, - workOrderMilestoneId - }, - processMilestoneResponse - ); - }; - - bulmaJS.confirm({ - title: "Reopen Milestone", - message: - "Are you sure you want to remove the completion status from this milestone, and reopen it?", - contextualColorName: "warning", - okButton: { - text: "Yes, Reopen Milestone", - callbackFunction: doReopen - } - }); - } - - function deleteMilestone(clickEvent: Event) { - clickEvent.preventDefault(); - - const workOrderMilestoneId = ( - (clickEvent.currentTarget as HTMLElement).closest(".container--milestone") as HTMLElement - ).dataset.workOrderMilestoneId; - - const doDelete = () => { - cityssm.postJSON( - los.urlPrefix + "/workOrders/doDeleteWorkOrderMilestone", - { - workOrderMilestoneId, - workOrderId - }, - processMilestoneResponse - ); - }; - - bulmaJS.confirm({ - title: "Delete Milestone", - message: "Are you sure you want to delete this milestone?", - contextualColorName: "warning", - okButton: { - text: "Yes, Delete Milestone", - callbackFunction: doDelete - } - }); - } - - function editMilestone(clickEvent: Event) { - clickEvent.preventDefault(); - - const workOrderMilestoneId = Number.parseInt( - ((clickEvent.currentTarget as HTMLElement).closest(".container--milestone") as HTMLElement) - .dataset.workOrderMilestoneId!, - 10 - ); - - const workOrderMilestone = workOrderMilestones.find((currentMilestone) => { - return currentMilestone.workOrderMilestoneId === workOrderMilestoneId; - })!; - - let editCloseModalFunction: () => void; - - const doEdit = (submitEvent: SubmitEvent) => { - submitEvent.preventDefault(); - - cityssm.postJSON( - los.urlPrefix + "/workOrders/doUpdateWorkOrderMilestone", - submitEvent.currentTarget, - (responseJSON: { - success: boolean; - errorMessage?: string; - workOrderMilestones?: recordTypes.WorkOrderMilestone[]; - }) => { - processMilestoneResponse(responseJSON); - if (responseJSON.success) { - editCloseModalFunction(); - } - } - ); - }; - - cityssm.openHtmlModal("workOrder-editMilestone", { - onshow(modalElement) { - (modalElement.querySelector("#milestoneEdit--workOrderId") as HTMLInputElement).value = - workOrderId; - - ( - modalElement.querySelector("#milestoneEdit--workOrderMilestoneId") as HTMLInputElement - ).value = workOrderMilestone.workOrderMilestoneId!.toString(); - - const milestoneTypeElement = modalElement.querySelector( - "#milestoneEdit--workOrderMilestoneTypeId" - ) as HTMLSelectElement; - - let milestoneTypeFound = false; - - for (const milestoneType of exports.workOrderMilestoneTypes as recordTypes.WorkOrderMilestoneType[]) { - const optionElement = document.createElement("option"); - - optionElement.value = milestoneType.workOrderMilestoneTypeId.toString(); - optionElement.textContent = milestoneType.workOrderMilestoneType; - - if ( - milestoneType.workOrderMilestoneTypeId === workOrderMilestone.workOrderMilestoneTypeId - ) { - optionElement.selected = true; - milestoneTypeFound = true; - } - - milestoneTypeElement.append(optionElement); - } - - if (!milestoneTypeFound && workOrderMilestone.workOrderMilestoneTypeId) { - const optionElement = document.createElement("option"); - optionElement.value = workOrderMilestone.workOrderMilestoneTypeId.toString(); - optionElement.textContent = workOrderMilestone.workOrderMilestoneType!; - optionElement.selected = true; - milestoneTypeElement.append(optionElement); - } - - ( - modalElement.querySelector( - "#milestoneEdit--workOrderMilestoneDateString" - ) as HTMLInputElement - ).value = workOrderMilestone.workOrderMilestoneDateString!; - - if (workOrderMilestone.workOrderMilestoneTime) { - ( - modalElement.querySelector( - "#milestoneEdit--workOrderMilestoneTimeString" - ) as HTMLInputElement - ).value = workOrderMilestone.workOrderMilestoneTimeString!; - } - - ( - modalElement.querySelector( - "#milestoneEdit--workOrderMilestoneDescription" - ) as HTMLTextAreaElement - ).value = workOrderMilestone.workOrderMilestoneDescription!; - }, - onshown(modalElement, closeModalFunction) { - editCloseModalFunction = closeModalFunction; - - bulmaJS.toggleHtmlClipped(); - - los.initializeDatePickers(modalElement); - // los.initializeTimePickers(modalElement); - modalElement.querySelector("form")!.addEventListener("submit", doEdit); - }, - onremoved() { - bulmaJS.toggleHtmlClipped(); - } - }); - } - - function renderMilestones() { - // Clear milestones panel - const milestonesPanelElement = document.querySelector("#panel--milestones") as HTMLElement; - - const panelBlockElementsToDelete = milestonesPanelElement.querySelectorAll(".panel-block"); - - for (const panelBlockToDelete of panelBlockElementsToDelete) { - panelBlockToDelete.remove(); + title: 'Milestone Date in the Past', + message: + 'Are you sure you want to create a milestone with a date in the past?', + contextualColorName: 'warning', + okButton: { + text: 'Yes, Create a Past Milestone', + callbackFunction: _doAdd + } + }) + } else { + _doAdd() + } } - for (const milestone of workOrderMilestones) { - const panelBlockElement = document.createElement("div"); - panelBlockElement.className = "panel-block is-block container--milestone"; + cityssm.openHtmlModal('workOrder-addMilestone', { + onshow(modalElement) { + ;( + modalElement.querySelector( + '#milestoneAdd--workOrderId' + ) as HTMLInputElement + ).value = workOrderId - panelBlockElement.dataset.workOrderMilestoneId = milestone.workOrderMilestoneId!.toString(); + const milestoneTypeElement = modalElement.querySelector( + '#milestoneAdd--workOrderMilestoneTypeId' + ) as HTMLSelectElement - panelBlockElement.innerHTML = - '
' + - ('
' + - (milestone.workOrderMilestoneCompletionDate - ? '' + - '' + - "" - : '") + - "
") + - ('
' + - (milestone.workOrderMilestoneTypeId - ? "" + - cityssm.escapeHTML(milestone.workOrderMilestoneType || "") + - "
" - : "") + - milestone.workOrderMilestoneDateString + - (milestone.workOrderMilestoneTime ? " " + milestone.workOrderMilestoneTimeString : "") + - "
" + - '' + - cityssm.escapeHTML(milestone.workOrderMilestoneDescription || "") + - "" + - "
") + - ('
' + - '" + - "
") + - "
"; + for (const milestoneType of exports.workOrderMilestoneTypes as recordTypes.WorkOrderMilestoneType[]) { + const optionElement = document.createElement('option') - panelBlockElement - .querySelector(".button--reopenMilestone") - ?.addEventListener("click", reopenMilestone); - panelBlockElement - .querySelector(".button--editMilestone") - ?.addEventListener("click", editMilestone); + optionElement.value = + milestoneType.workOrderMilestoneTypeId.toString() + optionElement.textContent = milestoneType.workOrderMilestoneType - panelBlockElement - .querySelector(".button--completeMilestone") - ?.addEventListener("click", completeMilestone); + milestoneTypeElement.append(optionElement) + } - panelBlockElement - .querySelector(".button--deleteMilestone")! - .addEventListener("click", deleteMilestone); + ;( + modalElement.querySelector( + '#milestoneAdd--workOrderMilestoneDateString' + ) as HTMLInputElement + ).valueAsDate = new Date() + }, + onshown(modalElement, closeModalFunction) { + addModalElement = modalElement + addCloseModalFunction = closeModalFunction - milestonesPanelElement.append(panelBlockElement); - } + los.initializeDatePickers(modalElement) + // los.initializeTimePickers(modalElement); - bulmaJS.init(milestonesPanelElement); - } + bulmaJS.toggleHtmlClipped() - if (!isCreate) { - workOrderMilestones = exports.workOrderMilestones as recordTypes.WorkOrderMilestone[]; - delete exports.workOrderMilestones; - - renderMilestones(); - - document.querySelector("#button--addMilestone")!.addEventListener("click", () => { - let addModalElement: HTMLElement; - let addFormElement: HTMLFormElement; - let addCloseModalFunction: () => void; - - const doAdd = (submitEvent: SubmitEvent) => { - if (submitEvent) { - submitEvent.preventDefault(); - } - - const currentDateString = cityssm.dateToString(new Date()); - - function _doAdd() { - cityssm.postJSON( - los.urlPrefix + "/workOrders/doAddWorkOrderMilestone", - addFormElement, - (responseJSON: { - success: boolean; - errorMessage?: string; - workOrderMilestones?: recordTypes.WorkOrderMilestone[]; - }) => { - processMilestoneResponse(responseJSON); - - if (responseJSON.success) { - addCloseModalFunction(); - } - } - ); - } - - if ( - ( - addModalElement.querySelector( - "#milestoneAdd--workOrderMilestoneDateString" - ) as HTMLInputElement - ).value < currentDateString - ) { - bulmaJS.confirm({ - title: "Milestone Date in the Past", - message: "Are you sure you want to create a milestone with a date in the past?", - contextualColorName: "warning", - okButton: { - text: "Yes, Create a Past Milestone", - callbackFunction: _doAdd - } - }); - } else { - _doAdd(); - } - }; - - cityssm.openHtmlModal("workOrder-addMilestone", { - onshow(modalElement) { - (modalElement.querySelector("#milestoneAdd--workOrderId") as HTMLInputElement).value = - workOrderId; - - const milestoneTypeElement = modalElement.querySelector( - "#milestoneAdd--workOrderMilestoneTypeId" - ) as HTMLSelectElement; - - for (const milestoneType of exports.workOrderMilestoneTypes as recordTypes.WorkOrderMilestoneType[]) { - const optionElement = document.createElement("option"); - - optionElement.value = milestoneType.workOrderMilestoneTypeId.toString(); - optionElement.textContent = milestoneType.workOrderMilestoneType; - - milestoneTypeElement.append(optionElement); - } - - ( - modalElement.querySelector( - "#milestoneAdd--workOrderMilestoneDateString" - ) as HTMLInputElement - ).valueAsDate = new Date(); - }, - onshown(modalElement, closeModalFunction) { - addModalElement = modalElement; - addCloseModalFunction = closeModalFunction; - - los.initializeDatePickers(modalElement); - // los.initializeTimePickers(modalElement); - - bulmaJS.toggleHtmlClipped(); - - addFormElement = modalElement.querySelector("form")!; - addFormElement.addEventListener("submit", doAdd); - }, - onremoved() { - bulmaJS.toggleHtmlClipped(); - } - }); - }); - } -})(); + addFormElement = modalElement.querySelector('form')! + addFormElement.addEventListener('submit', doAdd) + }, + onremoved() { + bulmaJS.toggleHtmlClipped() + } + }) + }) + } +})() diff --git a/public-typescript/workOrderEdit/workOrderEditComments.js b/public-typescript/workOrderEdit/workOrderEditComments.js index c20ce8a1..e244d42f 100644 --- a/public-typescript/workOrderEdit/workOrderEditComments.js +++ b/public-typescript/workOrderEdit/workOrderEditComments.js @@ -5,7 +5,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); let workOrderComments = exports.workOrderComments; delete exports.workOrderComments; 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) => { return currentComment.workOrderCommentId === workOrderCommentId; }); @@ -13,7 +14,7 @@ const openEditWorkOrderComment = (clickEvent) => { let editCloseModalFunction; function editComment(submitEvent) { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/workOrders/doUpdateWorkOrderComment", editFormElement, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/workOrders/doUpdateWorkOrderComment', editFormElement, (responseJSON) => { if (responseJSON.success) { workOrderComments = responseJSON.workOrderComments; editCloseModalFunction(); @@ -21,35 +22,35 @@ const openEditWorkOrderComment = (clickEvent) => { } else { bulmaJS.alert({ - title: "Error Updating Comment", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Updating Comment', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); } - cityssm.openHtmlModal("workOrder-editComment", { + cityssm.openHtmlModal('workOrder-editComment', { onshow(modalElement) { - modalElement.querySelector("#workOrderCommentEdit--workOrderId").value = - workOrderId; - modalElement.querySelector("#workOrderCommentEdit--workOrderCommentId").value = workOrderCommentId.toString(); - modalElement.querySelector("#workOrderCommentEdit--workOrderComment").value = workOrderComment.workOrderComment; - const workOrderCommentDateStringElement = modalElement.querySelector("#workOrderCommentEdit--workOrderCommentDateString"); - workOrderCommentDateStringElement.value = workOrderComment.workOrderCommentDateString; + ; + modalElement.querySelector('#workOrderCommentEdit--workOrderId').value = workOrderId; + modalElement.querySelector('#workOrderCommentEdit--workOrderCommentId').value = workOrderCommentId.toString(); + modalElement.querySelector('#workOrderCommentEdit--workOrderComment').value = workOrderComment.workOrderComment; + const workOrderCommentDateStringElement = modalElement.querySelector('#workOrderCommentEdit--workOrderCommentDateString'); + workOrderCommentDateStringElement.value = + workOrderComment.workOrderCommentDateString; const currentDateString = cityssm.dateToString(new Date()); workOrderCommentDateStringElement.max = workOrderComment.workOrderCommentDateString <= currentDateString ? currentDateString : workOrderComment.workOrderCommentDateString; - modalElement.querySelector("#workOrderCommentEdit--workOrderCommentTimeString").value = workOrderComment.workOrderCommentTimeString; + modalElement.querySelector('#workOrderCommentEdit--workOrderCommentTimeString').value = workOrderComment.workOrderCommentTimeString; }, onshown(modalElement, closeModalFunction) { bulmaJS.toggleHtmlClipped(); los.initializeDatePickers(modalElement); - // los.initializeTimePickers(modalElement); - modalElement.querySelector("#workOrderCommentEdit--workOrderComment").focus(); - editFormElement = modalElement.querySelector("form"); - editFormElement.addEventListener("submit", editComment); + modalElement.querySelector('#workOrderCommentEdit--workOrderComment').focus(); + editFormElement = modalElement.querySelector('form'); + editFormElement.addEventListener('submit', editComment); editCloseModalFunction = closeModalFunction; }, onremoved() { @@ -58,9 +59,10 @@ const openEditWorkOrderComment = (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() { - cityssm.postJSON(los.urlPrefix + "/workOrders/doDeleteWorkOrderComment", { + cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrderComment', { workOrderId, workOrderCommentId }, (responseJSON) => { @@ -70,77 +72,82 @@ function deleteWorkOrderComment(clickEvent) { } else { bulmaJS.alert({ - title: "Error Removing Comment", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Removing Comment', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); } bulmaJS.confirm({ - title: "Remove Comment?", - message: "Are you sure you want to remove this comment?", + title: 'Remove Comment?', + message: 'Are you sure you want to remove this comment?', okButton: { - text: "Yes, Remove Comment", + text: 'Yes, Remove Comment', callbackFunction: doDelete }, - contextualColorName: "warning" + contextualColorName: 'warning' }); } function renderWorkOrderComments() { - const containerElement = document.querySelector("#container--workOrderComments"); + const containerElement = document.querySelector('#container--workOrderComments'); if (workOrderComments.length === 0) { containerElement.innerHTML = `

There are no comments to display.

`; return; } - const tableElement = document.createElement("table"); - tableElement.className = "table is-fullwidth is-striped is-hoverable"; + const tableElement = document.createElement('table'); + tableElement.className = 'table is-fullwidth is-striped is-hoverable'; tableElement.innerHTML = ` Commentor Comment Date Comment Options`; for (const workOrderComment of workOrderComments) { - const tableRowElement = document.createElement("tr"); - tableRowElement.dataset.workOrderCommentId = workOrderComment.workOrderCommentId.toString(); + const tableRowElement = document.createElement('tr'); + tableRowElement.dataset.workOrderCommentId = + workOrderComment.workOrderCommentId.toString(); tableRowElement.innerHTML = - "" + - cityssm.escapeHTML(workOrderComment.recordCreate_userName || "") + - "" + - "" + + '' + + cityssm.escapeHTML(workOrderComment.recordCreate_userName || '') + + '' + + '' + workOrderComment.workOrderCommentDateString + (workOrderComment.workOrderCommentTime === 0 - ? "" - : " " + workOrderComment.workOrderCommentTimeString) + - "" + - "" + - cityssm.escapeHTML(workOrderComment.workOrderComment || "") + - "" + + ? '' + : ' ' + workOrderComment.workOrderCommentTimeString) + + '' + + '' + + cityssm.escapeHTML(workOrderComment.workOrderComment || '') + + '' + ('' + '
' + ('") + + ' Edit' + + '') + ('") + - "
" + - ""); - tableRowElement.querySelector(".button--edit").addEventListener("click", openEditWorkOrderComment); - tableRowElement.querySelector(".button--delete").addEventListener("click", deleteWorkOrderComment); - tableElement.querySelector("tbody").append(tableRowElement); + '') + + '' + + ''); + tableRowElement + .querySelector('.button--edit') + .addEventListener('click', openEditWorkOrderComment); + tableRowElement + .querySelector('.button--delete') + .addEventListener('click', deleteWorkOrderComment); + tableElement.querySelector('tbody').append(tableRowElement); } - containerElement.innerHTML = ""; + containerElement.innerHTML = ''; containerElement.append(tableElement); } function openAddCommentModal() { let addCommentCloseModalFunction; function doAddComment(formEvent) { formEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/workOrders/doAddWorkOrderComment", formEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/workOrders/doAddWorkOrderComment', formEvent.currentTarget, (responseJSON) => { if (responseJSON.success) { workOrderComments = responseJSON.workOrderComments; renderWorkOrderComments(); @@ -148,25 +155,27 @@ function openAddCommentModal() { } }); } - cityssm.openHtmlModal("workOrder-addComment", { + cityssm.openHtmlModal('workOrder-addComment', { onshow(modalElement) { los.populateAliases(modalElement); - modalElement.querySelector("#workOrderCommentAdd--workOrderId").value = - workOrderId; - modalElement.querySelector("form").addEventListener("submit", doAddComment); + modalElement.querySelector('#workOrderCommentAdd--workOrderId').value = workOrderId; + modalElement + .querySelector('form') + .addEventListener('submit', doAddComment); }, onshown(modalElement, closeModalFunction) { bulmaJS.toggleHtmlClipped(); addCommentCloseModalFunction = closeModalFunction; - modalElement.querySelector("#workOrderCommentAdd--workOrderComment").focus(); + modalElement.querySelector('#workOrderCommentAdd--workOrderComment').focus(); }, onremoved() { 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) { renderWorkOrderComments(); } diff --git a/public-typescript/workOrderEdit/workOrderEditComments.ts b/public-typescript/workOrderEdit/workOrderEditComments.ts index 4420fc39..67b75e9e 100644 --- a/public-typescript/workOrderEdit/workOrderEditComments.ts +++ b/public-typescript/workOrderEdit/workOrderEditComments.ts @@ -1,256 +1,290 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ -import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; -import type { BulmaJS } from "@cityssm/bulma-js/types"; +import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types' +import type { BulmaJS } from '@cityssm/bulma-js/types' -import type * as globalTypes from "../../types/globalTypes"; -import type * as recordTypes from "../../types/recordTypes"; +import type * as globalTypes from '../../types/globalTypes' +import type * as recordTypes from '../../types/recordTypes' -declare const cityssm: cityssmGlobal; -declare const bulmaJS: BulmaJS; +declare const cityssm: cityssmGlobal +declare const bulmaJS: BulmaJS -declare const los: globalTypes.LOS; +declare const los: globalTypes.LOS -declare const workOrderId: string; -declare const isCreate: boolean; +declare const workOrderId: string +declare const isCreate: boolean -let workOrderComments: recordTypes.WorkOrderComment[] = exports.workOrderComments; -delete exports.workOrderComments; +let workOrderComments: recordTypes.WorkOrderComment[] = + exports.workOrderComments +delete exports.workOrderComments const openEditWorkOrderComment = (clickEvent: Event) => { - const workOrderCommentId = Number.parseInt( - (clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.workOrderCommentId!, - 10 - ); + const workOrderCommentId = Number.parseInt( + (clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset + .workOrderCommentId!, + 10 + ) - const workOrderComment = workOrderComments.find((currentComment) => { - return currentComment.workOrderCommentId === workOrderCommentId; - })!; + const workOrderComment = workOrderComments.find((currentComment) => { + return currentComment.workOrderCommentId === workOrderCommentId + })! - let editFormElement: HTMLFormElement; - let editCloseModalFunction: () => void; + let editFormElement: HTMLFormElement + let editCloseModalFunction: () => void - function editComment(submitEvent: SubmitEvent): void { - submitEvent.preventDefault(); + function editComment(submitEvent: SubmitEvent): void { + submitEvent.preventDefault() - cityssm.postJSON( - los.urlPrefix + "/workOrders/doUpdateWorkOrderComment", - editFormElement, - (responseJSON: { - success: boolean; - errorMessage?: string; - workOrderComments?: recordTypes.WorkOrderComment[]; - }) => { - if (responseJSON.success) { - workOrderComments = responseJSON.workOrderComments!; - editCloseModalFunction(); - renderWorkOrderComments(); - } else { - bulmaJS.alert({ - title: "Error Updating Comment", - message: responseJSON.errorMessage || "", - 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.postJSON( + los.urlPrefix + '/workOrders/doUpdateWorkOrderComment', + editFormElement, + (responseJSON: { + success: boolean + errorMessage?: string + workOrderComments?: recordTypes.WorkOrderComment[] + }) => { + if (responseJSON.success) { + workOrderComments = responseJSON.workOrderComments! + editCloseModalFunction() + renderWorkOrderComments() + } else { + bulmaJS.alert({ + title: 'Error Updating Comment', + message: responseJSON.errorMessage || '', + 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() + } + }) +} function deleteWorkOrderComment(clickEvent: Event): void { - const workOrderCommentId = Number.parseInt( - (clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.workOrderCommentId!, - 10 - ); + const workOrderCommentId = Number.parseInt( + (clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset + .workOrderCommentId!, + 10 + ) - function doDelete() { - cityssm.postJSON( - los.urlPrefix + "/workOrders/doDeleteWorkOrderComment", - { - workOrderId, - workOrderCommentId - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - workOrderComments: recordTypes.WorkOrderComment[]; - }) => { - if (responseJSON.success) { - workOrderComments = responseJSON.workOrderComments; - renderWorkOrderComments(); - } else { - bulmaJS.alert({ - title: "Error Removing Comment", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - } + function doDelete() { + cityssm.postJSON( + los.urlPrefix + '/workOrders/doDeleteWorkOrderComment', + { + workOrderId, + workOrderCommentId + }, + (responseJSON: { + success: boolean + errorMessage?: string + workOrderComments: recordTypes.WorkOrderComment[] + }) => { + if (responseJSON.success) { + workOrderComments = responseJSON.workOrderComments + renderWorkOrderComments() + } 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" - }); + 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 renderWorkOrderComments() { - const containerElement = document.querySelector("#container--workOrderComments") as HTMLElement; + const containerElement = document.querySelector( + '#container--workOrderComments' + ) as HTMLElement - if (workOrderComments.length === 0) { - containerElement.innerHTML = `
+ if (workOrderComments.length === 0) { + containerElement.innerHTML = `

There are no comments to display.

-
`; - return; - } +
` + return + } - const tableElement = document.createElement("table"); - tableElement.className = "table is-fullwidth is-striped is-hoverable"; - tableElement.innerHTML = ` + const tableElement = document.createElement('table') + tableElement.className = 'table is-fullwidth is-striped is-hoverable' + tableElement.innerHTML = ` Commentor Comment Date Comment - Options`; + Options` - for (const workOrderComment of workOrderComments) { - const tableRowElement = document.createElement("tr"); - tableRowElement.dataset.workOrderCommentId = workOrderComment.workOrderCommentId!.toString(); + for (const workOrderComment of workOrderComments) { + const tableRowElement = document.createElement('tr') + tableRowElement.dataset.workOrderCommentId = + workOrderComment.workOrderCommentId!.toString() - tableRowElement.innerHTML = - "" + - cityssm.escapeHTML(workOrderComment.recordCreate_userName || "") + - "" + - "" + - workOrderComment.workOrderCommentDateString + - (workOrderComment.workOrderCommentTime === 0 - ? "" - : " " + workOrderComment.workOrderCommentTimeString) + - "" + - "" + - cityssm.escapeHTML(workOrderComment.workOrderComment || "") + - "" + - ('' + - '
' + - ('") + - ('") + - "
" + - ""); + tableRowElement.innerHTML = + '' + + cityssm.escapeHTML(workOrderComment.recordCreate_userName || '') + + '' + + '' + + workOrderComment.workOrderCommentDateString + + (workOrderComment.workOrderCommentTime === 0 + ? '' + : ' ' + workOrderComment.workOrderCommentTimeString) + + '' + + '' + + cityssm.escapeHTML(workOrderComment.workOrderComment || '') + + '' + + ('' + + '
' + + ('') + + ('') + + '
' + + '') - 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.append(tableElement); + containerElement.innerHTML = '' + containerElement.append(tableElement) } function openAddCommentModal() { - let addCommentCloseModalFunction: () => void; + let addCommentCloseModalFunction: () => void - function doAddComment(formEvent: SubmitEvent) { - formEvent.preventDefault(); + function doAddComment(formEvent: SubmitEvent) { + formEvent.preventDefault() - cityssm.postJSON( - los.urlPrefix + "/workOrders/doAddWorkOrderComment", - formEvent.currentTarget, - (responseJSON: { success: boolean; workOrderComments?: recordTypes.WorkOrderComment[] }) => { - 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.postJSON( + los.urlPrefix + '/workOrders/doAddWorkOrderComment', + formEvent.currentTarget, + (responseJSON: { + success: boolean + workOrderComments?: recordTypes.WorkOrderComment[] + }) => { + 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() + } + }) } -document.querySelector("#workOrderComments--add")?.addEventListener("click", openAddCommentModal); +document + .querySelector('#workOrderComments--add') + ?.addEventListener('click', openAddCommentModal) if (!isCreate) { - renderWorkOrderComments(); + renderWorkOrderComments() } diff --git a/public-typescript/workOrderEdit/workOrderEditLots.js b/public-typescript/workOrderEdit/workOrderEditLots.js index a16ec1b9..618b00b2 100644 --- a/public-typescript/workOrderEdit/workOrderEditLots.js +++ b/public-typescript/workOrderEdit/workOrderEditLots.js @@ -6,9 +6,9 @@ delete exports.workOrderLots; let workOrderLotOccupancies = exports.workOrderLotOccupancies; delete exports.workOrderLotOccupancies; function deleteLotOccupancy(clickEvent) { - const lotOccupancyId = clickEvent.currentTarget.closest(".container--lotOccupancy").dataset.lotOccupancyId; + const lotOccupancyId = clickEvent.currentTarget.closest('.container--lotOccupancy').dataset.lotOccupancyId; function doDelete() { - cityssm.postJSON(los.urlPrefix + "/workOrders/doDeleteWorkOrderLotOccupancy", { + cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrderLotOccupancy', { workOrderId, lotOccupancyId }, (responseJSON) => { @@ -18,9 +18,9 @@ function deleteLotOccupancy(clickEvent) { } else { bulmaJS.alert({ - title: "Error Deleting Relationship", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Deleting Relationship', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); @@ -28,15 +28,15 @@ function deleteLotOccupancy(clickEvent) { bulmaJS.confirm({ 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.`, - contextualColorName: "warning", + contextualColorName: 'warning', okButton: { - text: "Yes, Delete Relationship", + text: 'Yes, Delete Relationship', callbackFunction: doDelete } }); } function addLot(lotId, callbackFunction) { - cityssm.postJSON(los.urlPrefix + "/workOrders/doAddWorkOrderLot", { + cityssm.postJSON(los.urlPrefix + '/workOrders/doAddWorkOrderLot', { workOrderId, lotId }, (responseJSON) => { @@ -46,9 +46,9 @@ function addLot(lotId, callbackFunction) { } else { bulmaJS.alert({ - title: "Error Adding " + los.escapedAliases.Lot, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Adding ' + los.escapedAliases.Lot, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } if (callbackFunction) { @@ -57,7 +57,7 @@ function addLot(lotId, callbackFunction) { }); } function addLotOccupancy(lotOccupancyId, callbackFunction) { - cityssm.postJSON(los.urlPrefix + "/workOrders/doAddWorkOrderLotOccupancy", { + cityssm.postJSON(los.urlPrefix + '/workOrders/doAddWorkOrderLotOccupancy', { workOrderId, lotOccupancyId }, (responseJSON) => { @@ -67,9 +67,9 @@ function addLotOccupancy(lotOccupancyId, callbackFunction) { } else { bulmaJS.alert({ - title: "Error Adding " + los.escapedAliases.Occupancy, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Adding ' + los.escapedAliases.Occupancy, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } if (callbackFunction) { @@ -83,9 +83,8 @@ function addLotFromLotOccupancy(clickEvent) { } function renderRelatedOccupancies() { var _a, _b; - const occupanciesContainerElement = document.querySelector("#container--lotOccupancies"); - document.querySelector(".tabs a[href='#relatedTab--lotOccupancies'] .tag").textContent = - workOrderLotOccupancies.length.toString(); + const occupanciesContainerElement = document.querySelector('#container--lotOccupancies'); + document.querySelector(".tabs a[href='#relatedTab--lotOccupancies'] .tag").textContent = workOrderLotOccupancies.length.toString(); if (workOrderLotOccupancies.length === 0) { occupanciesContainerElement.innerHTML = `

There are no ${los.escapedAliases.occupancies} associated with this work order.

@@ -103,10 +102,11 @@ function renderRelatedOccupancies() { `; const currentDateString = cityssm.dateToString(new Date()); for (const lotOccupancy of workOrderLotOccupancies) { - const rowElement = document.createElement("tr"); - rowElement.className = "container--lotOccupancy"; + const rowElement = document.createElement('tr'); + rowElement.className = 'container--lotOccupancy'; rowElement.dataset.lotOccupancyId = lotOccupancy.lotOccupancyId.toString(); - const isActive = !(lotOccupancy.occupancyEndDate && lotOccupancy.occupancyEndDateString < currentDateString); + const isActive = !(lotOccupancy.occupancyEndDate && + lotOccupancy.occupancyEndDateString < currentDateString); const hasLotRecord = lotOccupancy.lotId && workOrderLots.some((lot) => { return lotOccupancy.lotId === lot.lotId; @@ -114,21 +114,25 @@ function renderRelatedOccupancies() { rowElement.innerHTML = '' + (isActive - ? '' - : '') + - "" + - ("" + + ? '' + : '') + + '' + + ('' + '' + - cityssm.escapeHTML(lotOccupancy.occupancyType || "") + - "" + - ""); + cityssm.escapeHTML(lotOccupancy.occupancyType || '') + + '' + + ''); if (lotOccupancy.lotId) { - rowElement.insertAdjacentHTML("beforeend", "" + - cityssm.escapeHTML(lotOccupancy.lotName || "") + + rowElement.insertAdjacentHTML('beforeend', '' + + cityssm.escapeHTML(lotOccupancy.lotName || '') + (hasLotRecord - ? "" + ? '' : ' ") + - ""); + '') + + ''); } else { - rowElement.insertAdjacentHTML("beforeend", `(No ${los.escapedAliases.Lot})`); + rowElement.insertAdjacentHTML('beforeend', `(No ${los.escapedAliases.Lot})`); } - rowElement.insertAdjacentHTML("beforeend", "" + + rowElement.insertAdjacentHTML('beforeend', '' + lotOccupancy.occupancyStartDateString + - "" + - ("" + + '' + + ('' + (lotOccupancy.occupancyEndDate ? lotOccupancy.occupancyEndDateString : '(No End Date)') + - "") + - ("" + + '') + + ('' + (lotOccupancy.lotOccupancyOccupants.length === 0 - ? '(No ' + los.escapedAliases.Occupants + ")" + ? '(No ' + + los.escapedAliases.Occupants + + ')' : (_a = lotOccupancy.lotOccupancyOccupants) === null || _a === void 0 ? void 0 : _a.reduce((soFar, occupant) => { return (soFar + '' + ' ' + cityssm.escapeHTML(occupant.occupantName) + - "
"); - }, "")) + - "") + - ("" + + '
'); + }, '')) + + '') + + ('' + '" + - "")); - (_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 - .querySelector(".button--deleteLotOccupancy") - .addEventListener("click", deleteLotOccupancy); - occupanciesContainerElement.querySelector("tbody").append(rowElement); + .querySelector('.button--deleteLotOccupancy') + .addEventListener('click', deleteLotOccupancy); + occupanciesContainerElement.querySelector('tbody').append(rowElement); } } 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) => { return possibleLot.lotId === lotId; }); let editCloseModalFunction; function doUpdateLotStatus(submitEvent) { submitEvent.preventDefault(); - cityssm.postJSON(los.urlPrefix + "/workOrders/doUpdateLotStatus", submitEvent.currentTarget, (responseJSON) => { + cityssm.postJSON(los.urlPrefix + '/workOrders/doUpdateLotStatus', submitEvent.currentTarget, (responseJSON) => { if (responseJSON.success) { workOrderLots = responseJSON.workOrderLots; renderRelatedLotsAndOccupancies(); @@ -199,23 +206,22 @@ function openEditLotStatus(clickEvent) { } else { bulmaJS.alert({ - title: "Error Deleting Relationship", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Deleting Relationship', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); } - cityssm.openHtmlModal("lot-editLotStatus", { + cityssm.openHtmlModal('lot-editLotStatus', { onshow(modalElement) { los.populateAliases(modalElement); - modalElement.querySelector("#lotStatusEdit--lotId").value = - lotId.toString(); - modalElement.querySelector("#lotStatusEdit--lotName").value = lot.lotName; - const lotStatusElement = modalElement.querySelector("#lotStatusEdit--lotStatusId"); + modalElement.querySelector('#lotStatusEdit--lotId').value = lotId.toString(); + modalElement.querySelector('#lotStatusEdit--lotName').value = lot.lotName; + const lotStatusElement = modalElement.querySelector('#lotStatusEdit--lotStatusId'); let lotStatusFound = false; for (const lotStatus of exports.lotStatuses) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = lotStatus.lotStatusId.toString(); optionElement.textContent = lotStatus.lotStatus; if (lotStatus.lotStatusId === lot.lotStatusId) { @@ -224,7 +230,7 @@ function openEditLotStatus(clickEvent) { lotStatusElement.append(optionElement); } if (!lotStatusFound && lot.lotStatusId) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = lot.lotStatusId.toString(); optionElement.textContent = lot.lotStatus; lotStatusElement.append(optionElement); @@ -233,13 +239,15 @@ function openEditLotStatus(clickEvent) { lotStatusElement.value = lot.lotStatusId.toString(); } modalElement - .querySelector("form") - .insertAdjacentHTML("beforeend", ``); + .querySelector('form') + .insertAdjacentHTML('beforeend', ``); }, onshown(modalElement, closeModalFunction) { editCloseModalFunction = closeModalFunction; bulmaJS.toggleHtmlClipped(); - modalElement.querySelector("form").addEventListener("submit", doUpdateLotStatus); + modalElement + .querySelector('form') + .addEventListener('submit', doUpdateLotStatus); }, onremoved() { bulmaJS.toggleHtmlClipped(); @@ -247,10 +255,9 @@ function openEditLotStatus(clickEvent) { }); } function deleteLot(clickEvent) { - const lotId = clickEvent.currentTarget.closest(".container--lot") - .dataset.lotId; + const lotId = clickEvent.currentTarget.closest('.container--lot').dataset.lotId; function doDelete() { - cityssm.postJSON(los.urlPrefix + "/workOrders/doDeleteWorkOrderLot", { + cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrderLot', { workOrderId, lotId }, (responseJSON) => { @@ -260,9 +267,9 @@ function deleteLot(clickEvent) { } else { bulmaJS.alert({ - title: "Error Deleting Relationship", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Deleting Relationship', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); @@ -270,17 +277,16 @@ function deleteLot(clickEvent) { bulmaJS.confirm({ 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.`, - contextualColorName: "warning", + contextualColorName: 'warning', okButton: { - text: "Yes, Delete Relationship", + text: 'Yes, Delete Relationship', callbackFunction: doDelete } }); } function renderRelatedLots() { - const lotsContainerElement = document.querySelector("#container--lots"); - document.querySelector(".tabs a[href='#relatedTab--lots'] .tag").textContent = - workOrderLots.length.toString(); + const lotsContainerElement = document.querySelector('#container--lots'); + document.querySelector(".tabs a[href='#relatedTab--lots'] .tag").textContent = workOrderLots.length.toString(); if (workOrderLots.length === 0) { lotsContainerElement.innerHTML = `

There are no ${los.escapedAliases.lots} associated with this work order.

@@ -298,35 +304,39 @@ function renderRelatedLots() { `; for (const lot of workOrderLots) { - const rowElement = document.createElement("tr"); - rowElement.className = "container--lot"; + const rowElement = document.createElement('tr'); + rowElement.className = 'container--lot'; rowElement.dataset.lotId = lot.lotId.toString(); rowElement.innerHTML = - "" + + '' + '' + - cityssm.escapeHTML(lot.lotName || "") + - "" + - "" + - ("" + cityssm.escapeHTML(lot.mapName || "") + "") + - ("" + cityssm.escapeHTML(lot.lotType || "") + "") + - ("" + + cityssm.escapeHTML(lot.lotName || '') + + '' + + '' + + ('' + cityssm.escapeHTML(lot.mapName || '') + '') + + ('' + cityssm.escapeHTML(lot.lotType || '') + '') + + ('' + (lot.lotStatusId - ? cityssm.escapeHTML(lot.lotStatus || "") + ? cityssm.escapeHTML(lot.lotStatus || '') : '(No Status)') + - "") + + '') + ('' + '" + + '' + ' " + - ""); - rowElement.querySelector(".button--editLotStatus").addEventListener("click", openEditLotStatus); - rowElement.querySelector(".button--deleteLot").addEventListener("click", deleteLot); - lotsContainerElement.querySelector("tbody").append(rowElement); + '' + + ''); + rowElement + .querySelector('.button--editLotStatus') + .addEventListener('click', openEditLotStatus); + rowElement + .querySelector('.button--deleteLot') + .addEventListener('click', deleteLot); + lotsContainerElement.querySelector('tbody').append(rowElement); } } function renderRelatedLotsAndOccupancies() { @@ -335,7 +345,7 @@ function renderRelatedLotsAndOccupancies() { } renderRelatedLotsAndOccupancies(); function doAddLotOccupancy(clickEvent) { - const rowElement = clickEvent.currentTarget.closest("tr"); + const rowElement = clickEvent.currentTarget.closest('tr'); const lotOccupancyId = rowElement.dataset.lotOccupancyId; addLotOccupancy(lotOccupancyId, (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 searchResultsContainerElement; function doSearch(event) { if (event) { event.preventDefault(); } - searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML("Searching..."); - cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doSearchLotOccupancies", searchFormElement, (responseJSON) => { + searchResultsContainerElement.innerHTML = + los.getLoadingParagraphHTML('Searching...'); + cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doSearchLotOccupancies', searchFormElement, (responseJSON) => { if (responseJSON.lotOccupancies.length === 0) { searchResultsContainerElement.innerHTML = `

There are no records that meet the search criteria.

@@ -370,64 +383,69 @@ document.querySelector("#button--addLotOccupancy").addEventListener("click", () `; for (const lotOccupancy of responseJSON.lotOccupancies) { - const rowElement = document.createElement("tr"); - rowElement.className = "container--lotOccupancy"; - rowElement.dataset.lotOccupancyId = lotOccupancy.lotOccupancyId.toString(); + const rowElement = document.createElement('tr'); + rowElement.className = 'container--lotOccupancy'; + rowElement.dataset.lotOccupancyId = + lotOccupancy.lotOccupancyId.toString(); rowElement.innerHTML = '' + '" + - "" + + '' + + '' + ('' + - cityssm.escapeHTML(lotOccupancy.occupancyType || "") + - ""); + cityssm.escapeHTML(lotOccupancy.occupancyType || '') + + ''); if (lotOccupancy.lotId) { - rowElement.insertAdjacentHTML("beforeend", "" + cityssm.escapeHTML(lotOccupancy.lotName || "") + ""); + rowElement.insertAdjacentHTML('beforeend', '' + + cityssm.escapeHTML(lotOccupancy.lotName || '') + + ''); } else { - rowElement.insertAdjacentHTML("beforeend", `(No ${los.escapedAliases.Lot})`); + rowElement.insertAdjacentHTML('beforeend', `(No ${los.escapedAliases.Lot})`); } - rowElement.insertAdjacentHTML("beforeend", "" + + rowElement.insertAdjacentHTML('beforeend', '' + lotOccupancy.occupancyStartDateString + - "" + - ("" + + '' + + ('' + (lotOccupancy.occupancyEndDate ? lotOccupancy.occupancyEndDateString : '(No End Date)') + - "") + - ("" + + '') + + ('' + (lotOccupancy.lotOccupancyOccupants.length === 0 ? '(No ' + cityssm.escapeHTML(exports.aliases.occupants) + - ")" + ')' : cityssm.escapeHTML(lotOccupancy.lotOccupancyOccupants[0].occupantName) + (lotOccupancy.lotOccupancyOccupants.length > 1 - ? " plus " + (lotOccupancy.lotOccupancyOccupants.length - 1) - : "")) + - "")); + ? ' plus ' + + (lotOccupancy.lotOccupancyOccupants.length - 1) + : '')) + + '')); rowElement - .querySelector(".button--addLotOccupancy") - .addEventListener("click", doAddLotOccupancy); - searchResultsContainerElement.querySelector("tbody").append(rowElement); + .querySelector('.button--addLotOccupancy') + .addEventListener('click', doAddLotOccupancy); + searchResultsContainerElement + .querySelector('tbody') + .append(rowElement); } }); } - cityssm.openHtmlModal("workOrder-addLotOccupancy", { + cityssm.openHtmlModal('workOrder-addLotOccupancy', { onshow(modalElement) { los.populateAliases(modalElement); - searchFormElement = modalElement.querySelector("form"); - searchResultsContainerElement = modalElement.querySelector("#resultsContainer--lotOccupancyAdd"); - modalElement.querySelector("#lotOccupancySearch--notWorkOrderId").value = - workOrderId; - modalElement.querySelector("#lotOccupancySearch--occupancyEffectiveDateString").value = document.querySelector("#workOrderEdit--workOrderOpenDateString").value; + searchFormElement = modalElement.querySelector('form'); + searchResultsContainerElement = modalElement.querySelector('#resultsContainer--lotOccupancyAdd'); + modalElement.querySelector('#lotOccupancySearch--notWorkOrderId').value = workOrderId; + modalElement.querySelector('#lotOccupancySearch--occupancyEffectiveDateString').value = document.querySelector('#workOrderEdit--workOrderOpenDateString').value; doSearch(); }, onshown(modalElement) { bulmaJS.toggleHtmlClipped(); - modalElement.querySelector("#lotOccupancySearch--occupantName").addEventListener("change", doSearch); - modalElement.querySelector("#lotOccupancySearch--lotName").addEventListener("change", doSearch); - searchFormElement.addEventListener("submit", doSearch); + modalElement.querySelector('#lotOccupancySearch--occupantName').addEventListener('change', doSearch); + modalElement.querySelector('#lotOccupancySearch--lotName').addEventListener('change', doSearch); + searchFormElement.addEventListener('submit', doSearch); }, onremoved() { bulmaJS.toggleHtmlClipped(); @@ -435,7 +453,7 @@ document.querySelector("#button--addLotOccupancy").addEventListener("click", () }); }); function doAddLot(clickEvent) { - const rowElement = clickEvent.currentTarget.closest("tr"); + const rowElement = clickEvent.currentTarget.closest('tr'); const lotId = rowElement.dataset.lotId; addLot(lotId, (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 searchResultsContainerElement; function doSearch(event) { if (event) { event.preventDefault(); } - searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML("Searching..."); - cityssm.postJSON(los.urlPrefix + "/lots/doSearchLots", searchFormElement, (responseJSON) => { + searchResultsContainerElement.innerHTML = + los.getLoadingParagraphHTML('Searching...'); + cityssm.postJSON(los.urlPrefix + '/lots/doSearchLots', searchFormElement, (responseJSON) => { if (responseJSON.lots.length === 0) { searchResultsContainerElement.innerHTML = '
' + '

There are no records that meet the search criteria.

' + - "
"; + '
'; return; } searchResultsContainerElement.innerHTML = ` @@ -470,38 +489,41 @@ document.querySelector("#button--addLot").addEventListener("click", () => {
`; for (const lot of responseJSON.lots) { - const rowElement = document.createElement("tr"); - rowElement.className = "container--lot"; + const rowElement = document.createElement('tr'); + rowElement.className = 'container--lot'; rowElement.dataset.lotId = lot.lotId.toString(); rowElement.innerHTML = '' + '" + - "" + + '' + + '' + ('' + - cityssm.escapeHTML(lot.lotName || "") + - "") + - "" + - cityssm.escapeHTML(lot.mapName || "") + - "" + - ("" + cityssm.escapeHTML(lot.lotType || "") + "") + - ("" + cityssm.escapeHTML(lot.lotStatus || "") + ""); - rowElement.querySelector(".button--addLot").addEventListener("click", doAddLot); - searchResultsContainerElement.querySelector("tbody").append(rowElement); + cityssm.escapeHTML(lot.lotName || '') + + '') + + '' + + cityssm.escapeHTML(lot.mapName || '') + + '' + + ('' + cityssm.escapeHTML(lot.lotType || '') + '') + + ('' + cityssm.escapeHTML(lot.lotStatus || '') + ''); + rowElement + .querySelector('.button--addLot') + .addEventListener('click', doAddLot); + searchResultsContainerElement + .querySelector('tbody') + .append(rowElement); } }); } - cityssm.openHtmlModal("workOrder-addLot", { + cityssm.openHtmlModal('workOrder-addLot', { onshow(modalElement) { los.populateAliases(modalElement); - searchFormElement = modalElement.querySelector("form"); - searchResultsContainerElement = modalElement.querySelector("#resultsContainer--lotAdd"); - modalElement.querySelector("#lotSearch--notWorkOrderId").value = - workOrderId; - const lotStatusElement = modalElement.querySelector("#lotSearch--lotStatusId"); + searchFormElement = modalElement.querySelector('form'); + searchResultsContainerElement = modalElement.querySelector('#resultsContainer--lotAdd'); + modalElement.querySelector('#lotSearch--notWorkOrderId').value = workOrderId; + const lotStatusElement = modalElement.querySelector('#lotSearch--lotStatusId'); for (const lotStatus of exports.lotStatuses) { - const optionElement = document.createElement("option"); + const optionElement = document.createElement('option'); optionElement.value = lotStatus.lotStatusId.toString(); optionElement.textContent = lotStatus.lotStatus; lotStatusElement.append(optionElement); @@ -510,9 +532,13 @@ document.querySelector("#button--addLot").addEventListener("click", () => { }, onshown(modalElement) { bulmaJS.toggleHtmlClipped(); - modalElement.querySelector("#lotSearch--lotName").addEventListener("change", doSearch); - modalElement.querySelector("#lotSearch--lotStatusId").addEventListener("change", doSearch); - searchFormElement.addEventListener("submit", doSearch); + modalElement + .querySelector('#lotSearch--lotName') + .addEventListener('change', doSearch); + modalElement + .querySelector('#lotSearch--lotStatusId') + .addEventListener('change', doSearch); + searchFormElement.addEventListener('submit', doSearch); }, onremoved() { bulmaJS.toggleHtmlClipped(); diff --git a/public-typescript/workOrderEdit/workOrderEditLots.ts b/public-typescript/workOrderEdit/workOrderEditLots.ts index 0c9db22a..5fbe739c 100644 --- a/public-typescript/workOrderEdit/workOrderEditLots.ts +++ b/public-typescript/workOrderEdit/workOrderEditLots.ts @@ -1,145 +1,160 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ -import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; -import type { BulmaJS } from "@cityssm/bulma-js/types"; +import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types' +import type { BulmaJS } from '@cityssm/bulma-js/types' -import type * as globalTypes from "../../types/globalTypes"; -import type * as recordTypes from "../../types/recordTypes"; +import type * as globalTypes from '../../types/globalTypes' +import type * as recordTypes from '../../types/recordTypes' -declare const cityssm: cityssmGlobal; -declare const bulmaJS: BulmaJS; +declare const cityssm: cityssmGlobal +declare const bulmaJS: BulmaJS -declare const los: globalTypes.LOS; +declare const los: globalTypes.LOS -declare const workOrderId: string; +declare const workOrderId: string -let workOrderLots: recordTypes.Lot[] = exports.workOrderLots; -delete exports.workOrderLots; +let workOrderLots: recordTypes.Lot[] = exports.workOrderLots +delete exports.workOrderLots -let workOrderLotOccupancies: recordTypes.LotOccupancy[] = exports.workOrderLotOccupancies; -delete exports.workOrderLotOccupancies; +let workOrderLotOccupancies: recordTypes.LotOccupancy[] = + exports.workOrderLotOccupancies +delete exports.workOrderLotOccupancies function deleteLotOccupancy(clickEvent: Event): void { - const lotOccupancyId = ( - (clickEvent.currentTarget as HTMLElement).closest(".container--lotOccupancy") as HTMLElement - ).dataset.lotOccupancyId; + const lotOccupancyId = ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--lotOccupancy' + ) as HTMLElement + ).dataset.lotOccupancyId - function doDelete(): void { - cityssm.postJSON( - los.urlPrefix + "/workOrders/doDeleteWorkOrderLotOccupancy", - { - workOrderId, - lotOccupancyId - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - workOrderLotOccupancies?: recordTypes.LotOccupancy[]; - }) => { - if (responseJSON.success) { - workOrderLotOccupancies = responseJSON.workOrderLotOccupancies!; - renderRelatedLotsAndOccupancies(); - } else { - bulmaJS.alert({ - title: "Error Deleting Relationship", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - } - - bulmaJS.confirm({ - 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.`, - contextualColorName: "warning", - okButton: { - text: "Yes, Delete Relationship", - callbackFunction: doDelete + function doDelete(): void { + cityssm.postJSON( + los.urlPrefix + '/workOrders/doDeleteWorkOrderLotOccupancy', + { + workOrderId, + lotOccupancyId + }, + (responseJSON: { + success: boolean + errorMessage?: string + workOrderLotOccupancies?: recordTypes.LotOccupancy[] + }) => { + if (responseJSON.success) { + workOrderLotOccupancies = responseJSON.workOrderLotOccupancies! + renderRelatedLotsAndOccupancies() + } else { + bulmaJS.alert({ + title: 'Error Deleting Relationship', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) } - }); + } + ) + } + + bulmaJS.confirm({ + 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.`, + contextualColorName: 'warning', + okButton: { + text: 'Yes, Delete Relationship', + callbackFunction: doDelete + } + }) } -function addLot(lotId: number | string, callbackFunction?: (success?: boolean) => void): void { - cityssm.postJSON( - los.urlPrefix + "/workOrders/doAddWorkOrderLot", - { - workOrderId, - lotId - }, - (responseJSON: { success: boolean; errorMessage?: string; workOrderLots?: recordTypes.Lot[] }) => { - if (responseJSON.success) { - workOrderLots = responseJSON.workOrderLots!; - renderRelatedLotsAndOccupancies(); - } else { - bulmaJS.alert({ - title: "Error Adding " + los.escapedAliases.Lot, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } +function addLot( + lotId: number | string, + callbackFunction?: (success?: boolean) => void +): void { + cityssm.postJSON( + los.urlPrefix + '/workOrders/doAddWorkOrderLot', + { + workOrderId, + lotId + }, + (responseJSON: { + success: boolean + errorMessage?: string + workOrderLots?: recordTypes.Lot[] + }) => { + if (responseJSON.success) { + workOrderLots = responseJSON.workOrderLots! + renderRelatedLotsAndOccupancies() + } else { + bulmaJS.alert({ + title: 'Error Adding ' + los.escapedAliases.Lot, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } - if (callbackFunction) { - callbackFunction(responseJSON.success); - } - } - ); + if (callbackFunction) { + callbackFunction(responseJSON.success) + } + } + ) } function addLotOccupancy( - lotOccupancyId: number | string, - callbackFunction?: (success?: boolean) => void + lotOccupancyId: number | string, + callbackFunction?: (success?: boolean) => void ): void { - cityssm.postJSON( - los.urlPrefix + "/workOrders/doAddWorkOrderLotOccupancy", - { - workOrderId, - lotOccupancyId - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - workOrderLotOccupancies?: recordTypes.LotOccupancy[]; - }) => { - if (responseJSON.success) { - workOrderLotOccupancies = responseJSON.workOrderLotOccupancies!; - renderRelatedLotsAndOccupancies(); - } else { - bulmaJS.alert({ - title: "Error Adding " + los.escapedAliases.Occupancy, - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } + cityssm.postJSON( + los.urlPrefix + '/workOrders/doAddWorkOrderLotOccupancy', + { + workOrderId, + lotOccupancyId + }, + (responseJSON: { + success: boolean + errorMessage?: string + workOrderLotOccupancies?: recordTypes.LotOccupancy[] + }) => { + if (responseJSON.success) { + workOrderLotOccupancies = responseJSON.workOrderLotOccupancies! + renderRelatedLotsAndOccupancies() + } else { + bulmaJS.alert({ + title: 'Error Adding ' + los.escapedAliases.Occupancy, + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) + } - if (callbackFunction) { - callbackFunction(responseJSON.success); - } - } - ); + if (callbackFunction) { + callbackFunction(responseJSON.success) + } + } + ) } function addLotFromLotOccupancy(clickEvent: Event): void { - const lotId = (clickEvent.currentTarget as HTMLElement).dataset.lotId!; - addLot(lotId); + const lotId = (clickEvent.currentTarget as HTMLElement).dataset.lotId! + addLot(lotId) } function renderRelatedOccupancies(): void { - const occupanciesContainerElement = document.querySelector("#container--lotOccupancies") as HTMLElement; + const occupanciesContainerElement = document.querySelector( + '#container--lotOccupancies' + ) as HTMLElement - (document.querySelector(".tabs a[href='#relatedTab--lotOccupancies'] .tag") as HTMLElement).textContent = - workOrderLotOccupancies.length.toString(); + ;( + document.querySelector( + ".tabs a[href='#relatedTab--lotOccupancies'] .tag" + ) as HTMLElement + ).textContent = workOrderLotOccupancies.length.toString() - if (workOrderLotOccupancies.length === 0) { - occupanciesContainerElement.innerHTML = `
+ if (workOrderLotOccupancies.length === 0) { + occupanciesContainerElement.innerHTML = `

There are no ${los.escapedAliases.occupancies} associated with this work order.

-
`; +
` - return; - } + return + } - occupanciesContainerElement.innerHTML = ` + occupanciesContainerElement.innerHTML = `
@@ -147,265 +162,293 @@ function renderRelatedOccupancies(): void { -
${los.escapedAliases.Occupancy} Type ${los.escapedAliases.Lot}${los.escapedAliases.OccupancyStartDate}
`; + ` - const currentDateString = cityssm.dateToString(new Date()); + const currentDateString = cityssm.dateToString(new Date()) - for (const lotOccupancy of workOrderLotOccupancies) { - const rowElement = document.createElement("tr"); - rowElement.className = "container--lotOccupancy"; - rowElement.dataset.lotOccupancyId = lotOccupancy.lotOccupancyId!.toString(); + for (const lotOccupancy of workOrderLotOccupancies) { + const rowElement = document.createElement('tr') + rowElement.className = 'container--lotOccupancy' + rowElement.dataset.lotOccupancyId = lotOccupancy.lotOccupancyId!.toString() - const isActive = !( - lotOccupancy.occupancyEndDate && lotOccupancy.occupancyEndDateString! < currentDateString - ); + const isActive = !( + lotOccupancy.occupancyEndDate && + lotOccupancy.occupancyEndDateString! < currentDateString + ) - const hasLotRecord = - lotOccupancy.lotId && - workOrderLots.some((lot) => { - return lotOccupancy.lotId === lot.lotId; - }); + const hasLotRecord = + lotOccupancy.lotId && + workOrderLots.some((lot) => { + return lotOccupancy.lotId === lot.lotId + }) - rowElement.innerHTML = - '' + - (isActive - ? '' - : '') + - "" + - ("" + - '' + - cityssm.escapeHTML(lotOccupancy.occupancyType || "") + - "" + - ""); + rowElement.innerHTML = + '' + + (isActive + ? '' + : '') + + '' + + ('' + + '' + + cityssm.escapeHTML(lotOccupancy.occupancyType || '') + + '' + + '') - if (lotOccupancy.lotId) { - rowElement.insertAdjacentHTML( - "beforeend", - "" + - cityssm.escapeHTML(lotOccupancy.lotName || "") + - (hasLotRecord - ? "" - : ' ") + - "" - ); - } else { - rowElement.insertAdjacentHTML( - "beforeend", - `(No ${los.escapedAliases.Lot})` - ); - } - - rowElement.insertAdjacentHTML( - "beforeend", - "" + - lotOccupancy.occupancyStartDateString + - "" + - ("" + - (lotOccupancy.occupancyEndDate - ? lotOccupancy.occupancyEndDateString - : '(No End Date)') + - "") + - ("" + - (lotOccupancy.lotOccupancyOccupants!.length === 0 - ? '(No ' + los.escapedAliases.Occupants + ")" - : lotOccupancy.lotOccupancyOccupants?.reduce((soFar, occupant) => { - return ( - soFar + - '' + - ' ' + - cityssm.escapeHTML(occupant.occupantName!) + - "
" - ); - }, "")) + - "") + - ("" + - '" + - "") - ); - - rowElement.querySelector(".button--addLot")?.addEventListener("click", addLotFromLotOccupancy); - - rowElement - .querySelector(".button--deleteLotOccupancy")! - .addEventListener("click", deleteLotOccupancy); - - occupanciesContainerElement.querySelector("tbody")!.append(rowElement); + if (lotOccupancy.lotId) { + rowElement.insertAdjacentHTML( + 'beforeend', + '' + + cityssm.escapeHTML(lotOccupancy.lotName || '') + + (hasLotRecord + ? '' + : ' ') + + '' + ) + } else { + rowElement.insertAdjacentHTML( + 'beforeend', + `(No ${los.escapedAliases.Lot})` + ) } + + rowElement.insertAdjacentHTML( + 'beforeend', + '' + + lotOccupancy.occupancyStartDateString + + '' + + ('' + + (lotOccupancy.occupancyEndDate + ? lotOccupancy.occupancyEndDateString + : '(No End Date)') + + '') + + ('' + + (lotOccupancy.lotOccupancyOccupants!.length === 0 + ? '(No ' + + los.escapedAliases.Occupants + + ')' + : lotOccupancy.lotOccupancyOccupants?.reduce((soFar, occupant) => { + return ( + soFar + + '' + + ' ' + + cityssm.escapeHTML(occupant.occupantName!) + + '
' + ) + }, '')) + + '') + + ('' + + '' + + '') + ) + + rowElement + .querySelector('.button--addLot') + ?.addEventListener('click', addLotFromLotOccupancy) + + rowElement + .querySelector('.button--deleteLotOccupancy')! + .addEventListener('click', deleteLotOccupancy) + + occupanciesContainerElement.querySelector('tbody')!.append(rowElement) + } } function openEditLotStatus(clickEvent: Event): void { - const lotId = Number.parseInt( - ((clickEvent.currentTarget as HTMLElement).closest(".container--lot") as HTMLElement).dataset.lotId!, - 10 - ); + const lotId = Number.parseInt( + ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--lot' + ) as HTMLElement + ).dataset.lotId!, + 10 + ) - const lot = workOrderLots.find((possibleLot) => { - return possibleLot.lotId === lotId; - })!; + const lot = workOrderLots.find((possibleLot) => { + return possibleLot.lotId === lotId + })! - let editCloseModalFunction: () => void; + let editCloseModalFunction: () => void - function doUpdateLotStatus(submitEvent: SubmitEvent) { - submitEvent.preventDefault(); + function doUpdateLotStatus(submitEvent: SubmitEvent) { + submitEvent.preventDefault() - cityssm.postJSON( - los.urlPrefix + "/workOrders/doUpdateLotStatus", - submitEvent.currentTarget, - (responseJSON: { - success: boolean; - errorMessage?: string; - workOrderLots?: recordTypes.Lot[]; - }) => { - if (responseJSON.success) { - workOrderLots = responseJSON.workOrderLots!; - renderRelatedLotsAndOccupancies(); - editCloseModalFunction(); - } else { - bulmaJS.alert({ - title: "Error Deleting Relationship", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - } - - cityssm.openHtmlModal("lot-editLotStatus", { - onshow(modalElement) { - los.populateAliases(modalElement); - - (modalElement.querySelector("#lotStatusEdit--lotId") as HTMLInputElement).value = - lotId.toString(); - - (modalElement.querySelector("#lotStatusEdit--lotName") as HTMLInputElement).value = lot.lotName!; - - const lotStatusElement = modalElement.querySelector( - "#lotStatusEdit--lotStatusId" - ) as HTMLSelectElement; - - let lotStatusFound = false; - - for (const lotStatus of exports.lotStatuses as recordTypes.LotStatus[]) { - const optionElement = document.createElement("option"); - optionElement.value = lotStatus.lotStatusId.toString(); - optionElement.textContent = lotStatus.lotStatus; - - if (lotStatus.lotStatusId === lot.lotStatusId) { - lotStatusFound = true; - } - - lotStatusElement.append(optionElement); - } - - if (!lotStatusFound && lot.lotStatusId) { - const optionElement = document.createElement("option"); - optionElement.value = lot.lotStatusId.toString(); - optionElement.textContent = lot.lotStatus!; - lotStatusElement.append(optionElement); - } - - if (lot.lotStatusId) { - lotStatusElement.value = lot.lotStatusId.toString(); - } - - modalElement - .querySelector("form")! - .insertAdjacentHTML( - "beforeend", - `` - ); - }, - onshown(modalElement, closeModalFunction) { - editCloseModalFunction = closeModalFunction; - - bulmaJS.toggleHtmlClipped(); - - modalElement.querySelector("form")!.addEventListener("submit", doUpdateLotStatus); - }, - onremoved() { - bulmaJS.toggleHtmlClipped(); + cityssm.postJSON( + los.urlPrefix + '/workOrders/doUpdateLotStatus', + submitEvent.currentTarget, + (responseJSON: { + success: boolean + errorMessage?: string + workOrderLots?: recordTypes.Lot[] + }) => { + if (responseJSON.success) { + workOrderLots = responseJSON.workOrderLots! + renderRelatedLotsAndOccupancies() + editCloseModalFunction() + } else { + bulmaJS.alert({ + title: 'Error Deleting Relationship', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) } - }); + } + ) + } + + cityssm.openHtmlModal('lot-editLotStatus', { + onshow(modalElement) { + los.populateAliases(modalElement) + + ;( + modalElement.querySelector('#lotStatusEdit--lotId') as HTMLInputElement + ).value = lotId.toString() + + ;( + modalElement.querySelector( + '#lotStatusEdit--lotName' + ) as HTMLInputElement + ).value = lot.lotName! + + const lotStatusElement = modalElement.querySelector( + '#lotStatusEdit--lotStatusId' + ) as HTMLSelectElement + + let lotStatusFound = false + + for (const lotStatus of exports.lotStatuses as recordTypes.LotStatus[]) { + const optionElement = document.createElement('option') + optionElement.value = lotStatus.lotStatusId.toString() + optionElement.textContent = lotStatus.lotStatus + + if (lotStatus.lotStatusId === lot.lotStatusId) { + lotStatusFound = true + } + + lotStatusElement.append(optionElement) + } + + if (!lotStatusFound && lot.lotStatusId) { + const optionElement = document.createElement('option') + optionElement.value = lot.lotStatusId.toString() + optionElement.textContent = lot.lotStatus! + lotStatusElement.append(optionElement) + } + + if (lot.lotStatusId) { + lotStatusElement.value = lot.lotStatusId.toString() + } + + modalElement + .querySelector('form')! + .insertAdjacentHTML( + 'beforeend', + `` + ) + }, + onshown(modalElement, closeModalFunction) { + editCloseModalFunction = closeModalFunction + + bulmaJS.toggleHtmlClipped() + + modalElement + .querySelector('form')! + .addEventListener('submit', doUpdateLotStatus) + }, + onremoved() { + bulmaJS.toggleHtmlClipped() + } + }) } function deleteLot(clickEvent: Event): void { - const lotId = ((clickEvent.currentTarget as HTMLElement).closest(".container--lot") as HTMLElement) - .dataset.lotId; + const lotId = ( + (clickEvent.currentTarget as HTMLElement).closest( + '.container--lot' + ) as HTMLElement + ).dataset.lotId - function doDelete(): void { - cityssm.postJSON( - los.urlPrefix + "/workOrders/doDeleteWorkOrderLot", - { - workOrderId, - lotId - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - workOrderLots?: recordTypes.Lot[]; - }) => { - if (responseJSON.success) { - workOrderLots = responseJSON.workOrderLots!; - renderRelatedLotsAndOccupancies(); - } else { - bulmaJS.alert({ - title: "Error Deleting Relationship", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - } - - bulmaJS.confirm({ - 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.`, - contextualColorName: "warning", - okButton: { - text: "Yes, Delete Relationship", - callbackFunction: doDelete + function doDelete(): void { + cityssm.postJSON( + los.urlPrefix + '/workOrders/doDeleteWorkOrderLot', + { + workOrderId, + lotId + }, + (responseJSON: { + success: boolean + errorMessage?: string + workOrderLots?: recordTypes.Lot[] + }) => { + if (responseJSON.success) { + workOrderLots = responseJSON.workOrderLots! + renderRelatedLotsAndOccupancies() + } else { + bulmaJS.alert({ + title: 'Error Deleting Relationship', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) } - }); + } + ) + } + + bulmaJS.confirm({ + 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.`, + contextualColorName: 'warning', + okButton: { + text: 'Yes, Delete Relationship', + callbackFunction: doDelete + } + }) } function renderRelatedLots(): void { - const lotsContainerElement = document.querySelector("#container--lots") as HTMLElement; + const lotsContainerElement = document.querySelector( + '#container--lots' + ) as HTMLElement - (document.querySelector(".tabs a[href='#relatedTab--lots'] .tag") as HTMLElement).textContent = - workOrderLots.length.toString(); + ;( + document.querySelector( + ".tabs a[href='#relatedTab--lots'] .tag" + ) as HTMLElement + ).textContent = workOrderLots.length.toString() - if (workOrderLots.length === 0) { - lotsContainerElement.innerHTML = `
+ if (workOrderLots.length === 0) { + lotsContainerElement.innerHTML = `

There are no ${los.escapedAliases.lots} associated with this work order.

-
`; +
` - return; - } + return + } - lotsContainerElement.innerHTML = ` + lotsContainerElement.innerHTML = `
@@ -414,89 +457,96 @@ function renderRelatedLots(): void { -
${los.escapedAliases.Lot} ${los.escapedAliases.Map}
`; + ` - for (const lot of workOrderLots) { - const rowElement = document.createElement("tr"); - rowElement.className = "container--lot"; + for (const lot of workOrderLots) { + const rowElement = document.createElement('tr') + rowElement.className = 'container--lot' - rowElement.dataset.lotId = lot.lotId.toString(); + rowElement.dataset.lotId = lot.lotId.toString() - rowElement.innerHTML = - "" + - '' + - cityssm.escapeHTML(lot.lotName || "") + - "" + - "" + - ("" + cityssm.escapeHTML(lot.mapName || "") + "") + - ("" + cityssm.escapeHTML(lot.lotType || "") + "") + - ("" + - (lot.lotStatusId - ? cityssm.escapeHTML(lot.lotStatus || "") - : '(No Status)') + - "") + - ('' + - '" + - ' " + - ""); + rowElement.innerHTML = + '' + + '' + + cityssm.escapeHTML(lot.lotName || '') + + '' + + '' + + ('' + cityssm.escapeHTML(lot.mapName || '') + '') + + ('' + cityssm.escapeHTML(lot.lotType || '') + '') + + ('' + + (lot.lotStatusId + ? cityssm.escapeHTML(lot.lotStatus || '') + : '(No Status)') + + '') + + ('' + + '' + + ' ' + + '') - rowElement.querySelector(".button--editLotStatus")!.addEventListener("click", openEditLotStatus); + rowElement + .querySelector('.button--editLotStatus')! + .addEventListener('click', openEditLotStatus) - rowElement.querySelector(".button--deleteLot")!.addEventListener("click", deleteLot); + rowElement + .querySelector('.button--deleteLot')! + .addEventListener('click', deleteLot) - lotsContainerElement.querySelector("tbody")!.append(rowElement); - } + lotsContainerElement.querySelector('tbody')!.append(rowElement) + } } function renderRelatedLotsAndOccupancies(): void { - renderRelatedOccupancies(); - renderRelatedLots(); + renderRelatedOccupancies() + renderRelatedLots() } -renderRelatedLotsAndOccupancies(); +renderRelatedLotsAndOccupancies() function doAddLotOccupancy(clickEvent: Event) { - const rowElement = (clickEvent.currentTarget as HTMLElement).closest("tr")!; + const rowElement = (clickEvent.currentTarget as HTMLElement).closest('tr')! - const lotOccupancyId = rowElement.dataset.lotOccupancyId!; + const lotOccupancyId = rowElement.dataset.lotOccupancyId! - addLotOccupancy(lotOccupancyId, (success) => { - if (success) { - rowElement.remove(); - } - }); + addLotOccupancy(lotOccupancyId, (success) => { + if (success) { + rowElement.remove() + } + }) } -document.querySelector("#button--addLotOccupancy")!.addEventListener("click", () => { - let searchFormElement: HTMLFormElement; - let searchResultsContainerElement: HTMLElement; +document + .querySelector('#button--addLotOccupancy')! + .addEventListener('click', () => { + let searchFormElement: HTMLFormElement + let searchResultsContainerElement: HTMLElement function doSearch(event?: Event) { - if (event) { - event.preventDefault(); - } + if (event) { + event.preventDefault() + } - searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML("Searching..."); + searchResultsContainerElement.innerHTML = + los.getLoadingParagraphHTML('Searching...') - cityssm.postJSON( - los.urlPrefix + "/lotOccupancies/doSearchLotOccupancies", - searchFormElement, - (responseJSON: { lotOccupancies: recordTypes.LotOccupancy[] }) => { - if (responseJSON.lotOccupancies.length === 0) { - searchResultsContainerElement.innerHTML = `
+ cityssm.postJSON( + los.urlPrefix + '/lotOccupancies/doSearchLotOccupancies', + searchFormElement, + (responseJSON: { lotOccupancies: recordTypes.LotOccupancy[] }) => { + if (responseJSON.lotOccupancies.length === 0) { + searchResultsContainerElement.innerHTML = `

There are no records that meet the search criteria.

-
`; +
` - return; - } + return + } - searchResultsContainerElement.innerHTML = ` + searchResultsContainerElement.innerHTML = `
@@ -506,149 +556,164 @@ document.querySelector("#button--addLotOccupancy")!.addEventListener("click", () -
${los.escapedAliases.Occupancy} Type${los.escapedAliases.Occupants}
`; + ` - for (const lotOccupancy of responseJSON.lotOccupancies) { - const rowElement = document.createElement("tr"); - rowElement.className = "container--lotOccupancy"; - rowElement.dataset.lotOccupancyId = lotOccupancy.lotOccupancyId!.toString(); + for (const lotOccupancy of responseJSON.lotOccupancies) { + const rowElement = document.createElement('tr') + rowElement.className = 'container--lotOccupancy' + rowElement.dataset.lotOccupancyId = + lotOccupancy.lotOccupancyId!.toString() - rowElement.innerHTML = - '' + - '" + - "" + - ('' + - cityssm.escapeHTML(lotOccupancy.occupancyType || "") + - ""); + rowElement.innerHTML = + '' + + '' + + '' + + ('' + + cityssm.escapeHTML(lotOccupancy.occupancyType || '') + + '') - if (lotOccupancy.lotId) { - rowElement.insertAdjacentHTML( - "beforeend", - "" + cityssm.escapeHTML(lotOccupancy.lotName || "") + "" - ); - } else { - rowElement.insertAdjacentHTML( - "beforeend", - `(No ${los.escapedAliases.Lot})` - ); - } - - rowElement.insertAdjacentHTML( - "beforeend", - "" + - lotOccupancy.occupancyStartDateString + - "" + - ("" + - (lotOccupancy.occupancyEndDate - ? lotOccupancy.occupancyEndDateString - : '(No End Date)') + - "") + - ("" + - (lotOccupancy.lotOccupancyOccupants!.length === 0 - ? '(No ' + - cityssm.escapeHTML(exports.aliases.occupants) + - ")" - : cityssm.escapeHTML( - lotOccupancy.lotOccupancyOccupants![0].occupantName! - ) + - (lotOccupancy.lotOccupancyOccupants!.length > 1 - ? " plus " + (lotOccupancy.lotOccupancyOccupants!.length - 1) - : "")) + - "") - ); - - rowElement - .querySelector(".button--addLotOccupancy")! - .addEventListener("click", doAddLotOccupancy); - - searchResultsContainerElement.querySelector("tbody")!.append(rowElement); - } + if (lotOccupancy.lotId) { + rowElement.insertAdjacentHTML( + 'beforeend', + '' + + cityssm.escapeHTML(lotOccupancy.lotName || '') + + '' + ) + } else { + rowElement.insertAdjacentHTML( + 'beforeend', + `(No ${los.escapedAliases.Lot})` + ) } - ); + + rowElement.insertAdjacentHTML( + 'beforeend', + '' + + lotOccupancy.occupancyStartDateString + + '' + + ('' + + (lotOccupancy.occupancyEndDate + ? lotOccupancy.occupancyEndDateString + : '(No End Date)') + + '') + + ('' + + (lotOccupancy.lotOccupancyOccupants!.length === 0 + ? '(No ' + + cityssm.escapeHTML(exports.aliases.occupants) + + ')' + : cityssm.escapeHTML( + lotOccupancy.lotOccupancyOccupants![0].occupantName! + ) + + (lotOccupancy.lotOccupancyOccupants!.length > 1 + ? ' plus ' + + (lotOccupancy.lotOccupancyOccupants!.length - 1) + : '')) + + '') + ) + + rowElement + .querySelector('.button--addLotOccupancy')! + .addEventListener('click', doAddLotOccupancy) + + searchResultsContainerElement + .querySelector('tbody')! + .append(rowElement) + } + } + ) } - cityssm.openHtmlModal("workOrder-addLotOccupancy", { - onshow(modalElement) { - los.populateAliases(modalElement); + cityssm.openHtmlModal('workOrder-addLotOccupancy', { + onshow(modalElement) { + los.populateAliases(modalElement) - searchFormElement = modalElement.querySelector("form")!; + searchFormElement = modalElement.querySelector('form')! - searchResultsContainerElement = modalElement.querySelector( - "#resultsContainer--lotOccupancyAdd" - ) as HTMLElement; + searchResultsContainerElement = modalElement.querySelector( + '#resultsContainer--lotOccupancyAdd' + ) as HTMLElement - (modalElement.querySelector("#lotOccupancySearch--notWorkOrderId") as HTMLInputElement).value = - workOrderId; + ;( + modalElement.querySelector( + '#lotOccupancySearch--notWorkOrderId' + ) as HTMLInputElement + ).value = workOrderId - ( - modalElement.querySelector( - "#lotOccupancySearch--occupancyEffectiveDateString" - ) as HTMLInputElement - ).value = ( - document.querySelector("#workOrderEdit--workOrderOpenDateString") as HTMLInputElement - ).value; + ;( + modalElement.querySelector( + '#lotOccupancySearch--occupancyEffectiveDateString' + ) as HTMLInputElement + ).value = ( + document.querySelector( + '#workOrderEdit--workOrderOpenDateString' + ) as HTMLInputElement + ).value - doSearch(); - }, - onshown(modalElement) { - bulmaJS.toggleHtmlClipped(); + doSearch() + }, + onshown(modalElement) { + bulmaJS.toggleHtmlClipped() - ( - modalElement.querySelector("#lotOccupancySearch--occupantName") as HTMLInputElement - ).addEventListener("change", doSearch); + ;( + modalElement.querySelector( + '#lotOccupancySearch--occupantName' + ) as HTMLInputElement + ).addEventListener('change', doSearch) - (modalElement.querySelector("#lotOccupancySearch--lotName") as HTMLInputElement).addEventListener( - "change", - doSearch - ); + ;( + modalElement.querySelector( + '#lotOccupancySearch--lotName' + ) as HTMLInputElement + ).addEventListener('change', doSearch) - searchFormElement.addEventListener("submit", doSearch); - }, - onremoved() { - bulmaJS.toggleHtmlClipped(); - } - }); -}); + searchFormElement.addEventListener('submit', doSearch) + }, + onremoved() { + bulmaJS.toggleHtmlClipped() + } + }) + }) function doAddLot(clickEvent: Event): void { - const rowElement = (clickEvent.currentTarget as HTMLElement).closest("tr")!; + const rowElement = (clickEvent.currentTarget as HTMLElement).closest('tr')! - const lotId = rowElement.dataset.lotId!; + const lotId = rowElement.dataset.lotId! - addLot(lotId, (success) => { - if (success) { - rowElement.remove(); - } - }); + addLot(lotId, (success) => { + if (success) { + rowElement.remove() + } + }) } -document.querySelector("#button--addLot")!.addEventListener("click", () => { - let searchFormElement: HTMLFormElement; - let searchResultsContainerElement: HTMLElement; +document.querySelector('#button--addLot')!.addEventListener('click', () => { + let searchFormElement: HTMLFormElement + let searchResultsContainerElement: HTMLElement - function doSearch(event?: Event) { - if (event) { - event.preventDefault(); + function doSearch(event?: Event) { + if (event) { + event.preventDefault() + } + + searchResultsContainerElement.innerHTML = + los.getLoadingParagraphHTML('Searching...') + + cityssm.postJSON( + los.urlPrefix + '/lots/doSearchLots', + searchFormElement, + (responseJSON: { lots: recordTypes.Lot[] }) => { + if (responseJSON.lots.length === 0) { + searchResultsContainerElement.innerHTML = + '
' + + '

There are no records that meet the search criteria.

' + + '
' + + return } - searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML("Searching..."); - - cityssm.postJSON( - los.urlPrefix + "/lots/doSearchLots", - searchFormElement, - (responseJSON: { lots: recordTypes.Lot[] }) => { - if (responseJSON.lots.length === 0) { - searchResultsContainerElement.innerHTML = - '
' + - '

There are no records that meet the search criteria.

' + - "
"; - - return; - } - - searchResultsContainerElement.innerHTML = ` + searchResultsContainerElement.innerHTML = `
@@ -657,73 +722,84 @@ document.querySelector("#button--addLot")!.addEventListener("click", () => { -
${los.escapedAliases.Lot}Status
`; + ` - for (const lot of responseJSON.lots) { - const rowElement = document.createElement("tr"); - rowElement.className = "container--lot"; - rowElement.dataset.lotId = lot.lotId.toString(); + for (const lot of responseJSON.lots) { + const rowElement = document.createElement('tr') + rowElement.className = 'container--lot' + rowElement.dataset.lotId = lot.lotId.toString() - rowElement.innerHTML = - '' + - '" + - "" + - ('' + - cityssm.escapeHTML(lot.lotName || "") + - "") + - "" + - cityssm.escapeHTML(lot.mapName || "") + - "" + - ("" + cityssm.escapeHTML(lot.lotType || "") + "") + - ("" + cityssm.escapeHTML(lot.lotStatus || "") + ""); + rowElement.innerHTML = + '' + + '' + + '' + + ('' + + cityssm.escapeHTML(lot.lotName || '') + + '') + + '' + + cityssm.escapeHTML(lot.mapName || '') + + '' + + ('' + cityssm.escapeHTML(lot.lotType || '') + '') + + ('' + cityssm.escapeHTML(lot.lotStatus || '') + '') - rowElement.querySelector(".button--addLot")!.addEventListener("click", doAddLot); + rowElement + .querySelector('.button--addLot')! + .addEventListener('click', doAddLot) - searchResultsContainerElement.querySelector("tbody")!.append(rowElement); - } - } - ); - } - - cityssm.openHtmlModal("workOrder-addLot", { - onshow(modalElement) { - los.populateAliases(modalElement); - - searchFormElement = modalElement.querySelector("form")!; - - searchResultsContainerElement = modalElement.querySelector( - "#resultsContainer--lotAdd" - ) as HTMLElement; - - (modalElement.querySelector("#lotSearch--notWorkOrderId") as HTMLInputElement).value = - workOrderId; - - const lotStatusElement = modalElement.querySelector( - "#lotSearch--lotStatusId" - ) as HTMLSelectElement; - - for (const lotStatus of exports.lotStatuses as recordTypes.LotStatus[]) { - const optionElement = document.createElement("option"); - optionElement.value = lotStatus.lotStatusId.toString(); - optionElement.textContent = lotStatus.lotStatus; - lotStatusElement.append(optionElement); - } - - doSearch(); - }, - onshown(modalElement) { - bulmaJS.toggleHtmlClipped(); - - modalElement.querySelector("#lotSearch--lotName")!.addEventListener("change", doSearch); - - modalElement.querySelector("#lotSearch--lotStatusId")!.addEventListener("change", doSearch); - - searchFormElement.addEventListener("submit", doSearch); - }, - onremoved() { - bulmaJS.toggleHtmlClipped(); + searchResultsContainerElement + .querySelector('tbody')! + .append(rowElement) } - }); -}); + } + ) + } + + cityssm.openHtmlModal('workOrder-addLot', { + onshow(modalElement) { + los.populateAliases(modalElement) + + searchFormElement = modalElement.querySelector('form')! + + searchResultsContainerElement = modalElement.querySelector( + '#resultsContainer--lotAdd' + ) as HTMLElement + + ;( + modalElement.querySelector( + '#lotSearch--notWorkOrderId' + ) as HTMLInputElement + ).value = workOrderId + + const lotStatusElement = modalElement.querySelector( + '#lotSearch--lotStatusId' + ) as HTMLSelectElement + + for (const lotStatus of exports.lotStatuses as recordTypes.LotStatus[]) { + const optionElement = document.createElement('option') + optionElement.value = lotStatus.lotStatusId.toString() + optionElement.textContent = lotStatus.lotStatus + lotStatusElement.append(optionElement) + } + + doSearch() + }, + onshown(modalElement) { + bulmaJS.toggleHtmlClipped() + + modalElement + .querySelector('#lotSearch--lotName')! + .addEventListener('change', doSearch) + + modalElement + .querySelector('#lotSearch--lotStatusId')! + .addEventListener('change', doSearch) + + searchFormElement.addEventListener('submit', doSearch) + }, + onremoved() { + bulmaJS.toggleHtmlClipped() + } + }) +}) diff --git a/public-typescript/workOrderMilestoneCalendar.js b/public-typescript/workOrderMilestoneCalendar.js index 3d25ca77..2d9fdcac 100644 --- a/public-typescript/workOrderMilestoneCalendar.js +++ b/public-typescript/workOrderMilestoneCalendar.js @@ -3,62 +3,62 @@ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; - const workOrderSearchFiltersFormElement = document.querySelector("#form--searchFilters"); - const workOrderMilestoneDateFilterElement = workOrderSearchFiltersFormElement.querySelector("#searchFilter--workOrderMilestoneDateFilter"); - const workOrderMilestoneDateStringElement = workOrderSearchFiltersFormElement.querySelector("#searchFilter--workOrderMilestoneDateString"); - const milestoneCalendarContainerElement = document.querySelector("#container--milestoneCalendar"); + const workOrderSearchFiltersFormElement = document.querySelector('#form--searchFilters'); + const workOrderMilestoneDateFilterElement = workOrderSearchFiltersFormElement.querySelector('#searchFilter--workOrderMilestoneDateFilter'); + const workOrderMilestoneDateStringElement = workOrderSearchFiltersFormElement.querySelector('#searchFilter--workOrderMilestoneDateString'); + const milestoneCalendarContainerElement = document.querySelector('#container--milestoneCalendar'); function renderMilestones(workOrderMilestones) { if (workOrderMilestones.length === 0) { milestoneCalendarContainerElement.innerHTML = `
-

There are no milestones that meet the search criteria.

-
`; +

There are no milestones that meet the search criteria.

+
`; return; } - milestoneCalendarContainerElement.innerHTML = ""; + milestoneCalendarContainerElement.innerHTML = ''; const currentDate = cityssm.dateToString(new Date()); let currentPanelElement; - let currentPanelDateString = ""; + let currentPanelDateString = ''; for (const milestone of workOrderMilestones) { if (currentPanelDateString !== milestone.workOrderMilestoneDateString) { if (currentPanelElement) { milestoneCalendarContainerElement.append(currentPanelElement); } - currentPanelElement = document.createElement("div"); - currentPanelElement.className = "panel"; + currentPanelElement = document.createElement('div'); + currentPanelElement.className = 'panel'; currentPanelElement.innerHTML = `

${milestone.workOrderMilestoneDateString}

`; currentPanelDateString = milestone.workOrderMilestoneDateString; } - const panelBlockElement = document.createElement("div"); - panelBlockElement.className = "panel-block is-block"; + const panelBlockElement = document.createElement('div'); + panelBlockElement.className = 'panel-block is-block'; if (!milestone.workOrderMilestoneCompletionDate && 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) { lotOccupancyHTML += '' + ' ' + - cityssm.escapeHTML(lot.lotName || "") + - "" + - "
"; + cityssm.escapeHTML(lot.lotName || '') + + '' + + '
'; } for (const lotOccupancy of milestone.workOrderLotOccupancies) { for (const occupant of lotOccupancy.lotOccupancyOccupants) { lotOccupancyHTML += '' + ' ' + - cityssm.escapeHTML(occupant.occupantName || "") + - "" + - "
"; + cityssm.escapeHTML(occupant.occupantName || '') + + '' + + '
'; } } panelBlockElement.innerHTML = @@ -68,36 +68,36 @@ Object.defineProperty(exports, "__esModule", { value: true }); (milestone.workOrderMilestoneCompletionDate ? '' : '') + - "" + - "
") + + '' + + '') + ('
' + (milestone.workOrderMilestoneTime === 0 - ? "" - : milestone.workOrderMilestoneTimeString + "
") + + ? '' + : milestone.workOrderMilestoneTimeString + '
') + (milestone.workOrderMilestoneTypeId - ? "" + + ? '' + cityssm.escapeHTML(milestone.workOrderMilestoneType) + - "
" - : "") + + '

' + : '') + '' + cityssm.escapeHTML(milestone.workOrderMilestoneDescription) + - "" + - "
") + + '' + + '') + ('
' + '' + ' ' + - cityssm.escapeHTML(milestone.workOrderNumber || "") + - "
" + + cityssm.escapeHTML(milestone.workOrderNumber || '') + + '
' + '' + - cityssm.escapeHTML(milestone.workOrderDescription || "") + - "" + - "
") + - ('
' + lotOccupancyHTML + "
") + - ""; + cityssm.escapeHTML(milestone.workOrderDescription || '') + + '' + + '') + + ('
' + lotOccupancyHTML + '
') + + ''; currentPanelElement.append(panelBlockElement); } milestoneCalendarContainerElement.append(currentPanelElement); @@ -106,18 +106,18 @@ Object.defineProperty(exports, "__esModule", { value: true }); if (event) { event.preventDefault(); } - milestoneCalendarContainerElement.innerHTML = los.getLoadingParagraphHTML("Loading Milestones..."); - cityssm.postJSON(los.urlPrefix + "/workOrders/doGetWorkOrderMilestones", workOrderSearchFiltersFormElement, (responseJSON) => { + milestoneCalendarContainerElement.innerHTML = los.getLoadingParagraphHTML('Loading Milestones...'); + cityssm.postJSON(los.urlPrefix + '/workOrders/doGetWorkOrderMilestones', workOrderSearchFiltersFormElement, (responseJSON) => { renderMilestones(responseJSON.workOrderMilestones); }); } - workOrderMilestoneDateFilterElement.addEventListener("change", () => { - workOrderMilestoneDateStringElement.closest("fieldset").disabled = - workOrderMilestoneDateFilterElement.value !== "date"; + workOrderMilestoneDateFilterElement.addEventListener('change', () => { + workOrderMilestoneDateStringElement.closest('fieldset').disabled = + workOrderMilestoneDateFilterElement.value !== 'date'; getMilestones(); }); los.initializeDatePickers(workOrderSearchFiltersFormElement); - workOrderMilestoneDateStringElement.addEventListener("change", getMilestones); - workOrderSearchFiltersFormElement.addEventListener("submit", getMilestones); + workOrderMilestoneDateStringElement.addEventListener('change', getMilestones); + workOrderSearchFiltersFormElement.addEventListener('submit', getMilestones); getMilestones(); })(); diff --git a/public-typescript/workOrderMilestoneCalendar.ts b/public-typescript/workOrderMilestoneCalendar.ts index 6584ade8..08af140e 100644 --- a/public-typescript/workOrderMilestoneCalendar.ts +++ b/public-typescript/workOrderMilestoneCalendar.ts @@ -1,170 +1,176 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ -import type * as recordTypes from "../types/recordTypes"; -import type * as globalTypes from "../types/globalTypes"; -import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; +import type * as recordTypes from '../types/recordTypes' +import type * as globalTypes from '../types/globalTypes' +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 workOrderSearchFiltersFormElement = document.querySelector( + '#form--searchFilters' + ) as HTMLFormElement - const workOrderSearchFiltersFormElement = document.querySelector( - "#form--searchFilters" - ) as HTMLFormElement; + const workOrderMilestoneDateFilterElement = + workOrderSearchFiltersFormElement.querySelector( + '#searchFilter--workOrderMilestoneDateFilter' + ) as HTMLSelectElement - const workOrderMilestoneDateFilterElement = workOrderSearchFiltersFormElement.querySelector( - "#searchFilter--workOrderMilestoneDateFilter" - ) as HTMLSelectElement; + const workOrderMilestoneDateStringElement = + workOrderSearchFiltersFormElement.querySelector( + '#searchFilter--workOrderMilestoneDateString' + ) as HTMLInputElement - const workOrderMilestoneDateStringElement = workOrderSearchFiltersFormElement.querySelector( - "#searchFilter--workOrderMilestoneDateString" - ) as HTMLInputElement; + const milestoneCalendarContainerElement = document.querySelector( + '#container--milestoneCalendar' + ) as HTMLElement - const milestoneCalendarContainerElement = document.querySelector( - "#container--milestoneCalendar" - ) as HTMLElement; - - function renderMilestones(workOrderMilestones: recordTypes.WorkOrderMilestone[]) { - if (workOrderMilestones.length === 0) { - milestoneCalendarContainerElement.innerHTML = `
-

There are no milestones that meet the search criteria.

-
`; - 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 = `

${milestone.workOrderMilestoneDateString}

`; - - 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 += - '' + - ' ' + - cityssm.escapeHTML(lot.lotName || "") + - "" + - "
"; - } - - for (const lotOccupancy of milestone.workOrderLotOccupancies!) { - for (const occupant of lotOccupancy.lotOccupancyOccupants!) { - lotOccupancyHTML += - '' + - ' ' + - cityssm.escapeHTML(occupant.occupantName || "") + - "" + - "
"; - } - } - - panelBlockElement.innerHTML = - '
' + - ('
' + - '' + - (milestone.workOrderMilestoneCompletionDate - ? '' - : '') + - "" + - "
") + - ('
' + - (milestone.workOrderMilestoneTime === 0 - ? "" - : milestone.workOrderMilestoneTimeString + "
") + - (milestone.workOrderMilestoneTypeId - ? "" + - cityssm.escapeHTML(milestone.workOrderMilestoneType!) + - "
" - : "") + - '' + - cityssm.escapeHTML(milestone.workOrderMilestoneDescription!) + - "" + - "
") + - ('
' + - '' + - ' ' + - cityssm.escapeHTML(milestone.workOrderNumber || "") + - "
" + - '' + - cityssm.escapeHTML(milestone.workOrderDescription || "") + - "" + - "
") + - ('
' + lotOccupancyHTML + "
") + - "
"; - - (currentPanelElement as HTMLElement).append(panelBlockElement); - } - - milestoneCalendarContainerElement.append(currentPanelElement!); + function renderMilestones( + workOrderMilestones: recordTypes.WorkOrderMilestone[] + ) { + if (workOrderMilestones.length === 0) { + milestoneCalendarContainerElement.innerHTML = `
+

There are no milestones that meet the search criteria.

+
` + return } - function getMilestones(event?: Event) { - if (event) { - event.preventDefault(); + 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) } - milestoneCalendarContainerElement.innerHTML = los.getLoadingParagraphHTML("Loading Milestones..."); + currentPanelElement = document.createElement('div') + currentPanelElement.className = 'panel' - cityssm.postJSON( - los.urlPrefix + "/workOrders/doGetWorkOrderMilestones", - workOrderSearchFiltersFormElement, - (responseJSON: { workOrderMilestones: recordTypes.WorkOrderMilestone[] }) => { - renderMilestones(responseJSON.workOrderMilestones); - } - ); + currentPanelElement.innerHTML = `

${milestone.workOrderMilestoneDateString}

` + + 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 += + '' + + ' ' + + cityssm.escapeHTML(lot.lotName || '') + + '' + + '
' + } + + for (const lotOccupancy of milestone.workOrderLotOccupancies!) { + for (const occupant of lotOccupancy.lotOccupancyOccupants!) { + lotOccupancyHTML += + '' + + ' ' + + cityssm.escapeHTML(occupant.occupantName || '') + + '' + + '
' + } + } + + panelBlockElement.innerHTML = + '
' + + ('
' + + '' + + (milestone.workOrderMilestoneCompletionDate + ? '' + : '') + + '' + + '
') + + ('
' + + (milestone.workOrderMilestoneTime === 0 + ? '' + : milestone.workOrderMilestoneTimeString + '
') + + (milestone.workOrderMilestoneTypeId + ? '' + + cityssm.escapeHTML(milestone.workOrderMilestoneType!) + + '
' + : '') + + '' + + cityssm.escapeHTML(milestone.workOrderMilestoneDescription!) + + '' + + '
') + + ('
' + + '' + + ' ' + + cityssm.escapeHTML(milestone.workOrderNumber || '') + + '
' + + '' + + cityssm.escapeHTML(milestone.workOrderDescription || '') + + '' + + '
') + + ('
' + lotOccupancyHTML + '
') + + '
' + ;(currentPanelElement as HTMLElement).append(panelBlockElement) } - workOrderMilestoneDateFilterElement.addEventListener("change", () => { - workOrderMilestoneDateStringElement.closest("fieldset")!.disabled = - workOrderMilestoneDateFilterElement.value !== "date"; - getMilestones(); - }); + milestoneCalendarContainerElement.append(currentPanelElement!) + } - los.initializeDatePickers(workOrderSearchFiltersFormElement); + function getMilestones(event?: Event) { + if (event) { + event.preventDefault() + } - workOrderMilestoneDateStringElement.addEventListener("change", getMilestones); - workOrderSearchFiltersFormElement.addEventListener("submit", getMilestones); + milestoneCalendarContainerElement.innerHTML = los.getLoadingParagraphHTML( + '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() +})() diff --git a/public-typescript/workOrderOutlook.js b/public-typescript/workOrderOutlook.js index 6f459e33..3b478e80 100644 --- a/public-typescript/workOrderOutlook.js +++ b/public-typescript/workOrderOutlook.js @@ -3,47 +3,48 @@ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; - const workOrderTypeIdsElement = document.querySelector("#icsFilters--workOrderTypeIds"); - const workOrderMilestoneTypeIdsElement = document.querySelector("#icsFilters--workOrderMilestoneTypeIds"); - const calendarLinkElement = document.querySelector("#icsFilters--calendarURL"); + const workOrderTypeIdsElement = document.querySelector('#icsFilters--workOrderTypeIds'); + const workOrderMilestoneTypeIdsElement = document.querySelector('#icsFilters--workOrderMilestoneTypeIds'); + const calendarLinkElement = document.querySelector('#icsFilters--calendarURL'); function updateCalendarURL() { let url = window.location.href.slice(0, Math.max(0, window.location.href.indexOf(window.location.pathname) + 1)) + los.urlPrefix + - "api/" + + 'api/' + los.apiKey + - "/" + - "milestoneICS/" + - "?"; + '/' + + 'milestoneICS/' + + '?'; if (!workOrderTypeIdsElement.disabled && workOrderTypeIdsElement.selectedOptions.length > 0) { - url += "workOrderTypeIds="; + url += 'workOrderTypeIds='; 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="; + url += 'workOrderMilestoneTypeIds='; 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); } - document.querySelector("#icsFilters--workOrderTypeIds-all").addEventListener("change", (changeEvent) => { + ; + document.querySelector('#icsFilters--workOrderTypeIds-all').addEventListener('change', (changeEvent) => { 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; }); - const inputSelectElements = document.querySelector("#panel--icsFilters").querySelectorAll("input, select"); + const inputSelectElements = document.querySelector('#panel--icsFilters').querySelectorAll('input, select'); for (const element of inputSelectElements) { - element.addEventListener("change", updateCalendarURL); + element.addEventListener('change', updateCalendarURL); } updateCalendarURL(); - calendarLinkElement.addEventListener("click", () => { + calendarLinkElement.addEventListener('click', () => { calendarLinkElement.focus(); calendarLinkElement.select(); }); diff --git a/public-typescript/workOrderOutlook.ts b/public-typescript/workOrderOutlook.ts index d458a87e..349b2bbf 100644 --- a/public-typescript/workOrderOutlook.ts +++ b/public-typescript/workOrderOutlook.ts @@ -1,85 +1,98 @@ /* 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( - "#icsFilters--workOrderTypeIds" - ) as HTMLSelectElement; + const workOrderTypeIdsElement = document.querySelector( + '#icsFilters--workOrderTypeIds' + ) as HTMLSelectElement - const workOrderMilestoneTypeIdsElement = document.querySelector( - "#icsFilters--workOrderMilestoneTypeIds" - ) as HTMLSelectElement; + const workOrderMilestoneTypeIdsElement = document.querySelector( + '#icsFilters--workOrderMilestoneTypeIds' + ) as HTMLSelectElement - const calendarLinkElement = document.querySelector( - "#icsFilters--calendarURL" - ) as HTMLTextAreaElement; + const calendarLinkElement = document.querySelector( + '#icsFilters--calendarURL' + ) as HTMLTextAreaElement - function updateCalendarURL() { - let url = window.location.href.slice( - 0, - Math.max(0, window.location.href.indexOf(window.location.pathname) + 1) - ) + - los.urlPrefix + - "api/" + - los.apiKey + - "/" + - "milestoneICS/" + - "?"; + function updateCalendarURL() { + let url = + window.location.href.slice( + 0, + Math.max(0, window.location.href.indexOf(window.location.pathname) + 1) + ) + + los.urlPrefix + + 'api/' + + los.apiKey + + '/' + + 'milestoneICS/' + + '?' - if (!workOrderTypeIdsElement.disabled && - workOrderTypeIdsElement.selectedOptions.length > 0) { - url += "workOrderTypeIds="; + if ( + !workOrderTypeIdsElement.disabled && + workOrderTypeIdsElement.selectedOptions.length > 0 + ) { + url += 'workOrderTypeIds=' - for (const optionElement of workOrderTypeIdsElement.selectedOptions) { - url += optionElement.value + ","; - } + for (const optionElement of workOrderTypeIdsElement.selectedOptions) { + url += optionElement.value + ',' + } - 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); + url = url.slice(0, -1) + '&' } - ( - document.querySelector("#icsFilters--workOrderTypeIds-all") as HTMLInputElement - ).addEventListener("change", (changeEvent) => { - workOrderTypeIdsElement.disabled = (changeEvent.currentTarget as HTMLInputElement).checked; - }); + if ( + !workOrderMilestoneTypeIdsElement.disabled && + workOrderMilestoneTypeIdsElement.selectedOptions.length > 0 + ) { + url += 'workOrderMilestoneTypeIds=' - ( - document.querySelector("#icsFilters--workOrderMilestoneTypeIds-all") as HTMLInputElement - ).addEventListener("change", (changeEvent) => { - workOrderMilestoneTypeIdsElement.disabled = ( - changeEvent.currentTarget as HTMLInputElement - ).checked; - }); + for (const optionElement of workOrderMilestoneTypeIdsElement.selectedOptions) { + url += optionElement.value + ',' + } - const inputSelectElements = ( - document.querySelector("#panel--icsFilters") as HTMLElement - ).querySelectorAll("input, select") as NodeListOf; - - for (const element of inputSelectElements) { - element.addEventListener("change", updateCalendarURL); + url = url.slice(0, -1) + '&' } - updateCalendarURL(); + calendarLinkElement.value = url.slice(0, -1) + } - calendarLinkElement.addEventListener("click", () => { - calendarLinkElement.focus(); - calendarLinkElement.select(); - }); -})(); + ;( + document.querySelector( + '#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() + }) +})() diff --git a/public-typescript/workOrderSearch.js b/public-typescript/workOrderSearch.js index 95c5aed0..8b6cf94c 100644 --- a/public-typescript/workOrderSearch.js +++ b/public-typescript/workOrderSearch.js @@ -4,67 +4,69 @@ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; const workOrderPrints = exports.workOrderPrints; - const searchFilterFormElement = document.querySelector("#form--searchFilters"); + const searchFilterFormElement = document.querySelector('#form--searchFilters'); los.initializeDatePickers(searchFilterFormElement); - const searchResultsContainerElement = document.querySelector("#container--searchResults"); - const limit = Number.parseInt(document.querySelector("#searchFilter--limit").value, 10); - const offsetElement = document.querySelector("#searchFilter--offset"); + const searchResultsContainerElement = document.querySelector('#container--searchResults'); + const limit = Number.parseInt(document.querySelector('#searchFilter--limit').value, 10); + const offsetElement = document.querySelector('#searchFilter--offset'); function renderWorkOrders(responseJSON) { var _a, _b; if (responseJSON.workOrders.length === 0) { searchResultsContainerElement.innerHTML = '
' + '

There are no work orders that meet the search criteria.

' + - "
"; + ''; return; } - const resultsTbodyElement = document.createElement("tbody"); + const resultsTbodyElement = document.createElement('tbody'); for (const workOrder of responseJSON.workOrders) { - let relatedHTML = ""; + let relatedHTML = ''; for (const lot of workOrder.workOrderLots) { relatedHTML += '' + ' ' + - cityssm.escapeHTML(lot.lotName || "(No " + exports.aliases.Lot + " Name)") + - "
"; + cityssm.escapeHTML(lot.lotName || '(No ' + exports.aliases.Lot + ' Name)') + + '
'; } for (const occupancy of workOrder.workOrderLotOccupancies) { for (const occupant of occupancy.lotOccupancyOccupants) { relatedHTML += '' + ' ' + - cityssm.escapeHTML(occupant.occupantName || "(No Name)") + - "
"; + cityssm.escapeHTML(occupant.occupantName || '(No Name)') + + '
'; } } - resultsTbodyElement.insertAdjacentHTML("beforeend", "" + - ("" + + resultsTbodyElement.insertAdjacentHTML('beforeend', '' + + ('' + '' + (workOrder.workOrderNumber.trim() - ? cityssm.escapeHTML(workOrder.workOrderNumber || "") - : "(No Number)") + - "" + - "") + - ("" + - cityssm.escapeHTML(workOrder.workOrderType || "") + - "
" + + ? cityssm.escapeHTML(workOrder.workOrderNumber || '') + : '(No Number)') + + '' + + '') + + ('' + + cityssm.escapeHTML(workOrder.workOrderType || '') + + '
' + '' + - cityssm.escapeHTML(workOrder.workOrderDescription || "") + - "" + - "") + - ('' + relatedHTML + "") + + cityssm.escapeHTML(workOrder.workOrderDescription || '') + + '' + + '') + + ('' + + relatedHTML + + '') + ('' + (' ' + workOrder.workOrderOpenDateString + - "
") + + '
') + ('' + @@ -84,55 +86,57 @@ Object.defineProperty(exports, "__esModule", { value: true }); ? workOrder.workOrderCloseDateString : '(No ' + los.escapedAliases.WorkOrderCloseDate + - ")") + - "") + - "") + - ("" + + ')') + + '') + + '') + + ('' + (workOrder.workOrderMilestoneCount === 0 - ? "-" + ? '-' : workOrder.workOrderMilestoneCompletionCount + - " / " + + ' / ' + workOrder.workOrderMilestoneCount) + - "") + + '') + (workOrderPrints.length > 0 - ? "" + + ? '' + '' + '' + - "" + - "" - : "") + - ""); + '' + + '' + : '') + + ''); } searchResultsContainerElement.innerHTML = '' + - "" + - "" + - "" + - "" + - "" + + '' + + '' + + '' + + '' + + '' + '' + - (workOrderPrints.length > 0 ? '' : "") + - "" + - "
Work Order NumberDescriptionRelatedDate
Work Order NumberDescriptionRelatedDateProgress
"; - searchResultsContainerElement.insertAdjacentHTML("beforeend", los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count)); - searchResultsContainerElement.querySelector("table").append(resultsTbodyElement); + (workOrderPrints.length > 0 ? '' : '') + + '' + + '
'; + searchResultsContainerElement.insertAdjacentHTML('beforeend', los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count)); + searchResultsContainerElement + .querySelector('table') + .append(resultsTbodyElement); (_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 - .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() { - searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML("Loading Work Orders..."); - cityssm.postJSON(los.urlPrefix + "/workOrders/doSearchWorkOrders", searchFilterFormElement, renderWorkOrders); + searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML('Loading Work Orders...'); + cityssm.postJSON(los.urlPrefix + '/workOrders/doSearchWorkOrders', searchFilterFormElement, renderWorkOrders); } function resetOffsetAndGetWorkOrders() { - offsetElement.value = "0"; + offsetElement.value = '0'; getWorkOrders(); } function previousAndGetWorkOrders() { @@ -143,42 +147,42 @@ Object.defineProperty(exports, "__esModule", { value: true }); offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString(); getWorkOrders(); } - const filterElements = searchFilterFormElement.querySelectorAll("input, select"); + const filterElements = searchFilterFormElement.querySelectorAll('input, select'); for (const filterElement of filterElements) { - filterElement.addEventListener("change", resetOffsetAndGetWorkOrders); + filterElement.addEventListener('change', resetOffsetAndGetWorkOrders); } - searchFilterFormElement.addEventListener("submit", (formEvent) => { + searchFilterFormElement.addEventListener('submit', (formEvent) => { formEvent.preventDefault(); resetOffsetAndGetWorkOrders(); }); /* - const workOrderOpenDateStringElement = document.querySelector("#searchFilter--workOrderOpenDateString") as HTMLInputElement; - - document.querySelector("#button--workOrderOpenDateString-previous").addEventListener("click", () => { - - if (workOrderOpenDateStringElement.value === "") { - workOrderOpenDateStringElement.valueAsDate = new Date(); - } else { - const openDate = workOrderOpenDateStringElement.valueAsDate; - openDate.setDate(openDate.getDate() - 1); - workOrderOpenDateStringElement.valueAsDate = openDate; - } - - resetOffsetAndGetWorkOrders(); - }); - - document.querySelector("#button--workOrderOpenDateString-next").addEventListener("click", () => { - - if (workOrderOpenDateStringElement.value === "") { - workOrderOpenDateStringElement.valueAsDate = new Date(); - } else { - const openDate = workOrderOpenDateStringElement.valueAsDate; - openDate.setDate(openDate.getDate() + 1); - workOrderOpenDateStringElement.valueAsDate = openDate; - } - - resetOffsetAndGetWorkOrders(); - }); - */ + const workOrderOpenDateStringElement = document.querySelector("#searchFilter--workOrderOpenDateString") as HTMLInputElement; + + document.querySelector("#button--workOrderOpenDateString-previous").addEventListener("click", () => { + + if (workOrderOpenDateStringElement.value === "") { + workOrderOpenDateStringElement.valueAsDate = new Date(); + } else { + const openDate = workOrderOpenDateStringElement.valueAsDate; + openDate.setDate(openDate.getDate() - 1); + workOrderOpenDateStringElement.valueAsDate = openDate; + } + + resetOffsetAndGetWorkOrders(); + }); + + document.querySelector("#button--workOrderOpenDateString-next").addEventListener("click", () => { + + if (workOrderOpenDateStringElement.value === "") { + workOrderOpenDateStringElement.valueAsDate = new Date(); + } else { + const openDate = workOrderOpenDateStringElement.valueAsDate; + openDate.setDate(openDate.getDate() + 1); + workOrderOpenDateStringElement.valueAsDate = openDate; + } + + resetOffsetAndGetWorkOrders(); + }); + */ getWorkOrders(); })(); diff --git a/public-typescript/workOrderSearch.ts b/public-typescript/workOrderSearch.ts index 0e669c75..23c0d0be 100644 --- a/public-typescript/workOrderSearch.ts +++ b/public-typescript/workOrderSearch.ts @@ -1,209 +1,232 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ -import type * as recordTypes from "../types/recordTypes"; -import type * as globalTypes from "../types/globalTypes"; -import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; +import type * as recordTypes from '../types/recordTypes' +import type * as globalTypes from '../types/globalTypes' +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( - (document.querySelector("#searchFilter--limit") as HTMLInputElement).value, - 10 - ); + const limit = Number.parseInt( + (document.querySelector('#searchFilter--limit') as HTMLInputElement).value, + 10 + ) - const offsetElement = document.querySelector("#searchFilter--offset") as HTMLInputElement; + const offsetElement = document.querySelector( + '#searchFilter--offset' + ) as HTMLInputElement - function renderWorkOrders(responseJSON: { - count: number; - offset: number; - workOrders: recordTypes.WorkOrder[]; - }) { - if (responseJSON.workOrders.length === 0) { - searchResultsContainerElement.innerHTML = - '
' + - '

There are no work orders that meet the search criteria.

' + - "
"; + function renderWorkOrders(responseJSON: { + count: number + offset: number + workOrders: recordTypes.WorkOrder[] + }) { + if (responseJSON.workOrders.length === 0) { + searchResultsContainerElement.innerHTML = + '
' + + '

There are no work orders that meet the search criteria.

' + + '
' - return; + return + } + + const resultsTbodyElement = document.createElement('tbody') + + for (const workOrder of responseJSON.workOrders) { + let relatedHTML = '' + + for (const lot of workOrder.workOrderLots!) { + relatedHTML += + '' + + ' ' + + cityssm.escapeHTML( + lot.lotName || '(No ' + exports.aliases.Lot + ' Name)' + ) + + '
' + } + + for (const occupancy of workOrder.workOrderLotOccupancies!) { + for (const occupant of occupancy.lotOccupancyOccupants!) { + relatedHTML += + '' + + ' ' + + cityssm.escapeHTML(occupant.occupantName || '(No Name)') + + '
' } + } - const resultsTbodyElement = document.createElement("tbody"); - - for (const workOrder of responseJSON.workOrders) { - let relatedHTML = ""; - - for (const lot of workOrder.workOrderLots!) { - relatedHTML += - '' + - ' ' + - cityssm.escapeHTML(lot.lotName || "(No " + exports.aliases.Lot + " Name)") + - "
"; - } - - for (const occupancy of workOrder.workOrderLotOccupancies!) { - for (const occupant of occupancy.lotOccupancyOccupants!) { - relatedHTML += - '' + - ' ' + - cityssm.escapeHTML(occupant.occupantName || "(No Name)") + - "
"; - } - } - - resultsTbodyElement.insertAdjacentHTML( - "beforeend", - "" + - ("") + - ("") + - ('") + - ('") + - ("") + - (workOrderPrints.length > 0 - ? "" - : "") + - "" - ); - } - - searchResultsContainerElement.innerHTML = - '
" + - '' + - (workOrder.workOrderNumber!.trim() - ? cityssm.escapeHTML(workOrder.workOrderNumber || "") - : "(No Number)") + - "" + - "" + - cityssm.escapeHTML(workOrder.workOrderType || "") + - "
" + - '' + - cityssm.escapeHTML(workOrder.workOrderDescription || "") + - "" + - "
' + relatedHTML + "' + - ('' + - ' ' + - workOrder.workOrderOpenDateString + - "
") + - ('' + - ' ' + - (workOrder.workOrderCloseDate - ? workOrder.workOrderCloseDateString - : '(No ' + - los.escapedAliases.WorkOrderCloseDate + - ")") + - "") + - "
" + - (workOrder.workOrderMilestoneCount === 0 - ? "-" - : workOrder.workOrderMilestoneCompletionCount + - " / " + - workOrder.workOrderMilestoneCount) + - "" + - '' + - '' + - "" + - "
' + - "" + - "" + - "" + - "" + - "" + - '' + - (workOrderPrints.length > 0 ? '' : "") + - "" + - "
Work Order NumberDescriptionRelatedDateProgress
"; - - 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); + resultsTbodyElement.insertAdjacentHTML( + 'beforeend', + '' + + ('') + + ('') + + ('') + + ('') + + ('') + + (workOrderPrints.length > 0 + ? '' + : '') + + '' + ) } - function getWorkOrders() { - searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML("Loading Work Orders..."); + searchResultsContainerElement.innerHTML = + '
' + + '' + + (workOrder.workOrderNumber!.trim() + ? cityssm.escapeHTML(workOrder.workOrderNumber || '') + : '(No Number)') + + '' + + '' + + cityssm.escapeHTML(workOrder.workOrderType || '') + + '
' + + '' + + cityssm.escapeHTML(workOrder.workOrderDescription || '') + + '' + + '
' + + relatedHTML + + '' + + ('' + + ' ' + + workOrder.workOrderOpenDateString + + '
') + + ('' + + ' ' + + (workOrder.workOrderCloseDate + ? workOrder.workOrderCloseDateString + : '(No ' + + los.escapedAliases.WorkOrderCloseDate + + ')') + + '') + + '
' + + (workOrder.workOrderMilestoneCount === 0 + ? '-' + : workOrder.workOrderMilestoneCompletionCount + + ' / ' + + workOrder.workOrderMilestoneCount) + + '' + + '' + + '' + + '' + + '
' + + '' + + '' + + '' + + '' + + '' + + '' + + (workOrderPrints.length > 0 ? '' : '') + + '' + + '
Work Order NumberDescriptionRelatedDateProgress
' - cityssm.postJSON( - los.urlPrefix + "/workOrders/doSearchWorkOrders", - searchFilterFormElement, - renderWorkOrders - ); - } + searchResultsContainerElement.insertAdjacentHTML( + 'beforeend', + los.getSearchResultsPagerHTML( + limit, + responseJSON.offset, + responseJSON.count + ) + ) - function resetOffsetAndGetWorkOrders() { - offsetElement.value = "0"; - getWorkOrders(); - } + searchResultsContainerElement + .querySelector('table')! + .append(resultsTbodyElement) - function previousAndGetWorkOrders() { - offsetElement.value = Math.max(Number.parseInt(offsetElement.value, 10) - limit, 0).toString(); - getWorkOrders(); - } + searchResultsContainerElement + .querySelector("button[data-page='previous']") + ?.addEventListener('click', previousAndGetWorkOrders) - function nextAndGetWorkOrders() { - offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString(); - getWorkOrders(); - } + searchResultsContainerElement + .querySelector("button[data-page='next']") + ?.addEventListener('click', nextAndGetWorkOrders) + } - const filterElements = searchFilterFormElement.querySelectorAll("input, select") as NodeListOf< - HTMLInputElement | HTMLSelectElement - >; + function getWorkOrders() { + searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML( + 'Loading Work Orders...' + ) - for (const filterElement of filterElements) { - filterElement.addEventListener("change", resetOffsetAndGetWorkOrders); - } + cityssm.postJSON( + los.urlPrefix + '/workOrders/doSearchWorkOrders', + searchFilterFormElement, + renderWorkOrders + ) + } - searchFilterFormElement.addEventListener("submit", (formEvent) => { - formEvent.preventDefault(); - resetOffsetAndGetWorkOrders(); - }); + function resetOffsetAndGetWorkOrders() { + offsetElement.value = '0' + 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 + + for (const filterElement of filterElements) { + filterElement.addEventListener('change', resetOffsetAndGetWorkOrders) + } + + searchFilterFormElement.addEventListener('submit', (formEvent) => { + formEvent.preventDefault() + resetOffsetAndGetWorkOrders() + }) + + /* const workOrderOpenDateStringElement = document.querySelector("#searchFilter--workOrderOpenDateString") as HTMLInputElement; document.querySelector("#button--workOrderOpenDateString-previous").addEventListener("click", () => { @@ -233,5 +256,5 @@ declare const cityssm: cityssmGlobal; }); */ - getWorkOrders(); -})(); + getWorkOrders() +})() diff --git a/public-typescript/workOrderView.js b/public-typescript/workOrderView.js index aec0f026..efe66b86 100644 --- a/public-typescript/workOrderView.js +++ b/public-typescript/workOrderView.js @@ -3,33 +3,32 @@ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; - const reopenWorkOrderButtonElement = document.querySelector("#button--reopenWorkOrder"); + const reopenWorkOrderButtonElement = document.querySelector('#button--reopenWorkOrder'); if (reopenWorkOrderButtonElement) { const workOrderId = reopenWorkOrderButtonElement.dataset.workOrderId; - reopenWorkOrderButtonElement.addEventListener("click", () => { + reopenWorkOrderButtonElement.addEventListener('click', () => { function doReopen() { - cityssm.postJSON(los.urlPrefix + "/workOrders/doReopenWorkOrder", { + cityssm.postJSON(los.urlPrefix + '/workOrders/doReopenWorkOrder', { workOrderId }, (responseJSON) => { if (responseJSON.success) { - window.location.href = - los.getWorkOrderURL(workOrderId, true, true); + window.location.href = los.getWorkOrderURL(workOrderId, true, true); } else { bulmaJS.alert({ - title: "Error Reopening Work Order", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" + title: 'Error Reopening Work Order', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' }); } }); } bulmaJS.confirm({ - title: "Reopen Work Order", - message: "Are you sure you want to remove the close date from this work order and reopen it?", - contextualColorName: "warning", + title: 'Reopen Work Order', + message: 'Are you sure you want to remove the close date from this work order and reopen it?', + contextualColorName: 'warning', okButton: { - text: "Yes, Reopen Work Order", + text: 'Yes, Reopen Work Order', callbackFunction: doReopen } }); diff --git a/public-typescript/workOrderView.ts b/public-typescript/workOrderView.ts index 0903e4c1..4cb22e4c 100644 --- a/public-typescript/workOrderView.ts +++ b/public-typescript/workOrderView.ts @@ -1,56 +1,59 @@ /* 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 bulmaJS: BulmaJS; +declare const cityssm: cityssmGlobal +declare const bulmaJS: BulmaJS -(() => { - const los = exports.los as globalTypes.LOS; +;(() => { + const los = exports.los as globalTypes.LOS - const reopenWorkOrderButtonElement = document.querySelector( - "#button--reopenWorkOrder" - ) as HTMLButtonElement; + const reopenWorkOrderButtonElement = document.querySelector( + '#button--reopenWorkOrder' + ) as HTMLButtonElement - if (reopenWorkOrderButtonElement) { - const workOrderId = reopenWorkOrderButtonElement.dataset.workOrderId!; + if (reopenWorkOrderButtonElement) { + const workOrderId = reopenWorkOrderButtonElement.dataset.workOrderId! - reopenWorkOrderButtonElement.addEventListener("click", () => { - function doReopen() { - cityssm.postJSON( - los.urlPrefix + "/workOrders/doReopenWorkOrder", - { - workOrderId - }, - (responseJSON: { success: boolean; errorMessage?: string }) => { - if (responseJSON.success) { - window.location.href = - los.getWorkOrderURL(workOrderId, true, true); - } else { - bulmaJS.alert({ - title: "Error Reopening Work Order", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); + reopenWorkOrderButtonElement.addEventListener('click', () => { + function doReopen() { + cityssm.postJSON( + los.urlPrefix + '/workOrders/doReopenWorkOrder', + { + workOrderId + }, + (responseJSON: { success: boolean; errorMessage?: string }) => { + if (responseJSON.success) { + window.location.href = los.getWorkOrderURL( + workOrderId, + true, + true + ) + } else { + bulmaJS.alert({ + title: 'Error Reopening Work Order', + message: responseJSON.errorMessage || '', + contextualColorName: 'danger' + }) } + } + ) + } - bulmaJS.confirm({ - title: "Reopen Work Order", - message: - "Are you sure you want to remove the close date from this work order and reopen it?", - contextualColorName: "warning", - okButton: { - text: "Yes, Reopen Work Order", - callbackFunction: doReopen - } - }); - }); - } -})(); + bulmaJS.confirm({ + title: 'Reopen Work Order', + message: + 'Are you sure you want to remove the close date from this work order and reopen it?', + contextualColorName: 'warning', + okButton: { + text: 'Yes, Reopen Work Order', + callbackFunction: doReopen + } + }) + }) + } +})() diff --git a/public/html/adminFees-editFee.html b/public/html/adminFees-editFee.html index e63d12fc..79a8a953 100644 --- a/public/html/adminFees-editFee.html +++ b/public/html/adminFees-editFee.html @@ -1,6 +1,6 @@
+ + + + +
+

Work Order #<%= workOrder.workOrderNumber %>

+
+ + <% if (workOrder.workOrderCloseDate) { %> + CLOSED
+ <% } %> + <%= workOrder.workOrderType %> +
+
+
+ + + + + +
+ +

+ Description
+ <%= workOrder.workOrderDescription %> +

+
+

+ <%= configFunctions.getProperty("aliases.workOrderOpenDate") %>
+ <%= workOrder.workOrderOpenDateString %> +

+ <% if (workOrder.workOrderCloseDate) { %> +

+ <%= configFunctions.getProperty("aliases.workOrderCloseDate") %>
+ <%= workOrder.workOrderCloseDateString %> +

+ <% } %> +
+
diff --git a/views/print/pdf/workOrder-commentLog.ejs b/views/print/pdf/workOrder-commentLog.ejs index 2a9c1cf1..cf967b1a 100644 --- a/views/print/pdf/workOrder-commentLog.ejs +++ b/views/print/pdf/workOrder-commentLog.ejs @@ -5,46 +5,7 @@ - - - - - -
-

Work Order #<%= workOrder.workOrderNumber %>

-
- - <% if (workOrder.workOrderCloseDate) { %> - CLOSED
- <% } %> - <%= workOrder.workOrderType %> -
-
-
- - - - - -
- -

- Description
- <%= workOrder.workOrderDescription %> -

-
-

- <%= configFunctions.getProperty("aliases.workOrderOpenDate") %>
- <%= workOrder.workOrderOpenDateString %> -

- <% if (workOrder.workOrderCloseDate) { %> -

- <%= configFunctions.getProperty("aliases.workOrderCloseDate") %>
- <%= workOrder.workOrderCloseDateString %> -

- <% } %> -
-
+ <%- include('_workOrder-header.ejs'); %>

Comments

diff --git a/views/print/pdf/workOrder.ejs b/views/print/pdf/workOrder.ejs index eb7fc0c5..5ded34fc 100644 --- a/views/print/pdf/workOrder.ejs +++ b/views/print/pdf/workOrder.ejs @@ -2,50 +2,11 @@ + - - - - - -
-

Work Order #<%= workOrder.workOrderNumber %>

-
- - <% if (workOrder.workOrderCloseDate) { %> - CLOSED
- <% } %> - <%= workOrder.workOrderType %> -
-
-
- - - - - -
- -

- Description
- <%= workOrder.workOrderDescription %> -

-
-

- <%= configFunctions.getProperty("aliases.workOrderOpenDate") %>
- <%= workOrder.workOrderOpenDateString %> -

- <% if (workOrder.workOrderCloseDate) { %> -

- <%= configFunctions.getProperty("aliases.workOrderCloseDate") %>
- <%= workOrder.workOrderCloseDateString %> -

- <% } %> -
-
- + <%- include('_workOrder-header.ejs'); %> + <% if (workOrder.workOrderLots.length > 0) { %>

<%= configFunctions.getProperty("aliases.lots") %>