linting with mega linter
parent
119c325cc3
commit
a4f4b353fc
|
|
@ -20,6 +20,7 @@
|
|||
"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",
|
||||
|
|
@ -31,7 +32,6 @@
|
|||
"ignore": ["DB", "URL"]
|
||||
}
|
||||
],
|
||||
"unicorn/prefer-node-protocol": "off",
|
||||
"unicorn/prevent-abbreviations": [
|
||||
"error",
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
{
|
||||
"trailingComma": "none",
|
||||
"tabWidth": 4,
|
||||
"semi": true,
|
||||
"singleQuote": false,
|
||||
"printWidth": 110
|
||||
"tabWidth": 2,
|
||||
"semi": false,
|
||||
"singleQuote": true
|
||||
}
|
||||
|
|
|
|||
153
app.js
153
app.js
|
|
@ -1,44 +1,44 @@
|
|||
import createError from "http-errors";
|
||||
import express from "express";
|
||||
import compression from "compression";
|
||||
import path from "node:path";
|
||||
import cookieParser from "cookie-parser";
|
||||
import csurf from "csurf";
|
||||
import rateLimit from "express-rate-limit";
|
||||
import session from "express-session";
|
||||
import FileStore from "session-file-store";
|
||||
import * as permissionHandlers from "./handlers/permissions.js";
|
||||
import routerLogin from "./routes/login.js";
|
||||
import routerDashboard from "./routes/dashboard.js";
|
||||
import routerApi from "./routes/api.js";
|
||||
import routerPrint from "./routes/print.js";
|
||||
import routerMaps from "./routes/maps.js";
|
||||
import routerLots from "./routes/lots.js";
|
||||
import routerLotOccupancies from "./routes/lotOccupancies.js";
|
||||
import routerWorkOrders from "./routes/workOrders.js";
|
||||
import routerReports from "./routes/reports.js";
|
||||
import routerAdmin from "./routes/admin.js";
|
||||
import * as configFunctions from "./helpers/functions.config.js";
|
||||
import * as printFunctions from "./helpers/functions.print.js";
|
||||
import * as dateTimeFns from "@cityssm/expressjs-server-js/dateTimeFns.js";
|
||||
import * as stringFns from "@cityssm/expressjs-server-js/stringFns.js";
|
||||
import * as htmlFns from "@cityssm/expressjs-server-js/htmlFns.js";
|
||||
import { version } from "./version.js";
|
||||
import * as databaseInitializer from "./helpers/initializer.database.js";
|
||||
import { apiGetHandler } from "./handlers/permissions.js";
|
||||
import { getSafeRedirectURL } from "./helpers/functions.authentication.js";
|
||||
import debug from "debug";
|
||||
const debugApp = debug("lot-occupancy-system:app");
|
||||
import createError from 'http-errors';
|
||||
import express from 'express';
|
||||
import compression from 'compression';
|
||||
import path from 'node:path';
|
||||
import cookieParser from 'cookie-parser';
|
||||
import csurf from 'csurf';
|
||||
import rateLimit from 'express-rate-limit';
|
||||
import session from 'express-session';
|
||||
import FileStore from 'session-file-store';
|
||||
import * as permissionHandlers from './handlers/permissions.js';
|
||||
import routerLogin from './routes/login.js';
|
||||
import routerDashboard from './routes/dashboard.js';
|
||||
import routerApi from './routes/api.js';
|
||||
import routerPrint from './routes/print.js';
|
||||
import routerMaps from './routes/maps.js';
|
||||
import routerLots from './routes/lots.js';
|
||||
import routerLotOccupancies from './routes/lotOccupancies.js';
|
||||
import routerWorkOrders from './routes/workOrders.js';
|
||||
import routerReports from './routes/reports.js';
|
||||
import routerAdmin from './routes/admin.js';
|
||||
import * as configFunctions from './helpers/functions.config.js';
|
||||
import * as printFunctions from './helpers/functions.print.js';
|
||||
import * as dateTimeFns from '@cityssm/expressjs-server-js/dateTimeFns.js';
|
||||
import * as stringFns from '@cityssm/expressjs-server-js/stringFns.js';
|
||||
import * as htmlFns from '@cityssm/expressjs-server-js/htmlFns.js';
|
||||
import { version } from './version.js';
|
||||
import * as databaseInitializer from './helpers/initializer.database.js';
|
||||
import { apiGetHandler } from './handlers/permissions.js';
|
||||
import { getSafeRedirectURL } from './helpers/functions.authentication.js';
|
||||
import debug from 'debug';
|
||||
const debugApp = debug('lot-occupancy-system:app');
|
||||
databaseInitializer.initializeDatabase();
|
||||
const __dirname = ".";
|
||||
const __dirname = '.';
|
||||
export const app = express();
|
||||
app.disable("X-Powered-By");
|
||||
if (!configFunctions.getProperty("reverseProxy.disableEtag")) {
|
||||
app.set("etag", false);
|
||||
app.disable('X-Powered-By');
|
||||
if (!configFunctions.getProperty('reverseProxy.disableEtag')) {
|
||||
app.set('etag', false);
|
||||
}
|
||||
app.set("views", path.join(__dirname, "views"));
|
||||
app.set("view engine", "ejs");
|
||||
if (!configFunctions.getProperty("reverseProxy.disableCompression")) {
|
||||
app.set('views', path.join(__dirname, 'views'));
|
||||
app.set('view engine', 'ejs');
|
||||
if (!configFunctions.getProperty('reverseProxy.disableCompression')) {
|
||||
app.use(compression());
|
||||
}
|
||||
app.use((request, _response, next) => {
|
||||
|
|
@ -53,38 +53,37 @@ app.use(cookieParser());
|
|||
app.use(csurf({
|
||||
cookie: true
|
||||
}));
|
||||
const limiter = rateLimit({
|
||||
windowMs: 1000,
|
||||
max: 25 * Math.max(3, configFunctions.getProperty("users.canLogin").length)
|
||||
});
|
||||
app.use(limiter);
|
||||
const urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix");
|
||||
if (urlPrefix !== "") {
|
||||
debugApp("urlPrefix = " + urlPrefix);
|
||||
app.use(rateLimit({
|
||||
windowMs: 10000,
|
||||
max: 200
|
||||
}));
|
||||
const urlPrefix = configFunctions.getProperty('reverseProxy.urlPrefix');
|
||||
if (urlPrefix !== '') {
|
||||
debugApp('urlPrefix = ' + urlPrefix);
|
||||
}
|
||||
app.use(urlPrefix, express.static(path.join("public")));
|
||||
app.use(urlPrefix + "/lib/bulma-calendar", express.static(path.join("node_modules", "bulma-calendar", "dist")));
|
||||
app.use(urlPrefix + "/lib/cityssm-bulma-js", express.static(path.join("node_modules", "@cityssm", "bulma-js", "dist")));
|
||||
app.use(urlPrefix + "/lib/cityssm-bulma-webapp-js", express.static(path.join("node_modules", "@cityssm", "bulma-webapp-js")));
|
||||
app.use(urlPrefix + "/lib/fa", express.static(path.join("node_modules", "@fortawesome", "fontawesome-free")));
|
||||
app.use(urlPrefix + "/lib/leaflet", express.static(path.join("node_modules", "leaflet", "dist")));
|
||||
app.use(urlPrefix + "/lib/randomcolor", express.static(path.join("node_modules", "randomcolor")));
|
||||
const sessionCookieName = configFunctions.getProperty("session.cookieName");
|
||||
app.use(urlPrefix, express.static(path.join('public')));
|
||||
app.use(urlPrefix + '/lib/bulma-calendar', express.static(path.join('node_modules', 'bulma-calendar', 'dist')));
|
||||
app.use(urlPrefix + '/lib/cityssm-bulma-js', express.static(path.join('node_modules', '@cityssm', 'bulma-js', 'dist')));
|
||||
app.use(urlPrefix + '/lib/cityssm-bulma-webapp-js', express.static(path.join('node_modules', '@cityssm', 'bulma-webapp-js')));
|
||||
app.use(urlPrefix + '/lib/fa', express.static(path.join('node_modules', '@fortawesome', 'fontawesome-free')));
|
||||
app.use(urlPrefix + '/lib/leaflet', express.static(path.join('node_modules', 'leaflet', 'dist')));
|
||||
app.use(urlPrefix + '/lib/randomcolor', express.static(path.join('node_modules', 'randomcolor')));
|
||||
const sessionCookieName = configFunctions.getProperty('session.cookieName');
|
||||
const FileStoreSession = FileStore(session);
|
||||
app.use(session({
|
||||
store: new FileStoreSession({
|
||||
path: "./data/sessions",
|
||||
logFn: debug("lot-occupancy-system:session"),
|
||||
path: './data/sessions',
|
||||
logFn: debug('lot-occupancy-system:session'),
|
||||
retries: 20
|
||||
}),
|
||||
name: sessionCookieName,
|
||||
secret: configFunctions.getProperty("session.secret"),
|
||||
secret: configFunctions.getProperty('session.secret'),
|
||||
resave: true,
|
||||
saveUninitialized: false,
|
||||
rolling: true,
|
||||
cookie: {
|
||||
maxAge: configFunctions.getProperty("session.maxAgeMillis"),
|
||||
sameSite: "strict"
|
||||
maxAge: configFunctions.getProperty('session.maxAgeMillis'),
|
||||
sameSite: 'strict'
|
||||
}
|
||||
}));
|
||||
app.use((request, response, next) => {
|
||||
|
|
@ -109,38 +108,38 @@ app.use((request, response, next) => {
|
|||
response.locals.dateTimeFunctions = dateTimeFns;
|
||||
response.locals.stringFunctions = stringFns;
|
||||
response.locals.htmlFunctions = htmlFns;
|
||||
response.locals.urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix");
|
||||
response.locals.urlPrefix = configFunctions.getProperty('reverseProxy.urlPrefix');
|
||||
next();
|
||||
});
|
||||
app.get(urlPrefix + "/", sessionChecker, (_request, response) => {
|
||||
response.redirect(urlPrefix + "/dashboard");
|
||||
app.get(urlPrefix + '/', sessionChecker, (_request, response) => {
|
||||
response.redirect(urlPrefix + '/dashboard');
|
||||
});
|
||||
app.use(urlPrefix + "/dashboard", sessionChecker, routerDashboard);
|
||||
app.use(urlPrefix + "/api/:apiKey", apiGetHandler, routerApi);
|
||||
app.use(urlPrefix + "/print", sessionChecker, routerPrint);
|
||||
app.use(urlPrefix + "/maps", sessionChecker, routerMaps);
|
||||
app.use(urlPrefix + "/lots", sessionChecker, routerLots);
|
||||
app.use(urlPrefix + "/lotOccupancies", sessionChecker, routerLotOccupancies);
|
||||
app.use(urlPrefix + "/workOrders", sessionChecker, routerWorkOrders);
|
||||
app.use(urlPrefix + "/reports", sessionChecker, routerReports);
|
||||
app.use(urlPrefix + "/admin", sessionChecker, permissionHandlers.adminGetHandler, routerAdmin);
|
||||
app.all(urlPrefix + "/keepAlive", (_request, response) => {
|
||||
app.use(urlPrefix + '/dashboard', sessionChecker, routerDashboard);
|
||||
app.use(urlPrefix + '/api/:apiKey', apiGetHandler, routerApi);
|
||||
app.use(urlPrefix + '/print', sessionChecker, routerPrint);
|
||||
app.use(urlPrefix + '/maps', sessionChecker, routerMaps);
|
||||
app.use(urlPrefix + '/lots', sessionChecker, routerLots);
|
||||
app.use(urlPrefix + '/lotOccupancies', sessionChecker, routerLotOccupancies);
|
||||
app.use(urlPrefix + '/workOrders', sessionChecker, routerWorkOrders);
|
||||
app.use(urlPrefix + '/reports', sessionChecker, routerReports);
|
||||
app.use(urlPrefix + '/admin', sessionChecker, permissionHandlers.adminGetHandler, routerAdmin);
|
||||
app.all(urlPrefix + '/keepAlive', (_request, response) => {
|
||||
response.json(true);
|
||||
});
|
||||
app.use(urlPrefix + "/login", routerLogin);
|
||||
app.get(urlPrefix + "/logout", (request, response) => {
|
||||
app.use(urlPrefix + '/login', routerLogin);
|
||||
app.get(urlPrefix + '/logout', (request, response) => {
|
||||
if (request.session.user && request.cookies[sessionCookieName]) {
|
||||
request.session.destroy(() => {
|
||||
response.clearCookie(sessionCookieName);
|
||||
response.redirect(urlPrefix + "/");
|
||||
response.redirect(urlPrefix + '/');
|
||||
});
|
||||
}
|
||||
else {
|
||||
response.redirect(urlPrefix + "/login");
|
||||
response.redirect(urlPrefix + '/login');
|
||||
}
|
||||
});
|
||||
app.use((request, _response, next) => {
|
||||
debugApp(request.url);
|
||||
next(createError(404, "File not found."));
|
||||
next(createError(404, 'File not found.'));
|
||||
});
|
||||
export default app;
|
||||
|
|
|
|||
255
app.ts
255
app.ts
|
|
@ -1,189 +1,182 @@
|
|||
import createError from "http-errors";
|
||||
import express from "express";
|
||||
import createError from 'http-errors'
|
||||
import express from 'express'
|
||||
|
||||
import compression from "compression";
|
||||
import path from "node:path";
|
||||
import cookieParser from "cookie-parser";
|
||||
import csurf from "csurf";
|
||||
import rateLimit from "express-rate-limit";
|
||||
import compression from 'compression'
|
||||
import path from 'node:path'
|
||||
import cookieParser from 'cookie-parser'
|
||||
import csurf from 'csurf'
|
||||
import rateLimit from 'express-rate-limit'
|
||||
|
||||
import session from "express-session";
|
||||
import FileStore from "session-file-store";
|
||||
import session from 'express-session'
|
||||
import FileStore from 'session-file-store'
|
||||
|
||||
import * as permissionHandlers from "./handlers/permissions.js";
|
||||
import routerLogin from "./routes/login.js";
|
||||
import routerDashboard from "./routes/dashboard.js";
|
||||
import routerApi from "./routes/api.js";
|
||||
import routerPrint from "./routes/print.js";
|
||||
import routerMaps from "./routes/maps.js";
|
||||
import routerLots from "./routes/lots.js";
|
||||
import routerLotOccupancies from "./routes/lotOccupancies.js";
|
||||
import routerWorkOrders from "./routes/workOrders.js";
|
||||
import routerReports from "./routes/reports.js";
|
||||
import routerAdmin from "./routes/admin.js";
|
||||
import * as permissionHandlers from './handlers/permissions.js'
|
||||
import routerLogin from './routes/login.js'
|
||||
import routerDashboard from './routes/dashboard.js'
|
||||
import routerApi from './routes/api.js'
|
||||
import routerPrint from './routes/print.js'
|
||||
import routerMaps from './routes/maps.js'
|
||||
import routerLots from './routes/lots.js'
|
||||
import routerLotOccupancies from './routes/lotOccupancies.js'
|
||||
import routerWorkOrders from './routes/workOrders.js'
|
||||
import routerReports from './routes/reports.js'
|
||||
import routerAdmin from './routes/admin.js'
|
||||
|
||||
import * as configFunctions from "./helpers/functions.config.js";
|
||||
import * as printFunctions from "./helpers/functions.print.js";
|
||||
import * as dateTimeFns from "@cityssm/expressjs-server-js/dateTimeFns.js";
|
||||
import * as stringFns from "@cityssm/expressjs-server-js/stringFns.js";
|
||||
import * as htmlFns from "@cityssm/expressjs-server-js/htmlFns.js";
|
||||
import * as configFunctions from './helpers/functions.config.js'
|
||||
import * as printFunctions from './helpers/functions.print.js'
|
||||
import * as dateTimeFns from '@cityssm/expressjs-server-js/dateTimeFns.js'
|
||||
import * as stringFns from '@cityssm/expressjs-server-js/stringFns.js'
|
||||
import * as htmlFns from '@cityssm/expressjs-server-js/htmlFns.js'
|
||||
|
||||
import { version } from "./version.js";
|
||||
import { version } from './version.js'
|
||||
|
||||
import * as databaseInitializer from "./helpers/initializer.database.js";
|
||||
import * as databaseInitializer from './helpers/initializer.database.js'
|
||||
|
||||
import { apiGetHandler } from "./handlers/permissions.js";
|
||||
import { getSafeRedirectURL } from "./helpers/functions.authentication.js";
|
||||
import { apiGetHandler } from './handlers/permissions.js'
|
||||
import { getSafeRedirectURL } from './helpers/functions.authentication.js'
|
||||
|
||||
import debug from "debug";
|
||||
const debugApp = debug("lot-occupancy-system:app");
|
||||
import debug from 'debug'
|
||||
const debugApp = debug('lot-occupancy-system:app')
|
||||
|
||||
/*
|
||||
* INITALIZE THE DATABASE
|
||||
* INITIALIZE THE DATABASE
|
||||
*/
|
||||
|
||||
databaseInitializer.initializeDatabase();
|
||||
databaseInitializer.initializeDatabase()
|
||||
|
||||
/*
|
||||
* INITIALIZE APP
|
||||
*/
|
||||
|
||||
const __dirname = ".";
|
||||
const __dirname = '.'
|
||||
|
||||
export const app = express();
|
||||
export const app = express()
|
||||
|
||||
app.disable("X-Powered-By");
|
||||
app.disable('X-Powered-By')
|
||||
|
||||
if (!configFunctions.getProperty("reverseProxy.disableEtag")) {
|
||||
app.set("etag", false);
|
||||
if (!configFunctions.getProperty('reverseProxy.disableEtag')) {
|
||||
app.set('etag', false)
|
||||
}
|
||||
|
||||
// View engine setup
|
||||
app.set("views", path.join(__dirname, "views"));
|
||||
app.set("view engine", "ejs");
|
||||
app.set('views', path.join(__dirname, 'views'))
|
||||
app.set('view engine', 'ejs')
|
||||
|
||||
if (!configFunctions.getProperty("reverseProxy.disableCompression")) {
|
||||
app.use(compression());
|
||||
if (!configFunctions.getProperty('reverseProxy.disableCompression')) {
|
||||
app.use(compression())
|
||||
}
|
||||
|
||||
app.use((request, _response, next) => {
|
||||
debugApp(`${request.method} ${request.url}`);
|
||||
next();
|
||||
});
|
||||
debugApp(`${request.method} ${request.url}`)
|
||||
next()
|
||||
})
|
||||
|
||||
app.use(express.json());
|
||||
app.use(express.json())
|
||||
|
||||
app.use(
|
||||
express.urlencoded({
|
||||
extended: false
|
||||
})
|
||||
);
|
||||
)
|
||||
|
||||
app.use(cookieParser());
|
||||
app.use(cookieParser())
|
||||
app.use(
|
||||
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"),
|
||||
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'
|
||||
}
|
||||
})
|
||||
);
|
||||
)
|
||||
|
||||
// Clear cookie if no corresponding session
|
||||
app.use((request, response, next) => {
|
||||
if (request.cookies[sessionCookieName] && !request.session.user) {
|
||||
response.clearCookie(sessionCookieName);
|
||||
response.clearCookie(sessionCookieName)
|
||||
}
|
||||
|
||||
next();
|
||||
});
|
||||
next()
|
||||
})
|
||||
|
||||
// Redirect logged in users
|
||||
const sessionChecker = (
|
||||
request: express.Request,
|
||||
response: express.Response,
|
||||
next: express.NextFunction
|
||||
) => {
|
||||
const sessionChecker = (request: express.Request, response: express.Response, next: express.NextFunction) => {
|
||||
if (request.session.user && request.cookies[sessionCookieName]) {
|
||||
return next();
|
||||
return 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) => {
|
||||
app.get(urlPrefix + '/logout', (request, response) => {
|
||||
if (request.session.user && request.cookies[sessionCookieName]) {
|
||||
request.session.destroy(() => {
|
||||
response.clearCookie(sessionCookieName);
|
||||
response.redirect(urlPrefix + "/");
|
||||
});
|
||||
response.clearCookie(sessionCookieName)
|
||||
response.redirect(urlPrefix + '/')
|
||||
})
|
||||
} else {
|
||||
response.redirect(urlPrefix + "/login");
|
||||
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
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
baseUrl: 'http://localhost:7000',
|
||||
specPattern: 'cypress/e2e/**/*.cy.ts',
|
||||
supportFile: false,
|
||||
projectId: "xya1fn"
|
||||
projectId: 'xya1fn'
|
||||
}
|
||||
});
|
||||
})
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
}
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"mapName": "Cypress Test - Holy Sepulchre",
|
||||
"mapDescription": "Operated by the City of Sault Ste. Marie" ,
|
||||
"mapDescription": "Operated by the City of Sault Ste. Marie",
|
||||
"mapAddress1": "Fourth Line and Peoples Road",
|
||||
"mapAddress2": "27 Fourth Line East",
|
||||
"mapPostalCode": "P6A 5K8",
|
||||
|
|
|
|||
62
gulpfile.js
62
gulpfile.js
|
|
@ -1,59 +1,59 @@
|
|||
import gulp from "gulp";
|
||||
import changed from "gulp-changed";
|
||||
import minify from "gulp-minify";
|
||||
import include from "gulp-include";
|
||||
import dartSass from "sass";
|
||||
import gulpSass from "gulp-sass";
|
||||
import gulp from 'gulp';
|
||||
import changed from 'gulp-changed';
|
||||
import minify from 'gulp-minify';
|
||||
import include from 'gulp-include';
|
||||
import dartSass from 'sass';
|
||||
import gulpSass from 'gulp-sass';
|
||||
const sass = gulpSass(dartSass);
|
||||
const publicSCSSDestination = "public/stylesheets";
|
||||
const publicSCSSDestination = 'public/stylesheets';
|
||||
const publicSCSSFunction = () => {
|
||||
return gulp
|
||||
.src("public-scss/*.scss")
|
||||
.pipe(sass({ outputStyle: "compressed", includePaths: ["node_modules"] }).on("error", sass.logError))
|
||||
.src('public-scss/*.scss')
|
||||
.pipe(sass({ outputStyle: 'compressed', includePaths: ['node_modules'] }).on('error', sass.logError))
|
||||
.pipe(gulp.dest(publicSCSSDestination));
|
||||
};
|
||||
gulp.task("public-scss", publicSCSSFunction);
|
||||
const publicJavascriptsDestination = "public/javascripts";
|
||||
gulp.task('public-scss', publicSCSSFunction);
|
||||
const publicJavascriptsDestination = 'public/javascripts';
|
||||
const publicJavascriptsMinFunction = () => {
|
||||
return gulp
|
||||
.src("public-typescript/*.js", { allowEmpty: true })
|
||||
.src('public-typescript/*.js', { allowEmpty: true })
|
||||
.pipe(changed(publicJavascriptsDestination, {
|
||||
extension: ".min.js"
|
||||
extension: '.min.js'
|
||||
}))
|
||||
.pipe(minify({ noSource: true, ext: { min: ".min.js" } }))
|
||||
.pipe(minify({ noSource: true, ext: { min: '.min.js' } }))
|
||||
.pipe(gulp.dest(publicJavascriptsDestination));
|
||||
};
|
||||
const publicJavascriptsAdminTablesFunction = () => {
|
||||
return gulp
|
||||
.src("public-typescript/adminTables/adminTables.js")
|
||||
.src('public-typescript/adminTables/adminTables.js')
|
||||
.pipe(include())
|
||||
.pipe(gulp.dest("public-typescript"));
|
||||
.pipe(gulp.dest('public-typescript'));
|
||||
};
|
||||
const publicJavascriptsLotOccupancyEditFunction = () => {
|
||||
return gulp
|
||||
.src("public-typescript/lotOccupancyEdit/lotOccupancyEdit.js")
|
||||
.src('public-typescript/lotOccupancyEdit/lotOccupancyEdit.js')
|
||||
.pipe(include())
|
||||
.pipe(gulp.dest("public-typescript"));
|
||||
.pipe(gulp.dest('public-typescript'));
|
||||
};
|
||||
const publicJavascriptsWorkOrderEditFunction = () => {
|
||||
return gulp
|
||||
.src("public-typescript/workOrderEdit/workOrderEdit.js")
|
||||
.src('public-typescript/workOrderEdit/workOrderEdit.js')
|
||||
.pipe(include())
|
||||
.pipe(gulp.dest("public-typescript"));
|
||||
.pipe(gulp.dest('public-typescript'));
|
||||
};
|
||||
gulp.task("public-javascript-adminTables", publicJavascriptsAdminTablesFunction);
|
||||
gulp.task("public-javascript-lotOccupancyEdit", publicJavascriptsLotOccupancyEditFunction);
|
||||
gulp.task("public-javascript-workOrderEdit", publicJavascriptsWorkOrderEditFunction);
|
||||
gulp.task("public-javascript-min", publicJavascriptsMinFunction);
|
||||
gulp.task('public-javascript-adminTables', publicJavascriptsAdminTablesFunction);
|
||||
gulp.task('public-javascript-lotOccupancyEdit', publicJavascriptsLotOccupancyEditFunction);
|
||||
gulp.task('public-javascript-workOrderEdit', publicJavascriptsWorkOrderEditFunction);
|
||||
gulp.task('public-javascript-min', publicJavascriptsMinFunction);
|
||||
const watchFunction = () => {
|
||||
gulp.watch("public-scss/*.scss", publicSCSSFunction);
|
||||
gulp.watch("public-typescript/adminTables/*.js", publicJavascriptsAdminTablesFunction);
|
||||
gulp.watch("public-typescript/lotOccupancyEdit/*.js", publicJavascriptsLotOccupancyEditFunction);
|
||||
gulp.watch("public-typescript/workOrderEdit/*.js", publicJavascriptsWorkOrderEditFunction);
|
||||
gulp.watch("public-typescript/*.js", publicJavascriptsMinFunction);
|
||||
gulp.watch('public-scss/*.scss', publicSCSSFunction);
|
||||
gulp.watch('public-typescript/adminTables/*.js', publicJavascriptsAdminTablesFunction);
|
||||
gulp.watch('public-typescript/lotOccupancyEdit/*.js', publicJavascriptsLotOccupancyEditFunction);
|
||||
gulp.watch('public-typescript/workOrderEdit/*.js', publicJavascriptsWorkOrderEditFunction);
|
||||
gulp.watch('public-typescript/*.js', publicJavascriptsMinFunction);
|
||||
};
|
||||
gulp.task("watch", watchFunction);
|
||||
gulp.task("default", () => {
|
||||
gulp.task('watch', watchFunction);
|
||||
gulp.task('default', () => {
|
||||
publicJavascriptsAdminTablesFunction();
|
||||
publicJavascriptsLotOccupancyEditFunction();
|
||||
publicJavascriptsWorkOrderEditFunction();
|
||||
|
|
|
|||
102
gulpfile.ts
102
gulpfile.ts
|
|
@ -1,110 +1,102 @@
|
|||
/* eslint-disable node/no-unpublished-import */
|
||||
|
||||
import gulp from "gulp";
|
||||
import changed from "gulp-changed";
|
||||
import minify from "gulp-minify";
|
||||
import include from "gulp-include";
|
||||
import gulp from 'gulp'
|
||||
import changed from 'gulp-changed'
|
||||
import minify from 'gulp-minify'
|
||||
import include from 'gulp-include'
|
||||
|
||||
import dartSass from "sass";
|
||||
import gulpSass from "gulp-sass";
|
||||
const sass = gulpSass(dartSass);
|
||||
import dartSass from 'sass'
|
||||
import gulpSass from 'gulp-sass'
|
||||
const sass = gulpSass(dartSass)
|
||||
|
||||
/*
|
||||
* Compile SASS
|
||||
*/
|
||||
|
||||
const publicSCSSDestination = "public/stylesheets";
|
||||
const publicSCSSDestination = 'public/stylesheets'
|
||||
|
||||
const publicSCSSFunction = () => {
|
||||
return gulp
|
||||
.src("public-scss/*.scss")
|
||||
.pipe(
|
||||
sass({ outputStyle: "compressed", includePaths: ["node_modules"] }).on(
|
||||
"error",
|
||||
sass.logError
|
||||
)
|
||||
)
|
||||
.pipe(gulp.dest(publicSCSSDestination));
|
||||
};
|
||||
.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 })
|
||||
.src('public-typescript/*.js', { allowEmpty: true })
|
||||
.pipe(
|
||||
changed(publicJavascriptsDestination, {
|
||||
extension: ".min.js"
|
||||
extension: '.min.js'
|
||||
})
|
||||
)
|
||||
.pipe(minify({ noSource: true, ext: { min: ".min.js" } }))
|
||||
.pipe(gulp.dest(publicJavascriptsDestination));
|
||||
};
|
||||
.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)
|
||||
|
||||
/*
|
||||
* 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()
|
||||
})
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
import type { RequestHandler } from "express";
|
||||
import type { RequestHandler } from 'express';
|
||||
export declare const handler: RequestHandler;
|
||||
export default handler;
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
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, {
|
||||
|
|
|
|||
|
|
@ -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({
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
@ -143,16 +140,11 @@ export function getWorkOrders(
|
|||
|
||||
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 as number,
|
||||
database
|
||||
);
|
||||
workOrder.workOrderComments = getWorkOrderComments(workOrder.workOrderId as number, database);
|
||||
}
|
||||
|
||||
if (options.includeLotsAndLotOccupancies) {
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
}
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -14,6 +14,10 @@ $black: #000;
|
|||
width: 10px;
|
||||
}
|
||||
|
||||
.has-width-900 {
|
||||
width: 900px;
|
||||
}
|
||||
|
||||
.has-min-page-height {
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
los.urlPrefix + '/admin/doCleanupDatabase',
|
||||
{},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
inactivedRecordCount: number;
|
||||
purgedRecordCount: number;
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
inactivedRecordCount: number
|
||||
purgedRecordCount: number
|
||||
}) => {
|
||||
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
|
||||
}
|
||||
});
|
||||
});
|
||||
})();
|
||||
})
|
||||
})
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -1,405 +1,457 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
|
||||
import type * as globalTypes from "../types/globalTypes";
|
||||
import type * as recordTypes from "../types/recordTypes";
|
||||
import type * as globalTypes from '../types/globalTypes'
|
||||
import type * as recordTypes from '../types/recordTypes'
|
||||
|
||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||
|
||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
||||
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||
|
||||
declare const cityssm: cityssmGlobal;
|
||||
declare const bulmaJS: BulmaJS;
|
||||
declare const cityssm: cityssmGlobal
|
||||
declare const bulmaJS: BulmaJS
|
||||
|
||||
(() => {
|
||||
const los = exports.los as globalTypes.LOS;
|
||||
;(() => {
|
||||
const los = exports.los as globalTypes.LOS
|
||||
|
||||
const containerElement = document.querySelector("#container--lotTypes") as HTMLElement;
|
||||
const containerElement = document.querySelector(
|
||||
'#container--lotTypes'
|
||||
) as HTMLElement
|
||||
|
||||
let lotTypes: recordTypes.LotType[] = exports.lotTypes;
|
||||
delete exports.lotTypes;
|
||||
let lotTypes: recordTypes.LotType[] = exports.lotTypes
|
||||
delete exports.lotTypes
|
||||
|
||||
const expandedLotTypes = new Set<number>();
|
||||
const expandedLotTypes = new Set<number>()
|
||||
|
||||
function toggleLotTypeFields(clickEvent: Event) {
|
||||
const toggleButtonElement = clickEvent.currentTarget as HTMLButtonElement;
|
||||
const toggleButtonElement = clickEvent.currentTarget as HTMLButtonElement
|
||||
|
||||
const lotTypeElement = toggleButtonElement.closest(".container--lotType") as HTMLElement;
|
||||
const lotTypeElement = toggleButtonElement.closest(
|
||||
'.container--lotType'
|
||||
) as HTMLElement
|
||||
|
||||
const lotTypeId = Number.parseInt(lotTypeElement.dataset.lotTypeId!, 10);
|
||||
const lotTypeId = Number.parseInt(lotTypeElement.dataset.lotTypeId!, 10)
|
||||
|
||||
if (expandedLotTypes.has(lotTypeId)) {
|
||||
expandedLotTypes.delete(lotTypeId);
|
||||
expandedLotTypes.delete(lotTypeId)
|
||||
} else {
|
||||
expandedLotTypes.add(lotTypeId);
|
||||
expandedLotTypes.add(lotTypeId)
|
||||
}
|
||||
|
||||
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>';
|
||||
: '<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: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotTypes?: recordTypes.LotType[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotTypes?: recordTypes.LotType[]
|
||||
}) {
|
||||
if (responseJSON.success) {
|
||||
lotTypes = responseJSON.lotTypes!;
|
||||
renderLotTypes();
|
||||
lotTypes = responseJSON.lotTypes!
|
||||
renderLotTypes()
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Updating ${exports.aliases.lot} Type`,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function deleteLotType(clickEvent: Event) {
|
||||
const lotTypeId = Number.parseInt(
|
||||
((clickEvent.currentTarget as HTMLElement).closest(".container--lotType") as HTMLElement).dataset
|
||||
.lotTypeId!,
|
||||
(
|
||||
(clickEvent.currentTarget as HTMLElement).closest(
|
||||
'.container--lotType'
|
||||
) as HTMLElement
|
||||
).dataset.lotTypeId!,
|
||||
10
|
||||
);
|
||||
)
|
||||
|
||||
function doDelete() {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/admin/doDeleteLotType",
|
||||
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
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
function openEditLotType(clickEvent: Event) {
|
||||
const lotTypeId = Number.parseInt(
|
||||
((clickEvent.currentTarget as HTMLElement).closest(".container--lotType") as HTMLElement).dataset
|
||||
.lotTypeId!,
|
||||
(
|
||||
(clickEvent.currentTarget as HTMLElement).closest(
|
||||
'.container--lotType'
|
||||
) as HTMLElement
|
||||
).dataset.lotTypeId!,
|
||||
10
|
||||
);
|
||||
)
|
||||
|
||||
const lotType = lotTypes.find((currentLotType) => {
|
||||
return lotTypeId === currentLotType.lotTypeId;
|
||||
})!;
|
||||
return lotTypeId === currentLotType.lotTypeId
|
||||
})!
|
||||
|
||||
let editCloseModalFunction: () => void;
|
||||
let editCloseModalFunction: () => void
|
||||
|
||||
const doEdit = (submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
submitEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/admin/doUpdateLotType",
|
||||
los.urlPrefix + '/admin/doUpdateLotType',
|
||||
submitEvent.currentTarget,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
occupancyTypes?: recordTypes.OccupancyType[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
occupancyTypes?: recordTypes.OccupancyType[]
|
||||
}) => {
|
||||
lotTypeResponseHandler(responseJSON);
|
||||
lotTypeResponseHandler(responseJSON)
|
||||
if (responseJSON.success) {
|
||||
editCloseModalFunction();
|
||||
editCloseModalFunction()
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
)
|
||||
}
|
||||
|
||||
cityssm.openHtmlModal("adminLotTypes-editLotType", {
|
||||
cityssm.openHtmlModal('adminLotTypes-editLotType', {
|
||||
onshow(modalElement) {
|
||||
los.populateAliases(modalElement);
|
||||
los.populateAliases(modalElement)
|
||||
|
||||
(modalElement.querySelector("#lotTypeEdit--lotTypeId") as HTMLInputElement).value =
|
||||
lotTypeId.toString();
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotTypeEdit--lotTypeId'
|
||||
) as HTMLInputElement
|
||||
).value = lotTypeId.toString()
|
||||
|
||||
(modalElement.querySelector("#lotTypeEdit--lotType") as HTMLInputElement).value =
|
||||
lotType.lotType;
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotTypeEdit--lotType'
|
||||
) as HTMLInputElement
|
||||
).value = lotType.lotType
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
editCloseModalFunction = closeModalFunction;
|
||||
editCloseModalFunction = closeModalFunction
|
||||
|
||||
(modalElement.querySelector("#lotTypeEdit--lotType") as HTMLInputElement).focus();
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotTypeEdit--lotType'
|
||||
) as HTMLInputElement
|
||||
).focus()
|
||||
|
||||
modalElement.querySelector("form")!.addEventListener("submit", doEdit);
|
||||
modalElement.querySelector('form')!.addEventListener('submit', doEdit)
|
||||
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
},
|
||||
onremoved() {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
function openAddLotTypeField(clickEvent: Event) {
|
||||
const lotTypeId = Number.parseInt(
|
||||
((clickEvent.currentTarget as HTMLElement).closest(".container--lotType") as HTMLElement).dataset
|
||||
.lotTypeId!,
|
||||
(
|
||||
(clickEvent.currentTarget as HTMLElement).closest(
|
||||
'.container--lotType'
|
||||
) as HTMLElement
|
||||
).dataset.lotTypeId!,
|
||||
10
|
||||
);
|
||||
)
|
||||
|
||||
let addCloseModalFunction: () => void;
|
||||
let addCloseModalFunction: () => void
|
||||
|
||||
const doAdd = (submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
submitEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/admin/doAddLotTypeField",
|
||||
los.urlPrefix + '/admin/doAddLotTypeField',
|
||||
submitEvent.currentTarget,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotTypes?: recordTypes.LotType[];
|
||||
lotTypeFieldId?: number;
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotTypes?: recordTypes.LotType[]
|
||||
lotTypeFieldId?: number
|
||||
}) => {
|
||||
expandedLotTypes.add(lotTypeId);
|
||||
lotTypeResponseHandler(responseJSON);
|
||||
expandedLotTypes.add(lotTypeId)
|
||||
lotTypeResponseHandler(responseJSON)
|
||||
|
||||
if (responseJSON.success) {
|
||||
addCloseModalFunction();
|
||||
openEditLotTypeField(lotTypeId, responseJSON.lotTypeFieldId!);
|
||||
addCloseModalFunction()
|
||||
openEditLotTypeField(lotTypeId, responseJSON.lotTypeFieldId!)
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
)
|
||||
}
|
||||
|
||||
cityssm.openHtmlModal("adminLotTypes-addLotTypeField", {
|
||||
cityssm.openHtmlModal('adminLotTypes-addLotTypeField', {
|
||||
onshow(modalElement) {
|
||||
los.populateAliases(modalElement);
|
||||
los.populateAliases(modalElement)
|
||||
|
||||
if (lotTypeId) {
|
||||
(modalElement.querySelector("#lotTypeFieldAdd--lotTypeId") as HTMLInputElement).value =
|
||||
lotTypeId.toString();
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotTypeFieldAdd--lotTypeId'
|
||||
) as HTMLInputElement
|
||||
).value = lotTypeId.toString()
|
||||
}
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
addCloseModalFunction = closeModalFunction;
|
||||
addCloseModalFunction = closeModalFunction
|
||||
|
||||
(modalElement.querySelector("#lotTypeFieldAdd--lotTypeField") as HTMLInputElement).focus();
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotTypeFieldAdd--lotTypeField'
|
||||
) as HTMLInputElement
|
||||
).focus()
|
||||
|
||||
modalElement.querySelector("form")!.addEventListener("submit", doAdd);
|
||||
modalElement.querySelector('form')!.addEventListener('submit', doAdd)
|
||||
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
},
|
||||
onremoved() {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
function moveLotType(clickEvent: MouseEvent) {
|
||||
const buttonElement = clickEvent.currentTarget as HTMLButtonElement;
|
||||
const buttonElement = clickEvent.currentTarget as HTMLButtonElement
|
||||
|
||||
const lotTypeId = (buttonElement.closest(".container--lotType") as HTMLElement).dataset.lotTypeId;
|
||||
const lotTypeId = (
|
||||
buttonElement.closest('.container--lotType') as HTMLElement
|
||||
).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: number, lotTypeFieldId: number) {
|
||||
const lotType = lotTypes.find((currentLotType) => {
|
||||
return currentLotType.lotTypeId === lotTypeId;
|
||||
})!;
|
||||
return currentLotType.lotTypeId === lotTypeId
|
||||
})!
|
||||
|
||||
const lotTypeField = lotType.lotTypeFields!.find((currentLotTypeField) => {
|
||||
return currentLotTypeField.lotTypeFieldId === lotTypeFieldId;
|
||||
})!;
|
||||
return currentLotTypeField.lotTypeFieldId === lotTypeFieldId
|
||||
})!
|
||||
|
||||
let minimumLengthElement: HTMLInputElement;
|
||||
let maximumLengthElement: HTMLInputElement;
|
||||
let patternElement: HTMLInputElement;
|
||||
let lotTypeFieldValuesElement: HTMLTextAreaElement;
|
||||
let minimumLengthElement: HTMLInputElement
|
||||
let maximumLengthElement: HTMLInputElement
|
||||
let patternElement: HTMLInputElement
|
||||
let lotTypeFieldValuesElement: HTMLTextAreaElement
|
||||
|
||||
let editCloseModalFunction: () => void;
|
||||
let editCloseModalFunction: () => void
|
||||
|
||||
function updateMaximumLengthMin() {
|
||||
maximumLengthElement.min = minimumLengthElement.value;
|
||||
maximumLengthElement.min = minimumLengthElement.value
|
||||
}
|
||||
|
||||
function toggleInputFields() {
|
||||
if (lotTypeFieldValuesElement.value === "") {
|
||||
minimumLengthElement.disabled = false;
|
||||
maximumLengthElement.disabled = false;
|
||||
patternElement.disabled = false;
|
||||
if (lotTypeFieldValuesElement.value === '') {
|
||||
minimumLengthElement.disabled = false
|
||||
maximumLengthElement.disabled = false
|
||||
patternElement.disabled = false
|
||||
} else {
|
||||
minimumLengthElement.disabled = true;
|
||||
maximumLengthElement.disabled = true;
|
||||
patternElement.disabled = true;
|
||||
minimumLengthElement.disabled = true
|
||||
maximumLengthElement.disabled = true
|
||||
patternElement.disabled = true
|
||||
}
|
||||
}
|
||||
|
||||
function doUpdate(submitEvent: SubmitEvent) {
|
||||
submitEvent.preventDefault();
|
||||
submitEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/admin/doUpdateLotTypeField",
|
||||
los.urlPrefix + '/admin/doUpdateLotTypeField',
|
||||
submitEvent.currentTarget,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
occupancyTypes?: recordTypes.OccupancyType[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
occupancyTypes?: recordTypes.OccupancyType[]
|
||||
}) => {
|
||||
lotTypeResponseHandler(responseJSON);
|
||||
lotTypeResponseHandler(responseJSON)
|
||||
if (responseJSON.success) {
|
||||
editCloseModalFunction();
|
||||
editCloseModalFunction()
|
||||
}
|
||||
}
|
||||
);
|
||||
)
|
||||
}
|
||||
|
||||
function doDelete() {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/admin/doDeleteLotTypeField",
|
||||
los.urlPrefix + '/admin/doDeleteLotTypeField',
|
||||
{
|
||||
lotTypeFieldId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotTypes?: recordTypes.LotType[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotTypes?: recordTypes.LotType[]
|
||||
}) => {
|
||||
lotTypeResponseHandler(responseJSON);
|
||||
lotTypeResponseHandler(responseJSON)
|
||||
if (responseJSON.success) {
|
||||
editCloseModalFunction();
|
||||
editCloseModalFunction()
|
||||
}
|
||||
}
|
||||
);
|
||||
)
|
||||
}
|
||||
|
||||
function confirmDoDelete() {
|
||||
bulmaJS.confirm({
|
||||
title: "Delete Field",
|
||||
title: 'Delete Field',
|
||||
message:
|
||||
"Are you sure you want to delete this field? Note that historical records that make use of this field will not be affected.",
|
||||
contextualColorName: "warning",
|
||||
'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);
|
||||
los.populateAliases(modalElement)
|
||||
|
||||
(modalElement.querySelector("#lotTypeFieldEdit--lotTypeFieldId") as HTMLInputElement).value =
|
||||
lotTypeField.lotTypeFieldId.toString();
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotTypeFieldEdit--lotTypeFieldId'
|
||||
) as HTMLInputElement
|
||||
).value = lotTypeField.lotTypeFieldId.toString()
|
||||
|
||||
(modalElement.querySelector("#lotTypeFieldEdit--lotTypeField") as HTMLInputElement).value =
|
||||
lotTypeField.lotTypeField!;
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotTypeFieldEdit--lotTypeField'
|
||||
) as HTMLInputElement
|
||||
).value = lotTypeField.lotTypeField!
|
||||
|
||||
(modalElement.querySelector("#lotTypeFieldEdit--isRequired") as HTMLSelectElement).value =
|
||||
lotTypeField.isRequired ? "1" : "0";
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotTypeFieldEdit--isRequired'
|
||||
) as HTMLSelectElement
|
||||
).value = lotTypeField.isRequired ? '1' : '0'
|
||||
|
||||
minimumLengthElement = modalElement.querySelector(
|
||||
"#lotTypeFieldEdit--minimumLength"
|
||||
) as HTMLInputElement;
|
||||
'#lotTypeFieldEdit--minimumLength'
|
||||
) as HTMLInputElement
|
||||
|
||||
minimumLengthElement.value = lotTypeField.minimumLength!.toString();
|
||||
minimumLengthElement.value = lotTypeField.minimumLength!.toString()
|
||||
|
||||
maximumLengthElement = modalElement.querySelector(
|
||||
"#lotTypeFieldEdit--maximumLength"
|
||||
) as HTMLInputElement;
|
||||
'#lotTypeFieldEdit--maximumLength'
|
||||
) as HTMLInputElement
|
||||
|
||||
maximumLengthElement.value = lotTypeField.maximumLength!.toString();
|
||||
maximumLengthElement.value = lotTypeField.maximumLength!.toString()
|
||||
|
||||
patternElement = modalElement.querySelector("#lotTypeFieldEdit--pattern") as HTMLInputElement;
|
||||
patternElement = modalElement.querySelector(
|
||||
'#lotTypeFieldEdit--pattern'
|
||||
) as HTMLInputElement
|
||||
|
||||
patternElement.value = lotTypeField.pattern!;
|
||||
patternElement.value = lotTypeField.pattern!
|
||||
|
||||
lotTypeFieldValuesElement = modalElement.querySelector(
|
||||
"#lotTypeFieldEdit--lotTypeFieldValues"
|
||||
) as HTMLTextAreaElement;
|
||||
'#lotTypeFieldEdit--lotTypeFieldValues'
|
||||
) as HTMLTextAreaElement
|
||||
|
||||
lotTypeFieldValuesElement.value = lotTypeField.lotTypeFieldValues!;
|
||||
lotTypeFieldValuesElement.value = lotTypeField.lotTypeFieldValues!
|
||||
|
||||
toggleInputFields();
|
||||
toggleInputFields()
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
editCloseModalFunction = closeModalFunction;
|
||||
editCloseModalFunction = closeModalFunction
|
||||
|
||||
bulmaJS.init(modalElement);
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
cityssm.enableNavBlocker();
|
||||
bulmaJS.init(modalElement)
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
cityssm.enableNavBlocker()
|
||||
|
||||
modalElement.querySelector("form")!.addEventListener("submit", doUpdate);
|
||||
modalElement.querySelector('form')!.addEventListener('submit', doUpdate)
|
||||
|
||||
minimumLengthElement.addEventListener("keyup", updateMaximumLengthMin);
|
||||
updateMaximumLengthMin();
|
||||
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();
|
||||
cityssm.disableNavBlocker();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
cityssm.disableNavBlocker()
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
function openEditLotTypeFieldByClick(clickEvent: Event) {
|
||||
clickEvent.preventDefault();
|
||||
clickEvent.preventDefault()
|
||||
|
||||
const lotTypeFieldId = Number.parseInt(
|
||||
((clickEvent.currentTarget as HTMLElement).closest(".container--lotTypeField") as HTMLElement)
|
||||
.dataset.lotTypeFieldId!,
|
||||
(
|
||||
(clickEvent.currentTarget as HTMLElement).closest(
|
||||
'.container--lotTypeField'
|
||||
) as HTMLElement
|
||||
).dataset.lotTypeFieldId!,
|
||||
10
|
||||
);
|
||||
)
|
||||
|
||||
const lotTypeId = Number.parseInt(
|
||||
((clickEvent.currentTarget as HTMLElement).closest(".container--lotType") as HTMLElement).dataset
|
||||
.lotTypeId!,
|
||||
(
|
||||
(clickEvent.currentTarget as HTMLElement).closest(
|
||||
'.container--lotType'
|
||||
) as HTMLElement
|
||||
).dataset.lotTypeId!,
|
||||
10
|
||||
);
|
||||
)
|
||||
|
||||
openEditLotTypeField(lotTypeId, lotTypeFieldId);
|
||||
openEditLotTypeField(lotTypeId, lotTypeFieldId)
|
||||
}
|
||||
|
||||
function moveLotTypeField(clickEvent: MouseEvent) {
|
||||
const buttonElement = clickEvent.currentTarget as HTMLButtonElement;
|
||||
const buttonElement = clickEvent.currentTarget as HTMLButtonElement
|
||||
|
||||
const lotTypeFieldId = (buttonElement.closest(".container--lotTypeField") as HTMLElement).dataset
|
||||
.lotTypeFieldId;
|
||||
const lotTypeFieldId = (
|
||||
buttonElement.closest('.container--lotTypeField') as HTMLElement
|
||||
).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(
|
||||
|
|
@ -409,82 +461,88 @@ declare const bulmaJS: BulmaJS;
|
|||
) {
|
||||
if (lotTypeFields.length === 0) {
|
||||
panelElement.insertAdjacentHTML(
|
||||
"beforeend",
|
||||
'beforeend',
|
||||
'<div class="panel-block is-block' +
|
||||
(expandedLotTypes.has(lotTypeId) ? "" : " is-hidden") +
|
||||
(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"
|
||||
'button--moveLotTypeFieldUp',
|
||||
'button--moveLotTypeFieldDown'
|
||||
) +
|
||||
"</div>") +
|
||||
"</div>" +
|
||||
"</div>";
|
||||
'</div>') +
|
||||
'</div>' +
|
||||
'</div>'
|
||||
|
||||
panelBlockElement
|
||||
.querySelector(".button--editLotTypeField")!
|
||||
.addEventListener("click", openEditLotTypeFieldByClick);
|
||||
.querySelector('.button--editLotTypeField')!
|
||||
.addEventListener('click', openEditLotTypeFieldByClick)
|
||||
|
||||
(
|
||||
panelBlockElement.querySelector(".button--moveLotTypeFieldUp") as HTMLButtonElement
|
||||
).addEventListener("click", moveLotTypeField);
|
||||
;(
|
||||
panelBlockElement.querySelector(
|
||||
'.button--moveLotTypeFieldUp'
|
||||
) as HTMLButtonElement
|
||||
).addEventListener('click', moveLotTypeField)
|
||||
|
||||
(
|
||||
panelBlockElement.querySelector(".button--moveLotTypeFieldDown") as HTMLButtonElement
|
||||
).addEventListener("click", moveLotTypeField);
|
||||
;(
|
||||
panelBlockElement.querySelector(
|
||||
'.button--moveLotTypeFieldDown'
|
||||
) as HTMLButtonElement
|
||||
).addEventListener('click', moveLotTypeField)
|
||||
|
||||
panelElement.append(panelBlockElement);
|
||||
panelElement.append(panelBlockElement)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function renderLotTypes() {
|
||||
containerElement.innerHTML = "";
|
||||
containerElement.innerHTML = ''
|
||||
|
||||
if (lotTypes.length === 0) {
|
||||
containerElement.insertAdjacentHTML(
|
||||
"afterbegin",
|
||||
'afterbegin',
|
||||
`<div class="message is-warning>
|
||||
<p class="message-body">There are no active ${los.escapedAliases.lot} types.</p>
|
||||
</div>`
|
||||
);
|
||||
)
|
||||
|
||||
return;
|
||||
return
|
||||
}
|
||||
|
||||
for (const lotType of lotTypes) {
|
||||
const lotTypeContainer = document.createElement("div");
|
||||
const lotTypeContainer = document.createElement('div')
|
||||
|
||||
lotTypeContainer.className = "panel container--lotType";
|
||||
lotTypeContainer.className = 'panel container--lotType'
|
||||
|
||||
lotTypeContainer.dataset.lotTypeId = lotType.lotTypeId.toString();
|
||||
lotTypeContainer.dataset.lotTypeId = lotType.lotTypeId.toString()
|
||||
|
||||
lotTypeContainer.innerHTML =
|
||||
'<div class="panel-heading">' +
|
||||
|
|
@ -495,120 +553,136 @@ declare const bulmaJS: BulmaJS;
|
|||
(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!);
|
||||
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);
|
||||
.querySelector('.button--addLotTypeField')!
|
||||
.addEventListener('click', openAddLotTypeField)
|
||||
|
||||
(lotTypeContainer.querySelector(".button--moveLotTypeUp") as HTMLButtonElement).addEventListener(
|
||||
"click",
|
||||
moveLotType
|
||||
);
|
||||
;(
|
||||
lotTypeContainer.querySelector(
|
||||
'.button--moveLotTypeUp'
|
||||
) as HTMLButtonElement
|
||||
).addEventListener('click', moveLotType)
|
||||
|
||||
(
|
||||
lotTypeContainer.querySelector(".button--moveLotTypeDown") as HTMLButtonElement
|
||||
).addEventListener("click", moveLotType);
|
||||
;(
|
||||
lotTypeContainer.querySelector(
|
||||
'.button--moveLotTypeDown'
|
||||
) as HTMLButtonElement
|
||||
).addEventListener('click', moveLotType)
|
||||
|
||||
containerElement.append(lotTypeContainer);
|
||||
containerElement.append(lotTypeContainer)
|
||||
}
|
||||
}
|
||||
|
||||
document.querySelector("#button--addLotType")!.addEventListener("click", () => {
|
||||
let addCloseModalFunction: () => void;
|
||||
document
|
||||
.querySelector('#button--addLotType')!
|
||||
.addEventListener('click', () => {
|
||||
let addCloseModalFunction: () => void
|
||||
|
||||
function doAdd(submitEvent: SubmitEvent): void {
|
||||
submitEvent.preventDefault();
|
||||
submitEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/admin/doAddLotType",
|
||||
los.urlPrefix + '/admin/doAddLotType',
|
||||
submitEvent.currentTarget,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotTypes?: recordTypes.LotType[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotTypes?: recordTypes.LotType[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
addCloseModalFunction();
|
||||
lotTypes = responseJSON.lotTypes!;
|
||||
renderLotTypes();
|
||||
addCloseModalFunction()
|
||||
lotTypes = responseJSON.lotTypes!
|
||||
renderLotTypes()
|
||||
} 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);
|
||||
los.populateAliases(modalElement)
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
addCloseModalFunction = closeModalFunction;
|
||||
addCloseModalFunction = closeModalFunction
|
||||
|
||||
(modalElement.querySelector("#lotTypeAdd--lotType") as HTMLInputElement).focus();
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotTypeAdd--lotType'
|
||||
) as HTMLInputElement
|
||||
).focus()
|
||||
|
||||
modalElement.querySelector("form")!.addEventListener("submit", doAdd);
|
||||
modalElement.querySelector('form')!.addEventListener('submit', doAdd)
|
||||
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
},
|
||||
onremoved() {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
}
|
||||
});
|
||||
});
|
||||
})
|
||||
})
|
||||
|
||||
renderLotTypes();
|
||||
})();
|
||||
renderLotTypes()
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
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;
|
||||
const inputElement = changeEvent.currentTarget as HTMLInputElement
|
||||
|
||||
const fontAwesomeIconClass = inputElement.value;
|
||||
const fontAwesomeIconClass = inputElement.value
|
||||
|
||||
inputElement
|
||||
.closest(".field")!
|
||||
.closest('.field')!
|
||||
.querySelectorAll(
|
||||
".button.is-static"
|
||||
)[1].innerHTML = `<i class="fas fa-fw fa-${fontAwesomeIconClass}" aria-hidden="true"></i>`;
|
||||
'.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
|
||||
})();
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,176 +1,172 @@
|
|||
/* 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",
|
||||
los.urlPrefix + '/admin/doUpdateLotOccupantType',
|
||||
submitEvent.currentTarget,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotOccupantTypes?: recordTypes.LotOccupantType[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotOccupantTypes?: recordTypes.LotOccupantType[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupantTypes = responseJSON.lotOccupantTypes!;
|
||||
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: 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",
|
||||
los.urlPrefix + '/admin/doDeleteLotOccupantType',
|
||||
{
|
||||
lotOccupantTypeId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotOccupantTypes?: recordTypes.LotOccupantType[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotOccupantTypes?: recordTypes.LotOccupantType[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupantTypes = responseJSON.lotOccupantTypes!;
|
||||
lotOccupantTypes = responseJSON.lotOccupantTypes!
|
||||
|
||||
if (lotOccupantTypes.length === 0) {
|
||||
renderLotOccupantTypes();
|
||||
renderLotOccupantTypes()
|
||||
} else {
|
||||
tableRowElement.remove();
|
||||
tableRowElement.remove()
|
||||
}
|
||||
|
||||
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'
|
||||
})
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
)
|
||||
}
|
||||
|
||||
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",
|
||||
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"),
|
||||
'/admin/' +
|
||||
(buttonElement.dataset.direction === 'up' ? 'doMoveLotOccupantTypeUp' : 'doMoveLotOccupantTypeDown'),
|
||||
{
|
||||
lotOccupantTypeId,
|
||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
||||
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotOccupantTypes?: recordTypes.LotOccupantType[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotOccupantTypes?: recordTypes.LotOccupantType[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupantTypes = responseJSON.lotOccupantTypes!;
|
||||
renderLotOccupantTypes();
|
||||
lotOccupantTypes = responseJSON.lotOccupantTypes!
|
||||
renderLotOccupantTypes()
|
||||
} 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"
|
||||
) as HTMLTableSectionElement;
|
||||
const containerElement = document.querySelector('#container--lotOccupantTypes') as HTMLTableSectionElement
|
||||
|
||||
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");
|
||||
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>" +
|
||||
'<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">' +
|
||||
|
|
@ -180,101 +176,102 @@ 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",
|
||||
'button--moveLotOccupantTypeUp',
|
||||
'button--moveLotOccupantTypeDown',
|
||||
false
|
||||
) +
|
||||
"</div>" +
|
||||
'</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']")!;
|
||||
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);
|
||||
.querySelector('.button--deleteLotOccupantType')!
|
||||
.addEventListener('click', deleteLotOccupantType)
|
||||
|
||||
containerElement.append(tableRowElement);
|
||||
containerElement.append(tableRowElement)
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
(document.querySelector("#form--addLotOccupantType") as HTMLFormElement).addEventListener(
|
||||
"submit",
|
||||
;(document.querySelector('#form--addLotOccupantType') as HTMLFormElement).addEventListener(
|
||||
'submit',
|
||||
(submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
submitEvent.preventDefault()
|
||||
|
||||
const formElement = submitEvent.currentTarget as HTMLFormElement;
|
||||
const formElement = submitEvent.currentTarget as HTMLFormElement
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/admin/doAddLotOccupantType",
|
||||
los.urlPrefix + '/admin/doAddLotOccupantType',
|
||||
formElement,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotOccupantTypes?: recordTypes.LotOccupantType[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotOccupantTypes?: recordTypes.LotOccupantType[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupantTypes = responseJSON.lotOccupantTypes!;
|
||||
renderLotOccupantTypes();
|
||||
formElement.reset();
|
||||
formElement.querySelector("input")!.focus();
|
||||
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"
|
||||
});
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
);
|
||||
)
|
||||
}
|
||||
);
|
||||
)
|
||||
|
||||
renderLotOccupantTypes();
|
||||
renderLotOccupantTypes()
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,157 +1,145 @@
|
|||
/* 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",
|
||||
los.urlPrefix + '/admin/doUpdateLotStatus',
|
||||
submitEvent.currentTarget,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotStatuses?: recordTypes.LotStatus[];
|
||||
}) => {
|
||||
(responseJSON: { success: boolean; errorMessage?: string; lotStatuses?: recordTypes.LotStatus[] }) => {
|
||||
if (responseJSON.success) {
|
||||
lotStatuses = responseJSON.lotStatuses!;
|
||||
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: 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",
|
||||
los.urlPrefix + '/admin/doDeleteLotStatus',
|
||||
{
|
||||
lotStatusId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotStatuses?: recordTypes.LotStatus[];
|
||||
}) => {
|
||||
(responseJSON: { success: boolean; errorMessage?: string; lotStatuses?: recordTypes.LotStatus[] }) => {
|
||||
if (responseJSON.success) {
|
||||
lotStatuses = responseJSON.lotStatuses!;
|
||||
lotStatuses = responseJSON.lotStatuses!
|
||||
|
||||
if (lotStatuses.length === 0) {
|
||||
renderLotStatuses();
|
||||
renderLotStatuses()
|
||||
} else {
|
||||
tableRowElement.remove();
|
||||
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'
|
||||
})
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
)
|
||||
}
|
||||
|
||||
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",
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: "Yes, Delete Status",
|
||||
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"),
|
||||
'/admin/' +
|
||||
(buttonElement.dataset.direction === 'up' ? 'doMoveLotStatusUp' : 'doMoveLotStatusDown'),
|
||||
{
|
||||
lotStatusId,
|
||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
||||
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotStatuses?: recordTypes.LotStatus[];
|
||||
}) => {
|
||||
(responseJSON: { success: boolean; errorMessage?: string; lotStatuses?: recordTypes.LotStatus[] }) => {
|
||||
if (responseJSON.success) {
|
||||
lotStatuses = responseJSON.lotStatuses!;
|
||||
renderLotStatuses();
|
||||
lotStatuses = responseJSON.lotStatuses!
|
||||
renderLotStatuses()
|
||||
} 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") as HTMLTableSectionElement;
|
||||
const containerElement = document.querySelector('#container--lotStatuses') as HTMLTableSectionElement
|
||||
|
||||
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");
|
||||
const tableRowElement = document.createElement('tr')
|
||||
|
||||
tableRowElement.dataset.lotStatusId = lotStatus.lotStatusId.toString();
|
||||
tableRowElement.dataset.lotStatusId = lotStatus.lotStatusId.toString()
|
||||
|
||||
tableRowElement.innerHTML =
|
||||
"<td>" +
|
||||
"<form>" +
|
||||
'<td>' +
|
||||
'<form>' +
|
||||
'<input name="lotStatusId" type="hidden" value="' +
|
||||
lotStatus.lotStatusId.toString() +
|
||||
'" />' +
|
||||
|
|
@ -161,74 +149,70 @@ 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>";
|
||||
'</button>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</td>'
|
||||
|
||||
tableRowElement.querySelector("form")!.addEventListener("submit", updateLotStatus);
|
||||
tableRowElement.querySelector('form')!.addEventListener('submit', updateLotStatus)
|
||||
|
||||
(tableRowElement.querySelector(".button--moveLotStatusUp") as HTMLButtonElement).addEventListener(
|
||||
"click",
|
||||
;(tableRowElement.querySelector('.button--moveLotStatusUp') as HTMLButtonElement).addEventListener(
|
||||
'click',
|
||||
moveLotStatus
|
||||
);
|
||||
)
|
||||
|
||||
(tableRowElement.querySelector(".button--moveLotStatusDown") as HTMLButtonElement).addEventListener(
|
||||
"click",
|
||||
;(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",
|
||||
;(document.querySelector('#form--addLotStatus') as HTMLFormElement).addEventListener(
|
||||
'submit',
|
||||
(submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
submitEvent.preventDefault()
|
||||
|
||||
const formElement = submitEvent.currentTarget as HTMLFormElement;
|
||||
const formElement = submitEvent.currentTarget as HTMLFormElement
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/admin/doAddLotStatus",
|
||||
los.urlPrefix + '/admin/doAddLotStatus',
|
||||
formElement,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotStatuses?: recordTypes.LotStatus[];
|
||||
}) => {
|
||||
(responseJSON: { success: boolean; errorMessage?: string; lotStatuses?: recordTypes.LotStatus[] }) => {
|
||||
if (responseJSON.success) {
|
||||
lotStatuses = responseJSON.lotStatuses!;
|
||||
renderLotStatuses();
|
||||
formElement.reset();
|
||||
formElement.querySelector("input")!.focus();
|
||||
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"
|
||||
});
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
);
|
||||
)
|
||||
}
|
||||
);
|
||||
)
|
||||
|
||||
renderLotStatuses();
|
||||
renderLotStatuses()
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,162 +1,162 @@
|
|||
/* 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",
|
||||
los.urlPrefix + '/admin/doUpdateWorkOrderMilestoneType',
|
||||
submitEvent.currentTarget,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!;
|
||||
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: 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",
|
||||
los.urlPrefix + '/admin/doDeleteWorkOrderMilestoneType',
|
||||
{
|
||||
workOrderMilestoneTypeId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!;
|
||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!
|
||||
|
||||
if (workOrderMilestoneTypes.length === 0) {
|
||||
renderWorkOrderMilestoneTypes();
|
||||
renderWorkOrderMilestoneTypes()
|
||||
} else {
|
||||
tableRowElement.remove();
|
||||
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: 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"),
|
||||
'/admin/' +
|
||||
(buttonElement.dataset.direction === 'up'
|
||||
? 'doMoveWorkOrderMilestoneTypeUp'
|
||||
: 'doMoveWorkOrderMilestoneTypeDown'),
|
||||
{
|
||||
workOrderMilestoneTypeId,
|
||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
||||
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!;
|
||||
renderWorkOrderMilestoneTypes();
|
||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!
|
||||
renderWorkOrderMilestoneTypes()
|
||||
} 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"
|
||||
) as HTMLTableSectionElement;
|
||||
'#container--workOrderMilestoneTypes'
|
||||
) as HTMLTableSectionElement
|
||||
|
||||
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");
|
||||
const tableRowElement = document.createElement('tr')
|
||||
|
||||
tableRowElement.dataset.workOrderMilestoneTypeId =
|
||||
workOrderMilestoneType.workOrderMilestoneTypeId.toString();
|
||||
workOrderMilestoneType.workOrderMilestoneTypeId.toString()
|
||||
|
||||
tableRowElement.innerHTML =
|
||||
"<td>" +
|
||||
"<form>" +
|
||||
'<td>' +
|
||||
'<form>' +
|
||||
'<input name="workOrderMilestoneTypeId" type="hidden" value="' +
|
||||
workOrderMilestoneType.workOrderMilestoneTypeId.toString() +
|
||||
'" />' +
|
||||
|
|
@ -165,78 +165,78 @@ 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",
|
||||
'button--moveWorkOrderMilestoneTypeUp',
|
||||
'button--moveWorkOrderMilestoneTypeDown',
|
||||
false
|
||||
) +
|
||||
"</div>" +
|
||||
'</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>";
|
||||
'</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);
|
||||
.querySelector('.button--deleteWorkOrderMilestoneType')!
|
||||
.addEventListener('click', deleteWorkOrderMilestoneType)
|
||||
|
||||
containerElement.append(tableRowElement);
|
||||
containerElement.append(tableRowElement)
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
(document.querySelector("#form--addWorkOrderMilestoneType") as HTMLFormElement).addEventListener(
|
||||
"submit",
|
||||
;(document.querySelector('#form--addWorkOrderMilestoneType') as HTMLFormElement).addEventListener(
|
||||
'submit',
|
||||
(submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
submitEvent.preventDefault()
|
||||
|
||||
const formElement = submitEvent.currentTarget as HTMLFormElement;
|
||||
const formElement = submitEvent.currentTarget as HTMLFormElement
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/admin/doAddWorkOrderMilestoneType",
|
||||
los.urlPrefix + '/admin/doAddWorkOrderMilestoneType',
|
||||
formElement,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!;
|
||||
renderWorkOrderMilestoneTypes();
|
||||
formElement.reset();
|
||||
formElement.querySelector("input")!.focus();
|
||||
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"
|
||||
});
|
||||
title: 'Error Adding Work Order Milestone Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
);
|
||||
)
|
||||
}
|
||||
);
|
||||
)
|
||||
|
||||
renderWorkOrderMilestoneTypes();
|
||||
renderWorkOrderMilestoneTypes()
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
los.urlPrefix + '/admin/doUpdateWorkOrderType',
|
||||
submitEvent.currentTarget,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
workOrderTypes?: recordTypes.WorkOrderType[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
workOrderTypes?: recordTypes.WorkOrderType[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderTypes = responseJSON.workOrderTypes!;
|
||||
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: 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",
|
||||
los.urlPrefix + '/admin/doDeleteWorkOrderType',
|
||||
{
|
||||
workOrderTypeId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
workOrderTypes?: recordTypes.WorkOrderType[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
workOrderTypes?: recordTypes.WorkOrderType[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderTypes = responseJSON.workOrderTypes!;
|
||||
workOrderTypes = responseJSON.workOrderTypes!
|
||||
|
||||
if (workOrderTypes.length === 0) {
|
||||
renderWorkOrderTypes();
|
||||
renderWorkOrderTypes()
|
||||
} else {
|
||||
tableRowElement.remove();
|
||||
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: 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"),
|
||||
'/admin/' +
|
||||
(buttonElement.dataset.direction === 'up' ? 'doMoveWorkOrderTypeUp' : 'doMoveWorkOrderTypeDown'),
|
||||
{
|
||||
workOrderTypeId,
|
||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
||||
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
workOrderTypes?: recordTypes.WorkOrderType[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
workOrderTypes?: recordTypes.WorkOrderType[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderTypes = responseJSON.workOrderTypes!;
|
||||
renderWorkOrderTypes();
|
||||
workOrderTypes = responseJSON.workOrderTypes!
|
||||
renderWorkOrderTypes()
|
||||
} 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") as HTMLTableSectionElement;
|
||||
const containerElement = document.querySelector('#container--workOrderTypes') as HTMLTableSectionElement
|
||||
|
||||
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");
|
||||
const tableRowElement = document.createElement('tr')
|
||||
|
||||
tableRowElement.dataset.workOrderTypeId = workOrderType.workOrderTypeId!.toString();
|
||||
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",
|
||||
'button--moveWorkOrderTypeUp',
|
||||
'button--moveWorkOrderTypeDown',
|
||||
false
|
||||
) +
|
||||
"</div>" +
|
||||
'</div>' +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-danger is-light button--deleteWorkOrderType" data-tooltip="Delete Work Order Type" type="button" aria-label="Delete Work Order Type">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
"</button>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</td>";
|
||||
'</button>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</td>'
|
||||
|
||||
tableRowElement.querySelector("form")!.addEventListener("submit", updateWorkOrderType);
|
||||
tableRowElement.querySelector('form')!.addEventListener('submit', updateWorkOrderType)
|
||||
|
||||
(tableRowElement.querySelector(".button--moveWorkOrderTypeUp") as HTMLButtonElement).addEventListener(
|
||||
"click",
|
||||
;(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);
|
||||
.querySelector('.button--deleteWorkOrderType')!
|
||||
.addEventListener('click', deleteWorkOrderType)
|
||||
|
||||
containerElement.append(tableRowElement);
|
||||
containerElement.append(tableRowElement)
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
(document.querySelector("#form--addWorkOrderType") as HTMLFormElement).addEventListener(
|
||||
"submit",
|
||||
;(document.querySelector('#form--addWorkOrderType') as HTMLFormElement).addEventListener(
|
||||
'submit',
|
||||
(submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
submitEvent.preventDefault()
|
||||
|
||||
const formElement = submitEvent.currentTarget as HTMLFormElement;
|
||||
const formElement = submitEvent.currentTarget as HTMLFormElement
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/admin/doAddWorkOrderType",
|
||||
los.urlPrefix + '/admin/doAddWorkOrderType',
|
||||
formElement,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
workOrderTypes?: recordTypes.WorkOrderType[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
workOrderTypes?: recordTypes.WorkOrderType[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderTypes = responseJSON.workOrderTypes!;
|
||||
renderWorkOrderTypes();
|
||||
formElement.reset();
|
||||
formElement.querySelector("input")!.focus();
|
||||
workOrderTypes = responseJSON.workOrderTypes!
|
||||
renderWorkOrderTypes()
|
||||
formElement.reset()
|
||||
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'
|
||||
})
|
||||
}
|
||||
}
|
||||
);
|
||||
)
|
||||
}
|
||||
);
|
||||
)
|
||||
|
||||
renderWorkOrderTypes();
|
||||
renderWorkOrderTypes()
|
||||
|
|
|
|||
|
|
@ -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 || '');
|
||||
}
|
||||
})();
|
||||
|
|
|
|||
|
|
@ -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>;
|
||||
'.fa-circle[data-work-order-number'
|
||||
) as NodeListOf<HTMLElement>
|
||||
|
||||
for (const workOrderNumberCircleElement of workOrderNumberCircleElements) {
|
||||
workOrderNumberCircleElement.style.color = los.getRandomColor(
|
||||
workOrderNumberCircleElement.dataset.workOrderNumber || ""
|
||||
);
|
||||
workOrderNumberCircleElement.dataset.workOrderNumber || ''
|
||||
)
|
||||
}
|
||||
})();
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
})();
|
||||
|
|
|
|||
|
|
@ -1,119 +1,130 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
|
||||
import type * as globalTypes from "../types/globalTypes";
|
||||
import type * as recordTypes from "../types/recordTypes";
|
||||
import type * as globalTypes from '../types/globalTypes'
|
||||
import type * as recordTypes from '../types/recordTypes'
|
||||
|
||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||
|
||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
||||
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||
|
||||
declare const cityssm: cityssmGlobal;
|
||||
declare const bulmaJS: BulmaJS;
|
||||
declare const cityssm: cityssmGlobal
|
||||
declare const bulmaJS: BulmaJS
|
||||
|
||||
(() => {
|
||||
const los = exports.los as globalTypes.LOS;
|
||||
;(() => {
|
||||
const los = exports.los as globalTypes.LOS
|
||||
|
||||
const lotId = (document.querySelector("#lot--lotId") as HTMLInputElement).value;
|
||||
const isCreate = lotId === "";
|
||||
const lotId = (document.querySelector('#lot--lotId') as HTMLInputElement)
|
||||
.value
|
||||
const isCreate = lotId === ''
|
||||
|
||||
// Main form
|
||||
|
||||
let refreshAfterSave = isCreate;
|
||||
let refreshAfterSave = isCreate
|
||||
|
||||
const formElement = document.querySelector("#form--lot") as HTMLFormElement;
|
||||
const formElement = document.querySelector('#form--lot') as HTMLFormElement
|
||||
|
||||
function updateLot(formEvent: SubmitEvent) {
|
||||
formEvent.preventDefault();
|
||||
formEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lots/" + (isCreate ? "doCreateLot" : "doUpdateLot"),
|
||||
los.urlPrefix + '/lots/' + (isCreate ? 'doCreateLot' : 'doUpdateLot'),
|
||||
formElement,
|
||||
(responseJSON: { success: boolean; lotId?: number; errorMessage?: string }) => {
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
lotId?: number
|
||||
errorMessage?: string
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
los.clearUnsavedChanges();
|
||||
los.clearUnsavedChanges()
|
||||
|
||||
if (isCreate || refreshAfterSave) {
|
||||
window.location.href = los.getLotURL(responseJSON.lotId, true, true);
|
||||
window.location.href = los.getLotURL(responseJSON.lotId, true, 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);
|
||||
formElement.addEventListener('submit', updateLot)
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
los.initializeUnlockFieldButtons(formElement);
|
||||
los.initializeUnlockFieldButtons(formElement)
|
||||
|
||||
document.querySelector("#button--deleteLot")?.addEventListener("click", (clickEvent) => {
|
||||
clickEvent.preventDefault();
|
||||
document
|
||||
.querySelector('#button--deleteLot')
|
||||
?.addEventListener('click', (clickEvent) => {
|
||||
clickEvent.preventDefault()
|
||||
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lots/doDeleteLot",
|
||||
los.urlPrefix + '/lots/doDeleteLot',
|
||||
{
|
||||
lotId
|
||||
},
|
||||
(responseJSON: { success: boolean; errorMessage?: string }) => {
|
||||
if (responseJSON.success) {
|
||||
cityssm.disableNavBlocker();
|
||||
window.location.href = los.getLotURL();
|
||||
cityssm.disableNavBlocker()
|
||||
window.location.href = los.getLotURL()
|
||||
} 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
|
||||
}
|
||||
});
|
||||
});
|
||||
})
|
||||
})
|
||||
|
||||
// Lot Type
|
||||
|
||||
const lotTypeIdElement = document.querySelector("#lot--lotTypeId") as HTMLSelectElement;
|
||||
const lotTypeIdElement = document.querySelector(
|
||||
'#lot--lotTypeId'
|
||||
) as HTMLSelectElement
|
||||
|
||||
if (isCreate) {
|
||||
const lotFieldsContainerElement = document.querySelector("#container--lotFields") as HTMLElement;
|
||||
const lotFieldsContainerElement = document.querySelector(
|
||||
'#container--lotFields'
|
||||
) as HTMLElement
|
||||
|
||||
lotTypeIdElement.addEventListener("change", () => {
|
||||
if (lotTypeIdElement.value === "") {
|
||||
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>`;
|
||||
</div>`
|
||||
|
||||
return;
|
||||
return
|
||||
}
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lots/doGetLotTypeFields",
|
||||
los.urlPrefix + '/lots/doGetLotTypeFields',
|
||||
{
|
||||
lotTypeId: lotTypeIdElement.value
|
||||
},
|
||||
|
|
@ -121,341 +132,389 @@ declare const bulmaJS: BulmaJS;
|
|||
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>`;
|
||||
</div>`
|
||||
|
||||
return;
|
||||
return
|
||||
}
|
||||
|
||||
lotFieldsContainerElement.innerHTML = "";
|
||||
lotFieldsContainerElement.innerHTML = ''
|
||||
|
||||
let lotTypeFieldIds = "";
|
||||
let lotTypeFieldIds = ''
|
||||
|
||||
for (const lotTypeField of responseJSON.lotTypeFields) {
|
||||
lotTypeFieldIds += "," + lotTypeField.lotTypeFieldId;
|
||||
lotTypeFieldIds += ',' + lotTypeField.lotTypeFieldId
|
||||
|
||||
const fieldName = "lotFieldValue_" + lotTypeField.lotTypeFieldId;
|
||||
const fieldName = 'lotFieldValue_' + lotTypeField.lotTypeFieldId
|
||||
|
||||
const fieldId = "lot--" + fieldName;
|
||||
const fieldId = 'lot--' + fieldName
|
||||
|
||||
const fieldElement = document.createElement("div");
|
||||
fieldElement.className = "field";
|
||||
const fieldElement = document.createElement('div')
|
||||
fieldElement.className = 'field'
|
||||
fieldElement.innerHTML = `<label class="label" for="${fieldId}"></label>
|
||||
<div class="control"></div>`;
|
||||
<div class="control"></div>`
|
||||
|
||||
(fieldElement.querySelector("label") as HTMLLabelElement).textContent =
|
||||
lotTypeField.lotTypeField as string;
|
||||
;(
|
||||
fieldElement.querySelector('label') as HTMLLabelElement
|
||||
).textContent = lotTypeField.lotTypeField as string
|
||||
|
||||
if (lotTypeField.lotTypeFieldValues === "") {
|
||||
const inputElement = document.createElement("input");
|
||||
if (lotTypeField.lotTypeFieldValues === '') {
|
||||
const inputElement = document.createElement('input')
|
||||
|
||||
inputElement.className = "input";
|
||||
inputElement.className = 'input'
|
||||
|
||||
inputElement.id = fieldId;
|
||||
inputElement.id = fieldId
|
||||
|
||||
inputElement.name = fieldName;
|
||||
inputElement.name = fieldName
|
||||
|
||||
inputElement.type = "text";
|
||||
inputElement.type = 'text'
|
||||
|
||||
inputElement.required = lotTypeField.isRequired as boolean;
|
||||
inputElement.minLength = lotTypeField.minimumLength as number;
|
||||
inputElement.maxLength = lotTypeField.maximumLength as number;
|
||||
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;
|
||||
if (lotTypeField.pattern && lotTypeField.pattern !== '') {
|
||||
inputElement.pattern = lotTypeField.pattern
|
||||
}
|
||||
|
||||
fieldElement.querySelector(".control")!.append(inputElement);
|
||||
fieldElement.querySelector('.control')!.append(inputElement)
|
||||
} else {
|
||||
fieldElement.querySelector(
|
||||
".control"
|
||||
'.control'
|
||||
)!.innerHTML = `<div class="select is-fullwidth">
|
||||
<select id="${fieldId}" name="${fieldName}"><option value="">(Not Set)</option></select>
|
||||
</div>`;
|
||||
</div>`
|
||||
|
||||
const selectElement = fieldElement.querySelector("select") as HTMLSelectElement;
|
||||
const selectElement = fieldElement.querySelector(
|
||||
'select'
|
||||
) as HTMLSelectElement
|
||||
|
||||
selectElement.required = lotTypeField.isRequired as boolean;
|
||||
selectElement.required = lotTypeField.isRequired as boolean
|
||||
|
||||
const optionValues = (lotTypeField.lotTypeFieldValues as string).split("\n");
|
||||
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);
|
||||
const optionElement = document.createElement('option')
|
||||
optionElement.value = optionValue
|
||||
optionElement.textContent = optionValue
|
||||
selectElement.append(optionElement)
|
||||
}
|
||||
}
|
||||
|
||||
lotFieldsContainerElement.append(fieldElement);
|
||||
lotFieldsContainerElement.append(fieldElement)
|
||||
}
|
||||
|
||||
lotFieldsContainerElement.insertAdjacentHTML(
|
||||
"beforeend",
|
||||
'beforeend',
|
||||
`<input name="lotTypeFieldIds" type="hidden"
|
||||
value="${lotTypeFieldIds.slice(1)}" />`
|
||||
);
|
||||
)
|
||||
}
|
||||
);
|
||||
});
|
||||
)
|
||||
})
|
||||
} else {
|
||||
const originalLotTypeId = lotTypeIdElement.value;
|
||||
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;
|
||||
refreshAfterSave = true
|
||||
}
|
||||
},
|
||||
cancelButton: {
|
||||
text: "Revert the Change",
|
||||
text: 'Revert the Change',
|
||||
callbackFunction: () => {
|
||||
lotTypeIdElement.value = originalLotTypeId;
|
||||
lotTypeIdElement.value = originalLotTypeId
|
||||
}
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
// Comments
|
||||
|
||||
let lotComments: recordTypes.LotComment[] = exports.lotComments;
|
||||
delete exports.lotComments;
|
||||
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!,
|
||||
(clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset
|
||||
.lotCommentId!,
|
||||
10
|
||||
);
|
||||
)
|
||||
|
||||
const lotComment = lotComments.find((currentLotComment) => {
|
||||
return currentLotComment.lotCommentId === lotCommentId;
|
||||
})!;
|
||||
return currentLotComment.lotCommentId === lotCommentId
|
||||
})!
|
||||
|
||||
let editFormElement: HTMLFormElement;
|
||||
let editCloseModalFunction: () => void;
|
||||
let editFormElement: HTMLFormElement
|
||||
let editCloseModalFunction: () => void
|
||||
|
||||
const editComment = (submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
submitEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lots/doUpdateLotComment",
|
||||
los.urlPrefix + '/lots/doUpdateLotComment',
|
||||
editFormElement,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotComments?: recordTypes.LotComment[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotComments?: recordTypes.LotComment[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotComments = responseJSON.lotComments!;
|
||||
editCloseModalFunction();
|
||||
renderLotComments();
|
||||
lotComments = responseJSON.lotComments!
|
||||
editCloseModalFunction()
|
||||
renderLotComments()
|
||||
} 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);
|
||||
los.populateAliases(modalElement)
|
||||
|
||||
(modalElement.querySelector("#lotCommentEdit--lotId") as HTMLInputElement).value = lotId;
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotCommentEdit--lotId'
|
||||
) as HTMLInputElement
|
||||
).value = lotId
|
||||
|
||||
(modalElement.querySelector("#lotCommentEdit--lotCommentId") as HTMLInputElement).value =
|
||||
lotCommentId.toString();
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotCommentEdit--lotCommentId'
|
||||
) as HTMLInputElement
|
||||
).value = lotCommentId.toString()
|
||||
|
||||
(modalElement.querySelector("#lotCommentEdit--lotComment") as HTMLInputElement).value =
|
||||
lotComment.lotComment!;
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotCommentEdit--lotComment'
|
||||
) as HTMLInputElement
|
||||
).value = lotComment.lotComment!
|
||||
|
||||
const lotCommentDateStringElement = modalElement.querySelector(
|
||||
"#lotCommentEdit--lotCommentDateString"
|
||||
) as HTMLInputElement;
|
||||
'#lotCommentEdit--lotCommentDateString'
|
||||
) as HTMLInputElement
|
||||
|
||||
lotCommentDateStringElement.value = lotComment.lotCommentDateString!;
|
||||
lotCommentDateStringElement.value = lotComment.lotCommentDateString!
|
||||
|
||||
const currentDateString = cityssm.dateToString(new Date());
|
||||
const currentDateString = cityssm.dateToString(new Date())
|
||||
|
||||
lotCommentDateStringElement.max =
|
||||
lotComment.lotCommentDateString! <= currentDateString
|
||||
? currentDateString
|
||||
: lotComment.lotCommentDateString!;
|
||||
: lotComment.lotCommentDateString!
|
||||
|
||||
(
|
||||
modalElement.querySelector("#lotCommentEdit--lotCommentTimeString") as HTMLInputElement
|
||||
).value = lotComment.lotCommentTimeString!;
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotCommentEdit--lotCommentTimeString'
|
||||
) as HTMLInputElement
|
||||
).value = lotComment.lotCommentTimeString!
|
||||
},
|
||||
onshown: (modalElement, closeModalFunction) => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
|
||||
los.initializeDatePickers(modalElement);
|
||||
los.initializeDatePickers(modalElement)
|
||||
// los.initializeTimePickers(modalElement);
|
||||
|
||||
(modalElement.querySelector("#lotCommentEdit--lotComment") as HTMLTextAreaElement).focus();
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotCommentEdit--lotComment'
|
||||
) as HTMLTextAreaElement
|
||||
).focus()
|
||||
|
||||
editFormElement = modalElement.querySelector("form")!;
|
||||
editFormElement.addEventListener("submit", editComment);
|
||||
editFormElement = modalElement.querySelector('form')!
|
||||
editFormElement.addEventListener('submit', editComment)
|
||||
|
||||
editCloseModalFunction = closeModalFunction;
|
||||
editCloseModalFunction = closeModalFunction
|
||||
},
|
||||
onremoved: () => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
function deleteLotComment(clickEvent: Event) {
|
||||
const lotCommentId = Number.parseInt(
|
||||
(clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.lotCommentId!,
|
||||
(clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset
|
||||
.lotCommentId!,
|
||||
10
|
||||
);
|
||||
)
|
||||
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lots/doDeleteLotComment",
|
||||
los.urlPrefix + '/lots/doDeleteLotComment',
|
||||
{
|
||||
lotId,
|
||||
lotCommentId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotComments: recordTypes.LotComment[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotComments: recordTypes.LotComment[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotComments = responseJSON.lotComments;
|
||||
renderLotComments();
|
||||
lotComments = responseJSON.lotComments
|
||||
renderLotComments()
|
||||
} 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") as HTMLElement;
|
||||
const containerElement = document.querySelector(
|
||||
'#container--lotComments'
|
||||
) as HTMLElement
|
||||
|
||||
if (lotComments.length === 0) {
|
||||
containerElement.innerHTML = `<div class="message is-info">
|
||||
<p class="message-body">There are no comments to display.</p>
|
||||
</div>`;
|
||||
return;
|
||||
</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>`;
|
||||
<tbody></tbody>`
|
||||
|
||||
for (const lotComment of lotComments) {
|
||||
const tableRowElement = document.createElement("tr");
|
||||
tableRowElement.dataset.lotCommentId = lotComment.lotCommentId!.toString();
|
||||
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>");
|
||||
'</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);
|
||||
containerElement.innerHTML = ''
|
||||
containerElement.append(tableElement)
|
||||
}
|
||||
|
||||
function openAddCommentModal() {
|
||||
let addCommentCloseModalFunction: () => void;
|
||||
let addCommentCloseModalFunction: () => void
|
||||
|
||||
const doAddComment = (formEvent: SubmitEvent) => {
|
||||
formEvent.preventDefault();
|
||||
formEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lots/doAddLotComment",
|
||||
los.urlPrefix + '/lots/doAddLotComment',
|
||||
formEvent.currentTarget,
|
||||
(responseJSON: { success: boolean; lotComments?: recordTypes.LotComment[] }) => {
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
lotComments?: recordTypes.LotComment[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotComments = responseJSON.lotComments!;
|
||||
renderLotComments();
|
||||
addCommentCloseModalFunction();
|
||||
lotComments = responseJSON.lotComments!
|
||||
renderLotComments()
|
||||
addCommentCloseModalFunction()
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
)
|
||||
}
|
||||
|
||||
cityssm.openHtmlModal("lot-addComment", {
|
||||
cityssm.openHtmlModal('lot-addComment', {
|
||||
onshow(modalElement) {
|
||||
los.populateAliases(modalElement);
|
||||
(modalElement.querySelector("#lotCommentAdd--lotId") as HTMLInputElement).value = lotId;
|
||||
modalElement.querySelector("form")!.addEventListener("submit", doAddComment);
|
||||
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();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
addCommentCloseModalFunction = closeModalFunction
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotCommentAdd--lotComment'
|
||||
) as HTMLTextAreaElement
|
||||
).focus()
|
||||
},
|
||||
onremoved() {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
(document.querySelector("#lotComments--add") as HTMLButtonElement).focus();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
;(
|
||||
document.querySelector('#lotComments--add') as HTMLButtonElement
|
||||
).focus()
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
if (!isCreate) {
|
||||
document.querySelector("#lotComments--add")!.addEventListener("click", openAddCommentModal);
|
||||
renderLotComments();
|
||||
document
|
||||
.querySelector('#lotComments--add')!
|
||||
.addEventListener('click', openAddCommentModal)
|
||||
renderLotComments()
|
||||
}
|
||||
})();
|
||||
})()
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -1,604 +1,698 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
|
||||
import type * as globalTypes from "../../types/globalTypes";
|
||||
import type * as recordTypes from "../../types/recordTypes";
|
||||
import type * as globalTypes from '../../types/globalTypes'
|
||||
import type * as recordTypes from '../../types/recordTypes'
|
||||
|
||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||
|
||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
||||
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||
|
||||
declare const cityssm: cityssmGlobal;
|
||||
declare const bulmaJS: BulmaJS;
|
||||
declare const cityssm: cityssmGlobal
|
||||
declare const bulmaJS: BulmaJS
|
||||
;(() => {
|
||||
const los = exports.los as globalTypes.LOS
|
||||
|
||||
(() => {
|
||||
const los = exports.los as globalTypes.LOS;
|
||||
|
||||
const lotOccupancyId = (document.querySelector("#lotOccupancy--lotOccupancyId") as HTMLInputElement)
|
||||
.value;
|
||||
const isCreate = lotOccupancyId === "";
|
||||
const lotOccupancyId = (
|
||||
document.querySelector('#lotOccupancy--lotOccupancyId') as HTMLInputElement
|
||||
).value
|
||||
const isCreate = lotOccupancyId === ''
|
||||
|
||||
/*
|
||||
* Main form
|
||||
*/
|
||||
|
||||
let refreshAfterSave = isCreate;
|
||||
let refreshAfterSave = isCreate
|
||||
|
||||
const formElement = document.querySelector("#form--lotOccupancy") as HTMLFormElement;
|
||||
const formElement = document.querySelector(
|
||||
'#form--lotOccupancy'
|
||||
) as HTMLFormElement
|
||||
|
||||
formElement.addEventListener("submit", (formEvent) => {
|
||||
formEvent.preventDefault();
|
||||
formElement.addEventListener('submit', (formEvent) => {
|
||||
formEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lotOccupancies/" + (isCreate ? "doCreateLotOccupancy" : "doUpdateLotOccupancy"),
|
||||
los.urlPrefix +
|
||||
'/lotOccupancies/' +
|
||||
(isCreate ? 'doCreateLotOccupancy' : 'doUpdateLotOccupancy'),
|
||||
formElement,
|
||||
(responseJSON: { success: boolean; lotOccupancyId?: number; errorMessage?: string }) => {
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
lotOccupancyId?: number
|
||||
errorMessage?: string
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
los.clearUnsavedChanges();
|
||||
los.clearUnsavedChanges()
|
||||
|
||||
if (isCreate || refreshAfterSave) {
|
||||
window.location.href = los.getLotOccupancyURL(
|
||||
responseJSON.lotOccupancyId,
|
||||
true,
|
||||
true
|
||||
);
|
||||
)
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
message: `${los.escapedAliases.Occupancy} Updated Successfully`,
|
||||
contextualColorName: "success"
|
||||
});
|
||||
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",
|
||||
los.urlPrefix + '/lotOccupancies/doCopyLotOccupancy',
|
||||
{
|
||||
lotOccupancyId
|
||||
},
|
||||
(responseJSON: { success: boolean; errorMessage?: string; lotOccupancyId?: number }) => {
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotOccupancyId?: number
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
cityssm.disableNavBlocker();
|
||||
window.location.href = los.getLotOccupancyURL(responseJSON.lotOccupancyId, true);
|
||||
cityssm.disableNavBlocker()
|
||||
window.location.href = los.getLotOccupancyURL(
|
||||
responseJSON.lotOccupancyId,
|
||||
true
|
||||
)
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Copying Record",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
title: 'Error Copying Record',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
)
|
||||
}
|
||||
|
||||
document.querySelector("#button--copyLotOccupancy")?.addEventListener("click", (clickEvent) => {
|
||||
clickEvent.preventDefault();
|
||||
document
|
||||
.querySelector('#button--copyLotOccupancy')
|
||||
?.addEventListener('click', (clickEvent) => {
|
||||
clickEvent.preventDefault()
|
||||
|
||||
if (los.hasUnsavedChanges()) {
|
||||
bulmaJS.alert({
|
||||
title: "Unsaved Changes",
|
||||
message: "Please save all unsaved changes before continuing.",
|
||||
contextualColorName: "warning"
|
||||
});
|
||||
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
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
document.querySelector("#button--deleteLotOccupancy")?.addEventListener("click", (clickEvent) => {
|
||||
clickEvent.preventDefault();
|
||||
document
|
||||
.querySelector('#button--deleteLotOccupancy')
|
||||
?.addEventListener('click', (clickEvent) => {
|
||||
clickEvent.preventDefault()
|
||||
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancy",
|
||||
los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancy',
|
||||
{
|
||||
lotOccupancyId
|
||||
},
|
||||
(responseJSON: { success: boolean; errorMessage?: string }) => {
|
||||
if (responseJSON.success) {
|
||||
cityssm.disableNavBlocker();
|
||||
window.location.href = los.getLotOccupancyURL();
|
||||
cityssm.disableNavBlocker()
|
||||
window.location.href = los.getLotOccupancyURL()
|
||||
} 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
|
||||
}
|
||||
});
|
||||
});
|
||||
})
|
||||
})
|
||||
|
||||
document.querySelector("#button--createWorkOrder")?.addEventListener("click", (clickEvent) => {
|
||||
clickEvent.preventDefault();
|
||||
document
|
||||
.querySelector('#button--createWorkOrder')
|
||||
?.addEventListener('click', (clickEvent) => {
|
||||
clickEvent.preventDefault()
|
||||
|
||||
let createCloseModalFunction: () => void;
|
||||
let createCloseModalFunction: () => void
|
||||
|
||||
const doCreate = (formEvent: SubmitEvent) => {
|
||||
formEvent.preventDefault();
|
||||
formEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/workOrders/doCreateWorkOrder",
|
||||
los.urlPrefix + '/workOrders/doCreateWorkOrder',
|
||||
formEvent.currentTarget,
|
||||
(responseJSON: { success: boolean; errorMessage?: string; workOrderId?: number }) => {
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
workOrderId?: number
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
createCloseModalFunction();
|
||||
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 as string,
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
)
|
||||
}
|
||||
|
||||
cityssm.openHtmlModal("lotOccupancy-createWorkOrder", {
|
||||
cityssm.openHtmlModal('lotOccupancy-createWorkOrder', {
|
||||
onshow(modalElement) {
|
||||
(modalElement.querySelector("#workOrderCreate--lotOccupancyId") as HTMLInputElement).value =
|
||||
lotOccupancyId;
|
||||
|
||||
(
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#workOrderCreate--workOrderOpenDateString"
|
||||
'#workOrderCreate--lotOccupancyId'
|
||||
) as HTMLInputElement
|
||||
).value = cityssm.dateToString(new Date());
|
||||
).value = lotOccupancyId
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#workOrderCreate--workOrderOpenDateString'
|
||||
) as HTMLInputElement
|
||||
).value = cityssm.dateToString(new Date())
|
||||
|
||||
const workOrderTypeSelectElement = modalElement.querySelector(
|
||||
"#workOrderCreate--workOrderTypeId"
|
||||
) as HTMLSelectElement;
|
||||
'#workOrderCreate--workOrderTypeId'
|
||||
) as HTMLSelectElement
|
||||
|
||||
const workOrderTypes = exports.workOrderTypes as recordTypes.WorkOrderType[];
|
||||
const workOrderTypes =
|
||||
exports.workOrderTypes as recordTypes.WorkOrderType[]
|
||||
|
||||
if (workOrderTypes.length === 1) {
|
||||
workOrderTypeSelectElement.innerHTML = "";
|
||||
workOrderTypeSelectElement.innerHTML = ''
|
||||
}
|
||||
|
||||
for (const workOrderType of workOrderTypes) {
|
||||
const optionElement = document.createElement("option");
|
||||
optionElement.value = (workOrderType.workOrderTypeId as number).toString();
|
||||
optionElement.textContent = workOrderType.workOrderType as string;
|
||||
workOrderTypeSelectElement.append(optionElement);
|
||||
const optionElement = document.createElement('option')
|
||||
optionElement.value = (
|
||||
workOrderType.workOrderTypeId as number
|
||||
).toString()
|
||||
optionElement.textContent = workOrderType.workOrderType as string
|
||||
workOrderTypeSelectElement.append(optionElement)
|
||||
}
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
createCloseModalFunction = closeModalFunction;
|
||||
createCloseModalFunction = closeModalFunction
|
||||
|
||||
modalElement.querySelector("form")?.addEventListener("submit", doCreate);
|
||||
modalElement
|
||||
.querySelector('form')
|
||||
?.addEventListener('submit', doCreate)
|
||||
}
|
||||
});
|
||||
});
|
||||
})
|
||||
})
|
||||
|
||||
// Occupancy Type
|
||||
|
||||
const occupancyTypeIdElement = document.querySelector(
|
||||
"#lotOccupancy--occupancyTypeId"
|
||||
) as HTMLSelectElement;
|
||||
'#lotOccupancy--occupancyTypeId'
|
||||
) as HTMLSelectElement
|
||||
|
||||
if (isCreate) {
|
||||
const lotOccupancyFieldsContainerElement = document.querySelector(
|
||||
"#container--lotOccupancyFields"
|
||||
) as HTMLElement;
|
||||
'#container--lotOccupancyFields'
|
||||
) as HTMLElement
|
||||
|
||||
occupancyTypeIdElement.addEventListener("change", () => {
|
||||
if (occupancyTypeIdElement.value === "") {
|
||||
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>`;
|
||||
</div>`
|
||||
|
||||
return;
|
||||
return
|
||||
}
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lotOccupancies/doGetOccupancyTypeFields",
|
||||
los.urlPrefix + '/lotOccupancies/doGetOccupancyTypeFields',
|
||||
{
|
||||
occupancyTypeId: occupancyTypeIdElement.value
|
||||
},
|
||||
(responseJSON: { occupancyTypeFields: recordTypes.OccupancyTypeField[] }) => {
|
||||
(responseJSON: {
|
||||
occupancyTypeFields: recordTypes.OccupancyTypeField[]
|
||||
}) => {
|
||||
if (responseJSON.occupancyTypeFields.length === 0) {
|
||||
lotOccupancyFieldsContainerElement.innerHTML = `<div class="message is-info">
|
||||
<p class="message-body">There are no additional fields for this ${los.escapedAliases.occupancy} type.</p>
|
||||
</div>`;
|
||||
</div>`
|
||||
|
||||
return;
|
||||
return
|
||||
}
|
||||
|
||||
lotOccupancyFieldsContainerElement.innerHTML = "";
|
||||
lotOccupancyFieldsContainerElement.innerHTML = ''
|
||||
|
||||
let occupancyTypeFieldIds = "";
|
||||
let occupancyTypeFieldIds = ''
|
||||
|
||||
for (const occupancyTypeField of responseJSON.occupancyTypeFields) {
|
||||
occupancyTypeFieldIds += "," + occupancyTypeField.occupancyTypeFieldId;
|
||||
occupancyTypeFieldIds +=
|
||||
',' + occupancyTypeField.occupancyTypeFieldId
|
||||
|
||||
const fieldName = "lotOccupancyFieldValue_" + occupancyTypeField.occupancyTypeFieldId;
|
||||
const fieldName =
|
||||
'lotOccupancyFieldValue_' +
|
||||
occupancyTypeField.occupancyTypeFieldId
|
||||
|
||||
const fieldId = "lotOccupancy--" + fieldName;
|
||||
const fieldId = 'lotOccupancy--' + fieldName
|
||||
|
||||
const fieldElement = document.createElement("div");
|
||||
fieldElement.className = "field";
|
||||
fieldElement.innerHTML = `<label class="label" for="${fieldId}"></label><div class="control"></div>`;
|
||||
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 = occupancyTypeField.occupancyTypeField as string
|
||||
|
||||
(fieldElement.querySelector("label") as HTMLLabelElement).textContent =
|
||||
occupancyTypeField.occupancyTypeField as string;
|
||||
if (occupancyTypeField.occupancyTypeFieldValues === '') {
|
||||
const inputElement = document.createElement('input')
|
||||
|
||||
if (occupancyTypeField.occupancyTypeFieldValues === "") {
|
||||
const inputElement = document.createElement("input");
|
||||
inputElement.className = 'input'
|
||||
|
||||
inputElement.className = "input";
|
||||
inputElement.id = fieldId
|
||||
|
||||
inputElement.id = fieldId;
|
||||
inputElement.name = fieldName
|
||||
|
||||
inputElement.name = fieldName;
|
||||
inputElement.type = 'text'
|
||||
|
||||
inputElement.type = "text";
|
||||
inputElement.required = occupancyTypeField.isRequired as boolean
|
||||
inputElement.minLength =
|
||||
occupancyTypeField.minimumLength as number
|
||||
inputElement.maxLength =
|
||||
occupancyTypeField.maximumLength as number
|
||||
|
||||
inputElement.required = occupancyTypeField.isRequired as boolean;
|
||||
inputElement.minLength = occupancyTypeField.minimumLength as number;
|
||||
inputElement.maxLength = occupancyTypeField.maximumLength as number;
|
||||
|
||||
if (occupancyTypeField.pattern && occupancyTypeField.pattern !== "") {
|
||||
inputElement.pattern = occupancyTypeField.pattern;
|
||||
if (
|
||||
occupancyTypeField.pattern &&
|
||||
occupancyTypeField.pattern !== ''
|
||||
) {
|
||||
inputElement.pattern = occupancyTypeField.pattern
|
||||
}
|
||||
|
||||
(fieldElement.querySelector(".control") as HTMLElement).append(inputElement);
|
||||
;(fieldElement.querySelector('.control') as HTMLElement).append(
|
||||
inputElement
|
||||
)
|
||||
} else {
|
||||
(fieldElement.querySelector(".control") as HTMLElement).innerHTML =
|
||||
;(
|
||||
fieldElement.querySelector('.control') as HTMLElement
|
||||
).innerHTML =
|
||||
'<div class="select is-fullwidth"><select id="' +
|
||||
fieldId +
|
||||
'" name="' +
|
||||
fieldName +
|
||||
'">' +
|
||||
'<option value="">(Not Set)</option>' +
|
||||
"</select></div>";
|
||||
'</select></div>'
|
||||
|
||||
const selectElement = fieldElement.querySelector("select") as HTMLSelectElement;
|
||||
const selectElement = fieldElement.querySelector(
|
||||
'select'
|
||||
) as HTMLSelectElement
|
||||
|
||||
selectElement.required = occupancyTypeField.isRequired as boolean;
|
||||
selectElement.required = occupancyTypeField.isRequired as boolean
|
||||
|
||||
const optionValues = (
|
||||
occupancyTypeField.occupancyTypeFieldValues as string
|
||||
).split("\n");
|
||||
).split('\n')
|
||||
|
||||
for (const optionValue of optionValues) {
|
||||
const optionElement = document.createElement("option");
|
||||
optionElement.value = optionValue;
|
||||
optionElement.textContent = optionValue;
|
||||
selectElement.append(optionElement);
|
||||
const optionElement = document.createElement('option')
|
||||
optionElement.value = optionValue
|
||||
optionElement.textContent = optionValue
|
||||
selectElement.append(optionElement)
|
||||
}
|
||||
}
|
||||
|
||||
lotOccupancyFieldsContainerElement.append(fieldElement);
|
||||
lotOccupancyFieldsContainerElement.append(fieldElement)
|
||||
}
|
||||
|
||||
lotOccupancyFieldsContainerElement.insertAdjacentHTML(
|
||||
"beforeend",
|
||||
'beforeend',
|
||||
`<input name="occupancyTypeFieldIds" type="hidden" value="${occupancyTypeFieldIds.slice(
|
||||
1
|
||||
)}" />`
|
||||
);
|
||||
)
|
||||
}
|
||||
);
|
||||
});
|
||||
)
|
||||
})
|
||||
} else {
|
||||
const originalOccupancyTypeId = occupancyTypeIdElement.value;
|
||||
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;
|
||||
refreshAfterSave = true
|
||||
}
|
||||
},
|
||||
cancelButton: {
|
||||
text: "Revert the Change",
|
||||
text: 'Revert the Change',
|
||||
callbackFunction: () => {
|
||||
occupancyTypeIdElement.value = originalOccupancyTypeId;
|
||||
occupancyTypeIdElement.value = originalOccupancyTypeId
|
||||
}
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
// Lot Selector
|
||||
|
||||
const lotNameElement = document.querySelector("#lotOccupancy--lotName") as HTMLInputElement;
|
||||
const lotNameElement = document.querySelector(
|
||||
'#lotOccupancy--lotName'
|
||||
) as HTMLInputElement
|
||||
|
||||
lotNameElement.addEventListener("click", (clickEvent) => {
|
||||
const currentLotName = (clickEvent.currentTarget as HTMLInputElement).value;
|
||||
lotNameElement.addEventListener('click', (clickEvent) => {
|
||||
const currentLotName = (clickEvent.currentTarget as HTMLInputElement).value
|
||||
|
||||
let lotSelectCloseModalFunction: () => void;
|
||||
let lotSelectModalElement: HTMLElement;
|
||||
let lotSelectCloseModalFunction: () => void
|
||||
let lotSelectModalElement: HTMLElement
|
||||
|
||||
let lotSelectFormElement: HTMLFormElement;
|
||||
let lotSelectResultsElement: HTMLElement;
|
||||
let lotSelectFormElement: HTMLFormElement
|
||||
let lotSelectResultsElement: HTMLElement
|
||||
|
||||
const renderSelectedLotAndClose = (lotId: number | string, lotName: string) => {
|
||||
(document.querySelector("#lotOccupancy--lotId") as HTMLInputElement).value = lotId.toString();
|
||||
(document.querySelector("#lotOccupancy--lotName") as HTMLInputElement).value = lotName;
|
||||
const renderSelectedLotAndClose = (
|
||||
lotId: number | string,
|
||||
lotName: string
|
||||
) => {
|
||||
;(
|
||||
document.querySelector('#lotOccupancy--lotId') as HTMLInputElement
|
||||
).value = lotId.toString()
|
||||
;(
|
||||
document.querySelector('#lotOccupancy--lotName') as HTMLInputElement
|
||||
).value = lotName
|
||||
|
||||
los.setUnsavedChanges();
|
||||
lotSelectCloseModalFunction();
|
||||
};
|
||||
los.setUnsavedChanges()
|
||||
lotSelectCloseModalFunction()
|
||||
}
|
||||
|
||||
const selectExistingLot = (clickEvent: Event) => {
|
||||
clickEvent.preventDefault();
|
||||
clickEvent.preventDefault()
|
||||
|
||||
const selectedLotElement = clickEvent.currentTarget as HTMLElement;
|
||||
const selectedLotElement = clickEvent.currentTarget as HTMLElement
|
||||
|
||||
renderSelectedLotAndClose(selectedLotElement.dataset.lotId!, selectedLotElement.dataset.lotName!);
|
||||
};
|
||||
renderSelectedLotAndClose(
|
||||
selectedLotElement.dataset.lotId!,
|
||||
selectedLotElement.dataset.lotName!
|
||||
)
|
||||
}
|
||||
|
||||
const searchLots = () => {
|
||||
lotSelectResultsElement.innerHTML = los.getLoadingParagraphHTML("Searching...");
|
||||
lotSelectResultsElement.innerHTML =
|
||||
los.getLoadingParagraphHTML('Searching...')
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lots/doSearchLots",
|
||||
los.urlPrefix + '/lots/doSearchLots',
|
||||
lotSelectFormElement,
|
||||
(responseJSON: { count: number; lots: recordTypes.Lot[] }) => {
|
||||
if (responseJSON.count === 0) {
|
||||
lotSelectResultsElement.innerHTML = `<div class="message is-info">
|
||||
<p class="message-body">No results.</p>
|
||||
</div>`;
|
||||
</div>`
|
||||
|
||||
return;
|
||||
return
|
||||
}
|
||||
|
||||
const panelElement = document.createElement("div");
|
||||
panelElement.className = "panel";
|
||||
const panelElement = document.createElement('div')
|
||||
panelElement.className = 'panel'
|
||||
|
||||
for (const lot of responseJSON.lots) {
|
||||
const panelBlockElement = document.createElement("a");
|
||||
panelBlockElement.className = "panel-block is-block";
|
||||
panelBlockElement.href = "#";
|
||||
const panelBlockElement = document.createElement('a')
|
||||
panelBlockElement.className = 'panel-block is-block'
|
||||
panelBlockElement.href = '#'
|
||||
|
||||
panelBlockElement.dataset.lotId = lot.lotId.toString();
|
||||
panelBlockElement.dataset.lotName = lot.lotName;
|
||||
panelBlockElement.dataset.lotId = lot.lotId.toString()
|
||||
panelBlockElement.dataset.lotName = lot.lotName
|
||||
|
||||
panelBlockElement.innerHTML =
|
||||
'<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 as string) +
|
||||
"<br />" +
|
||||
'<br />' +
|
||||
'<span class="is-size-7">' +
|
||||
(lot.lotOccupancyCount! > 0 ? "Currently Occupied" : "") +
|
||||
"</span>" +
|
||||
"</div>") +
|
||||
"</div>";
|
||||
(lot.lotOccupancyCount! > 0 ? 'Currently Occupied' : '') +
|
||||
'</span>' +
|
||||
'</div>') +
|
||||
'</div>'
|
||||
|
||||
panelBlockElement.addEventListener("click", selectExistingLot);
|
||||
panelBlockElement.addEventListener('click', selectExistingLot)
|
||||
|
||||
panelElement.append(panelBlockElement);
|
||||
panelElement.append(panelBlockElement)
|
||||
}
|
||||
|
||||
lotSelectResultsElement.innerHTML = "";
|
||||
lotSelectResultsElement.append(panelElement);
|
||||
lotSelectResultsElement.innerHTML = ''
|
||||
lotSelectResultsElement.append(panelElement)
|
||||
}
|
||||
)
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
const createLotAndSelect = (submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
submitEvent.preventDefault()
|
||||
|
||||
const lotName = (lotSelectModalElement.querySelector("#lotCreate--lotName") as HTMLInputElement)
|
||||
.value;
|
||||
const lotName = (
|
||||
lotSelectModalElement.querySelector(
|
||||
'#lotCreate--lotName'
|
||||
) as HTMLInputElement
|
||||
).value
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lots/doCreateLot",
|
||||
los.urlPrefix + '/lots/doCreateLot',
|
||||
submitEvent.currentTarget,
|
||||
(responseJSON: { success: boolean; errorMessage?: string; lotId?: number }) => {
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotId?: number
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
renderSelectedLotAndClose(responseJSON.lotId!, lotName);
|
||||
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);
|
||||
los.populateAliases(modalElement)
|
||||
},
|
||||
onshown: (modalElement, closeModalFunction) => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
|
||||
lotSelectModalElement = modalElement;
|
||||
lotSelectCloseModalFunction = closeModalFunction;
|
||||
lotSelectModalElement = modalElement
|
||||
lotSelectCloseModalFunction = closeModalFunction
|
||||
|
||||
bulmaJS.init(modalElement);
|
||||
bulmaJS.init(modalElement)
|
||||
|
||||
// search Tab
|
||||
|
||||
const lotNameFilterElement = modalElement.querySelector(
|
||||
"#lotSelect--lotName"
|
||||
) as HTMLInputElement;
|
||||
'#lotSelect--lotName'
|
||||
) as HTMLInputElement
|
||||
|
||||
if ((document.querySelector("#lotOccupancy--lotId") as HTMLInputElement).value !== "") {
|
||||
lotNameFilterElement.value = currentLotName;
|
||||
if (
|
||||
(document.querySelector('#lotOccupancy--lotId') as HTMLInputElement)
|
||||
.value !== ''
|
||||
) {
|
||||
lotNameFilterElement.value = currentLotName
|
||||
}
|
||||
|
||||
lotNameFilterElement.focus();
|
||||
lotNameFilterElement.addEventListener("change", searchLots);
|
||||
lotNameFilterElement.focus()
|
||||
lotNameFilterElement.addEventListener('change', searchLots)
|
||||
|
||||
const occupancyStatusFilterElement = modalElement.querySelector(
|
||||
"#lotSelect--occupancyStatus"
|
||||
) as HTMLSelectElement;
|
||||
occupancyStatusFilterElement.addEventListener("change", searchLots);
|
||||
'#lotSelect--occupancyStatus'
|
||||
) as HTMLSelectElement
|
||||
occupancyStatusFilterElement.addEventListener('change', searchLots)
|
||||
|
||||
if (currentLotName !== "") {
|
||||
occupancyStatusFilterElement.value = "";
|
||||
if (currentLotName !== '') {
|
||||
occupancyStatusFilterElement.value = ''
|
||||
}
|
||||
|
||||
lotSelectFormElement = modalElement.querySelector("#form--lotSelect") as HTMLFormElement;
|
||||
lotSelectFormElement = modalElement.querySelector(
|
||||
'#form--lotSelect'
|
||||
) as HTMLFormElement
|
||||
lotSelectResultsElement = modalElement.querySelector(
|
||||
"#resultsContainer--lotSelect"
|
||||
) as HTMLElement;
|
||||
'#resultsContainer--lotSelect'
|
||||
) as HTMLElement
|
||||
|
||||
lotSelectFormElement.addEventListener("submit", (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
});
|
||||
lotSelectFormElement.addEventListener('submit', (submitEvent) => {
|
||||
submitEvent.preventDefault()
|
||||
})
|
||||
|
||||
searchLots();
|
||||
searchLots()
|
||||
|
||||
// Create Tab
|
||||
|
||||
if (exports.lotNamePattern) {
|
||||
const regex = exports.lotNamePattern as RegExp;
|
||||
const regex = exports.lotNamePattern as RegExp
|
||||
|
||||
(modalElement.querySelector("#lotCreate--lotName") as HTMLInputElement).pattern =
|
||||
regex.source;
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotCreate--lotName'
|
||||
) as HTMLInputElement
|
||||
).pattern = regex.source
|
||||
}
|
||||
|
||||
const lotTypeElement = modalElement.querySelector(
|
||||
"#lotCreate--lotTypeId"
|
||||
) as HTMLSelectElement;
|
||||
'#lotCreate--lotTypeId'
|
||||
) as HTMLSelectElement
|
||||
|
||||
for (const lotType of exports.lotTypes as recordTypes.LotType[]) {
|
||||
const optionElement = document.createElement("option");
|
||||
optionElement.value = lotType.lotTypeId.toString();
|
||||
optionElement.textContent = lotType.lotType;
|
||||
lotTypeElement.append(optionElement);
|
||||
const optionElement = document.createElement('option')
|
||||
optionElement.value = lotType.lotTypeId.toString()
|
||||
optionElement.textContent = lotType.lotType
|
||||
lotTypeElement.append(optionElement)
|
||||
}
|
||||
|
||||
const lotStatusElement = modalElement.querySelector(
|
||||
"#lotCreate--lotStatusId"
|
||||
) as HTMLSelectElement;
|
||||
'#lotCreate--lotStatusId'
|
||||
) as HTMLSelectElement
|
||||
|
||||
for (const lotStatus of exports.lotStatuses as recordTypes.LotStatus[]) {
|
||||
const optionElement = document.createElement("option");
|
||||
optionElement.value = lotStatus.lotStatusId.toString();
|
||||
optionElement.textContent = lotStatus.lotStatus;
|
||||
lotStatusElement.append(optionElement);
|
||||
const optionElement = document.createElement('option')
|
||||
optionElement.value = lotStatus.lotStatusId.toString()
|
||||
optionElement.textContent = lotStatus.lotStatus
|
||||
lotStatusElement.append(optionElement)
|
||||
}
|
||||
|
||||
const mapElement = modalElement.querySelector("#lotCreate--mapId") as HTMLSelectElement;
|
||||
const mapElement = modalElement.querySelector(
|
||||
'#lotCreate--mapId'
|
||||
) as HTMLSelectElement
|
||||
|
||||
for (const map of exports.maps as recordTypes.Map[]) {
|
||||
const optionElement = document.createElement("option");
|
||||
optionElement.value = map.mapId!.toString();
|
||||
optionElement.textContent = map.mapName || "(No Name)";
|
||||
mapElement.append(optionElement);
|
||||
const optionElement = document.createElement('option')
|
||||
optionElement.value = map.mapId!.toString()
|
||||
optionElement.textContent = map.mapName || '(No Name)'
|
||||
mapElement.append(optionElement)
|
||||
}
|
||||
|
||||
(modalElement.querySelector("#form--lotCreate") as HTMLFormElement).addEventListener(
|
||||
"submit",
|
||||
createLotAndSelect
|
||||
);
|
||||
;(
|
||||
modalElement.querySelector('#form--lotCreate') as HTMLFormElement
|
||||
).addEventListener('submit', createLotAndSelect)
|
||||
},
|
||||
onremoved: () => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
}
|
||||
});
|
||||
});
|
||||
})
|
||||
})
|
||||
|
||||
document.querySelector(".is-lot-view-button")!.addEventListener("click", () => {
|
||||
const lotId = (document.querySelector("#lotOccupancy--lotId") as HTMLInputElement).value;
|
||||
document
|
||||
.querySelector('.is-lot-view-button')!
|
||||
.addEventListener('click', () => {
|
||||
const lotId = (
|
||||
document.querySelector('#lotOccupancy--lotId') as HTMLInputElement
|
||||
).value
|
||||
|
||||
if (lotId) {
|
||||
window.open(los.urlPrefix + "/lots/" + lotId);
|
||||
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") as HTMLInputElement).value = "";
|
||||
los.setUnsavedChanges();
|
||||
lotNameElement.value = `(No ${los.escapedAliases.Lot})`
|
||||
;(
|
||||
document.querySelector('#lotOccupancy--lotId') as HTMLInputElement
|
||||
).value = ''
|
||||
los.setUnsavedChanges()
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
// Start Date
|
||||
|
||||
los.initializeDatePickers(formElement);
|
||||
los.initializeDatePickers(formElement)
|
||||
|
||||
document.querySelector("#lotOccupancy--occupancyStartDateString")!.addEventListener("change", () => {
|
||||
document
|
||||
.querySelector('#lotOccupancy--occupancyStartDateString')!
|
||||
.addEventListener('change', () => {
|
||||
const endDatePicker = (
|
||||
document.querySelector("#lotOccupancy--occupancyEndDateString") as HTMLInputElement
|
||||
).bulmaCalendar.datePicker;
|
||||
document.querySelector(
|
||||
'#lotOccupancy--occupancyEndDateString'
|
||||
) as HTMLInputElement
|
||||
).bulmaCalendar.datePicker
|
||||
|
||||
endDatePicker.min = (
|
||||
document.querySelector("#lotOccupancy--occupancyStartDateString") as HTMLInputElement
|
||||
).value;
|
||||
document.querySelector(
|
||||
'#lotOccupancy--occupancyStartDateString'
|
||||
) as HTMLInputElement
|
||||
).value
|
||||
|
||||
endDatePicker.refresh();
|
||||
});
|
||||
endDatePicker.refresh()
|
||||
})
|
||||
|
||||
los.initializeUnlockFieldButtons(formElement);
|
||||
los.initializeUnlockFieldButtons(formElement)
|
||||
|
||||
/*
|
||||
* Occupants
|
||||
|
|
@ -610,4 +704,4 @@ declare const bulmaJS: BulmaJS;
|
|||
//=include lotOccupancyEditComments.js
|
||||
//=include lotOccupancyEditFees.js
|
||||
}
|
||||
})();
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -4,15 +4,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
let lotOccupancyComments = exports.lotOccupancyComments;
|
||||
delete exports.lotOccupancyComments;
|
||||
const openEditLotOccupancyComment = (clickEvent) => {
|
||||
const lotOccupancyCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.lotOccupancyCommentId, 10);
|
||||
const lotOccupancyCommentId = Number.parseInt(clickEvent.currentTarget.closest('tr').dataset
|
||||
.lotOccupancyCommentId, 10);
|
||||
const lotOccupancyComment = lotOccupancyComments.find((currentLotOccupancyComment) => {
|
||||
return currentLotOccupancyComment.lotOccupancyCommentId === lotOccupancyCommentId;
|
||||
return (currentLotOccupancyComment.lotOccupancyCommentId ===
|
||||
lotOccupancyCommentId);
|
||||
});
|
||||
let editFormElement;
|
||||
let editCloseModalFunction;
|
||||
const editComment = (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doUpdateLotOccupancyComment", editFormElement, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doUpdateLotOccupancyComment', editFormElement, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupancyComments = responseJSON.lotOccupancyComments;
|
||||
editCloseModalFunction();
|
||||
|
|
@ -20,20 +22,20 @@ const openEditLotOccupancyComment = (clickEvent) => {
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating Comment",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Updating Comment',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
cityssm.openHtmlModal("lotOccupancy-editComment", {
|
||||
cityssm.openHtmlModal('lotOccupancy-editComment', {
|
||||
onshow: (modalElement) => {
|
||||
los.populateAliases(modalElement);
|
||||
modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyId").value = lotOccupancyId;
|
||||
modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentId").value = lotOccupancyCommentId.toString();
|
||||
modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyComment").value = lotOccupancyComment.lotOccupancyComment;
|
||||
const lotOccupancyCommentDateStringElement = modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentDateString");
|
||||
modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyId').value = lotOccupancyId;
|
||||
modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyCommentId').value = lotOccupancyCommentId.toString();
|
||||
modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyComment').value = lotOccupancyComment.lotOccupancyComment;
|
||||
const lotOccupancyCommentDateStringElement = modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyCommentDateString');
|
||||
lotOccupancyCommentDateStringElement.value =
|
||||
lotOccupancyComment.lotOccupancyCommentDateString;
|
||||
const currentDateString = cityssm.dateToString(new Date());
|
||||
|
|
@ -41,15 +43,14 @@ const openEditLotOccupancyComment = (clickEvent) => {
|
|||
lotOccupancyComment.lotOccupancyCommentDateString <= currentDateString
|
||||
? currentDateString
|
||||
: lotOccupancyComment.lotOccupancyCommentDateString;
|
||||
modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentTimeString").value = lotOccupancyComment.lotOccupancyCommentTimeString;
|
||||
modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyCommentTimeString').value = lotOccupancyComment.lotOccupancyCommentTimeString;
|
||||
},
|
||||
onshown: (modalElement, closeModalFunction) => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
los.initializeDatePickers(modalElement);
|
||||
// los.initializeTimePickers(modalElement);
|
||||
modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyComment").focus();
|
||||
editFormElement = modalElement.querySelector("form");
|
||||
editFormElement.addEventListener("submit", editComment);
|
||||
modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyComment').focus();
|
||||
editFormElement = modalElement.querySelector('form');
|
||||
editFormElement.addEventListener('submit', editComment);
|
||||
editCloseModalFunction = closeModalFunction;
|
||||
},
|
||||
onremoved: () => {
|
||||
|
|
@ -58,9 +59,10 @@ const openEditLotOccupancyComment = (clickEvent) => {
|
|||
});
|
||||
};
|
||||
const deleteLotOccupancyComment = (clickEvent) => {
|
||||
const lotOccupancyCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.lotOccupancyCommentId, 10);
|
||||
const lotOccupancyCommentId = Number.parseInt(clickEvent.currentTarget.closest('tr').dataset
|
||||
.lotOccupancyCommentId, 10);
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyComment", {
|
||||
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyComment', {
|
||||
lotOccupancyId,
|
||||
lotOccupancyCommentId
|
||||
}, (responseJSON) => {
|
||||
|
|
@ -70,87 +72,87 @@ const deleteLotOccupancyComment = (clickEvent) => {
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Removing Comment",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Removing Comment',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
bulmaJS.confirm({
|
||||
title: "Remove Comment?",
|
||||
message: "Are you sure you want to remove this comment?",
|
||||
title: 'Remove Comment?',
|
||||
message: 'Are you sure you want to remove this comment?',
|
||||
okButton: {
|
||||
text: "Yes, Remove Comment",
|
||||
text: 'Yes, Remove Comment',
|
||||
callbackFunction: doDelete
|
||||
},
|
||||
contextualColorName: "warning"
|
||||
contextualColorName: 'warning'
|
||||
});
|
||||
};
|
||||
const renderLotOccupancyComments = () => {
|
||||
const containerElement = document.querySelector("#container--lotOccupancyComments");
|
||||
const containerElement = document.querySelector('#container--lotOccupancyComments');
|
||||
if (lotOccupancyComments.length === 0) {
|
||||
containerElement.innerHTML =
|
||||
'<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: () => {
|
||||
|
|
|
|||
|
|
@ -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!,
|
||||
(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();
|
||||
submitEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lotOccupancies/doUpdateLotOccupancyComment",
|
||||
los.urlPrefix + '/lotOccupancies/doUpdateLotOccupancyComment',
|
||||
editFormElement,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotOccupancyComments?: recordTypes.LotOccupancyComment[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotOccupancyComments?: recordTypes.LotOccupancyComment[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupancyComments = responseJSON.lotOccupancyComments!;
|
||||
editCloseModalFunction();
|
||||
renderLotOccupancyComments();
|
||||
lotOccupancyComments = responseJSON.lotOccupancyComments!
|
||||
editCloseModalFunction()
|
||||
renderLotOccupancyComments()
|
||||
} 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);
|
||||
los.populateAliases(modalElement)
|
||||
|
||||
(
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyCommentEdit--lotOccupancyId"
|
||||
'#lotOccupancyCommentEdit--lotOccupancyId'
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupancyId;
|
||||
(
|
||||
).value = lotOccupancyId
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyCommentEdit--lotOccupancyCommentId"
|
||||
'#lotOccupancyCommentEdit--lotOccupancyCommentId'
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupancyCommentId.toString();
|
||||
).value = lotOccupancyCommentId.toString()
|
||||
|
||||
(
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyCommentEdit--lotOccupancyComment"
|
||||
'#lotOccupancyCommentEdit--lotOccupancyComment'
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupancyComment.lotOccupancyComment!;
|
||||
).value = lotOccupancyComment.lotOccupancyComment!
|
||||
|
||||
const lotOccupancyCommentDateStringElement = modalElement.querySelector(
|
||||
"#lotOccupancyCommentEdit--lotOccupancyCommentDateString"
|
||||
) as HTMLInputElement;
|
||||
'#lotOccupancyCommentEdit--lotOccupancyCommentDateString'
|
||||
) as HTMLInputElement
|
||||
|
||||
lotOccupancyCommentDateStringElement.value =
|
||||
lotOccupancyComment.lotOccupancyCommentDateString!;
|
||||
lotOccupancyComment.lotOccupancyCommentDateString!
|
||||
|
||||
const currentDateString = cityssm.dateToString(new Date());
|
||||
const currentDateString = cityssm.dateToString(new Date())
|
||||
|
||||
lotOccupancyCommentDateStringElement.max =
|
||||
lotOccupancyComment.lotOccupancyCommentDateString! <= currentDateString
|
||||
? currentDateString
|
||||
: lotOccupancyComment.lotOccupancyCommentDateString!;
|
||||
: lotOccupancyComment.lotOccupancyCommentDateString!
|
||||
|
||||
(
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyCommentEdit--lotOccupancyCommentTimeString"
|
||||
'#lotOccupancyCommentEdit--lotOccupancyCommentTimeString'
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupancyComment.lotOccupancyCommentTimeString!;
|
||||
).value = lotOccupancyComment.lotOccupancyCommentTimeString!
|
||||
},
|
||||
onshown: (modalElement, closeModalFunction) => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
|
||||
los.initializeDatePickers(modalElement);
|
||||
los.initializeDatePickers(modalElement)
|
||||
// los.initializeTimePickers(modalElement);
|
||||
|
||||
(
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyCommentEdit--lotOccupancyComment"
|
||||
'#lotOccupancyCommentEdit--lotOccupancyComment'
|
||||
) as HTMLTextAreaElement
|
||||
).focus();
|
||||
).focus()
|
||||
|
||||
editFormElement = modalElement.querySelector("form")!;
|
||||
editFormElement.addEventListener("submit", editComment);
|
||||
editFormElement = modalElement.querySelector('form')!
|
||||
editFormElement.addEventListener('submit', editComment)
|
||||
|
||||
editCloseModalFunction = closeModalFunction;
|
||||
editCloseModalFunction = closeModalFunction
|
||||
},
|
||||
onremoved: () => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
}
|
||||
});
|
||||
};
|
||||
})
|
||||
}
|
||||
|
||||
const deleteLotOccupancyComment = (clickEvent: Event) => {
|
||||
const lotOccupancyCommentId = Number.parseInt(
|
||||
(clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.lotOccupancyCommentId!,
|
||||
(clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset
|
||||
.lotOccupancyCommentId!,
|
||||
10
|
||||
);
|
||||
)
|
||||
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyComment",
|
||||
los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyComment',
|
||||
{
|
||||
lotOccupancyId,
|
||||
lotOccupancyCommentId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotOccupancyComments: recordTypes.LotOccupancyComment[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotOccupancyComments: recordTypes.LotOccupancyComment[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupancyComments = responseJSON.lotOccupancyComments;
|
||||
renderLotOccupancyComments();
|
||||
lotOccupancyComments = responseJSON.lotOccupancyComments
|
||||
renderLotOccupancyComments()
|
||||
} 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"
|
||||
) as HTMLElement;
|
||||
'#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;
|
||||
'</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();
|
||||
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);
|
||||
.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();
|
||||
submitEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lotOccupancies/doAddLotOccupancyComment",
|
||||
los.urlPrefix + '/lotOccupancies/doAddLotOccupancyComment',
|
||||
addFormElement,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotOccupancyComments?: recordTypes.LotOccupancyComment[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotOccupancyComments?: recordTypes.LotOccupancyComment[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupancyComments = responseJSON.lotOccupancyComments!;
|
||||
addCloseModalFunction();
|
||||
renderLotOccupancyComments();
|
||||
lotOccupancyComments = responseJSON.lotOccupancyComments!
|
||||
addCloseModalFunction()
|
||||
renderLotOccupancyComments()
|
||||
} 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);
|
||||
los.populateAliases(modalElement)
|
||||
|
||||
(
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyCommentAdd--lotOccupancyId"
|
||||
'#lotOccupancyCommentAdd--lotOccupancyId'
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupancyId;
|
||||
).value = lotOccupancyId
|
||||
},
|
||||
onshown: (modalElement, closeModalFunction) => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
|
||||
(
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyCommentAdd--lotOccupancyComment"
|
||||
'#lotOccupancyCommentAdd--lotOccupancyComment'
|
||||
) as HTMLTextAreaElement
|
||||
).focus();
|
||||
).focus()
|
||||
|
||||
addFormElement = modalElement.querySelector("form")!;
|
||||
addFormElement.addEventListener("submit", addComment);
|
||||
addFormElement = modalElement.querySelector('form')!
|
||||
addFormElement.addEventListener('submit', addComment)
|
||||
|
||||
addCloseModalFunction = closeModalFunction;
|
||||
addCloseModalFunction = closeModalFunction
|
||||
},
|
||||
onremoved: () => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
}
|
||||
});
|
||||
});
|
||||
})
|
||||
})
|
||||
|
||||
renderLotOccupancyComments();
|
||||
renderLotOccupancyComments()
|
||||
|
|
|
|||
|
|
@ -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">×</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>×</td>" +
|
||||
'</td>' +
|
||||
'<td>×</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();
|
||||
|
|
|
|||
|
|
@ -1,290 +1,306 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
|
||||
import type * as globalTypes from "../../types/globalTypes";
|
||||
import type * as recordTypes from "../../types/recordTypes";
|
||||
import type * as globalTypes from '../../types/globalTypes'
|
||||
import type * as recordTypes from '../../types/recordTypes'
|
||||
|
||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||
|
||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
||||
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||
|
||||
declare const cityssm: cityssmGlobal;
|
||||
declare const bulmaJS: BulmaJS;
|
||||
declare const cityssm: cityssmGlobal
|
||||
declare const bulmaJS: BulmaJS
|
||||
|
||||
declare const los: globalTypes.LOS;
|
||||
declare const los: globalTypes.LOS
|
||||
|
||||
declare const lotOccupancyId: string;
|
||||
declare const hasUnsavedChanges: boolean;
|
||||
declare const lotOccupancyId: string
|
||||
declare const hasUnsavedChanges: boolean
|
||||
|
||||
let lotOccupancyFees: recordTypes.LotOccupancyFee[] = exports.lotOccupancyFees;
|
||||
delete exports.lotOccupancyFees;
|
||||
let lotOccupancyFees: recordTypes.LotOccupancyFee[] = exports.lotOccupancyFees
|
||||
delete exports.lotOccupancyFees
|
||||
|
||||
const lotOccupancyFeesContainerElement = document.querySelector(
|
||||
"#container--lotOccupancyFees"
|
||||
) as HTMLElement;
|
||||
'#container--lotOccupancyFees'
|
||||
) as HTMLElement
|
||||
|
||||
const getFeeGrandTotal = (): number => {
|
||||
let feeGrandTotal = 0;
|
||||
let feeGrandTotal = 0
|
||||
|
||||
for (const lotOccupancyFee of lotOccupancyFees) {
|
||||
feeGrandTotal +=
|
||||
(lotOccupancyFee.feeAmount! + lotOccupancyFee.taxAmount!) * lotOccupancyFee.quantity!;
|
||||
(lotOccupancyFee.feeAmount! + lotOccupancyFee.taxAmount!) *
|
||||
lotOccupancyFee.quantity!
|
||||
}
|
||||
|
||||
return feeGrandTotal;
|
||||
};
|
||||
return feeGrandTotal
|
||||
}
|
||||
|
||||
const deleteLotOccupancyFee = (clickEvent: Event) => {
|
||||
const feeId = (
|
||||
(clickEvent.currentTarget as HTMLElement).closest(
|
||||
".container--lotOccupancyFee"
|
||||
'.container--lotOccupancyFee'
|
||||
) as HTMLElement
|
||||
).dataset.feeId;
|
||||
).dataset.feeId
|
||||
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyFee",
|
||||
los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyFee',
|
||||
{
|
||||
lotOccupancyId,
|
||||
feeId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotOccupancyFees?: recordTypes.LotOccupancyFee[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotOccupancyFees?: recordTypes.LotOccupancyFee[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupancyFees = responseJSON.lotOccupancyFees!;
|
||||
renderLotOccupancyFees();
|
||||
lotOccupancyFees = responseJSON.lotOccupancyFees!
|
||||
renderLotOccupancyFees()
|
||||
} 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
|
||||
}
|
||||
});
|
||||
};
|
||||
})
|
||||
}
|
||||
|
||||
const renderLotOccupancyFees = () => {
|
||||
if (lotOccupancyFees.length === 0) {
|
||||
lotOccupancyFeesContainerElement.innerHTML =
|
||||
'<div class="message is-info">' +
|
||||
'<p class="message-body">There are no fees associated with this record.</p>' +
|
||||
"</div>";
|
||||
'</div>'
|
||||
|
||||
renderLotOccupancyTransactions();
|
||||
renderLotOccupancyTransactions()
|
||||
|
||||
return;
|
||||
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">×</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;
|
||||
let feeAmountTotal = 0
|
||||
let taxAmountTotal = 0
|
||||
|
||||
for (const lotOccupancyFee of lotOccupancyFees) {
|
||||
const tableRowElement = document.createElement("tr");
|
||||
tableRowElement.className = "container--lotOccupancyFee";
|
||||
tableRowElement.dataset.feeId = lotOccupancyFee.feeId!.toString();
|
||||
tableRowElement.dataset.includeQuantity = lotOccupancyFee.includeQuantity ? "1" : "0";
|
||||
const tableRowElement = document.createElement('tr')
|
||||
tableRowElement.className = 'container--lotOccupancyFee'
|
||||
tableRowElement.dataset.feeId = lotOccupancyFee.feeId!.toString()
|
||||
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>×</td>" +
|
||||
'</td>' +
|
||||
'<td>×</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>");
|
||||
'</button>' +
|
||||
'</td>')
|
||||
|
||||
tableRowElement.querySelector("button")!.addEventListener("click", deleteLotOccupancyFee);
|
||||
tableRowElement
|
||||
.querySelector('button')!
|
||||
.addEventListener('click', deleteLotOccupancyFee)
|
||||
|
||||
lotOccupancyFeesContainerElement.querySelector("tbody")!.append(tableRowElement);
|
||||
lotOccupancyFeesContainerElement
|
||||
.querySelector('tbody')!
|
||||
.append(tableRowElement)
|
||||
|
||||
feeAmountTotal += lotOccupancyFee.feeAmount! * lotOccupancyFee.quantity!;
|
||||
taxAmountTotal += lotOccupancyFee.taxAmount! * lotOccupancyFee.quantity!;
|
||||
feeAmountTotal += lotOccupancyFee.feeAmount! * lotOccupancyFee.quantity!
|
||||
taxAmountTotal += lotOccupancyFee.taxAmount! * lotOccupancyFee.quantity!
|
||||
}
|
||||
|
||||
(
|
||||
;(
|
||||
lotOccupancyFeesContainerElement.querySelector(
|
||||
"#lotOccupancyFees--feeAmountTotal"
|
||||
'#lotOccupancyFees--feeAmountTotal'
|
||||
) as HTMLElement
|
||||
).textContent = "$" + feeAmountTotal.toFixed(2);
|
||||
(
|
||||
).textContent = '$' + feeAmountTotal.toFixed(2)
|
||||
;(
|
||||
lotOccupancyFeesContainerElement.querySelector(
|
||||
"#lotOccupancyFees--taxAmountTotal"
|
||||
'#lotOccupancyFees--taxAmountTotal'
|
||||
) as HTMLElement
|
||||
).textContent = "$" + taxAmountTotal.toFixed(2);
|
||||
(
|
||||
).textContent = '$' + taxAmountTotal.toFixed(2)
|
||||
;(
|
||||
lotOccupancyFeesContainerElement.querySelector(
|
||||
"#lotOccupancyFees--grandTotal"
|
||||
'#lotOccupancyFees--grandTotal'
|
||||
) as HTMLElement
|
||||
).textContent = "$" + (feeAmountTotal + taxAmountTotal).toFixed(2);
|
||||
).textContent = '$' + (feeAmountTotal + taxAmountTotal).toFixed(2)
|
||||
|
||||
renderLotOccupancyTransactions();
|
||||
};
|
||||
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"
|
||||
});
|
||||
return;
|
||||
message: 'Please save all unsaved changes before adding fees.',
|
||||
contextualColorName: 'warning'
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
let feeCategories: recordTypes.FeeCategory[];
|
||||
let feeCategories: recordTypes.FeeCategory[]
|
||||
|
||||
let feeFilterElement: HTMLInputElement;
|
||||
let feeFilterResultsElement: HTMLElement;
|
||||
let feeFilterElement: HTMLInputElement
|
||||
let feeFilterResultsElement: HTMLElement
|
||||
|
||||
const doAddFee = (feeId: number, quantity: number | string = 1) => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lotOccupancies/doAddLotOccupancyFee",
|
||||
los.urlPrefix + '/lotOccupancies/doAddLotOccupancyFee',
|
||||
{
|
||||
lotOccupancyId,
|
||||
feeId,
|
||||
quantity
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotOccupancyFees?: recordTypes.LotOccupancyFee[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotOccupancyFees?: recordTypes.LotOccupancyFee[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupancyFees = responseJSON.lotOccupancyFees!;
|
||||
renderLotOccupancyFees();
|
||||
filterFees();
|
||||
lotOccupancyFees = responseJSON.lotOccupancyFees!
|
||||
renderLotOccupancyFees()
|
||||
filterFees()
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Adding Fee",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
title: 'Error Adding Fee',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
)
|
||||
}
|
||||
|
||||
const doSetQuantityAndAddFee = (fee: recordTypes.Fee) => {
|
||||
let quantityElement: HTMLInputElement;
|
||||
let quantityCloseModalFunction: () => void;
|
||||
let quantityElement: HTMLInputElement
|
||||
let quantityCloseModalFunction: () => void
|
||||
|
||||
const doSetQuantity = (submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
doAddFee(fee.feeId!, quantityElement.value);
|
||||
quantityCloseModalFunction();
|
||||
};
|
||||
submitEvent.preventDefault()
|
||||
doAddFee(fee.feeId!, quantityElement.value)
|
||||
quantityCloseModalFunction()
|
||||
}
|
||||
|
||||
cityssm.openHtmlModal("lotOccupancy-setFeeQuantity", {
|
||||
cityssm.openHtmlModal('lotOccupancy-setFeeQuantity', {
|
||||
onshow: (modalElement) => {
|
||||
(
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyFeeQuantity--quantityUnit"
|
||||
'#lotOccupancyFeeQuantity--quantityUnit'
|
||||
) as HTMLElement
|
||||
).textContent = fee.quantityUnit!;
|
||||
).textContent = fee.quantityUnit!
|
||||
},
|
||||
onshown: (modalElement, closeModalFunction) => {
|
||||
quantityCloseModalFunction = closeModalFunction;
|
||||
quantityCloseModalFunction = closeModalFunction
|
||||
|
||||
quantityElement = modalElement.querySelector(
|
||||
"#lotOccupancyFeeQuantity--quantity"
|
||||
) as HTMLInputElement;
|
||||
'#lotOccupancyFeeQuantity--quantity'
|
||||
) as HTMLInputElement
|
||||
|
||||
modalElement.querySelector("form")!.addEventListener("submit", doSetQuantity);
|
||||
modalElement
|
||||
.querySelector('form')!
|
||||
.addEventListener('submit', doSetQuantity)
|
||||
}
|
||||
})
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
const tryAddFee = (clickEvent: Event) => {
|
||||
clickEvent.preventDefault();
|
||||
clickEvent.preventDefault()
|
||||
|
||||
const feeId = Number.parseInt((clickEvent.currentTarget as HTMLElement).dataset.feeId!, 10);
|
||||
const feeId = Number.parseInt(
|
||||
(clickEvent.currentTarget as HTMLElement).dataset.feeId!,
|
||||
10
|
||||
)
|
||||
const feeCategoryId = Number.parseInt(
|
||||
(
|
||||
(clickEvent.currentTarget as HTMLElement).closest(
|
||||
".container--feeCategory"
|
||||
'.container--feeCategory'
|
||||
) as HTMLElement
|
||||
).dataset.feeCategoryId!,
|
||||
10
|
||||
);
|
||||
)
|
||||
|
||||
const feeCategory = feeCategories.find((currentFeeCategory) => {
|
||||
return currentFeeCategory.feeCategoryId === feeCategoryId;
|
||||
})!;
|
||||
return currentFeeCategory.feeCategoryId === feeCategoryId
|
||||
})!
|
||||
|
||||
const fee = feeCategory.fees!.find((currentFee) => {
|
||||
return currentFee.feeId === feeId;
|
||||
})!;
|
||||
return currentFee.feeId === feeId
|
||||
})!
|
||||
|
||||
if (fee.includeQuantity) {
|
||||
doSetQuantityAndAddFee(fee);
|
||||
doSetQuantityAndAddFee(fee)
|
||||
} else {
|
||||
doAddFee(feeId);
|
||||
doAddFee(feeId)
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const filterFees = () => {
|
||||
const filterStringPieces = feeFilterElement.value.trim().toLowerCase().split(" ");
|
||||
const filterStringPieces = feeFilterElement.value
|
||||
.trim()
|
||||
.toLowerCase()
|
||||
.split(' ')
|
||||
|
||||
feeFilterResultsElement.innerHTML = "";
|
||||
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>" +
|
||||
'<div class="panel mb-5"></div>';
|
||||
cityssm.escapeHTML(feeCategory.feeCategory || '') +
|
||||
'</h4>' +
|
||||
'<div class="panel mb-5"></div>'
|
||||
|
||||
let hasFees = false;
|
||||
let hasFees = false
|
||||
|
||||
for (const fee of feeCategory.fees!) {
|
||||
if (
|
||||
|
|
@ -294,309 +310,319 @@ document.querySelector("#button--addFee")!.addEventListener("click", () => {
|
|||
"'][data-include-quantity='0']"
|
||||
)
|
||||
) {
|
||||
continue;
|
||||
continue
|
||||
}
|
||||
|
||||
let includeFee = true;
|
||||
let includeFee = true
|
||||
|
||||
for (const filterStringPiece of filterStringPieces) {
|
||||
if (!fee.feeName!.toLowerCase().includes(filterStringPiece)) {
|
||||
includeFee = false;
|
||||
break;
|
||||
includeFee = false
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if (!includeFee) {
|
||||
continue;
|
||||
continue
|
||||
}
|
||||
|
||||
hasFees = true;
|
||||
hasFees = true
|
||||
|
||||
const panelBlockElement = document.createElement("a");
|
||||
panelBlockElement.className = "panel-block is-block container--fee";
|
||||
panelBlockElement.dataset.feeId = fee.feeId!.toString();
|
||||
panelBlockElement.href = "#";
|
||||
const panelBlockElement = document.createElement('a')
|
||||
panelBlockElement.className = 'panel-block is-block container--fee'
|
||||
panelBlockElement.dataset.feeId = fee.feeId!.toString()
|
||||
panelBlockElement.href = '#'
|
||||
|
||||
panelBlockElement.innerHTML =
|
||||
"<strong>" +
|
||||
cityssm.escapeHTML(fee.feeName || "") +
|
||||
"</strong><br />" +
|
||||
"<small>" +
|
||||
cityssm.escapeHTML(fee.feeDescription || "").replace(/\n/g, "<br />") +
|
||||
"</small>";
|
||||
'<strong>' +
|
||||
cityssm.escapeHTML(fee.feeName || '') +
|
||||
'</strong><br />' +
|
||||
'<small>' +
|
||||
cityssm
|
||||
.escapeHTML(fee.feeDescription || '')
|
||||
.replace(/\n/g, '<br />') +
|
||||
'</small>'
|
||||
|
||||
panelBlockElement.addEventListener("click", tryAddFee);
|
||||
panelBlockElement.addEventListener('click', tryAddFee)
|
||||
|
||||
(categoryContainerElement.querySelector(".panel") as HTMLElement).append(
|
||||
panelBlockElement
|
||||
);
|
||||
;(
|
||||
categoryContainerElement.querySelector('.panel') as HTMLElement
|
||||
).append(panelBlockElement)
|
||||
}
|
||||
|
||||
if (hasFees) {
|
||||
feeFilterResultsElement.append(categoryContainerElement);
|
||||
feeFilterResultsElement.append(categoryContainerElement)
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
cityssm.openHtmlModal("lotOccupancy-addFee", {
|
||||
cityssm.openHtmlModal('lotOccupancy-addFee', {
|
||||
onshow: (modalElement) => {
|
||||
feeFilterElement = modalElement.querySelector(
|
||||
"#feeSelect--feeName"
|
||||
) as HTMLInputElement;
|
||||
'#feeSelect--feeName'
|
||||
) as HTMLInputElement
|
||||
|
||||
feeFilterResultsElement = modalElement.querySelector(
|
||||
"#resultsContainer--feeSelect"
|
||||
) as HTMLElement;
|
||||
'#resultsContainer--feeSelect'
|
||||
) as HTMLElement
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lotOccupancies/doGetFees",
|
||||
los.urlPrefix + '/lotOccupancies/doGetFees',
|
||||
{
|
||||
lotOccupancyId
|
||||
},
|
||||
(responseJSON: { feeCategories: recordTypes.FeeCategory[] }) => {
|
||||
feeCategories = responseJSON.feeCategories;
|
||||
feeCategories = responseJSON.feeCategories
|
||||
|
||||
feeFilterElement.disabled = false;
|
||||
feeFilterElement.addEventListener("keyup", filterFees);
|
||||
feeFilterElement.focus();
|
||||
feeFilterElement.disabled = false
|
||||
feeFilterElement.addEventListener('keyup', filterFees)
|
||||
feeFilterElement.focus()
|
||||
|
||||
filterFees();
|
||||
filterFees()
|
||||
}
|
||||
);
|
||||
)
|
||||
},
|
||||
onshown: () => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
},
|
||||
onhidden: () => {
|
||||
renderLotOccupancyFees();
|
||||
renderLotOccupancyFees()
|
||||
},
|
||||
onremoved: () => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
}
|
||||
});
|
||||
});
|
||||
})
|
||||
})
|
||||
|
||||
let lotOccupancyTransactions: recordTypes.LotOccupancyTransaction[] =
|
||||
exports.lotOccupancyTransactions;
|
||||
delete exports.lotOccupancyTransactions;
|
||||
exports.lotOccupancyTransactions
|
||||
delete exports.lotOccupancyTransactions
|
||||
|
||||
const lotOccupancyTransactionsContainerElement = document.querySelector(
|
||||
"#container--lotOccupancyTransactions"
|
||||
) as HTMLElement;
|
||||
'#container--lotOccupancyTransactions'
|
||||
) as HTMLElement
|
||||
|
||||
const getTransactionGrandTotal = (): number => {
|
||||
let transactionGrandTotal = 0;
|
||||
let transactionGrandTotal = 0
|
||||
|
||||
for (const lotOccupancyTransaction of lotOccupancyTransactions) {
|
||||
transactionGrandTotal += lotOccupancyTransaction.transactionAmount;
|
||||
transactionGrandTotal += lotOccupancyTransaction.transactionAmount
|
||||
}
|
||||
|
||||
return transactionGrandTotal;
|
||||
};
|
||||
return transactionGrandTotal
|
||||
}
|
||||
|
||||
const deleteLotOccupancyTransaction = (clickEvent: Event) => {
|
||||
const transactionIndex = (
|
||||
(clickEvent.currentTarget as HTMLElement).closest(
|
||||
".container--lotOccupancyTransaction"
|
||||
'.container--lotOccupancyTransaction'
|
||||
) as HTMLElement
|
||||
).dataset.transactionIndex;
|
||||
).dataset.transactionIndex
|
||||
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyTransaction",
|
||||
los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyTransaction',
|
||||
{
|
||||
lotOccupancyId,
|
||||
transactionIndex
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotOccupancyTransactions?: recordTypes.LotOccupancyTransaction[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotOccupancyTransactions?: recordTypes.LotOccupancyTransaction[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupancyTransactions = responseJSON.lotOccupancyTransactions!;
|
||||
renderLotOccupancyTransactions();
|
||||
lotOccupancyTransactions = responseJSON.lotOccupancyTransactions!
|
||||
renderLotOccupancyTransactions()
|
||||
} 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
|
||||
}
|
||||
});
|
||||
};
|
||||
})
|
||||
}
|
||||
|
||||
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;
|
||||
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;
|
||||
let transactionGrandTotal = 0
|
||||
|
||||
for (const lotOccupancyTransaction of lotOccupancyTransactions) {
|
||||
transactionGrandTotal += lotOccupancyTransaction.transactionAmount;
|
||||
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();
|
||||
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);
|
||||
.querySelector('button')!
|
||||
.addEventListener('click', deleteLotOccupancyTransaction)
|
||||
|
||||
lotOccupancyTransactionsContainerElement.querySelector("tbody")!.append(tableRowElement);
|
||||
lotOccupancyTransactionsContainerElement
|
||||
.querySelector('tbody')!
|
||||
.append(tableRowElement)
|
||||
}
|
||||
|
||||
(
|
||||
;(
|
||||
lotOccupancyTransactionsContainerElement.querySelector(
|
||||
"#lotOccupancyTransactions--grandTotal"
|
||||
'#lotOccupancyTransactions--grandTotal'
|
||||
) as HTMLElement
|
||||
).textContent = "$" + transactionGrandTotal.toFixed(2);
|
||||
).textContent = '$' + transactionGrandTotal.toFixed(2)
|
||||
|
||||
const feeGrandTotal = getFeeGrandTotal();
|
||||
const feeGrandTotal = getFeeGrandTotal()
|
||||
|
||||
if (feeGrandTotal > transactionGrandTotal) {
|
||||
lotOccupancyTransactionsContainerElement.insertAdjacentHTML(
|
||||
"afterbegin",
|
||||
'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", () => {
|
||||
let addCloseModalFunction: () => void;
|
||||
document
|
||||
.querySelector('#button--addTransaction')!
|
||||
.addEventListener('click', () => {
|
||||
let addCloseModalFunction: () => void
|
||||
|
||||
const doAddTransaction = (submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
submitEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lotOccupancies/doAddLotOccupancyTransaction",
|
||||
los.urlPrefix + '/lotOccupancies/doAddLotOccupancyTransaction',
|
||||
submitEvent.currentTarget,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotOccupancyTransactions?: recordTypes.LotOccupancyTransaction[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotOccupancyTransactions?: recordTypes.LotOccupancyTransaction[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupancyTransactions = responseJSON.lotOccupancyTransactions!;
|
||||
addCloseModalFunction();
|
||||
renderLotOccupancyTransactions();
|
||||
lotOccupancyTransactions = responseJSON.lotOccupancyTransactions!
|
||||
addCloseModalFunction()
|
||||
renderLotOccupancyTransactions()
|
||||
} 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);
|
||||
los.populateAliases(modalElement)
|
||||
|
||||
(
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyTransactionAdd--lotOccupancyId"
|
||||
'#lotOccupancyTransactionAdd--lotOccupancyId'
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupancyId.toString();
|
||||
).value = lotOccupancyId.toString()
|
||||
|
||||
const feeGrandTotal = getFeeGrandTotal();
|
||||
const transactionGrandTotal = getTransactionGrandTotal();
|
||||
const feeGrandTotal = getFeeGrandTotal()
|
||||
const transactionGrandTotal = getTransactionGrandTotal()
|
||||
|
||||
const transactionAmountElement = modalElement.querySelector(
|
||||
"#lotOccupancyTransactionAdd--transactionAmount"
|
||||
) as HTMLInputElement;
|
||||
'#lotOccupancyTransactionAdd--transactionAmount'
|
||||
) as HTMLInputElement
|
||||
|
||||
transactionAmountElement.min = (-1 * transactionGrandTotal).toFixed(2);
|
||||
transactionAmountElement.min = (-1 * transactionGrandTotal).toFixed(2)
|
||||
transactionAmountElement.max = Math.max(
|
||||
feeGrandTotal - transactionGrandTotal,
|
||||
0
|
||||
).toFixed(2);
|
||||
).toFixed(2)
|
||||
transactionAmountElement.value = Math.max(
|
||||
feeGrandTotal - transactionGrandTotal,
|
||||
0
|
||||
).toFixed(2);
|
||||
).toFixed(2)
|
||||
},
|
||||
onshown: (modalElement, closeModalFunction) => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
|
||||
addCloseModalFunction = closeModalFunction;
|
||||
addCloseModalFunction = closeModalFunction
|
||||
|
||||
modalElement.querySelector("form")!.addEventListener("submit", doAddTransaction);
|
||||
modalElement
|
||||
.querySelector('form')!
|
||||
.addEventListener('submit', doAddTransaction)
|
||||
},
|
||||
onremoved: () => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
}
|
||||
});
|
||||
});
|
||||
})
|
||||
})
|
||||
|
||||
renderLotOccupancyFees();
|
||||
renderLotOccupancyFees()
|
||||
|
|
|
|||
|
|
@ -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: () => {
|
||||
|
|
|
|||
|
|
@ -1,558 +1,584 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
|
||||
import type * as globalTypes from "../../types/globalTypes";
|
||||
import type * as recordTypes from "../../types/recordTypes";
|
||||
import type * as globalTypes from '../../types/globalTypes'
|
||||
import type * as recordTypes from '../../types/recordTypes'
|
||||
|
||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||
|
||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
||||
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||
|
||||
declare const cityssm: cityssmGlobal;
|
||||
declare const bulmaJS: BulmaJS;
|
||||
declare const cityssm: cityssmGlobal
|
||||
declare const bulmaJS: BulmaJS
|
||||
|
||||
declare const los: globalTypes.LOS;
|
||||
declare const los: globalTypes.LOS
|
||||
|
||||
declare const lotOccupancyId: string;
|
||||
declare const isCreate: boolean;
|
||||
declare const formElement: HTMLFormElement;
|
||||
declare const lotOccupancyId: string
|
||||
declare const isCreate: boolean
|
||||
declare const formElement: HTMLFormElement
|
||||
|
||||
let lotOccupancyOccupants: recordTypes.LotOccupancyOccupant[];
|
||||
let lotOccupancyOccupants: recordTypes.LotOccupancyOccupant[]
|
||||
|
||||
const openEditLotOccupancyOccupant = (clickEvent: Event) => {
|
||||
const lotOccupantIndex = Number.parseInt(
|
||||
(clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.lotOccupantIndex!,
|
||||
(clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset
|
||||
.lotOccupantIndex!,
|
||||
10
|
||||
);
|
||||
)
|
||||
|
||||
const lotOccupancyOccupant = lotOccupancyOccupants.find((currentLotOccupancyOccupant) => {
|
||||
return currentLotOccupancyOccupant.lotOccupantIndex === lotOccupantIndex;
|
||||
})!;
|
||||
const lotOccupancyOccupant = lotOccupancyOccupants.find(
|
||||
(currentLotOccupancyOccupant) => {
|
||||
return currentLotOccupancyOccupant.lotOccupantIndex === lotOccupantIndex
|
||||
}
|
||||
)!
|
||||
|
||||
let editFormElement: HTMLFormElement;
|
||||
let editCloseModalFunction: () => void;
|
||||
let editFormElement: HTMLFormElement
|
||||
let editCloseModalFunction: () => void
|
||||
|
||||
const editOccupant = (submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
submitEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lotOccupancies/doUpdateLotOccupancyOccupant",
|
||||
los.urlPrefix + '/lotOccupancies/doUpdateLotOccupancyOccupant',
|
||||
editFormElement,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotOccupancyOccupants?: recordTypes.LotOccupancyOccupant[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotOccupancyOccupants?: recordTypes.LotOccupancyOccupant[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupancyOccupants = responseJSON.lotOccupancyOccupants!;
|
||||
editCloseModalFunction();
|
||||
renderLotOccupancyOccupants();
|
||||
lotOccupancyOccupants = responseJSON.lotOccupancyOccupants!
|
||||
editCloseModalFunction()
|
||||
renderLotOccupancyOccupants()
|
||||
} 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);
|
||||
los.populateAliases(modalElement)
|
||||
|
||||
(
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyOccupantEdit--lotOccupancyId"
|
||||
'#lotOccupancyOccupantEdit--lotOccupancyId'
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupancyId;
|
||||
(
|
||||
).value = lotOccupancyId
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyOccupantEdit--lotOccupantIndex"
|
||||
'#lotOccupancyOccupantEdit--lotOccupantIndex'
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupantIndex.toString();
|
||||
).value = lotOccupantIndex.toString()
|
||||
|
||||
const lotOccupantTypeSelectElement = modalElement.querySelector(
|
||||
"#lotOccupancyOccupantEdit--lotOccupantTypeId"
|
||||
) as HTMLSelectElement;
|
||||
'#lotOccupancyOccupantEdit--lotOccupantTypeId'
|
||||
) as HTMLSelectElement
|
||||
|
||||
let lotOccupantTypeSelected = false;
|
||||
let lotOccupantTypeSelected = false
|
||||
|
||||
for (const lotOccupantType of exports.lotOccupantTypes as recordTypes.LotOccupantType[]) {
|
||||
const optionElement = document.createElement("option");
|
||||
optionElement.value = lotOccupantType.lotOccupantTypeId.toString();
|
||||
optionElement.textContent = lotOccupantType.lotOccupantType;
|
||||
const optionElement = document.createElement('option')
|
||||
optionElement.value = lotOccupantType.lotOccupantTypeId.toString()
|
||||
optionElement.textContent = lotOccupantType.lotOccupantType
|
||||
|
||||
if (lotOccupantType.lotOccupantTypeId === lotOccupancyOccupant.lotOccupantTypeId) {
|
||||
optionElement.selected = true;
|
||||
lotOccupantTypeSelected = true;
|
||||
if (
|
||||
lotOccupantType.lotOccupantTypeId ===
|
||||
lotOccupancyOccupant.lotOccupantTypeId
|
||||
) {
|
||||
optionElement.selected = true
|
||||
lotOccupantTypeSelected = true
|
||||
}
|
||||
|
||||
lotOccupantTypeSelectElement.append(optionElement);
|
||||
lotOccupantTypeSelectElement.append(optionElement)
|
||||
}
|
||||
|
||||
if (!lotOccupantTypeSelected) {
|
||||
const optionElement = document.createElement("option");
|
||||
const optionElement = document.createElement('option')
|
||||
|
||||
optionElement.value = lotOccupancyOccupant.lotOccupantTypeId!.toString();
|
||||
optionElement.textContent = lotOccupancyOccupant.lotOccupantType as string;
|
||||
optionElement.selected = true;
|
||||
optionElement.value = lotOccupancyOccupant.lotOccupantTypeId!.toString()
|
||||
optionElement.textContent =
|
||||
lotOccupancyOccupant.lotOccupantType as string
|
||||
optionElement.selected = true
|
||||
|
||||
lotOccupantTypeSelectElement.append(optionElement);
|
||||
lotOccupantTypeSelectElement.append(optionElement)
|
||||
}
|
||||
|
||||
(
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyOccupantEdit--occupantName"
|
||||
'#lotOccupancyOccupantEdit--occupantName'
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupancyOccupant.occupantName!;
|
||||
(
|
||||
).value = lotOccupancyOccupant.occupantName!
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyOccupantEdit--occupantAddress1"
|
||||
'#lotOccupancyOccupantEdit--occupantAddress1'
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupancyOccupant.occupantAddress1!;
|
||||
(
|
||||
).value = lotOccupancyOccupant.occupantAddress1!
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyOccupantEdit--occupantAddress2"
|
||||
'#lotOccupancyOccupantEdit--occupantAddress2'
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupancyOccupant.occupantAddress2!;
|
||||
(
|
||||
).value = lotOccupancyOccupant.occupantAddress2!
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyOccupantEdit--occupantCity"
|
||||
'#lotOccupancyOccupantEdit--occupantCity'
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupancyOccupant.occupantCity!;
|
||||
(
|
||||
).value = lotOccupancyOccupant.occupantCity!
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyOccupantEdit--occupantProvince"
|
||||
'#lotOccupancyOccupantEdit--occupantProvince'
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupancyOccupant.occupantProvince!;
|
||||
).value = lotOccupancyOccupant.occupantProvince!
|
||||
|
||||
(
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyOccupantEdit--occupantPostalCode"
|
||||
'#lotOccupancyOccupantEdit--occupantPostalCode'
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupancyOccupant.occupantPostalCode!;
|
||||
).value = lotOccupancyOccupant.occupantPostalCode!
|
||||
|
||||
(
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyOccupantEdit--occupantPhoneNumber"
|
||||
'#lotOccupancyOccupantEdit--occupantPhoneNumber'
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupancyOccupant.occupantPhoneNumber!;
|
||||
).value = lotOccupancyOccupant.occupantPhoneNumber!
|
||||
|
||||
(
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyOccupantEdit--occupantEmailAddress"
|
||||
'#lotOccupancyOccupantEdit--occupantEmailAddress'
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupancyOccupant.occupantEmailAddress!;
|
||||
).value = lotOccupancyOccupant.occupantEmailAddress!
|
||||
|
||||
(
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyOccupantEdit--occupantComment"
|
||||
'#lotOccupancyOccupantEdit--occupantComment'
|
||||
) as HTMLTextAreaElement
|
||||
).value = lotOccupancyOccupant.occupantComment!;
|
||||
).value = lotOccupancyOccupant.occupantComment!
|
||||
},
|
||||
onshown: (modalElement, closeModalFunction) => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
|
||||
(
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyOccupantEdit--lotOccupantTypeId"
|
||||
'#lotOccupancyOccupantEdit--lotOccupantTypeId'
|
||||
) as HTMLInputElement
|
||||
).focus();
|
||||
).focus()
|
||||
|
||||
editFormElement = modalElement.querySelector("form")!;
|
||||
editFormElement.addEventListener("submit", editOccupant);
|
||||
editFormElement = modalElement.querySelector('form')!
|
||||
editFormElement.addEventListener('submit', editOccupant)
|
||||
|
||||
editCloseModalFunction = closeModalFunction;
|
||||
editCloseModalFunction = closeModalFunction
|
||||
},
|
||||
onremoved: () => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
}
|
||||
});
|
||||
};
|
||||
})
|
||||
}
|
||||
|
||||
const deleteLotOccupancyOccupant = (clickEvent: Event) => {
|
||||
const lotOccupantIndex = (clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset
|
||||
.lotOccupantIndex;
|
||||
const lotOccupantIndex = (clickEvent.currentTarget as HTMLElement).closest(
|
||||
'tr'
|
||||
)!.dataset.lotOccupantIndex
|
||||
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyOccupant",
|
||||
los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyOccupant',
|
||||
{
|
||||
lotOccupancyId,
|
||||
lotOccupantIndex
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotOccupancyOccupants: recordTypes.LotOccupancyOccupant[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotOccupancyOccupants: recordTypes.LotOccupancyOccupant[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupancyOccupants = responseJSON.lotOccupancyOccupants;
|
||||
renderLotOccupancyOccupants();
|
||||
lotOccupancyOccupants = responseJSON.lotOccupancyOccupants
|
||||
renderLotOccupancyOccupants()
|
||||
} 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 + "?",
|
||||
title: 'Remove ' + exports.aliases.occupant + '?',
|
||||
message:
|
||||
"Are you sure you want to remove this " + exports.aliases.occupant.toLowerCase() + "?",
|
||||
'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"
|
||||
) as HTMLElement;
|
||||
'#container--lotOccupancyOccupants'
|
||||
) as HTMLElement
|
||||
|
||||
cityssm.clearElement(occupantsContainer);
|
||||
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;
|
||||
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();
|
||||
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);
|
||||
.querySelector('.button--delete')!
|
||||
.addEventListener('click', deleteLotOccupancyOccupant)
|
||||
|
||||
tableElement.querySelector("tbody")!.append(tableRowElement);
|
||||
tableElement.querySelector('tbody')!.append(tableRowElement)
|
||||
}
|
||||
|
||||
occupantsContainer.append(tableElement);
|
||||
};
|
||||
occupantsContainer.append(tableElement)
|
||||
}
|
||||
|
||||
if (isCreate) {
|
||||
const lotOccupantTypeIdElement = document.querySelector(
|
||||
"#lotOccupancy--lotOccupantTypeId"
|
||||
) as HTMLSelectElement;
|
||||
'#lotOccupancy--lotOccupantTypeId'
|
||||
) as HTMLSelectElement
|
||||
|
||||
lotOccupantTypeIdElement.addEventListener("change", () => {
|
||||
lotOccupantTypeIdElement.addEventListener('change', () => {
|
||||
const occupantFields = formElement.querySelectorAll(
|
||||
"[data-table='LotOccupancyOccupant']"
|
||||
) as NodeListOf<HTMLInputElement | HTMLTextAreaElement>;
|
||||
) as NodeListOf<HTMLInputElement | HTMLTextAreaElement>
|
||||
|
||||
for (const occupantField of occupantFields) {
|
||||
occupantField.disabled = lotOccupantTypeIdElement.value === "";
|
||||
occupantField.disabled = lotOccupantTypeIdElement.value === ''
|
||||
}
|
||||
});
|
||||
})
|
||||
} else {
|
||||
lotOccupancyOccupants = exports.lotOccupancyOccupants;
|
||||
delete exports.lotOccupancyOccupants;
|
||||
lotOccupancyOccupants = exports.lotOccupancyOccupants
|
||||
delete exports.lotOccupancyOccupants
|
||||
|
||||
document.querySelector("#button--addOccupant")!.addEventListener("click", () => {
|
||||
let addCloseModalFunction: () => void;
|
||||
document
|
||||
.querySelector('#button--addOccupant')!
|
||||
.addEventListener('click', () => {
|
||||
let addCloseModalFunction: () => void
|
||||
|
||||
let addFormElement: HTMLFormElement;
|
||||
let addFormElement: HTMLFormElement
|
||||
|
||||
let searchFormElement: HTMLFormElement;
|
||||
let searchResultsElement: HTMLElement;
|
||||
let searchFormElement: HTMLFormElement
|
||||
let searchResultsElement: HTMLElement
|
||||
|
||||
const addOccupant = (formOrObject: HTMLFormElement | recordTypes.LotOccupancyOccupant) => {
|
||||
const addOccupant = (
|
||||
formOrObject: HTMLFormElement | recordTypes.LotOccupancyOccupant
|
||||
) => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lotOccupancies/doAddLotOccupancyOccupant",
|
||||
los.urlPrefix + '/lotOccupancies/doAddLotOccupancyOccupant',
|
||||
formOrObject,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotOccupancyOccupants?: recordTypes.LotOccupancyOccupant[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotOccupancyOccupants?: recordTypes.LotOccupancyOccupant[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupancyOccupants = responseJSON.lotOccupancyOccupants!;
|
||||
addCloseModalFunction();
|
||||
renderLotOccupancyOccupants();
|
||||
lotOccupancyOccupants = responseJSON.lotOccupancyOccupants!
|
||||
addCloseModalFunction()
|
||||
renderLotOccupancyOccupants()
|
||||
} 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'
|
||||
})
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
)
|
||||
}
|
||||
|
||||
const addOccupantFromForm = (submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
addOccupant(addFormElement);
|
||||
};
|
||||
submitEvent.preventDefault()
|
||||
addOccupant(addFormElement)
|
||||
}
|
||||
|
||||
let pastOccupantSearchResults: recordTypes.LotOccupancyOccupant[] = [];
|
||||
let pastOccupantSearchResults: recordTypes.LotOccupancyOccupant[] = []
|
||||
|
||||
const addOccupantFromCopy = (clickEvent: MouseEvent) => {
|
||||
clickEvent.preventDefault();
|
||||
clickEvent.preventDefault()
|
||||
|
||||
const panelBlockElement = clickEvent.currentTarget as HTMLElement;
|
||||
const panelBlockElement = clickEvent.currentTarget as HTMLElement
|
||||
|
||||
const occupant =
|
||||
pastOccupantSearchResults[Number.parseInt(panelBlockElement.dataset.index!, 10)];
|
||||
pastOccupantSearchResults[
|
||||
Number.parseInt(panelBlockElement.dataset.index!, 10)
|
||||
]
|
||||
|
||||
const lotOccupantTypeId = (
|
||||
panelBlockElement
|
||||
.closest(".modal")!
|
||||
.closest('.modal')!
|
||||
.querySelector(
|
||||
"#lotOccupancyOccupantCopy--lotOccupantTypeId"
|
||||
'#lotOccupancyOccupantCopy--lotOccupantTypeId'
|
||||
) as HTMLSelectElement
|
||||
).value;
|
||||
).value
|
||||
|
||||
if (lotOccupantTypeId === "") {
|
||||
if (lotOccupantTypeId === '') {
|
||||
bulmaJS.alert({
|
||||
title: "No " + exports.aliases.occupant + " Type Selected",
|
||||
title: 'No ' + exports.aliases.occupant + ' Type Selected',
|
||||
message:
|
||||
"Select a type to apply to the newly added " +
|
||||
'Select a type to apply to the newly added ' +
|
||||
exports.aliases.occupant.toLowerCase() +
|
||||
".",
|
||||
contextualColorName: "warning"
|
||||
});
|
||||
'.',
|
||||
contextualColorName: 'warning'
|
||||
})
|
||||
} else {
|
||||
occupant.lotOccupantTypeId = Number.parseInt(lotOccupantTypeId, 10);
|
||||
occupant.lotOccupancyId = Number.parseInt(lotOccupancyId, 10);
|
||||
addOccupant(occupant);
|
||||
occupant.lotOccupantTypeId = Number.parseInt(lotOccupantTypeId, 10)
|
||||
occupant.lotOccupancyId = Number.parseInt(lotOccupancyId, 10)
|
||||
addOccupant(occupant)
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const searchOccupants = (event: Event) => {
|
||||
event.preventDefault();
|
||||
event.preventDefault()
|
||||
|
||||
if (
|
||||
(
|
||||
searchFormElement.querySelector(
|
||||
"#lotOccupancyOccupantCopy--searchFilter"
|
||||
'#lotOccupancyOccupantCopy--searchFilter'
|
||||
) as HTMLInputElement
|
||||
).value === ""
|
||||
).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;
|
||||
return
|
||||
}
|
||||
|
||||
searchResultsElement.innerHTML = los.getLoadingParagraphHTML("Searching...");
|
||||
searchResultsElement.innerHTML =
|
||||
los.getLoadingParagraphHTML('Searching...')
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lotOccupancies/doSearchPastOccupants",
|
||||
los.urlPrefix + '/lotOccupancies/doSearchPastOccupants',
|
||||
searchFormElement,
|
||||
(responseJSON: { occupants: recordTypes.LotOccupancyOccupant[] }) => {
|
||||
pastOccupantSearchResults = responseJSON.occupants;
|
||||
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";
|
||||
panelBlockElement.dataset.index = index.toString();
|
||||
for (const [
|
||||
index,
|
||||
occupant
|
||||
] of pastOccupantSearchResults.entries()) {
|
||||
const panelBlockElement = document.createElement('a')
|
||||
panelBlockElement.className = 'panel-block is-block'
|
||||
panelBlockElement.dataset.index = index.toString()
|
||||
|
||||
panelBlockElement.innerHTML =
|
||||
"<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>";
|
||||
? cityssm.escapeHTML(occupant.occupantPhoneNumber) +
|
||||
'<br />'
|
||||
: '') +
|
||||
cityssm.escapeHTML(occupant.occupantEmailAddress || '') +
|
||||
'<br />' +
|
||||
'</div>') +
|
||||
'</div>'
|
||||
|
||||
panelBlockElement.addEventListener("click", addOccupantFromCopy);
|
||||
panelBlockElement.addEventListener('click', addOccupantFromCopy)
|
||||
|
||||
panelElement.append(panelBlockElement);
|
||||
panelElement.append(panelBlockElement)
|
||||
}
|
||||
|
||||
searchResultsElement.innerHTML = "";
|
||||
searchResultsElement.append(panelElement);
|
||||
searchResultsElement.innerHTML = ''
|
||||
searchResultsElement.append(panelElement)
|
||||
}
|
||||
)
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
cityssm.openHtmlModal("lotOccupancy-addOccupant", {
|
||||
cityssm.openHtmlModal('lotOccupancy-addOccupant', {
|
||||
onshow: (modalElement) => {
|
||||
los.populateAliases(modalElement);
|
||||
los.populateAliases(modalElement)
|
||||
|
||||
(
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyOccupantAdd--lotOccupancyId"
|
||||
'#lotOccupancyOccupantAdd--lotOccupancyId'
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupancyId;
|
||||
).value = lotOccupancyId
|
||||
|
||||
const lotOccupantTypeSelectElement = modalElement.querySelector(
|
||||
"#lotOccupancyOccupantAdd--lotOccupantTypeId"
|
||||
) as HTMLSelectElement;
|
||||
'#lotOccupancyOccupantAdd--lotOccupantTypeId'
|
||||
) as HTMLSelectElement
|
||||
|
||||
const lotOccupantTypeCopySelectElement = modalElement.querySelector(
|
||||
"#lotOccupancyOccupantCopy--lotOccupantTypeId"
|
||||
) as HTMLSelectElement;
|
||||
'#lotOccupancyOccupantCopy--lotOccupantTypeId'
|
||||
) as HTMLSelectElement
|
||||
|
||||
for (const lotOccupantType of exports.lotOccupantTypes as recordTypes.LotOccupantType[]) {
|
||||
const optionElement = document.createElement("option");
|
||||
optionElement.value = lotOccupantType.lotOccupantTypeId.toString();
|
||||
optionElement.textContent = lotOccupantType.lotOccupantType;
|
||||
const optionElement = document.createElement('option')
|
||||
optionElement.value = lotOccupantType.lotOccupantTypeId.toString()
|
||||
optionElement.textContent = lotOccupantType.lotOccupantType
|
||||
|
||||
lotOccupantTypeSelectElement.append(optionElement);
|
||||
lotOccupantTypeSelectElement.append(optionElement)
|
||||
|
||||
lotOccupantTypeCopySelectElement.append(optionElement.cloneNode(true));
|
||||
lotOccupantTypeCopySelectElement.append(
|
||||
optionElement.cloneNode(true)
|
||||
)
|
||||
}
|
||||
|
||||
(
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyOccupantAdd--occupantCity"
|
||||
'#lotOccupancyOccupantAdd--occupantCity'
|
||||
) as HTMLInputElement
|
||||
).value = exports.occupantCityDefault;
|
||||
).value = exports.occupantCityDefault
|
||||
|
||||
(
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyOccupantAdd--occupantProvince"
|
||||
'#lotOccupancyOccupantAdd--occupantProvince'
|
||||
) as HTMLInputElement
|
||||
).value = exports.occupantProvinceDefault;
|
||||
).value = exports.occupantProvinceDefault
|
||||
},
|
||||
onshown: (modalElement, closeModalFunction) => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.init(modalElement);
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
bulmaJS.init(modalElement)
|
||||
|
||||
(
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyOccupantAdd--lotOccupantTypeId"
|
||||
'#lotOccupancyOccupantAdd--lotOccupantTypeId'
|
||||
) as HTMLInputElement
|
||||
).focus();
|
||||
).focus()
|
||||
|
||||
addFormElement = modalElement.querySelector(
|
||||
"#form--lotOccupancyOccupantAdd"
|
||||
) as HTMLFormElement;
|
||||
addFormElement.addEventListener("submit", addOccupantFromForm);
|
||||
'#form--lotOccupancyOccupantAdd'
|
||||
) as HTMLFormElement
|
||||
addFormElement.addEventListener('submit', addOccupantFromForm)
|
||||
|
||||
searchResultsElement = modalElement.querySelector(
|
||||
"#lotOccupancyOccupantCopy--searchResults"
|
||||
) as HTMLElement;
|
||||
'#lotOccupancyOccupantCopy--searchResults'
|
||||
) as HTMLElement
|
||||
|
||||
searchFormElement = modalElement.querySelector(
|
||||
"#form--lotOccupancyOccupantCopy"
|
||||
) as HTMLFormElement;
|
||||
searchFormElement.addEventListener("submit", (formEvent) => {
|
||||
formEvent.preventDefault();
|
||||
});
|
||||
'#form--lotOccupancyOccupantCopy'
|
||||
) as HTMLFormElement
|
||||
searchFormElement.addEventListener('submit', (formEvent) => {
|
||||
formEvent.preventDefault()
|
||||
})
|
||||
|
||||
(
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyOccupantCopy--searchFilter"
|
||||
'#lotOccupancyOccupantCopy--searchFilter'
|
||||
) as HTMLInputElement
|
||||
).addEventListener("change", searchOccupants);
|
||||
).addEventListener('change', searchOccupants)
|
||||
|
||||
addCloseModalFunction = closeModalFunction;
|
||||
addCloseModalFunction = closeModalFunction
|
||||
},
|
||||
onremoved: () => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
}
|
||||
});
|
||||
});
|
||||
})
|
||||
})
|
||||
|
||||
renderLotOccupancyOccupants();
|
||||
renderLotOccupancyOccupants()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,128 +1,136 @@
|
|||
/* 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,
|
||||
(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[];
|
||||
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 = "";
|
||||
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>
|
||||
</span>`;
|
||||
</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>`;
|
||||
</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 || "") +
|
||||
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>" +
|
||||
'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>" +
|
||||
'</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">
|
||||
|
|
@ -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)
|
||||
);
|
||||
'beforeend',
|
||||
los.getSearchResultsPagerHTML(
|
||||
limit,
|
||||
responseJSON.offset,
|
||||
responseJSON.count
|
||||
)
|
||||
)
|
||||
|
||||
searchResultsContainerElement
|
||||
.querySelector("button[data-page='previous']")
|
||||
?.addEventListener("click", previousAndGetLotOccupancies);
|
||||
?.addEventListener('click', previousAndGetLotOccupancies)
|
||||
|
||||
searchResultsContainerElement
|
||||
.querySelector("button[data-page='next']")
|
||||
?.addEventListener("click", nextAndGetLotOccupancies);
|
||||
?.addEventListener('click', nextAndGetLotOccupancies)
|
||||
}
|
||||
|
||||
function getLotOccupancies() {
|
||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(
|
||||
`Loading ${exports.aliases.occupancies}...`
|
||||
);
|
||||
)
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lotOccupancies/doSearchLotOccupancies",
|
||||
los.urlPrefix + '/lotOccupancies/doSearchLotOccupancies',
|
||||
searchFilterFormElement,
|
||||
renderLotOccupancies
|
||||
);
|
||||
)
|
||||
}
|
||||
|
||||
function resetOffsetAndGetLotOccupancies() {
|
||||
offsetElement.value = "0";
|
||||
getLotOccupancies();
|
||||
offsetElement.value = '0'
|
||||
getLotOccupancies()
|
||||
}
|
||||
|
||||
function previousAndGetLotOccupancies() {
|
||||
offsetElement.value = Math.max(Number.parseInt(offsetElement.value, 10) - limit, 0).toString();
|
||||
getLotOccupancies();
|
||||
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();
|
||||
offsetElement.value = (
|
||||
Number.parseInt(offsetElement.value, 10) + limit
|
||||
).toString()
|
||||
getLotOccupancies()
|
||||
}
|
||||
|
||||
const filterElements = searchFilterFormElement.querySelectorAll("input, select") as NodeListOf<
|
||||
HTMLInputElement | HTMLSelectElement
|
||||
>;
|
||||
const filterElements = searchFilterFormElement.querySelectorAll(
|
||||
'input, select'
|
||||
) as NodeListOf<HTMLInputElement | HTMLSelectElement>
|
||||
|
||||
for (const filterElement of filterElements) {
|
||||
filterElement.addEventListener("change", resetOffsetAndGetLotOccupancies);
|
||||
filterElement.addEventListener('change', resetOffsetAndGetLotOccupancies)
|
||||
}
|
||||
|
||||
searchFilterFormElement.addEventListener("submit", (formEvent) => {
|
||||
formEvent.preventDefault();
|
||||
resetOffsetAndGetLotOccupancies();
|
||||
});
|
||||
searchFilterFormElement.addEventListener('submit', (formEvent) => {
|
||||
formEvent.preventDefault()
|
||||
resetOffsetAndGetLotOccupancies()
|
||||
})
|
||||
|
||||
getLotOccupancies();
|
||||
})();
|
||||
getLotOccupancies()
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,68 +1,78 @@
|
|||
/* 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,
|
||||
(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 renderLots(responseJSON: { count: number; offset: number; lots: recordTypes.Lot[] }): void {
|
||||
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>" +
|
||||
'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">
|
||||
|
|
@ -72,59 +82,74 @@ declare const cityssm: cityssmGlobal;
|
|||
<th>${los.escapedAliases.Lot} Type</th>
|
||||
<th>Status</th>
|
||||
</tr></thead>
|
||||
<table>`;
|
||||
<table>`
|
||||
|
||||
searchResultsContainerElement.insertAdjacentHTML(
|
||||
"beforeend",
|
||||
los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count)
|
||||
);
|
||||
'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);
|
||||
?.addEventListener('click', previousAndGetLots)
|
||||
|
||||
searchResultsContainerElement
|
||||
.querySelector("button[data-page='next']")
|
||||
?.addEventListener("click", nextAndGetLots);
|
||||
?.addEventListener('click', nextAndGetLots)
|
||||
}
|
||||
|
||||
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();
|
||||
offsetElement.value = '0'
|
||||
getLots()
|
||||
}
|
||||
|
||||
function previousAndGetLots(): void {
|
||||
offsetElement.value = Math.max(Number.parseInt(offsetElement.value, 10) - limit, 0).toString();
|
||||
getLots();
|
||||
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();
|
||||
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);
|
||||
filterElement.addEventListener('change', resetOffsetAndGetLots)
|
||||
}
|
||||
|
||||
searchFilterFormElement.addEventListener("submit", (formEvent) => {
|
||||
formEvent.preventDefault();
|
||||
resetOffsetAndGetLots();
|
||||
});
|
||||
searchFilterFormElement.addEventListener('submit', (formEvent) => {
|
||||
formEvent.preventDefault()
|
||||
resetOffsetAndGetLots()
|
||||
})
|
||||
|
||||
getLots();
|
||||
})();
|
||||
getLots()
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
}
|
||||
})();
|
||||
|
|
|
|||
|
|
@ -1,15 +1,14 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
|
||||
import * as globalTypes from "../types/globalTypes";
|
||||
|
||||
(() => {
|
||||
const mapContainerElement = document.querySelector("#lot--map") as HTMLElement;
|
||||
import * as globalTypes from '../types/globalTypes'
|
||||
;(() => {
|
||||
const mapContainerElement = document.querySelector('#lot--map') as HTMLElement
|
||||
|
||||
if (mapContainerElement) {
|
||||
(exports.los as globalTypes.LOS).highlightMap(
|
||||
;(exports.los as globalTypes.LOS).highlightMap(
|
||||
mapContainerElement,
|
||||
mapContainerElement.dataset.mapKey!,
|
||||
"success"
|
||||
);
|
||||
'success'
|
||||
)
|
||||
}
|
||||
})();
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -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">×</span>';
|
||||
}
|
||||
|
|
@ -130,8 +131,7 @@ 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -211,38 +211,38 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
* 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,
|
||||
|
|
|
|||
|
|
@ -1,34 +1,34 @@
|
|||
/* 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
|
||||
*/
|
||||
|
||||
let _hasUnsavedChanges = false;
|
||||
let _hasUnsavedChanges = false
|
||||
|
||||
function setUnsavedChanges() {
|
||||
if (!hasUnsavedChanges()) {
|
||||
_hasUnsavedChanges = true;
|
||||
cityssm.enableNavBlocker();
|
||||
_hasUnsavedChanges = true
|
||||
cityssm.enableNavBlocker()
|
||||
}
|
||||
}
|
||||
|
||||
function clearUnsavedChanges() {
|
||||
_hasUnsavedChanges = false;
|
||||
cityssm.disableNavBlocker();
|
||||
_hasUnsavedChanges = false
|
||||
cityssm.disableNavBlocker()
|
||||
}
|
||||
|
||||
function hasUnsavedChanges() {
|
||||
return _hasUnsavedChanges;
|
||||
return _hasUnsavedChanges
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -38,64 +38,68 @@ declare const bulmaJS: BulmaJS;
|
|||
function highlightMap(
|
||||
mapContainerElement: HTMLElement,
|
||||
mapKey: string,
|
||||
contextualClass: "success" | "danger"
|
||||
contextualClass: 'success' | 'danger'
|
||||
): void {
|
||||
// Search for ID
|
||||
let svgId = mapKey;
|
||||
let svgElementToHighlight: SVGElement | null;
|
||||
let svgId = mapKey
|
||||
let svgElementToHighlight: SVGElement | null
|
||||
|
||||
// eslint-disable-next-line no-constant-condition
|
||||
while (true) {
|
||||
svgElementToHighlight = mapContainerElement.querySelector("#" + svgId);
|
||||
svgElementToHighlight = mapContainerElement.querySelector('#' + svgId)
|
||||
|
||||
if (svgElementToHighlight || !svgId.includes("-")) {
|
||||
break;
|
||||
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.style.fill = ''
|
||||
|
||||
svgElementToHighlight.classList.add("highlight", "is-" + contextualClass);
|
||||
svgElementToHighlight.classList.add('highlight', 'is-' + contextualClass)
|
||||
|
||||
const childPathElements = svgElementToHighlight.querySelectorAll("path");
|
||||
const childPathElements = svgElementToHighlight.querySelectorAll('path')
|
||||
for (const pathElement of childPathElements) {
|
||||
// eslint-disable-next-line unicorn/no-null
|
||||
pathElement.style.fill = "";
|
||||
pathElement.style.fill = ''
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function unlockField(clickEvent: Event): void {
|
||||
const fieldElement = (clickEvent.currentTarget as HTMLElement).closest(".field")!;
|
||||
const fieldElement = (clickEvent.currentTarget as HTMLElement).closest(
|
||||
'.field'
|
||||
)!
|
||||
|
||||
const inputOrSelectElement = fieldElement.querySelector("input, select") as
|
||||
const inputOrSelectElement = fieldElement.querySelector('input, select') as
|
||||
| HTMLInputElement
|
||||
| HTMLSelectElement;
|
||||
| HTMLSelectElement
|
||||
|
||||
inputOrSelectElement.classList.remove("is-readonly");
|
||||
inputOrSelectElement.classList.remove('is-readonly')
|
||||
|
||||
if (inputOrSelectElement.tagName === "INPUT") {
|
||||
(inputOrSelectElement as HTMLInputElement).readOnly = false;
|
||||
(inputOrSelectElement as HTMLInputElement).disabled = false;
|
||||
if (inputOrSelectElement.tagName === 'INPUT') {
|
||||
;(inputOrSelectElement as HTMLInputElement).readOnly = false
|
||||
;(inputOrSelectElement as HTMLInputElement).disabled = false
|
||||
} else {
|
||||
const optionElements = inputOrSelectElement.querySelectorAll("option");
|
||||
const optionElements = inputOrSelectElement.querySelectorAll('option')
|
||||
for (const optionElement of optionElements) {
|
||||
optionElement.disabled = false;
|
||||
optionElement.disabled = false
|
||||
}
|
||||
}
|
||||
|
||||
inputOrSelectElement.focus();
|
||||
inputOrSelectElement.focus()
|
||||
}
|
||||
|
||||
function initializeUnlockFieldButtons(containerElement: HTMLElement): void {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -104,88 +108,98 @@ declare const bulmaJS: BulmaJS;
|
|||
*/
|
||||
|
||||
const datePickerBaseOptions: BulmaCalendarOptions = {
|
||||
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: HTMLElement): void {
|
||||
const dateElements = containerElement.querySelectorAll(
|
||||
"input[type='date']"
|
||||
) as NodeListOf<HTMLInputElement>;
|
||||
) as NodeListOf<HTMLInputElement>
|
||||
|
||||
for (const dateElement of dateElements) {
|
||||
const datePickerOptions = Object.assign({}, datePickerBaseOptions);
|
||||
const datePickerOptions = Object.assign({}, datePickerBaseOptions)
|
||||
|
||||
if (dateElement.required) {
|
||||
datePickerOptions.showClearButton = false;
|
||||
datePickerOptions.showClearButton = false
|
||||
}
|
||||
|
||||
// apply min date if set
|
||||
if (dateElement.min) {
|
||||
datePickerOptions.minDate = cityssm.dateStringToDate(dateElement.min);
|
||||
datePickerOptions.minDate = cityssm.dateStringToDate(dateElement.min)
|
||||
}
|
||||
|
||||
// apply max date if set
|
||||
if (dateElement.max) {
|
||||
datePickerOptions.maxDate = cityssm.dateStringToDate(dateElement.max);
|
||||
datePickerOptions.maxDate = cityssm.dateStringToDate(dateElement.max)
|
||||
}
|
||||
|
||||
const cal = exports.bulmaCalendar.attach(dateElement, datePickerOptions)[0];
|
||||
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"));
|
||||
});
|
||||
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");
|
||||
});
|
||||
cal.on('show', () => {
|
||||
document.querySelector('html')!.classList.add('is-clipped')
|
||||
})
|
||||
|
||||
// Reenable scrolling, if a modal window is not open
|
||||
cal.on("hide", () => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
});
|
||||
cal.on('hide', () => {
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
})
|
||||
|
||||
// Get the datepicker container element
|
||||
const datepickerElement = containerElement.querySelector("#" + cal._id) as HTMLElement;
|
||||
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"
|
||||
);
|
||||
'.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"
|
||||
) as HTMLElement;
|
||||
'.datetimepicker-clear-button'
|
||||
) as HTMLElement
|
||||
|
||||
if (clearButtonElement) {
|
||||
if (dateElement.required) {
|
||||
clearButtonElement.remove();
|
||||
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">×</span>';
|
||||
'<span class="has-text-weight-bold" aria-hidden="true">×</span>'
|
||||
}
|
||||
}
|
||||
|
||||
// Apply a label
|
||||
const labelElement = document.querySelector("label[for='" + dateElement.id + "']");
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -268,41 +282,43 @@ declare const bulmaJS: BulmaJS;
|
|||
*/
|
||||
|
||||
function populateAliases(containerElement: HTMLElement): void {
|
||||
const aliasElements = containerElement.querySelectorAll(".alias") as NodeListOf<HTMLElement>;
|
||||
const aliasElements = containerElement.querySelectorAll(
|
||||
'.alias'
|
||||
) as NodeListOf<HTMLElement>
|
||||
|
||||
for (const aliasElement of aliasElements) {
|
||||
switch (aliasElement.dataset.alias) {
|
||||
case "Map": {
|
||||
aliasElement.textContent = exports.aliases.map;
|
||||
break;
|
||||
case 'Map': {
|
||||
aliasElement.textContent = exports.aliases.map
|
||||
break
|
||||
}
|
||||
case "Lot": {
|
||||
aliasElement.textContent = exports.aliases.lot;
|
||||
break;
|
||||
case 'Lot': {
|
||||
aliasElement.textContent = exports.aliases.lot
|
||||
break
|
||||
}
|
||||
case "lot": {
|
||||
aliasElement.textContent = exports.aliases.lot.toLowerCase();
|
||||
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
|
||||
break
|
||||
}
|
||||
case "occupancy": {
|
||||
aliasElement.textContent = exports.aliases.occupancy.toLowerCase();
|
||||
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
|
||||
break
|
||||
}
|
||||
case "occupant": {
|
||||
aliasElement.textContent = exports.aliases.occupant.toLowerCase();
|
||||
break;
|
||||
case 'occupant': {
|
||||
aliasElement.textContent = exports.aliases.occupant.toLowerCase()
|
||||
break
|
||||
}
|
||||
case "ExternalReceiptNumber": {
|
||||
aliasElement.textContent = exports.aliases.externalReceiptNumber;
|
||||
break;
|
||||
case 'ExternalReceiptNumber': {
|
||||
aliasElement.textContent = exports.aliases.externalReceiptNumber
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -329,39 +345,54 @@ declare const bulmaJS: BulmaJS;
|
|||
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()),
|
||||
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()),
|
||||
occupancyStartDate: cityssm.escapeHTML(
|
||||
exports.aliases.occupancyStartDate.toLowerCase()
|
||||
),
|
||||
|
||||
WorkOrderOpenDate: cityssm.escapeHTML(exports.aliases.workOrderOpenDate),
|
||||
workOrderOpenDate: cityssm.escapeHTML(exports.aliases.workOrderOpenDate.toLowerCase()),
|
||||
workOrderOpenDate: cityssm.escapeHTML(
|
||||
exports.aliases.workOrderOpenDate.toLowerCase()
|
||||
),
|
||||
|
||||
WorkOrderCloseDate: cityssm.escapeHTML(exports.aliases.workOrderCloseDate),
|
||||
workOrderCloseDate: cityssm.escapeHTML(exports.aliases.workOrderCloseDate.toLowerCase())
|
||||
});
|
||||
workOrderCloseDate: cityssm.escapeHTML(
|
||||
exports.aliases.workOrderCloseDate.toLowerCase()
|
||||
)
|
||||
})
|
||||
|
||||
/*
|
||||
* 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: string) {
|
||||
let actualSeedString = 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],
|
||||
hue: hues[
|
||||
actualSeedString.codePointAt(actualSeedString.length - 1)! % hues.length
|
||||
],
|
||||
luminosity:
|
||||
luminosity[actualSeedString.codePointAt(actualSeedString.length - 2)! % luminosity.length]
|
||||
});
|
||||
luminosity[
|
||||
actualSeedString.codePointAt(actualSeedString.length - 2)! %
|
||||
luminosity.length
|
||||
]
|
||||
})
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -376,98 +407,114 @@ declare const bulmaJS: BulmaJS;
|
|||
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 {
|
||||
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) {
|
||||
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 " +
|
||||
'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: "maps" | "lots" | "lotOccupancies" | "workOrders",
|
||||
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() : "")
|
||||
);
|
||||
(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)
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -476,7 +523,7 @@ declare const bulmaJS: BulmaJS;
|
|||
|
||||
const los: globalTypes.LOS = {
|
||||
urlPrefix,
|
||||
apiKey: document.querySelector("main")!.dataset.apiKey!,
|
||||
apiKey: document.querySelector('main')!.dataset.apiKey!,
|
||||
highlightMap,
|
||||
initializeUnlockFieldButtons,
|
||||
initializeDatePickers,
|
||||
|
|
@ -498,7 +545,7 @@ declare const bulmaJS: BulmaJS;
|
|||
getLotURL,
|
||||
getLotOccupancyURL,
|
||||
getWorkOrderURL
|
||||
};
|
||||
}
|
||||
|
||||
exports.los = los;
|
||||
})();
|
||||
exports.los = los
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
formEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/maps/" + (isCreate ? "doCreateMap" : "doUpdateMap"),
|
||||
los.urlPrefix + '/maps/' + (isCreate ? 'doCreateMap' : 'doUpdateMap'),
|
||||
mapForm,
|
||||
(responseJSON: { success: boolean; mapId?: number; errorMessage?: string }) => {
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
mapId?: number
|
||||
errorMessage?: string
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
cityssm.disableNavBlocker();
|
||||
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);
|
||||
mapForm.addEventListener('submit', updateMap)
|
||||
|
||||
const inputElements = mapForm.querySelectorAll("input, select") as NodeListOf<
|
||||
const inputElements = mapForm.querySelectorAll('input, select') as NodeListOf<
|
||||
HTMLInputElement | HTMLSelectElement
|
||||
>;
|
||||
>
|
||||
|
||||
for (const inputElement of inputElements) {
|
||||
inputElement.addEventListener("change", cityssm.enableNavBlocker);
|
||||
inputElement.addEventListener('change', cityssm.enableNavBlocker)
|
||||
}
|
||||
|
||||
document.querySelector("#button--deleteMap")?.addEventListener("click", (clickEvent) => {
|
||||
clickEvent.preventDefault();
|
||||
document
|
||||
.querySelector('#button--deleteMap')
|
||||
?.addEventListener('click', (clickEvent) => {
|
||||
clickEvent.preventDefault()
|
||||
|
||||
function doDelete() {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/maps/doDeleteMap",
|
||||
los.urlPrefix + '/maps/doDeleteMap',
|
||||
{
|
||||
mapId
|
||||
},
|
||||
(responseJSON: { success: boolean; errorMessage?: string }) => {
|
||||
if (responseJSON.success) {
|
||||
window.location.href = los.getMapURL();
|
||||
window.location.href = los.getMapURL()
|
||||
} 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
|
||||
}
|
||||
});
|
||||
});
|
||||
})();
|
||||
})
|
||||
})
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,111 +1,122 @@
|
|||
/* 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}...`
|
||||
);
|
||||
)
|
||||
|
||||
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();
|
||||
`${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;
|
||||
showMap = false
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if (!showMap) {
|
||||
continue;
|
||||
continue
|
||||
}
|
||||
|
||||
searchResultCount += 1;
|
||||
searchResultCount += 1
|
||||
|
||||
searchResultsTbodyElement.insertAdjacentHTML(
|
||||
"beforeend",
|
||||
"<tr>" +
|
||||
("<td>" +
|
||||
'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>`;
|
||||
</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>
|
||||
|
|
@ -114,20 +125,22 @@ declare const cityssm: cityssmGlobal;
|
|||
<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()
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
'#map--leaflet'
|
||||
) as HTMLElement
|
||||
|
||||
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);
|
||||
const map: Leaflet.Map = L.map(mapContainerElement)
|
||||
map.setView(mapCoordinates, 15)
|
||||
|
||||
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
|
||||
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
||||
maxZoom: 19,
|
||||
attribution: "© OpenStreetMap"
|
||||
}).addTo(map);
|
||||
attribution: '© OpenStreetMap'
|
||||
}).addTo(map)
|
||||
|
||||
L.marker(mapCoordinates).addTo(map);
|
||||
L.marker(mapCoordinates).addTo(map)
|
||||
}
|
||||
})();
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
})();
|
||||
|
|
|
|||
|
|
@ -1,38 +1,41 @@
|
|||
/* eslint-disable unicorn/prefer-module */
|
||||
|
||||
(() => {
|
||||
const menuTabElements = document.querySelectorAll(".menu a") as NodeListOf<HTMLAnchorElement>;
|
||||
;(() => {
|
||||
const menuTabElements = document.querySelectorAll(
|
||||
'.menu a'
|
||||
) as NodeListOf<HTMLAnchorElement>
|
||||
|
||||
const tabContainerElements = document.querySelectorAll(
|
||||
".tabs-container > div"
|
||||
) as NodeListOf<HTMLElement>;
|
||||
'.tabs-container > div'
|
||||
) as NodeListOf<HTMLElement>
|
||||
|
||||
function selectTab(clickEvent: Event) {
|
||||
clickEvent.preventDefault();
|
||||
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 as HTMLAnchorElement;
|
||||
selectedTabElement.classList.add("is-active");
|
||||
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)
|
||||
);
|
||||
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)
|
||||
}
|
||||
})();
|
||||
})()
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -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,70 +23,71 @@ 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
|
||||
|
|
@ -102,24 +105,25 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
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();
|
||||
|
|
|
|||
|
|
@ -1,65 +1,78 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
|
||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
||||
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||
|
||||
import type * as globalTypes from "../../types/globalTypes";
|
||||
import type * as recordTypes from "../../types/recordTypes";
|
||||
import type * as globalTypes from '../../types/globalTypes'
|
||||
import type * as recordTypes from '../../types/recordTypes'
|
||||
|
||||
declare const cityssm: cityssmGlobal;
|
||||
declare const bulmaJS: BulmaJS;
|
||||
declare const cityssm: cityssmGlobal
|
||||
declare const bulmaJS: BulmaJS
|
||||
|
||||
(() => {
|
||||
const los = exports.los as globalTypes.LOS;
|
||||
;(() => {
|
||||
const los = exports.los as globalTypes.LOS
|
||||
|
||||
const workOrderId = (document.querySelector("#workOrderEdit--workOrderId") as HTMLInputElement).value;
|
||||
const workOrderId = (
|
||||
document.querySelector('#workOrderEdit--workOrderId') as HTMLInputElement
|
||||
).value
|
||||
|
||||
const isCreate = workOrderId === "";
|
||||
const isCreate = workOrderId === ''
|
||||
|
||||
const workOrderFormElement = document.querySelector("#form--workOrderEdit") as HTMLFormElement;
|
||||
const workOrderFormElement = document.querySelector(
|
||||
'#form--workOrderEdit'
|
||||
) as HTMLFormElement
|
||||
|
||||
los.initializeDatePickers(
|
||||
workOrderFormElement
|
||||
.querySelector("#workOrderEdit--workOrderOpenDateString")!
|
||||
.closest(".field") as HTMLElement
|
||||
);
|
||||
los.initializeUnlockFieldButtons(workOrderFormElement);
|
||||
.querySelector('#workOrderEdit--workOrderOpenDateString')!
|
||||
.closest('.field') as HTMLElement
|
||||
)
|
||||
los.initializeUnlockFieldButtons(workOrderFormElement)
|
||||
|
||||
workOrderFormElement.addEventListener("submit", (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
workOrderFormElement.addEventListener('submit', (submitEvent) => {
|
||||
submitEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/workOrders/" + (isCreate ? "doCreateWorkOrder" : "doUpdateWorkOrder"),
|
||||
los.urlPrefix +
|
||||
'/workOrders/' +
|
||||
(isCreate ? 'doCreateWorkOrder' : 'doUpdateWorkOrder'),
|
||||
submitEvent.currentTarget,
|
||||
(responseJSON: { success: boolean; workOrderId?: number; errorMessage?: string }) => {
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
workOrderId?: number
|
||||
errorMessage?: string
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
cityssm.disableNavBlocker();
|
||||
cityssm.disableNavBlocker()
|
||||
|
||||
if (isCreate) {
|
||||
window.location.href = los.getWorkOrderURL(responseJSON.workOrderId!, true);
|
||||
window.location.href = los.getWorkOrderURL(
|
||||
responseJSON.workOrderId!,
|
||||
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") as NodeListOf<
|
||||
HTMLInputElement | HTMLSelectElement
|
||||
>;
|
||||
const inputElements = workOrderFormElement.querySelectorAll(
|
||||
'input, select'
|
||||
) as NodeListOf<HTMLInputElement | HTMLSelectElement>
|
||||
|
||||
for (const inputElement of inputElements) {
|
||||
inputElement.addEventListener("change", cityssm.enableNavBlocker);
|
||||
inputElement.addEventListener('change', cityssm.enableNavBlocker)
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -68,58 +81,60 @@ declare const bulmaJS: BulmaJS;
|
|||
|
||||
function doClose() {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/workOrders/doCloseWorkOrder",
|
||||
los.urlPrefix + '/workOrders/doCloseWorkOrder',
|
||||
{
|
||||
workOrderId
|
||||
},
|
||||
(responseJSON: { success: boolean; errorMessage?: string }) => {
|
||||
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",
|
||||
los.urlPrefix + '/workOrders/doDeleteWorkOrder',
|
||||
{
|
||||
workOrderId
|
||||
},
|
||||
(responseJSON: { success: boolean; errorMessage?: string }) => {
|
||||
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: recordTypes.WorkOrderMilestone[];
|
||||
let workOrderMilestones: recordTypes.WorkOrderMilestone[]
|
||||
|
||||
document.querySelector("#button--closeWorkOrder")?.addEventListener("click", () => {
|
||||
document
|
||||
.querySelector('#button--closeWorkOrder')
|
||||
?.addEventListener('click', () => {
|
||||
const hasOpenMilestones = workOrderMilestones.some((milestone) => {
|
||||
return !milestone.workOrderMilestoneCompletionDate;
|
||||
});
|
||||
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
|
||||
|
|
@ -136,30 +151,32 @@ declare const bulmaJS: BulmaJS;
|
|||
*/
|
||||
} 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
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
document.querySelector("#button--deleteWorkOrder")?.addEventListener("click", (clickEvent: Event) => {
|
||||
clickEvent.preventDefault();
|
||||
document
|
||||
.querySelector('#button--deleteWorkOrder')
|
||||
?.addEventListener('click', (clickEvent: Event) => {
|
||||
clickEvent.preventDefault()
|
||||
|
||||
bulmaJS.confirm({
|
||||
title: "Delete Work Order",
|
||||
message: "Are you sure you want to delete this work order?",
|
||||
contextualColorName: "warning",
|
||||
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
|
||||
}
|
||||
});
|
||||
});
|
||||
})
|
||||
})
|
||||
|
||||
/*
|
||||
* Related Lots
|
||||
|
|
@ -180,246 +197,271 @@ declare const bulmaJS: BulmaJS;
|
|||
*/
|
||||
|
||||
function processMilestoneResponse(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
workOrderMilestones?: recordTypes.WorkOrderMilestone[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
workOrderMilestones?: recordTypes.WorkOrderMilestone[]
|
||||
}) {
|
||||
if (responseJSON.success) {
|
||||
workOrderMilestones = responseJSON.workOrderMilestones!;
|
||||
renderMilestones();
|
||||
workOrderMilestones = responseJSON.workOrderMilestones!
|
||||
renderMilestones()
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Reopening Milestone",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
title: 'Error Reopening Milestone',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function completeMilestone(clickEvent: Event) {
|
||||
clickEvent.preventDefault();
|
||||
clickEvent.preventDefault()
|
||||
|
||||
const currentDateString = cityssm.dateToString(new Date());
|
||||
const currentDateString = cityssm.dateToString(new Date())
|
||||
|
||||
const workOrderMilestoneId = Number.parseInt(
|
||||
((clickEvent.currentTarget as HTMLElement).closest(".container--milestone") as HTMLElement)
|
||||
.dataset.workOrderMilestoneId!,
|
||||
(
|
||||
(clickEvent.currentTarget as HTMLElement).closest(
|
||||
'.container--milestone'
|
||||
) as HTMLElement
|
||||
).dataset.workOrderMilestoneId!,
|
||||
10
|
||||
);
|
||||
)
|
||||
|
||||
const workOrderMilestone = workOrderMilestones.find((currentMilestone) => {
|
||||
return currentMilestone.workOrderMilestoneId === workOrderMilestoneId;
|
||||
})!;
|
||||
return currentMilestone.workOrderMilestoneId === workOrderMilestoneId
|
||||
})!
|
||||
|
||||
const doComplete = () => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/workOrders/doCompleteWorkOrderMilestone",
|
||||
los.urlPrefix + '/workOrders/doCompleteWorkOrderMilestone',
|
||||
{
|
||||
workOrderId,
|
||||
workOrderMilestoneId
|
||||
},
|
||||
processMilestoneResponse
|
||||
);
|
||||
};
|
||||
)
|
||||
}
|
||||
|
||||
bulmaJS.confirm({
|
||||
title: "Complete Milestone",
|
||||
title: 'Complete Milestone',
|
||||
message:
|
||||
"Are you sure you want to complete this milestone?" +
|
||||
'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: Event) {
|
||||
clickEvent.preventDefault();
|
||||
clickEvent.preventDefault()
|
||||
|
||||
const workOrderMilestoneId = (
|
||||
(clickEvent.currentTarget as HTMLElement).closest(".container--milestone") as HTMLElement
|
||||
).dataset.workOrderMilestoneId;
|
||||
(clickEvent.currentTarget as HTMLElement).closest(
|
||||
'.container--milestone'
|
||||
) as HTMLElement
|
||||
).dataset.workOrderMilestoneId
|
||||
|
||||
const doReopen = () => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/workOrders/doReopenWorkOrderMilestone",
|
||||
los.urlPrefix + '/workOrders/doReopenWorkOrderMilestone',
|
||||
{
|
||||
workOrderId,
|
||||
workOrderMilestoneId
|
||||
},
|
||||
processMilestoneResponse
|
||||
);
|
||||
};
|
||||
)
|
||||
}
|
||||
|
||||
bulmaJS.confirm({
|
||||
title: "Reopen Milestone",
|
||||
title: 'Reopen Milestone',
|
||||
message:
|
||||
"Are you sure you want to remove the completion status from this milestone, and reopen it?",
|
||||
contextualColorName: "warning",
|
||||
'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: Event) {
|
||||
clickEvent.preventDefault();
|
||||
clickEvent.preventDefault()
|
||||
|
||||
const workOrderMilestoneId = (
|
||||
(clickEvent.currentTarget as HTMLElement).closest(".container--milestone") as HTMLElement
|
||||
).dataset.workOrderMilestoneId;
|
||||
(clickEvent.currentTarget as HTMLElement).closest(
|
||||
'.container--milestone'
|
||||
) as HTMLElement
|
||||
).dataset.workOrderMilestoneId
|
||||
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/workOrders/doDeleteWorkOrderMilestone",
|
||||
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: Event) {
|
||||
clickEvent.preventDefault();
|
||||
clickEvent.preventDefault()
|
||||
|
||||
const workOrderMilestoneId = Number.parseInt(
|
||||
((clickEvent.currentTarget as HTMLElement).closest(".container--milestone") as HTMLElement)
|
||||
.dataset.workOrderMilestoneId!,
|
||||
(
|
||||
(clickEvent.currentTarget as HTMLElement).closest(
|
||||
'.container--milestone'
|
||||
) as HTMLElement
|
||||
).dataset.workOrderMilestoneId!,
|
||||
10
|
||||
);
|
||||
)
|
||||
|
||||
const workOrderMilestone = workOrderMilestones.find((currentMilestone) => {
|
||||
return currentMilestone.workOrderMilestoneId === workOrderMilestoneId;
|
||||
})!;
|
||||
return currentMilestone.workOrderMilestoneId === workOrderMilestoneId
|
||||
})!
|
||||
|
||||
let editCloseModalFunction: () => void;
|
||||
let editCloseModalFunction: () => void
|
||||
|
||||
const doEdit = (submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
submitEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/workOrders/doUpdateWorkOrderMilestone",
|
||||
los.urlPrefix + '/workOrders/doUpdateWorkOrderMilestone',
|
||||
submitEvent.currentTarget,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
workOrderMilestones?: recordTypes.WorkOrderMilestone[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
workOrderMilestones?: recordTypes.WorkOrderMilestone[]
|
||||
}) => {
|
||||
processMilestoneResponse(responseJSON);
|
||||
processMilestoneResponse(responseJSON)
|
||||
if (responseJSON.success) {
|
||||
editCloseModalFunction();
|
||||
editCloseModalFunction()
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
)
|
||||
}
|
||||
|
||||
cityssm.openHtmlModal("workOrder-editMilestone", {
|
||||
cityssm.openHtmlModal('workOrder-editMilestone', {
|
||||
onshow(modalElement) {
|
||||
(modalElement.querySelector("#milestoneEdit--workOrderId") as HTMLInputElement).value =
|
||||
workOrderId;
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#milestoneEdit--workOrderId'
|
||||
) as HTMLInputElement
|
||||
).value = workOrderId
|
||||
|
||||
(
|
||||
modalElement.querySelector("#milestoneEdit--workOrderMilestoneId") as HTMLInputElement
|
||||
).value = workOrderMilestone.workOrderMilestoneId!.toString();
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#milestoneEdit--workOrderMilestoneId'
|
||||
) as HTMLInputElement
|
||||
).value = workOrderMilestone.workOrderMilestoneId!.toString()
|
||||
|
||||
const milestoneTypeElement = modalElement.querySelector(
|
||||
"#milestoneEdit--workOrderMilestoneTypeId"
|
||||
) as HTMLSelectElement;
|
||||
'#milestoneEdit--workOrderMilestoneTypeId'
|
||||
) as HTMLSelectElement
|
||||
|
||||
let milestoneTypeFound = false;
|
||||
let milestoneTypeFound = false
|
||||
|
||||
for (const milestoneType of exports.workOrderMilestoneTypes as recordTypes.WorkOrderMilestoneType[]) {
|
||||
const optionElement = document.createElement("option");
|
||||
const optionElement = document.createElement('option')
|
||||
|
||||
optionElement.value = milestoneType.workOrderMilestoneTypeId.toString();
|
||||
optionElement.textContent = milestoneType.workOrderMilestoneType;
|
||||
optionElement.value =
|
||||
milestoneType.workOrderMilestoneTypeId.toString()
|
||||
optionElement.textContent = milestoneType.workOrderMilestoneType
|
||||
|
||||
if (
|
||||
milestoneType.workOrderMilestoneTypeId === workOrderMilestone.workOrderMilestoneTypeId
|
||||
milestoneType.workOrderMilestoneTypeId ===
|
||||
workOrderMilestone.workOrderMilestoneTypeId
|
||||
) {
|
||||
optionElement.selected = true;
|
||||
milestoneTypeFound = true;
|
||||
optionElement.selected = true
|
||||
milestoneTypeFound = true
|
||||
}
|
||||
|
||||
milestoneTypeElement.append(optionElement);
|
||||
milestoneTypeElement.append(optionElement)
|
||||
}
|
||||
|
||||
if (!milestoneTypeFound && workOrderMilestone.workOrderMilestoneTypeId) {
|
||||
const optionElement = document.createElement("option");
|
||||
optionElement.value = workOrderMilestone.workOrderMilestoneTypeId.toString();
|
||||
optionElement.textContent = workOrderMilestone.workOrderMilestoneType!;
|
||||
optionElement.selected = true;
|
||||
milestoneTypeElement.append(optionElement);
|
||||
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"
|
||||
'#milestoneEdit--workOrderMilestoneDateString'
|
||||
) as HTMLInputElement
|
||||
).value = workOrderMilestone.workOrderMilestoneDateString!;
|
||||
).value = workOrderMilestone.workOrderMilestoneDateString!
|
||||
|
||||
if (workOrderMilestone.workOrderMilestoneTime) {
|
||||
(
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#milestoneEdit--workOrderMilestoneTimeString"
|
||||
'#milestoneEdit--workOrderMilestoneTimeString'
|
||||
) as HTMLInputElement
|
||||
).value = workOrderMilestone.workOrderMilestoneTimeString!;
|
||||
).value = workOrderMilestone.workOrderMilestoneTimeString!
|
||||
}
|
||||
|
||||
(
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#milestoneEdit--workOrderMilestoneDescription"
|
||||
'#milestoneEdit--workOrderMilestoneDescription'
|
||||
) as HTMLTextAreaElement
|
||||
).value = workOrderMilestone.workOrderMilestoneDescription!;
|
||||
).value = workOrderMilestone.workOrderMilestoneDescription!
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
editCloseModalFunction = closeModalFunction;
|
||||
editCloseModalFunction = closeModalFunction
|
||||
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
|
||||
los.initializeDatePickers(modalElement);
|
||||
los.initializeDatePickers(modalElement)
|
||||
// los.initializeTimePickers(modalElement);
|
||||
modalElement.querySelector("form")!.addEventListener("submit", doEdit);
|
||||
modalElement.querySelector('form')!.addEventListener('submit', doEdit)
|
||||
},
|
||||
onremoved() {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
function renderMilestones() {
|
||||
// Clear milestones panel
|
||||
const milestonesPanelElement = document.querySelector("#panel--milestones") as HTMLElement;
|
||||
const milestonesPanelElement = document.querySelector(
|
||||
'#panel--milestones'
|
||||
) as HTMLElement
|
||||
|
||||
const panelBlockElementsToDelete = milestonesPanelElement.querySelectorAll(".panel-block");
|
||||
const panelBlockElementsToDelete =
|
||||
milestonesPanelElement.querySelectorAll('.panel-block')
|
||||
|
||||
for (const panelBlockToDelete of panelBlockElementsToDelete) {
|
||||
panelBlockToDelete.remove();
|
||||
panelBlockToDelete.remove()
|
||||
}
|
||||
|
||||
for (const milestone of workOrderMilestones) {
|
||||
const panelBlockElement = document.createElement("div");
|
||||
panelBlockElement.className = "panel-block is-block container--milestone";
|
||||
const panelBlockElement = document.createElement('div')
|
||||
panelBlockElement.className = 'panel-block is-block container--milestone'
|
||||
|
||||
panelBlockElement.dataset.workOrderMilestoneId = milestone.workOrderMilestoneId!.toString();
|
||||
panelBlockElement.dataset.workOrderMilestoneId =
|
||||
milestone.workOrderMilestoneId!.toString()
|
||||
|
||||
panelBlockElement.innerHTML =
|
||||
'<div class="columns is-mobile">' +
|
||||
|
|
@ -431,171 +473,181 @@ declare const bulmaJS: BulmaJS;
|
|||
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>'
|
||||
|
||||
panelBlockElement
|
||||
.querySelector(".button--reopenMilestone")
|
||||
?.addEventListener("click", reopenMilestone);
|
||||
.querySelector('.button--reopenMilestone')
|
||||
?.addEventListener('click', reopenMilestone)
|
||||
panelBlockElement
|
||||
.querySelector(".button--editMilestone")
|
||||
?.addEventListener("click", editMilestone);
|
||||
.querySelector('.button--editMilestone')
|
||||
?.addEventListener('click', editMilestone)
|
||||
|
||||
panelBlockElement
|
||||
.querySelector(".button--completeMilestone")
|
||||
?.addEventListener("click", completeMilestone);
|
||||
.querySelector('.button--completeMilestone')
|
||||
?.addEventListener('click', completeMilestone)
|
||||
|
||||
panelBlockElement
|
||||
.querySelector(".button--deleteMilestone")!
|
||||
.addEventListener("click", deleteMilestone);
|
||||
.querySelector('.button--deleteMilestone')!
|
||||
.addEventListener('click', deleteMilestone)
|
||||
|
||||
milestonesPanelElement.append(panelBlockElement);
|
||||
milestonesPanelElement.append(panelBlockElement)
|
||||
}
|
||||
|
||||
bulmaJS.init(milestonesPanelElement);
|
||||
bulmaJS.init(milestonesPanelElement)
|
||||
}
|
||||
|
||||
if (!isCreate) {
|
||||
workOrderMilestones = exports.workOrderMilestones as recordTypes.WorkOrderMilestone[];
|
||||
delete exports.workOrderMilestones;
|
||||
workOrderMilestones =
|
||||
exports.workOrderMilestones as recordTypes.WorkOrderMilestone[]
|
||||
delete exports.workOrderMilestones
|
||||
|
||||
renderMilestones();
|
||||
renderMilestones()
|
||||
|
||||
document.querySelector("#button--addMilestone")!.addEventListener("click", () => {
|
||||
let addModalElement: HTMLElement;
|
||||
let addFormElement: HTMLFormElement;
|
||||
let addCloseModalFunction: () => void;
|
||||
document
|
||||
.querySelector('#button--addMilestone')!
|
||||
.addEventListener('click', () => {
|
||||
let addModalElement: HTMLElement
|
||||
let addFormElement: HTMLFormElement
|
||||
let addCloseModalFunction: () => void
|
||||
|
||||
const doAdd = (submitEvent: SubmitEvent) => {
|
||||
if (submitEvent) {
|
||||
submitEvent.preventDefault();
|
||||
submitEvent.preventDefault()
|
||||
}
|
||||
|
||||
const currentDateString = cityssm.dateToString(new Date());
|
||||
const currentDateString = cityssm.dateToString(new Date())
|
||||
|
||||
function _doAdd() {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/workOrders/doAddWorkOrderMilestone",
|
||||
los.urlPrefix + '/workOrders/doAddWorkOrderMilestone',
|
||||
addFormElement,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
workOrderMilestones?: recordTypes.WorkOrderMilestone[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
workOrderMilestones?: recordTypes.WorkOrderMilestone[]
|
||||
}) => {
|
||||
processMilestoneResponse(responseJSON);
|
||||
processMilestoneResponse(responseJSON)
|
||||
|
||||
if (responseJSON.success) {
|
||||
addCloseModalFunction();
|
||||
addCloseModalFunction()
|
||||
}
|
||||
}
|
||||
);
|
||||
)
|
||||
}
|
||||
|
||||
if (
|
||||
(
|
||||
addModalElement.querySelector(
|
||||
"#milestoneAdd--workOrderMilestoneDateString"
|
||||
'#milestoneAdd--workOrderMilestoneDateString'
|
||||
) as HTMLInputElement
|
||||
).value < currentDateString
|
||||
) {
|
||||
bulmaJS.confirm({
|
||||
title: "Milestone Date in the Past",
|
||||
message: "Are you sure you want to create a milestone with a date in the past?",
|
||||
contextualColorName: "warning",
|
||||
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
|
||||
}
|
||||
});
|
||||
})
|
||||
} else {
|
||||
_doAdd();
|
||||
_doAdd()
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
cityssm.openHtmlModal("workOrder-addMilestone", {
|
||||
cityssm.openHtmlModal('workOrder-addMilestone', {
|
||||
onshow(modalElement) {
|
||||
(modalElement.querySelector("#milestoneAdd--workOrderId") as HTMLInputElement).value =
|
||||
workOrderId;
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#milestoneAdd--workOrderId'
|
||||
) as HTMLInputElement
|
||||
).value = workOrderId
|
||||
|
||||
const milestoneTypeElement = modalElement.querySelector(
|
||||
"#milestoneAdd--workOrderMilestoneTypeId"
|
||||
) as HTMLSelectElement;
|
||||
'#milestoneAdd--workOrderMilestoneTypeId'
|
||||
) as HTMLSelectElement
|
||||
|
||||
for (const milestoneType of exports.workOrderMilestoneTypes as recordTypes.WorkOrderMilestoneType[]) {
|
||||
const optionElement = document.createElement("option");
|
||||
const optionElement = document.createElement('option')
|
||||
|
||||
optionElement.value = milestoneType.workOrderMilestoneTypeId.toString();
|
||||
optionElement.textContent = milestoneType.workOrderMilestoneType;
|
||||
optionElement.value =
|
||||
milestoneType.workOrderMilestoneTypeId.toString()
|
||||
optionElement.textContent = milestoneType.workOrderMilestoneType
|
||||
|
||||
milestoneTypeElement.append(optionElement);
|
||||
milestoneTypeElement.append(optionElement)
|
||||
}
|
||||
|
||||
(
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#milestoneAdd--workOrderMilestoneDateString"
|
||||
'#milestoneAdd--workOrderMilestoneDateString'
|
||||
) as HTMLInputElement
|
||||
).valueAsDate = new Date();
|
||||
).valueAsDate = new Date()
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
addModalElement = modalElement;
|
||||
addCloseModalFunction = closeModalFunction;
|
||||
addModalElement = modalElement
|
||||
addCloseModalFunction = closeModalFunction
|
||||
|
||||
los.initializeDatePickers(modalElement);
|
||||
los.initializeDatePickers(modalElement)
|
||||
// los.initializeTimePickers(modalElement);
|
||||
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
|
||||
addFormElement = modalElement.querySelector("form")!;
|
||||
addFormElement.addEventListener("submit", doAdd);
|
||||
addFormElement = modalElement.querySelector('form')!
|
||||
addFormElement.addEventListener('submit', doAdd)
|
||||
},
|
||||
onremoved() {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
}
|
||||
});
|
||||
});
|
||||
})
|
||||
})
|
||||
}
|
||||
})();
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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!,
|
||||
(clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset
|
||||
.workOrderCommentId!,
|
||||
10
|
||||
);
|
||||
)
|
||||
|
||||
const workOrderComment = workOrderComments.find((currentComment) => {
|
||||
return currentComment.workOrderCommentId === workOrderCommentId;
|
||||
})!;
|
||||
return currentComment.workOrderCommentId === workOrderCommentId
|
||||
})!
|
||||
|
||||
let editFormElement: HTMLFormElement;
|
||||
let editCloseModalFunction: () => void;
|
||||
let editFormElement: HTMLFormElement
|
||||
let editCloseModalFunction: () => void
|
||||
|
||||
function editComment(submitEvent: SubmitEvent): void {
|
||||
submitEvent.preventDefault();
|
||||
submitEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/workOrders/doUpdateWorkOrderComment",
|
||||
los.urlPrefix + '/workOrders/doUpdateWorkOrderComment',
|
||||
editFormElement,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
workOrderComments?: recordTypes.WorkOrderComment[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
workOrderComments?: recordTypes.WorkOrderComment[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderComments = responseJSON.workOrderComments!;
|
||||
editCloseModalFunction();
|
||||
renderWorkOrderComments();
|
||||
workOrderComments = responseJSON.workOrderComments!
|
||||
editCloseModalFunction()
|
||||
renderWorkOrderComments()
|
||||
} 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") as HTMLInputElement).value =
|
||||
workOrderId;
|
||||
(
|
||||
modalElement.querySelector("#workOrderCommentEdit--workOrderCommentId") as HTMLInputElement
|
||||
).value = workOrderCommentId.toString();
|
||||
;(
|
||||
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!;
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#workOrderCommentEdit--workOrderComment'
|
||||
) as HTMLInputElement
|
||||
).value = workOrderComment.workOrderComment!
|
||||
|
||||
const workOrderCommentDateStringElement = modalElement.querySelector(
|
||||
"#workOrderCommentEdit--workOrderCommentDateString"
|
||||
) as HTMLInputElement;
|
||||
'#workOrderCommentEdit--workOrderCommentDateString'
|
||||
) as HTMLInputElement
|
||||
|
||||
workOrderCommentDateStringElement.value = workOrderComment.workOrderCommentDateString!;
|
||||
workOrderCommentDateStringElement.value =
|
||||
workOrderComment.workOrderCommentDateString!
|
||||
|
||||
const currentDateString = cityssm.dateToString(new Date());
|
||||
const currentDateString = cityssm.dateToString(new Date())
|
||||
|
||||
workOrderCommentDateStringElement.max =
|
||||
workOrderComment.workOrderCommentDateString! <= currentDateString
|
||||
? currentDateString
|
||||
: workOrderComment.workOrderCommentDateString!;
|
||||
: workOrderComment.workOrderCommentDateString!
|
||||
|
||||
(
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
"#workOrderCommentEdit--workOrderCommentTimeString"
|
||||
'#workOrderCommentEdit--workOrderCommentTimeString'
|
||||
) as HTMLInputElement
|
||||
).value = workOrderComment.workOrderCommentTimeString!;
|
||||
).value = workOrderComment.workOrderCommentTimeString!
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
|
||||
los.initializeDatePickers(modalElement);
|
||||
los.initializeDatePickers(modalElement)
|
||||
// los.initializeTimePickers(modalElement);
|
||||
|
||||
(
|
||||
modalElement.querySelector("#workOrderCommentEdit--workOrderComment") as HTMLTextAreaElement
|
||||
).focus();
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#workOrderCommentEdit--workOrderComment'
|
||||
) as HTMLTextAreaElement
|
||||
).focus()
|
||||
|
||||
editFormElement = modalElement.querySelector("form")!;
|
||||
editFormElement.addEventListener("submit", editComment);
|
||||
editFormElement = modalElement.querySelector('form')!
|
||||
editFormElement.addEventListener('submit', editComment)
|
||||
|
||||
editCloseModalFunction = closeModalFunction;
|
||||
editCloseModalFunction = closeModalFunction
|
||||
},
|
||||
onremoved() {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
}
|
||||
});
|
||||
};
|
||||
})
|
||||
}
|
||||
|
||||
function deleteWorkOrderComment(clickEvent: Event): void {
|
||||
const workOrderCommentId = Number.parseInt(
|
||||
(clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.workOrderCommentId!,
|
||||
(clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset
|
||||
.workOrderCommentId!,
|
||||
10
|
||||
);
|
||||
)
|
||||
|
||||
function doDelete() {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/workOrders/doDeleteWorkOrderComment",
|
||||
los.urlPrefix + '/workOrders/doDeleteWorkOrderComment',
|
||||
{
|
||||
workOrderId,
|
||||
workOrderCommentId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
workOrderComments: recordTypes.WorkOrderComment[];
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
workOrderComments: recordTypes.WorkOrderComment[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderComments = responseJSON.workOrderComments;
|
||||
renderWorkOrderComments();
|
||||
workOrderComments = responseJSON.workOrderComments
|
||||
renderWorkOrderComments()
|
||||
} 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") as HTMLElement;
|
||||
const containerElement = document.querySelector(
|
||||
'#container--workOrderComments'
|
||||
) as HTMLElement
|
||||
|
||||
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";
|
||||
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();
|
||||
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>");
|
||||
'</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();
|
||||
formEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/workOrders/doAddWorkOrderComment",
|
||||
los.urlPrefix + '/workOrders/doAddWorkOrderComment',
|
||||
formEvent.currentTarget,
|
||||
(responseJSON: { success: boolean; workOrderComments?: recordTypes.WorkOrderComment[] }) => {
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
workOrderComments?: recordTypes.WorkOrderComment[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderComments = responseJSON.workOrderComments!;
|
||||
renderWorkOrderComments();
|
||||
addCommentCloseModalFunction();
|
||||
workOrderComments = responseJSON.workOrderComments!
|
||||
renderWorkOrderComments()
|
||||
addCommentCloseModalFunction()
|
||||
}
|
||||
}
|
||||
);
|
||||
)
|
||||
}
|
||||
|
||||
cityssm.openHtmlModal("workOrder-addComment", {
|
||||
cityssm.openHtmlModal('workOrder-addComment', {
|
||||
onshow(modalElement) {
|
||||
los.populateAliases(modalElement);
|
||||
(modalElement.querySelector("#workOrderCommentAdd--workOrderId") as HTMLInputElement).value =
|
||||
workOrderId;
|
||||
modalElement.querySelector("form")!.addEventListener("submit", doAddComment);
|
||||
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();
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
addCommentCloseModalFunction = closeModalFunction
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#workOrderCommentAdd--workOrderComment'
|
||||
) as HTMLTextAreaElement
|
||||
).focus()
|
||||
},
|
||||
onremoved() {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
(document.querySelector("#workOrderComments--add") as HTMLButtonElement).focus();
|
||||
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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -3,10 +3,10 @@
|
|||
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">
|
||||
|
|
@ -14,51 +14,51 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
</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();
|
||||
})();
|
||||
|
|
|
|||
|
|
@ -1,97 +1,100 @@
|
|||
/* 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;
|
||||
|
||||
(() => {
|
||||
const los = exports.los as globalTypes.LOS;
|
||||
declare const cityssm: cityssmGlobal
|
||||
;(() => {
|
||||
const los = exports.los as globalTypes.LOS
|
||||
|
||||
const workOrderSearchFiltersFormElement = document.querySelector(
|
||||
"#form--searchFilters"
|
||||
) as HTMLFormElement;
|
||||
'#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;
|
||||
'#container--milestoneCalendar'
|
||||
) as HTMLElement
|
||||
|
||||
function renderMilestones(workOrderMilestones: recordTypes.WorkOrderMilestone[]) {
|
||||
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;
|
||||
</div>`
|
||||
return
|
||||
}
|
||||
|
||||
milestoneCalendarContainerElement.innerHTML = "";
|
||||
milestoneCalendarContainerElement.innerHTML = ''
|
||||
|
||||
const currentDate = cityssm.dateToString(new Date());
|
||||
const currentDate = cityssm.dateToString(new Date())
|
||||
|
||||
let currentPanelElement: HTMLElement | undefined;
|
||||
let currentPanelDateString = "";
|
||||
let currentPanelElement: HTMLElement | undefined
|
||||
let currentPanelDateString = ''
|
||||
|
||||
for (const milestone of workOrderMilestones) {
|
||||
if (currentPanelDateString !== milestone.workOrderMilestoneDateString) {
|
||||
if (currentPanelElement) {
|
||||
milestoneCalendarContainerElement.append(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>`;
|
||||
currentPanelElement.innerHTML = `<h2 class="panel-heading">${milestone.workOrderMilestoneDateString}</h2>`
|
||||
|
||||
currentPanelDateString = milestone.workOrderMilestoneDateString!;
|
||||
currentPanelDateString = milestone.workOrderMilestoneDateString!
|
||||
}
|
||||
|
||||
const panelBlockElement = document.createElement("div");
|
||||
const panelBlockElement = document.createElement('div')
|
||||
|
||||
panelBlockElement.className = "panel-block is-block";
|
||||
panelBlockElement.className = 'panel-block is-block'
|
||||
|
||||
if (
|
||||
!milestone.workOrderMilestoneCompletionDate &&
|
||||
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 />'
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -102,69 +105,72 @@ declare const cityssm: cityssmGlobal;
|
|||
(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>";
|
||||
|
||||
(currentPanelElement as HTMLElement).append(panelBlockElement);
|
||||
cityssm.escapeHTML(milestone.workOrderDescription || '') +
|
||||
'</span>' +
|
||||
'</div>') +
|
||||
('<div class="column is-size-7">' + lotOccupancyHTML + '</div>') +
|
||||
'</div>'
|
||||
;(currentPanelElement as HTMLElement).append(panelBlockElement)
|
||||
}
|
||||
|
||||
milestoneCalendarContainerElement.append(currentPanelElement!);
|
||||
milestoneCalendarContainerElement.append(currentPanelElement!)
|
||||
}
|
||||
|
||||
function getMilestones(event?: Event) {
|
||||
if (event) {
|
||||
event.preventDefault();
|
||||
event.preventDefault()
|
||||
}
|
||||
|
||||
milestoneCalendarContainerElement.innerHTML = los.getLoadingParagraphHTML("Loading Milestones...");
|
||||
milestoneCalendarContainerElement.innerHTML = los.getLoadingParagraphHTML(
|
||||
'Loading Milestones...'
|
||||
)
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/workOrders/doGetWorkOrderMilestones",
|
||||
los.urlPrefix + '/workOrders/doGetWorkOrderMilestones',
|
||||
workOrderSearchFiltersFormElement,
|
||||
(responseJSON: { workOrderMilestones: recordTypes.WorkOrderMilestone[] }) => {
|
||||
renderMilestones(responseJSON.workOrderMilestones);
|
||||
(responseJSON: {
|
||||
workOrderMilestones: recordTypes.WorkOrderMilestone[]
|
||||
}) => {
|
||||
renderMilestones(responseJSON.workOrderMilestones)
|
||||
}
|
||||
);
|
||||
)
|
||||
}
|
||||
|
||||
workOrderMilestoneDateFilterElement.addEventListener("change", () => {
|
||||
workOrderMilestoneDateStringElement.closest("fieldset")!.disabled =
|
||||
workOrderMilestoneDateFilterElement.value !== "date";
|
||||
getMilestones();
|
||||
});
|
||||
workOrderMilestoneDateFilterElement.addEventListener('change', () => {
|
||||
workOrderMilestoneDateStringElement.closest('fieldset')!.disabled =
|
||||
workOrderMilestoneDateFilterElement.value !== 'date'
|
||||
getMilestones()
|
||||
})
|
||||
|
||||
los.initializeDatePickers(workOrderSearchFiltersFormElement);
|
||||
los.initializeDatePickers(workOrderSearchFiltersFormElement)
|
||||
|
||||
workOrderMilestoneDateStringElement.addEventListener("change", getMilestones);
|
||||
workOrderSearchFiltersFormElement.addEventListener("submit", getMilestones);
|
||||
workOrderMilestoneDateStringElement.addEventListener('change', getMilestones)
|
||||
workOrderSearchFiltersFormElement.addEventListener('submit', getMilestones)
|
||||
|
||||
getMilestones();
|
||||
})();
|
||||
getMilestones()
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
'#icsFilters--workOrderTypeIds'
|
||||
) as HTMLSelectElement
|
||||
|
||||
const workOrderMilestoneTypeIdsElement = document.querySelector(
|
||||
"#icsFilters--workOrderMilestoneTypeIds"
|
||||
) as HTMLSelectElement;
|
||||
'#icsFilters--workOrderMilestoneTypeIds'
|
||||
) as HTMLSelectElement
|
||||
|
||||
const calendarLinkElement = document.querySelector(
|
||||
"#icsFilters--calendarURL"
|
||||
) as HTMLTextAreaElement;
|
||||
'#icsFilters--calendarURL'
|
||||
) as HTMLTextAreaElement
|
||||
|
||||
function updateCalendarURL() {
|
||||
let url = window.location.href.slice(
|
||||
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=";
|
||||
if (
|
||||
!workOrderTypeIdsElement.disabled &&
|
||||
workOrderTypeIdsElement.selectedOptions.length > 0
|
||||
) {
|
||||
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=";
|
||||
if (
|
||||
!workOrderMilestoneTypeIdsElement.disabled &&
|
||||
workOrderMilestoneTypeIdsElement.selectedOptions.length > 0
|
||||
) {
|
||||
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);
|
||||
calendarLinkElement.value = url.slice(0, -1)
|
||||
}
|
||||
|
||||
(
|
||||
document.querySelector("#icsFilters--workOrderTypeIds-all") as HTMLInputElement
|
||||
).addEventListener("change", (changeEvent) => {
|
||||
workOrderTypeIdsElement.disabled = (changeEvent.currentTarget as HTMLInputElement).checked;
|
||||
});
|
||||
;(
|
||||
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) => {
|
||||
;(
|
||||
document.querySelector(
|
||||
'#icsFilters--workOrderMilestoneTypeIds-all'
|
||||
) as HTMLInputElement
|
||||
).addEventListener('change', (changeEvent) => {
|
||||
workOrderMilestoneTypeIdsElement.disabled = (
|
||||
changeEvent.currentTarget as HTMLInputElement
|
||||
).checked;
|
||||
});
|
||||
).checked
|
||||
})
|
||||
|
||||
const inputSelectElements = (
|
||||
document.querySelector("#panel--icsFilters") as HTMLElement
|
||||
).querySelectorAll("input, select") as NodeListOf<HTMLInputElement | HTMLSelectElement>;
|
||||
document.querySelector('#panel--icsFilters') as HTMLElement
|
||||
).querySelectorAll('input, select') as NodeListOf<
|
||||
HTMLInputElement | HTMLSelectElement
|
||||
>
|
||||
|
||||
for (const element of inputSelectElements) {
|
||||
element.addEventListener("change", updateCalendarURL);
|
||||
element.addEventListener('change', updateCalendarURL)
|
||||
}
|
||||
|
||||
updateCalendarURL();
|
||||
updateCalendarURL()
|
||||
|
||||
calendarLinkElement.addEventListener("click", () => {
|
||||
calendarLinkElement.focus();
|
||||
calendarLinkElement.select();
|
||||
});
|
||||
})();
|
||||
calendarLinkElement.addEventListener('click', () => {
|
||||
calendarLinkElement.focus()
|
||||
calendarLinkElement.select()
|
||||
})
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -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,11 +147,11 @@ 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();
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,96 +1,106 @@
|
|||
/* 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,
|
||||
(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[];
|
||||
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>";
|
||||
'</div>'
|
||||
|
||||
return;
|
||||
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>" +
|
||||
'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 +
|
||||
|
|
@ -99,7 +109,7 @@ declare const cityssm: cityssmGlobal;
|
|||
los.escapedAliases.WorkOrderOpenDate +
|
||||
'"></i> ' +
|
||||
workOrder.workOrderOpenDateString +
|
||||
"</span><br />") +
|
||||
'</span><br />') +
|
||||
('<span class="has-tooltip-left" data-tooltip="' +
|
||||
los.escapedAliases.WorkOrderCloseDate +
|
||||
'">' +
|
||||
|
|
@ -110,98 +120,111 @@ declare const cityssm: cityssmGlobal;
|
|||
? 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>";
|
||||
(workOrderPrints.length > 0 ? '<th class="has-width-1"></th>' : '') +
|
||||
'</tr></thead>' +
|
||||
'<table>'
|
||||
|
||||
searchResultsContainerElement.insertAdjacentHTML(
|
||||
"beforeend",
|
||||
los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count)
|
||||
);
|
||||
'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", previousAndGetWorkOrders);
|
||||
?.addEventListener('click', previousAndGetWorkOrders)
|
||||
|
||||
searchResultsContainerElement
|
||||
.querySelector("button[data-page='next']")
|
||||
?.addEventListener("click", nextAndGetWorkOrders);
|
||||
?.addEventListener('click', nextAndGetWorkOrders)
|
||||
}
|
||||
|
||||
function getWorkOrders() {
|
||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML("Loading Work Orders...");
|
||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(
|
||||
'Loading Work Orders...'
|
||||
)
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/workOrders/doSearchWorkOrders",
|
||||
los.urlPrefix + '/workOrders/doSearchWorkOrders',
|
||||
searchFilterFormElement,
|
||||
renderWorkOrders
|
||||
);
|
||||
)
|
||||
}
|
||||
|
||||
function resetOffsetAndGetWorkOrders() {
|
||||
offsetElement.value = "0";
|
||||
getWorkOrders();
|
||||
offsetElement.value = '0'
|
||||
getWorkOrders()
|
||||
}
|
||||
|
||||
function previousAndGetWorkOrders() {
|
||||
offsetElement.value = Math.max(Number.parseInt(offsetElement.value, 10) - limit, 0).toString();
|
||||
getWorkOrders();
|
||||
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();
|
||||
offsetElement.value = (
|
||||
Number.parseInt(offsetElement.value, 10) + limit
|
||||
).toString()
|
||||
getWorkOrders()
|
||||
}
|
||||
|
||||
const filterElements = searchFilterFormElement.querySelectorAll("input, select") as NodeListOf<
|
||||
HTMLInputElement | HTMLSelectElement
|
||||
>;
|
||||
const filterElements = searchFilterFormElement.querySelectorAll(
|
||||
'input, select'
|
||||
) as NodeListOf<HTMLInputElement | HTMLSelectElement>
|
||||
|
||||
for (const filterElement of filterElements) {
|
||||
filterElement.addEventListener("change", resetOffsetAndGetWorkOrders);
|
||||
filterElement.addEventListener('change', resetOffsetAndGetWorkOrders)
|
||||
}
|
||||
|
||||
searchFilterFormElement.addEventListener("submit", (formEvent) => {
|
||||
formEvent.preventDefault();
|
||||
resetOffsetAndGetWorkOrders();
|
||||
});
|
||||
searchFilterFormElement.addEventListener('submit', (formEvent) => {
|
||||
formEvent.preventDefault()
|
||||
resetOffsetAndGetWorkOrders()
|
||||
})
|
||||
|
||||
/*
|
||||
const workOrderOpenDateStringElement = document.querySelector("#searchFilter--workOrderOpenDateString") as HTMLInputElement;
|
||||
|
|
@ -233,5 +256,5 @@ declare const cityssm: cityssmGlobal;
|
|||
});
|
||||
*/
|
||||
|
||||
getWorkOrders();
|
||||
})();
|
||||
getWorkOrders()
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
'#button--reopenWorkOrder'
|
||||
) as HTMLButtonElement
|
||||
|
||||
if (reopenWorkOrderButtonElement) {
|
||||
const workOrderId = reopenWorkOrderButtonElement.dataset.workOrderId!;
|
||||
const workOrderId = reopenWorkOrderButtonElement.dataset.workOrderId!
|
||||
|
||||
reopenWorkOrderButtonElement.addEventListener("click", () => {
|
||||
reopenWorkOrderButtonElement.addEventListener('click', () => {
|
||||
function doReopen() {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/workOrders/doReopenWorkOrder",
|
||||
los.urlPrefix + '/workOrders/doReopenWorkOrder',
|
||||
{
|
||||
workOrderId
|
||||
},
|
||||
(responseJSON: { success: boolean; errorMessage?: string }) => {
|
||||
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",
|
||||
title: 'Reopen Work Order',
|
||||
message:
|
||||
"Are you sure you want to remove the close date from this work order and reopen it?",
|
||||
contextualColorName: "warning",
|
||||
'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
|
||||
}
|
||||
});
|
||||
});
|
||||
})
|
||||
})
|
||||
}
|
||||
})();
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 Related <span class="alias" data-alias="Lot"></span> to Work Order
|
||||
|
|
|
|||
|
|
@ -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 Related <span class="alias" data-alias="Occupancy"></span> to Work Order
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue