linting with mega linter

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

View File

@ -1,16 +1,16 @@
{
"ignorePaths": [
"**/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"
}

View File

@ -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
}
}
}
]
}
}

View File

@ -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"
]
}

View File

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

View File

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

153
app.js
View File

@ -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;

305
app.ts
View File

@ -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

View File

@ -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'
}
});

View File

@ -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'
}
})

View File

@ -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"
}

View File

@ -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
"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
}

View File

@ -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();

View File

@ -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()
})

View File

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

View File

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

View File

@ -1,18 +1,18 @@
import type { RequestHandler } from "express";
import type { RequestHandler } from 'express';
import { getLots } from "../../helpers/lotOccupancyDB/getLots.js";
import { getLots } from '../../helpers/lotOccupancyDB/getLots.js';
export const handler: RequestHandler = async (request, response) => {
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;

View File

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

View File

@ -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";

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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;

164
package-lock.json generated
View File

@ -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"
}
},

View File

@ -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",

View File

@ -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;
}

View File

@ -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
}
});

View File

@ -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
}
})
})
})()

View File

@ -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 });
</div>`;
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 =
'<div class="panel-heading">' +
'<div class="columns">' +
('<div class="column">' +
'<h2 class="title is-4">' +
cityssm.escapeHTML(feeCategory.feeCategory || "") +
"</h2>" +
"</div>") +
cityssm.escapeHTML(feeCategory.feeCategory || '') +
'</h2>' +
'</div>') +
('<div class="column is-narrow">' +
'<div class="field is-grouped is-justify-content-end">' +
(feeCategory.fees.length === 0
? '<div class="control">' +
'<button class="button is-small is-danger button--deleteFeeCategory" type="button">' +
'<span class="icon is-small"><i class="fas fa-trash" aria-hidden="true"></i></span>' +
"<span>Delete Category</span>" +
"</button>" +
"</div>"
: "") +
'<span>Delete Category</span>' +
'</button>' +
'</div>'
: '') +
('<div class="control">' +
'<button class="button is-small is-primary button--editFeeCategory" type="button">' +
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
"<span>Edit Category</span>" +
"</button>" +
"</div>") +
'<span>Edit Category</span>' +
'</button>' +
'</div>') +
('<div class="control">' +
'<button class="button is-small is-success button--addFee" data-cy="addFee" type="button">' +
'<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>' +
"<span>Add Fee</span>" +
"</button>" +
"</div>") +
'<span>Add Fee</span>' +
'</button>' +
'</div>') +
('<div class="control">' +
los.getMoveUpDownButtonFieldHTML("button--moveFeeCategoryUp", "button--moveFeeCategoryDown") +
"</div>") +
"</div>") +
"</div>" +
"</div>";
los.getMoveUpDownButtonFieldHTML('button--moveFeeCategoryUp', 'button--moveFeeCategoryDown') +
'</div>') +
'</div>') +
'</div>' +
'</div>';
if (feeCategory.fees.length === 0) {
feeCategoryContainerElement.insertAdjacentHTML("beforeend", `<div class="panel-block is-block">
feeCategoryContainerElement.insertAdjacentHTML('beforeend', `<div class="panel-block is-block">
<div class="message is-info">
<p class="message-body">
There are no fees in the
"${cityssm.escapeHTML(feeCategory.feeCategory || "")}"
"${cityssm.escapeHTML(feeCategory.feeCategory || '')}"
category.
</p>
</div>
</div>`);
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 =
'<div class="columns">' +
('<div class="column is-half">' +
"<p>" +
'<p>' +
'<a class="has-text-weight-bold" href="#">' +
cityssm.escapeHTML(fee.feeName || "") +
"</a><br />" +
"<small>" +
cityssm.escapeHTML(fee.feeDescription || "").replace(/\n/g, "<br />") +
"</small>" +
"</p>" +
cityssm.escapeHTML(fee.feeName || '') +
'</a><br />' +
'<small>' +
cityssm
.escapeHTML(fee.feeDescription || '')
.replace(/\n/g, '<br />') +
'</small>' +
'</p>' +
(hasTagsBlock
? '<p class="tags">' +
(fee.isRequired ? '<span class="tag is-warning">Required</span>' : "") +
(fee.isRequired
? '<span class="tag is-warning">Required</span>'
: '') +
(fee.occupancyTypeId
? ' <span class="tag has-tooltip-bottom" data-tooltip="' +
los.escapedAliases.Occupancy +
' Type Filter">' +
cityssm.escapeHTML(fee.occupancyType || "") +
"</span>"
: "") +
cityssm.escapeHTML(fee.occupancyType || '') +
'</span>'
: '') +
(fee.lotTypeId
? ' <span class="tag has-tooltip-bottom" data-tooltip="' +
los.escapedAliases.Lot +
' Type Filter">' +
cityssm.escapeHTML(fee.lotType || "") +
"</span>"
: "") +
"</p>"
: "") +
"</div>") +
cityssm.escapeHTML(fee.lotType || '') +
'</span>'
: '') +
'</p>'
: '') +
'</div>') +
('<div class="column">' +
'<div class="columns is-mobile">' +
('<div class="column has-text-centered">' +
(fee.feeFunction
? cityssm.escapeHTML(fee.feeFunction) +
"<br />" +
"<small>Fee Function</small>"
: "$" + fee.feeAmount.toFixed(2) + "<br />" + "<small>Fee</small>") +
"</div>") +
'<br />' +
'<small>Fee Function</small>'
: '$' +
fee.feeAmount.toFixed(2) +
'<br />' +
'<small>Fee</small>') +
'</div>') +
('<div class="column has-text-centered">' +
(fee.taxPercentage
? fee.taxPercentage + "%"
: "$" + fee.taxAmount.toFixed(2)) +
"<br /><small>Tax</small>" +
"</div>") +
? fee.taxPercentage + '%'
: '$' + fee.taxAmount.toFixed(2)) +
'<br /><small>Tax</small>' +
'</div>') +
('<div class="column has-text-centered">' +
(fee.includeQuantity
? cityssm.escapeHTML(fee.quantityUnit || "") +
"<br />" +
"<small>Quantity</small>"
: "") +
"</div>") +
"</div>" +
"</div>") +
? cityssm.escapeHTML(fee.quantityUnit || '') +
'<br />' +
'<small>Quantity</small>'
: '') +
'</div>') +
'</div>' +
'</div>') +
('<div class="column is-narrow">' +
los.getMoveUpDownButtonFieldHTML("button--moveFeeUp", "button--moveFeeDown") +
"</div>" +
"</div>") +
"</div>";
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') +
'</div>' +
'</div>') +
'</div>';
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'
});
}
});

File diff suppressed because it is too large Load Diff

View File

@ -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)
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>';
const panelBlockElements = lotTypeElement.querySelectorAll(".panel-block");
const panelBlockElements = lotTypeElement.querySelectorAll('.panel-block');
for (const panelBlockElement of panelBlockElements) {
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", '<div class="panel-block is-block' +
(expandedLotTypes.has(lotTypeId) ? "" : " is-hidden") +
panelElement.insertAdjacentHTML('beforeend', '<div class="panel-block is-block' +
(expandedLotTypes.has(lotTypeId) ? '' : ' is-hidden') +
'">' +
'<div class="message is-info">' +
'<p class="message-body">There are no additional fields.</p>' +
"</div>" +
"</div>");
'</div>' +
'</div>');
}
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 =
'<div class="level is-mobile">' +
'<div class="level-left">' +
('<div class="level-item">' +
'<a class="has-text-weight-bold button--editLotTypeField" href="#">' +
cityssm.escapeHTML(lotTypeField.lotTypeField || "") +
"</a>" +
"</div>") +
"</div>" +
cityssm.escapeHTML(lotTypeField.lotTypeField || '') +
'</a>' +
'</div>') +
'</div>' +
'<div class="level-right">' +
('<div class="level-item">' +
los.getMoveUpDownButtonFieldHTML("button--moveLotTypeFieldUp", "button--moveLotTypeFieldDown") +
"</div>") +
"</div>" +
"</div>";
los.getMoveUpDownButtonFieldHTML('button--moveLotTypeFieldUp', 'button--moveLotTypeFieldDown') +
'</div>') +
'</div>' +
'</div>';
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", `<div class="message is-warning>
containerElement.insertAdjacentHTML('afterbegin', `<div class="message is-warning>
<p class="message-body">There are no active ${los.escapedAliases.lot} types.</p>
</div>`);
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 =
'<div class="panel-heading">' +
@ -314,64 +307,66 @@ Object.defineProperty(exports, "__esModule", { value: true });
(expandedLotTypes.has(lotType.lotTypeId)
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>') +
"</button>" +
"</div>" +
'</button>' +
'</div>' +
'<div class="level-item">' +
'<h2 class="title is-4">' +
cityssm.escapeHTML(lotType.lotType) +
"</h2>" +
"</div>" +
"</div>") +
'</h2>' +
'</div>' +
'</div>') +
('<div class="level-right">' +
('<div class="level-item">' +
'<button class="button is-danger is-small button--deleteLotType" type="button">' +
'<span class="icon is-small"><i class="fas fa-trash" aria-hidden="true"></i></span>' +
"<span>Delete</span>" +
"</button>" +
"</div>") +
'<span>Delete</span>' +
'</button>' +
'</div>') +
('<div class="level-item">' +
'<button class="button is-primary is-small button--editLotType" type="button">' +
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
"<span>Edit " +
'<span>Edit ' +
exports.aliases.lot +
" Type</span>" +
"</button>" +
"</div>") +
' Type</span>' +
'</button>' +
'</div>') +
('<div class="level-item">' +
'<button class="button is-success is-small button--addLotTypeField" type="button">' +
'<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>' +
"<span>Add Field</span>" +
"</button>" +
"</div>") +
'<span>Add Field</span>' +
'</button>' +
'</div>') +
('<div class="level-item">' +
los.getMoveUpDownButtonFieldHTML("button--moveLotTypeUp", "button--moveLotTypeDown") +
"</div>") +
"</div>") +
"</div>" +
"</div>";
los.getMoveUpDownButtonFieldHTML('button--moveLotTypeUp', 'button--moveLotTypeDown') +
'</div>') +
'</div>') +
'</div>' +
'</div>';
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() {

File diff suppressed because it is too large Load Diff

View File

@ -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)
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>';
const panelBlockElements = occupancyTypeElement.querySelectorAll(".panel-block");
const panelBlockElements = occupancyTypeElement.querySelectorAll('.panel-block');
for (const panelBlockElement of panelBlockElements) {
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", '<div class="panel-block is-block' +
panelElement.insertAdjacentHTML('beforeend', '<div class="panel-block is-block' +
(!occupancyTypeId || expandedOccupancyTypes.has(occupancyTypeId)
? ""
: " is-hidden") +
? ''
: ' is-hidden') +
'">' +
'<div class="message is-info">' +
'<p class="message-body">There are no additional fields.</p>' +
"</div>" +
"</div>");
'</div>' +
'</div>');
}
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 });
'<div class="level-left">' +
('<div class="level-item">' +
'<a class="has-text-weight-bold button--editOccupancyTypeField" href="#">' +
cityssm.escapeHTML(occupancyTypeField.occupancyTypeField || "") +
"</a>" +
"</div>") +
"</div>" +
cityssm.escapeHTML(occupancyTypeField.occupancyTypeField || '') +
'</a>' +
'</div>') +
'</div>' +
'<div class="level-right">' +
('<div class="level-item">' +
los.getMoveUpDownButtonFieldHTML("button--moveOccupancyTypeFieldUp", "button--moveOccupancyTypeFieldDown") +
"</div>") +
"</div>" +
"</div>";
los.getMoveUpDownButtonFieldHTML('button--moveOccupancyTypeFieldUp', 'button--moveOccupancyTypeFieldDown') +
'</div>') +
'</div>' +
'</div>';
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", `<div class="panel-block is-block">
panelElement.insertAdjacentHTML('beforeend', `<div class="panel-block is-block">
<div class="message is-info">
<p class="message-body">There are no prints associated with this record.</p>
</div>
@ -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 =
'<div class="level is-mobile">' +
@ -390,28 +396,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
'<i class="fas fa-fw ' +
printIconClass +
'" aria-hidden="true"></i>' +
"</div>") +
'</div>') +
('<div class="level-item">' +
cityssm.escapeHTML(printTitle || printEJS) +
"</div>") +
"</div>" +
'</div>') +
'</div>' +
'<div class="level-right">' +
('<div class="level-item">' +
los.getMoveUpDownButtonFieldHTML("button--moveOccupancyTypePrintUp", "button--moveOccupancyTypePrintDown") +
"</div>") +
los.getMoveUpDownButtonFieldHTML('button--moveOccupancyTypePrintUp', 'button--moveOccupancyTypePrintDown') +
'</div>') +
('<div class="level-item">' +
'<button class="button is-small is-danger button--deleteOccupancyTypePrint" data-tooltip="Delete" type="button" aria-label="Delete Print">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" +
"</div>" +
"</div>") +
"</div>" +
"</div>";
panelBlockElement.querySelector(".button--moveOccupancyTypePrintUp").addEventListener("click", moveOccupancyTypePrint);
panelBlockElement.querySelector(".button--moveOccupancyTypePrintDown").addEventListener("click", moveOccupancyTypePrint);
'</button>' +
'</div>' +
'</div>') +
'</div>' +
'</div>';
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 });
'<div class="level-item">' +
('<h2 class="title is-4">(All ' +
cityssm.escapeHTML(exports.aliases.occupancy) +
" Types)</h2>") +
"</div>" +
"</div>") +
' Types)</h2>') +
'</div>' +
'</div>') +
('<div class="level-right">' +
('<div class="level-item">' +
'<button class="button is-success is-small button--addOccupancyTypeField" type="button">' +
'<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>' +
"<span>Add Field</span>" +
"</button>" +
"</div>") +
"</div>") +
"</div>") +
"</div>" +
"</div>";
occupancyTypePrintsContainerElement.innerHTML = "";
renderOccupancyTypeFields(occupancyTypesContainerElement.querySelector("#container--allOccupancyTypeFields"), undefined, allOccupancyTypeFields);
'<span>Add Field</span>' +
'</button>' +
'</div>') +
'</div>') +
'</div>') +
'</div>' +
'</div>';
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", `<div class="message is-warning>
occupancyTypesContainerElement.insertAdjacentHTML('afterbegin', `<div class="message is-warning>
<p class="message-body">There are no active ${los.escapedAliases.occupancy} types.</p>
</div>`);
occupancyTypePrintsContainerElement.insertAdjacentHTML("afterbegin", `<div class="message is-warning>
occupancyTypePrintsContainerElement.insertAdjacentHTML('afterbegin', `<div class="message is-warning>
<p class="message-body">There are no active ${los.escapedAliases.occupancy} types.</p>
</div>`);
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)
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>') +
"</button>" +
"</div>" +
'</button>' +
'</div>' +
'<div class="level-item">' +
'<h2 class="title is-4">' +
cityssm.escapeHTML(occupancyType.occupancyType) +
"</h2>" +
"</div>" +
"</div>") +
'</h2>' +
'</div>' +
'</div>') +
('<div class="level-right">' +
('<div class="level-item">' +
'<button class="button is-danger is-small button--deleteOccupancyType" type="button">' +
'<span class="icon is-small"><i class="fas fa-trash" aria-hidden="true"></i></span>' +
"<span>Delete</span>" +
"</button>" +
"</div>") +
'<span>Delete</span>' +
'</button>' +
'</div>') +
('<div class="level-item">' +
'<button class="button is-primary is-small button--editOccupancyType" type="button">' +
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
"<span>Edit " +
'<span>Edit ' +
exports.aliases.occupancy +
" Type</span>" +
"</button>" +
"</div>") +
' Type</span>' +
'</button>' +
'</div>') +
('<div class="level-item">' +
'<button class="button is-success is-small button--addOccupancyTypeField" type="button">' +
'<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>' +
"<span>Add Field</span>" +
"</button>" +
"</div>") +
'<span>Add Field</span>' +
'</button>' +
'</div>') +
('<div class="level-item">' +
los.getMoveUpDownButtonFieldHTML("button--moveOccupancyTypeUp", "button--moveOccupancyTypeDown") +
"</div>") +
"</div>") +
"</div>" +
"</div>";
los.getMoveUpDownButtonFieldHTML('button--moveOccupancyTypeUp', 'button--moveOccupancyTypeDown') +
'</div>') +
'</div>') +
'</div>' +
'</div>';
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 });
'<div class="level-item">' +
'<h2 class="title is-4">' +
cityssm.escapeHTML(occupancyType.occupancyType) +
"</h2>" +
"</div>" +
"</div>") +
'</h2>' +
'</div>' +
'</div>') +
('<div class="level-right">' +
('<div class="level-item">' +
'<button class="button is-success is-small button--addOccupancyTypePrint" type="button">' +
'<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>' +
"<span>Add Print</span>" +
"</button>" +
"</div>") +
"</div>") +
"</div>" +
"</div>";
'<span>Add Print</span>' +
'</button>' +
'</div>') +
'</div>') +
'</div>' +
'</div>';
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: () => {

File diff suppressed because it is too large Load Diff

View File

@ -9,8 +9,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
const inputElement = changeEvent.currentTarget;
const fontAwesomeIconClass = inputElement.value;
inputElement
.closest(".field")
.querySelectorAll(".button.is-static")[1].innerHTML = `<i class="fas fa-fw fa-${fontAwesomeIconClass}" aria-hidden="true"></i>`;
.closest('.field')
.querySelectorAll('.button.is-static')[1].innerHTML = `<i class="fas fa-fw fa-${fontAwesomeIconClass}" aria-hidden="true"></i>`;
}
"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?<br />
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 = `<tr><td colspan="2">
<div class="message is-warning"><p class="message-body">There are no active work order types.</p></div>
</td></tr>`;
return;
}
containerElement.innerHTML = "";
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 =
"<td>" +
"<form>" +
'<td>' +
'<form>' +
'<input name="workOrderTypeId" type="hidden" value="' +
workOrderType.workOrderTypeId.toString() +
'" />' +
('<div class="field has-addons">' +
'<div class="control">' +
'<input class="input" name="workOrderType" type="text" value="' +
cityssm.escapeHTML(workOrderType.workOrderType || "") +
cityssm.escapeHTML(workOrderType.workOrderType || '') +
'" maxlength="100" aria-label="Work Order Type" required />' +
"</div>" +
'</div>' +
'<div class="control">' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
"</div>" +
"</div>") +
"</form>" +
"</td>" +
'</div>' +
'</div>') +
'</form>' +
'</td>' +
'<td class="is-nowrap">' +
'<div class="field is-grouped">' +
'<div class="control">' +
los.getMoveUpDownButtonFieldHTML("button--moveWorkOrderTypeUp", "button--moveWorkOrderTypeDown", false) +
"</div>" +
los.getMoveUpDownButtonFieldHTML('button--moveWorkOrderTypeUp', 'button--moveWorkOrderTypeDown', false) +
'</div>' +
'<div class="control">' +
'<button class="button is-danger is-light button--deleteWorkOrderType" data-tooltip="Delete Work Order Type" type="button" aria-label="Delete Work Order Type">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" +
"</div>" +
"</div>" +
"</td>";
tableRowElement.querySelector("form").addEventListener("submit", updateWorkOrderType);
tableRowElement.querySelector(".button--moveWorkOrderTypeUp").addEventListener("click", moveWorkOrderType);
tableRowElement.querySelector(".button--moveWorkOrderTypeDown").addEventListener("click", moveWorkOrderType);
'</button>' +
'</div>' +
'</div>' +
'</td>';
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?<br />
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 = `<tr><td colspan="2">
<div class="message is-warning"><p class="message-body">There are no active work order milestone types.</p></div>
</td></tr>`;
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 =
"<td>" +
"<form>" +
'<td>' +
'<form>' +
'<input name="workOrderMilestoneTypeId" type="hidden" value="' +
workOrderMilestoneType.workOrderMilestoneTypeId.toString() +
'" />' +
@ -286,49 +286,49 @@ Object.defineProperty(exports, "__esModule", { value: true });
'<input class="input" name="workOrderMilestoneType" type="text" value="' +
cityssm.escapeHTML(workOrderMilestoneType.workOrderMilestoneType) +
'" maxlength="100" aria-label="Work Order Milestone Type" required />' +
"</div>" +
'</div>' +
'<div class="control">' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
"</div>" +
"</div>") +
"</form>" +
"</td>" +
'</div>' +
'</div>') +
'</form>' +
'</td>' +
'<td class="is-nowrap">' +
'<div class="field is-grouped">' +
'<div class="control">' +
los.getMoveUpDownButtonFieldHTML("button--moveWorkOrderMilestoneTypeUp", "button--moveWorkOrderMilestoneTypeDown", false) +
"</div>" +
los.getMoveUpDownButtonFieldHTML('button--moveWorkOrderMilestoneTypeUp', 'button--moveWorkOrderMilestoneTypeDown', false) +
'</div>' +
'<div class="control">' +
'<button class="button is-danger is-light button--deleteWorkOrderMilestoneType" data-tooltip="Delete Mielstone Type" type="button" aria-label="Delete Milestone Type">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" +
"</div>" +
"</div>" +
"</td>";
tableRowElement.querySelector("form").addEventListener("submit", updateWorkOrderMilestoneType);
tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeUp").addEventListener("click", moveWorkOrderMilestoneType);
tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeDown").addEventListener("click", moveWorkOrderMilestoneType);
'</button>' +
'</div>' +
'</div>' +
'</td>';
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?<br />
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 = `<tr><td colspan="2">
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} statuses.</p></div>
</td></tr>`;
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 =
"<td>" +
"<form>" +
'<td>' +
'<form>' +
'<input name="lotStatusId" type="hidden" value="' +
lotStatus.lotStatusId.toString() +
'" />' +
@ -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 />' +
"</div>" +
'</div>' +
'<div class="control">' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
"</div>" +
"</div>") +
"</form>" +
"</td>" +
'</div>' +
'</div>') +
'</form>' +
'</td>' +
'<td class="is-nowrap">' +
'<div class="field is-grouped">' +
'<div class="control">' +
los.getMoveUpDownButtonFieldHTML("button--moveLotStatusUp", "button--moveLotStatusDown", false) +
"</div>" +
los.getMoveUpDownButtonFieldHTML('button--moveLotStatusUp', 'button--moveLotStatusDown', false) +
'</div>' +
'<div class="control">' +
'<button class="button is-danger is-light button--deleteLotStatus" data-tooltip="Delete Status" type="button" aria-label="Delete Status">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" +
"</div>" +
"</div>" +
"</td>";
tableRowElement.querySelector("form").addEventListener("submit", updateLotStatus);
tableRowElement.querySelector(".button--moveLotStatusUp").addEventListener("click", moveLotStatus);
tableRowElement.querySelector(".button--moveLotStatusDown").addEventListener("click", moveLotStatus);
tableRowElement.querySelector(".button--deleteLotStatus").addEventListener("click", deleteLotStatus);
'</button>' +
'</div>' +
'</div>' +
'</td>';
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?<br />
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 = `<tr><td colspan="3">
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} ${los.escapedAliases.occupant} types.</p></div>
</td></tr>`;
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 =
"<td>" +
'<td>' +
('<div class="field">' +
'<div class="control">' +
'<input class="input" name="lotOccupantType" type="text"' +
(' value="' + cityssm.escapeHTML(lotOccupantType.lotOccupantType) + '"') +
(' form="' + formId + '"') +
(' aria-label="' +
cityssm.escapeHTML(exports.aliases.lot + " " + exports.aliases.occupant) +
cityssm.escapeHTML(exports.aliases.lot + ' ' + exports.aliases.occupant) +
' Type"') +
' maxlength="100" required />' +
"</div>" +
"</div>") +
"</td>" +
"<td>" +
'</div>' +
'</div>') +
'</td>' +
'<td>' +
('<div class="field has-addons">' +
'<div class="control"><span class="button is-static">fa-</span></div>' +
'<div class="control">' +
@ -621,70 +619,70 @@ Object.defineProperty(exports, "__esModule", { value: true });
' list="datalist--fontAwesomeIconClass"' +
' aria-label="Icon Name"' +
' maxlength="50" />' +
"</div>" +
'</div>' +
'<div class="control"><span class="button is-static">' +
'<i class="fas fa-fw fa-' +
cityssm.escapeHTML(lotOccupantType.fontAwesomeIconClass) +
'"></i></span></div>' +
"</div>") +
"</td>" +
("<td>" +
'</div>') +
'</td>' +
('<td>' +
('<form id="' + formId + '">') +
'<input name="lotOccupantTypeId" type="hidden"' +
(' value="' + lotOccupantType.lotOccupantTypeId.toString() + '"') +
" />" +
' />' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
"</form>" +
"</td>") +
'</form>' +
'</td>') +
'<td class="is-nowrap">' +
'<div class="field is-grouped">' +
'<div class="control">' +
los.getMoveUpDownButtonFieldHTML("button--moveLotOccupantTypeUp", "button--moveLotOccupantTypeDown", false) +
"</div>" +
los.getMoveUpDownButtonFieldHTML('button--moveLotOccupantTypeUp', 'button--moveLotOccupantTypeDown', false) +
'</div>' +
'<div class="control">' +
'<button class="button is-danger is-light button--deleteLotOccupantType"' +
' data-tooltip="Delete ' +
los.escapedAliases.Lot +
" " +
' ' +
los.escapedAliases.Occupant +
' Type" type="button"' +
' aria-label="Delete ' +
los.escapedAliases.Lot +
" " +
' ' +
los.escapedAliases.Occupant +
' Type">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" +
"</div>" +
"</div>" +
"</td>";
'</button>' +
'</div>' +
'</div>' +
'</td>';
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'
});
}
});

View File

@ -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 = `<i class="fas fa-fw fa-${fontAwesomeIconClass}" aria-hidden="true"></i>`;
.closest('.field')
.querySelectorAll('.button.is-static')[1].innerHTML = `<i class="fas fa-fw fa-${fontAwesomeIconClass}" aria-hidden="true"></i>`;
}
//=include adminTablesWorkOrderTypes.js
//=include adminTablesWorkOrderMilestoneTypes.js

View File

@ -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 = `<i class="fas fa-fw fa-${fontAwesomeIconClass}" aria-hidden="true"></i>`;
}
inputElement
.closest('.field')!
.querySelectorAll(
'.button.is-static'
)[1].innerHTML = `<i class="fas fa-fw fa-${fontAwesomeIconClass}" aria-hidden="true"></i>`
}
//=include adminTablesWorkOrderTypes.js
//=include adminTablesWorkOrderMilestoneTypes.js
//=include adminTablesLotStatuses.js
//=include adminTablesLotOccupantTypes.js
})();
//=include adminTablesWorkOrderTypes.js
//=include adminTablesWorkOrderMilestoneTypes.js
//=include adminTablesLotStatuses.js
//=include adminTablesLotOccupantTypes.js
})()

View File

@ -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?<br />
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 = `<tr><td colspan="3">
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} ${los.escapedAliases.occupant} types.</p></div>
</td></tr>`;
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 =
"<td>" +
'<td>' +
('<div class="field">' +
'<div class="control">' +
'<input class="input" name="lotOccupantType" type="text"' +
(' value="' + cityssm.escapeHTML(lotOccupantType.lotOccupantType) + '"') +
(' form="' + formId + '"') +
(' aria-label="' +
cityssm.escapeHTML(exports.aliases.lot + " " + exports.aliases.occupant) +
cityssm.escapeHTML(exports.aliases.lot + ' ' + exports.aliases.occupant) +
' Type"') +
' maxlength="100" required />' +
"</div>" +
"</div>") +
"</td>" +
"<td>" +
'</div>' +
'</div>') +
'</td>' +
'<td>' +
('<div class="field has-addons">' +
'<div class="control"><span class="button is-static">fa-</span></div>' +
'<div class="control">' +
@ -125,70 +123,70 @@ const renderLotOccupantTypes = () => {
' list="datalist--fontAwesomeIconClass"' +
' aria-label="Icon Name"' +
' maxlength="50" />' +
"</div>" +
'</div>' +
'<div class="control"><span class="button is-static">' +
'<i class="fas fa-fw fa-' +
cityssm.escapeHTML(lotOccupantType.fontAwesomeIconClass) +
'"></i></span></div>' +
"</div>") +
"</td>" +
("<td>" +
'</div>') +
'</td>' +
('<td>' +
('<form id="' + formId + '">') +
'<input name="lotOccupantTypeId" type="hidden"' +
(' value="' + lotOccupantType.lotOccupantTypeId.toString() + '"') +
" />" +
' />' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
"</form>" +
"</td>") +
'</form>' +
'</td>') +
'<td class="is-nowrap">' +
'<div class="field is-grouped">' +
'<div class="control">' +
los.getMoveUpDownButtonFieldHTML("button--moveLotOccupantTypeUp", "button--moveLotOccupantTypeDown", false) +
"</div>" +
los.getMoveUpDownButtonFieldHTML('button--moveLotOccupantTypeUp', 'button--moveLotOccupantTypeDown', false) +
'</div>' +
'<div class="control">' +
'<button class="button is-danger is-light button--deleteLotOccupantType"' +
' data-tooltip="Delete ' +
los.escapedAliases.Lot +
" " +
' ' +
los.escapedAliases.Occupant +
' Type" type="button"' +
' aria-label="Delete ' +
los.escapedAliases.Lot +
" " +
' ' +
los.escapedAliases.Occupant +
' Type">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" +
"</div>" +
"</div>" +
"</td>";
'</button>' +
'</div>' +
'</div>' +
'</td>';
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'
});
}
});

View File

@ -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?<br />
Note that no ${los.escapedAliases.lot} ${los.escapedAliases.occupants} will be removed.`,
messageIsHtml: true,
contextualColorName: "warning",
okButton: {
text: `Yes, Delete ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
callbackFunction: doDelete
bulmaJS.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?<br />
Note that no ${los.escapedAliases.lot} ${los.escapedAliases.occupants} will be removed.`,
messageIsHtml: true,
contextualColorName: 'warning',
okButton: {
text: `Yes, Delete ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
callbackFunction: doDelete
}
})
}
const moveLotOccupantType = (clickEvent: MouseEvent) => {
const 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 = `<tr><td colspan="3">
if (lotOccupantTypes.length === 0) {
containerElement.innerHTML = `<tr><td colspan="3">
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} ${los.escapedAliases.occupant} types.</p></div>
</td></tr>`;
</td></tr>`
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 =
"<td>" +
('<div class="field">' +
'<div class="control">' +
'<input class="input" name="lotOccupantType" type="text"' +
(' value="' + cityssm.escapeHTML(lotOccupantType.lotOccupantType) + '"') +
(' form="' + formId + '"') +
(' aria-label="' +
cityssm.escapeHTML(exports.aliases.lot + " " + exports.aliases.occupant) +
' Type"') +
' maxlength="100" required />' +
"</div>" +
"</div>") +
"</td>" +
"<td>" +
('<div class="field has-addons">' +
'<div class="control"><span class="button is-static">fa-</span></div>' +
'<div class="control">' +
'<input class="input" name="fontAwesomeIconClass" type="text"' +
(' value="' + cityssm.escapeHTML(lotOccupantType.fontAwesomeIconClass) + '"') +
(' form="' + formId + '"') +
' list="datalist--fontAwesomeIconClass"' +
' aria-label="Icon Name"' +
' maxlength="50" />' +
"</div>" +
'<div class="control"><span class="button is-static">' +
'<i class="fas fa-fw fa-' +
cityssm.escapeHTML(lotOccupantType.fontAwesomeIconClass) +
'"></i></span></div>' +
"</div>") +
"</td>" +
("<td>" +
('<form id="' + formId + '">') +
'<input name="lotOccupantTypeId" type="hidden"' +
(' value="' + lotOccupantType.lotOccupantTypeId.toString() + '"') +
" />" +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
"</form>" +
"</td>") +
'<td class="is-nowrap">' +
'<div class="field is-grouped">' +
'<div class="control">' +
los.getMoveUpDownButtonFieldHTML(
"button--moveLotOccupantTypeUp",
"button--moveLotOccupantTypeDown",
false
) +
"</div>" +
'<div class="control">' +
'<button class="button is-danger is-light button--deleteLotOccupantType"' +
' data-tooltip="Delete ' +
los.escapedAliases.Lot +
" " +
los.escapedAliases.Occupant +
' Type" type="button"' +
' aria-label="Delete ' +
los.escapedAliases.Lot +
" " +
los.escapedAliases.Occupant +
' Type">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" +
"</div>" +
"</div>" +
"</td>";
tableRowElement.innerHTML =
'<td>' +
('<div class="field">' +
'<div class="control">' +
'<input class="input" name="lotOccupantType" type="text"' +
(' value="' + cityssm.escapeHTML(lotOccupantType.lotOccupantType) + '"') +
(' form="' + formId + '"') +
(' aria-label="' +
cityssm.escapeHTML(exports.aliases.lot + ' ' + exports.aliases.occupant) +
' Type"') +
' maxlength="100" required />' +
'</div>' +
'</div>') +
'</td>' +
'<td>' +
('<div class="field has-addons">' +
'<div class="control"><span class="button is-static">fa-</span></div>' +
'<div class="control">' +
'<input class="input" name="fontAwesomeIconClass" type="text"' +
(' value="' + cityssm.escapeHTML(lotOccupantType.fontAwesomeIconClass) + '"') +
(' form="' + formId + '"') +
' list="datalist--fontAwesomeIconClass"' +
' aria-label="Icon Name"' +
' maxlength="50" />' +
'</div>' +
'<div class="control"><span class="button is-static">' +
'<i class="fas fa-fw fa-' +
cityssm.escapeHTML(lotOccupantType.fontAwesomeIconClass) +
'"></i></span></div>' +
'</div>') +
'</td>' +
('<td>' +
('<form id="' + formId + '">') +
'<input name="lotOccupantTypeId" type="hidden"' +
(' value="' + lotOccupantType.lotOccupantTypeId.toString() + '"') +
' />' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
'</form>' +
'</td>') +
'<td class="is-nowrap">' +
'<div class="field is-grouped">' +
'<div class="control">' +
los.getMoveUpDownButtonFieldHTML(
'button--moveLotOccupantTypeUp',
'button--moveLotOccupantTypeDown',
false
) +
'</div>' +
'<div class="control">' +
'<button class="button is-danger is-light button--deleteLotOccupantType"' +
' data-tooltip="Delete ' +
los.escapedAliases.Lot +
' ' +
los.escapedAliases.Occupant +
' Type" type="button"' +
' aria-label="Delete ' +
los.escapedAliases.Lot +
' ' +
los.escapedAliases.Occupant +
' Type">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
'</button>' +
'</div>' +
'</div>' +
'</td>'
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()

View File

@ -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?<br />
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 = `<tr><td colspan="2">
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} statuses.</p></div>
</td></tr>`;
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 =
"<td>" +
"<form>" +
'<td>' +
'<form>' +
'<input name="lotStatusId" type="hidden" value="' +
lotStatus.lotStatusId.toString() +
'" />' +
@ -110,47 +110,47 @@ const renderLotStatuses = () => {
(' value="' + cityssm.escapeHTML(lotStatus.lotStatus) + '"') +
(' aria-label="' + cityssm.escapeHTML(exports.aliases.lot) + ' Status"') +
' maxlength="100" required />' +
"</div>" +
'</div>' +
'<div class="control">' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
"</div>" +
"</div>") +
"</form>" +
"</td>" +
'</div>' +
'</div>') +
'</form>' +
'</td>' +
'<td class="is-nowrap">' +
'<div class="field is-grouped">' +
'<div class="control">' +
los.getMoveUpDownButtonFieldHTML("button--moveLotStatusUp", "button--moveLotStatusDown", false) +
"</div>" +
los.getMoveUpDownButtonFieldHTML('button--moveLotStatusUp', 'button--moveLotStatusDown', false) +
'</div>' +
'<div class="control">' +
'<button class="button is-danger is-light button--deleteLotStatus" data-tooltip="Delete Status" type="button" aria-label="Delete Status">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" +
"</div>" +
"</div>" +
"</td>";
tableRowElement.querySelector("form").addEventListener("submit", updateLotStatus);
tableRowElement.querySelector(".button--moveLotStatusUp").addEventListener("click", moveLotStatus);
tableRowElement.querySelector(".button--moveLotStatusDown").addEventListener("click", moveLotStatus);
tableRowElement.querySelector(".button--deleteLotStatus").addEventListener("click", deleteLotStatus);
'</button>' +
'</div>' +
'</div>' +
'</td>';
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'
});
}
});

View File

@ -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?<br />
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?<br />
Note that no ${los.escapedAliases.lot} will be removed.`,
messageIsHtml: true,
contextualColorName: 'warning',
okButton: {
text: 'Yes, Delete Status',
callbackFunction: doDelete
}
})
}
const moveLotStatus = (clickEvent: MouseEvent) => {
const 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 = `<tr><td colspan="2">
if (lotStatuses.length === 0) {
containerElement.innerHTML = `<tr><td colspan="2">
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} statuses.</p></div>
</td></tr>`;
</td></tr>`
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 =
"<td>" +
"<form>" +
'<input name="lotStatusId" type="hidden" value="' +
lotStatus.lotStatusId.toString() +
'" />' +
('<div class="field has-addons">' +
'<div class="control">' +
'<input class="input" name="lotStatus" type="text"' +
(' value="' + cityssm.escapeHTML(lotStatus.lotStatus) + '"') +
(' aria-label="' + cityssm.escapeHTML(exports.aliases.lot) + ' Status"') +
' maxlength="100" required />' +
"</div>" +
'<div class="control">' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
"</div>" +
"</div>") +
"</form>" +
"</td>" +
'<td class="is-nowrap">' +
'<div class="field is-grouped">' +
'<div class="control">' +
los.getMoveUpDownButtonFieldHTML("button--moveLotStatusUp", "button--moveLotStatusDown", false) +
"</div>" +
'<div class="control">' +
'<button class="button is-danger is-light button--deleteLotStatus" data-tooltip="Delete Status" type="button" aria-label="Delete Status">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" +
"</div>" +
"</div>" +
"</td>";
tableRowElement.innerHTML =
'<td>' +
'<form>' +
'<input name="lotStatusId" type="hidden" value="' +
lotStatus.lotStatusId.toString() +
'" />' +
('<div class="field has-addons">' +
'<div class="control">' +
'<input class="input" name="lotStatus" type="text"' +
(' value="' + cityssm.escapeHTML(lotStatus.lotStatus) + '"') +
(' aria-label="' + cityssm.escapeHTML(exports.aliases.lot) + ' Status"') +
' maxlength="100" required />' +
'</div>' +
'<div class="control">' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
'</div>' +
'</div>') +
'</form>' +
'</td>' +
'<td class="is-nowrap">' +
'<div class="field is-grouped">' +
'<div class="control">' +
los.getMoveUpDownButtonFieldHTML('button--moveLotStatusUp', 'button--moveLotStatusDown', false) +
'</div>' +
'<div class="control">' +
'<button class="button is-danger is-light button--deleteLotStatus" data-tooltip="Delete Status" type="button" aria-label="Delete Status">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
'</button>' +
'</div>' +
'</div>' +
'</td>'
tableRowElement.querySelector("form")!.addEventListener("submit", updateLotStatus);
tableRowElement.querySelector('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()

View File

@ -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?<br />
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 = `<tr><td colspan="2">
<div class="message is-warning"><p class="message-body">There are no active work order milestone types.</p></div>
</td></tr>`;
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 =
"<td>" +
"<form>" +
'<td>' +
'<form>' +
'<input name="workOrderMilestoneTypeId" type="hidden" value="' +
workOrderMilestoneType.workOrderMilestoneTypeId.toString() +
'" />' +
@ -112,49 +112,49 @@ const renderWorkOrderMilestoneTypes = () => {
'<input class="input" name="workOrderMilestoneType" type="text" value="' +
cityssm.escapeHTML(workOrderMilestoneType.workOrderMilestoneType) +
'" maxlength="100" aria-label="Work Order Milestone Type" required />' +
"</div>" +
'</div>' +
'<div class="control">' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
"</div>" +
"</div>") +
"</form>" +
"</td>" +
'</div>' +
'</div>') +
'</form>' +
'</td>' +
'<td class="is-nowrap">' +
'<div class="field is-grouped">' +
'<div class="control">' +
los.getMoveUpDownButtonFieldHTML("button--moveWorkOrderMilestoneTypeUp", "button--moveWorkOrderMilestoneTypeDown", false) +
"</div>" +
los.getMoveUpDownButtonFieldHTML('button--moveWorkOrderMilestoneTypeUp', 'button--moveWorkOrderMilestoneTypeDown', false) +
'</div>' +
'<div class="control">' +
'<button class="button is-danger is-light button--deleteWorkOrderMilestoneType" data-tooltip="Delete Mielstone Type" type="button" aria-label="Delete Milestone Type">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" +
"</div>" +
"</div>" +
"</td>";
tableRowElement.querySelector("form").addEventListener("submit", updateWorkOrderMilestoneType);
tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeUp").addEventListener("click", moveWorkOrderMilestoneType);
tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeDown").addEventListener("click", moveWorkOrderMilestoneType);
'</button>' +
'</div>' +
'</div>' +
'</td>';
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'
});
}
});

View File

@ -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?<br />
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?<br />
Note that no work orders will be removed.`,
messageIsHtml: true,
contextualColorName: 'warning',
okButton: {
text: 'Yes, Delete Work Order Milestone Type',
callbackFunction: doDelete
}
})
}
const moveWorkOrderMilestoneType = (clickEvent: MouseEvent) => {
const 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 = `<tr><td colspan="2">
if (workOrderMilestoneTypes.length === 0) {
containerElement.innerHTML = `<tr><td colspan="2">
<div class="message is-warning"><p class="message-body">There are no active work order milestone types.</p></div>
</td></tr>`;
</td></tr>`
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 =
"<td>" +
"<form>" +
'<input name="workOrderMilestoneTypeId" type="hidden" value="' +
workOrderMilestoneType.workOrderMilestoneTypeId.toString() +
'" />' +
('<div class="field has-addons">' +
'<div class="control">' +
'<input class="input" name="workOrderMilestoneType" type="text" value="' +
cityssm.escapeHTML(workOrderMilestoneType.workOrderMilestoneType) +
'" maxlength="100" aria-label="Work Order Milestone Type" required />' +
"</div>" +
'<div class="control">' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
"</div>" +
"</div>") +
"</form>" +
"</td>" +
'<td class="is-nowrap">' +
'<div class="field is-grouped">' +
'<div class="control">' +
los.getMoveUpDownButtonFieldHTML(
"button--moveWorkOrderMilestoneTypeUp",
"button--moveWorkOrderMilestoneTypeDown",
false
) +
"</div>" +
'<div class="control">' +
'<button class="button is-danger is-light button--deleteWorkOrderMilestoneType" data-tooltip="Delete Mielstone Type" type="button" aria-label="Delete Milestone Type">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" +
"</div>" +
"</div>" +
"</td>";
tableRowElement.innerHTML =
'<td>' +
'<form>' +
'<input name="workOrderMilestoneTypeId" type="hidden" value="' +
workOrderMilestoneType.workOrderMilestoneTypeId.toString() +
'" />' +
('<div class="field has-addons">' +
'<div class="control">' +
'<input class="input" name="workOrderMilestoneType" type="text" value="' +
cityssm.escapeHTML(workOrderMilestoneType.workOrderMilestoneType) +
'" maxlength="100" aria-label="Work Order Milestone Type" required />' +
'</div>' +
'<div class="control">' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
'</div>' +
'</div>') +
'</form>' +
'</td>' +
'<td class="is-nowrap">' +
'<div class="field is-grouped">' +
'<div class="control">' +
los.getMoveUpDownButtonFieldHTML(
'button--moveWorkOrderMilestoneTypeUp',
'button--moveWorkOrderMilestoneTypeDown',
false
) +
'</div>' +
'<div class="control">' +
'<button class="button is-danger is-light button--deleteWorkOrderMilestoneType" data-tooltip="Delete Mielstone Type" type="button" aria-label="Delete Milestone Type">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
'</button>' +
'</div>' +
'</div>' +
'</td>'
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()

View File

@ -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?<br />
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 = `<tr><td colspan="2">
<div class="message is-warning"><p class="message-body">There are no active work order types.</p></div>
</td></tr>`;
return;
}
containerElement.innerHTML = "";
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 =
"<td>" +
"<form>" +
'<td>' +
'<form>' +
'<input name="workOrderTypeId" type="hidden" value="' +
workOrderType.workOrderTypeId.toString() +
'" />' +
('<div class="field has-addons">' +
'<div class="control">' +
'<input class="input" name="workOrderType" type="text" value="' +
cityssm.escapeHTML(workOrderType.workOrderType || "") +
cityssm.escapeHTML(workOrderType.workOrderType || '') +
'" maxlength="100" aria-label="Work Order Type" required />' +
"</div>" +
'</div>' +
'<div class="control">' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
"</div>" +
"</div>") +
"</form>" +
"</td>" +
'</div>' +
'</div>') +
'</form>' +
'</td>' +
'<td class="is-nowrap">' +
'<div class="field is-grouped">' +
'<div class="control">' +
los.getMoveUpDownButtonFieldHTML("button--moveWorkOrderTypeUp", "button--moveWorkOrderTypeDown", false) +
"</div>" +
los.getMoveUpDownButtonFieldHTML('button--moveWorkOrderTypeUp', 'button--moveWorkOrderTypeDown', false) +
'</div>' +
'<div class="control">' +
'<button class="button is-danger is-light button--deleteWorkOrderType" data-tooltip="Delete Work Order Type" type="button" aria-label="Delete Work Order Type">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" +
"</div>" +
"</div>" +
"</td>";
tableRowElement.querySelector("form").addEventListener("submit", updateWorkOrderType);
tableRowElement.querySelector(".button--moveWorkOrderTypeUp").addEventListener("click", moveWorkOrderType);
tableRowElement.querySelector(".button--moveWorkOrderTypeDown").addEventListener("click", moveWorkOrderType);
'</button>' +
'</div>' +
'</div>' +
'</td>';
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'
});
}
});

View File

@ -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?<br />
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?<br />
Note that no work orders will be removed.`,
messageIsHtml: true,
contextualColorName: 'warning',
okButton: {
text: 'Yes, Delete Work Order Type',
callbackFunction: doDelete
}
})
}
const moveWorkOrderType = (clickEvent: MouseEvent) => {
const 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 = `<tr><td colspan="2">
if (workOrderTypes.length === 0) {
containerElement.innerHTML = `<tr><td colspan="2">
<div class="message is-warning"><p class="message-body">There are no active work order types.</p></div>
</td></tr>`;
</td></tr>`
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 =
"<td>" +
"<form>" +
'<input name="workOrderTypeId" type="hidden" value="' +
workOrderType.workOrderTypeId!.toString() +
'" />' +
('<div class="field has-addons">' +
'<div class="control">' +
'<input class="input" name="workOrderType" type="text" value="' +
cityssm.escapeHTML(workOrderType.workOrderType || "") +
'" maxlength="100" aria-label="Work Order Type" required />' +
"</div>" +
'<div class="control">' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
"</div>" +
"</div>") +
"</form>" +
"</td>" +
'<td class="is-nowrap">' +
'<div class="field is-grouped">' +
'<div class="control">' +
los.getMoveUpDownButtonFieldHTML(
"button--moveWorkOrderTypeUp",
"button--moveWorkOrderTypeDown",
false
) +
"</div>" +
'<div class="control">' +
'<button class="button is-danger is-light button--deleteWorkOrderType" data-tooltip="Delete Work Order Type" type="button" aria-label="Delete Work Order Type">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" +
"</div>" +
"</div>" +
"</td>";
tableRowElement.innerHTML =
'<td>' +
'<form>' +
'<input name="workOrderTypeId" type="hidden" value="' +
workOrderType.workOrderTypeId!.toString() +
'" />' +
('<div class="field has-addons">' +
'<div class="control">' +
'<input class="input" name="workOrderType" type="text" value="' +
cityssm.escapeHTML(workOrderType.workOrderType || '') +
'" maxlength="100" aria-label="Work Order Type" required />' +
'</div>' +
'<div class="control">' +
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
'</div>' +
'</div>') +
'</form>' +
'</td>' +
'<td class="is-nowrap">' +
'<div class="field is-grouped">' +
'<div class="control">' +
los.getMoveUpDownButtonFieldHTML(
'button--moveWorkOrderTypeUp',
'button--moveWorkOrderTypeDown',
false
) +
'</div>' +
'<div class="control">' +
'<button class="button is-danger is-light button--deleteWorkOrderType" data-tooltip="Delete Work Order Type" type="button" aria-label="Delete Work Order Type">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
'</button>' +
'</div>' +
'</div>' +
'</td>'
tableRowElement.querySelector("form")!.addEventListener("submit", updateWorkOrderType);
tableRowElement.querySelector('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()

View File

@ -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 || '');
}
})();

View File

@ -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<HTMLElement>;
const workOrderNumberCircleElements = document.querySelectorAll(
'.fa-circle[data-work-order-number'
) as NodeListOf<HTMLElement>
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 || ''
)
}
})()

View File

@ -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 = `<div class="message is-info">
<p class="message-body">Select the ${los.escapedAliases.lot} type to load the available fields.</p>
</div>`;
return;
}
cityssm.postJSON(los.urlPrefix + "/lots/doGetLotTypeFields", {
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 });
</div>`;
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 = `<label class="label" for="${fieldId}"></label>
<div class="control"></div>`;
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 = `<div class="select is-fullwidth">
fieldElement.querySelector('.control').innerHTML = `<div class="select is-fullwidth">
<select id="${fieldId}" name="${fieldName}"><option value="">(Not Set)</option></select>
</div>`;
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", `<input name="lotTypeFieldIds" type="hidden"
lotFieldsContainerElement.insertAdjacentHTML('beforeend', `<input name="lotTypeFieldIds" type="hidden"
value="${lotTypeFieldIds.slice(1)}" />`);
});
});
}
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 = `<div class="message is-info">
<p class="message-body">There are no comments to display.</p>
</div>`;
return;
}
const tableElement = document.createElement("table");
tableElement.className = "table is-fullwidth is-striped is-hoverable";
const tableElement = document.createElement('table');
tableElement.className = 'table is-fullwidth is-striped is-hoverable';
tableElement.innerHTML = `<thead><tr>
<th>Commentor</th>
<th>Comment Date</th>
@ -266,42 +266,48 @@ Object.defineProperty(exports, "__esModule", { value: true });
</tr></thead>
<tbody></tbody>`;
for (const lotComment of lotComments) {
const tableRowElement = document.createElement("tr");
const tableRowElement = document.createElement('tr');
tableRowElement.dataset.lotCommentId = lotComment.lotCommentId.toString();
tableRowElement.innerHTML =
"<td>" +
cityssm.escapeHTML(lotComment.recordCreate_userName || "") +
"</td>" +
"<td>" +
'<td>' +
cityssm.escapeHTML(lotComment.recordCreate_userName || '') +
'</td>' +
'<td>' +
lotComment.lotCommentDateString +
(lotComment.lotCommentTime === 0 ? "" : " " + lotComment.lotCommentTimeString) +
"</td>" +
"<td>" +
cityssm.escapeHTML(lotComment.lotComment || "") +
"</td>" +
(lotComment.lotCommentTime === 0
? ''
: ' ' + lotComment.lotCommentTimeString) +
'</td>' +
'<td>' +
cityssm.escapeHTML(lotComment.lotComment || '') +
'</td>' +
('<td class="is-hidden-print">' +
'<div class="buttons are-small is-justify-content-end">' +
('<button class="button is-primary button--edit" type="button">' +
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
" <span>Edit</span>" +
"</button>") +
' <span>Edit</span>' +
'</button>') +
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>") +
"</div>" +
"</td>");
tableRowElement.querySelector(".button--edit").addEventListener("click", openEditLotComment);
tableRowElement.querySelector(".button--delete").addEventListener("click", deleteLotComment);
tableElement.querySelector("tbody").append(tableRowElement);
'</button>') +
'</div>' +
'</td>');
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();
}
})();

View File

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

File diff suppressed because it is too large Load Diff

View File

@ -4,17 +4,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
(() => {
var _a, _b, _c;
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 = `<div class="message is-info">
<p class="message-body">Select the ${los.escapedAliases.occupancy} type to load the available fields.</p>
</div>`;
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 });
</div>`;
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 = `<label class="label" for="${fieldId}"></label><div class="control"></div>`;
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 =
'<div class="select is-fullwidth"><select id="' +
fieldId +
'" name="' +
fieldName +
'">' +
'<option value="">(Not Set)</option>' +
"</select></div>";
const selectElement = fieldElement.querySelector("select");
'</select></div>';
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", `<input name="occupancyTypeFieldIds" type="hidden" value="${occupancyTypeFieldIds.slice(1)}" />`);
lotOccupancyFieldsContainerElement.insertAdjacentHTML('beforeend', `<input name="occupancyTypeFieldIds" type="hidden" value="${occupancyTypeFieldIds.slice(1)}" />`);
});
});
}
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 = `<div class="message is-info">
<p class="message-body">No results.</p>
</div>`;
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 =
'<div class="columns">' +
('<div class="column">' +
cityssm.escapeHTML(lot.lotName || "") +
"<br />" +
cityssm.escapeHTML(lot.lotName || '') +
'<br />' +
'<span class="is-size-7">' +
cityssm.escapeHTML(lot.mapName || "") +
"</span>" +
"</div>") +
cityssm.escapeHTML(lot.mapName || '') +
'</span>' +
'</div>') +
('<div class="column">' +
cityssm.escapeHTML(lot.lotStatus) +
"<br />" +
'<br />' +
'<span class="is-size-7">' +
(lot.lotOccupancyCount > 0 ? "Currently Occupied" : "") +
"</span>" +
"</div>") +
"</div>";
panelBlockElement.addEventListener("click", selectExistingLot);
(lot.lotOccupancyCount > 0 ? 'Currently Occupied' : '') +
'</span>' +
'</div>') +
'</div>';
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);

File diff suppressed because it is too large Load Diff

View File

@ -4,15 +4,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
let lotOccupancyComments = exports.lotOccupancyComments;
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 =
'<div class="message is-info">' +
'<p class="message-body">There are no comments associated with this record.</p>' +
"</div>";
'</div>';
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 =
"<thead><tr>" +
"<th>Commentor</th>" +
"<th>Comment Date</th>" +
"<th>Comment</th>" +
'<thead><tr>' +
'<th>Commentor</th>' +
'<th>Comment Date</th>' +
'<th>Comment</th>' +
'<th class="is-hidden-print"><span class="is-sr-only">Options</span></th>' +
"</tr></thead>" +
"<tbody></tbody>";
'</tr></thead>' +
'<tbody></tbody>';
for (const lotOccupancyComment of lotOccupancyComments) {
const tableRowElement = document.createElement("tr");
const tableRowElement = document.createElement('tr');
tableRowElement.dataset.lotOccupancyCommentId =
lotOccupancyComment.lotOccupancyCommentId.toString();
tableRowElement.innerHTML =
"<td>" +
cityssm.escapeHTML(lotOccupancyComment.recordCreate_userName || "") +
"</td>" +
"<td>" +
'<td>' +
cityssm.escapeHTML(lotOccupancyComment.recordCreate_userName || '') +
'</td>' +
'<td>' +
lotOccupancyComment.lotOccupancyCommentDateString +
(lotOccupancyComment.lotOccupancyCommentTime === 0
? ""
: " " + lotOccupancyComment.lotOccupancyCommentTimeString) +
"</td>" +
"<td>" +
cityssm.escapeHTML(lotOccupancyComment.lotOccupancyComment || "") +
"</td>" +
? ''
: ' ' + lotOccupancyComment.lotOccupancyCommentTimeString) +
'</td>' +
'<td>' +
cityssm.escapeHTML(lotOccupancyComment.lotOccupancyComment || '') +
'</td>' +
('<td class="is-hidden-print">' +
'<div class="buttons are-small is-justify-content-end">' +
('<button class="button is-primary button--edit" type="button">' +
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
" <span>Edit</span>" +
"</button>") +
' <span>Edit</span>' +
'</button>') +
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>") +
"</div>" +
"</td>");
'</button>') +
'</div>' +
'</td>');
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: () => {

View File

@ -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 =
'<div class="message is-info">' +
'<p class="message-body">There are no comments associated with this record.</p>' +
"</div>";
return;
}
if (lotOccupancyComments.length === 0) {
containerElement.innerHTML =
'<div class="message is-info">' +
'<p class="message-body">There are no comments associated with this record.</p>' +
'</div>'
return
}
const tableElement = document.createElement("table");
tableElement.className = "table is-fullwidth is-striped is-hoverable";
tableElement.innerHTML =
"<thead><tr>" +
"<th>Commentor</th>" +
"<th>Comment Date</th>" +
"<th>Comment</th>" +
'<th class="is-hidden-print"><span class="is-sr-only">Options</span></th>' +
"</tr></thead>" +
"<tbody></tbody>";
const tableElement = document.createElement('table')
tableElement.className = 'table is-fullwidth is-striped is-hoverable'
tableElement.innerHTML =
'<thead><tr>' +
'<th>Commentor</th>' +
'<th>Comment Date</th>' +
'<th>Comment</th>' +
'<th class="is-hidden-print"><span class="is-sr-only">Options</span></th>' +
'</tr></thead>' +
'<tbody></tbody>'
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 =
"<td>" +
cityssm.escapeHTML(lotOccupancyComment.recordCreate_userName || "") +
"</td>" +
"<td>" +
lotOccupancyComment.lotOccupancyCommentDateString +
(lotOccupancyComment.lotOccupancyCommentTime === 0
? ""
: " " + lotOccupancyComment.lotOccupancyCommentTimeString) +
"</td>" +
"<td>" +
cityssm.escapeHTML(lotOccupancyComment.lotOccupancyComment || "") +
"</td>" +
('<td class="is-hidden-print">' +
'<div class="buttons are-small is-justify-content-end">' +
('<button class="button is-primary button--edit" type="button">' +
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
" <span>Edit</span>" +
"</button>") +
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>") +
"</div>" +
"</td>");
tableRowElement.innerHTML =
'<td>' +
cityssm.escapeHTML(lotOccupancyComment.recordCreate_userName || '') +
'</td>' +
'<td>' +
lotOccupancyComment.lotOccupancyCommentDateString +
(lotOccupancyComment.lotOccupancyCommentTime === 0
? ''
: ' ' + lotOccupancyComment.lotOccupancyCommentTimeString) +
'</td>' +
'<td>' +
cityssm.escapeHTML(lotOccupancyComment.lotOccupancyComment || '') +
'</td>' +
('<td class="is-hidden-print">' +
'<div class="buttons are-small is-justify-content-end">' +
('<button class="button is-primary button--edit" type="button">' +
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
' <span>Edit</span>' +
'</button>') +
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
'</button>') +
'</div>' +
'</td>')
tableRowElement
.querySelector(".button--edit")!
.addEventListener("click", 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()

View File

@ -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 =
'<div class="message is-info">' +
'<p class="message-body">There are no fees associated with this record.</p>' +
"</div>";
'</div>';
renderLotOccupancyTransactions();
return;
}
lotOccupancyFeesContainerElement.innerHTML =
'<table class="table is-fullwidth is-striped is-hoverable">' +
("<thead><tr>" +
"<th>Fee</th>" +
('<thead><tr>' +
'<th>Fee</th>' +
'<th><span class="is-sr-only">Unit Cost</span></th>' +
'<th class="has-width-1"><span class="is-sr-only">&times;</span></th>' +
'<th class="has-width-1"><span class="is-sr-only">Quantity</span></th>' +
'<th class="has-width-1"><span class="is-sr-only">equals</span></th>' +
'<th class="has-width-1 has-text-right">Total</th>' +
'<th class="has-width-1 is-hidden-print"><span class="is-sr-only">Options</span></th>' +
"</tr></thead>") +
"<tbody></tbody>" +
("<tfoot>" +
'</tr></thead>') +
'<tbody></tbody>' +
('<tfoot>' +
'<tr><th colspan="5">Subtotal</th><td class="has-text-weight-bold has-text-right" id="lotOccupancyFees--feeAmountTotal"></td><td class="is-hidden-print"></td></tr>' +
'<tr><th colspan="5">Tax</th><td class="has-text-right" id="lotOccupancyFees--taxAmountTotal"></td><td class="is-hidden-print"></td></tr>' +
'<tr><th colspan="5">Grand Total</th><td class="has-text-weight-bold has-text-right" id="lotOccupancyFees--grandTotal"></td><td class="is-hidden-print"></td></tr>' +
"</tfoot>") +
"</table>";
'</tfoot>') +
'</table>';
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 =
'<td colspan="' +
(lotOccupancyFee.quantity === 1 ? "5" : "1") +
(lotOccupancyFee.quantity === 1 ? '5' : '1') +
'">' +
cityssm.escapeHTML(lotOccupancyFee.feeName || "") +
"</td>" +
cityssm.escapeHTML(lotOccupancyFee.feeName || '') +
'</td>' +
(lotOccupancyFee.quantity === 1
? ""
? ''
: '<td class="has-text-right">$' +
lotOccupancyFee.feeAmount.toFixed(2) +
"</td>" +
"<td>&times;</td>" +
'</td>' +
'<td>&times;</td>' +
'<td class="has-text-right">' +
lotOccupancyFee.quantity +
"</td>" +
"<td>=</td>") +
'</td>' +
'<td>=</td>') +
'<td class="has-text-right">$' +
(lotOccupancyFee.feeAmount * lotOccupancyFee.quantity).toFixed(2) +
"</td>" +
'</td>' +
('<td class="is-hidden-print">' +
'<button class="button is-small is-danger is-light" data-tooltip="Delete Fee" type="button">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" +
"</td>");
tableRowElement.querySelector("button").addEventListener("click", deleteLotOccupancyFee);
lotOccupancyFeesContainerElement.querySelector("tbody").append(tableRowElement);
'</button>' +
'</td>');
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 =
'<h4 class="title is-5 mt-2">' +
cityssm.escapeHTML(feeCategory.feeCategory || "") +
"</h4>" +
cityssm.escapeHTML(feeCategory.feeCategory || '') +
'</h4>' +
'<div class="panel mb-5"></div>';
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 =
"<strong>" +
cityssm.escapeHTML(fee.feeName || "") +
"</strong><br />" +
"<small>" +
cityssm.escapeHTML(fee.feeDescription || "").replace(/\n/g, "<br />") +
"</small>";
panelBlockElement.addEventListener("click", tryAddFee);
categoryContainerElement.querySelector(".panel").append(panelBlockElement);
'<strong>' +
cityssm.escapeHTML(fee.feeName || '') +
'</strong><br />' +
'<small>' +
cityssm
.escapeHTML(fee.feeDescription || '')
.replace(/\n/g, '<br />') +
'</small>';
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 =
'<div class="message ' +
(lotOccupancyFees.length === 0 ? "is-info" : "is-warning") +
(lotOccupancyFees.length === 0 ? 'is-info' : 'is-warning') +
'">' +
'<p class="message-body">There are no transactions associated with this record.</p>' +
"</div>";
'</div>';
return;
}
lotOccupancyTransactionsContainerElement.innerHTML =
'<table class="table is-fullwidth is-striped is-hoverable">' +
"<thead><tr>" +
'<thead><tr>' +
'<th class="has-width-1">Date</th>' +
"<th>" +
'<th>' +
cityssm.escapeHTML(exports.aliases.externalReceiptNumber) +
"</th>" +
'</th>' +
'<th class="has-text-right has-width-1">Amount</th>' +
'<th class="has-width-1 is-hidden-print"><span class="is-sr-only">Options</span></th>' +
"</tr></thead>" +
"<tbody></tbody>" +
("<tfoot><tr>" +
'</tr></thead>' +
'<tbody></tbody>' +
('<tfoot><tr>' +
'<th colspan="2">Transaction Total</th>' +
'<td class="has-text-weight-bold has-text-right" id="lotOccupancyTransactions--grandTotal"></td>' +
'<td class="is-hidden-print"></td>' +
"</tr></tfoot>") +
"</table>";
'</tr></tfoot>') +
'</table>';
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 =
"<td>" +
'<td>' +
lotOccupancyTransaction.transactionDateString +
"</td>" +
("<td>" +
cityssm.escapeHTML(lotOccupancyTransaction.externalReceiptNumber || "") +
"<br />" +
"<small>" +
cityssm.escapeHTML(lotOccupancyTransaction.transactionNote || "") +
"</small>" +
"</td>") +
'</td>' +
('<td>' +
cityssm.escapeHTML(lotOccupancyTransaction.externalReceiptNumber || '') +
'<br />' +
'<small>' +
cityssm.escapeHTML(lotOccupancyTransaction.transactionNote || '') +
'</small>' +
'</td>') +
('<td class="has-text-right">$' +
lotOccupancyTransaction.transactionAmount.toFixed(2) +
"</td>") +
'</td>') +
('<td class="is-hidden-print">' +
'<button class="button is-small is-danger is-light" data-tooltip="Delete Transaction" type="button">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" +
"</td>");
'</button>' +
'</td>');
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", '<div class="message is-warning">' +
lotOccupancyTransactionsContainerElement.insertAdjacentHTML('afterbegin', '<div class="message is-warning">' +
'<div class="message-body">' +
'<div class="level">' +
'<div class="level-left"><div class="level-item">Outstanding Balance</div></div>' +
'<div class="level-right"><div class="level-item">$' +
(feeGrandTotal - transactionGrandTotal).toFixed(2) +
"</div></div>" +
"</div>" +
"</div>" +
"</div>");
'</div></div>' +
'</div>' +
'</div>' +
'</div>');
}
};
document.querySelector("#button--addTransaction").addEventListener("click", () => {
document
.querySelector('#button--addTransaction')
.addEventListener('click', () => {
let addCloseModalFunction;
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();

File diff suppressed because it is too large Load Diff

View File

@ -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 =
'<div class="message is-warning">' +
'<p class="message-body">There are no ' +
exports.aliases.occupants.toLowerCase() +
" associated with this record.</p>" +
"</div>";
' associated with this record.</p>' +
'</div>';
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 =
"<thead><tr>" +
("<th>" + exports.aliases.occupant + "</th>") +
"<th>Address</th>" +
"<th>Other Contact</th>" +
"<th>Comment</th>" +
'<thead><tr>' +
('<th>' + exports.aliases.occupant + '</th>') +
'<th>Address</th>' +
'<th>Other Contact</th>' +
'<th>Comment</th>' +
'<th class="is-hidden-print"><span class="is-sr-only">Options</span></th>' +
"</tr></thead>" +
"<tbody></tbody>";
'</tr></thead>' +
'<tbody></tbody>';
for (const lotOccupancyOccupant of lotOccupancyOccupants) {
const tableRowElement = document.createElement("tr");
const tableRowElement = document.createElement('tr');
tableRowElement.dataset.lotOccupantIndex =
lotOccupancyOccupant.lotOccupantIndex.toString();
tableRowElement.innerHTML =
"<td>" +
cityssm.escapeHTML(lotOccupancyOccupant.occupantName || "(No Name)") +
"<br />" +
'<td>' +
cityssm.escapeHTML(lotOccupancyOccupant.occupantName || '(No Name)') +
'<br />' +
('<span class="tag">' +
'<i class="fas fa-fw fa-' +
cityssm.escapeHTML(lotOccupancyOccupant.fontAwesomeIconClass) +
'" aria-hidden="true"></i>' +
' <span class="ml-1">' +
cityssm.escapeHTML(lotOccupancyOccupant.lotOccupantType) +
"</span>" +
"</span>") +
"</td>" +
("<td>" +
'</span>' +
'</span>') +
'</td>' +
('<td>' +
(lotOccupancyOccupant.occupantAddress1
? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress1) + "<br />"
: "") +
? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress1) + '<br />'
: '') +
(lotOccupancyOccupant.occupantAddress2
? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress2) + "<br />"
: "") +
? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress2) + '<br />'
: '') +
(lotOccupancyOccupant.occupantCity
? cityssm.escapeHTML(lotOccupancyOccupant.occupantCity) + ", "
: "") +
cityssm.escapeHTML(lotOccupancyOccupant.occupantProvince || "") +
"<br />" +
cityssm.escapeHTML(lotOccupancyOccupant.occupantPostalCode || "") +
"</td>") +
("<td>" +
? cityssm.escapeHTML(lotOccupancyOccupant.occupantCity) + ', '
: '') +
cityssm.escapeHTML(lotOccupancyOccupant.occupantProvince || '') +
'<br />' +
cityssm.escapeHTML(lotOccupancyOccupant.occupantPostalCode || '') +
'</td>') +
('<td>' +
(lotOccupancyOccupant.occupantPhoneNumber
? cityssm.escapeHTML(lotOccupancyOccupant.occupantPhoneNumber) + "<br />"
: "") +
? cityssm.escapeHTML(lotOccupancyOccupant.occupantPhoneNumber) +
'<br />'
: '') +
(lotOccupancyOccupant.occupantEmailAddress
? cityssm.escapeHTML(lotOccupancyOccupant.occupantEmailAddress)
: "") +
"</td>") +
("<td>" + cityssm.escapeHTML(lotOccupancyOccupant.occupantComment) + "</td>") +
: '') +
'</td>') +
('<td>' +
cityssm.escapeHTML(lotOccupancyOccupant.occupantComment) +
'</td>') +
('<td class="is-hidden-print">' +
'<div class="buttons are-small is-justify-content-end">' +
('<button class="button is-primary button--edit" type="button">' +
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
" <span>Edit</span>" +
"</button>") +
' <span>Edit</span>' +
'</button>') +
('<button class="button is-light is-danger button--delete" data-tooltip="Delete ' +
cityssm.escapeHTML(exports.aliases.occupant) +
'" type="button" aria-label="Delete">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>") +
"</div>" +
"</td>");
'</button>') +
'</div>' +
'</td>');
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 =
'<div class="message is-info">' +
'<p class="message-body">Enter a partial name or address in the search field above.</p>' +
"</div>";
'</div>';
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 =
"<strong>" +
cityssm.escapeHTML(occupant.occupantName || "") +
"</strong>" +
"<br />" +
'<strong>' +
cityssm.escapeHTML(occupant.occupantName || '') +
'</strong>' +
'<br />' +
'<div class="columns">' +
('<div class="column">' +
cityssm.escapeHTML(occupant.occupantAddress1 || "") +
"<br />" +
cityssm.escapeHTML(occupant.occupantAddress1 || '') +
'<br />' +
(occupant.occupantAddress2
? cityssm.escapeHTML(occupant.occupantAddress2) + "<br />"
: "") +
cityssm.escapeHTML(occupant.occupantCity || "") +
", " +
cityssm.escapeHTML(occupant.occupantProvince || "") +
"<br />" +
cityssm.escapeHTML(occupant.occupantPostalCode || "") +
"</div>") +
? cityssm.escapeHTML(occupant.occupantAddress2) + '<br />'
: '') +
cityssm.escapeHTML(occupant.occupantCity || '') +
', ' +
cityssm.escapeHTML(occupant.occupantProvince || '') +
'<br />' +
cityssm.escapeHTML(occupant.occupantPostalCode || '') +
'</div>') +
('<div class="column">' +
(occupant.occupantPhoneNumber
? cityssm.escapeHTML(occupant.occupantPhoneNumber) + "<br />"
: "") +
cityssm.escapeHTML(occupant.occupantEmailAddress || "") +
"<br />" +
"</div>") +
"</div>";
panelBlockElement.addEventListener("click", addOccupantFromCopy);
? cityssm.escapeHTML(occupant.occupantPhoneNumber) +
'<br />'
: '') +
cityssm.escapeHTML(occupant.occupantEmailAddress || '') +
'<br />' +
'</div>') +
'</div>';
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: () => {

File diff suppressed because it is too large Load Diff

View File

@ -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 });
</div>`;
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 = `<span class="has-tooltip-right" data-tooltip="Current ${los.escapedAliases.Occupancy}">
<i class="fas fa-play" aria-label="Current ${los.escapedAliases.Occupancy}"></i>
@ -38,63 +38,65 @@ Object.defineProperty(exports, "__esModule", { value: true });
<i class="fas fa-stop" aria-label="Past ${los.escapedAliases.Occupancy}"></i>
</span>`;
}
let occupantsHTML = "";
let occupantsHTML = '';
for (const occupant of lotOccupancy.lotOccupancyOccupants) {
occupantsHTML +=
'<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(occupant.lotOccupantType || "") +
cityssm.escapeHTML(occupant.lotOccupantType || '') +
'">' +
('<i class="fas fa-fw fa-' +
cityssm.escapeHTML(occupant.fontAwesomeIconClass || "user") +
cityssm.escapeHTML(occupant.fontAwesomeIconClass || 'user') +
'" aria-hidden="true"></i> ') +
cityssm.escapeHTML(occupant.occupantName || "") +
"</span><br />";
cityssm.escapeHTML(occupant.occupantName || '') +
'</span><br />';
}
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
('<td class="has-width-1">' + occupancyTimeHTML + "</td>") +
("<td>" +
resultsTbodyElement.insertAdjacentHTML('beforeend', '<tr>' +
('<td class="has-width-1">' + occupancyTimeHTML + '</td>') +
('<td>' +
'<a class="has-text-weight-bold" href="' +
los.getLotOccupancyURL(lotOccupancy.lotOccupancyId) +
'">' +
cityssm.escapeHTML(lotOccupancy.occupancyType) +
"</a>" +
"</td>") +
("<td>" +
'</a>' +
'</td>') +
('<td>' +
(lotOccupancy.lotName
? '<a class="has-tooltip-right" data-tooltip="' +
cityssm.escapeHTML(lotOccupancy.lotType || "") +
cityssm.escapeHTML(lotOccupancy.lotType || '') +
'" href="' +
los.getLotURL(lotOccupancy.lotId) +
'">' +
cityssm.escapeHTML(lotOccupancy.lotName) +
"</a>"
: '<span class="has-text-grey">(No ' + los.escapedAliases.Lot + ")</span>") +
"<br />" +
'</a>'
: '<span class="has-text-grey">(No ' +
los.escapedAliases.Lot +
')</span>') +
'<br />' +
('<span class="is-size-7">' +
cityssm.escapeHTML(lotOccupancy.mapName || "") +
"</span>") +
"</td>") +
("<td>" + lotOccupancy.occupancyStartDateString + "</td>") +
("<td>" +
cityssm.escapeHTML(lotOccupancy.mapName || '') +
'</span>') +
'</td>') +
('<td>' + lotOccupancy.occupancyStartDateString + '</td>') +
('<td>' +
(lotOccupancy.occupancyEndDate
? lotOccupancy.occupancyEndDateString
: '<span class="has-text-grey">(No End Date)</span>') +
"</td>") +
("<td>" + occupantsHTML + "</td>") +
"<td>" +
'</td>') +
('<td>' + occupantsHTML + '</td>') +
'<td>' +
(lotOccupancy.printEJS
? '<a class="button is-small" data-tooltip="Print" href="' +
los.urlPrefix +
"/print/" +
'/print/' +
lotOccupancy.printEJS +
"/?lotOccupancyId=" +
'/?lotOccupancyId=' +
lotOccupancy.lotOccupancyId +
'" target="_blank">' +
'<i class="fas fa-print" aria-label="Print"></i>' +
"</a>"
: "") +
"</td>" +
"</tr>");
'</a>'
: '') +
'</td>' +
'</tr>');
}
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">
<thead><tr>
@ -107,19 +109,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
<th class="has-width-1"><span class="is-sr-only">Print</span></th>
</tr></thead>
<table>`;
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();
});

View File

@ -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 = `<div class="message is-info">
function renderLotOccupancies(responseJSON: {
count: number
offset: number
lotOccupancies: recordTypes.LotOccupancy[]
}) {
if (responseJSON.lotOccupancies.length === 0) {
searchResultsContainerElement.innerHTML = `<div class="message is-info">
<p class="message-body">
There are no ${los.escapedAliases.occupancy} records that meet the search criteria.
</p>
</div>`;
</div>`
return;
}
return
}
const resultsTbodyElement = document.createElement("tbody");
const resultsTbodyElement = document.createElement('tbody')
const nowDateString = cityssm.dateToString(new Date());
const nowDateString = cityssm.dateToString(new Date())
for (const lotOccupancy of responseJSON.lotOccupancies) {
let occupancyTimeHTML = "";
for (const lotOccupancy of responseJSON.lotOccupancies) {
let occupancyTimeHTML = ''
if (
lotOccupancy.occupancyStartDateString! <= nowDateString &&
(lotOccupancy.occupancyEndDateString === "" ||
lotOccupancy.occupancyEndDateString! >= nowDateString)
) {
occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Current ${los.escapedAliases.Occupancy}">
if (
lotOccupancy.occupancyStartDateString! <= nowDateString &&
(lotOccupancy.occupancyEndDateString === '' ||
lotOccupancy.occupancyEndDateString! >= nowDateString)
) {
occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Current ${los.escapedAliases.Occupancy}">
<i class="fas fa-play" aria-label="Current ${los.escapedAliases.Occupancy}"></i>
</span>`;
} else if (lotOccupancy.occupancyStartDateString! > nowDateString) {
occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Future ${los.escapedAliases.Occupancy}">
</span>`
} else if (lotOccupancy.occupancyStartDateString! > nowDateString) {
occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Future ${los.escapedAliases.Occupancy}">
<i class="fas fa-fast-forward" aria-label="Future ${los.escapedAliases.Occupancy}"></i>
</span>`;
} else {
occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Past ${los.escapedAliases.Occupancy}">
</span>`
} else {
occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Past ${los.escapedAliases.Occupancy}">
<i class="fas fa-stop" aria-label="Past ${los.escapedAliases.Occupancy}"></i>
</span>`;
}
</span>`
}
let occupantsHTML = "";
let occupantsHTML = ''
for (const occupant of lotOccupancy.lotOccupancyOccupants!) {
occupantsHTML +=
'<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(occupant.lotOccupantType || "") +
'">' +
('<i class="fas fa-fw fa-' +
cityssm.escapeHTML(occupant.fontAwesomeIconClass || "user") +
'" aria-hidden="true"></i> ') +
cityssm.escapeHTML(occupant.occupantName || "") +
"</span><br />";
}
for (const occupant of lotOccupancy.lotOccupancyOccupants!) {
occupantsHTML +=
'<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(occupant.lotOccupantType || '') +
'">' +
('<i class="fas fa-fw fa-' +
cityssm.escapeHTML(occupant.fontAwesomeIconClass || 'user') +
'" aria-hidden="true"></i> ') +
cityssm.escapeHTML(occupant.occupantName || '') +
'</span><br />'
}
resultsTbodyElement.insertAdjacentHTML(
"beforeend",
"<tr>" +
('<td class="has-width-1">' + occupancyTimeHTML + "</td>") +
("<td>" +
'<a class="has-text-weight-bold" href="' +
los.getLotOccupancyURL(lotOccupancy.lotOccupancyId!) +
'">' +
cityssm.escapeHTML(lotOccupancy.occupancyType as string) +
"</a>" +
"</td>") +
("<td>" +
(lotOccupancy.lotName
? '<a class="has-tooltip-right" data-tooltip="' +
cityssm.escapeHTML(lotOccupancy.lotType || "") +
'" href="' +
los.getLotURL(lotOccupancy.lotId!) +
'">' +
cityssm.escapeHTML(lotOccupancy.lotName) +
"</a>"
: '<span class="has-text-grey">(No ' + los.escapedAliases.Lot + ")</span>") +
"<br />" +
('<span class="is-size-7">' +
cityssm.escapeHTML(lotOccupancy.mapName || "") +
"</span>") +
"</td>") +
("<td>" + lotOccupancy.occupancyStartDateString + "</td>") +
("<td>" +
(lotOccupancy.occupancyEndDate
? lotOccupancy.occupancyEndDateString
: '<span class="has-text-grey">(No End Date)</span>') +
"</td>") +
("<td>" + occupantsHTML + "</td>") +
"<td>" +
(lotOccupancy.printEJS
? '<a class="button is-small" data-tooltip="Print" href="' +
los.urlPrefix +
"/print/" +
lotOccupancy.printEJS +
"/?lotOccupancyId=" +
lotOccupancy.lotOccupancyId +
'" target="_blank">' +
'<i class="fas fa-print" aria-label="Print"></i>' +
"</a>"
: "") +
"</td>" +
"</tr>"
);
}
resultsTbodyElement.insertAdjacentHTML(
'beforeend',
'<tr>' +
('<td class="has-width-1">' + occupancyTimeHTML + '</td>') +
('<td>' +
'<a class="has-text-weight-bold" href="' +
los.getLotOccupancyURL(lotOccupancy.lotOccupancyId!) +
'">' +
cityssm.escapeHTML(lotOccupancy.occupancyType as string) +
'</a>' +
'</td>') +
('<td>' +
(lotOccupancy.lotName
? '<a class="has-tooltip-right" data-tooltip="' +
cityssm.escapeHTML(lotOccupancy.lotType || '') +
'" href="' +
los.getLotURL(lotOccupancy.lotId!) +
'">' +
cityssm.escapeHTML(lotOccupancy.lotName) +
'</a>'
: '<span class="has-text-grey">(No ' +
los.escapedAliases.Lot +
')</span>') +
'<br />' +
('<span class="is-size-7">' +
cityssm.escapeHTML(lotOccupancy.mapName || '') +
'</span>') +
'</td>') +
('<td>' + lotOccupancy.occupancyStartDateString + '</td>') +
('<td>' +
(lotOccupancy.occupancyEndDate
? lotOccupancy.occupancyEndDateString
: '<span class="has-text-grey">(No End Date)</span>') +
'</td>') +
('<td>' + occupantsHTML + '</td>') +
'<td>' +
(lotOccupancy.printEJS
? '<a class="button is-small" data-tooltip="Print" href="' +
los.urlPrefix +
'/print/' +
lotOccupancy.printEJS +
'/?lotOccupancyId=' +
lotOccupancy.lotOccupancyId +
'" target="_blank">' +
'<i class="fas fa-print" aria-label="Print"></i>' +
'</a>'
: '') +
'</td>' +
'</tr>'
)
}
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">
<thead><tr>
<th class="has-width-1"></th>
<th>${los.escapedAliases.Occupancy} Type</th>
@ -135,63 +143,74 @@ declare const cityssm: cityssmGlobal;
<th>${los.escapedAliases.Occupants}</th>
<th class="has-width-1"><span class="is-sr-only">Print</span></th>
</tr></thead>
<table>`;
<table>`
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<HTMLInputElement | HTMLSelectElement>
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()
})()

View File

@ -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 });
</div>`;
return;
}
const resultsTbodyElement = document.createElement("tbody");
const resultsTbodyElement = document.createElement('tbody');
for (const lot of responseJSON.lots) {
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
("<td>" +
resultsTbodyElement.insertAdjacentHTML('beforeend', '<tr>' +
('<td>' +
'<a class="has-text-weight-bold" href="' +
los.getLotURL(lot.lotId) +
'">' +
cityssm.escapeHTML(lot.lotName || "") +
"</a>" +
"</td>") +
("<td>" +
cityssm.escapeHTML(lot.lotName || '') +
'</a>' +
'</td>') +
('<td>' +
'<a href="' +
los.getMapURL(lot.mapId) +
'">' +
(lot.mapName
? cityssm.escapeHTML(lot.mapName)
: '<span class="has-text-grey">(No Name)</span>') +
"</a>" +
"</td>") +
("<td>" + cityssm.escapeHTML(lot.lotType || "") + "</td>") +
("<td>" +
'</a>' +
'</td>') +
('<td>' + cityssm.escapeHTML(lot.lotType || '') + '</td>') +
('<td>' +
(lot.lotStatusId
? cityssm.escapeHTML(lot.lotStatus || "")
? cityssm.escapeHTML(lot.lotStatus || '')
: '<span class="has-text-grey">(No Status)</span>') +
"<br />" +
'<br />' +
(lot.lotOccupancyCount > 0
? '<span class="is-size-7">Currently Occupied</span>'
: "") +
"</td>") +
"</tr>");
: '') +
'</td>') +
'</tr>');
}
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">
<thead><tr>
@ -54,19 +54,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
<th>Status</th>
</tr></thead>
<table>`;
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();
});

View File

@ -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 = `<div class="message is-info">
function renderLots(responseJSON: {
count: number
offset: number
lots: recordTypes.Lot[]
}): void {
if (responseJSON.lots.length === 0) {
searchResultsContainerElement.innerHTML = `<div class="message is-info">
<p class="message-body">There are no ${los.escapedAliases.lots} that meet the search criteria.</p>
</div>`;
</div>`
return;
}
return
}
const resultsTbodyElement = document.createElement("tbody");
const resultsTbodyElement = document.createElement('tbody')
for (const lot of responseJSON.lots) {
resultsTbodyElement.insertAdjacentHTML(
"beforeend",
"<tr>" +
("<td>" +
'<a class="has-text-weight-bold" href="' +
los.getLotURL(lot.lotId) +
'">' +
cityssm.escapeHTML(lot.lotName || "") +
"</a>" +
"</td>") +
("<td>" +
'<a href="' +
los.getMapURL(lot.mapId!) +
'">' +
(lot.mapName
? cityssm.escapeHTML(lot.mapName)
: '<span class="has-text-grey">(No Name)</span>') +
"</a>" +
"</td>") +
("<td>" + cityssm.escapeHTML(lot.lotType || "") + "</td>") +
("<td>" +
(lot.lotStatusId
? cityssm.escapeHTML(lot.lotStatus || "")
: '<span class="has-text-grey">(No Status)</span>') +
"<br />" +
(lot.lotOccupancyCount! > 0
? '<span class="is-size-7">Currently Occupied</span>'
: "") +
"</td>") +
"</tr>"
);
}
for (const lot of responseJSON.lots) {
resultsTbodyElement.insertAdjacentHTML(
'beforeend',
'<tr>' +
('<td>' +
'<a class="has-text-weight-bold" href="' +
los.getLotURL(lot.lotId) +
'">' +
cityssm.escapeHTML(lot.lotName || '') +
'</a>' +
'</td>') +
('<td>' +
'<a href="' +
los.getMapURL(lot.mapId!) +
'">' +
(lot.mapName
? cityssm.escapeHTML(lot.mapName)
: '<span class="has-text-grey">(No Name)</span>') +
'</a>' +
'</td>') +
('<td>' + cityssm.escapeHTML(lot.lotType || '') + '</td>') +
('<td>' +
(lot.lotStatusId
? cityssm.escapeHTML(lot.lotStatus || '')
: '<span class="has-text-grey">(No Status)</span>') +
'<br />' +
(lot.lotOccupancyCount! > 0
? '<span class="is-size-7">Currently Occupied</span>'
: '') +
'</td>') +
'</tr>'
)
}
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">
<thead><tr>
<th>${los.escapedAliases.Lot}</th>
<th>${los.escapedAliases.Map}</th>
<th>${los.escapedAliases.Lot} Type</th>
<th>Status</th>
</tr></thead>
<table>`;
<table>`
searchResultsContainerElement.insertAdjacentHTML(
"beforeend",
los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count)
);
searchResultsContainerElement.insertAdjacentHTML(
'beforeend',
los.getSearchResultsPagerHTML(
limit,
responseJSON.offset,
responseJSON.count
)
)
searchResultsContainerElement.querySelector("table")!.append(resultsTbodyElement);
searchResultsContainerElement
.querySelector('table')!
.append(resultsTbodyElement)
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<HTMLInputElement | HTMLSelectElement>
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()
})()

View File

@ -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');
}
})();

View File

@ -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'
)
}
})()

View File

@ -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 =
'<span class="has-text-weight-bold" aria-hidden="true">&times;</span>';
}
@ -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 timePickerBaseOptions: BulmaCalendarOptions = {
type: "time",
timeFormat: "hh:mm",
color: "info",
displayMode: "dialog",
validateLabel: "Set Time",
minuteSteps: 1
};
const initializeTimePickers = (containerElement: HTMLElement) => {
const initializeTimePickers = (containerElement: HTMLElement) => {
const timeElements = containerElement.querySelectorAll(
"input[type='time']"
) as NodeListOf<HTMLInputElement>;
const timeElements = containerElement.querySelectorAll(
"input[type='time']"
) as NodeListOf<HTMLInputElement>;
for (const timeElement of timeElements) {
const timePickerOptions = Object.assign({}, timePickerBaseOptions);
for (const timeElement of timeElements) {
const timePickerOptions = Object.assign({}, timePickerBaseOptions);
if (timeElement.required) {
timePickerOptions.showClearButton = false;
}
if (timeElement.required) {
timePickerOptions.showClearButton = false;
}
const cal = exports.bulmaCalendar.attach(timeElement, timePickerOptions)[0];
const cal = exports.bulmaCalendar.attach(timeElement, timePickerOptions)[0];
// trigger change event on original element
cal.on("save", () => {
timeElement.value = cal.value();
timeElement.dispatchEvent(new Event("change"));
});
// 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");
});
// 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();
});
// 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;
// Get the datepicker container element
const timePickerElement = containerElement.querySelector("#" + cal._id) as HTMLElement;
// Remove "cancel" button
// Remove "cancel" button
const timePickerCancelButtonElement = timePickerElement.querySelector(
".datetimepicker-footer-cancel"
);
const timePickerCancelButtonElement = timePickerElement.querySelector(
".datetimepicker-footer-cancel"
);
if (timePickerCancelButtonElement) {
timePickerCancelButtonElement.remove();
}
if (timePickerCancelButtonElement) {
timePickerCancelButtonElement.remove();
}
// Override the clear button style
// Override the clear button style
const clearButtonElement = timePickerElement.querySelector(
".datetimepicker-clear-button"
) as HTMLElement;
const clearButtonElement = timePickerElement.querySelector(
".datetimepicker-clear-button"
) as HTMLElement;
if (clearButtonElement) {
if (timeElement.required) {
clearButtonElement.remove();
} else {
clearButtonElement.dataset.tooltip = "Clear";
clearButtonElement.innerHTML =
'<span class="has-text-weight-bold" aria-hidden="true">&times;</span>';
}
}
}
};
*/
if (clearButtonElement) {
if (timeElement.required) {
clearButtonElement.remove();
} else {
clearButtonElement.dataset.tooltip = "Clear";
clearButtonElement.innerHTML =
'<span class="has-text-weight-bold" aria-hidden="true">&times;</span>';
}
}
}
};
*/
/*
* 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 `<div class="field has-addons">
<div class="control">
<button
class="button ${isSmall ? "is-small" : ""} ${upButtonClassNames}"
class="button ${isSmall ? 'is-small' : ''} ${upButtonClassNames}"
data-tooltip="Move Up" data-direction="up" type="button" aria-label="Move Up">
<i class="fas fa-arrow-up" aria-hidden="true"></i>
</button>
</div>
<div class="control">
<button
class="button ${isSmall ? "is-small" : ""} ${downButtonClassNames}"
class="button ${isSmall ? 'is-small' : ''} ${downButtonClassNames}"
data-tooltip="Move Down" data-direction="down" type="button" aria-label="Move Down">
<i class="fas fa-arrow-down" aria-hidden="true"></i>
</button>
</div>
</div>`;
}
function getLoadingParagraphHTML(captionText = "Loading...") {
function getLoadingParagraphHTML(captionText = 'Loading...') {
return `<p class="has-text-centered has-text-grey">
<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />
${cityssm.escapeHTML(captionText)}
@ -322,63 +323,63 @@ Object.defineProperty(exports, "__esModule", { value: true });
return ('<div class="level">' +
('<div class="level-left">' +
'<div class="level-item has-text-weight-bold">' +
"Displaying " +
'Displaying ' +
(offset + 1).toString() +
" to " +
' to ' +
Math.min(count, limit + offset) +
" of " +
' of ' +
count +
"</div>" +
"</div>") +
'</div>' +
'</div>') +
('<div class="level-right">' +
(offset > 0
? '<div class="level-item">' +
'<button class="button is-rounded is-link is-outlined" data-page="previous" type="button" title="Previous">' +
'<i class="fas fa-arrow-left" aria-hidden="true"></i>' +
"</button>" +
"</div>"
: "") +
'</button>' +
'</div>'
: '') +
(limit + offset < count
? '<div class="level-item">' +
'<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
"<span>Next</span>" +
'<span>Next</span>' +
'<span class="icon"><i class="fas fa-arrow-right" aria-hidden="true"></i></span>' +
"</button>" +
"</div>"
: "") +
"</div>") +
"</div>");
'</button>' +
'</div>'
: '') +
'</div>') +
'</div>');
}
/*
* 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,

View File

@ -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<HTMLInputElement>
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 =
'<span class="has-text-weight-bold" aria-hidden="true">&times;</span>'
}
}
inputOrSelectElement.focus();
// Apply a label
const labelElement = document.querySelector(
"label[for='" + dateElement.id + "']"
)
if (labelElement) {
datepickerElement.querySelector(
'.datetimepicker-dummy-input'
)!.ariaLabel = labelElement.textContent
}
}
}
function initializeUnlockFieldButtons(containerElement: HTMLElement): void {
const unlockFieldButtonElements = containerElement.querySelectorAll(".is-unlock-field-button");
for (const unlockFieldButtonElement of unlockFieldButtonElements) {
unlockFieldButtonElement.addEventListener("click", unlockField);
}
}
/*
* Date Pickers
*/
const datePickerBaseOptions: BulmaCalendarOptions = {
type: "date",
dateFormat: "yyyy-MM-dd",
showFooter: false,
color: "info",
displayMode: "dialog"
};
function initializeDatePickers(containerElement: HTMLElement): void {
const dateElements = containerElement.querySelectorAll(
"input[type='date']"
) as NodeListOf<HTMLInputElement>;
for (const dateElement of dateElements) {
const datePickerOptions = Object.assign({}, datePickerBaseOptions);
if (dateElement.required) {
datePickerOptions.showClearButton = false;
}
// apply min date if set
if (dateElement.min) {
datePickerOptions.minDate = cityssm.dateStringToDate(dateElement.min);
}
// apply max date if set
if (dateElement.max) {
datePickerOptions.maxDate = cityssm.dateStringToDate(dateElement.max);
}
const cal = exports.bulmaCalendar.attach(dateElement, datePickerOptions)[0];
// trigger change event on original element
cal.on("save", () => {
dateElement.value = cal.value();
dateElement.dispatchEvent(new Event("change"));
});
// Disable html scrolling when calendar is open
cal.on("show", () => {
document.querySelector("html")!.classList.add("is-clipped");
});
// Reenable scrolling, if a modal window is not open
cal.on("hide", () => {
bulmaJS.toggleHtmlClipped();
});
// Get the datepicker container element
const datepickerElement = containerElement.querySelector("#" + cal._id) as HTMLElement;
// Override the previous and next month button styles
const datePickerNavButtonElements = datepickerElement.querySelectorAll(
".datepicker-nav button.is-text"
);
for (const datePickerNavButtonElement of datePickerNavButtonElements) {
datePickerNavButtonElement.classList.add("is-" + datePickerBaseOptions.color);
datePickerNavButtonElement.classList.remove("is-text");
}
// Override the clear button style
const clearButtonElement = datepickerElement.querySelector(
".datetimepicker-clear-button"
) as HTMLElement;
if (clearButtonElement) {
if (dateElement.required) {
clearButtonElement.remove();
} else {
clearButtonElement.dataset.tooltip = "Clear";
clearButtonElement.ariaLabel = "Clear";
clearButtonElement.innerHTML =
'<span class="has-text-weight-bold" aria-hidden="true">&times;</span>';
}
}
// Apply a label
const labelElement = document.querySelector("label[for='" + dateElement.id + "']");
if (labelElement) {
datepickerElement.querySelector(".datetimepicker-dummy-input")!.ariaLabel =
labelElement.textContent;
}
}
}
/*
/*
const timePickerBaseOptions: BulmaCalendarOptions = {
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<HTMLElement>;
function populateAliases(containerElement: HTMLElement): void {
const aliasElements = containerElement.querySelectorAll(
'.alias'
) as NodeListOf<HTMLElement>
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 `<div class="field has-addons">
function getMoveUpDownButtonFieldHTML(
upButtonClassNames: string,
downButtonClassNames: string,
isSmall = true
): string {
return `<div class="field has-addons">
<div class="control">
<button
class="button ${isSmall ? "is-small" : ""} ${upButtonClassNames}"
class="button ${
isSmall ? 'is-small' : ''
} ${upButtonClassNames}"
data-tooltip="Move Up" data-direction="up" type="button" aria-label="Move Up">
<i class="fas fa-arrow-up" aria-hidden="true"></i>
</button>
</div>
<div class="control">
<button
class="button ${isSmall ? "is-small" : ""} ${downButtonClassNames}"
class="button ${
isSmall ? 'is-small' : ''
} ${downButtonClassNames}"
data-tooltip="Move Down" data-direction="down" type="button" aria-label="Move Down">
<i class="fas fa-arrow-down" aria-hidden="true"></i>
</button>
</div>
</div>`;
}
</div>`
}
function getLoadingParagraphHTML(captionText = "Loading..."): string {
return `<p class="has-text-centered has-text-grey">
function getLoadingParagraphHTML(captionText = 'Loading...'): string {
return `<p class="has-text-centered has-text-grey">
<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />
${cityssm.escapeHTML(captionText)}
</p>`;
}
</p>`
}
function getSearchResultsPagerHTML(limit: number, offset: number, count: number) {
return (
'<div class="level">' +
('<div class="level-left">' +
'<div class="level-item has-text-weight-bold">' +
"Displaying " +
(offset + 1).toString() +
" to " +
Math.min(count, limit + offset) +
" of " +
count +
"</div>" +
"</div>") +
('<div class="level-right">' +
(offset > 0
? '<div class="level-item">' +
'<button class="button is-rounded is-link is-outlined" data-page="previous" type="button" title="Previous">' +
'<i class="fas fa-arrow-left" aria-hidden="true"></i>' +
"</button>" +
"</div>"
: "") +
(limit + offset < count
? '<div class="level-item">' +
'<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
"<span>Next</span>" +
'<span class="icon"><i class="fas fa-arrow-right" aria-hidden="true"></i></span>' +
"</button>" +
"</div>"
: "") +
"</div>") +
"</div>"
);
}
function getSearchResultsPagerHTML(
limit: number,
offset: number,
count: number
) {
return (
'<div class="level">' +
('<div class="level-left">' +
'<div class="level-item has-text-weight-bold">' +
'Displaying ' +
(offset + 1).toString() +
' to ' +
Math.min(count, limit + offset) +
' of ' +
count +
'</div>' +
'</div>') +
('<div class="level-right">' +
(offset > 0
? '<div class="level-item">' +
'<button class="button is-rounded is-link is-outlined" data-page="previous" type="button" title="Previous">' +
'<i class="fas fa-arrow-left" aria-hidden="true"></i>' +
'</button>' +
'</div>'
: '') +
(limit + offset < count
? '<div class="level-item">' +
'<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
'<span>Next</span>' +
'<span class="icon"><i class="fas fa-arrow-right" aria-hidden="true"></i></span>' +
'</button>' +
'</div>'
: '') +
'</div>') +
'</div>'
)
}
/*
* 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
})()

View File

@ -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

View File

@ -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
}
})
})
})()

View File

@ -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", "<tr>" +
("<td>" +
searchResultsTbodyElement.insertAdjacentHTML('beforeend', '<tr>' +
('<td>' +
'<a class="has-text-weight-bold" href="' +
los.urlPrefix +
"/maps/" +
'/maps/' +
map.mapId +
'">' +
cityssm.escapeHTML(map.mapName || "(No Name)") +
"</a><br />" +
cityssm.escapeHTML(map.mapName || '(No Name)') +
'</a><br />' +
'<span class="is-size-7">' +
cityssm.escapeHTML(map.mapDescription || "") +
"</span>" +
"</td>") +
("<td>" +
(map.mapAddress1 ? cityssm.escapeHTML(map.mapAddress1) + "<br />" : "") +
(map.mapAddress2 ? cityssm.escapeHTML(map.mapAddress2) + "<br />" : "") +
cityssm.escapeHTML(map.mapDescription || '') +
'</span>' +
'</td>') +
('<td>' +
(map.mapAddress1
? cityssm.escapeHTML(map.mapAddress1) + '<br />'
: '') +
(map.mapAddress2
? cityssm.escapeHTML(map.mapAddress2) + '<br />'
: '') +
(map.mapCity || map.mapProvince
? cityssm.escapeHTML(map.mapCity || "") +
", " +
cityssm.escapeHTML(map.mapProvince || "") +
"<br />"
: "") +
(map.mapPostalCode ? cityssm.escapeHTML(map.mapPostalCode) : "") +
"</td>") +
("<td>" + cityssm.escapeHTML(map.mapPhoneNumber || "") + "</td>") +
? cityssm.escapeHTML(map.mapCity || '') +
', ' +
cityssm.escapeHTML(map.mapProvince || '') +
'<br />'
: '') +
(map.mapPostalCode ? cityssm.escapeHTML(map.mapPostalCode) : '') +
'</td>') +
('<td>' + cityssm.escapeHTML(map.mapPhoneNumber || '') + '</td>') +
'<td class="has-text-centered">' +
(map.mapLatitude && map.mapLongitude
? '<span data-tooltip="Has Geographic Coordinates"><i class="fas fa-map-marker-alt" aria-label="Has Geographic Coordinates"></i></span>'
: "") +
"</td>" +
: '') +
'</td>' +
'<td class="has-text-centered">' +
(map.mapSVG
? '<span data-tooltip="Has Image"><i class="fas fa-image" aria-label="Has Image"></i></span>'
: "") +
"</td>" +
: '') +
'</td>' +
('<td class="has-text-right">' +
'<a href="' +
los.urlPrefix +
"/lots?mapId=" +
'/lots?mapId=' +
map.mapId +
'">' +
map.lotCount +
"</a>" +
"</td>") +
"</tr>");
'</a>' +
'</td>') +
'</tr>');
}
searchResultsContainerElement.innerHTML = "";
searchResultsContainerElement.innerHTML = '';
if (searchResultCount === 0) {
searchResultsContainerElement.innerHTML = `<div class="message is-info">
<p class="message-body">There are no ${los.escapedAliases.maps} that meet the search criteria.</p>
</div>`;
}
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 = `<thead><tr>
<th>${los.escapedAliases.Map}</th>
<th>Address</th>
@ -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();
});

View File

@ -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",
"<tr>" +
("<td>" +
'<a class="has-text-weight-bold" href="' +
los.urlPrefix +
"/maps/" +
map.mapId +
'">' +
cityssm.escapeHTML(map.mapName || "(No Name)") +
"</a><br />" +
'<span class="is-size-7">' +
cityssm.escapeHTML(map.mapDescription || "") +
"</span>" +
"</td>") +
("<td>" +
(map.mapAddress1 ? cityssm.escapeHTML(map.mapAddress1) + "<br />" : "") +
(map.mapAddress2 ? cityssm.escapeHTML(map.mapAddress2) + "<br />" : "") +
(map.mapCity || map.mapProvince
? cityssm.escapeHTML(map.mapCity || "") +
", " +
cityssm.escapeHTML(map.mapProvince || "") +
"<br />"
: "") +
(map.mapPostalCode ? cityssm.escapeHTML(map.mapPostalCode) : "") +
"</td>") +
("<td>" + cityssm.escapeHTML(map.mapPhoneNumber || "") + "</td>") +
'<td class="has-text-centered">' +
(map.mapLatitude && map.mapLongitude
? '<span data-tooltip="Has Geographic Coordinates"><i class="fas fa-map-marker-alt" aria-label="Has Geographic Coordinates"></i></span>'
: "") +
"</td>" +
'<td class="has-text-centered">' +
(map.mapSVG
? '<span data-tooltip="Has Image"><i class="fas fa-image" aria-label="Has Image"></i></span>'
: "") +
"</td>" +
('<td class="has-text-right">' +
'<a href="' +
los.urlPrefix +
"/lots?mapId=" +
map.mapId +
'">' +
map.lotCount +
"</a>" +
"</td>") +
"</tr>"
);
for (const filterStringPiece of filterStringSplit) {
if (!mapSearchString.includes(filterStringPiece)) {
showMap = false
break
}
}
searchResultsContainerElement.innerHTML = "";
if (!showMap) {
continue
}
if (searchResultCount === 0) {
searchResultsContainerElement.innerHTML = `<div class="message is-info">
searchResultCount += 1
searchResultsTbodyElement.insertAdjacentHTML(
'beforeend',
'<tr>' +
('<td>' +
'<a class="has-text-weight-bold" href="' +
los.urlPrefix +
'/maps/' +
map.mapId +
'">' +
cityssm.escapeHTML(map.mapName || '(No Name)') +
'</a><br />' +
'<span class="is-size-7">' +
cityssm.escapeHTML(map.mapDescription || '') +
'</span>' +
'</td>') +
('<td>' +
(map.mapAddress1
? cityssm.escapeHTML(map.mapAddress1) + '<br />'
: '') +
(map.mapAddress2
? cityssm.escapeHTML(map.mapAddress2) + '<br />'
: '') +
(map.mapCity || map.mapProvince
? cityssm.escapeHTML(map.mapCity || '') +
', ' +
cityssm.escapeHTML(map.mapProvince || '') +
'<br />'
: '') +
(map.mapPostalCode ? cityssm.escapeHTML(map.mapPostalCode) : '') +
'</td>') +
('<td>' + cityssm.escapeHTML(map.mapPhoneNumber || '') + '</td>') +
'<td class="has-text-centered">' +
(map.mapLatitude && map.mapLongitude
? '<span data-tooltip="Has Geographic Coordinates"><i class="fas fa-map-marker-alt" aria-label="Has Geographic Coordinates"></i></span>'
: '') +
'</td>' +
'<td class="has-text-centered">' +
(map.mapSVG
? '<span data-tooltip="Has Image"><i class="fas fa-image" aria-label="Has Image"></i></span>'
: '') +
'</td>' +
('<td class="has-text-right">' +
'<a href="' +
los.urlPrefix +
'/lots?mapId=' +
map.mapId +
'">' +
map.lotCount +
'</a>' +
'</td>') +
'</tr>'
)
}
searchResultsContainerElement.innerHTML = ''
if (searchResultCount === 0) {
searchResultsContainerElement.innerHTML = `<div class="message is-info">
<p class="message-body">There are no ${los.escapedAliases.maps} that meet the search criteria.</p>
</div>`;
} else {
const searchResultsTableElement = document.createElement("table");
</div>`
} 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 = `<thead><tr>
searchResultsTableElement.innerHTML = `<thead><tr>
<th>${los.escapedAliases.Map}</th>
<th>Address</th>
<th>Phone Number</th>
<th class="has-text-centered">Coordinates</th>
<th class="has-text-centered">Image</th>
<th class="has-text-right">${los.escapedAliases.Lot} Count</th>
</tr></thead>`;
</tr></thead>`
searchResultsTableElement.append(searchResultsTbodyElement);
searchResultsTableElement.append(searchResultsTbodyElement)
searchResultsContainerElement.append(searchResultsTableElement);
}
searchResultsContainerElement.append(searchResultsTableElement)
}
}
searchFilterElement.addEventListener("keyup", renderResults);
searchFilterElement.addEventListener('keyup', renderResults)
document.querySelector("#form--searchFilters")!.addEventListener("submit", (formEvent) => {
formEvent.preventDefault();
renderResults();
});
document
.querySelector('#form--searchFilters')!
.addEventListener('submit', (formEvent) => {
formEvent.preventDefault()
renderResults()
})
renderResults();
})();
renderResults()
})()

View File

@ -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);
}

View File

@ -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)
}
})()

View File

@ -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);
}
})();

View File

@ -1,38 +1,41 @@
/* eslint-disable unicorn/prefer-module */
(() => {
const menuTabElements = document.querySelectorAll(".menu a") as NodeListOf<HTMLAnchorElement>;
const tabContainerElements = document.querySelectorAll(
".tabs-container > div"
) as NodeListOf<HTMLElement>;
;(() => {
const menuTabElements = document.querySelectorAll(
'.menu a'
) as NodeListOf<HTMLAnchorElement>
function selectTab(clickEvent: Event) {
clickEvent.preventDefault();
const tabContainerElements = document.querySelectorAll(
'.tabs-container > div'
) as NodeListOf<HTMLElement>
// 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)
}
})()

File diff suppressed because it is too large Load Diff

View File

@ -4,16 +4,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
(() => {
var _a, _b;
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
? "<br /><strong>Note that this milestone is expected to be completed in the future.</strong>"
: ""),
? '<br /><strong>Note that this milestone is expected to be completed in the future.</strong>'
: ''),
messageIsHtml: true,
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 =
'<div class="columns is-mobile">' +
('<div class="column is-narrow">' +
@ -297,70 +307,75 @@ Object.defineProperty(exports, "__esModule", { value: true });
milestone.workOrderMilestoneCompletionDateString +
'">' +
'<span class="icon is-small"><i class="fas fa-check" aria-hidden="true"></i></span>' +
"</span>"
'</span>'
: '<button class="button button--completeMilestone" data-tooltip="Incomplete" type="button" aria-label="Incomplete">' +
'<span class="icon is-small"><i class="far fa-square" aria-hidden="true"></i></span>' +
"</button>") +
"</div>") +
'</button>') +
'</div>') +
('<div class="column">' +
(milestone.workOrderMilestoneTypeId
? "<strong>" +
cityssm.escapeHTML(milestone.workOrderMilestoneType || "") +
"</strong><br />"
: "") +
? '<strong>' +
cityssm.escapeHTML(milestone.workOrderMilestoneType || '') +
'</strong><br />'
: '') +
milestone.workOrderMilestoneDateString +
(milestone.workOrderMilestoneTime ? " " + milestone.workOrderMilestoneTimeString : "") +
"<br />" +
(milestone.workOrderMilestoneTime
? ' ' + milestone.workOrderMilestoneTimeString
: '') +
'<br />' +
'<span class="is-size-7">' +
cityssm.escapeHTML(milestone.workOrderMilestoneDescription || "") +
"</span>" +
"</div>") +
cityssm.escapeHTML(milestone.workOrderMilestoneDescription || '') +
'</span>' +
'</div>') +
('<div class="column is-narrow">' +
'<div class="dropdown is-right">' +
('<div class="dropdown-trigger">' +
'<button class="button is-small" data-tooltip="Options" type="button" aria-label="Options">' +
'<i class="fas fa-ellipsis-v" aria-hidden="true"></i>' +
"</button>" +
"</div>") +
'</button>' +
'</div>') +
('<div class="dropdown-menu">' +
'<div class="dropdown-content">' +
(milestone.workOrderMilestoneCompletionDate
? '<a class="dropdown-item button--reopenMilestone" href="#">' +
'<span class="icon is-small"><i class="fas fa-times" aria-hidden="true"></i></span>' +
" <span>Reopen Milestone</span>" +
"</a>"
' <span>Reopen Milestone</span>' +
'</a>'
: '<a class="dropdown-item button--editMilestone" href="#">' +
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
" <span>Edit Milestone</span>" +
"</a>") +
' <span>Edit Milestone</span>' +
'</a>') +
'<hr class="dropdown-divider" />' +
'<a class="dropdown-item button--deleteMilestone" href="#">' +
'<span class="icon is-small"><i class="fas fa-trash has-text-danger" aria-hidden="true"></i></span>' +
" <span>Delete Milestone</span>" +
"</a>" +
"</div>" +
"</div>") +
"</div>" +
"</div>") +
"</div>";
' <span>Delete Milestone</span>' +
'</a>' +
'</div>' +
'</div>') +
'</div>' +
'</div>') +
'</div>';
(_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();

File diff suppressed because it is too large Load Diff

View File

@ -5,7 +5,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
let workOrderComments = exports.workOrderComments;
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 = `<div class="message is-info">
<p class="message-body">There are no comments to display.</p>
</div>`;
return;
}
const tableElement = document.createElement("table");
tableElement.className = "table is-fullwidth is-striped is-hoverable";
const tableElement = document.createElement('table');
tableElement.className = 'table is-fullwidth is-striped is-hoverable';
tableElement.innerHTML = `<thead><tr>
<th>Commentor</th>
<th>Comment Date</th>
<th>Comment</th>
<th class="is-hidden-print"><span class="is-sr-only">Options</span></th></tr></thead><tbody></tbody>`;
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 =
"<td>" +
cityssm.escapeHTML(workOrderComment.recordCreate_userName || "") +
"</td>" +
"<td>" +
'<td>' +
cityssm.escapeHTML(workOrderComment.recordCreate_userName || '') +
'</td>' +
'<td>' +
workOrderComment.workOrderCommentDateString +
(workOrderComment.workOrderCommentTime === 0
? ""
: " " + workOrderComment.workOrderCommentTimeString) +
"</td>" +
"<td>" +
cityssm.escapeHTML(workOrderComment.workOrderComment || "") +
"</td>" +
? ''
: ' ' + workOrderComment.workOrderCommentTimeString) +
'</td>' +
'<td>' +
cityssm.escapeHTML(workOrderComment.workOrderComment || '') +
'</td>' +
('<td class="is-hidden-print">' +
'<div class="buttons are-small is-justify-content-end">' +
('<button class="button is-primary button--edit" type="button">' +
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
" <span>Edit</span>" +
"</button>") +
' <span>Edit</span>' +
'</button>') +
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>") +
"</div>" +
"</td>");
tableRowElement.querySelector(".button--edit").addEventListener("click", openEditWorkOrderComment);
tableRowElement.querySelector(".button--delete").addEventListener("click", deleteWorkOrderComment);
tableElement.querySelector("tbody").append(tableRowElement);
'</button>') +
'</div>' +
'</td>');
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();
}

View File

@ -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 = `<div class="message is-info">
if (workOrderComments.length === 0) {
containerElement.innerHTML = `<div class="message is-info">
<p class="message-body">There are no comments to display.</p>
</div>`;
return;
}
</div>`
return
}
const tableElement = document.createElement("table");
tableElement.className = "table is-fullwidth is-striped is-hoverable";
tableElement.innerHTML = `<thead><tr>
const tableElement = document.createElement('table')
tableElement.className = 'table is-fullwidth is-striped is-hoverable'
tableElement.innerHTML = `<thead><tr>
<th>Commentor</th>
<th>Comment Date</th>
<th>Comment</th>
<th class="is-hidden-print"><span class="is-sr-only">Options</span></th></tr></thead><tbody></tbody>`;
<th class="is-hidden-print"><span class="is-sr-only">Options</span></th></tr></thead><tbody></tbody>`
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 =
"<td>" +
cityssm.escapeHTML(workOrderComment.recordCreate_userName || "") +
"</td>" +
"<td>" +
workOrderComment.workOrderCommentDateString +
(workOrderComment.workOrderCommentTime === 0
? ""
: " " + workOrderComment.workOrderCommentTimeString) +
"</td>" +
"<td>" +
cityssm.escapeHTML(workOrderComment.workOrderComment || "") +
"</td>" +
('<td class="is-hidden-print">' +
'<div class="buttons are-small is-justify-content-end">' +
('<button class="button is-primary button--edit" type="button">' +
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
" <span>Edit</span>" +
"</button>") +
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>") +
"</div>" +
"</td>");
tableRowElement.innerHTML =
'<td>' +
cityssm.escapeHTML(workOrderComment.recordCreate_userName || '') +
'</td>' +
'<td>' +
workOrderComment.workOrderCommentDateString +
(workOrderComment.workOrderCommentTime === 0
? ''
: ' ' + workOrderComment.workOrderCommentTimeString) +
'</td>' +
'<td>' +
cityssm.escapeHTML(workOrderComment.workOrderComment || '') +
'</td>' +
('<td class="is-hidden-print">' +
'<div class="buttons are-small is-justify-content-end">' +
('<button class="button is-primary button--edit" type="button">' +
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
' <span>Edit</span>' +
'</button>') +
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
'</button>') +
'</div>' +
'</td>')
tableRowElement.querySelector(".button--edit")!.addEventListener("click", 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()
}

View File

@ -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 = `<div class="message is-info">
<p class="message-body">There are no ${los.escapedAliases.occupancies} associated with this work order.</p>
@ -103,10 +102,11 @@ function renderRelatedOccupancies() {
</table>`;
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 =
'<td class="is-width-1 has-text-centered">' +
(isActive
? '<i class="fas fa-play" title="Current ' + los.escapedAliases.Occupancy + '"></i>'
: '<i class="fas fa-stop" title="Previous ' + los.escapedAliases.Occupancy + '"></i>') +
"</td>" +
("<td>" +
? '<i class="fas fa-play" title="Current ' +
los.escapedAliases.Occupancy +
'"></i>'
: '<i class="fas fa-stop" title="Previous ' +
los.escapedAliases.Occupancy +
'"></i>') +
'</td>' +
('<td>' +
'<a class="has-text-weight-bold" href="' +
los.getLotOccupancyURL(lotOccupancy.lotOccupancyId) +
'">' +
cityssm.escapeHTML(lotOccupancy.occupancyType || "") +
"</a>" +
"</td>");
cityssm.escapeHTML(lotOccupancy.occupancyType || '') +
'</a>' +
'</td>');
if (lotOccupancy.lotId) {
rowElement.insertAdjacentHTML("beforeend", "<td>" +
cityssm.escapeHTML(lotOccupancy.lotName || "") +
rowElement.insertAdjacentHTML('beforeend', '<td>' +
cityssm.escapeHTML(lotOccupancy.lotName || '') +
(hasLotRecord
? ""
? ''
: ' <button class="button is-small is-light is-success button--addLot"' +
' data-lot-id="' +
lotOccupancy.lotId +
@ -140,58 +144,61 @@ function renderRelatedOccupancies() {
los.escapedAliases.Lot +
'" type="button">' +
'<i class="fas fa-plus" aria-hidden="true"></i>' +
"</button>") +
"</td>");
'</button>') +
'</td>');
}
else {
rowElement.insertAdjacentHTML("beforeend", `<td><span class="has-text-grey">(No ${los.escapedAliases.Lot})</span></td>`);
rowElement.insertAdjacentHTML('beforeend', `<td><span class="has-text-grey">(No ${los.escapedAliases.Lot})</span></td>`);
}
rowElement.insertAdjacentHTML("beforeend", "<td>" +
rowElement.insertAdjacentHTML('beforeend', '<td>' +
lotOccupancy.occupancyStartDateString +
"</td>" +
("<td>" +
'</td>' +
('<td>' +
(lotOccupancy.occupancyEndDate
? lotOccupancy.occupancyEndDateString
: '<span class="has-text-grey">(No End Date)</span>') +
"</td>") +
("<td>" +
'</td>') +
('<td>' +
(lotOccupancy.lotOccupancyOccupants.length === 0
? '<span class="has-text-grey">(No ' + los.escapedAliases.Occupants + ")</span>"
? '<span class="has-text-grey">(No ' +
los.escapedAliases.Occupants +
')</span>'
: (_a = lotOccupancy.lotOccupancyOccupants) === null || _a === void 0 ? void 0 : _a.reduce((soFar, occupant) => {
return (soFar +
'<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(occupant.lotOccupantType) +
'">' +
'<i class="fas fa-fw fa-' +
cityssm.escapeHTML(occupant.fontAwesomeIconClass || "user") +
cityssm.escapeHTML(occupant.fontAwesomeIconClass || 'user') +
'" aria-label="' +
los.escapedAliases.Occupant +
'"></i> ' +
cityssm.escapeHTML(occupant.occupantName) +
"</span><br />");
}, "")) +
"</td>") +
("<td>" +
'</span><br />');
}, '')) +
'</td>') +
('<td>' +
'<button class="button is-small is-light is-danger button--deleteLotOccupancy" data-tooltip="Delete Relationship" type="button">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" +
"</td>"));
(_b = rowElement.querySelector(".button--addLot")) === null || _b === void 0 ? void 0 : _b.addEventListener("click", addLotFromLotOccupancy);
'</button>' +
'</td>'));
(_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", `<input name="workOrderId" type="hidden" value="${workOrderId}" />`);
.querySelector('form')
.insertAdjacentHTML('beforeend', `<input name="workOrderId" type="hidden" value="${workOrderId}" />`);
},
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 = `<div class="message is-info">
<p class="message-body">There are no ${los.escapedAliases.lots} associated with this work order.</p>
@ -298,35 +304,39 @@ function renderRelatedLots() {
<tbody></tbody>
</table>`;
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 =
"<td>" +
'<td>' +
'<a class="has-text-weight-bold" href="' +
los.getLotURL(lot.lotId) +
'">' +
cityssm.escapeHTML(lot.lotName || "") +
"</a>" +
"</td>" +
("<td>" + cityssm.escapeHTML(lot.mapName || "") + "</td>") +
("<td>" + cityssm.escapeHTML(lot.lotType || "") + "</td>") +
("<td>" +
cityssm.escapeHTML(lot.lotName || '') +
'</a>' +
'</td>' +
('<td>' + cityssm.escapeHTML(lot.mapName || '') + '</td>') +
('<td>' + cityssm.escapeHTML(lot.lotType || '') + '</td>') +
('<td>' +
(lot.lotStatusId
? cityssm.escapeHTML(lot.lotStatus || "")
? cityssm.escapeHTML(lot.lotStatus || '')
: '<span class="has-text-grey">(No Status)</span>') +
"</td>") +
'</td>') +
('<td class="is-nowrap">' +
'<button class="button is-small is-light is-info button--editLotStatus" data-tooltip="Update Status" type="button">' +
'<i class="fas fa-pencil-alt" aria-hidden="true"></i>' +
"</button>" +
'</button>' +
' <button class="button is-small is-light is-danger button--deleteLot" data-tooltip="Delete Relationship" type="button">' +
'<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" +
"</td>");
rowElement.querySelector(".button--editLotStatus").addEventListener("click", openEditLotStatus);
rowElement.querySelector(".button--deleteLot").addEventListener("click", deleteLot);
lotsContainerElement.querySelector("tbody").append(rowElement);
'</button>' +
'</td>');
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 = `<div class="message is-info">
<p class="message-body">There are no records that meet the search criteria.</p>
@ -370,64 +383,69 @@ document.querySelector("#button--addLotOccupancy").addEventListener("click", ()
<tbody></tbody>
</table>`;
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 =
'<td class="has-text-centered">' +
'<button class="button is-small is-success button--addLotOccupancy" data-tooltip="Add" type="button" aria-label="Add">' +
'<i class="fas fa-plus" aria-hidden="true"></i>' +
"</button>" +
"</td>" +
'</button>' +
'</td>' +
('<td class="has-text-weight-bold">' +
cityssm.escapeHTML(lotOccupancy.occupancyType || "") +
"</td>");
cityssm.escapeHTML(lotOccupancy.occupancyType || '') +
'</td>');
if (lotOccupancy.lotId) {
rowElement.insertAdjacentHTML("beforeend", "<td>" + cityssm.escapeHTML(lotOccupancy.lotName || "") + "</td>");
rowElement.insertAdjacentHTML('beforeend', '<td>' +
cityssm.escapeHTML(lotOccupancy.lotName || '') +
'</td>');
}
else {
rowElement.insertAdjacentHTML("beforeend", `<td><span class="has-text-grey">(No ${los.escapedAliases.Lot})</span></td>`);
rowElement.insertAdjacentHTML('beforeend', `<td><span class="has-text-grey">(No ${los.escapedAliases.Lot})</span></td>`);
}
rowElement.insertAdjacentHTML("beforeend", "<td>" +
rowElement.insertAdjacentHTML('beforeend', '<td>' +
lotOccupancy.occupancyStartDateString +
"</td>" +
("<td>" +
'</td>' +
('<td>' +
(lotOccupancy.occupancyEndDate
? lotOccupancy.occupancyEndDateString
: '<span class="has-text-grey">(No End Date)</span>') +
"</td>") +
("<td>" +
'</td>') +
('<td>' +
(lotOccupancy.lotOccupancyOccupants.length === 0
? '<span class="has-text-grey">(No ' +
cityssm.escapeHTML(exports.aliases.occupants) +
")</span>"
')</span>'
: cityssm.escapeHTML(lotOccupancy.lotOccupancyOccupants[0].occupantName) +
(lotOccupancy.lotOccupancyOccupants.length > 1
? " plus " + (lotOccupancy.lotOccupancyOccupants.length - 1)
: "")) +
"</td>"));
? ' plus ' +
(lotOccupancy.lotOccupancyOccupants.length - 1)
: '')) +
'</td>'));
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 =
'<div class="message is-info">' +
'<p class="message-body">There are no records that meet the search criteria.</p>' +
"</div>";
'</div>';
return;
}
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable">
@ -470,38 +489,41 @@ document.querySelector("#button--addLot").addEventListener("click", () => {
<tbody></tbody>
</table>`;
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 =
'<td class="has-text-centered">' +
'<button class="button is-small is-success button--addLot" data-tooltip="Add" type="button" aria-label="Add">' +
'<i class="fas fa-plus" aria-hidden="true"></i>' +
"</button>" +
"</td>" +
'</button>' +
'</td>' +
('<td class="has-text-weight-bold">' +
cityssm.escapeHTML(lot.lotName || "") +
"</td>") +
"<td>" +
cityssm.escapeHTML(lot.mapName || "") +
"</td>" +
("<td>" + cityssm.escapeHTML(lot.lotType || "") + "</td>") +
("<td>" + cityssm.escapeHTML(lot.lotStatus || "") + "</td>");
rowElement.querySelector(".button--addLot").addEventListener("click", doAddLot);
searchResultsContainerElement.querySelector("tbody").append(rowElement);
cityssm.escapeHTML(lot.lotName || '') +
'</td>') +
'<td>' +
cityssm.escapeHTML(lot.mapName || '') +
'</td>' +
('<td>' + cityssm.escapeHTML(lot.lotType || '') + '</td>') +
('<td>' + cityssm.escapeHTML(lot.lotStatus || '') + '</td>');
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();

File diff suppressed because it is too large Load Diff

View File

@ -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 = `<div class="message is-info">
<p class="message-body">There are no milestones that meet the search criteria.</p>
</div>`;
<p class="message-body">There are no milestones that meet the search criteria.</p>
</div>`;
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 = `<h2 class="panel-heading">${milestone.workOrderMilestoneDateString}</h2>`;
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 +=
'<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(lot.mapName || "") +
cityssm.escapeHTML(lot.mapName || '') +
'">' +
'<i class="fas fa-vector-square" aria-label="' +
los.escapedAliases.Lot +
'"></i> ' +
cityssm.escapeHTML(lot.lotName || "") +
"</span>" +
"<br />";
cityssm.escapeHTML(lot.lotName || '') +
'</span>' +
'<br />';
}
for (const lotOccupancy of milestone.workOrderLotOccupancies) {
for (const occupant of lotOccupancy.lotOccupancyOccupants) {
lotOccupancyHTML +=
'<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(occupant.lotOccupantType || "") +
cityssm.escapeHTML(occupant.lotOccupantType || '') +
'">' +
'<i class="fas fa-user" aria-label="' +
los.escapedAliases.Occupancy +
'"></i> ' +
cityssm.escapeHTML(occupant.occupantName || "") +
"</span>" +
"<br />";
cityssm.escapeHTML(occupant.occupantName || '') +
'</span>' +
'<br />';
}
}
panelBlockElement.innerHTML =
@ -68,36 +68,36 @@ Object.defineProperty(exports, "__esModule", { value: true });
(milestone.workOrderMilestoneCompletionDate
? '<i class="fas fa-check" aria-label="Completed"></i>'
: '<i class="far fa-square has-text-grey" aria-label="Incomplete"></i>') +
"</span>" +
"</div>") +
'</span>' +
'</div>') +
('<div class="column">' +
(milestone.workOrderMilestoneTime === 0
? ""
: milestone.workOrderMilestoneTimeString + "<br />") +
? ''
: milestone.workOrderMilestoneTimeString + '<br />') +
(milestone.workOrderMilestoneTypeId
? "<strong>" +
? '<strong>' +
cityssm.escapeHTML(milestone.workOrderMilestoneType) +
"</strong><br />"
: "") +
'</strong><br />'
: '') +
'<span class="is-size-7">' +
cityssm.escapeHTML(milestone.workOrderMilestoneDescription) +
"</span>" +
"</div>") +
'</span>' +
'</div>') +
('<div class="column">' +
'<i class="fas fa-circle" style="color:' +
los.getRandomColor(milestone.workOrderNumber || "") +
los.getRandomColor(milestone.workOrderNumber || '') +
'" aria-hidden="true"></i>' +
' <a class="has-text-weight-bold" href="' +
los.getWorkOrderURL(milestone.workOrderId) +
'">' +
cityssm.escapeHTML(milestone.workOrderNumber || "") +
"</a><br />" +
cityssm.escapeHTML(milestone.workOrderNumber || '') +
'</a><br />' +
'<span class="is-size-7">' +
cityssm.escapeHTML(milestone.workOrderDescription || "") +
"</span>" +
"</div>") +
('<div class="column is-size-7">' + lotOccupancyHTML + "</div>") +
"</div>";
cityssm.escapeHTML(milestone.workOrderDescription || '') +
'</span>' +
'</div>') +
('<div class="column is-size-7">' + lotOccupancyHTML + '</div>') +
'</div>';
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();
})();

View File

@ -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 = `<div class="message is-info">
<p class="message-body">There are no milestones that meet the search criteria.</p>
</div>`;
return;
}
milestoneCalendarContainerElement.innerHTML = "";
const currentDate = cityssm.dateToString(new Date());
let currentPanelElement: HTMLElement | undefined;
let currentPanelDateString = "";
for (const milestone of workOrderMilestones) {
if (currentPanelDateString !== milestone.workOrderMilestoneDateString) {
if (currentPanelElement) {
milestoneCalendarContainerElement.append(currentPanelElement);
}
currentPanelElement = document.createElement("div");
currentPanelElement.className = "panel";
currentPanelElement.innerHTML = `<h2 class="panel-heading">${milestone.workOrderMilestoneDateString}</h2>`;
currentPanelDateString = milestone.workOrderMilestoneDateString!;
}
const panelBlockElement = document.createElement("div");
panelBlockElement.className = "panel-block is-block";
if (
!milestone.workOrderMilestoneCompletionDate &&
milestone.workOrderMilestoneDateString! < currentDate
) {
panelBlockElement.classList.add("has-background-warning-light");
}
let lotOccupancyHTML = "";
for (const lot of milestone.workOrderLots!) {
lotOccupancyHTML +=
'<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(lot.mapName || "") +
'">' +
'<i class="fas fa-vector-square" aria-label="' +
los.escapedAliases.Lot +
'"></i> ' +
cityssm.escapeHTML(lot.lotName || "") +
"</span>" +
"<br />";
}
for (const lotOccupancy of milestone.workOrderLotOccupancies!) {
for (const occupant of lotOccupancy.lotOccupancyOccupants!) {
lotOccupancyHTML +=
'<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(occupant.lotOccupantType || "") +
'">' +
'<i class="fas fa-user" aria-label="' +
los.escapedAliases.Occupancy +
'"></i> ' +
cityssm.escapeHTML(occupant.occupantName || "") +
"</span>" +
"<br />";
}
}
panelBlockElement.innerHTML =
'<div class="columns">' +
('<div class="column is-narrow">' +
'<span class="icon is-small">' +
(milestone.workOrderMilestoneCompletionDate
? '<i class="fas fa-check" aria-label="Completed"></i>'
: '<i class="far fa-square has-text-grey" aria-label="Incomplete"></i>') +
"</span>" +
"</div>") +
('<div class="column">' +
(milestone.workOrderMilestoneTime === 0
? ""
: milestone.workOrderMilestoneTimeString + "<br />") +
(milestone.workOrderMilestoneTypeId
? "<strong>" +
cityssm.escapeHTML(milestone.workOrderMilestoneType!) +
"</strong><br />"
: "") +
'<span class="is-size-7">' +
cityssm.escapeHTML(milestone.workOrderMilestoneDescription!) +
"</span>" +
"</div>") +
('<div class="column">' +
'<i class="fas fa-circle" style="color:' +
los.getRandomColor(milestone.workOrderNumber || "") +
'" aria-hidden="true"></i>' +
' <a class="has-text-weight-bold" href="' +
los.getWorkOrderURL(milestone.workOrderId!) +
'">' +
cityssm.escapeHTML(milestone.workOrderNumber || "") +
"</a><br />" +
'<span class="is-size-7">' +
cityssm.escapeHTML(milestone.workOrderDescription || "") +
"</span>" +
"</div>") +
('<div class="column is-size-7">' + lotOccupancyHTML + "</div>") +
"</div>";
(currentPanelElement as HTMLElement).append(panelBlockElement);
}
milestoneCalendarContainerElement.append(currentPanelElement!);
function renderMilestones(
workOrderMilestones: recordTypes.WorkOrderMilestone[]
) {
if (workOrderMilestones.length === 0) {
milestoneCalendarContainerElement.innerHTML = `<div class="message is-info">
<p class="message-body">There are no milestones that meet the search criteria.</p>
</div>`
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 = `<h2 class="panel-heading">${milestone.workOrderMilestoneDateString}</h2>`
currentPanelDateString = milestone.workOrderMilestoneDateString!
}
const panelBlockElement = document.createElement('div')
panelBlockElement.className = 'panel-block is-block'
if (
!milestone.workOrderMilestoneCompletionDate &&
milestone.workOrderMilestoneDateString! < currentDate
) {
panelBlockElement.classList.add('has-background-warning-light')
}
let lotOccupancyHTML = ''
for (const lot of milestone.workOrderLots!) {
lotOccupancyHTML +=
'<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(lot.mapName || '') +
'">' +
'<i class="fas fa-vector-square" aria-label="' +
los.escapedAliases.Lot +
'"></i> ' +
cityssm.escapeHTML(lot.lotName || '') +
'</span>' +
'<br />'
}
for (const lotOccupancy of milestone.workOrderLotOccupancies!) {
for (const occupant of lotOccupancy.lotOccupancyOccupants!) {
lotOccupancyHTML +=
'<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(occupant.lotOccupantType || '') +
'">' +
'<i class="fas fa-user" aria-label="' +
los.escapedAliases.Occupancy +
'"></i> ' +
cityssm.escapeHTML(occupant.occupantName || '') +
'</span>' +
'<br />'
}
}
panelBlockElement.innerHTML =
'<div class="columns">' +
('<div class="column is-narrow">' +
'<span class="icon is-small">' +
(milestone.workOrderMilestoneCompletionDate
? '<i class="fas fa-check" aria-label="Completed"></i>'
: '<i class="far fa-square has-text-grey" aria-label="Incomplete"></i>') +
'</span>' +
'</div>') +
('<div class="column">' +
(milestone.workOrderMilestoneTime === 0
? ''
: milestone.workOrderMilestoneTimeString + '<br />') +
(milestone.workOrderMilestoneTypeId
? '<strong>' +
cityssm.escapeHTML(milestone.workOrderMilestoneType!) +
'</strong><br />'
: '') +
'<span class="is-size-7">' +
cityssm.escapeHTML(milestone.workOrderMilestoneDescription!) +
'</span>' +
'</div>') +
('<div class="column">' +
'<i class="fas fa-circle" style="color:' +
los.getRandomColor(milestone.workOrderNumber || '') +
'" aria-hidden="true"></i>' +
' <a class="has-text-weight-bold" href="' +
los.getWorkOrderURL(milestone.workOrderId!) +
'">' +
cityssm.escapeHTML(milestone.workOrderNumber || '') +
'</a><br />' +
'<span class="is-size-7">' +
cityssm.escapeHTML(milestone.workOrderDescription || '') +
'</span>' +
'</div>') +
('<div class="column is-size-7">' + lotOccupancyHTML + '</div>') +
'</div>'
;(currentPanelElement as HTMLElement).append(panelBlockElement)
}
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()
})()

View File

@ -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();
});

View File

@ -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<HTMLInputElement | HTMLSelectElement>;
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()
})
})()

View File

@ -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 =
'<div class="message is-info">' +
'<p class="message-body">There are no work orders that meet the search criteria.</p>' +
"</div>";
'</div>';
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 +=
'<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(lot.mapName || "") +
cityssm.escapeHTML(lot.mapName || '') +
'">' +
'<i class="fas fa-fw fa-vector-square" aria-label="' +
los.escapedAliases.Lot +
'"></i> ' +
cityssm.escapeHTML(lot.lotName || "(No " + exports.aliases.Lot + " Name)") +
"</span><br />";
cityssm.escapeHTML(lot.lotName || '(No ' + exports.aliases.Lot + ' Name)') +
'</span><br />';
}
for (const occupancy of workOrder.workOrderLotOccupancies) {
for (const occupant of occupancy.lotOccupancyOccupants) {
relatedHTML +=
'<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(occupant.lotOccupantType || "") +
cityssm.escapeHTML(occupant.lotOccupantType || '') +
'">' +
'<i class="fas fa-fw fa-' +
cityssm.escapeHTML(occupant.fontAwesomeIconClass || "user") +
cityssm.escapeHTML(occupant.fontAwesomeIconClass || 'user') +
'" aria-label="' +
los.escapedAliases.occupant +
'"></i> ' +
cityssm.escapeHTML(occupant.occupantName || "(No Name)") +
"</span><br />";
cityssm.escapeHTML(occupant.occupantName || '(No Name)') +
'</span><br />';
}
}
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
("<td>" +
resultsTbodyElement.insertAdjacentHTML('beforeend', '<tr>' +
('<td>' +
'<a class="has-text-weight-bold" href="' +
los.getWorkOrderURL(workOrder.workOrderId) +
'">' +
(workOrder.workOrderNumber.trim()
? cityssm.escapeHTML(workOrder.workOrderNumber || "")
: "(No Number)") +
"</a>" +
"</td>") +
("<td>" +
cityssm.escapeHTML(workOrder.workOrderType || "") +
"<br />" +
? cityssm.escapeHTML(workOrder.workOrderNumber || '')
: '(No Number)') +
'</a>' +
'</td>') +
('<td>' +
cityssm.escapeHTML(workOrder.workOrderType || '') +
'<br />' +
'<span class="is-size-7">' +
cityssm.escapeHTML(workOrder.workOrderDescription || "") +
"</span>" +
"</td>") +
('<td class="is-nowrap"><span class="is-size-7">' + relatedHTML + "</span></td>") +
cityssm.escapeHTML(workOrder.workOrderDescription || '') +
'</span>' +
'</td>') +
('<td class="is-nowrap"><span class="is-size-7">' +
relatedHTML +
'</span></td>') +
('<td class="is-nowrap">' +
('<span class="has-tooltip-left" data-tooltip="' +
los.escapedAliases.WorkOrderOpenDate +
@ -73,7 +75,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
los.escapedAliases.WorkOrderOpenDate +
'"></i> ' +
workOrder.workOrderOpenDateString +
"</span><br />") +
'</span><br />') +
('<span class="has-tooltip-left" data-tooltip="' +
los.escapedAliases.WorkOrderCloseDate +
'">' +
@ -84,55 +86,57 @@ Object.defineProperty(exports, "__esModule", { value: true });
? workOrder.workOrderCloseDateString
: '<span class="has-text-grey">(No ' +
los.escapedAliases.WorkOrderCloseDate +
")</span>") +
"</span>") +
"</td>") +
("<td>" +
')</span>') +
'</span>') +
'</td>') +
('<td>' +
(workOrder.workOrderMilestoneCount === 0
? "-"
? '-'
: workOrder.workOrderMilestoneCompletionCount +
" / " +
' / ' +
workOrder.workOrderMilestoneCount) +
"</td>") +
'</td>') +
(workOrderPrints.length > 0
? "<td>" +
? '<td>' +
'<a class="button is-small" data-tooltip="Print" href="' +
los.urlPrefix +
"/print/" +
'/print/' +
workOrderPrints[0] +
"/?workOrderId=" +
'/?workOrderId=' +
workOrder.workOrderId +
'" target="_blank">' +
'<i class="fas fa-print" aria-label="Print"></i>' +
"</a>" +
"</td>"
: "") +
"</tr>");
'</a>' +
'</td>'
: '') +
'</tr>');
}
searchResultsContainerElement.innerHTML =
'<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">' +
"<thead><tr>" +
"<th>Work Order Number</th>" +
"<th>Description</th>" +
"<th>Related</th>" +
"<th>Date</th>" +
'<thead><tr>' +
'<th>Work Order Number</th>' +
'<th>Description</th>' +
'<th>Related</th>' +
'<th>Date</th>' +
'<th class="has-tooltip-bottom" data-tooltip="Completed / Total Milestones">Progress</th>' +
(workOrderPrints.length > 0 ? '<th class="has-width-1"></th>' : "") +
"</tr></thead>" +
"<table>";
searchResultsContainerElement.insertAdjacentHTML("beforeend", los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count));
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement);
(workOrderPrints.length > 0 ? '<th class="has-width-1"></th>' : '') +
'</tr></thead>' +
'<table>';
searchResultsContainerElement.insertAdjacentHTML('beforeend', los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count));
searchResultsContainerElement
.querySelector('table')
.append(resultsTbodyElement);
(_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;
const workOrderOpenDateStringElement = document.querySelector("#searchFilter--workOrderOpenDateString") as HTMLInputElement;
document.querySelector("#button--workOrderOpenDateString-previous").addEventListener("click", () => {
document.querySelector("#button--workOrderOpenDateString-previous").addEventListener("click", () => {
if (workOrderOpenDateStringElement.value === "") {
workOrderOpenDateStringElement.valueAsDate = new Date();
} else {
const openDate = workOrderOpenDateStringElement.valueAsDate;
openDate.setDate(openDate.getDate() - 1);
workOrderOpenDateStringElement.valueAsDate = openDate;
}
if (workOrderOpenDateStringElement.value === "") {
workOrderOpenDateStringElement.valueAsDate = new Date();
} else {
const openDate = workOrderOpenDateStringElement.valueAsDate;
openDate.setDate(openDate.getDate() - 1);
workOrderOpenDateStringElement.valueAsDate = openDate;
}
resetOffsetAndGetWorkOrders();
});
resetOffsetAndGetWorkOrders();
});
document.querySelector("#button--workOrderOpenDateString-next").addEventListener("click", () => {
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;
}
if (workOrderOpenDateStringElement.value === "") {
workOrderOpenDateStringElement.valueAsDate = new Date();
} else {
const openDate = workOrderOpenDateStringElement.valueAsDate;
openDate.setDate(openDate.getDate() + 1);
workOrderOpenDateStringElement.valueAsDate = openDate;
}
resetOffsetAndGetWorkOrders();
});
*/
resetOffsetAndGetWorkOrders();
});
*/
getWorkOrders();
})();

View File

@ -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 =
'<div class="message is-info">' +
'<p class="message-body">There are no work orders that meet the search criteria.</p>' +
"</div>";
function renderWorkOrders(responseJSON: {
count: number
offset: number
workOrders: recordTypes.WorkOrder[]
}) {
if (responseJSON.workOrders.length === 0) {
searchResultsContainerElement.innerHTML =
'<div class="message is-info">' +
'<p class="message-body">There are no work orders that meet the search criteria.</p>' +
'</div>'
return;
return
}
const resultsTbodyElement = document.createElement('tbody')
for (const workOrder of responseJSON.workOrders) {
let relatedHTML = ''
for (const lot of workOrder.workOrderLots!) {
relatedHTML +=
'<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(lot.mapName || '') +
'">' +
'<i class="fas fa-fw fa-vector-square" aria-label="' +
los.escapedAliases.Lot +
'"></i> ' +
cityssm.escapeHTML(
lot.lotName || '(No ' + exports.aliases.Lot + ' Name)'
) +
'</span><br />'
}
for (const occupancy of workOrder.workOrderLotOccupancies!) {
for (const occupant of occupancy.lotOccupancyOccupants!) {
relatedHTML +=
'<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(occupant.lotOccupantType || '') +
'">' +
'<i class="fas fa-fw fa-' +
cityssm.escapeHTML(occupant.fontAwesomeIconClass || 'user') +
'" aria-label="' +
los.escapedAliases.occupant +
'"></i> ' +
cityssm.escapeHTML(occupant.occupantName || '(No Name)') +
'</span><br />'
}
}
const resultsTbodyElement = document.createElement("tbody");
for (const workOrder of responseJSON.workOrders) {
let relatedHTML = "";
for (const lot of workOrder.workOrderLots!) {
relatedHTML +=
'<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(lot.mapName || "") +
'">' +
'<i class="fas fa-fw fa-vector-square" aria-label="' +
los.escapedAliases.Lot +
'"></i> ' +
cityssm.escapeHTML(lot.lotName || "(No " + exports.aliases.Lot + " Name)") +
"</span><br />";
}
for (const occupancy of workOrder.workOrderLotOccupancies!) {
for (const occupant of occupancy.lotOccupancyOccupants!) {
relatedHTML +=
'<span class="has-tooltip-left" data-tooltip="' +
cityssm.escapeHTML(occupant.lotOccupantType || "") +
'">' +
'<i class="fas fa-fw fa-' +
cityssm.escapeHTML(occupant.fontAwesomeIconClass || "user") +
'" aria-label="' +
los.escapedAliases.occupant +
'"></i> ' +
cityssm.escapeHTML(occupant.occupantName || "(No Name)") +
"</span><br />";
}
}
resultsTbodyElement.insertAdjacentHTML(
"beforeend",
"<tr>" +
("<td>" +
'<a class="has-text-weight-bold" href="' +
los.getWorkOrderURL(workOrder.workOrderId!) +
'">' +
(workOrder.workOrderNumber!.trim()
? cityssm.escapeHTML(workOrder.workOrderNumber || "")
: "(No Number)") +
"</a>" +
"</td>") +
("<td>" +
cityssm.escapeHTML(workOrder.workOrderType || "") +
"<br />" +
'<span class="is-size-7">' +
cityssm.escapeHTML(workOrder.workOrderDescription || "") +
"</span>" +
"</td>") +
('<td class="is-nowrap"><span class="is-size-7">' + relatedHTML + "</span></td>") +
('<td class="is-nowrap">' +
('<span class="has-tooltip-left" data-tooltip="' +
los.escapedAliases.WorkOrderOpenDate +
'">' +
'<i class="fas fa-fw fa-play" aria-label="' +
los.escapedAliases.WorkOrderOpenDate +
'"></i> ' +
workOrder.workOrderOpenDateString +
"</span><br />") +
('<span class="has-tooltip-left" data-tooltip="' +
los.escapedAliases.WorkOrderCloseDate +
'">' +
'<i class="fas fa-fw fa-stop" aria-label="' +
los.escapedAliases.WorkOrderCloseDate +
'"></i> ' +
(workOrder.workOrderCloseDate
? workOrder.workOrderCloseDateString
: '<span class="has-text-grey">(No ' +
los.escapedAliases.WorkOrderCloseDate +
")</span>") +
"</span>") +
"</td>") +
("<td>" +
(workOrder.workOrderMilestoneCount === 0
? "-"
: workOrder.workOrderMilestoneCompletionCount +
" / " +
workOrder.workOrderMilestoneCount) +
"</td>") +
(workOrderPrints.length > 0
? "<td>" +
'<a class="button is-small" data-tooltip="Print" href="' +
los.urlPrefix +
"/print/" +
workOrderPrints[0] +
"/?workOrderId=" +
workOrder.workOrderId +
'" target="_blank">' +
'<i class="fas fa-print" aria-label="Print"></i>' +
"</a>" +
"</td>"
: "") +
"</tr>"
);
}
searchResultsContainerElement.innerHTML =
'<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">' +
"<thead><tr>" +
"<th>Work Order Number</th>" +
"<th>Description</th>" +
"<th>Related</th>" +
"<th>Date</th>" +
'<th class="has-tooltip-bottom" data-tooltip="Completed / Total Milestones">Progress</th>' +
(workOrderPrints.length > 0 ? '<th class="has-width-1"></th>' : "") +
"</tr></thead>" +
"<table>";
searchResultsContainerElement.insertAdjacentHTML(
"beforeend",
los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count)
);
searchResultsContainerElement.querySelector("table")!.append(resultsTbodyElement);
searchResultsContainerElement
.querySelector("button[data-page='previous']")
?.addEventListener("click", previousAndGetWorkOrders);
searchResultsContainerElement
.querySelector("button[data-page='next']")
?.addEventListener("click", nextAndGetWorkOrders);
resultsTbodyElement.insertAdjacentHTML(
'beforeend',
'<tr>' +
('<td>' +
'<a class="has-text-weight-bold" href="' +
los.getWorkOrderURL(workOrder.workOrderId!) +
'">' +
(workOrder.workOrderNumber!.trim()
? cityssm.escapeHTML(workOrder.workOrderNumber || '')
: '(No Number)') +
'</a>' +
'</td>') +
('<td>' +
cityssm.escapeHTML(workOrder.workOrderType || '') +
'<br />' +
'<span class="is-size-7">' +
cityssm.escapeHTML(workOrder.workOrderDescription || '') +
'</span>' +
'</td>') +
('<td class="is-nowrap"><span class="is-size-7">' +
relatedHTML +
'</span></td>') +
('<td class="is-nowrap">' +
('<span class="has-tooltip-left" data-tooltip="' +
los.escapedAliases.WorkOrderOpenDate +
'">' +
'<i class="fas fa-fw fa-play" aria-label="' +
los.escapedAliases.WorkOrderOpenDate +
'"></i> ' +
workOrder.workOrderOpenDateString +
'</span><br />') +
('<span class="has-tooltip-left" data-tooltip="' +
los.escapedAliases.WorkOrderCloseDate +
'">' +
'<i class="fas fa-fw fa-stop" aria-label="' +
los.escapedAliases.WorkOrderCloseDate +
'"></i> ' +
(workOrder.workOrderCloseDate
? workOrder.workOrderCloseDateString
: '<span class="has-text-grey">(No ' +
los.escapedAliases.WorkOrderCloseDate +
')</span>') +
'</span>') +
'</td>') +
('<td>' +
(workOrder.workOrderMilestoneCount === 0
? '-'
: workOrder.workOrderMilestoneCompletionCount +
' / ' +
workOrder.workOrderMilestoneCount) +
'</td>') +
(workOrderPrints.length > 0
? '<td>' +
'<a class="button is-small" data-tooltip="Print" href="' +
los.urlPrefix +
'/print/' +
workOrderPrints[0] +
'/?workOrderId=' +
workOrder.workOrderId +
'" target="_blank">' +
'<i class="fas fa-print" aria-label="Print"></i>' +
'</a>' +
'</td>'
: '') +
'</tr>'
)
}
function getWorkOrders() {
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML("Loading Work Orders...");
searchResultsContainerElement.innerHTML =
'<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">' +
'<thead><tr>' +
'<th>Work Order Number</th>' +
'<th>Description</th>' +
'<th>Related</th>' +
'<th>Date</th>' +
'<th class="has-tooltip-bottom" data-tooltip="Completed / Total Milestones">Progress</th>' +
(workOrderPrints.length > 0 ? '<th class="has-width-1"></th>' : '') +
'</tr></thead>' +
'<table>'
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<HTMLInputElement | HTMLSelectElement>
for (const filterElement of filterElements) {
filterElement.addEventListener('change', resetOffsetAndGetWorkOrders)
}
searchFilterFormElement.addEventListener('submit', (formEvent) => {
formEvent.preventDefault()
resetOffsetAndGetWorkOrders()
})
/*
const workOrderOpenDateStringElement = document.querySelector("#searchFilter--workOrderOpenDateString") as HTMLInputElement;
document.querySelector("#button--workOrderOpenDateString-previous").addEventListener("click", () => {
@ -233,5 +256,5 @@ declare const cityssm: cityssmGlobal;
});
*/
getWorkOrders();
})();
getWorkOrders()
})()

View File

@ -3,33 +3,32 @@
Object.defineProperty(exports, "__esModule", { value: true });
(() => {
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
}
});

View File

@ -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
}
})
})
}
})()

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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