linting with mega linter
parent
119c325cc3
commit
a4f4b353fc
|
|
@ -20,6 +20,7 @@
|
||||||
"plugin:@typescript-eslint/recommended"
|
"plugin:@typescript-eslint/recommended"
|
||||||
],
|
],
|
||||||
"rules": {
|
"rules": {
|
||||||
|
"@typescript-eslint/no-extra-semi": "off",
|
||||||
"node/no-missing-import": "off",
|
"node/no-missing-import": "off",
|
||||||
"node/no-unpublished-import": "off",
|
"node/no-unpublished-import": "off",
|
||||||
"unicorn/consistent-function-scoping": "warn",
|
"unicorn/consistent-function-scoping": "warn",
|
||||||
|
|
@ -31,7 +32,6 @@
|
||||||
"ignore": ["DB", "URL"]
|
"ignore": ["DB", "URL"]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"unicorn/prefer-node-protocol": "off",
|
|
||||||
"unicorn/prevent-abbreviations": [
|
"unicorn/prevent-abbreviations": [
|
||||||
"error",
|
"error",
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
{
|
{
|
||||||
"trailingComma": "none",
|
"trailingComma": "none",
|
||||||
"tabWidth": 4,
|
"tabWidth": 2,
|
||||||
"semi": true,
|
"semi": false,
|
||||||
"singleQuote": false,
|
"singleQuote": true
|
||||||
"printWidth": 110
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
153
app.js
153
app.js
|
|
@ -1,44 +1,44 @@
|
||||||
import createError from "http-errors";
|
import createError from 'http-errors';
|
||||||
import express from "express";
|
import express from 'express';
|
||||||
import compression from "compression";
|
import compression from 'compression';
|
||||||
import path from "node:path";
|
import path from 'node:path';
|
||||||
import cookieParser from "cookie-parser";
|
import cookieParser from 'cookie-parser';
|
||||||
import csurf from "csurf";
|
import csurf from 'csurf';
|
||||||
import rateLimit from "express-rate-limit";
|
import rateLimit from 'express-rate-limit';
|
||||||
import session from "express-session";
|
import session from 'express-session';
|
||||||
import FileStore from "session-file-store";
|
import FileStore from 'session-file-store';
|
||||||
import * as permissionHandlers from "./handlers/permissions.js";
|
import * as permissionHandlers from './handlers/permissions.js';
|
||||||
import routerLogin from "./routes/login.js";
|
import routerLogin from './routes/login.js';
|
||||||
import routerDashboard from "./routes/dashboard.js";
|
import routerDashboard from './routes/dashboard.js';
|
||||||
import routerApi from "./routes/api.js";
|
import routerApi from './routes/api.js';
|
||||||
import routerPrint from "./routes/print.js";
|
import routerPrint from './routes/print.js';
|
||||||
import routerMaps from "./routes/maps.js";
|
import routerMaps from './routes/maps.js';
|
||||||
import routerLots from "./routes/lots.js";
|
import routerLots from './routes/lots.js';
|
||||||
import routerLotOccupancies from "./routes/lotOccupancies.js";
|
import routerLotOccupancies from './routes/lotOccupancies.js';
|
||||||
import routerWorkOrders from "./routes/workOrders.js";
|
import routerWorkOrders from './routes/workOrders.js';
|
||||||
import routerReports from "./routes/reports.js";
|
import routerReports from './routes/reports.js';
|
||||||
import routerAdmin from "./routes/admin.js";
|
import routerAdmin from './routes/admin.js';
|
||||||
import * as configFunctions from "./helpers/functions.config.js";
|
import * as configFunctions from './helpers/functions.config.js';
|
||||||
import * as printFunctions from "./helpers/functions.print.js";
|
import * as printFunctions from './helpers/functions.print.js';
|
||||||
import * as dateTimeFns from "@cityssm/expressjs-server-js/dateTimeFns.js";
|
import * as dateTimeFns from '@cityssm/expressjs-server-js/dateTimeFns.js';
|
||||||
import * as stringFns from "@cityssm/expressjs-server-js/stringFns.js";
|
import * as stringFns from '@cityssm/expressjs-server-js/stringFns.js';
|
||||||
import * as htmlFns from "@cityssm/expressjs-server-js/htmlFns.js";
|
import * as htmlFns from '@cityssm/expressjs-server-js/htmlFns.js';
|
||||||
import { version } from "./version.js";
|
import { version } from './version.js';
|
||||||
import * as databaseInitializer from "./helpers/initializer.database.js";
|
import * as databaseInitializer from './helpers/initializer.database.js';
|
||||||
import { apiGetHandler } from "./handlers/permissions.js";
|
import { apiGetHandler } from './handlers/permissions.js';
|
||||||
import { getSafeRedirectURL } from "./helpers/functions.authentication.js";
|
import { getSafeRedirectURL } from './helpers/functions.authentication.js';
|
||||||
import debug from "debug";
|
import debug from 'debug';
|
||||||
const debugApp = debug("lot-occupancy-system:app");
|
const debugApp = debug('lot-occupancy-system:app');
|
||||||
databaseInitializer.initializeDatabase();
|
databaseInitializer.initializeDatabase();
|
||||||
const __dirname = ".";
|
const __dirname = '.';
|
||||||
export const app = express();
|
export const app = express();
|
||||||
app.disable("X-Powered-By");
|
app.disable('X-Powered-By');
|
||||||
if (!configFunctions.getProperty("reverseProxy.disableEtag")) {
|
if (!configFunctions.getProperty('reverseProxy.disableEtag')) {
|
||||||
app.set("etag", false);
|
app.set('etag', false);
|
||||||
}
|
}
|
||||||
app.set("views", path.join(__dirname, "views"));
|
app.set('views', path.join(__dirname, 'views'));
|
||||||
app.set("view engine", "ejs");
|
app.set('view engine', 'ejs');
|
||||||
if (!configFunctions.getProperty("reverseProxy.disableCompression")) {
|
if (!configFunctions.getProperty('reverseProxy.disableCompression')) {
|
||||||
app.use(compression());
|
app.use(compression());
|
||||||
}
|
}
|
||||||
app.use((request, _response, next) => {
|
app.use((request, _response, next) => {
|
||||||
|
|
@ -53,38 +53,37 @@ app.use(cookieParser());
|
||||||
app.use(csurf({
|
app.use(csurf({
|
||||||
cookie: true
|
cookie: true
|
||||||
}));
|
}));
|
||||||
const limiter = rateLimit({
|
app.use(rateLimit({
|
||||||
windowMs: 1000,
|
windowMs: 10000,
|
||||||
max: 25 * Math.max(3, configFunctions.getProperty("users.canLogin").length)
|
max: 200
|
||||||
});
|
}));
|
||||||
app.use(limiter);
|
const urlPrefix = configFunctions.getProperty('reverseProxy.urlPrefix');
|
||||||
const urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix");
|
if (urlPrefix !== '') {
|
||||||
if (urlPrefix !== "") {
|
debugApp('urlPrefix = ' + urlPrefix);
|
||||||
debugApp("urlPrefix = " + urlPrefix);
|
|
||||||
}
|
}
|
||||||
app.use(urlPrefix, express.static(path.join("public")));
|
app.use(urlPrefix, express.static(path.join('public')));
|
||||||
app.use(urlPrefix + "/lib/bulma-calendar", express.static(path.join("node_modules", "bulma-calendar", "dist")));
|
app.use(urlPrefix + '/lib/bulma-calendar', express.static(path.join('node_modules', 'bulma-calendar', 'dist')));
|
||||||
app.use(urlPrefix + "/lib/cityssm-bulma-js", express.static(path.join("node_modules", "@cityssm", "bulma-js", "dist")));
|
app.use(urlPrefix + '/lib/cityssm-bulma-js', express.static(path.join('node_modules', '@cityssm', 'bulma-js', 'dist')));
|
||||||
app.use(urlPrefix + "/lib/cityssm-bulma-webapp-js", express.static(path.join("node_modules", "@cityssm", "bulma-webapp-js")));
|
app.use(urlPrefix + '/lib/cityssm-bulma-webapp-js', express.static(path.join('node_modules', '@cityssm', 'bulma-webapp-js')));
|
||||||
app.use(urlPrefix + "/lib/fa", express.static(path.join("node_modules", "@fortawesome", "fontawesome-free")));
|
app.use(urlPrefix + '/lib/fa', express.static(path.join('node_modules', '@fortawesome', 'fontawesome-free')));
|
||||||
app.use(urlPrefix + "/lib/leaflet", express.static(path.join("node_modules", "leaflet", "dist")));
|
app.use(urlPrefix + '/lib/leaflet', express.static(path.join('node_modules', 'leaflet', 'dist')));
|
||||||
app.use(urlPrefix + "/lib/randomcolor", express.static(path.join("node_modules", "randomcolor")));
|
app.use(urlPrefix + '/lib/randomcolor', express.static(path.join('node_modules', 'randomcolor')));
|
||||||
const sessionCookieName = configFunctions.getProperty("session.cookieName");
|
const sessionCookieName = configFunctions.getProperty('session.cookieName');
|
||||||
const FileStoreSession = FileStore(session);
|
const FileStoreSession = FileStore(session);
|
||||||
app.use(session({
|
app.use(session({
|
||||||
store: new FileStoreSession({
|
store: new FileStoreSession({
|
||||||
path: "./data/sessions",
|
path: './data/sessions',
|
||||||
logFn: debug("lot-occupancy-system:session"),
|
logFn: debug('lot-occupancy-system:session'),
|
||||||
retries: 20
|
retries: 20
|
||||||
}),
|
}),
|
||||||
name: sessionCookieName,
|
name: sessionCookieName,
|
||||||
secret: configFunctions.getProperty("session.secret"),
|
secret: configFunctions.getProperty('session.secret'),
|
||||||
resave: true,
|
resave: true,
|
||||||
saveUninitialized: false,
|
saveUninitialized: false,
|
||||||
rolling: true,
|
rolling: true,
|
||||||
cookie: {
|
cookie: {
|
||||||
maxAge: configFunctions.getProperty("session.maxAgeMillis"),
|
maxAge: configFunctions.getProperty('session.maxAgeMillis'),
|
||||||
sameSite: "strict"
|
sameSite: 'strict'
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
app.use((request, response, next) => {
|
app.use((request, response, next) => {
|
||||||
|
|
@ -109,38 +108,38 @@ app.use((request, response, next) => {
|
||||||
response.locals.dateTimeFunctions = dateTimeFns;
|
response.locals.dateTimeFunctions = dateTimeFns;
|
||||||
response.locals.stringFunctions = stringFns;
|
response.locals.stringFunctions = stringFns;
|
||||||
response.locals.htmlFunctions = htmlFns;
|
response.locals.htmlFunctions = htmlFns;
|
||||||
response.locals.urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix");
|
response.locals.urlPrefix = configFunctions.getProperty('reverseProxy.urlPrefix');
|
||||||
next();
|
next();
|
||||||
});
|
});
|
||||||
app.get(urlPrefix + "/", sessionChecker, (_request, response) => {
|
app.get(urlPrefix + '/', sessionChecker, (_request, response) => {
|
||||||
response.redirect(urlPrefix + "/dashboard");
|
response.redirect(urlPrefix + '/dashboard');
|
||||||
});
|
});
|
||||||
app.use(urlPrefix + "/dashboard", sessionChecker, routerDashboard);
|
app.use(urlPrefix + '/dashboard', sessionChecker, routerDashboard);
|
||||||
app.use(urlPrefix + "/api/:apiKey", apiGetHandler, routerApi);
|
app.use(urlPrefix + '/api/:apiKey', apiGetHandler, routerApi);
|
||||||
app.use(urlPrefix + "/print", sessionChecker, routerPrint);
|
app.use(urlPrefix + '/print', sessionChecker, routerPrint);
|
||||||
app.use(urlPrefix + "/maps", sessionChecker, routerMaps);
|
app.use(urlPrefix + '/maps', sessionChecker, routerMaps);
|
||||||
app.use(urlPrefix + "/lots", sessionChecker, routerLots);
|
app.use(urlPrefix + '/lots', sessionChecker, routerLots);
|
||||||
app.use(urlPrefix + "/lotOccupancies", sessionChecker, routerLotOccupancies);
|
app.use(urlPrefix + '/lotOccupancies', sessionChecker, routerLotOccupancies);
|
||||||
app.use(urlPrefix + "/workOrders", sessionChecker, routerWorkOrders);
|
app.use(urlPrefix + '/workOrders', sessionChecker, routerWorkOrders);
|
||||||
app.use(urlPrefix + "/reports", sessionChecker, routerReports);
|
app.use(urlPrefix + '/reports', sessionChecker, routerReports);
|
||||||
app.use(urlPrefix + "/admin", sessionChecker, permissionHandlers.adminGetHandler, routerAdmin);
|
app.use(urlPrefix + '/admin', sessionChecker, permissionHandlers.adminGetHandler, routerAdmin);
|
||||||
app.all(urlPrefix + "/keepAlive", (_request, response) => {
|
app.all(urlPrefix + '/keepAlive', (_request, response) => {
|
||||||
response.json(true);
|
response.json(true);
|
||||||
});
|
});
|
||||||
app.use(urlPrefix + "/login", routerLogin);
|
app.use(urlPrefix + '/login', routerLogin);
|
||||||
app.get(urlPrefix + "/logout", (request, response) => {
|
app.get(urlPrefix + '/logout', (request, response) => {
|
||||||
if (request.session.user && request.cookies[sessionCookieName]) {
|
if (request.session.user && request.cookies[sessionCookieName]) {
|
||||||
request.session.destroy(() => {
|
request.session.destroy(() => {
|
||||||
response.clearCookie(sessionCookieName);
|
response.clearCookie(sessionCookieName);
|
||||||
response.redirect(urlPrefix + "/");
|
response.redirect(urlPrefix + '/');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
response.redirect(urlPrefix + "/login");
|
response.redirect(urlPrefix + '/login');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
app.use((request, _response, next) => {
|
app.use((request, _response, next) => {
|
||||||
debugApp(request.url);
|
debugApp(request.url);
|
||||||
next(createError(404, "File not found."));
|
next(createError(404, 'File not found.'));
|
||||||
});
|
});
|
||||||
export default app;
|
export default app;
|
||||||
|
|
|
||||||
255
app.ts
255
app.ts
|
|
@ -1,189 +1,182 @@
|
||||||
import createError from "http-errors";
|
import createError from 'http-errors'
|
||||||
import express from "express";
|
import express from 'express'
|
||||||
|
|
||||||
import compression from "compression";
|
import compression from 'compression'
|
||||||
import path from "node:path";
|
import path from 'node:path'
|
||||||
import cookieParser from "cookie-parser";
|
import cookieParser from 'cookie-parser'
|
||||||
import csurf from "csurf";
|
import csurf from 'csurf'
|
||||||
import rateLimit from "express-rate-limit";
|
import rateLimit from 'express-rate-limit'
|
||||||
|
|
||||||
import session from "express-session";
|
import session from 'express-session'
|
||||||
import FileStore from "session-file-store";
|
import FileStore from 'session-file-store'
|
||||||
|
|
||||||
import * as permissionHandlers from "./handlers/permissions.js";
|
import * as permissionHandlers from './handlers/permissions.js'
|
||||||
import routerLogin from "./routes/login.js";
|
import routerLogin from './routes/login.js'
|
||||||
import routerDashboard from "./routes/dashboard.js";
|
import routerDashboard from './routes/dashboard.js'
|
||||||
import routerApi from "./routes/api.js";
|
import routerApi from './routes/api.js'
|
||||||
import routerPrint from "./routes/print.js";
|
import routerPrint from './routes/print.js'
|
||||||
import routerMaps from "./routes/maps.js";
|
import routerMaps from './routes/maps.js'
|
||||||
import routerLots from "./routes/lots.js";
|
import routerLots from './routes/lots.js'
|
||||||
import routerLotOccupancies from "./routes/lotOccupancies.js";
|
import routerLotOccupancies from './routes/lotOccupancies.js'
|
||||||
import routerWorkOrders from "./routes/workOrders.js";
|
import routerWorkOrders from './routes/workOrders.js'
|
||||||
import routerReports from "./routes/reports.js";
|
import routerReports from './routes/reports.js'
|
||||||
import routerAdmin from "./routes/admin.js";
|
import routerAdmin from './routes/admin.js'
|
||||||
|
|
||||||
import * as configFunctions from "./helpers/functions.config.js";
|
import * as configFunctions from './helpers/functions.config.js'
|
||||||
import * as printFunctions from "./helpers/functions.print.js";
|
import * as printFunctions from './helpers/functions.print.js'
|
||||||
import * as dateTimeFns from "@cityssm/expressjs-server-js/dateTimeFns.js";
|
import * as dateTimeFns from '@cityssm/expressjs-server-js/dateTimeFns.js'
|
||||||
import * as stringFns from "@cityssm/expressjs-server-js/stringFns.js";
|
import * as stringFns from '@cityssm/expressjs-server-js/stringFns.js'
|
||||||
import * as htmlFns from "@cityssm/expressjs-server-js/htmlFns.js";
|
import * as htmlFns from '@cityssm/expressjs-server-js/htmlFns.js'
|
||||||
|
|
||||||
import { version } from "./version.js";
|
import { version } from './version.js'
|
||||||
|
|
||||||
import * as databaseInitializer from "./helpers/initializer.database.js";
|
import * as databaseInitializer from './helpers/initializer.database.js'
|
||||||
|
|
||||||
import { apiGetHandler } from "./handlers/permissions.js";
|
import { apiGetHandler } from './handlers/permissions.js'
|
||||||
import { getSafeRedirectURL } from "./helpers/functions.authentication.js";
|
import { getSafeRedirectURL } from './helpers/functions.authentication.js'
|
||||||
|
|
||||||
import debug from "debug";
|
import debug from 'debug'
|
||||||
const debugApp = debug("lot-occupancy-system:app");
|
const debugApp = debug('lot-occupancy-system:app')
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* INITALIZE THE DATABASE
|
* INITIALIZE THE DATABASE
|
||||||
*/
|
*/
|
||||||
|
|
||||||
databaseInitializer.initializeDatabase();
|
databaseInitializer.initializeDatabase()
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* INITIALIZE APP
|
* INITIALIZE APP
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const __dirname = ".";
|
const __dirname = '.'
|
||||||
|
|
||||||
export const app = express();
|
export const app = express()
|
||||||
|
|
||||||
app.disable("X-Powered-By");
|
app.disable('X-Powered-By')
|
||||||
|
|
||||||
if (!configFunctions.getProperty("reverseProxy.disableEtag")) {
|
if (!configFunctions.getProperty('reverseProxy.disableEtag')) {
|
||||||
app.set("etag", false);
|
app.set('etag', false)
|
||||||
}
|
}
|
||||||
|
|
||||||
// View engine setup
|
// View engine setup
|
||||||
app.set("views", path.join(__dirname, "views"));
|
app.set('views', path.join(__dirname, 'views'))
|
||||||
app.set("view engine", "ejs");
|
app.set('view engine', 'ejs')
|
||||||
|
|
||||||
if (!configFunctions.getProperty("reverseProxy.disableCompression")) {
|
if (!configFunctions.getProperty('reverseProxy.disableCompression')) {
|
||||||
app.use(compression());
|
app.use(compression())
|
||||||
}
|
}
|
||||||
|
|
||||||
app.use((request, _response, next) => {
|
app.use((request, _response, next) => {
|
||||||
debugApp(`${request.method} ${request.url}`);
|
debugApp(`${request.method} ${request.url}`)
|
||||||
next();
|
next()
|
||||||
});
|
})
|
||||||
|
|
||||||
app.use(express.json());
|
app.use(express.json())
|
||||||
|
|
||||||
app.use(
|
app.use(
|
||||||
express.urlencoded({
|
express.urlencoded({
|
||||||
extended: false
|
extended: false
|
||||||
})
|
})
|
||||||
);
|
)
|
||||||
|
|
||||||
app.use(cookieParser());
|
app.use(cookieParser())
|
||||||
app.use(
|
app.use(
|
||||||
csurf({
|
csurf({
|
||||||
cookie: true
|
cookie: true
|
||||||
})
|
})
|
||||||
);
|
)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Rate Limiter
|
* Rate Limiter
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const limiter = rateLimit({
|
app.use(
|
||||||
windowMs: 1000,
|
rateLimit({
|
||||||
max: 25 * Math.max(3, configFunctions.getProperty("users.canLogin").length)
|
windowMs: 10_000,
|
||||||
});
|
max: 200
|
||||||
|
})
|
||||||
app.use(limiter);
|
)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* STATIC ROUTES
|
* STATIC ROUTES
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix");
|
const urlPrefix = configFunctions.getProperty('reverseProxy.urlPrefix')
|
||||||
|
|
||||||
if (urlPrefix !== "") {
|
if (urlPrefix !== '') {
|
||||||
debugApp("urlPrefix = " + urlPrefix);
|
debugApp('urlPrefix = ' + urlPrefix)
|
||||||
}
|
}
|
||||||
|
|
||||||
app.use(urlPrefix, express.static(path.join("public")));
|
app.use(urlPrefix, express.static(path.join('public')))
|
||||||
|
|
||||||
app.use(
|
app.use(
|
||||||
urlPrefix + "/lib/bulma-calendar",
|
urlPrefix + '/lib/bulma-calendar',
|
||||||
express.static(path.join("node_modules", "bulma-calendar", "dist"))
|
express.static(path.join('node_modules', 'bulma-calendar', 'dist'))
|
||||||
);
|
)
|
||||||
|
|
||||||
app.use(
|
app.use(
|
||||||
urlPrefix + "/lib/cityssm-bulma-js",
|
urlPrefix + '/lib/cityssm-bulma-js',
|
||||||
express.static(path.join("node_modules", "@cityssm", "bulma-js", "dist"))
|
express.static(path.join('node_modules', '@cityssm', 'bulma-js', 'dist'))
|
||||||
);
|
)
|
||||||
|
|
||||||
app.use(
|
app.use(
|
||||||
urlPrefix + "/lib/cityssm-bulma-webapp-js",
|
urlPrefix + '/lib/cityssm-bulma-webapp-js',
|
||||||
express.static(path.join("node_modules", "@cityssm", "bulma-webapp-js"))
|
express.static(path.join('node_modules', '@cityssm', 'bulma-webapp-js'))
|
||||||
);
|
)
|
||||||
|
|
||||||
app.use(
|
app.use(urlPrefix + '/lib/fa', express.static(path.join('node_modules', '@fortawesome', 'fontawesome-free')))
|
||||||
urlPrefix + "/lib/fa",
|
|
||||||
express.static(path.join("node_modules", "@fortawesome", "fontawesome-free"))
|
|
||||||
);
|
|
||||||
|
|
||||||
app.use(urlPrefix + "/lib/leaflet", express.static(path.join("node_modules", "leaflet", "dist")));
|
app.use(urlPrefix + '/lib/leaflet', express.static(path.join('node_modules', 'leaflet', 'dist')))
|
||||||
|
|
||||||
app.use(urlPrefix + "/lib/randomcolor", express.static(path.join("node_modules", "randomcolor")));
|
app.use(urlPrefix + '/lib/randomcolor', express.static(path.join('node_modules', 'randomcolor')))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SESSION MANAGEMENT
|
* SESSION MANAGEMENT
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const sessionCookieName: string = configFunctions.getProperty("session.cookieName");
|
const sessionCookieName: string = configFunctions.getProperty('session.cookieName')
|
||||||
|
|
||||||
const FileStoreSession = FileStore(session);
|
const FileStoreSession = FileStore(session)
|
||||||
|
|
||||||
// Initialize session
|
// Initialize session
|
||||||
app.use(
|
app.use(
|
||||||
session({
|
session({
|
||||||
store: new FileStoreSession({
|
store: new FileStoreSession({
|
||||||
path: "./data/sessions",
|
path: './data/sessions',
|
||||||
logFn: debug("lot-occupancy-system:session"),
|
logFn: debug('lot-occupancy-system:session'),
|
||||||
retries: 20
|
retries: 20
|
||||||
}),
|
}),
|
||||||
name: sessionCookieName,
|
name: sessionCookieName,
|
||||||
secret: configFunctions.getProperty("session.secret"),
|
secret: configFunctions.getProperty('session.secret'),
|
||||||
resave: true,
|
resave: true,
|
||||||
saveUninitialized: false,
|
saveUninitialized: false,
|
||||||
rolling: true,
|
rolling: true,
|
||||||
cookie: {
|
cookie: {
|
||||||
maxAge: configFunctions.getProperty("session.maxAgeMillis"),
|
maxAge: configFunctions.getProperty('session.maxAgeMillis'),
|
||||||
sameSite: "strict"
|
sameSite: 'strict'
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
);
|
)
|
||||||
|
|
||||||
// Clear cookie if no corresponding session
|
// Clear cookie if no corresponding session
|
||||||
app.use((request, response, next) => {
|
app.use((request, response, next) => {
|
||||||
if (request.cookies[sessionCookieName] && !request.session.user) {
|
if (request.cookies[sessionCookieName] && !request.session.user) {
|
||||||
response.clearCookie(sessionCookieName);
|
response.clearCookie(sessionCookieName)
|
||||||
}
|
}
|
||||||
|
|
||||||
next();
|
next()
|
||||||
});
|
})
|
||||||
|
|
||||||
// Redirect logged in users
|
// Redirect logged in users
|
||||||
const sessionChecker = (
|
const sessionChecker = (request: express.Request, response: express.Response, next: express.NextFunction) => {
|
||||||
request: express.Request,
|
|
||||||
response: express.Response,
|
|
||||||
next: express.NextFunction
|
|
||||||
) => {
|
|
||||||
if (request.session.user && request.cookies[sessionCookieName]) {
|
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
|
* ROUTES
|
||||||
|
|
@ -192,60 +185,60 @@ const sessionChecker = (
|
||||||
// Make the user and config objects available to the templates
|
// Make the user and config objects available to the templates
|
||||||
|
|
||||||
app.use((request, response, next) => {
|
app.use((request, response, next) => {
|
||||||
response.locals.buildNumber = version;
|
response.locals.buildNumber = version
|
||||||
|
|
||||||
response.locals.user = request.session.user;
|
response.locals.user = request.session.user
|
||||||
response.locals.csrfToken = request.csrfToken();
|
response.locals.csrfToken = request.csrfToken()
|
||||||
|
|
||||||
response.locals.configFunctions = configFunctions;
|
response.locals.configFunctions = configFunctions
|
||||||
response.locals.printFunctions = printFunctions;
|
response.locals.printFunctions = printFunctions
|
||||||
response.locals.dateTimeFunctions = dateTimeFns;
|
response.locals.dateTimeFunctions = dateTimeFns
|
||||||
response.locals.stringFunctions = stringFns;
|
response.locals.stringFunctions = stringFns
|
||||||
response.locals.htmlFunctions = htmlFns;
|
response.locals.htmlFunctions = htmlFns
|
||||||
|
|
||||||
response.locals.urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix");
|
response.locals.urlPrefix = configFunctions.getProperty('reverseProxy.urlPrefix')
|
||||||
|
|
||||||
next();
|
next()
|
||||||
});
|
})
|
||||||
|
|
||||||
app.get(urlPrefix + "/", sessionChecker, (_request, response) => {
|
app.get(urlPrefix + '/', sessionChecker, (_request, response) => {
|
||||||
response.redirect(urlPrefix + "/dashboard");
|
response.redirect(urlPrefix + '/dashboard')
|
||||||
});
|
})
|
||||||
|
|
||||||
app.use(urlPrefix + "/dashboard", sessionChecker, routerDashboard);
|
app.use(urlPrefix + '/dashboard', sessionChecker, routerDashboard)
|
||||||
|
|
||||||
app.use(urlPrefix + "/api/:apiKey", apiGetHandler, routerApi);
|
app.use(urlPrefix + '/api/:apiKey', apiGetHandler, routerApi)
|
||||||
|
|
||||||
app.use(urlPrefix + "/print", sessionChecker, routerPrint);
|
app.use(urlPrefix + '/print', sessionChecker, routerPrint)
|
||||||
app.use(urlPrefix + "/maps", sessionChecker, routerMaps);
|
app.use(urlPrefix + '/maps', sessionChecker, routerMaps)
|
||||||
app.use(urlPrefix + "/lots", sessionChecker, routerLots);
|
app.use(urlPrefix + '/lots', sessionChecker, routerLots)
|
||||||
app.use(urlPrefix + "/lotOccupancies", sessionChecker, routerLotOccupancies);
|
app.use(urlPrefix + '/lotOccupancies', sessionChecker, routerLotOccupancies)
|
||||||
app.use(urlPrefix + "/workOrders", sessionChecker, routerWorkOrders);
|
app.use(urlPrefix + '/workOrders', sessionChecker, routerWorkOrders)
|
||||||
|
|
||||||
app.use(urlPrefix + "/reports", sessionChecker, routerReports);
|
app.use(urlPrefix + '/reports', sessionChecker, routerReports)
|
||||||
app.use(urlPrefix + "/admin", sessionChecker, permissionHandlers.adminGetHandler, routerAdmin);
|
app.use(urlPrefix + '/admin', sessionChecker, permissionHandlers.adminGetHandler, routerAdmin)
|
||||||
|
|
||||||
app.all(urlPrefix + "/keepAlive", (_request, response) => {
|
app.all(urlPrefix + '/keepAlive', (_request, response) => {
|
||||||
response.json(true);
|
response.json(true)
|
||||||
});
|
})
|
||||||
|
|
||||||
app.use(urlPrefix + "/login", routerLogin);
|
app.use(urlPrefix + '/login', routerLogin)
|
||||||
|
|
||||||
app.get(urlPrefix + "/logout", (request, response) => {
|
app.get(urlPrefix + '/logout', (request, response) => {
|
||||||
if (request.session.user && request.cookies[sessionCookieName]) {
|
if (request.session.user && request.cookies[sessionCookieName]) {
|
||||||
request.session.destroy(() => {
|
request.session.destroy(() => {
|
||||||
response.clearCookie(sessionCookieName);
|
response.clearCookie(sessionCookieName)
|
||||||
response.redirect(urlPrefix + "/");
|
response.redirect(urlPrefix + '/')
|
||||||
});
|
})
|
||||||
} else {
|
} else {
|
||||||
response.redirect(urlPrefix + "/login");
|
response.redirect(urlPrefix + '/login')
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
|
|
||||||
// Catch 404 and forward to error handler
|
// Catch 404 and forward to error handler
|
||||||
app.use((request, _response, next) => {
|
app.use((request, _response, next) => {
|
||||||
debugApp(request.url);
|
debugApp(request.url)
|
||||||
next(createError(404, "File not found."));
|
next(createError(404, 'File not found.'))
|
||||||
});
|
})
|
||||||
|
|
||||||
export default app;
|
export default app
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
import { defineConfig } from "cypress";
|
import { defineConfig } from 'cypress';
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
e2e: {
|
e2e: {
|
||||||
baseUrl: "http://localhost:7000",
|
baseUrl: 'http://localhost:7000',
|
||||||
specPattern: "cypress/e2e/**/*.cy.ts",
|
specPattern: 'cypress/e2e/**/*.cy.ts',
|
||||||
supportFile: false,
|
supportFile: false,
|
||||||
projectId: "xya1fn"
|
projectId: 'xya1fn'
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
import { defineConfig } from "cypress";
|
import { defineConfig } from 'cypress'
|
||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
e2e: {
|
e2e: {
|
||||||
baseUrl: "http://localhost:7000",
|
baseUrl: 'http://localhost:7000',
|
||||||
specPattern: "cypress/e2e/**/*.cy.ts",
|
specPattern: 'cypress/e2e/**/*.cy.ts',
|
||||||
supportFile: false,
|
supportFile: false,
|
||||||
projectId: "xya1fn"
|
projectId: 'xya1fn'
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,6 @@
|
||||||
"feeCategory": "Cypress Test - Fee Category",
|
"feeCategory": "Cypress Test - Fee Category",
|
||||||
"feeName": "Cypress Test - Fee Name",
|
"feeName": "Cypress Test - Fee Name",
|
||||||
"feeDescription": "Test Description",
|
"feeDescription": "Test Description",
|
||||||
"feeAmount": 10.50,
|
"feeAmount": 10.5,
|
||||||
"quantityUnit": "units"
|
"quantityUnit": "units"
|
||||||
}
|
}
|
||||||
62
gulpfile.js
62
gulpfile.js
|
|
@ -1,59 +1,59 @@
|
||||||
import gulp from "gulp";
|
import gulp from 'gulp';
|
||||||
import changed from "gulp-changed";
|
import changed from 'gulp-changed';
|
||||||
import minify from "gulp-minify";
|
import minify from 'gulp-minify';
|
||||||
import include from "gulp-include";
|
import include from 'gulp-include';
|
||||||
import dartSass from "sass";
|
import dartSass from 'sass';
|
||||||
import gulpSass from "gulp-sass";
|
import gulpSass from 'gulp-sass';
|
||||||
const sass = gulpSass(dartSass);
|
const sass = gulpSass(dartSass);
|
||||||
const publicSCSSDestination = "public/stylesheets";
|
const publicSCSSDestination = 'public/stylesheets';
|
||||||
const publicSCSSFunction = () => {
|
const publicSCSSFunction = () => {
|
||||||
return gulp
|
return gulp
|
||||||
.src("public-scss/*.scss")
|
.src('public-scss/*.scss')
|
||||||
.pipe(sass({ outputStyle: "compressed", includePaths: ["node_modules"] }).on("error", sass.logError))
|
.pipe(sass({ outputStyle: 'compressed', includePaths: ['node_modules'] }).on('error', sass.logError))
|
||||||
.pipe(gulp.dest(publicSCSSDestination));
|
.pipe(gulp.dest(publicSCSSDestination));
|
||||||
};
|
};
|
||||||
gulp.task("public-scss", publicSCSSFunction);
|
gulp.task('public-scss', publicSCSSFunction);
|
||||||
const publicJavascriptsDestination = "public/javascripts";
|
const publicJavascriptsDestination = 'public/javascripts';
|
||||||
const publicJavascriptsMinFunction = () => {
|
const publicJavascriptsMinFunction = () => {
|
||||||
return gulp
|
return gulp
|
||||||
.src("public-typescript/*.js", { allowEmpty: true })
|
.src('public-typescript/*.js', { allowEmpty: true })
|
||||||
.pipe(changed(publicJavascriptsDestination, {
|
.pipe(changed(publicJavascriptsDestination, {
|
||||||
extension: ".min.js"
|
extension: '.min.js'
|
||||||
}))
|
}))
|
||||||
.pipe(minify({ noSource: true, ext: { min: ".min.js" } }))
|
.pipe(minify({ noSource: true, ext: { min: '.min.js' } }))
|
||||||
.pipe(gulp.dest(publicJavascriptsDestination));
|
.pipe(gulp.dest(publicJavascriptsDestination));
|
||||||
};
|
};
|
||||||
const publicJavascriptsAdminTablesFunction = () => {
|
const publicJavascriptsAdminTablesFunction = () => {
|
||||||
return gulp
|
return gulp
|
||||||
.src("public-typescript/adminTables/adminTables.js")
|
.src('public-typescript/adminTables/adminTables.js')
|
||||||
.pipe(include())
|
.pipe(include())
|
||||||
.pipe(gulp.dest("public-typescript"));
|
.pipe(gulp.dest('public-typescript'));
|
||||||
};
|
};
|
||||||
const publicJavascriptsLotOccupancyEditFunction = () => {
|
const publicJavascriptsLotOccupancyEditFunction = () => {
|
||||||
return gulp
|
return gulp
|
||||||
.src("public-typescript/lotOccupancyEdit/lotOccupancyEdit.js")
|
.src('public-typescript/lotOccupancyEdit/lotOccupancyEdit.js')
|
||||||
.pipe(include())
|
.pipe(include())
|
||||||
.pipe(gulp.dest("public-typescript"));
|
.pipe(gulp.dest('public-typescript'));
|
||||||
};
|
};
|
||||||
const publicJavascriptsWorkOrderEditFunction = () => {
|
const publicJavascriptsWorkOrderEditFunction = () => {
|
||||||
return gulp
|
return gulp
|
||||||
.src("public-typescript/workOrderEdit/workOrderEdit.js")
|
.src('public-typescript/workOrderEdit/workOrderEdit.js')
|
||||||
.pipe(include())
|
.pipe(include())
|
||||||
.pipe(gulp.dest("public-typescript"));
|
.pipe(gulp.dest('public-typescript'));
|
||||||
};
|
};
|
||||||
gulp.task("public-javascript-adminTables", publicJavascriptsAdminTablesFunction);
|
gulp.task('public-javascript-adminTables', publicJavascriptsAdminTablesFunction);
|
||||||
gulp.task("public-javascript-lotOccupancyEdit", publicJavascriptsLotOccupancyEditFunction);
|
gulp.task('public-javascript-lotOccupancyEdit', publicJavascriptsLotOccupancyEditFunction);
|
||||||
gulp.task("public-javascript-workOrderEdit", publicJavascriptsWorkOrderEditFunction);
|
gulp.task('public-javascript-workOrderEdit', publicJavascriptsWorkOrderEditFunction);
|
||||||
gulp.task("public-javascript-min", publicJavascriptsMinFunction);
|
gulp.task('public-javascript-min', publicJavascriptsMinFunction);
|
||||||
const watchFunction = () => {
|
const watchFunction = () => {
|
||||||
gulp.watch("public-scss/*.scss", publicSCSSFunction);
|
gulp.watch('public-scss/*.scss', publicSCSSFunction);
|
||||||
gulp.watch("public-typescript/adminTables/*.js", publicJavascriptsAdminTablesFunction);
|
gulp.watch('public-typescript/adminTables/*.js', publicJavascriptsAdminTablesFunction);
|
||||||
gulp.watch("public-typescript/lotOccupancyEdit/*.js", publicJavascriptsLotOccupancyEditFunction);
|
gulp.watch('public-typescript/lotOccupancyEdit/*.js', publicJavascriptsLotOccupancyEditFunction);
|
||||||
gulp.watch("public-typescript/workOrderEdit/*.js", publicJavascriptsWorkOrderEditFunction);
|
gulp.watch('public-typescript/workOrderEdit/*.js', publicJavascriptsWorkOrderEditFunction);
|
||||||
gulp.watch("public-typescript/*.js", publicJavascriptsMinFunction);
|
gulp.watch('public-typescript/*.js', publicJavascriptsMinFunction);
|
||||||
};
|
};
|
||||||
gulp.task("watch", watchFunction);
|
gulp.task('watch', watchFunction);
|
||||||
gulp.task("default", () => {
|
gulp.task('default', () => {
|
||||||
publicJavascriptsAdminTablesFunction();
|
publicJavascriptsAdminTablesFunction();
|
||||||
publicJavascriptsLotOccupancyEditFunction();
|
publicJavascriptsLotOccupancyEditFunction();
|
||||||
publicJavascriptsWorkOrderEditFunction();
|
publicJavascriptsWorkOrderEditFunction();
|
||||||
|
|
|
||||||
102
gulpfile.ts
102
gulpfile.ts
|
|
@ -1,110 +1,102 @@
|
||||||
/* eslint-disable node/no-unpublished-import */
|
/* eslint-disable node/no-unpublished-import */
|
||||||
|
|
||||||
import gulp from "gulp";
|
import gulp from 'gulp'
|
||||||
import changed from "gulp-changed";
|
import changed from 'gulp-changed'
|
||||||
import minify from "gulp-minify";
|
import minify from 'gulp-minify'
|
||||||
import include from "gulp-include";
|
import include from 'gulp-include'
|
||||||
|
|
||||||
import dartSass from "sass";
|
import dartSass from 'sass'
|
||||||
import gulpSass from "gulp-sass";
|
import gulpSass from 'gulp-sass'
|
||||||
const sass = gulpSass(dartSass);
|
const sass = gulpSass(dartSass)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Compile SASS
|
* Compile SASS
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const publicSCSSDestination = "public/stylesheets";
|
const publicSCSSDestination = 'public/stylesheets'
|
||||||
|
|
||||||
const publicSCSSFunction = () => {
|
const publicSCSSFunction = () => {
|
||||||
return gulp
|
return gulp
|
||||||
.src("public-scss/*.scss")
|
.src('public-scss/*.scss')
|
||||||
.pipe(
|
.pipe(sass({ outputStyle: 'compressed', includePaths: ['node_modules'] }).on('error', sass.logError))
|
||||||
sass({ outputStyle: "compressed", includePaths: ["node_modules"] }).on(
|
.pipe(gulp.dest(publicSCSSDestination))
|
||||||
"error",
|
}
|
||||||
sass.logError
|
|
||||||
)
|
|
||||||
)
|
|
||||||
.pipe(gulp.dest(publicSCSSDestination));
|
|
||||||
};
|
|
||||||
|
|
||||||
gulp.task("public-scss", publicSCSSFunction);
|
gulp.task('public-scss', publicSCSSFunction)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Minify public/javascripts
|
* Minify public/javascripts
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const publicJavascriptsDestination = "public/javascripts";
|
const publicJavascriptsDestination = 'public/javascripts'
|
||||||
|
|
||||||
const publicJavascriptsMinFunction = () => {
|
const publicJavascriptsMinFunction = () => {
|
||||||
return gulp
|
return gulp
|
||||||
.src("public-typescript/*.js", { allowEmpty: true })
|
.src('public-typescript/*.js', { allowEmpty: true })
|
||||||
.pipe(
|
.pipe(
|
||||||
changed(publicJavascriptsDestination, {
|
changed(publicJavascriptsDestination, {
|
||||||
extension: ".min.js"
|
extension: '.min.js'
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
.pipe(minify({ noSource: true, ext: { min: ".min.js" } }))
|
.pipe(minify({ noSource: true, ext: { min: '.min.js' } }))
|
||||||
.pipe(gulp.dest(publicJavascriptsDestination));
|
.pipe(gulp.dest(publicJavascriptsDestination))
|
||||||
};
|
}
|
||||||
|
|
||||||
const publicJavascriptsAdminTablesFunction = () => {
|
const publicJavascriptsAdminTablesFunction = () => {
|
||||||
return gulp
|
return gulp
|
||||||
.src("public-typescript/adminTables/adminTables.js")
|
.src('public-typescript/adminTables/adminTables.js')
|
||||||
.pipe(include())
|
.pipe(include())
|
||||||
.pipe(gulp.dest("public-typescript"));
|
.pipe(gulp.dest('public-typescript'))
|
||||||
};
|
}
|
||||||
|
|
||||||
const publicJavascriptsLotOccupancyEditFunction = () => {
|
const publicJavascriptsLotOccupancyEditFunction = () => {
|
||||||
return gulp
|
return gulp
|
||||||
.src("public-typescript/lotOccupancyEdit/lotOccupancyEdit.js")
|
.src('public-typescript/lotOccupancyEdit/lotOccupancyEdit.js')
|
||||||
.pipe(include())
|
.pipe(include())
|
||||||
.pipe(gulp.dest("public-typescript"));
|
.pipe(gulp.dest('public-typescript'))
|
||||||
};
|
}
|
||||||
|
|
||||||
const publicJavascriptsWorkOrderEditFunction = () => {
|
const publicJavascriptsWorkOrderEditFunction = () => {
|
||||||
return gulp
|
return gulp
|
||||||
.src("public-typescript/workOrderEdit/workOrderEdit.js")
|
.src('public-typescript/workOrderEdit/workOrderEdit.js')
|
||||||
.pipe(include())
|
.pipe(include())
|
||||||
.pipe(gulp.dest("public-typescript"));
|
.pipe(gulp.dest('public-typescript'))
|
||||||
};
|
}
|
||||||
|
|
||||||
gulp.task("public-javascript-adminTables", publicJavascriptsAdminTablesFunction);
|
gulp.task('public-javascript-adminTables', publicJavascriptsAdminTablesFunction)
|
||||||
gulp.task("public-javascript-lotOccupancyEdit", publicJavascriptsLotOccupancyEditFunction);
|
gulp.task('public-javascript-lotOccupancyEdit', publicJavascriptsLotOccupancyEditFunction)
|
||||||
gulp.task("public-javascript-workOrderEdit", publicJavascriptsWorkOrderEditFunction);
|
gulp.task('public-javascript-workOrderEdit', publicJavascriptsWorkOrderEditFunction)
|
||||||
gulp.task("public-javascript-min", publicJavascriptsMinFunction);
|
gulp.task('public-javascript-min', publicJavascriptsMinFunction)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Watch
|
* Watch
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const watchFunction = () => {
|
const watchFunction = () => {
|
||||||
gulp.watch("public-scss/*.scss", publicSCSSFunction);
|
gulp.watch('public-scss/*.scss', publicSCSSFunction)
|
||||||
|
|
||||||
gulp.watch("public-typescript/adminTables/*.js", publicJavascriptsAdminTablesFunction);
|
gulp.watch('public-typescript/adminTables/*.js', publicJavascriptsAdminTablesFunction)
|
||||||
|
|
||||||
gulp.watch(
|
gulp.watch('public-typescript/lotOccupancyEdit/*.js', publicJavascriptsLotOccupancyEditFunction)
|
||||||
"public-typescript/lotOccupancyEdit/*.js",
|
|
||||||
publicJavascriptsLotOccupancyEditFunction
|
|
||||||
);
|
|
||||||
|
|
||||||
gulp.watch("public-typescript/workOrderEdit/*.js", publicJavascriptsWorkOrderEditFunction);
|
gulp.watch('public-typescript/workOrderEdit/*.js', publicJavascriptsWorkOrderEditFunction)
|
||||||
|
|
||||||
gulp.watch("public-typescript/*.js", publicJavascriptsMinFunction);
|
gulp.watch('public-typescript/*.js', publicJavascriptsMinFunction)
|
||||||
};
|
}
|
||||||
|
|
||||||
gulp.task("watch", watchFunction);
|
gulp.task('watch', watchFunction)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize default
|
* Initialize default
|
||||||
*/
|
*/
|
||||||
|
|
||||||
gulp.task("default", () => {
|
gulp.task('default', () => {
|
||||||
publicJavascriptsAdminTablesFunction();
|
publicJavascriptsAdminTablesFunction()
|
||||||
publicJavascriptsLotOccupancyEditFunction();
|
publicJavascriptsLotOccupancyEditFunction()
|
||||||
publicJavascriptsWorkOrderEditFunction();
|
publicJavascriptsWorkOrderEditFunction()
|
||||||
publicJavascriptsMinFunction();
|
publicJavascriptsMinFunction()
|
||||||
|
|
||||||
publicSCSSFunction();
|
publicSCSSFunction()
|
||||||
|
|
||||||
watchFunction();
|
watchFunction()
|
||||||
});
|
})
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
import type { RequestHandler } from "express";
|
import type { RequestHandler } from 'express';
|
||||||
export declare const handler: RequestHandler;
|
export declare const handler: RequestHandler;
|
||||||
export default handler;
|
export default handler;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { getLots } from "../../helpers/lotOccupancyDB/getLots.js";
|
import { getLots } from '../../helpers/lotOccupancyDB/getLots.js';
|
||||||
export const handler = async (request, response) => {
|
export const handler = async (request, response) => {
|
||||||
const result = getLots(request.body, {
|
const result = getLots(request.body, {
|
||||||
limit: request.body.limit,
|
limit: request.body.limit,
|
||||||
|
|
|
||||||
|
|
@ -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) => {
|
export const handler: RequestHandler = async (request, response) => {
|
||||||
const result = getLots(request.body, {
|
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";
|
import { getWorkOrderMilestones } from "../../helpers/lotOccupancyDB/getWorkOrderMilestones.js";
|
||||||
export const handler = async (request, response) => {
|
export const handler = async (request, response) => {
|
||||||
const success = completeWorkOrderMilestone({
|
const success = completeWorkOrderMilestone({
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import type { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
import { completeWorkOrderMilestone } from "../../helpers/lotOccupancyDB/completeWorkOrderMiletstone.js";
|
import { completeWorkOrderMilestone } from "../../helpers/lotOccupancyDB/completeWorkOrderMilestone.js";
|
||||||
|
|
||||||
import { getWorkOrderMilestones } from "../../helpers/lotOccupancyDB/getWorkOrderMilestones.js";
|
import { getWorkOrderMilestones } from "../../helpers/lotOccupancyDB/getWorkOrderMilestones.js";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -68,6 +68,7 @@ export function getLots(filters, options, connectedDatabase) {
|
||||||
let lots = [];
|
let lots = [];
|
||||||
if (options.limit === -1 || count > 0) {
|
if (options.limit === -1 || count > 0) {
|
||||||
database.function("userFn_lotNameSortName", configFunctions.getProperty("settings.lot.lotNameSortNameFunction"));
|
database.function("userFn_lotNameSortName", configFunctions.getProperty("settings.lot.lotNameSortNameFunction"));
|
||||||
|
sqlParameters.unshift(currentDate, currentDate);
|
||||||
lots = database
|
lots = database
|
||||||
.prepare("select l.lotId, l.lotName," +
|
.prepare("select l.lotId, l.lotName," +
|
||||||
" t.lotType," +
|
" t.lotType," +
|
||||||
|
|
@ -82,16 +83,13 @@ export function getLots(filters, options, connectedDatabase) {
|
||||||
"select lotId, count(lotOccupancyId) as lotOccupancyCount" +
|
"select lotId, count(lotOccupancyId) as lotOccupancyCount" +
|
||||||
" from LotOccupancies" +
|
" from LotOccupancies" +
|
||||||
" where recordDelete_timeMillis is null" +
|
" where recordDelete_timeMillis is null" +
|
||||||
" and occupancyStartDate <= " +
|
" and occupancyStartDate <= ?" +
|
||||||
currentDate +
|
" and (occupancyEndDate is null or occupancyEndDate >= ?)" +
|
||||||
" and (occupancyEndDate is null or occupancyEndDate >= " +
|
|
||||||
currentDate +
|
|
||||||
")" +
|
|
||||||
" group by lotId" +
|
" group by lotId" +
|
||||||
") o on l.lotId = o.lotId") +
|
") o on l.lotId = o.lotId") +
|
||||||
sqlWhereClause +
|
sqlWhereClause +
|
||||||
" order by userFn_lotNameSortName(l.lotName), l.lotId" +
|
" order by userFn_lotNameSortName(l.lotName), l.lotId" +
|
||||||
(options ? " limit " + options.limit + " offset " + options.offset : ""))
|
(options ? ` limit ${options.limit} offset ${options.offset}` : ""))
|
||||||
.all(sqlParameters);
|
.all(sqlParameters);
|
||||||
if (options.limit === -1) {
|
if (options.limit === -1) {
|
||||||
count = lots.length;
|
count = lots.length;
|
||||||
|
|
|
||||||
|
|
@ -119,6 +119,8 @@ export function getLots(
|
||||||
configFunctions.getProperty("settings.lot.lotNameSortNameFunction")
|
configFunctions.getProperty("settings.lot.lotNameSortNameFunction")
|
||||||
);
|
);
|
||||||
|
|
||||||
|
sqlParameters.unshift(currentDate, currentDate);
|
||||||
|
|
||||||
lots = database
|
lots = database
|
||||||
.prepare(
|
.prepare(
|
||||||
"select l.lotId, l.lotName," +
|
"select l.lotId, l.lotName," +
|
||||||
|
|
@ -134,16 +136,13 @@ export function getLots(
|
||||||
"select lotId, count(lotOccupancyId) as lotOccupancyCount" +
|
"select lotId, count(lotOccupancyId) as lotOccupancyCount" +
|
||||||
" from LotOccupancies" +
|
" from LotOccupancies" +
|
||||||
" where recordDelete_timeMillis is null" +
|
" where recordDelete_timeMillis is null" +
|
||||||
" and occupancyStartDate <= " +
|
" and occupancyStartDate <= ?" +
|
||||||
currentDate +
|
" and (occupancyEndDate is null or occupancyEndDate >= ?)" +
|
||||||
" and (occupancyEndDate is null or occupancyEndDate >= " +
|
|
||||||
currentDate +
|
|
||||||
")" +
|
|
||||||
" group by lotId" +
|
" group by lotId" +
|
||||||
") o on l.lotId = o.lotId") +
|
") o on l.lotId = o.lotId") +
|
||||||
sqlWhereClause +
|
sqlWhereClause +
|
||||||
" order by userFn_lotNameSortName(l.lotName), l.lotId" +
|
" order by userFn_lotNameSortName(l.lotName), l.lotId" +
|
||||||
(options ? " limit " + options.limit + " offset " + options.offset : "")
|
(options ? ` limit ${options.limit} offset ${options.offset}` : "")
|
||||||
)
|
)
|
||||||
.all(sqlParameters);
|
.all(sqlParameters);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -90,9 +90,7 @@ export function getWorkOrders(filters, options, connectedDatabase) {
|
||||||
.all(sqlParameters);
|
.all(sqlParameters);
|
||||||
}
|
}
|
||||||
if (options &&
|
if (options &&
|
||||||
(options.includeComments ||
|
(options.includeComments || options.includeLotsAndLotOccupancies || options.includeMilestones)) {
|
||||||
options.includeLotsAndLotOccupancies ||
|
|
||||||
options.includeMilestones)) {
|
|
||||||
for (const workOrder of workOrders) {
|
for (const workOrder of workOrders) {
|
||||||
if (options.includeComments) {
|
if (options.includeComments) {
|
||||||
workOrder.workOrderComments = getWorkOrderComments(workOrder.workOrderId, database);
|
workOrder.workOrderComments = getWorkOrderComments(workOrder.workOrderId, database);
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,7 @@ import sqlite from "better-sqlite3";
|
||||||
|
|
||||||
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
|
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
|
||||||
|
|
||||||
import {
|
import { dateIntegerToString, dateStringToInteger } from "@cityssm/expressjs-server-js/dateTimeFns.js";
|
||||||
dateIntegerToString,
|
|
||||||
dateStringToInteger
|
|
||||||
} from "@cityssm/expressjs-server-js/dateTimeFns.js";
|
|
||||||
|
|
||||||
import { getWorkOrderComments } from "./getWorkOrderComments.js";
|
import { getWorkOrderComments } from "./getWorkOrderComments.js";
|
||||||
import { getLots } from "./getLots.js";
|
import { getLots } from "./getLots.js";
|
||||||
|
|
@ -143,16 +140,11 @@ export function getWorkOrders(
|
||||||
|
|
||||||
if (
|
if (
|
||||||
options &&
|
options &&
|
||||||
(options.includeComments ||
|
(options.includeComments || options.includeLotsAndLotOccupancies || options.includeMilestones)
|
||||||
options.includeLotsAndLotOccupancies ||
|
|
||||||
options.includeMilestones)
|
|
||||||
) {
|
) {
|
||||||
for (const workOrder of workOrders) {
|
for (const workOrder of workOrders) {
|
||||||
if (options.includeComments) {
|
if (options.includeComments) {
|
||||||
workOrder.workOrderComments = getWorkOrderComments(
|
workOrder.workOrderComments = getWorkOrderComments(workOrder.workOrderId as number, database);
|
||||||
workOrder.workOrderId as number,
|
|
||||||
database
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options.includeLotsAndLotOccupancies) {
|
if (options.includeLotsAndLotOccupancies) {
|
||||||
|
|
|
||||||
|
|
@ -67,8 +67,8 @@
|
||||||
"@types/randomcolor": "^0.5.7",
|
"@types/randomcolor": "^0.5.7",
|
||||||
"@types/session-file-store": "^1.2.2",
|
"@types/session-file-store": "^1.2.2",
|
||||||
"@types/uuid": "^9.0.0",
|
"@types/uuid": "^9.0.0",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.48.0",
|
"@typescript-eslint/eslint-plugin": "^5.48.1",
|
||||||
"@typescript-eslint/parser": "^5.48.0",
|
"@typescript-eslint/parser": "^5.48.1",
|
||||||
"bulma": "^0.9.4",
|
"bulma": "^0.9.4",
|
||||||
"bulma-divider": "^0.2.0",
|
"bulma-divider": "^0.2.0",
|
||||||
"bulma-helpers": "^0.4.3",
|
"bulma-helpers": "^0.4.3",
|
||||||
|
|
@ -1376,14 +1376,14 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/eslint-plugin": {
|
"node_modules/@typescript-eslint/eslint-plugin": {
|
||||||
"version": "5.48.0",
|
"version": "5.48.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.1.tgz",
|
||||||
"integrity": "sha512-SVLafp0NXpoJY7ut6VFVUU9I+YeFsDzeQwtK0WZ+xbRN3mtxJ08je+6Oi2N89qDn087COdO0u3blKZNv9VetRQ==",
|
"integrity": "sha512-9nY5K1Rp2ppmpb9s9S2aBiF3xo5uExCehMDmYmmFqqyxgenbHJ3qbarcLt4ITgaD6r/2ypdlcFRdcuVPnks+fQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/scope-manager": "5.48.0",
|
"@typescript-eslint/scope-manager": "5.48.1",
|
||||||
"@typescript-eslint/type-utils": "5.48.0",
|
"@typescript-eslint/type-utils": "5.48.1",
|
||||||
"@typescript-eslint/utils": "5.48.0",
|
"@typescript-eslint/utils": "5.48.1",
|
||||||
"debug": "^4.3.4",
|
"debug": "^4.3.4",
|
||||||
"ignore": "^5.2.0",
|
"ignore": "^5.2.0",
|
||||||
"natural-compare-lite": "^1.4.0",
|
"natural-compare-lite": "^1.4.0",
|
||||||
|
|
@ -1409,14 +1409,14 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/parser": {
|
"node_modules/@typescript-eslint/parser": {
|
||||||
"version": "5.48.0",
|
"version": "5.48.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.48.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.48.1.tgz",
|
||||||
"integrity": "sha512-1mxNA8qfgxX8kBvRDIHEzrRGrKHQfQlbW6iHyfHYS0Q4X1af+S6mkLNtgCOsGVl8+/LUPrqdHMssAemkrQ01qg==",
|
"integrity": "sha512-4yg+FJR/V1M9Xoq56SF9Iygqm+r5LMXvheo6DQ7/yUWynQ4YfCRnsKuRgqH4EQ5Ya76rVwlEpw4Xu+TgWQUcdA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/scope-manager": "5.48.0",
|
"@typescript-eslint/scope-manager": "5.48.1",
|
||||||
"@typescript-eslint/types": "5.48.0",
|
"@typescript-eslint/types": "5.48.1",
|
||||||
"@typescript-eslint/typescript-estree": "5.48.0",
|
"@typescript-eslint/typescript-estree": "5.48.1",
|
||||||
"debug": "^4.3.4"
|
"debug": "^4.3.4"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
|
|
@ -1436,13 +1436,13 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/scope-manager": {
|
"node_modules/@typescript-eslint/scope-manager": {
|
||||||
"version": "5.48.0",
|
"version": "5.48.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.1.tgz",
|
||||||
"integrity": "sha512-0AA4LviDtVtZqlyUQnZMVHydDATpD9SAX/RC5qh6cBd3xmyWvmXYF+WT1oOmxkeMnWDlUVTwdODeucUnjz3gow==",
|
"integrity": "sha512-S035ueRrbxRMKvSTv9vJKIWgr86BD8s3RqoRZmsSh/s8HhIs90g6UlK8ZabUSjUZQkhVxt7nmZ63VJ9dcZhtDQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/types": "5.48.0",
|
"@typescript-eslint/types": "5.48.1",
|
||||||
"@typescript-eslint/visitor-keys": "5.48.0"
|
"@typescript-eslint/visitor-keys": "5.48.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||||
|
|
@ -1453,13 +1453,13 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/type-utils": {
|
"node_modules/@typescript-eslint/type-utils": {
|
||||||
"version": "5.48.0",
|
"version": "5.48.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.1.tgz",
|
||||||
"integrity": "sha512-vbtPO5sJyFjtHkGlGK4Sthmta0Bbls4Onv0bEqOGm7hP9h8UpRsHJwsrCiWtCUndTRNQO/qe6Ijz9rnT/DB+7g==",
|
"integrity": "sha512-Hyr8HU8Alcuva1ppmqSYtM/Gp0q4JOp1F+/JH5D1IZm/bUBrV0edoewQZiEc1r6I8L4JL21broddxK8HAcZiqQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/typescript-estree": "5.48.0",
|
"@typescript-eslint/typescript-estree": "5.48.1",
|
||||||
"@typescript-eslint/utils": "5.48.0",
|
"@typescript-eslint/utils": "5.48.1",
|
||||||
"debug": "^4.3.4",
|
"debug": "^4.3.4",
|
||||||
"tsutils": "^3.21.0"
|
"tsutils": "^3.21.0"
|
||||||
},
|
},
|
||||||
|
|
@ -1480,9 +1480,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/types": {
|
"node_modules/@typescript-eslint/types": {
|
||||||
"version": "5.48.0",
|
"version": "5.48.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.1.tgz",
|
||||||
"integrity": "sha512-UTe67B0Ypius0fnEE518NB2N8gGutIlTojeTg4nt0GQvikReVkurqxd2LvYa9q9M5MQ6rtpNyWTBxdscw40Xhw==",
|
"integrity": "sha512-xHyDLU6MSuEEdIlzrrAerCGS3T7AA/L8Hggd0RCYBi0w3JMvGYxlLlXHeg50JI9Tfg5MrtsfuNxbS/3zF1/ATg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||||
|
|
@ -1493,13 +1493,13 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/typescript-estree": {
|
"node_modules/@typescript-eslint/typescript-estree": {
|
||||||
"version": "5.48.0",
|
"version": "5.48.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.1.tgz",
|
||||||
"integrity": "sha512-7pjd94vvIjI1zTz6aq/5wwE/YrfIyEPLtGJmRfyNR9NYIW+rOvzzUv3Cmq2hRKpvt6e9vpvPUQ7puzX7VSmsEw==",
|
"integrity": "sha512-Hut+Osk5FYr+sgFh8J/FHjqX6HFcDzTlWLrFqGoK5kVUN3VBHF/QzZmAsIXCQ8T/W9nQNBTqalxi1P3LSqWnRA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/types": "5.48.0",
|
"@typescript-eslint/types": "5.48.1",
|
||||||
"@typescript-eslint/visitor-keys": "5.48.0",
|
"@typescript-eslint/visitor-keys": "5.48.1",
|
||||||
"debug": "^4.3.4",
|
"debug": "^4.3.4",
|
||||||
"globby": "^11.1.0",
|
"globby": "^11.1.0",
|
||||||
"is-glob": "^4.0.3",
|
"is-glob": "^4.0.3",
|
||||||
|
|
@ -1520,16 +1520,16 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/utils": {
|
"node_modules/@typescript-eslint/utils": {
|
||||||
"version": "5.48.0",
|
"version": "5.48.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.1.tgz",
|
||||||
"integrity": "sha512-x2jrMcPaMfsHRRIkL+x96++xdzvrdBCnYRd5QiW5Wgo1OB4kDYPbC1XjWP/TNqlfK93K/lUL92erq5zPLgFScQ==",
|
"integrity": "sha512-SmQuSrCGUOdmGMwivW14Z0Lj8dxG1mOFZ7soeJ0TQZEJcs3n5Ndgkg0A4bcMFzBELqLJ6GTHnEU+iIoaD6hFGA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/json-schema": "^7.0.9",
|
"@types/json-schema": "^7.0.9",
|
||||||
"@types/semver": "^7.3.12",
|
"@types/semver": "^7.3.12",
|
||||||
"@typescript-eslint/scope-manager": "5.48.0",
|
"@typescript-eslint/scope-manager": "5.48.1",
|
||||||
"@typescript-eslint/types": "5.48.0",
|
"@typescript-eslint/types": "5.48.1",
|
||||||
"@typescript-eslint/typescript-estree": "5.48.0",
|
"@typescript-eslint/typescript-estree": "5.48.1",
|
||||||
"eslint-scope": "^5.1.1",
|
"eslint-scope": "^5.1.1",
|
||||||
"eslint-utils": "^3.0.0",
|
"eslint-utils": "^3.0.0",
|
||||||
"semver": "^7.3.7"
|
"semver": "^7.3.7"
|
||||||
|
|
@ -1546,12 +1546,12 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/visitor-keys": {
|
"node_modules/@typescript-eslint/visitor-keys": {
|
||||||
"version": "5.48.0",
|
"version": "5.48.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.1.tgz",
|
||||||
"integrity": "sha512-5motVPz5EgxQ0bHjut3chzBkJ3Z3sheYVcSwS5BpHZpLqSptSmELNtGixmgj65+rIfhvtQTz5i9OP2vtzdDH7Q==",
|
"integrity": "sha512-Ns0XBwmfuX7ZknznfXozgnydyR8F6ev/KEGePP4i74uL3ArsKbEhJ7raeKr1JSa997DBDwol/4a0Y+At82c9dA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/types": "5.48.0",
|
"@typescript-eslint/types": "5.48.1",
|
||||||
"eslint-visitor-keys": "^3.3.0"
|
"eslint-visitor-keys": "^3.3.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
|
|
@ -13709,14 +13709,14 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@typescript-eslint/eslint-plugin": {
|
"@typescript-eslint/eslint-plugin": {
|
||||||
"version": "5.48.0",
|
"version": "5.48.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.1.tgz",
|
||||||
"integrity": "sha512-SVLafp0NXpoJY7ut6VFVUU9I+YeFsDzeQwtK0WZ+xbRN3mtxJ08je+6Oi2N89qDn087COdO0u3blKZNv9VetRQ==",
|
"integrity": "sha512-9nY5K1Rp2ppmpb9s9S2aBiF3xo5uExCehMDmYmmFqqyxgenbHJ3qbarcLt4ITgaD6r/2ypdlcFRdcuVPnks+fQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@typescript-eslint/scope-manager": "5.48.0",
|
"@typescript-eslint/scope-manager": "5.48.1",
|
||||||
"@typescript-eslint/type-utils": "5.48.0",
|
"@typescript-eslint/type-utils": "5.48.1",
|
||||||
"@typescript-eslint/utils": "5.48.0",
|
"@typescript-eslint/utils": "5.48.1",
|
||||||
"debug": "^4.3.4",
|
"debug": "^4.3.4",
|
||||||
"ignore": "^5.2.0",
|
"ignore": "^5.2.0",
|
||||||
"natural-compare-lite": "^1.4.0",
|
"natural-compare-lite": "^1.4.0",
|
||||||
|
|
@ -13726,53 +13726,53 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@typescript-eslint/parser": {
|
"@typescript-eslint/parser": {
|
||||||
"version": "5.48.0",
|
"version": "5.48.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.48.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.48.1.tgz",
|
||||||
"integrity": "sha512-1mxNA8qfgxX8kBvRDIHEzrRGrKHQfQlbW6iHyfHYS0Q4X1af+S6mkLNtgCOsGVl8+/LUPrqdHMssAemkrQ01qg==",
|
"integrity": "sha512-4yg+FJR/V1M9Xoq56SF9Iygqm+r5LMXvheo6DQ7/yUWynQ4YfCRnsKuRgqH4EQ5Ya76rVwlEpw4Xu+TgWQUcdA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@typescript-eslint/scope-manager": "5.48.0",
|
"@typescript-eslint/scope-manager": "5.48.1",
|
||||||
"@typescript-eslint/types": "5.48.0",
|
"@typescript-eslint/types": "5.48.1",
|
||||||
"@typescript-eslint/typescript-estree": "5.48.0",
|
"@typescript-eslint/typescript-estree": "5.48.1",
|
||||||
"debug": "^4.3.4"
|
"debug": "^4.3.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@typescript-eslint/scope-manager": {
|
"@typescript-eslint/scope-manager": {
|
||||||
"version": "5.48.0",
|
"version": "5.48.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.1.tgz",
|
||||||
"integrity": "sha512-0AA4LviDtVtZqlyUQnZMVHydDATpD9SAX/RC5qh6cBd3xmyWvmXYF+WT1oOmxkeMnWDlUVTwdODeucUnjz3gow==",
|
"integrity": "sha512-S035ueRrbxRMKvSTv9vJKIWgr86BD8s3RqoRZmsSh/s8HhIs90g6UlK8ZabUSjUZQkhVxt7nmZ63VJ9dcZhtDQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@typescript-eslint/types": "5.48.0",
|
"@typescript-eslint/types": "5.48.1",
|
||||||
"@typescript-eslint/visitor-keys": "5.48.0"
|
"@typescript-eslint/visitor-keys": "5.48.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@typescript-eslint/type-utils": {
|
"@typescript-eslint/type-utils": {
|
||||||
"version": "5.48.0",
|
"version": "5.48.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.1.tgz",
|
||||||
"integrity": "sha512-vbtPO5sJyFjtHkGlGK4Sthmta0Bbls4Onv0bEqOGm7hP9h8UpRsHJwsrCiWtCUndTRNQO/qe6Ijz9rnT/DB+7g==",
|
"integrity": "sha512-Hyr8HU8Alcuva1ppmqSYtM/Gp0q4JOp1F+/JH5D1IZm/bUBrV0edoewQZiEc1r6I8L4JL21broddxK8HAcZiqQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@typescript-eslint/typescript-estree": "5.48.0",
|
"@typescript-eslint/typescript-estree": "5.48.1",
|
||||||
"@typescript-eslint/utils": "5.48.0",
|
"@typescript-eslint/utils": "5.48.1",
|
||||||
"debug": "^4.3.4",
|
"debug": "^4.3.4",
|
||||||
"tsutils": "^3.21.0"
|
"tsutils": "^3.21.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@typescript-eslint/types": {
|
"@typescript-eslint/types": {
|
||||||
"version": "5.48.0",
|
"version": "5.48.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.1.tgz",
|
||||||
"integrity": "sha512-UTe67B0Ypius0fnEE518NB2N8gGutIlTojeTg4nt0GQvikReVkurqxd2LvYa9q9M5MQ6rtpNyWTBxdscw40Xhw==",
|
"integrity": "sha512-xHyDLU6MSuEEdIlzrrAerCGS3T7AA/L8Hggd0RCYBi0w3JMvGYxlLlXHeg50JI9Tfg5MrtsfuNxbS/3zF1/ATg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@typescript-eslint/typescript-estree": {
|
"@typescript-eslint/typescript-estree": {
|
||||||
"version": "5.48.0",
|
"version": "5.48.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.1.tgz",
|
||||||
"integrity": "sha512-7pjd94vvIjI1zTz6aq/5wwE/YrfIyEPLtGJmRfyNR9NYIW+rOvzzUv3Cmq2hRKpvt6e9vpvPUQ7puzX7VSmsEw==",
|
"integrity": "sha512-Hut+Osk5FYr+sgFh8J/FHjqX6HFcDzTlWLrFqGoK5kVUN3VBHF/QzZmAsIXCQ8T/W9nQNBTqalxi1P3LSqWnRA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@typescript-eslint/types": "5.48.0",
|
"@typescript-eslint/types": "5.48.1",
|
||||||
"@typescript-eslint/visitor-keys": "5.48.0",
|
"@typescript-eslint/visitor-keys": "5.48.1",
|
||||||
"debug": "^4.3.4",
|
"debug": "^4.3.4",
|
||||||
"globby": "^11.1.0",
|
"globby": "^11.1.0",
|
||||||
"is-glob": "^4.0.3",
|
"is-glob": "^4.0.3",
|
||||||
|
|
@ -13781,28 +13781,28 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@typescript-eslint/utils": {
|
"@typescript-eslint/utils": {
|
||||||
"version": "5.48.0",
|
"version": "5.48.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.1.tgz",
|
||||||
"integrity": "sha512-x2jrMcPaMfsHRRIkL+x96++xdzvrdBCnYRd5QiW5Wgo1OB4kDYPbC1XjWP/TNqlfK93K/lUL92erq5zPLgFScQ==",
|
"integrity": "sha512-SmQuSrCGUOdmGMwivW14Z0Lj8dxG1mOFZ7soeJ0TQZEJcs3n5Ndgkg0A4bcMFzBELqLJ6GTHnEU+iIoaD6hFGA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@types/json-schema": "^7.0.9",
|
"@types/json-schema": "^7.0.9",
|
||||||
"@types/semver": "^7.3.12",
|
"@types/semver": "^7.3.12",
|
||||||
"@typescript-eslint/scope-manager": "5.48.0",
|
"@typescript-eslint/scope-manager": "5.48.1",
|
||||||
"@typescript-eslint/types": "5.48.0",
|
"@typescript-eslint/types": "5.48.1",
|
||||||
"@typescript-eslint/typescript-estree": "5.48.0",
|
"@typescript-eslint/typescript-estree": "5.48.1",
|
||||||
"eslint-scope": "^5.1.1",
|
"eslint-scope": "^5.1.1",
|
||||||
"eslint-utils": "^3.0.0",
|
"eslint-utils": "^3.0.0",
|
||||||
"semver": "^7.3.7"
|
"semver": "^7.3.7"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@typescript-eslint/visitor-keys": {
|
"@typescript-eslint/visitor-keys": {
|
||||||
"version": "5.48.0",
|
"version": "5.48.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.1.tgz",
|
||||||
"integrity": "sha512-5motVPz5EgxQ0bHjut3chzBkJ3Z3sheYVcSwS5BpHZpLqSptSmELNtGixmgj65+rIfhvtQTz5i9OP2vtzdDH7Q==",
|
"integrity": "sha512-Ns0XBwmfuX7ZknznfXozgnydyR8F6ev/KEGePP4i74uL3ArsKbEhJ7raeKr1JSa997DBDwol/4a0Y+At82c9dA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@typescript-eslint/types": "5.48.0",
|
"@typescript-eslint/types": "5.48.1",
|
||||||
"eslint-visitor-keys": "^3.3.0"
|
"eslint-visitor-keys": "^3.3.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -91,8 +91,8 @@
|
||||||
"@types/randomcolor": "^0.5.7",
|
"@types/randomcolor": "^0.5.7",
|
||||||
"@types/session-file-store": "^1.2.2",
|
"@types/session-file-store": "^1.2.2",
|
||||||
"@types/uuid": "^9.0.0",
|
"@types/uuid": "^9.0.0",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.48.0",
|
"@typescript-eslint/eslint-plugin": "^5.48.1",
|
||||||
"@typescript-eslint/parser": "^5.48.0",
|
"@typescript-eslint/parser": "^5.48.1",
|
||||||
"bulma": "^0.9.4",
|
"bulma": "^0.9.4",
|
||||||
"bulma-divider": "^0.2.0",
|
"bulma-divider": "^0.2.0",
|
||||||
"bulma-helpers": "^0.4.3",
|
"bulma-helpers": "^0.4.3",
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,10 @@ $black: #000;
|
||||||
width: 10px;
|
width: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.has-width-900 {
|
||||||
|
width: 900px;
|
||||||
|
}
|
||||||
|
|
||||||
.has-min-page-height {
|
.has-min-page-height {
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,30 +4,32 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
(() => {
|
(() => {
|
||||||
const los = exports.los;
|
const los = exports.los;
|
||||||
const doCleanup = () => {
|
const doCleanup = () => {
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doCleanupDatabase", {}, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doCleanupDatabase', {}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Database Cleaned Up Successfully",
|
title: 'Database Cleaned Up Successfully',
|
||||||
message: `${responseJSON.inactivedRecordCount} records inactivated,
|
message: `${responseJSON.inactivedRecordCount} records inactivated,
|
||||||
${responseJSON.purgedRecordCount} permanently deleted.`,
|
${responseJSON.purgedRecordCount} permanently deleted.`,
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Cleaning Database",
|
title: 'Error Cleaning Database',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
document.querySelector("#button--cleanupDatabase").addEventListener("click", () => {
|
document
|
||||||
|
.querySelector('#button--cleanupDatabase')
|
||||||
|
.addEventListener('click', () => {
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Cleanup Database",
|
title: 'Cleanup Database',
|
||||||
message: "Are you sure you want to cleanup up the database?",
|
message: 'Are you sure you want to cleanup up the database?',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Cleanup Database",
|
text: 'Yes, Cleanup Database',
|
||||||
callbackFunction: doCleanup
|
callbackFunction: doCleanup
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,53 +1,55 @@
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||||
|
|
||||||
import type * as globalTypes from "../types/globalTypes";
|
import type * as globalTypes from '../types/globalTypes'
|
||||||
|
|
||||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||||
|
|
||||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal
|
||||||
declare const bulmaJS: BulmaJS;
|
declare const bulmaJS: BulmaJS
|
||||||
|
|
||||||
(() => {
|
;(() => {
|
||||||
const los = exports.los as globalTypes.LOS;
|
const los = exports.los as globalTypes.LOS
|
||||||
|
|
||||||
const doCleanup = () => {
|
const doCleanup = () => {
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/admin/doCleanupDatabase",
|
los.urlPrefix + '/admin/doCleanupDatabase',
|
||||||
{},
|
{},
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
inactivedRecordCount: number;
|
inactivedRecordCount: number
|
||||||
purgedRecordCount: number;
|
purgedRecordCount: number
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Database Cleaned Up Successfully",
|
title: 'Database Cleaned Up Successfully',
|
||||||
message: `${responseJSON.inactivedRecordCount} records inactivated,
|
message: `${responseJSON.inactivedRecordCount} records inactivated,
|
||||||
${responseJSON.purgedRecordCount} permanently deleted.`,
|
${responseJSON.purgedRecordCount} permanently deleted.`,
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
})
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Cleaning Database",
|
title: 'Error Cleaning Database',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
document.querySelector("#button--cleanupDatabase")!.addEventListener("click", () => {
|
document
|
||||||
|
.querySelector('#button--cleanupDatabase')!
|
||||||
|
.addEventListener('click', () => {
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Cleanup Database",
|
title: 'Cleanup Database',
|
||||||
message: "Are you sure you want to cleanup up the database?",
|
message: 'Are you sure you want to cleanup up the database?',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Cleanup Database",
|
text: 'Yes, Cleanup Database',
|
||||||
callbackFunction: doCleanup
|
callbackFunction: doCleanup
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
})();
|
})()
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
(() => {
|
(() => {
|
||||||
const los = exports.los;
|
const los = exports.los;
|
||||||
const feeCategoriesContainerElement = document.querySelector("#container--feeCategories");
|
const feeCategoriesContainerElement = document.querySelector('#container--feeCategories');
|
||||||
let feeCategories = exports.feeCategories;
|
let feeCategories = exports.feeCategories;
|
||||||
delete exports.feeCategories;
|
delete exports.feeCategories;
|
||||||
function renderFeeCategories() {
|
function renderFeeCategories() {
|
||||||
|
|
@ -13,152 +13,164 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
</div>`;
|
</div>`;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
feeCategoriesContainerElement.innerHTML = "";
|
feeCategoriesContainerElement.innerHTML = '';
|
||||||
for (const feeCategory of feeCategories) {
|
for (const feeCategory of feeCategories) {
|
||||||
const feeCategoryContainerElement = document.createElement("section");
|
const feeCategoryContainerElement = document.createElement('section');
|
||||||
feeCategoryContainerElement.className = "panel container--feeCategory";
|
feeCategoryContainerElement.className = 'panel container--feeCategory';
|
||||||
feeCategoryContainerElement.dataset.feeCategoryId = feeCategory.feeCategoryId.toString();
|
feeCategoryContainerElement.dataset.feeCategoryId =
|
||||||
|
feeCategory.feeCategoryId.toString();
|
||||||
feeCategoryContainerElement.innerHTML =
|
feeCategoryContainerElement.innerHTML =
|
||||||
'<div class="panel-heading">' +
|
'<div class="panel-heading">' +
|
||||||
'<div class="columns">' +
|
'<div class="columns">' +
|
||||||
('<div class="column">' +
|
('<div class="column">' +
|
||||||
'<h2 class="title is-4">' +
|
'<h2 class="title is-4">' +
|
||||||
cityssm.escapeHTML(feeCategory.feeCategory || "") +
|
cityssm.escapeHTML(feeCategory.feeCategory || '') +
|
||||||
"</h2>" +
|
'</h2>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="column is-narrow">' +
|
('<div class="column is-narrow">' +
|
||||||
'<div class="field is-grouped is-justify-content-end">' +
|
'<div class="field is-grouped is-justify-content-end">' +
|
||||||
(feeCategory.fees.length === 0
|
(feeCategory.fees.length === 0
|
||||||
? '<div class="control">' +
|
? '<div class="control">' +
|
||||||
'<button class="button is-small is-danger button--deleteFeeCategory" type="button">' +
|
'<button class="button is-small is-danger button--deleteFeeCategory" type="button">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-trash" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-trash" aria-hidden="true"></i></span>' +
|
||||||
"<span>Delete Category</span>" +
|
'<span>Delete Category</span>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>"
|
'</div>'
|
||||||
: "") +
|
: '') +
|
||||||
('<div class="control">' +
|
('<div class="control">' +
|
||||||
'<button class="button is-small is-primary button--editFeeCategory" type="button">' +
|
'<button class="button is-small is-primary button--editFeeCategory" type="button">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||||
"<span>Edit Category</span>" +
|
'<span>Edit Category</span>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="control">' +
|
('<div class="control">' +
|
||||||
'<button class="button is-small is-success button--addFee" data-cy="addFee" type="button">' +
|
'<button class="button is-small is-success button--addFee" data-cy="addFee" type="button">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>' +
|
||||||
"<span>Add Fee</span>" +
|
'<span>Add Fee</span>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="control">' +
|
('<div class="control">' +
|
||||||
los.getMoveUpDownButtonFieldHTML("button--moveFeeCategoryUp", "button--moveFeeCategoryDown") +
|
los.getMoveUpDownButtonFieldHTML('button--moveFeeCategoryUp', 'button--moveFeeCategoryDown') +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>";
|
'</div>';
|
||||||
if (feeCategory.fees.length === 0) {
|
if (feeCategory.fees.length === 0) {
|
||||||
feeCategoryContainerElement.insertAdjacentHTML("beforeend", `<div class="panel-block is-block">
|
feeCategoryContainerElement.insertAdjacentHTML('beforeend', `<div class="panel-block is-block">
|
||||||
<div class="message is-info">
|
<div class="message is-info">
|
||||||
<p class="message-body">
|
<p class="message-body">
|
||||||
There are no fees in the
|
There are no fees in the
|
||||||
"${cityssm.escapeHTML(feeCategory.feeCategory || "")}"
|
"${cityssm.escapeHTML(feeCategory.feeCategory || '')}"
|
||||||
category.
|
category.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>`);
|
</div>`);
|
||||||
feeCategoryContainerElement
|
feeCategoryContainerElement
|
||||||
.querySelector(".button--deleteFeeCategory")
|
.querySelector('.button--deleteFeeCategory')
|
||||||
.addEventListener("click", confirmDeleteFeeCategory);
|
.addEventListener('click', confirmDeleteFeeCategory);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for (const fee of feeCategory.fees) {
|
for (const fee of feeCategory.fees) {
|
||||||
const panelBlockElement = document.createElement("div");
|
const panelBlockElement = document.createElement('div');
|
||||||
panelBlockElement.className = "panel-block is-block container--fee";
|
panelBlockElement.className = 'panel-block is-block container--fee';
|
||||||
panelBlockElement.dataset.feeId = fee.feeId.toString();
|
panelBlockElement.dataset.feeId = fee.feeId.toString();
|
||||||
const hasTagsBlock = fee.isRequired || fee.occupancyTypeId || fee.lotTypeId;
|
const hasTagsBlock = fee.isRequired || fee.occupancyTypeId || fee.lotTypeId;
|
||||||
panelBlockElement.innerHTML =
|
panelBlockElement.innerHTML =
|
||||||
'<div class="columns">' +
|
'<div class="columns">' +
|
||||||
('<div class="column is-half">' +
|
('<div class="column is-half">' +
|
||||||
"<p>" +
|
'<p>' +
|
||||||
'<a class="has-text-weight-bold" href="#">' +
|
'<a class="has-text-weight-bold" href="#">' +
|
||||||
cityssm.escapeHTML(fee.feeName || "") +
|
cityssm.escapeHTML(fee.feeName || '') +
|
||||||
"</a><br />" +
|
'</a><br />' +
|
||||||
"<small>" +
|
'<small>' +
|
||||||
cityssm.escapeHTML(fee.feeDescription || "").replace(/\n/g, "<br />") +
|
cityssm
|
||||||
"</small>" +
|
.escapeHTML(fee.feeDescription || '')
|
||||||
"</p>" +
|
.replace(/\n/g, '<br />') +
|
||||||
|
'</small>' +
|
||||||
|
'</p>' +
|
||||||
(hasTagsBlock
|
(hasTagsBlock
|
||||||
? '<p class="tags">' +
|
? '<p class="tags">' +
|
||||||
(fee.isRequired ? '<span class="tag is-warning">Required</span>' : "") +
|
(fee.isRequired
|
||||||
|
? '<span class="tag is-warning">Required</span>'
|
||||||
|
: '') +
|
||||||
(fee.occupancyTypeId
|
(fee.occupancyTypeId
|
||||||
? ' <span class="tag has-tooltip-bottom" data-tooltip="' +
|
? ' <span class="tag has-tooltip-bottom" data-tooltip="' +
|
||||||
los.escapedAliases.Occupancy +
|
los.escapedAliases.Occupancy +
|
||||||
' Type Filter">' +
|
' Type Filter">' +
|
||||||
cityssm.escapeHTML(fee.occupancyType || "") +
|
cityssm.escapeHTML(fee.occupancyType || '') +
|
||||||
"</span>"
|
'</span>'
|
||||||
: "") +
|
: '') +
|
||||||
(fee.lotTypeId
|
(fee.lotTypeId
|
||||||
? ' <span class="tag has-tooltip-bottom" data-tooltip="' +
|
? ' <span class="tag has-tooltip-bottom" data-tooltip="' +
|
||||||
los.escapedAliases.Lot +
|
los.escapedAliases.Lot +
|
||||||
' Type Filter">' +
|
' Type Filter">' +
|
||||||
cityssm.escapeHTML(fee.lotType || "") +
|
cityssm.escapeHTML(fee.lotType || '') +
|
||||||
"</span>"
|
'</span>'
|
||||||
: "") +
|
: '') +
|
||||||
"</p>"
|
'</p>'
|
||||||
: "") +
|
: '') +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="column">' +
|
('<div class="column">' +
|
||||||
'<div class="columns is-mobile">' +
|
'<div class="columns is-mobile">' +
|
||||||
('<div class="column has-text-centered">' +
|
('<div class="column has-text-centered">' +
|
||||||
(fee.feeFunction
|
(fee.feeFunction
|
||||||
? cityssm.escapeHTML(fee.feeFunction) +
|
? cityssm.escapeHTML(fee.feeFunction) +
|
||||||
"<br />" +
|
'<br />' +
|
||||||
"<small>Fee Function</small>"
|
'<small>Fee Function</small>'
|
||||||
: "$" + fee.feeAmount.toFixed(2) + "<br />" + "<small>Fee</small>") +
|
: '$' +
|
||||||
"</div>") +
|
fee.feeAmount.toFixed(2) +
|
||||||
|
'<br />' +
|
||||||
|
'<small>Fee</small>') +
|
||||||
|
'</div>') +
|
||||||
('<div class="column has-text-centered">' +
|
('<div class="column has-text-centered">' +
|
||||||
(fee.taxPercentage
|
(fee.taxPercentage
|
||||||
? fee.taxPercentage + "%"
|
? fee.taxPercentage + '%'
|
||||||
: "$" + fee.taxAmount.toFixed(2)) +
|
: '$' + fee.taxAmount.toFixed(2)) +
|
||||||
"<br /><small>Tax</small>" +
|
'<br /><small>Tax</small>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="column has-text-centered">' +
|
('<div class="column has-text-centered">' +
|
||||||
(fee.includeQuantity
|
(fee.includeQuantity
|
||||||
? cityssm.escapeHTML(fee.quantityUnit || "") +
|
? cityssm.escapeHTML(fee.quantityUnit || '') +
|
||||||
"<br />" +
|
'<br />' +
|
||||||
"<small>Quantity</small>"
|
'<small>Quantity</small>'
|
||||||
: "") +
|
: '') +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="column is-narrow">' +
|
('<div class="column is-narrow">' +
|
||||||
los.getMoveUpDownButtonFieldHTML("button--moveFeeUp", "button--moveFeeDown") +
|
los.getMoveUpDownButtonFieldHTML('button--moveFeeUp', 'button--moveFeeDown') +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>";
|
'</div>';
|
||||||
panelBlockElement.querySelector("a").addEventListener("click", openEditFee);
|
panelBlockElement
|
||||||
panelBlockElement.querySelector(".button--moveFeeUp").addEventListener("click", moveFee);
|
.querySelector('a')
|
||||||
panelBlockElement.querySelector(".button--moveFeeDown").addEventListener("click", moveFee);
|
.addEventListener('click', openEditFee);
|
||||||
|
panelBlockElement.querySelector('.button--moveFeeUp').addEventListener('click', moveFee);
|
||||||
|
panelBlockElement.querySelector('.button--moveFeeDown').addEventListener('click', moveFee);
|
||||||
feeCategoryContainerElement.append(panelBlockElement);
|
feeCategoryContainerElement.append(panelBlockElement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
feeCategoryContainerElement
|
feeCategoryContainerElement
|
||||||
.querySelector(".button--editFeeCategory")
|
.querySelector('.button--editFeeCategory')
|
||||||
.addEventListener("click", openEditFeeCategory);
|
.addEventListener('click', openEditFeeCategory);
|
||||||
feeCategoryContainerElement
|
feeCategoryContainerElement
|
||||||
.querySelector(".button--addFee")
|
.querySelector('.button--addFee')
|
||||||
.addEventListener("click", openAddFee);
|
.addEventListener('click', openAddFee);
|
||||||
feeCategoryContainerElement.querySelector(".button--moveFeeCategoryUp").addEventListener("click", moveFeeCategory);
|
feeCategoryContainerElement.querySelector('.button--moveFeeCategoryUp').addEventListener('click', moveFeeCategory);
|
||||||
feeCategoryContainerElement.querySelector(".button--moveFeeCategoryDown").addEventListener("click", moveFeeCategory);
|
feeCategoryContainerElement.querySelector('.button--moveFeeCategoryDown').addEventListener('click', moveFeeCategory);
|
||||||
feeCategoriesContainerElement.append(feeCategoryContainerElement);
|
feeCategoriesContainerElement.append(feeCategoryContainerElement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Fee Categories
|
* Fee Categories
|
||||||
*/
|
*/
|
||||||
document.querySelector("#button--addFeeCategory").addEventListener("click", () => {
|
document
|
||||||
|
.querySelector('#button--addFeeCategory')
|
||||||
|
.addEventListener('click', () => {
|
||||||
let addCloseModalFunction;
|
let addCloseModalFunction;
|
||||||
const doAddFeeCategory = (submitEvent) => {
|
const doAddFeeCategory = (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddFeeCategory", submitEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doAddFeeCategory', submitEvent.currentTarget, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
feeCategories = responseJSON.feeCategories;
|
feeCategories = responseJSON.feeCategories;
|
||||||
addCloseModalFunction();
|
addCloseModalFunction();
|
||||||
|
|
@ -166,36 +178,37 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Creating Fee Category",
|
title: 'Error Creating Fee Category',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
cityssm.openHtmlModal("adminFees-addFeeCategory", {
|
cityssm.openHtmlModal('adminFees-addFeeCategory', {
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
modalElement.querySelector("#feeCategoryAdd--feeCategory").focus();
|
modalElement.querySelector('#feeCategoryAdd--feeCategory').focus();
|
||||||
addCloseModalFunction = closeModalFunction;
|
addCloseModalFunction = closeModalFunction;
|
||||||
modalElement.querySelector("form").addEventListener("submit", doAddFeeCategory);
|
modalElement
|
||||||
|
.querySelector('form')
|
||||||
|
.addEventListener('submit', doAddFeeCategory);
|
||||||
},
|
},
|
||||||
onremoved() {
|
onremoved() {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
document.querySelector("#button--addFeeCategory").focus();
|
document.querySelector('#button--addFeeCategory').focus();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
function openEditFeeCategory(clickEvent) {
|
function openEditFeeCategory(clickEvent) {
|
||||||
const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest(".container--feeCategory")
|
const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest('.container--feeCategory').dataset.feeCategoryId, 10);
|
||||||
.dataset.feeCategoryId, 10);
|
|
||||||
const feeCategory = feeCategories.find((currentFeeCategory) => {
|
const feeCategory = feeCategories.find((currentFeeCategory) => {
|
||||||
return currentFeeCategory.feeCategoryId === feeCategoryId;
|
return currentFeeCategory.feeCategoryId === feeCategoryId;
|
||||||
});
|
});
|
||||||
let editCloseModalFunction;
|
let editCloseModalFunction;
|
||||||
function doUpdateFeeCategory(submitEvent) {
|
function doUpdateFeeCategory(submitEvent) {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateFeeCategory", submitEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateFeeCategory', submitEvent.currentTarget, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
feeCategories = responseJSON.feeCategories;
|
feeCategories = responseJSON.feeCategories;
|
||||||
editCloseModalFunction();
|
editCloseModalFunction();
|
||||||
|
|
@ -203,25 +216,26 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating Fee Category",
|
title: 'Error Updating Fee Category',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
cityssm.openHtmlModal("adminFees-editFeeCategory", {
|
cityssm.openHtmlModal('adminFees-editFeeCategory', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
modalElement.querySelector("#feeCategoryEdit--feeCategoryId").value =
|
;
|
||||||
feeCategory.feeCategoryId.toString();
|
modalElement.querySelector('#feeCategoryEdit--feeCategoryId').value = feeCategory.feeCategoryId.toString();
|
||||||
modalElement.querySelector("#feeCategoryEdit--feeCategory").value =
|
modalElement.querySelector('#feeCategoryEdit--feeCategory').value = feeCategory.feeCategory;
|
||||||
feeCategory.feeCategory;
|
|
||||||
},
|
},
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
editCloseModalFunction = closeModalFunction;
|
editCloseModalFunction = closeModalFunction;
|
||||||
modalElement.querySelector("form").addEventListener("submit", doUpdateFeeCategory);
|
modalElement
|
||||||
modalElement.querySelector("#feeCategoryEdit--feeCategory").focus();
|
.querySelector('form')
|
||||||
|
.addEventListener('submit', doUpdateFeeCategory);
|
||||||
|
modalElement.querySelector('#feeCategoryEdit--feeCategory').focus();
|
||||||
},
|
},
|
||||||
onremoved: () => {
|
onremoved: () => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
|
|
@ -229,10 +243,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function confirmDeleteFeeCategory(clickEvent) {
|
function confirmDeleteFeeCategory(clickEvent) {
|
||||||
const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest(".container--feeCategory")
|
const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest('.container--feeCategory').dataset.feeCategoryId, 10);
|
||||||
.dataset.feeCategoryId, 10);
|
|
||||||
function doDelete() {
|
function doDelete() {
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteFeeCategory", {
|
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteFeeCategory', {
|
||||||
feeCategoryId
|
feeCategoryId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
|
|
@ -241,32 +254,33 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating Fee Category",
|
title: 'Error Updating Fee Category',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete Fee Category?",
|
title: 'Delete Fee Category?',
|
||||||
message: "Are you sure you want to delete this fee category?",
|
message: 'Are you sure you want to delete this fee category?',
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete the Fee Category",
|
text: 'Yes, Delete the Fee Category',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function moveFeeCategory(clickEvent) {
|
function moveFeeCategory(clickEvent) {
|
||||||
const buttonElement = clickEvent.currentTarget;
|
const buttonElement = clickEvent.currentTarget;
|
||||||
const feeCategoryId = buttonElement.closest(".container--feeCategory").dataset
|
const feeCategoryId = buttonElement.closest('.container--feeCategory').dataset.feeCategoryId;
|
||||||
.feeCategoryId;
|
|
||||||
cityssm.postJSON(los.urlPrefix +
|
cityssm.postJSON(los.urlPrefix +
|
||||||
"/admin/" +
|
'/admin/' +
|
||||||
(buttonElement.dataset.direction === "up" ? "doMoveFeeCategoryUp" : "doMoveFeeCategoryDown"), {
|
(buttonElement.dataset.direction === 'up'
|
||||||
|
? 'doMoveFeeCategoryUp'
|
||||||
|
: 'doMoveFeeCategoryDown'), {
|
||||||
feeCategoryId,
|
feeCategoryId,
|
||||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
feeCategories = responseJSON.feeCategories;
|
feeCategories = responseJSON.feeCategories;
|
||||||
|
|
@ -274,9 +288,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Moving Fee Category",
|
title: 'Error Moving Fee Category',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -285,12 +299,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
* Fees
|
* Fees
|
||||||
*/
|
*/
|
||||||
function openAddFee(clickEvent) {
|
function openAddFee(clickEvent) {
|
||||||
const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest(".container--feeCategory")
|
const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest('.container--feeCategory').dataset.feeCategoryId, 10);
|
||||||
.dataset.feeCategoryId, 10);
|
|
||||||
let addCloseModalFunction;
|
let addCloseModalFunction;
|
||||||
function doAddFee(submitEvent) {
|
function doAddFee(submitEvent) {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddFee", submitEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doAddFee', submitEvent.currentTarget, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
feeCategories = responseJSON.feeCategories;
|
feeCategories = responseJSON.feeCategories;
|
||||||
addCloseModalFunction();
|
addCloseModalFunction();
|
||||||
|
|
@ -298,18 +311,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Adding Fee",
|
title: 'Error Adding Fee',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
cityssm.openHtmlModal("adminFees-addFee", {
|
cityssm.openHtmlModal('adminFees-addFee', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
const feeCategoryElement = modalElement.querySelector("#feeAdd--feeCategoryId");
|
const feeCategoryElement = modalElement.querySelector('#feeAdd--feeCategoryId');
|
||||||
for (const feeCategory of feeCategories) {
|
for (const feeCategory of feeCategories) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option');
|
||||||
optionElement.value = feeCategory.feeCategoryId.toString();
|
optionElement.value = feeCategory.feeCategoryId.toString();
|
||||||
optionElement.textContent = feeCategory.feeCategory;
|
optionElement.textContent = feeCategory.feeCategory;
|
||||||
if (feeCategory.feeCategoryId === feeCategoryId) {
|
if (feeCategory.feeCategoryId === feeCategoryId) {
|
||||||
|
|
@ -317,60 +330,67 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
feeCategoryElement.append(optionElement);
|
feeCategoryElement.append(optionElement);
|
||||||
}
|
}
|
||||||
const occupancyTypeElement = modalElement.querySelector("#feeAdd--occupancyTypeId");
|
const occupancyTypeElement = modalElement.querySelector('#feeAdd--occupancyTypeId');
|
||||||
for (const occupancyType of exports.occupancyTypes) {
|
for (const occupancyType of exports.occupancyTypes) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option');
|
||||||
optionElement.value = occupancyType.occupancyTypeId.toString();
|
optionElement.value = occupancyType.occupancyTypeId.toString();
|
||||||
optionElement.textContent = occupancyType.occupancyType;
|
optionElement.textContent = occupancyType.occupancyType;
|
||||||
occupancyTypeElement.append(optionElement);
|
occupancyTypeElement.append(optionElement);
|
||||||
}
|
}
|
||||||
const lotTypeElement = modalElement.querySelector("#feeAdd--lotTypeId");
|
const lotTypeElement = modalElement.querySelector('#feeAdd--lotTypeId');
|
||||||
for (const lotType of exports.lotTypes) {
|
for (const lotType of exports.lotTypes) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option');
|
||||||
optionElement.value = lotType.lotTypeId.toString();
|
optionElement.value = lotType.lotTypeId.toString();
|
||||||
optionElement.textContent = lotType.lotType;
|
optionElement.textContent = lotType.lotType;
|
||||||
lotTypeElement.append(optionElement);
|
lotTypeElement.append(optionElement);
|
||||||
}
|
}
|
||||||
modalElement.querySelector("#feeAdd--taxPercentage").value = exports.taxPercentageDefault.toString();
|
;
|
||||||
|
modalElement.querySelector('#feeAdd--taxPercentage').value = exports.taxPercentageDefault.toString();
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement);
|
||||||
},
|
},
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
addCloseModalFunction = closeModalFunction;
|
addCloseModalFunction = closeModalFunction;
|
||||||
modalElement.querySelector("form").addEventListener("submit", doAddFee);
|
modalElement.querySelector('form').addEventListener('submit', doAddFee);
|
||||||
modalElement.querySelector("#feeAdd--feeName").focus();
|
modalElement.querySelector('#feeAdd--feeName').focus();
|
||||||
modalElement.querySelector("#feeAdd--feeFunction").addEventListener("change", () => {
|
modalElement.querySelector('#feeAdd--feeFunction').addEventListener('change', () => {
|
||||||
const feeAmountElement = modalElement.querySelector("#feeAdd--feeAmount");
|
const feeAmountElement = modalElement.querySelector('#feeAdd--feeAmount');
|
||||||
const feeFunctionElement = modalElement.querySelector("#feeAdd--feeFunction");
|
const feeFunctionElement = modalElement.querySelector('#feeAdd--feeFunction');
|
||||||
if (feeFunctionElement.value === "") {
|
if (feeFunctionElement.value === '') {
|
||||||
feeFunctionElement.closest(".select").classList.remove("is-success");
|
feeFunctionElement
|
||||||
feeAmountElement.classList.add("is-success");
|
.closest('.select')
|
||||||
|
.classList.remove('is-success');
|
||||||
|
feeAmountElement.classList.add('is-success');
|
||||||
feeAmountElement.disabled = false;
|
feeAmountElement.disabled = false;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
feeFunctionElement.closest(".select").classList.add("is-success");
|
feeFunctionElement.closest('.select').classList.add('is-success');
|
||||||
feeAmountElement.classList.remove("is-success");
|
feeAmountElement.classList.remove('is-success');
|
||||||
feeAmountElement.disabled = true;
|
feeAmountElement.disabled = true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
modalElement.querySelector("#feeAdd--taxPercentage").addEventListener("keyup", () => {
|
modalElement
|
||||||
const taxAmountElement = modalElement.querySelector("#feeAdd--taxAmount");
|
.querySelector('#feeAdd--taxPercentage')
|
||||||
const taxPercentageElement = modalElement.querySelector("#feeAdd--taxPercentage");
|
.addEventListener('keyup', () => {
|
||||||
if (taxPercentageElement.value === "") {
|
const taxAmountElement = modalElement.querySelector('#feeAdd--taxAmount');
|
||||||
taxPercentageElement.classList.remove("is-success");
|
const taxPercentageElement = modalElement.querySelector('#feeAdd--taxPercentage');
|
||||||
taxAmountElement.classList.add("is-success");
|
if (taxPercentageElement.value === '') {
|
||||||
|
taxPercentageElement.classList.remove('is-success');
|
||||||
|
taxAmountElement.classList.add('is-success');
|
||||||
taxAmountElement.disabled = false;
|
taxAmountElement.disabled = false;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
taxPercentageElement.classList.add("is-success");
|
taxPercentageElement.classList.add('is-success');
|
||||||
taxAmountElement.classList.remove("is-success");
|
taxAmountElement.classList.remove('is-success');
|
||||||
taxAmountElement.disabled = true;
|
taxAmountElement.disabled = true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
modalElement.querySelector("#feeAdd--includeQuantity").addEventListener("change", () => {
|
modalElement
|
||||||
modalElement.querySelector("#feeAdd--quantityUnit").disabled =
|
.querySelector('#feeAdd--includeQuantity')
|
||||||
modalElement.querySelector("#feeAdd--includeQuantity")
|
.addEventListener('change', () => {
|
||||||
.value === "";
|
;
|
||||||
|
modalElement.querySelector('#feeAdd--quantityUnit').disabled =
|
||||||
|
modalElement.querySelector('#feeAdd--includeQuantity').value === '';
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
onremoved() {
|
onremoved() {
|
||||||
|
|
@ -380,9 +400,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
function openEditFee(clickEvent) {
|
function openEditFee(clickEvent) {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault();
|
||||||
const feeContainerElement = clickEvent.currentTarget.closest(".container--fee");
|
const feeContainerElement = clickEvent.currentTarget.closest('.container--fee');
|
||||||
const feeId = Number.parseInt(feeContainerElement.dataset.feeId, 10);
|
const feeId = Number.parseInt(feeContainerElement.dataset.feeId, 10);
|
||||||
const feeCategoryId = Number.parseInt(feeContainerElement.closest(".container--feeCategory").dataset.feeCategoryId);
|
const feeCategoryId = Number.parseInt(feeContainerElement.closest('.container--feeCategory')
|
||||||
|
.dataset.feeCategoryId);
|
||||||
const feeCategory = feeCategories.find((currentFeeCategory) => {
|
const feeCategory = feeCategories.find((currentFeeCategory) => {
|
||||||
return currentFeeCategory.feeCategoryId === feeCategoryId;
|
return currentFeeCategory.feeCategoryId === feeCategoryId;
|
||||||
});
|
});
|
||||||
|
|
@ -393,7 +414,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
let editModalElement;
|
let editModalElement;
|
||||||
function doUpdateFee(submitEvent) {
|
function doUpdateFee(submitEvent) {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateFee", submitEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateFee', submitEvent.currentTarget, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
feeCategories = responseJSON.feeCategories;
|
feeCategories = responseJSON.feeCategories;
|
||||||
editCloseModalFunction();
|
editCloseModalFunction();
|
||||||
|
|
@ -401,9 +422,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating Fee",
|
title: 'Error Updating Fee',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -411,7 +432,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
function confirmDeleteFee(clickEvent) {
|
function confirmDeleteFee(clickEvent) {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault();
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteFee", {
|
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteFee', {
|
||||||
feeId
|
feeId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
|
|
@ -421,64 +442,62 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Deleting Fee",
|
title: 'Error Deleting Fee',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete Fee?",
|
title: 'Delete Fee?',
|
||||||
message: "Are you sure you want to delete this fee?",
|
message: 'Are you sure you want to delete this fee?',
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete the Fee",
|
text: 'Yes, Delete the Fee',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function toggleFeeFields() {
|
function toggleFeeFields() {
|
||||||
const feeAmountElement = editModalElement.querySelector("#feeEdit--feeAmount");
|
const feeAmountElement = editModalElement.querySelector('#feeEdit--feeAmount');
|
||||||
const feeFunctionElement = editModalElement.querySelector("#feeEdit--feeFunction");
|
const feeFunctionElement = editModalElement.querySelector('#feeEdit--feeFunction');
|
||||||
if (feeFunctionElement.value === "") {
|
if (feeFunctionElement.value === '') {
|
||||||
feeFunctionElement.closest(".select").classList.remove("is-success");
|
feeFunctionElement.closest('.select').classList.remove('is-success');
|
||||||
feeAmountElement.classList.add("is-success");
|
feeAmountElement.classList.add('is-success');
|
||||||
feeAmountElement.disabled = false;
|
feeAmountElement.disabled = false;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
feeFunctionElement.closest(".select").classList.add("is-success");
|
feeFunctionElement.closest('.select').classList.add('is-success');
|
||||||
feeAmountElement.classList.remove("is-success");
|
feeAmountElement.classList.remove('is-success');
|
||||||
feeAmountElement.disabled = true;
|
feeAmountElement.disabled = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function toggleTaxFields() {
|
function toggleTaxFields() {
|
||||||
const taxAmountElement = editModalElement.querySelector("#feeEdit--taxAmount");
|
const taxAmountElement = editModalElement.querySelector('#feeEdit--taxAmount');
|
||||||
const taxPercentageElement = editModalElement.querySelector("#feeEdit--taxPercentage");
|
const taxPercentageElement = editModalElement.querySelector('#feeEdit--taxPercentage');
|
||||||
if (taxPercentageElement.value === "") {
|
if (taxPercentageElement.value === '') {
|
||||||
taxPercentageElement.classList.remove("is-success");
|
taxPercentageElement.classList.remove('is-success');
|
||||||
taxAmountElement.classList.add("is-success");
|
taxAmountElement.classList.add('is-success');
|
||||||
taxAmountElement.disabled = false;
|
taxAmountElement.disabled = false;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
taxPercentageElement.classList.add("is-success");
|
taxPercentageElement.classList.add('is-success');
|
||||||
taxAmountElement.classList.remove("is-success");
|
taxAmountElement.classList.remove('is-success');
|
||||||
taxAmountElement.disabled = true;
|
taxAmountElement.disabled = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function toggleQuantityFields() {
|
function toggleQuantityFields() {
|
||||||
const includeQuanitityValue = editModalElement.querySelector("#feeEdit--includeQuantity").value;
|
const includeQuanitityValue = editModalElement.querySelector('#feeEdit--includeQuantity').value;
|
||||||
editModalElement.querySelector("#feeEdit--quantityUnit").disabled =
|
editModalElement.querySelector('#feeEdit--quantityUnit').disabled = includeQuanitityValue === '';
|
||||||
includeQuanitityValue === "";
|
|
||||||
}
|
}
|
||||||
cityssm.openHtmlModal("adminFees-editFee", {
|
cityssm.openHtmlModal('adminFees-editFee', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
editModalElement = modalElement;
|
editModalElement = modalElement;
|
||||||
modalElement.querySelector("#feeEdit--feeId").value =
|
modalElement.querySelector('#feeEdit--feeId').value = fee.feeId.toString();
|
||||||
fee.feeId.toString();
|
const feeCategoryElement = modalElement.querySelector('#feeEdit--feeCategoryId');
|
||||||
const feeCategoryElement = modalElement.querySelector("#feeEdit--feeCategoryId");
|
|
||||||
for (const feeCategory of feeCategories) {
|
for (const feeCategory of feeCategories) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option');
|
||||||
optionElement.value = feeCategory.feeCategoryId.toString();
|
optionElement.value = feeCategory.feeCategoryId.toString();
|
||||||
optionElement.textContent = feeCategory.feeCategory;
|
optionElement.textContent = feeCategory.feeCategory;
|
||||||
if (feeCategory.feeCategoryId === feeCategoryId) {
|
if (feeCategory.feeCategoryId === feeCategoryId) {
|
||||||
|
|
@ -486,12 +505,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
feeCategoryElement.append(optionElement);
|
feeCategoryElement.append(optionElement);
|
||||||
}
|
}
|
||||||
modalElement.querySelector("#feeEdit--feeName").value = fee.feeName;
|
;
|
||||||
modalElement.querySelector("#feeEdit--feeDescription").value =
|
modalElement.querySelector('#feeEdit--feeName').value = fee.feeName;
|
||||||
fee.feeDescription;
|
modalElement.querySelector('#feeEdit--feeDescription').value = fee.feeDescription;
|
||||||
const occupancyTypeElement = modalElement.querySelector("#feeEdit--occupancyTypeId");
|
const occupancyTypeElement = modalElement.querySelector('#feeEdit--occupancyTypeId');
|
||||||
for (const occupancyType of exports.occupancyTypes) {
|
for (const occupancyType of exports.occupancyTypes) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option');
|
||||||
optionElement.value = occupancyType.occupancyTypeId.toString();
|
optionElement.value = occupancyType.occupancyTypeId.toString();
|
||||||
optionElement.textContent = occupancyType.occupancyType;
|
optionElement.textContent = occupancyType.occupancyType;
|
||||||
if (occupancyType.occupancyTypeId === fee.occupancyTypeId) {
|
if (occupancyType.occupancyTypeId === fee.occupancyTypeId) {
|
||||||
|
|
@ -499,9 +518,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
occupancyTypeElement.append(optionElement);
|
occupancyTypeElement.append(optionElement);
|
||||||
}
|
}
|
||||||
const lotTypeElement = modalElement.querySelector("#feeEdit--lotTypeId");
|
const lotTypeElement = modalElement.querySelector('#feeEdit--lotTypeId');
|
||||||
for (const lotType of exports.lotTypes) {
|
for (const lotType of exports.lotTypes) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option');
|
||||||
optionElement.value = lotType.lotTypeId.toString();
|
optionElement.value = lotType.lotTypeId.toString();
|
||||||
optionElement.textContent = lotType.lotType;
|
optionElement.textContent = lotType.lotType;
|
||||||
if (lotType.lotTypeId === fee.lotTypeId) {
|
if (lotType.lotTypeId === fee.lotTypeId) {
|
||||||
|
|
@ -509,39 +528,42 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
lotTypeElement.append(optionElement);
|
lotTypeElement.append(optionElement);
|
||||||
}
|
}
|
||||||
modalElement.querySelector("#feeEdit--feeAmount").value = fee.feeAmount
|
;
|
||||||
? fee.feeAmount.toFixed(2)
|
modalElement.querySelector('#feeEdit--feeAmount').value = fee.feeAmount ? fee.feeAmount.toFixed(2) : '';
|
||||||
: "";
|
|
||||||
modalElement
|
modalElement
|
||||||
.querySelector("#feeEdit--feeFunction")
|
.querySelector('#feeEdit--feeFunction')
|
||||||
.addEventListener("change", toggleFeeFields);
|
.addEventListener('change', toggleFeeFields);
|
||||||
toggleFeeFields();
|
toggleFeeFields();
|
||||||
modalElement.querySelector("#feeEdit--taxAmount").value = fee.taxAmount
|
modalElement.querySelector('#feeEdit--taxAmount').value = fee.taxAmount ? fee.taxAmount.toFixed(2) : '';
|
||||||
? fee.taxAmount.toFixed(2)
|
const taxPercentageElement = modalElement.querySelector('#feeEdit--taxPercentage');
|
||||||
: "";
|
taxPercentageElement.value = fee.taxPercentage
|
||||||
const taxPercentageElement = modalElement.querySelector("#feeEdit--taxPercentage");
|
? fee.taxPercentage.toString()
|
||||||
taxPercentageElement.value = fee.taxPercentage ? fee.taxPercentage.toString() : "";
|
: '';
|
||||||
taxPercentageElement.addEventListener("keyup", toggleTaxFields);
|
taxPercentageElement.addEventListener('keyup', toggleTaxFields);
|
||||||
toggleTaxFields();
|
toggleTaxFields();
|
||||||
const includeQuantityElement = modalElement.querySelector("#feeEdit--includeQuantity");
|
const includeQuantityElement = modalElement.querySelector('#feeEdit--includeQuantity');
|
||||||
if (fee.includeQuantity) {
|
if (fee.includeQuantity) {
|
||||||
includeQuantityElement.value = "1";
|
includeQuantityElement.value = '1';
|
||||||
}
|
}
|
||||||
includeQuantityElement.addEventListener("change", toggleQuantityFields);
|
includeQuantityElement.addEventListener('change', toggleQuantityFields);
|
||||||
modalElement.querySelector("#feeEdit--quantityUnit").value =
|
modalElement.querySelector('#feeEdit--quantityUnit').value = fee.quantityUnit || '';
|
||||||
fee.quantityUnit || "";
|
|
||||||
toggleQuantityFields();
|
toggleQuantityFields();
|
||||||
if (fee.isRequired) {
|
if (fee.isRequired) {
|
||||||
modalElement.querySelector("#feeEdit--isRequired").value = "1";
|
;
|
||||||
|
modalElement.querySelector('#feeEdit--isRequired').value = '1';
|
||||||
}
|
}
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement);
|
||||||
},
|
},
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
editCloseModalFunction = closeModalFunction;
|
editCloseModalFunction = closeModalFunction;
|
||||||
modalElement.querySelector("form").addEventListener("submit", doUpdateFee);
|
modalElement
|
||||||
|
.querySelector('form')
|
||||||
|
.addEventListener('submit', doUpdateFee);
|
||||||
bulmaJS.init(modalElement);
|
bulmaJS.init(modalElement);
|
||||||
modalElement.querySelector(".button--deleteFee").addEventListener("click", confirmDeleteFee);
|
modalElement
|
||||||
|
.querySelector('.button--deleteFee')
|
||||||
|
.addEventListener('click', confirmDeleteFee);
|
||||||
},
|
},
|
||||||
onremoved: () => {
|
onremoved: () => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
|
|
@ -550,13 +572,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
function moveFee(clickEvent) {
|
function moveFee(clickEvent) {
|
||||||
const buttonElement = clickEvent.currentTarget;
|
const buttonElement = clickEvent.currentTarget;
|
||||||
const feeContainerElement = buttonElement.closest(".container--fee");
|
const feeContainerElement = buttonElement.closest('.container--fee');
|
||||||
const feeId = feeContainerElement.dataset.feeId;
|
const feeId = feeContainerElement.dataset.feeId;
|
||||||
cityssm.postJSON(los.urlPrefix +
|
cityssm.postJSON(los.urlPrefix +
|
||||||
"/admin/" +
|
'/admin/' +
|
||||||
(buttonElement.dataset.direction === "up" ? "doMoveFeeUp" : "doMoveFeeDown"), {
|
(buttonElement.dataset.direction === 'up'
|
||||||
|
? 'doMoveFeeUp'
|
||||||
|
: 'doMoveFeeDown'), {
|
||||||
feeId,
|
feeId,
|
||||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
feeCategories = responseJSON.feeCategories;
|
feeCategories = responseJSON.feeCategories;
|
||||||
|
|
@ -564,9 +588,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Moving Fee",
|
title: 'Error Moving Fee',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -3,13 +3,13 @@
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
(() => {
|
(() => {
|
||||||
const los = exports.los;
|
const los = exports.los;
|
||||||
const containerElement = document.querySelector("#container--lotTypes");
|
const containerElement = document.querySelector('#container--lotTypes');
|
||||||
let lotTypes = exports.lotTypes;
|
let lotTypes = exports.lotTypes;
|
||||||
delete exports.lotTypes;
|
delete exports.lotTypes;
|
||||||
const expandedLotTypes = new Set();
|
const expandedLotTypes = new Set();
|
||||||
function toggleLotTypeFields(clickEvent) {
|
function toggleLotTypeFields(clickEvent) {
|
||||||
const toggleButtonElement = clickEvent.currentTarget;
|
const toggleButtonElement = clickEvent.currentTarget;
|
||||||
const lotTypeElement = toggleButtonElement.closest(".container--lotType");
|
const lotTypeElement = toggleButtonElement.closest('.container--lotType');
|
||||||
const lotTypeId = Number.parseInt(lotTypeElement.dataset.lotTypeId, 10);
|
const lotTypeId = Number.parseInt(lotTypeElement.dataset.lotTypeId, 10);
|
||||||
if (expandedLotTypes.has(lotTypeId)) {
|
if (expandedLotTypes.has(lotTypeId)) {
|
||||||
expandedLotTypes.delete(lotTypeId);
|
expandedLotTypes.delete(lotTypeId);
|
||||||
|
|
@ -20,9 +20,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
toggleButtonElement.innerHTML = expandedLotTypes.has(lotTypeId)
|
toggleButtonElement.innerHTML = expandedLotTypes.has(lotTypeId)
|
||||||
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
|
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
|
||||||
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>';
|
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>';
|
||||||
const panelBlockElements = lotTypeElement.querySelectorAll(".panel-block");
|
const panelBlockElements = lotTypeElement.querySelectorAll('.panel-block');
|
||||||
for (const panelBlockElement of panelBlockElements) {
|
for (const panelBlockElement of panelBlockElements) {
|
||||||
panelBlockElement.classList.toggle("is-hidden");
|
panelBlockElement.classList.toggle('is-hidden');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function lotTypeResponseHandler(responseJSON) {
|
function lotTypeResponseHandler(responseJSON) {
|
||||||
|
|
@ -33,23 +33,22 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: `Error Updating ${exports.aliases.lot} Type`,
|
title: `Error Updating ${exports.aliases.lot} Type`,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function deleteLotType(clickEvent) {
|
function deleteLotType(clickEvent) {
|
||||||
const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--lotType").dataset
|
const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotType').dataset.lotTypeId, 10);
|
||||||
.lotTypeId, 10);
|
|
||||||
function doDelete() {
|
function doDelete() {
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteLotType", {
|
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteLotType', {
|
||||||
lotTypeId
|
lotTypeId
|
||||||
}, lotTypeResponseHandler);
|
}, lotTypeResponseHandler);
|
||||||
}
|
}
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: `Delete ${exports.aliases.lot} Type`,
|
title: `Delete ${exports.aliases.lot} Type`,
|
||||||
message: `Are you sure you want to delete this ${exports.aliases.lot.toLowerCase()} type?`,
|
message: `Are you sure you want to delete this ${exports.aliases.lot.toLowerCase()} type?`,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: `Yes, Delete ${exports.aliases.lot} Type`,
|
text: `Yes, Delete ${exports.aliases.lot} Type`,
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
|
|
@ -57,33 +56,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function openEditLotType(clickEvent) {
|
function openEditLotType(clickEvent) {
|
||||||
const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--lotType").dataset
|
const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotType').dataset.lotTypeId, 10);
|
||||||
.lotTypeId, 10);
|
|
||||||
const lotType = lotTypes.find((currentLotType) => {
|
const lotType = lotTypes.find((currentLotType) => {
|
||||||
return lotTypeId === currentLotType.lotTypeId;
|
return lotTypeId === currentLotType.lotTypeId;
|
||||||
});
|
});
|
||||||
let editCloseModalFunction;
|
let editCloseModalFunction;
|
||||||
const doEdit = (submitEvent) => {
|
const doEdit = (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateLotType", submitEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateLotType', submitEvent.currentTarget, (responseJSON) => {
|
||||||
lotTypeResponseHandler(responseJSON);
|
lotTypeResponseHandler(responseJSON);
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
editCloseModalFunction();
|
editCloseModalFunction();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
cityssm.openHtmlModal("adminLotTypes-editLotType", {
|
cityssm.openHtmlModal('adminLotTypes-editLotType', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement);
|
||||||
modalElement.querySelector("#lotTypeEdit--lotTypeId").value =
|
modalElement.querySelector('#lotTypeEdit--lotTypeId').value = lotTypeId.toString();
|
||||||
lotTypeId.toString();
|
modalElement.querySelector('#lotTypeEdit--lotType').value = lotType.lotType;
|
||||||
modalElement.querySelector("#lotTypeEdit--lotType").value =
|
|
||||||
lotType.lotType;
|
|
||||||
},
|
},
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
editCloseModalFunction = closeModalFunction;
|
editCloseModalFunction = closeModalFunction;
|
||||||
modalElement.querySelector("#lotTypeEdit--lotType").focus();
|
modalElement.querySelector('#lotTypeEdit--lotType').focus();
|
||||||
modalElement.querySelector("form").addEventListener("submit", doEdit);
|
modalElement.querySelector('form').addEventListener('submit', doEdit);
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
},
|
},
|
||||||
onremoved() {
|
onremoved() {
|
||||||
|
|
@ -92,12 +88,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function openAddLotTypeField(clickEvent) {
|
function openAddLotTypeField(clickEvent) {
|
||||||
const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--lotType").dataset
|
const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotType').dataset.lotTypeId, 10);
|
||||||
.lotTypeId, 10);
|
|
||||||
let addCloseModalFunction;
|
let addCloseModalFunction;
|
||||||
const doAdd = (submitEvent) => {
|
const doAdd = (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddLotTypeField", submitEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doAddLotTypeField', submitEvent.currentTarget, (responseJSON) => {
|
||||||
expandedLotTypes.add(lotTypeId);
|
expandedLotTypes.add(lotTypeId);
|
||||||
lotTypeResponseHandler(responseJSON);
|
lotTypeResponseHandler(responseJSON);
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
|
|
@ -106,18 +101,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
cityssm.openHtmlModal("adminLotTypes-addLotTypeField", {
|
cityssm.openHtmlModal('adminLotTypes-addLotTypeField', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement);
|
||||||
if (lotTypeId) {
|
if (lotTypeId) {
|
||||||
modalElement.querySelector("#lotTypeFieldAdd--lotTypeId").value =
|
;
|
||||||
lotTypeId.toString();
|
modalElement.querySelector('#lotTypeFieldAdd--lotTypeId').value = lotTypeId.toString();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
addCloseModalFunction = closeModalFunction;
|
addCloseModalFunction = closeModalFunction;
|
||||||
modalElement.querySelector("#lotTypeFieldAdd--lotTypeField").focus();
|
modalElement.querySelector('#lotTypeFieldAdd--lotTypeField').focus();
|
||||||
modalElement.querySelector("form").addEventListener("submit", doAdd);
|
modalElement.querySelector('form').addEventListener('submit', doAdd);
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
},
|
},
|
||||||
onremoved() {
|
onremoved() {
|
||||||
|
|
@ -127,12 +122,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
function moveLotType(clickEvent) {
|
function moveLotType(clickEvent) {
|
||||||
const buttonElement = clickEvent.currentTarget;
|
const buttonElement = clickEvent.currentTarget;
|
||||||
const lotTypeId = buttonElement.closest(".container--lotType").dataset.lotTypeId;
|
const lotTypeId = buttonElement.closest('.container--lotType').dataset.lotTypeId;
|
||||||
cityssm.postJSON(los.urlPrefix +
|
cityssm.postJSON(los.urlPrefix +
|
||||||
"/admin/" +
|
'/admin/' +
|
||||||
(buttonElement.dataset.direction === "up" ? "doMoveLotTypeUp" : "doMoveLotTypeDown"), {
|
(buttonElement.dataset.direction === 'up'
|
||||||
|
? 'doMoveLotTypeUp'
|
||||||
|
: 'doMoveLotTypeDown'), {
|
||||||
lotTypeId,
|
lotTypeId,
|
||||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||||
}, lotTypeResponseHandler);
|
}, lotTypeResponseHandler);
|
||||||
}
|
}
|
||||||
function openEditLotTypeField(lotTypeId, lotTypeFieldId) {
|
function openEditLotTypeField(lotTypeId, lotTypeFieldId) {
|
||||||
|
|
@ -151,7 +148,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
maximumLengthElement.min = minimumLengthElement.value;
|
maximumLengthElement.min = minimumLengthElement.value;
|
||||||
}
|
}
|
||||||
function toggleInputFields() {
|
function toggleInputFields() {
|
||||||
if (lotTypeFieldValuesElement.value === "") {
|
if (lotTypeFieldValuesElement.value === '') {
|
||||||
minimumLengthElement.disabled = false;
|
minimumLengthElement.disabled = false;
|
||||||
maximumLengthElement.disabled = false;
|
maximumLengthElement.disabled = false;
|
||||||
patternElement.disabled = false;
|
patternElement.disabled = false;
|
||||||
|
|
@ -164,7 +161,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
function doUpdate(submitEvent) {
|
function doUpdate(submitEvent) {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateLotTypeField", submitEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateLotTypeField', submitEvent.currentTarget, (responseJSON) => {
|
||||||
lotTypeResponseHandler(responseJSON);
|
lotTypeResponseHandler(responseJSON);
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
editCloseModalFunction();
|
editCloseModalFunction();
|
||||||
|
|
@ -172,7 +169,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function doDelete() {
|
function doDelete() {
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteLotTypeField", {
|
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteLotTypeField', {
|
||||||
lotTypeFieldId
|
lotTypeFieldId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
lotTypeResponseHandler(responseJSON);
|
lotTypeResponseHandler(responseJSON);
|
||||||
|
|
@ -183,31 +180,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
function confirmDoDelete() {
|
function confirmDoDelete() {
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete Field",
|
title: 'Delete Field',
|
||||||
message: "Are you sure you want to delete this field? Note that historical records that make use of this field will not be affected.",
|
message: 'Are you sure you want to delete this field? Note that historical records that make use of this field will not be affected.',
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete Field",
|
text: 'Yes, Delete Field',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
cityssm.openHtmlModal("adminLotTypes-editLotTypeField", {
|
cityssm.openHtmlModal('adminLotTypes-editLotTypeField', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement);
|
||||||
modalElement.querySelector("#lotTypeFieldEdit--lotTypeFieldId").value =
|
modalElement.querySelector('#lotTypeFieldEdit--lotTypeFieldId').value = lotTypeField.lotTypeFieldId.toString();
|
||||||
lotTypeField.lotTypeFieldId.toString();
|
modalElement.querySelector('#lotTypeFieldEdit--lotTypeField').value = lotTypeField.lotTypeField;
|
||||||
modalElement.querySelector("#lotTypeFieldEdit--lotTypeField").value =
|
modalElement.querySelector('#lotTypeFieldEdit--isRequired').value = lotTypeField.isRequired ? '1' : '0';
|
||||||
lotTypeField.lotTypeField;
|
minimumLengthElement = modalElement.querySelector('#lotTypeFieldEdit--minimumLength');
|
||||||
modalElement.querySelector("#lotTypeFieldEdit--isRequired").value =
|
|
||||||
lotTypeField.isRequired ? "1" : "0";
|
|
||||||
minimumLengthElement = modalElement.querySelector("#lotTypeFieldEdit--minimumLength");
|
|
||||||
minimumLengthElement.value = lotTypeField.minimumLength.toString();
|
minimumLengthElement.value = lotTypeField.minimumLength.toString();
|
||||||
maximumLengthElement = modalElement.querySelector("#lotTypeFieldEdit--maximumLength");
|
maximumLengthElement = modalElement.querySelector('#lotTypeFieldEdit--maximumLength');
|
||||||
maximumLengthElement.value = lotTypeField.maximumLength.toString();
|
maximumLengthElement.value = lotTypeField.maximumLength.toString();
|
||||||
patternElement = modalElement.querySelector("#lotTypeFieldEdit--pattern");
|
patternElement = modalElement.querySelector('#lotTypeFieldEdit--pattern');
|
||||||
patternElement.value = lotTypeField.pattern;
|
patternElement.value = lotTypeField.pattern;
|
||||||
lotTypeFieldValuesElement = modalElement.querySelector("#lotTypeFieldEdit--lotTypeFieldValues");
|
lotTypeFieldValuesElement = modalElement.querySelector('#lotTypeFieldEdit--lotTypeFieldValues');
|
||||||
lotTypeFieldValuesElement.value = lotTypeField.lotTypeFieldValues;
|
lotTypeFieldValuesElement.value = lotTypeField.lotTypeFieldValues;
|
||||||
toggleInputFields();
|
toggleInputFields();
|
||||||
},
|
},
|
||||||
|
|
@ -216,13 +210,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
bulmaJS.init(modalElement);
|
bulmaJS.init(modalElement);
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
cityssm.enableNavBlocker();
|
cityssm.enableNavBlocker();
|
||||||
modalElement.querySelector("form").addEventListener("submit", doUpdate);
|
modalElement.querySelector('form').addEventListener('submit', doUpdate);
|
||||||
minimumLengthElement.addEventListener("keyup", updateMaximumLengthMin);
|
minimumLengthElement.addEventListener('keyup', updateMaximumLengthMin);
|
||||||
updateMaximumLengthMin();
|
updateMaximumLengthMin();
|
||||||
lotTypeFieldValuesElement.addEventListener("keyup", toggleInputFields);
|
lotTypeFieldValuesElement.addEventListener('keyup', toggleInputFields);
|
||||||
modalElement
|
modalElement
|
||||||
.querySelector("#button--deleteLotTypeField")
|
.querySelector('#button--deleteLotTypeField')
|
||||||
.addEventListener("click", confirmDoDelete);
|
.addEventListener('click', confirmDoDelete);
|
||||||
},
|
},
|
||||||
onremoved() {
|
onremoved() {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
|
|
@ -232,78 +226,77 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
function openEditLotTypeFieldByClick(clickEvent) {
|
function openEditLotTypeFieldByClick(clickEvent) {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault();
|
||||||
const lotTypeFieldId = Number.parseInt(clickEvent.currentTarget.closest(".container--lotTypeField")
|
const lotTypeFieldId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotTypeField').dataset.lotTypeFieldId, 10);
|
||||||
.dataset.lotTypeFieldId, 10);
|
const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotType').dataset.lotTypeId, 10);
|
||||||
const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--lotType").dataset
|
|
||||||
.lotTypeId, 10);
|
|
||||||
openEditLotTypeField(lotTypeId, lotTypeFieldId);
|
openEditLotTypeField(lotTypeId, lotTypeFieldId);
|
||||||
}
|
}
|
||||||
function moveLotTypeField(clickEvent) {
|
function moveLotTypeField(clickEvent) {
|
||||||
const buttonElement = clickEvent.currentTarget;
|
const buttonElement = clickEvent.currentTarget;
|
||||||
const lotTypeFieldId = buttonElement.closest(".container--lotTypeField").dataset
|
const lotTypeFieldId = buttonElement.closest('.container--lotTypeField').dataset.lotTypeFieldId;
|
||||||
.lotTypeFieldId;
|
|
||||||
cityssm.postJSON(los.urlPrefix +
|
cityssm.postJSON(los.urlPrefix +
|
||||||
"/admin/" +
|
'/admin/' +
|
||||||
(buttonElement.dataset.direction === "up"
|
(buttonElement.dataset.direction === 'up'
|
||||||
? "doMoveLotTypeFieldUp"
|
? 'doMoveLotTypeFieldUp'
|
||||||
: "doMoveLotTypeFieldDown"), {
|
: 'doMoveLotTypeFieldDown'), {
|
||||||
lotTypeFieldId,
|
lotTypeFieldId,
|
||||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||||
}, lotTypeResponseHandler);
|
}, lotTypeResponseHandler);
|
||||||
}
|
}
|
||||||
function renderLotTypeFields(panelElement, lotTypeId, lotTypeFields) {
|
function renderLotTypeFields(panelElement, lotTypeId, lotTypeFields) {
|
||||||
if (lotTypeFields.length === 0) {
|
if (lotTypeFields.length === 0) {
|
||||||
panelElement.insertAdjacentHTML("beforeend", '<div class="panel-block is-block' +
|
panelElement.insertAdjacentHTML('beforeend', '<div class="panel-block is-block' +
|
||||||
(expandedLotTypes.has(lotTypeId) ? "" : " is-hidden") +
|
(expandedLotTypes.has(lotTypeId) ? '' : ' is-hidden') +
|
||||||
'">' +
|
'">' +
|
||||||
'<div class="message is-info">' +
|
'<div class="message is-info">' +
|
||||||
'<p class="message-body">There are no additional fields.</p>' +
|
'<p class="message-body">There are no additional fields.</p>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>");
|
'</div>');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for (const lotTypeField of lotTypeFields) {
|
for (const lotTypeField of lotTypeFields) {
|
||||||
const panelBlockElement = document.createElement("div");
|
const panelBlockElement = document.createElement('div');
|
||||||
panelBlockElement.className = "panel-block is-block container--lotTypeField";
|
panelBlockElement.className =
|
||||||
|
'panel-block is-block container--lotTypeField';
|
||||||
if (!expandedLotTypes.has(lotTypeId)) {
|
if (!expandedLotTypes.has(lotTypeId)) {
|
||||||
panelBlockElement.classList.add("is-hidden");
|
panelBlockElement.classList.add('is-hidden');
|
||||||
}
|
}
|
||||||
panelBlockElement.dataset.lotTypeFieldId = lotTypeField.lotTypeFieldId.toString();
|
panelBlockElement.dataset.lotTypeFieldId =
|
||||||
|
lotTypeField.lotTypeFieldId.toString();
|
||||||
panelBlockElement.innerHTML =
|
panelBlockElement.innerHTML =
|
||||||
'<div class="level is-mobile">' +
|
'<div class="level is-mobile">' +
|
||||||
'<div class="level-left">' +
|
'<div class="level-left">' +
|
||||||
('<div class="level-item">' +
|
('<div class="level-item">' +
|
||||||
'<a class="has-text-weight-bold button--editLotTypeField" href="#">' +
|
'<a class="has-text-weight-bold button--editLotTypeField" href="#">' +
|
||||||
cityssm.escapeHTML(lotTypeField.lotTypeField || "") +
|
cityssm.escapeHTML(lotTypeField.lotTypeField || '') +
|
||||||
"</a>" +
|
'</a>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="level-right">' +
|
'<div class="level-right">' +
|
||||||
('<div class="level-item">' +
|
('<div class="level-item">' +
|
||||||
los.getMoveUpDownButtonFieldHTML("button--moveLotTypeFieldUp", "button--moveLotTypeFieldDown") +
|
los.getMoveUpDownButtonFieldHTML('button--moveLotTypeFieldUp', 'button--moveLotTypeFieldDown') +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>";
|
'</div>';
|
||||||
panelBlockElement
|
panelBlockElement
|
||||||
.querySelector(".button--editLotTypeField")
|
.querySelector('.button--editLotTypeField')
|
||||||
.addEventListener("click", openEditLotTypeFieldByClick);
|
.addEventListener('click', openEditLotTypeFieldByClick);
|
||||||
panelBlockElement.querySelector(".button--moveLotTypeFieldUp").addEventListener("click", moveLotTypeField);
|
panelBlockElement.querySelector('.button--moveLotTypeFieldUp').addEventListener('click', moveLotTypeField);
|
||||||
panelBlockElement.querySelector(".button--moveLotTypeFieldDown").addEventListener("click", moveLotTypeField);
|
panelBlockElement.querySelector('.button--moveLotTypeFieldDown').addEventListener('click', moveLotTypeField);
|
||||||
panelElement.append(panelBlockElement);
|
panelElement.append(panelBlockElement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function renderLotTypes() {
|
function renderLotTypes() {
|
||||||
containerElement.innerHTML = "";
|
containerElement.innerHTML = '';
|
||||||
if (lotTypes.length === 0) {
|
if (lotTypes.length === 0) {
|
||||||
containerElement.insertAdjacentHTML("afterbegin", `<div class="message is-warning>
|
containerElement.insertAdjacentHTML('afterbegin', `<div class="message is-warning>
|
||||||
<p class="message-body">There are no active ${los.escapedAliases.lot} types.</p>
|
<p class="message-body">There are no active ${los.escapedAliases.lot} types.</p>
|
||||||
</div>`);
|
</div>`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (const lotType of lotTypes) {
|
for (const lotType of lotTypes) {
|
||||||
const lotTypeContainer = document.createElement("div");
|
const lotTypeContainer = document.createElement('div');
|
||||||
lotTypeContainer.className = "panel container--lotType";
|
lotTypeContainer.className = 'panel container--lotType';
|
||||||
lotTypeContainer.dataset.lotTypeId = lotType.lotTypeId.toString();
|
lotTypeContainer.dataset.lotTypeId = lotType.lotTypeId.toString();
|
||||||
lotTypeContainer.innerHTML =
|
lotTypeContainer.innerHTML =
|
||||||
'<div class="panel-heading">' +
|
'<div class="panel-heading">' +
|
||||||
|
|
@ -314,64 +307,66 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
(expandedLotTypes.has(lotType.lotTypeId)
|
(expandedLotTypes.has(lotType.lotTypeId)
|
||||||
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
|
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
|
||||||
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>') +
|
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>') +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="level-item">' +
|
'<div class="level-item">' +
|
||||||
'<h2 class="title is-4">' +
|
'<h2 class="title is-4">' +
|
||||||
cityssm.escapeHTML(lotType.lotType) +
|
cityssm.escapeHTML(lotType.lotType) +
|
||||||
"</h2>" +
|
'</h2>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="level-right">' +
|
('<div class="level-right">' +
|
||||||
('<div class="level-item">' +
|
('<div class="level-item">' +
|
||||||
'<button class="button is-danger is-small button--deleteLotType" type="button">' +
|
'<button class="button is-danger is-small button--deleteLotType" type="button">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-trash" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-trash" aria-hidden="true"></i></span>' +
|
||||||
"<span>Delete</span>" +
|
'<span>Delete</span>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="level-item">' +
|
('<div class="level-item">' +
|
||||||
'<button class="button is-primary is-small button--editLotType" type="button">' +
|
'<button class="button is-primary is-small button--editLotType" type="button">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||||
"<span>Edit " +
|
'<span>Edit ' +
|
||||||
exports.aliases.lot +
|
exports.aliases.lot +
|
||||||
" Type</span>" +
|
' Type</span>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="level-item">' +
|
('<div class="level-item">' +
|
||||||
'<button class="button is-success is-small button--addLotTypeField" type="button">' +
|
'<button class="button is-success is-small button--addLotTypeField" type="button">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>' +
|
||||||
"<span>Add Field</span>" +
|
'<span>Add Field</span>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="level-item">' +
|
('<div class="level-item">' +
|
||||||
los.getMoveUpDownButtonFieldHTML("button--moveLotTypeUp", "button--moveLotTypeDown") +
|
los.getMoveUpDownButtonFieldHTML('button--moveLotTypeUp', 'button--moveLotTypeDown') +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>";
|
'</div>';
|
||||||
renderLotTypeFields(lotTypeContainer, lotType.lotTypeId, lotType.lotTypeFields);
|
renderLotTypeFields(lotTypeContainer, lotType.lotTypeId, lotType.lotTypeFields);
|
||||||
lotTypeContainer
|
lotTypeContainer
|
||||||
.querySelector(".button--toggleLotTypeFields")
|
.querySelector('.button--toggleLotTypeFields')
|
||||||
.addEventListener("click", toggleLotTypeFields);
|
.addEventListener('click', toggleLotTypeFields);
|
||||||
lotTypeContainer
|
lotTypeContainer
|
||||||
.querySelector(".button--deleteLotType")
|
.querySelector('.button--deleteLotType')
|
||||||
.addEventListener("click", deleteLotType);
|
.addEventListener('click', deleteLotType);
|
||||||
lotTypeContainer
|
lotTypeContainer
|
||||||
.querySelector(".button--editLotType")
|
.querySelector('.button--editLotType')
|
||||||
.addEventListener("click", openEditLotType);
|
.addEventListener('click', openEditLotType);
|
||||||
lotTypeContainer
|
lotTypeContainer
|
||||||
.querySelector(".button--addLotTypeField")
|
.querySelector('.button--addLotTypeField')
|
||||||
.addEventListener("click", openAddLotTypeField);
|
.addEventListener('click', openAddLotTypeField);
|
||||||
lotTypeContainer.querySelector(".button--moveLotTypeUp").addEventListener("click", moveLotType);
|
lotTypeContainer.querySelector('.button--moveLotTypeUp').addEventListener('click', moveLotType);
|
||||||
lotTypeContainer.querySelector(".button--moveLotTypeDown").addEventListener("click", moveLotType);
|
lotTypeContainer.querySelector('.button--moveLotTypeDown').addEventListener('click', moveLotType);
|
||||||
containerElement.append(lotTypeContainer);
|
containerElement.append(lotTypeContainer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
document.querySelector("#button--addLotType").addEventListener("click", () => {
|
document
|
||||||
|
.querySelector('#button--addLotType')
|
||||||
|
.addEventListener('click', () => {
|
||||||
let addCloseModalFunction;
|
let addCloseModalFunction;
|
||||||
function doAdd(submitEvent) {
|
function doAdd(submitEvent) {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddLotType", submitEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doAddLotType', submitEvent.currentTarget, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
addCloseModalFunction();
|
addCloseModalFunction();
|
||||||
lotTypes = responseJSON.lotTypes;
|
lotTypes = responseJSON.lotTypes;
|
||||||
|
|
@ -380,20 +375,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: `Error Adding ${los.escapedAliases.Lot} Type`,
|
title: `Error Adding ${los.escapedAliases.Lot} Type`,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
cityssm.openHtmlModal("adminLotTypes-addLotType", {
|
cityssm.openHtmlModal('adminLotTypes-addLotType', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement);
|
||||||
},
|
},
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
addCloseModalFunction = closeModalFunction;
|
addCloseModalFunction = closeModalFunction;
|
||||||
modalElement.querySelector("#lotTypeAdd--lotType").focus();
|
modalElement.querySelector('#lotTypeAdd--lotType').focus();
|
||||||
modalElement.querySelector("form").addEventListener("submit", doAdd);
|
modalElement.querySelector('form').addEventListener('submit', doAdd);
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
},
|
},
|
||||||
onremoved() {
|
onremoved() {
|
||||||
|
|
|
||||||
|
|
@ -1,405 +1,457 @@
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||||
|
|
||||||
import type * as globalTypes from "../types/globalTypes";
|
import type * as globalTypes from '../types/globalTypes'
|
||||||
import type * as recordTypes from "../types/recordTypes";
|
import type * as recordTypes from '../types/recordTypes'
|
||||||
|
|
||||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||||
|
|
||||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal
|
||||||
declare const bulmaJS: BulmaJS;
|
declare const bulmaJS: BulmaJS
|
||||||
|
|
||||||
(() => {
|
;(() => {
|
||||||
const los = exports.los as globalTypes.LOS;
|
const los = exports.los as globalTypes.LOS
|
||||||
|
|
||||||
const containerElement = document.querySelector("#container--lotTypes") as HTMLElement;
|
const containerElement = document.querySelector(
|
||||||
|
'#container--lotTypes'
|
||||||
|
) as HTMLElement
|
||||||
|
|
||||||
let lotTypes: recordTypes.LotType[] = exports.lotTypes;
|
let lotTypes: recordTypes.LotType[] = exports.lotTypes
|
||||||
delete exports.lotTypes;
|
delete exports.lotTypes
|
||||||
|
|
||||||
const expandedLotTypes = new Set<number>();
|
const expandedLotTypes = new Set<number>()
|
||||||
|
|
||||||
function toggleLotTypeFields(clickEvent: Event) {
|
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)) {
|
if (expandedLotTypes.has(lotTypeId)) {
|
||||||
expandedLotTypes.delete(lotTypeId);
|
expandedLotTypes.delete(lotTypeId)
|
||||||
} else {
|
} else {
|
||||||
expandedLotTypes.add(lotTypeId);
|
expandedLotTypes.add(lotTypeId)
|
||||||
}
|
}
|
||||||
|
|
||||||
toggleButtonElement.innerHTML = expandedLotTypes.has(lotTypeId)
|
toggleButtonElement.innerHTML = expandedLotTypes.has(lotTypeId)
|
||||||
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
|
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
|
||||||
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>';
|
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>'
|
||||||
|
|
||||||
const panelBlockElements = lotTypeElement.querySelectorAll(".panel-block");
|
const panelBlockElements = lotTypeElement.querySelectorAll('.panel-block')
|
||||||
|
|
||||||
for (const panelBlockElement of panelBlockElements) {
|
for (const panelBlockElement of panelBlockElements) {
|
||||||
panelBlockElement.classList.toggle("is-hidden");
|
panelBlockElement.classList.toggle('is-hidden')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function lotTypeResponseHandler(responseJSON: {
|
function lotTypeResponseHandler(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
lotTypes?: recordTypes.LotType[];
|
lotTypes?: recordTypes.LotType[]
|
||||||
}) {
|
}) {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotTypes = responseJSON.lotTypes!;
|
lotTypes = responseJSON.lotTypes!
|
||||||
renderLotTypes();
|
renderLotTypes()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: `Error Updating ${exports.aliases.lot} Type`,
|
title: `Error Updating ${exports.aliases.lot} Type`,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function deleteLotType(clickEvent: Event) {
|
function deleteLotType(clickEvent: Event) {
|
||||||
const lotTypeId = Number.parseInt(
|
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
|
10
|
||||||
);
|
)
|
||||||
|
|
||||||
function doDelete() {
|
function doDelete() {
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/admin/doDeleteLotType",
|
los.urlPrefix + '/admin/doDeleteLotType',
|
||||||
{
|
{
|
||||||
lotTypeId
|
lotTypeId
|
||||||
},
|
},
|
||||||
lotTypeResponseHandler
|
lotTypeResponseHandler
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: `Delete ${exports.aliases.lot} Type`,
|
title: `Delete ${exports.aliases.lot} Type`,
|
||||||
message: `Are you sure you want to delete this ${exports.aliases.lot.toLowerCase()} type?`,
|
message: `Are you sure you want to delete this ${exports.aliases.lot.toLowerCase()} type?`,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: `Yes, Delete ${exports.aliases.lot} Type`,
|
text: `Yes, Delete ${exports.aliases.lot} Type`,
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function openEditLotType(clickEvent: Event) {
|
function openEditLotType(clickEvent: Event) {
|
||||||
const lotTypeId = Number.parseInt(
|
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
|
10
|
||||||
);
|
)
|
||||||
|
|
||||||
const lotType = lotTypes.find((currentLotType) => {
|
const lotType = lotTypes.find((currentLotType) => {
|
||||||
return lotTypeId === currentLotType.lotTypeId;
|
return lotTypeId === currentLotType.lotTypeId
|
||||||
})!;
|
})!
|
||||||
|
|
||||||
let editCloseModalFunction: () => void;
|
let editCloseModalFunction: () => void
|
||||||
|
|
||||||
const doEdit = (submitEvent: SubmitEvent) => {
|
const doEdit = (submitEvent: SubmitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault()
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/admin/doUpdateLotType",
|
los.urlPrefix + '/admin/doUpdateLotType',
|
||||||
submitEvent.currentTarget,
|
submitEvent.currentTarget,
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
occupancyTypes?: recordTypes.OccupancyType[];
|
occupancyTypes?: recordTypes.OccupancyType[]
|
||||||
}) => {
|
}) => {
|
||||||
lotTypeResponseHandler(responseJSON);
|
lotTypeResponseHandler(responseJSON)
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
editCloseModalFunction();
|
editCloseModalFunction()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
cityssm.openHtmlModal("adminLotTypes-editLotType", {
|
cityssm.openHtmlModal('adminLotTypes-editLotType', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement)
|
||||||
|
|
||||||
(modalElement.querySelector("#lotTypeEdit--lotTypeId") 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) {
|
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() {
|
onremoved() {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function openAddLotTypeField(clickEvent: Event) {
|
function openAddLotTypeField(clickEvent: Event) {
|
||||||
const lotTypeId = Number.parseInt(
|
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
|
10
|
||||||
);
|
)
|
||||||
|
|
||||||
let addCloseModalFunction: () => void;
|
let addCloseModalFunction: () => void
|
||||||
|
|
||||||
const doAdd = (submitEvent: SubmitEvent) => {
|
const doAdd = (submitEvent: SubmitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault()
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/admin/doAddLotTypeField",
|
los.urlPrefix + '/admin/doAddLotTypeField',
|
||||||
submitEvent.currentTarget,
|
submitEvent.currentTarget,
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
lotTypes?: recordTypes.LotType[];
|
lotTypes?: recordTypes.LotType[]
|
||||||
lotTypeFieldId?: number;
|
lotTypeFieldId?: number
|
||||||
}) => {
|
}) => {
|
||||||
expandedLotTypes.add(lotTypeId);
|
expandedLotTypes.add(lotTypeId)
|
||||||
lotTypeResponseHandler(responseJSON);
|
lotTypeResponseHandler(responseJSON)
|
||||||
|
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
addCloseModalFunction();
|
addCloseModalFunction()
|
||||||
openEditLotTypeField(lotTypeId, responseJSON.lotTypeFieldId!);
|
openEditLotTypeField(lotTypeId, responseJSON.lotTypeFieldId!)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
cityssm.openHtmlModal("adminLotTypes-addLotTypeField", {
|
cityssm.openHtmlModal('adminLotTypes-addLotTypeField', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement)
|
||||||
|
|
||||||
if (lotTypeId) {
|
if (lotTypeId) {
|
||||||
(modalElement.querySelector("#lotTypeFieldAdd--lotTypeId") as HTMLInputElement).value =
|
;(
|
||||||
lotTypeId.toString();
|
modalElement.querySelector(
|
||||||
|
'#lotTypeFieldAdd--lotTypeId'
|
||||||
|
) as HTMLInputElement
|
||||||
|
).value = lotTypeId.toString()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onshown(modalElement, closeModalFunction) {
|
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() {
|
onremoved() {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function moveLotType(clickEvent: MouseEvent) {
|
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(
|
cityssm.postJSON(
|
||||||
los.urlPrefix +
|
los.urlPrefix +
|
||||||
"/admin/" +
|
'/admin/' +
|
||||||
(buttonElement.dataset.direction === "up" ? "doMoveLotTypeUp" : "doMoveLotTypeDown"),
|
(buttonElement.dataset.direction === 'up'
|
||||||
|
? 'doMoveLotTypeUp'
|
||||||
|
: 'doMoveLotTypeDown'),
|
||||||
{
|
{
|
||||||
lotTypeId,
|
lotTypeId,
|
||||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||||
},
|
},
|
||||||
lotTypeResponseHandler
|
lotTypeResponseHandler
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
function openEditLotTypeField(lotTypeId: number, lotTypeFieldId: number) {
|
function openEditLotTypeField(lotTypeId: number, lotTypeFieldId: number) {
|
||||||
const lotType = lotTypes.find((currentLotType) => {
|
const lotType = lotTypes.find((currentLotType) => {
|
||||||
return currentLotType.lotTypeId === lotTypeId;
|
return currentLotType.lotTypeId === lotTypeId
|
||||||
})!;
|
})!
|
||||||
|
|
||||||
const lotTypeField = lotType.lotTypeFields!.find((currentLotTypeField) => {
|
const lotTypeField = lotType.lotTypeFields!.find((currentLotTypeField) => {
|
||||||
return currentLotTypeField.lotTypeFieldId === lotTypeFieldId;
|
return currentLotTypeField.lotTypeFieldId === lotTypeFieldId
|
||||||
})!;
|
})!
|
||||||
|
|
||||||
let minimumLengthElement: HTMLInputElement;
|
let minimumLengthElement: HTMLInputElement
|
||||||
let maximumLengthElement: HTMLInputElement;
|
let maximumLengthElement: HTMLInputElement
|
||||||
let patternElement: HTMLInputElement;
|
let patternElement: HTMLInputElement
|
||||||
let lotTypeFieldValuesElement: HTMLTextAreaElement;
|
let lotTypeFieldValuesElement: HTMLTextAreaElement
|
||||||
|
|
||||||
let editCloseModalFunction: () => void;
|
let editCloseModalFunction: () => void
|
||||||
|
|
||||||
function updateMaximumLengthMin() {
|
function updateMaximumLengthMin() {
|
||||||
maximumLengthElement.min = minimumLengthElement.value;
|
maximumLengthElement.min = minimumLengthElement.value
|
||||||
}
|
}
|
||||||
|
|
||||||
function toggleInputFields() {
|
function toggleInputFields() {
|
||||||
if (lotTypeFieldValuesElement.value === "") {
|
if (lotTypeFieldValuesElement.value === '') {
|
||||||
minimumLengthElement.disabled = false;
|
minimumLengthElement.disabled = false
|
||||||
maximumLengthElement.disabled = false;
|
maximumLengthElement.disabled = false
|
||||||
patternElement.disabled = false;
|
patternElement.disabled = false
|
||||||
} else {
|
} else {
|
||||||
minimumLengthElement.disabled = true;
|
minimumLengthElement.disabled = true
|
||||||
maximumLengthElement.disabled = true;
|
maximumLengthElement.disabled = true
|
||||||
patternElement.disabled = true;
|
patternElement.disabled = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function doUpdate(submitEvent: SubmitEvent) {
|
function doUpdate(submitEvent: SubmitEvent) {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault()
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/admin/doUpdateLotTypeField",
|
los.urlPrefix + '/admin/doUpdateLotTypeField',
|
||||||
submitEvent.currentTarget,
|
submitEvent.currentTarget,
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
occupancyTypes?: recordTypes.OccupancyType[];
|
occupancyTypes?: recordTypes.OccupancyType[]
|
||||||
}) => {
|
}) => {
|
||||||
lotTypeResponseHandler(responseJSON);
|
lotTypeResponseHandler(responseJSON)
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
editCloseModalFunction();
|
editCloseModalFunction()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
function doDelete() {
|
function doDelete() {
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/admin/doDeleteLotTypeField",
|
los.urlPrefix + '/admin/doDeleteLotTypeField',
|
||||||
{
|
{
|
||||||
lotTypeFieldId
|
lotTypeFieldId
|
||||||
},
|
},
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
lotTypes?: recordTypes.LotType[];
|
lotTypes?: recordTypes.LotType[]
|
||||||
}) => {
|
}) => {
|
||||||
lotTypeResponseHandler(responseJSON);
|
lotTypeResponseHandler(responseJSON)
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
editCloseModalFunction();
|
editCloseModalFunction()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
function confirmDoDelete() {
|
function confirmDoDelete() {
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete Field",
|
title: 'Delete Field',
|
||||||
message:
|
message:
|
||||||
"Are you sure you want to delete this field? Note that historical records that make use of this field will not be affected.",
|
'Are you sure you want to delete this field? Note that historical records that make use of this field will not be affected.',
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete Field",
|
text: 'Yes, Delete Field',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
cityssm.openHtmlModal("adminLotTypes-editLotTypeField", {
|
cityssm.openHtmlModal('adminLotTypes-editLotTypeField', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement)
|
||||||
|
|
||||||
(modalElement.querySelector("#lotTypeFieldEdit--lotTypeFieldId") 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(
|
minimumLengthElement = modalElement.querySelector(
|
||||||
"#lotTypeFieldEdit--minimumLength"
|
'#lotTypeFieldEdit--minimumLength'
|
||||||
) as HTMLInputElement;
|
) as HTMLInputElement
|
||||||
|
|
||||||
minimumLengthElement.value = lotTypeField.minimumLength!.toString();
|
minimumLengthElement.value = lotTypeField.minimumLength!.toString()
|
||||||
|
|
||||||
maximumLengthElement = modalElement.querySelector(
|
maximumLengthElement = modalElement.querySelector(
|
||||||
"#lotTypeFieldEdit--maximumLength"
|
'#lotTypeFieldEdit--maximumLength'
|
||||||
) as HTMLInputElement;
|
) 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(
|
lotTypeFieldValuesElement = modalElement.querySelector(
|
||||||
"#lotTypeFieldEdit--lotTypeFieldValues"
|
'#lotTypeFieldEdit--lotTypeFieldValues'
|
||||||
) as HTMLTextAreaElement;
|
) as HTMLTextAreaElement
|
||||||
|
|
||||||
lotTypeFieldValuesElement.value = lotTypeField.lotTypeFieldValues!;
|
lotTypeFieldValuesElement.value = lotTypeField.lotTypeFieldValues!
|
||||||
|
|
||||||
toggleInputFields();
|
toggleInputFields()
|
||||||
},
|
},
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
editCloseModalFunction = closeModalFunction;
|
editCloseModalFunction = closeModalFunction
|
||||||
|
|
||||||
bulmaJS.init(modalElement);
|
bulmaJS.init(modalElement)
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
cityssm.enableNavBlocker();
|
cityssm.enableNavBlocker()
|
||||||
|
|
||||||
modalElement.querySelector("form")!.addEventListener("submit", doUpdate);
|
modalElement.querySelector('form')!.addEventListener('submit', doUpdate)
|
||||||
|
|
||||||
minimumLengthElement.addEventListener("keyup", updateMaximumLengthMin);
|
minimumLengthElement.addEventListener('keyup', updateMaximumLengthMin)
|
||||||
updateMaximumLengthMin();
|
updateMaximumLengthMin()
|
||||||
|
|
||||||
lotTypeFieldValuesElement.addEventListener("keyup", toggleInputFields);
|
lotTypeFieldValuesElement.addEventListener('keyup', toggleInputFields)
|
||||||
|
|
||||||
modalElement
|
modalElement
|
||||||
.querySelector("#button--deleteLotTypeField")!
|
.querySelector('#button--deleteLotTypeField')!
|
||||||
.addEventListener("click", confirmDoDelete);
|
.addEventListener('click', confirmDoDelete)
|
||||||
},
|
},
|
||||||
onremoved() {
|
onremoved() {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
cityssm.disableNavBlocker();
|
cityssm.disableNavBlocker()
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function openEditLotTypeFieldByClick(clickEvent: Event) {
|
function openEditLotTypeFieldByClick(clickEvent: Event) {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault()
|
||||||
|
|
||||||
const lotTypeFieldId = Number.parseInt(
|
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
|
10
|
||||||
);
|
)
|
||||||
|
|
||||||
const lotTypeId = Number.parseInt(
|
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
|
10
|
||||||
);
|
)
|
||||||
|
|
||||||
openEditLotTypeField(lotTypeId, lotTypeFieldId);
|
openEditLotTypeField(lotTypeId, lotTypeFieldId)
|
||||||
}
|
}
|
||||||
|
|
||||||
function moveLotTypeField(clickEvent: MouseEvent) {
|
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
|
const lotTypeFieldId = (
|
||||||
.lotTypeFieldId;
|
buttonElement.closest('.container--lotTypeField') as HTMLElement
|
||||||
|
).dataset.lotTypeFieldId
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix +
|
los.urlPrefix +
|
||||||
"/admin/" +
|
'/admin/' +
|
||||||
(buttonElement.dataset.direction === "up"
|
(buttonElement.dataset.direction === 'up'
|
||||||
? "doMoveLotTypeFieldUp"
|
? 'doMoveLotTypeFieldUp'
|
||||||
: "doMoveLotTypeFieldDown"),
|
: 'doMoveLotTypeFieldDown'),
|
||||||
{
|
{
|
||||||
lotTypeFieldId,
|
lotTypeFieldId,
|
||||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||||
},
|
},
|
||||||
lotTypeResponseHandler
|
lotTypeResponseHandler
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderLotTypeFields(
|
function renderLotTypeFields(
|
||||||
|
|
@ -409,82 +461,88 @@ declare const bulmaJS: BulmaJS;
|
||||||
) {
|
) {
|
||||||
if (lotTypeFields.length === 0) {
|
if (lotTypeFields.length === 0) {
|
||||||
panelElement.insertAdjacentHTML(
|
panelElement.insertAdjacentHTML(
|
||||||
"beforeend",
|
'beforeend',
|
||||||
'<div class="panel-block is-block' +
|
'<div class="panel-block is-block' +
|
||||||
(expandedLotTypes.has(lotTypeId) ? "" : " is-hidden") +
|
(expandedLotTypes.has(lotTypeId) ? '' : ' is-hidden') +
|
||||||
'">' +
|
'">' +
|
||||||
'<div class="message is-info">' +
|
'<div class="message is-info">' +
|
||||||
'<p class="message-body">There are no additional fields.</p>' +
|
'<p class="message-body">There are no additional fields.</p>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>"
|
'</div>'
|
||||||
);
|
)
|
||||||
} else {
|
} else {
|
||||||
for (const lotTypeField of lotTypeFields) {
|
for (const lotTypeField of lotTypeFields) {
|
||||||
const panelBlockElement = document.createElement("div");
|
const panelBlockElement = document.createElement('div')
|
||||||
panelBlockElement.className = "panel-block is-block container--lotTypeField";
|
panelBlockElement.className =
|
||||||
|
'panel-block is-block container--lotTypeField'
|
||||||
|
|
||||||
if (!expandedLotTypes.has(lotTypeId)) {
|
if (!expandedLotTypes.has(lotTypeId)) {
|
||||||
panelBlockElement.classList.add("is-hidden");
|
panelBlockElement.classList.add('is-hidden')
|
||||||
}
|
}
|
||||||
|
|
||||||
panelBlockElement.dataset.lotTypeFieldId = lotTypeField.lotTypeFieldId.toString();
|
panelBlockElement.dataset.lotTypeFieldId =
|
||||||
|
lotTypeField.lotTypeFieldId.toString()
|
||||||
|
|
||||||
panelBlockElement.innerHTML =
|
panelBlockElement.innerHTML =
|
||||||
'<div class="level is-mobile">' +
|
'<div class="level is-mobile">' +
|
||||||
'<div class="level-left">' +
|
'<div class="level-left">' +
|
||||||
('<div class="level-item">' +
|
('<div class="level-item">' +
|
||||||
'<a class="has-text-weight-bold button--editLotTypeField" href="#">' +
|
'<a class="has-text-weight-bold button--editLotTypeField" href="#">' +
|
||||||
cityssm.escapeHTML(lotTypeField.lotTypeField || "") +
|
cityssm.escapeHTML(lotTypeField.lotTypeField || '') +
|
||||||
"</a>" +
|
'</a>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="level-right">' +
|
'<div class="level-right">' +
|
||||||
('<div class="level-item">' +
|
('<div class="level-item">' +
|
||||||
los.getMoveUpDownButtonFieldHTML(
|
los.getMoveUpDownButtonFieldHTML(
|
||||||
"button--moveLotTypeFieldUp",
|
'button--moveLotTypeFieldUp',
|
||||||
"button--moveLotTypeFieldDown"
|
'button--moveLotTypeFieldDown'
|
||||||
) +
|
) +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>";
|
'</div>'
|
||||||
|
|
||||||
panelBlockElement
|
panelBlockElement
|
||||||
.querySelector(".button--editLotTypeField")!
|
.querySelector('.button--editLotTypeField')!
|
||||||
.addEventListener("click", openEditLotTypeFieldByClick);
|
.addEventListener('click', openEditLotTypeFieldByClick)
|
||||||
|
|
||||||
(
|
;(
|
||||||
panelBlockElement.querySelector(".button--moveLotTypeFieldUp") as HTMLButtonElement
|
panelBlockElement.querySelector(
|
||||||
).addEventListener("click", moveLotTypeField);
|
'.button--moveLotTypeFieldUp'
|
||||||
|
) as HTMLButtonElement
|
||||||
|
).addEventListener('click', moveLotTypeField)
|
||||||
|
|
||||||
(
|
;(
|
||||||
panelBlockElement.querySelector(".button--moveLotTypeFieldDown") as HTMLButtonElement
|
panelBlockElement.querySelector(
|
||||||
).addEventListener("click", moveLotTypeField);
|
'.button--moveLotTypeFieldDown'
|
||||||
|
) as HTMLButtonElement
|
||||||
|
).addEventListener('click', moveLotTypeField)
|
||||||
|
|
||||||
panelElement.append(panelBlockElement);
|
panelElement.append(panelBlockElement)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderLotTypes() {
|
function renderLotTypes() {
|
||||||
containerElement.innerHTML = "";
|
containerElement.innerHTML = ''
|
||||||
|
|
||||||
if (lotTypes.length === 0) {
|
if (lotTypes.length === 0) {
|
||||||
containerElement.insertAdjacentHTML(
|
containerElement.insertAdjacentHTML(
|
||||||
"afterbegin",
|
'afterbegin',
|
||||||
`<div class="message is-warning>
|
`<div class="message is-warning>
|
||||||
<p class="message-body">There are no active ${los.escapedAliases.lot} types.</p>
|
<p class="message-body">There are no active ${los.escapedAliases.lot} types.</p>
|
||||||
</div>`
|
</div>`
|
||||||
);
|
)
|
||||||
|
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const lotType of lotTypes) {
|
for (const lotType of lotTypes) {
|
||||||
const lotTypeContainer = document.createElement("div");
|
const lotTypeContainer = document.createElement('div')
|
||||||
|
|
||||||
lotTypeContainer.className = "panel container--lotType";
|
lotTypeContainer.className = 'panel container--lotType'
|
||||||
|
|
||||||
lotTypeContainer.dataset.lotTypeId = lotType.lotTypeId.toString();
|
lotTypeContainer.dataset.lotTypeId = lotType.lotTypeId.toString()
|
||||||
|
|
||||||
lotTypeContainer.innerHTML =
|
lotTypeContainer.innerHTML =
|
||||||
'<div class="panel-heading">' +
|
'<div class="panel-heading">' +
|
||||||
|
|
@ -495,120 +553,136 @@ declare const bulmaJS: BulmaJS;
|
||||||
(expandedLotTypes.has(lotType.lotTypeId)
|
(expandedLotTypes.has(lotType.lotTypeId)
|
||||||
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
|
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
|
||||||
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>') +
|
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>') +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="level-item">' +
|
'<div class="level-item">' +
|
||||||
'<h2 class="title is-4">' +
|
'<h2 class="title is-4">' +
|
||||||
cityssm.escapeHTML(lotType.lotType) +
|
cityssm.escapeHTML(lotType.lotType) +
|
||||||
"</h2>" +
|
'</h2>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="level-right">' +
|
('<div class="level-right">' +
|
||||||
('<div class="level-item">' +
|
('<div class="level-item">' +
|
||||||
'<button class="button is-danger is-small button--deleteLotType" type="button">' +
|
'<button class="button is-danger is-small button--deleteLotType" type="button">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-trash" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-trash" aria-hidden="true"></i></span>' +
|
||||||
"<span>Delete</span>" +
|
'<span>Delete</span>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="level-item">' +
|
('<div class="level-item">' +
|
||||||
'<button class="button is-primary is-small button--editLotType" type="button">' +
|
'<button class="button is-primary is-small button--editLotType" type="button">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||||
"<span>Edit " +
|
'<span>Edit ' +
|
||||||
exports.aliases.lot +
|
exports.aliases.lot +
|
||||||
" Type</span>" +
|
' Type</span>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="level-item">' +
|
('<div class="level-item">' +
|
||||||
'<button class="button is-success is-small button--addLotTypeField" type="button">' +
|
'<button class="button is-success is-small button--addLotTypeField" type="button">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>' +
|
||||||
"<span>Add Field</span>" +
|
'<span>Add Field</span>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="level-item">' +
|
('<div class="level-item">' +
|
||||||
los.getMoveUpDownButtonFieldHTML("button--moveLotTypeUp", "button--moveLotTypeDown") +
|
los.getMoveUpDownButtonFieldHTML(
|
||||||
"</div>") +
|
'button--moveLotTypeUp',
|
||||||
"</div>") +
|
'button--moveLotTypeDown'
|
||||||
"</div>" +
|
) +
|
||||||
"</div>";
|
'</div>') +
|
||||||
|
'</div>') +
|
||||||
|
'</div>' +
|
||||||
|
'</div>'
|
||||||
|
|
||||||
renderLotTypeFields(lotTypeContainer, lotType.lotTypeId, lotType.lotTypeFields!);
|
renderLotTypeFields(
|
||||||
|
lotTypeContainer,
|
||||||
|
lotType.lotTypeId,
|
||||||
|
lotType.lotTypeFields!
|
||||||
|
)
|
||||||
|
|
||||||
lotTypeContainer
|
lotTypeContainer
|
||||||
.querySelector(".button--toggleLotTypeFields")!
|
.querySelector('.button--toggleLotTypeFields')!
|
||||||
.addEventListener("click", toggleLotTypeFields);
|
.addEventListener('click', toggleLotTypeFields)
|
||||||
|
|
||||||
lotTypeContainer
|
lotTypeContainer
|
||||||
.querySelector(".button--deleteLotType")!
|
.querySelector('.button--deleteLotType')!
|
||||||
.addEventListener("click", deleteLotType);
|
.addEventListener('click', deleteLotType)
|
||||||
|
|
||||||
lotTypeContainer
|
lotTypeContainer
|
||||||
.querySelector(".button--editLotType")!
|
.querySelector('.button--editLotType')!
|
||||||
.addEventListener("click", openEditLotType);
|
.addEventListener('click', openEditLotType)
|
||||||
|
|
||||||
lotTypeContainer
|
lotTypeContainer
|
||||||
.querySelector(".button--addLotTypeField")!
|
.querySelector('.button--addLotTypeField')!
|
||||||
.addEventListener("click", openAddLotTypeField);
|
.addEventListener('click', openAddLotTypeField)
|
||||||
|
|
||||||
(lotTypeContainer.querySelector(".button--moveLotTypeUp") as HTMLButtonElement).addEventListener(
|
;(
|
||||||
"click",
|
lotTypeContainer.querySelector(
|
||||||
moveLotType
|
'.button--moveLotTypeUp'
|
||||||
);
|
) as HTMLButtonElement
|
||||||
|
).addEventListener('click', moveLotType)
|
||||||
|
|
||||||
(
|
;(
|
||||||
lotTypeContainer.querySelector(".button--moveLotTypeDown") as HTMLButtonElement
|
lotTypeContainer.querySelector(
|
||||||
).addEventListener("click", moveLotType);
|
'.button--moveLotTypeDown'
|
||||||
|
) as HTMLButtonElement
|
||||||
|
).addEventListener('click', moveLotType)
|
||||||
|
|
||||||
containerElement.append(lotTypeContainer);
|
containerElement.append(lotTypeContainer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
document.querySelector("#button--addLotType")!.addEventListener("click", () => {
|
document
|
||||||
let addCloseModalFunction: () => void;
|
.querySelector('#button--addLotType')!
|
||||||
|
.addEventListener('click', () => {
|
||||||
|
let addCloseModalFunction: () => void
|
||||||
|
|
||||||
function doAdd(submitEvent: SubmitEvent): void {
|
function doAdd(submitEvent: SubmitEvent): void {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault()
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/admin/doAddLotType",
|
los.urlPrefix + '/admin/doAddLotType',
|
||||||
submitEvent.currentTarget,
|
submitEvent.currentTarget,
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
lotTypes?: recordTypes.LotType[];
|
lotTypes?: recordTypes.LotType[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
addCloseModalFunction();
|
addCloseModalFunction()
|
||||||
lotTypes = responseJSON.lotTypes!;
|
lotTypes = responseJSON.lotTypes!
|
||||||
renderLotTypes();
|
renderLotTypes()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: `Error Adding ${los.escapedAliases.Lot} Type`,
|
title: `Error Adding ${los.escapedAliases.Lot} Type`,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
cityssm.openHtmlModal("adminLotTypes-addLotType", {
|
cityssm.openHtmlModal('adminLotTypes-addLotType', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement)
|
||||||
},
|
},
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
addCloseModalFunction = closeModalFunction;
|
addCloseModalFunction = closeModalFunction
|
||||||
|
|
||||||
(modalElement.querySelector("#lotTypeAdd--lotType") 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() {
|
onremoved() {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
|
|
||||||
renderLotTypes();
|
renderLotTypes()
|
||||||
})();
|
})()
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,8 @@
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
(() => {
|
(() => {
|
||||||
const los = exports.los;
|
const los = exports.los;
|
||||||
const occupancyTypesContainerElement = document.querySelector("#container--occupancyTypes");
|
const occupancyTypesContainerElement = document.querySelector('#container--occupancyTypes');
|
||||||
const occupancyTypePrintsContainerElement = document.querySelector("#container--occupancyTypePrints");
|
const occupancyTypePrintsContainerElement = document.querySelector('#container--occupancyTypePrints');
|
||||||
let occupancyTypes = exports.occupancyTypes;
|
let occupancyTypes = exports.occupancyTypes;
|
||||||
delete exports.occupancyTypes;
|
delete exports.occupancyTypes;
|
||||||
let allOccupancyTypeFields = exports.allOccupancyTypeFields;
|
let allOccupancyTypeFields = exports.allOccupancyTypeFields;
|
||||||
|
|
@ -12,7 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const expandedOccupancyTypes = new Set();
|
const expandedOccupancyTypes = new Set();
|
||||||
function toggleOccupancyTypeFields(clickEvent) {
|
function toggleOccupancyTypeFields(clickEvent) {
|
||||||
const toggleButtonElement = clickEvent.currentTarget;
|
const toggleButtonElement = clickEvent.currentTarget;
|
||||||
const occupancyTypeElement = toggleButtonElement.closest(".container--occupancyType");
|
const occupancyTypeElement = toggleButtonElement.closest('.container--occupancyType');
|
||||||
const occupancyTypeId = Number.parseInt(occupancyTypeElement.dataset.occupancyTypeId, 10);
|
const occupancyTypeId = Number.parseInt(occupancyTypeElement.dataset.occupancyTypeId, 10);
|
||||||
if (expandedOccupancyTypes.has(occupancyTypeId)) {
|
if (expandedOccupancyTypes.has(occupancyTypeId)) {
|
||||||
expandedOccupancyTypes.delete(occupancyTypeId);
|
expandedOccupancyTypes.delete(occupancyTypeId);
|
||||||
|
|
@ -23,9 +23,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
toggleButtonElement.innerHTML = expandedOccupancyTypes.has(occupancyTypeId)
|
toggleButtonElement.innerHTML = expandedOccupancyTypes.has(occupancyTypeId)
|
||||||
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
|
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
|
||||||
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>';
|
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>';
|
||||||
const panelBlockElements = occupancyTypeElement.querySelectorAll(".panel-block");
|
const panelBlockElements = occupancyTypeElement.querySelectorAll('.panel-block');
|
||||||
for (const panelBlockElement of panelBlockElements) {
|
for (const panelBlockElement of panelBlockElements) {
|
||||||
panelBlockElement.classList.toggle("is-hidden");
|
panelBlockElement.classList.toggle('is-hidden');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function occupancyTypeResponseHandler(responseJSON) {
|
function occupancyTypeResponseHandler(responseJSON) {
|
||||||
|
|
@ -36,23 +36,23 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating " + exports.aliases.occupancy + " Type",
|
title: 'Error Updating ' + exports.aliases.occupancy + ' Type',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function deleteOccupancyType(clickEvent) {
|
function deleteOccupancyType(clickEvent) {
|
||||||
const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId, 10);
|
const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--occupancyType').dataset.occupancyTypeId, 10);
|
||||||
function doDelete() {
|
function doDelete() {
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteOccupancyType", {
|
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteOccupancyType', {
|
||||||
occupancyTypeId
|
occupancyTypeId
|
||||||
}, occupancyTypeResponseHandler);
|
}, occupancyTypeResponseHandler);
|
||||||
}
|
}
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: `Delete ${exports.aliases.occupancy} Type`,
|
title: `Delete ${exports.aliases.occupancy} Type`,
|
||||||
message: `Are you sure you want to delete this ${exports.aliases.occupancy.toLowerCase()} type?`,
|
message: `Are you sure you want to delete this ${exports.aliases.occupancy.toLowerCase()} type?`,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: `Yes, Delete ${exports.aliases.occupancy} Type`,
|
text: `Yes, Delete ${exports.aliases.occupancy} Type`,
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
|
|
@ -60,30 +60,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function openEditOccupancyType(clickEvent) {
|
function openEditOccupancyType(clickEvent) {
|
||||||
const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId, 10);
|
const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--occupancyType').dataset.occupancyTypeId, 10);
|
||||||
const occupancyType = occupancyTypes.find((currentOccupancyType) => {
|
const occupancyType = occupancyTypes.find((currentOccupancyType) => {
|
||||||
return occupancyTypeId === currentOccupancyType.occupancyTypeId;
|
return occupancyTypeId === currentOccupancyType.occupancyTypeId;
|
||||||
});
|
});
|
||||||
let editCloseModalFunction;
|
let editCloseModalFunction;
|
||||||
function doEdit(submitEvent) {
|
function doEdit(submitEvent) {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateOccupancyType", submitEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateOccupancyType', submitEvent.currentTarget, (responseJSON) => {
|
||||||
occupancyTypeResponseHandler(responseJSON);
|
occupancyTypeResponseHandler(responseJSON);
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
editCloseModalFunction();
|
editCloseModalFunction();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
cityssm.openHtmlModal("adminOccupancyTypes-editOccupancyType", {
|
cityssm.openHtmlModal('adminOccupancyTypes-editOccupancyType', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement);
|
||||||
modalElement.querySelector("#occupancyTypeEdit--occupancyTypeId").value = occupancyTypeId.toString();
|
modalElement.querySelector('#occupancyTypeEdit--occupancyTypeId').value = occupancyTypeId.toString();
|
||||||
modalElement.querySelector("#occupancyTypeEdit--occupancyType").value = occupancyType.occupancyType;
|
modalElement.querySelector('#occupancyTypeEdit--occupancyType').value = occupancyType.occupancyType;
|
||||||
},
|
},
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
editCloseModalFunction = closeModalFunction;
|
editCloseModalFunction = closeModalFunction;
|
||||||
modalElement.querySelector("#occupancyTypeEdit--occupancyType").focus();
|
modalElement.querySelector('#occupancyTypeEdit--occupancyType').focus();
|
||||||
modalElement.querySelector("form").addEventListener("submit", doEdit);
|
modalElement.querySelector('form').addEventListener('submit', doEdit);
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
},
|
},
|
||||||
onremoved() {
|
onremoved() {
|
||||||
|
|
@ -92,11 +92,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function openAddOccupancyTypeField(clickEvent) {
|
function openAddOccupancyTypeField(clickEvent) {
|
||||||
const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId, 10);
|
const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--occupancyType').dataset.occupancyTypeId, 10);
|
||||||
let addCloseModalFunction;
|
let addCloseModalFunction;
|
||||||
function doAdd(submitEvent) {
|
function doAdd(submitEvent) {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddOccupancyTypeField", submitEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doAddOccupancyTypeField', submitEvent.currentTarget, (responseJSON) => {
|
||||||
expandedOccupancyTypes.add(occupancyTypeId);
|
expandedOccupancyTypes.add(occupancyTypeId);
|
||||||
occupancyTypeResponseHandler(responseJSON);
|
occupancyTypeResponseHandler(responseJSON);
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
|
|
@ -105,17 +105,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyTypeField", {
|
cityssm.openHtmlModal('adminOccupancyTypes-addOccupancyTypeField', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement);
|
||||||
if (occupancyTypeId) {
|
if (occupancyTypeId) {
|
||||||
modalElement.querySelector("#occupancyTypeFieldAdd--occupancyTypeId").value = occupancyTypeId.toString();
|
;
|
||||||
|
modalElement.querySelector('#occupancyTypeFieldAdd--occupancyTypeId').value = occupancyTypeId.toString();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
addCloseModalFunction = closeModalFunction;
|
addCloseModalFunction = closeModalFunction;
|
||||||
modalElement.querySelector("#occupancyTypeFieldAdd--occupancyTypeField").focus();
|
modalElement.querySelector('#occupancyTypeFieldAdd--occupancyTypeField').focus();
|
||||||
modalElement.querySelector("form").addEventListener("submit", doAdd);
|
modalElement.querySelector('form').addEventListener('submit', doAdd);
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
},
|
},
|
||||||
onremoved() {
|
onremoved() {
|
||||||
|
|
@ -125,14 +126,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
function moveOccupancyType(clickEvent) {
|
function moveOccupancyType(clickEvent) {
|
||||||
const buttonElement = clickEvent.currentTarget;
|
const buttonElement = clickEvent.currentTarget;
|
||||||
const occupancyTypeId = clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId;
|
const occupancyTypeId = clickEvent.currentTarget.closest('.container--occupancyType').dataset.occupancyTypeId;
|
||||||
cityssm.postJSON(los.urlPrefix +
|
cityssm.postJSON(los.urlPrefix +
|
||||||
"/admin/" +
|
'/admin/' +
|
||||||
(buttonElement.dataset.direction === "up"
|
(buttonElement.dataset.direction === 'up'
|
||||||
? "doMoveOccupancyTypeUp"
|
? 'doMoveOccupancyTypeUp'
|
||||||
: "doMoveOccupancyTypeDown"), {
|
: 'doMoveOccupancyTypeDown'), {
|
||||||
occupancyTypeId,
|
occupancyTypeId,
|
||||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||||
}, occupancyTypeResponseHandler);
|
}, occupancyTypeResponseHandler);
|
||||||
}
|
}
|
||||||
function openEditOccupancyTypeField(occupancyTypeId, occupancyTypeFieldId) {
|
function openEditOccupancyTypeField(occupancyTypeId, occupancyTypeFieldId) {
|
||||||
|
|
@ -142,8 +143,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
return currentOccupancyType.occupancyTypeId === occupancyTypeId;
|
return currentOccupancyType.occupancyTypeId === occupancyTypeId;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
const occupancyTypeField = (occupancyType ? occupancyType.occupancyTypeFields : allOccupancyTypeFields).find((currentOccupancyTypeField) => {
|
const occupancyTypeField = (occupancyType
|
||||||
return currentOccupancyTypeField.occupancyTypeFieldId === occupancyTypeFieldId;
|
? occupancyType.occupancyTypeFields
|
||||||
|
: allOccupancyTypeFields).find((currentOccupancyTypeField) => {
|
||||||
|
return (currentOccupancyTypeField.occupancyTypeFieldId === occupancyTypeFieldId);
|
||||||
});
|
});
|
||||||
let minimumLengthElement;
|
let minimumLengthElement;
|
||||||
let maximumLengthElement;
|
let maximumLengthElement;
|
||||||
|
|
@ -154,7 +157,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
maximumLengthElement.min = minimumLengthElement.value;
|
maximumLengthElement.min = minimumLengthElement.value;
|
||||||
}
|
}
|
||||||
function toggleInputFields() {
|
function toggleInputFields() {
|
||||||
if (occupancyTypeFieldValuesElement.value === "") {
|
if (occupancyTypeFieldValuesElement.value === '') {
|
||||||
minimumLengthElement.disabled = false;
|
minimumLengthElement.disabled = false;
|
||||||
maximumLengthElement.disabled = false;
|
maximumLengthElement.disabled = false;
|
||||||
patternElement.disabled = false;
|
patternElement.disabled = false;
|
||||||
|
|
@ -167,7 +170,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
function doUpdate(submitEvent) {
|
function doUpdate(submitEvent) {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateOccupancyTypeField", submitEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateOccupancyTypeField', submitEvent.currentTarget, (responseJSON) => {
|
||||||
occupancyTypeResponseHandler(responseJSON);
|
occupancyTypeResponseHandler(responseJSON);
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
editCloseModalFunction();
|
editCloseModalFunction();
|
||||||
|
|
@ -175,7 +178,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function doDelete() {
|
function doDelete() {
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteOccupancyTypeField", {
|
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteOccupancyTypeField', {
|
||||||
occupancyTypeFieldId
|
occupancyTypeFieldId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
occupancyTypeResponseHandler(responseJSON);
|
occupancyTypeResponseHandler(responseJSON);
|
||||||
|
|
@ -186,28 +189,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
function confirmDoDelete() {
|
function confirmDoDelete() {
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete Field",
|
title: 'Delete Field',
|
||||||
message: "Are you sure you want to delete this field? Note that historical records that make use of this field will not be affected.",
|
message: 'Are you sure you want to delete this field? Note that historical records that make use of this field will not be affected.',
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete Field",
|
text: 'Yes, Delete Field',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
cityssm.openHtmlModal("adminOccupancyTypes-editOccupancyTypeField", {
|
cityssm.openHtmlModal('adminOccupancyTypes-editOccupancyTypeField', {
|
||||||
onshow: (modalElement) => {
|
onshow: (modalElement) => {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement);
|
||||||
modalElement.querySelector("#occupancyTypeFieldEdit--occupancyTypeFieldId").value = occupancyTypeField.occupancyTypeFieldId.toString();
|
modalElement.querySelector('#occupancyTypeFieldEdit--occupancyTypeFieldId').value = occupancyTypeField.occupancyTypeFieldId.toString();
|
||||||
modalElement.querySelector("#occupancyTypeFieldEdit--occupancyTypeField").value = occupancyTypeField.occupancyTypeField;
|
modalElement.querySelector('#occupancyTypeFieldEdit--occupancyTypeField').value = occupancyTypeField.occupancyTypeField;
|
||||||
modalElement.querySelector("#occupancyTypeFieldEdit--isRequired").value = occupancyTypeField.isRequired ? "1" : "0";
|
modalElement.querySelector('#occupancyTypeFieldEdit--isRequired').value = occupancyTypeField.isRequired ? '1' : '0';
|
||||||
minimumLengthElement = modalElement.querySelector("#occupancyTypeFieldEdit--minimumLength");
|
minimumLengthElement = modalElement.querySelector('#occupancyTypeFieldEdit--minimumLength');
|
||||||
minimumLengthElement.value = occupancyTypeField.minimumLength.toString();
|
minimumLengthElement.value =
|
||||||
maximumLengthElement = modalElement.querySelector("#occupancyTypeFieldEdit--maximumLength");
|
occupancyTypeField.minimumLength.toString();
|
||||||
maximumLengthElement.value = occupancyTypeField.maximumLength.toString();
|
maximumLengthElement = modalElement.querySelector('#occupancyTypeFieldEdit--maximumLength');
|
||||||
patternElement = modalElement.querySelector("#occupancyTypeFieldEdit--pattern");
|
maximumLengthElement.value =
|
||||||
|
occupancyTypeField.maximumLength.toString();
|
||||||
|
patternElement = modalElement.querySelector('#occupancyTypeFieldEdit--pattern');
|
||||||
patternElement.value = occupancyTypeField.pattern;
|
patternElement.value = occupancyTypeField.pattern;
|
||||||
occupancyTypeFieldValuesElement = modalElement.querySelector("#occupancyTypeFieldEdit--occupancyTypeFieldValues");
|
occupancyTypeFieldValuesElement = modalElement.querySelector('#occupancyTypeFieldEdit--occupancyTypeFieldValues');
|
||||||
occupancyTypeFieldValuesElement.value =
|
occupancyTypeFieldValuesElement.value =
|
||||||
occupancyTypeField.occupancyTypeFieldValues;
|
occupancyTypeField.occupancyTypeFieldValues;
|
||||||
toggleInputFields();
|
toggleInputFields();
|
||||||
|
|
@ -217,13 +222,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
bulmaJS.init(modalElement);
|
bulmaJS.init(modalElement);
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
cityssm.enableNavBlocker();
|
cityssm.enableNavBlocker();
|
||||||
modalElement.querySelector("form").addEventListener("submit", doUpdate);
|
modalElement.querySelector('form').addEventListener('submit', doUpdate);
|
||||||
minimumLengthElement.addEventListener("keyup", updateMaximumLengthMin);
|
minimumLengthElement.addEventListener('keyup', updateMaximumLengthMin);
|
||||||
updateMaximumLengthMin();
|
updateMaximumLengthMin();
|
||||||
occupancyTypeFieldValuesElement.addEventListener("keyup", toggleInputFields);
|
occupancyTypeFieldValuesElement.addEventListener('keyup', toggleInputFields);
|
||||||
modalElement
|
modalElement
|
||||||
.querySelector("#button--deleteOccupancyTypeField")
|
.querySelector('#button--deleteOccupancyTypeField')
|
||||||
.addEventListener("click", confirmDoDelete);
|
.addEventListener('click', confirmDoDelete);
|
||||||
},
|
},
|
||||||
onremoved: () => {
|
onremoved: () => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
|
|
@ -233,40 +238,41 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
function openEditOccupancyTypeFieldByClick(clickEvent) {
|
function openEditOccupancyTypeFieldByClick(clickEvent) {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault();
|
||||||
const occupancyTypeFieldId = Number.parseInt(clickEvent.currentTarget.closest(".container--occupancyTypeField").dataset.occupancyTypeFieldId, 10);
|
const occupancyTypeFieldId = Number.parseInt(clickEvent.currentTarget.closest('.container--occupancyTypeField').dataset.occupancyTypeFieldId, 10);
|
||||||
const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId, 10);
|
const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--occupancyType').dataset.occupancyTypeId, 10);
|
||||||
openEditOccupancyTypeField(occupancyTypeId, occupancyTypeFieldId);
|
openEditOccupancyTypeField(occupancyTypeId, occupancyTypeFieldId);
|
||||||
}
|
}
|
||||||
function moveOccupancyTypeField(clickEvent) {
|
function moveOccupancyTypeField(clickEvent) {
|
||||||
const buttonElement = clickEvent.currentTarget;
|
const buttonElement = clickEvent.currentTarget;
|
||||||
const occupancyTypeFieldId = clickEvent.currentTarget.closest(".container--occupancyTypeField").dataset.occupancyTypeFieldId;
|
const occupancyTypeFieldId = clickEvent.currentTarget.closest('.container--occupancyTypeField').dataset.occupancyTypeFieldId;
|
||||||
cityssm.postJSON(los.urlPrefix +
|
cityssm.postJSON(los.urlPrefix +
|
||||||
"/admin/" +
|
'/admin/' +
|
||||||
(buttonElement.dataset.direction === "up"
|
(buttonElement.dataset.direction === 'up'
|
||||||
? "doMoveOccupancyTypeFieldUp"
|
? 'doMoveOccupancyTypeFieldUp'
|
||||||
: "doMoveOccupancyTypeFieldDown"), {
|
: 'doMoveOccupancyTypeFieldDown'), {
|
||||||
occupancyTypeFieldId,
|
occupancyTypeFieldId,
|
||||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||||
}, occupancyTypeResponseHandler);
|
}, occupancyTypeResponseHandler);
|
||||||
}
|
}
|
||||||
function renderOccupancyTypeFields(panelElement, occupancyTypeId, occupancyTypeFields) {
|
function renderOccupancyTypeFields(panelElement, occupancyTypeId, occupancyTypeFields) {
|
||||||
if (occupancyTypeFields.length === 0) {
|
if (occupancyTypeFields.length === 0) {
|
||||||
panelElement.insertAdjacentHTML("beforeend", '<div class="panel-block is-block' +
|
panelElement.insertAdjacentHTML('beforeend', '<div class="panel-block is-block' +
|
||||||
(!occupancyTypeId || expandedOccupancyTypes.has(occupancyTypeId)
|
(!occupancyTypeId || expandedOccupancyTypes.has(occupancyTypeId)
|
||||||
? ""
|
? ''
|
||||||
: " is-hidden") +
|
: ' is-hidden') +
|
||||||
'">' +
|
'">' +
|
||||||
'<div class="message is-info">' +
|
'<div class="message is-info">' +
|
||||||
'<p class="message-body">There are no additional fields.</p>' +
|
'<p class="message-body">There are no additional fields.</p>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>");
|
'</div>');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for (const occupancyTypeField of occupancyTypeFields) {
|
for (const occupancyTypeField of occupancyTypeFields) {
|
||||||
const panelBlockElement = document.createElement("div");
|
const panelBlockElement = document.createElement('div');
|
||||||
panelBlockElement.className = "panel-block is-block container--occupancyTypeField";
|
panelBlockElement.className =
|
||||||
|
'panel-block is-block container--occupancyTypeField';
|
||||||
if (occupancyTypeId && !expandedOccupancyTypes.has(occupancyTypeId)) {
|
if (occupancyTypeId && !expandedOccupancyTypes.has(occupancyTypeId)) {
|
||||||
panelBlockElement.classList.add("is-hidden");
|
panelBlockElement.classList.add('is-hidden');
|
||||||
}
|
}
|
||||||
panelBlockElement.dataset.occupancyTypeFieldId =
|
panelBlockElement.dataset.occupancyTypeFieldId =
|
||||||
occupancyTypeField.occupancyTypeFieldId.toString();
|
occupancyTypeField.occupancyTypeFieldId.toString();
|
||||||
|
|
@ -275,44 +281,44 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
'<div class="level-left">' +
|
'<div class="level-left">' +
|
||||||
('<div class="level-item">' +
|
('<div class="level-item">' +
|
||||||
'<a class="has-text-weight-bold button--editOccupancyTypeField" href="#">' +
|
'<a class="has-text-weight-bold button--editOccupancyTypeField" href="#">' +
|
||||||
cityssm.escapeHTML(occupancyTypeField.occupancyTypeField || "") +
|
cityssm.escapeHTML(occupancyTypeField.occupancyTypeField || '') +
|
||||||
"</a>" +
|
'</a>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="level-right">' +
|
'<div class="level-right">' +
|
||||||
('<div class="level-item">' +
|
('<div class="level-item">' +
|
||||||
los.getMoveUpDownButtonFieldHTML("button--moveOccupancyTypeFieldUp", "button--moveOccupancyTypeFieldDown") +
|
los.getMoveUpDownButtonFieldHTML('button--moveOccupancyTypeFieldUp', 'button--moveOccupancyTypeFieldDown') +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>";
|
'</div>';
|
||||||
panelBlockElement
|
panelBlockElement
|
||||||
.querySelector(".button--editOccupancyTypeField")
|
.querySelector('.button--editOccupancyTypeField')
|
||||||
.addEventListener("click", openEditOccupancyTypeFieldByClick);
|
.addEventListener('click', openEditOccupancyTypeFieldByClick);
|
||||||
panelBlockElement.querySelector(".button--moveOccupancyTypeFieldUp").addEventListener("click", moveOccupancyTypeField);
|
panelBlockElement.querySelector('.button--moveOccupancyTypeFieldUp').addEventListener('click', moveOccupancyTypeField);
|
||||||
panelBlockElement.querySelector(".button--moveOccupancyTypeFieldDown").addEventListener("click", moveOccupancyTypeField);
|
panelBlockElement.querySelector('.button--moveOccupancyTypeFieldDown').addEventListener('click', moveOccupancyTypeField);
|
||||||
panelElement.append(panelBlockElement);
|
panelElement.append(panelBlockElement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function openAddOccupancyTypePrint(clickEvent) {
|
function openAddOccupancyTypePrint(clickEvent) {
|
||||||
const occupancyTypeId = clickEvent.currentTarget.closest(".container--occupancyTypePrintList").dataset.occupancyTypeId;
|
const occupancyTypeId = clickEvent.currentTarget.closest('.container--occupancyTypePrintList').dataset.occupancyTypeId;
|
||||||
let closeAddModalFunction;
|
let closeAddModalFunction;
|
||||||
function doAdd(formEvent) {
|
function doAdd(formEvent) {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddOccupancyTypePrint", formEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doAddOccupancyTypePrint', formEvent.currentTarget, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
closeAddModalFunction();
|
closeAddModalFunction();
|
||||||
}
|
}
|
||||||
occupancyTypeResponseHandler(responseJSON);
|
occupancyTypeResponseHandler(responseJSON);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyTypePrint", {
|
cityssm.openHtmlModal('adminOccupancyTypes-addOccupancyTypePrint', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement);
|
||||||
modalElement.querySelector("#occupancyTypePrintAdd--occupancyTypeId").value = occupancyTypeId;
|
modalElement.querySelector('#occupancyTypePrintAdd--occupancyTypeId').value = occupancyTypeId;
|
||||||
const printSelectElement = modalElement.querySelector("#occupancyTypePrintAdd--printEJS");
|
const printSelectElement = modalElement.querySelector('#occupancyTypePrintAdd--printEJS');
|
||||||
for (const [printEJS, printTitle] of Object.entries(exports.occupancyTypePrintTitles)) {
|
for (const [printEJS, printTitle] of Object.entries(exports.occupancyTypePrintTitles)) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option');
|
||||||
optionElement.value = printEJS;
|
optionElement.value = printEJS;
|
||||||
optionElement.textContent = printTitle;
|
optionElement.textContent = printTitle;
|
||||||
printSelectElement.append(optionElement);
|
printSelectElement.append(optionElement);
|
||||||
|
|
@ -321,48 +327,47 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
var _a;
|
var _a;
|
||||||
closeAddModalFunction = closeModalFunction;
|
closeAddModalFunction = closeModalFunction;
|
||||||
(_a = modalElement.querySelector("form")) === null || _a === void 0 ? void 0 : _a.addEventListener("submit", doAdd);
|
(_a = modalElement.querySelector('form')) === null || _a === void 0 ? void 0 : _a.addEventListener('submit', doAdd);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function moveOccupancyTypePrint(clickEvent) {
|
function moveOccupancyTypePrint(clickEvent) {
|
||||||
const buttonElement = clickEvent.currentTarget;
|
const buttonElement = clickEvent.currentTarget;
|
||||||
const printEJS = buttonElement.closest(".container--occupancyTypePrint")
|
const printEJS = buttonElement.closest('.container--occupancyTypePrint').dataset.printEJS;
|
||||||
.dataset.printEJS;
|
const occupancyTypeId = buttonElement.closest('.container--occupancyTypePrintList').dataset.occupancyTypeId;
|
||||||
const occupancyTypeId = buttonElement.closest(".container--occupancyTypePrintList").dataset.occupancyTypeId;
|
|
||||||
cityssm.postJSON(los.urlPrefix +
|
cityssm.postJSON(los.urlPrefix +
|
||||||
"/admin/" +
|
'/admin/' +
|
||||||
(buttonElement.dataset.direction === "up"
|
(buttonElement.dataset.direction === 'up'
|
||||||
? "doMoveOccupancyTypePrintUp"
|
? 'doMoveOccupancyTypePrintUp'
|
||||||
: "doMoveOccupancyTypePrintDown"), {
|
: 'doMoveOccupancyTypePrintDown'), {
|
||||||
occupancyTypeId,
|
occupancyTypeId,
|
||||||
printEJS,
|
printEJS,
|
||||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||||
}, occupancyTypeResponseHandler);
|
}, occupancyTypeResponseHandler);
|
||||||
}
|
}
|
||||||
function deleteOccupancyTypePrint(clickEvent) {
|
function deleteOccupancyTypePrint(clickEvent) {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault();
|
||||||
const printEJS = clickEvent.currentTarget.closest(".container--occupancyTypePrint").dataset.printEJS;
|
const printEJS = clickEvent.currentTarget.closest('.container--occupancyTypePrint').dataset.printEJS;
|
||||||
const occupancyTypeId = clickEvent.currentTarget.closest(".container--occupancyTypePrintList").dataset.occupancyTypeId;
|
const occupancyTypeId = clickEvent.currentTarget.closest('.container--occupancyTypePrintList').dataset.occupancyTypeId;
|
||||||
function doDelete() {
|
function doDelete() {
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteOccupancyTypePrint", {
|
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteOccupancyTypePrint', {
|
||||||
occupancyTypeId,
|
occupancyTypeId,
|
||||||
printEJS
|
printEJS
|
||||||
}, occupancyTypeResponseHandler);
|
}, occupancyTypeResponseHandler);
|
||||||
}
|
}
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete Print",
|
title: 'Delete Print',
|
||||||
message: "Are you sure you want to remove this print option?",
|
message: 'Are you sure you want to remove this print option?',
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Remove Print",
|
text: 'Yes, Remove Print',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function renderOccupancyTypePrints(panelElement, occupancyTypeId, occupancyTypePrints) {
|
function renderOccupancyTypePrints(panelElement, occupancyTypeId, occupancyTypePrints) {
|
||||||
if (occupancyTypePrints.length === 0) {
|
if (occupancyTypePrints.length === 0) {
|
||||||
panelElement.insertAdjacentHTML("beforeend", `<div class="panel-block is-block">
|
panelElement.insertAdjacentHTML('beforeend', `<div class="panel-block is-block">
|
||||||
<div class="message is-info">
|
<div class="message is-info">
|
||||||
<p class="message-body">There are no prints associated with this record.</p>
|
<p class="message-body">There are no prints associated with this record.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -370,18 +375,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for (const printEJS of occupancyTypePrints) {
|
for (const printEJS of occupancyTypePrints) {
|
||||||
const panelBlockElement = document.createElement("div");
|
const panelBlockElement = document.createElement('div');
|
||||||
panelBlockElement.className = "panel-block is-block container--occupancyTypePrint";
|
panelBlockElement.className =
|
||||||
|
'panel-block is-block container--occupancyTypePrint';
|
||||||
panelBlockElement.dataset.printEJS = printEJS;
|
panelBlockElement.dataset.printEJS = printEJS;
|
||||||
const printTitle = printEJS === "*"
|
const printTitle = printEJS === '*'
|
||||||
? "(All Available Prints)"
|
? '(All Available Prints)'
|
||||||
: exports.occupancyTypePrintTitles[printEJS];
|
: exports.occupancyTypePrintTitles[printEJS];
|
||||||
let printIconClass = "fa-star";
|
let printIconClass = 'fa-star';
|
||||||
if (printEJS.startsWith("pdf/")) {
|
if (printEJS.startsWith('pdf/')) {
|
||||||
printIconClass = "fa-file-pdf";
|
printIconClass = 'fa-file-pdf';
|
||||||
}
|
}
|
||||||
else if (printEJS.startsWith("screen/")) {
|
else if (printEJS.startsWith('screen/')) {
|
||||||
printIconClass = "fa-file";
|
printIconClass = 'fa-file';
|
||||||
}
|
}
|
||||||
panelBlockElement.innerHTML =
|
panelBlockElement.innerHTML =
|
||||||
'<div class="level is-mobile">' +
|
'<div class="level is-mobile">' +
|
||||||
|
|
@ -390,28 +396,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
'<i class="fas fa-fw ' +
|
'<i class="fas fa-fw ' +
|
||||||
printIconClass +
|
printIconClass +
|
||||||
'" aria-hidden="true"></i>' +
|
'" aria-hidden="true"></i>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="level-item">' +
|
('<div class="level-item">' +
|
||||||
cityssm.escapeHTML(printTitle || printEJS) +
|
cityssm.escapeHTML(printTitle || printEJS) +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="level-right">' +
|
'<div class="level-right">' +
|
||||||
('<div class="level-item">' +
|
('<div class="level-item">' +
|
||||||
los.getMoveUpDownButtonFieldHTML("button--moveOccupancyTypePrintUp", "button--moveOccupancyTypePrintDown") +
|
los.getMoveUpDownButtonFieldHTML('button--moveOccupancyTypePrintUp', 'button--moveOccupancyTypePrintDown') +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="level-item">' +
|
('<div class="level-item">' +
|
||||||
'<button class="button is-small is-danger button--deleteOccupancyTypePrint" data-tooltip="Delete" type="button" aria-label="Delete Print">' +
|
'<button class="button is-small is-danger button--deleteOccupancyTypePrint" data-tooltip="Delete" type="button" aria-label="Delete Print">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>";
|
'</div>';
|
||||||
panelBlockElement.querySelector(".button--moveOccupancyTypePrintUp").addEventListener("click", moveOccupancyTypePrint);
|
panelBlockElement.querySelector('.button--moveOccupancyTypePrintUp').addEventListener('click', moveOccupancyTypePrint);
|
||||||
panelBlockElement.querySelector(".button--moveOccupancyTypePrintDown").addEventListener("click", moveOccupancyTypePrint);
|
panelBlockElement.querySelector('.button--moveOccupancyTypePrintDown').addEventListener('click', moveOccupancyTypePrint);
|
||||||
panelBlockElement
|
panelBlockElement
|
||||||
.querySelector(".button--deleteOccupancyTypePrint")
|
.querySelector('.button--deleteOccupancyTypePrint')
|
||||||
.addEventListener("click", deleteOccupancyTypePrint);
|
.addEventListener('click', deleteOccupancyTypePrint);
|
||||||
panelElement.append(panelBlockElement);
|
panelElement.append(panelBlockElement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -425,30 +431,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
'<div class="level-item">' +
|
'<div class="level-item">' +
|
||||||
('<h2 class="title is-4">(All ' +
|
('<h2 class="title is-4">(All ' +
|
||||||
cityssm.escapeHTML(exports.aliases.occupancy) +
|
cityssm.escapeHTML(exports.aliases.occupancy) +
|
||||||
" Types)</h2>") +
|
' Types)</h2>') +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="level-right">' +
|
('<div class="level-right">' +
|
||||||
('<div class="level-item">' +
|
('<div class="level-item">' +
|
||||||
'<button class="button is-success is-small button--addOccupancyTypeField" type="button">' +
|
'<button class="button is-success is-small button--addOccupancyTypeField" type="button">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>' +
|
||||||
"<span>Add Field</span>" +
|
'<span>Add Field</span>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>";
|
'</div>';
|
||||||
occupancyTypePrintsContainerElement.innerHTML = "";
|
occupancyTypePrintsContainerElement.innerHTML = '';
|
||||||
renderOccupancyTypeFields(occupancyTypesContainerElement.querySelector("#container--allOccupancyTypeFields"), undefined, allOccupancyTypeFields);
|
renderOccupancyTypeFields(occupancyTypesContainerElement.querySelector('#container--allOccupancyTypeFields'), undefined, allOccupancyTypeFields);
|
||||||
occupancyTypesContainerElement
|
occupancyTypesContainerElement
|
||||||
.querySelector(".button--addOccupancyTypeField")
|
.querySelector('.button--addOccupancyTypeField')
|
||||||
.addEventListener("click", openAddOccupancyTypeField);
|
.addEventListener('click', openAddOccupancyTypeField);
|
||||||
if (occupancyTypes.length === 0) {
|
if (occupancyTypes.length === 0) {
|
||||||
occupancyTypesContainerElement.insertAdjacentHTML("afterbegin", `<div class="message is-warning>
|
occupancyTypesContainerElement.insertAdjacentHTML('afterbegin', `<div class="message is-warning>
|
||||||
<p class="message-body">There are no active ${los.escapedAliases.occupancy} types.</p>
|
<p class="message-body">There are no active ${los.escapedAliases.occupancy} types.</p>
|
||||||
</div>`);
|
</div>`);
|
||||||
occupancyTypePrintsContainerElement.insertAdjacentHTML("afterbegin", `<div class="message is-warning>
|
occupancyTypePrintsContainerElement.insertAdjacentHTML('afterbegin', `<div class="message is-warning>
|
||||||
<p class="message-body">There are no active ${los.escapedAliases.occupancy} types.</p>
|
<p class="message-body">There are no active ${los.escapedAliases.occupancy} types.</p>
|
||||||
</div>`);
|
</div>`);
|
||||||
return;
|
return;
|
||||||
|
|
@ -456,8 +462,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
for (const occupancyType of occupancyTypes) {
|
for (const occupancyType of occupancyTypes) {
|
||||||
// Types and Fields
|
// Types and Fields
|
||||||
{
|
{
|
||||||
const occupancyTypeContainer = document.createElement("div");
|
const occupancyTypeContainer = document.createElement('div');
|
||||||
occupancyTypeContainer.className = "panel container--occupancyType";
|
occupancyTypeContainer.className = 'panel container--occupancyType';
|
||||||
occupancyTypeContainer.dataset.occupancyTypeId =
|
occupancyTypeContainer.dataset.occupancyTypeId =
|
||||||
occupancyType.occupancyTypeId.toString();
|
occupancyType.occupancyTypeId.toString();
|
||||||
occupancyTypeContainer.innerHTML =
|
occupancyTypeContainer.innerHTML =
|
||||||
|
|
@ -469,62 +475,63 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
(expandedOccupancyTypes.has(occupancyType.occupancyTypeId)
|
(expandedOccupancyTypes.has(occupancyType.occupancyTypeId)
|
||||||
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
|
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
|
||||||
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>') +
|
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>') +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="level-item">' +
|
'<div class="level-item">' +
|
||||||
'<h2 class="title is-4">' +
|
'<h2 class="title is-4">' +
|
||||||
cityssm.escapeHTML(occupancyType.occupancyType) +
|
cityssm.escapeHTML(occupancyType.occupancyType) +
|
||||||
"</h2>" +
|
'</h2>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="level-right">' +
|
('<div class="level-right">' +
|
||||||
('<div class="level-item">' +
|
('<div class="level-item">' +
|
||||||
'<button class="button is-danger is-small button--deleteOccupancyType" type="button">' +
|
'<button class="button is-danger is-small button--deleteOccupancyType" type="button">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-trash" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-trash" aria-hidden="true"></i></span>' +
|
||||||
"<span>Delete</span>" +
|
'<span>Delete</span>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="level-item">' +
|
('<div class="level-item">' +
|
||||||
'<button class="button is-primary is-small button--editOccupancyType" type="button">' +
|
'<button class="button is-primary is-small button--editOccupancyType" type="button">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||||
"<span>Edit " +
|
'<span>Edit ' +
|
||||||
exports.aliases.occupancy +
|
exports.aliases.occupancy +
|
||||||
" Type</span>" +
|
' Type</span>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="level-item">' +
|
('<div class="level-item">' +
|
||||||
'<button class="button is-success is-small button--addOccupancyTypeField" type="button">' +
|
'<button class="button is-success is-small button--addOccupancyTypeField" type="button">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>' +
|
||||||
"<span>Add Field</span>" +
|
'<span>Add Field</span>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="level-item">' +
|
('<div class="level-item">' +
|
||||||
los.getMoveUpDownButtonFieldHTML("button--moveOccupancyTypeUp", "button--moveOccupancyTypeDown") +
|
los.getMoveUpDownButtonFieldHTML('button--moveOccupancyTypeUp', 'button--moveOccupancyTypeDown') +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>";
|
'</div>';
|
||||||
renderOccupancyTypeFields(occupancyTypeContainer, occupancyType.occupancyTypeId, occupancyType.occupancyTypeFields);
|
renderOccupancyTypeFields(occupancyTypeContainer, occupancyType.occupancyTypeId, occupancyType.occupancyTypeFields);
|
||||||
occupancyTypeContainer
|
occupancyTypeContainer
|
||||||
.querySelector(".button--toggleOccupancyTypeFields")
|
.querySelector('.button--toggleOccupancyTypeFields')
|
||||||
.addEventListener("click", toggleOccupancyTypeFields);
|
.addEventListener('click', toggleOccupancyTypeFields);
|
||||||
occupancyTypeContainer
|
occupancyTypeContainer
|
||||||
.querySelector(".button--deleteOccupancyType")
|
.querySelector('.button--deleteOccupancyType')
|
||||||
.addEventListener("click", deleteOccupancyType);
|
.addEventListener('click', deleteOccupancyType);
|
||||||
occupancyTypeContainer
|
occupancyTypeContainer
|
||||||
.querySelector(".button--editOccupancyType")
|
.querySelector('.button--editOccupancyType')
|
||||||
.addEventListener("click", openEditOccupancyType);
|
.addEventListener('click', openEditOccupancyType);
|
||||||
occupancyTypeContainer
|
occupancyTypeContainer
|
||||||
.querySelector(".button--addOccupancyTypeField")
|
.querySelector('.button--addOccupancyTypeField')
|
||||||
.addEventListener("click", openAddOccupancyTypeField);
|
.addEventListener('click', openAddOccupancyTypeField);
|
||||||
occupancyTypeContainer.querySelector(".button--moveOccupancyTypeUp").addEventListener("click", moveOccupancyType);
|
occupancyTypeContainer.querySelector('.button--moveOccupancyTypeUp').addEventListener('click', moveOccupancyType);
|
||||||
occupancyTypeContainer.querySelector(".button--moveOccupancyTypeDown").addEventListener("click", moveOccupancyType);
|
occupancyTypeContainer.querySelector('.button--moveOccupancyTypeDown').addEventListener('click', moveOccupancyType);
|
||||||
occupancyTypesContainerElement.append(occupancyTypeContainer);
|
occupancyTypesContainerElement.append(occupancyTypeContainer);
|
||||||
}
|
}
|
||||||
// Prints
|
// Prints
|
||||||
{
|
{
|
||||||
const occupancyTypePrintContainer = document.createElement("div");
|
const occupancyTypePrintContainer = document.createElement('div');
|
||||||
occupancyTypePrintContainer.className = "panel container--occupancyTypePrintList";
|
occupancyTypePrintContainer.className =
|
||||||
|
'panel container--occupancyTypePrintList';
|
||||||
occupancyTypePrintContainer.dataset.occupancyTypeId =
|
occupancyTypePrintContainer.dataset.occupancyTypeId =
|
||||||
occupancyType.occupancyTypeId.toString();
|
occupancyType.occupancyTypeId.toString();
|
||||||
occupancyTypePrintContainer.innerHTML =
|
occupancyTypePrintContainer.innerHTML =
|
||||||
|
|
@ -534,32 +541,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
'<div class="level-item">' +
|
'<div class="level-item">' +
|
||||||
'<h2 class="title is-4">' +
|
'<h2 class="title is-4">' +
|
||||||
cityssm.escapeHTML(occupancyType.occupancyType) +
|
cityssm.escapeHTML(occupancyType.occupancyType) +
|
||||||
"</h2>" +
|
'</h2>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="level-right">' +
|
('<div class="level-right">' +
|
||||||
('<div class="level-item">' +
|
('<div class="level-item">' +
|
||||||
'<button class="button is-success is-small button--addOccupancyTypePrint" type="button">' +
|
'<button class="button is-success is-small button--addOccupancyTypePrint" type="button">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>' +
|
||||||
"<span>Add Print</span>" +
|
'<span>Add Print</span>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>";
|
'</div>';
|
||||||
renderOccupancyTypePrints(occupancyTypePrintContainer, occupancyType.occupancyTypeId, occupancyType.occupancyTypePrints);
|
renderOccupancyTypePrints(occupancyTypePrintContainer, occupancyType.occupancyTypeId, occupancyType.occupancyTypePrints);
|
||||||
occupancyTypePrintContainer
|
occupancyTypePrintContainer
|
||||||
.querySelector(".button--addOccupancyTypePrint")
|
.querySelector('.button--addOccupancyTypePrint')
|
||||||
.addEventListener("click", openAddOccupancyTypePrint);
|
.addEventListener('click', openAddOccupancyTypePrint);
|
||||||
occupancyTypePrintsContainerElement.append(occupancyTypePrintContainer);
|
occupancyTypePrintsContainerElement.append(occupancyTypePrintContainer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
document.querySelector("#button--addOccupancyType").addEventListener("click", () => {
|
document
|
||||||
|
.querySelector('#button--addOccupancyType')
|
||||||
|
.addEventListener('click', () => {
|
||||||
let addCloseModalFunction;
|
let addCloseModalFunction;
|
||||||
const doAdd = (submitEvent) => {
|
const doAdd = (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddOccupancyType", submitEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doAddOccupancyType', submitEvent.currentTarget, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
addCloseModalFunction();
|
addCloseModalFunction();
|
||||||
occupancyTypes = responseJSON.occupancyTypes;
|
occupancyTypes = responseJSON.occupancyTypes;
|
||||||
|
|
@ -567,21 +576,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Adding " + exports.aliases.occupancy + " Type",
|
title: 'Error Adding ' + exports.aliases.occupancy + ' Type',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyType", {
|
cityssm.openHtmlModal('adminOccupancyTypes-addOccupancyType', {
|
||||||
onshow: (modalElement) => {
|
onshow: (modalElement) => {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement);
|
||||||
},
|
},
|
||||||
onshown: (modalElement, closeModalFunction) => {
|
onshown: (modalElement, closeModalFunction) => {
|
||||||
addCloseModalFunction = closeModalFunction;
|
addCloseModalFunction = closeModalFunction;
|
||||||
modalElement.querySelector("#occupancyTypeAdd--occupancyType").focus();
|
modalElement.querySelector('#occupancyTypeAdd--occupancyType').focus();
|
||||||
modalElement.querySelector("form").addEventListener("submit", doAdd);
|
modalElement.querySelector('form').addEventListener('submit', doAdd);
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
},
|
},
|
||||||
onremoved: () => {
|
onremoved: () => {
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -9,8 +9,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const inputElement = changeEvent.currentTarget;
|
const inputElement = changeEvent.currentTarget;
|
||||||
const fontAwesomeIconClass = inputElement.value;
|
const fontAwesomeIconClass = inputElement.value;
|
||||||
inputElement
|
inputElement
|
||||||
.closest(".field")
|
.closest('.field')
|
||||||
.querySelectorAll(".button.is-static")[1].innerHTML = `<i class="fas fa-fw fa-${fontAwesomeIconClass}" aria-hidden="true"></i>`;
|
.querySelectorAll('.button.is-static')[1].innerHTML = `<i class="fas fa-fw fa-${fontAwesomeIconClass}" aria-hidden="true"></i>`;
|
||||||
}
|
}
|
||||||
"use strict";
|
"use strict";
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||||
|
|
@ -19,28 +19,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
delete exports.workOrderTypes;
|
delete exports.workOrderTypes;
|
||||||
const updateWorkOrderType = (submitEvent) => {
|
const updateWorkOrderType = (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateWorkOrderType", submitEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateWorkOrderType', submitEvent.currentTarget, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderTypes = responseJSON.workOrderTypes;
|
workOrderTypes = responseJSON.workOrderTypes;
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: "Work Order Type Updated Successfully",
|
message: 'Work Order Type Updated Successfully',
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating Work Order Type",
|
title: 'Error Updating Work Order Type',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const deleteWorkOrderType = (clickEvent) => {
|
const deleteWorkOrderType = (clickEvent) => {
|
||||||
const tableRowElement = clickEvent.currentTarget.closest("tr");
|
const tableRowElement = clickEvent.currentTarget.closest('tr');
|
||||||
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
|
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteWorkOrderType", {
|
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteWorkOrderType', {
|
||||||
workOrderTypeId
|
workOrderTypeId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
|
|
@ -52,40 +52,40 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
tableRowElement.remove();
|
tableRowElement.remove();
|
||||||
}
|
}
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: "Work Order Type Deleted Successfully",
|
message: 'Work Order Type Deleted Successfully',
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Deleting Work Order Type",
|
title: 'Error Deleting Work Order Type',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete Work Order Type",
|
title: 'Delete Work Order Type',
|
||||||
message: `Are you sure you want to delete this work order type?<br />
|
message: `Are you sure you want to delete this work order type?<br />
|
||||||
Note that no work orders will be removed.`,
|
Note that no work orders will be removed.`,
|
||||||
messageIsHtml: true,
|
messageIsHtml: true,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete Work Order Type",
|
text: 'Yes, Delete Work Order Type',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const moveWorkOrderType = (clickEvent) => {
|
const moveWorkOrderType = (clickEvent) => {
|
||||||
const buttonElement = clickEvent.currentTarget;
|
const buttonElement = clickEvent.currentTarget;
|
||||||
const tableRowElement = buttonElement.closest("tr");
|
const tableRowElement = buttonElement.closest('tr');
|
||||||
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
|
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
|
||||||
cityssm.postJSON(los.urlPrefix +
|
cityssm.postJSON(los.urlPrefix +
|
||||||
"/admin/" +
|
'/admin/' +
|
||||||
(buttonElement.dataset.direction === "up" ? "doMoveWorkOrderTypeUp" : "doMoveWorkOrderTypeDown"), {
|
(buttonElement.dataset.direction === 'up' ? 'doMoveWorkOrderTypeUp' : 'doMoveWorkOrderTypeDown'), {
|
||||||
workOrderTypeId,
|
workOrderTypeId,
|
||||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderTypes = responseJSON.workOrderTypes;
|
workOrderTypes = responseJSON.workOrderTypes;
|
||||||
|
|
@ -93,79 +93,79 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Moving Work Order Type",
|
title: 'Error Moving Work Order Type',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const renderWorkOrderTypes = () => {
|
const renderWorkOrderTypes = () => {
|
||||||
const containerElement = document.querySelector("#container--workOrderTypes");
|
const containerElement = document.querySelector('#container--workOrderTypes');
|
||||||
if (workOrderTypes.length === 0) {
|
if (workOrderTypes.length === 0) {
|
||||||
containerElement.innerHTML = `<tr><td colspan="2">
|
containerElement.innerHTML = `<tr><td colspan="2">
|
||||||
<div class="message is-warning"><p class="message-body">There are no active work order types.</p></div>
|
<div class="message is-warning"><p class="message-body">There are no active work order types.</p></div>
|
||||||
</td></tr>`;
|
</td></tr>`;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
containerElement.innerHTML = "";
|
containerElement.innerHTML = '';
|
||||||
for (const workOrderType of workOrderTypes) {
|
for (const workOrderType of workOrderTypes) {
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement('tr');
|
||||||
tableRowElement.dataset.workOrderTypeId = workOrderType.workOrderTypeId.toString();
|
tableRowElement.dataset.workOrderTypeId = workOrderType.workOrderTypeId.toString();
|
||||||
tableRowElement.innerHTML =
|
tableRowElement.innerHTML =
|
||||||
"<td>" +
|
'<td>' +
|
||||||
"<form>" +
|
'<form>' +
|
||||||
'<input name="workOrderTypeId" type="hidden" value="' +
|
'<input name="workOrderTypeId" type="hidden" value="' +
|
||||||
workOrderType.workOrderTypeId.toString() +
|
workOrderType.workOrderTypeId.toString() +
|
||||||
'" />' +
|
'" />' +
|
||||||
('<div class="field has-addons">' +
|
('<div class="field has-addons">' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<input class="input" name="workOrderType" type="text" value="' +
|
'<input class="input" name="workOrderType" type="text" value="' +
|
||||||
cityssm.escapeHTML(workOrderType.workOrderType || "") +
|
cityssm.escapeHTML(workOrderType.workOrderType || '') +
|
||||||
'" maxlength="100" aria-label="Work Order Type" required />' +
|
'" maxlength="100" aria-label="Work Order Type" required />' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</form>" +
|
'</form>' +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
'<td class="is-nowrap">' +
|
'<td class="is-nowrap">' +
|
||||||
'<div class="field is-grouped">' +
|
'<div class="field is-grouped">' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
los.getMoveUpDownButtonFieldHTML("button--moveWorkOrderTypeUp", "button--moveWorkOrderTypeDown", false) +
|
los.getMoveUpDownButtonFieldHTML('button--moveWorkOrderTypeUp', 'button--moveWorkOrderTypeDown', false) +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<button class="button is-danger is-light button--deleteWorkOrderType" data-tooltip="Delete Work Order Type" type="button" aria-label="Delete Work Order Type">' +
|
'<button class="button is-danger is-light button--deleteWorkOrderType" data-tooltip="Delete Work Order Type" type="button" aria-label="Delete Work Order Type">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</td>";
|
'</td>';
|
||||||
tableRowElement.querySelector("form").addEventListener("submit", updateWorkOrderType);
|
tableRowElement.querySelector('form').addEventListener('submit', updateWorkOrderType);
|
||||||
tableRowElement.querySelector(".button--moveWorkOrderTypeUp").addEventListener("click", moveWorkOrderType);
|
tableRowElement.querySelector('.button--moveWorkOrderTypeUp').addEventListener('click', moveWorkOrderType);
|
||||||
tableRowElement.querySelector(".button--moveWorkOrderTypeDown").addEventListener("click", moveWorkOrderType);
|
tableRowElement.querySelector('.button--moveWorkOrderTypeDown').addEventListener('click', moveWorkOrderType);
|
||||||
tableRowElement
|
tableRowElement
|
||||||
.querySelector(".button--deleteWorkOrderType")
|
.querySelector('.button--deleteWorkOrderType')
|
||||||
.addEventListener("click", deleteWorkOrderType);
|
.addEventListener('click', deleteWorkOrderType);
|
||||||
containerElement.append(tableRowElement);
|
containerElement.append(tableRowElement);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
document.querySelector("#form--addWorkOrderType").addEventListener("submit", (submitEvent) => {
|
document.querySelector('#form--addWorkOrderType').addEventListener('submit', (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
const formElement = submitEvent.currentTarget;
|
const formElement = submitEvent.currentTarget;
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddWorkOrderType", formElement, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doAddWorkOrderType', formElement, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderTypes = responseJSON.workOrderTypes;
|
workOrderTypes = responseJSON.workOrderTypes;
|
||||||
renderWorkOrderTypes();
|
renderWorkOrderTypes();
|
||||||
formElement.reset();
|
formElement.reset();
|
||||||
formElement.querySelector("input").focus();
|
formElement.querySelector('input').focus();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Adding Work Order Type",
|
title: 'Error Adding Work Order Type',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -179,28 +179,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
delete exports.workOrderMilestoneTypes;
|
delete exports.workOrderMilestoneTypes;
|
||||||
const updateWorkOrderMilestoneType = (submitEvent) => {
|
const updateWorkOrderMilestoneType = (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateWorkOrderMilestoneType", submitEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateWorkOrderMilestoneType', submitEvent.currentTarget, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes;
|
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes;
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: "Work Order Milestone Type Updated Successfully",
|
message: 'Work Order Milestone Type Updated Successfully',
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating Work Order Milestone Type",
|
title: 'Error Updating Work Order Milestone Type',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const deleteWorkOrderMilestoneType = (clickEvent) => {
|
const deleteWorkOrderMilestoneType = (clickEvent) => {
|
||||||
const tableRowElement = clickEvent.currentTarget.closest("tr");
|
const tableRowElement = clickEvent.currentTarget.closest('tr');
|
||||||
const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId;
|
const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId;
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteWorkOrderMilestoneType", {
|
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteWorkOrderMilestoneType', {
|
||||||
workOrderMilestoneTypeId
|
workOrderMilestoneTypeId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
|
|
@ -212,42 +212,42 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
tableRowElement.remove();
|
tableRowElement.remove();
|
||||||
}
|
}
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: "Work Order Milestone Type Deleted Successfully",
|
message: 'Work Order Milestone Type Deleted Successfully',
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Deleting Work Order Milestone Type",
|
title: 'Error Deleting Work Order Milestone Type',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete Work Order Milestone Type",
|
title: 'Delete Work Order Milestone Type',
|
||||||
message: `Are you sure you want to delete this work order milestone type?<br />
|
message: `Are you sure you want to delete this work order milestone type?<br />
|
||||||
Note that no work orders will be removed.`,
|
Note that no work orders will be removed.`,
|
||||||
messageIsHtml: true,
|
messageIsHtml: true,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete Work Order Milestone Type",
|
text: 'Yes, Delete Work Order Milestone Type',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const moveWorkOrderMilestoneType = (clickEvent) => {
|
const moveWorkOrderMilestoneType = (clickEvent) => {
|
||||||
const buttonElement = clickEvent.currentTarget;
|
const buttonElement = clickEvent.currentTarget;
|
||||||
const tableRowElement = buttonElement.closest("tr");
|
const tableRowElement = buttonElement.closest('tr');
|
||||||
const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId;
|
const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId;
|
||||||
cityssm.postJSON(los.urlPrefix +
|
cityssm.postJSON(los.urlPrefix +
|
||||||
"/admin/" +
|
'/admin/' +
|
||||||
(buttonElement.dataset.direction === "up"
|
(buttonElement.dataset.direction === 'up'
|
||||||
? "doMoveWorkOrderMilestoneTypeUp"
|
? 'doMoveWorkOrderMilestoneTypeUp'
|
||||||
: "doMoveWorkOrderMilestoneTypeDown"), {
|
: 'doMoveWorkOrderMilestoneTypeDown'), {
|
||||||
workOrderMilestoneTypeId,
|
workOrderMilestoneTypeId,
|
||||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes;
|
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes;
|
||||||
|
|
@ -255,29 +255,29 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Moving Work Order Milestone Type",
|
title: 'Error Moving Work Order Milestone Type',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const renderWorkOrderMilestoneTypes = () => {
|
const renderWorkOrderMilestoneTypes = () => {
|
||||||
const containerElement = document.querySelector("#container--workOrderMilestoneTypes");
|
const containerElement = document.querySelector('#container--workOrderMilestoneTypes');
|
||||||
if (workOrderMilestoneTypes.length === 0) {
|
if (workOrderMilestoneTypes.length === 0) {
|
||||||
containerElement.innerHTML = `<tr><td colspan="2">
|
containerElement.innerHTML = `<tr><td colspan="2">
|
||||||
<div class="message is-warning"><p class="message-body">There are no active work order milestone types.</p></div>
|
<div class="message is-warning"><p class="message-body">There are no active work order milestone types.</p></div>
|
||||||
</td></tr>`;
|
</td></tr>`;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
containerElement.innerHTML = "";
|
containerElement.innerHTML = '';
|
||||||
for (const workOrderMilestoneType of workOrderMilestoneTypes) {
|
for (const workOrderMilestoneType of workOrderMilestoneTypes) {
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement('tr');
|
||||||
tableRowElement.dataset.workOrderMilestoneTypeId =
|
tableRowElement.dataset.workOrderMilestoneTypeId =
|
||||||
workOrderMilestoneType.workOrderMilestoneTypeId.toString();
|
workOrderMilestoneType.workOrderMilestoneTypeId.toString();
|
||||||
tableRowElement.innerHTML =
|
tableRowElement.innerHTML =
|
||||||
"<td>" +
|
'<td>' +
|
||||||
"<form>" +
|
'<form>' +
|
||||||
'<input name="workOrderMilestoneTypeId" type="hidden" value="' +
|
'<input name="workOrderMilestoneTypeId" type="hidden" value="' +
|
||||||
workOrderMilestoneType.workOrderMilestoneTypeId.toString() +
|
workOrderMilestoneType.workOrderMilestoneTypeId.toString() +
|
||||||
'" />' +
|
'" />' +
|
||||||
|
|
@ -286,49 +286,49 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
'<input class="input" name="workOrderMilestoneType" type="text" value="' +
|
'<input class="input" name="workOrderMilestoneType" type="text" value="' +
|
||||||
cityssm.escapeHTML(workOrderMilestoneType.workOrderMilestoneType) +
|
cityssm.escapeHTML(workOrderMilestoneType.workOrderMilestoneType) +
|
||||||
'" maxlength="100" aria-label="Work Order Milestone Type" required />' +
|
'" maxlength="100" aria-label="Work Order Milestone Type" required />' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</form>" +
|
'</form>' +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
'<td class="is-nowrap">' +
|
'<td class="is-nowrap">' +
|
||||||
'<div class="field is-grouped">' +
|
'<div class="field is-grouped">' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
los.getMoveUpDownButtonFieldHTML("button--moveWorkOrderMilestoneTypeUp", "button--moveWorkOrderMilestoneTypeDown", false) +
|
los.getMoveUpDownButtonFieldHTML('button--moveWorkOrderMilestoneTypeUp', 'button--moveWorkOrderMilestoneTypeDown', false) +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<button class="button is-danger is-light button--deleteWorkOrderMilestoneType" data-tooltip="Delete Mielstone Type" type="button" aria-label="Delete Milestone Type">' +
|
'<button class="button is-danger is-light button--deleteWorkOrderMilestoneType" data-tooltip="Delete Mielstone Type" type="button" aria-label="Delete Milestone Type">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</td>";
|
'</td>';
|
||||||
tableRowElement.querySelector("form").addEventListener("submit", updateWorkOrderMilestoneType);
|
tableRowElement.querySelector('form').addEventListener('submit', updateWorkOrderMilestoneType);
|
||||||
tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeUp").addEventListener("click", moveWorkOrderMilestoneType);
|
tableRowElement.querySelector('.button--moveWorkOrderMilestoneTypeUp').addEventListener('click', moveWorkOrderMilestoneType);
|
||||||
tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeDown").addEventListener("click", moveWorkOrderMilestoneType);
|
tableRowElement.querySelector('.button--moveWorkOrderMilestoneTypeDown').addEventListener('click', moveWorkOrderMilestoneType);
|
||||||
tableRowElement
|
tableRowElement
|
||||||
.querySelector(".button--deleteWorkOrderMilestoneType")
|
.querySelector('.button--deleteWorkOrderMilestoneType')
|
||||||
.addEventListener("click", deleteWorkOrderMilestoneType);
|
.addEventListener('click', deleteWorkOrderMilestoneType);
|
||||||
containerElement.append(tableRowElement);
|
containerElement.append(tableRowElement);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
document.querySelector("#form--addWorkOrderMilestoneType").addEventListener("submit", (submitEvent) => {
|
document.querySelector('#form--addWorkOrderMilestoneType').addEventListener('submit', (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
const formElement = submitEvent.currentTarget;
|
const formElement = submitEvent.currentTarget;
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddWorkOrderMilestoneType", formElement, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doAddWorkOrderMilestoneType', formElement, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes;
|
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes;
|
||||||
renderWorkOrderMilestoneTypes();
|
renderWorkOrderMilestoneTypes();
|
||||||
formElement.reset();
|
formElement.reset();
|
||||||
formElement.querySelector("input").focus();
|
formElement.querySelector('input').focus();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Adding Work Order Milestone Type",
|
title: 'Error Adding Work Order Milestone Type',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -342,28 +342,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
delete exports.lotStatuses;
|
delete exports.lotStatuses;
|
||||||
const updateLotStatus = (submitEvent) => {
|
const updateLotStatus = (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateLotStatus", submitEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateLotStatus', submitEvent.currentTarget, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotStatuses = responseJSON.lotStatuses;
|
lotStatuses = responseJSON.lotStatuses;
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: los.escapedAliases.Lot + " Status Updated Successfully",
|
message: los.escapedAliases.Lot + ' Status Updated Successfully',
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating " + los.escapedAliases.Lot + " Status",
|
title: 'Error Updating ' + los.escapedAliases.Lot + ' Status',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const deleteLotStatus = (clickEvent) => {
|
const deleteLotStatus = (clickEvent) => {
|
||||||
const tableRowElement = clickEvent.currentTarget.closest("tr");
|
const tableRowElement = clickEvent.currentTarget.closest('tr');
|
||||||
const lotStatusId = tableRowElement.dataset.lotStatusId;
|
const lotStatusId = tableRowElement.dataset.lotStatusId;
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteLotStatus", {
|
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteLotStatus', {
|
||||||
lotStatusId
|
lotStatusId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
|
|
@ -375,15 +375,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
tableRowElement.remove();
|
tableRowElement.remove();
|
||||||
}
|
}
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: los.escapedAliases.Lot + " Status Deleted Successfully",
|
message: los.escapedAliases.Lot + ' Status Deleted Successfully',
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Deleting " + los.escapedAliases.Lot + " Status",
|
title: 'Error Deleting ' + los.escapedAliases.Lot + ' Status',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -393,22 +393,22 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
message: `Are you sure you want to delete this status?<br />
|
message: `Are you sure you want to delete this status?<br />
|
||||||
Note that no ${los.escapedAliases.lot} will be removed.`,
|
Note that no ${los.escapedAliases.lot} will be removed.`,
|
||||||
messageIsHtml: true,
|
messageIsHtml: true,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete Status",
|
text: 'Yes, Delete Status',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const moveLotStatus = (clickEvent) => {
|
const moveLotStatus = (clickEvent) => {
|
||||||
const buttonElement = clickEvent.currentTarget;
|
const buttonElement = clickEvent.currentTarget;
|
||||||
const tableRowElement = buttonElement.closest("tr");
|
const tableRowElement = buttonElement.closest('tr');
|
||||||
const lotStatusId = tableRowElement.dataset.lotStatusId;
|
const lotStatusId = tableRowElement.dataset.lotStatusId;
|
||||||
cityssm.postJSON(los.urlPrefix +
|
cityssm.postJSON(los.urlPrefix +
|
||||||
"/admin/" +
|
'/admin/' +
|
||||||
(buttonElement.dataset.direction === "up" ? "doMoveLotStatusUp" : "doMoveLotStatusDown"), {
|
(buttonElement.dataset.direction === 'up' ? 'doMoveLotStatusUp' : 'doMoveLotStatusDown'), {
|
||||||
lotStatusId,
|
lotStatusId,
|
||||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotStatuses = responseJSON.lotStatuses;
|
lotStatuses = responseJSON.lotStatuses;
|
||||||
|
|
@ -416,28 +416,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Moving " + exports.aliases.lot + " Status",
|
title: 'Error Moving ' + exports.aliases.lot + ' Status',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const renderLotStatuses = () => {
|
const renderLotStatuses = () => {
|
||||||
const containerElement = document.querySelector("#container--lotStatuses");
|
const containerElement = document.querySelector('#container--lotStatuses');
|
||||||
if (lotStatuses.length === 0) {
|
if (lotStatuses.length === 0) {
|
||||||
containerElement.innerHTML = `<tr><td colspan="2">
|
containerElement.innerHTML = `<tr><td colspan="2">
|
||||||
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} statuses.</p></div>
|
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} statuses.</p></div>
|
||||||
</td></tr>`;
|
</td></tr>`;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
containerElement.innerHTML = "";
|
containerElement.innerHTML = '';
|
||||||
for (const lotStatus of lotStatuses) {
|
for (const lotStatus of lotStatuses) {
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement('tr');
|
||||||
tableRowElement.dataset.lotStatusId = lotStatus.lotStatusId.toString();
|
tableRowElement.dataset.lotStatusId = lotStatus.lotStatusId.toString();
|
||||||
tableRowElement.innerHTML =
|
tableRowElement.innerHTML =
|
||||||
"<td>" +
|
'<td>' +
|
||||||
"<form>" +
|
'<form>' +
|
||||||
'<input name="lotStatusId" type="hidden" value="' +
|
'<input name="lotStatusId" type="hidden" value="' +
|
||||||
lotStatus.lotStatusId.toString() +
|
lotStatus.lotStatusId.toString() +
|
||||||
'" />' +
|
'" />' +
|
||||||
|
|
@ -447,47 +447,47 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
(' value="' + cityssm.escapeHTML(lotStatus.lotStatus) + '"') +
|
(' value="' + cityssm.escapeHTML(lotStatus.lotStatus) + '"') +
|
||||||
(' aria-label="' + cityssm.escapeHTML(exports.aliases.lot) + ' Status"') +
|
(' aria-label="' + cityssm.escapeHTML(exports.aliases.lot) + ' Status"') +
|
||||||
' maxlength="100" required />' +
|
' maxlength="100" required />' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</form>" +
|
'</form>' +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
'<td class="is-nowrap">' +
|
'<td class="is-nowrap">' +
|
||||||
'<div class="field is-grouped">' +
|
'<div class="field is-grouped">' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
los.getMoveUpDownButtonFieldHTML("button--moveLotStatusUp", "button--moveLotStatusDown", false) +
|
los.getMoveUpDownButtonFieldHTML('button--moveLotStatusUp', 'button--moveLotStatusDown', false) +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<button class="button is-danger is-light button--deleteLotStatus" data-tooltip="Delete Status" type="button" aria-label="Delete Status">' +
|
'<button class="button is-danger is-light button--deleteLotStatus" data-tooltip="Delete Status" type="button" aria-label="Delete Status">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</td>";
|
'</td>';
|
||||||
tableRowElement.querySelector("form").addEventListener("submit", updateLotStatus);
|
tableRowElement.querySelector('form').addEventListener('submit', updateLotStatus);
|
||||||
tableRowElement.querySelector(".button--moveLotStatusUp").addEventListener("click", moveLotStatus);
|
tableRowElement.querySelector('.button--moveLotStatusUp').addEventListener('click', moveLotStatus);
|
||||||
tableRowElement.querySelector(".button--moveLotStatusDown").addEventListener("click", moveLotStatus);
|
tableRowElement.querySelector('.button--moveLotStatusDown').addEventListener('click', moveLotStatus);
|
||||||
tableRowElement.querySelector(".button--deleteLotStatus").addEventListener("click", deleteLotStatus);
|
tableRowElement.querySelector('.button--deleteLotStatus').addEventListener('click', deleteLotStatus);
|
||||||
containerElement.append(tableRowElement);
|
containerElement.append(tableRowElement);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
document.querySelector("#form--addLotStatus").addEventListener("submit", (submitEvent) => {
|
document.querySelector('#form--addLotStatus').addEventListener('submit', (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
const formElement = submitEvent.currentTarget;
|
const formElement = submitEvent.currentTarget;
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddLotStatus", formElement, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doAddLotStatus', formElement, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotStatuses = responseJSON.lotStatuses;
|
lotStatuses = responseJSON.lotStatuses;
|
||||||
renderLotStatuses();
|
renderLotStatuses();
|
||||||
formElement.reset();
|
formElement.reset();
|
||||||
formElement.querySelector("input").focus();
|
formElement.querySelector('input').focus();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: `Error Adding ${los.escapedAliases.Lot} Status`,
|
title: `Error Adding ${los.escapedAliases.Lot} Status`,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -501,28 +501,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
delete exports.lotOccupantTypes;
|
delete exports.lotOccupantTypes;
|
||||||
const updateLotOccupantType = (submitEvent) => {
|
const updateLotOccupantType = (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateLotOccupantType", submitEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateLotOccupantType', submitEvent.currentTarget, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotOccupantTypes = responseJSON.lotOccupantTypes;
|
lotOccupantTypes = responseJSON.lotOccupantTypes;
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Updated Successfully`,
|
message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Updated Successfully`,
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: `Error Updating ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
title: `Error Updating ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const deleteLotOccupantType = (clickEvent) => {
|
const deleteLotOccupantType = (clickEvent) => {
|
||||||
const tableRowElement = clickEvent.currentTarget.closest("tr");
|
const tableRowElement = clickEvent.currentTarget.closest('tr');
|
||||||
const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId;
|
const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId;
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteLotOccupantType", {
|
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteLotOccupantType', {
|
||||||
lotOccupantTypeId
|
lotOccupantTypeId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
|
|
@ -535,14 +535,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Deleted Successfully`,
|
message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Deleted Successfully`,
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: `Error Deleting ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
title: `Error Deleting ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -552,7 +552,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
message: `Are you sure you want to delete this ${los.escapedAliases.lot} ${los.escapedAliases.occupant} type?<br />
|
message: `Are you sure you want to delete this ${los.escapedAliases.lot} ${los.escapedAliases.occupant} type?<br />
|
||||||
Note that no ${los.escapedAliases.lot} ${los.escapedAliases.occupants} will be removed.`,
|
Note that no ${los.escapedAliases.lot} ${los.escapedAliases.occupants} will be removed.`,
|
||||||
messageIsHtml: true,
|
messageIsHtml: true,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: `Yes, Delete ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
text: `Yes, Delete ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
|
|
@ -561,15 +561,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
};
|
};
|
||||||
const moveLotOccupantType = (clickEvent) => {
|
const moveLotOccupantType = (clickEvent) => {
|
||||||
const buttonElement = clickEvent.currentTarget;
|
const buttonElement = clickEvent.currentTarget;
|
||||||
const tableRowElement = buttonElement.closest("tr");
|
const tableRowElement = buttonElement.closest('tr');
|
||||||
const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId;
|
const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId;
|
||||||
cityssm.postJSON(los.urlPrefix +
|
cityssm.postJSON(los.urlPrefix +
|
||||||
"/admin/" +
|
'/admin/' +
|
||||||
(buttonElement.dataset.direction === "up"
|
(buttonElement.dataset.direction === 'up' ? 'doMoveLotOccupantTypeUp' : 'doMoveLotOccupantTypeDown'), {
|
||||||
? "doMoveLotOccupantTypeUp"
|
|
||||||
: "doMoveLotOccupantTypeDown"), {
|
|
||||||
lotOccupantTypeId,
|
lotOccupantTypeId,
|
||||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotOccupantTypes = responseJSON.lotOccupantTypes;
|
lotOccupantTypes = responseJSON.lotOccupantTypes;
|
||||||
|
|
@ -578,40 +576,40 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: `Error Moving ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
title: `Error Moving ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const renderLotOccupantTypes = () => {
|
const renderLotOccupantTypes = () => {
|
||||||
const containerElement = document.querySelector("#container--lotOccupantTypes");
|
const containerElement = document.querySelector('#container--lotOccupantTypes');
|
||||||
if (lotOccupantTypes.length === 0) {
|
if (lotOccupantTypes.length === 0) {
|
||||||
containerElement.innerHTML = `<tr><td colspan="3">
|
containerElement.innerHTML = `<tr><td colspan="3">
|
||||||
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} ${los.escapedAliases.occupant} types.</p></div>
|
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} ${los.escapedAliases.occupant} types.</p></div>
|
||||||
</td></tr>`;
|
</td></tr>`;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
containerElement.innerHTML = "";
|
containerElement.innerHTML = '';
|
||||||
for (const lotOccupantType of lotOccupantTypes) {
|
for (const lotOccupantType of lotOccupantTypes) {
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement('tr');
|
||||||
tableRowElement.dataset.lotOccupantTypeId = lotOccupantType.lotOccupantTypeId.toString();
|
tableRowElement.dataset.lotOccupantTypeId = lotOccupantType.lotOccupantTypeId.toString();
|
||||||
const formId = "form--lotOccupantType-" + lotOccupantType.lotOccupantTypeId;
|
const formId = 'form--lotOccupantType-' + lotOccupantType.lotOccupantTypeId;
|
||||||
tableRowElement.innerHTML =
|
tableRowElement.innerHTML =
|
||||||
"<td>" +
|
'<td>' +
|
||||||
('<div class="field">' +
|
('<div class="field">' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<input class="input" name="lotOccupantType" type="text"' +
|
'<input class="input" name="lotOccupantType" type="text"' +
|
||||||
(' value="' + cityssm.escapeHTML(lotOccupantType.lotOccupantType) + '"') +
|
(' value="' + cityssm.escapeHTML(lotOccupantType.lotOccupantType) + '"') +
|
||||||
(' form="' + formId + '"') +
|
(' form="' + formId + '"') +
|
||||||
(' aria-label="' +
|
(' aria-label="' +
|
||||||
cityssm.escapeHTML(exports.aliases.lot + " " + exports.aliases.occupant) +
|
cityssm.escapeHTML(exports.aliases.lot + ' ' + exports.aliases.occupant) +
|
||||||
' Type"') +
|
' Type"') +
|
||||||
' maxlength="100" required />' +
|
' maxlength="100" required />' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
"<td>" +
|
'<td>' +
|
||||||
('<div class="field has-addons">' +
|
('<div class="field has-addons">' +
|
||||||
'<div class="control"><span class="button is-static">fa-</span></div>' +
|
'<div class="control"><span class="button is-static">fa-</span></div>' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
|
|
@ -621,70 +619,70 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
' list="datalist--fontAwesomeIconClass"' +
|
' list="datalist--fontAwesomeIconClass"' +
|
||||||
' aria-label="Icon Name"' +
|
' aria-label="Icon Name"' +
|
||||||
' maxlength="50" />' +
|
' maxlength="50" />' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="control"><span class="button is-static">' +
|
'<div class="control"><span class="button is-static">' +
|
||||||
'<i class="fas fa-fw fa-' +
|
'<i class="fas fa-fw fa-' +
|
||||||
cityssm.escapeHTML(lotOccupantType.fontAwesomeIconClass) +
|
cityssm.escapeHTML(lotOccupantType.fontAwesomeIconClass) +
|
||||||
'"></i></span></div>' +
|
'"></i></span></div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
('<form id="' + formId + '">') +
|
('<form id="' + formId + '">') +
|
||||||
'<input name="lotOccupantTypeId" type="hidden"' +
|
'<input name="lotOccupantTypeId" type="hidden"' +
|
||||||
(' value="' + lotOccupantType.lotOccupantTypeId.toString() + '"') +
|
(' value="' + lotOccupantType.lotOccupantTypeId.toString() + '"') +
|
||||||
" />" +
|
' />' +
|
||||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||||
"</form>" +
|
'</form>' +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
'<td class="is-nowrap">' +
|
'<td class="is-nowrap">' +
|
||||||
'<div class="field is-grouped">' +
|
'<div class="field is-grouped">' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
los.getMoveUpDownButtonFieldHTML("button--moveLotOccupantTypeUp", "button--moveLotOccupantTypeDown", false) +
|
los.getMoveUpDownButtonFieldHTML('button--moveLotOccupantTypeUp', 'button--moveLotOccupantTypeDown', false) +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<button class="button is-danger is-light button--deleteLotOccupantType"' +
|
'<button class="button is-danger is-light button--deleteLotOccupantType"' +
|
||||||
' data-tooltip="Delete ' +
|
' data-tooltip="Delete ' +
|
||||||
los.escapedAliases.Lot +
|
los.escapedAliases.Lot +
|
||||||
" " +
|
' ' +
|
||||||
los.escapedAliases.Occupant +
|
los.escapedAliases.Occupant +
|
||||||
' Type" type="button"' +
|
' Type" type="button"' +
|
||||||
' aria-label="Delete ' +
|
' aria-label="Delete ' +
|
||||||
los.escapedAliases.Lot +
|
los.escapedAliases.Lot +
|
||||||
" " +
|
' ' +
|
||||||
los.escapedAliases.Occupant +
|
los.escapedAliases.Occupant +
|
||||||
' Type">' +
|
' Type">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</td>";
|
'</td>';
|
||||||
const fontAwesomeInputElement = tableRowElement.querySelector("input[name='fontAwesomeIconClass']");
|
const fontAwesomeInputElement = tableRowElement.querySelector("input[name='fontAwesomeIconClass']");
|
||||||
fontAwesomeInputElement.addEventListener("keyup", refreshFontAwesomeIcon);
|
fontAwesomeInputElement.addEventListener('keyup', refreshFontAwesomeIcon);
|
||||||
fontAwesomeInputElement.addEventListener("change", refreshFontAwesomeIcon);
|
fontAwesomeInputElement.addEventListener('change', refreshFontAwesomeIcon);
|
||||||
tableRowElement.querySelector("form").addEventListener("submit", updateLotOccupantType);
|
tableRowElement.querySelector('form').addEventListener('submit', updateLotOccupantType);
|
||||||
tableRowElement.querySelector(".button--moveLotOccupantTypeUp").addEventListener("click", moveLotOccupantType);
|
tableRowElement.querySelector('.button--moveLotOccupantTypeUp').addEventListener('click', moveLotOccupantType);
|
||||||
tableRowElement.querySelector(".button--moveLotOccupantTypeDown").addEventListener("click", moveLotOccupantType);
|
tableRowElement.querySelector('.button--moveLotOccupantTypeDown').addEventListener('click', moveLotOccupantType);
|
||||||
tableRowElement
|
tableRowElement
|
||||||
.querySelector(".button--deleteLotOccupantType")
|
.querySelector('.button--deleteLotOccupantType')
|
||||||
.addEventListener("click", deleteLotOccupantType);
|
.addEventListener('click', deleteLotOccupantType);
|
||||||
containerElement.append(tableRowElement);
|
containerElement.append(tableRowElement);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
document.querySelector("#form--addLotOccupantType").addEventListener("submit", (submitEvent) => {
|
document.querySelector('#form--addLotOccupantType').addEventListener('submit', (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
const formElement = submitEvent.currentTarget;
|
const formElement = submitEvent.currentTarget;
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddLotOccupantType", formElement, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doAddLotOccupantType', formElement, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotOccupantTypes = responseJSON.lotOccupantTypes;
|
lotOccupantTypes = responseJSON.lotOccupantTypes;
|
||||||
renderLotOccupantTypes();
|
renderLotOccupantTypes();
|
||||||
formElement.reset();
|
formElement.reset();
|
||||||
formElement.querySelector("input").focus();
|
formElement.querySelector('input').focus();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: `Error Adding ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
title: `Error Adding ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const inputElement = changeEvent.currentTarget;
|
const inputElement = changeEvent.currentTarget;
|
||||||
const fontAwesomeIconClass = inputElement.value;
|
const fontAwesomeIconClass = inputElement.value;
|
||||||
inputElement
|
inputElement
|
||||||
.closest(".field")
|
.closest('.field')
|
||||||
.querySelectorAll(".button.is-static")[1].innerHTML = `<i class="fas fa-fw fa-${fontAwesomeIconClass}" aria-hidden="true"></i>`;
|
.querySelectorAll('.button.is-static')[1].innerHTML = `<i class="fas fa-fw fa-${fontAwesomeIconClass}" aria-hidden="true"></i>`;
|
||||||
}
|
}
|
||||||
//=include adminTablesWorkOrderTypes.js
|
//=include adminTablesWorkOrderTypes.js
|
||||||
//=include adminTablesWorkOrderMilestoneTypes.js
|
//=include adminTablesWorkOrderMilestoneTypes.js
|
||||||
|
|
|
||||||
|
|
@ -1,26 +1,26 @@
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||||
|
|
||||||
import type * as globalTypes from "../../types/globalTypes";
|
import type * as globalTypes from '../../types/globalTypes'
|
||||||
|
|
||||||
(() => {
|
;(() => {
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
const los = exports.los as globalTypes.LOS;
|
const los = exports.los as globalTypes.LOS
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
function refreshFontAwesomeIcon(changeEvent: Event) {
|
function refreshFontAwesomeIcon(changeEvent: Event) {
|
||||||
const inputElement = changeEvent.currentTarget as HTMLInputElement;
|
const inputElement = changeEvent.currentTarget as HTMLInputElement
|
||||||
|
|
||||||
const fontAwesomeIconClass = inputElement.value;
|
const fontAwesomeIconClass = inputElement.value
|
||||||
|
|
||||||
inputElement
|
inputElement
|
||||||
.closest(".field")!
|
.closest('.field')!
|
||||||
.querySelectorAll(
|
.querySelectorAll(
|
||||||
".button.is-static"
|
'.button.is-static'
|
||||||
)[1].innerHTML = `<i class="fas fa-fw fa-${fontAwesomeIconClass}" aria-hidden="true"></i>`;
|
)[1].innerHTML = `<i class="fas fa-fw fa-${fontAwesomeIconClass}" aria-hidden="true"></i>`
|
||||||
}
|
}
|
||||||
|
|
||||||
//=include adminTablesWorkOrderTypes.js
|
//=include adminTablesWorkOrderTypes.js
|
||||||
//=include adminTablesWorkOrderMilestoneTypes.js
|
//=include adminTablesWorkOrderMilestoneTypes.js
|
||||||
//=include adminTablesLotStatuses.js
|
//=include adminTablesLotStatuses.js
|
||||||
//=include adminTablesLotOccupantTypes.js
|
//=include adminTablesLotOccupantTypes.js
|
||||||
})();
|
})()
|
||||||
|
|
|
||||||
|
|
@ -5,28 +5,28 @@ let lotOccupantTypes = exports.lotOccupantTypes;
|
||||||
delete exports.lotOccupantTypes;
|
delete exports.lotOccupantTypes;
|
||||||
const updateLotOccupantType = (submitEvent) => {
|
const updateLotOccupantType = (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateLotOccupantType", submitEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateLotOccupantType', submitEvent.currentTarget, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotOccupantTypes = responseJSON.lotOccupantTypes;
|
lotOccupantTypes = responseJSON.lotOccupantTypes;
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Updated Successfully`,
|
message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Updated Successfully`,
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: `Error Updating ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
title: `Error Updating ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const deleteLotOccupantType = (clickEvent) => {
|
const deleteLotOccupantType = (clickEvent) => {
|
||||||
const tableRowElement = clickEvent.currentTarget.closest("tr");
|
const tableRowElement = clickEvent.currentTarget.closest('tr');
|
||||||
const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId;
|
const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId;
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteLotOccupantType", {
|
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteLotOccupantType', {
|
||||||
lotOccupantTypeId
|
lotOccupantTypeId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
|
|
@ -39,14 +39,14 @@ const deleteLotOccupantType = (clickEvent) => {
|
||||||
}
|
}
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Deleted Successfully`,
|
message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Deleted Successfully`,
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: `Error Deleting ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
title: `Error Deleting ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -56,7 +56,7 @@ const deleteLotOccupantType = (clickEvent) => {
|
||||||
message: `Are you sure you want to delete this ${los.escapedAliases.lot} ${los.escapedAliases.occupant} type?<br />
|
message: `Are you sure you want to delete this ${los.escapedAliases.lot} ${los.escapedAliases.occupant} type?<br />
|
||||||
Note that no ${los.escapedAliases.lot} ${los.escapedAliases.occupants} will be removed.`,
|
Note that no ${los.escapedAliases.lot} ${los.escapedAliases.occupants} will be removed.`,
|
||||||
messageIsHtml: true,
|
messageIsHtml: true,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: `Yes, Delete ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
text: `Yes, Delete ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
|
|
@ -65,15 +65,13 @@ const deleteLotOccupantType = (clickEvent) => {
|
||||||
};
|
};
|
||||||
const moveLotOccupantType = (clickEvent) => {
|
const moveLotOccupantType = (clickEvent) => {
|
||||||
const buttonElement = clickEvent.currentTarget;
|
const buttonElement = clickEvent.currentTarget;
|
||||||
const tableRowElement = buttonElement.closest("tr");
|
const tableRowElement = buttonElement.closest('tr');
|
||||||
const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId;
|
const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId;
|
||||||
cityssm.postJSON(los.urlPrefix +
|
cityssm.postJSON(los.urlPrefix +
|
||||||
"/admin/" +
|
'/admin/' +
|
||||||
(buttonElement.dataset.direction === "up"
|
(buttonElement.dataset.direction === 'up' ? 'doMoveLotOccupantTypeUp' : 'doMoveLotOccupantTypeDown'), {
|
||||||
? "doMoveLotOccupantTypeUp"
|
|
||||||
: "doMoveLotOccupantTypeDown"), {
|
|
||||||
lotOccupantTypeId,
|
lotOccupantTypeId,
|
||||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotOccupantTypes = responseJSON.lotOccupantTypes;
|
lotOccupantTypes = responseJSON.lotOccupantTypes;
|
||||||
|
|
@ -82,40 +80,40 @@ const moveLotOccupantType = (clickEvent) => {
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: `Error Moving ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
title: `Error Moving ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const renderLotOccupantTypes = () => {
|
const renderLotOccupantTypes = () => {
|
||||||
const containerElement = document.querySelector("#container--lotOccupantTypes");
|
const containerElement = document.querySelector('#container--lotOccupantTypes');
|
||||||
if (lotOccupantTypes.length === 0) {
|
if (lotOccupantTypes.length === 0) {
|
||||||
containerElement.innerHTML = `<tr><td colspan="3">
|
containerElement.innerHTML = `<tr><td colspan="3">
|
||||||
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} ${los.escapedAliases.occupant} types.</p></div>
|
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} ${los.escapedAliases.occupant} types.</p></div>
|
||||||
</td></tr>`;
|
</td></tr>`;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
containerElement.innerHTML = "";
|
containerElement.innerHTML = '';
|
||||||
for (const lotOccupantType of lotOccupantTypes) {
|
for (const lotOccupantType of lotOccupantTypes) {
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement('tr');
|
||||||
tableRowElement.dataset.lotOccupantTypeId = lotOccupantType.lotOccupantTypeId.toString();
|
tableRowElement.dataset.lotOccupantTypeId = lotOccupantType.lotOccupantTypeId.toString();
|
||||||
const formId = "form--lotOccupantType-" + lotOccupantType.lotOccupantTypeId;
|
const formId = 'form--lotOccupantType-' + lotOccupantType.lotOccupantTypeId;
|
||||||
tableRowElement.innerHTML =
|
tableRowElement.innerHTML =
|
||||||
"<td>" +
|
'<td>' +
|
||||||
('<div class="field">' +
|
('<div class="field">' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<input class="input" name="lotOccupantType" type="text"' +
|
'<input class="input" name="lotOccupantType" type="text"' +
|
||||||
(' value="' + cityssm.escapeHTML(lotOccupantType.lotOccupantType) + '"') +
|
(' value="' + cityssm.escapeHTML(lotOccupantType.lotOccupantType) + '"') +
|
||||||
(' form="' + formId + '"') +
|
(' form="' + formId + '"') +
|
||||||
(' aria-label="' +
|
(' aria-label="' +
|
||||||
cityssm.escapeHTML(exports.aliases.lot + " " + exports.aliases.occupant) +
|
cityssm.escapeHTML(exports.aliases.lot + ' ' + exports.aliases.occupant) +
|
||||||
' Type"') +
|
' Type"') +
|
||||||
' maxlength="100" required />' +
|
' maxlength="100" required />' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
"<td>" +
|
'<td>' +
|
||||||
('<div class="field has-addons">' +
|
('<div class="field has-addons">' +
|
||||||
'<div class="control"><span class="button is-static">fa-</span></div>' +
|
'<div class="control"><span class="button is-static">fa-</span></div>' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
|
|
@ -125,70 +123,70 @@ const renderLotOccupantTypes = () => {
|
||||||
' list="datalist--fontAwesomeIconClass"' +
|
' list="datalist--fontAwesomeIconClass"' +
|
||||||
' aria-label="Icon Name"' +
|
' aria-label="Icon Name"' +
|
||||||
' maxlength="50" />' +
|
' maxlength="50" />' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="control"><span class="button is-static">' +
|
'<div class="control"><span class="button is-static">' +
|
||||||
'<i class="fas fa-fw fa-' +
|
'<i class="fas fa-fw fa-' +
|
||||||
cityssm.escapeHTML(lotOccupantType.fontAwesomeIconClass) +
|
cityssm.escapeHTML(lotOccupantType.fontAwesomeIconClass) +
|
||||||
'"></i></span></div>' +
|
'"></i></span></div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
('<form id="' + formId + '">') +
|
('<form id="' + formId + '">') +
|
||||||
'<input name="lotOccupantTypeId" type="hidden"' +
|
'<input name="lotOccupantTypeId" type="hidden"' +
|
||||||
(' value="' + lotOccupantType.lotOccupantTypeId.toString() + '"') +
|
(' value="' + lotOccupantType.lotOccupantTypeId.toString() + '"') +
|
||||||
" />" +
|
' />' +
|
||||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||||
"</form>" +
|
'</form>' +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
'<td class="is-nowrap">' +
|
'<td class="is-nowrap">' +
|
||||||
'<div class="field is-grouped">' +
|
'<div class="field is-grouped">' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
los.getMoveUpDownButtonFieldHTML("button--moveLotOccupantTypeUp", "button--moveLotOccupantTypeDown", false) +
|
los.getMoveUpDownButtonFieldHTML('button--moveLotOccupantTypeUp', 'button--moveLotOccupantTypeDown', false) +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<button class="button is-danger is-light button--deleteLotOccupantType"' +
|
'<button class="button is-danger is-light button--deleteLotOccupantType"' +
|
||||||
' data-tooltip="Delete ' +
|
' data-tooltip="Delete ' +
|
||||||
los.escapedAliases.Lot +
|
los.escapedAliases.Lot +
|
||||||
" " +
|
' ' +
|
||||||
los.escapedAliases.Occupant +
|
los.escapedAliases.Occupant +
|
||||||
' Type" type="button"' +
|
' Type" type="button"' +
|
||||||
' aria-label="Delete ' +
|
' aria-label="Delete ' +
|
||||||
los.escapedAliases.Lot +
|
los.escapedAliases.Lot +
|
||||||
" " +
|
' ' +
|
||||||
los.escapedAliases.Occupant +
|
los.escapedAliases.Occupant +
|
||||||
' Type">' +
|
' Type">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</td>";
|
'</td>';
|
||||||
const fontAwesomeInputElement = tableRowElement.querySelector("input[name='fontAwesomeIconClass']");
|
const fontAwesomeInputElement = tableRowElement.querySelector("input[name='fontAwesomeIconClass']");
|
||||||
fontAwesomeInputElement.addEventListener("keyup", refreshFontAwesomeIcon);
|
fontAwesomeInputElement.addEventListener('keyup', refreshFontAwesomeIcon);
|
||||||
fontAwesomeInputElement.addEventListener("change", refreshFontAwesomeIcon);
|
fontAwesomeInputElement.addEventListener('change', refreshFontAwesomeIcon);
|
||||||
tableRowElement.querySelector("form").addEventListener("submit", updateLotOccupantType);
|
tableRowElement.querySelector('form').addEventListener('submit', updateLotOccupantType);
|
||||||
tableRowElement.querySelector(".button--moveLotOccupantTypeUp").addEventListener("click", moveLotOccupantType);
|
tableRowElement.querySelector('.button--moveLotOccupantTypeUp').addEventListener('click', moveLotOccupantType);
|
||||||
tableRowElement.querySelector(".button--moveLotOccupantTypeDown").addEventListener("click", moveLotOccupantType);
|
tableRowElement.querySelector('.button--moveLotOccupantTypeDown').addEventListener('click', moveLotOccupantType);
|
||||||
tableRowElement
|
tableRowElement
|
||||||
.querySelector(".button--deleteLotOccupantType")
|
.querySelector('.button--deleteLotOccupantType')
|
||||||
.addEventListener("click", deleteLotOccupantType);
|
.addEventListener('click', deleteLotOccupantType);
|
||||||
containerElement.append(tableRowElement);
|
containerElement.append(tableRowElement);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
document.querySelector("#form--addLotOccupantType").addEventListener("submit", (submitEvent) => {
|
document.querySelector('#form--addLotOccupantType').addEventListener('submit', (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
const formElement = submitEvent.currentTarget;
|
const formElement = submitEvent.currentTarget;
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddLotOccupantType", formElement, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doAddLotOccupantType', formElement, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotOccupantTypes = responseJSON.lotOccupantTypes;
|
lotOccupantTypes = responseJSON.lotOccupantTypes;
|
||||||
renderLotOccupantTypes();
|
renderLotOccupantTypes();
|
||||||
formElement.reset();
|
formElement.reset();
|
||||||
formElement.querySelector("input").focus();
|
formElement.querySelector('input').focus();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: `Error Adding ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
title: `Error Adding ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,176 +1,172 @@
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||||
|
|
||||||
import type * as globalTypes from "../../types/globalTypes";
|
import type * as globalTypes from '../../types/globalTypes'
|
||||||
import type * as recordTypes from "../../types/recordTypes";
|
import type * as recordTypes from '../../types/recordTypes'
|
||||||
|
|
||||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||||
|
|
||||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal
|
||||||
declare const bulmaJS: BulmaJS;
|
declare const bulmaJS: BulmaJS
|
||||||
|
|
||||||
declare const los: globalTypes.LOS;
|
declare const los: globalTypes.LOS
|
||||||
declare const refreshFontAwesomeIcon: (changeEvent: Event) => void;
|
declare const refreshFontAwesomeIcon: (changeEvent: Event) => void
|
||||||
|
|
||||||
let lotOccupantTypes: recordTypes.LotOccupantType[] = exports.lotOccupantTypes;
|
let lotOccupantTypes: recordTypes.LotOccupantType[] = exports.lotOccupantTypes
|
||||||
delete exports.lotOccupantTypes;
|
delete exports.lotOccupantTypes
|
||||||
|
|
||||||
const updateLotOccupantType = (submitEvent: SubmitEvent) => {
|
const updateLotOccupantType = (submitEvent: SubmitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault()
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/admin/doUpdateLotOccupantType",
|
los.urlPrefix + '/admin/doUpdateLotOccupantType',
|
||||||
submitEvent.currentTarget,
|
submitEvent.currentTarget,
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
lotOccupantTypes?: recordTypes.LotOccupantType[];
|
lotOccupantTypes?: recordTypes.LotOccupantType[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotOccupantTypes = responseJSON.lotOccupantTypes!;
|
lotOccupantTypes = responseJSON.lotOccupantTypes!
|
||||||
|
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Updated Successfully`,
|
message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Updated Successfully`,
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
})
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: `Error Updating ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
title: `Error Updating ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
const deleteLotOccupantType = (clickEvent: Event) => {
|
const deleteLotOccupantType = (clickEvent: Event) => {
|
||||||
const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest("tr")!;
|
const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest('tr')!
|
||||||
|
|
||||||
const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId;
|
const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId
|
||||||
|
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/admin/doDeleteLotOccupantType",
|
los.urlPrefix + '/admin/doDeleteLotOccupantType',
|
||||||
{
|
{
|
||||||
lotOccupantTypeId
|
lotOccupantTypeId
|
||||||
},
|
},
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
lotOccupantTypes?: recordTypes.LotOccupantType[];
|
lotOccupantTypes?: recordTypes.LotOccupantType[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotOccupantTypes = responseJSON.lotOccupantTypes!;
|
lotOccupantTypes = responseJSON.lotOccupantTypes!
|
||||||
|
|
||||||
if (lotOccupantTypes.length === 0) {
|
if (lotOccupantTypes.length === 0) {
|
||||||
renderLotOccupantTypes();
|
renderLotOccupantTypes()
|
||||||
} else {
|
} else {
|
||||||
tableRowElement.remove();
|
tableRowElement.remove()
|
||||||
}
|
}
|
||||||
|
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Deleted Successfully`,
|
message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Deleted Successfully`,
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
})
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: `Error Deleting ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
title: `Error Deleting ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: `Delete ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
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 />
|
message: `Are you sure you want to delete this ${los.escapedAliases.lot} ${los.escapedAliases.occupant} type?<br />
|
||||||
Note that no ${los.escapedAliases.lot} ${los.escapedAliases.occupants} will be removed.`,
|
Note that no ${los.escapedAliases.lot} ${los.escapedAliases.occupants} will be removed.`,
|
||||||
messageIsHtml: true,
|
messageIsHtml: true,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: `Yes, Delete ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
text: `Yes, Delete ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
};
|
}
|
||||||
|
|
||||||
const moveLotOccupantType = (clickEvent: MouseEvent) => {
|
const moveLotOccupantType = (clickEvent: MouseEvent) => {
|
||||||
const buttonElement = clickEvent.currentTarget as HTMLButtonElement;
|
const buttonElement = clickEvent.currentTarget as HTMLButtonElement
|
||||||
|
|
||||||
const tableRowElement = buttonElement.closest("tr")!;
|
const tableRowElement = buttonElement.closest('tr')!
|
||||||
|
|
||||||
const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId;
|
const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix +
|
los.urlPrefix +
|
||||||
"/admin/" +
|
'/admin/' +
|
||||||
(buttonElement.dataset.direction === "up"
|
(buttonElement.dataset.direction === 'up' ? 'doMoveLotOccupantTypeUp' : 'doMoveLotOccupantTypeDown'),
|
||||||
? "doMoveLotOccupantTypeUp"
|
|
||||||
: "doMoveLotOccupantTypeDown"),
|
|
||||||
{
|
{
|
||||||
lotOccupantTypeId,
|
lotOccupantTypeId,
|
||||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||||
},
|
},
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
lotOccupantTypes?: recordTypes.LotOccupantType[];
|
lotOccupantTypes?: recordTypes.LotOccupantType[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotOccupantTypes = responseJSON.lotOccupantTypes!;
|
lotOccupantTypes = responseJSON.lotOccupantTypes!
|
||||||
renderLotOccupantTypes();
|
renderLotOccupantTypes()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: `Error Moving ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
title: `Error Moving ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
const renderLotOccupantTypes = () => {
|
const renderLotOccupantTypes = () => {
|
||||||
const containerElement = document.querySelector(
|
const containerElement = document.querySelector('#container--lotOccupantTypes') as HTMLTableSectionElement
|
||||||
"#container--lotOccupantTypes"
|
|
||||||
) as HTMLTableSectionElement;
|
|
||||||
|
|
||||||
if (lotOccupantTypes.length === 0) {
|
if (lotOccupantTypes.length === 0) {
|
||||||
containerElement.innerHTML = `<tr><td colspan="3">
|
containerElement.innerHTML = `<tr><td colspan="3">
|
||||||
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} ${los.escapedAliases.occupant} types.</p></div>
|
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} ${los.escapedAliases.occupant} types.</p></div>
|
||||||
</td></tr>`;
|
</td></tr>`
|
||||||
|
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
containerElement.innerHTML = "";
|
containerElement.innerHTML = ''
|
||||||
|
|
||||||
for (const lotOccupantType of lotOccupantTypes) {
|
for (const lotOccupantType of lotOccupantTypes) {
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement('tr')
|
||||||
|
|
||||||
tableRowElement.dataset.lotOccupantTypeId = lotOccupantType.lotOccupantTypeId.toString();
|
tableRowElement.dataset.lotOccupantTypeId = lotOccupantType.lotOccupantTypeId.toString()
|
||||||
|
|
||||||
const formId = "form--lotOccupantType-" + lotOccupantType.lotOccupantTypeId;
|
const formId = 'form--lotOccupantType-' + lotOccupantType.lotOccupantTypeId
|
||||||
|
|
||||||
tableRowElement.innerHTML =
|
tableRowElement.innerHTML =
|
||||||
"<td>" +
|
'<td>' +
|
||||||
('<div class="field">' +
|
('<div class="field">' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<input class="input" name="lotOccupantType" type="text"' +
|
'<input class="input" name="lotOccupantType" type="text"' +
|
||||||
(' value="' + cityssm.escapeHTML(lotOccupantType.lotOccupantType) + '"') +
|
(' value="' + cityssm.escapeHTML(lotOccupantType.lotOccupantType) + '"') +
|
||||||
(' form="' + formId + '"') +
|
(' form="' + formId + '"') +
|
||||||
(' aria-label="' +
|
(' aria-label="' +
|
||||||
cityssm.escapeHTML(exports.aliases.lot + " " + exports.aliases.occupant) +
|
cityssm.escapeHTML(exports.aliases.lot + ' ' + exports.aliases.occupant) +
|
||||||
' Type"') +
|
' Type"') +
|
||||||
' maxlength="100" required />' +
|
' maxlength="100" required />' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
"<td>" +
|
'<td>' +
|
||||||
('<div class="field has-addons">' +
|
('<div class="field has-addons">' +
|
||||||
'<div class="control"><span class="button is-static">fa-</span></div>' +
|
'<div class="control"><span class="button is-static">fa-</span></div>' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
|
|
@ -180,101 +176,102 @@ const renderLotOccupantTypes = () => {
|
||||||
' list="datalist--fontAwesomeIconClass"' +
|
' list="datalist--fontAwesomeIconClass"' +
|
||||||
' aria-label="Icon Name"' +
|
' aria-label="Icon Name"' +
|
||||||
' maxlength="50" />' +
|
' maxlength="50" />' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="control"><span class="button is-static">' +
|
'<div class="control"><span class="button is-static">' +
|
||||||
'<i class="fas fa-fw fa-' +
|
'<i class="fas fa-fw fa-' +
|
||||||
cityssm.escapeHTML(lotOccupantType.fontAwesomeIconClass) +
|
cityssm.escapeHTML(lotOccupantType.fontAwesomeIconClass) +
|
||||||
'"></i></span></div>' +
|
'"></i></span></div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
('<form id="' + formId + '">') +
|
('<form id="' + formId + '">') +
|
||||||
'<input name="lotOccupantTypeId" type="hidden"' +
|
'<input name="lotOccupantTypeId" type="hidden"' +
|
||||||
(' value="' + lotOccupantType.lotOccupantTypeId.toString() + '"') +
|
(' value="' + lotOccupantType.lotOccupantTypeId.toString() + '"') +
|
||||||
" />" +
|
' />' +
|
||||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||||
"</form>" +
|
'</form>' +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
'<td class="is-nowrap">' +
|
'<td class="is-nowrap">' +
|
||||||
'<div class="field is-grouped">' +
|
'<div class="field is-grouped">' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
los.getMoveUpDownButtonFieldHTML(
|
los.getMoveUpDownButtonFieldHTML(
|
||||||
"button--moveLotOccupantTypeUp",
|
'button--moveLotOccupantTypeUp',
|
||||||
"button--moveLotOccupantTypeDown",
|
'button--moveLotOccupantTypeDown',
|
||||||
false
|
false
|
||||||
) +
|
) +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<button class="button is-danger is-light button--deleteLotOccupantType"' +
|
'<button class="button is-danger is-light button--deleteLotOccupantType"' +
|
||||||
' data-tooltip="Delete ' +
|
' data-tooltip="Delete ' +
|
||||||
los.escapedAliases.Lot +
|
los.escapedAliases.Lot +
|
||||||
" " +
|
' ' +
|
||||||
los.escapedAliases.Occupant +
|
los.escapedAliases.Occupant +
|
||||||
' Type" type="button"' +
|
' Type" type="button"' +
|
||||||
' aria-label="Delete ' +
|
' aria-label="Delete ' +
|
||||||
los.escapedAliases.Lot +
|
los.escapedAliases.Lot +
|
||||||
" " +
|
' ' +
|
||||||
los.escapedAliases.Occupant +
|
los.escapedAliases.Occupant +
|
||||||
' Type">' +
|
' Type">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</td>";
|
'</td>'
|
||||||
|
|
||||||
const fontAwesomeInputElement = tableRowElement.querySelector("input[name='fontAwesomeIconClass']")!;
|
const fontAwesomeInputElement = tableRowElement.querySelector("input[name='fontAwesomeIconClass']")!
|
||||||
|
|
||||||
fontAwesomeInputElement.addEventListener("keyup", refreshFontAwesomeIcon);
|
fontAwesomeInputElement.addEventListener('keyup', refreshFontAwesomeIcon)
|
||||||
fontAwesomeInputElement.addEventListener("change", refreshFontAwesomeIcon);
|
fontAwesomeInputElement.addEventListener('change', refreshFontAwesomeIcon)
|
||||||
|
|
||||||
tableRowElement.querySelector("form")!.addEventListener("submit", updateLotOccupantType);
|
tableRowElement.querySelector('form')!.addEventListener('submit', updateLotOccupantType)
|
||||||
|
|
||||||
(
|
;(tableRowElement.querySelector('.button--moveLotOccupantTypeUp') as HTMLButtonElement).addEventListener(
|
||||||
tableRowElement.querySelector(".button--moveLotOccupantTypeUp") as HTMLButtonElement
|
'click',
|
||||||
).addEventListener("click", moveLotOccupantType);
|
moveLotOccupantType
|
||||||
|
)
|
||||||
|
|
||||||
(
|
;(
|
||||||
tableRowElement.querySelector(".button--moveLotOccupantTypeDown") as HTMLButtonElement
|
tableRowElement.querySelector('.button--moveLotOccupantTypeDown') as HTMLButtonElement
|
||||||
).addEventListener("click", moveLotOccupantType);
|
).addEventListener('click', moveLotOccupantType)
|
||||||
|
|
||||||
tableRowElement
|
tableRowElement
|
||||||
.querySelector(".button--deleteLotOccupantType")!
|
.querySelector('.button--deleteLotOccupantType')!
|
||||||
.addEventListener("click", deleteLotOccupantType);
|
.addEventListener('click', deleteLotOccupantType)
|
||||||
|
|
||||||
containerElement.append(tableRowElement);
|
containerElement.append(tableRowElement)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
(document.querySelector("#form--addLotOccupantType") as HTMLFormElement).addEventListener(
|
;(document.querySelector('#form--addLotOccupantType') as HTMLFormElement).addEventListener(
|
||||||
"submit",
|
'submit',
|
||||||
(submitEvent: SubmitEvent) => {
|
(submitEvent: SubmitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault()
|
||||||
|
|
||||||
const formElement = submitEvent.currentTarget as HTMLFormElement;
|
const formElement = submitEvent.currentTarget as HTMLFormElement
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/admin/doAddLotOccupantType",
|
los.urlPrefix + '/admin/doAddLotOccupantType',
|
||||||
formElement,
|
formElement,
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
lotOccupantTypes?: recordTypes.LotOccupantType[];
|
lotOccupantTypes?: recordTypes.LotOccupantType[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotOccupantTypes = responseJSON.lotOccupantTypes!;
|
lotOccupantTypes = responseJSON.lotOccupantTypes!
|
||||||
renderLotOccupantTypes();
|
renderLotOccupantTypes()
|
||||||
formElement.reset();
|
formElement.reset()
|
||||||
formElement.querySelector("input")!.focus();
|
formElement.querySelector('input')!.focus()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: `Error Adding ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
title: `Error Adding ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
|
|
||||||
renderLotOccupantTypes();
|
renderLotOccupantTypes()
|
||||||
|
|
|
||||||
|
|
@ -5,28 +5,28 @@ let lotStatuses = exports.lotStatuses;
|
||||||
delete exports.lotStatuses;
|
delete exports.lotStatuses;
|
||||||
const updateLotStatus = (submitEvent) => {
|
const updateLotStatus = (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateLotStatus", submitEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateLotStatus', submitEvent.currentTarget, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotStatuses = responseJSON.lotStatuses;
|
lotStatuses = responseJSON.lotStatuses;
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: los.escapedAliases.Lot + " Status Updated Successfully",
|
message: los.escapedAliases.Lot + ' Status Updated Successfully',
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating " + los.escapedAliases.Lot + " Status",
|
title: 'Error Updating ' + los.escapedAliases.Lot + ' Status',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const deleteLotStatus = (clickEvent) => {
|
const deleteLotStatus = (clickEvent) => {
|
||||||
const tableRowElement = clickEvent.currentTarget.closest("tr");
|
const tableRowElement = clickEvent.currentTarget.closest('tr');
|
||||||
const lotStatusId = tableRowElement.dataset.lotStatusId;
|
const lotStatusId = tableRowElement.dataset.lotStatusId;
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteLotStatus", {
|
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteLotStatus', {
|
||||||
lotStatusId
|
lotStatusId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
|
|
@ -38,15 +38,15 @@ const deleteLotStatus = (clickEvent) => {
|
||||||
tableRowElement.remove();
|
tableRowElement.remove();
|
||||||
}
|
}
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: los.escapedAliases.Lot + " Status Deleted Successfully",
|
message: los.escapedAliases.Lot + ' Status Deleted Successfully',
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Deleting " + los.escapedAliases.Lot + " Status",
|
title: 'Error Deleting ' + los.escapedAliases.Lot + ' Status',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -56,22 +56,22 @@ const deleteLotStatus = (clickEvent) => {
|
||||||
message: `Are you sure you want to delete this status?<br />
|
message: `Are you sure you want to delete this status?<br />
|
||||||
Note that no ${los.escapedAliases.lot} will be removed.`,
|
Note that no ${los.escapedAliases.lot} will be removed.`,
|
||||||
messageIsHtml: true,
|
messageIsHtml: true,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete Status",
|
text: 'Yes, Delete Status',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const moveLotStatus = (clickEvent) => {
|
const moveLotStatus = (clickEvent) => {
|
||||||
const buttonElement = clickEvent.currentTarget;
|
const buttonElement = clickEvent.currentTarget;
|
||||||
const tableRowElement = buttonElement.closest("tr");
|
const tableRowElement = buttonElement.closest('tr');
|
||||||
const lotStatusId = tableRowElement.dataset.lotStatusId;
|
const lotStatusId = tableRowElement.dataset.lotStatusId;
|
||||||
cityssm.postJSON(los.urlPrefix +
|
cityssm.postJSON(los.urlPrefix +
|
||||||
"/admin/" +
|
'/admin/' +
|
||||||
(buttonElement.dataset.direction === "up" ? "doMoveLotStatusUp" : "doMoveLotStatusDown"), {
|
(buttonElement.dataset.direction === 'up' ? 'doMoveLotStatusUp' : 'doMoveLotStatusDown'), {
|
||||||
lotStatusId,
|
lotStatusId,
|
||||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotStatuses = responseJSON.lotStatuses;
|
lotStatuses = responseJSON.lotStatuses;
|
||||||
|
|
@ -79,28 +79,28 @@ const moveLotStatus = (clickEvent) => {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Moving " + exports.aliases.lot + " Status",
|
title: 'Error Moving ' + exports.aliases.lot + ' Status',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const renderLotStatuses = () => {
|
const renderLotStatuses = () => {
|
||||||
const containerElement = document.querySelector("#container--lotStatuses");
|
const containerElement = document.querySelector('#container--lotStatuses');
|
||||||
if (lotStatuses.length === 0) {
|
if (lotStatuses.length === 0) {
|
||||||
containerElement.innerHTML = `<tr><td colspan="2">
|
containerElement.innerHTML = `<tr><td colspan="2">
|
||||||
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} statuses.</p></div>
|
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} statuses.</p></div>
|
||||||
</td></tr>`;
|
</td></tr>`;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
containerElement.innerHTML = "";
|
containerElement.innerHTML = '';
|
||||||
for (const lotStatus of lotStatuses) {
|
for (const lotStatus of lotStatuses) {
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement('tr');
|
||||||
tableRowElement.dataset.lotStatusId = lotStatus.lotStatusId.toString();
|
tableRowElement.dataset.lotStatusId = lotStatus.lotStatusId.toString();
|
||||||
tableRowElement.innerHTML =
|
tableRowElement.innerHTML =
|
||||||
"<td>" +
|
'<td>' +
|
||||||
"<form>" +
|
'<form>' +
|
||||||
'<input name="lotStatusId" type="hidden" value="' +
|
'<input name="lotStatusId" type="hidden" value="' +
|
||||||
lotStatus.lotStatusId.toString() +
|
lotStatus.lotStatusId.toString() +
|
||||||
'" />' +
|
'" />' +
|
||||||
|
|
@ -110,47 +110,47 @@ const renderLotStatuses = () => {
|
||||||
(' value="' + cityssm.escapeHTML(lotStatus.lotStatus) + '"') +
|
(' value="' + cityssm.escapeHTML(lotStatus.lotStatus) + '"') +
|
||||||
(' aria-label="' + cityssm.escapeHTML(exports.aliases.lot) + ' Status"') +
|
(' aria-label="' + cityssm.escapeHTML(exports.aliases.lot) + ' Status"') +
|
||||||
' maxlength="100" required />' +
|
' maxlength="100" required />' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</form>" +
|
'</form>' +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
'<td class="is-nowrap">' +
|
'<td class="is-nowrap">' +
|
||||||
'<div class="field is-grouped">' +
|
'<div class="field is-grouped">' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
los.getMoveUpDownButtonFieldHTML("button--moveLotStatusUp", "button--moveLotStatusDown", false) +
|
los.getMoveUpDownButtonFieldHTML('button--moveLotStatusUp', 'button--moveLotStatusDown', false) +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<button class="button is-danger is-light button--deleteLotStatus" data-tooltip="Delete Status" type="button" aria-label="Delete Status">' +
|
'<button class="button is-danger is-light button--deleteLotStatus" data-tooltip="Delete Status" type="button" aria-label="Delete Status">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</td>";
|
'</td>';
|
||||||
tableRowElement.querySelector("form").addEventListener("submit", updateLotStatus);
|
tableRowElement.querySelector('form').addEventListener('submit', updateLotStatus);
|
||||||
tableRowElement.querySelector(".button--moveLotStatusUp").addEventListener("click", moveLotStatus);
|
tableRowElement.querySelector('.button--moveLotStatusUp').addEventListener('click', moveLotStatus);
|
||||||
tableRowElement.querySelector(".button--moveLotStatusDown").addEventListener("click", moveLotStatus);
|
tableRowElement.querySelector('.button--moveLotStatusDown').addEventListener('click', moveLotStatus);
|
||||||
tableRowElement.querySelector(".button--deleteLotStatus").addEventListener("click", deleteLotStatus);
|
tableRowElement.querySelector('.button--deleteLotStatus').addEventListener('click', deleteLotStatus);
|
||||||
containerElement.append(tableRowElement);
|
containerElement.append(tableRowElement);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
document.querySelector("#form--addLotStatus").addEventListener("submit", (submitEvent) => {
|
document.querySelector('#form--addLotStatus').addEventListener('submit', (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
const formElement = submitEvent.currentTarget;
|
const formElement = submitEvent.currentTarget;
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddLotStatus", formElement, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doAddLotStatus', formElement, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotStatuses = responseJSON.lotStatuses;
|
lotStatuses = responseJSON.lotStatuses;
|
||||||
renderLotStatuses();
|
renderLotStatuses();
|
||||||
formElement.reset();
|
formElement.reset();
|
||||||
formElement.querySelector("input").focus();
|
formElement.querySelector('input').focus();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: `Error Adding ${los.escapedAliases.Lot} Status`,
|
title: `Error Adding ${los.escapedAliases.Lot} Status`,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,157 +1,145 @@
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||||
|
|
||||||
import type * as globalTypes from "../../types/globalTypes";
|
import type * as globalTypes from '../../types/globalTypes'
|
||||||
import type * as recordTypes from "../../types/recordTypes";
|
import type * as recordTypes from '../../types/recordTypes'
|
||||||
|
|
||||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||||
|
|
||||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal
|
||||||
declare const bulmaJS: BulmaJS;
|
declare const bulmaJS: BulmaJS
|
||||||
|
|
||||||
declare const los: globalTypes.LOS;
|
declare const los: globalTypes.LOS
|
||||||
|
|
||||||
let lotStatuses: recordTypes.LotStatus[] = exports.lotStatuses;
|
let lotStatuses: recordTypes.LotStatus[] = exports.lotStatuses
|
||||||
delete exports.lotStatuses;
|
delete exports.lotStatuses
|
||||||
|
|
||||||
const updateLotStatus = (submitEvent: SubmitEvent) => {
|
const updateLotStatus = (submitEvent: SubmitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault()
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/admin/doUpdateLotStatus",
|
los.urlPrefix + '/admin/doUpdateLotStatus',
|
||||||
submitEvent.currentTarget,
|
submitEvent.currentTarget,
|
||||||
(responseJSON: {
|
(responseJSON: { success: boolean; errorMessage?: string; lotStatuses?: recordTypes.LotStatus[] }) => {
|
||||||
success: boolean;
|
|
||||||
errorMessage?: string;
|
|
||||||
lotStatuses?: recordTypes.LotStatus[];
|
|
||||||
}) => {
|
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotStatuses = responseJSON.lotStatuses!;
|
lotStatuses = responseJSON.lotStatuses!
|
||||||
|
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: los.escapedAliases.Lot + " Status Updated Successfully",
|
message: los.escapedAliases.Lot + ' Status Updated Successfully',
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
})
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating " + los.escapedAliases.Lot + " Status",
|
title: 'Error Updating ' + los.escapedAliases.Lot + ' Status',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
const deleteLotStatus = (clickEvent: Event) => {
|
const deleteLotStatus = (clickEvent: Event) => {
|
||||||
const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest("tr")!;
|
const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest('tr')!
|
||||||
|
|
||||||
const lotStatusId = tableRowElement.dataset.lotStatusId;
|
const lotStatusId = tableRowElement.dataset.lotStatusId
|
||||||
|
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/admin/doDeleteLotStatus",
|
los.urlPrefix + '/admin/doDeleteLotStatus',
|
||||||
{
|
{
|
||||||
lotStatusId
|
lotStatusId
|
||||||
},
|
},
|
||||||
(responseJSON: {
|
(responseJSON: { success: boolean; errorMessage?: string; lotStatuses?: recordTypes.LotStatus[] }) => {
|
||||||
success: boolean;
|
|
||||||
errorMessage?: string;
|
|
||||||
lotStatuses?: recordTypes.LotStatus[];
|
|
||||||
}) => {
|
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotStatuses = responseJSON.lotStatuses!;
|
lotStatuses = responseJSON.lotStatuses!
|
||||||
|
|
||||||
if (lotStatuses.length === 0) {
|
if (lotStatuses.length === 0) {
|
||||||
renderLotStatuses();
|
renderLotStatuses()
|
||||||
} else {
|
} else {
|
||||||
tableRowElement.remove();
|
tableRowElement.remove()
|
||||||
}
|
}
|
||||||
|
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: los.escapedAliases.Lot + " Status Deleted Successfully",
|
message: los.escapedAliases.Lot + ' Status Deleted Successfully',
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
})
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Deleting " + los.escapedAliases.Lot + " Status",
|
title: 'Error Deleting ' + los.escapedAliases.Lot + ' Status',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: `Delete ${los.escapedAliases.Lot} Status`,
|
title: `Delete ${los.escapedAliases.Lot} Status`,
|
||||||
message: `Are you sure you want to delete this status?<br />
|
message: `Are you sure you want to delete this status?<br />
|
||||||
Note that no ${los.escapedAliases.lot} will be removed.`,
|
Note that no ${los.escapedAliases.lot} will be removed.`,
|
||||||
messageIsHtml: true,
|
messageIsHtml: true,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete Status",
|
text: 'Yes, Delete Status',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
};
|
}
|
||||||
|
|
||||||
const moveLotStatus = (clickEvent: MouseEvent) => {
|
const moveLotStatus = (clickEvent: MouseEvent) => {
|
||||||
const buttonElement = clickEvent.currentTarget as HTMLButtonElement;
|
const buttonElement = clickEvent.currentTarget as HTMLButtonElement
|
||||||
|
|
||||||
const tableRowElement = buttonElement.closest("tr")!;
|
const tableRowElement = buttonElement.closest('tr')!
|
||||||
|
|
||||||
const lotStatusId = tableRowElement.dataset.lotStatusId;
|
const lotStatusId = tableRowElement.dataset.lotStatusId
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix +
|
los.urlPrefix +
|
||||||
"/admin/" +
|
'/admin/' +
|
||||||
(buttonElement.dataset.direction === "up" ? "doMoveLotStatusUp" : "doMoveLotStatusDown"),
|
(buttonElement.dataset.direction === 'up' ? 'doMoveLotStatusUp' : 'doMoveLotStatusDown'),
|
||||||
{
|
{
|
||||||
lotStatusId,
|
lotStatusId,
|
||||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||||
},
|
},
|
||||||
(responseJSON: {
|
(responseJSON: { success: boolean; errorMessage?: string; lotStatuses?: recordTypes.LotStatus[] }) => {
|
||||||
success: boolean;
|
|
||||||
errorMessage?: string;
|
|
||||||
lotStatuses?: recordTypes.LotStatus[];
|
|
||||||
}) => {
|
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotStatuses = responseJSON.lotStatuses!;
|
lotStatuses = responseJSON.lotStatuses!
|
||||||
renderLotStatuses();
|
renderLotStatuses()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Moving " + exports.aliases.lot + " Status",
|
title: 'Error Moving ' + exports.aliases.lot + ' Status',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
const renderLotStatuses = () => {
|
const renderLotStatuses = () => {
|
||||||
const containerElement = document.querySelector("#container--lotStatuses") as HTMLTableSectionElement;
|
const containerElement = document.querySelector('#container--lotStatuses') as HTMLTableSectionElement
|
||||||
|
|
||||||
if (lotStatuses.length === 0) {
|
if (lotStatuses.length === 0) {
|
||||||
containerElement.innerHTML = `<tr><td colspan="2">
|
containerElement.innerHTML = `<tr><td colspan="2">
|
||||||
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} statuses.</p></div>
|
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} statuses.</p></div>
|
||||||
</td></tr>`;
|
</td></tr>`
|
||||||
|
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
containerElement.innerHTML = "";
|
containerElement.innerHTML = ''
|
||||||
|
|
||||||
for (const lotStatus of lotStatuses) {
|
for (const lotStatus of lotStatuses) {
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement('tr')
|
||||||
|
|
||||||
tableRowElement.dataset.lotStatusId = lotStatus.lotStatusId.toString();
|
tableRowElement.dataset.lotStatusId = lotStatus.lotStatusId.toString()
|
||||||
|
|
||||||
tableRowElement.innerHTML =
|
tableRowElement.innerHTML =
|
||||||
"<td>" +
|
'<td>' +
|
||||||
"<form>" +
|
'<form>' +
|
||||||
'<input name="lotStatusId" type="hidden" value="' +
|
'<input name="lotStatusId" type="hidden" value="' +
|
||||||
lotStatus.lotStatusId.toString() +
|
lotStatus.lotStatusId.toString() +
|
||||||
'" />' +
|
'" />' +
|
||||||
|
|
@ -161,74 +149,70 @@ const renderLotStatuses = () => {
|
||||||
(' value="' + cityssm.escapeHTML(lotStatus.lotStatus) + '"') +
|
(' value="' + cityssm.escapeHTML(lotStatus.lotStatus) + '"') +
|
||||||
(' aria-label="' + cityssm.escapeHTML(exports.aliases.lot) + ' Status"') +
|
(' aria-label="' + cityssm.escapeHTML(exports.aliases.lot) + ' Status"') +
|
||||||
' maxlength="100" required />' +
|
' maxlength="100" required />' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</form>" +
|
'</form>' +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
'<td class="is-nowrap">' +
|
'<td class="is-nowrap">' +
|
||||||
'<div class="field is-grouped">' +
|
'<div class="field is-grouped">' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
los.getMoveUpDownButtonFieldHTML("button--moveLotStatusUp", "button--moveLotStatusDown", false) +
|
los.getMoveUpDownButtonFieldHTML('button--moveLotStatusUp', 'button--moveLotStatusDown', false) +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<button class="button is-danger is-light button--deleteLotStatus" data-tooltip="Delete Status" type="button" aria-label="Delete Status">' +
|
'<button class="button is-danger is-light button--deleteLotStatus" data-tooltip="Delete Status" type="button" aria-label="Delete Status">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</td>";
|
'</td>'
|
||||||
|
|
||||||
tableRowElement.querySelector("form")!.addEventListener("submit", updateLotStatus);
|
tableRowElement.querySelector('form')!.addEventListener('submit', updateLotStatus)
|
||||||
|
|
||||||
(tableRowElement.querySelector(".button--moveLotStatusUp") as HTMLButtonElement).addEventListener(
|
;(tableRowElement.querySelector('.button--moveLotStatusUp') as HTMLButtonElement).addEventListener(
|
||||||
"click",
|
'click',
|
||||||
moveLotStatus
|
moveLotStatus
|
||||||
);
|
)
|
||||||
|
|
||||||
(tableRowElement.querySelector(".button--moveLotStatusDown") as HTMLButtonElement).addEventListener(
|
;(tableRowElement.querySelector('.button--moveLotStatusDown') as HTMLButtonElement).addEventListener(
|
||||||
"click",
|
'click',
|
||||||
moveLotStatus
|
moveLotStatus
|
||||||
);
|
)
|
||||||
|
|
||||||
tableRowElement.querySelector(".button--deleteLotStatus")!.addEventListener("click", deleteLotStatus);
|
tableRowElement.querySelector('.button--deleteLotStatus')!.addEventListener('click', deleteLotStatus)
|
||||||
|
|
||||||
containerElement.append(tableRowElement);
|
containerElement.append(tableRowElement)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
(document.querySelector("#form--addLotStatus") as HTMLFormElement).addEventListener(
|
;(document.querySelector('#form--addLotStatus') as HTMLFormElement).addEventListener(
|
||||||
"submit",
|
'submit',
|
||||||
(submitEvent: SubmitEvent) => {
|
(submitEvent: SubmitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault()
|
||||||
|
|
||||||
const formElement = submitEvent.currentTarget as HTMLFormElement;
|
const formElement = submitEvent.currentTarget as HTMLFormElement
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/admin/doAddLotStatus",
|
los.urlPrefix + '/admin/doAddLotStatus',
|
||||||
formElement,
|
formElement,
|
||||||
(responseJSON: {
|
(responseJSON: { success: boolean; errorMessage?: string; lotStatuses?: recordTypes.LotStatus[] }) => {
|
||||||
success: boolean;
|
|
||||||
errorMessage?: string;
|
|
||||||
lotStatuses?: recordTypes.LotStatus[];
|
|
||||||
}) => {
|
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotStatuses = responseJSON.lotStatuses!;
|
lotStatuses = responseJSON.lotStatuses!
|
||||||
renderLotStatuses();
|
renderLotStatuses()
|
||||||
formElement.reset();
|
formElement.reset()
|
||||||
formElement.querySelector("input")!.focus();
|
formElement.querySelector('input')!.focus()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: `Error Adding ${los.escapedAliases.Lot} Status`,
|
title: `Error Adding ${los.escapedAliases.Lot} Status`,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
|
|
||||||
renderLotStatuses();
|
renderLotStatuses()
|
||||||
|
|
|
||||||
|
|
@ -5,28 +5,28 @@ let workOrderMilestoneTypes = exports.workOrderMilestoneTypes;
|
||||||
delete exports.workOrderMilestoneTypes;
|
delete exports.workOrderMilestoneTypes;
|
||||||
const updateWorkOrderMilestoneType = (submitEvent) => {
|
const updateWorkOrderMilestoneType = (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateWorkOrderMilestoneType", submitEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateWorkOrderMilestoneType', submitEvent.currentTarget, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes;
|
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes;
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: "Work Order Milestone Type Updated Successfully",
|
message: 'Work Order Milestone Type Updated Successfully',
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating Work Order Milestone Type",
|
title: 'Error Updating Work Order Milestone Type',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const deleteWorkOrderMilestoneType = (clickEvent) => {
|
const deleteWorkOrderMilestoneType = (clickEvent) => {
|
||||||
const tableRowElement = clickEvent.currentTarget.closest("tr");
|
const tableRowElement = clickEvent.currentTarget.closest('tr');
|
||||||
const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId;
|
const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId;
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteWorkOrderMilestoneType", {
|
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteWorkOrderMilestoneType', {
|
||||||
workOrderMilestoneTypeId
|
workOrderMilestoneTypeId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
|
|
@ -38,42 +38,42 @@ const deleteWorkOrderMilestoneType = (clickEvent) => {
|
||||||
tableRowElement.remove();
|
tableRowElement.remove();
|
||||||
}
|
}
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: "Work Order Milestone Type Deleted Successfully",
|
message: 'Work Order Milestone Type Deleted Successfully',
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Deleting Work Order Milestone Type",
|
title: 'Error Deleting Work Order Milestone Type',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete Work Order Milestone Type",
|
title: 'Delete Work Order Milestone Type',
|
||||||
message: `Are you sure you want to delete this work order milestone type?<br />
|
message: `Are you sure you want to delete this work order milestone type?<br />
|
||||||
Note that no work orders will be removed.`,
|
Note that no work orders will be removed.`,
|
||||||
messageIsHtml: true,
|
messageIsHtml: true,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete Work Order Milestone Type",
|
text: 'Yes, Delete Work Order Milestone Type',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const moveWorkOrderMilestoneType = (clickEvent) => {
|
const moveWorkOrderMilestoneType = (clickEvent) => {
|
||||||
const buttonElement = clickEvent.currentTarget;
|
const buttonElement = clickEvent.currentTarget;
|
||||||
const tableRowElement = buttonElement.closest("tr");
|
const tableRowElement = buttonElement.closest('tr');
|
||||||
const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId;
|
const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId;
|
||||||
cityssm.postJSON(los.urlPrefix +
|
cityssm.postJSON(los.urlPrefix +
|
||||||
"/admin/" +
|
'/admin/' +
|
||||||
(buttonElement.dataset.direction === "up"
|
(buttonElement.dataset.direction === 'up'
|
||||||
? "doMoveWorkOrderMilestoneTypeUp"
|
? 'doMoveWorkOrderMilestoneTypeUp'
|
||||||
: "doMoveWorkOrderMilestoneTypeDown"), {
|
: 'doMoveWorkOrderMilestoneTypeDown'), {
|
||||||
workOrderMilestoneTypeId,
|
workOrderMilestoneTypeId,
|
||||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes;
|
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes;
|
||||||
|
|
@ -81,29 +81,29 @@ const moveWorkOrderMilestoneType = (clickEvent) => {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Moving Work Order Milestone Type",
|
title: 'Error Moving Work Order Milestone Type',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const renderWorkOrderMilestoneTypes = () => {
|
const renderWorkOrderMilestoneTypes = () => {
|
||||||
const containerElement = document.querySelector("#container--workOrderMilestoneTypes");
|
const containerElement = document.querySelector('#container--workOrderMilestoneTypes');
|
||||||
if (workOrderMilestoneTypes.length === 0) {
|
if (workOrderMilestoneTypes.length === 0) {
|
||||||
containerElement.innerHTML = `<tr><td colspan="2">
|
containerElement.innerHTML = `<tr><td colspan="2">
|
||||||
<div class="message is-warning"><p class="message-body">There are no active work order milestone types.</p></div>
|
<div class="message is-warning"><p class="message-body">There are no active work order milestone types.</p></div>
|
||||||
</td></tr>`;
|
</td></tr>`;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
containerElement.innerHTML = "";
|
containerElement.innerHTML = '';
|
||||||
for (const workOrderMilestoneType of workOrderMilestoneTypes) {
|
for (const workOrderMilestoneType of workOrderMilestoneTypes) {
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement('tr');
|
||||||
tableRowElement.dataset.workOrderMilestoneTypeId =
|
tableRowElement.dataset.workOrderMilestoneTypeId =
|
||||||
workOrderMilestoneType.workOrderMilestoneTypeId.toString();
|
workOrderMilestoneType.workOrderMilestoneTypeId.toString();
|
||||||
tableRowElement.innerHTML =
|
tableRowElement.innerHTML =
|
||||||
"<td>" +
|
'<td>' +
|
||||||
"<form>" +
|
'<form>' +
|
||||||
'<input name="workOrderMilestoneTypeId" type="hidden" value="' +
|
'<input name="workOrderMilestoneTypeId" type="hidden" value="' +
|
||||||
workOrderMilestoneType.workOrderMilestoneTypeId.toString() +
|
workOrderMilestoneType.workOrderMilestoneTypeId.toString() +
|
||||||
'" />' +
|
'" />' +
|
||||||
|
|
@ -112,49 +112,49 @@ const renderWorkOrderMilestoneTypes = () => {
|
||||||
'<input class="input" name="workOrderMilestoneType" type="text" value="' +
|
'<input class="input" name="workOrderMilestoneType" type="text" value="' +
|
||||||
cityssm.escapeHTML(workOrderMilestoneType.workOrderMilestoneType) +
|
cityssm.escapeHTML(workOrderMilestoneType.workOrderMilestoneType) +
|
||||||
'" maxlength="100" aria-label="Work Order Milestone Type" required />' +
|
'" maxlength="100" aria-label="Work Order Milestone Type" required />' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</form>" +
|
'</form>' +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
'<td class="is-nowrap">' +
|
'<td class="is-nowrap">' +
|
||||||
'<div class="field is-grouped">' +
|
'<div class="field is-grouped">' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
los.getMoveUpDownButtonFieldHTML("button--moveWorkOrderMilestoneTypeUp", "button--moveWorkOrderMilestoneTypeDown", false) +
|
los.getMoveUpDownButtonFieldHTML('button--moveWorkOrderMilestoneTypeUp', 'button--moveWorkOrderMilestoneTypeDown', false) +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<button class="button is-danger is-light button--deleteWorkOrderMilestoneType" data-tooltip="Delete Mielstone Type" type="button" aria-label="Delete Milestone Type">' +
|
'<button class="button is-danger is-light button--deleteWorkOrderMilestoneType" data-tooltip="Delete Mielstone Type" type="button" aria-label="Delete Milestone Type">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</td>";
|
'</td>';
|
||||||
tableRowElement.querySelector("form").addEventListener("submit", updateWorkOrderMilestoneType);
|
tableRowElement.querySelector('form').addEventListener('submit', updateWorkOrderMilestoneType);
|
||||||
tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeUp").addEventListener("click", moveWorkOrderMilestoneType);
|
tableRowElement.querySelector('.button--moveWorkOrderMilestoneTypeUp').addEventListener('click', moveWorkOrderMilestoneType);
|
||||||
tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeDown").addEventListener("click", moveWorkOrderMilestoneType);
|
tableRowElement.querySelector('.button--moveWorkOrderMilestoneTypeDown').addEventListener('click', moveWorkOrderMilestoneType);
|
||||||
tableRowElement
|
tableRowElement
|
||||||
.querySelector(".button--deleteWorkOrderMilestoneType")
|
.querySelector('.button--deleteWorkOrderMilestoneType')
|
||||||
.addEventListener("click", deleteWorkOrderMilestoneType);
|
.addEventListener('click', deleteWorkOrderMilestoneType);
|
||||||
containerElement.append(tableRowElement);
|
containerElement.append(tableRowElement);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
document.querySelector("#form--addWorkOrderMilestoneType").addEventListener("submit", (submitEvent) => {
|
document.querySelector('#form--addWorkOrderMilestoneType').addEventListener('submit', (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
const formElement = submitEvent.currentTarget;
|
const formElement = submitEvent.currentTarget;
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddWorkOrderMilestoneType", formElement, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doAddWorkOrderMilestoneType', formElement, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes;
|
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes;
|
||||||
renderWorkOrderMilestoneTypes();
|
renderWorkOrderMilestoneTypes();
|
||||||
formElement.reset();
|
formElement.reset();
|
||||||
formElement.querySelector("input").focus();
|
formElement.querySelector('input').focus();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Adding Work Order Milestone Type",
|
title: 'Error Adding Work Order Milestone Type',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,162 +1,162 @@
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||||
|
|
||||||
import type * as globalTypes from "../../types/globalTypes";
|
import type * as globalTypes from '../../types/globalTypes'
|
||||||
import type * as recordTypes from "../../types/recordTypes";
|
import type * as recordTypes from '../../types/recordTypes'
|
||||||
|
|
||||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||||
|
|
||||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal
|
||||||
declare const bulmaJS: BulmaJS;
|
declare const bulmaJS: BulmaJS
|
||||||
|
|
||||||
declare const los: globalTypes.LOS;
|
declare const los: globalTypes.LOS
|
||||||
|
|
||||||
let workOrderMilestoneTypes: recordTypes.WorkOrderMilestoneType[] = exports.workOrderMilestoneTypes;
|
let workOrderMilestoneTypes: recordTypes.WorkOrderMilestoneType[] = exports.workOrderMilestoneTypes
|
||||||
delete exports.workOrderMilestoneTypes;
|
delete exports.workOrderMilestoneTypes
|
||||||
|
|
||||||
const updateWorkOrderMilestoneType = (submitEvent: SubmitEvent) => {
|
const updateWorkOrderMilestoneType = (submitEvent: SubmitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault()
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/admin/doUpdateWorkOrderMilestoneType",
|
los.urlPrefix + '/admin/doUpdateWorkOrderMilestoneType',
|
||||||
submitEvent.currentTarget,
|
submitEvent.currentTarget,
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[];
|
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!;
|
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!
|
||||||
|
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: "Work Order Milestone Type Updated Successfully",
|
message: 'Work Order Milestone Type Updated Successfully',
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
})
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating Work Order Milestone Type",
|
title: 'Error Updating Work Order Milestone Type',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
const deleteWorkOrderMilestoneType = (clickEvent: Event) => {
|
const deleteWorkOrderMilestoneType = (clickEvent: Event) => {
|
||||||
const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest("tr")!;
|
const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest('tr')!
|
||||||
|
|
||||||
const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId;
|
const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId
|
||||||
|
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/admin/doDeleteWorkOrderMilestoneType",
|
los.urlPrefix + '/admin/doDeleteWorkOrderMilestoneType',
|
||||||
{
|
{
|
||||||
workOrderMilestoneTypeId
|
workOrderMilestoneTypeId
|
||||||
},
|
},
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[];
|
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!;
|
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!
|
||||||
|
|
||||||
if (workOrderMilestoneTypes.length === 0) {
|
if (workOrderMilestoneTypes.length === 0) {
|
||||||
renderWorkOrderMilestoneTypes();
|
renderWorkOrderMilestoneTypes()
|
||||||
} else {
|
} else {
|
||||||
tableRowElement.remove();
|
tableRowElement.remove()
|
||||||
}
|
}
|
||||||
|
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: "Work Order Milestone Type Deleted Successfully",
|
message: 'Work Order Milestone Type Deleted Successfully',
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
})
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Deleting Work Order Milestone Type",
|
title: 'Error Deleting Work Order Milestone Type',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete Work Order Milestone Type",
|
title: 'Delete Work Order Milestone Type',
|
||||||
message: `Are you sure you want to delete this work order milestone type?<br />
|
message: `Are you sure you want to delete this work order milestone type?<br />
|
||||||
Note that no work orders will be removed.`,
|
Note that no work orders will be removed.`,
|
||||||
messageIsHtml: true,
|
messageIsHtml: true,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete Work Order Milestone Type",
|
text: 'Yes, Delete Work Order Milestone Type',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
};
|
}
|
||||||
|
|
||||||
const moveWorkOrderMilestoneType = (clickEvent: MouseEvent) => {
|
const moveWorkOrderMilestoneType = (clickEvent: MouseEvent) => {
|
||||||
const buttonElement = clickEvent.currentTarget as HTMLButtonElement;
|
const buttonElement = clickEvent.currentTarget as HTMLButtonElement
|
||||||
|
|
||||||
const tableRowElement = buttonElement.closest("tr")!;
|
const tableRowElement = buttonElement.closest('tr')!
|
||||||
|
|
||||||
const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId;
|
const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix +
|
los.urlPrefix +
|
||||||
"/admin/" +
|
'/admin/' +
|
||||||
(buttonElement.dataset.direction === "up"
|
(buttonElement.dataset.direction === 'up'
|
||||||
? "doMoveWorkOrderMilestoneTypeUp"
|
? 'doMoveWorkOrderMilestoneTypeUp'
|
||||||
: "doMoveWorkOrderMilestoneTypeDown"),
|
: 'doMoveWorkOrderMilestoneTypeDown'),
|
||||||
{
|
{
|
||||||
workOrderMilestoneTypeId,
|
workOrderMilestoneTypeId,
|
||||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||||
},
|
},
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[];
|
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!;
|
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!
|
||||||
renderWorkOrderMilestoneTypes();
|
renderWorkOrderMilestoneTypes()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Moving Work Order Milestone Type",
|
title: 'Error Moving Work Order Milestone Type',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
const renderWorkOrderMilestoneTypes = () => {
|
const renderWorkOrderMilestoneTypes = () => {
|
||||||
const containerElement = document.querySelector(
|
const containerElement = document.querySelector(
|
||||||
"#container--workOrderMilestoneTypes"
|
'#container--workOrderMilestoneTypes'
|
||||||
) as HTMLTableSectionElement;
|
) as HTMLTableSectionElement
|
||||||
|
|
||||||
if (workOrderMilestoneTypes.length === 0) {
|
if (workOrderMilestoneTypes.length === 0) {
|
||||||
containerElement.innerHTML = `<tr><td colspan="2">
|
containerElement.innerHTML = `<tr><td colspan="2">
|
||||||
<div class="message is-warning"><p class="message-body">There are no active work order milestone types.</p></div>
|
<div class="message is-warning"><p class="message-body">There are no active work order milestone types.</p></div>
|
||||||
</td></tr>`;
|
</td></tr>`
|
||||||
|
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
containerElement.innerHTML = "";
|
containerElement.innerHTML = ''
|
||||||
|
|
||||||
for (const workOrderMilestoneType of workOrderMilestoneTypes) {
|
for (const workOrderMilestoneType of workOrderMilestoneTypes) {
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement('tr')
|
||||||
|
|
||||||
tableRowElement.dataset.workOrderMilestoneTypeId =
|
tableRowElement.dataset.workOrderMilestoneTypeId =
|
||||||
workOrderMilestoneType.workOrderMilestoneTypeId.toString();
|
workOrderMilestoneType.workOrderMilestoneTypeId.toString()
|
||||||
|
|
||||||
tableRowElement.innerHTML =
|
tableRowElement.innerHTML =
|
||||||
"<td>" +
|
'<td>' +
|
||||||
"<form>" +
|
'<form>' +
|
||||||
'<input name="workOrderMilestoneTypeId" type="hidden" value="' +
|
'<input name="workOrderMilestoneTypeId" type="hidden" value="' +
|
||||||
workOrderMilestoneType.workOrderMilestoneTypeId.toString() +
|
workOrderMilestoneType.workOrderMilestoneTypeId.toString() +
|
||||||
'" />' +
|
'" />' +
|
||||||
|
|
@ -165,78 +165,78 @@ const renderWorkOrderMilestoneTypes = () => {
|
||||||
'<input class="input" name="workOrderMilestoneType" type="text" value="' +
|
'<input class="input" name="workOrderMilestoneType" type="text" value="' +
|
||||||
cityssm.escapeHTML(workOrderMilestoneType.workOrderMilestoneType) +
|
cityssm.escapeHTML(workOrderMilestoneType.workOrderMilestoneType) +
|
||||||
'" maxlength="100" aria-label="Work Order Milestone Type" required />' +
|
'" maxlength="100" aria-label="Work Order Milestone Type" required />' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</form>" +
|
'</form>' +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
'<td class="is-nowrap">' +
|
'<td class="is-nowrap">' +
|
||||||
'<div class="field is-grouped">' +
|
'<div class="field is-grouped">' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
los.getMoveUpDownButtonFieldHTML(
|
los.getMoveUpDownButtonFieldHTML(
|
||||||
"button--moveWorkOrderMilestoneTypeUp",
|
'button--moveWorkOrderMilestoneTypeUp',
|
||||||
"button--moveWorkOrderMilestoneTypeDown",
|
'button--moveWorkOrderMilestoneTypeDown',
|
||||||
false
|
false
|
||||||
) +
|
) +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<button class="button is-danger is-light button--deleteWorkOrderMilestoneType" data-tooltip="Delete Mielstone Type" type="button" aria-label="Delete Milestone Type">' +
|
'<button class="button is-danger is-light button--deleteWorkOrderMilestoneType" data-tooltip="Delete Mielstone Type" type="button" aria-label="Delete Milestone Type">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</td>";
|
'</td>'
|
||||||
|
|
||||||
tableRowElement.querySelector("form")!.addEventListener("submit", updateWorkOrderMilestoneType);
|
tableRowElement.querySelector('form')!.addEventListener('submit', updateWorkOrderMilestoneType)
|
||||||
|
|
||||||
(
|
;(
|
||||||
tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeUp") as HTMLButtonElement
|
tableRowElement.querySelector('.button--moveWorkOrderMilestoneTypeUp') as HTMLButtonElement
|
||||||
).addEventListener("click", moveWorkOrderMilestoneType);
|
).addEventListener('click', moveWorkOrderMilestoneType)
|
||||||
|
|
||||||
(
|
;(
|
||||||
tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeDown") as HTMLButtonElement
|
tableRowElement.querySelector('.button--moveWorkOrderMilestoneTypeDown') as HTMLButtonElement
|
||||||
).addEventListener("click", moveWorkOrderMilestoneType);
|
).addEventListener('click', moveWorkOrderMilestoneType)
|
||||||
|
|
||||||
tableRowElement
|
tableRowElement
|
||||||
.querySelector(".button--deleteWorkOrderMilestoneType")!
|
.querySelector('.button--deleteWorkOrderMilestoneType')!
|
||||||
.addEventListener("click", deleteWorkOrderMilestoneType);
|
.addEventListener('click', deleteWorkOrderMilestoneType)
|
||||||
|
|
||||||
containerElement.append(tableRowElement);
|
containerElement.append(tableRowElement)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
(document.querySelector("#form--addWorkOrderMilestoneType") as HTMLFormElement).addEventListener(
|
;(document.querySelector('#form--addWorkOrderMilestoneType') as HTMLFormElement).addEventListener(
|
||||||
"submit",
|
'submit',
|
||||||
(submitEvent: SubmitEvent) => {
|
(submitEvent: SubmitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault()
|
||||||
|
|
||||||
const formElement = submitEvent.currentTarget as HTMLFormElement;
|
const formElement = submitEvent.currentTarget as HTMLFormElement
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/admin/doAddWorkOrderMilestoneType",
|
los.urlPrefix + '/admin/doAddWorkOrderMilestoneType',
|
||||||
formElement,
|
formElement,
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[];
|
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!;
|
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!
|
||||||
renderWorkOrderMilestoneTypes();
|
renderWorkOrderMilestoneTypes()
|
||||||
formElement.reset();
|
formElement.reset()
|
||||||
formElement.querySelector("input")!.focus();
|
formElement.querySelector('input')!.focus()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Adding Work Order Milestone Type",
|
title: 'Error Adding Work Order Milestone Type',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
|
|
||||||
renderWorkOrderMilestoneTypes();
|
renderWorkOrderMilestoneTypes()
|
||||||
|
|
|
||||||
|
|
@ -5,28 +5,28 @@ let workOrderTypes = exports.workOrderTypes;
|
||||||
delete exports.workOrderTypes;
|
delete exports.workOrderTypes;
|
||||||
const updateWorkOrderType = (submitEvent) => {
|
const updateWorkOrderType = (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateWorkOrderType", submitEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateWorkOrderType', submitEvent.currentTarget, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderTypes = responseJSON.workOrderTypes;
|
workOrderTypes = responseJSON.workOrderTypes;
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: "Work Order Type Updated Successfully",
|
message: 'Work Order Type Updated Successfully',
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating Work Order Type",
|
title: 'Error Updating Work Order Type',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const deleteWorkOrderType = (clickEvent) => {
|
const deleteWorkOrderType = (clickEvent) => {
|
||||||
const tableRowElement = clickEvent.currentTarget.closest("tr");
|
const tableRowElement = clickEvent.currentTarget.closest('tr');
|
||||||
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
|
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteWorkOrderType", {
|
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteWorkOrderType', {
|
||||||
workOrderTypeId
|
workOrderTypeId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
|
|
@ -38,40 +38,40 @@ const deleteWorkOrderType = (clickEvent) => {
|
||||||
tableRowElement.remove();
|
tableRowElement.remove();
|
||||||
}
|
}
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: "Work Order Type Deleted Successfully",
|
message: 'Work Order Type Deleted Successfully',
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Deleting Work Order Type",
|
title: 'Error Deleting Work Order Type',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete Work Order Type",
|
title: 'Delete Work Order Type',
|
||||||
message: `Are you sure you want to delete this work order type?<br />
|
message: `Are you sure you want to delete this work order type?<br />
|
||||||
Note that no work orders will be removed.`,
|
Note that no work orders will be removed.`,
|
||||||
messageIsHtml: true,
|
messageIsHtml: true,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete Work Order Type",
|
text: 'Yes, Delete Work Order Type',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const moveWorkOrderType = (clickEvent) => {
|
const moveWorkOrderType = (clickEvent) => {
|
||||||
const buttonElement = clickEvent.currentTarget;
|
const buttonElement = clickEvent.currentTarget;
|
||||||
const tableRowElement = buttonElement.closest("tr");
|
const tableRowElement = buttonElement.closest('tr');
|
||||||
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
|
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
|
||||||
cityssm.postJSON(los.urlPrefix +
|
cityssm.postJSON(los.urlPrefix +
|
||||||
"/admin/" +
|
'/admin/' +
|
||||||
(buttonElement.dataset.direction === "up" ? "doMoveWorkOrderTypeUp" : "doMoveWorkOrderTypeDown"), {
|
(buttonElement.dataset.direction === 'up' ? 'doMoveWorkOrderTypeUp' : 'doMoveWorkOrderTypeDown'), {
|
||||||
workOrderTypeId,
|
workOrderTypeId,
|
||||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderTypes = responseJSON.workOrderTypes;
|
workOrderTypes = responseJSON.workOrderTypes;
|
||||||
|
|
@ -79,79 +79,79 @@ const moveWorkOrderType = (clickEvent) => {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Moving Work Order Type",
|
title: 'Error Moving Work Order Type',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const renderWorkOrderTypes = () => {
|
const renderWorkOrderTypes = () => {
|
||||||
const containerElement = document.querySelector("#container--workOrderTypes");
|
const containerElement = document.querySelector('#container--workOrderTypes');
|
||||||
if (workOrderTypes.length === 0) {
|
if (workOrderTypes.length === 0) {
|
||||||
containerElement.innerHTML = `<tr><td colspan="2">
|
containerElement.innerHTML = `<tr><td colspan="2">
|
||||||
<div class="message is-warning"><p class="message-body">There are no active work order types.</p></div>
|
<div class="message is-warning"><p class="message-body">There are no active work order types.</p></div>
|
||||||
</td></tr>`;
|
</td></tr>`;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
containerElement.innerHTML = "";
|
containerElement.innerHTML = '';
|
||||||
for (const workOrderType of workOrderTypes) {
|
for (const workOrderType of workOrderTypes) {
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement('tr');
|
||||||
tableRowElement.dataset.workOrderTypeId = workOrderType.workOrderTypeId.toString();
|
tableRowElement.dataset.workOrderTypeId = workOrderType.workOrderTypeId.toString();
|
||||||
tableRowElement.innerHTML =
|
tableRowElement.innerHTML =
|
||||||
"<td>" +
|
'<td>' +
|
||||||
"<form>" +
|
'<form>' +
|
||||||
'<input name="workOrderTypeId" type="hidden" value="' +
|
'<input name="workOrderTypeId" type="hidden" value="' +
|
||||||
workOrderType.workOrderTypeId.toString() +
|
workOrderType.workOrderTypeId.toString() +
|
||||||
'" />' +
|
'" />' +
|
||||||
('<div class="field has-addons">' +
|
('<div class="field has-addons">' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<input class="input" name="workOrderType" type="text" value="' +
|
'<input class="input" name="workOrderType" type="text" value="' +
|
||||||
cityssm.escapeHTML(workOrderType.workOrderType || "") +
|
cityssm.escapeHTML(workOrderType.workOrderType || '') +
|
||||||
'" maxlength="100" aria-label="Work Order Type" required />' +
|
'" maxlength="100" aria-label="Work Order Type" required />' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</form>" +
|
'</form>' +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
'<td class="is-nowrap">' +
|
'<td class="is-nowrap">' +
|
||||||
'<div class="field is-grouped">' +
|
'<div class="field is-grouped">' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
los.getMoveUpDownButtonFieldHTML("button--moveWorkOrderTypeUp", "button--moveWorkOrderTypeDown", false) +
|
los.getMoveUpDownButtonFieldHTML('button--moveWorkOrderTypeUp', 'button--moveWorkOrderTypeDown', false) +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<button class="button is-danger is-light button--deleteWorkOrderType" data-tooltip="Delete Work Order Type" type="button" aria-label="Delete Work Order Type">' +
|
'<button class="button is-danger is-light button--deleteWorkOrderType" data-tooltip="Delete Work Order Type" type="button" aria-label="Delete Work Order Type">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</td>";
|
'</td>';
|
||||||
tableRowElement.querySelector("form").addEventListener("submit", updateWorkOrderType);
|
tableRowElement.querySelector('form').addEventListener('submit', updateWorkOrderType);
|
||||||
tableRowElement.querySelector(".button--moveWorkOrderTypeUp").addEventListener("click", moveWorkOrderType);
|
tableRowElement.querySelector('.button--moveWorkOrderTypeUp').addEventListener('click', moveWorkOrderType);
|
||||||
tableRowElement.querySelector(".button--moveWorkOrderTypeDown").addEventListener("click", moveWorkOrderType);
|
tableRowElement.querySelector('.button--moveWorkOrderTypeDown').addEventListener('click', moveWorkOrderType);
|
||||||
tableRowElement
|
tableRowElement
|
||||||
.querySelector(".button--deleteWorkOrderType")
|
.querySelector('.button--deleteWorkOrderType')
|
||||||
.addEventListener("click", deleteWorkOrderType);
|
.addEventListener('click', deleteWorkOrderType);
|
||||||
containerElement.append(tableRowElement);
|
containerElement.append(tableRowElement);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
document.querySelector("#form--addWorkOrderType").addEventListener("submit", (submitEvent) => {
|
document.querySelector('#form--addWorkOrderType').addEventListener('submit', (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
const formElement = submitEvent.currentTarget;
|
const formElement = submitEvent.currentTarget;
|
||||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddWorkOrderType", formElement, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/admin/doAddWorkOrderType', formElement, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderTypes = responseJSON.workOrderTypes;
|
workOrderTypes = responseJSON.workOrderTypes;
|
||||||
renderWorkOrderTypes();
|
renderWorkOrderTypes();
|
||||||
formElement.reset();
|
formElement.reset();
|
||||||
formElement.querySelector("input").focus();
|
formElement.querySelector('input').focus();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Adding Work Order Type",
|
title: 'Error Adding Work Order Type',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,238 +1,239 @@
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||||
|
|
||||||
import type * as globalTypes from "../../types/globalTypes";
|
import type * as globalTypes from '../../types/globalTypes'
|
||||||
import type * as recordTypes from "../../types/recordTypes";
|
import type * as recordTypes from '../../types/recordTypes'
|
||||||
|
|
||||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||||
|
|
||||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal
|
||||||
declare const bulmaJS: BulmaJS;
|
declare const bulmaJS: BulmaJS
|
||||||
|
|
||||||
declare const los: globalTypes.LOS;
|
declare const los: globalTypes.LOS
|
||||||
|
|
||||||
let workOrderTypes: recordTypes.WorkOrderType[] = exports.workOrderTypes;
|
let workOrderTypes: recordTypes.WorkOrderType[] = exports.workOrderTypes
|
||||||
delete exports.workOrderTypes;
|
delete exports.workOrderTypes
|
||||||
|
|
||||||
const updateWorkOrderType = (submitEvent: SubmitEvent) => {
|
const updateWorkOrderType = (submitEvent: SubmitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault()
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/admin/doUpdateWorkOrderType",
|
los.urlPrefix + '/admin/doUpdateWorkOrderType',
|
||||||
submitEvent.currentTarget,
|
submitEvent.currentTarget,
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
workOrderTypes?: recordTypes.WorkOrderType[];
|
workOrderTypes?: recordTypes.WorkOrderType[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderTypes = responseJSON.workOrderTypes!;
|
workOrderTypes = responseJSON.workOrderTypes!
|
||||||
|
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: "Work Order Type Updated Successfully",
|
message: 'Work Order Type Updated Successfully',
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
})
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating Work Order Type",
|
title: 'Error Updating Work Order Type',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
const deleteWorkOrderType = (clickEvent: Event) => {
|
const deleteWorkOrderType = (clickEvent: Event) => {
|
||||||
const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest("tr")!;
|
const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest('tr')!
|
||||||
|
|
||||||
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
|
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId
|
||||||
|
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/admin/doDeleteWorkOrderType",
|
los.urlPrefix + '/admin/doDeleteWorkOrderType',
|
||||||
{
|
{
|
||||||
workOrderTypeId
|
workOrderTypeId
|
||||||
},
|
},
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
workOrderTypes?: recordTypes.WorkOrderType[];
|
workOrderTypes?: recordTypes.WorkOrderType[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderTypes = responseJSON.workOrderTypes!;
|
workOrderTypes = responseJSON.workOrderTypes!
|
||||||
|
|
||||||
if (workOrderTypes.length === 0) {
|
if (workOrderTypes.length === 0) {
|
||||||
renderWorkOrderTypes();
|
renderWorkOrderTypes()
|
||||||
} else {
|
} else {
|
||||||
tableRowElement.remove();
|
tableRowElement.remove()
|
||||||
}
|
}
|
||||||
|
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: "Work Order Type Deleted Successfully",
|
message: 'Work Order Type Deleted Successfully',
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
})
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Deleting Work Order Type",
|
title: 'Error Deleting Work Order Type',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete Work Order Type",
|
title: 'Delete Work Order Type',
|
||||||
message: `Are you sure you want to delete this work order type?<br />
|
message: `Are you sure you want to delete this work order type?<br />
|
||||||
Note that no work orders will be removed.`,
|
Note that no work orders will be removed.`,
|
||||||
messageIsHtml: true,
|
messageIsHtml: true,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete Work Order Type",
|
text: 'Yes, Delete Work Order Type',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
};
|
}
|
||||||
|
|
||||||
const moveWorkOrderType = (clickEvent: MouseEvent) => {
|
const moveWorkOrderType = (clickEvent: MouseEvent) => {
|
||||||
const buttonElement = clickEvent.currentTarget as HTMLButtonElement;
|
const buttonElement = clickEvent.currentTarget as HTMLButtonElement
|
||||||
|
|
||||||
const tableRowElement = buttonElement.closest("tr")!;
|
const tableRowElement = buttonElement.closest('tr')!
|
||||||
|
|
||||||
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
|
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix +
|
los.urlPrefix +
|
||||||
"/admin/" +
|
'/admin/' +
|
||||||
(buttonElement.dataset.direction === "up" ? "doMoveWorkOrderTypeUp" : "doMoveWorkOrderTypeDown"),
|
(buttonElement.dataset.direction === 'up' ? 'doMoveWorkOrderTypeUp' : 'doMoveWorkOrderTypeDown'),
|
||||||
{
|
{
|
||||||
workOrderTypeId,
|
workOrderTypeId,
|
||||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||||
},
|
},
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
workOrderTypes?: recordTypes.WorkOrderType[];
|
workOrderTypes?: recordTypes.WorkOrderType[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderTypes = responseJSON.workOrderTypes!;
|
workOrderTypes = responseJSON.workOrderTypes!
|
||||||
renderWorkOrderTypes();
|
renderWorkOrderTypes()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Moving Work Order Type",
|
title: 'Error Moving Work Order Type',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
const renderWorkOrderTypes = () => {
|
const renderWorkOrderTypes = () => {
|
||||||
const containerElement = document.querySelector("#container--workOrderTypes") as HTMLTableSectionElement;
|
const containerElement = document.querySelector('#container--workOrderTypes') as HTMLTableSectionElement
|
||||||
|
|
||||||
if (workOrderTypes.length === 0) {
|
if (workOrderTypes.length === 0) {
|
||||||
containerElement.innerHTML = `<tr><td colspan="2">
|
containerElement.innerHTML = `<tr><td colspan="2">
|
||||||
<div class="message is-warning"><p class="message-body">There are no active work order types.</p></div>
|
<div class="message is-warning"><p class="message-body">There are no active work order types.</p></div>
|
||||||
</td></tr>`;
|
</td></tr>`
|
||||||
|
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
containerElement.innerHTML = "";
|
containerElement.innerHTML = ''
|
||||||
|
|
||||||
for (const workOrderType of workOrderTypes) {
|
for (const workOrderType of workOrderTypes) {
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement('tr')
|
||||||
|
|
||||||
tableRowElement.dataset.workOrderTypeId = workOrderType.workOrderTypeId!.toString();
|
tableRowElement.dataset.workOrderTypeId = workOrderType.workOrderTypeId!.toString()
|
||||||
|
|
||||||
tableRowElement.innerHTML =
|
tableRowElement.innerHTML =
|
||||||
"<td>" +
|
'<td>' +
|
||||||
"<form>" +
|
'<form>' +
|
||||||
'<input name="workOrderTypeId" type="hidden" value="' +
|
'<input name="workOrderTypeId" type="hidden" value="' +
|
||||||
workOrderType.workOrderTypeId!.toString() +
|
workOrderType.workOrderTypeId!.toString() +
|
||||||
'" />' +
|
'" />' +
|
||||||
('<div class="field has-addons">' +
|
('<div class="field has-addons">' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<input class="input" name="workOrderType" type="text" value="' +
|
'<input class="input" name="workOrderType" type="text" value="' +
|
||||||
cityssm.escapeHTML(workOrderType.workOrderType || "") +
|
cityssm.escapeHTML(workOrderType.workOrderType || '') +
|
||||||
'" maxlength="100" aria-label="Work Order Type" required />' +
|
'" maxlength="100" aria-label="Work Order Type" required />' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</form>" +
|
'</form>' +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
'<td class="is-nowrap">' +
|
'<td class="is-nowrap">' +
|
||||||
'<div class="field is-grouped">' +
|
'<div class="field is-grouped">' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
los.getMoveUpDownButtonFieldHTML(
|
los.getMoveUpDownButtonFieldHTML(
|
||||||
"button--moveWorkOrderTypeUp",
|
'button--moveWorkOrderTypeUp',
|
||||||
"button--moveWorkOrderTypeDown",
|
'button--moveWorkOrderTypeDown',
|
||||||
false
|
false
|
||||||
) +
|
) +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
'<div class="control">' +
|
'<div class="control">' +
|
||||||
'<button class="button is-danger is-light button--deleteWorkOrderType" data-tooltip="Delete Work Order Type" type="button" aria-label="Delete Work Order Type">' +
|
'<button class="button is-danger is-light button--deleteWorkOrderType" data-tooltip="Delete Work Order Type" type="button" aria-label="Delete Work Order Type">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</td>";
|
'</td>'
|
||||||
|
|
||||||
tableRowElement.querySelector("form")!.addEventListener("submit", updateWorkOrderType);
|
tableRowElement.querySelector('form')!.addEventListener('submit', updateWorkOrderType)
|
||||||
|
|
||||||
(tableRowElement.querySelector(".button--moveWorkOrderTypeUp") as HTMLButtonElement).addEventListener(
|
;(tableRowElement.querySelector('.button--moveWorkOrderTypeUp') as HTMLButtonElement).addEventListener(
|
||||||
"click",
|
'click',
|
||||||
moveWorkOrderType
|
moveWorkOrderType
|
||||||
);
|
)
|
||||||
|
|
||||||
(
|
;(tableRowElement.querySelector('.button--moveWorkOrderTypeDown') as HTMLButtonElement).addEventListener(
|
||||||
tableRowElement.querySelector(".button--moveWorkOrderTypeDown") as HTMLButtonElement
|
'click',
|
||||||
).addEventListener("click", moveWorkOrderType);
|
moveWorkOrderType
|
||||||
|
)
|
||||||
|
|
||||||
tableRowElement
|
tableRowElement
|
||||||
.querySelector(".button--deleteWorkOrderType")!
|
.querySelector('.button--deleteWorkOrderType')!
|
||||||
.addEventListener("click", deleteWorkOrderType);
|
.addEventListener('click', deleteWorkOrderType)
|
||||||
|
|
||||||
containerElement.append(tableRowElement);
|
containerElement.append(tableRowElement)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
(document.querySelector("#form--addWorkOrderType") as HTMLFormElement).addEventListener(
|
;(document.querySelector('#form--addWorkOrderType') as HTMLFormElement).addEventListener(
|
||||||
"submit",
|
'submit',
|
||||||
(submitEvent: SubmitEvent) => {
|
(submitEvent: SubmitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault()
|
||||||
|
|
||||||
const formElement = submitEvent.currentTarget as HTMLFormElement;
|
const formElement = submitEvent.currentTarget as HTMLFormElement
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/admin/doAddWorkOrderType",
|
los.urlPrefix + '/admin/doAddWorkOrderType',
|
||||||
formElement,
|
formElement,
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
workOrderTypes?: recordTypes.WorkOrderType[];
|
workOrderTypes?: recordTypes.WorkOrderType[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderTypes = responseJSON.workOrderTypes!;
|
workOrderTypes = responseJSON.workOrderTypes!
|
||||||
renderWorkOrderTypes();
|
renderWorkOrderTypes()
|
||||||
formElement.reset();
|
formElement.reset()
|
||||||
formElement.querySelector("input")!.focus();
|
formElement.querySelector('input')!.focus()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Adding Work Order Type",
|
title: 'Error Adding Work Order Type',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
|
|
||||||
renderWorkOrderTypes();
|
renderWorkOrderTypes()
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,8 @@
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
(() => {
|
(() => {
|
||||||
const los = exports.los;
|
const los = exports.los;
|
||||||
const workOrderNumberCircleElements = document.querySelectorAll(".fa-circle[data-work-order-number");
|
const workOrderNumberCircleElements = document.querySelectorAll('.fa-circle[data-work-order-number');
|
||||||
for (const workOrderNumberCircleElement of workOrderNumberCircleElements) {
|
for (const workOrderNumberCircleElement of workOrderNumberCircleElements) {
|
||||||
workOrderNumberCircleElement.style.color = los.getRandomColor(workOrderNumberCircleElement.dataset.workOrderNumber || "");
|
workOrderNumberCircleElement.style.color = los.getRandomColor(workOrderNumberCircleElement.dataset.workOrderNumber || '');
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,17 @@
|
||||||
/* eslint-disable unicorn/prefer-module */
|
/* eslint-disable unicorn/prefer-module */
|
||||||
|
|
||||||
import type * as globalTypes from "../types/globalTypes";
|
import type * as globalTypes from '../types/globalTypes'
|
||||||
|
|
||||||
(() => {
|
;(() => {
|
||||||
const los = exports.los as globalTypes.LOS;
|
const los = exports.los as globalTypes.LOS
|
||||||
|
|
||||||
const workOrderNumberCircleElements = document.querySelectorAll(
|
const workOrderNumberCircleElements = document.querySelectorAll(
|
||||||
".fa-circle[data-work-order-number"
|
'.fa-circle[data-work-order-number'
|
||||||
) as NodeListOf<HTMLElement>;
|
) as NodeListOf<HTMLElement>
|
||||||
|
|
||||||
for (const workOrderNumberCircleElement of workOrderNumberCircleElements) {
|
for (const workOrderNumberCircleElement of workOrderNumberCircleElements) {
|
||||||
workOrderNumberCircleElement.style.color = los.getRandomColor(
|
workOrderNumberCircleElement.style.color = los.getRandomColor(
|
||||||
workOrderNumberCircleElement.dataset.workOrderNumber || ""
|
workOrderNumberCircleElement.dataset.workOrderNumber || ''
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
})();
|
})()
|
||||||
|
|
|
||||||
|
|
@ -4,14 +4,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
(() => {
|
(() => {
|
||||||
var _a;
|
var _a;
|
||||||
const los = exports.los;
|
const los = exports.los;
|
||||||
const lotId = document.querySelector("#lot--lotId").value;
|
const lotId = document.querySelector('#lot--lotId')
|
||||||
const isCreate = lotId === "";
|
.value;
|
||||||
|
const isCreate = lotId === '';
|
||||||
// Main form
|
// Main form
|
||||||
let refreshAfterSave = isCreate;
|
let refreshAfterSave = isCreate;
|
||||||
const formElement = document.querySelector("#form--lot");
|
const formElement = document.querySelector('#form--lot');
|
||||||
function updateLot(formEvent) {
|
function updateLot(formEvent) {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/lots/" + (isCreate ? "doCreateLot" : "doUpdateLot"), formElement, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/lots/' + (isCreate ? 'doCreateLot' : 'doUpdateLot'), formElement, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
los.clearUnsavedChanges();
|
los.clearUnsavedChanges();
|
||||||
if (isCreate || refreshAfterSave) {
|
if (isCreate || refreshAfterSave) {
|
||||||
|
|
@ -19,30 +20,31 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: exports.aliases.lot + " Updated Successfully",
|
message: exports.aliases.lot + ' Updated Successfully',
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating " + exports.aliases.lot,
|
title: 'Error Updating ' + exports.aliases.lot,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
formElement.addEventListener("submit", updateLot);
|
formElement.addEventListener('submit', updateLot);
|
||||||
const formInputElements = formElement.querySelectorAll("input, select");
|
const formInputElements = formElement.querySelectorAll('input, select');
|
||||||
for (const formInputElement of formInputElements) {
|
for (const formInputElement of formInputElements) {
|
||||||
formInputElement.addEventListener("change", los.setUnsavedChanges);
|
formInputElement.addEventListener('change', los.setUnsavedChanges);
|
||||||
}
|
}
|
||||||
los.initializeUnlockFieldButtons(formElement);
|
los.initializeUnlockFieldButtons(formElement);
|
||||||
(_a = document.querySelector("#button--deleteLot")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", (clickEvent) => {
|
(_a = document
|
||||||
|
.querySelector('#button--deleteLot')) === null || _a === void 0 ? void 0 : _a.addEventListener('click', (clickEvent) => {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault();
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(los.urlPrefix + "/lots/doDeleteLot", {
|
cityssm.postJSON(los.urlPrefix + '/lots/doDeleteLot', {
|
||||||
lotId
|
lotId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
|
|
@ -52,16 +54,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: `Error Deleting ${los.escapedAliases.Lot}`,
|
title: `Error Deleting ${los.escapedAliases.Lot}`,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete " + exports.aliases.lot,
|
title: 'Delete ' + exports.aliases.lot,
|
||||||
message: `Are you sure you want to delete this ${los.escapedAliases.lot}?`,
|
message: `Are you sure you want to delete this ${los.escapedAliases.lot}?`,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: `Yes, Delete ${los.escapedAliases.Lot}`,
|
text: `Yes, Delete ${los.escapedAliases.Lot}`,
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
|
|
@ -69,17 +71,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
// Lot Type
|
// Lot Type
|
||||||
const lotTypeIdElement = document.querySelector("#lot--lotTypeId");
|
const lotTypeIdElement = document.querySelector('#lot--lotTypeId');
|
||||||
if (isCreate) {
|
if (isCreate) {
|
||||||
const lotFieldsContainerElement = document.querySelector("#container--lotFields");
|
const lotFieldsContainerElement = document.querySelector('#container--lotFields');
|
||||||
lotTypeIdElement.addEventListener("change", () => {
|
lotTypeIdElement.addEventListener('change', () => {
|
||||||
if (lotTypeIdElement.value === "") {
|
if (lotTypeIdElement.value === '') {
|
||||||
lotFieldsContainerElement.innerHTML = `<div class="message is-info">
|
lotFieldsContainerElement.innerHTML = `<div class="message is-info">
|
||||||
<p class="message-body">Select the ${los.escapedAliases.lot} type to load the available fields.</p>
|
<p class="message-body">Select the ${los.escapedAliases.lot} type to load the available fields.</p>
|
||||||
</div>`;
|
</div>`;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
cityssm.postJSON(los.urlPrefix + "/lots/doGetLotTypeFields", {
|
cityssm.postJSON(los.urlPrefix + '/lots/doGetLotTypeFields', {
|
||||||
lotTypeId: lotTypeIdElement.value
|
lotTypeId: lotTypeIdElement.value
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.lotTypeFields.length === 0) {
|
if (responseJSON.lotTypeFields.length === 0) {
|
||||||
|
|
@ -88,41 +90,40 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
</div>`;
|
</div>`;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
lotFieldsContainerElement.innerHTML = "";
|
lotFieldsContainerElement.innerHTML = '';
|
||||||
let lotTypeFieldIds = "";
|
let lotTypeFieldIds = '';
|
||||||
for (const lotTypeField of responseJSON.lotTypeFields) {
|
for (const lotTypeField of responseJSON.lotTypeFields) {
|
||||||
lotTypeFieldIds += "," + lotTypeField.lotTypeFieldId;
|
lotTypeFieldIds += ',' + lotTypeField.lotTypeFieldId;
|
||||||
const fieldName = "lotFieldValue_" + lotTypeField.lotTypeFieldId;
|
const fieldName = 'lotFieldValue_' + lotTypeField.lotTypeFieldId;
|
||||||
const fieldId = "lot--" + fieldName;
|
const fieldId = 'lot--' + fieldName;
|
||||||
const fieldElement = document.createElement("div");
|
const fieldElement = document.createElement('div');
|
||||||
fieldElement.className = "field";
|
fieldElement.className = 'field';
|
||||||
fieldElement.innerHTML = `<label class="label" for="${fieldId}"></label>
|
fieldElement.innerHTML = `<label class="label" for="${fieldId}"></label>
|
||||||
<div class="control"></div>`;
|
<div class="control"></div>`;
|
||||||
fieldElement.querySelector("label").textContent =
|
fieldElement.querySelector('label').textContent = lotTypeField.lotTypeField;
|
||||||
lotTypeField.lotTypeField;
|
if (lotTypeField.lotTypeFieldValues === '') {
|
||||||
if (lotTypeField.lotTypeFieldValues === "") {
|
const inputElement = document.createElement('input');
|
||||||
const inputElement = document.createElement("input");
|
inputElement.className = 'input';
|
||||||
inputElement.className = "input";
|
|
||||||
inputElement.id = fieldId;
|
inputElement.id = fieldId;
|
||||||
inputElement.name = fieldName;
|
inputElement.name = fieldName;
|
||||||
inputElement.type = "text";
|
inputElement.type = 'text';
|
||||||
inputElement.required = lotTypeField.isRequired;
|
inputElement.required = lotTypeField.isRequired;
|
||||||
inputElement.minLength = lotTypeField.minimumLength;
|
inputElement.minLength = lotTypeField.minimumLength;
|
||||||
inputElement.maxLength = lotTypeField.maximumLength;
|
inputElement.maxLength = lotTypeField.maximumLength;
|
||||||
if (lotTypeField.pattern && lotTypeField.pattern !== "") {
|
if (lotTypeField.pattern && lotTypeField.pattern !== '') {
|
||||||
inputElement.pattern = lotTypeField.pattern;
|
inputElement.pattern = lotTypeField.pattern;
|
||||||
}
|
}
|
||||||
fieldElement.querySelector(".control").append(inputElement);
|
fieldElement.querySelector('.control').append(inputElement);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
fieldElement.querySelector(".control").innerHTML = `<div class="select is-fullwidth">
|
fieldElement.querySelector('.control').innerHTML = `<div class="select is-fullwidth">
|
||||||
<select id="${fieldId}" name="${fieldName}"><option value="">(Not Set)</option></select>
|
<select id="${fieldId}" name="${fieldName}"><option value="">(Not Set)</option></select>
|
||||||
</div>`;
|
</div>`;
|
||||||
const selectElement = fieldElement.querySelector("select");
|
const selectElement = fieldElement.querySelector('select');
|
||||||
selectElement.required = lotTypeField.isRequired;
|
selectElement.required = lotTypeField.isRequired;
|
||||||
const optionValues = lotTypeField.lotTypeFieldValues.split("\n");
|
const optionValues = lotTypeField.lotTypeFieldValues.split('\n');
|
||||||
for (const optionValue of optionValues) {
|
for (const optionValue of optionValues) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option');
|
||||||
optionElement.value = optionValue;
|
optionElement.value = optionValue;
|
||||||
optionElement.textContent = optionValue;
|
optionElement.textContent = optionValue;
|
||||||
selectElement.append(optionElement);
|
selectElement.append(optionElement);
|
||||||
|
|
@ -130,28 +131,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
lotFieldsContainerElement.append(fieldElement);
|
lotFieldsContainerElement.append(fieldElement);
|
||||||
}
|
}
|
||||||
lotFieldsContainerElement.insertAdjacentHTML("beforeend", `<input name="lotTypeFieldIds" type="hidden"
|
lotFieldsContainerElement.insertAdjacentHTML('beforeend', `<input name="lotTypeFieldIds" type="hidden"
|
||||||
value="${lotTypeFieldIds.slice(1)}" />`);
|
value="${lotTypeFieldIds.slice(1)}" />`);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const originalLotTypeId = lotTypeIdElement.value;
|
const originalLotTypeId = lotTypeIdElement.value;
|
||||||
lotTypeIdElement.addEventListener("change", () => {
|
lotTypeIdElement.addEventListener('change', () => {
|
||||||
if (lotTypeIdElement.value !== originalLotTypeId) {
|
if (lotTypeIdElement.value !== originalLotTypeId) {
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Confirm Change",
|
title: 'Confirm Change',
|
||||||
message: `Are you sure you want to change the ${los.escapedAliases.lot} type?\n
|
message: `Are you sure you want to change the ${los.escapedAliases.lot} type?\n
|
||||||
This change affects the additional fields associated with this record.`,
|
This change affects the additional fields associated with this record.`,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Keep the Change",
|
text: 'Yes, Keep the Change',
|
||||||
callbackFunction: () => {
|
callbackFunction: () => {
|
||||||
refreshAfterSave = true;
|
refreshAfterSave = true;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
cancelButton: {
|
cancelButton: {
|
||||||
text: "Revert the Change",
|
text: 'Revert the Change',
|
||||||
callbackFunction: () => {
|
callbackFunction: () => {
|
||||||
lotTypeIdElement.value = originalLotTypeId;
|
lotTypeIdElement.value = originalLotTypeId;
|
||||||
}
|
}
|
||||||
|
|
@ -164,7 +165,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
let lotComments = exports.lotComments;
|
let lotComments = exports.lotComments;
|
||||||
delete exports.lotComments;
|
delete exports.lotComments;
|
||||||
function openEditLotComment(clickEvent) {
|
function openEditLotComment(clickEvent) {
|
||||||
const lotCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.lotCommentId, 10);
|
const lotCommentId = Number.parseInt(clickEvent.currentTarget.closest('tr').dataset
|
||||||
|
.lotCommentId, 10);
|
||||||
const lotComment = lotComments.find((currentLotComment) => {
|
const lotComment = lotComments.find((currentLotComment) => {
|
||||||
return currentLotComment.lotCommentId === lotCommentId;
|
return currentLotComment.lotCommentId === lotCommentId;
|
||||||
});
|
});
|
||||||
|
|
@ -172,7 +174,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
let editCloseModalFunction;
|
let editCloseModalFunction;
|
||||||
const editComment = (submitEvent) => {
|
const editComment = (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/lots/doUpdateLotComment", editFormElement, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/lots/doUpdateLotComment', editFormElement, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotComments = responseJSON.lotComments;
|
lotComments = responseJSON.lotComments;
|
||||||
editCloseModalFunction();
|
editCloseModalFunction();
|
||||||
|
|
@ -180,37 +182,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating Comment",
|
title: 'Error Updating Comment',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
cityssm.openHtmlModal("lot-editComment", {
|
cityssm.openHtmlModal('lot-editComment', {
|
||||||
onshow: (modalElement) => {
|
onshow: (modalElement) => {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement);
|
||||||
modalElement.querySelector("#lotCommentEdit--lotId").value = lotId;
|
modalElement.querySelector('#lotCommentEdit--lotId').value = lotId;
|
||||||
modalElement.querySelector("#lotCommentEdit--lotCommentId").value =
|
modalElement.querySelector('#lotCommentEdit--lotCommentId').value = lotCommentId.toString();
|
||||||
lotCommentId.toString();
|
modalElement.querySelector('#lotCommentEdit--lotComment').value = lotComment.lotComment;
|
||||||
modalElement.querySelector("#lotCommentEdit--lotComment").value =
|
const lotCommentDateStringElement = modalElement.querySelector('#lotCommentEdit--lotCommentDateString');
|
||||||
lotComment.lotComment;
|
|
||||||
const lotCommentDateStringElement = modalElement.querySelector("#lotCommentEdit--lotCommentDateString");
|
|
||||||
lotCommentDateStringElement.value = lotComment.lotCommentDateString;
|
lotCommentDateStringElement.value = lotComment.lotCommentDateString;
|
||||||
const currentDateString = cityssm.dateToString(new Date());
|
const currentDateString = cityssm.dateToString(new Date());
|
||||||
lotCommentDateStringElement.max =
|
lotCommentDateStringElement.max =
|
||||||
lotComment.lotCommentDateString <= currentDateString
|
lotComment.lotCommentDateString <= currentDateString
|
||||||
? currentDateString
|
? currentDateString
|
||||||
: lotComment.lotCommentDateString;
|
: lotComment.lotCommentDateString;
|
||||||
modalElement.querySelector("#lotCommentEdit--lotCommentTimeString").value = lotComment.lotCommentTimeString;
|
modalElement.querySelector('#lotCommentEdit--lotCommentTimeString').value = lotComment.lotCommentTimeString;
|
||||||
},
|
},
|
||||||
onshown: (modalElement, closeModalFunction) => {
|
onshown: (modalElement, closeModalFunction) => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
los.initializeDatePickers(modalElement);
|
los.initializeDatePickers(modalElement);
|
||||||
// los.initializeTimePickers(modalElement);
|
modalElement.querySelector('#lotCommentEdit--lotComment').focus();
|
||||||
modalElement.querySelector("#lotCommentEdit--lotComment").focus();
|
editFormElement = modalElement.querySelector('form');
|
||||||
editFormElement = modalElement.querySelector("form");
|
editFormElement.addEventListener('submit', editComment);
|
||||||
editFormElement.addEventListener("submit", editComment);
|
|
||||||
editCloseModalFunction = closeModalFunction;
|
editCloseModalFunction = closeModalFunction;
|
||||||
},
|
},
|
||||||
onremoved: () => {
|
onremoved: () => {
|
||||||
|
|
@ -219,9 +218,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function deleteLotComment(clickEvent) {
|
function deleteLotComment(clickEvent) {
|
||||||
const lotCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.lotCommentId, 10);
|
const lotCommentId = Number.parseInt(clickEvent.currentTarget.closest('tr').dataset
|
||||||
|
.lotCommentId, 10);
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(los.urlPrefix + "/lots/doDeleteLotComment", {
|
cityssm.postJSON(los.urlPrefix + '/lots/doDeleteLotComment', {
|
||||||
lotId,
|
lotId,
|
||||||
lotCommentId
|
lotCommentId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
|
|
@ -231,33 +231,33 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Removing Comment",
|
title: 'Error Removing Comment',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Remove Comment?",
|
title: 'Remove Comment?',
|
||||||
message: "Are you sure you want to remove this comment?",
|
message: 'Are you sure you want to remove this comment?',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Remove Comment",
|
text: 'Yes, Remove Comment',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
},
|
},
|
||||||
contextualColorName: "warning"
|
contextualColorName: 'warning'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function renderLotComments() {
|
function renderLotComments() {
|
||||||
const containerElement = document.querySelector("#container--lotComments");
|
const containerElement = document.querySelector('#container--lotComments');
|
||||||
if (lotComments.length === 0) {
|
if (lotComments.length === 0) {
|
||||||
containerElement.innerHTML = `<div class="message is-info">
|
containerElement.innerHTML = `<div class="message is-info">
|
||||||
<p class="message-body">There are no comments to display.</p>
|
<p class="message-body">There are no comments to display.</p>
|
||||||
</div>`;
|
</div>`;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const tableElement = document.createElement("table");
|
const tableElement = document.createElement('table');
|
||||||
tableElement.className = "table is-fullwidth is-striped is-hoverable";
|
tableElement.className = 'table is-fullwidth is-striped is-hoverable';
|
||||||
tableElement.innerHTML = `<thead><tr>
|
tableElement.innerHTML = `<thead><tr>
|
||||||
<th>Commentor</th>
|
<th>Commentor</th>
|
||||||
<th>Comment Date</th>
|
<th>Comment Date</th>
|
||||||
|
|
@ -266,42 +266,48 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
</tr></thead>
|
</tr></thead>
|
||||||
<tbody></tbody>`;
|
<tbody></tbody>`;
|
||||||
for (const lotComment of lotComments) {
|
for (const lotComment of lotComments) {
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement('tr');
|
||||||
tableRowElement.dataset.lotCommentId = lotComment.lotCommentId.toString();
|
tableRowElement.dataset.lotCommentId = lotComment.lotCommentId.toString();
|
||||||
tableRowElement.innerHTML =
|
tableRowElement.innerHTML =
|
||||||
"<td>" +
|
'<td>' +
|
||||||
cityssm.escapeHTML(lotComment.recordCreate_userName || "") +
|
cityssm.escapeHTML(lotComment.recordCreate_userName || '') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
"<td>" +
|
'<td>' +
|
||||||
lotComment.lotCommentDateString +
|
lotComment.lotCommentDateString +
|
||||||
(lotComment.lotCommentTime === 0 ? "" : " " + lotComment.lotCommentTimeString) +
|
(lotComment.lotCommentTime === 0
|
||||||
"</td>" +
|
? ''
|
||||||
"<td>" +
|
: ' ' + lotComment.lotCommentTimeString) +
|
||||||
cityssm.escapeHTML(lotComment.lotComment || "") +
|
'</td>' +
|
||||||
"</td>" +
|
'<td>' +
|
||||||
|
cityssm.escapeHTML(lotComment.lotComment || '') +
|
||||||
|
'</td>' +
|
||||||
('<td class="is-hidden-print">' +
|
('<td class="is-hidden-print">' +
|
||||||
'<div class="buttons are-small is-justify-content-end">' +
|
'<div class="buttons are-small is-justify-content-end">' +
|
||||||
('<button class="button is-primary button--edit" type="button">' +
|
('<button class="button is-primary button--edit" type="button">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||||
" <span>Edit</span>" +
|
' <span>Edit</span>' +
|
||||||
"</button>") +
|
'</button>') +
|
||||||
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
|
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>") +
|
'</button>') +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</td>");
|
'</td>');
|
||||||
tableRowElement.querySelector(".button--edit").addEventListener("click", openEditLotComment);
|
tableRowElement
|
||||||
tableRowElement.querySelector(".button--delete").addEventListener("click", deleteLotComment);
|
.querySelector('.button--edit')
|
||||||
tableElement.querySelector("tbody").append(tableRowElement);
|
.addEventListener('click', openEditLotComment);
|
||||||
|
tableRowElement
|
||||||
|
.querySelector('.button--delete')
|
||||||
|
.addEventListener('click', deleteLotComment);
|
||||||
|
tableElement.querySelector('tbody').append(tableRowElement);
|
||||||
}
|
}
|
||||||
containerElement.innerHTML = "";
|
containerElement.innerHTML = '';
|
||||||
containerElement.append(tableElement);
|
containerElement.append(tableElement);
|
||||||
}
|
}
|
||||||
function openAddCommentModal() {
|
function openAddCommentModal() {
|
||||||
let addCommentCloseModalFunction;
|
let addCommentCloseModalFunction;
|
||||||
const doAddComment = (formEvent) => {
|
const doAddComment = (formEvent) => {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/lots/doAddLotComment", formEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/lots/doAddLotComment', formEvent.currentTarget, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotComments = responseJSON.lotComments;
|
lotComments = responseJSON.lotComments;
|
||||||
renderLotComments();
|
renderLotComments();
|
||||||
|
|
@ -309,25 +315,29 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
cityssm.openHtmlModal("lot-addComment", {
|
cityssm.openHtmlModal('lot-addComment', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement);
|
||||||
modalElement.querySelector("#lotCommentAdd--lotId").value = lotId;
|
modalElement.querySelector('#lotCommentAdd--lotId').value = lotId;
|
||||||
modalElement.querySelector("form").addEventListener("submit", doAddComment);
|
modalElement
|
||||||
|
.querySelector('form')
|
||||||
|
.addEventListener('submit', doAddComment);
|
||||||
},
|
},
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
addCommentCloseModalFunction = closeModalFunction;
|
addCommentCloseModalFunction = closeModalFunction;
|
||||||
modalElement.querySelector("#lotCommentAdd--lotComment").focus();
|
modalElement.querySelector('#lotCommentAdd--lotComment').focus();
|
||||||
},
|
},
|
||||||
onremoved() {
|
onremoved() {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
document.querySelector("#lotComments--add").focus();
|
document.querySelector('#lotComments--add').focus();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (!isCreate) {
|
if (!isCreate) {
|
||||||
document.querySelector("#lotComments--add").addEventListener("click", openAddCommentModal);
|
document
|
||||||
|
.querySelector('#lotComments--add')
|
||||||
|
.addEventListener('click', openAddCommentModal);
|
||||||
renderLotComments();
|
renderLotComments();
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|
|
||||||
|
|
@ -1,119 +1,130 @@
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||||
|
|
||||||
import type * as globalTypes from "../types/globalTypes";
|
import type * as globalTypes from '../types/globalTypes'
|
||||||
import type * as recordTypes from "../types/recordTypes";
|
import type * as recordTypes from '../types/recordTypes'
|
||||||
|
|
||||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||||
|
|
||||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal
|
||||||
declare const bulmaJS: BulmaJS;
|
declare const bulmaJS: BulmaJS
|
||||||
|
|
||||||
(() => {
|
;(() => {
|
||||||
const los = exports.los as globalTypes.LOS;
|
const los = exports.los as globalTypes.LOS
|
||||||
|
|
||||||
const lotId = (document.querySelector("#lot--lotId") as HTMLInputElement).value;
|
const lotId = (document.querySelector('#lot--lotId') as HTMLInputElement)
|
||||||
const isCreate = lotId === "";
|
.value
|
||||||
|
const isCreate = lotId === ''
|
||||||
|
|
||||||
// Main form
|
// Main form
|
||||||
|
|
||||||
let refreshAfterSave = isCreate;
|
let refreshAfterSave = isCreate
|
||||||
|
|
||||||
const formElement = document.querySelector("#form--lot") as HTMLFormElement;
|
const formElement = document.querySelector('#form--lot') as HTMLFormElement
|
||||||
|
|
||||||
function updateLot(formEvent: SubmitEvent) {
|
function updateLot(formEvent: SubmitEvent) {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault()
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/lots/" + (isCreate ? "doCreateLot" : "doUpdateLot"),
|
los.urlPrefix + '/lots/' + (isCreate ? 'doCreateLot' : 'doUpdateLot'),
|
||||||
formElement,
|
formElement,
|
||||||
(responseJSON: { success: boolean; lotId?: number; errorMessage?: string }) => {
|
(responseJSON: {
|
||||||
|
success: boolean
|
||||||
|
lotId?: number
|
||||||
|
errorMessage?: string
|
||||||
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
los.clearUnsavedChanges();
|
los.clearUnsavedChanges()
|
||||||
|
|
||||||
if (isCreate || refreshAfterSave) {
|
if (isCreate || refreshAfterSave) {
|
||||||
window.location.href = los.getLotURL(responseJSON.lotId, true, true);
|
window.location.href = los.getLotURL(responseJSON.lotId, true, true)
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: exports.aliases.lot + " Updated Successfully",
|
message: exports.aliases.lot + ' Updated Successfully',
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating " + exports.aliases.lot,
|
title: 'Error Updating ' + exports.aliases.lot,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
formElement.addEventListener("submit", updateLot);
|
formElement.addEventListener('submit', updateLot)
|
||||||
|
|
||||||
const formInputElements = formElement.querySelectorAll("input, select");
|
const formInputElements = formElement.querySelectorAll('input, select')
|
||||||
|
|
||||||
for (const formInputElement of formInputElements) {
|
for (const formInputElement of formInputElements) {
|
||||||
formInputElement.addEventListener("change", los.setUnsavedChanges);
|
formInputElement.addEventListener('change', los.setUnsavedChanges)
|
||||||
}
|
}
|
||||||
|
|
||||||
los.initializeUnlockFieldButtons(formElement);
|
los.initializeUnlockFieldButtons(formElement)
|
||||||
|
|
||||||
document.querySelector("#button--deleteLot")?.addEventListener("click", (clickEvent) => {
|
document
|
||||||
clickEvent.preventDefault();
|
.querySelector('#button--deleteLot')
|
||||||
|
?.addEventListener('click', (clickEvent) => {
|
||||||
|
clickEvent.preventDefault()
|
||||||
|
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/lots/doDeleteLot",
|
los.urlPrefix + '/lots/doDeleteLot',
|
||||||
{
|
{
|
||||||
lotId
|
lotId
|
||||||
},
|
},
|
||||||
(responseJSON: { success: boolean; errorMessage?: string }) => {
|
(responseJSON: { success: boolean; errorMessage?: string }) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
cityssm.disableNavBlocker();
|
cityssm.disableNavBlocker()
|
||||||
window.location.href = los.getLotURL();
|
window.location.href = los.getLotURL()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: `Error Deleting ${los.escapedAliases.Lot}`,
|
title: `Error Deleting ${los.escapedAliases.Lot}`,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete " + exports.aliases.lot,
|
title: 'Delete ' + exports.aliases.lot,
|
||||||
message: `Are you sure you want to delete this ${los.escapedAliases.lot}?`,
|
message: `Are you sure you want to delete this ${los.escapedAliases.lot}?`,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: `Yes, Delete ${los.escapedAliases.Lot}`,
|
text: `Yes, Delete ${los.escapedAliases.Lot}`,
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
|
|
||||||
// Lot Type
|
// Lot Type
|
||||||
|
|
||||||
const lotTypeIdElement = document.querySelector("#lot--lotTypeId") as HTMLSelectElement;
|
const lotTypeIdElement = document.querySelector(
|
||||||
|
'#lot--lotTypeId'
|
||||||
|
) as HTMLSelectElement
|
||||||
|
|
||||||
if (isCreate) {
|
if (isCreate) {
|
||||||
const lotFieldsContainerElement = document.querySelector("#container--lotFields") as HTMLElement;
|
const lotFieldsContainerElement = document.querySelector(
|
||||||
|
'#container--lotFields'
|
||||||
|
) as HTMLElement
|
||||||
|
|
||||||
lotTypeIdElement.addEventListener("change", () => {
|
lotTypeIdElement.addEventListener('change', () => {
|
||||||
if (lotTypeIdElement.value === "") {
|
if (lotTypeIdElement.value === '') {
|
||||||
lotFieldsContainerElement.innerHTML = `<div class="message is-info">
|
lotFieldsContainerElement.innerHTML = `<div class="message is-info">
|
||||||
<p class="message-body">Select the ${los.escapedAliases.lot} type to load the available fields.</p>
|
<p class="message-body">Select the ${los.escapedAliases.lot} type to load the available fields.</p>
|
||||||
</div>`;
|
</div>`
|
||||||
|
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/lots/doGetLotTypeFields",
|
los.urlPrefix + '/lots/doGetLotTypeFields',
|
||||||
{
|
{
|
||||||
lotTypeId: lotTypeIdElement.value
|
lotTypeId: lotTypeIdElement.value
|
||||||
},
|
},
|
||||||
|
|
@ -121,341 +132,389 @@ declare const bulmaJS: BulmaJS;
|
||||||
if (responseJSON.lotTypeFields.length === 0) {
|
if (responseJSON.lotTypeFields.length === 0) {
|
||||||
lotFieldsContainerElement.innerHTML = `<div class="message is-info">
|
lotFieldsContainerElement.innerHTML = `<div class="message is-info">
|
||||||
<p class="message-body">There are no additional fields for this ${los.escapedAliases.lot} type.</p>
|
<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) {
|
for (const lotTypeField of responseJSON.lotTypeFields) {
|
||||||
lotTypeFieldIds += "," + lotTypeField.lotTypeFieldId;
|
lotTypeFieldIds += ',' + lotTypeField.lotTypeFieldId
|
||||||
|
|
||||||
const fieldName = "lotFieldValue_" + lotTypeField.lotTypeFieldId;
|
const fieldName = 'lotFieldValue_' + lotTypeField.lotTypeFieldId
|
||||||
|
|
||||||
const fieldId = "lot--" + fieldName;
|
const fieldId = 'lot--' + fieldName
|
||||||
|
|
||||||
const fieldElement = document.createElement("div");
|
const fieldElement = document.createElement('div')
|
||||||
fieldElement.className = "field";
|
fieldElement.className = 'field'
|
||||||
fieldElement.innerHTML = `<label class="label" for="${fieldId}"></label>
|
fieldElement.innerHTML = `<label class="label" for="${fieldId}"></label>
|
||||||
<div class="control"></div>`;
|
<div class="control"></div>`
|
||||||
|
|
||||||
(fieldElement.querySelector("label") as HTMLLabelElement).textContent =
|
;(
|
||||||
lotTypeField.lotTypeField as string;
|
fieldElement.querySelector('label') as HTMLLabelElement
|
||||||
|
).textContent = lotTypeField.lotTypeField as string
|
||||||
|
|
||||||
if (lotTypeField.lotTypeFieldValues === "") {
|
if (lotTypeField.lotTypeFieldValues === '') {
|
||||||
const inputElement = document.createElement("input");
|
const inputElement = document.createElement('input')
|
||||||
|
|
||||||
inputElement.className = "input";
|
inputElement.className = 'input'
|
||||||
|
|
||||||
inputElement.id = fieldId;
|
inputElement.id = fieldId
|
||||||
|
|
||||||
inputElement.name = fieldName;
|
inputElement.name = fieldName
|
||||||
|
|
||||||
inputElement.type = "text";
|
inputElement.type = 'text'
|
||||||
|
|
||||||
inputElement.required = lotTypeField.isRequired as boolean;
|
inputElement.required = lotTypeField.isRequired as boolean
|
||||||
inputElement.minLength = lotTypeField.minimumLength as number;
|
inputElement.minLength = lotTypeField.minimumLength as number
|
||||||
inputElement.maxLength = lotTypeField.maximumLength as number;
|
inputElement.maxLength = lotTypeField.maximumLength as number
|
||||||
|
|
||||||
if (lotTypeField.pattern && lotTypeField.pattern !== "") {
|
if (lotTypeField.pattern && lotTypeField.pattern !== '') {
|
||||||
inputElement.pattern = lotTypeField.pattern;
|
inputElement.pattern = lotTypeField.pattern
|
||||||
}
|
}
|
||||||
|
|
||||||
fieldElement.querySelector(".control")!.append(inputElement);
|
fieldElement.querySelector('.control')!.append(inputElement)
|
||||||
} else {
|
} else {
|
||||||
fieldElement.querySelector(
|
fieldElement.querySelector(
|
||||||
".control"
|
'.control'
|
||||||
)!.innerHTML = `<div class="select is-fullwidth">
|
)!.innerHTML = `<div class="select is-fullwidth">
|
||||||
<select id="${fieldId}" name="${fieldName}"><option value="">(Not Set)</option></select>
|
<select id="${fieldId}" name="${fieldName}"><option value="">(Not Set)</option></select>
|
||||||
</div>`;
|
</div>`
|
||||||
|
|
||||||
const selectElement = fieldElement.querySelector("select") 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) {
|
for (const optionValue of optionValues) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option')
|
||||||
optionElement.value = optionValue;
|
optionElement.value = optionValue
|
||||||
optionElement.textContent = optionValue;
|
optionElement.textContent = optionValue
|
||||||
selectElement.append(optionElement);
|
selectElement.append(optionElement)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lotFieldsContainerElement.append(fieldElement);
|
lotFieldsContainerElement.append(fieldElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
lotFieldsContainerElement.insertAdjacentHTML(
|
lotFieldsContainerElement.insertAdjacentHTML(
|
||||||
"beforeend",
|
'beforeend',
|
||||||
`<input name="lotTypeFieldIds" type="hidden"
|
`<input name="lotTypeFieldIds" type="hidden"
|
||||||
value="${lotTypeFieldIds.slice(1)}" />`
|
value="${lotTypeFieldIds.slice(1)}" />`
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
});
|
})
|
||||||
} else {
|
} else {
|
||||||
const originalLotTypeId = lotTypeIdElement.value;
|
const originalLotTypeId = lotTypeIdElement.value
|
||||||
|
|
||||||
lotTypeIdElement.addEventListener("change", () => {
|
lotTypeIdElement.addEventListener('change', () => {
|
||||||
if (lotTypeIdElement.value !== originalLotTypeId) {
|
if (lotTypeIdElement.value !== originalLotTypeId) {
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Confirm Change",
|
title: 'Confirm Change',
|
||||||
message: `Are you sure you want to change the ${los.escapedAliases.lot} type?\n
|
message: `Are you sure you want to change the ${los.escapedAliases.lot} type?\n
|
||||||
This change affects the additional fields associated with this record.`,
|
This change affects the additional fields associated with this record.`,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Keep the Change",
|
text: 'Yes, Keep the Change',
|
||||||
callbackFunction: () => {
|
callbackFunction: () => {
|
||||||
refreshAfterSave = true;
|
refreshAfterSave = true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
cancelButton: {
|
cancelButton: {
|
||||||
text: "Revert the Change",
|
text: 'Revert the Change',
|
||||||
callbackFunction: () => {
|
callbackFunction: () => {
|
||||||
lotTypeIdElement.value = originalLotTypeId;
|
lotTypeIdElement.value = originalLotTypeId
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Comments
|
// Comments
|
||||||
|
|
||||||
let lotComments: recordTypes.LotComment[] = exports.lotComments;
|
let lotComments: recordTypes.LotComment[] = exports.lotComments
|
||||||
delete exports.lotComments;
|
delete exports.lotComments
|
||||||
|
|
||||||
function openEditLotComment(clickEvent: Event) {
|
function openEditLotComment(clickEvent: Event) {
|
||||||
const lotCommentId = Number.parseInt(
|
const lotCommentId = Number.parseInt(
|
||||||
(clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.lotCommentId!,
|
(clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset
|
||||||
|
.lotCommentId!,
|
||||||
10
|
10
|
||||||
);
|
)
|
||||||
|
|
||||||
const lotComment = lotComments.find((currentLotComment) => {
|
const lotComment = lotComments.find((currentLotComment) => {
|
||||||
return currentLotComment.lotCommentId === lotCommentId;
|
return currentLotComment.lotCommentId === lotCommentId
|
||||||
})!;
|
})!
|
||||||
|
|
||||||
let editFormElement: HTMLFormElement;
|
let editFormElement: HTMLFormElement
|
||||||
let editCloseModalFunction: () => void;
|
let editCloseModalFunction: () => void
|
||||||
|
|
||||||
const editComment = (submitEvent: SubmitEvent) => {
|
const editComment = (submitEvent: SubmitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault()
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/lots/doUpdateLotComment",
|
los.urlPrefix + '/lots/doUpdateLotComment',
|
||||||
editFormElement,
|
editFormElement,
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
lotComments?: recordTypes.LotComment[];
|
lotComments?: recordTypes.LotComment[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotComments = responseJSON.lotComments!;
|
lotComments = responseJSON.lotComments!
|
||||||
editCloseModalFunction();
|
editCloseModalFunction()
|
||||||
renderLotComments();
|
renderLotComments()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating Comment",
|
title: 'Error Updating Comment',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
cityssm.openHtmlModal("lot-editComment", {
|
cityssm.openHtmlModal('lot-editComment', {
|
||||||
onshow: (modalElement) => {
|
onshow: (modalElement) => {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement)
|
||||||
|
|
||||||
(modalElement.querySelector("#lotCommentEdit--lotId") 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(
|
const lotCommentDateStringElement = modalElement.querySelector(
|
||||||
"#lotCommentEdit--lotCommentDateString"
|
'#lotCommentEdit--lotCommentDateString'
|
||||||
) as HTMLInputElement;
|
) as HTMLInputElement
|
||||||
|
|
||||||
lotCommentDateStringElement.value = lotComment.lotCommentDateString!;
|
lotCommentDateStringElement.value = lotComment.lotCommentDateString!
|
||||||
|
|
||||||
const currentDateString = cityssm.dateToString(new Date());
|
const currentDateString = cityssm.dateToString(new Date())
|
||||||
|
|
||||||
lotCommentDateStringElement.max =
|
lotCommentDateStringElement.max =
|
||||||
lotComment.lotCommentDateString! <= currentDateString
|
lotComment.lotCommentDateString! <= currentDateString
|
||||||
? currentDateString
|
? currentDateString
|
||||||
: lotComment.lotCommentDateString!;
|
: lotComment.lotCommentDateString!
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector("#lotCommentEdit--lotCommentTimeString") as HTMLInputElement
|
modalElement.querySelector(
|
||||||
).value = lotComment.lotCommentTimeString!;
|
'#lotCommentEdit--lotCommentTimeString'
|
||||||
|
) as HTMLInputElement
|
||||||
|
).value = lotComment.lotCommentTimeString!
|
||||||
},
|
},
|
||||||
onshown: (modalElement, closeModalFunction) => {
|
onshown: (modalElement, closeModalFunction) => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
|
|
||||||
los.initializeDatePickers(modalElement);
|
los.initializeDatePickers(modalElement)
|
||||||
// los.initializeTimePickers(modalElement);
|
// los.initializeTimePickers(modalElement);
|
||||||
|
|
||||||
(modalElement.querySelector("#lotCommentEdit--lotComment") as HTMLTextAreaElement).focus();
|
;(
|
||||||
|
modalElement.querySelector(
|
||||||
|
'#lotCommentEdit--lotComment'
|
||||||
|
) as HTMLTextAreaElement
|
||||||
|
).focus()
|
||||||
|
|
||||||
editFormElement = modalElement.querySelector("form")!;
|
editFormElement = modalElement.querySelector('form')!
|
||||||
editFormElement.addEventListener("submit", editComment);
|
editFormElement.addEventListener('submit', editComment)
|
||||||
|
|
||||||
editCloseModalFunction = closeModalFunction;
|
editCloseModalFunction = closeModalFunction
|
||||||
},
|
},
|
||||||
onremoved: () => {
|
onremoved: () => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function deleteLotComment(clickEvent: Event) {
|
function deleteLotComment(clickEvent: Event) {
|
||||||
const lotCommentId = Number.parseInt(
|
const lotCommentId = Number.parseInt(
|
||||||
(clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.lotCommentId!,
|
(clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset
|
||||||
|
.lotCommentId!,
|
||||||
10
|
10
|
||||||
);
|
)
|
||||||
|
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/lots/doDeleteLotComment",
|
los.urlPrefix + '/lots/doDeleteLotComment',
|
||||||
{
|
{
|
||||||
lotId,
|
lotId,
|
||||||
lotCommentId
|
lotCommentId
|
||||||
},
|
},
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
lotComments: recordTypes.LotComment[];
|
lotComments: recordTypes.LotComment[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotComments = responseJSON.lotComments;
|
lotComments = responseJSON.lotComments
|
||||||
renderLotComments();
|
renderLotComments()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Removing Comment",
|
title: 'Error Removing Comment',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Remove Comment?",
|
title: 'Remove Comment?',
|
||||||
message: "Are you sure you want to remove this comment?",
|
message: 'Are you sure you want to remove this comment?',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Remove Comment",
|
text: 'Yes, Remove Comment',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
},
|
},
|
||||||
contextualColorName: "warning"
|
contextualColorName: 'warning'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderLotComments() {
|
function renderLotComments() {
|
||||||
const containerElement = document.querySelector("#container--lotComments") as HTMLElement;
|
const containerElement = document.querySelector(
|
||||||
|
'#container--lotComments'
|
||||||
|
) as HTMLElement
|
||||||
|
|
||||||
if (lotComments.length === 0) {
|
if (lotComments.length === 0) {
|
||||||
containerElement.innerHTML = `<div class="message is-info">
|
containerElement.innerHTML = `<div class="message is-info">
|
||||||
<p class="message-body">There are no comments to display.</p>
|
<p class="message-body">There are no comments to display.</p>
|
||||||
</div>`;
|
</div>`
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const tableElement = document.createElement("table");
|
const tableElement = document.createElement('table')
|
||||||
tableElement.className = "table is-fullwidth is-striped is-hoverable";
|
tableElement.className = 'table is-fullwidth is-striped is-hoverable'
|
||||||
tableElement.innerHTML = `<thead><tr>
|
tableElement.innerHTML = `<thead><tr>
|
||||||
<th>Commentor</th>
|
<th>Commentor</th>
|
||||||
<th>Comment Date</th>
|
<th>Comment Date</th>
|
||||||
<th>Comment</th>
|
<th>Comment</th>
|
||||||
<th class="is-hidden-print"><span class="is-sr-only">Options</span></th>
|
<th class="is-hidden-print"><span class="is-sr-only">Options</span></th>
|
||||||
</tr></thead>
|
</tr></thead>
|
||||||
<tbody></tbody>`;
|
<tbody></tbody>`
|
||||||
|
|
||||||
for (const lotComment of lotComments) {
|
for (const lotComment of lotComments) {
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement('tr')
|
||||||
tableRowElement.dataset.lotCommentId = lotComment.lotCommentId!.toString();
|
tableRowElement.dataset.lotCommentId = lotComment.lotCommentId!.toString()
|
||||||
|
|
||||||
tableRowElement.innerHTML =
|
tableRowElement.innerHTML =
|
||||||
"<td>" +
|
'<td>' +
|
||||||
cityssm.escapeHTML(lotComment.recordCreate_userName || "") +
|
cityssm.escapeHTML(lotComment.recordCreate_userName || '') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
"<td>" +
|
'<td>' +
|
||||||
lotComment.lotCommentDateString +
|
lotComment.lotCommentDateString +
|
||||||
(lotComment.lotCommentTime === 0 ? "" : " " + lotComment.lotCommentTimeString) +
|
(lotComment.lotCommentTime === 0
|
||||||
"</td>" +
|
? ''
|
||||||
"<td>" +
|
: ' ' + lotComment.lotCommentTimeString) +
|
||||||
cityssm.escapeHTML(lotComment.lotComment || "") +
|
'</td>' +
|
||||||
"</td>" +
|
'<td>' +
|
||||||
|
cityssm.escapeHTML(lotComment.lotComment || '') +
|
||||||
|
'</td>' +
|
||||||
('<td class="is-hidden-print">' +
|
('<td class="is-hidden-print">' +
|
||||||
'<div class="buttons are-small is-justify-content-end">' +
|
'<div class="buttons are-small is-justify-content-end">' +
|
||||||
('<button class="button is-primary button--edit" type="button">' +
|
('<button class="button is-primary button--edit" type="button">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||||
" <span>Edit</span>" +
|
' <span>Edit</span>' +
|
||||||
"</button>") +
|
'</button>') +
|
||||||
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
|
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>") +
|
'</button>') +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</td>");
|
'</td>')
|
||||||
|
|
||||||
tableRowElement.querySelector(".button--edit")!.addEventListener("click", openEditLotComment);
|
tableRowElement
|
||||||
|
.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.innerHTML = ''
|
||||||
containerElement.append(tableElement);
|
containerElement.append(tableElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
function openAddCommentModal() {
|
function openAddCommentModal() {
|
||||||
let addCommentCloseModalFunction: () => void;
|
let addCommentCloseModalFunction: () => void
|
||||||
|
|
||||||
const doAddComment = (formEvent: SubmitEvent) => {
|
const doAddComment = (formEvent: SubmitEvent) => {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault()
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/lots/doAddLotComment",
|
los.urlPrefix + '/lots/doAddLotComment',
|
||||||
formEvent.currentTarget,
|
formEvent.currentTarget,
|
||||||
(responseJSON: { success: boolean; lotComments?: recordTypes.LotComment[] }) => {
|
(responseJSON: {
|
||||||
|
success: boolean
|
||||||
|
lotComments?: recordTypes.LotComment[]
|
||||||
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotComments = responseJSON.lotComments!;
|
lotComments = responseJSON.lotComments!
|
||||||
renderLotComments();
|
renderLotComments()
|
||||||
addCommentCloseModalFunction();
|
addCommentCloseModalFunction()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
cityssm.openHtmlModal("lot-addComment", {
|
cityssm.openHtmlModal('lot-addComment', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement)
|
||||||
(modalElement.querySelector("#lotCommentAdd--lotId") as HTMLInputElement).value = lotId;
|
;(
|
||||||
modalElement.querySelector("form")!.addEventListener("submit", doAddComment);
|
modalElement.querySelector(
|
||||||
|
'#lotCommentAdd--lotId'
|
||||||
|
) as HTMLInputElement
|
||||||
|
).value = lotId
|
||||||
|
modalElement
|
||||||
|
.querySelector('form')!
|
||||||
|
.addEventListener('submit', doAddComment)
|
||||||
},
|
},
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
addCommentCloseModalFunction = closeModalFunction;
|
addCommentCloseModalFunction = closeModalFunction
|
||||||
(modalElement.querySelector("#lotCommentAdd--lotComment") as HTMLTextAreaElement).focus();
|
;(
|
||||||
|
modalElement.querySelector(
|
||||||
|
'#lotCommentAdd--lotComment'
|
||||||
|
) as HTMLTextAreaElement
|
||||||
|
).focus()
|
||||||
},
|
},
|
||||||
onremoved() {
|
onremoved() {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
(document.querySelector("#lotComments--add") as HTMLButtonElement).focus();
|
;(
|
||||||
|
document.querySelector('#lotComments--add') as HTMLButtonElement
|
||||||
|
).focus()
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isCreate) {
|
if (!isCreate) {
|
||||||
document.querySelector("#lotComments--add")!.addEventListener("click", openAddCommentModal);
|
document
|
||||||
renderLotComments();
|
.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;
|
var _a, _b, _c;
|
||||||
const los = exports.los;
|
const los = exports.los;
|
||||||
const lotOccupancyId = document.querySelector("#lotOccupancy--lotOccupancyId")
|
const lotOccupancyId = document.querySelector('#lotOccupancy--lotOccupancyId').value;
|
||||||
.value;
|
const isCreate = lotOccupancyId === '';
|
||||||
const isCreate = lotOccupancyId === "";
|
|
||||||
/*
|
/*
|
||||||
* Main form
|
* Main form
|
||||||
*/
|
*/
|
||||||
let refreshAfterSave = isCreate;
|
let refreshAfterSave = isCreate;
|
||||||
const formElement = document.querySelector("#form--lotOccupancy");
|
const formElement = document.querySelector('#form--lotOccupancy');
|
||||||
formElement.addEventListener("submit", (formEvent) => {
|
formElement.addEventListener('submit', (formEvent) => {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/" + (isCreate ? "doCreateLotOccupancy" : "doUpdateLotOccupancy"), formElement, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix +
|
||||||
|
'/lotOccupancies/' +
|
||||||
|
(isCreate ? 'doCreateLotOccupancy' : 'doUpdateLotOccupancy'), formElement, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
los.clearUnsavedChanges();
|
los.clearUnsavedChanges();
|
||||||
if (isCreate || refreshAfterSave) {
|
if (isCreate || refreshAfterSave) {
|
||||||
|
|
@ -23,25 +24,25 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: `${los.escapedAliases.Occupancy} Updated Successfully`,
|
message: `${los.escapedAliases.Occupancy} Updated Successfully`,
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Saving " + exports.aliases.occupancy,
|
title: 'Error Saving ' + exports.aliases.occupancy,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
const formInputElements = formElement.querySelectorAll("input, select");
|
const formInputElements = formElement.querySelectorAll('input, select');
|
||||||
for (const formInputElement of formInputElements) {
|
for (const formInputElement of formInputElements) {
|
||||||
formInputElement.addEventListener("change", los.setUnsavedChanges);
|
formInputElement.addEventListener('change', los.setUnsavedChanges);
|
||||||
}
|
}
|
||||||
const doCopy = () => {
|
const doCopy = () => {
|
||||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doCopyLotOccupancy", {
|
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doCopyLotOccupancy', {
|
||||||
lotOccupancyId
|
lotOccupancyId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
|
|
@ -50,38 +51,40 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Copying Record",
|
title: 'Error Copying Record',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
(_a = document.querySelector("#button--copyLotOccupancy")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", (clickEvent) => {
|
(_a = document
|
||||||
|
.querySelector('#button--copyLotOccupancy')) === null || _a === void 0 ? void 0 : _a.addEventListener('click', (clickEvent) => {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault();
|
||||||
if (los.hasUnsavedChanges()) {
|
if (los.hasUnsavedChanges()) {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Unsaved Changes",
|
title: 'Unsaved Changes',
|
||||||
message: "Please save all unsaved changes before continuing.",
|
message: 'Please save all unsaved changes before continuing.',
|
||||||
contextualColorName: "warning"
|
contextualColorName: 'warning'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: `Copy ${los.escapedAliases.Occupancy} Record as New`,
|
title: `Copy ${los.escapedAliases.Occupancy} Record as New`,
|
||||||
message: "Are you sure you want to copy this record to a new record?",
|
message: 'Are you sure you want to copy this record to a new record?',
|
||||||
contextualColorName: "info",
|
contextualColorName: 'info',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Copy",
|
text: 'Yes, Copy',
|
||||||
callbackFunction: doCopy
|
callbackFunction: doCopy
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
(_b = document.querySelector("#button--deleteLotOccupancy")) === null || _b === void 0 ? void 0 : _b.addEventListener("click", (clickEvent) => {
|
(_b = document
|
||||||
|
.querySelector('#button--deleteLotOccupancy')) === null || _b === void 0 ? void 0 : _b.addEventListener('click', (clickEvent) => {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault();
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancy", {
|
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancy', {
|
||||||
lotOccupancyId
|
lotOccupancyId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
|
|
@ -90,65 +93,69 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Deleting Record",
|
title: 'Error Deleting Record',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete " + exports.aliases.occupancy + " Record",
|
title: 'Delete ' + exports.aliases.occupancy + ' Record',
|
||||||
message: "Are you sure you want to delete this record?",
|
message: 'Are you sure you want to delete this record?',
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete",
|
text: 'Yes, Delete',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
(_c = document.querySelector("#button--createWorkOrder")) === null || _c === void 0 ? void 0 : _c.addEventListener("click", (clickEvent) => {
|
(_c = document
|
||||||
|
.querySelector('#button--createWorkOrder')) === null || _c === void 0 ? void 0 : _c.addEventListener('click', (clickEvent) => {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault();
|
||||||
let createCloseModalFunction;
|
let createCloseModalFunction;
|
||||||
const doCreate = (formEvent) => {
|
const doCreate = (formEvent) => {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doCreateWorkOrder", formEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/workOrders/doCreateWorkOrder', formEvent.currentTarget, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
createCloseModalFunction();
|
createCloseModalFunction();
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Work Order Created Successfully",
|
title: 'Work Order Created Successfully',
|
||||||
message: "Would you like to open the work order now?",
|
message: 'Would you like to open the work order now?',
|
||||||
contextualColorName: "success",
|
contextualColorName: 'success',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Open the Work Order",
|
text: 'Yes, Open the Work Order',
|
||||||
callbackFunction: () => {
|
callbackFunction: () => {
|
||||||
window.location.href =
|
window.location.href =
|
||||||
los.urlPrefix + "/workOrders/" + responseJSON.workOrderId + "/edit";
|
los.urlPrefix +
|
||||||
|
'/workOrders/' +
|
||||||
|
responseJSON.workOrderId +
|
||||||
|
'/edit';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Creating Work Order",
|
title: 'Error Creating Work Order',
|
||||||
message: responseJSON.errorMessage,
|
message: responseJSON.errorMessage,
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
cityssm.openHtmlModal("lotOccupancy-createWorkOrder", {
|
cityssm.openHtmlModal('lotOccupancy-createWorkOrder', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
modalElement.querySelector("#workOrderCreate--lotOccupancyId").value =
|
;
|
||||||
lotOccupancyId;
|
modalElement.querySelector('#workOrderCreate--lotOccupancyId').value = lotOccupancyId;
|
||||||
modalElement.querySelector("#workOrderCreate--workOrderOpenDateString").value = cityssm.dateToString(new Date());
|
modalElement.querySelector('#workOrderCreate--workOrderOpenDateString').value = cityssm.dateToString(new Date());
|
||||||
const workOrderTypeSelectElement = modalElement.querySelector("#workOrderCreate--workOrderTypeId");
|
const workOrderTypeSelectElement = modalElement.querySelector('#workOrderCreate--workOrderTypeId');
|
||||||
const workOrderTypes = exports.workOrderTypes;
|
const workOrderTypes = exports.workOrderTypes;
|
||||||
if (workOrderTypes.length === 1) {
|
if (workOrderTypes.length === 1) {
|
||||||
workOrderTypeSelectElement.innerHTML = "";
|
workOrderTypeSelectElement.innerHTML = '';
|
||||||
}
|
}
|
||||||
for (const workOrderType of workOrderTypes) {
|
for (const workOrderType of workOrderTypes) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option');
|
||||||
optionElement.value = workOrderType.workOrderTypeId.toString();
|
optionElement.value = workOrderType.workOrderTypeId.toString();
|
||||||
optionElement.textContent = workOrderType.workOrderType;
|
optionElement.textContent = workOrderType.workOrderType;
|
||||||
workOrderTypeSelectElement.append(optionElement);
|
workOrderTypeSelectElement.append(optionElement);
|
||||||
|
|
@ -157,22 +164,23 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
var _a;
|
var _a;
|
||||||
createCloseModalFunction = closeModalFunction;
|
createCloseModalFunction = closeModalFunction;
|
||||||
(_a = modalElement.querySelector("form")) === null || _a === void 0 ? void 0 : _a.addEventListener("submit", doCreate);
|
(_a = modalElement
|
||||||
|
.querySelector('form')) === null || _a === void 0 ? void 0 : _a.addEventListener('submit', doCreate);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
// Occupancy Type
|
// Occupancy Type
|
||||||
const occupancyTypeIdElement = document.querySelector("#lotOccupancy--occupancyTypeId");
|
const occupancyTypeIdElement = document.querySelector('#lotOccupancy--occupancyTypeId');
|
||||||
if (isCreate) {
|
if (isCreate) {
|
||||||
const lotOccupancyFieldsContainerElement = document.querySelector("#container--lotOccupancyFields");
|
const lotOccupancyFieldsContainerElement = document.querySelector('#container--lotOccupancyFields');
|
||||||
occupancyTypeIdElement.addEventListener("change", () => {
|
occupancyTypeIdElement.addEventListener('change', () => {
|
||||||
if (occupancyTypeIdElement.value === "") {
|
if (occupancyTypeIdElement.value === '') {
|
||||||
lotOccupancyFieldsContainerElement.innerHTML = `<div class="message is-info">
|
lotOccupancyFieldsContainerElement.innerHTML = `<div class="message is-info">
|
||||||
<p class="message-body">Select the ${los.escapedAliases.occupancy} type to load the available fields.</p>
|
<p class="message-body">Select the ${los.escapedAliases.occupancy} type to load the available fields.</p>
|
||||||
</div>`;
|
</div>`;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doGetOccupancyTypeFields", {
|
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doGetOccupancyTypeFields', {
|
||||||
occupancyTypeId: occupancyTypeIdElement.value
|
occupancyTypeId: occupancyTypeIdElement.value
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.occupancyTypeFields.length === 0) {
|
if (responseJSON.occupancyTypeFields.length === 0) {
|
||||||
|
|
@ -181,45 +189,51 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
</div>`;
|
</div>`;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
lotOccupancyFieldsContainerElement.innerHTML = "";
|
lotOccupancyFieldsContainerElement.innerHTML = '';
|
||||||
let occupancyTypeFieldIds = "";
|
let occupancyTypeFieldIds = '';
|
||||||
for (const occupancyTypeField of responseJSON.occupancyTypeFields) {
|
for (const occupancyTypeField of responseJSON.occupancyTypeFields) {
|
||||||
occupancyTypeFieldIds += "," + occupancyTypeField.occupancyTypeFieldId;
|
occupancyTypeFieldIds +=
|
||||||
const fieldName = "lotOccupancyFieldValue_" + occupancyTypeField.occupancyTypeFieldId;
|
',' + occupancyTypeField.occupancyTypeFieldId;
|
||||||
const fieldId = "lotOccupancy--" + fieldName;
|
const fieldName = 'lotOccupancyFieldValue_' +
|
||||||
const fieldElement = document.createElement("div");
|
occupancyTypeField.occupancyTypeFieldId;
|
||||||
fieldElement.className = "field";
|
const fieldId = 'lotOccupancy--' + fieldName;
|
||||||
|
const fieldElement = document.createElement('div');
|
||||||
|
fieldElement.className = 'field';
|
||||||
fieldElement.innerHTML = `<label class="label" for="${fieldId}"></label><div class="control"></div>`;
|
fieldElement.innerHTML = `<label class="label" for="${fieldId}"></label><div class="control"></div>`;
|
||||||
fieldElement.querySelector("label").textContent =
|
fieldElement.querySelector('label').textContent = occupancyTypeField.occupancyTypeField;
|
||||||
occupancyTypeField.occupancyTypeField;
|
if (occupancyTypeField.occupancyTypeFieldValues === '') {
|
||||||
if (occupancyTypeField.occupancyTypeFieldValues === "") {
|
const inputElement = document.createElement('input');
|
||||||
const inputElement = document.createElement("input");
|
inputElement.className = 'input';
|
||||||
inputElement.className = "input";
|
|
||||||
inputElement.id = fieldId;
|
inputElement.id = fieldId;
|
||||||
inputElement.name = fieldName;
|
inputElement.name = fieldName;
|
||||||
inputElement.type = "text";
|
inputElement.type = 'text';
|
||||||
inputElement.required = occupancyTypeField.isRequired;
|
inputElement.required = occupancyTypeField.isRequired;
|
||||||
inputElement.minLength = occupancyTypeField.minimumLength;
|
inputElement.minLength =
|
||||||
inputElement.maxLength = occupancyTypeField.maximumLength;
|
occupancyTypeField.minimumLength;
|
||||||
if (occupancyTypeField.pattern && occupancyTypeField.pattern !== "") {
|
inputElement.maxLength =
|
||||||
|
occupancyTypeField.maximumLength;
|
||||||
|
if (occupancyTypeField.pattern &&
|
||||||
|
occupancyTypeField.pattern !== '') {
|
||||||
inputElement.pattern = occupancyTypeField.pattern;
|
inputElement.pattern = occupancyTypeField.pattern;
|
||||||
}
|
}
|
||||||
fieldElement.querySelector(".control").append(inputElement);
|
;
|
||||||
|
fieldElement.querySelector('.control').append(inputElement);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
fieldElement.querySelector(".control").innerHTML =
|
;
|
||||||
|
fieldElement.querySelector('.control').innerHTML =
|
||||||
'<div class="select is-fullwidth"><select id="' +
|
'<div class="select is-fullwidth"><select id="' +
|
||||||
fieldId +
|
fieldId +
|
||||||
'" name="' +
|
'" name="' +
|
||||||
fieldName +
|
fieldName +
|
||||||
'">' +
|
'">' +
|
||||||
'<option value="">(Not Set)</option>' +
|
'<option value="">(Not Set)</option>' +
|
||||||
"</select></div>";
|
'</select></div>';
|
||||||
const selectElement = fieldElement.querySelector("select");
|
const selectElement = fieldElement.querySelector('select');
|
||||||
selectElement.required = occupancyTypeField.isRequired;
|
selectElement.required = occupancyTypeField.isRequired;
|
||||||
const optionValues = occupancyTypeField.occupancyTypeFieldValues.split("\n");
|
const optionValues = occupancyTypeField.occupancyTypeFieldValues.split('\n');
|
||||||
for (const optionValue of optionValues) {
|
for (const optionValue of optionValues) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option');
|
||||||
optionElement.value = optionValue;
|
optionElement.value = optionValue;
|
||||||
optionElement.textContent = optionValue;
|
optionElement.textContent = optionValue;
|
||||||
selectElement.append(optionElement);
|
selectElement.append(optionElement);
|
||||||
|
|
@ -227,27 +241,27 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
lotOccupancyFieldsContainerElement.append(fieldElement);
|
lotOccupancyFieldsContainerElement.append(fieldElement);
|
||||||
}
|
}
|
||||||
lotOccupancyFieldsContainerElement.insertAdjacentHTML("beforeend", `<input name="occupancyTypeFieldIds" type="hidden" value="${occupancyTypeFieldIds.slice(1)}" />`);
|
lotOccupancyFieldsContainerElement.insertAdjacentHTML('beforeend', `<input name="occupancyTypeFieldIds" type="hidden" value="${occupancyTypeFieldIds.slice(1)}" />`);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const originalOccupancyTypeId = occupancyTypeIdElement.value;
|
const originalOccupancyTypeId = occupancyTypeIdElement.value;
|
||||||
occupancyTypeIdElement.addEventListener("change", () => {
|
occupancyTypeIdElement.addEventListener('change', () => {
|
||||||
if (occupancyTypeIdElement.value !== originalOccupancyTypeId) {
|
if (occupancyTypeIdElement.value !== originalOccupancyTypeId) {
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Confirm Change",
|
title: 'Confirm Change',
|
||||||
message: `Are you sure you want to change the ${los.escapedAliases.occupancy} type?\n
|
message: `Are you sure you want to change the ${los.escapedAliases.occupancy} type?\n
|
||||||
This change affects the additional fields associated with this record, and may also affect the available fees.`,
|
This change affects the additional fields associated with this record, and may also affect the available fees.`,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Keep the Change",
|
text: 'Yes, Keep the Change',
|
||||||
callbackFunction: () => {
|
callbackFunction: () => {
|
||||||
refreshAfterSave = true;
|
refreshAfterSave = true;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
cancelButton: {
|
cancelButton: {
|
||||||
text: "Revert the Change",
|
text: 'Revert the Change',
|
||||||
callbackFunction: () => {
|
callbackFunction: () => {
|
||||||
occupancyTypeIdElement.value = originalOccupancyTypeId;
|
occupancyTypeIdElement.value = originalOccupancyTypeId;
|
||||||
}
|
}
|
||||||
|
|
@ -257,16 +271,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
// Lot Selector
|
// Lot Selector
|
||||||
const lotNameElement = document.querySelector("#lotOccupancy--lotName");
|
const lotNameElement = document.querySelector('#lotOccupancy--lotName');
|
||||||
lotNameElement.addEventListener("click", (clickEvent) => {
|
lotNameElement.addEventListener('click', (clickEvent) => {
|
||||||
const currentLotName = clickEvent.currentTarget.value;
|
const currentLotName = clickEvent.currentTarget.value;
|
||||||
let lotSelectCloseModalFunction;
|
let lotSelectCloseModalFunction;
|
||||||
let lotSelectModalElement;
|
let lotSelectModalElement;
|
||||||
let lotSelectFormElement;
|
let lotSelectFormElement;
|
||||||
let lotSelectResultsElement;
|
let lotSelectResultsElement;
|
||||||
const renderSelectedLotAndClose = (lotId, lotName) => {
|
const renderSelectedLotAndClose = (lotId, lotName) => {
|
||||||
document.querySelector("#lotOccupancy--lotId").value = lotId.toString();
|
;
|
||||||
document.querySelector("#lotOccupancy--lotName").value = lotName;
|
document.querySelector('#lotOccupancy--lotId').value = lotId.toString();
|
||||||
|
document.querySelector('#lotOccupancy--lotName').value = lotName;
|
||||||
los.setUnsavedChanges();
|
los.setUnsavedChanges();
|
||||||
lotSelectCloseModalFunction();
|
lotSelectCloseModalFunction();
|
||||||
};
|
};
|
||||||
|
|
@ -276,64 +291,64 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
renderSelectedLotAndClose(selectedLotElement.dataset.lotId, selectedLotElement.dataset.lotName);
|
renderSelectedLotAndClose(selectedLotElement.dataset.lotId, selectedLotElement.dataset.lotName);
|
||||||
};
|
};
|
||||||
const searchLots = () => {
|
const searchLots = () => {
|
||||||
lotSelectResultsElement.innerHTML = los.getLoadingParagraphHTML("Searching...");
|
lotSelectResultsElement.innerHTML =
|
||||||
cityssm.postJSON(los.urlPrefix + "/lots/doSearchLots", lotSelectFormElement, (responseJSON) => {
|
los.getLoadingParagraphHTML('Searching...');
|
||||||
|
cityssm.postJSON(los.urlPrefix + '/lots/doSearchLots', lotSelectFormElement, (responseJSON) => {
|
||||||
if (responseJSON.count === 0) {
|
if (responseJSON.count === 0) {
|
||||||
lotSelectResultsElement.innerHTML = `<div class="message is-info">
|
lotSelectResultsElement.innerHTML = `<div class="message is-info">
|
||||||
<p class="message-body">No results.</p>
|
<p class="message-body">No results.</p>
|
||||||
</div>`;
|
</div>`;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const panelElement = document.createElement("div");
|
const panelElement = document.createElement('div');
|
||||||
panelElement.className = "panel";
|
panelElement.className = 'panel';
|
||||||
for (const lot of responseJSON.lots) {
|
for (const lot of responseJSON.lots) {
|
||||||
const panelBlockElement = document.createElement("a");
|
const panelBlockElement = document.createElement('a');
|
||||||
panelBlockElement.className = "panel-block is-block";
|
panelBlockElement.className = 'panel-block is-block';
|
||||||
panelBlockElement.href = "#";
|
panelBlockElement.href = '#';
|
||||||
panelBlockElement.dataset.lotId = lot.lotId.toString();
|
panelBlockElement.dataset.lotId = lot.lotId.toString();
|
||||||
panelBlockElement.dataset.lotName = lot.lotName;
|
panelBlockElement.dataset.lotName = lot.lotName;
|
||||||
panelBlockElement.innerHTML =
|
panelBlockElement.innerHTML =
|
||||||
'<div class="columns">' +
|
'<div class="columns">' +
|
||||||
('<div class="column">' +
|
('<div class="column">' +
|
||||||
cityssm.escapeHTML(lot.lotName || "") +
|
cityssm.escapeHTML(lot.lotName || '') +
|
||||||
"<br />" +
|
'<br />' +
|
||||||
'<span class="is-size-7">' +
|
'<span class="is-size-7">' +
|
||||||
cityssm.escapeHTML(lot.mapName || "") +
|
cityssm.escapeHTML(lot.mapName || '') +
|
||||||
"</span>" +
|
'</span>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="column">' +
|
('<div class="column">' +
|
||||||
cityssm.escapeHTML(lot.lotStatus) +
|
cityssm.escapeHTML(lot.lotStatus) +
|
||||||
"<br />" +
|
'<br />' +
|
||||||
'<span class="is-size-7">' +
|
'<span class="is-size-7">' +
|
||||||
(lot.lotOccupancyCount > 0 ? "Currently Occupied" : "") +
|
(lot.lotOccupancyCount > 0 ? 'Currently Occupied' : '') +
|
||||||
"</span>" +
|
'</span>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>";
|
'</div>';
|
||||||
panelBlockElement.addEventListener("click", selectExistingLot);
|
panelBlockElement.addEventListener('click', selectExistingLot);
|
||||||
panelElement.append(panelBlockElement);
|
panelElement.append(panelBlockElement);
|
||||||
}
|
}
|
||||||
lotSelectResultsElement.innerHTML = "";
|
lotSelectResultsElement.innerHTML = '';
|
||||||
lotSelectResultsElement.append(panelElement);
|
lotSelectResultsElement.append(panelElement);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const createLotAndSelect = (submitEvent) => {
|
const createLotAndSelect = (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
const lotName = lotSelectModalElement.querySelector("#lotCreate--lotName")
|
const lotName = lotSelectModalElement.querySelector('#lotCreate--lotName').value;
|
||||||
.value;
|
cityssm.postJSON(los.urlPrefix + '/lots/doCreateLot', submitEvent.currentTarget, (responseJSON) => {
|
||||||
cityssm.postJSON(los.urlPrefix + "/lots/doCreateLot", submitEvent.currentTarget, (responseJSON) => {
|
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
renderSelectedLotAndClose(responseJSON.lotId, lotName);
|
renderSelectedLotAndClose(responseJSON.lotId, lotName);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: `Error Creating ${los.escapedAliases.Lot}`,
|
title: `Error Creating ${los.escapedAliases.Lot}`,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
cityssm.openHtmlModal("lotOccupancy-selectLot", {
|
cityssm.openHtmlModal('lotOccupancy-selectLot', {
|
||||||
onshow: (modalElement) => {
|
onshow: (modalElement) => {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement);
|
||||||
},
|
},
|
||||||
|
|
@ -343,87 +358,94 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
lotSelectCloseModalFunction = closeModalFunction;
|
lotSelectCloseModalFunction = closeModalFunction;
|
||||||
bulmaJS.init(modalElement);
|
bulmaJS.init(modalElement);
|
||||||
// search Tab
|
// search Tab
|
||||||
const lotNameFilterElement = modalElement.querySelector("#lotSelect--lotName");
|
const lotNameFilterElement = modalElement.querySelector('#lotSelect--lotName');
|
||||||
if (document.querySelector("#lotOccupancy--lotId").value !== "") {
|
if (document.querySelector('#lotOccupancy--lotId')
|
||||||
|
.value !== '') {
|
||||||
lotNameFilterElement.value = currentLotName;
|
lotNameFilterElement.value = currentLotName;
|
||||||
}
|
}
|
||||||
lotNameFilterElement.focus();
|
lotNameFilterElement.focus();
|
||||||
lotNameFilterElement.addEventListener("change", searchLots);
|
lotNameFilterElement.addEventListener('change', searchLots);
|
||||||
const occupancyStatusFilterElement = modalElement.querySelector("#lotSelect--occupancyStatus");
|
const occupancyStatusFilterElement = modalElement.querySelector('#lotSelect--occupancyStatus');
|
||||||
occupancyStatusFilterElement.addEventListener("change", searchLots);
|
occupancyStatusFilterElement.addEventListener('change', searchLots);
|
||||||
if (currentLotName !== "") {
|
if (currentLotName !== '') {
|
||||||
occupancyStatusFilterElement.value = "";
|
occupancyStatusFilterElement.value = '';
|
||||||
}
|
}
|
||||||
lotSelectFormElement = modalElement.querySelector("#form--lotSelect");
|
lotSelectFormElement = modalElement.querySelector('#form--lotSelect');
|
||||||
lotSelectResultsElement = modalElement.querySelector("#resultsContainer--lotSelect");
|
lotSelectResultsElement = modalElement.querySelector('#resultsContainer--lotSelect');
|
||||||
lotSelectFormElement.addEventListener("submit", (submitEvent) => {
|
lotSelectFormElement.addEventListener('submit', (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
});
|
});
|
||||||
searchLots();
|
searchLots();
|
||||||
// Create Tab
|
// Create Tab
|
||||||
if (exports.lotNamePattern) {
|
if (exports.lotNamePattern) {
|
||||||
const regex = exports.lotNamePattern;
|
const regex = exports.lotNamePattern;
|
||||||
modalElement.querySelector("#lotCreate--lotName").pattern =
|
modalElement.querySelector('#lotCreate--lotName').pattern = regex.source;
|
||||||
regex.source;
|
|
||||||
}
|
}
|
||||||
const lotTypeElement = modalElement.querySelector("#lotCreate--lotTypeId");
|
const lotTypeElement = modalElement.querySelector('#lotCreate--lotTypeId');
|
||||||
for (const lotType of exports.lotTypes) {
|
for (const lotType of exports.lotTypes) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option');
|
||||||
optionElement.value = lotType.lotTypeId.toString();
|
optionElement.value = lotType.lotTypeId.toString();
|
||||||
optionElement.textContent = lotType.lotType;
|
optionElement.textContent = lotType.lotType;
|
||||||
lotTypeElement.append(optionElement);
|
lotTypeElement.append(optionElement);
|
||||||
}
|
}
|
||||||
const lotStatusElement = modalElement.querySelector("#lotCreate--lotStatusId");
|
const lotStatusElement = modalElement.querySelector('#lotCreate--lotStatusId');
|
||||||
for (const lotStatus of exports.lotStatuses) {
|
for (const lotStatus of exports.lotStatuses) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option');
|
||||||
optionElement.value = lotStatus.lotStatusId.toString();
|
optionElement.value = lotStatus.lotStatusId.toString();
|
||||||
optionElement.textContent = lotStatus.lotStatus;
|
optionElement.textContent = lotStatus.lotStatus;
|
||||||
lotStatusElement.append(optionElement);
|
lotStatusElement.append(optionElement);
|
||||||
}
|
}
|
||||||
const mapElement = modalElement.querySelector("#lotCreate--mapId");
|
const mapElement = modalElement.querySelector('#lotCreate--mapId');
|
||||||
for (const map of exports.maps) {
|
for (const map of exports.maps) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option');
|
||||||
optionElement.value = map.mapId.toString();
|
optionElement.value = map.mapId.toString();
|
||||||
optionElement.textContent = map.mapName || "(No Name)";
|
optionElement.textContent = map.mapName || '(No Name)';
|
||||||
mapElement.append(optionElement);
|
mapElement.append(optionElement);
|
||||||
}
|
}
|
||||||
modalElement.querySelector("#form--lotCreate").addEventListener("submit", createLotAndSelect);
|
;
|
||||||
|
modalElement.querySelector('#form--lotCreate').addEventListener('submit', createLotAndSelect);
|
||||||
},
|
},
|
||||||
onremoved: () => {
|
onremoved: () => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
document.querySelector(".is-lot-view-button").addEventListener("click", () => {
|
document
|
||||||
const lotId = document.querySelector("#lotOccupancy--lotId").value;
|
.querySelector('.is-lot-view-button')
|
||||||
|
.addEventListener('click', () => {
|
||||||
|
const lotId = document.querySelector('#lotOccupancy--lotId').value;
|
||||||
if (lotId) {
|
if (lotId) {
|
||||||
window.open(los.urlPrefix + "/lots/" + lotId);
|
window.open(los.urlPrefix + '/lots/' + lotId);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: `No ${los.escapedAliases.lot} selected.`,
|
message: `No ${los.escapedAliases.lot} selected.`,
|
||||||
contextualColorName: "info"
|
contextualColorName: 'info'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
document.querySelector(".is-clear-lot-button").addEventListener("click", () => {
|
document
|
||||||
|
.querySelector('.is-clear-lot-button')
|
||||||
|
.addEventListener('click', () => {
|
||||||
if (lotNameElement.disabled) {
|
if (lotNameElement.disabled) {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: "You need to unlock the field before clearing it.",
|
message: 'You need to unlock the field before clearing it.',
|
||||||
contextualColorName: "info"
|
contextualColorName: 'info'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
lotNameElement.value = `(No ${los.escapedAliases.Lot})`;
|
lotNameElement.value = `(No ${los.escapedAliases.Lot})`;
|
||||||
document.querySelector("#lotOccupancy--lotId").value = "";
|
document.querySelector('#lotOccupancy--lotId').value = '';
|
||||||
los.setUnsavedChanges();
|
los.setUnsavedChanges();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// Start Date
|
// Start Date
|
||||||
los.initializeDatePickers(formElement);
|
los.initializeDatePickers(formElement);
|
||||||
document.querySelector("#lotOccupancy--occupancyStartDateString").addEventListener("change", () => {
|
document
|
||||||
const endDatePicker = document.querySelector("#lotOccupancy--occupancyEndDateString").bulmaCalendar.datePicker;
|
.querySelector('#lotOccupancy--occupancyStartDateString')
|
||||||
endDatePicker.min = document.querySelector("#lotOccupancy--occupancyStartDateString").value;
|
.addEventListener('change', () => {
|
||||||
|
const endDatePicker = document.querySelector('#lotOccupancy--occupancyEndDateString').bulmaCalendar.datePicker;
|
||||||
|
endDatePicker.min = document.querySelector('#lotOccupancy--occupancyStartDateString').value;
|
||||||
endDatePicker.refresh();
|
endDatePicker.refresh();
|
||||||
});
|
});
|
||||||
los.initializeUnlockFieldButtons(formElement);
|
los.initializeUnlockFieldButtons(formElement);
|
||||||
|
|
|
||||||
|
|
@ -1,604 +1,698 @@
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||||
|
|
||||||
import type * as globalTypes from "../../types/globalTypes";
|
import type * as globalTypes from '../../types/globalTypes'
|
||||||
import type * as recordTypes from "../../types/recordTypes";
|
import type * as recordTypes from '../../types/recordTypes'
|
||||||
|
|
||||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||||
|
|
||||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal
|
||||||
declare const bulmaJS: BulmaJS;
|
declare const bulmaJS: BulmaJS
|
||||||
|
;(() => {
|
||||||
|
const los = exports.los as globalTypes.LOS
|
||||||
|
|
||||||
(() => {
|
const lotOccupancyId = (
|
||||||
const los = exports.los as globalTypes.LOS;
|
document.querySelector('#lotOccupancy--lotOccupancyId') as HTMLInputElement
|
||||||
|
).value
|
||||||
const lotOccupancyId = (document.querySelector("#lotOccupancy--lotOccupancyId") as HTMLInputElement)
|
const isCreate = lotOccupancyId === ''
|
||||||
.value;
|
|
||||||
const isCreate = lotOccupancyId === "";
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Main form
|
* Main form
|
||||||
*/
|
*/
|
||||||
|
|
||||||
let refreshAfterSave = isCreate;
|
let refreshAfterSave = isCreate
|
||||||
|
|
||||||
const formElement = document.querySelector("#form--lotOccupancy") as HTMLFormElement;
|
const formElement = document.querySelector(
|
||||||
|
'#form--lotOccupancy'
|
||||||
|
) as HTMLFormElement
|
||||||
|
|
||||||
formElement.addEventListener("submit", (formEvent) => {
|
formElement.addEventListener('submit', (formEvent) => {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault()
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/lotOccupancies/" + (isCreate ? "doCreateLotOccupancy" : "doUpdateLotOccupancy"),
|
los.urlPrefix +
|
||||||
|
'/lotOccupancies/' +
|
||||||
|
(isCreate ? 'doCreateLotOccupancy' : 'doUpdateLotOccupancy'),
|
||||||
formElement,
|
formElement,
|
||||||
(responseJSON: { success: boolean; lotOccupancyId?: number; errorMessage?: string }) => {
|
(responseJSON: {
|
||||||
|
success: boolean
|
||||||
|
lotOccupancyId?: number
|
||||||
|
errorMessage?: string
|
||||||
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
los.clearUnsavedChanges();
|
los.clearUnsavedChanges()
|
||||||
|
|
||||||
if (isCreate || refreshAfterSave) {
|
if (isCreate || refreshAfterSave) {
|
||||||
window.location.href = los.getLotOccupancyURL(
|
window.location.href = los.getLotOccupancyURL(
|
||||||
responseJSON.lotOccupancyId,
|
responseJSON.lotOccupancyId,
|
||||||
true,
|
true,
|
||||||
true
|
true
|
||||||
);
|
)
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: `${los.escapedAliases.Occupancy} Updated Successfully`,
|
message: `${los.escapedAliases.Occupancy} Updated Successfully`,
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Saving " + exports.aliases.occupancy,
|
title: 'Error Saving ' + exports.aliases.occupancy,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
});
|
})
|
||||||
|
|
||||||
const formInputElements = formElement.querySelectorAll("input, select");
|
const formInputElements = formElement.querySelectorAll('input, select')
|
||||||
|
|
||||||
for (const formInputElement of formInputElements) {
|
for (const formInputElement of formInputElements) {
|
||||||
formInputElement.addEventListener("change", los.setUnsavedChanges);
|
formInputElement.addEventListener('change', los.setUnsavedChanges)
|
||||||
}
|
}
|
||||||
|
|
||||||
const doCopy = () => {
|
const doCopy = () => {
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/lotOccupancies/doCopyLotOccupancy",
|
los.urlPrefix + '/lotOccupancies/doCopyLotOccupancy',
|
||||||
{
|
{
|
||||||
lotOccupancyId
|
lotOccupancyId
|
||||||
},
|
},
|
||||||
(responseJSON: { success: boolean; errorMessage?: string; lotOccupancyId?: number }) => {
|
(responseJSON: {
|
||||||
|
success: boolean
|
||||||
|
errorMessage?: string
|
||||||
|
lotOccupancyId?: number
|
||||||
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
cityssm.disableNavBlocker();
|
cityssm.disableNavBlocker()
|
||||||
window.location.href = los.getLotOccupancyURL(responseJSON.lotOccupancyId, true);
|
window.location.href = los.getLotOccupancyURL(
|
||||||
|
responseJSON.lotOccupancyId,
|
||||||
|
true
|
||||||
|
)
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Copying Record",
|
title: 'Error Copying Record',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
document.querySelector("#button--copyLotOccupancy")?.addEventListener("click", (clickEvent) => {
|
document
|
||||||
clickEvent.preventDefault();
|
.querySelector('#button--copyLotOccupancy')
|
||||||
|
?.addEventListener('click', (clickEvent) => {
|
||||||
|
clickEvent.preventDefault()
|
||||||
|
|
||||||
if (los.hasUnsavedChanges()) {
|
if (los.hasUnsavedChanges()) {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Unsaved Changes",
|
title: 'Unsaved Changes',
|
||||||
message: "Please save all unsaved changes before continuing.",
|
message: 'Please save all unsaved changes before continuing.',
|
||||||
contextualColorName: "warning"
|
contextualColorName: 'warning'
|
||||||
});
|
})
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: `Copy ${los.escapedAliases.Occupancy} Record as New`,
|
title: `Copy ${los.escapedAliases.Occupancy} Record as New`,
|
||||||
message: "Are you sure you want to copy this record to a new record?",
|
message: 'Are you sure you want to copy this record to a new record?',
|
||||||
contextualColorName: "info",
|
contextualColorName: 'info',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Copy",
|
text: 'Yes, Copy',
|
||||||
callbackFunction: doCopy
|
callbackFunction: doCopy
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
|
|
||||||
document.querySelector("#button--deleteLotOccupancy")?.addEventListener("click", (clickEvent) => {
|
document
|
||||||
clickEvent.preventDefault();
|
.querySelector('#button--deleteLotOccupancy')
|
||||||
|
?.addEventListener('click', (clickEvent) => {
|
||||||
|
clickEvent.preventDefault()
|
||||||
|
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancy",
|
los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancy',
|
||||||
{
|
{
|
||||||
lotOccupancyId
|
lotOccupancyId
|
||||||
},
|
},
|
||||||
(responseJSON: { success: boolean; errorMessage?: string }) => {
|
(responseJSON: { success: boolean; errorMessage?: string }) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
cityssm.disableNavBlocker();
|
cityssm.disableNavBlocker()
|
||||||
window.location.href = los.getLotOccupancyURL();
|
window.location.href = los.getLotOccupancyURL()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Deleting Record",
|
title: 'Error Deleting Record',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete " + exports.aliases.occupancy + " Record",
|
title: 'Delete ' + exports.aliases.occupancy + ' Record',
|
||||||
message: "Are you sure you want to delete this record?",
|
message: 'Are you sure you want to delete this record?',
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete",
|
text: 'Yes, Delete',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
|
|
||||||
document.querySelector("#button--createWorkOrder")?.addEventListener("click", (clickEvent) => {
|
document
|
||||||
clickEvent.preventDefault();
|
.querySelector('#button--createWorkOrder')
|
||||||
|
?.addEventListener('click', (clickEvent) => {
|
||||||
|
clickEvent.preventDefault()
|
||||||
|
|
||||||
let createCloseModalFunction: () => void;
|
let createCloseModalFunction: () => void
|
||||||
|
|
||||||
const doCreate = (formEvent: SubmitEvent) => {
|
const doCreate = (formEvent: SubmitEvent) => {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault()
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/workOrders/doCreateWorkOrder",
|
los.urlPrefix + '/workOrders/doCreateWorkOrder',
|
||||||
formEvent.currentTarget,
|
formEvent.currentTarget,
|
||||||
(responseJSON: { success: boolean; errorMessage?: string; workOrderId?: number }) => {
|
(responseJSON: {
|
||||||
|
success: boolean
|
||||||
|
errorMessage?: string
|
||||||
|
workOrderId?: number
|
||||||
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
createCloseModalFunction();
|
createCloseModalFunction()
|
||||||
|
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Work Order Created Successfully",
|
title: 'Work Order Created Successfully',
|
||||||
message: "Would you like to open the work order now?",
|
message: 'Would you like to open the work order now?',
|
||||||
contextualColorName: "success",
|
contextualColorName: 'success',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Open the Work Order",
|
text: 'Yes, Open the Work Order',
|
||||||
callbackFunction: () => {
|
callbackFunction: () => {
|
||||||
window.location.href =
|
window.location.href =
|
||||||
los.urlPrefix + "/workOrders/" + responseJSON.workOrderId + "/edit";
|
los.urlPrefix +
|
||||||
|
'/workOrders/' +
|
||||||
|
responseJSON.workOrderId +
|
||||||
|
'/edit'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Creating Work Order",
|
title: 'Error Creating Work Order',
|
||||||
message: responseJSON.errorMessage as string,
|
message: responseJSON.errorMessage as string,
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
cityssm.openHtmlModal("lotOccupancy-createWorkOrder", {
|
cityssm.openHtmlModal('lotOccupancy-createWorkOrder', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
(modalElement.querySelector("#workOrderCreate--lotOccupancyId") as HTMLInputElement).value =
|
;(
|
||||||
lotOccupancyId;
|
|
||||||
|
|
||||||
(
|
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#workOrderCreate--workOrderOpenDateString"
|
'#workOrderCreate--lotOccupancyId'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value = cityssm.dateToString(new Date());
|
).value = lotOccupancyId
|
||||||
|
;(
|
||||||
|
modalElement.querySelector(
|
||||||
|
'#workOrderCreate--workOrderOpenDateString'
|
||||||
|
) as HTMLInputElement
|
||||||
|
).value = cityssm.dateToString(new Date())
|
||||||
|
|
||||||
const workOrderTypeSelectElement = modalElement.querySelector(
|
const workOrderTypeSelectElement = modalElement.querySelector(
|
||||||
"#workOrderCreate--workOrderTypeId"
|
'#workOrderCreate--workOrderTypeId'
|
||||||
) as HTMLSelectElement;
|
) as HTMLSelectElement
|
||||||
|
|
||||||
const workOrderTypes = exports.workOrderTypes as recordTypes.WorkOrderType[];
|
const workOrderTypes =
|
||||||
|
exports.workOrderTypes as recordTypes.WorkOrderType[]
|
||||||
|
|
||||||
if (workOrderTypes.length === 1) {
|
if (workOrderTypes.length === 1) {
|
||||||
workOrderTypeSelectElement.innerHTML = "";
|
workOrderTypeSelectElement.innerHTML = ''
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const workOrderType of workOrderTypes) {
|
for (const workOrderType of workOrderTypes) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option')
|
||||||
optionElement.value = (workOrderType.workOrderTypeId as number).toString();
|
optionElement.value = (
|
||||||
optionElement.textContent = workOrderType.workOrderType as string;
|
workOrderType.workOrderTypeId as number
|
||||||
workOrderTypeSelectElement.append(optionElement);
|
).toString()
|
||||||
|
optionElement.textContent = workOrderType.workOrderType as string
|
||||||
|
workOrderTypeSelectElement.append(optionElement)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
createCloseModalFunction = closeModalFunction;
|
createCloseModalFunction = closeModalFunction
|
||||||
|
|
||||||
modalElement.querySelector("form")?.addEventListener("submit", doCreate);
|
modalElement
|
||||||
|
.querySelector('form')
|
||||||
|
?.addEventListener('submit', doCreate)
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
|
|
||||||
// Occupancy Type
|
// Occupancy Type
|
||||||
|
|
||||||
const occupancyTypeIdElement = document.querySelector(
|
const occupancyTypeIdElement = document.querySelector(
|
||||||
"#lotOccupancy--occupancyTypeId"
|
'#lotOccupancy--occupancyTypeId'
|
||||||
) as HTMLSelectElement;
|
) as HTMLSelectElement
|
||||||
|
|
||||||
if (isCreate) {
|
if (isCreate) {
|
||||||
const lotOccupancyFieldsContainerElement = document.querySelector(
|
const lotOccupancyFieldsContainerElement = document.querySelector(
|
||||||
"#container--lotOccupancyFields"
|
'#container--lotOccupancyFields'
|
||||||
) as HTMLElement;
|
) as HTMLElement
|
||||||
|
|
||||||
occupancyTypeIdElement.addEventListener("change", () => {
|
occupancyTypeIdElement.addEventListener('change', () => {
|
||||||
if (occupancyTypeIdElement.value === "") {
|
if (occupancyTypeIdElement.value === '') {
|
||||||
lotOccupancyFieldsContainerElement.innerHTML = `<div class="message is-info">
|
lotOccupancyFieldsContainerElement.innerHTML = `<div class="message is-info">
|
||||||
<p class="message-body">Select the ${los.escapedAliases.occupancy} type to load the available fields.</p>
|
<p class="message-body">Select the ${los.escapedAliases.occupancy} type to load the available fields.</p>
|
||||||
</div>`;
|
</div>`
|
||||||
|
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/lotOccupancies/doGetOccupancyTypeFields",
|
los.urlPrefix + '/lotOccupancies/doGetOccupancyTypeFields',
|
||||||
{
|
{
|
||||||
occupancyTypeId: occupancyTypeIdElement.value
|
occupancyTypeId: occupancyTypeIdElement.value
|
||||||
},
|
},
|
||||||
(responseJSON: { occupancyTypeFields: recordTypes.OccupancyTypeField[] }) => {
|
(responseJSON: {
|
||||||
|
occupancyTypeFields: recordTypes.OccupancyTypeField[]
|
||||||
|
}) => {
|
||||||
if (responseJSON.occupancyTypeFields.length === 0) {
|
if (responseJSON.occupancyTypeFields.length === 0) {
|
||||||
lotOccupancyFieldsContainerElement.innerHTML = `<div class="message is-info">
|
lotOccupancyFieldsContainerElement.innerHTML = `<div class="message is-info">
|
||||||
<p class="message-body">There are no additional fields for this ${los.escapedAliases.occupancy} type.</p>
|
<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) {
|
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");
|
const fieldElement = document.createElement('div')
|
||||||
fieldElement.className = "field";
|
fieldElement.className = 'field'
|
||||||
fieldElement.innerHTML = `<label class="label" for="${fieldId}"></label><div class="control"></div>`;
|
fieldElement.innerHTML = `<label class="label" for="${fieldId}"></label><div class="control"></div>`
|
||||||
|
;(
|
||||||
|
fieldElement.querySelector('label') as HTMLLabelElement
|
||||||
|
).textContent = occupancyTypeField.occupancyTypeField as string
|
||||||
|
|
||||||
(fieldElement.querySelector("label") as HTMLLabelElement).textContent =
|
if (occupancyTypeField.occupancyTypeFieldValues === '') {
|
||||||
occupancyTypeField.occupancyTypeField as string;
|
const inputElement = document.createElement('input')
|
||||||
|
|
||||||
if (occupancyTypeField.occupancyTypeFieldValues === "") {
|
inputElement.className = 'input'
|
||||||
const inputElement = document.createElement("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;
|
if (
|
||||||
inputElement.minLength = occupancyTypeField.minimumLength as number;
|
occupancyTypeField.pattern &&
|
||||||
inputElement.maxLength = occupancyTypeField.maximumLength as number;
|
occupancyTypeField.pattern !== ''
|
||||||
|
) {
|
||||||
if (occupancyTypeField.pattern && occupancyTypeField.pattern !== "") {
|
inputElement.pattern = occupancyTypeField.pattern
|
||||||
inputElement.pattern = occupancyTypeField.pattern;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
(fieldElement.querySelector(".control") as HTMLElement).append(inputElement);
|
;(fieldElement.querySelector('.control') as HTMLElement).append(
|
||||||
|
inputElement
|
||||||
|
)
|
||||||
} else {
|
} else {
|
||||||
(fieldElement.querySelector(".control") as HTMLElement).innerHTML =
|
;(
|
||||||
|
fieldElement.querySelector('.control') as HTMLElement
|
||||||
|
).innerHTML =
|
||||||
'<div class="select is-fullwidth"><select id="' +
|
'<div class="select is-fullwidth"><select id="' +
|
||||||
fieldId +
|
fieldId +
|
||||||
'" name="' +
|
'" name="' +
|
||||||
fieldName +
|
fieldName +
|
||||||
'">' +
|
'">' +
|
||||||
'<option value="">(Not Set)</option>' +
|
'<option value="">(Not Set)</option>' +
|
||||||
"</select></div>";
|
'</select></div>'
|
||||||
|
|
||||||
const selectElement = fieldElement.querySelector("select") as HTMLSelectElement;
|
const selectElement = fieldElement.querySelector(
|
||||||
|
'select'
|
||||||
|
) as HTMLSelectElement
|
||||||
|
|
||||||
selectElement.required = occupancyTypeField.isRequired as boolean;
|
selectElement.required = occupancyTypeField.isRequired as boolean
|
||||||
|
|
||||||
const optionValues = (
|
const optionValues = (
|
||||||
occupancyTypeField.occupancyTypeFieldValues as string
|
occupancyTypeField.occupancyTypeFieldValues as string
|
||||||
).split("\n");
|
).split('\n')
|
||||||
|
|
||||||
for (const optionValue of optionValues) {
|
for (const optionValue of optionValues) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option')
|
||||||
optionElement.value = optionValue;
|
optionElement.value = optionValue
|
||||||
optionElement.textContent = optionValue;
|
optionElement.textContent = optionValue
|
||||||
selectElement.append(optionElement);
|
selectElement.append(optionElement)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lotOccupancyFieldsContainerElement.append(fieldElement);
|
lotOccupancyFieldsContainerElement.append(fieldElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
lotOccupancyFieldsContainerElement.insertAdjacentHTML(
|
lotOccupancyFieldsContainerElement.insertAdjacentHTML(
|
||||||
"beforeend",
|
'beforeend',
|
||||||
`<input name="occupancyTypeFieldIds" type="hidden" value="${occupancyTypeFieldIds.slice(
|
`<input name="occupancyTypeFieldIds" type="hidden" value="${occupancyTypeFieldIds.slice(
|
||||||
1
|
1
|
||||||
)}" />`
|
)}" />`
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
});
|
})
|
||||||
} else {
|
} else {
|
||||||
const originalOccupancyTypeId = occupancyTypeIdElement.value;
|
const originalOccupancyTypeId = occupancyTypeIdElement.value
|
||||||
|
|
||||||
occupancyTypeIdElement.addEventListener("change", () => {
|
occupancyTypeIdElement.addEventListener('change', () => {
|
||||||
if (occupancyTypeIdElement.value !== originalOccupancyTypeId) {
|
if (occupancyTypeIdElement.value !== originalOccupancyTypeId) {
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Confirm Change",
|
title: 'Confirm Change',
|
||||||
message: `Are you sure you want to change the ${los.escapedAliases.occupancy} type?\n
|
message: `Are you sure you want to change the ${los.escapedAliases.occupancy} type?\n
|
||||||
This change affects the additional fields associated with this record, and may also affect the available fees.`,
|
This change affects the additional fields associated with this record, and may also affect the available fees.`,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Keep the Change",
|
text: 'Yes, Keep the Change',
|
||||||
callbackFunction: () => {
|
callbackFunction: () => {
|
||||||
refreshAfterSave = true;
|
refreshAfterSave = true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
cancelButton: {
|
cancelButton: {
|
||||||
text: "Revert the Change",
|
text: 'Revert the Change',
|
||||||
callbackFunction: () => {
|
callbackFunction: () => {
|
||||||
occupancyTypeIdElement.value = originalOccupancyTypeId;
|
occupancyTypeIdElement.value = originalOccupancyTypeId
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lot Selector
|
// Lot Selector
|
||||||
|
|
||||||
const lotNameElement = document.querySelector("#lotOccupancy--lotName") as HTMLInputElement;
|
const lotNameElement = document.querySelector(
|
||||||
|
'#lotOccupancy--lotName'
|
||||||
|
) as HTMLInputElement
|
||||||
|
|
||||||
lotNameElement.addEventListener("click", (clickEvent) => {
|
lotNameElement.addEventListener('click', (clickEvent) => {
|
||||||
const currentLotName = (clickEvent.currentTarget as HTMLInputElement).value;
|
const currentLotName = (clickEvent.currentTarget as HTMLInputElement).value
|
||||||
|
|
||||||
let lotSelectCloseModalFunction: () => void;
|
let lotSelectCloseModalFunction: () => void
|
||||||
let lotSelectModalElement: HTMLElement;
|
let lotSelectModalElement: HTMLElement
|
||||||
|
|
||||||
let lotSelectFormElement: HTMLFormElement;
|
let lotSelectFormElement: HTMLFormElement
|
||||||
let lotSelectResultsElement: HTMLElement;
|
let lotSelectResultsElement: HTMLElement
|
||||||
|
|
||||||
const renderSelectedLotAndClose = (lotId: number | string, lotName: string) => {
|
const renderSelectedLotAndClose = (
|
||||||
(document.querySelector("#lotOccupancy--lotId") as HTMLInputElement).value = lotId.toString();
|
lotId: number | string,
|
||||||
(document.querySelector("#lotOccupancy--lotName") as HTMLInputElement).value = lotName;
|
lotName: string
|
||||||
|
) => {
|
||||||
|
;(
|
||||||
|
document.querySelector('#lotOccupancy--lotId') as HTMLInputElement
|
||||||
|
).value = lotId.toString()
|
||||||
|
;(
|
||||||
|
document.querySelector('#lotOccupancy--lotName') as HTMLInputElement
|
||||||
|
).value = lotName
|
||||||
|
|
||||||
los.setUnsavedChanges();
|
los.setUnsavedChanges()
|
||||||
lotSelectCloseModalFunction();
|
lotSelectCloseModalFunction()
|
||||||
};
|
}
|
||||||
|
|
||||||
const selectExistingLot = (clickEvent: Event) => {
|
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 = () => {
|
const searchLots = () => {
|
||||||
lotSelectResultsElement.innerHTML = los.getLoadingParagraphHTML("Searching...");
|
lotSelectResultsElement.innerHTML =
|
||||||
|
los.getLoadingParagraphHTML('Searching...')
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/lots/doSearchLots",
|
los.urlPrefix + '/lots/doSearchLots',
|
||||||
lotSelectFormElement,
|
lotSelectFormElement,
|
||||||
(responseJSON: { count: number; lots: recordTypes.Lot[] }) => {
|
(responseJSON: { count: number; lots: recordTypes.Lot[] }) => {
|
||||||
if (responseJSON.count === 0) {
|
if (responseJSON.count === 0) {
|
||||||
lotSelectResultsElement.innerHTML = `<div class="message is-info">
|
lotSelectResultsElement.innerHTML = `<div class="message is-info">
|
||||||
<p class="message-body">No results.</p>
|
<p class="message-body">No results.</p>
|
||||||
</div>`;
|
</div>`
|
||||||
|
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const panelElement = document.createElement("div");
|
const panelElement = document.createElement('div')
|
||||||
panelElement.className = "panel";
|
panelElement.className = 'panel'
|
||||||
|
|
||||||
for (const lot of responseJSON.lots) {
|
for (const lot of responseJSON.lots) {
|
||||||
const panelBlockElement = document.createElement("a");
|
const panelBlockElement = document.createElement('a')
|
||||||
panelBlockElement.className = "panel-block is-block";
|
panelBlockElement.className = 'panel-block is-block'
|
||||||
panelBlockElement.href = "#";
|
panelBlockElement.href = '#'
|
||||||
|
|
||||||
panelBlockElement.dataset.lotId = lot.lotId.toString();
|
panelBlockElement.dataset.lotId = lot.lotId.toString()
|
||||||
panelBlockElement.dataset.lotName = lot.lotName;
|
panelBlockElement.dataset.lotName = lot.lotName
|
||||||
|
|
||||||
panelBlockElement.innerHTML =
|
panelBlockElement.innerHTML =
|
||||||
'<div class="columns">' +
|
'<div class="columns">' +
|
||||||
('<div class="column">' +
|
('<div class="column">' +
|
||||||
cityssm.escapeHTML(lot.lotName || "") +
|
cityssm.escapeHTML(lot.lotName || '') +
|
||||||
"<br />" +
|
'<br />' +
|
||||||
'<span class="is-size-7">' +
|
'<span class="is-size-7">' +
|
||||||
cityssm.escapeHTML(lot.mapName || "") +
|
cityssm.escapeHTML(lot.mapName || '') +
|
||||||
"</span>" +
|
'</span>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="column">' +
|
('<div class="column">' +
|
||||||
cityssm.escapeHTML(lot.lotStatus as string) +
|
cityssm.escapeHTML(lot.lotStatus as string) +
|
||||||
"<br />" +
|
'<br />' +
|
||||||
'<span class="is-size-7">' +
|
'<span class="is-size-7">' +
|
||||||
(lot.lotOccupancyCount! > 0 ? "Currently Occupied" : "") +
|
(lot.lotOccupancyCount! > 0 ? 'Currently Occupied' : '') +
|
||||||
"</span>" +
|
'</span>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>";
|
'</div>'
|
||||||
|
|
||||||
panelBlockElement.addEventListener("click", selectExistingLot);
|
panelBlockElement.addEventListener('click', selectExistingLot)
|
||||||
|
|
||||||
panelElement.append(panelBlockElement);
|
panelElement.append(panelBlockElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
lotSelectResultsElement.innerHTML = "";
|
lotSelectResultsElement.innerHTML = ''
|
||||||
lotSelectResultsElement.append(panelElement);
|
lotSelectResultsElement.append(panelElement)
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const createLotAndSelect = (submitEvent: SubmitEvent) => {
|
const createLotAndSelect = (submitEvent: SubmitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault()
|
||||||
|
|
||||||
const lotName = (lotSelectModalElement.querySelector("#lotCreate--lotName") as HTMLInputElement)
|
const lotName = (
|
||||||
.value;
|
lotSelectModalElement.querySelector(
|
||||||
|
'#lotCreate--lotName'
|
||||||
|
) as HTMLInputElement
|
||||||
|
).value
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/lots/doCreateLot",
|
los.urlPrefix + '/lots/doCreateLot',
|
||||||
submitEvent.currentTarget,
|
submitEvent.currentTarget,
|
||||||
(responseJSON: { success: boolean; errorMessage?: string; lotId?: number }) => {
|
(responseJSON: {
|
||||||
|
success: boolean
|
||||||
|
errorMessage?: string
|
||||||
|
lotId?: number
|
||||||
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
renderSelectedLotAndClose(responseJSON.lotId!, lotName);
|
renderSelectedLotAndClose(responseJSON.lotId!, lotName)
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: `Error Creating ${los.escapedAliases.Lot}`,
|
title: `Error Creating ${los.escapedAliases.Lot}`,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
cityssm.openHtmlModal("lotOccupancy-selectLot", {
|
cityssm.openHtmlModal('lotOccupancy-selectLot', {
|
||||||
onshow: (modalElement) => {
|
onshow: (modalElement) => {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement)
|
||||||
},
|
},
|
||||||
onshown: (modalElement, closeModalFunction) => {
|
onshown: (modalElement, closeModalFunction) => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
|
|
||||||
lotSelectModalElement = modalElement;
|
lotSelectModalElement = modalElement
|
||||||
lotSelectCloseModalFunction = closeModalFunction;
|
lotSelectCloseModalFunction = closeModalFunction
|
||||||
|
|
||||||
bulmaJS.init(modalElement);
|
bulmaJS.init(modalElement)
|
||||||
|
|
||||||
// search Tab
|
// search Tab
|
||||||
|
|
||||||
const lotNameFilterElement = modalElement.querySelector(
|
const lotNameFilterElement = modalElement.querySelector(
|
||||||
"#lotSelect--lotName"
|
'#lotSelect--lotName'
|
||||||
) as HTMLInputElement;
|
) as HTMLInputElement
|
||||||
|
|
||||||
if ((document.querySelector("#lotOccupancy--lotId") as HTMLInputElement).value !== "") {
|
if (
|
||||||
lotNameFilterElement.value = currentLotName;
|
(document.querySelector('#lotOccupancy--lotId') as HTMLInputElement)
|
||||||
|
.value !== ''
|
||||||
|
) {
|
||||||
|
lotNameFilterElement.value = currentLotName
|
||||||
}
|
}
|
||||||
|
|
||||||
lotNameFilterElement.focus();
|
lotNameFilterElement.focus()
|
||||||
lotNameFilterElement.addEventListener("change", searchLots);
|
lotNameFilterElement.addEventListener('change', searchLots)
|
||||||
|
|
||||||
const occupancyStatusFilterElement = modalElement.querySelector(
|
const occupancyStatusFilterElement = modalElement.querySelector(
|
||||||
"#lotSelect--occupancyStatus"
|
'#lotSelect--occupancyStatus'
|
||||||
) as HTMLSelectElement;
|
) as HTMLSelectElement
|
||||||
occupancyStatusFilterElement.addEventListener("change", searchLots);
|
occupancyStatusFilterElement.addEventListener('change', searchLots)
|
||||||
|
|
||||||
if (currentLotName !== "") {
|
if (currentLotName !== '') {
|
||||||
occupancyStatusFilterElement.value = "";
|
occupancyStatusFilterElement.value = ''
|
||||||
}
|
}
|
||||||
|
|
||||||
lotSelectFormElement = modalElement.querySelector("#form--lotSelect") as HTMLFormElement;
|
lotSelectFormElement = modalElement.querySelector(
|
||||||
|
'#form--lotSelect'
|
||||||
|
) as HTMLFormElement
|
||||||
lotSelectResultsElement = modalElement.querySelector(
|
lotSelectResultsElement = modalElement.querySelector(
|
||||||
"#resultsContainer--lotSelect"
|
'#resultsContainer--lotSelect'
|
||||||
) as HTMLElement;
|
) as HTMLElement
|
||||||
|
|
||||||
lotSelectFormElement.addEventListener("submit", (submitEvent) => {
|
lotSelectFormElement.addEventListener('submit', (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault()
|
||||||
});
|
})
|
||||||
|
|
||||||
searchLots();
|
searchLots()
|
||||||
|
|
||||||
// Create Tab
|
// Create Tab
|
||||||
|
|
||||||
if (exports.lotNamePattern) {
|
if (exports.lotNamePattern) {
|
||||||
const regex = exports.lotNamePattern 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(
|
const lotTypeElement = modalElement.querySelector(
|
||||||
"#lotCreate--lotTypeId"
|
'#lotCreate--lotTypeId'
|
||||||
) as HTMLSelectElement;
|
) as HTMLSelectElement
|
||||||
|
|
||||||
for (const lotType of exports.lotTypes as recordTypes.LotType[]) {
|
for (const lotType of exports.lotTypes as recordTypes.LotType[]) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option')
|
||||||
optionElement.value = lotType.lotTypeId.toString();
|
optionElement.value = lotType.lotTypeId.toString()
|
||||||
optionElement.textContent = lotType.lotType;
|
optionElement.textContent = lotType.lotType
|
||||||
lotTypeElement.append(optionElement);
|
lotTypeElement.append(optionElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
const lotStatusElement = modalElement.querySelector(
|
const lotStatusElement = modalElement.querySelector(
|
||||||
"#lotCreate--lotStatusId"
|
'#lotCreate--lotStatusId'
|
||||||
) as HTMLSelectElement;
|
) as HTMLSelectElement
|
||||||
|
|
||||||
for (const lotStatus of exports.lotStatuses as recordTypes.LotStatus[]) {
|
for (const lotStatus of exports.lotStatuses as recordTypes.LotStatus[]) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option')
|
||||||
optionElement.value = lotStatus.lotStatusId.toString();
|
optionElement.value = lotStatus.lotStatusId.toString()
|
||||||
optionElement.textContent = lotStatus.lotStatus;
|
optionElement.textContent = lotStatus.lotStatus
|
||||||
lotStatusElement.append(optionElement);
|
lotStatusElement.append(optionElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
const mapElement = modalElement.querySelector("#lotCreate--mapId") as HTMLSelectElement;
|
const mapElement = modalElement.querySelector(
|
||||||
|
'#lotCreate--mapId'
|
||||||
|
) as HTMLSelectElement
|
||||||
|
|
||||||
for (const map of exports.maps as recordTypes.Map[]) {
|
for (const map of exports.maps as recordTypes.Map[]) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option')
|
||||||
optionElement.value = map.mapId!.toString();
|
optionElement.value = map.mapId!.toString()
|
||||||
optionElement.textContent = map.mapName || "(No Name)";
|
optionElement.textContent = map.mapName || '(No Name)'
|
||||||
mapElement.append(optionElement);
|
mapElement.append(optionElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
(modalElement.querySelector("#form--lotCreate") as HTMLFormElement).addEventListener(
|
;(
|
||||||
"submit",
|
modalElement.querySelector('#form--lotCreate') as HTMLFormElement
|
||||||
createLotAndSelect
|
).addEventListener('submit', createLotAndSelect)
|
||||||
);
|
|
||||||
},
|
},
|
||||||
onremoved: () => {
|
onremoved: () => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
|
|
||||||
document.querySelector(".is-lot-view-button")!.addEventListener("click", () => {
|
document
|
||||||
const lotId = (document.querySelector("#lotOccupancy--lotId") as HTMLInputElement).value;
|
.querySelector('.is-lot-view-button')!
|
||||||
|
.addEventListener('click', () => {
|
||||||
|
const lotId = (
|
||||||
|
document.querySelector('#lotOccupancy--lotId') as HTMLInputElement
|
||||||
|
).value
|
||||||
|
|
||||||
if (lotId) {
|
if (lotId) {
|
||||||
window.open(los.urlPrefix + "/lots/" + lotId);
|
window.open(los.urlPrefix + '/lots/' + lotId)
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: `No ${los.escapedAliases.lot} selected.`,
|
message: `No ${los.escapedAliases.lot} selected.`,
|
||||||
contextualColorName: "info"
|
contextualColorName: 'info'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
|
|
||||||
document.querySelector(".is-clear-lot-button")!.addEventListener("click", () => {
|
document
|
||||||
|
.querySelector('.is-clear-lot-button')!
|
||||||
|
.addEventListener('click', () => {
|
||||||
if (lotNameElement.disabled) {
|
if (lotNameElement.disabled) {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: "You need to unlock the field before clearing it.",
|
message: 'You need to unlock the field before clearing it.',
|
||||||
contextualColorName: "info"
|
contextualColorName: 'info'
|
||||||
});
|
})
|
||||||
} else {
|
} else {
|
||||||
lotNameElement.value = `(No ${los.escapedAliases.Lot})`;
|
lotNameElement.value = `(No ${los.escapedAliases.Lot})`
|
||||||
(document.querySelector("#lotOccupancy--lotId") as HTMLInputElement).value = "";
|
;(
|
||||||
los.setUnsavedChanges();
|
document.querySelector('#lotOccupancy--lotId') as HTMLInputElement
|
||||||
|
).value = ''
|
||||||
|
los.setUnsavedChanges()
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
|
|
||||||
// Start Date
|
// Start Date
|
||||||
|
|
||||||
los.initializeDatePickers(formElement);
|
los.initializeDatePickers(formElement)
|
||||||
|
|
||||||
document.querySelector("#lotOccupancy--occupancyStartDateString")!.addEventListener("change", () => {
|
document
|
||||||
|
.querySelector('#lotOccupancy--occupancyStartDateString')!
|
||||||
|
.addEventListener('change', () => {
|
||||||
const endDatePicker = (
|
const endDatePicker = (
|
||||||
document.querySelector("#lotOccupancy--occupancyEndDateString") as HTMLInputElement
|
document.querySelector(
|
||||||
).bulmaCalendar.datePicker;
|
'#lotOccupancy--occupancyEndDateString'
|
||||||
|
) as HTMLInputElement
|
||||||
|
).bulmaCalendar.datePicker
|
||||||
|
|
||||||
endDatePicker.min = (
|
endDatePicker.min = (
|
||||||
document.querySelector("#lotOccupancy--occupancyStartDateString") as HTMLInputElement
|
document.querySelector(
|
||||||
).value;
|
'#lotOccupancy--occupancyStartDateString'
|
||||||
|
) as HTMLInputElement
|
||||||
|
).value
|
||||||
|
|
||||||
endDatePicker.refresh();
|
endDatePicker.refresh()
|
||||||
});
|
})
|
||||||
|
|
||||||
los.initializeUnlockFieldButtons(formElement);
|
los.initializeUnlockFieldButtons(formElement)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Occupants
|
* Occupants
|
||||||
|
|
@ -610,4 +704,4 @@ declare const bulmaJS: BulmaJS;
|
||||||
//=include lotOccupancyEditComments.js
|
//=include lotOccupancyEditComments.js
|
||||||
//=include lotOccupancyEditFees.js
|
//=include lotOccupancyEditFees.js
|
||||||
}
|
}
|
||||||
})();
|
})()
|
||||||
|
|
|
||||||
|
|
@ -4,15 +4,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
let lotOccupancyComments = exports.lotOccupancyComments;
|
let lotOccupancyComments = exports.lotOccupancyComments;
|
||||||
delete exports.lotOccupancyComments;
|
delete exports.lotOccupancyComments;
|
||||||
const openEditLotOccupancyComment = (clickEvent) => {
|
const openEditLotOccupancyComment = (clickEvent) => {
|
||||||
const lotOccupancyCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.lotOccupancyCommentId, 10);
|
const lotOccupancyCommentId = Number.parseInt(clickEvent.currentTarget.closest('tr').dataset
|
||||||
|
.lotOccupancyCommentId, 10);
|
||||||
const lotOccupancyComment = lotOccupancyComments.find((currentLotOccupancyComment) => {
|
const lotOccupancyComment = lotOccupancyComments.find((currentLotOccupancyComment) => {
|
||||||
return currentLotOccupancyComment.lotOccupancyCommentId === lotOccupancyCommentId;
|
return (currentLotOccupancyComment.lotOccupancyCommentId ===
|
||||||
|
lotOccupancyCommentId);
|
||||||
});
|
});
|
||||||
let editFormElement;
|
let editFormElement;
|
||||||
let editCloseModalFunction;
|
let editCloseModalFunction;
|
||||||
const editComment = (submitEvent) => {
|
const editComment = (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doUpdateLotOccupancyComment", editFormElement, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doUpdateLotOccupancyComment', editFormElement, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotOccupancyComments = responseJSON.lotOccupancyComments;
|
lotOccupancyComments = responseJSON.lotOccupancyComments;
|
||||||
editCloseModalFunction();
|
editCloseModalFunction();
|
||||||
|
|
@ -20,20 +22,20 @@ const openEditLotOccupancyComment = (clickEvent) => {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating Comment",
|
title: 'Error Updating Comment',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
cityssm.openHtmlModal("lotOccupancy-editComment", {
|
cityssm.openHtmlModal('lotOccupancy-editComment', {
|
||||||
onshow: (modalElement) => {
|
onshow: (modalElement) => {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement);
|
||||||
modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyId").value = lotOccupancyId;
|
modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyId').value = lotOccupancyId;
|
||||||
modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentId").value = lotOccupancyCommentId.toString();
|
modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyCommentId').value = lotOccupancyCommentId.toString();
|
||||||
modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyComment").value = lotOccupancyComment.lotOccupancyComment;
|
modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyComment').value = lotOccupancyComment.lotOccupancyComment;
|
||||||
const lotOccupancyCommentDateStringElement = modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentDateString");
|
const lotOccupancyCommentDateStringElement = modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyCommentDateString');
|
||||||
lotOccupancyCommentDateStringElement.value =
|
lotOccupancyCommentDateStringElement.value =
|
||||||
lotOccupancyComment.lotOccupancyCommentDateString;
|
lotOccupancyComment.lotOccupancyCommentDateString;
|
||||||
const currentDateString = cityssm.dateToString(new Date());
|
const currentDateString = cityssm.dateToString(new Date());
|
||||||
|
|
@ -41,15 +43,14 @@ const openEditLotOccupancyComment = (clickEvent) => {
|
||||||
lotOccupancyComment.lotOccupancyCommentDateString <= currentDateString
|
lotOccupancyComment.lotOccupancyCommentDateString <= currentDateString
|
||||||
? currentDateString
|
? currentDateString
|
||||||
: lotOccupancyComment.lotOccupancyCommentDateString;
|
: lotOccupancyComment.lotOccupancyCommentDateString;
|
||||||
modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentTimeString").value = lotOccupancyComment.lotOccupancyCommentTimeString;
|
modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyCommentTimeString').value = lotOccupancyComment.lotOccupancyCommentTimeString;
|
||||||
},
|
},
|
||||||
onshown: (modalElement, closeModalFunction) => {
|
onshown: (modalElement, closeModalFunction) => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
los.initializeDatePickers(modalElement);
|
los.initializeDatePickers(modalElement);
|
||||||
// los.initializeTimePickers(modalElement);
|
modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyComment').focus();
|
||||||
modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyComment").focus();
|
editFormElement = modalElement.querySelector('form');
|
||||||
editFormElement = modalElement.querySelector("form");
|
editFormElement.addEventListener('submit', editComment);
|
||||||
editFormElement.addEventListener("submit", editComment);
|
|
||||||
editCloseModalFunction = closeModalFunction;
|
editCloseModalFunction = closeModalFunction;
|
||||||
},
|
},
|
||||||
onremoved: () => {
|
onremoved: () => {
|
||||||
|
|
@ -58,9 +59,10 @@ const openEditLotOccupancyComment = (clickEvent) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const deleteLotOccupancyComment = (clickEvent) => {
|
const deleteLotOccupancyComment = (clickEvent) => {
|
||||||
const lotOccupancyCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.lotOccupancyCommentId, 10);
|
const lotOccupancyCommentId = Number.parseInt(clickEvent.currentTarget.closest('tr').dataset
|
||||||
|
.lotOccupancyCommentId, 10);
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyComment", {
|
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyComment', {
|
||||||
lotOccupancyId,
|
lotOccupancyId,
|
||||||
lotOccupancyCommentId
|
lotOccupancyCommentId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
|
|
@ -70,87 +72,87 @@ const deleteLotOccupancyComment = (clickEvent) => {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Removing Comment",
|
title: 'Error Removing Comment',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Remove Comment?",
|
title: 'Remove Comment?',
|
||||||
message: "Are you sure you want to remove this comment?",
|
message: 'Are you sure you want to remove this comment?',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Remove Comment",
|
text: 'Yes, Remove Comment',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
},
|
},
|
||||||
contextualColorName: "warning"
|
contextualColorName: 'warning'
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const renderLotOccupancyComments = () => {
|
const renderLotOccupancyComments = () => {
|
||||||
const containerElement = document.querySelector("#container--lotOccupancyComments");
|
const containerElement = document.querySelector('#container--lotOccupancyComments');
|
||||||
if (lotOccupancyComments.length === 0) {
|
if (lotOccupancyComments.length === 0) {
|
||||||
containerElement.innerHTML =
|
containerElement.innerHTML =
|
||||||
'<div class="message is-info">' +
|
'<div class="message is-info">' +
|
||||||
'<p class="message-body">There are no comments associated with this record.</p>' +
|
'<p class="message-body">There are no comments associated with this record.</p>' +
|
||||||
"</div>";
|
'</div>';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const tableElement = document.createElement("table");
|
const tableElement = document.createElement('table');
|
||||||
tableElement.className = "table is-fullwidth is-striped is-hoverable";
|
tableElement.className = 'table is-fullwidth is-striped is-hoverable';
|
||||||
tableElement.innerHTML =
|
tableElement.innerHTML =
|
||||||
"<thead><tr>" +
|
'<thead><tr>' +
|
||||||
"<th>Commentor</th>" +
|
'<th>Commentor</th>' +
|
||||||
"<th>Comment Date</th>" +
|
'<th>Comment Date</th>' +
|
||||||
"<th>Comment</th>" +
|
'<th>Comment</th>' +
|
||||||
'<th class="is-hidden-print"><span class="is-sr-only">Options</span></th>' +
|
'<th class="is-hidden-print"><span class="is-sr-only">Options</span></th>' +
|
||||||
"</tr></thead>" +
|
'</tr></thead>' +
|
||||||
"<tbody></tbody>";
|
'<tbody></tbody>';
|
||||||
for (const lotOccupancyComment of lotOccupancyComments) {
|
for (const lotOccupancyComment of lotOccupancyComments) {
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement('tr');
|
||||||
tableRowElement.dataset.lotOccupancyCommentId =
|
tableRowElement.dataset.lotOccupancyCommentId =
|
||||||
lotOccupancyComment.lotOccupancyCommentId.toString();
|
lotOccupancyComment.lotOccupancyCommentId.toString();
|
||||||
tableRowElement.innerHTML =
|
tableRowElement.innerHTML =
|
||||||
"<td>" +
|
'<td>' +
|
||||||
cityssm.escapeHTML(lotOccupancyComment.recordCreate_userName || "") +
|
cityssm.escapeHTML(lotOccupancyComment.recordCreate_userName || '') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
"<td>" +
|
'<td>' +
|
||||||
lotOccupancyComment.lotOccupancyCommentDateString +
|
lotOccupancyComment.lotOccupancyCommentDateString +
|
||||||
(lotOccupancyComment.lotOccupancyCommentTime === 0
|
(lotOccupancyComment.lotOccupancyCommentTime === 0
|
||||||
? ""
|
? ''
|
||||||
: " " + lotOccupancyComment.lotOccupancyCommentTimeString) +
|
: ' ' + lotOccupancyComment.lotOccupancyCommentTimeString) +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
"<td>" +
|
'<td>' +
|
||||||
cityssm.escapeHTML(lotOccupancyComment.lotOccupancyComment || "") +
|
cityssm.escapeHTML(lotOccupancyComment.lotOccupancyComment || '') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
('<td class="is-hidden-print">' +
|
('<td class="is-hidden-print">' +
|
||||||
'<div class="buttons are-small is-justify-content-end">' +
|
'<div class="buttons are-small is-justify-content-end">' +
|
||||||
('<button class="button is-primary button--edit" type="button">' +
|
('<button class="button is-primary button--edit" type="button">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||||
" <span>Edit</span>" +
|
' <span>Edit</span>' +
|
||||||
"</button>") +
|
'</button>') +
|
||||||
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
|
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>") +
|
'</button>') +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</td>");
|
'</td>');
|
||||||
tableRowElement
|
tableRowElement
|
||||||
.querySelector(".button--edit")
|
.querySelector('.button--edit')
|
||||||
.addEventListener("click", openEditLotOccupancyComment);
|
.addEventListener('click', openEditLotOccupancyComment);
|
||||||
tableRowElement
|
tableRowElement
|
||||||
.querySelector(".button--delete")
|
.querySelector('.button--delete')
|
||||||
.addEventListener("click", deleteLotOccupancyComment);
|
.addEventListener('click', deleteLotOccupancyComment);
|
||||||
tableElement.querySelector("tbody").append(tableRowElement);
|
tableElement.querySelector('tbody').append(tableRowElement);
|
||||||
}
|
}
|
||||||
containerElement.innerHTML = "";
|
containerElement.innerHTML = '';
|
||||||
containerElement.append(tableElement);
|
containerElement.append(tableElement);
|
||||||
};
|
};
|
||||||
document.querySelector("#button--addComment").addEventListener("click", () => {
|
document.querySelector('#button--addComment').addEventListener('click', () => {
|
||||||
let addFormElement;
|
let addFormElement;
|
||||||
let addCloseModalFunction;
|
let addCloseModalFunction;
|
||||||
const addComment = (submitEvent) => {
|
const addComment = (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doAddLotOccupancyComment", addFormElement, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doAddLotOccupancyComment', addFormElement, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotOccupancyComments = responseJSON.lotOccupancyComments;
|
lotOccupancyComments = responseJSON.lotOccupancyComments;
|
||||||
addCloseModalFunction();
|
addCloseModalFunction();
|
||||||
|
|
@ -158,23 +160,23 @@ document.querySelector("#button--addComment").addEventListener("click", () => {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Adding Comment",
|
title: 'Error Adding Comment',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
cityssm.openHtmlModal("lotOccupancy-addComment", {
|
cityssm.openHtmlModal('lotOccupancy-addComment', {
|
||||||
onshow: (modalElement) => {
|
onshow: (modalElement) => {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement);
|
||||||
modalElement.querySelector("#lotOccupancyCommentAdd--lotOccupancyId").value = lotOccupancyId;
|
modalElement.querySelector('#lotOccupancyCommentAdd--lotOccupancyId').value = lotOccupancyId;
|
||||||
},
|
},
|
||||||
onshown: (modalElement, closeModalFunction) => {
|
onshown: (modalElement, closeModalFunction) => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
modalElement.querySelector("#lotOccupancyCommentAdd--lotOccupancyComment").focus();
|
modalElement.querySelector('#lotOccupancyCommentAdd--lotOccupancyComment').focus();
|
||||||
addFormElement = modalElement.querySelector("form");
|
addFormElement = modalElement.querySelector('form');
|
||||||
addFormElement.addEventListener("submit", addComment);
|
addFormElement.addEventListener('submit', addComment);
|
||||||
addCloseModalFunction = closeModalFunction;
|
addCloseModalFunction = closeModalFunction;
|
||||||
},
|
},
|
||||||
onremoved: () => {
|
onremoved: () => {
|
||||||
|
|
|
||||||
|
|
@ -1,295 +1,303 @@
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||||
|
|
||||||
import type * as globalTypes from "../../types/globalTypes";
|
import type * as globalTypes from '../../types/globalTypes'
|
||||||
import type * as recordTypes from "../../types/recordTypes";
|
import type * as recordTypes from '../../types/recordTypes'
|
||||||
|
|
||||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||||
|
|
||||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal
|
||||||
declare const bulmaJS: BulmaJS;
|
declare const bulmaJS: BulmaJS
|
||||||
|
|
||||||
declare const los: globalTypes.LOS;
|
declare const los: globalTypes.LOS
|
||||||
|
|
||||||
declare const lotOccupancyId: string;
|
declare const lotOccupancyId: string
|
||||||
|
|
||||||
let lotOccupancyComments: recordTypes.LotOccupancyComment[] = exports.lotOccupancyComments;
|
let lotOccupancyComments: recordTypes.LotOccupancyComment[] =
|
||||||
delete exports.lotOccupancyComments;
|
exports.lotOccupancyComments
|
||||||
|
delete exports.lotOccupancyComments
|
||||||
|
|
||||||
const openEditLotOccupancyComment = (clickEvent: Event) => {
|
const openEditLotOccupancyComment = (clickEvent: Event) => {
|
||||||
const lotOccupancyCommentId = Number.parseInt(
|
const lotOccupancyCommentId = Number.parseInt(
|
||||||
(clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.lotOccupancyCommentId!,
|
(clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset
|
||||||
|
.lotOccupancyCommentId!,
|
||||||
10
|
10
|
||||||
);
|
)
|
||||||
|
|
||||||
const lotOccupancyComment = lotOccupancyComments.find((currentLotOccupancyComment) => {
|
const lotOccupancyComment = lotOccupancyComments.find(
|
||||||
return currentLotOccupancyComment.lotOccupancyCommentId === lotOccupancyCommentId;
|
(currentLotOccupancyComment) => {
|
||||||
})!;
|
return (
|
||||||
|
currentLotOccupancyComment.lotOccupancyCommentId ===
|
||||||
|
lotOccupancyCommentId
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)!
|
||||||
|
|
||||||
let editFormElement: HTMLFormElement;
|
let editFormElement: HTMLFormElement
|
||||||
let editCloseModalFunction: () => void;
|
let editCloseModalFunction: () => void
|
||||||
|
|
||||||
const editComment = (submitEvent: SubmitEvent) => {
|
const editComment = (submitEvent: SubmitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault()
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/lotOccupancies/doUpdateLotOccupancyComment",
|
los.urlPrefix + '/lotOccupancies/doUpdateLotOccupancyComment',
|
||||||
editFormElement,
|
editFormElement,
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
lotOccupancyComments?: recordTypes.LotOccupancyComment[];
|
lotOccupancyComments?: recordTypes.LotOccupancyComment[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotOccupancyComments = responseJSON.lotOccupancyComments!;
|
lotOccupancyComments = responseJSON.lotOccupancyComments!
|
||||||
editCloseModalFunction();
|
editCloseModalFunction()
|
||||||
renderLotOccupancyComments();
|
renderLotOccupancyComments()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating Comment",
|
title: 'Error Updating Comment',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
cityssm.openHtmlModal("lotOccupancy-editComment", {
|
cityssm.openHtmlModal('lotOccupancy-editComment', {
|
||||||
onshow: (modalElement) => {
|
onshow: (modalElement) => {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement)
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#lotOccupancyCommentEdit--lotOccupancyId"
|
'#lotOccupancyCommentEdit--lotOccupancyId'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value = lotOccupancyId;
|
).value = lotOccupancyId
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#lotOccupancyCommentEdit--lotOccupancyCommentId"
|
'#lotOccupancyCommentEdit--lotOccupancyCommentId'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value = lotOccupancyCommentId.toString();
|
).value = lotOccupancyCommentId.toString()
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#lotOccupancyCommentEdit--lotOccupancyComment"
|
'#lotOccupancyCommentEdit--lotOccupancyComment'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value = lotOccupancyComment.lotOccupancyComment!;
|
).value = lotOccupancyComment.lotOccupancyComment!
|
||||||
|
|
||||||
const lotOccupancyCommentDateStringElement = modalElement.querySelector(
|
const lotOccupancyCommentDateStringElement = modalElement.querySelector(
|
||||||
"#lotOccupancyCommentEdit--lotOccupancyCommentDateString"
|
'#lotOccupancyCommentEdit--lotOccupancyCommentDateString'
|
||||||
) as HTMLInputElement;
|
) as HTMLInputElement
|
||||||
|
|
||||||
lotOccupancyCommentDateStringElement.value =
|
lotOccupancyCommentDateStringElement.value =
|
||||||
lotOccupancyComment.lotOccupancyCommentDateString!;
|
lotOccupancyComment.lotOccupancyCommentDateString!
|
||||||
|
|
||||||
const currentDateString = cityssm.dateToString(new Date());
|
const currentDateString = cityssm.dateToString(new Date())
|
||||||
|
|
||||||
lotOccupancyCommentDateStringElement.max =
|
lotOccupancyCommentDateStringElement.max =
|
||||||
lotOccupancyComment.lotOccupancyCommentDateString! <= currentDateString
|
lotOccupancyComment.lotOccupancyCommentDateString! <= currentDateString
|
||||||
? currentDateString
|
? currentDateString
|
||||||
: lotOccupancyComment.lotOccupancyCommentDateString!;
|
: lotOccupancyComment.lotOccupancyCommentDateString!
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#lotOccupancyCommentEdit--lotOccupancyCommentTimeString"
|
'#lotOccupancyCommentEdit--lotOccupancyCommentTimeString'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value = lotOccupancyComment.lotOccupancyCommentTimeString!;
|
).value = lotOccupancyComment.lotOccupancyCommentTimeString!
|
||||||
},
|
},
|
||||||
onshown: (modalElement, closeModalFunction) => {
|
onshown: (modalElement, closeModalFunction) => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
|
|
||||||
los.initializeDatePickers(modalElement);
|
los.initializeDatePickers(modalElement)
|
||||||
// los.initializeTimePickers(modalElement);
|
// los.initializeTimePickers(modalElement);
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#lotOccupancyCommentEdit--lotOccupancyComment"
|
'#lotOccupancyCommentEdit--lotOccupancyComment'
|
||||||
) as HTMLTextAreaElement
|
) as HTMLTextAreaElement
|
||||||
).focus();
|
).focus()
|
||||||
|
|
||||||
editFormElement = modalElement.querySelector("form")!;
|
editFormElement = modalElement.querySelector('form')!
|
||||||
editFormElement.addEventListener("submit", editComment);
|
editFormElement.addEventListener('submit', editComment)
|
||||||
|
|
||||||
editCloseModalFunction = closeModalFunction;
|
editCloseModalFunction = closeModalFunction
|
||||||
},
|
},
|
||||||
onremoved: () => {
|
onremoved: () => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const deleteLotOccupancyComment = (clickEvent: Event) => {
|
const deleteLotOccupancyComment = (clickEvent: Event) => {
|
||||||
const lotOccupancyCommentId = Number.parseInt(
|
const lotOccupancyCommentId = Number.parseInt(
|
||||||
(clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.lotOccupancyCommentId!,
|
(clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset
|
||||||
|
.lotOccupancyCommentId!,
|
||||||
10
|
10
|
||||||
);
|
)
|
||||||
|
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyComment",
|
los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyComment',
|
||||||
{
|
{
|
||||||
lotOccupancyId,
|
lotOccupancyId,
|
||||||
lotOccupancyCommentId
|
lotOccupancyCommentId
|
||||||
},
|
},
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
lotOccupancyComments: recordTypes.LotOccupancyComment[];
|
lotOccupancyComments: recordTypes.LotOccupancyComment[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotOccupancyComments = responseJSON.lotOccupancyComments;
|
lotOccupancyComments = responseJSON.lotOccupancyComments
|
||||||
renderLotOccupancyComments();
|
renderLotOccupancyComments()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Removing Comment",
|
title: 'Error Removing Comment',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Remove Comment?",
|
title: 'Remove Comment?',
|
||||||
message: "Are you sure you want to remove this comment?",
|
message: 'Are you sure you want to remove this comment?',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Remove Comment",
|
text: 'Yes, Remove Comment',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
},
|
},
|
||||||
contextualColorName: "warning"
|
contextualColorName: 'warning'
|
||||||
});
|
})
|
||||||
};
|
}
|
||||||
|
|
||||||
const renderLotOccupancyComments = () => {
|
const renderLotOccupancyComments = () => {
|
||||||
const containerElement = document.querySelector(
|
const containerElement = document.querySelector(
|
||||||
"#container--lotOccupancyComments"
|
'#container--lotOccupancyComments'
|
||||||
) as HTMLElement;
|
) as HTMLElement
|
||||||
|
|
||||||
if (lotOccupancyComments.length === 0) {
|
if (lotOccupancyComments.length === 0) {
|
||||||
containerElement.innerHTML =
|
containerElement.innerHTML =
|
||||||
'<div class="message is-info">' +
|
'<div class="message is-info">' +
|
||||||
'<p class="message-body">There are no comments associated with this record.</p>' +
|
'<p class="message-body">There are no comments associated with this record.</p>' +
|
||||||
"</div>";
|
'</div>'
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const tableElement = document.createElement("table");
|
const tableElement = document.createElement('table')
|
||||||
tableElement.className = "table is-fullwidth is-striped is-hoverable";
|
tableElement.className = 'table is-fullwidth is-striped is-hoverable'
|
||||||
tableElement.innerHTML =
|
tableElement.innerHTML =
|
||||||
"<thead><tr>" +
|
'<thead><tr>' +
|
||||||
"<th>Commentor</th>" +
|
'<th>Commentor</th>' +
|
||||||
"<th>Comment Date</th>" +
|
'<th>Comment Date</th>' +
|
||||||
"<th>Comment</th>" +
|
'<th>Comment</th>' +
|
||||||
'<th class="is-hidden-print"><span class="is-sr-only">Options</span></th>' +
|
'<th class="is-hidden-print"><span class="is-sr-only">Options</span></th>' +
|
||||||
"</tr></thead>" +
|
'</tr></thead>' +
|
||||||
"<tbody></tbody>";
|
'<tbody></tbody>'
|
||||||
|
|
||||||
for (const lotOccupancyComment of lotOccupancyComments) {
|
for (const lotOccupancyComment of lotOccupancyComments) {
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement('tr')
|
||||||
tableRowElement.dataset.lotOccupancyCommentId =
|
tableRowElement.dataset.lotOccupancyCommentId =
|
||||||
lotOccupancyComment.lotOccupancyCommentId!.toString();
|
lotOccupancyComment.lotOccupancyCommentId!.toString()
|
||||||
|
|
||||||
tableRowElement.innerHTML =
|
tableRowElement.innerHTML =
|
||||||
"<td>" +
|
'<td>' +
|
||||||
cityssm.escapeHTML(lotOccupancyComment.recordCreate_userName || "") +
|
cityssm.escapeHTML(lotOccupancyComment.recordCreate_userName || '') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
"<td>" +
|
'<td>' +
|
||||||
lotOccupancyComment.lotOccupancyCommentDateString +
|
lotOccupancyComment.lotOccupancyCommentDateString +
|
||||||
(lotOccupancyComment.lotOccupancyCommentTime === 0
|
(lotOccupancyComment.lotOccupancyCommentTime === 0
|
||||||
? ""
|
? ''
|
||||||
: " " + lotOccupancyComment.lotOccupancyCommentTimeString) +
|
: ' ' + lotOccupancyComment.lotOccupancyCommentTimeString) +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
"<td>" +
|
'<td>' +
|
||||||
cityssm.escapeHTML(lotOccupancyComment.lotOccupancyComment || "") +
|
cityssm.escapeHTML(lotOccupancyComment.lotOccupancyComment || '') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
('<td class="is-hidden-print">' +
|
('<td class="is-hidden-print">' +
|
||||||
'<div class="buttons are-small is-justify-content-end">' +
|
'<div class="buttons are-small is-justify-content-end">' +
|
||||||
('<button class="button is-primary button--edit" type="button">' +
|
('<button class="button is-primary button--edit" type="button">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||||
" <span>Edit</span>" +
|
' <span>Edit</span>' +
|
||||||
"</button>") +
|
'</button>') +
|
||||||
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
|
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>") +
|
'</button>') +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</td>");
|
'</td>')
|
||||||
|
|
||||||
tableRowElement
|
tableRowElement
|
||||||
.querySelector(".button--edit")!
|
.querySelector('.button--edit')!
|
||||||
.addEventListener("click", openEditLotOccupancyComment);
|
.addEventListener('click', openEditLotOccupancyComment)
|
||||||
|
|
||||||
tableRowElement
|
tableRowElement
|
||||||
.querySelector(".button--delete")!
|
.querySelector('.button--delete')!
|
||||||
.addEventListener("click", deleteLotOccupancyComment);
|
.addEventListener('click', deleteLotOccupancyComment)
|
||||||
|
|
||||||
tableElement.querySelector("tbody")!.append(tableRowElement);
|
tableElement.querySelector('tbody')!.append(tableRowElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
containerElement.innerHTML = "";
|
containerElement.innerHTML = ''
|
||||||
containerElement.append(tableElement);
|
containerElement.append(tableElement)
|
||||||
};
|
}
|
||||||
|
|
||||||
document.querySelector("#button--addComment")!.addEventListener("click", () => {
|
document.querySelector('#button--addComment')!.addEventListener('click', () => {
|
||||||
let addFormElement: HTMLFormElement;
|
let addFormElement: HTMLFormElement
|
||||||
let addCloseModalFunction: () => void;
|
let addCloseModalFunction: () => void
|
||||||
|
|
||||||
const addComment = (submitEvent: SubmitEvent) => {
|
const addComment = (submitEvent: SubmitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault()
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/lotOccupancies/doAddLotOccupancyComment",
|
los.urlPrefix + '/lotOccupancies/doAddLotOccupancyComment',
|
||||||
addFormElement,
|
addFormElement,
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
lotOccupancyComments?: recordTypes.LotOccupancyComment[];
|
lotOccupancyComments?: recordTypes.LotOccupancyComment[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotOccupancyComments = responseJSON.lotOccupancyComments!;
|
lotOccupancyComments = responseJSON.lotOccupancyComments!
|
||||||
addCloseModalFunction();
|
addCloseModalFunction()
|
||||||
renderLotOccupancyComments();
|
renderLotOccupancyComments()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Adding Comment",
|
title: 'Error Adding Comment',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
cityssm.openHtmlModal("lotOccupancy-addComment", {
|
cityssm.openHtmlModal('lotOccupancy-addComment', {
|
||||||
onshow: (modalElement) => {
|
onshow: (modalElement) => {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement)
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#lotOccupancyCommentAdd--lotOccupancyId"
|
'#lotOccupancyCommentAdd--lotOccupancyId'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value = lotOccupancyId;
|
).value = lotOccupancyId
|
||||||
},
|
},
|
||||||
onshown: (modalElement, closeModalFunction) => {
|
onshown: (modalElement, closeModalFunction) => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#lotOccupancyCommentAdd--lotOccupancyComment"
|
'#lotOccupancyCommentAdd--lotOccupancyComment'
|
||||||
) as HTMLTextAreaElement
|
) as HTMLTextAreaElement
|
||||||
).focus();
|
).focus()
|
||||||
|
|
||||||
addFormElement = modalElement.querySelector("form")!;
|
addFormElement = modalElement.querySelector('form')!
|
||||||
addFormElement.addEventListener("submit", addComment);
|
addFormElement.addEventListener('submit', addComment)
|
||||||
|
|
||||||
addCloseModalFunction = closeModalFunction;
|
addCloseModalFunction = closeModalFunction
|
||||||
},
|
},
|
||||||
onremoved: () => {
|
onremoved: () => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
|
|
||||||
renderLotOccupancyComments();
|
renderLotOccupancyComments()
|
||||||
|
|
|
||||||
|
|
@ -3,19 +3,20 @@
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
let lotOccupancyFees = exports.lotOccupancyFees;
|
let lotOccupancyFees = exports.lotOccupancyFees;
|
||||||
delete exports.lotOccupancyFees;
|
delete exports.lotOccupancyFees;
|
||||||
const lotOccupancyFeesContainerElement = document.querySelector("#container--lotOccupancyFees");
|
const lotOccupancyFeesContainerElement = document.querySelector('#container--lotOccupancyFees');
|
||||||
const getFeeGrandTotal = () => {
|
const getFeeGrandTotal = () => {
|
||||||
let feeGrandTotal = 0;
|
let feeGrandTotal = 0;
|
||||||
for (const lotOccupancyFee of lotOccupancyFees) {
|
for (const lotOccupancyFee of lotOccupancyFees) {
|
||||||
feeGrandTotal +=
|
feeGrandTotal +=
|
||||||
(lotOccupancyFee.feeAmount + lotOccupancyFee.taxAmount) * lotOccupancyFee.quantity;
|
(lotOccupancyFee.feeAmount + lotOccupancyFee.taxAmount) *
|
||||||
|
lotOccupancyFee.quantity;
|
||||||
}
|
}
|
||||||
return feeGrandTotal;
|
return feeGrandTotal;
|
||||||
};
|
};
|
||||||
const deleteLotOccupancyFee = (clickEvent) => {
|
const deleteLotOccupancyFee = (clickEvent) => {
|
||||||
const feeId = clickEvent.currentTarget.closest(".container--lotOccupancyFee").dataset.feeId;
|
const feeId = clickEvent.currentTarget.closest('.container--lotOccupancyFee').dataset.feeId;
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyFee", {
|
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyFee', {
|
||||||
lotOccupancyId,
|
lotOccupancyId,
|
||||||
feeId
|
feeId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
|
|
@ -25,19 +26,19 @@ const deleteLotOccupancyFee = (clickEvent) => {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Deleting Fee",
|
title: 'Error Deleting Fee',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete Fee",
|
title: 'Delete Fee',
|
||||||
message: "Are you sure you want to delete this fee?",
|
message: 'Are you sure you want to delete this fee?',
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete Fee",
|
text: 'Yes, Delete Fee',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -47,74 +48,81 @@ const renderLotOccupancyFees = () => {
|
||||||
lotOccupancyFeesContainerElement.innerHTML =
|
lotOccupancyFeesContainerElement.innerHTML =
|
||||||
'<div class="message is-info">' +
|
'<div class="message is-info">' +
|
||||||
'<p class="message-body">There are no fees associated with this record.</p>' +
|
'<p class="message-body">There are no fees associated with this record.</p>' +
|
||||||
"</div>";
|
'</div>';
|
||||||
renderLotOccupancyTransactions();
|
renderLotOccupancyTransactions();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
lotOccupancyFeesContainerElement.innerHTML =
|
lotOccupancyFeesContainerElement.innerHTML =
|
||||||
'<table class="table is-fullwidth is-striped is-hoverable">' +
|
'<table class="table is-fullwidth is-striped is-hoverable">' +
|
||||||
("<thead><tr>" +
|
('<thead><tr>' +
|
||||||
"<th>Fee</th>" +
|
'<th>Fee</th>' +
|
||||||
'<th><span class="is-sr-only">Unit Cost</span></th>' +
|
'<th><span class="is-sr-only">Unit Cost</span></th>' +
|
||||||
'<th class="has-width-1"><span class="is-sr-only">×</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">Quantity</span></th>' +
|
||||||
'<th class="has-width-1"><span class="is-sr-only">equals</span></th>' +
|
'<th class="has-width-1"><span class="is-sr-only">equals</span></th>' +
|
||||||
'<th class="has-width-1 has-text-right">Total</th>' +
|
'<th class="has-width-1 has-text-right">Total</th>' +
|
||||||
'<th class="has-width-1 is-hidden-print"><span class="is-sr-only">Options</span></th>' +
|
'<th class="has-width-1 is-hidden-print"><span class="is-sr-only">Options</span></th>' +
|
||||||
"</tr></thead>") +
|
'</tr></thead>') +
|
||||||
"<tbody></tbody>" +
|
'<tbody></tbody>' +
|
||||||
("<tfoot>" +
|
('<tfoot>' +
|
||||||
'<tr><th colspan="5">Subtotal</th><td class="has-text-weight-bold has-text-right" id="lotOccupancyFees--feeAmountTotal"></td><td class="is-hidden-print"></td></tr>' +
|
'<tr><th colspan="5">Subtotal</th><td class="has-text-weight-bold has-text-right" id="lotOccupancyFees--feeAmountTotal"></td><td class="is-hidden-print"></td></tr>' +
|
||||||
'<tr><th colspan="5">Tax</th><td class="has-text-right" id="lotOccupancyFees--taxAmountTotal"></td><td class="is-hidden-print"></td></tr>' +
|
'<tr><th colspan="5">Tax</th><td class="has-text-right" id="lotOccupancyFees--taxAmountTotal"></td><td class="is-hidden-print"></td></tr>' +
|
||||||
'<tr><th colspan="5">Grand Total</th><td class="has-text-weight-bold has-text-right" id="lotOccupancyFees--grandTotal"></td><td class="is-hidden-print"></td></tr>' +
|
'<tr><th colspan="5">Grand Total</th><td class="has-text-weight-bold has-text-right" id="lotOccupancyFees--grandTotal"></td><td class="is-hidden-print"></td></tr>' +
|
||||||
"</tfoot>") +
|
'</tfoot>') +
|
||||||
"</table>";
|
'</table>';
|
||||||
let feeAmountTotal = 0;
|
let feeAmountTotal = 0;
|
||||||
let taxAmountTotal = 0;
|
let taxAmountTotal = 0;
|
||||||
for (const lotOccupancyFee of lotOccupancyFees) {
|
for (const lotOccupancyFee of lotOccupancyFees) {
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement('tr');
|
||||||
tableRowElement.className = "container--lotOccupancyFee";
|
tableRowElement.className = 'container--lotOccupancyFee';
|
||||||
tableRowElement.dataset.feeId = lotOccupancyFee.feeId.toString();
|
tableRowElement.dataset.feeId = lotOccupancyFee.feeId.toString();
|
||||||
tableRowElement.dataset.includeQuantity = lotOccupancyFee.includeQuantity ? "1" : "0";
|
tableRowElement.dataset.includeQuantity = lotOccupancyFee.includeQuantity
|
||||||
|
? '1'
|
||||||
|
: '0';
|
||||||
tableRowElement.innerHTML =
|
tableRowElement.innerHTML =
|
||||||
'<td colspan="' +
|
'<td colspan="' +
|
||||||
(lotOccupancyFee.quantity === 1 ? "5" : "1") +
|
(lotOccupancyFee.quantity === 1 ? '5' : '1') +
|
||||||
'">' +
|
'">' +
|
||||||
cityssm.escapeHTML(lotOccupancyFee.feeName || "") +
|
cityssm.escapeHTML(lotOccupancyFee.feeName || '') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
(lotOccupancyFee.quantity === 1
|
(lotOccupancyFee.quantity === 1
|
||||||
? ""
|
? ''
|
||||||
: '<td class="has-text-right">$' +
|
: '<td class="has-text-right">$' +
|
||||||
lotOccupancyFee.feeAmount.toFixed(2) +
|
lotOccupancyFee.feeAmount.toFixed(2) +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
"<td>×</td>" +
|
'<td>×</td>' +
|
||||||
'<td class="has-text-right">' +
|
'<td class="has-text-right">' +
|
||||||
lotOccupancyFee.quantity +
|
lotOccupancyFee.quantity +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
"<td>=</td>") +
|
'<td>=</td>') +
|
||||||
'<td class="has-text-right">$' +
|
'<td class="has-text-right">$' +
|
||||||
(lotOccupancyFee.feeAmount * lotOccupancyFee.quantity).toFixed(2) +
|
(lotOccupancyFee.feeAmount * lotOccupancyFee.quantity).toFixed(2) +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
('<td class="is-hidden-print">' +
|
('<td class="is-hidden-print">' +
|
||||||
'<button class="button is-small is-danger is-light" data-tooltip="Delete Fee" type="button">' +
|
'<button class="button is-small is-danger is-light" data-tooltip="Delete Fee" type="button">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</td>");
|
'</td>');
|
||||||
tableRowElement.querySelector("button").addEventListener("click", deleteLotOccupancyFee);
|
tableRowElement
|
||||||
lotOccupancyFeesContainerElement.querySelector("tbody").append(tableRowElement);
|
.querySelector('button')
|
||||||
|
.addEventListener('click', deleteLotOccupancyFee);
|
||||||
|
lotOccupancyFeesContainerElement
|
||||||
|
.querySelector('tbody')
|
||||||
|
.append(tableRowElement);
|
||||||
feeAmountTotal += lotOccupancyFee.feeAmount * lotOccupancyFee.quantity;
|
feeAmountTotal += lotOccupancyFee.feeAmount * lotOccupancyFee.quantity;
|
||||||
taxAmountTotal += lotOccupancyFee.taxAmount * lotOccupancyFee.quantity;
|
taxAmountTotal += lotOccupancyFee.taxAmount * lotOccupancyFee.quantity;
|
||||||
}
|
}
|
||||||
lotOccupancyFeesContainerElement.querySelector("#lotOccupancyFees--feeAmountTotal").textContent = "$" + feeAmountTotal.toFixed(2);
|
;
|
||||||
lotOccupancyFeesContainerElement.querySelector("#lotOccupancyFees--taxAmountTotal").textContent = "$" + taxAmountTotal.toFixed(2);
|
lotOccupancyFeesContainerElement.querySelector('#lotOccupancyFees--feeAmountTotal').textContent = '$' + feeAmountTotal.toFixed(2);
|
||||||
lotOccupancyFeesContainerElement.querySelector("#lotOccupancyFees--grandTotal").textContent = "$" + (feeAmountTotal + taxAmountTotal).toFixed(2);
|
lotOccupancyFeesContainerElement.querySelector('#lotOccupancyFees--taxAmountTotal').textContent = '$' + taxAmountTotal.toFixed(2);
|
||||||
|
lotOccupancyFeesContainerElement.querySelector('#lotOccupancyFees--grandTotal').textContent = '$' + (feeAmountTotal + taxAmountTotal).toFixed(2);
|
||||||
renderLotOccupancyTransactions();
|
renderLotOccupancyTransactions();
|
||||||
};
|
};
|
||||||
document.querySelector("#button--addFee").addEventListener("click", () => {
|
document.querySelector('#button--addFee').addEventListener('click', () => {
|
||||||
if (hasUnsavedChanges) {
|
if (hasUnsavedChanges) {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: "Please save all unsaved changes before adding fees.",
|
message: 'Please save all unsaved changes before adding fees.',
|
||||||
contextualColorName: "warning"
|
contextualColorName: 'warning'
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -122,7 +130,7 @@ document.querySelector("#button--addFee").addEventListener("click", () => {
|
||||||
let feeFilterElement;
|
let feeFilterElement;
|
||||||
let feeFilterResultsElement;
|
let feeFilterResultsElement;
|
||||||
const doAddFee = (feeId, quantity = 1) => {
|
const doAddFee = (feeId, quantity = 1) => {
|
||||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doAddLotOccupancyFee", {
|
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doAddLotOccupancyFee', {
|
||||||
lotOccupancyId,
|
lotOccupancyId,
|
||||||
feeId,
|
feeId,
|
||||||
quantity
|
quantity
|
||||||
|
|
@ -134,9 +142,9 @@ document.querySelector("#button--addFee").addEventListener("click", () => {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Adding Fee",
|
title: 'Error Adding Fee',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -149,21 +157,24 @@ document.querySelector("#button--addFee").addEventListener("click", () => {
|
||||||
doAddFee(fee.feeId, quantityElement.value);
|
doAddFee(fee.feeId, quantityElement.value);
|
||||||
quantityCloseModalFunction();
|
quantityCloseModalFunction();
|
||||||
};
|
};
|
||||||
cityssm.openHtmlModal("lotOccupancy-setFeeQuantity", {
|
cityssm.openHtmlModal('lotOccupancy-setFeeQuantity', {
|
||||||
onshow: (modalElement) => {
|
onshow: (modalElement) => {
|
||||||
modalElement.querySelector("#lotOccupancyFeeQuantity--quantityUnit").textContent = fee.quantityUnit;
|
;
|
||||||
|
modalElement.querySelector('#lotOccupancyFeeQuantity--quantityUnit').textContent = fee.quantityUnit;
|
||||||
},
|
},
|
||||||
onshown: (modalElement, closeModalFunction) => {
|
onshown: (modalElement, closeModalFunction) => {
|
||||||
quantityCloseModalFunction = closeModalFunction;
|
quantityCloseModalFunction = closeModalFunction;
|
||||||
quantityElement = modalElement.querySelector("#lotOccupancyFeeQuantity--quantity");
|
quantityElement = modalElement.querySelector('#lotOccupancyFeeQuantity--quantity');
|
||||||
modalElement.querySelector("form").addEventListener("submit", doSetQuantity);
|
modalElement
|
||||||
|
.querySelector('form')
|
||||||
|
.addEventListener('submit', doSetQuantity);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const tryAddFee = (clickEvent) => {
|
const tryAddFee = (clickEvent) => {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault();
|
||||||
const feeId = Number.parseInt(clickEvent.currentTarget.dataset.feeId, 10);
|
const feeId = Number.parseInt(clickEvent.currentTarget.dataset.feeId, 10);
|
||||||
const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId, 10);
|
const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest('.container--feeCategory').dataset.feeCategoryId, 10);
|
||||||
const feeCategory = feeCategories.find((currentFeeCategory) => {
|
const feeCategory = feeCategories.find((currentFeeCategory) => {
|
||||||
return currentFeeCategory.feeCategoryId === feeCategoryId;
|
return currentFeeCategory.feeCategoryId === feeCategoryId;
|
||||||
});
|
});
|
||||||
|
|
@ -178,16 +189,20 @@ document.querySelector("#button--addFee").addEventListener("click", () => {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
const filterFees = () => {
|
const filterFees = () => {
|
||||||
const filterStringPieces = feeFilterElement.value.trim().toLowerCase().split(" ");
|
const filterStringPieces = feeFilterElement.value
|
||||||
feeFilterResultsElement.innerHTML = "";
|
.trim()
|
||||||
|
.toLowerCase()
|
||||||
|
.split(' ');
|
||||||
|
feeFilterResultsElement.innerHTML = '';
|
||||||
for (const feeCategory of feeCategories) {
|
for (const feeCategory of feeCategories) {
|
||||||
const categoryContainerElement = document.createElement("div");
|
const categoryContainerElement = document.createElement('div');
|
||||||
categoryContainerElement.className = "container--feeCategory";
|
categoryContainerElement.className = 'container--feeCategory';
|
||||||
categoryContainerElement.dataset.feeCategoryId = feeCategory.feeCategoryId.toString();
|
categoryContainerElement.dataset.feeCategoryId =
|
||||||
|
feeCategory.feeCategoryId.toString();
|
||||||
categoryContainerElement.innerHTML =
|
categoryContainerElement.innerHTML =
|
||||||
'<h4 class="title is-5 mt-2">' +
|
'<h4 class="title is-5 mt-2">' +
|
||||||
cityssm.escapeHTML(feeCategory.feeCategory || "") +
|
cityssm.escapeHTML(feeCategory.feeCategory || '') +
|
||||||
"</h4>" +
|
'</h4>' +
|
||||||
'<div class="panel mb-5"></div>';
|
'<div class="panel mb-5"></div>';
|
||||||
let hasFees = false;
|
let hasFees = false;
|
||||||
for (const fee of feeCategory.fees) {
|
for (const fee of feeCategory.fees) {
|
||||||
|
|
@ -207,35 +222,37 @@ document.querySelector("#button--addFee").addEventListener("click", () => {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
hasFees = true;
|
hasFees = true;
|
||||||
const panelBlockElement = document.createElement("a");
|
const panelBlockElement = document.createElement('a');
|
||||||
panelBlockElement.className = "panel-block is-block container--fee";
|
panelBlockElement.className = 'panel-block is-block container--fee';
|
||||||
panelBlockElement.dataset.feeId = fee.feeId.toString();
|
panelBlockElement.dataset.feeId = fee.feeId.toString();
|
||||||
panelBlockElement.href = "#";
|
panelBlockElement.href = '#';
|
||||||
panelBlockElement.innerHTML =
|
panelBlockElement.innerHTML =
|
||||||
"<strong>" +
|
'<strong>' +
|
||||||
cityssm.escapeHTML(fee.feeName || "") +
|
cityssm.escapeHTML(fee.feeName || '') +
|
||||||
"</strong><br />" +
|
'</strong><br />' +
|
||||||
"<small>" +
|
'<small>' +
|
||||||
cityssm.escapeHTML(fee.feeDescription || "").replace(/\n/g, "<br />") +
|
cityssm
|
||||||
"</small>";
|
.escapeHTML(fee.feeDescription || '')
|
||||||
panelBlockElement.addEventListener("click", tryAddFee);
|
.replace(/\n/g, '<br />') +
|
||||||
categoryContainerElement.querySelector(".panel").append(panelBlockElement);
|
'</small>';
|
||||||
|
panelBlockElement.addEventListener('click', tryAddFee);
|
||||||
|
categoryContainerElement.querySelector('.panel').append(panelBlockElement);
|
||||||
}
|
}
|
||||||
if (hasFees) {
|
if (hasFees) {
|
||||||
feeFilterResultsElement.append(categoryContainerElement);
|
feeFilterResultsElement.append(categoryContainerElement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
cityssm.openHtmlModal("lotOccupancy-addFee", {
|
cityssm.openHtmlModal('lotOccupancy-addFee', {
|
||||||
onshow: (modalElement) => {
|
onshow: (modalElement) => {
|
||||||
feeFilterElement = modalElement.querySelector("#feeSelect--feeName");
|
feeFilterElement = modalElement.querySelector('#feeSelect--feeName');
|
||||||
feeFilterResultsElement = modalElement.querySelector("#resultsContainer--feeSelect");
|
feeFilterResultsElement = modalElement.querySelector('#resultsContainer--feeSelect');
|
||||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doGetFees", {
|
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doGetFees', {
|
||||||
lotOccupancyId
|
lotOccupancyId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
feeCategories = responseJSON.feeCategories;
|
feeCategories = responseJSON.feeCategories;
|
||||||
feeFilterElement.disabled = false;
|
feeFilterElement.disabled = false;
|
||||||
feeFilterElement.addEventListener("keyup", filterFees);
|
feeFilterElement.addEventListener('keyup', filterFees);
|
||||||
feeFilterElement.focus();
|
feeFilterElement.focus();
|
||||||
filterFees();
|
filterFees();
|
||||||
});
|
});
|
||||||
|
|
@ -253,7 +270,7 @@ document.querySelector("#button--addFee").addEventListener("click", () => {
|
||||||
});
|
});
|
||||||
let lotOccupancyTransactions = exports.lotOccupancyTransactions;
|
let lotOccupancyTransactions = exports.lotOccupancyTransactions;
|
||||||
delete exports.lotOccupancyTransactions;
|
delete exports.lotOccupancyTransactions;
|
||||||
const lotOccupancyTransactionsContainerElement = document.querySelector("#container--lotOccupancyTransactions");
|
const lotOccupancyTransactionsContainerElement = document.querySelector('#container--lotOccupancyTransactions');
|
||||||
const getTransactionGrandTotal = () => {
|
const getTransactionGrandTotal = () => {
|
||||||
let transactionGrandTotal = 0;
|
let transactionGrandTotal = 0;
|
||||||
for (const lotOccupancyTransaction of lotOccupancyTransactions) {
|
for (const lotOccupancyTransaction of lotOccupancyTransactions) {
|
||||||
|
|
@ -262,9 +279,9 @@ const getTransactionGrandTotal = () => {
|
||||||
return transactionGrandTotal;
|
return transactionGrandTotal;
|
||||||
};
|
};
|
||||||
const deleteLotOccupancyTransaction = (clickEvent) => {
|
const deleteLotOccupancyTransaction = (clickEvent) => {
|
||||||
const transactionIndex = clickEvent.currentTarget.closest(".container--lotOccupancyTransaction").dataset.transactionIndex;
|
const transactionIndex = clickEvent.currentTarget.closest('.container--lotOccupancyTransaction').dataset.transactionIndex;
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyTransaction", {
|
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyTransaction', {
|
||||||
lotOccupancyId,
|
lotOccupancyId,
|
||||||
transactionIndex
|
transactionIndex
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
|
|
@ -274,19 +291,19 @@ const deleteLotOccupancyTransaction = (clickEvent) => {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Deleting Transaction",
|
title: 'Error Deleting Transaction',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete Trasnaction",
|
title: 'Delete Trasnaction',
|
||||||
message: "Are you sure you want to delete this transaction?",
|
message: 'Are you sure you want to delete this transaction?',
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete Transaction",
|
text: 'Yes, Delete Transaction',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -295,80 +312,85 @@ const renderLotOccupancyTransactions = () => {
|
||||||
if (lotOccupancyTransactions.length === 0) {
|
if (lotOccupancyTransactions.length === 0) {
|
||||||
lotOccupancyTransactionsContainerElement.innerHTML =
|
lotOccupancyTransactionsContainerElement.innerHTML =
|
||||||
'<div class="message ' +
|
'<div class="message ' +
|
||||||
(lotOccupancyFees.length === 0 ? "is-info" : "is-warning") +
|
(lotOccupancyFees.length === 0 ? 'is-info' : 'is-warning') +
|
||||||
'">' +
|
'">' +
|
||||||
'<p class="message-body">There are no transactions associated with this record.</p>' +
|
'<p class="message-body">There are no transactions associated with this record.</p>' +
|
||||||
"</div>";
|
'</div>';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
lotOccupancyTransactionsContainerElement.innerHTML =
|
lotOccupancyTransactionsContainerElement.innerHTML =
|
||||||
'<table class="table is-fullwidth is-striped is-hoverable">' +
|
'<table class="table is-fullwidth is-striped is-hoverable">' +
|
||||||
"<thead><tr>" +
|
'<thead><tr>' +
|
||||||
'<th class="has-width-1">Date</th>' +
|
'<th class="has-width-1">Date</th>' +
|
||||||
"<th>" +
|
'<th>' +
|
||||||
cityssm.escapeHTML(exports.aliases.externalReceiptNumber) +
|
cityssm.escapeHTML(exports.aliases.externalReceiptNumber) +
|
||||||
"</th>" +
|
'</th>' +
|
||||||
'<th class="has-text-right has-width-1">Amount</th>' +
|
'<th class="has-text-right has-width-1">Amount</th>' +
|
||||||
'<th class="has-width-1 is-hidden-print"><span class="is-sr-only">Options</span></th>' +
|
'<th class="has-width-1 is-hidden-print"><span class="is-sr-only">Options</span></th>' +
|
||||||
"</tr></thead>" +
|
'</tr></thead>' +
|
||||||
"<tbody></tbody>" +
|
'<tbody></tbody>' +
|
||||||
("<tfoot><tr>" +
|
('<tfoot><tr>' +
|
||||||
'<th colspan="2">Transaction Total</th>' +
|
'<th colspan="2">Transaction Total</th>' +
|
||||||
'<td class="has-text-weight-bold has-text-right" id="lotOccupancyTransactions--grandTotal"></td>' +
|
'<td class="has-text-weight-bold has-text-right" id="lotOccupancyTransactions--grandTotal"></td>' +
|
||||||
'<td class="is-hidden-print"></td>' +
|
'<td class="is-hidden-print"></td>' +
|
||||||
"</tr></tfoot>") +
|
'</tr></tfoot>') +
|
||||||
"</table>";
|
'</table>';
|
||||||
let transactionGrandTotal = 0;
|
let transactionGrandTotal = 0;
|
||||||
for (const lotOccupancyTransaction of lotOccupancyTransactions) {
|
for (const lotOccupancyTransaction of lotOccupancyTransactions) {
|
||||||
transactionGrandTotal += lotOccupancyTransaction.transactionAmount;
|
transactionGrandTotal += lotOccupancyTransaction.transactionAmount;
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement('tr');
|
||||||
tableRowElement.className = "container--lotOccupancyTransaction";
|
tableRowElement.className = 'container--lotOccupancyTransaction';
|
||||||
tableRowElement.dataset.transactionIndex =
|
tableRowElement.dataset.transactionIndex =
|
||||||
lotOccupancyTransaction.transactionIndex.toString();
|
lotOccupancyTransaction.transactionIndex.toString();
|
||||||
tableRowElement.innerHTML =
|
tableRowElement.innerHTML =
|
||||||
"<td>" +
|
'<td>' +
|
||||||
lotOccupancyTransaction.transactionDateString +
|
lotOccupancyTransaction.transactionDateString +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
cityssm.escapeHTML(lotOccupancyTransaction.externalReceiptNumber || "") +
|
cityssm.escapeHTML(lotOccupancyTransaction.externalReceiptNumber || '') +
|
||||||
"<br />" +
|
'<br />' +
|
||||||
"<small>" +
|
'<small>' +
|
||||||
cityssm.escapeHTML(lotOccupancyTransaction.transactionNote || "") +
|
cityssm.escapeHTML(lotOccupancyTransaction.transactionNote || '') +
|
||||||
"</small>" +
|
'</small>' +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
('<td class="has-text-right">$' +
|
('<td class="has-text-right">$' +
|
||||||
lotOccupancyTransaction.transactionAmount.toFixed(2) +
|
lotOccupancyTransaction.transactionAmount.toFixed(2) +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
('<td class="is-hidden-print">' +
|
('<td class="is-hidden-print">' +
|
||||||
'<button class="button is-small is-danger is-light" data-tooltip="Delete Transaction" type="button">' +
|
'<button class="button is-small is-danger is-light" data-tooltip="Delete Transaction" type="button">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</td>");
|
'</td>');
|
||||||
tableRowElement
|
tableRowElement
|
||||||
.querySelector("button")
|
.querySelector('button')
|
||||||
.addEventListener("click", deleteLotOccupancyTransaction);
|
.addEventListener('click', deleteLotOccupancyTransaction);
|
||||||
lotOccupancyTransactionsContainerElement.querySelector("tbody").append(tableRowElement);
|
lotOccupancyTransactionsContainerElement
|
||||||
|
.querySelector('tbody')
|
||||||
|
.append(tableRowElement);
|
||||||
}
|
}
|
||||||
lotOccupancyTransactionsContainerElement.querySelector("#lotOccupancyTransactions--grandTotal").textContent = "$" + transactionGrandTotal.toFixed(2);
|
;
|
||||||
|
lotOccupancyTransactionsContainerElement.querySelector('#lotOccupancyTransactions--grandTotal').textContent = '$' + transactionGrandTotal.toFixed(2);
|
||||||
const feeGrandTotal = getFeeGrandTotal();
|
const feeGrandTotal = getFeeGrandTotal();
|
||||||
if (feeGrandTotal > transactionGrandTotal) {
|
if (feeGrandTotal > transactionGrandTotal) {
|
||||||
lotOccupancyTransactionsContainerElement.insertAdjacentHTML("afterbegin", '<div class="message is-warning">' +
|
lotOccupancyTransactionsContainerElement.insertAdjacentHTML('afterbegin', '<div class="message is-warning">' +
|
||||||
'<div class="message-body">' +
|
'<div class="message-body">' +
|
||||||
'<div class="level">' +
|
'<div class="level">' +
|
||||||
'<div class="level-left"><div class="level-item">Outstanding Balance</div></div>' +
|
'<div class="level-left"><div class="level-item">Outstanding Balance</div></div>' +
|
||||||
'<div class="level-right"><div class="level-item">$' +
|
'<div class="level-right"><div class="level-item">$' +
|
||||||
(feeGrandTotal - transactionGrandTotal).toFixed(2) +
|
(feeGrandTotal - transactionGrandTotal).toFixed(2) +
|
||||||
"</div></div>" +
|
'</div></div>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>");
|
'</div>');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
document.querySelector("#button--addTransaction").addEventListener("click", () => {
|
document
|
||||||
|
.querySelector('#button--addTransaction')
|
||||||
|
.addEventListener('click', () => {
|
||||||
let addCloseModalFunction;
|
let addCloseModalFunction;
|
||||||
const doAddTransaction = (submitEvent) => {
|
const doAddTransaction = (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doAddLotOccupancyTransaction", submitEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doAddLotOccupancyTransaction', submitEvent.currentTarget, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotOccupancyTransactions = responseJSON.lotOccupancyTransactions;
|
lotOccupancyTransactions = responseJSON.lotOccupancyTransactions;
|
||||||
addCloseModalFunction();
|
addCloseModalFunction();
|
||||||
|
|
@ -376,20 +398,20 @@ document.querySelector("#button--addTransaction").addEventListener("click", () =
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Error Adding Transaction",
|
title: 'Error Adding Transaction',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
cityssm.openHtmlModal("lotOccupancy-addTransaction", {
|
cityssm.openHtmlModal('lotOccupancy-addTransaction', {
|
||||||
onshow: (modalElement) => {
|
onshow: (modalElement) => {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement);
|
||||||
modalElement.querySelector("#lotOccupancyTransactionAdd--lotOccupancyId").value = lotOccupancyId.toString();
|
modalElement.querySelector('#lotOccupancyTransactionAdd--lotOccupancyId').value = lotOccupancyId.toString();
|
||||||
const feeGrandTotal = getFeeGrandTotal();
|
const feeGrandTotal = getFeeGrandTotal();
|
||||||
const transactionGrandTotal = getTransactionGrandTotal();
|
const transactionGrandTotal = getTransactionGrandTotal();
|
||||||
const transactionAmountElement = modalElement.querySelector("#lotOccupancyTransactionAdd--transactionAmount");
|
const transactionAmountElement = modalElement.querySelector('#lotOccupancyTransactionAdd--transactionAmount');
|
||||||
transactionAmountElement.min = (-1 * transactionGrandTotal).toFixed(2);
|
transactionAmountElement.min = (-1 * transactionGrandTotal).toFixed(2);
|
||||||
transactionAmountElement.max = Math.max(feeGrandTotal - transactionGrandTotal, 0).toFixed(2);
|
transactionAmountElement.max = Math.max(feeGrandTotal - transactionGrandTotal, 0).toFixed(2);
|
||||||
transactionAmountElement.value = Math.max(feeGrandTotal - transactionGrandTotal, 0).toFixed(2);
|
transactionAmountElement.value = Math.max(feeGrandTotal - transactionGrandTotal, 0).toFixed(2);
|
||||||
|
|
@ -397,7 +419,9 @@ document.querySelector("#button--addTransaction").addEventListener("click", () =
|
||||||
onshown: (modalElement, closeModalFunction) => {
|
onshown: (modalElement, closeModalFunction) => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
addCloseModalFunction = closeModalFunction;
|
addCloseModalFunction = closeModalFunction;
|
||||||
modalElement.querySelector("form").addEventListener("submit", doAddTransaction);
|
modalElement
|
||||||
|
.querySelector('form')
|
||||||
|
.addEventListener('submit', doAddTransaction);
|
||||||
},
|
},
|
||||||
onremoved: () => {
|
onremoved: () => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
|
|
|
||||||
|
|
@ -1,290 +1,306 @@
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||||
|
|
||||||
import type * as globalTypes from "../../types/globalTypes";
|
import type * as globalTypes from '../../types/globalTypes'
|
||||||
import type * as recordTypes from "../../types/recordTypes";
|
import type * as recordTypes from '../../types/recordTypes'
|
||||||
|
|
||||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||||
|
|
||||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal
|
||||||
declare const bulmaJS: BulmaJS;
|
declare const bulmaJS: BulmaJS
|
||||||
|
|
||||||
declare const los: globalTypes.LOS;
|
declare const los: globalTypes.LOS
|
||||||
|
|
||||||
declare const lotOccupancyId: string;
|
declare const lotOccupancyId: string
|
||||||
declare const hasUnsavedChanges: boolean;
|
declare const hasUnsavedChanges: boolean
|
||||||
|
|
||||||
let lotOccupancyFees: recordTypes.LotOccupancyFee[] = exports.lotOccupancyFees;
|
let lotOccupancyFees: recordTypes.LotOccupancyFee[] = exports.lotOccupancyFees
|
||||||
delete exports.lotOccupancyFees;
|
delete exports.lotOccupancyFees
|
||||||
|
|
||||||
const lotOccupancyFeesContainerElement = document.querySelector(
|
const lotOccupancyFeesContainerElement = document.querySelector(
|
||||||
"#container--lotOccupancyFees"
|
'#container--lotOccupancyFees'
|
||||||
) as HTMLElement;
|
) as HTMLElement
|
||||||
|
|
||||||
const getFeeGrandTotal = (): number => {
|
const getFeeGrandTotal = (): number => {
|
||||||
let feeGrandTotal = 0;
|
let feeGrandTotal = 0
|
||||||
|
|
||||||
for (const lotOccupancyFee of lotOccupancyFees) {
|
for (const lotOccupancyFee of lotOccupancyFees) {
|
||||||
feeGrandTotal +=
|
feeGrandTotal +=
|
||||||
(lotOccupancyFee.feeAmount! + lotOccupancyFee.taxAmount!) * lotOccupancyFee.quantity!;
|
(lotOccupancyFee.feeAmount! + lotOccupancyFee.taxAmount!) *
|
||||||
|
lotOccupancyFee.quantity!
|
||||||
}
|
}
|
||||||
|
|
||||||
return feeGrandTotal;
|
return feeGrandTotal
|
||||||
};
|
}
|
||||||
|
|
||||||
const deleteLotOccupancyFee = (clickEvent: Event) => {
|
const deleteLotOccupancyFee = (clickEvent: Event) => {
|
||||||
const feeId = (
|
const feeId = (
|
||||||
(clickEvent.currentTarget as HTMLElement).closest(
|
(clickEvent.currentTarget as HTMLElement).closest(
|
||||||
".container--lotOccupancyFee"
|
'.container--lotOccupancyFee'
|
||||||
) as HTMLElement
|
) as HTMLElement
|
||||||
).dataset.feeId;
|
).dataset.feeId
|
||||||
|
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyFee",
|
los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyFee',
|
||||||
{
|
{
|
||||||
lotOccupancyId,
|
lotOccupancyId,
|
||||||
feeId
|
feeId
|
||||||
},
|
},
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
lotOccupancyFees?: recordTypes.LotOccupancyFee[];
|
lotOccupancyFees?: recordTypes.LotOccupancyFee[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotOccupancyFees = responseJSON.lotOccupancyFees!;
|
lotOccupancyFees = responseJSON.lotOccupancyFees!
|
||||||
renderLotOccupancyFees();
|
renderLotOccupancyFees()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Deleting Fee",
|
title: 'Error Deleting Fee',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete Fee",
|
title: 'Delete Fee',
|
||||||
message: "Are you sure you want to delete this fee?",
|
message: 'Are you sure you want to delete this fee?',
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete Fee",
|
text: 'Yes, Delete Fee',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
};
|
}
|
||||||
|
|
||||||
const renderLotOccupancyFees = () => {
|
const renderLotOccupancyFees = () => {
|
||||||
if (lotOccupancyFees.length === 0) {
|
if (lotOccupancyFees.length === 0) {
|
||||||
lotOccupancyFeesContainerElement.innerHTML =
|
lotOccupancyFeesContainerElement.innerHTML =
|
||||||
'<div class="message is-info">' +
|
'<div class="message is-info">' +
|
||||||
'<p class="message-body">There are no fees associated with this record.</p>' +
|
'<p class="message-body">There are no fees associated with this record.</p>' +
|
||||||
"</div>";
|
'</div>'
|
||||||
|
|
||||||
renderLotOccupancyTransactions();
|
renderLotOccupancyTransactions()
|
||||||
|
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
lotOccupancyFeesContainerElement.innerHTML =
|
lotOccupancyFeesContainerElement.innerHTML =
|
||||||
'<table class="table is-fullwidth is-striped is-hoverable">' +
|
'<table class="table is-fullwidth is-striped is-hoverable">' +
|
||||||
("<thead><tr>" +
|
('<thead><tr>' +
|
||||||
"<th>Fee</th>" +
|
'<th>Fee</th>' +
|
||||||
'<th><span class="is-sr-only">Unit Cost</span></th>' +
|
'<th><span class="is-sr-only">Unit Cost</span></th>' +
|
||||||
'<th class="has-width-1"><span class="is-sr-only">×</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">Quantity</span></th>' +
|
||||||
'<th class="has-width-1"><span class="is-sr-only">equals</span></th>' +
|
'<th class="has-width-1"><span class="is-sr-only">equals</span></th>' +
|
||||||
'<th class="has-width-1 has-text-right">Total</th>' +
|
'<th class="has-width-1 has-text-right">Total</th>' +
|
||||||
'<th class="has-width-1 is-hidden-print"><span class="is-sr-only">Options</span></th>' +
|
'<th class="has-width-1 is-hidden-print"><span class="is-sr-only">Options</span></th>' +
|
||||||
"</tr></thead>") +
|
'</tr></thead>') +
|
||||||
"<tbody></tbody>" +
|
'<tbody></tbody>' +
|
||||||
("<tfoot>" +
|
('<tfoot>' +
|
||||||
'<tr><th colspan="5">Subtotal</th><td class="has-text-weight-bold has-text-right" id="lotOccupancyFees--feeAmountTotal"></td><td class="is-hidden-print"></td></tr>' +
|
'<tr><th colspan="5">Subtotal</th><td class="has-text-weight-bold has-text-right" id="lotOccupancyFees--feeAmountTotal"></td><td class="is-hidden-print"></td></tr>' +
|
||||||
'<tr><th colspan="5">Tax</th><td class="has-text-right" id="lotOccupancyFees--taxAmountTotal"></td><td class="is-hidden-print"></td></tr>' +
|
'<tr><th colspan="5">Tax</th><td class="has-text-right" id="lotOccupancyFees--taxAmountTotal"></td><td class="is-hidden-print"></td></tr>' +
|
||||||
'<tr><th colspan="5">Grand Total</th><td class="has-text-weight-bold has-text-right" id="lotOccupancyFees--grandTotal"></td><td class="is-hidden-print"></td></tr>' +
|
'<tr><th colspan="5">Grand Total</th><td class="has-text-weight-bold has-text-right" id="lotOccupancyFees--grandTotal"></td><td class="is-hidden-print"></td></tr>' +
|
||||||
"</tfoot>") +
|
'</tfoot>') +
|
||||||
"</table>";
|
'</table>'
|
||||||
|
|
||||||
let feeAmountTotal = 0;
|
let feeAmountTotal = 0
|
||||||
let taxAmountTotal = 0;
|
let taxAmountTotal = 0
|
||||||
|
|
||||||
for (const lotOccupancyFee of lotOccupancyFees) {
|
for (const lotOccupancyFee of lotOccupancyFees) {
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement('tr')
|
||||||
tableRowElement.className = "container--lotOccupancyFee";
|
tableRowElement.className = 'container--lotOccupancyFee'
|
||||||
tableRowElement.dataset.feeId = lotOccupancyFee.feeId!.toString();
|
tableRowElement.dataset.feeId = lotOccupancyFee.feeId!.toString()
|
||||||
tableRowElement.dataset.includeQuantity = lotOccupancyFee.includeQuantity ? "1" : "0";
|
tableRowElement.dataset.includeQuantity = lotOccupancyFee.includeQuantity
|
||||||
|
? '1'
|
||||||
|
: '0'
|
||||||
|
|
||||||
tableRowElement.innerHTML =
|
tableRowElement.innerHTML =
|
||||||
'<td colspan="' +
|
'<td colspan="' +
|
||||||
(lotOccupancyFee.quantity === 1 ? "5" : "1") +
|
(lotOccupancyFee.quantity === 1 ? '5' : '1') +
|
||||||
'">' +
|
'">' +
|
||||||
cityssm.escapeHTML(lotOccupancyFee.feeName || "") +
|
cityssm.escapeHTML(lotOccupancyFee.feeName || '') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
(lotOccupancyFee.quantity === 1
|
(lotOccupancyFee.quantity === 1
|
||||||
? ""
|
? ''
|
||||||
: '<td class="has-text-right">$' +
|
: '<td class="has-text-right">$' +
|
||||||
lotOccupancyFee.feeAmount!.toFixed(2) +
|
lotOccupancyFee.feeAmount!.toFixed(2) +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
"<td>×</td>" +
|
'<td>×</td>' +
|
||||||
'<td class="has-text-right">' +
|
'<td class="has-text-right">' +
|
||||||
lotOccupancyFee.quantity +
|
lotOccupancyFee.quantity +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
"<td>=</td>") +
|
'<td>=</td>') +
|
||||||
'<td class="has-text-right">$' +
|
'<td class="has-text-right">$' +
|
||||||
(lotOccupancyFee.feeAmount! * lotOccupancyFee.quantity!).toFixed(2) +
|
(lotOccupancyFee.feeAmount! * lotOccupancyFee.quantity!).toFixed(2) +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
('<td class="is-hidden-print">' +
|
('<td class="is-hidden-print">' +
|
||||||
'<button class="button is-small is-danger is-light" data-tooltip="Delete Fee" type="button">' +
|
'<button class="button is-small is-danger is-light" data-tooltip="Delete Fee" type="button">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</td>");
|
'</td>')
|
||||||
|
|
||||||
tableRowElement.querySelector("button")!.addEventListener("click", deleteLotOccupancyFee);
|
tableRowElement
|
||||||
|
.querySelector('button')!
|
||||||
|
.addEventListener('click', deleteLotOccupancyFee)
|
||||||
|
|
||||||
lotOccupancyFeesContainerElement.querySelector("tbody")!.append(tableRowElement);
|
lotOccupancyFeesContainerElement
|
||||||
|
.querySelector('tbody')!
|
||||||
|
.append(tableRowElement)
|
||||||
|
|
||||||
feeAmountTotal += lotOccupancyFee.feeAmount! * lotOccupancyFee.quantity!;
|
feeAmountTotal += lotOccupancyFee.feeAmount! * lotOccupancyFee.quantity!
|
||||||
taxAmountTotal += lotOccupancyFee.taxAmount! * lotOccupancyFee.quantity!;
|
taxAmountTotal += lotOccupancyFee.taxAmount! * lotOccupancyFee.quantity!
|
||||||
}
|
}
|
||||||
|
|
||||||
(
|
;(
|
||||||
lotOccupancyFeesContainerElement.querySelector(
|
lotOccupancyFeesContainerElement.querySelector(
|
||||||
"#lotOccupancyFees--feeAmountTotal"
|
'#lotOccupancyFees--feeAmountTotal'
|
||||||
) as HTMLElement
|
) as HTMLElement
|
||||||
).textContent = "$" + feeAmountTotal.toFixed(2);
|
).textContent = '$' + feeAmountTotal.toFixed(2)
|
||||||
(
|
;(
|
||||||
lotOccupancyFeesContainerElement.querySelector(
|
lotOccupancyFeesContainerElement.querySelector(
|
||||||
"#lotOccupancyFees--taxAmountTotal"
|
'#lotOccupancyFees--taxAmountTotal'
|
||||||
) as HTMLElement
|
) as HTMLElement
|
||||||
).textContent = "$" + taxAmountTotal.toFixed(2);
|
).textContent = '$' + taxAmountTotal.toFixed(2)
|
||||||
(
|
;(
|
||||||
lotOccupancyFeesContainerElement.querySelector(
|
lotOccupancyFeesContainerElement.querySelector(
|
||||||
"#lotOccupancyFees--grandTotal"
|
'#lotOccupancyFees--grandTotal'
|
||||||
) as HTMLElement
|
) 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) {
|
if (hasUnsavedChanges) {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: "Please save all unsaved changes before adding fees.",
|
message: 'Please save all unsaved changes before adding fees.',
|
||||||
contextualColorName: "warning"
|
contextualColorName: 'warning'
|
||||||
});
|
})
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
let feeCategories: recordTypes.FeeCategory[];
|
let feeCategories: recordTypes.FeeCategory[]
|
||||||
|
|
||||||
let feeFilterElement: HTMLInputElement;
|
let feeFilterElement: HTMLInputElement
|
||||||
let feeFilterResultsElement: HTMLElement;
|
let feeFilterResultsElement: HTMLElement
|
||||||
|
|
||||||
const doAddFee = (feeId: number, quantity: number | string = 1) => {
|
const doAddFee = (feeId: number, quantity: number | string = 1) => {
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/lotOccupancies/doAddLotOccupancyFee",
|
los.urlPrefix + '/lotOccupancies/doAddLotOccupancyFee',
|
||||||
{
|
{
|
||||||
lotOccupancyId,
|
lotOccupancyId,
|
||||||
feeId,
|
feeId,
|
||||||
quantity
|
quantity
|
||||||
},
|
},
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
lotOccupancyFees?: recordTypes.LotOccupancyFee[];
|
lotOccupancyFees?: recordTypes.LotOccupancyFee[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotOccupancyFees = responseJSON.lotOccupancyFees!;
|
lotOccupancyFees = responseJSON.lotOccupancyFees!
|
||||||
renderLotOccupancyFees();
|
renderLotOccupancyFees()
|
||||||
filterFees();
|
filterFees()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Adding Fee",
|
title: 'Error Adding Fee',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
const doSetQuantityAndAddFee = (fee: recordTypes.Fee) => {
|
const doSetQuantityAndAddFee = (fee: recordTypes.Fee) => {
|
||||||
let quantityElement: HTMLInputElement;
|
let quantityElement: HTMLInputElement
|
||||||
let quantityCloseModalFunction: () => void;
|
let quantityCloseModalFunction: () => void
|
||||||
|
|
||||||
const doSetQuantity = (submitEvent: SubmitEvent) => {
|
const doSetQuantity = (submitEvent: SubmitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault()
|
||||||
doAddFee(fee.feeId!, quantityElement.value);
|
doAddFee(fee.feeId!, quantityElement.value)
|
||||||
quantityCloseModalFunction();
|
quantityCloseModalFunction()
|
||||||
};
|
}
|
||||||
|
|
||||||
cityssm.openHtmlModal("lotOccupancy-setFeeQuantity", {
|
cityssm.openHtmlModal('lotOccupancy-setFeeQuantity', {
|
||||||
onshow: (modalElement) => {
|
onshow: (modalElement) => {
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#lotOccupancyFeeQuantity--quantityUnit"
|
'#lotOccupancyFeeQuantity--quantityUnit'
|
||||||
) as HTMLElement
|
) as HTMLElement
|
||||||
).textContent = fee.quantityUnit!;
|
).textContent = fee.quantityUnit!
|
||||||
},
|
},
|
||||||
onshown: (modalElement, closeModalFunction) => {
|
onshown: (modalElement, closeModalFunction) => {
|
||||||
quantityCloseModalFunction = closeModalFunction;
|
quantityCloseModalFunction = closeModalFunction
|
||||||
|
|
||||||
quantityElement = modalElement.querySelector(
|
quantityElement = modalElement.querySelector(
|
||||||
"#lotOccupancyFeeQuantity--quantity"
|
'#lotOccupancyFeeQuantity--quantity'
|
||||||
) as HTMLInputElement;
|
) as HTMLInputElement
|
||||||
|
|
||||||
modalElement.querySelector("form")!.addEventListener("submit", doSetQuantity);
|
modalElement
|
||||||
|
.querySelector('form')!
|
||||||
|
.addEventListener('submit', doSetQuantity)
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const tryAddFee = (clickEvent: Event) => {
|
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(
|
const feeCategoryId = Number.parseInt(
|
||||||
(
|
(
|
||||||
(clickEvent.currentTarget as HTMLElement).closest(
|
(clickEvent.currentTarget as HTMLElement).closest(
|
||||||
".container--feeCategory"
|
'.container--feeCategory'
|
||||||
) as HTMLElement
|
) as HTMLElement
|
||||||
).dataset.feeCategoryId!,
|
).dataset.feeCategoryId!,
|
||||||
10
|
10
|
||||||
);
|
)
|
||||||
|
|
||||||
const feeCategory = feeCategories.find((currentFeeCategory) => {
|
const feeCategory = feeCategories.find((currentFeeCategory) => {
|
||||||
return currentFeeCategory.feeCategoryId === feeCategoryId;
|
return currentFeeCategory.feeCategoryId === feeCategoryId
|
||||||
})!;
|
})!
|
||||||
|
|
||||||
const fee = feeCategory.fees!.find((currentFee) => {
|
const fee = feeCategory.fees!.find((currentFee) => {
|
||||||
return currentFee.feeId === feeId;
|
return currentFee.feeId === feeId
|
||||||
})!;
|
})!
|
||||||
|
|
||||||
if (fee.includeQuantity) {
|
if (fee.includeQuantity) {
|
||||||
doSetQuantityAndAddFee(fee);
|
doSetQuantityAndAddFee(fee)
|
||||||
} else {
|
} else {
|
||||||
doAddFee(feeId);
|
doAddFee(feeId)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
const filterFees = () => {
|
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) {
|
for (const feeCategory of feeCategories) {
|
||||||
const categoryContainerElement = document.createElement("div");
|
const categoryContainerElement = document.createElement('div')
|
||||||
categoryContainerElement.className = "container--feeCategory";
|
categoryContainerElement.className = 'container--feeCategory'
|
||||||
categoryContainerElement.dataset.feeCategoryId = feeCategory.feeCategoryId!.toString();
|
categoryContainerElement.dataset.feeCategoryId =
|
||||||
|
feeCategory.feeCategoryId!.toString()
|
||||||
categoryContainerElement.innerHTML =
|
categoryContainerElement.innerHTML =
|
||||||
'<h4 class="title is-5 mt-2">' +
|
'<h4 class="title is-5 mt-2">' +
|
||||||
cityssm.escapeHTML(feeCategory.feeCategory || "") +
|
cityssm.escapeHTML(feeCategory.feeCategory || '') +
|
||||||
"</h4>" +
|
'</h4>' +
|
||||||
'<div class="panel mb-5"></div>';
|
'<div class="panel mb-5"></div>'
|
||||||
|
|
||||||
let hasFees = false;
|
let hasFees = false
|
||||||
|
|
||||||
for (const fee of feeCategory.fees!) {
|
for (const fee of feeCategory.fees!) {
|
||||||
if (
|
if (
|
||||||
|
|
@ -294,309 +310,319 @@ document.querySelector("#button--addFee")!.addEventListener("click", () => {
|
||||||
"'][data-include-quantity='0']"
|
"'][data-include-quantity='0']"
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
continue;
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
let includeFee = true;
|
let includeFee = true
|
||||||
|
|
||||||
for (const filterStringPiece of filterStringPieces) {
|
for (const filterStringPiece of filterStringPieces) {
|
||||||
if (!fee.feeName!.toLowerCase().includes(filterStringPiece)) {
|
if (!fee.feeName!.toLowerCase().includes(filterStringPiece)) {
|
||||||
includeFee = false;
|
includeFee = false
|
||||||
break;
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!includeFee) {
|
if (!includeFee) {
|
||||||
continue;
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
hasFees = true;
|
hasFees = true
|
||||||
|
|
||||||
const panelBlockElement = document.createElement("a");
|
const panelBlockElement = document.createElement('a')
|
||||||
panelBlockElement.className = "panel-block is-block container--fee";
|
panelBlockElement.className = 'panel-block is-block container--fee'
|
||||||
panelBlockElement.dataset.feeId = fee.feeId!.toString();
|
panelBlockElement.dataset.feeId = fee.feeId!.toString()
|
||||||
panelBlockElement.href = "#";
|
panelBlockElement.href = '#'
|
||||||
|
|
||||||
panelBlockElement.innerHTML =
|
panelBlockElement.innerHTML =
|
||||||
"<strong>" +
|
'<strong>' +
|
||||||
cityssm.escapeHTML(fee.feeName || "") +
|
cityssm.escapeHTML(fee.feeName || '') +
|
||||||
"</strong><br />" +
|
'</strong><br />' +
|
||||||
"<small>" +
|
'<small>' +
|
||||||
cityssm.escapeHTML(fee.feeDescription || "").replace(/\n/g, "<br />") +
|
cityssm
|
||||||
"</small>";
|
.escapeHTML(fee.feeDescription || '')
|
||||||
|
.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) {
|
if (hasFees) {
|
||||||
feeFilterResultsElement.append(categoryContainerElement);
|
feeFilterResultsElement.append(categoryContainerElement)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
cityssm.openHtmlModal("lotOccupancy-addFee", {
|
cityssm.openHtmlModal('lotOccupancy-addFee', {
|
||||||
onshow: (modalElement) => {
|
onshow: (modalElement) => {
|
||||||
feeFilterElement = modalElement.querySelector(
|
feeFilterElement = modalElement.querySelector(
|
||||||
"#feeSelect--feeName"
|
'#feeSelect--feeName'
|
||||||
) as HTMLInputElement;
|
) as HTMLInputElement
|
||||||
|
|
||||||
feeFilterResultsElement = modalElement.querySelector(
|
feeFilterResultsElement = modalElement.querySelector(
|
||||||
"#resultsContainer--feeSelect"
|
'#resultsContainer--feeSelect'
|
||||||
) as HTMLElement;
|
) as HTMLElement
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/lotOccupancies/doGetFees",
|
los.urlPrefix + '/lotOccupancies/doGetFees',
|
||||||
{
|
{
|
||||||
lotOccupancyId
|
lotOccupancyId
|
||||||
},
|
},
|
||||||
(responseJSON: { feeCategories: recordTypes.FeeCategory[] }) => {
|
(responseJSON: { feeCategories: recordTypes.FeeCategory[] }) => {
|
||||||
feeCategories = responseJSON.feeCategories;
|
feeCategories = responseJSON.feeCategories
|
||||||
|
|
||||||
feeFilterElement.disabled = false;
|
feeFilterElement.disabled = false
|
||||||
feeFilterElement.addEventListener("keyup", filterFees);
|
feeFilterElement.addEventListener('keyup', filterFees)
|
||||||
feeFilterElement.focus();
|
feeFilterElement.focus()
|
||||||
|
|
||||||
filterFees();
|
filterFees()
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
},
|
},
|
||||||
onshown: () => {
|
onshown: () => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
},
|
},
|
||||||
onhidden: () => {
|
onhidden: () => {
|
||||||
renderLotOccupancyFees();
|
renderLotOccupancyFees()
|
||||||
},
|
},
|
||||||
onremoved: () => {
|
onremoved: () => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
|
|
||||||
let lotOccupancyTransactions: recordTypes.LotOccupancyTransaction[] =
|
let lotOccupancyTransactions: recordTypes.LotOccupancyTransaction[] =
|
||||||
exports.lotOccupancyTransactions;
|
exports.lotOccupancyTransactions
|
||||||
delete exports.lotOccupancyTransactions;
|
delete exports.lotOccupancyTransactions
|
||||||
|
|
||||||
const lotOccupancyTransactionsContainerElement = document.querySelector(
|
const lotOccupancyTransactionsContainerElement = document.querySelector(
|
||||||
"#container--lotOccupancyTransactions"
|
'#container--lotOccupancyTransactions'
|
||||||
) as HTMLElement;
|
) as HTMLElement
|
||||||
|
|
||||||
const getTransactionGrandTotal = (): number => {
|
const getTransactionGrandTotal = (): number => {
|
||||||
let transactionGrandTotal = 0;
|
let transactionGrandTotal = 0
|
||||||
|
|
||||||
for (const lotOccupancyTransaction of lotOccupancyTransactions) {
|
for (const lotOccupancyTransaction of lotOccupancyTransactions) {
|
||||||
transactionGrandTotal += lotOccupancyTransaction.transactionAmount;
|
transactionGrandTotal += lotOccupancyTransaction.transactionAmount
|
||||||
}
|
}
|
||||||
|
|
||||||
return transactionGrandTotal;
|
return transactionGrandTotal
|
||||||
};
|
}
|
||||||
|
|
||||||
const deleteLotOccupancyTransaction = (clickEvent: Event) => {
|
const deleteLotOccupancyTransaction = (clickEvent: Event) => {
|
||||||
const transactionIndex = (
|
const transactionIndex = (
|
||||||
(clickEvent.currentTarget as HTMLElement).closest(
|
(clickEvent.currentTarget as HTMLElement).closest(
|
||||||
".container--lotOccupancyTransaction"
|
'.container--lotOccupancyTransaction'
|
||||||
) as HTMLElement
|
) as HTMLElement
|
||||||
).dataset.transactionIndex;
|
).dataset.transactionIndex
|
||||||
|
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyTransaction",
|
los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyTransaction',
|
||||||
{
|
{
|
||||||
lotOccupancyId,
|
lotOccupancyId,
|
||||||
transactionIndex
|
transactionIndex
|
||||||
},
|
},
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
lotOccupancyTransactions?: recordTypes.LotOccupancyTransaction[];
|
lotOccupancyTransactions?: recordTypes.LotOccupancyTransaction[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotOccupancyTransactions = responseJSON.lotOccupancyTransactions!;
|
lotOccupancyTransactions = responseJSON.lotOccupancyTransactions!
|
||||||
renderLotOccupancyTransactions();
|
renderLotOccupancyTransactions()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Deleting Transaction",
|
title: 'Error Deleting Transaction',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete Trasnaction",
|
title: 'Delete Trasnaction',
|
||||||
message: "Are you sure you want to delete this transaction?",
|
message: 'Are you sure you want to delete this transaction?',
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete Transaction",
|
text: 'Yes, Delete Transaction',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
};
|
}
|
||||||
|
|
||||||
const renderLotOccupancyTransactions = () => {
|
const renderLotOccupancyTransactions = () => {
|
||||||
if (lotOccupancyTransactions.length === 0) {
|
if (lotOccupancyTransactions.length === 0) {
|
||||||
lotOccupancyTransactionsContainerElement.innerHTML =
|
lotOccupancyTransactionsContainerElement.innerHTML =
|
||||||
'<div class="message ' +
|
'<div class="message ' +
|
||||||
(lotOccupancyFees.length === 0 ? "is-info" : "is-warning") +
|
(lotOccupancyFees.length === 0 ? 'is-info' : 'is-warning') +
|
||||||
'">' +
|
'">' +
|
||||||
'<p class="message-body">There are no transactions associated with this record.</p>' +
|
'<p class="message-body">There are no transactions associated with this record.</p>' +
|
||||||
"</div>";
|
'</div>'
|
||||||
|
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
lotOccupancyTransactionsContainerElement.innerHTML =
|
lotOccupancyTransactionsContainerElement.innerHTML =
|
||||||
'<table class="table is-fullwidth is-striped is-hoverable">' +
|
'<table class="table is-fullwidth is-striped is-hoverable">' +
|
||||||
"<thead><tr>" +
|
'<thead><tr>' +
|
||||||
'<th class="has-width-1">Date</th>' +
|
'<th class="has-width-1">Date</th>' +
|
||||||
"<th>" +
|
'<th>' +
|
||||||
cityssm.escapeHTML(exports.aliases.externalReceiptNumber) +
|
cityssm.escapeHTML(exports.aliases.externalReceiptNumber) +
|
||||||
"</th>" +
|
'</th>' +
|
||||||
'<th class="has-text-right has-width-1">Amount</th>' +
|
'<th class="has-text-right has-width-1">Amount</th>' +
|
||||||
'<th class="has-width-1 is-hidden-print"><span class="is-sr-only">Options</span></th>' +
|
'<th class="has-width-1 is-hidden-print"><span class="is-sr-only">Options</span></th>' +
|
||||||
"</tr></thead>" +
|
'</tr></thead>' +
|
||||||
"<tbody></tbody>" +
|
'<tbody></tbody>' +
|
||||||
("<tfoot><tr>" +
|
('<tfoot><tr>' +
|
||||||
'<th colspan="2">Transaction Total</th>' +
|
'<th colspan="2">Transaction Total</th>' +
|
||||||
'<td class="has-text-weight-bold has-text-right" id="lotOccupancyTransactions--grandTotal"></td>' +
|
'<td class="has-text-weight-bold has-text-right" id="lotOccupancyTransactions--grandTotal"></td>' +
|
||||||
'<td class="is-hidden-print"></td>' +
|
'<td class="is-hidden-print"></td>' +
|
||||||
"</tr></tfoot>") +
|
'</tr></tfoot>') +
|
||||||
"</table>";
|
'</table>'
|
||||||
|
|
||||||
let transactionGrandTotal = 0;
|
let transactionGrandTotal = 0
|
||||||
|
|
||||||
for (const lotOccupancyTransaction of lotOccupancyTransactions) {
|
for (const lotOccupancyTransaction of lotOccupancyTransactions) {
|
||||||
transactionGrandTotal += lotOccupancyTransaction.transactionAmount;
|
transactionGrandTotal += lotOccupancyTransaction.transactionAmount
|
||||||
|
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement('tr')
|
||||||
tableRowElement.className = "container--lotOccupancyTransaction";
|
tableRowElement.className = 'container--lotOccupancyTransaction'
|
||||||
tableRowElement.dataset.transactionIndex =
|
tableRowElement.dataset.transactionIndex =
|
||||||
lotOccupancyTransaction.transactionIndex!.toString();
|
lotOccupancyTransaction.transactionIndex!.toString()
|
||||||
|
|
||||||
tableRowElement.innerHTML =
|
tableRowElement.innerHTML =
|
||||||
"<td>" +
|
'<td>' +
|
||||||
lotOccupancyTransaction.transactionDateString +
|
lotOccupancyTransaction.transactionDateString +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
cityssm.escapeHTML(lotOccupancyTransaction.externalReceiptNumber || "") +
|
cityssm.escapeHTML(
|
||||||
"<br />" +
|
lotOccupancyTransaction.externalReceiptNumber || ''
|
||||||
"<small>" +
|
) +
|
||||||
cityssm.escapeHTML(lotOccupancyTransaction.transactionNote || "") +
|
'<br />' +
|
||||||
"</small>" +
|
'<small>' +
|
||||||
"</td>") +
|
cityssm.escapeHTML(lotOccupancyTransaction.transactionNote || '') +
|
||||||
|
'</small>' +
|
||||||
|
'</td>') +
|
||||||
('<td class="has-text-right">$' +
|
('<td class="has-text-right">$' +
|
||||||
lotOccupancyTransaction.transactionAmount.toFixed(2) +
|
lotOccupancyTransaction.transactionAmount.toFixed(2) +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
('<td class="is-hidden-print">' +
|
('<td class="is-hidden-print">' +
|
||||||
'<button class="button is-small is-danger is-light" data-tooltip="Delete Transaction" type="button">' +
|
'<button class="button is-small is-danger is-light" data-tooltip="Delete Transaction" type="button">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</td>");
|
'</td>')
|
||||||
|
|
||||||
tableRowElement
|
tableRowElement
|
||||||
.querySelector("button")!
|
.querySelector('button')!
|
||||||
.addEventListener("click", deleteLotOccupancyTransaction);
|
.addEventListener('click', deleteLotOccupancyTransaction)
|
||||||
|
|
||||||
lotOccupancyTransactionsContainerElement.querySelector("tbody")!.append(tableRowElement);
|
lotOccupancyTransactionsContainerElement
|
||||||
|
.querySelector('tbody')!
|
||||||
|
.append(tableRowElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
(
|
;(
|
||||||
lotOccupancyTransactionsContainerElement.querySelector(
|
lotOccupancyTransactionsContainerElement.querySelector(
|
||||||
"#lotOccupancyTransactions--grandTotal"
|
'#lotOccupancyTransactions--grandTotal'
|
||||||
) as HTMLElement
|
) as HTMLElement
|
||||||
).textContent = "$" + transactionGrandTotal.toFixed(2);
|
).textContent = '$' + transactionGrandTotal.toFixed(2)
|
||||||
|
|
||||||
const feeGrandTotal = getFeeGrandTotal();
|
const feeGrandTotal = getFeeGrandTotal()
|
||||||
|
|
||||||
if (feeGrandTotal > transactionGrandTotal) {
|
if (feeGrandTotal > transactionGrandTotal) {
|
||||||
lotOccupancyTransactionsContainerElement.insertAdjacentHTML(
|
lotOccupancyTransactionsContainerElement.insertAdjacentHTML(
|
||||||
"afterbegin",
|
'afterbegin',
|
||||||
'<div class="message is-warning">' +
|
'<div class="message is-warning">' +
|
||||||
'<div class="message-body">' +
|
'<div class="message-body">' +
|
||||||
'<div class="level">' +
|
'<div class="level">' +
|
||||||
'<div class="level-left"><div class="level-item">Outstanding Balance</div></div>' +
|
'<div class="level-left"><div class="level-item">Outstanding Balance</div></div>' +
|
||||||
'<div class="level-right"><div class="level-item">$' +
|
'<div class="level-right"><div class="level-item">$' +
|
||||||
(feeGrandTotal - transactionGrandTotal).toFixed(2) +
|
(feeGrandTotal - transactionGrandTotal).toFixed(2) +
|
||||||
"</div></div>" +
|
'</div></div>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>"
|
'</div>'
|
||||||
);
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
document.querySelector("#button--addTransaction")!.addEventListener("click", () => {
|
document
|
||||||
let addCloseModalFunction: () => void;
|
.querySelector('#button--addTransaction')!
|
||||||
|
.addEventListener('click', () => {
|
||||||
|
let addCloseModalFunction: () => void
|
||||||
|
|
||||||
const doAddTransaction = (submitEvent: SubmitEvent) => {
|
const doAddTransaction = (submitEvent: SubmitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault()
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/lotOccupancies/doAddLotOccupancyTransaction",
|
los.urlPrefix + '/lotOccupancies/doAddLotOccupancyTransaction',
|
||||||
submitEvent.currentTarget,
|
submitEvent.currentTarget,
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
lotOccupancyTransactions?: recordTypes.LotOccupancyTransaction[];
|
lotOccupancyTransactions?: recordTypes.LotOccupancyTransaction[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotOccupancyTransactions = responseJSON.lotOccupancyTransactions!;
|
lotOccupancyTransactions = responseJSON.lotOccupancyTransactions!
|
||||||
addCloseModalFunction();
|
addCloseModalFunction()
|
||||||
renderLotOccupancyTransactions();
|
renderLotOccupancyTransactions()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Error Adding Transaction",
|
title: 'Error Adding Transaction',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
cityssm.openHtmlModal("lotOccupancy-addTransaction", {
|
cityssm.openHtmlModal('lotOccupancy-addTransaction', {
|
||||||
onshow: (modalElement) => {
|
onshow: (modalElement) => {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement)
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#lotOccupancyTransactionAdd--lotOccupancyId"
|
'#lotOccupancyTransactionAdd--lotOccupancyId'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value = lotOccupancyId.toString();
|
).value = lotOccupancyId.toString()
|
||||||
|
|
||||||
const feeGrandTotal = getFeeGrandTotal();
|
const feeGrandTotal = getFeeGrandTotal()
|
||||||
const transactionGrandTotal = getTransactionGrandTotal();
|
const transactionGrandTotal = getTransactionGrandTotal()
|
||||||
|
|
||||||
const transactionAmountElement = modalElement.querySelector(
|
const transactionAmountElement = modalElement.querySelector(
|
||||||
"#lotOccupancyTransactionAdd--transactionAmount"
|
'#lotOccupancyTransactionAdd--transactionAmount'
|
||||||
) as HTMLInputElement;
|
) as HTMLInputElement
|
||||||
|
|
||||||
transactionAmountElement.min = (-1 * transactionGrandTotal).toFixed(2);
|
transactionAmountElement.min = (-1 * transactionGrandTotal).toFixed(2)
|
||||||
transactionAmountElement.max = Math.max(
|
transactionAmountElement.max = Math.max(
|
||||||
feeGrandTotal - transactionGrandTotal,
|
feeGrandTotal - transactionGrandTotal,
|
||||||
0
|
0
|
||||||
).toFixed(2);
|
).toFixed(2)
|
||||||
transactionAmountElement.value = Math.max(
|
transactionAmountElement.value = Math.max(
|
||||||
feeGrandTotal - transactionGrandTotal,
|
feeGrandTotal - transactionGrandTotal,
|
||||||
0
|
0
|
||||||
).toFixed(2);
|
).toFixed(2)
|
||||||
},
|
},
|
||||||
onshown: (modalElement, closeModalFunction) => {
|
onshown: (modalElement, closeModalFunction) => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
|
|
||||||
addCloseModalFunction = closeModalFunction;
|
addCloseModalFunction = closeModalFunction
|
||||||
|
|
||||||
modalElement.querySelector("form")!.addEventListener("submit", doAddTransaction);
|
modalElement
|
||||||
|
.querySelector('form')!
|
||||||
|
.addEventListener('submit', doAddTransaction)
|
||||||
},
|
},
|
||||||
onremoved: () => {
|
onremoved: () => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
|
|
||||||
renderLotOccupancyFees();
|
renderLotOccupancyFees()
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,8 @@
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
let lotOccupancyOccupants;
|
let lotOccupancyOccupants;
|
||||||
const openEditLotOccupancyOccupant = (clickEvent) => {
|
const openEditLotOccupancyOccupant = (clickEvent) => {
|
||||||
const lotOccupantIndex = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.lotOccupantIndex, 10);
|
const lotOccupantIndex = Number.parseInt(clickEvent.currentTarget.closest('tr').dataset
|
||||||
|
.lotOccupantIndex, 10);
|
||||||
const lotOccupancyOccupant = lotOccupancyOccupants.find((currentLotOccupancyOccupant) => {
|
const lotOccupancyOccupant = lotOccupancyOccupants.find((currentLotOccupancyOccupant) => {
|
||||||
return currentLotOccupancyOccupant.lotOccupantIndex === lotOccupantIndex;
|
return currentLotOccupancyOccupant.lotOccupantIndex === lotOccupantIndex;
|
||||||
});
|
});
|
||||||
|
|
@ -11,7 +12,7 @@ const openEditLotOccupancyOccupant = (clickEvent) => {
|
||||||
let editCloseModalFunction;
|
let editCloseModalFunction;
|
||||||
const editOccupant = (submitEvent) => {
|
const editOccupant = (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doUpdateLotOccupancyOccupant", editFormElement, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doUpdateLotOccupancyOccupant', editFormElement, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotOccupancyOccupants = responseJSON.lotOccupancyOccupants;
|
lotOccupancyOccupants = responseJSON.lotOccupancyOccupants;
|
||||||
editCloseModalFunction();
|
editCloseModalFunction();
|
||||||
|
|
@ -19,52 +20,55 @@ const openEditLotOccupancyOccupant = (clickEvent) => {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating " + exports.aliases.occupant,
|
title: 'Error Updating ' + exports.aliases.occupant,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
cityssm.openHtmlModal("lotOccupancy-editOccupant", {
|
cityssm.openHtmlModal('lotOccupancy-editOccupant', {
|
||||||
onshow: (modalElement) => {
|
onshow: (modalElement) => {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement);
|
||||||
modalElement.querySelector("#lotOccupancyOccupantEdit--lotOccupancyId").value = lotOccupancyId;
|
modalElement.querySelector('#lotOccupancyOccupantEdit--lotOccupancyId').value = lotOccupancyId;
|
||||||
modalElement.querySelector("#lotOccupancyOccupantEdit--lotOccupantIndex").value = lotOccupantIndex.toString();
|
modalElement.querySelector('#lotOccupancyOccupantEdit--lotOccupantIndex').value = lotOccupantIndex.toString();
|
||||||
const lotOccupantTypeSelectElement = modalElement.querySelector("#lotOccupancyOccupantEdit--lotOccupantTypeId");
|
const lotOccupantTypeSelectElement = modalElement.querySelector('#lotOccupancyOccupantEdit--lotOccupantTypeId');
|
||||||
let lotOccupantTypeSelected = false;
|
let lotOccupantTypeSelected = false;
|
||||||
for (const lotOccupantType of exports.lotOccupantTypes) {
|
for (const lotOccupantType of exports.lotOccupantTypes) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option');
|
||||||
optionElement.value = lotOccupantType.lotOccupantTypeId.toString();
|
optionElement.value = lotOccupantType.lotOccupantTypeId.toString();
|
||||||
optionElement.textContent = lotOccupantType.lotOccupantType;
|
optionElement.textContent = lotOccupantType.lotOccupantType;
|
||||||
if (lotOccupantType.lotOccupantTypeId === lotOccupancyOccupant.lotOccupantTypeId) {
|
if (lotOccupantType.lotOccupantTypeId ===
|
||||||
|
lotOccupancyOccupant.lotOccupantTypeId) {
|
||||||
optionElement.selected = true;
|
optionElement.selected = true;
|
||||||
lotOccupantTypeSelected = true;
|
lotOccupantTypeSelected = true;
|
||||||
}
|
}
|
||||||
lotOccupantTypeSelectElement.append(optionElement);
|
lotOccupantTypeSelectElement.append(optionElement);
|
||||||
}
|
}
|
||||||
if (!lotOccupantTypeSelected) {
|
if (!lotOccupantTypeSelected) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option');
|
||||||
optionElement.value = lotOccupancyOccupant.lotOccupantTypeId.toString();
|
optionElement.value = lotOccupancyOccupant.lotOccupantTypeId.toString();
|
||||||
optionElement.textContent = lotOccupancyOccupant.lotOccupantType;
|
optionElement.textContent =
|
||||||
|
lotOccupancyOccupant.lotOccupantType;
|
||||||
optionElement.selected = true;
|
optionElement.selected = true;
|
||||||
lotOccupantTypeSelectElement.append(optionElement);
|
lotOccupantTypeSelectElement.append(optionElement);
|
||||||
}
|
}
|
||||||
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantName").value = lotOccupancyOccupant.occupantName;
|
;
|
||||||
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantAddress1").value = lotOccupancyOccupant.occupantAddress1;
|
modalElement.querySelector('#lotOccupancyOccupantEdit--occupantName').value = lotOccupancyOccupant.occupantName;
|
||||||
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantAddress2").value = lotOccupancyOccupant.occupantAddress2;
|
modalElement.querySelector('#lotOccupancyOccupantEdit--occupantAddress1').value = lotOccupancyOccupant.occupantAddress1;
|
||||||
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantCity").value = lotOccupancyOccupant.occupantCity;
|
modalElement.querySelector('#lotOccupancyOccupantEdit--occupantAddress2').value = lotOccupancyOccupant.occupantAddress2;
|
||||||
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantProvince").value = lotOccupancyOccupant.occupantProvince;
|
modalElement.querySelector('#lotOccupancyOccupantEdit--occupantCity').value = lotOccupancyOccupant.occupantCity;
|
||||||
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantPostalCode").value = lotOccupancyOccupant.occupantPostalCode;
|
modalElement.querySelector('#lotOccupancyOccupantEdit--occupantProvince').value = lotOccupancyOccupant.occupantProvince;
|
||||||
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantPhoneNumber").value = lotOccupancyOccupant.occupantPhoneNumber;
|
modalElement.querySelector('#lotOccupancyOccupantEdit--occupantPostalCode').value = lotOccupancyOccupant.occupantPostalCode;
|
||||||
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantEmailAddress").value = lotOccupancyOccupant.occupantEmailAddress;
|
modalElement.querySelector('#lotOccupancyOccupantEdit--occupantPhoneNumber').value = lotOccupancyOccupant.occupantPhoneNumber;
|
||||||
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantComment").value = lotOccupancyOccupant.occupantComment;
|
modalElement.querySelector('#lotOccupancyOccupantEdit--occupantEmailAddress').value = lotOccupancyOccupant.occupantEmailAddress;
|
||||||
|
modalElement.querySelector('#lotOccupancyOccupantEdit--occupantComment').value = lotOccupancyOccupant.occupantComment;
|
||||||
},
|
},
|
||||||
onshown: (modalElement, closeModalFunction) => {
|
onshown: (modalElement, closeModalFunction) => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
modalElement.querySelector("#lotOccupancyOccupantEdit--lotOccupantTypeId").focus();
|
modalElement.querySelector('#lotOccupancyOccupantEdit--lotOccupantTypeId').focus();
|
||||||
editFormElement = modalElement.querySelector("form");
|
editFormElement = modalElement.querySelector('form');
|
||||||
editFormElement.addEventListener("submit", editOccupant);
|
editFormElement.addEventListener('submit', editOccupant);
|
||||||
editCloseModalFunction = closeModalFunction;
|
editCloseModalFunction = closeModalFunction;
|
||||||
},
|
},
|
||||||
onremoved: () => {
|
onremoved: () => {
|
||||||
|
|
@ -73,10 +77,9 @@ const openEditLotOccupancyOccupant = (clickEvent) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const deleteLotOccupancyOccupant = (clickEvent) => {
|
const deleteLotOccupancyOccupant = (clickEvent) => {
|
||||||
const lotOccupantIndex = clickEvent.currentTarget.closest("tr").dataset
|
const lotOccupantIndex = clickEvent.currentTarget.closest('tr').dataset.lotOccupantIndex;
|
||||||
.lotOccupantIndex;
|
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyOccupant", {
|
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyOccupant', {
|
||||||
lotOccupancyId,
|
lotOccupancyId,
|
||||||
lotOccupantIndex
|
lotOccupantIndex
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
|
|
@ -86,128 +89,135 @@ const deleteLotOccupancyOccupant = (clickEvent) => {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Removing " + exports.aliases.occupant,
|
title: 'Error Removing ' + exports.aliases.occupant,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Remove " + exports.aliases.occupant + "?",
|
title: 'Remove ' + exports.aliases.occupant + '?',
|
||||||
message: "Are you sure you want to remove this " + exports.aliases.occupant.toLowerCase() + "?",
|
message: 'Are you sure you want to remove this ' +
|
||||||
|
exports.aliases.occupant.toLowerCase() +
|
||||||
|
'?',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Remove " + exports.aliases.occupant,
|
text: 'Yes, Remove ' + exports.aliases.occupant,
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
},
|
},
|
||||||
contextualColorName: "warning"
|
contextualColorName: 'warning'
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const renderLotOccupancyOccupants = () => {
|
const renderLotOccupancyOccupants = () => {
|
||||||
const occupantsContainer = document.querySelector("#container--lotOccupancyOccupants");
|
const occupantsContainer = document.querySelector('#container--lotOccupancyOccupants');
|
||||||
cityssm.clearElement(occupantsContainer);
|
cityssm.clearElement(occupantsContainer);
|
||||||
if (lotOccupancyOccupants.length === 0) {
|
if (lotOccupancyOccupants.length === 0) {
|
||||||
occupantsContainer.innerHTML =
|
occupantsContainer.innerHTML =
|
||||||
'<div class="message is-warning">' +
|
'<div class="message is-warning">' +
|
||||||
'<p class="message-body">There are no ' +
|
'<p class="message-body">There are no ' +
|
||||||
exports.aliases.occupants.toLowerCase() +
|
exports.aliases.occupants.toLowerCase() +
|
||||||
" associated with this record.</p>" +
|
' associated with this record.</p>' +
|
||||||
"</div>";
|
'</div>';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const tableElement = document.createElement("table");
|
const tableElement = document.createElement('table');
|
||||||
tableElement.className = "table is-fullwidth is-striped is-hoverable";
|
tableElement.className = 'table is-fullwidth is-striped is-hoverable';
|
||||||
tableElement.innerHTML =
|
tableElement.innerHTML =
|
||||||
"<thead><tr>" +
|
'<thead><tr>' +
|
||||||
("<th>" + exports.aliases.occupant + "</th>") +
|
('<th>' + exports.aliases.occupant + '</th>') +
|
||||||
"<th>Address</th>" +
|
'<th>Address</th>' +
|
||||||
"<th>Other Contact</th>" +
|
'<th>Other Contact</th>' +
|
||||||
"<th>Comment</th>" +
|
'<th>Comment</th>' +
|
||||||
'<th class="is-hidden-print"><span class="is-sr-only">Options</span></th>' +
|
'<th class="is-hidden-print"><span class="is-sr-only">Options</span></th>' +
|
||||||
"</tr></thead>" +
|
'</tr></thead>' +
|
||||||
"<tbody></tbody>";
|
'<tbody></tbody>';
|
||||||
for (const lotOccupancyOccupant of lotOccupancyOccupants) {
|
for (const lotOccupancyOccupant of lotOccupancyOccupants) {
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement('tr');
|
||||||
tableRowElement.dataset.lotOccupantIndex =
|
tableRowElement.dataset.lotOccupantIndex =
|
||||||
lotOccupancyOccupant.lotOccupantIndex.toString();
|
lotOccupancyOccupant.lotOccupantIndex.toString();
|
||||||
tableRowElement.innerHTML =
|
tableRowElement.innerHTML =
|
||||||
"<td>" +
|
'<td>' +
|
||||||
cityssm.escapeHTML(lotOccupancyOccupant.occupantName || "(No Name)") +
|
cityssm.escapeHTML(lotOccupancyOccupant.occupantName || '(No Name)') +
|
||||||
"<br />" +
|
'<br />' +
|
||||||
('<span class="tag">' +
|
('<span class="tag">' +
|
||||||
'<i class="fas fa-fw fa-' +
|
'<i class="fas fa-fw fa-' +
|
||||||
cityssm.escapeHTML(lotOccupancyOccupant.fontAwesomeIconClass) +
|
cityssm.escapeHTML(lotOccupancyOccupant.fontAwesomeIconClass) +
|
||||||
'" aria-hidden="true"></i>' +
|
'" aria-hidden="true"></i>' +
|
||||||
' <span class="ml-1">' +
|
' <span class="ml-1">' +
|
||||||
cityssm.escapeHTML(lotOccupancyOccupant.lotOccupantType) +
|
cityssm.escapeHTML(lotOccupancyOccupant.lotOccupantType) +
|
||||||
"</span>" +
|
'</span>' +
|
||||||
"</span>") +
|
'</span>') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
(lotOccupancyOccupant.occupantAddress1
|
(lotOccupancyOccupant.occupantAddress1
|
||||||
? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress1) + "<br />"
|
? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress1) + '<br />'
|
||||||
: "") +
|
: '') +
|
||||||
(lotOccupancyOccupant.occupantAddress2
|
(lotOccupancyOccupant.occupantAddress2
|
||||||
? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress2) + "<br />"
|
? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress2) + '<br />'
|
||||||
: "") +
|
: '') +
|
||||||
(lotOccupancyOccupant.occupantCity
|
(lotOccupancyOccupant.occupantCity
|
||||||
? cityssm.escapeHTML(lotOccupancyOccupant.occupantCity) + ", "
|
? cityssm.escapeHTML(lotOccupancyOccupant.occupantCity) + ', '
|
||||||
: "") +
|
: '') +
|
||||||
cityssm.escapeHTML(lotOccupancyOccupant.occupantProvince || "") +
|
cityssm.escapeHTML(lotOccupancyOccupant.occupantProvince || '') +
|
||||||
"<br />" +
|
'<br />' +
|
||||||
cityssm.escapeHTML(lotOccupancyOccupant.occupantPostalCode || "") +
|
cityssm.escapeHTML(lotOccupancyOccupant.occupantPostalCode || '') +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
(lotOccupancyOccupant.occupantPhoneNumber
|
(lotOccupancyOccupant.occupantPhoneNumber
|
||||||
? cityssm.escapeHTML(lotOccupancyOccupant.occupantPhoneNumber) + "<br />"
|
? cityssm.escapeHTML(lotOccupancyOccupant.occupantPhoneNumber) +
|
||||||
: "") +
|
'<br />'
|
||||||
|
: '') +
|
||||||
(lotOccupancyOccupant.occupantEmailAddress
|
(lotOccupancyOccupant.occupantEmailAddress
|
||||||
? cityssm.escapeHTML(lotOccupancyOccupant.occupantEmailAddress)
|
? cityssm.escapeHTML(lotOccupancyOccupant.occupantEmailAddress)
|
||||||
: "") +
|
: '') +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
("<td>" + cityssm.escapeHTML(lotOccupancyOccupant.occupantComment) + "</td>") +
|
('<td>' +
|
||||||
|
cityssm.escapeHTML(lotOccupancyOccupant.occupantComment) +
|
||||||
|
'</td>') +
|
||||||
('<td class="is-hidden-print">' +
|
('<td class="is-hidden-print">' +
|
||||||
'<div class="buttons are-small is-justify-content-end">' +
|
'<div class="buttons are-small is-justify-content-end">' +
|
||||||
('<button class="button is-primary button--edit" type="button">' +
|
('<button class="button is-primary button--edit" type="button">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||||
" <span>Edit</span>" +
|
' <span>Edit</span>' +
|
||||||
"</button>") +
|
'</button>') +
|
||||||
('<button class="button is-light is-danger button--delete" data-tooltip="Delete ' +
|
('<button class="button is-light is-danger button--delete" data-tooltip="Delete ' +
|
||||||
cityssm.escapeHTML(exports.aliases.occupant) +
|
cityssm.escapeHTML(exports.aliases.occupant) +
|
||||||
'" type="button" aria-label="Delete">' +
|
'" type="button" aria-label="Delete">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>") +
|
'</button>') +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</td>");
|
'</td>');
|
||||||
tableRowElement
|
tableRowElement
|
||||||
.querySelector(".button--edit")
|
.querySelector('.button--edit')
|
||||||
.addEventListener("click", openEditLotOccupancyOccupant);
|
.addEventListener('click', openEditLotOccupancyOccupant);
|
||||||
tableRowElement
|
tableRowElement
|
||||||
.querySelector(".button--delete")
|
.querySelector('.button--delete')
|
||||||
.addEventListener("click", deleteLotOccupancyOccupant);
|
.addEventListener('click', deleteLotOccupancyOccupant);
|
||||||
tableElement.querySelector("tbody").append(tableRowElement);
|
tableElement.querySelector('tbody').append(tableRowElement);
|
||||||
}
|
}
|
||||||
occupantsContainer.append(tableElement);
|
occupantsContainer.append(tableElement);
|
||||||
};
|
};
|
||||||
if (isCreate) {
|
if (isCreate) {
|
||||||
const lotOccupantTypeIdElement = document.querySelector("#lotOccupancy--lotOccupantTypeId");
|
const lotOccupantTypeIdElement = document.querySelector('#lotOccupancy--lotOccupantTypeId');
|
||||||
lotOccupantTypeIdElement.addEventListener("change", () => {
|
lotOccupantTypeIdElement.addEventListener('change', () => {
|
||||||
const occupantFields = formElement.querySelectorAll("[data-table='LotOccupancyOccupant']");
|
const occupantFields = formElement.querySelectorAll("[data-table='LotOccupancyOccupant']");
|
||||||
for (const occupantField of occupantFields) {
|
for (const occupantField of occupantFields) {
|
||||||
occupantField.disabled = lotOccupantTypeIdElement.value === "";
|
occupantField.disabled = lotOccupantTypeIdElement.value === '';
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
lotOccupancyOccupants = exports.lotOccupancyOccupants;
|
lotOccupancyOccupants = exports.lotOccupancyOccupants;
|
||||||
delete exports.lotOccupancyOccupants;
|
delete exports.lotOccupancyOccupants;
|
||||||
document.querySelector("#button--addOccupant").addEventListener("click", () => {
|
document
|
||||||
|
.querySelector('#button--addOccupant')
|
||||||
|
.addEventListener('click', () => {
|
||||||
let addCloseModalFunction;
|
let addCloseModalFunction;
|
||||||
let addFormElement;
|
let addFormElement;
|
||||||
let searchFormElement;
|
let searchFormElement;
|
||||||
let searchResultsElement;
|
let searchResultsElement;
|
||||||
const addOccupant = (formOrObject) => {
|
const addOccupant = (formOrObject) => {
|
||||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doAddLotOccupancyOccupant", formOrObject, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doAddLotOccupancyOccupant', formOrObject, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotOccupancyOccupants = responseJSON.lotOccupancyOccupants;
|
lotOccupancyOccupants = responseJSON.lotOccupancyOccupants;
|
||||||
addCloseModalFunction();
|
addCloseModalFunction();
|
||||||
|
|
@ -215,9 +225,9 @@ else {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Adding " + exports.aliases.occupant,
|
title: 'Error Adding ' + exports.aliases.occupant,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -232,15 +242,15 @@ else {
|
||||||
const panelBlockElement = clickEvent.currentTarget;
|
const panelBlockElement = clickEvent.currentTarget;
|
||||||
const occupant = pastOccupantSearchResults[Number.parseInt(panelBlockElement.dataset.index, 10)];
|
const occupant = pastOccupantSearchResults[Number.parseInt(panelBlockElement.dataset.index, 10)];
|
||||||
const lotOccupantTypeId = panelBlockElement
|
const lotOccupantTypeId = panelBlockElement
|
||||||
.closest(".modal")
|
.closest('.modal')
|
||||||
.querySelector("#lotOccupancyOccupantCopy--lotOccupantTypeId").value;
|
.querySelector('#lotOccupancyOccupantCopy--lotOccupantTypeId').value;
|
||||||
if (lotOccupantTypeId === "") {
|
if (lotOccupantTypeId === '') {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "No " + exports.aliases.occupant + " Type Selected",
|
title: 'No ' + exports.aliases.occupant + ' Type Selected',
|
||||||
message: "Select a type to apply to the newly added " +
|
message: 'Select a type to apply to the newly added ' +
|
||||||
exports.aliases.occupant.toLowerCase() +
|
exports.aliases.occupant.toLowerCase() +
|
||||||
".",
|
'.',
|
||||||
contextualColorName: "warning"
|
contextualColorName: 'warning'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
@ -251,83 +261,86 @@ else {
|
||||||
};
|
};
|
||||||
const searchOccupants = (event) => {
|
const searchOccupants = (event) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
if (searchFormElement.querySelector("#lotOccupancyOccupantCopy--searchFilter").value === "") {
|
if (searchFormElement.querySelector('#lotOccupancyOccupantCopy--searchFilter').value === '') {
|
||||||
searchResultsElement.innerHTML =
|
searchResultsElement.innerHTML =
|
||||||
'<div class="message is-info">' +
|
'<div class="message is-info">' +
|
||||||
'<p class="message-body">Enter a partial name or address in the search field above.</p>' +
|
'<p class="message-body">Enter a partial name or address in the search field above.</p>' +
|
||||||
"</div>";
|
'</div>';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
searchResultsElement.innerHTML = los.getLoadingParagraphHTML("Searching...");
|
searchResultsElement.innerHTML =
|
||||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doSearchPastOccupants", searchFormElement, (responseJSON) => {
|
los.getLoadingParagraphHTML('Searching...');
|
||||||
|
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doSearchPastOccupants', searchFormElement, (responseJSON) => {
|
||||||
pastOccupantSearchResults = responseJSON.occupants;
|
pastOccupantSearchResults = responseJSON.occupants;
|
||||||
const panelElement = document.createElement("div");
|
const panelElement = document.createElement('div');
|
||||||
panelElement.className = "panel";
|
panelElement.className = 'panel';
|
||||||
for (const [index, occupant] of pastOccupantSearchResults.entries()) {
|
for (const [index, occupant] of pastOccupantSearchResults.entries()) {
|
||||||
const panelBlockElement = document.createElement("a");
|
const panelBlockElement = document.createElement('a');
|
||||||
panelBlockElement.className = "panel-block is-block";
|
panelBlockElement.className = 'panel-block is-block';
|
||||||
panelBlockElement.dataset.index = index.toString();
|
panelBlockElement.dataset.index = index.toString();
|
||||||
panelBlockElement.innerHTML =
|
panelBlockElement.innerHTML =
|
||||||
"<strong>" +
|
'<strong>' +
|
||||||
cityssm.escapeHTML(occupant.occupantName || "") +
|
cityssm.escapeHTML(occupant.occupantName || '') +
|
||||||
"</strong>" +
|
'</strong>' +
|
||||||
"<br />" +
|
'<br />' +
|
||||||
'<div class="columns">' +
|
'<div class="columns">' +
|
||||||
('<div class="column">' +
|
('<div class="column">' +
|
||||||
cityssm.escapeHTML(occupant.occupantAddress1 || "") +
|
cityssm.escapeHTML(occupant.occupantAddress1 || '') +
|
||||||
"<br />" +
|
'<br />' +
|
||||||
(occupant.occupantAddress2
|
(occupant.occupantAddress2
|
||||||
? cityssm.escapeHTML(occupant.occupantAddress2) + "<br />"
|
? cityssm.escapeHTML(occupant.occupantAddress2) + '<br />'
|
||||||
: "") +
|
: '') +
|
||||||
cityssm.escapeHTML(occupant.occupantCity || "") +
|
cityssm.escapeHTML(occupant.occupantCity || '') +
|
||||||
", " +
|
', ' +
|
||||||
cityssm.escapeHTML(occupant.occupantProvince || "") +
|
cityssm.escapeHTML(occupant.occupantProvince || '') +
|
||||||
"<br />" +
|
'<br />' +
|
||||||
cityssm.escapeHTML(occupant.occupantPostalCode || "") +
|
cityssm.escapeHTML(occupant.occupantPostalCode || '') +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="column">' +
|
('<div class="column">' +
|
||||||
(occupant.occupantPhoneNumber
|
(occupant.occupantPhoneNumber
|
||||||
? cityssm.escapeHTML(occupant.occupantPhoneNumber) + "<br />"
|
? cityssm.escapeHTML(occupant.occupantPhoneNumber) +
|
||||||
: "") +
|
'<br />'
|
||||||
cityssm.escapeHTML(occupant.occupantEmailAddress || "") +
|
: '') +
|
||||||
"<br />" +
|
cityssm.escapeHTML(occupant.occupantEmailAddress || '') +
|
||||||
"</div>") +
|
'<br />' +
|
||||||
"</div>";
|
'</div>') +
|
||||||
panelBlockElement.addEventListener("click", addOccupantFromCopy);
|
'</div>';
|
||||||
|
panelBlockElement.addEventListener('click', addOccupantFromCopy);
|
||||||
panelElement.append(panelBlockElement);
|
panelElement.append(panelBlockElement);
|
||||||
}
|
}
|
||||||
searchResultsElement.innerHTML = "";
|
searchResultsElement.innerHTML = '';
|
||||||
searchResultsElement.append(panelElement);
|
searchResultsElement.append(panelElement);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
cityssm.openHtmlModal("lotOccupancy-addOccupant", {
|
cityssm.openHtmlModal('lotOccupancy-addOccupant', {
|
||||||
onshow: (modalElement) => {
|
onshow: (modalElement) => {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement);
|
||||||
modalElement.querySelector("#lotOccupancyOccupantAdd--lotOccupancyId").value = lotOccupancyId;
|
modalElement.querySelector('#lotOccupancyOccupantAdd--lotOccupancyId').value = lotOccupancyId;
|
||||||
const lotOccupantTypeSelectElement = modalElement.querySelector("#lotOccupancyOccupantAdd--lotOccupantTypeId");
|
const lotOccupantTypeSelectElement = modalElement.querySelector('#lotOccupancyOccupantAdd--lotOccupantTypeId');
|
||||||
const lotOccupantTypeCopySelectElement = modalElement.querySelector("#lotOccupancyOccupantCopy--lotOccupantTypeId");
|
const lotOccupantTypeCopySelectElement = modalElement.querySelector('#lotOccupancyOccupantCopy--lotOccupantTypeId');
|
||||||
for (const lotOccupantType of exports.lotOccupantTypes) {
|
for (const lotOccupantType of exports.lotOccupantTypes) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option');
|
||||||
optionElement.value = lotOccupantType.lotOccupantTypeId.toString();
|
optionElement.value = lotOccupantType.lotOccupantTypeId.toString();
|
||||||
optionElement.textContent = lotOccupantType.lotOccupantType;
|
optionElement.textContent = lotOccupantType.lotOccupantType;
|
||||||
lotOccupantTypeSelectElement.append(optionElement);
|
lotOccupantTypeSelectElement.append(optionElement);
|
||||||
lotOccupantTypeCopySelectElement.append(optionElement.cloneNode(true));
|
lotOccupantTypeCopySelectElement.append(optionElement.cloneNode(true));
|
||||||
}
|
}
|
||||||
modalElement.querySelector("#lotOccupancyOccupantAdd--occupantCity").value = exports.occupantCityDefault;
|
;
|
||||||
modalElement.querySelector("#lotOccupancyOccupantAdd--occupantProvince").value = exports.occupantProvinceDefault;
|
modalElement.querySelector('#lotOccupancyOccupantAdd--occupantCity').value = exports.occupantCityDefault;
|
||||||
|
modalElement.querySelector('#lotOccupancyOccupantAdd--occupantProvince').value = exports.occupantProvinceDefault;
|
||||||
},
|
},
|
||||||
onshown: (modalElement, closeModalFunction) => {
|
onshown: (modalElement, closeModalFunction) => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
bulmaJS.init(modalElement);
|
bulmaJS.init(modalElement);
|
||||||
modalElement.querySelector("#lotOccupancyOccupantAdd--lotOccupantTypeId").focus();
|
modalElement.querySelector('#lotOccupancyOccupantAdd--lotOccupantTypeId').focus();
|
||||||
addFormElement = modalElement.querySelector("#form--lotOccupancyOccupantAdd");
|
addFormElement = modalElement.querySelector('#form--lotOccupancyOccupantAdd');
|
||||||
addFormElement.addEventListener("submit", addOccupantFromForm);
|
addFormElement.addEventListener('submit', addOccupantFromForm);
|
||||||
searchResultsElement = modalElement.querySelector("#lotOccupancyOccupantCopy--searchResults");
|
searchResultsElement = modalElement.querySelector('#lotOccupancyOccupantCopy--searchResults');
|
||||||
searchFormElement = modalElement.querySelector("#form--lotOccupancyOccupantCopy");
|
searchFormElement = modalElement.querySelector('#form--lotOccupancyOccupantCopy');
|
||||||
searchFormElement.addEventListener("submit", (formEvent) => {
|
searchFormElement.addEventListener('submit', (formEvent) => {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault();
|
||||||
});
|
});
|
||||||
modalElement.querySelector("#lotOccupancyOccupantCopy--searchFilter").addEventListener("change", searchOccupants);
|
modalElement.querySelector('#lotOccupancyOccupantCopy--searchFilter').addEventListener('change', searchOccupants);
|
||||||
addCloseModalFunction = closeModalFunction;
|
addCloseModalFunction = closeModalFunction;
|
||||||
},
|
},
|
||||||
onremoved: () => {
|
onremoved: () => {
|
||||||
|
|
|
||||||
|
|
@ -1,558 +1,584 @@
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||||
|
|
||||||
import type * as globalTypes from "../../types/globalTypes";
|
import type * as globalTypes from '../../types/globalTypes'
|
||||||
import type * as recordTypes from "../../types/recordTypes";
|
import type * as recordTypes from '../../types/recordTypes'
|
||||||
|
|
||||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||||
|
|
||||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal
|
||||||
declare const bulmaJS: BulmaJS;
|
declare const bulmaJS: BulmaJS
|
||||||
|
|
||||||
declare const los: globalTypes.LOS;
|
declare const los: globalTypes.LOS
|
||||||
|
|
||||||
declare const lotOccupancyId: string;
|
declare const lotOccupancyId: string
|
||||||
declare const isCreate: boolean;
|
declare const isCreate: boolean
|
||||||
declare const formElement: HTMLFormElement;
|
declare const formElement: HTMLFormElement
|
||||||
|
|
||||||
let lotOccupancyOccupants: recordTypes.LotOccupancyOccupant[];
|
let lotOccupancyOccupants: recordTypes.LotOccupancyOccupant[]
|
||||||
|
|
||||||
const openEditLotOccupancyOccupant = (clickEvent: Event) => {
|
const openEditLotOccupancyOccupant = (clickEvent: Event) => {
|
||||||
const lotOccupantIndex = Number.parseInt(
|
const lotOccupantIndex = Number.parseInt(
|
||||||
(clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.lotOccupantIndex!,
|
(clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset
|
||||||
|
.lotOccupantIndex!,
|
||||||
10
|
10
|
||||||
);
|
)
|
||||||
|
|
||||||
const lotOccupancyOccupant = lotOccupancyOccupants.find((currentLotOccupancyOccupant) => {
|
const lotOccupancyOccupant = lotOccupancyOccupants.find(
|
||||||
return currentLotOccupancyOccupant.lotOccupantIndex === lotOccupantIndex;
|
(currentLotOccupancyOccupant) => {
|
||||||
})!;
|
return currentLotOccupancyOccupant.lotOccupantIndex === lotOccupantIndex
|
||||||
|
}
|
||||||
|
)!
|
||||||
|
|
||||||
let editFormElement: HTMLFormElement;
|
let editFormElement: HTMLFormElement
|
||||||
let editCloseModalFunction: () => void;
|
let editCloseModalFunction: () => void
|
||||||
|
|
||||||
const editOccupant = (submitEvent: SubmitEvent) => {
|
const editOccupant = (submitEvent: SubmitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault()
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/lotOccupancies/doUpdateLotOccupancyOccupant",
|
los.urlPrefix + '/lotOccupancies/doUpdateLotOccupancyOccupant',
|
||||||
editFormElement,
|
editFormElement,
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
lotOccupancyOccupants?: recordTypes.LotOccupancyOccupant[];
|
lotOccupancyOccupants?: recordTypes.LotOccupancyOccupant[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotOccupancyOccupants = responseJSON.lotOccupancyOccupants!;
|
lotOccupancyOccupants = responseJSON.lotOccupancyOccupants!
|
||||||
editCloseModalFunction();
|
editCloseModalFunction()
|
||||||
renderLotOccupancyOccupants();
|
renderLotOccupancyOccupants()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating " + exports.aliases.occupant,
|
title: 'Error Updating ' + exports.aliases.occupant,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
cityssm.openHtmlModal("lotOccupancy-editOccupant", {
|
cityssm.openHtmlModal('lotOccupancy-editOccupant', {
|
||||||
onshow: (modalElement) => {
|
onshow: (modalElement) => {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement)
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#lotOccupancyOccupantEdit--lotOccupancyId"
|
'#lotOccupancyOccupantEdit--lotOccupancyId'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value = lotOccupancyId;
|
).value = lotOccupancyId
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#lotOccupancyOccupantEdit--lotOccupantIndex"
|
'#lotOccupancyOccupantEdit--lotOccupantIndex'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value = lotOccupantIndex.toString();
|
).value = lotOccupantIndex.toString()
|
||||||
|
|
||||||
const lotOccupantTypeSelectElement = modalElement.querySelector(
|
const lotOccupantTypeSelectElement = modalElement.querySelector(
|
||||||
"#lotOccupancyOccupantEdit--lotOccupantTypeId"
|
'#lotOccupancyOccupantEdit--lotOccupantTypeId'
|
||||||
) as HTMLSelectElement;
|
) as HTMLSelectElement
|
||||||
|
|
||||||
let lotOccupantTypeSelected = false;
|
let lotOccupantTypeSelected = false
|
||||||
|
|
||||||
for (const lotOccupantType of exports.lotOccupantTypes as recordTypes.LotOccupantType[]) {
|
for (const lotOccupantType of exports.lotOccupantTypes as recordTypes.LotOccupantType[]) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option')
|
||||||
optionElement.value = lotOccupantType.lotOccupantTypeId.toString();
|
optionElement.value = lotOccupantType.lotOccupantTypeId.toString()
|
||||||
optionElement.textContent = lotOccupantType.lotOccupantType;
|
optionElement.textContent = lotOccupantType.lotOccupantType
|
||||||
|
|
||||||
if (lotOccupantType.lotOccupantTypeId === lotOccupancyOccupant.lotOccupantTypeId) {
|
if (
|
||||||
optionElement.selected = true;
|
lotOccupantType.lotOccupantTypeId ===
|
||||||
lotOccupantTypeSelected = true;
|
lotOccupancyOccupant.lotOccupantTypeId
|
||||||
|
) {
|
||||||
|
optionElement.selected = true
|
||||||
|
lotOccupantTypeSelected = true
|
||||||
}
|
}
|
||||||
|
|
||||||
lotOccupantTypeSelectElement.append(optionElement);
|
lotOccupantTypeSelectElement.append(optionElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!lotOccupantTypeSelected) {
|
if (!lotOccupantTypeSelected) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option')
|
||||||
|
|
||||||
optionElement.value = lotOccupancyOccupant.lotOccupantTypeId!.toString();
|
optionElement.value = lotOccupancyOccupant.lotOccupantTypeId!.toString()
|
||||||
optionElement.textContent = lotOccupancyOccupant.lotOccupantType as string;
|
optionElement.textContent =
|
||||||
optionElement.selected = true;
|
lotOccupancyOccupant.lotOccupantType as string
|
||||||
|
optionElement.selected = true
|
||||||
|
|
||||||
lotOccupantTypeSelectElement.append(optionElement);
|
lotOccupantTypeSelectElement.append(optionElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#lotOccupancyOccupantEdit--occupantName"
|
'#lotOccupancyOccupantEdit--occupantName'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value = lotOccupancyOccupant.occupantName!;
|
).value = lotOccupancyOccupant.occupantName!
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#lotOccupancyOccupantEdit--occupantAddress1"
|
'#lotOccupancyOccupantEdit--occupantAddress1'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value = lotOccupancyOccupant.occupantAddress1!;
|
).value = lotOccupancyOccupant.occupantAddress1!
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#lotOccupancyOccupantEdit--occupantAddress2"
|
'#lotOccupancyOccupantEdit--occupantAddress2'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value = lotOccupancyOccupant.occupantAddress2!;
|
).value = lotOccupancyOccupant.occupantAddress2!
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#lotOccupancyOccupantEdit--occupantCity"
|
'#lotOccupancyOccupantEdit--occupantCity'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value = lotOccupancyOccupant.occupantCity!;
|
).value = lotOccupancyOccupant.occupantCity!
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#lotOccupancyOccupantEdit--occupantProvince"
|
'#lotOccupancyOccupantEdit--occupantProvince'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value = lotOccupancyOccupant.occupantProvince!;
|
).value = lotOccupancyOccupant.occupantProvince!
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#lotOccupancyOccupantEdit--occupantPostalCode"
|
'#lotOccupancyOccupantEdit--occupantPostalCode'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value = lotOccupancyOccupant.occupantPostalCode!;
|
).value = lotOccupancyOccupant.occupantPostalCode!
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#lotOccupancyOccupantEdit--occupantPhoneNumber"
|
'#lotOccupancyOccupantEdit--occupantPhoneNumber'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value = lotOccupancyOccupant.occupantPhoneNumber!;
|
).value = lotOccupancyOccupant.occupantPhoneNumber!
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#lotOccupancyOccupantEdit--occupantEmailAddress"
|
'#lotOccupancyOccupantEdit--occupantEmailAddress'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value = lotOccupancyOccupant.occupantEmailAddress!;
|
).value = lotOccupancyOccupant.occupantEmailAddress!
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#lotOccupancyOccupantEdit--occupantComment"
|
'#lotOccupancyOccupantEdit--occupantComment'
|
||||||
) as HTMLTextAreaElement
|
) as HTMLTextAreaElement
|
||||||
).value = lotOccupancyOccupant.occupantComment!;
|
).value = lotOccupancyOccupant.occupantComment!
|
||||||
},
|
},
|
||||||
onshown: (modalElement, closeModalFunction) => {
|
onshown: (modalElement, closeModalFunction) => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#lotOccupancyOccupantEdit--lotOccupantTypeId"
|
'#lotOccupancyOccupantEdit--lotOccupantTypeId'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).focus();
|
).focus()
|
||||||
|
|
||||||
editFormElement = modalElement.querySelector("form")!;
|
editFormElement = modalElement.querySelector('form')!
|
||||||
editFormElement.addEventListener("submit", editOccupant);
|
editFormElement.addEventListener('submit', editOccupant)
|
||||||
|
|
||||||
editCloseModalFunction = closeModalFunction;
|
editCloseModalFunction = closeModalFunction
|
||||||
},
|
},
|
||||||
onremoved: () => {
|
onremoved: () => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const deleteLotOccupancyOccupant = (clickEvent: Event) => {
|
const deleteLotOccupancyOccupant = (clickEvent: Event) => {
|
||||||
const lotOccupantIndex = (clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset
|
const lotOccupantIndex = (clickEvent.currentTarget as HTMLElement).closest(
|
||||||
.lotOccupantIndex;
|
'tr'
|
||||||
|
)!.dataset.lotOccupantIndex
|
||||||
|
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyOccupant",
|
los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyOccupant',
|
||||||
{
|
{
|
||||||
lotOccupancyId,
|
lotOccupancyId,
|
||||||
lotOccupantIndex
|
lotOccupantIndex
|
||||||
},
|
},
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
lotOccupancyOccupants: recordTypes.LotOccupancyOccupant[];
|
lotOccupancyOccupants: recordTypes.LotOccupancyOccupant[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotOccupancyOccupants = responseJSON.lotOccupancyOccupants;
|
lotOccupancyOccupants = responseJSON.lotOccupancyOccupants
|
||||||
renderLotOccupancyOccupants();
|
renderLotOccupancyOccupants()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Removing " + exports.aliases.occupant,
|
title: 'Error Removing ' + exports.aliases.occupant,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Remove " + exports.aliases.occupant + "?",
|
title: 'Remove ' + exports.aliases.occupant + '?',
|
||||||
message:
|
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: {
|
okButton: {
|
||||||
text: "Yes, Remove " + exports.aliases.occupant,
|
text: 'Yes, Remove ' + exports.aliases.occupant,
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
},
|
},
|
||||||
contextualColorName: "warning"
|
contextualColorName: 'warning'
|
||||||
});
|
})
|
||||||
};
|
}
|
||||||
|
|
||||||
const renderLotOccupancyOccupants = () => {
|
const renderLotOccupancyOccupants = () => {
|
||||||
const occupantsContainer = document.querySelector(
|
const occupantsContainer = document.querySelector(
|
||||||
"#container--lotOccupancyOccupants"
|
'#container--lotOccupancyOccupants'
|
||||||
) as HTMLElement;
|
) as HTMLElement
|
||||||
|
|
||||||
cityssm.clearElement(occupantsContainer);
|
cityssm.clearElement(occupantsContainer)
|
||||||
|
|
||||||
if (lotOccupancyOccupants.length === 0) {
|
if (lotOccupancyOccupants.length === 0) {
|
||||||
occupantsContainer.innerHTML =
|
occupantsContainer.innerHTML =
|
||||||
'<div class="message is-warning">' +
|
'<div class="message is-warning">' +
|
||||||
'<p class="message-body">There are no ' +
|
'<p class="message-body">There are no ' +
|
||||||
exports.aliases.occupants.toLowerCase() +
|
exports.aliases.occupants.toLowerCase() +
|
||||||
" associated with this record.</p>" +
|
' associated with this record.</p>' +
|
||||||
"</div>";
|
'</div>'
|
||||||
|
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const tableElement = document.createElement("table");
|
const tableElement = document.createElement('table')
|
||||||
tableElement.className = "table is-fullwidth is-striped is-hoverable";
|
tableElement.className = 'table is-fullwidth is-striped is-hoverable'
|
||||||
|
|
||||||
tableElement.innerHTML =
|
tableElement.innerHTML =
|
||||||
"<thead><tr>" +
|
'<thead><tr>' +
|
||||||
("<th>" + exports.aliases.occupant + "</th>") +
|
('<th>' + exports.aliases.occupant + '</th>') +
|
||||||
"<th>Address</th>" +
|
'<th>Address</th>' +
|
||||||
"<th>Other Contact</th>" +
|
'<th>Other Contact</th>' +
|
||||||
"<th>Comment</th>" +
|
'<th>Comment</th>' +
|
||||||
'<th class="is-hidden-print"><span class="is-sr-only">Options</span></th>' +
|
'<th class="is-hidden-print"><span class="is-sr-only">Options</span></th>' +
|
||||||
"</tr></thead>" +
|
'</tr></thead>' +
|
||||||
"<tbody></tbody>";
|
'<tbody></tbody>'
|
||||||
|
|
||||||
for (const lotOccupancyOccupant of lotOccupancyOccupants) {
|
for (const lotOccupancyOccupant of lotOccupancyOccupants) {
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement('tr')
|
||||||
tableRowElement.dataset.lotOccupantIndex =
|
tableRowElement.dataset.lotOccupantIndex =
|
||||||
lotOccupancyOccupant.lotOccupantIndex!.toString();
|
lotOccupancyOccupant.lotOccupantIndex!.toString()
|
||||||
|
|
||||||
tableRowElement.innerHTML =
|
tableRowElement.innerHTML =
|
||||||
"<td>" +
|
'<td>' +
|
||||||
cityssm.escapeHTML(lotOccupancyOccupant.occupantName || "(No Name)") +
|
cityssm.escapeHTML(lotOccupancyOccupant.occupantName || '(No Name)') +
|
||||||
"<br />" +
|
'<br />' +
|
||||||
('<span class="tag">' +
|
('<span class="tag">' +
|
||||||
'<i class="fas fa-fw fa-' +
|
'<i class="fas fa-fw fa-' +
|
||||||
cityssm.escapeHTML(lotOccupancyOccupant.fontAwesomeIconClass!) +
|
cityssm.escapeHTML(lotOccupancyOccupant.fontAwesomeIconClass!) +
|
||||||
'" aria-hidden="true"></i>' +
|
'" aria-hidden="true"></i>' +
|
||||||
' <span class="ml-1">' +
|
' <span class="ml-1">' +
|
||||||
cityssm.escapeHTML(lotOccupancyOccupant.lotOccupantType!) +
|
cityssm.escapeHTML(lotOccupancyOccupant.lotOccupantType!) +
|
||||||
"</span>" +
|
'</span>' +
|
||||||
"</span>") +
|
'</span>') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
(lotOccupancyOccupant.occupantAddress1
|
(lotOccupancyOccupant.occupantAddress1
|
||||||
? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress1) + "<br />"
|
? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress1) + '<br />'
|
||||||
: "") +
|
: '') +
|
||||||
(lotOccupancyOccupant.occupantAddress2
|
(lotOccupancyOccupant.occupantAddress2
|
||||||
? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress2) + "<br />"
|
? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress2) + '<br />'
|
||||||
: "") +
|
: '') +
|
||||||
(lotOccupancyOccupant.occupantCity
|
(lotOccupancyOccupant.occupantCity
|
||||||
? cityssm.escapeHTML(lotOccupancyOccupant.occupantCity) + ", "
|
? cityssm.escapeHTML(lotOccupancyOccupant.occupantCity) + ', '
|
||||||
: "") +
|
: '') +
|
||||||
cityssm.escapeHTML(lotOccupancyOccupant.occupantProvince || "") +
|
cityssm.escapeHTML(lotOccupancyOccupant.occupantProvince || '') +
|
||||||
"<br />" +
|
'<br />' +
|
||||||
cityssm.escapeHTML(lotOccupancyOccupant.occupantPostalCode || "") +
|
cityssm.escapeHTML(lotOccupancyOccupant.occupantPostalCode || '') +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
(lotOccupancyOccupant.occupantPhoneNumber
|
(lotOccupancyOccupant.occupantPhoneNumber
|
||||||
? cityssm.escapeHTML(lotOccupancyOccupant.occupantPhoneNumber) + "<br />"
|
? cityssm.escapeHTML(lotOccupancyOccupant.occupantPhoneNumber) +
|
||||||
: "") +
|
'<br />'
|
||||||
|
: '') +
|
||||||
(lotOccupancyOccupant.occupantEmailAddress
|
(lotOccupancyOccupant.occupantEmailAddress
|
||||||
? cityssm.escapeHTML(lotOccupancyOccupant.occupantEmailAddress)
|
? cityssm.escapeHTML(lotOccupancyOccupant.occupantEmailAddress)
|
||||||
: "") +
|
: '') +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
("<td>" + cityssm.escapeHTML(lotOccupancyOccupant.occupantComment!) + "</td>") +
|
('<td>' +
|
||||||
|
cityssm.escapeHTML(lotOccupancyOccupant.occupantComment!) +
|
||||||
|
'</td>') +
|
||||||
('<td class="is-hidden-print">' +
|
('<td class="is-hidden-print">' +
|
||||||
'<div class="buttons are-small is-justify-content-end">' +
|
'<div class="buttons are-small is-justify-content-end">' +
|
||||||
('<button class="button is-primary button--edit" type="button">' +
|
('<button class="button is-primary button--edit" type="button">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||||
" <span>Edit</span>" +
|
' <span>Edit</span>' +
|
||||||
"</button>") +
|
'</button>') +
|
||||||
('<button class="button is-light is-danger button--delete" data-tooltip="Delete ' +
|
('<button class="button is-light is-danger button--delete" data-tooltip="Delete ' +
|
||||||
cityssm.escapeHTML(exports.aliases.occupant) +
|
cityssm.escapeHTML(exports.aliases.occupant) +
|
||||||
'" type="button" aria-label="Delete">' +
|
'" type="button" aria-label="Delete">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>") +
|
'</button>') +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</td>");
|
'</td>')
|
||||||
|
|
||||||
tableRowElement
|
tableRowElement
|
||||||
.querySelector(".button--edit")!
|
.querySelector('.button--edit')!
|
||||||
.addEventListener("click", openEditLotOccupancyOccupant);
|
.addEventListener('click', openEditLotOccupancyOccupant)
|
||||||
|
|
||||||
tableRowElement
|
tableRowElement
|
||||||
.querySelector(".button--delete")!
|
.querySelector('.button--delete')!
|
||||||
.addEventListener("click", deleteLotOccupancyOccupant);
|
.addEventListener('click', deleteLotOccupancyOccupant)
|
||||||
|
|
||||||
tableElement.querySelector("tbody")!.append(tableRowElement);
|
tableElement.querySelector('tbody')!.append(tableRowElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
occupantsContainer.append(tableElement);
|
occupantsContainer.append(tableElement)
|
||||||
};
|
}
|
||||||
|
|
||||||
if (isCreate) {
|
if (isCreate) {
|
||||||
const lotOccupantTypeIdElement = document.querySelector(
|
const lotOccupantTypeIdElement = document.querySelector(
|
||||||
"#lotOccupancy--lotOccupantTypeId"
|
'#lotOccupancy--lotOccupantTypeId'
|
||||||
) as HTMLSelectElement;
|
) as HTMLSelectElement
|
||||||
|
|
||||||
lotOccupantTypeIdElement.addEventListener("change", () => {
|
lotOccupantTypeIdElement.addEventListener('change', () => {
|
||||||
const occupantFields = formElement.querySelectorAll(
|
const occupantFields = formElement.querySelectorAll(
|
||||||
"[data-table='LotOccupancyOccupant']"
|
"[data-table='LotOccupancyOccupant']"
|
||||||
) as NodeListOf<HTMLInputElement | HTMLTextAreaElement>;
|
) as NodeListOf<HTMLInputElement | HTMLTextAreaElement>
|
||||||
|
|
||||||
for (const occupantField of occupantFields) {
|
for (const occupantField of occupantFields) {
|
||||||
occupantField.disabled = lotOccupantTypeIdElement.value === "";
|
occupantField.disabled = lotOccupantTypeIdElement.value === ''
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
} else {
|
} else {
|
||||||
lotOccupancyOccupants = exports.lotOccupancyOccupants;
|
lotOccupancyOccupants = exports.lotOccupancyOccupants
|
||||||
delete exports.lotOccupancyOccupants;
|
delete exports.lotOccupancyOccupants
|
||||||
|
|
||||||
document.querySelector("#button--addOccupant")!.addEventListener("click", () => {
|
document
|
||||||
let addCloseModalFunction: () => void;
|
.querySelector('#button--addOccupant')!
|
||||||
|
.addEventListener('click', () => {
|
||||||
|
let addCloseModalFunction: () => void
|
||||||
|
|
||||||
let addFormElement: HTMLFormElement;
|
let addFormElement: HTMLFormElement
|
||||||
|
|
||||||
let searchFormElement: HTMLFormElement;
|
let searchFormElement: HTMLFormElement
|
||||||
let searchResultsElement: HTMLElement;
|
let searchResultsElement: HTMLElement
|
||||||
|
|
||||||
const addOccupant = (formOrObject: HTMLFormElement | recordTypes.LotOccupancyOccupant) => {
|
const addOccupant = (
|
||||||
|
formOrObject: HTMLFormElement | recordTypes.LotOccupancyOccupant
|
||||||
|
) => {
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/lotOccupancies/doAddLotOccupancyOccupant",
|
los.urlPrefix + '/lotOccupancies/doAddLotOccupancyOccupant',
|
||||||
formOrObject,
|
formOrObject,
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
lotOccupancyOccupants?: recordTypes.LotOccupancyOccupant[];
|
lotOccupancyOccupants?: recordTypes.LotOccupancyOccupant[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
lotOccupancyOccupants = responseJSON.lotOccupancyOccupants!;
|
lotOccupancyOccupants = responseJSON.lotOccupancyOccupants!
|
||||||
addCloseModalFunction();
|
addCloseModalFunction()
|
||||||
renderLotOccupancyOccupants();
|
renderLotOccupancyOccupants()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Adding " + exports.aliases.occupant,
|
title: 'Error Adding ' + exports.aliases.occupant,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
const addOccupantFromForm = (submitEvent: SubmitEvent) => {
|
const addOccupantFromForm = (submitEvent: SubmitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault()
|
||||||
addOccupant(addFormElement);
|
addOccupant(addFormElement)
|
||||||
};
|
}
|
||||||
|
|
||||||
let pastOccupantSearchResults: recordTypes.LotOccupancyOccupant[] = [];
|
let pastOccupantSearchResults: recordTypes.LotOccupancyOccupant[] = []
|
||||||
|
|
||||||
const addOccupantFromCopy = (clickEvent: MouseEvent) => {
|
const addOccupantFromCopy = (clickEvent: MouseEvent) => {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault()
|
||||||
|
|
||||||
const panelBlockElement = clickEvent.currentTarget as HTMLElement;
|
const panelBlockElement = clickEvent.currentTarget as HTMLElement
|
||||||
|
|
||||||
const occupant =
|
const occupant =
|
||||||
pastOccupantSearchResults[Number.parseInt(panelBlockElement.dataset.index!, 10)];
|
pastOccupantSearchResults[
|
||||||
|
Number.parseInt(panelBlockElement.dataset.index!, 10)
|
||||||
|
]
|
||||||
|
|
||||||
const lotOccupantTypeId = (
|
const lotOccupantTypeId = (
|
||||||
panelBlockElement
|
panelBlockElement
|
||||||
.closest(".modal")!
|
.closest('.modal')!
|
||||||
.querySelector(
|
.querySelector(
|
||||||
"#lotOccupancyOccupantCopy--lotOccupantTypeId"
|
'#lotOccupancyOccupantCopy--lotOccupantTypeId'
|
||||||
) as HTMLSelectElement
|
) as HTMLSelectElement
|
||||||
).value;
|
).value
|
||||||
|
|
||||||
if (lotOccupantTypeId === "") {
|
if (lotOccupantTypeId === '') {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "No " + exports.aliases.occupant + " Type Selected",
|
title: 'No ' + exports.aliases.occupant + ' Type Selected',
|
||||||
message:
|
message:
|
||||||
"Select a type to apply to the newly added " +
|
'Select a type to apply to the newly added ' +
|
||||||
exports.aliases.occupant.toLowerCase() +
|
exports.aliases.occupant.toLowerCase() +
|
||||||
".",
|
'.',
|
||||||
contextualColorName: "warning"
|
contextualColorName: 'warning'
|
||||||
});
|
})
|
||||||
} else {
|
} else {
|
||||||
occupant.lotOccupantTypeId = Number.parseInt(lotOccupantTypeId, 10);
|
occupant.lotOccupantTypeId = Number.parseInt(lotOccupantTypeId, 10)
|
||||||
occupant.lotOccupancyId = Number.parseInt(lotOccupancyId, 10);
|
occupant.lotOccupancyId = Number.parseInt(lotOccupancyId, 10)
|
||||||
addOccupant(occupant);
|
addOccupant(occupant)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
const searchOccupants = (event: Event) => {
|
const searchOccupants = (event: Event) => {
|
||||||
event.preventDefault();
|
event.preventDefault()
|
||||||
|
|
||||||
if (
|
if (
|
||||||
(
|
(
|
||||||
searchFormElement.querySelector(
|
searchFormElement.querySelector(
|
||||||
"#lotOccupancyOccupantCopy--searchFilter"
|
'#lotOccupancyOccupantCopy--searchFilter'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value === ""
|
).value === ''
|
||||||
) {
|
) {
|
||||||
searchResultsElement.innerHTML =
|
searchResultsElement.innerHTML =
|
||||||
'<div class="message is-info">' +
|
'<div class="message is-info">' +
|
||||||
'<p class="message-body">Enter a partial name or address in the search field above.</p>' +
|
'<p class="message-body">Enter a partial name or address in the search field above.</p>' +
|
||||||
"</div>";
|
'</div>'
|
||||||
|
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
searchResultsElement.innerHTML = los.getLoadingParagraphHTML("Searching...");
|
searchResultsElement.innerHTML =
|
||||||
|
los.getLoadingParagraphHTML('Searching...')
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/lotOccupancies/doSearchPastOccupants",
|
los.urlPrefix + '/lotOccupancies/doSearchPastOccupants',
|
||||||
searchFormElement,
|
searchFormElement,
|
||||||
(responseJSON: { occupants: recordTypes.LotOccupancyOccupant[] }) => {
|
(responseJSON: { occupants: recordTypes.LotOccupancyOccupant[] }) => {
|
||||||
pastOccupantSearchResults = responseJSON.occupants;
|
pastOccupantSearchResults = responseJSON.occupants
|
||||||
|
|
||||||
const panelElement = document.createElement("div");
|
const panelElement = document.createElement('div')
|
||||||
panelElement.className = "panel";
|
panelElement.className = 'panel'
|
||||||
|
|
||||||
for (const [index, occupant] of pastOccupantSearchResults.entries()) {
|
for (const [
|
||||||
const panelBlockElement = document.createElement("a");
|
index,
|
||||||
panelBlockElement.className = "panel-block is-block";
|
occupant
|
||||||
panelBlockElement.dataset.index = index.toString();
|
] of pastOccupantSearchResults.entries()) {
|
||||||
|
const panelBlockElement = document.createElement('a')
|
||||||
|
panelBlockElement.className = 'panel-block is-block'
|
||||||
|
panelBlockElement.dataset.index = index.toString()
|
||||||
|
|
||||||
panelBlockElement.innerHTML =
|
panelBlockElement.innerHTML =
|
||||||
"<strong>" +
|
'<strong>' +
|
||||||
cityssm.escapeHTML(occupant.occupantName || "") +
|
cityssm.escapeHTML(occupant.occupantName || '') +
|
||||||
"</strong>" +
|
'</strong>' +
|
||||||
"<br />" +
|
'<br />' +
|
||||||
'<div class="columns">' +
|
'<div class="columns">' +
|
||||||
('<div class="column">' +
|
('<div class="column">' +
|
||||||
cityssm.escapeHTML(occupant.occupantAddress1 || "") +
|
cityssm.escapeHTML(occupant.occupantAddress1 || '') +
|
||||||
"<br />" +
|
'<br />' +
|
||||||
(occupant.occupantAddress2
|
(occupant.occupantAddress2
|
||||||
? cityssm.escapeHTML(occupant.occupantAddress2) + "<br />"
|
? cityssm.escapeHTML(occupant.occupantAddress2) + '<br />'
|
||||||
: "") +
|
: '') +
|
||||||
cityssm.escapeHTML(occupant.occupantCity || "") +
|
cityssm.escapeHTML(occupant.occupantCity || '') +
|
||||||
", " +
|
', ' +
|
||||||
cityssm.escapeHTML(occupant.occupantProvince || "") +
|
cityssm.escapeHTML(occupant.occupantProvince || '') +
|
||||||
"<br />" +
|
'<br />' +
|
||||||
cityssm.escapeHTML(occupant.occupantPostalCode || "") +
|
cityssm.escapeHTML(occupant.occupantPostalCode || '') +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="column">' +
|
('<div class="column">' +
|
||||||
(occupant.occupantPhoneNumber
|
(occupant.occupantPhoneNumber
|
||||||
? cityssm.escapeHTML(occupant.occupantPhoneNumber) + "<br />"
|
? cityssm.escapeHTML(occupant.occupantPhoneNumber) +
|
||||||
: "") +
|
'<br />'
|
||||||
cityssm.escapeHTML(occupant.occupantEmailAddress || "") +
|
: '') +
|
||||||
"<br />" +
|
cityssm.escapeHTML(occupant.occupantEmailAddress || '') +
|
||||||
"</div>") +
|
'<br />' +
|
||||||
"</div>";
|
'</div>') +
|
||||||
|
'</div>'
|
||||||
|
|
||||||
panelBlockElement.addEventListener("click", addOccupantFromCopy);
|
panelBlockElement.addEventListener('click', addOccupantFromCopy)
|
||||||
|
|
||||||
panelElement.append(panelBlockElement);
|
panelElement.append(panelBlockElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
searchResultsElement.innerHTML = "";
|
searchResultsElement.innerHTML = ''
|
||||||
searchResultsElement.append(panelElement);
|
searchResultsElement.append(panelElement)
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
cityssm.openHtmlModal("lotOccupancy-addOccupant", {
|
cityssm.openHtmlModal('lotOccupancy-addOccupant', {
|
||||||
onshow: (modalElement) => {
|
onshow: (modalElement) => {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement)
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#lotOccupancyOccupantAdd--lotOccupancyId"
|
'#lotOccupancyOccupantAdd--lotOccupancyId'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value = lotOccupancyId;
|
).value = lotOccupancyId
|
||||||
|
|
||||||
const lotOccupantTypeSelectElement = modalElement.querySelector(
|
const lotOccupantTypeSelectElement = modalElement.querySelector(
|
||||||
"#lotOccupancyOccupantAdd--lotOccupantTypeId"
|
'#lotOccupancyOccupantAdd--lotOccupantTypeId'
|
||||||
) as HTMLSelectElement;
|
) as HTMLSelectElement
|
||||||
|
|
||||||
const lotOccupantTypeCopySelectElement = modalElement.querySelector(
|
const lotOccupantTypeCopySelectElement = modalElement.querySelector(
|
||||||
"#lotOccupancyOccupantCopy--lotOccupantTypeId"
|
'#lotOccupancyOccupantCopy--lotOccupantTypeId'
|
||||||
) as HTMLSelectElement;
|
) as HTMLSelectElement
|
||||||
|
|
||||||
for (const lotOccupantType of exports.lotOccupantTypes as recordTypes.LotOccupantType[]) {
|
for (const lotOccupantType of exports.lotOccupantTypes as recordTypes.LotOccupantType[]) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option')
|
||||||
optionElement.value = lotOccupantType.lotOccupantTypeId.toString();
|
optionElement.value = lotOccupantType.lotOccupantTypeId.toString()
|
||||||
optionElement.textContent = lotOccupantType.lotOccupantType;
|
optionElement.textContent = lotOccupantType.lotOccupantType
|
||||||
|
|
||||||
lotOccupantTypeSelectElement.append(optionElement);
|
lotOccupantTypeSelectElement.append(optionElement)
|
||||||
|
|
||||||
lotOccupantTypeCopySelectElement.append(optionElement.cloneNode(true));
|
lotOccupantTypeCopySelectElement.append(
|
||||||
|
optionElement.cloneNode(true)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#lotOccupancyOccupantAdd--occupantCity"
|
'#lotOccupancyOccupantAdd--occupantCity'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value = exports.occupantCityDefault;
|
).value = exports.occupantCityDefault
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#lotOccupancyOccupantAdd--occupantProvince"
|
'#lotOccupancyOccupantAdd--occupantProvince'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value = exports.occupantProvinceDefault;
|
).value = exports.occupantProvinceDefault
|
||||||
},
|
},
|
||||||
onshown: (modalElement, closeModalFunction) => {
|
onshown: (modalElement, closeModalFunction) => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
bulmaJS.init(modalElement);
|
bulmaJS.init(modalElement)
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#lotOccupancyOccupantAdd--lotOccupantTypeId"
|
'#lotOccupancyOccupantAdd--lotOccupantTypeId'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).focus();
|
).focus()
|
||||||
|
|
||||||
addFormElement = modalElement.querySelector(
|
addFormElement = modalElement.querySelector(
|
||||||
"#form--lotOccupancyOccupantAdd"
|
'#form--lotOccupancyOccupantAdd'
|
||||||
) as HTMLFormElement;
|
) as HTMLFormElement
|
||||||
addFormElement.addEventListener("submit", addOccupantFromForm);
|
addFormElement.addEventListener('submit', addOccupantFromForm)
|
||||||
|
|
||||||
searchResultsElement = modalElement.querySelector(
|
searchResultsElement = modalElement.querySelector(
|
||||||
"#lotOccupancyOccupantCopy--searchResults"
|
'#lotOccupancyOccupantCopy--searchResults'
|
||||||
) as HTMLElement;
|
) as HTMLElement
|
||||||
|
|
||||||
searchFormElement = modalElement.querySelector(
|
searchFormElement = modalElement.querySelector(
|
||||||
"#form--lotOccupancyOccupantCopy"
|
'#form--lotOccupancyOccupantCopy'
|
||||||
) as HTMLFormElement;
|
) as HTMLFormElement
|
||||||
searchFormElement.addEventListener("submit", (formEvent) => {
|
searchFormElement.addEventListener('submit', (formEvent) => {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault()
|
||||||
});
|
})
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#lotOccupancyOccupantCopy--searchFilter"
|
'#lotOccupancyOccupantCopy--searchFilter'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).addEventListener("change", searchOccupants);
|
).addEventListener('change', searchOccupants)
|
||||||
|
|
||||||
addCloseModalFunction = closeModalFunction;
|
addCloseModalFunction = closeModalFunction
|
||||||
},
|
},
|
||||||
onremoved: () => {
|
onremoved: () => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
|
|
||||||
renderLotOccupancyOccupants();
|
renderLotOccupancyOccupants()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,10 +3,10 @@
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
(() => {
|
(() => {
|
||||||
const los = exports.los;
|
const los = exports.los;
|
||||||
const searchFilterFormElement = document.querySelector("#form--searchFilters");
|
const searchFilterFormElement = document.querySelector('#form--searchFilters');
|
||||||
const searchResultsContainerElement = document.querySelector("#container--searchResults");
|
const searchResultsContainerElement = document.querySelector('#container--searchResults');
|
||||||
const limit = Number.parseInt(document.querySelector("#searchFilter--limit").value, 10);
|
const limit = Number.parseInt(document.querySelector('#searchFilter--limit').value, 10);
|
||||||
const offsetElement = document.querySelector("#searchFilter--offset");
|
const offsetElement = document.querySelector('#searchFilter--offset');
|
||||||
function renderLotOccupancies(responseJSON) {
|
function renderLotOccupancies(responseJSON) {
|
||||||
var _a, _b;
|
var _a, _b;
|
||||||
if (responseJSON.lotOccupancies.length === 0) {
|
if (responseJSON.lotOccupancies.length === 0) {
|
||||||
|
|
@ -17,12 +17,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
</div>`;
|
</div>`;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const resultsTbodyElement = document.createElement("tbody");
|
const resultsTbodyElement = document.createElement('tbody');
|
||||||
const nowDateString = cityssm.dateToString(new Date());
|
const nowDateString = cityssm.dateToString(new Date());
|
||||||
for (const lotOccupancy of responseJSON.lotOccupancies) {
|
for (const lotOccupancy of responseJSON.lotOccupancies) {
|
||||||
let occupancyTimeHTML = "";
|
let occupancyTimeHTML = '';
|
||||||
if (lotOccupancy.occupancyStartDateString <= nowDateString &&
|
if (lotOccupancy.occupancyStartDateString <= nowDateString &&
|
||||||
(lotOccupancy.occupancyEndDateString === "" ||
|
(lotOccupancy.occupancyEndDateString === '' ||
|
||||||
lotOccupancy.occupancyEndDateString >= nowDateString)) {
|
lotOccupancy.occupancyEndDateString >= nowDateString)) {
|
||||||
occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Current ${los.escapedAliases.Occupancy}">
|
occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Current ${los.escapedAliases.Occupancy}">
|
||||||
<i class="fas fa-play" aria-label="Current ${los.escapedAliases.Occupancy}"></i>
|
<i class="fas fa-play" aria-label="Current ${los.escapedAliases.Occupancy}"></i>
|
||||||
|
|
@ -38,63 +38,65 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
<i class="fas fa-stop" aria-label="Past ${los.escapedAliases.Occupancy}"></i>
|
<i class="fas fa-stop" aria-label="Past ${los.escapedAliases.Occupancy}"></i>
|
||||||
</span>`;
|
</span>`;
|
||||||
}
|
}
|
||||||
let occupantsHTML = "";
|
let occupantsHTML = '';
|
||||||
for (const occupant of lotOccupancy.lotOccupancyOccupants) {
|
for (const occupant of lotOccupancy.lotOccupancyOccupants) {
|
||||||
occupantsHTML +=
|
occupantsHTML +=
|
||||||
'<span class="has-tooltip-left" data-tooltip="' +
|
'<span class="has-tooltip-left" data-tooltip="' +
|
||||||
cityssm.escapeHTML(occupant.lotOccupantType || "") +
|
cityssm.escapeHTML(occupant.lotOccupantType || '') +
|
||||||
'">' +
|
'">' +
|
||||||
('<i class="fas fa-fw fa-' +
|
('<i class="fas fa-fw fa-' +
|
||||||
cityssm.escapeHTML(occupant.fontAwesomeIconClass || "user") +
|
cityssm.escapeHTML(occupant.fontAwesomeIconClass || 'user') +
|
||||||
'" aria-hidden="true"></i> ') +
|
'" aria-hidden="true"></i> ') +
|
||||||
cityssm.escapeHTML(occupant.occupantName || "") +
|
cityssm.escapeHTML(occupant.occupantName || '') +
|
||||||
"</span><br />";
|
'</span><br />';
|
||||||
}
|
}
|
||||||
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
|
resultsTbodyElement.insertAdjacentHTML('beforeend', '<tr>' +
|
||||||
('<td class="has-width-1">' + occupancyTimeHTML + "</td>") +
|
('<td class="has-width-1">' + occupancyTimeHTML + '</td>') +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
'<a class="has-text-weight-bold" href="' +
|
'<a class="has-text-weight-bold" href="' +
|
||||||
los.getLotOccupancyURL(lotOccupancy.lotOccupancyId) +
|
los.getLotOccupancyURL(lotOccupancy.lotOccupancyId) +
|
||||||
'">' +
|
'">' +
|
||||||
cityssm.escapeHTML(lotOccupancy.occupancyType) +
|
cityssm.escapeHTML(lotOccupancy.occupancyType) +
|
||||||
"</a>" +
|
'</a>' +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
(lotOccupancy.lotName
|
(lotOccupancy.lotName
|
||||||
? '<a class="has-tooltip-right" data-tooltip="' +
|
? '<a class="has-tooltip-right" data-tooltip="' +
|
||||||
cityssm.escapeHTML(lotOccupancy.lotType || "") +
|
cityssm.escapeHTML(lotOccupancy.lotType || '') +
|
||||||
'" href="' +
|
'" href="' +
|
||||||
los.getLotURL(lotOccupancy.lotId) +
|
los.getLotURL(lotOccupancy.lotId) +
|
||||||
'">' +
|
'">' +
|
||||||
cityssm.escapeHTML(lotOccupancy.lotName) +
|
cityssm.escapeHTML(lotOccupancy.lotName) +
|
||||||
"</a>"
|
'</a>'
|
||||||
: '<span class="has-text-grey">(No ' + los.escapedAliases.Lot + ")</span>") +
|
: '<span class="has-text-grey">(No ' +
|
||||||
"<br />" +
|
los.escapedAliases.Lot +
|
||||||
|
')</span>') +
|
||||||
|
'<br />' +
|
||||||
('<span class="is-size-7">' +
|
('<span class="is-size-7">' +
|
||||||
cityssm.escapeHTML(lotOccupancy.mapName || "") +
|
cityssm.escapeHTML(lotOccupancy.mapName || '') +
|
||||||
"</span>") +
|
'</span>') +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
("<td>" + lotOccupancy.occupancyStartDateString + "</td>") +
|
('<td>' + lotOccupancy.occupancyStartDateString + '</td>') +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
(lotOccupancy.occupancyEndDate
|
(lotOccupancy.occupancyEndDate
|
||||||
? lotOccupancy.occupancyEndDateString
|
? lotOccupancy.occupancyEndDateString
|
||||||
: '<span class="has-text-grey">(No End Date)</span>') +
|
: '<span class="has-text-grey">(No End Date)</span>') +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
("<td>" + occupantsHTML + "</td>") +
|
('<td>' + occupantsHTML + '</td>') +
|
||||||
"<td>" +
|
'<td>' +
|
||||||
(lotOccupancy.printEJS
|
(lotOccupancy.printEJS
|
||||||
? '<a class="button is-small" data-tooltip="Print" href="' +
|
? '<a class="button is-small" data-tooltip="Print" href="' +
|
||||||
los.urlPrefix +
|
los.urlPrefix +
|
||||||
"/print/" +
|
'/print/' +
|
||||||
lotOccupancy.printEJS +
|
lotOccupancy.printEJS +
|
||||||
"/?lotOccupancyId=" +
|
'/?lotOccupancyId=' +
|
||||||
lotOccupancy.lotOccupancyId +
|
lotOccupancy.lotOccupancyId +
|
||||||
'" target="_blank">' +
|
'" target="_blank">' +
|
||||||
'<i class="fas fa-print" aria-label="Print"></i>' +
|
'<i class="fas fa-print" aria-label="Print"></i>' +
|
||||||
"</a>"
|
'</a>'
|
||||||
: "") +
|
: '') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
"</tr>");
|
'</tr>');
|
||||||
}
|
}
|
||||||
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">
|
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">
|
||||||
<thead><tr>
|
<thead><tr>
|
||||||
|
|
@ -107,19 +109,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
<th class="has-width-1"><span class="is-sr-only">Print</span></th>
|
<th class="has-width-1"><span class="is-sr-only">Print</span></th>
|
||||||
</tr></thead>
|
</tr></thead>
|
||||||
<table>`;
|
<table>`;
|
||||||
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement);
|
searchResultsContainerElement
|
||||||
searchResultsContainerElement.insertAdjacentHTML("beforeend", los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count));
|
.querySelector('table')
|
||||||
|
.append(resultsTbodyElement);
|
||||||
|
searchResultsContainerElement.insertAdjacentHTML('beforeend', los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count));
|
||||||
(_a = searchResultsContainerElement
|
(_a = searchResultsContainerElement
|
||||||
.querySelector("button[data-page='previous']")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", previousAndGetLotOccupancies);
|
.querySelector("button[data-page='previous']")) === null || _a === void 0 ? void 0 : _a.addEventListener('click', previousAndGetLotOccupancies);
|
||||||
(_b = searchResultsContainerElement
|
(_b = searchResultsContainerElement
|
||||||
.querySelector("button[data-page='next']")) === null || _b === void 0 ? void 0 : _b.addEventListener("click", nextAndGetLotOccupancies);
|
.querySelector("button[data-page='next']")) === null || _b === void 0 ? void 0 : _b.addEventListener('click', nextAndGetLotOccupancies);
|
||||||
}
|
}
|
||||||
function getLotOccupancies() {
|
function getLotOccupancies() {
|
||||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(`Loading ${exports.aliases.occupancies}...`);
|
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(`Loading ${exports.aliases.occupancies}...`);
|
||||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doSearchLotOccupancies", searchFilterFormElement, renderLotOccupancies);
|
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doSearchLotOccupancies', searchFilterFormElement, renderLotOccupancies);
|
||||||
}
|
}
|
||||||
function resetOffsetAndGetLotOccupancies() {
|
function resetOffsetAndGetLotOccupancies() {
|
||||||
offsetElement.value = "0";
|
offsetElement.value = '0';
|
||||||
getLotOccupancies();
|
getLotOccupancies();
|
||||||
}
|
}
|
||||||
function previousAndGetLotOccupancies() {
|
function previousAndGetLotOccupancies() {
|
||||||
|
|
@ -130,11 +134,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString();
|
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString();
|
||||||
getLotOccupancies();
|
getLotOccupancies();
|
||||||
}
|
}
|
||||||
const filterElements = searchFilterFormElement.querySelectorAll("input, select");
|
const filterElements = searchFilterFormElement.querySelectorAll('input, select');
|
||||||
for (const filterElement of filterElements) {
|
for (const filterElement of filterElements) {
|
||||||
filterElement.addEventListener("change", resetOffsetAndGetLotOccupancies);
|
filterElement.addEventListener('change', resetOffsetAndGetLotOccupancies);
|
||||||
}
|
}
|
||||||
searchFilterFormElement.addEventListener("submit", (formEvent) => {
|
searchFilterFormElement.addEventListener('submit', (formEvent) => {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault();
|
||||||
resetOffsetAndGetLotOccupancies();
|
resetOffsetAndGetLotOccupancies();
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,128 +1,136 @@
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||||
|
|
||||||
import type * as globalTypes from "../types/globalTypes";
|
import type * as globalTypes from '../types/globalTypes'
|
||||||
import type * as recordTypes from "../types/recordTypes";
|
import type * as recordTypes from '../types/recordTypes'
|
||||||
|
|
||||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal
|
||||||
|
|
||||||
(() => {
|
;(() => {
|
||||||
const los = exports.los as globalTypes.LOS;
|
const los = exports.los as globalTypes.LOS
|
||||||
|
|
||||||
const searchFilterFormElement = document.querySelector("#form--searchFilters") as HTMLFormElement;
|
const searchFilterFormElement = document.querySelector(
|
||||||
|
'#form--searchFilters'
|
||||||
|
) as HTMLFormElement
|
||||||
|
|
||||||
const searchResultsContainerElement = document.querySelector("#container--searchResults") as HTMLElement;
|
const searchResultsContainerElement = document.querySelector(
|
||||||
|
'#container--searchResults'
|
||||||
|
) as HTMLElement
|
||||||
|
|
||||||
const limit = Number.parseInt(
|
const limit = Number.parseInt(
|
||||||
(document.querySelector("#searchFilter--limit") as HTMLInputElement).value,
|
(document.querySelector('#searchFilter--limit') as HTMLInputElement).value,
|
||||||
10
|
10
|
||||||
);
|
)
|
||||||
|
|
||||||
const offsetElement = document.querySelector("#searchFilter--offset") as HTMLInputElement;
|
const offsetElement = document.querySelector(
|
||||||
|
'#searchFilter--offset'
|
||||||
|
) as HTMLInputElement
|
||||||
|
|
||||||
function renderLotOccupancies(responseJSON: {
|
function renderLotOccupancies(responseJSON: {
|
||||||
count: number;
|
count: number
|
||||||
offset: number;
|
offset: number
|
||||||
lotOccupancies: recordTypes.LotOccupancy[];
|
lotOccupancies: recordTypes.LotOccupancy[]
|
||||||
}) {
|
}) {
|
||||||
if (responseJSON.lotOccupancies.length === 0) {
|
if (responseJSON.lotOccupancies.length === 0) {
|
||||||
searchResultsContainerElement.innerHTML = `<div class="message is-info">
|
searchResultsContainerElement.innerHTML = `<div class="message is-info">
|
||||||
<p class="message-body">
|
<p class="message-body">
|
||||||
There are no ${los.escapedAliases.occupancy} records that meet the search criteria.
|
There are no ${los.escapedAliases.occupancy} records that meet the search criteria.
|
||||||
</p>
|
</p>
|
||||||
</div>`;
|
</div>`
|
||||||
|
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const resultsTbodyElement = document.createElement("tbody");
|
const resultsTbodyElement = document.createElement('tbody')
|
||||||
|
|
||||||
const nowDateString = cityssm.dateToString(new Date());
|
const nowDateString = cityssm.dateToString(new Date())
|
||||||
|
|
||||||
for (const lotOccupancy of responseJSON.lotOccupancies) {
|
for (const lotOccupancy of responseJSON.lotOccupancies) {
|
||||||
let occupancyTimeHTML = "";
|
let occupancyTimeHTML = ''
|
||||||
|
|
||||||
if (
|
if (
|
||||||
lotOccupancy.occupancyStartDateString! <= nowDateString &&
|
lotOccupancy.occupancyStartDateString! <= nowDateString &&
|
||||||
(lotOccupancy.occupancyEndDateString === "" ||
|
(lotOccupancy.occupancyEndDateString === '' ||
|
||||||
lotOccupancy.occupancyEndDateString! >= nowDateString)
|
lotOccupancy.occupancyEndDateString! >= nowDateString)
|
||||||
) {
|
) {
|
||||||
occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Current ${los.escapedAliases.Occupancy}">
|
occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Current ${los.escapedAliases.Occupancy}">
|
||||||
<i class="fas fa-play" aria-label="Current ${los.escapedAliases.Occupancy}"></i>
|
<i class="fas fa-play" aria-label="Current ${los.escapedAliases.Occupancy}"></i>
|
||||||
</span>`;
|
</span>`
|
||||||
} else if (lotOccupancy.occupancyStartDateString! > nowDateString) {
|
} else if (lotOccupancy.occupancyStartDateString! > nowDateString) {
|
||||||
occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Future ${los.escapedAliases.Occupancy}">
|
occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Future ${los.escapedAliases.Occupancy}">
|
||||||
<i class="fas fa-fast-forward" aria-label="Future ${los.escapedAliases.Occupancy}"></i>
|
<i class="fas fa-fast-forward" aria-label="Future ${los.escapedAliases.Occupancy}"></i>
|
||||||
</span>`;
|
</span>`
|
||||||
} else {
|
} else {
|
||||||
occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Past ${los.escapedAliases.Occupancy}">
|
occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Past ${los.escapedAliases.Occupancy}">
|
||||||
<i class="fas fa-stop" aria-label="Past ${los.escapedAliases.Occupancy}"></i>
|
<i class="fas fa-stop" aria-label="Past ${los.escapedAliases.Occupancy}"></i>
|
||||||
</span>`;
|
</span>`
|
||||||
}
|
}
|
||||||
|
|
||||||
let occupantsHTML = "";
|
let occupantsHTML = ''
|
||||||
|
|
||||||
for (const occupant of lotOccupancy.lotOccupancyOccupants!) {
|
for (const occupant of lotOccupancy.lotOccupancyOccupants!) {
|
||||||
occupantsHTML +=
|
occupantsHTML +=
|
||||||
'<span class="has-tooltip-left" data-tooltip="' +
|
'<span class="has-tooltip-left" data-tooltip="' +
|
||||||
cityssm.escapeHTML(occupant.lotOccupantType || "") +
|
cityssm.escapeHTML(occupant.lotOccupantType || '') +
|
||||||
'">' +
|
'">' +
|
||||||
('<i class="fas fa-fw fa-' +
|
('<i class="fas fa-fw fa-' +
|
||||||
cityssm.escapeHTML(occupant.fontAwesomeIconClass || "user") +
|
cityssm.escapeHTML(occupant.fontAwesomeIconClass || 'user') +
|
||||||
'" aria-hidden="true"></i> ') +
|
'" aria-hidden="true"></i> ') +
|
||||||
cityssm.escapeHTML(occupant.occupantName || "") +
|
cityssm.escapeHTML(occupant.occupantName || '') +
|
||||||
"</span><br />";
|
'</span><br />'
|
||||||
}
|
}
|
||||||
|
|
||||||
resultsTbodyElement.insertAdjacentHTML(
|
resultsTbodyElement.insertAdjacentHTML(
|
||||||
"beforeend",
|
'beforeend',
|
||||||
"<tr>" +
|
'<tr>' +
|
||||||
('<td class="has-width-1">' + occupancyTimeHTML + "</td>") +
|
('<td class="has-width-1">' + occupancyTimeHTML + '</td>') +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
'<a class="has-text-weight-bold" href="' +
|
'<a class="has-text-weight-bold" href="' +
|
||||||
los.getLotOccupancyURL(lotOccupancy.lotOccupancyId!) +
|
los.getLotOccupancyURL(lotOccupancy.lotOccupancyId!) +
|
||||||
'">' +
|
'">' +
|
||||||
cityssm.escapeHTML(lotOccupancy.occupancyType as string) +
|
cityssm.escapeHTML(lotOccupancy.occupancyType as string) +
|
||||||
"</a>" +
|
'</a>' +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
(lotOccupancy.lotName
|
(lotOccupancy.lotName
|
||||||
? '<a class="has-tooltip-right" data-tooltip="' +
|
? '<a class="has-tooltip-right" data-tooltip="' +
|
||||||
cityssm.escapeHTML(lotOccupancy.lotType || "") +
|
cityssm.escapeHTML(lotOccupancy.lotType || '') +
|
||||||
'" href="' +
|
'" href="' +
|
||||||
los.getLotURL(lotOccupancy.lotId!) +
|
los.getLotURL(lotOccupancy.lotId!) +
|
||||||
'">' +
|
'">' +
|
||||||
cityssm.escapeHTML(lotOccupancy.lotName) +
|
cityssm.escapeHTML(lotOccupancy.lotName) +
|
||||||
"</a>"
|
'</a>'
|
||||||
: '<span class="has-text-grey">(No ' + los.escapedAliases.Lot + ")</span>") +
|
: '<span class="has-text-grey">(No ' +
|
||||||
"<br />" +
|
los.escapedAliases.Lot +
|
||||||
|
')</span>') +
|
||||||
|
'<br />' +
|
||||||
('<span class="is-size-7">' +
|
('<span class="is-size-7">' +
|
||||||
cityssm.escapeHTML(lotOccupancy.mapName || "") +
|
cityssm.escapeHTML(lotOccupancy.mapName || '') +
|
||||||
"</span>") +
|
'</span>') +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
("<td>" + lotOccupancy.occupancyStartDateString + "</td>") +
|
('<td>' + lotOccupancy.occupancyStartDateString + '</td>') +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
(lotOccupancy.occupancyEndDate
|
(lotOccupancy.occupancyEndDate
|
||||||
? lotOccupancy.occupancyEndDateString
|
? lotOccupancy.occupancyEndDateString
|
||||||
: '<span class="has-text-grey">(No End Date)</span>') +
|
: '<span class="has-text-grey">(No End Date)</span>') +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
("<td>" + occupantsHTML + "</td>") +
|
('<td>' + occupantsHTML + '</td>') +
|
||||||
"<td>" +
|
'<td>' +
|
||||||
(lotOccupancy.printEJS
|
(lotOccupancy.printEJS
|
||||||
? '<a class="button is-small" data-tooltip="Print" href="' +
|
? '<a class="button is-small" data-tooltip="Print" href="' +
|
||||||
los.urlPrefix +
|
los.urlPrefix +
|
||||||
"/print/" +
|
'/print/' +
|
||||||
lotOccupancy.printEJS +
|
lotOccupancy.printEJS +
|
||||||
"/?lotOccupancyId=" +
|
'/?lotOccupancyId=' +
|
||||||
lotOccupancy.lotOccupancyId +
|
lotOccupancy.lotOccupancyId +
|
||||||
'" target="_blank">' +
|
'" target="_blank">' +
|
||||||
'<i class="fas fa-print" aria-label="Print"></i>' +
|
'<i class="fas fa-print" aria-label="Print"></i>' +
|
||||||
"</a>"
|
'</a>'
|
||||||
: "") +
|
: '') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
"</tr>"
|
'</tr>'
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">
|
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">
|
||||||
|
|
@ -135,63 +143,74 @@ declare const cityssm: cityssmGlobal;
|
||||||
<th>${los.escapedAliases.Occupants}</th>
|
<th>${los.escapedAliases.Occupants}</th>
|
||||||
<th class="has-width-1"><span class="is-sr-only">Print</span></th>
|
<th class="has-width-1"><span class="is-sr-only">Print</span></th>
|
||||||
</tr></thead>
|
</tr></thead>
|
||||||
<table>`;
|
<table>`
|
||||||
|
|
||||||
searchResultsContainerElement.querySelector("table")!.append(resultsTbodyElement);
|
searchResultsContainerElement
|
||||||
|
.querySelector('table')!
|
||||||
|
.append(resultsTbodyElement)
|
||||||
|
|
||||||
searchResultsContainerElement.insertAdjacentHTML(
|
searchResultsContainerElement.insertAdjacentHTML(
|
||||||
"beforeend",
|
'beforeend',
|
||||||
los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count)
|
los.getSearchResultsPagerHTML(
|
||||||
);
|
limit,
|
||||||
|
responseJSON.offset,
|
||||||
|
responseJSON.count
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
searchResultsContainerElement
|
searchResultsContainerElement
|
||||||
.querySelector("button[data-page='previous']")
|
.querySelector("button[data-page='previous']")
|
||||||
?.addEventListener("click", previousAndGetLotOccupancies);
|
?.addEventListener('click', previousAndGetLotOccupancies)
|
||||||
|
|
||||||
searchResultsContainerElement
|
searchResultsContainerElement
|
||||||
.querySelector("button[data-page='next']")
|
.querySelector("button[data-page='next']")
|
||||||
?.addEventListener("click", nextAndGetLotOccupancies);
|
?.addEventListener('click', nextAndGetLotOccupancies)
|
||||||
}
|
}
|
||||||
|
|
||||||
function getLotOccupancies() {
|
function getLotOccupancies() {
|
||||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(
|
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(
|
||||||
`Loading ${exports.aliases.occupancies}...`
|
`Loading ${exports.aliases.occupancies}...`
|
||||||
);
|
)
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/lotOccupancies/doSearchLotOccupancies",
|
los.urlPrefix + '/lotOccupancies/doSearchLotOccupancies',
|
||||||
searchFilterFormElement,
|
searchFilterFormElement,
|
||||||
renderLotOccupancies
|
renderLotOccupancies
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
function resetOffsetAndGetLotOccupancies() {
|
function resetOffsetAndGetLotOccupancies() {
|
||||||
offsetElement.value = "0";
|
offsetElement.value = '0'
|
||||||
getLotOccupancies();
|
getLotOccupancies()
|
||||||
}
|
}
|
||||||
|
|
||||||
function previousAndGetLotOccupancies() {
|
function previousAndGetLotOccupancies() {
|
||||||
offsetElement.value = Math.max(Number.parseInt(offsetElement.value, 10) - limit, 0).toString();
|
offsetElement.value = Math.max(
|
||||||
getLotOccupancies();
|
Number.parseInt(offsetElement.value, 10) - limit,
|
||||||
|
0
|
||||||
|
).toString()
|
||||||
|
getLotOccupancies()
|
||||||
}
|
}
|
||||||
|
|
||||||
function nextAndGetLotOccupancies() {
|
function nextAndGetLotOccupancies() {
|
||||||
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString();
|
offsetElement.value = (
|
||||||
getLotOccupancies();
|
Number.parseInt(offsetElement.value, 10) + limit
|
||||||
|
).toString()
|
||||||
|
getLotOccupancies()
|
||||||
}
|
}
|
||||||
|
|
||||||
const filterElements = searchFilterFormElement.querySelectorAll("input, select") as NodeListOf<
|
const filterElements = searchFilterFormElement.querySelectorAll(
|
||||||
HTMLInputElement | HTMLSelectElement
|
'input, select'
|
||||||
>;
|
) as NodeListOf<HTMLInputElement | HTMLSelectElement>
|
||||||
|
|
||||||
for (const filterElement of filterElements) {
|
for (const filterElement of filterElements) {
|
||||||
filterElement.addEventListener("change", resetOffsetAndGetLotOccupancies);
|
filterElement.addEventListener('change', resetOffsetAndGetLotOccupancies)
|
||||||
}
|
}
|
||||||
|
|
||||||
searchFilterFormElement.addEventListener("submit", (formEvent) => {
|
searchFilterFormElement.addEventListener('submit', (formEvent) => {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault()
|
||||||
resetOffsetAndGetLotOccupancies();
|
resetOffsetAndGetLotOccupancies()
|
||||||
});
|
})
|
||||||
|
|
||||||
getLotOccupancies();
|
getLotOccupancies()
|
||||||
})();
|
})()
|
||||||
|
|
|
||||||
|
|
@ -3,10 +3,10 @@
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
(() => {
|
(() => {
|
||||||
const los = exports.los;
|
const los = exports.los;
|
||||||
const searchFilterFormElement = document.querySelector("#form--searchFilters");
|
const searchFilterFormElement = document.querySelector('#form--searchFilters');
|
||||||
const searchResultsContainerElement = document.querySelector("#container--searchResults");
|
const searchResultsContainerElement = document.querySelector('#container--searchResults');
|
||||||
const limit = Number.parseInt(document.querySelector("#searchFilter--limit").value, 10);
|
const limit = Number.parseInt(document.querySelector('#searchFilter--limit').value, 10);
|
||||||
const offsetElement = document.querySelector("#searchFilter--offset");
|
const offsetElement = document.querySelector('#searchFilter--offset');
|
||||||
function renderLots(responseJSON) {
|
function renderLots(responseJSON) {
|
||||||
var _a, _b;
|
var _a, _b;
|
||||||
if (responseJSON.lots.length === 0) {
|
if (responseJSON.lots.length === 0) {
|
||||||
|
|
@ -15,36 +15,36 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
</div>`;
|
</div>`;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const resultsTbodyElement = document.createElement("tbody");
|
const resultsTbodyElement = document.createElement('tbody');
|
||||||
for (const lot of responseJSON.lots) {
|
for (const lot of responseJSON.lots) {
|
||||||
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
|
resultsTbodyElement.insertAdjacentHTML('beforeend', '<tr>' +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
'<a class="has-text-weight-bold" href="' +
|
'<a class="has-text-weight-bold" href="' +
|
||||||
los.getLotURL(lot.lotId) +
|
los.getLotURL(lot.lotId) +
|
||||||
'">' +
|
'">' +
|
||||||
cityssm.escapeHTML(lot.lotName || "") +
|
cityssm.escapeHTML(lot.lotName || '') +
|
||||||
"</a>" +
|
'</a>' +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
'<a href="' +
|
'<a href="' +
|
||||||
los.getMapURL(lot.mapId) +
|
los.getMapURL(lot.mapId) +
|
||||||
'">' +
|
'">' +
|
||||||
(lot.mapName
|
(lot.mapName
|
||||||
? cityssm.escapeHTML(lot.mapName)
|
? cityssm.escapeHTML(lot.mapName)
|
||||||
: '<span class="has-text-grey">(No Name)</span>') +
|
: '<span class="has-text-grey">(No Name)</span>') +
|
||||||
"</a>" +
|
'</a>' +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
("<td>" + cityssm.escapeHTML(lot.lotType || "") + "</td>") +
|
('<td>' + cityssm.escapeHTML(lot.lotType || '') + '</td>') +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
(lot.lotStatusId
|
(lot.lotStatusId
|
||||||
? cityssm.escapeHTML(lot.lotStatus || "")
|
? cityssm.escapeHTML(lot.lotStatus || '')
|
||||||
: '<span class="has-text-grey">(No Status)</span>') +
|
: '<span class="has-text-grey">(No Status)</span>') +
|
||||||
"<br />" +
|
'<br />' +
|
||||||
(lot.lotOccupancyCount > 0
|
(lot.lotOccupancyCount > 0
|
||||||
? '<span class="is-size-7">Currently Occupied</span>'
|
? '<span class="is-size-7">Currently Occupied</span>'
|
||||||
: "") +
|
: '') +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
"</tr>");
|
'</tr>');
|
||||||
}
|
}
|
||||||
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">
|
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">
|
||||||
<thead><tr>
|
<thead><tr>
|
||||||
|
|
@ -54,19 +54,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
<th>Status</th>
|
<th>Status</th>
|
||||||
</tr></thead>
|
</tr></thead>
|
||||||
<table>`;
|
<table>`;
|
||||||
searchResultsContainerElement.insertAdjacentHTML("beforeend", los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count));
|
searchResultsContainerElement.insertAdjacentHTML('beforeend', los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count));
|
||||||
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement);
|
searchResultsContainerElement
|
||||||
|
.querySelector('table')
|
||||||
|
.append(resultsTbodyElement);
|
||||||
(_a = searchResultsContainerElement
|
(_a = searchResultsContainerElement
|
||||||
.querySelector("button[data-page='previous']")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", previousAndGetLots);
|
.querySelector("button[data-page='previous']")) === null || _a === void 0 ? void 0 : _a.addEventListener('click', previousAndGetLots);
|
||||||
(_b = searchResultsContainerElement
|
(_b = searchResultsContainerElement
|
||||||
.querySelector("button[data-page='next']")) === null || _b === void 0 ? void 0 : _b.addEventListener("click", nextAndGetLots);
|
.querySelector("button[data-page='next']")) === null || _b === void 0 ? void 0 : _b.addEventListener('click', nextAndGetLots);
|
||||||
}
|
}
|
||||||
function getLots() {
|
function getLots() {
|
||||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(`Loading ${los.escapedAliases.Lots}...`);
|
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(`Loading ${los.escapedAliases.Lots}...`);
|
||||||
cityssm.postJSON(los.urlPrefix + "/lots/doSearchLots", searchFilterFormElement, renderLots);
|
cityssm.postJSON(los.urlPrefix + '/lots/doSearchLots', searchFilterFormElement, renderLots);
|
||||||
}
|
}
|
||||||
function resetOffsetAndGetLots() {
|
function resetOffsetAndGetLots() {
|
||||||
offsetElement.value = "0";
|
offsetElement.value = '0';
|
||||||
getLots();
|
getLots();
|
||||||
}
|
}
|
||||||
function previousAndGetLots() {
|
function previousAndGetLots() {
|
||||||
|
|
@ -77,11 +79,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString();
|
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString();
|
||||||
getLots();
|
getLots();
|
||||||
}
|
}
|
||||||
const filterElements = searchFilterFormElement.querySelectorAll("input, select");
|
const filterElements = searchFilterFormElement.querySelectorAll('input, select');
|
||||||
for (const filterElement of filterElements) {
|
for (const filterElement of filterElements) {
|
||||||
filterElement.addEventListener("change", resetOffsetAndGetLots);
|
filterElement.addEventListener('change', resetOffsetAndGetLots);
|
||||||
}
|
}
|
||||||
searchFilterFormElement.addEventListener("submit", (formEvent) => {
|
searchFilterFormElement.addEventListener('submit', (formEvent) => {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault();
|
||||||
resetOffsetAndGetLots();
|
resetOffsetAndGetLots();
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,68 +1,78 @@
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||||
|
|
||||||
import type * as globalTypes from "../types/globalTypes";
|
import type * as globalTypes from '../types/globalTypes'
|
||||||
import type * as recordTypes from "../types/recordTypes";
|
import type * as recordTypes from '../types/recordTypes'
|
||||||
|
|
||||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal
|
||||||
|
|
||||||
(() => {
|
;(() => {
|
||||||
const los = exports.los as globalTypes.LOS;
|
const los = exports.los as globalTypes.LOS
|
||||||
|
|
||||||
const searchFilterFormElement = document.querySelector("#form--searchFilters") as HTMLFormElement;
|
const searchFilterFormElement = document.querySelector(
|
||||||
|
'#form--searchFilters'
|
||||||
|
) as HTMLFormElement
|
||||||
|
|
||||||
const searchResultsContainerElement = document.querySelector("#container--searchResults") as HTMLElement;
|
const searchResultsContainerElement = document.querySelector(
|
||||||
|
'#container--searchResults'
|
||||||
|
) as HTMLElement
|
||||||
|
|
||||||
const limit = Number.parseInt(
|
const limit = Number.parseInt(
|
||||||
(document.querySelector("#searchFilter--limit") as HTMLInputElement).value,
|
(document.querySelector('#searchFilter--limit') as HTMLInputElement).value,
|
||||||
10
|
10
|
||||||
);
|
)
|
||||||
const offsetElement = document.querySelector("#searchFilter--offset") as HTMLInputElement;
|
const offsetElement = document.querySelector(
|
||||||
|
'#searchFilter--offset'
|
||||||
|
) as HTMLInputElement
|
||||||
|
|
||||||
function renderLots(responseJSON: { count: number; offset: number; lots: recordTypes.Lot[] }): void {
|
function renderLots(responseJSON: {
|
||||||
|
count: number
|
||||||
|
offset: number
|
||||||
|
lots: recordTypes.Lot[]
|
||||||
|
}): void {
|
||||||
if (responseJSON.lots.length === 0) {
|
if (responseJSON.lots.length === 0) {
|
||||||
searchResultsContainerElement.innerHTML = `<div class="message is-info">
|
searchResultsContainerElement.innerHTML = `<div class="message is-info">
|
||||||
<p class="message-body">There are no ${los.escapedAliases.lots} that meet the search criteria.</p>
|
<p class="message-body">There are no ${los.escapedAliases.lots} that meet the search criteria.</p>
|
||||||
</div>`;
|
</div>`
|
||||||
|
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const resultsTbodyElement = document.createElement("tbody");
|
const resultsTbodyElement = document.createElement('tbody')
|
||||||
|
|
||||||
for (const lot of responseJSON.lots) {
|
for (const lot of responseJSON.lots) {
|
||||||
resultsTbodyElement.insertAdjacentHTML(
|
resultsTbodyElement.insertAdjacentHTML(
|
||||||
"beforeend",
|
'beforeend',
|
||||||
"<tr>" +
|
'<tr>' +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
'<a class="has-text-weight-bold" href="' +
|
'<a class="has-text-weight-bold" href="' +
|
||||||
los.getLotURL(lot.lotId) +
|
los.getLotURL(lot.lotId) +
|
||||||
'">' +
|
'">' +
|
||||||
cityssm.escapeHTML(lot.lotName || "") +
|
cityssm.escapeHTML(lot.lotName || '') +
|
||||||
"</a>" +
|
'</a>' +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
'<a href="' +
|
'<a href="' +
|
||||||
los.getMapURL(lot.mapId!) +
|
los.getMapURL(lot.mapId!) +
|
||||||
'">' +
|
'">' +
|
||||||
(lot.mapName
|
(lot.mapName
|
||||||
? cityssm.escapeHTML(lot.mapName)
|
? cityssm.escapeHTML(lot.mapName)
|
||||||
: '<span class="has-text-grey">(No Name)</span>') +
|
: '<span class="has-text-grey">(No Name)</span>') +
|
||||||
"</a>" +
|
'</a>' +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
("<td>" + cityssm.escapeHTML(lot.lotType || "") + "</td>") +
|
('<td>' + cityssm.escapeHTML(lot.lotType || '') + '</td>') +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
(lot.lotStatusId
|
(lot.lotStatusId
|
||||||
? cityssm.escapeHTML(lot.lotStatus || "")
|
? cityssm.escapeHTML(lot.lotStatus || '')
|
||||||
: '<span class="has-text-grey">(No Status)</span>') +
|
: '<span class="has-text-grey">(No Status)</span>') +
|
||||||
"<br />" +
|
'<br />' +
|
||||||
(lot.lotOccupancyCount! > 0
|
(lot.lotOccupancyCount! > 0
|
||||||
? '<span class="is-size-7">Currently Occupied</span>'
|
? '<span class="is-size-7">Currently Occupied</span>'
|
||||||
: "") +
|
: '') +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
"</tr>"
|
'</tr>'
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">
|
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">
|
||||||
|
|
@ -72,59 +82,74 @@ declare const cityssm: cityssmGlobal;
|
||||||
<th>${los.escapedAliases.Lot} Type</th>
|
<th>${los.escapedAliases.Lot} Type</th>
|
||||||
<th>Status</th>
|
<th>Status</th>
|
||||||
</tr></thead>
|
</tr></thead>
|
||||||
<table>`;
|
<table>`
|
||||||
|
|
||||||
searchResultsContainerElement.insertAdjacentHTML(
|
searchResultsContainerElement.insertAdjacentHTML(
|
||||||
"beforeend",
|
'beforeend',
|
||||||
los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count)
|
los.getSearchResultsPagerHTML(
|
||||||
);
|
limit,
|
||||||
|
responseJSON.offset,
|
||||||
|
responseJSON.count
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
searchResultsContainerElement.querySelector("table")!.append(resultsTbodyElement);
|
searchResultsContainerElement
|
||||||
|
.querySelector('table')!
|
||||||
|
.append(resultsTbodyElement)
|
||||||
|
|
||||||
searchResultsContainerElement
|
searchResultsContainerElement
|
||||||
.querySelector("button[data-page='previous']")
|
.querySelector("button[data-page='previous']")
|
||||||
?.addEventListener("click", previousAndGetLots);
|
?.addEventListener('click', previousAndGetLots)
|
||||||
|
|
||||||
searchResultsContainerElement
|
searchResultsContainerElement
|
||||||
.querySelector("button[data-page='next']")
|
.querySelector("button[data-page='next']")
|
||||||
?.addEventListener("click", nextAndGetLots);
|
?.addEventListener('click', nextAndGetLots)
|
||||||
}
|
}
|
||||||
|
|
||||||
function getLots(): void {
|
function getLots(): void {
|
||||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(
|
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(
|
||||||
`Loading ${los.escapedAliases.Lots}...`
|
`Loading ${los.escapedAliases.Lots}...`
|
||||||
);
|
)
|
||||||
|
|
||||||
cityssm.postJSON(los.urlPrefix + "/lots/doSearchLots", searchFilterFormElement, renderLots);
|
cityssm.postJSON(
|
||||||
|
los.urlPrefix + '/lots/doSearchLots',
|
||||||
|
searchFilterFormElement,
|
||||||
|
renderLots
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
function resetOffsetAndGetLots(): void {
|
function resetOffsetAndGetLots(): void {
|
||||||
offsetElement.value = "0";
|
offsetElement.value = '0'
|
||||||
getLots();
|
getLots()
|
||||||
}
|
}
|
||||||
|
|
||||||
function previousAndGetLots(): void {
|
function previousAndGetLots(): void {
|
||||||
offsetElement.value = Math.max(Number.parseInt(offsetElement.value, 10) - limit, 0).toString();
|
offsetElement.value = Math.max(
|
||||||
getLots();
|
Number.parseInt(offsetElement.value, 10) - limit,
|
||||||
|
0
|
||||||
|
).toString()
|
||||||
|
getLots()
|
||||||
}
|
}
|
||||||
|
|
||||||
function nextAndGetLots(): void {
|
function nextAndGetLots(): void {
|
||||||
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString();
|
offsetElement.value = (
|
||||||
getLots();
|
Number.parseInt(offsetElement.value, 10) + limit
|
||||||
|
).toString()
|
||||||
|
getLots()
|
||||||
}
|
}
|
||||||
|
|
||||||
const filterElements = searchFilterFormElement.querySelectorAll("input, select") as NodeListOf<
|
const filterElements = searchFilterFormElement.querySelectorAll(
|
||||||
HTMLInputElement | HTMLSelectElement
|
'input, select'
|
||||||
>;
|
) as NodeListOf<HTMLInputElement | HTMLSelectElement>
|
||||||
|
|
||||||
for (const filterElement of filterElements) {
|
for (const filterElement of filterElements) {
|
||||||
filterElement.addEventListener("change", resetOffsetAndGetLots);
|
filterElement.addEventListener('change', resetOffsetAndGetLots)
|
||||||
}
|
}
|
||||||
|
|
||||||
searchFilterFormElement.addEventListener("submit", (formEvent) => {
|
searchFilterFormElement.addEventListener('submit', (formEvent) => {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault()
|
||||||
resetOffsetAndGetLots();
|
resetOffsetAndGetLots()
|
||||||
});
|
})
|
||||||
|
|
||||||
getLots();
|
getLots()
|
||||||
})();
|
})()
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,9 @@
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
(() => {
|
(() => {
|
||||||
const mapContainerElement = document.querySelector("#lot--map");
|
const mapContainerElement = document.querySelector('#lot--map');
|
||||||
if (mapContainerElement) {
|
if (mapContainerElement) {
|
||||||
exports.los.highlightMap(mapContainerElement, mapContainerElement.dataset.mapKey, "success");
|
;
|
||||||
|
exports.los.highlightMap(mapContainerElement, mapContainerElement.dataset.mapKey, 'success');
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,14 @@
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||||
|
|
||||||
import * as globalTypes from "../types/globalTypes";
|
import * as globalTypes from '../types/globalTypes'
|
||||||
|
;(() => {
|
||||||
(() => {
|
const mapContainerElement = document.querySelector('#lot--map') as HTMLElement
|
||||||
const mapContainerElement = document.querySelector("#lot--map") as HTMLElement;
|
|
||||||
|
|
||||||
if (mapContainerElement) {
|
if (mapContainerElement) {
|
||||||
(exports.los as globalTypes.LOS).highlightMap(
|
;(exports.los as globalTypes.LOS).highlightMap(
|
||||||
mapContainerElement,
|
mapContainerElement,
|
||||||
mapContainerElement.dataset.mapKey!,
|
mapContainerElement.dataset.mapKey!,
|
||||||
"success"
|
'success'
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
})();
|
})()
|
||||||
|
|
|
||||||
|
|
@ -28,33 +28,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
let svgElementToHighlight;
|
let svgElementToHighlight;
|
||||||
// eslint-disable-next-line no-constant-condition
|
// eslint-disable-next-line no-constant-condition
|
||||||
while (true) {
|
while (true) {
|
||||||
svgElementToHighlight = mapContainerElement.querySelector("#" + svgId);
|
svgElementToHighlight = mapContainerElement.querySelector('#' + svgId);
|
||||||
if (svgElementToHighlight || !svgId.includes("-")) {
|
if (svgElementToHighlight || !svgId.includes('-')) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
svgId = svgId.slice(0, Math.max(0, svgId.lastIndexOf("-")));
|
svgId = svgId.slice(0, Math.max(0, svgId.lastIndexOf('-')));
|
||||||
}
|
}
|
||||||
if (svgElementToHighlight) {
|
if (svgElementToHighlight) {
|
||||||
// eslint-disable-next-line unicorn/no-null
|
// eslint-disable-next-line unicorn/no-null
|
||||||
svgElementToHighlight.style.fill = "";
|
svgElementToHighlight.style.fill = '';
|
||||||
svgElementToHighlight.classList.add("highlight", "is-" + contextualClass);
|
svgElementToHighlight.classList.add('highlight', 'is-' + contextualClass);
|
||||||
const childPathElements = svgElementToHighlight.querySelectorAll("path");
|
const childPathElements = svgElementToHighlight.querySelectorAll('path');
|
||||||
for (const pathElement of childPathElements) {
|
for (const pathElement of childPathElements) {
|
||||||
// eslint-disable-next-line unicorn/no-null
|
// eslint-disable-next-line unicorn/no-null
|
||||||
pathElement.style.fill = "";
|
pathElement.style.fill = '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function unlockField(clickEvent) {
|
function unlockField(clickEvent) {
|
||||||
const fieldElement = clickEvent.currentTarget.closest(".field");
|
const fieldElement = clickEvent.currentTarget.closest('.field');
|
||||||
const inputOrSelectElement = fieldElement.querySelector("input, select");
|
const inputOrSelectElement = fieldElement.querySelector('input, select');
|
||||||
inputOrSelectElement.classList.remove("is-readonly");
|
inputOrSelectElement.classList.remove('is-readonly');
|
||||||
if (inputOrSelectElement.tagName === "INPUT") {
|
if (inputOrSelectElement.tagName === 'INPUT') {
|
||||||
|
;
|
||||||
inputOrSelectElement.readOnly = false;
|
inputOrSelectElement.readOnly = false;
|
||||||
inputOrSelectElement.disabled = false;
|
inputOrSelectElement.disabled = false;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const optionElements = inputOrSelectElement.querySelectorAll("option");
|
const optionElements = inputOrSelectElement.querySelectorAll('option');
|
||||||
for (const optionElement of optionElements) {
|
for (const optionElement of optionElements) {
|
||||||
optionElement.disabled = false;
|
optionElement.disabled = false;
|
||||||
}
|
}
|
||||||
|
|
@ -62,20 +63,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
inputOrSelectElement.focus();
|
inputOrSelectElement.focus();
|
||||||
}
|
}
|
||||||
function initializeUnlockFieldButtons(containerElement) {
|
function initializeUnlockFieldButtons(containerElement) {
|
||||||
const unlockFieldButtonElements = containerElement.querySelectorAll(".is-unlock-field-button");
|
const unlockFieldButtonElements = containerElement.querySelectorAll('.is-unlock-field-button');
|
||||||
for (const unlockFieldButtonElement of unlockFieldButtonElements) {
|
for (const unlockFieldButtonElement of unlockFieldButtonElements) {
|
||||||
unlockFieldButtonElement.addEventListener("click", unlockField);
|
unlockFieldButtonElement.addEventListener('click', unlockField);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Date Pickers
|
* Date Pickers
|
||||||
*/
|
*/
|
||||||
const datePickerBaseOptions = {
|
const datePickerBaseOptions = {
|
||||||
type: "date",
|
type: 'date',
|
||||||
dateFormat: "yyyy-MM-dd",
|
dateFormat: 'yyyy-MM-dd',
|
||||||
showFooter: false,
|
showFooter: false,
|
||||||
color: "info",
|
color: 'info',
|
||||||
displayMode: "dialog"
|
displayMode: 'dialog'
|
||||||
};
|
};
|
||||||
function initializeDatePickers(containerElement) {
|
function initializeDatePickers(containerElement) {
|
||||||
const dateElements = containerElement.querySelectorAll("input[type='date']");
|
const dateElements = containerElement.querySelectorAll("input[type='date']");
|
||||||
|
|
@ -94,35 +95,35 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
const cal = exports.bulmaCalendar.attach(dateElement, datePickerOptions)[0];
|
const cal = exports.bulmaCalendar.attach(dateElement, datePickerOptions)[0];
|
||||||
// trigger change event on original element
|
// trigger change event on original element
|
||||||
cal.on("save", () => {
|
cal.on('save', () => {
|
||||||
dateElement.value = cal.value();
|
dateElement.value = cal.value();
|
||||||
dateElement.dispatchEvent(new Event("change"));
|
dateElement.dispatchEvent(new Event('change'));
|
||||||
});
|
});
|
||||||
// Disable html scrolling when calendar is open
|
// Disable html scrolling when calendar is open
|
||||||
cal.on("show", () => {
|
cal.on('show', () => {
|
||||||
document.querySelector("html").classList.add("is-clipped");
|
document.querySelector('html').classList.add('is-clipped');
|
||||||
});
|
});
|
||||||
// Reenable scrolling, if a modal window is not open
|
// Reenable scrolling, if a modal window is not open
|
||||||
cal.on("hide", () => {
|
cal.on('hide', () => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
});
|
});
|
||||||
// Get the datepicker container element
|
// Get the datepicker container element
|
||||||
const datepickerElement = containerElement.querySelector("#" + cal._id);
|
const datepickerElement = containerElement.querySelector('#' + cal._id);
|
||||||
// Override the previous and next month button styles
|
// Override the previous and next month button styles
|
||||||
const datePickerNavButtonElements = datepickerElement.querySelectorAll(".datepicker-nav button.is-text");
|
const datePickerNavButtonElements = datepickerElement.querySelectorAll('.datepicker-nav button.is-text');
|
||||||
for (const datePickerNavButtonElement of datePickerNavButtonElements) {
|
for (const datePickerNavButtonElement of datePickerNavButtonElements) {
|
||||||
datePickerNavButtonElement.classList.add("is-" + datePickerBaseOptions.color);
|
datePickerNavButtonElement.classList.add('is-' + datePickerBaseOptions.color);
|
||||||
datePickerNavButtonElement.classList.remove("is-text");
|
datePickerNavButtonElement.classList.remove('is-text');
|
||||||
}
|
}
|
||||||
// Override the clear button style
|
// Override the clear button style
|
||||||
const clearButtonElement = datepickerElement.querySelector(".datetimepicker-clear-button");
|
const clearButtonElement = datepickerElement.querySelector('.datetimepicker-clear-button');
|
||||||
if (clearButtonElement) {
|
if (clearButtonElement) {
|
||||||
if (dateElement.required) {
|
if (dateElement.required) {
|
||||||
clearButtonElement.remove();
|
clearButtonElement.remove();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
clearButtonElement.dataset.tooltip = "Clear";
|
clearButtonElement.dataset.tooltip = 'Clear';
|
||||||
clearButtonElement.ariaLabel = "Clear";
|
clearButtonElement.ariaLabel = 'Clear';
|
||||||
clearButtonElement.innerHTML =
|
clearButtonElement.innerHTML =
|
||||||
'<span class="has-text-weight-bold" aria-hidden="true">×</span>';
|
'<span class="has-text-weight-bold" aria-hidden="true">×</span>';
|
||||||
}
|
}
|
||||||
|
|
@ -130,8 +131,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
// Apply a label
|
// Apply a label
|
||||||
const labelElement = document.querySelector("label[for='" + dateElement.id + "']");
|
const labelElement = document.querySelector("label[for='" + dateElement.id + "']");
|
||||||
if (labelElement) {
|
if (labelElement) {
|
||||||
datepickerElement.querySelector(".datetimepicker-dummy-input").ariaLabel =
|
datepickerElement.querySelector('.datetimepicker-dummy-input').ariaLabel = labelElement.textContent;
|
||||||
labelElement.textContent;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -211,38 +211,38 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
* Aliases
|
* Aliases
|
||||||
*/
|
*/
|
||||||
function populateAliases(containerElement) {
|
function populateAliases(containerElement) {
|
||||||
const aliasElements = containerElement.querySelectorAll(".alias");
|
const aliasElements = containerElement.querySelectorAll('.alias');
|
||||||
for (const aliasElement of aliasElements) {
|
for (const aliasElement of aliasElements) {
|
||||||
switch (aliasElement.dataset.alias) {
|
switch (aliasElement.dataset.alias) {
|
||||||
case "Map": {
|
case 'Map': {
|
||||||
aliasElement.textContent = exports.aliases.map;
|
aliasElement.textContent = exports.aliases.map;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "Lot": {
|
case 'Lot': {
|
||||||
aliasElement.textContent = exports.aliases.lot;
|
aliasElement.textContent = exports.aliases.lot;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "lot": {
|
case 'lot': {
|
||||||
aliasElement.textContent = exports.aliases.lot.toLowerCase();
|
aliasElement.textContent = exports.aliases.lot.toLowerCase();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "Occupancy": {
|
case 'Occupancy': {
|
||||||
aliasElement.textContent = exports.aliases.occupancy;
|
aliasElement.textContent = exports.aliases.occupancy;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "occupancy": {
|
case 'occupancy': {
|
||||||
aliasElement.textContent = exports.aliases.occupancy.toLowerCase();
|
aliasElement.textContent = exports.aliases.occupancy.toLowerCase();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "Occupant": {
|
case 'Occupant': {
|
||||||
aliasElement.textContent = exports.aliases.occupant;
|
aliasElement.textContent = exports.aliases.occupant;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "occupant": {
|
case 'occupant': {
|
||||||
aliasElement.textContent = exports.aliases.occupant.toLowerCase();
|
aliasElement.textContent = exports.aliases.occupant.toLowerCase();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "ExternalReceiptNumber": {
|
case 'ExternalReceiptNumber': {
|
||||||
aliasElement.textContent = exports.aliases.externalReceiptNumber;
|
aliasElement.textContent = exports.aliases.externalReceiptNumber;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -278,17 +278,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
/*
|
/*
|
||||||
* Colours
|
* Colours
|
||||||
*/
|
*/
|
||||||
const hues = ["red", "green", "orange", "blue", "pink", "yellow", "purple"];
|
const hues = ['red', 'green', 'orange', 'blue', 'pink', 'yellow', 'purple'];
|
||||||
const luminosity = ["bright", "light", "dark"];
|
const luminosity = ['bright', 'light', 'dark'];
|
||||||
function getRandomColor(seedString) {
|
function getRandomColor(seedString) {
|
||||||
let actualSeedString = seedString;
|
let actualSeedString = seedString;
|
||||||
if (actualSeedString.length < 2) {
|
if (actualSeedString.length < 2) {
|
||||||
actualSeedString = actualSeedString + "a1";
|
actualSeedString = actualSeedString + 'a1';
|
||||||
}
|
}
|
||||||
return exports.randomColor({
|
return exports.randomColor({
|
||||||
seed: actualSeedString + actualSeedString,
|
seed: actualSeedString + actualSeedString,
|
||||||
hue: hues[actualSeedString.codePointAt(actualSeedString.length - 1) % hues.length],
|
hue: hues[actualSeedString.codePointAt(actualSeedString.length - 1) % hues.length],
|
||||||
luminosity: luminosity[actualSeedString.codePointAt(actualSeedString.length - 2) % luminosity.length]
|
luminosity: luminosity[actualSeedString.codePointAt(actualSeedString.length - 2) %
|
||||||
|
luminosity.length]
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
|
@ -298,21 +299,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
return `<div class="field has-addons">
|
return `<div class="field has-addons">
|
||||||
<div class="control">
|
<div class="control">
|
||||||
<button
|
<button
|
||||||
class="button ${isSmall ? "is-small" : ""} ${upButtonClassNames}"
|
class="button ${isSmall ? 'is-small' : ''} ${upButtonClassNames}"
|
||||||
data-tooltip="Move Up" data-direction="up" type="button" aria-label="Move Up">
|
data-tooltip="Move Up" data-direction="up" type="button" aria-label="Move Up">
|
||||||
<i class="fas fa-arrow-up" aria-hidden="true"></i>
|
<i class="fas fa-arrow-up" aria-hidden="true"></i>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="control">
|
<div class="control">
|
||||||
<button
|
<button
|
||||||
class="button ${isSmall ? "is-small" : ""} ${downButtonClassNames}"
|
class="button ${isSmall ? 'is-small' : ''} ${downButtonClassNames}"
|
||||||
data-tooltip="Move Down" data-direction="down" type="button" aria-label="Move Down">
|
data-tooltip="Move Down" data-direction="down" type="button" aria-label="Move Down">
|
||||||
<i class="fas fa-arrow-down" aria-hidden="true"></i>
|
<i class="fas fa-arrow-down" aria-hidden="true"></i>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>`;
|
</div>`;
|
||||||
}
|
}
|
||||||
function getLoadingParagraphHTML(captionText = "Loading...") {
|
function getLoadingParagraphHTML(captionText = 'Loading...') {
|
||||||
return `<p class="has-text-centered has-text-grey">
|
return `<p class="has-text-centered has-text-grey">
|
||||||
<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />
|
<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />
|
||||||
${cityssm.escapeHTML(captionText)}
|
${cityssm.escapeHTML(captionText)}
|
||||||
|
|
@ -322,63 +323,63 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
return ('<div class="level">' +
|
return ('<div class="level">' +
|
||||||
('<div class="level-left">' +
|
('<div class="level-left">' +
|
||||||
'<div class="level-item has-text-weight-bold">' +
|
'<div class="level-item has-text-weight-bold">' +
|
||||||
"Displaying " +
|
'Displaying ' +
|
||||||
(offset + 1).toString() +
|
(offset + 1).toString() +
|
||||||
" to " +
|
' to ' +
|
||||||
Math.min(count, limit + offset) +
|
Math.min(count, limit + offset) +
|
||||||
" of " +
|
' of ' +
|
||||||
count +
|
count +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="level-right">' +
|
('<div class="level-right">' +
|
||||||
(offset > 0
|
(offset > 0
|
||||||
? '<div class="level-item">' +
|
? '<div class="level-item">' +
|
||||||
'<button class="button is-rounded is-link is-outlined" data-page="previous" type="button" title="Previous">' +
|
'<button class="button is-rounded is-link is-outlined" data-page="previous" type="button" title="Previous">' +
|
||||||
'<i class="fas fa-arrow-left" aria-hidden="true"></i>' +
|
'<i class="fas fa-arrow-left" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>"
|
'</div>'
|
||||||
: "") +
|
: '') +
|
||||||
(limit + offset < count
|
(limit + offset < count
|
||||||
? '<div class="level-item">' +
|
? '<div class="level-item">' +
|
||||||
'<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
|
'<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
|
||||||
"<span>Next</span>" +
|
'<span>Next</span>' +
|
||||||
'<span class="icon"><i class="fas fa-arrow-right" aria-hidden="true"></i></span>' +
|
'<span class="icon"><i class="fas fa-arrow-right" aria-hidden="true"></i></span>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>"
|
'</div>'
|
||||||
: "") +
|
: '') +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>");
|
'</div>');
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* URLs
|
* URLs
|
||||||
*/
|
*/
|
||||||
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
const urlPrefix = document.querySelector('main').dataset.urlPrefix;
|
||||||
function getRecordURL(recordTypePlural, recordId, edit, time) {
|
function getRecordURL(recordTypePlural, recordId, edit, time) {
|
||||||
return (urlPrefix +
|
return (urlPrefix +
|
||||||
"/" +
|
'/' +
|
||||||
recordTypePlural +
|
recordTypePlural +
|
||||||
(recordId ? "/" + recordId : "") +
|
(recordId ? '/' + recordId : '') +
|
||||||
(recordId && edit ? "/edit" : "") +
|
(recordId && edit ? '/edit' : '') +
|
||||||
(time ? "/?t=" + Date.now() : ""));
|
(time ? '/?t=' + Date.now() : ''));
|
||||||
}
|
}
|
||||||
function getMapURL(mapId = "", edit = false, time = false) {
|
function getMapURL(mapId = '', edit = false, time = false) {
|
||||||
return getRecordURL("maps", mapId, edit, time);
|
return getRecordURL('maps', mapId, edit, time);
|
||||||
}
|
}
|
||||||
function getLotURL(lotId = "", edit = false, time = false) {
|
function getLotURL(lotId = '', edit = false, time = false) {
|
||||||
return getRecordURL("lots", lotId, edit, time);
|
return getRecordURL('lots', lotId, edit, time);
|
||||||
}
|
}
|
||||||
function getLotOccupancyURL(lotOccupancyId = "", edit = false, time = false) {
|
function getLotOccupancyURL(lotOccupancyId = '', edit = false, time = false) {
|
||||||
return getRecordURL("lotOccupancies", lotOccupancyId, edit, time);
|
return getRecordURL('lotOccupancies', lotOccupancyId, edit, time);
|
||||||
}
|
}
|
||||||
function getWorkOrderURL(workOrderId = "", edit = false, time = false) {
|
function getWorkOrderURL(workOrderId = '', edit = false, time = false) {
|
||||||
return getRecordURL("workOrders", workOrderId, edit, time);
|
return getRecordURL('workOrders', workOrderId, edit, time);
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Declare LOS
|
* Declare LOS
|
||||||
*/
|
*/
|
||||||
const los = {
|
const los = {
|
||||||
urlPrefix,
|
urlPrefix,
|
||||||
apiKey: document.querySelector("main").dataset.apiKey,
|
apiKey: document.querySelector('main').dataset.apiKey,
|
||||||
highlightMap,
|
highlightMap,
|
||||||
initializeUnlockFieldButtons,
|
initializeUnlockFieldButtons,
|
||||||
initializeDatePickers,
|
initializeDatePickers,
|
||||||
|
|
|
||||||
|
|
@ -1,34 +1,34 @@
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||||
|
|
||||||
import type * as globalTypes from "../types/globalTypes";
|
import type * as globalTypes from '../types/globalTypes'
|
||||||
import type { Options as BulmaCalendarOptions } from "bulma-calendar";
|
import type { Options as BulmaCalendarOptions } from 'bulma-calendar'
|
||||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal
|
||||||
declare const bulmaJS: BulmaJS;
|
declare const bulmaJS: BulmaJS
|
||||||
|
|
||||||
(() => {
|
;(() => {
|
||||||
/*
|
/*
|
||||||
* Unsaved Changes
|
* Unsaved Changes
|
||||||
*/
|
*/
|
||||||
|
|
||||||
let _hasUnsavedChanges = false;
|
let _hasUnsavedChanges = false
|
||||||
|
|
||||||
function setUnsavedChanges() {
|
function setUnsavedChanges() {
|
||||||
if (!hasUnsavedChanges()) {
|
if (!hasUnsavedChanges()) {
|
||||||
_hasUnsavedChanges = true;
|
_hasUnsavedChanges = true
|
||||||
cityssm.enableNavBlocker();
|
cityssm.enableNavBlocker()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function clearUnsavedChanges() {
|
function clearUnsavedChanges() {
|
||||||
_hasUnsavedChanges = false;
|
_hasUnsavedChanges = false
|
||||||
cityssm.disableNavBlocker();
|
cityssm.disableNavBlocker()
|
||||||
}
|
}
|
||||||
|
|
||||||
function hasUnsavedChanges() {
|
function hasUnsavedChanges() {
|
||||||
return _hasUnsavedChanges;
|
return _hasUnsavedChanges
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -38,64 +38,68 @@ declare const bulmaJS: BulmaJS;
|
||||||
function highlightMap(
|
function highlightMap(
|
||||||
mapContainerElement: HTMLElement,
|
mapContainerElement: HTMLElement,
|
||||||
mapKey: string,
|
mapKey: string,
|
||||||
contextualClass: "success" | "danger"
|
contextualClass: 'success' | 'danger'
|
||||||
): void {
|
): void {
|
||||||
// Search for ID
|
// Search for ID
|
||||||
let svgId = mapKey;
|
let svgId = mapKey
|
||||||
let svgElementToHighlight: SVGElement | null;
|
let svgElementToHighlight: SVGElement | null
|
||||||
|
|
||||||
// eslint-disable-next-line no-constant-condition
|
// eslint-disable-next-line no-constant-condition
|
||||||
while (true) {
|
while (true) {
|
||||||
svgElementToHighlight = mapContainerElement.querySelector("#" + svgId);
|
svgElementToHighlight = mapContainerElement.querySelector('#' + svgId)
|
||||||
|
|
||||||
if (svgElementToHighlight || !svgId.includes("-")) {
|
if (svgElementToHighlight || !svgId.includes('-')) {
|
||||||
break;
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
svgId = svgId.slice(0, Math.max(0, svgId.lastIndexOf("-")));
|
svgId = svgId.slice(0, Math.max(0, svgId.lastIndexOf('-')))
|
||||||
}
|
}
|
||||||
|
|
||||||
if (svgElementToHighlight) {
|
if (svgElementToHighlight) {
|
||||||
// eslint-disable-next-line unicorn/no-null
|
// eslint-disable-next-line unicorn/no-null
|
||||||
svgElementToHighlight.style.fill = "";
|
svgElementToHighlight.style.fill = ''
|
||||||
|
|
||||||
svgElementToHighlight.classList.add("highlight", "is-" + contextualClass);
|
svgElementToHighlight.classList.add('highlight', 'is-' + contextualClass)
|
||||||
|
|
||||||
const childPathElements = svgElementToHighlight.querySelectorAll("path");
|
const childPathElements = svgElementToHighlight.querySelectorAll('path')
|
||||||
for (const pathElement of childPathElements) {
|
for (const pathElement of childPathElements) {
|
||||||
// eslint-disable-next-line unicorn/no-null
|
// eslint-disable-next-line unicorn/no-null
|
||||||
pathElement.style.fill = "";
|
pathElement.style.fill = ''
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function unlockField(clickEvent: Event): void {
|
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
|
| HTMLInputElement
|
||||||
| HTMLSelectElement;
|
| HTMLSelectElement
|
||||||
|
|
||||||
inputOrSelectElement.classList.remove("is-readonly");
|
inputOrSelectElement.classList.remove('is-readonly')
|
||||||
|
|
||||||
if (inputOrSelectElement.tagName === "INPUT") {
|
if (inputOrSelectElement.tagName === 'INPUT') {
|
||||||
(inputOrSelectElement as HTMLInputElement).readOnly = false;
|
;(inputOrSelectElement as HTMLInputElement).readOnly = false
|
||||||
(inputOrSelectElement as HTMLInputElement).disabled = false;
|
;(inputOrSelectElement as HTMLInputElement).disabled = false
|
||||||
} else {
|
} else {
|
||||||
const optionElements = inputOrSelectElement.querySelectorAll("option");
|
const optionElements = inputOrSelectElement.querySelectorAll('option')
|
||||||
for (const optionElement of optionElements) {
|
for (const optionElement of optionElements) {
|
||||||
optionElement.disabled = false;
|
optionElement.disabled = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inputOrSelectElement.focus();
|
inputOrSelectElement.focus()
|
||||||
}
|
}
|
||||||
|
|
||||||
function initializeUnlockFieldButtons(containerElement: HTMLElement): void {
|
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) {
|
for (const unlockFieldButtonElement of unlockFieldButtonElements) {
|
||||||
unlockFieldButtonElement.addEventListener("click", unlockField);
|
unlockFieldButtonElement.addEventListener('click', unlockField)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -104,88 +108,98 @@ declare const bulmaJS: BulmaJS;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const datePickerBaseOptions: BulmaCalendarOptions = {
|
const datePickerBaseOptions: BulmaCalendarOptions = {
|
||||||
type: "date",
|
type: 'date',
|
||||||
dateFormat: "yyyy-MM-dd",
|
dateFormat: 'yyyy-MM-dd',
|
||||||
showFooter: false,
|
showFooter: false,
|
||||||
color: "info",
|
color: 'info',
|
||||||
displayMode: "dialog"
|
displayMode: 'dialog'
|
||||||
};
|
}
|
||||||
|
|
||||||
function initializeDatePickers(containerElement: HTMLElement): void {
|
function initializeDatePickers(containerElement: HTMLElement): void {
|
||||||
const dateElements = containerElement.querySelectorAll(
|
const dateElements = containerElement.querySelectorAll(
|
||||||
"input[type='date']"
|
"input[type='date']"
|
||||||
) as NodeListOf<HTMLInputElement>;
|
) as NodeListOf<HTMLInputElement>
|
||||||
|
|
||||||
for (const dateElement of dateElements) {
|
for (const dateElement of dateElements) {
|
||||||
const datePickerOptions = Object.assign({}, datePickerBaseOptions);
|
const datePickerOptions = Object.assign({}, datePickerBaseOptions)
|
||||||
|
|
||||||
if (dateElement.required) {
|
if (dateElement.required) {
|
||||||
datePickerOptions.showClearButton = false;
|
datePickerOptions.showClearButton = false
|
||||||
}
|
}
|
||||||
|
|
||||||
// apply min date if set
|
// apply min date if set
|
||||||
if (dateElement.min) {
|
if (dateElement.min) {
|
||||||
datePickerOptions.minDate = cityssm.dateStringToDate(dateElement.min);
|
datePickerOptions.minDate = cityssm.dateStringToDate(dateElement.min)
|
||||||
}
|
}
|
||||||
|
|
||||||
// apply max date if set
|
// apply max date if set
|
||||||
if (dateElement.max) {
|
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
|
// trigger change event on original element
|
||||||
cal.on("save", () => {
|
cal.on('save', () => {
|
||||||
dateElement.value = cal.value();
|
dateElement.value = cal.value()
|
||||||
dateElement.dispatchEvent(new Event("change"));
|
dateElement.dispatchEvent(new Event('change'))
|
||||||
});
|
})
|
||||||
|
|
||||||
// Disable html scrolling when calendar is open
|
// Disable html scrolling when calendar is open
|
||||||
cal.on("show", () => {
|
cal.on('show', () => {
|
||||||
document.querySelector("html")!.classList.add("is-clipped");
|
document.querySelector('html')!.classList.add('is-clipped')
|
||||||
});
|
})
|
||||||
|
|
||||||
// Reenable scrolling, if a modal window is not open
|
// Reenable scrolling, if a modal window is not open
|
||||||
cal.on("hide", () => {
|
cal.on('hide', () => {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
});
|
})
|
||||||
|
|
||||||
// Get the datepicker container element
|
// Get the datepicker container element
|
||||||
const datepickerElement = containerElement.querySelector("#" + cal._id) as HTMLElement;
|
const datepickerElement = containerElement.querySelector(
|
||||||
|
'#' + cal._id
|
||||||
|
) as HTMLElement
|
||||||
|
|
||||||
// Override the previous and next month button styles
|
// Override the previous and next month button styles
|
||||||
const datePickerNavButtonElements = datepickerElement.querySelectorAll(
|
const datePickerNavButtonElements = datepickerElement.querySelectorAll(
|
||||||
".datepicker-nav button.is-text"
|
'.datepicker-nav button.is-text'
|
||||||
);
|
)
|
||||||
|
|
||||||
for (const datePickerNavButtonElement of datePickerNavButtonElements) {
|
for (const datePickerNavButtonElement of datePickerNavButtonElements) {
|
||||||
datePickerNavButtonElement.classList.add("is-" + datePickerBaseOptions.color);
|
datePickerNavButtonElement.classList.add(
|
||||||
datePickerNavButtonElement.classList.remove("is-text");
|
'is-' + datePickerBaseOptions.color
|
||||||
|
)
|
||||||
|
datePickerNavButtonElement.classList.remove('is-text')
|
||||||
}
|
}
|
||||||
|
|
||||||
// Override the clear button style
|
// Override the clear button style
|
||||||
const clearButtonElement = datepickerElement.querySelector(
|
const clearButtonElement = datepickerElement.querySelector(
|
||||||
".datetimepicker-clear-button"
|
'.datetimepicker-clear-button'
|
||||||
) as HTMLElement;
|
) as HTMLElement
|
||||||
|
|
||||||
if (clearButtonElement) {
|
if (clearButtonElement) {
|
||||||
if (dateElement.required) {
|
if (dateElement.required) {
|
||||||
clearButtonElement.remove();
|
clearButtonElement.remove()
|
||||||
} else {
|
} else {
|
||||||
clearButtonElement.dataset.tooltip = "Clear";
|
clearButtonElement.dataset.tooltip = 'Clear'
|
||||||
clearButtonElement.ariaLabel = "Clear";
|
clearButtonElement.ariaLabel = 'Clear'
|
||||||
clearButtonElement.innerHTML =
|
clearButtonElement.innerHTML =
|
||||||
'<span class="has-text-weight-bold" aria-hidden="true">×</span>';
|
'<span class="has-text-weight-bold" aria-hidden="true">×</span>'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply a label
|
// Apply a label
|
||||||
const labelElement = document.querySelector("label[for='" + dateElement.id + "']");
|
const labelElement = document.querySelector(
|
||||||
|
"label[for='" + dateElement.id + "']"
|
||||||
|
)
|
||||||
|
|
||||||
if (labelElement) {
|
if (labelElement) {
|
||||||
datepickerElement.querySelector(".datetimepicker-dummy-input")!.ariaLabel =
|
datepickerElement.querySelector(
|
||||||
labelElement.textContent;
|
'.datetimepicker-dummy-input'
|
||||||
|
)!.ariaLabel = labelElement.textContent
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -268,41 +282,43 @@ declare const bulmaJS: BulmaJS;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
function populateAliases(containerElement: HTMLElement): void {
|
function populateAliases(containerElement: HTMLElement): void {
|
||||||
const aliasElements = containerElement.querySelectorAll(".alias") as NodeListOf<HTMLElement>;
|
const aliasElements = containerElement.querySelectorAll(
|
||||||
|
'.alias'
|
||||||
|
) as NodeListOf<HTMLElement>
|
||||||
|
|
||||||
for (const aliasElement of aliasElements) {
|
for (const aliasElement of aliasElements) {
|
||||||
switch (aliasElement.dataset.alias) {
|
switch (aliasElement.dataset.alias) {
|
||||||
case "Map": {
|
case 'Map': {
|
||||||
aliasElement.textContent = exports.aliases.map;
|
aliasElement.textContent = exports.aliases.map
|
||||||
break;
|
break
|
||||||
}
|
}
|
||||||
case "Lot": {
|
case 'Lot': {
|
||||||
aliasElement.textContent = exports.aliases.lot;
|
aliasElement.textContent = exports.aliases.lot
|
||||||
break;
|
break
|
||||||
}
|
}
|
||||||
case "lot": {
|
case 'lot': {
|
||||||
aliasElement.textContent = exports.aliases.lot.toLowerCase();
|
aliasElement.textContent = exports.aliases.lot.toLowerCase()
|
||||||
break;
|
break
|
||||||
}
|
}
|
||||||
case "Occupancy": {
|
case 'Occupancy': {
|
||||||
aliasElement.textContent = exports.aliases.occupancy;
|
aliasElement.textContent = exports.aliases.occupancy
|
||||||
break;
|
break
|
||||||
}
|
}
|
||||||
case "occupancy": {
|
case 'occupancy': {
|
||||||
aliasElement.textContent = exports.aliases.occupancy.toLowerCase();
|
aliasElement.textContent = exports.aliases.occupancy.toLowerCase()
|
||||||
break;
|
break
|
||||||
}
|
}
|
||||||
case "Occupant": {
|
case 'Occupant': {
|
||||||
aliasElement.textContent = exports.aliases.occupant;
|
aliasElement.textContent = exports.aliases.occupant
|
||||||
break;
|
break
|
||||||
}
|
}
|
||||||
case "occupant": {
|
case 'occupant': {
|
||||||
aliasElement.textContent = exports.aliases.occupant.toLowerCase();
|
aliasElement.textContent = exports.aliases.occupant.toLowerCase()
|
||||||
break;
|
break
|
||||||
}
|
}
|
||||||
case "ExternalReceiptNumber": {
|
case 'ExternalReceiptNumber': {
|
||||||
aliasElement.textContent = exports.aliases.externalReceiptNumber;
|
aliasElement.textContent = exports.aliases.externalReceiptNumber
|
||||||
break;
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -329,39 +345,54 @@ declare const bulmaJS: BulmaJS;
|
||||||
Occupants: cityssm.escapeHTML(exports.aliases.occupants),
|
Occupants: cityssm.escapeHTML(exports.aliases.occupants),
|
||||||
occupants: cityssm.escapeHTML(exports.aliases.occupants.toLowerCase()),
|
occupants: cityssm.escapeHTML(exports.aliases.occupants.toLowerCase()),
|
||||||
|
|
||||||
ExternalReceiptNumber: cityssm.escapeHTML(exports.aliases.externalReceiptNumber),
|
ExternalReceiptNumber: cityssm.escapeHTML(
|
||||||
externalReceiptNumber: cityssm.escapeHTML(exports.aliases.externalReceiptNumber.toLowerCase()),
|
exports.aliases.externalReceiptNumber
|
||||||
|
),
|
||||||
|
externalReceiptNumber: cityssm.escapeHTML(
|
||||||
|
exports.aliases.externalReceiptNumber.toLowerCase()
|
||||||
|
),
|
||||||
|
|
||||||
OccupancyStartDate: cityssm.escapeHTML(exports.aliases.occupancyStartDate),
|
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),
|
||||||
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),
|
||||||
workOrderCloseDate: cityssm.escapeHTML(exports.aliases.workOrderCloseDate.toLowerCase())
|
workOrderCloseDate: cityssm.escapeHTML(
|
||||||
});
|
exports.aliases.workOrderCloseDate.toLowerCase()
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Colours
|
* Colours
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const hues = ["red", "green", "orange", "blue", "pink", "yellow", "purple"];
|
const hues = ['red', 'green', 'orange', 'blue', 'pink', 'yellow', 'purple']
|
||||||
const luminosity = ["bright", "light", "dark"];
|
const luminosity = ['bright', 'light', 'dark']
|
||||||
|
|
||||||
function getRandomColor(seedString: string) {
|
function getRandomColor(seedString: string) {
|
||||||
let actualSeedString = seedString;
|
let actualSeedString = seedString
|
||||||
|
|
||||||
if (actualSeedString.length < 2) {
|
if (actualSeedString.length < 2) {
|
||||||
actualSeedString = actualSeedString + "a1";
|
actualSeedString = actualSeedString + 'a1'
|
||||||
}
|
}
|
||||||
|
|
||||||
return exports.randomColor({
|
return exports.randomColor({
|
||||||
seed: actualSeedString + actualSeedString,
|
seed: actualSeedString + actualSeedString,
|
||||||
hue: hues[actualSeedString.codePointAt(actualSeedString.length - 1)! % hues.length],
|
hue: hues[
|
||||||
|
actualSeedString.codePointAt(actualSeedString.length - 1)! % hues.length
|
||||||
|
],
|
||||||
luminosity:
|
luminosity:
|
||||||
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">
|
return `<div class="field has-addons">
|
||||||
<div class="control">
|
<div class="control">
|
||||||
<button
|
<button
|
||||||
class="button ${isSmall ? "is-small" : ""} ${upButtonClassNames}"
|
class="button ${
|
||||||
|
isSmall ? 'is-small' : ''
|
||||||
|
} ${upButtonClassNames}"
|
||||||
data-tooltip="Move Up" data-direction="up" type="button" aria-label="Move Up">
|
data-tooltip="Move Up" data-direction="up" type="button" aria-label="Move Up">
|
||||||
<i class="fas fa-arrow-up" aria-hidden="true"></i>
|
<i class="fas fa-arrow-up" aria-hidden="true"></i>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="control">
|
<div class="control">
|
||||||
<button
|
<button
|
||||||
class="button ${isSmall ? "is-small" : ""} ${downButtonClassNames}"
|
class="button ${
|
||||||
|
isSmall ? 'is-small' : ''
|
||||||
|
} ${downButtonClassNames}"
|
||||||
data-tooltip="Move Down" data-direction="down" type="button" aria-label="Move Down">
|
data-tooltip="Move Down" data-direction="down" type="button" aria-label="Move Down">
|
||||||
<i class="fas fa-arrow-down" aria-hidden="true"></i>
|
<i class="fas fa-arrow-down" aria-hidden="true"></i>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>`;
|
</div>`
|
||||||
}
|
}
|
||||||
|
|
||||||
function getLoadingParagraphHTML(captionText = "Loading..."): string {
|
function getLoadingParagraphHTML(captionText = 'Loading...'): string {
|
||||||
return `<p class="has-text-centered has-text-grey">
|
return `<p class="has-text-centered has-text-grey">
|
||||||
<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />
|
<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />
|
||||||
${cityssm.escapeHTML(captionText)}
|
${cityssm.escapeHTML(captionText)}
|
||||||
</p>`;
|
</p>`
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSearchResultsPagerHTML(limit: number, offset: number, count: number) {
|
function getSearchResultsPagerHTML(
|
||||||
|
limit: number,
|
||||||
|
offset: number,
|
||||||
|
count: number
|
||||||
|
) {
|
||||||
return (
|
return (
|
||||||
'<div class="level">' +
|
'<div class="level">' +
|
||||||
('<div class="level-left">' +
|
('<div class="level-left">' +
|
||||||
'<div class="level-item has-text-weight-bold">' +
|
'<div class="level-item has-text-weight-bold">' +
|
||||||
"Displaying " +
|
'Displaying ' +
|
||||||
(offset + 1).toString() +
|
(offset + 1).toString() +
|
||||||
" to " +
|
' to ' +
|
||||||
Math.min(count, limit + offset) +
|
Math.min(count, limit + offset) +
|
||||||
" of " +
|
' of ' +
|
||||||
count +
|
count +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="level-right">' +
|
('<div class="level-right">' +
|
||||||
(offset > 0
|
(offset > 0
|
||||||
? '<div class="level-item">' +
|
? '<div class="level-item">' +
|
||||||
'<button class="button is-rounded is-link is-outlined" data-page="previous" type="button" title="Previous">' +
|
'<button class="button is-rounded is-link is-outlined" data-page="previous" type="button" title="Previous">' +
|
||||||
'<i class="fas fa-arrow-left" aria-hidden="true"></i>' +
|
'<i class="fas fa-arrow-left" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>"
|
'</div>'
|
||||||
: "") +
|
: '') +
|
||||||
(limit + offset < count
|
(limit + offset < count
|
||||||
? '<div class="level-item">' +
|
? '<div class="level-item">' +
|
||||||
'<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
|
'<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
|
||||||
"<span>Next</span>" +
|
'<span>Next</span>' +
|
||||||
'<span class="icon"><i class="fas fa-arrow-right" aria-hidden="true"></i></span>' +
|
'<span class="icon"><i class="fas fa-arrow-right" aria-hidden="true"></i></span>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>"
|
'</div>'
|
||||||
: "") +
|
: '') +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>"
|
'</div>'
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* URLs
|
* URLs
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const urlPrefix = document.querySelector("main")!.dataset.urlPrefix!;
|
const urlPrefix = document.querySelector('main')!.dataset.urlPrefix!
|
||||||
|
|
||||||
function getRecordURL(
|
function getRecordURL(
|
||||||
recordTypePlural: "maps" | "lots" | "lotOccupancies" | "workOrders",
|
recordTypePlural: 'maps' | 'lots' | 'lotOccupancies' | 'workOrders',
|
||||||
recordId: number | string,
|
recordId: number | string,
|
||||||
edit: boolean,
|
edit: boolean,
|
||||||
time: boolean
|
time: boolean
|
||||||
): string {
|
): string {
|
||||||
return (
|
return (
|
||||||
urlPrefix +
|
urlPrefix +
|
||||||
"/" +
|
'/' +
|
||||||
recordTypePlural +
|
recordTypePlural +
|
||||||
(recordId ? "/" + recordId : "") +
|
(recordId ? '/' + recordId : '') +
|
||||||
(recordId && edit ? "/edit" : "") +
|
(recordId && edit ? '/edit' : '') +
|
||||||
(time ? "/?t=" + Date.now() : "")
|
(time ? '/?t=' + Date.now() : '')
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
function getMapURL(mapId: number | string = "", edit = false, time = false) {
|
function getMapURL(mapId: number | string = '', edit = false, time = false) {
|
||||||
return getRecordURL("maps", mapId, edit, time);
|
return getRecordURL('maps', mapId, edit, time)
|
||||||
}
|
}
|
||||||
|
|
||||||
function getLotURL(lotId: number | string = "", edit = false, time = false) {
|
function getLotURL(lotId: number | string = '', edit = false, time = false) {
|
||||||
return getRecordURL("lots", lotId, edit, time);
|
return getRecordURL('lots', lotId, edit, time)
|
||||||
}
|
}
|
||||||
|
|
||||||
function getLotOccupancyURL(lotOccupancyId: number | string = "", edit = false, time = false) {
|
function getLotOccupancyURL(
|
||||||
return getRecordURL("lotOccupancies", lotOccupancyId, edit, time);
|
lotOccupancyId: number | string = '',
|
||||||
|
edit = false,
|
||||||
|
time = false
|
||||||
|
) {
|
||||||
|
return getRecordURL('lotOccupancies', lotOccupancyId, edit, time)
|
||||||
}
|
}
|
||||||
|
|
||||||
function getWorkOrderURL(workOrderId: number | string = "", edit = false, time = false) {
|
function getWorkOrderURL(
|
||||||
return getRecordURL("workOrders", workOrderId, edit, time);
|
workOrderId: number | string = '',
|
||||||
|
edit = false,
|
||||||
|
time = false
|
||||||
|
) {
|
||||||
|
return getRecordURL('workOrders', workOrderId, edit, time)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -476,7 +523,7 @@ declare const bulmaJS: BulmaJS;
|
||||||
|
|
||||||
const los: globalTypes.LOS = {
|
const los: globalTypes.LOS = {
|
||||||
urlPrefix,
|
urlPrefix,
|
||||||
apiKey: document.querySelector("main")!.dataset.apiKey!,
|
apiKey: document.querySelector('main')!.dataset.apiKey!,
|
||||||
highlightMap,
|
highlightMap,
|
||||||
initializeUnlockFieldButtons,
|
initializeUnlockFieldButtons,
|
||||||
initializeDatePickers,
|
initializeDatePickers,
|
||||||
|
|
@ -498,7 +545,7 @@ declare const bulmaJS: BulmaJS;
|
||||||
getLotURL,
|
getLotURL,
|
||||||
getLotOccupancyURL,
|
getLotOccupancyURL,
|
||||||
getWorkOrderURL
|
getWorkOrderURL
|
||||||
};
|
}
|
||||||
|
|
||||||
exports.los = los;
|
exports.los = los
|
||||||
})();
|
})()
|
||||||
|
|
|
||||||
|
|
@ -4,42 +4,45 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
(() => {
|
(() => {
|
||||||
var _a;
|
var _a;
|
||||||
const los = exports.los;
|
const los = exports.los;
|
||||||
const mapId = document.querySelector("#map--mapId").value;
|
const mapId = document.querySelector('#map--mapId')
|
||||||
const isCreate = mapId === "";
|
.value;
|
||||||
const mapForm = document.querySelector("#form--map");
|
const isCreate = mapId === '';
|
||||||
|
const mapForm = document.querySelector('#form--map');
|
||||||
function updateMap(formEvent) {
|
function updateMap(formEvent) {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/maps/" + (isCreate ? "doCreateMap" : "doUpdateMap"), mapForm, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/maps/' + (isCreate ? 'doCreateMap' : 'doUpdateMap'), mapForm, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
cityssm.disableNavBlocker();
|
cityssm.disableNavBlocker();
|
||||||
if (isCreate) {
|
if (isCreate) {
|
||||||
window.location.href = los.urlPrefix + "/maps/" + responseJSON.mapId + "/edit";
|
window.location.href =
|
||||||
|
los.urlPrefix + '/maps/' + responseJSON.mapId + '/edit';
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: exports.aliases.map + " Updated Successfully",
|
message: exports.aliases.map + ' Updated Successfully',
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating " + exports.aliases.map,
|
title: 'Error Updating ' + exports.aliases.map,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
mapForm.addEventListener("submit", updateMap);
|
mapForm.addEventListener('submit', updateMap);
|
||||||
const inputElements = mapForm.querySelectorAll("input, select");
|
const inputElements = mapForm.querySelectorAll('input, select');
|
||||||
for (const inputElement of inputElements) {
|
for (const inputElement of inputElements) {
|
||||||
inputElement.addEventListener("change", cityssm.enableNavBlocker);
|
inputElement.addEventListener('change', cityssm.enableNavBlocker);
|
||||||
}
|
}
|
||||||
(_a = document.querySelector("#button--deleteMap")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", (clickEvent) => {
|
(_a = document
|
||||||
|
.querySelector('#button--deleteMap')) === null || _a === void 0 ? void 0 : _a.addEventListener('click', (clickEvent) => {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault();
|
||||||
function doDelete() {
|
function doDelete() {
|
||||||
cityssm.postJSON(los.urlPrefix + "/maps/doDeleteMap", {
|
cityssm.postJSON(los.urlPrefix + '/maps/doDeleteMap', {
|
||||||
mapId
|
mapId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
|
|
@ -47,17 +50,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Deleting " + exports.aliases.map,
|
title: 'Error Deleting ' + exports.aliases.map,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete " + exports.aliases.map,
|
title: 'Delete ' + exports.aliases.map,
|
||||||
message: `Are you sure you want to delete this ${exports.aliases.map.toLowerCase()} and all related ${exports.aliases.lots.toLowerCase()}?`,
|
message: `Are you sure you want to delete this ${exports.aliases.map.toLowerCase()} and all related ${exports.aliases.lots.toLowerCase()}?`,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: `Yes, Delete ${exports.aliases.map}`,
|
text: `Yes, Delete ${exports.aliases.map}`,
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
|
|
|
||||||
|
|
@ -1,91 +1,99 @@
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||||
|
|
||||||
import type * as globalTypes from "../types/globalTypes";
|
import type * as globalTypes from '../types/globalTypes'
|
||||||
|
|
||||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal
|
||||||
declare const bulmaJS: BulmaJS;
|
declare const bulmaJS: BulmaJS
|
||||||
|
|
||||||
(() => {
|
;(() => {
|
||||||
const los = exports.los as globalTypes.LOS;
|
const los = exports.los as globalTypes.LOS
|
||||||
|
|
||||||
const mapId = (document.querySelector("#map--mapId") as HTMLInputElement).value;
|
const mapId = (document.querySelector('#map--mapId') as HTMLInputElement)
|
||||||
const isCreate = mapId === "";
|
.value
|
||||||
|
const isCreate = mapId === ''
|
||||||
|
|
||||||
const mapForm = document.querySelector("#form--map") as HTMLFormElement;
|
const mapForm = document.querySelector('#form--map') as HTMLFormElement
|
||||||
|
|
||||||
function updateMap(formEvent: SubmitEvent) {
|
function updateMap(formEvent: SubmitEvent) {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault()
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/maps/" + (isCreate ? "doCreateMap" : "doUpdateMap"),
|
los.urlPrefix + '/maps/' + (isCreate ? 'doCreateMap' : 'doUpdateMap'),
|
||||||
mapForm,
|
mapForm,
|
||||||
(responseJSON: { success: boolean; mapId?: number; errorMessage?: string }) => {
|
(responseJSON: {
|
||||||
|
success: boolean
|
||||||
|
mapId?: number
|
||||||
|
errorMessage?: string
|
||||||
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
cityssm.disableNavBlocker();
|
cityssm.disableNavBlocker()
|
||||||
|
|
||||||
if (isCreate) {
|
if (isCreate) {
|
||||||
window.location.href = los.urlPrefix + "/maps/" + responseJSON.mapId + "/edit";
|
window.location.href =
|
||||||
|
los.urlPrefix + '/maps/' + responseJSON.mapId + '/edit'
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: exports.aliases.map + " Updated Successfully",
|
message: exports.aliases.map + ' Updated Successfully',
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating " + exports.aliases.map,
|
title: 'Error Updating ' + exports.aliases.map,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
mapForm.addEventListener("submit", updateMap);
|
mapForm.addEventListener('submit', updateMap)
|
||||||
|
|
||||||
const inputElements = mapForm.querySelectorAll("input, select") as NodeListOf<
|
const inputElements = mapForm.querySelectorAll('input, select') as NodeListOf<
|
||||||
HTMLInputElement | HTMLSelectElement
|
HTMLInputElement | HTMLSelectElement
|
||||||
>;
|
>
|
||||||
|
|
||||||
for (const inputElement of inputElements) {
|
for (const inputElement of inputElements) {
|
||||||
inputElement.addEventListener("change", cityssm.enableNavBlocker);
|
inputElement.addEventListener('change', cityssm.enableNavBlocker)
|
||||||
}
|
}
|
||||||
|
|
||||||
document.querySelector("#button--deleteMap")?.addEventListener("click", (clickEvent) => {
|
document
|
||||||
clickEvent.preventDefault();
|
.querySelector('#button--deleteMap')
|
||||||
|
?.addEventListener('click', (clickEvent) => {
|
||||||
|
clickEvent.preventDefault()
|
||||||
|
|
||||||
function doDelete() {
|
function doDelete() {
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/maps/doDeleteMap",
|
los.urlPrefix + '/maps/doDeleteMap',
|
||||||
{
|
{
|
||||||
mapId
|
mapId
|
||||||
},
|
},
|
||||||
(responseJSON: { success: boolean; errorMessage?: string }) => {
|
(responseJSON: { success: boolean; errorMessage?: string }) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
window.location.href = los.getMapURL();
|
window.location.href = los.getMapURL()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Deleting " + exports.aliases.map,
|
title: 'Error Deleting ' + exports.aliases.map,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete " + exports.aliases.map,
|
title: 'Delete ' + exports.aliases.map,
|
||||||
message: `Are you sure you want to delete this ${exports.aliases.map.toLowerCase()} and all related ${exports.aliases.lots.toLowerCase()}?`,
|
message: `Are you sure you want to delete this ${exports.aliases.map.toLowerCase()} and all related ${exports.aliases.lots.toLowerCase()}?`,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: `Yes, Delete ${exports.aliases.map}`,
|
text: `Yes, Delete ${exports.aliases.map}`,
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
})();
|
})()
|
||||||
|
|
|
||||||
|
|
@ -4,13 +4,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
(() => {
|
(() => {
|
||||||
const los = exports.los;
|
const los = exports.los;
|
||||||
const maps = exports.maps;
|
const maps = exports.maps;
|
||||||
const searchFilterElement = document.querySelector("#searchFilter--map");
|
const searchFilterElement = document.querySelector('#searchFilter--map');
|
||||||
const searchResultsContainerElement = document.querySelector("#container--searchResults");
|
const searchResultsContainerElement = document.querySelector('#container--searchResults');
|
||||||
function renderResults() {
|
function renderResults() {
|
||||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(`Loading ${los.escapedAliases.Maps}...`);
|
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(`Loading ${los.escapedAliases.Maps}...`);
|
||||||
let searchResultCount = 0;
|
let searchResultCount = 0;
|
||||||
const searchResultsTbodyElement = document.createElement("tbody");
|
const searchResultsTbodyElement = document.createElement('tbody');
|
||||||
const filterStringSplit = searchFilterElement.value.trim().toLowerCase().split(" ");
|
const filterStringSplit = searchFilterElement.value
|
||||||
|
.trim()
|
||||||
|
.toLowerCase()
|
||||||
|
.split(' ');
|
||||||
for (const map of maps) {
|
for (const map of maps) {
|
||||||
const mapSearchString = `${map.mapName} ${map.mapDescription} ${map.mapAddress1} ${map.mapAddress2}`.toLowerCase();
|
const mapSearchString = `${map.mapName} ${map.mapDescription} ${map.mapAddress1} ${map.mapAddress2}`.toLowerCase();
|
||||||
let showMap = true;
|
let showMap = true;
|
||||||
|
|
@ -24,62 +27,66 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
searchResultCount += 1;
|
searchResultCount += 1;
|
||||||
searchResultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
|
searchResultsTbodyElement.insertAdjacentHTML('beforeend', '<tr>' +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
'<a class="has-text-weight-bold" href="' +
|
'<a class="has-text-weight-bold" href="' +
|
||||||
los.urlPrefix +
|
los.urlPrefix +
|
||||||
"/maps/" +
|
'/maps/' +
|
||||||
map.mapId +
|
map.mapId +
|
||||||
'">' +
|
'">' +
|
||||||
cityssm.escapeHTML(map.mapName || "(No Name)") +
|
cityssm.escapeHTML(map.mapName || '(No Name)') +
|
||||||
"</a><br />" +
|
'</a><br />' +
|
||||||
'<span class="is-size-7">' +
|
'<span class="is-size-7">' +
|
||||||
cityssm.escapeHTML(map.mapDescription || "") +
|
cityssm.escapeHTML(map.mapDescription || '') +
|
||||||
"</span>" +
|
'</span>' +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
(map.mapAddress1 ? cityssm.escapeHTML(map.mapAddress1) + "<br />" : "") +
|
(map.mapAddress1
|
||||||
(map.mapAddress2 ? cityssm.escapeHTML(map.mapAddress2) + "<br />" : "") +
|
? cityssm.escapeHTML(map.mapAddress1) + '<br />'
|
||||||
|
: '') +
|
||||||
|
(map.mapAddress2
|
||||||
|
? cityssm.escapeHTML(map.mapAddress2) + '<br />'
|
||||||
|
: '') +
|
||||||
(map.mapCity || map.mapProvince
|
(map.mapCity || map.mapProvince
|
||||||
? cityssm.escapeHTML(map.mapCity || "") +
|
? cityssm.escapeHTML(map.mapCity || '') +
|
||||||
", " +
|
', ' +
|
||||||
cityssm.escapeHTML(map.mapProvince || "") +
|
cityssm.escapeHTML(map.mapProvince || '') +
|
||||||
"<br />"
|
'<br />'
|
||||||
: "") +
|
: '') +
|
||||||
(map.mapPostalCode ? cityssm.escapeHTML(map.mapPostalCode) : "") +
|
(map.mapPostalCode ? cityssm.escapeHTML(map.mapPostalCode) : '') +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
("<td>" + cityssm.escapeHTML(map.mapPhoneNumber || "") + "</td>") +
|
('<td>' + cityssm.escapeHTML(map.mapPhoneNumber || '') + '</td>') +
|
||||||
'<td class="has-text-centered">' +
|
'<td class="has-text-centered">' +
|
||||||
(map.mapLatitude && map.mapLongitude
|
(map.mapLatitude && map.mapLongitude
|
||||||
? '<span data-tooltip="Has Geographic Coordinates"><i class="fas fa-map-marker-alt" aria-label="Has Geographic Coordinates"></i></span>'
|
? '<span data-tooltip="Has Geographic Coordinates"><i class="fas fa-map-marker-alt" aria-label="Has Geographic Coordinates"></i></span>'
|
||||||
: "") +
|
: '') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
'<td class="has-text-centered">' +
|
'<td class="has-text-centered">' +
|
||||||
(map.mapSVG
|
(map.mapSVG
|
||||||
? '<span data-tooltip="Has Image"><i class="fas fa-image" aria-label="Has Image"></i></span>'
|
? '<span data-tooltip="Has Image"><i class="fas fa-image" aria-label="Has Image"></i></span>'
|
||||||
: "") +
|
: '') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
('<td class="has-text-right">' +
|
('<td class="has-text-right">' +
|
||||||
'<a href="' +
|
'<a href="' +
|
||||||
los.urlPrefix +
|
los.urlPrefix +
|
||||||
"/lots?mapId=" +
|
'/lots?mapId=' +
|
||||||
map.mapId +
|
map.mapId +
|
||||||
'">' +
|
'">' +
|
||||||
map.lotCount +
|
map.lotCount +
|
||||||
"</a>" +
|
'</a>' +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
"</tr>");
|
'</tr>');
|
||||||
}
|
}
|
||||||
searchResultsContainerElement.innerHTML = "";
|
searchResultsContainerElement.innerHTML = '';
|
||||||
if (searchResultCount === 0) {
|
if (searchResultCount === 0) {
|
||||||
searchResultsContainerElement.innerHTML = `<div class="message is-info">
|
searchResultsContainerElement.innerHTML = `<div class="message is-info">
|
||||||
<p class="message-body">There are no ${los.escapedAliases.maps} that meet the search criteria.</p>
|
<p class="message-body">There are no ${los.escapedAliases.maps} that meet the search criteria.</p>
|
||||||
</div>`;
|
</div>`;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const searchResultsTableElement = document.createElement("table");
|
const searchResultsTableElement = document.createElement('table');
|
||||||
searchResultsTableElement.className =
|
searchResultsTableElement.className =
|
||||||
"table is-fullwidth is-striped is-hoverable has-sticky-header";
|
'table is-fullwidth is-striped is-hoverable has-sticky-header';
|
||||||
searchResultsTableElement.innerHTML = `<thead><tr>
|
searchResultsTableElement.innerHTML = `<thead><tr>
|
||||||
<th>${los.escapedAliases.Map}</th>
|
<th>${los.escapedAliases.Map}</th>
|
||||||
<th>Address</th>
|
<th>Address</th>
|
||||||
|
|
@ -92,8 +99,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
searchResultsContainerElement.append(searchResultsTableElement);
|
searchResultsContainerElement.append(searchResultsTableElement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
searchFilterElement.addEventListener("keyup", renderResults);
|
searchFilterElement.addEventListener('keyup', renderResults);
|
||||||
document.querySelector("#form--searchFilters").addEventListener("submit", (formEvent) => {
|
document
|
||||||
|
.querySelector('#form--searchFilters')
|
||||||
|
.addEventListener('submit', (formEvent) => {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault();
|
||||||
renderResults();
|
renderResults();
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,111 +1,122 @@
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||||
|
|
||||||
import type * as globalTypes from "../types/globalTypes";
|
import type * as globalTypes from '../types/globalTypes'
|
||||||
import type * as recordTypes from "../types/recordTypes";
|
import type * as recordTypes from '../types/recordTypes'
|
||||||
|
|
||||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal
|
||||||
|
|
||||||
(() => {
|
;(() => {
|
||||||
const los = exports.los as globalTypes.LOS;
|
const los = exports.los as globalTypes.LOS
|
||||||
|
|
||||||
const maps: recordTypes.Map[] = exports.maps;
|
const maps: recordTypes.Map[] = exports.maps
|
||||||
|
|
||||||
const searchFilterElement = document.querySelector("#searchFilter--map") as HTMLInputElement;
|
const searchFilterElement = document.querySelector(
|
||||||
|
'#searchFilter--map'
|
||||||
|
) as HTMLInputElement
|
||||||
|
|
||||||
const searchResultsContainerElement = document.querySelector("#container--searchResults") as HTMLElement;
|
const searchResultsContainerElement = document.querySelector(
|
||||||
|
'#container--searchResults'
|
||||||
|
) as HTMLElement
|
||||||
|
|
||||||
function renderResults(): void {
|
function renderResults(): void {
|
||||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(
|
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(
|
||||||
`Loading ${los.escapedAliases.Maps}...`
|
`Loading ${los.escapedAliases.Maps}...`
|
||||||
);
|
)
|
||||||
|
|
||||||
let searchResultCount = 0;
|
let searchResultCount = 0
|
||||||
const searchResultsTbodyElement = document.createElement("tbody");
|
const searchResultsTbodyElement = document.createElement('tbody')
|
||||||
|
|
||||||
const filterStringSplit = searchFilterElement.value.trim().toLowerCase().split(" ");
|
const filterStringSplit = searchFilterElement.value
|
||||||
|
.trim()
|
||||||
|
.toLowerCase()
|
||||||
|
.split(' ')
|
||||||
|
|
||||||
for (const map of maps) {
|
for (const map of maps) {
|
||||||
const mapSearchString =
|
const mapSearchString =
|
||||||
`${map.mapName} ${map.mapDescription} ${map.mapAddress1} ${map.mapAddress2}`.toLowerCase();
|
`${map.mapName} ${map.mapDescription} ${map.mapAddress1} ${map.mapAddress2}`.toLowerCase()
|
||||||
|
|
||||||
let showMap = true;
|
let showMap = true
|
||||||
|
|
||||||
for (const filterStringPiece of filterStringSplit) {
|
for (const filterStringPiece of filterStringSplit) {
|
||||||
if (!mapSearchString.includes(filterStringPiece)) {
|
if (!mapSearchString.includes(filterStringPiece)) {
|
||||||
showMap = false;
|
showMap = false
|
||||||
break;
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!showMap) {
|
if (!showMap) {
|
||||||
continue;
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
searchResultCount += 1;
|
searchResultCount += 1
|
||||||
|
|
||||||
searchResultsTbodyElement.insertAdjacentHTML(
|
searchResultsTbodyElement.insertAdjacentHTML(
|
||||||
"beforeend",
|
'beforeend',
|
||||||
"<tr>" +
|
'<tr>' +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
'<a class="has-text-weight-bold" href="' +
|
'<a class="has-text-weight-bold" href="' +
|
||||||
los.urlPrefix +
|
los.urlPrefix +
|
||||||
"/maps/" +
|
'/maps/' +
|
||||||
map.mapId +
|
map.mapId +
|
||||||
'">' +
|
'">' +
|
||||||
cityssm.escapeHTML(map.mapName || "(No Name)") +
|
cityssm.escapeHTML(map.mapName || '(No Name)') +
|
||||||
"</a><br />" +
|
'</a><br />' +
|
||||||
'<span class="is-size-7">' +
|
'<span class="is-size-7">' +
|
||||||
cityssm.escapeHTML(map.mapDescription || "") +
|
cityssm.escapeHTML(map.mapDescription || '') +
|
||||||
"</span>" +
|
'</span>' +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
(map.mapAddress1 ? cityssm.escapeHTML(map.mapAddress1) + "<br />" : "") +
|
(map.mapAddress1
|
||||||
(map.mapAddress2 ? cityssm.escapeHTML(map.mapAddress2) + "<br />" : "") +
|
? cityssm.escapeHTML(map.mapAddress1) + '<br />'
|
||||||
|
: '') +
|
||||||
|
(map.mapAddress2
|
||||||
|
? cityssm.escapeHTML(map.mapAddress2) + '<br />'
|
||||||
|
: '') +
|
||||||
(map.mapCity || map.mapProvince
|
(map.mapCity || map.mapProvince
|
||||||
? cityssm.escapeHTML(map.mapCity || "") +
|
? cityssm.escapeHTML(map.mapCity || '') +
|
||||||
", " +
|
', ' +
|
||||||
cityssm.escapeHTML(map.mapProvince || "") +
|
cityssm.escapeHTML(map.mapProvince || '') +
|
||||||
"<br />"
|
'<br />'
|
||||||
: "") +
|
: '') +
|
||||||
(map.mapPostalCode ? cityssm.escapeHTML(map.mapPostalCode) : "") +
|
(map.mapPostalCode ? cityssm.escapeHTML(map.mapPostalCode) : '') +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
("<td>" + cityssm.escapeHTML(map.mapPhoneNumber || "") + "</td>") +
|
('<td>' + cityssm.escapeHTML(map.mapPhoneNumber || '') + '</td>') +
|
||||||
'<td class="has-text-centered">' +
|
'<td class="has-text-centered">' +
|
||||||
(map.mapLatitude && map.mapLongitude
|
(map.mapLatitude && map.mapLongitude
|
||||||
? '<span data-tooltip="Has Geographic Coordinates"><i class="fas fa-map-marker-alt" aria-label="Has Geographic Coordinates"></i></span>'
|
? '<span data-tooltip="Has Geographic Coordinates"><i class="fas fa-map-marker-alt" aria-label="Has Geographic Coordinates"></i></span>'
|
||||||
: "") +
|
: '') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
'<td class="has-text-centered">' +
|
'<td class="has-text-centered">' +
|
||||||
(map.mapSVG
|
(map.mapSVG
|
||||||
? '<span data-tooltip="Has Image"><i class="fas fa-image" aria-label="Has Image"></i></span>'
|
? '<span data-tooltip="Has Image"><i class="fas fa-image" aria-label="Has Image"></i></span>'
|
||||||
: "") +
|
: '') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
('<td class="has-text-right">' +
|
('<td class="has-text-right">' +
|
||||||
'<a href="' +
|
'<a href="' +
|
||||||
los.urlPrefix +
|
los.urlPrefix +
|
||||||
"/lots?mapId=" +
|
'/lots?mapId=' +
|
||||||
map.mapId +
|
map.mapId +
|
||||||
'">' +
|
'">' +
|
||||||
map.lotCount +
|
map.lotCount +
|
||||||
"</a>" +
|
'</a>' +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
"</tr>"
|
'</tr>'
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
searchResultsContainerElement.innerHTML = "";
|
searchResultsContainerElement.innerHTML = ''
|
||||||
|
|
||||||
if (searchResultCount === 0) {
|
if (searchResultCount === 0) {
|
||||||
searchResultsContainerElement.innerHTML = `<div class="message is-info">
|
searchResultsContainerElement.innerHTML = `<div class="message is-info">
|
||||||
<p class="message-body">There are no ${los.escapedAliases.maps} that meet the search criteria.</p>
|
<p class="message-body">There are no ${los.escapedAliases.maps} that meet the search criteria.</p>
|
||||||
</div>`;
|
</div>`
|
||||||
} else {
|
} else {
|
||||||
const searchResultsTableElement = document.createElement("table");
|
const searchResultsTableElement = document.createElement('table')
|
||||||
|
|
||||||
searchResultsTableElement.className =
|
searchResultsTableElement.className =
|
||||||
"table is-fullwidth is-striped is-hoverable has-sticky-header";
|
'table is-fullwidth is-striped is-hoverable has-sticky-header'
|
||||||
|
|
||||||
searchResultsTableElement.innerHTML = `<thead><tr>
|
searchResultsTableElement.innerHTML = `<thead><tr>
|
||||||
<th>${los.escapedAliases.Map}</th>
|
<th>${los.escapedAliases.Map}</th>
|
||||||
|
|
@ -114,20 +125,22 @@ declare const cityssm: cityssmGlobal;
|
||||||
<th class="has-text-centered">Coordinates</th>
|
<th class="has-text-centered">Coordinates</th>
|
||||||
<th class="has-text-centered">Image</th>
|
<th class="has-text-centered">Image</th>
|
||||||
<th class="has-text-right">${los.escapedAliases.Lot} Count</th>
|
<th class="has-text-right">${los.escapedAliases.Lot} Count</th>
|
||||||
</tr></thead>`;
|
</tr></thead>`
|
||||||
|
|
||||||
searchResultsTableElement.append(searchResultsTbodyElement);
|
searchResultsTableElement.append(searchResultsTbodyElement)
|
||||||
|
|
||||||
searchResultsContainerElement.append(searchResultsTableElement);
|
searchResultsContainerElement.append(searchResultsTableElement)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
searchFilterElement.addEventListener("keyup", renderResults);
|
searchFilterElement.addEventListener('keyup', renderResults)
|
||||||
|
|
||||||
document.querySelector("#form--searchFilters")!.addEventListener("submit", (formEvent) => {
|
document
|
||||||
formEvent.preventDefault();
|
.querySelector('#form--searchFilters')!
|
||||||
renderResults();
|
.addEventListener('submit', (formEvent) => {
|
||||||
});
|
formEvent.preventDefault()
|
||||||
|
renderResults()
|
||||||
|
})
|
||||||
|
|
||||||
renderResults();
|
renderResults()
|
||||||
})();
|
})()
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
(() => {
|
(() => {
|
||||||
const mapContainerElement = document.querySelector("#map--leaflet");
|
const mapContainerElement = document.querySelector('#map--leaflet');
|
||||||
if (mapContainerElement) {
|
if (mapContainerElement) {
|
||||||
const mapLatitude = Number.parseFloat(mapContainerElement.dataset.mapLatitude);
|
const mapLatitude = Number.parseFloat(mapContainerElement.dataset.mapLatitude);
|
||||||
const mapLongitude = Number.parseFloat(mapContainerElement.dataset.mapLongitude);
|
const mapLongitude = Number.parseFloat(mapContainerElement.dataset.mapLongitude);
|
||||||
|
|
@ -10,9 +10,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
// eslint-disable-next-line unicorn/no-array-callback-reference
|
// eslint-disable-next-line unicorn/no-array-callback-reference
|
||||||
const map = L.map(mapContainerElement);
|
const map = L.map(mapContainerElement);
|
||||||
map.setView(mapCoordinates, 15);
|
map.setView(mapCoordinates, 15);
|
||||||
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
|
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
||||||
maxZoom: 19,
|
maxZoom: 19,
|
||||||
attribution: "© OpenStreetMap"
|
attribution: '© OpenStreetMap'
|
||||||
}).addTo(map);
|
}).addTo(map);
|
||||||
L.marker(mapCoordinates).addTo(map);
|
L.marker(mapCoordinates).addTo(map);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,33 +1,33 @@
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
||||||
|
|
||||||
import type * as Leaflet from "leaflet";
|
import type * as Leaflet from 'leaflet'
|
||||||
|
|
||||||
declare const L;
|
declare const L
|
||||||
|
|
||||||
(() => {
|
;(() => {
|
||||||
const mapContainerElement = document.querySelector(
|
const mapContainerElement = document.querySelector(
|
||||||
"#map--leaflet"
|
'#map--leaflet'
|
||||||
) as HTMLElement;
|
) as HTMLElement
|
||||||
|
|
||||||
if (mapContainerElement) {
|
if (mapContainerElement) {
|
||||||
const mapLatitude = Number.parseFloat(
|
const mapLatitude = Number.parseFloat(
|
||||||
mapContainerElement.dataset.mapLatitude!
|
mapContainerElement.dataset.mapLatitude!
|
||||||
);
|
)
|
||||||
const mapLongitude = Number.parseFloat(
|
const mapLongitude = Number.parseFloat(
|
||||||
mapContainerElement.dataset.mapLongitude!
|
mapContainerElement.dataset.mapLongitude!
|
||||||
);
|
)
|
||||||
|
|
||||||
const mapCoordinates: Leaflet.LatLngTuple = [mapLatitude, mapLongitude];
|
const mapCoordinates: Leaflet.LatLngTuple = [mapLatitude, mapLongitude]
|
||||||
|
|
||||||
// eslint-disable-next-line unicorn/no-array-callback-reference
|
// eslint-disable-next-line unicorn/no-array-callback-reference
|
||||||
const map: Leaflet.Map = L.map(mapContainerElement);
|
const map: Leaflet.Map = L.map(mapContainerElement)
|
||||||
map.setView(mapCoordinates, 15);
|
map.setView(mapCoordinates, 15)
|
||||||
|
|
||||||
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
|
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
||||||
maxZoom: 19,
|
maxZoom: 19,
|
||||||
attribution: "© OpenStreetMap"
|
attribution: '© OpenStreetMap'
|
||||||
}).addTo(map);
|
}).addTo(map)
|
||||||
|
|
||||||
L.marker(mapCoordinates).addTo(map);
|
L.marker(mapCoordinates).addTo(map)
|
||||||
}
|
}
|
||||||
})();
|
})()
|
||||||
|
|
|
||||||
|
|
@ -1,28 +1,29 @@
|
||||||
/* eslint-disable unicorn/prefer-module */
|
/* eslint-disable unicorn/prefer-module */
|
||||||
|
;
|
||||||
(() => {
|
(() => {
|
||||||
const menuTabElements = document.querySelectorAll(".menu a");
|
const menuTabElements = document.querySelectorAll('.menu a');
|
||||||
const tabContainerElements = document.querySelectorAll(".tabs-container > div");
|
const tabContainerElements = document.querySelectorAll('.tabs-container > div');
|
||||||
function selectTab(clickEvent) {
|
function selectTab(clickEvent) {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault();
|
||||||
// Remove .is-active from all tabs
|
// Remove .is-active from all tabs
|
||||||
for (const menuTabElement of menuTabElements) {
|
for (const menuTabElement of menuTabElements) {
|
||||||
menuTabElement.classList.remove("is-active");
|
menuTabElement.classList.remove('is-active');
|
||||||
}
|
}
|
||||||
// Set .is-active on clicked tab
|
// Set .is-active on clicked tab
|
||||||
const selectedTabElement = clickEvent.currentTarget;
|
const selectedTabElement = clickEvent.currentTarget;
|
||||||
selectedTabElement.classList.add("is-active");
|
selectedTabElement.classList.add('is-active');
|
||||||
// Hide all but selected tab
|
// Hide all but selected tab
|
||||||
const selectedTabContainerId = selectedTabElement.href.slice(Math.max(0, selectedTabElement.href.indexOf("#") + 1));
|
const selectedTabContainerId = selectedTabElement.href.slice(Math.max(0, selectedTabElement.href.indexOf('#') + 1));
|
||||||
for (const tabContainerElement of tabContainerElements) {
|
for (const tabContainerElement of tabContainerElements) {
|
||||||
if (tabContainerElement.id === selectedTabContainerId) {
|
if (tabContainerElement.id === selectedTabContainerId) {
|
||||||
tabContainerElement.classList.remove("is-hidden");
|
tabContainerElement.classList.remove('is-hidden');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
tabContainerElement.classList.add("is-hidden");
|
tabContainerElement.classList.add('is-hidden');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (const menuTabElement of menuTabElements) {
|
for (const menuTabElement of menuTabElements) {
|
||||||
menuTabElement.addEventListener("click", selectTab);
|
menuTabElement.addEventListener('click', selectTab);
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|
|
||||||
|
|
@ -1,38 +1,41 @@
|
||||||
/* eslint-disable unicorn/prefer-module */
|
/* eslint-disable unicorn/prefer-module */
|
||||||
|
|
||||||
(() => {
|
;(() => {
|
||||||
const menuTabElements = document.querySelectorAll(".menu a") as NodeListOf<HTMLAnchorElement>;
|
const menuTabElements = document.querySelectorAll(
|
||||||
|
'.menu a'
|
||||||
|
) as NodeListOf<HTMLAnchorElement>
|
||||||
|
|
||||||
const tabContainerElements = document.querySelectorAll(
|
const tabContainerElements = document.querySelectorAll(
|
||||||
".tabs-container > div"
|
'.tabs-container > div'
|
||||||
) as NodeListOf<HTMLElement>;
|
) as NodeListOf<HTMLElement>
|
||||||
|
|
||||||
function selectTab(clickEvent: Event) {
|
function selectTab(clickEvent: Event) {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault()
|
||||||
|
|
||||||
// Remove .is-active from all tabs
|
// Remove .is-active from all tabs
|
||||||
for (const menuTabElement of menuTabElements) {
|
for (const menuTabElement of menuTabElements) {
|
||||||
menuTabElement.classList.remove("is-active");
|
menuTabElement.classList.remove('is-active')
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set .is-active on clicked tab
|
// Set .is-active on clicked tab
|
||||||
const selectedTabElement = clickEvent.currentTarget as HTMLAnchorElement;
|
const selectedTabElement = clickEvent.currentTarget as HTMLAnchorElement
|
||||||
selectedTabElement.classList.add("is-active");
|
selectedTabElement.classList.add('is-active')
|
||||||
|
|
||||||
// Hide all but selected tab
|
// Hide all but selected tab
|
||||||
const selectedTabContainerId = selectedTabElement.href.slice(
|
const selectedTabContainerId = selectedTabElement.href.slice(
|
||||||
Math.max(0, selectedTabElement.href.indexOf("#") + 1)
|
Math.max(0, selectedTabElement.href.indexOf('#') + 1)
|
||||||
);
|
)
|
||||||
|
|
||||||
for (const tabContainerElement of tabContainerElements) {
|
for (const tabContainerElement of tabContainerElements) {
|
||||||
if (tabContainerElement.id === selectedTabContainerId) {
|
if (tabContainerElement.id === selectedTabContainerId) {
|
||||||
tabContainerElement.classList.remove("is-hidden");
|
tabContainerElement.classList.remove('is-hidden')
|
||||||
} else {
|
} else {
|
||||||
tabContainerElement.classList.add("is-hidden");
|
tabContainerElement.classList.add('is-hidden')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const menuTabElement of menuTabElements) {
|
for (const menuTabElement of menuTabElements) {
|
||||||
menuTabElement.addEventListener("click", selectTab);
|
menuTabElement.addEventListener('click', selectTab)
|
||||||
}
|
}
|
||||||
})();
|
})()
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -4,16 +4,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
(() => {
|
(() => {
|
||||||
var _a, _b;
|
var _a, _b;
|
||||||
const los = exports.los;
|
const los = exports.los;
|
||||||
const workOrderId = document.querySelector("#workOrderEdit--workOrderId").value;
|
const workOrderId = document.querySelector('#workOrderEdit--workOrderId').value;
|
||||||
const isCreate = workOrderId === "";
|
const isCreate = workOrderId === '';
|
||||||
const workOrderFormElement = document.querySelector("#form--workOrderEdit");
|
const workOrderFormElement = document.querySelector('#form--workOrderEdit');
|
||||||
los.initializeDatePickers(workOrderFormElement
|
los.initializeDatePickers(workOrderFormElement
|
||||||
.querySelector("#workOrderEdit--workOrderOpenDateString")
|
.querySelector('#workOrderEdit--workOrderOpenDateString')
|
||||||
.closest(".field"));
|
.closest('.field'));
|
||||||
los.initializeUnlockFieldButtons(workOrderFormElement);
|
los.initializeUnlockFieldButtons(workOrderFormElement);
|
||||||
workOrderFormElement.addEventListener("submit", (submitEvent) => {
|
workOrderFormElement.addEventListener('submit', (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/workOrders/" + (isCreate ? "doCreateWorkOrder" : "doUpdateWorkOrder"), submitEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix +
|
||||||
|
'/workOrders/' +
|
||||||
|
(isCreate ? 'doCreateWorkOrder' : 'doUpdateWorkOrder'), submitEvent.currentTarget, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
cityssm.disableNavBlocker();
|
cityssm.disableNavBlocker();
|
||||||
if (isCreate) {
|
if (isCreate) {
|
||||||
|
|
@ -21,70 +23,71 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: "Work Order Updated Successfully",
|
message: 'Work Order Updated Successfully',
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating Work Order",
|
title: 'Error Updating Work Order',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
const inputElements = workOrderFormElement.querySelectorAll("input, select");
|
const inputElements = workOrderFormElement.querySelectorAll('input, select');
|
||||||
for (const inputElement of inputElements) {
|
for (const inputElement of inputElements) {
|
||||||
inputElement.addEventListener("change", cityssm.enableNavBlocker);
|
inputElement.addEventListener('change', cityssm.enableNavBlocker);
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Work Order Options
|
* Work Order Options
|
||||||
*/
|
*/
|
||||||
function doClose() {
|
function doClose() {
|
||||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doCloseWorkOrder", {
|
cityssm.postJSON(los.urlPrefix + '/workOrders/doCloseWorkOrder', {
|
||||||
workOrderId
|
workOrderId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
window.location.href = los.urlPrefix + "/workOrders/" + workOrderId;
|
window.location.href = los.urlPrefix + '/workOrders/' + workOrderId;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Closing Work Order",
|
title: 'Error Closing Work Order',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function doDelete() {
|
function doDelete() {
|
||||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doDeleteWorkOrder", {
|
cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrder', {
|
||||||
workOrderId
|
workOrderId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
window.location.href = los.urlPrefix + "/workOrders";
|
window.location.href = los.urlPrefix + '/workOrders';
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Deleting Work Order",
|
title: 'Error Deleting Work Order',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
let workOrderMilestones;
|
let workOrderMilestones;
|
||||||
(_a = document.querySelector("#button--closeWorkOrder")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", () => {
|
(_a = document
|
||||||
|
.querySelector('#button--closeWorkOrder')) === null || _a === void 0 ? void 0 : _a.addEventListener('click', () => {
|
||||||
const hasOpenMilestones = workOrderMilestones.some((milestone) => {
|
const hasOpenMilestones = workOrderMilestones.some((milestone) => {
|
||||||
return !milestone.workOrderMilestoneCompletionDate;
|
return !milestone.workOrderMilestoneCompletionDate;
|
||||||
});
|
});
|
||||||
if (hasOpenMilestones) {
|
if (hasOpenMilestones) {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Outstanding Milestones",
|
title: 'Outstanding Milestones',
|
||||||
message: `You cannot close a work order with outstanding milestones.
|
message: `You cannot close a work order with outstanding milestones.
|
||||||
Either complete the outstanding milestones, or remove them from the work order.`,
|
Either complete the outstanding milestones, or remove them from the work order.`,
|
||||||
contextualColorName: "warning"
|
contextualColorName: 'warning'
|
||||||
});
|
});
|
||||||
/*
|
/*
|
||||||
// Disable closing work orders with open milestones
|
// Disable closing work orders with open milestones
|
||||||
|
|
@ -102,24 +105,25 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Close Work Order",
|
title: 'Close Work Order',
|
||||||
message: "Are you sure you want to close this work order?",
|
message: 'Are you sure you want to close this work order?',
|
||||||
contextualColorName: "info",
|
contextualColorName: 'info',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Close Work Order",
|
text: 'Yes, Close Work Order',
|
||||||
callbackFunction: doClose
|
callbackFunction: doClose
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
(_b = document.querySelector("#button--deleteWorkOrder")) === null || _b === void 0 ? void 0 : _b.addEventListener("click", (clickEvent) => {
|
(_b = document
|
||||||
|
.querySelector('#button--deleteWorkOrder')) === null || _b === void 0 ? void 0 : _b.addEventListener('click', (clickEvent) => {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault();
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete Work Order",
|
title: 'Delete Work Order',
|
||||||
message: "Are you sure you want to delete this work order?",
|
message: 'Are you sure you want to delete this work order?',
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete Work Order",
|
text: 'Yes, Delete Work Order',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -144,131 +148,136 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Reopening Milestone",
|
title: 'Error Reopening Milestone',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function completeMilestone(clickEvent) {
|
function completeMilestone(clickEvent) {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault();
|
||||||
const currentDateString = cityssm.dateToString(new Date());
|
const currentDateString = cityssm.dateToString(new Date());
|
||||||
const workOrderMilestoneId = Number.parseInt(clickEvent.currentTarget.closest(".container--milestone")
|
const workOrderMilestoneId = Number.parseInt(clickEvent.currentTarget.closest('.container--milestone').dataset.workOrderMilestoneId, 10);
|
||||||
.dataset.workOrderMilestoneId, 10);
|
|
||||||
const workOrderMilestone = workOrderMilestones.find((currentMilestone) => {
|
const workOrderMilestone = workOrderMilestones.find((currentMilestone) => {
|
||||||
return currentMilestone.workOrderMilestoneId === workOrderMilestoneId;
|
return currentMilestone.workOrderMilestoneId === workOrderMilestoneId;
|
||||||
});
|
});
|
||||||
const doComplete = () => {
|
const doComplete = () => {
|
||||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doCompleteWorkOrderMilestone", {
|
cityssm.postJSON(los.urlPrefix + '/workOrders/doCompleteWorkOrderMilestone', {
|
||||||
workOrderId,
|
workOrderId,
|
||||||
workOrderMilestoneId
|
workOrderMilestoneId
|
||||||
}, processMilestoneResponse);
|
}, processMilestoneResponse);
|
||||||
};
|
};
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Complete Milestone",
|
title: 'Complete Milestone',
|
||||||
message: "Are you sure you want to complete this milestone?" +
|
message: 'Are you sure you want to complete this milestone?' +
|
||||||
(workOrderMilestone.workOrderMilestoneDateString > currentDateString
|
(workOrderMilestone.workOrderMilestoneDateString > currentDateString
|
||||||
? "<br /><strong>Note that this milestone is expected to be completed in the future.</strong>"
|
? '<br /><strong>Note that this milestone is expected to be completed in the future.</strong>'
|
||||||
: ""),
|
: ''),
|
||||||
messageIsHtml: true,
|
messageIsHtml: true,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Complete Milestone",
|
text: 'Yes, Complete Milestone',
|
||||||
callbackFunction: doComplete
|
callbackFunction: doComplete
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function reopenMilestone(clickEvent) {
|
function reopenMilestone(clickEvent) {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault();
|
||||||
const workOrderMilestoneId = clickEvent.currentTarget.closest(".container--milestone").dataset.workOrderMilestoneId;
|
const workOrderMilestoneId = clickEvent.currentTarget.closest('.container--milestone').dataset.workOrderMilestoneId;
|
||||||
const doReopen = () => {
|
const doReopen = () => {
|
||||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doReopenWorkOrderMilestone", {
|
cityssm.postJSON(los.urlPrefix + '/workOrders/doReopenWorkOrderMilestone', {
|
||||||
workOrderId,
|
workOrderId,
|
||||||
workOrderMilestoneId
|
workOrderMilestoneId
|
||||||
}, processMilestoneResponse);
|
}, processMilestoneResponse);
|
||||||
};
|
};
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Reopen Milestone",
|
title: 'Reopen Milestone',
|
||||||
message: "Are you sure you want to remove the completion status from this milestone, and reopen it?",
|
message: 'Are you sure you want to remove the completion status from this milestone, and reopen it?',
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Reopen Milestone",
|
text: 'Yes, Reopen Milestone',
|
||||||
callbackFunction: doReopen
|
callbackFunction: doReopen
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function deleteMilestone(clickEvent) {
|
function deleteMilestone(clickEvent) {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault();
|
||||||
const workOrderMilestoneId = clickEvent.currentTarget.closest(".container--milestone").dataset.workOrderMilestoneId;
|
const workOrderMilestoneId = clickEvent.currentTarget.closest('.container--milestone').dataset.workOrderMilestoneId;
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doDeleteWorkOrderMilestone", {
|
cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrderMilestone', {
|
||||||
workOrderMilestoneId,
|
workOrderMilestoneId,
|
||||||
workOrderId
|
workOrderId
|
||||||
}, processMilestoneResponse);
|
}, processMilestoneResponse);
|
||||||
};
|
};
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete Milestone",
|
title: 'Delete Milestone',
|
||||||
message: "Are you sure you want to delete this milestone?",
|
message: 'Are you sure you want to delete this milestone?',
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete Milestone",
|
text: 'Yes, Delete Milestone',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function editMilestone(clickEvent) {
|
function editMilestone(clickEvent) {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault();
|
||||||
const workOrderMilestoneId = Number.parseInt(clickEvent.currentTarget.closest(".container--milestone")
|
const workOrderMilestoneId = Number.parseInt(clickEvent.currentTarget.closest('.container--milestone').dataset.workOrderMilestoneId, 10);
|
||||||
.dataset.workOrderMilestoneId, 10);
|
|
||||||
const workOrderMilestone = workOrderMilestones.find((currentMilestone) => {
|
const workOrderMilestone = workOrderMilestones.find((currentMilestone) => {
|
||||||
return currentMilestone.workOrderMilestoneId === workOrderMilestoneId;
|
return currentMilestone.workOrderMilestoneId === workOrderMilestoneId;
|
||||||
});
|
});
|
||||||
let editCloseModalFunction;
|
let editCloseModalFunction;
|
||||||
const doEdit = (submitEvent) => {
|
const doEdit = (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doUpdateWorkOrderMilestone", submitEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/workOrders/doUpdateWorkOrderMilestone', submitEvent.currentTarget, (responseJSON) => {
|
||||||
processMilestoneResponse(responseJSON);
|
processMilestoneResponse(responseJSON);
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
editCloseModalFunction();
|
editCloseModalFunction();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
cityssm.openHtmlModal("workOrder-editMilestone", {
|
cityssm.openHtmlModal('workOrder-editMilestone', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
modalElement.querySelector("#milestoneEdit--workOrderId").value =
|
;
|
||||||
workOrderId;
|
modalElement.querySelector('#milestoneEdit--workOrderId').value = workOrderId;
|
||||||
modalElement.querySelector("#milestoneEdit--workOrderMilestoneId").value = workOrderMilestone.workOrderMilestoneId.toString();
|
modalElement.querySelector('#milestoneEdit--workOrderMilestoneId').value = workOrderMilestone.workOrderMilestoneId.toString();
|
||||||
const milestoneTypeElement = modalElement.querySelector("#milestoneEdit--workOrderMilestoneTypeId");
|
const milestoneTypeElement = modalElement.querySelector('#milestoneEdit--workOrderMilestoneTypeId');
|
||||||
let milestoneTypeFound = false;
|
let milestoneTypeFound = false;
|
||||||
for (const milestoneType of exports.workOrderMilestoneTypes) {
|
for (const milestoneType of exports.workOrderMilestoneTypes) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option');
|
||||||
optionElement.value = milestoneType.workOrderMilestoneTypeId.toString();
|
optionElement.value =
|
||||||
|
milestoneType.workOrderMilestoneTypeId.toString();
|
||||||
optionElement.textContent = milestoneType.workOrderMilestoneType;
|
optionElement.textContent = milestoneType.workOrderMilestoneType;
|
||||||
if (milestoneType.workOrderMilestoneTypeId === workOrderMilestone.workOrderMilestoneTypeId) {
|
if (milestoneType.workOrderMilestoneTypeId ===
|
||||||
|
workOrderMilestone.workOrderMilestoneTypeId) {
|
||||||
optionElement.selected = true;
|
optionElement.selected = true;
|
||||||
milestoneTypeFound = true;
|
milestoneTypeFound = true;
|
||||||
}
|
}
|
||||||
milestoneTypeElement.append(optionElement);
|
milestoneTypeElement.append(optionElement);
|
||||||
}
|
}
|
||||||
if (!milestoneTypeFound && workOrderMilestone.workOrderMilestoneTypeId) {
|
if (!milestoneTypeFound &&
|
||||||
const optionElement = document.createElement("option");
|
workOrderMilestone.workOrderMilestoneTypeId) {
|
||||||
optionElement.value = workOrderMilestone.workOrderMilestoneTypeId.toString();
|
const optionElement = document.createElement('option');
|
||||||
|
optionElement.value =
|
||||||
|
workOrderMilestone.workOrderMilestoneTypeId.toString();
|
||||||
optionElement.textContent = workOrderMilestone.workOrderMilestoneType;
|
optionElement.textContent = workOrderMilestone.workOrderMilestoneType;
|
||||||
optionElement.selected = true;
|
optionElement.selected = true;
|
||||||
milestoneTypeElement.append(optionElement);
|
milestoneTypeElement.append(optionElement);
|
||||||
}
|
}
|
||||||
modalElement.querySelector("#milestoneEdit--workOrderMilestoneDateString").value = workOrderMilestone.workOrderMilestoneDateString;
|
;
|
||||||
|
modalElement.querySelector('#milestoneEdit--workOrderMilestoneDateString').value = workOrderMilestone.workOrderMilestoneDateString;
|
||||||
if (workOrderMilestone.workOrderMilestoneTime) {
|
if (workOrderMilestone.workOrderMilestoneTime) {
|
||||||
modalElement.querySelector("#milestoneEdit--workOrderMilestoneTimeString").value = workOrderMilestone.workOrderMilestoneTimeString;
|
;
|
||||||
|
modalElement.querySelector('#milestoneEdit--workOrderMilestoneTimeString').value = workOrderMilestone.workOrderMilestoneTimeString;
|
||||||
}
|
}
|
||||||
modalElement.querySelector("#milestoneEdit--workOrderMilestoneDescription").value = workOrderMilestone.workOrderMilestoneDescription;
|
;
|
||||||
|
modalElement.querySelector('#milestoneEdit--workOrderMilestoneDescription').value = workOrderMilestone.workOrderMilestoneDescription;
|
||||||
},
|
},
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
editCloseModalFunction = closeModalFunction;
|
editCloseModalFunction = closeModalFunction;
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
los.initializeDatePickers(modalElement);
|
los.initializeDatePickers(modalElement);
|
||||||
// los.initializeTimePickers(modalElement);
|
// los.initializeTimePickers(modalElement);
|
||||||
modalElement.querySelector("form").addEventListener("submit", doEdit);
|
modalElement.querySelector('form').addEventListener('submit', doEdit);
|
||||||
},
|
},
|
||||||
onremoved() {
|
onremoved() {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
|
|
@ -278,15 +287,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
function renderMilestones() {
|
function renderMilestones() {
|
||||||
var _a, _b, _c;
|
var _a, _b, _c;
|
||||||
// Clear milestones panel
|
// Clear milestones panel
|
||||||
const milestonesPanelElement = document.querySelector("#panel--milestones");
|
const milestonesPanelElement = document.querySelector('#panel--milestones');
|
||||||
const panelBlockElementsToDelete = milestonesPanelElement.querySelectorAll(".panel-block");
|
const panelBlockElementsToDelete = milestonesPanelElement.querySelectorAll('.panel-block');
|
||||||
for (const panelBlockToDelete of panelBlockElementsToDelete) {
|
for (const panelBlockToDelete of panelBlockElementsToDelete) {
|
||||||
panelBlockToDelete.remove();
|
panelBlockToDelete.remove();
|
||||||
}
|
}
|
||||||
for (const milestone of workOrderMilestones) {
|
for (const milestone of workOrderMilestones) {
|
||||||
const panelBlockElement = document.createElement("div");
|
const panelBlockElement = document.createElement('div');
|
||||||
panelBlockElement.className = "panel-block is-block container--milestone";
|
panelBlockElement.className = 'panel-block is-block container--milestone';
|
||||||
panelBlockElement.dataset.workOrderMilestoneId = milestone.workOrderMilestoneId.toString();
|
panelBlockElement.dataset.workOrderMilestoneId =
|
||||||
|
milestone.workOrderMilestoneId.toString();
|
||||||
panelBlockElement.innerHTML =
|
panelBlockElement.innerHTML =
|
||||||
'<div class="columns is-mobile">' +
|
'<div class="columns is-mobile">' +
|
||||||
('<div class="column is-narrow">' +
|
('<div class="column is-narrow">' +
|
||||||
|
|
@ -297,70 +307,75 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
milestone.workOrderMilestoneCompletionDateString +
|
milestone.workOrderMilestoneCompletionDateString +
|
||||||
'">' +
|
'">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-check" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-check" aria-hidden="true"></i></span>' +
|
||||||
"</span>"
|
'</span>'
|
||||||
: '<button class="button button--completeMilestone" data-tooltip="Incomplete" type="button" aria-label="Incomplete">' +
|
: '<button class="button button--completeMilestone" data-tooltip="Incomplete" type="button" aria-label="Incomplete">' +
|
||||||
'<span class="icon is-small"><i class="far fa-square" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="far fa-square" aria-hidden="true"></i></span>' +
|
||||||
"</button>") +
|
'</button>') +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="column">' +
|
('<div class="column">' +
|
||||||
(milestone.workOrderMilestoneTypeId
|
(milestone.workOrderMilestoneTypeId
|
||||||
? "<strong>" +
|
? '<strong>' +
|
||||||
cityssm.escapeHTML(milestone.workOrderMilestoneType || "") +
|
cityssm.escapeHTML(milestone.workOrderMilestoneType || '') +
|
||||||
"</strong><br />"
|
'</strong><br />'
|
||||||
: "") +
|
: '') +
|
||||||
milestone.workOrderMilestoneDateString +
|
milestone.workOrderMilestoneDateString +
|
||||||
(milestone.workOrderMilestoneTime ? " " + milestone.workOrderMilestoneTimeString : "") +
|
(milestone.workOrderMilestoneTime
|
||||||
"<br />" +
|
? ' ' + milestone.workOrderMilestoneTimeString
|
||||||
|
: '') +
|
||||||
|
'<br />' +
|
||||||
'<span class="is-size-7">' +
|
'<span class="is-size-7">' +
|
||||||
cityssm.escapeHTML(milestone.workOrderMilestoneDescription || "") +
|
cityssm.escapeHTML(milestone.workOrderMilestoneDescription || '') +
|
||||||
"</span>" +
|
'</span>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="column is-narrow">' +
|
('<div class="column is-narrow">' +
|
||||||
'<div class="dropdown is-right">' +
|
'<div class="dropdown is-right">' +
|
||||||
('<div class="dropdown-trigger">' +
|
('<div class="dropdown-trigger">' +
|
||||||
'<button class="button is-small" data-tooltip="Options" type="button" aria-label="Options">' +
|
'<button class="button is-small" data-tooltip="Options" type="button" aria-label="Options">' +
|
||||||
'<i class="fas fa-ellipsis-v" aria-hidden="true"></i>' +
|
'<i class="fas fa-ellipsis-v" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="dropdown-menu">' +
|
('<div class="dropdown-menu">' +
|
||||||
'<div class="dropdown-content">' +
|
'<div class="dropdown-content">' +
|
||||||
(milestone.workOrderMilestoneCompletionDate
|
(milestone.workOrderMilestoneCompletionDate
|
||||||
? '<a class="dropdown-item button--reopenMilestone" href="#">' +
|
? '<a class="dropdown-item button--reopenMilestone" href="#">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-times" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-times" aria-hidden="true"></i></span>' +
|
||||||
" <span>Reopen Milestone</span>" +
|
' <span>Reopen Milestone</span>' +
|
||||||
"</a>"
|
'</a>'
|
||||||
: '<a class="dropdown-item button--editMilestone" href="#">' +
|
: '<a class="dropdown-item button--editMilestone" href="#">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||||
" <span>Edit Milestone</span>" +
|
' <span>Edit Milestone</span>' +
|
||||||
"</a>") +
|
'</a>') +
|
||||||
'<hr class="dropdown-divider" />' +
|
'<hr class="dropdown-divider" />' +
|
||||||
'<a class="dropdown-item button--deleteMilestone" href="#">' +
|
'<a class="dropdown-item button--deleteMilestone" href="#">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-trash has-text-danger" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-trash has-text-danger" aria-hidden="true"></i></span>' +
|
||||||
" <span>Delete Milestone</span>" +
|
' <span>Delete Milestone</span>' +
|
||||||
"</a>" +
|
'</a>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>";
|
'</div>';
|
||||||
(_a = panelBlockElement
|
(_a = panelBlockElement
|
||||||
.querySelector(".button--reopenMilestone")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", reopenMilestone);
|
.querySelector('.button--reopenMilestone')) === null || _a === void 0 ? void 0 : _a.addEventListener('click', reopenMilestone);
|
||||||
(_b = panelBlockElement
|
(_b = panelBlockElement
|
||||||
.querySelector(".button--editMilestone")) === null || _b === void 0 ? void 0 : _b.addEventListener("click", editMilestone);
|
.querySelector('.button--editMilestone')) === null || _b === void 0 ? void 0 : _b.addEventListener('click', editMilestone);
|
||||||
(_c = panelBlockElement
|
(_c = panelBlockElement
|
||||||
.querySelector(".button--completeMilestone")) === null || _c === void 0 ? void 0 : _c.addEventListener("click", completeMilestone);
|
.querySelector('.button--completeMilestone')) === null || _c === void 0 ? void 0 : _c.addEventListener('click', completeMilestone);
|
||||||
panelBlockElement
|
panelBlockElement
|
||||||
.querySelector(".button--deleteMilestone")
|
.querySelector('.button--deleteMilestone')
|
||||||
.addEventListener("click", deleteMilestone);
|
.addEventListener('click', deleteMilestone);
|
||||||
milestonesPanelElement.append(panelBlockElement);
|
milestonesPanelElement.append(panelBlockElement);
|
||||||
}
|
}
|
||||||
bulmaJS.init(milestonesPanelElement);
|
bulmaJS.init(milestonesPanelElement);
|
||||||
}
|
}
|
||||||
if (!isCreate) {
|
if (!isCreate) {
|
||||||
workOrderMilestones = exports.workOrderMilestones;
|
workOrderMilestones =
|
||||||
|
exports.workOrderMilestones;
|
||||||
delete exports.workOrderMilestones;
|
delete exports.workOrderMilestones;
|
||||||
renderMilestones();
|
renderMilestones();
|
||||||
document.querySelector("#button--addMilestone").addEventListener("click", () => {
|
document
|
||||||
|
.querySelector('#button--addMilestone')
|
||||||
|
.addEventListener('click', () => {
|
||||||
let addModalElement;
|
let addModalElement;
|
||||||
let addFormElement;
|
let addFormElement;
|
||||||
let addCloseModalFunction;
|
let addCloseModalFunction;
|
||||||
|
|
@ -370,20 +385,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
}
|
}
|
||||||
const currentDateString = cityssm.dateToString(new Date());
|
const currentDateString = cityssm.dateToString(new Date());
|
||||||
function _doAdd() {
|
function _doAdd() {
|
||||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doAddWorkOrderMilestone", addFormElement, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/workOrders/doAddWorkOrderMilestone', addFormElement, (responseJSON) => {
|
||||||
processMilestoneResponse(responseJSON);
|
processMilestoneResponse(responseJSON);
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
addCloseModalFunction();
|
addCloseModalFunction();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (addModalElement.querySelector("#milestoneAdd--workOrderMilestoneDateString").value < currentDateString) {
|
if (addModalElement.querySelector('#milestoneAdd--workOrderMilestoneDateString').value < currentDateString) {
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Milestone Date in the Past",
|
title: 'Milestone Date in the Past',
|
||||||
message: "Are you sure you want to create a milestone with a date in the past?",
|
message: 'Are you sure you want to create a milestone with a date in the past?',
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Create a Past Milestone",
|
text: 'Yes, Create a Past Milestone',
|
||||||
callbackFunction: _doAdd
|
callbackFunction: _doAdd
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -392,18 +407,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
_doAdd();
|
_doAdd();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
cityssm.openHtmlModal("workOrder-addMilestone", {
|
cityssm.openHtmlModal('workOrder-addMilestone', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
modalElement.querySelector("#milestoneAdd--workOrderId").value =
|
;
|
||||||
workOrderId;
|
modalElement.querySelector('#milestoneAdd--workOrderId').value = workOrderId;
|
||||||
const milestoneTypeElement = modalElement.querySelector("#milestoneAdd--workOrderMilestoneTypeId");
|
const milestoneTypeElement = modalElement.querySelector('#milestoneAdd--workOrderMilestoneTypeId');
|
||||||
for (const milestoneType of exports.workOrderMilestoneTypes) {
|
for (const milestoneType of exports.workOrderMilestoneTypes) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option');
|
||||||
optionElement.value = milestoneType.workOrderMilestoneTypeId.toString();
|
optionElement.value =
|
||||||
|
milestoneType.workOrderMilestoneTypeId.toString();
|
||||||
optionElement.textContent = milestoneType.workOrderMilestoneType;
|
optionElement.textContent = milestoneType.workOrderMilestoneType;
|
||||||
milestoneTypeElement.append(optionElement);
|
milestoneTypeElement.append(optionElement);
|
||||||
}
|
}
|
||||||
modalElement.querySelector("#milestoneAdd--workOrderMilestoneDateString").valueAsDate = new Date();
|
;
|
||||||
|
modalElement.querySelector('#milestoneAdd--workOrderMilestoneDateString').valueAsDate = new Date();
|
||||||
},
|
},
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
addModalElement = modalElement;
|
addModalElement = modalElement;
|
||||||
|
|
@ -411,8 +428,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
los.initializeDatePickers(modalElement);
|
los.initializeDatePickers(modalElement);
|
||||||
// los.initializeTimePickers(modalElement);
|
// los.initializeTimePickers(modalElement);
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
addFormElement = modalElement.querySelector("form");
|
addFormElement = modalElement.querySelector('form');
|
||||||
addFormElement.addEventListener("submit", doAdd);
|
addFormElement.addEventListener('submit', doAdd);
|
||||||
},
|
},
|
||||||
onremoved() {
|
onremoved() {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
|
|
|
||||||
|
|
@ -1,65 +1,78 @@
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||||
|
|
||||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||||
|
|
||||||
import type * as globalTypes from "../../types/globalTypes";
|
import type * as globalTypes from '../../types/globalTypes'
|
||||||
import type * as recordTypes from "../../types/recordTypes";
|
import type * as recordTypes from '../../types/recordTypes'
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal
|
||||||
declare const bulmaJS: BulmaJS;
|
declare const bulmaJS: BulmaJS
|
||||||
|
|
||||||
(() => {
|
;(() => {
|
||||||
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(
|
los.initializeDatePickers(
|
||||||
workOrderFormElement
|
workOrderFormElement
|
||||||
.querySelector("#workOrderEdit--workOrderOpenDateString")!
|
.querySelector('#workOrderEdit--workOrderOpenDateString')!
|
||||||
.closest(".field") as HTMLElement
|
.closest('.field') as HTMLElement
|
||||||
);
|
)
|
||||||
los.initializeUnlockFieldButtons(workOrderFormElement);
|
los.initializeUnlockFieldButtons(workOrderFormElement)
|
||||||
|
|
||||||
workOrderFormElement.addEventListener("submit", (submitEvent) => {
|
workOrderFormElement.addEventListener('submit', (submitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault()
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/workOrders/" + (isCreate ? "doCreateWorkOrder" : "doUpdateWorkOrder"),
|
los.urlPrefix +
|
||||||
|
'/workOrders/' +
|
||||||
|
(isCreate ? 'doCreateWorkOrder' : 'doUpdateWorkOrder'),
|
||||||
submitEvent.currentTarget,
|
submitEvent.currentTarget,
|
||||||
(responseJSON: { success: boolean; workOrderId?: number; errorMessage?: string }) => {
|
(responseJSON: {
|
||||||
|
success: boolean
|
||||||
|
workOrderId?: number
|
||||||
|
errorMessage?: string
|
||||||
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
cityssm.disableNavBlocker();
|
cityssm.disableNavBlocker()
|
||||||
|
|
||||||
if (isCreate) {
|
if (isCreate) {
|
||||||
window.location.href = los.getWorkOrderURL(responseJSON.workOrderId!, true);
|
window.location.href = los.getWorkOrderURL(
|
||||||
|
responseJSON.workOrderId!,
|
||||||
|
true
|
||||||
|
)
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
message: "Work Order Updated Successfully",
|
message: 'Work Order Updated Successfully',
|
||||||
contextualColorName: "success"
|
contextualColorName: 'success'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating Work Order",
|
title: 'Error Updating Work Order',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
});
|
})
|
||||||
|
|
||||||
const inputElements = workOrderFormElement.querySelectorAll("input, select") as NodeListOf<
|
const inputElements = workOrderFormElement.querySelectorAll(
|
||||||
HTMLInputElement | HTMLSelectElement
|
'input, select'
|
||||||
>;
|
) as NodeListOf<HTMLInputElement | HTMLSelectElement>
|
||||||
|
|
||||||
for (const inputElement of inputElements) {
|
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() {
|
function doClose() {
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/workOrders/doCloseWorkOrder",
|
los.urlPrefix + '/workOrders/doCloseWorkOrder',
|
||||||
{
|
{
|
||||||
workOrderId
|
workOrderId
|
||||||
},
|
},
|
||||||
(responseJSON: { success: boolean; errorMessage?: string }) => {
|
(responseJSON: { success: boolean; errorMessage?: string }) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
window.location.href = los.urlPrefix + "/workOrders/" + workOrderId;
|
window.location.href = los.urlPrefix + '/workOrders/' + workOrderId
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Closing Work Order",
|
title: 'Error Closing Work Order',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
function doDelete() {
|
function doDelete() {
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/workOrders/doDeleteWorkOrder",
|
los.urlPrefix + '/workOrders/doDeleteWorkOrder',
|
||||||
{
|
{
|
||||||
workOrderId
|
workOrderId
|
||||||
},
|
},
|
||||||
(responseJSON: { success: boolean; errorMessage?: string }) => {
|
(responseJSON: { success: boolean; errorMessage?: string }) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
window.location.href = los.urlPrefix + "/workOrders";
|
window.location.href = los.urlPrefix + '/workOrders'
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Deleting Work Order",
|
title: 'Error Deleting Work Order',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
let workOrderMilestones: recordTypes.WorkOrderMilestone[];
|
let workOrderMilestones: recordTypes.WorkOrderMilestone[]
|
||||||
|
|
||||||
document.querySelector("#button--closeWorkOrder")?.addEventListener("click", () => {
|
document
|
||||||
|
.querySelector('#button--closeWorkOrder')
|
||||||
|
?.addEventListener('click', () => {
|
||||||
const hasOpenMilestones = workOrderMilestones.some((milestone) => {
|
const hasOpenMilestones = workOrderMilestones.some((milestone) => {
|
||||||
return !milestone.workOrderMilestoneCompletionDate;
|
return !milestone.workOrderMilestoneCompletionDate
|
||||||
});
|
})
|
||||||
|
|
||||||
if (hasOpenMilestones) {
|
if (hasOpenMilestones) {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Outstanding Milestones",
|
title: 'Outstanding Milestones',
|
||||||
message: `You cannot close a work order with outstanding milestones.
|
message: `You cannot close a work order with outstanding milestones.
|
||||||
Either complete the outstanding milestones, or remove them from the work order.`,
|
Either complete the outstanding milestones, or remove them from the work order.`,
|
||||||
contextualColorName: "warning"
|
contextualColorName: 'warning'
|
||||||
});
|
})
|
||||||
|
|
||||||
/*
|
/*
|
||||||
// Disable closing work orders with open milestones
|
// Disable closing work orders with open milestones
|
||||||
|
|
@ -136,30 +151,32 @@ declare const bulmaJS: BulmaJS;
|
||||||
*/
|
*/
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Close Work Order",
|
title: 'Close Work Order',
|
||||||
message: "Are you sure you want to close this work order?",
|
message: 'Are you sure you want to close this work order?',
|
||||||
contextualColorName: "info",
|
contextualColorName: 'info',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Close Work Order",
|
text: 'Yes, Close Work Order',
|
||||||
callbackFunction: doClose
|
callbackFunction: doClose
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
|
|
||||||
document.querySelector("#button--deleteWorkOrder")?.addEventListener("click", (clickEvent: Event) => {
|
document
|
||||||
clickEvent.preventDefault();
|
.querySelector('#button--deleteWorkOrder')
|
||||||
|
?.addEventListener('click', (clickEvent: Event) => {
|
||||||
|
clickEvent.preventDefault()
|
||||||
|
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete Work Order",
|
title: 'Delete Work Order',
|
||||||
message: "Are you sure you want to delete this work order?",
|
message: 'Are you sure you want to delete this work order?',
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete Work Order",
|
text: 'Yes, Delete Work Order',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Related Lots
|
* Related Lots
|
||||||
|
|
@ -180,246 +197,271 @@ declare const bulmaJS: BulmaJS;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
function processMilestoneResponse(responseJSON: {
|
function processMilestoneResponse(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
workOrderMilestones?: recordTypes.WorkOrderMilestone[];
|
workOrderMilestones?: recordTypes.WorkOrderMilestone[]
|
||||||
}) {
|
}) {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderMilestones = responseJSON.workOrderMilestones!;
|
workOrderMilestones = responseJSON.workOrderMilestones!
|
||||||
renderMilestones();
|
renderMilestones()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Reopening Milestone",
|
title: 'Error Reopening Milestone',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function completeMilestone(clickEvent: Event) {
|
function completeMilestone(clickEvent: Event) {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault()
|
||||||
|
|
||||||
const currentDateString = cityssm.dateToString(new Date());
|
const currentDateString = cityssm.dateToString(new Date())
|
||||||
|
|
||||||
const workOrderMilestoneId = Number.parseInt(
|
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
|
10
|
||||||
);
|
)
|
||||||
|
|
||||||
const workOrderMilestone = workOrderMilestones.find((currentMilestone) => {
|
const workOrderMilestone = workOrderMilestones.find((currentMilestone) => {
|
||||||
return currentMilestone.workOrderMilestoneId === workOrderMilestoneId;
|
return currentMilestone.workOrderMilestoneId === workOrderMilestoneId
|
||||||
})!;
|
})!
|
||||||
|
|
||||||
const doComplete = () => {
|
const doComplete = () => {
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/workOrders/doCompleteWorkOrderMilestone",
|
los.urlPrefix + '/workOrders/doCompleteWorkOrderMilestone',
|
||||||
{
|
{
|
||||||
workOrderId,
|
workOrderId,
|
||||||
workOrderMilestoneId
|
workOrderMilestoneId
|
||||||
},
|
},
|
||||||
processMilestoneResponse
|
processMilestoneResponse
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Complete Milestone",
|
title: 'Complete Milestone',
|
||||||
message:
|
message:
|
||||||
"Are you sure you want to complete this milestone?" +
|
'Are you sure you want to complete this milestone?' +
|
||||||
(workOrderMilestone.workOrderMilestoneDateString! > currentDateString
|
(workOrderMilestone.workOrderMilestoneDateString! > currentDateString
|
||||||
? "<br /><strong>Note that this milestone is expected to be completed in the future.</strong>"
|
? '<br /><strong>Note that this milestone is expected to be completed in the future.</strong>'
|
||||||
: ""),
|
: ''),
|
||||||
messageIsHtml: true,
|
messageIsHtml: true,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Complete Milestone",
|
text: 'Yes, Complete Milestone',
|
||||||
callbackFunction: doComplete
|
callbackFunction: doComplete
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function reopenMilestone(clickEvent: Event) {
|
function reopenMilestone(clickEvent: Event) {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault()
|
||||||
|
|
||||||
const workOrderMilestoneId = (
|
const workOrderMilestoneId = (
|
||||||
(clickEvent.currentTarget as HTMLElement).closest(".container--milestone") as HTMLElement
|
(clickEvent.currentTarget as HTMLElement).closest(
|
||||||
).dataset.workOrderMilestoneId;
|
'.container--milestone'
|
||||||
|
) as HTMLElement
|
||||||
|
).dataset.workOrderMilestoneId
|
||||||
|
|
||||||
const doReopen = () => {
|
const doReopen = () => {
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/workOrders/doReopenWorkOrderMilestone",
|
los.urlPrefix + '/workOrders/doReopenWorkOrderMilestone',
|
||||||
{
|
{
|
||||||
workOrderId,
|
workOrderId,
|
||||||
workOrderMilestoneId
|
workOrderMilestoneId
|
||||||
},
|
},
|
||||||
processMilestoneResponse
|
processMilestoneResponse
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Reopen Milestone",
|
title: 'Reopen Milestone',
|
||||||
message:
|
message:
|
||||||
"Are you sure you want to remove the completion status from this milestone, and reopen it?",
|
'Are you sure you want to remove the completion status from this milestone, and reopen it?',
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Reopen Milestone",
|
text: 'Yes, Reopen Milestone',
|
||||||
callbackFunction: doReopen
|
callbackFunction: doReopen
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function deleteMilestone(clickEvent: Event) {
|
function deleteMilestone(clickEvent: Event) {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault()
|
||||||
|
|
||||||
const workOrderMilestoneId = (
|
const workOrderMilestoneId = (
|
||||||
(clickEvent.currentTarget as HTMLElement).closest(".container--milestone") as HTMLElement
|
(clickEvent.currentTarget as HTMLElement).closest(
|
||||||
).dataset.workOrderMilestoneId;
|
'.container--milestone'
|
||||||
|
) as HTMLElement
|
||||||
|
).dataset.workOrderMilestoneId
|
||||||
|
|
||||||
const doDelete = () => {
|
const doDelete = () => {
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/workOrders/doDeleteWorkOrderMilestone",
|
los.urlPrefix + '/workOrders/doDeleteWorkOrderMilestone',
|
||||||
{
|
{
|
||||||
workOrderMilestoneId,
|
workOrderMilestoneId,
|
||||||
workOrderId
|
workOrderId
|
||||||
},
|
},
|
||||||
processMilestoneResponse
|
processMilestoneResponse
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Delete Milestone",
|
title: 'Delete Milestone',
|
||||||
message: "Are you sure you want to delete this milestone?",
|
message: 'Are you sure you want to delete this milestone?',
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete Milestone",
|
text: 'Yes, Delete Milestone',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function editMilestone(clickEvent: Event) {
|
function editMilestone(clickEvent: Event) {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault()
|
||||||
|
|
||||||
const workOrderMilestoneId = Number.parseInt(
|
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
|
10
|
||||||
);
|
)
|
||||||
|
|
||||||
const workOrderMilestone = workOrderMilestones.find((currentMilestone) => {
|
const workOrderMilestone = workOrderMilestones.find((currentMilestone) => {
|
||||||
return currentMilestone.workOrderMilestoneId === workOrderMilestoneId;
|
return currentMilestone.workOrderMilestoneId === workOrderMilestoneId
|
||||||
})!;
|
})!
|
||||||
|
|
||||||
let editCloseModalFunction: () => void;
|
let editCloseModalFunction: () => void
|
||||||
|
|
||||||
const doEdit = (submitEvent: SubmitEvent) => {
|
const doEdit = (submitEvent: SubmitEvent) => {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault()
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/workOrders/doUpdateWorkOrderMilestone",
|
los.urlPrefix + '/workOrders/doUpdateWorkOrderMilestone',
|
||||||
submitEvent.currentTarget,
|
submitEvent.currentTarget,
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
workOrderMilestones?: recordTypes.WorkOrderMilestone[];
|
workOrderMilestones?: recordTypes.WorkOrderMilestone[]
|
||||||
}) => {
|
}) => {
|
||||||
processMilestoneResponse(responseJSON);
|
processMilestoneResponse(responseJSON)
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
editCloseModalFunction();
|
editCloseModalFunction()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
cityssm.openHtmlModal("workOrder-editMilestone", {
|
cityssm.openHtmlModal('workOrder-editMilestone', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
(modalElement.querySelector("#milestoneEdit--workOrderId") as HTMLInputElement).value =
|
;(
|
||||||
workOrderId;
|
modalElement.querySelector(
|
||||||
|
'#milestoneEdit--workOrderId'
|
||||||
|
) as HTMLInputElement
|
||||||
|
).value = workOrderId
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector("#milestoneEdit--workOrderMilestoneId") as HTMLInputElement
|
modalElement.querySelector(
|
||||||
).value = workOrderMilestone.workOrderMilestoneId!.toString();
|
'#milestoneEdit--workOrderMilestoneId'
|
||||||
|
) as HTMLInputElement
|
||||||
|
).value = workOrderMilestone.workOrderMilestoneId!.toString()
|
||||||
|
|
||||||
const milestoneTypeElement = modalElement.querySelector(
|
const milestoneTypeElement = modalElement.querySelector(
|
||||||
"#milestoneEdit--workOrderMilestoneTypeId"
|
'#milestoneEdit--workOrderMilestoneTypeId'
|
||||||
) as HTMLSelectElement;
|
) as HTMLSelectElement
|
||||||
|
|
||||||
let milestoneTypeFound = false;
|
let milestoneTypeFound = false
|
||||||
|
|
||||||
for (const milestoneType of exports.workOrderMilestoneTypes as recordTypes.WorkOrderMilestoneType[]) {
|
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.value =
|
||||||
optionElement.textContent = milestoneType.workOrderMilestoneType;
|
milestoneType.workOrderMilestoneTypeId.toString()
|
||||||
|
optionElement.textContent = milestoneType.workOrderMilestoneType
|
||||||
|
|
||||||
if (
|
if (
|
||||||
milestoneType.workOrderMilestoneTypeId === workOrderMilestone.workOrderMilestoneTypeId
|
milestoneType.workOrderMilestoneTypeId ===
|
||||||
|
workOrderMilestone.workOrderMilestoneTypeId
|
||||||
) {
|
) {
|
||||||
optionElement.selected = true;
|
optionElement.selected = true
|
||||||
milestoneTypeFound = true;
|
milestoneTypeFound = true
|
||||||
}
|
}
|
||||||
|
|
||||||
milestoneTypeElement.append(optionElement);
|
milestoneTypeElement.append(optionElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!milestoneTypeFound && workOrderMilestone.workOrderMilestoneTypeId) {
|
if (
|
||||||
const optionElement = document.createElement("option");
|
!milestoneTypeFound &&
|
||||||
optionElement.value = workOrderMilestone.workOrderMilestoneTypeId.toString();
|
workOrderMilestone.workOrderMilestoneTypeId
|
||||||
optionElement.textContent = workOrderMilestone.workOrderMilestoneType!;
|
) {
|
||||||
optionElement.selected = true;
|
const optionElement = document.createElement('option')
|
||||||
milestoneTypeElement.append(optionElement);
|
optionElement.value =
|
||||||
|
workOrderMilestone.workOrderMilestoneTypeId.toString()
|
||||||
|
optionElement.textContent = workOrderMilestone.workOrderMilestoneType!
|
||||||
|
optionElement.selected = true
|
||||||
|
milestoneTypeElement.append(optionElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#milestoneEdit--workOrderMilestoneDateString"
|
'#milestoneEdit--workOrderMilestoneDateString'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value = workOrderMilestone.workOrderMilestoneDateString!;
|
).value = workOrderMilestone.workOrderMilestoneDateString!
|
||||||
|
|
||||||
if (workOrderMilestone.workOrderMilestoneTime) {
|
if (workOrderMilestone.workOrderMilestoneTime) {
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#milestoneEdit--workOrderMilestoneTimeString"
|
'#milestoneEdit--workOrderMilestoneTimeString'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value = workOrderMilestone.workOrderMilestoneTimeString!;
|
).value = workOrderMilestone.workOrderMilestoneTimeString!
|
||||||
}
|
}
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#milestoneEdit--workOrderMilestoneDescription"
|
'#milestoneEdit--workOrderMilestoneDescription'
|
||||||
) as HTMLTextAreaElement
|
) as HTMLTextAreaElement
|
||||||
).value = workOrderMilestone.workOrderMilestoneDescription!;
|
).value = workOrderMilestone.workOrderMilestoneDescription!
|
||||||
},
|
},
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
editCloseModalFunction = closeModalFunction;
|
editCloseModalFunction = closeModalFunction
|
||||||
|
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
|
|
||||||
los.initializeDatePickers(modalElement);
|
los.initializeDatePickers(modalElement)
|
||||||
// los.initializeTimePickers(modalElement);
|
// los.initializeTimePickers(modalElement);
|
||||||
modalElement.querySelector("form")!.addEventListener("submit", doEdit);
|
modalElement.querySelector('form')!.addEventListener('submit', doEdit)
|
||||||
},
|
},
|
||||||
onremoved() {
|
onremoved() {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderMilestones() {
|
function renderMilestones() {
|
||||||
// Clear milestones panel
|
// 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) {
|
for (const panelBlockToDelete of panelBlockElementsToDelete) {
|
||||||
panelBlockToDelete.remove();
|
panelBlockToDelete.remove()
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const milestone of workOrderMilestones) {
|
for (const milestone of workOrderMilestones) {
|
||||||
const panelBlockElement = document.createElement("div");
|
const panelBlockElement = document.createElement('div')
|
||||||
panelBlockElement.className = "panel-block is-block container--milestone";
|
panelBlockElement.className = 'panel-block is-block container--milestone'
|
||||||
|
|
||||||
panelBlockElement.dataset.workOrderMilestoneId = milestone.workOrderMilestoneId!.toString();
|
panelBlockElement.dataset.workOrderMilestoneId =
|
||||||
|
milestone.workOrderMilestoneId!.toString()
|
||||||
|
|
||||||
panelBlockElement.innerHTML =
|
panelBlockElement.innerHTML =
|
||||||
'<div class="columns is-mobile">' +
|
'<div class="columns is-mobile">' +
|
||||||
|
|
@ -431,171 +473,181 @@ declare const bulmaJS: BulmaJS;
|
||||||
milestone.workOrderMilestoneCompletionDateString +
|
milestone.workOrderMilestoneCompletionDateString +
|
||||||
'">' +
|
'">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-check" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-check" aria-hidden="true"></i></span>' +
|
||||||
"</span>"
|
'</span>'
|
||||||
: '<button class="button button--completeMilestone" data-tooltip="Incomplete" type="button" aria-label="Incomplete">' +
|
: '<button class="button button--completeMilestone" data-tooltip="Incomplete" type="button" aria-label="Incomplete">' +
|
||||||
'<span class="icon is-small"><i class="far fa-square" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="far fa-square" aria-hidden="true"></i></span>' +
|
||||||
"</button>") +
|
'</button>') +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="column">' +
|
('<div class="column">' +
|
||||||
(milestone.workOrderMilestoneTypeId
|
(milestone.workOrderMilestoneTypeId
|
||||||
? "<strong>" +
|
? '<strong>' +
|
||||||
cityssm.escapeHTML(milestone.workOrderMilestoneType || "") +
|
cityssm.escapeHTML(milestone.workOrderMilestoneType || '') +
|
||||||
"</strong><br />"
|
'</strong><br />'
|
||||||
: "") +
|
: '') +
|
||||||
milestone.workOrderMilestoneDateString +
|
milestone.workOrderMilestoneDateString +
|
||||||
(milestone.workOrderMilestoneTime ? " " + milestone.workOrderMilestoneTimeString : "") +
|
(milestone.workOrderMilestoneTime
|
||||||
"<br />" +
|
? ' ' + milestone.workOrderMilestoneTimeString
|
||||||
|
: '') +
|
||||||
|
'<br />' +
|
||||||
'<span class="is-size-7">' +
|
'<span class="is-size-7">' +
|
||||||
cityssm.escapeHTML(milestone.workOrderMilestoneDescription || "") +
|
cityssm.escapeHTML(milestone.workOrderMilestoneDescription || '') +
|
||||||
"</span>" +
|
'</span>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="column is-narrow">' +
|
('<div class="column is-narrow">' +
|
||||||
'<div class="dropdown is-right">' +
|
'<div class="dropdown is-right">' +
|
||||||
('<div class="dropdown-trigger">' +
|
('<div class="dropdown-trigger">' +
|
||||||
'<button class="button is-small" data-tooltip="Options" type="button" aria-label="Options">' +
|
'<button class="button is-small" data-tooltip="Options" type="button" aria-label="Options">' +
|
||||||
'<i class="fas fa-ellipsis-v" aria-hidden="true"></i>' +
|
'<i class="fas fa-ellipsis-v" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="dropdown-menu">' +
|
('<div class="dropdown-menu">' +
|
||||||
'<div class="dropdown-content">' +
|
'<div class="dropdown-content">' +
|
||||||
(milestone.workOrderMilestoneCompletionDate
|
(milestone.workOrderMilestoneCompletionDate
|
||||||
? '<a class="dropdown-item button--reopenMilestone" href="#">' +
|
? '<a class="dropdown-item button--reopenMilestone" href="#">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-times" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-times" aria-hidden="true"></i></span>' +
|
||||||
" <span>Reopen Milestone</span>" +
|
' <span>Reopen Milestone</span>' +
|
||||||
"</a>"
|
'</a>'
|
||||||
: '<a class="dropdown-item button--editMilestone" href="#">' +
|
: '<a class="dropdown-item button--editMilestone" href="#">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||||
" <span>Edit Milestone</span>" +
|
' <span>Edit Milestone</span>' +
|
||||||
"</a>") +
|
'</a>') +
|
||||||
'<hr class="dropdown-divider" />' +
|
'<hr class="dropdown-divider" />' +
|
||||||
'<a class="dropdown-item button--deleteMilestone" href="#">' +
|
'<a class="dropdown-item button--deleteMilestone" href="#">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-trash has-text-danger" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-trash has-text-danger" aria-hidden="true"></i></span>' +
|
||||||
" <span>Delete Milestone</span>" +
|
' <span>Delete Milestone</span>' +
|
||||||
"</a>" +
|
'</a>' +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
"</div>";
|
'</div>'
|
||||||
|
|
||||||
panelBlockElement
|
panelBlockElement
|
||||||
.querySelector(".button--reopenMilestone")
|
.querySelector('.button--reopenMilestone')
|
||||||
?.addEventListener("click", reopenMilestone);
|
?.addEventListener('click', reopenMilestone)
|
||||||
panelBlockElement
|
panelBlockElement
|
||||||
.querySelector(".button--editMilestone")
|
.querySelector('.button--editMilestone')
|
||||||
?.addEventListener("click", editMilestone);
|
?.addEventListener('click', editMilestone)
|
||||||
|
|
||||||
panelBlockElement
|
panelBlockElement
|
||||||
.querySelector(".button--completeMilestone")
|
.querySelector('.button--completeMilestone')
|
||||||
?.addEventListener("click", completeMilestone);
|
?.addEventListener('click', completeMilestone)
|
||||||
|
|
||||||
panelBlockElement
|
panelBlockElement
|
||||||
.querySelector(".button--deleteMilestone")!
|
.querySelector('.button--deleteMilestone')!
|
||||||
.addEventListener("click", deleteMilestone);
|
.addEventListener('click', deleteMilestone)
|
||||||
|
|
||||||
milestonesPanelElement.append(panelBlockElement);
|
milestonesPanelElement.append(panelBlockElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
bulmaJS.init(milestonesPanelElement);
|
bulmaJS.init(milestonesPanelElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isCreate) {
|
if (!isCreate) {
|
||||||
workOrderMilestones = exports.workOrderMilestones as recordTypes.WorkOrderMilestone[];
|
workOrderMilestones =
|
||||||
delete exports.workOrderMilestones;
|
exports.workOrderMilestones as recordTypes.WorkOrderMilestone[]
|
||||||
|
delete exports.workOrderMilestones
|
||||||
|
|
||||||
renderMilestones();
|
renderMilestones()
|
||||||
|
|
||||||
document.querySelector("#button--addMilestone")!.addEventListener("click", () => {
|
document
|
||||||
let addModalElement: HTMLElement;
|
.querySelector('#button--addMilestone')!
|
||||||
let addFormElement: HTMLFormElement;
|
.addEventListener('click', () => {
|
||||||
let addCloseModalFunction: () => void;
|
let addModalElement: HTMLElement
|
||||||
|
let addFormElement: HTMLFormElement
|
||||||
|
let addCloseModalFunction: () => void
|
||||||
|
|
||||||
const doAdd = (submitEvent: SubmitEvent) => {
|
const doAdd = (submitEvent: SubmitEvent) => {
|
||||||
if (submitEvent) {
|
if (submitEvent) {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault()
|
||||||
}
|
}
|
||||||
|
|
||||||
const currentDateString = cityssm.dateToString(new Date());
|
const currentDateString = cityssm.dateToString(new Date())
|
||||||
|
|
||||||
function _doAdd() {
|
function _doAdd() {
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/workOrders/doAddWorkOrderMilestone",
|
los.urlPrefix + '/workOrders/doAddWorkOrderMilestone',
|
||||||
addFormElement,
|
addFormElement,
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
workOrderMilestones?: recordTypes.WorkOrderMilestone[];
|
workOrderMilestones?: recordTypes.WorkOrderMilestone[]
|
||||||
}) => {
|
}) => {
|
||||||
processMilestoneResponse(responseJSON);
|
processMilestoneResponse(responseJSON)
|
||||||
|
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
addCloseModalFunction();
|
addCloseModalFunction()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
(
|
(
|
||||||
addModalElement.querySelector(
|
addModalElement.querySelector(
|
||||||
"#milestoneAdd--workOrderMilestoneDateString"
|
'#milestoneAdd--workOrderMilestoneDateString'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value < currentDateString
|
).value < currentDateString
|
||||||
) {
|
) {
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Milestone Date in the Past",
|
title: 'Milestone Date in the Past',
|
||||||
message: "Are you sure you want to create a milestone with a date in the past?",
|
message:
|
||||||
contextualColorName: "warning",
|
'Are you sure you want to create a milestone with a date in the past?',
|
||||||
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Create a Past Milestone",
|
text: 'Yes, Create a Past Milestone',
|
||||||
callbackFunction: _doAdd
|
callbackFunction: _doAdd
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
} else {
|
} else {
|
||||||
_doAdd();
|
_doAdd()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
cityssm.openHtmlModal("workOrder-addMilestone", {
|
cityssm.openHtmlModal('workOrder-addMilestone', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
(modalElement.querySelector("#milestoneAdd--workOrderId") as HTMLInputElement).value =
|
;(
|
||||||
workOrderId;
|
modalElement.querySelector(
|
||||||
|
'#milestoneAdd--workOrderId'
|
||||||
|
) as HTMLInputElement
|
||||||
|
).value = workOrderId
|
||||||
|
|
||||||
const milestoneTypeElement = modalElement.querySelector(
|
const milestoneTypeElement = modalElement.querySelector(
|
||||||
"#milestoneAdd--workOrderMilestoneTypeId"
|
'#milestoneAdd--workOrderMilestoneTypeId'
|
||||||
) as HTMLSelectElement;
|
) as HTMLSelectElement
|
||||||
|
|
||||||
for (const milestoneType of exports.workOrderMilestoneTypes as recordTypes.WorkOrderMilestoneType[]) {
|
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.value =
|
||||||
optionElement.textContent = milestoneType.workOrderMilestoneType;
|
milestoneType.workOrderMilestoneTypeId.toString()
|
||||||
|
optionElement.textContent = milestoneType.workOrderMilestoneType
|
||||||
|
|
||||||
milestoneTypeElement.append(optionElement);
|
milestoneTypeElement.append(optionElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#milestoneAdd--workOrderMilestoneDateString"
|
'#milestoneAdd--workOrderMilestoneDateString'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).valueAsDate = new Date();
|
).valueAsDate = new Date()
|
||||||
},
|
},
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
addModalElement = modalElement;
|
addModalElement = modalElement
|
||||||
addCloseModalFunction = closeModalFunction;
|
addCloseModalFunction = closeModalFunction
|
||||||
|
|
||||||
los.initializeDatePickers(modalElement);
|
los.initializeDatePickers(modalElement)
|
||||||
// los.initializeTimePickers(modalElement);
|
// los.initializeTimePickers(modalElement);
|
||||||
|
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
|
|
||||||
addFormElement = modalElement.querySelector("form")!;
|
addFormElement = modalElement.querySelector('form')!
|
||||||
addFormElement.addEventListener("submit", doAdd);
|
addFormElement.addEventListener('submit', doAdd)
|
||||||
},
|
},
|
||||||
onremoved() {
|
onremoved() {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
})();
|
})()
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
let workOrderComments = exports.workOrderComments;
|
let workOrderComments = exports.workOrderComments;
|
||||||
delete exports.workOrderComments;
|
delete exports.workOrderComments;
|
||||||
const openEditWorkOrderComment = (clickEvent) => {
|
const openEditWorkOrderComment = (clickEvent) => {
|
||||||
const workOrderCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.workOrderCommentId, 10);
|
const workOrderCommentId = Number.parseInt(clickEvent.currentTarget.closest('tr').dataset
|
||||||
|
.workOrderCommentId, 10);
|
||||||
const workOrderComment = workOrderComments.find((currentComment) => {
|
const workOrderComment = workOrderComments.find((currentComment) => {
|
||||||
return currentComment.workOrderCommentId === workOrderCommentId;
|
return currentComment.workOrderCommentId === workOrderCommentId;
|
||||||
});
|
});
|
||||||
|
|
@ -13,7 +14,7 @@ const openEditWorkOrderComment = (clickEvent) => {
|
||||||
let editCloseModalFunction;
|
let editCloseModalFunction;
|
||||||
function editComment(submitEvent) {
|
function editComment(submitEvent) {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doUpdateWorkOrderComment", editFormElement, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/workOrders/doUpdateWorkOrderComment', editFormElement, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderComments = responseJSON.workOrderComments;
|
workOrderComments = responseJSON.workOrderComments;
|
||||||
editCloseModalFunction();
|
editCloseModalFunction();
|
||||||
|
|
@ -21,35 +22,35 @@ const openEditWorkOrderComment = (clickEvent) => {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating Comment",
|
title: 'Error Updating Comment',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
cityssm.openHtmlModal("workOrder-editComment", {
|
cityssm.openHtmlModal('workOrder-editComment', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
modalElement.querySelector("#workOrderCommentEdit--workOrderId").value =
|
;
|
||||||
workOrderId;
|
modalElement.querySelector('#workOrderCommentEdit--workOrderId').value = workOrderId;
|
||||||
modalElement.querySelector("#workOrderCommentEdit--workOrderCommentId").value = workOrderCommentId.toString();
|
modalElement.querySelector('#workOrderCommentEdit--workOrderCommentId').value = workOrderCommentId.toString();
|
||||||
modalElement.querySelector("#workOrderCommentEdit--workOrderComment").value = workOrderComment.workOrderComment;
|
modalElement.querySelector('#workOrderCommentEdit--workOrderComment').value = workOrderComment.workOrderComment;
|
||||||
const workOrderCommentDateStringElement = modalElement.querySelector("#workOrderCommentEdit--workOrderCommentDateString");
|
const workOrderCommentDateStringElement = modalElement.querySelector('#workOrderCommentEdit--workOrderCommentDateString');
|
||||||
workOrderCommentDateStringElement.value = workOrderComment.workOrderCommentDateString;
|
workOrderCommentDateStringElement.value =
|
||||||
|
workOrderComment.workOrderCommentDateString;
|
||||||
const currentDateString = cityssm.dateToString(new Date());
|
const currentDateString = cityssm.dateToString(new Date());
|
||||||
workOrderCommentDateStringElement.max =
|
workOrderCommentDateStringElement.max =
|
||||||
workOrderComment.workOrderCommentDateString <= currentDateString
|
workOrderComment.workOrderCommentDateString <= currentDateString
|
||||||
? currentDateString
|
? currentDateString
|
||||||
: workOrderComment.workOrderCommentDateString;
|
: workOrderComment.workOrderCommentDateString;
|
||||||
modalElement.querySelector("#workOrderCommentEdit--workOrderCommentTimeString").value = workOrderComment.workOrderCommentTimeString;
|
modalElement.querySelector('#workOrderCommentEdit--workOrderCommentTimeString').value = workOrderComment.workOrderCommentTimeString;
|
||||||
},
|
},
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
los.initializeDatePickers(modalElement);
|
los.initializeDatePickers(modalElement);
|
||||||
// los.initializeTimePickers(modalElement);
|
modalElement.querySelector('#workOrderCommentEdit--workOrderComment').focus();
|
||||||
modalElement.querySelector("#workOrderCommentEdit--workOrderComment").focus();
|
editFormElement = modalElement.querySelector('form');
|
||||||
editFormElement = modalElement.querySelector("form");
|
editFormElement.addEventListener('submit', editComment);
|
||||||
editFormElement.addEventListener("submit", editComment);
|
|
||||||
editCloseModalFunction = closeModalFunction;
|
editCloseModalFunction = closeModalFunction;
|
||||||
},
|
},
|
||||||
onremoved() {
|
onremoved() {
|
||||||
|
|
@ -58,9 +59,10 @@ const openEditWorkOrderComment = (clickEvent) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
function deleteWorkOrderComment(clickEvent) {
|
function deleteWorkOrderComment(clickEvent) {
|
||||||
const workOrderCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.workOrderCommentId, 10);
|
const workOrderCommentId = Number.parseInt(clickEvent.currentTarget.closest('tr').dataset
|
||||||
|
.workOrderCommentId, 10);
|
||||||
function doDelete() {
|
function doDelete() {
|
||||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doDeleteWorkOrderComment", {
|
cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrderComment', {
|
||||||
workOrderId,
|
workOrderId,
|
||||||
workOrderCommentId
|
workOrderCommentId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
|
|
@ -70,77 +72,82 @@ function deleteWorkOrderComment(clickEvent) {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Removing Comment",
|
title: 'Error Removing Comment',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Remove Comment?",
|
title: 'Remove Comment?',
|
||||||
message: "Are you sure you want to remove this comment?",
|
message: 'Are you sure you want to remove this comment?',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Remove Comment",
|
text: 'Yes, Remove Comment',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
},
|
},
|
||||||
contextualColorName: "warning"
|
contextualColorName: 'warning'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function renderWorkOrderComments() {
|
function renderWorkOrderComments() {
|
||||||
const containerElement = document.querySelector("#container--workOrderComments");
|
const containerElement = document.querySelector('#container--workOrderComments');
|
||||||
if (workOrderComments.length === 0) {
|
if (workOrderComments.length === 0) {
|
||||||
containerElement.innerHTML = `<div class="message is-info">
|
containerElement.innerHTML = `<div class="message is-info">
|
||||||
<p class="message-body">There are no comments to display.</p>
|
<p class="message-body">There are no comments to display.</p>
|
||||||
</div>`;
|
</div>`;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const tableElement = document.createElement("table");
|
const tableElement = document.createElement('table');
|
||||||
tableElement.className = "table is-fullwidth is-striped is-hoverable";
|
tableElement.className = 'table is-fullwidth is-striped is-hoverable';
|
||||||
tableElement.innerHTML = `<thead><tr>
|
tableElement.innerHTML = `<thead><tr>
|
||||||
<th>Commentor</th>
|
<th>Commentor</th>
|
||||||
<th>Comment Date</th>
|
<th>Comment Date</th>
|
||||||
<th>Comment</th>
|
<th>Comment</th>
|
||||||
<th class="is-hidden-print"><span class="is-sr-only">Options</span></th></tr></thead><tbody></tbody>`;
|
<th class="is-hidden-print"><span class="is-sr-only">Options</span></th></tr></thead><tbody></tbody>`;
|
||||||
for (const workOrderComment of workOrderComments) {
|
for (const workOrderComment of workOrderComments) {
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement('tr');
|
||||||
tableRowElement.dataset.workOrderCommentId = workOrderComment.workOrderCommentId.toString();
|
tableRowElement.dataset.workOrderCommentId =
|
||||||
|
workOrderComment.workOrderCommentId.toString();
|
||||||
tableRowElement.innerHTML =
|
tableRowElement.innerHTML =
|
||||||
"<td>" +
|
'<td>' +
|
||||||
cityssm.escapeHTML(workOrderComment.recordCreate_userName || "") +
|
cityssm.escapeHTML(workOrderComment.recordCreate_userName || '') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
"<td>" +
|
'<td>' +
|
||||||
workOrderComment.workOrderCommentDateString +
|
workOrderComment.workOrderCommentDateString +
|
||||||
(workOrderComment.workOrderCommentTime === 0
|
(workOrderComment.workOrderCommentTime === 0
|
||||||
? ""
|
? ''
|
||||||
: " " + workOrderComment.workOrderCommentTimeString) +
|
: ' ' + workOrderComment.workOrderCommentTimeString) +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
"<td>" +
|
'<td>' +
|
||||||
cityssm.escapeHTML(workOrderComment.workOrderComment || "") +
|
cityssm.escapeHTML(workOrderComment.workOrderComment || '') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
('<td class="is-hidden-print">' +
|
('<td class="is-hidden-print">' +
|
||||||
'<div class="buttons are-small is-justify-content-end">' +
|
'<div class="buttons are-small is-justify-content-end">' +
|
||||||
('<button class="button is-primary button--edit" type="button">' +
|
('<button class="button is-primary button--edit" type="button">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||||
" <span>Edit</span>" +
|
' <span>Edit</span>' +
|
||||||
"</button>") +
|
'</button>') +
|
||||||
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
|
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>") +
|
'</button>') +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</td>");
|
'</td>');
|
||||||
tableRowElement.querySelector(".button--edit").addEventListener("click", openEditWorkOrderComment);
|
tableRowElement
|
||||||
tableRowElement.querySelector(".button--delete").addEventListener("click", deleteWorkOrderComment);
|
.querySelector('.button--edit')
|
||||||
tableElement.querySelector("tbody").append(tableRowElement);
|
.addEventListener('click', openEditWorkOrderComment);
|
||||||
|
tableRowElement
|
||||||
|
.querySelector('.button--delete')
|
||||||
|
.addEventListener('click', deleteWorkOrderComment);
|
||||||
|
tableElement.querySelector('tbody').append(tableRowElement);
|
||||||
}
|
}
|
||||||
containerElement.innerHTML = "";
|
containerElement.innerHTML = '';
|
||||||
containerElement.append(tableElement);
|
containerElement.append(tableElement);
|
||||||
}
|
}
|
||||||
function openAddCommentModal() {
|
function openAddCommentModal() {
|
||||||
let addCommentCloseModalFunction;
|
let addCommentCloseModalFunction;
|
||||||
function doAddComment(formEvent) {
|
function doAddComment(formEvent) {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doAddWorkOrderComment", formEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/workOrders/doAddWorkOrderComment', formEvent.currentTarget, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderComments = responseJSON.workOrderComments;
|
workOrderComments = responseJSON.workOrderComments;
|
||||||
renderWorkOrderComments();
|
renderWorkOrderComments();
|
||||||
|
|
@ -148,25 +155,27 @@ function openAddCommentModal() {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
cityssm.openHtmlModal("workOrder-addComment", {
|
cityssm.openHtmlModal('workOrder-addComment', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement);
|
||||||
modalElement.querySelector("#workOrderCommentAdd--workOrderId").value =
|
modalElement.querySelector('#workOrderCommentAdd--workOrderId').value = workOrderId;
|
||||||
workOrderId;
|
modalElement
|
||||||
modalElement.querySelector("form").addEventListener("submit", doAddComment);
|
.querySelector('form')
|
||||||
|
.addEventListener('submit', doAddComment);
|
||||||
},
|
},
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
addCommentCloseModalFunction = closeModalFunction;
|
addCommentCloseModalFunction = closeModalFunction;
|
||||||
modalElement.querySelector("#workOrderCommentAdd--workOrderComment").focus();
|
modalElement.querySelector('#workOrderCommentAdd--workOrderComment').focus();
|
||||||
},
|
},
|
||||||
onremoved() {
|
onremoved() {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
document.querySelector("#workOrderComments--add").focus();
|
document.querySelector('#workOrderComments--add').focus();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
(_a = document.querySelector("#workOrderComments--add")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", openAddCommentModal);
|
(_a = document
|
||||||
|
.querySelector('#workOrderComments--add')) === null || _a === void 0 ? void 0 : _a.addEventListener('click', openAddCommentModal);
|
||||||
if (!isCreate) {
|
if (!isCreate) {
|
||||||
renderWorkOrderComments();
|
renderWorkOrderComments();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,256 +1,290 @@
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||||
|
|
||||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||||
|
|
||||||
import type * as globalTypes from "../../types/globalTypes";
|
import type * as globalTypes from '../../types/globalTypes'
|
||||||
import type * as recordTypes from "../../types/recordTypes";
|
import type * as recordTypes from '../../types/recordTypes'
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal
|
||||||
declare const bulmaJS: BulmaJS;
|
declare const bulmaJS: BulmaJS
|
||||||
|
|
||||||
declare const los: globalTypes.LOS;
|
declare const los: globalTypes.LOS
|
||||||
|
|
||||||
declare const workOrderId: string;
|
declare const workOrderId: string
|
||||||
declare const isCreate: boolean;
|
declare const isCreate: boolean
|
||||||
|
|
||||||
let workOrderComments: recordTypes.WorkOrderComment[] = exports.workOrderComments;
|
let workOrderComments: recordTypes.WorkOrderComment[] =
|
||||||
delete exports.workOrderComments;
|
exports.workOrderComments
|
||||||
|
delete exports.workOrderComments
|
||||||
|
|
||||||
const openEditWorkOrderComment = (clickEvent: Event) => {
|
const openEditWorkOrderComment = (clickEvent: Event) => {
|
||||||
const workOrderCommentId = Number.parseInt(
|
const workOrderCommentId = Number.parseInt(
|
||||||
(clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.workOrderCommentId!,
|
(clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset
|
||||||
|
.workOrderCommentId!,
|
||||||
10
|
10
|
||||||
);
|
)
|
||||||
|
|
||||||
const workOrderComment = workOrderComments.find((currentComment) => {
|
const workOrderComment = workOrderComments.find((currentComment) => {
|
||||||
return currentComment.workOrderCommentId === workOrderCommentId;
|
return currentComment.workOrderCommentId === workOrderCommentId
|
||||||
})!;
|
})!
|
||||||
|
|
||||||
let editFormElement: HTMLFormElement;
|
let editFormElement: HTMLFormElement
|
||||||
let editCloseModalFunction: () => void;
|
let editCloseModalFunction: () => void
|
||||||
|
|
||||||
function editComment(submitEvent: SubmitEvent): void {
|
function editComment(submitEvent: SubmitEvent): void {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault()
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/workOrders/doUpdateWorkOrderComment",
|
los.urlPrefix + '/workOrders/doUpdateWorkOrderComment',
|
||||||
editFormElement,
|
editFormElement,
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
workOrderComments?: recordTypes.WorkOrderComment[];
|
workOrderComments?: recordTypes.WorkOrderComment[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderComments = responseJSON.workOrderComments!;
|
workOrderComments = responseJSON.workOrderComments!
|
||||||
editCloseModalFunction();
|
editCloseModalFunction()
|
||||||
renderWorkOrderComments();
|
renderWorkOrderComments()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Updating Comment",
|
title: 'Error Updating Comment',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
cityssm.openHtmlModal("workOrder-editComment", {
|
cityssm.openHtmlModal('workOrder-editComment', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
(modalElement.querySelector("#workOrderCommentEdit--workOrderId") as HTMLInputElement).value =
|
;(
|
||||||
workOrderId;
|
modalElement.querySelector(
|
||||||
(
|
'#workOrderCommentEdit--workOrderId'
|
||||||
modalElement.querySelector("#workOrderCommentEdit--workOrderCommentId") as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value = workOrderCommentId.toString();
|
).value = workOrderId
|
||||||
|
;(
|
||||||
|
modalElement.querySelector(
|
||||||
|
'#workOrderCommentEdit--workOrderCommentId'
|
||||||
|
) as HTMLInputElement
|
||||||
|
).value = workOrderCommentId.toString()
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector("#workOrderCommentEdit--workOrderComment") as HTMLInputElement
|
modalElement.querySelector(
|
||||||
).value = workOrderComment.workOrderComment!;
|
'#workOrderCommentEdit--workOrderComment'
|
||||||
|
) as HTMLInputElement
|
||||||
|
).value = workOrderComment.workOrderComment!
|
||||||
|
|
||||||
const workOrderCommentDateStringElement = modalElement.querySelector(
|
const workOrderCommentDateStringElement = modalElement.querySelector(
|
||||||
"#workOrderCommentEdit--workOrderCommentDateString"
|
'#workOrderCommentEdit--workOrderCommentDateString'
|
||||||
) as HTMLInputElement;
|
) as HTMLInputElement
|
||||||
|
|
||||||
workOrderCommentDateStringElement.value = workOrderComment.workOrderCommentDateString!;
|
workOrderCommentDateStringElement.value =
|
||||||
|
workOrderComment.workOrderCommentDateString!
|
||||||
|
|
||||||
const currentDateString = cityssm.dateToString(new Date());
|
const currentDateString = cityssm.dateToString(new Date())
|
||||||
|
|
||||||
workOrderCommentDateStringElement.max =
|
workOrderCommentDateStringElement.max =
|
||||||
workOrderComment.workOrderCommentDateString! <= currentDateString
|
workOrderComment.workOrderCommentDateString! <= currentDateString
|
||||||
? currentDateString
|
? currentDateString
|
||||||
: workOrderComment.workOrderCommentDateString!;
|
: workOrderComment.workOrderCommentDateString!
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector(
|
modalElement.querySelector(
|
||||||
"#workOrderCommentEdit--workOrderCommentTimeString"
|
'#workOrderCommentEdit--workOrderCommentTimeString'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
).value = workOrderComment.workOrderCommentTimeString!;
|
).value = workOrderComment.workOrderCommentTimeString!
|
||||||
},
|
},
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
|
|
||||||
los.initializeDatePickers(modalElement);
|
los.initializeDatePickers(modalElement)
|
||||||
// los.initializeTimePickers(modalElement);
|
// los.initializeTimePickers(modalElement);
|
||||||
|
|
||||||
(
|
;(
|
||||||
modalElement.querySelector("#workOrderCommentEdit--workOrderComment") as HTMLTextAreaElement
|
modalElement.querySelector(
|
||||||
).focus();
|
'#workOrderCommentEdit--workOrderComment'
|
||||||
|
) as HTMLTextAreaElement
|
||||||
|
).focus()
|
||||||
|
|
||||||
editFormElement = modalElement.querySelector("form")!;
|
editFormElement = modalElement.querySelector('form')!
|
||||||
editFormElement.addEventListener("submit", editComment);
|
editFormElement.addEventListener('submit', editComment)
|
||||||
|
|
||||||
editCloseModalFunction = closeModalFunction;
|
editCloseModalFunction = closeModalFunction
|
||||||
},
|
},
|
||||||
onremoved() {
|
onremoved() {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
function deleteWorkOrderComment(clickEvent: Event): void {
|
function deleteWorkOrderComment(clickEvent: Event): void {
|
||||||
const workOrderCommentId = Number.parseInt(
|
const workOrderCommentId = Number.parseInt(
|
||||||
(clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.workOrderCommentId!,
|
(clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset
|
||||||
|
.workOrderCommentId!,
|
||||||
10
|
10
|
||||||
);
|
)
|
||||||
|
|
||||||
function doDelete() {
|
function doDelete() {
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/workOrders/doDeleteWorkOrderComment",
|
los.urlPrefix + '/workOrders/doDeleteWorkOrderComment',
|
||||||
{
|
{
|
||||||
workOrderId,
|
workOrderId,
|
||||||
workOrderCommentId
|
workOrderCommentId
|
||||||
},
|
},
|
||||||
(responseJSON: {
|
(responseJSON: {
|
||||||
success: boolean;
|
success: boolean
|
||||||
errorMessage?: string;
|
errorMessage?: string
|
||||||
workOrderComments: recordTypes.WorkOrderComment[];
|
workOrderComments: recordTypes.WorkOrderComment[]
|
||||||
}) => {
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderComments = responseJSON.workOrderComments;
|
workOrderComments = responseJSON.workOrderComments
|
||||||
renderWorkOrderComments();
|
renderWorkOrderComments()
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Removing Comment",
|
title: 'Error Removing Comment',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Remove Comment?",
|
title: 'Remove Comment?',
|
||||||
message: "Are you sure you want to remove this comment?",
|
message: 'Are you sure you want to remove this comment?',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Remove Comment",
|
text: 'Yes, Remove Comment',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
},
|
},
|
||||||
contextualColorName: "warning"
|
contextualColorName: 'warning'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderWorkOrderComments() {
|
function renderWorkOrderComments() {
|
||||||
const containerElement = document.querySelector("#container--workOrderComments") as HTMLElement;
|
const containerElement = document.querySelector(
|
||||||
|
'#container--workOrderComments'
|
||||||
|
) as HTMLElement
|
||||||
|
|
||||||
if (workOrderComments.length === 0) {
|
if (workOrderComments.length === 0) {
|
||||||
containerElement.innerHTML = `<div class="message is-info">
|
containerElement.innerHTML = `<div class="message is-info">
|
||||||
<p class="message-body">There are no comments to display.</p>
|
<p class="message-body">There are no comments to display.</p>
|
||||||
</div>`;
|
</div>`
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const tableElement = document.createElement("table");
|
const tableElement = document.createElement('table')
|
||||||
tableElement.className = "table is-fullwidth is-striped is-hoverable";
|
tableElement.className = 'table is-fullwidth is-striped is-hoverable'
|
||||||
tableElement.innerHTML = `<thead><tr>
|
tableElement.innerHTML = `<thead><tr>
|
||||||
<th>Commentor</th>
|
<th>Commentor</th>
|
||||||
<th>Comment Date</th>
|
<th>Comment Date</th>
|
||||||
<th>Comment</th>
|
<th>Comment</th>
|
||||||
<th class="is-hidden-print"><span class="is-sr-only">Options</span></th></tr></thead><tbody></tbody>`;
|
<th class="is-hidden-print"><span class="is-sr-only">Options</span></th></tr></thead><tbody></tbody>`
|
||||||
|
|
||||||
for (const workOrderComment of workOrderComments) {
|
for (const workOrderComment of workOrderComments) {
|
||||||
const tableRowElement = document.createElement("tr");
|
const tableRowElement = document.createElement('tr')
|
||||||
tableRowElement.dataset.workOrderCommentId = workOrderComment.workOrderCommentId!.toString();
|
tableRowElement.dataset.workOrderCommentId =
|
||||||
|
workOrderComment.workOrderCommentId!.toString()
|
||||||
|
|
||||||
tableRowElement.innerHTML =
|
tableRowElement.innerHTML =
|
||||||
"<td>" +
|
'<td>' +
|
||||||
cityssm.escapeHTML(workOrderComment.recordCreate_userName || "") +
|
cityssm.escapeHTML(workOrderComment.recordCreate_userName || '') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
"<td>" +
|
'<td>' +
|
||||||
workOrderComment.workOrderCommentDateString +
|
workOrderComment.workOrderCommentDateString +
|
||||||
(workOrderComment.workOrderCommentTime === 0
|
(workOrderComment.workOrderCommentTime === 0
|
||||||
? ""
|
? ''
|
||||||
: " " + workOrderComment.workOrderCommentTimeString) +
|
: ' ' + workOrderComment.workOrderCommentTimeString) +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
"<td>" +
|
'<td>' +
|
||||||
cityssm.escapeHTML(workOrderComment.workOrderComment || "") +
|
cityssm.escapeHTML(workOrderComment.workOrderComment || '') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
('<td class="is-hidden-print">' +
|
('<td class="is-hidden-print">' +
|
||||||
'<div class="buttons are-small is-justify-content-end">' +
|
'<div class="buttons are-small is-justify-content-end">' +
|
||||||
('<button class="button is-primary button--edit" type="button">' +
|
('<button class="button is-primary button--edit" type="button">' +
|
||||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||||
" <span>Edit</span>" +
|
' <span>Edit</span>' +
|
||||||
"</button>") +
|
'</button>') +
|
||||||
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
|
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>") +
|
'</button>') +
|
||||||
"</div>" +
|
'</div>' +
|
||||||
"</td>");
|
'</td>')
|
||||||
|
|
||||||
tableRowElement.querySelector(".button--edit")!.addEventListener("click", openEditWorkOrderComment);
|
tableRowElement
|
||||||
|
.querySelector('.button--edit')!
|
||||||
|
.addEventListener('click', openEditWorkOrderComment)
|
||||||
|
|
||||||
tableRowElement.querySelector(".button--delete")!.addEventListener("click", deleteWorkOrderComment);
|
tableRowElement
|
||||||
|
.querySelector('.button--delete')!
|
||||||
|
.addEventListener('click', deleteWorkOrderComment)
|
||||||
|
|
||||||
tableElement.querySelector("tbody")!.append(tableRowElement);
|
tableElement.querySelector('tbody')!.append(tableRowElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
containerElement.innerHTML = "";
|
containerElement.innerHTML = ''
|
||||||
containerElement.append(tableElement);
|
containerElement.append(tableElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
function openAddCommentModal() {
|
function openAddCommentModal() {
|
||||||
let addCommentCloseModalFunction: () => void;
|
let addCommentCloseModalFunction: () => void
|
||||||
|
|
||||||
function doAddComment(formEvent: SubmitEvent) {
|
function doAddComment(formEvent: SubmitEvent) {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault()
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/workOrders/doAddWorkOrderComment",
|
los.urlPrefix + '/workOrders/doAddWorkOrderComment',
|
||||||
formEvent.currentTarget,
|
formEvent.currentTarget,
|
||||||
(responseJSON: { success: boolean; workOrderComments?: recordTypes.WorkOrderComment[] }) => {
|
(responseJSON: {
|
||||||
|
success: boolean
|
||||||
|
workOrderComments?: recordTypes.WorkOrderComment[]
|
||||||
|
}) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderComments = responseJSON.workOrderComments!;
|
workOrderComments = responseJSON.workOrderComments!
|
||||||
renderWorkOrderComments();
|
renderWorkOrderComments()
|
||||||
addCommentCloseModalFunction();
|
addCommentCloseModalFunction()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
cityssm.openHtmlModal("workOrder-addComment", {
|
cityssm.openHtmlModal('workOrder-addComment', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement)
|
||||||
(modalElement.querySelector("#workOrderCommentAdd--workOrderId") as HTMLInputElement).value =
|
;(
|
||||||
workOrderId;
|
modalElement.querySelector(
|
||||||
modalElement.querySelector("form")!.addEventListener("submit", doAddComment);
|
'#workOrderCommentAdd--workOrderId'
|
||||||
|
) as HTMLInputElement
|
||||||
|
).value = workOrderId
|
||||||
|
modalElement
|
||||||
|
.querySelector('form')!
|
||||||
|
.addEventListener('submit', doAddComment)
|
||||||
},
|
},
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
addCommentCloseModalFunction = closeModalFunction;
|
addCommentCloseModalFunction = closeModalFunction
|
||||||
(
|
;(
|
||||||
modalElement.querySelector("#workOrderCommentAdd--workOrderComment") as HTMLTextAreaElement
|
modalElement.querySelector(
|
||||||
).focus();
|
'#workOrderCommentAdd--workOrderComment'
|
||||||
|
) as HTMLTextAreaElement
|
||||||
|
).focus()
|
||||||
},
|
},
|
||||||
onremoved() {
|
onremoved() {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped()
|
||||||
(document.querySelector("#workOrderComments--add") as HTMLButtonElement).focus();
|
;(
|
||||||
|
document.querySelector('#workOrderComments--add') as HTMLButtonElement
|
||||||
|
).focus()
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
document.querySelector("#workOrderComments--add")?.addEventListener("click", openAddCommentModal);
|
document
|
||||||
|
.querySelector('#workOrderComments--add')
|
||||||
|
?.addEventListener('click', openAddCommentModal)
|
||||||
|
|
||||||
if (!isCreate) {
|
if (!isCreate) {
|
||||||
renderWorkOrderComments();
|
renderWorkOrderComments()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,9 @@ delete exports.workOrderLots;
|
||||||
let workOrderLotOccupancies = exports.workOrderLotOccupancies;
|
let workOrderLotOccupancies = exports.workOrderLotOccupancies;
|
||||||
delete exports.workOrderLotOccupancies;
|
delete exports.workOrderLotOccupancies;
|
||||||
function deleteLotOccupancy(clickEvent) {
|
function deleteLotOccupancy(clickEvent) {
|
||||||
const lotOccupancyId = clickEvent.currentTarget.closest(".container--lotOccupancy").dataset.lotOccupancyId;
|
const lotOccupancyId = clickEvent.currentTarget.closest('.container--lotOccupancy').dataset.lotOccupancyId;
|
||||||
function doDelete() {
|
function doDelete() {
|
||||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doDeleteWorkOrderLotOccupancy", {
|
cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrderLotOccupancy', {
|
||||||
workOrderId,
|
workOrderId,
|
||||||
lotOccupancyId
|
lotOccupancyId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
|
|
@ -18,9 +18,9 @@ function deleteLotOccupancy(clickEvent) {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Deleting Relationship",
|
title: 'Error Deleting Relationship',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -28,15 +28,15 @@ function deleteLotOccupancy(clickEvent) {
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: `Delete ${los.escapedAliases.Occupancy} Relationship`,
|
title: `Delete ${los.escapedAliases.Occupancy} Relationship`,
|
||||||
message: `Are you sure you want to remove the relationship to this ${los.escapedAliases.occupancy} record from this work order? Note that the record will remain.`,
|
message: `Are you sure you want to remove the relationship to this ${los.escapedAliases.occupancy} record from this work order? Note that the record will remain.`,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete Relationship",
|
text: 'Yes, Delete Relationship',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function addLot(lotId, callbackFunction) {
|
function addLot(lotId, callbackFunction) {
|
||||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doAddWorkOrderLot", {
|
cityssm.postJSON(los.urlPrefix + '/workOrders/doAddWorkOrderLot', {
|
||||||
workOrderId,
|
workOrderId,
|
||||||
lotId
|
lotId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
|
|
@ -46,9 +46,9 @@ function addLot(lotId, callbackFunction) {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Adding " + los.escapedAliases.Lot,
|
title: 'Error Adding ' + los.escapedAliases.Lot,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (callbackFunction) {
|
if (callbackFunction) {
|
||||||
|
|
@ -57,7 +57,7 @@ function addLot(lotId, callbackFunction) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function addLotOccupancy(lotOccupancyId, callbackFunction) {
|
function addLotOccupancy(lotOccupancyId, callbackFunction) {
|
||||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doAddWorkOrderLotOccupancy", {
|
cityssm.postJSON(los.urlPrefix + '/workOrders/doAddWorkOrderLotOccupancy', {
|
||||||
workOrderId,
|
workOrderId,
|
||||||
lotOccupancyId
|
lotOccupancyId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
|
|
@ -67,9 +67,9 @@ function addLotOccupancy(lotOccupancyId, callbackFunction) {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Adding " + los.escapedAliases.Occupancy,
|
title: 'Error Adding ' + los.escapedAliases.Occupancy,
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (callbackFunction) {
|
if (callbackFunction) {
|
||||||
|
|
@ -83,9 +83,8 @@ function addLotFromLotOccupancy(clickEvent) {
|
||||||
}
|
}
|
||||||
function renderRelatedOccupancies() {
|
function renderRelatedOccupancies() {
|
||||||
var _a, _b;
|
var _a, _b;
|
||||||
const occupanciesContainerElement = document.querySelector("#container--lotOccupancies");
|
const occupanciesContainerElement = document.querySelector('#container--lotOccupancies');
|
||||||
document.querySelector(".tabs a[href='#relatedTab--lotOccupancies'] .tag").textContent =
|
document.querySelector(".tabs a[href='#relatedTab--lotOccupancies'] .tag").textContent = workOrderLotOccupancies.length.toString();
|
||||||
workOrderLotOccupancies.length.toString();
|
|
||||||
if (workOrderLotOccupancies.length === 0) {
|
if (workOrderLotOccupancies.length === 0) {
|
||||||
occupanciesContainerElement.innerHTML = `<div class="message is-info">
|
occupanciesContainerElement.innerHTML = `<div class="message is-info">
|
||||||
<p class="message-body">There are no ${los.escapedAliases.occupancies} associated with this work order.</p>
|
<p class="message-body">There are no ${los.escapedAliases.occupancies} associated with this work order.</p>
|
||||||
|
|
@ -103,10 +102,11 @@ function renderRelatedOccupancies() {
|
||||||
</table>`;
|
</table>`;
|
||||||
const currentDateString = cityssm.dateToString(new Date());
|
const currentDateString = cityssm.dateToString(new Date());
|
||||||
for (const lotOccupancy of workOrderLotOccupancies) {
|
for (const lotOccupancy of workOrderLotOccupancies) {
|
||||||
const rowElement = document.createElement("tr");
|
const rowElement = document.createElement('tr');
|
||||||
rowElement.className = "container--lotOccupancy";
|
rowElement.className = 'container--lotOccupancy';
|
||||||
rowElement.dataset.lotOccupancyId = lotOccupancy.lotOccupancyId.toString();
|
rowElement.dataset.lotOccupancyId = lotOccupancy.lotOccupancyId.toString();
|
||||||
const isActive = !(lotOccupancy.occupancyEndDate && lotOccupancy.occupancyEndDateString < currentDateString);
|
const isActive = !(lotOccupancy.occupancyEndDate &&
|
||||||
|
lotOccupancy.occupancyEndDateString < currentDateString);
|
||||||
const hasLotRecord = lotOccupancy.lotId &&
|
const hasLotRecord = lotOccupancy.lotId &&
|
||||||
workOrderLots.some((lot) => {
|
workOrderLots.some((lot) => {
|
||||||
return lotOccupancy.lotId === lot.lotId;
|
return lotOccupancy.lotId === lot.lotId;
|
||||||
|
|
@ -114,21 +114,25 @@ function renderRelatedOccupancies() {
|
||||||
rowElement.innerHTML =
|
rowElement.innerHTML =
|
||||||
'<td class="is-width-1 has-text-centered">' +
|
'<td class="is-width-1 has-text-centered">' +
|
||||||
(isActive
|
(isActive
|
||||||
? '<i class="fas fa-play" title="Current ' + los.escapedAliases.Occupancy + '"></i>'
|
? '<i class="fas fa-play" title="Current ' +
|
||||||
: '<i class="fas fa-stop" title="Previous ' + los.escapedAliases.Occupancy + '"></i>') +
|
los.escapedAliases.Occupancy +
|
||||||
"</td>" +
|
'"></i>'
|
||||||
("<td>" +
|
: '<i class="fas fa-stop" title="Previous ' +
|
||||||
|
los.escapedAliases.Occupancy +
|
||||||
|
'"></i>') +
|
||||||
|
'</td>' +
|
||||||
|
('<td>' +
|
||||||
'<a class="has-text-weight-bold" href="' +
|
'<a class="has-text-weight-bold" href="' +
|
||||||
los.getLotOccupancyURL(lotOccupancy.lotOccupancyId) +
|
los.getLotOccupancyURL(lotOccupancy.lotOccupancyId) +
|
||||||
'">' +
|
'">' +
|
||||||
cityssm.escapeHTML(lotOccupancy.occupancyType || "") +
|
cityssm.escapeHTML(lotOccupancy.occupancyType || '') +
|
||||||
"</a>" +
|
'</a>' +
|
||||||
"</td>");
|
'</td>');
|
||||||
if (lotOccupancy.lotId) {
|
if (lotOccupancy.lotId) {
|
||||||
rowElement.insertAdjacentHTML("beforeend", "<td>" +
|
rowElement.insertAdjacentHTML('beforeend', '<td>' +
|
||||||
cityssm.escapeHTML(lotOccupancy.lotName || "") +
|
cityssm.escapeHTML(lotOccupancy.lotName || '') +
|
||||||
(hasLotRecord
|
(hasLotRecord
|
||||||
? ""
|
? ''
|
||||||
: ' <button class="button is-small is-light is-success button--addLot"' +
|
: ' <button class="button is-small is-light is-success button--addLot"' +
|
||||||
' data-lot-id="' +
|
' data-lot-id="' +
|
||||||
lotOccupancy.lotId +
|
lotOccupancy.lotId +
|
||||||
|
|
@ -140,58 +144,61 @@ function renderRelatedOccupancies() {
|
||||||
los.escapedAliases.Lot +
|
los.escapedAliases.Lot +
|
||||||
'" type="button">' +
|
'" type="button">' +
|
||||||
'<i class="fas fa-plus" aria-hidden="true"></i>' +
|
'<i class="fas fa-plus" aria-hidden="true"></i>' +
|
||||||
"</button>") +
|
'</button>') +
|
||||||
"</td>");
|
'</td>');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
rowElement.insertAdjacentHTML("beforeend", `<td><span class="has-text-grey">(No ${los.escapedAliases.Lot})</span></td>`);
|
rowElement.insertAdjacentHTML('beforeend', `<td><span class="has-text-grey">(No ${los.escapedAliases.Lot})</span></td>`);
|
||||||
}
|
}
|
||||||
rowElement.insertAdjacentHTML("beforeend", "<td>" +
|
rowElement.insertAdjacentHTML('beforeend', '<td>' +
|
||||||
lotOccupancy.occupancyStartDateString +
|
lotOccupancy.occupancyStartDateString +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
(lotOccupancy.occupancyEndDate
|
(lotOccupancy.occupancyEndDate
|
||||||
? lotOccupancy.occupancyEndDateString
|
? lotOccupancy.occupancyEndDateString
|
||||||
: '<span class="has-text-grey">(No End Date)</span>') +
|
: '<span class="has-text-grey">(No End Date)</span>') +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
(lotOccupancy.lotOccupancyOccupants.length === 0
|
(lotOccupancy.lotOccupancyOccupants.length === 0
|
||||||
? '<span class="has-text-grey">(No ' + los.escapedAliases.Occupants + ")</span>"
|
? '<span class="has-text-grey">(No ' +
|
||||||
|
los.escapedAliases.Occupants +
|
||||||
|
')</span>'
|
||||||
: (_a = lotOccupancy.lotOccupancyOccupants) === null || _a === void 0 ? void 0 : _a.reduce((soFar, occupant) => {
|
: (_a = lotOccupancy.lotOccupancyOccupants) === null || _a === void 0 ? void 0 : _a.reduce((soFar, occupant) => {
|
||||||
return (soFar +
|
return (soFar +
|
||||||
'<span class="has-tooltip-left" data-tooltip="' +
|
'<span class="has-tooltip-left" data-tooltip="' +
|
||||||
cityssm.escapeHTML(occupant.lotOccupantType) +
|
cityssm.escapeHTML(occupant.lotOccupantType) +
|
||||||
'">' +
|
'">' +
|
||||||
'<i class="fas fa-fw fa-' +
|
'<i class="fas fa-fw fa-' +
|
||||||
cityssm.escapeHTML(occupant.fontAwesomeIconClass || "user") +
|
cityssm.escapeHTML(occupant.fontAwesomeIconClass || 'user') +
|
||||||
'" aria-label="' +
|
'" aria-label="' +
|
||||||
los.escapedAliases.Occupant +
|
los.escapedAliases.Occupant +
|
||||||
'"></i> ' +
|
'"></i> ' +
|
||||||
cityssm.escapeHTML(occupant.occupantName) +
|
cityssm.escapeHTML(occupant.occupantName) +
|
||||||
"</span><br />");
|
'</span><br />');
|
||||||
}, "")) +
|
}, '')) +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
'<button class="button is-small is-light is-danger button--deleteLotOccupancy" data-tooltip="Delete Relationship" type="button">' +
|
'<button class="button is-small is-light is-danger button--deleteLotOccupancy" data-tooltip="Delete Relationship" type="button">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</td>"));
|
'</td>'));
|
||||||
(_b = rowElement.querySelector(".button--addLot")) === null || _b === void 0 ? void 0 : _b.addEventListener("click", addLotFromLotOccupancy);
|
(_b = rowElement
|
||||||
|
.querySelector('.button--addLot')) === null || _b === void 0 ? void 0 : _b.addEventListener('click', addLotFromLotOccupancy);
|
||||||
rowElement
|
rowElement
|
||||||
.querySelector(".button--deleteLotOccupancy")
|
.querySelector('.button--deleteLotOccupancy')
|
||||||
.addEventListener("click", deleteLotOccupancy);
|
.addEventListener('click', deleteLotOccupancy);
|
||||||
occupanciesContainerElement.querySelector("tbody").append(rowElement);
|
occupanciesContainerElement.querySelector('tbody').append(rowElement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function openEditLotStatus(clickEvent) {
|
function openEditLotStatus(clickEvent) {
|
||||||
const lotId = Number.parseInt(clickEvent.currentTarget.closest(".container--lot").dataset.lotId, 10);
|
const lotId = Number.parseInt(clickEvent.currentTarget.closest('.container--lot').dataset.lotId, 10);
|
||||||
const lot = workOrderLots.find((possibleLot) => {
|
const lot = workOrderLots.find((possibleLot) => {
|
||||||
return possibleLot.lotId === lotId;
|
return possibleLot.lotId === lotId;
|
||||||
});
|
});
|
||||||
let editCloseModalFunction;
|
let editCloseModalFunction;
|
||||||
function doUpdateLotStatus(submitEvent) {
|
function doUpdateLotStatus(submitEvent) {
|
||||||
submitEvent.preventDefault();
|
submitEvent.preventDefault();
|
||||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doUpdateLotStatus", submitEvent.currentTarget, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/workOrders/doUpdateLotStatus', submitEvent.currentTarget, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
workOrderLots = responseJSON.workOrderLots;
|
workOrderLots = responseJSON.workOrderLots;
|
||||||
renderRelatedLotsAndOccupancies();
|
renderRelatedLotsAndOccupancies();
|
||||||
|
|
@ -199,23 +206,22 @@ function openEditLotStatus(clickEvent) {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Deleting Relationship",
|
title: 'Error Deleting Relationship',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
cityssm.openHtmlModal("lot-editLotStatus", {
|
cityssm.openHtmlModal('lot-editLotStatus', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement);
|
||||||
modalElement.querySelector("#lotStatusEdit--lotId").value =
|
modalElement.querySelector('#lotStatusEdit--lotId').value = lotId.toString();
|
||||||
lotId.toString();
|
modalElement.querySelector('#lotStatusEdit--lotName').value = lot.lotName;
|
||||||
modalElement.querySelector("#lotStatusEdit--lotName").value = lot.lotName;
|
const lotStatusElement = modalElement.querySelector('#lotStatusEdit--lotStatusId');
|
||||||
const lotStatusElement = modalElement.querySelector("#lotStatusEdit--lotStatusId");
|
|
||||||
let lotStatusFound = false;
|
let lotStatusFound = false;
|
||||||
for (const lotStatus of exports.lotStatuses) {
|
for (const lotStatus of exports.lotStatuses) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option');
|
||||||
optionElement.value = lotStatus.lotStatusId.toString();
|
optionElement.value = lotStatus.lotStatusId.toString();
|
||||||
optionElement.textContent = lotStatus.lotStatus;
|
optionElement.textContent = lotStatus.lotStatus;
|
||||||
if (lotStatus.lotStatusId === lot.lotStatusId) {
|
if (lotStatus.lotStatusId === lot.lotStatusId) {
|
||||||
|
|
@ -224,7 +230,7 @@ function openEditLotStatus(clickEvent) {
|
||||||
lotStatusElement.append(optionElement);
|
lotStatusElement.append(optionElement);
|
||||||
}
|
}
|
||||||
if (!lotStatusFound && lot.lotStatusId) {
|
if (!lotStatusFound && lot.lotStatusId) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option');
|
||||||
optionElement.value = lot.lotStatusId.toString();
|
optionElement.value = lot.lotStatusId.toString();
|
||||||
optionElement.textContent = lot.lotStatus;
|
optionElement.textContent = lot.lotStatus;
|
||||||
lotStatusElement.append(optionElement);
|
lotStatusElement.append(optionElement);
|
||||||
|
|
@ -233,13 +239,15 @@ function openEditLotStatus(clickEvent) {
|
||||||
lotStatusElement.value = lot.lotStatusId.toString();
|
lotStatusElement.value = lot.lotStatusId.toString();
|
||||||
}
|
}
|
||||||
modalElement
|
modalElement
|
||||||
.querySelector("form")
|
.querySelector('form')
|
||||||
.insertAdjacentHTML("beforeend", `<input name="workOrderId" type="hidden" value="${workOrderId}" />`);
|
.insertAdjacentHTML('beforeend', `<input name="workOrderId" type="hidden" value="${workOrderId}" />`);
|
||||||
},
|
},
|
||||||
onshown(modalElement, closeModalFunction) {
|
onshown(modalElement, closeModalFunction) {
|
||||||
editCloseModalFunction = closeModalFunction;
|
editCloseModalFunction = closeModalFunction;
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
modalElement.querySelector("form").addEventListener("submit", doUpdateLotStatus);
|
modalElement
|
||||||
|
.querySelector('form')
|
||||||
|
.addEventListener('submit', doUpdateLotStatus);
|
||||||
},
|
},
|
||||||
onremoved() {
|
onremoved() {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
|
|
@ -247,10 +255,9 @@ function openEditLotStatus(clickEvent) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function deleteLot(clickEvent) {
|
function deleteLot(clickEvent) {
|
||||||
const lotId = clickEvent.currentTarget.closest(".container--lot")
|
const lotId = clickEvent.currentTarget.closest('.container--lot').dataset.lotId;
|
||||||
.dataset.lotId;
|
|
||||||
function doDelete() {
|
function doDelete() {
|
||||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doDeleteWorkOrderLot", {
|
cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrderLot', {
|
||||||
workOrderId,
|
workOrderId,
|
||||||
lotId
|
lotId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
|
|
@ -260,9 +267,9 @@ function deleteLot(clickEvent) {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Deleting Relationship",
|
title: 'Error Deleting Relationship',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -270,17 +277,16 @@ function deleteLot(clickEvent) {
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: `Delete ${los.escapedAliases.Occupancy} Relationship`,
|
title: `Delete ${los.escapedAliases.Occupancy} Relationship`,
|
||||||
message: `Are you sure you want to remove the relationship to this ${los.escapedAliases.occupancy} record from this work order? Note that the record will remain.`,
|
message: `Are you sure you want to remove the relationship to this ${los.escapedAliases.occupancy} record from this work order? Note that the record will remain.`,
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Delete Relationship",
|
text: 'Yes, Delete Relationship',
|
||||||
callbackFunction: doDelete
|
callbackFunction: doDelete
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function renderRelatedLots() {
|
function renderRelatedLots() {
|
||||||
const lotsContainerElement = document.querySelector("#container--lots");
|
const lotsContainerElement = document.querySelector('#container--lots');
|
||||||
document.querySelector(".tabs a[href='#relatedTab--lots'] .tag").textContent =
|
document.querySelector(".tabs a[href='#relatedTab--lots'] .tag").textContent = workOrderLots.length.toString();
|
||||||
workOrderLots.length.toString();
|
|
||||||
if (workOrderLots.length === 0) {
|
if (workOrderLots.length === 0) {
|
||||||
lotsContainerElement.innerHTML = `<div class="message is-info">
|
lotsContainerElement.innerHTML = `<div class="message is-info">
|
||||||
<p class="message-body">There are no ${los.escapedAliases.lots} associated with this work order.</p>
|
<p class="message-body">There are no ${los.escapedAliases.lots} associated with this work order.</p>
|
||||||
|
|
@ -298,35 +304,39 @@ function renderRelatedLots() {
|
||||||
<tbody></tbody>
|
<tbody></tbody>
|
||||||
</table>`;
|
</table>`;
|
||||||
for (const lot of workOrderLots) {
|
for (const lot of workOrderLots) {
|
||||||
const rowElement = document.createElement("tr");
|
const rowElement = document.createElement('tr');
|
||||||
rowElement.className = "container--lot";
|
rowElement.className = 'container--lot';
|
||||||
rowElement.dataset.lotId = lot.lotId.toString();
|
rowElement.dataset.lotId = lot.lotId.toString();
|
||||||
rowElement.innerHTML =
|
rowElement.innerHTML =
|
||||||
"<td>" +
|
'<td>' +
|
||||||
'<a class="has-text-weight-bold" href="' +
|
'<a class="has-text-weight-bold" href="' +
|
||||||
los.getLotURL(lot.lotId) +
|
los.getLotURL(lot.lotId) +
|
||||||
'">' +
|
'">' +
|
||||||
cityssm.escapeHTML(lot.lotName || "") +
|
cityssm.escapeHTML(lot.lotName || '') +
|
||||||
"</a>" +
|
'</a>' +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
("<td>" + cityssm.escapeHTML(lot.mapName || "") + "</td>") +
|
('<td>' + cityssm.escapeHTML(lot.mapName || '') + '</td>') +
|
||||||
("<td>" + cityssm.escapeHTML(lot.lotType || "") + "</td>") +
|
('<td>' + cityssm.escapeHTML(lot.lotType || '') + '</td>') +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
(lot.lotStatusId
|
(lot.lotStatusId
|
||||||
? cityssm.escapeHTML(lot.lotStatus || "")
|
? cityssm.escapeHTML(lot.lotStatus || '')
|
||||||
: '<span class="has-text-grey">(No Status)</span>') +
|
: '<span class="has-text-grey">(No Status)</span>') +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
('<td class="is-nowrap">' +
|
('<td class="is-nowrap">' +
|
||||||
'<button class="button is-small is-light is-info button--editLotStatus" data-tooltip="Update Status" type="button">' +
|
'<button class="button is-small is-light is-info button--editLotStatus" data-tooltip="Update Status" type="button">' +
|
||||||
'<i class="fas fa-pencil-alt" aria-hidden="true"></i>' +
|
'<i class="fas fa-pencil-alt" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
' <button class="button is-small is-light is-danger button--deleteLot" data-tooltip="Delete Relationship" type="button">' +
|
' <button class="button is-small is-light is-danger button--deleteLot" data-tooltip="Delete Relationship" type="button">' +
|
||||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</td>");
|
'</td>');
|
||||||
rowElement.querySelector(".button--editLotStatus").addEventListener("click", openEditLotStatus);
|
rowElement
|
||||||
rowElement.querySelector(".button--deleteLot").addEventListener("click", deleteLot);
|
.querySelector('.button--editLotStatus')
|
||||||
lotsContainerElement.querySelector("tbody").append(rowElement);
|
.addEventListener('click', openEditLotStatus);
|
||||||
|
rowElement
|
||||||
|
.querySelector('.button--deleteLot')
|
||||||
|
.addEventListener('click', deleteLot);
|
||||||
|
lotsContainerElement.querySelector('tbody').append(rowElement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function renderRelatedLotsAndOccupancies() {
|
function renderRelatedLotsAndOccupancies() {
|
||||||
|
|
@ -335,7 +345,7 @@ function renderRelatedLotsAndOccupancies() {
|
||||||
}
|
}
|
||||||
renderRelatedLotsAndOccupancies();
|
renderRelatedLotsAndOccupancies();
|
||||||
function doAddLotOccupancy(clickEvent) {
|
function doAddLotOccupancy(clickEvent) {
|
||||||
const rowElement = clickEvent.currentTarget.closest("tr");
|
const rowElement = clickEvent.currentTarget.closest('tr');
|
||||||
const lotOccupancyId = rowElement.dataset.lotOccupancyId;
|
const lotOccupancyId = rowElement.dataset.lotOccupancyId;
|
||||||
addLotOccupancy(lotOccupancyId, (success) => {
|
addLotOccupancy(lotOccupancyId, (success) => {
|
||||||
if (success) {
|
if (success) {
|
||||||
|
|
@ -343,15 +353,18 @@ function doAddLotOccupancy(clickEvent) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
document.querySelector("#button--addLotOccupancy").addEventListener("click", () => {
|
document
|
||||||
|
.querySelector('#button--addLotOccupancy')
|
||||||
|
.addEventListener('click', () => {
|
||||||
let searchFormElement;
|
let searchFormElement;
|
||||||
let searchResultsContainerElement;
|
let searchResultsContainerElement;
|
||||||
function doSearch(event) {
|
function doSearch(event) {
|
||||||
if (event) {
|
if (event) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
}
|
}
|
||||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML("Searching...");
|
searchResultsContainerElement.innerHTML =
|
||||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doSearchLotOccupancies", searchFormElement, (responseJSON) => {
|
los.getLoadingParagraphHTML('Searching...');
|
||||||
|
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doSearchLotOccupancies', searchFormElement, (responseJSON) => {
|
||||||
if (responseJSON.lotOccupancies.length === 0) {
|
if (responseJSON.lotOccupancies.length === 0) {
|
||||||
searchResultsContainerElement.innerHTML = `<div class="message is-info">
|
searchResultsContainerElement.innerHTML = `<div class="message is-info">
|
||||||
<p class="message-body">There are no records that meet the search criteria.</p>
|
<p class="message-body">There are no records that meet the search criteria.</p>
|
||||||
|
|
@ -370,64 +383,69 @@ document.querySelector("#button--addLotOccupancy").addEventListener("click", ()
|
||||||
<tbody></tbody>
|
<tbody></tbody>
|
||||||
</table>`;
|
</table>`;
|
||||||
for (const lotOccupancy of responseJSON.lotOccupancies) {
|
for (const lotOccupancy of responseJSON.lotOccupancies) {
|
||||||
const rowElement = document.createElement("tr");
|
const rowElement = document.createElement('tr');
|
||||||
rowElement.className = "container--lotOccupancy";
|
rowElement.className = 'container--lotOccupancy';
|
||||||
rowElement.dataset.lotOccupancyId = lotOccupancy.lotOccupancyId.toString();
|
rowElement.dataset.lotOccupancyId =
|
||||||
|
lotOccupancy.lotOccupancyId.toString();
|
||||||
rowElement.innerHTML =
|
rowElement.innerHTML =
|
||||||
'<td class="has-text-centered">' +
|
'<td class="has-text-centered">' +
|
||||||
'<button class="button is-small is-success button--addLotOccupancy" data-tooltip="Add" type="button" aria-label="Add">' +
|
'<button class="button is-small is-success button--addLotOccupancy" data-tooltip="Add" type="button" aria-label="Add">' +
|
||||||
'<i class="fas fa-plus" aria-hidden="true"></i>' +
|
'<i class="fas fa-plus" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
('<td class="has-text-weight-bold">' +
|
('<td class="has-text-weight-bold">' +
|
||||||
cityssm.escapeHTML(lotOccupancy.occupancyType || "") +
|
cityssm.escapeHTML(lotOccupancy.occupancyType || '') +
|
||||||
"</td>");
|
'</td>');
|
||||||
if (lotOccupancy.lotId) {
|
if (lotOccupancy.lotId) {
|
||||||
rowElement.insertAdjacentHTML("beforeend", "<td>" + cityssm.escapeHTML(lotOccupancy.lotName || "") + "</td>");
|
rowElement.insertAdjacentHTML('beforeend', '<td>' +
|
||||||
|
cityssm.escapeHTML(lotOccupancy.lotName || '') +
|
||||||
|
'</td>');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
rowElement.insertAdjacentHTML("beforeend", `<td><span class="has-text-grey">(No ${los.escapedAliases.Lot})</span></td>`);
|
rowElement.insertAdjacentHTML('beforeend', `<td><span class="has-text-grey">(No ${los.escapedAliases.Lot})</span></td>`);
|
||||||
}
|
}
|
||||||
rowElement.insertAdjacentHTML("beforeend", "<td>" +
|
rowElement.insertAdjacentHTML('beforeend', '<td>' +
|
||||||
lotOccupancy.occupancyStartDateString +
|
lotOccupancy.occupancyStartDateString +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
(lotOccupancy.occupancyEndDate
|
(lotOccupancy.occupancyEndDate
|
||||||
? lotOccupancy.occupancyEndDateString
|
? lotOccupancy.occupancyEndDateString
|
||||||
: '<span class="has-text-grey">(No End Date)</span>') +
|
: '<span class="has-text-grey">(No End Date)</span>') +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
(lotOccupancy.lotOccupancyOccupants.length === 0
|
(lotOccupancy.lotOccupancyOccupants.length === 0
|
||||||
? '<span class="has-text-grey">(No ' +
|
? '<span class="has-text-grey">(No ' +
|
||||||
cityssm.escapeHTML(exports.aliases.occupants) +
|
cityssm.escapeHTML(exports.aliases.occupants) +
|
||||||
")</span>"
|
')</span>'
|
||||||
: cityssm.escapeHTML(lotOccupancy.lotOccupancyOccupants[0].occupantName) +
|
: cityssm.escapeHTML(lotOccupancy.lotOccupancyOccupants[0].occupantName) +
|
||||||
(lotOccupancy.lotOccupancyOccupants.length > 1
|
(lotOccupancy.lotOccupancyOccupants.length > 1
|
||||||
? " plus " + (lotOccupancy.lotOccupancyOccupants.length - 1)
|
? ' plus ' +
|
||||||
: "")) +
|
(lotOccupancy.lotOccupancyOccupants.length - 1)
|
||||||
"</td>"));
|
: '')) +
|
||||||
|
'</td>'));
|
||||||
rowElement
|
rowElement
|
||||||
.querySelector(".button--addLotOccupancy")
|
.querySelector('.button--addLotOccupancy')
|
||||||
.addEventListener("click", doAddLotOccupancy);
|
.addEventListener('click', doAddLotOccupancy);
|
||||||
searchResultsContainerElement.querySelector("tbody").append(rowElement);
|
searchResultsContainerElement
|
||||||
|
.querySelector('tbody')
|
||||||
|
.append(rowElement);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
cityssm.openHtmlModal("workOrder-addLotOccupancy", {
|
cityssm.openHtmlModal('workOrder-addLotOccupancy', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement);
|
||||||
searchFormElement = modalElement.querySelector("form");
|
searchFormElement = modalElement.querySelector('form');
|
||||||
searchResultsContainerElement = modalElement.querySelector("#resultsContainer--lotOccupancyAdd");
|
searchResultsContainerElement = modalElement.querySelector('#resultsContainer--lotOccupancyAdd');
|
||||||
modalElement.querySelector("#lotOccupancySearch--notWorkOrderId").value =
|
modalElement.querySelector('#lotOccupancySearch--notWorkOrderId').value = workOrderId;
|
||||||
workOrderId;
|
modalElement.querySelector('#lotOccupancySearch--occupancyEffectiveDateString').value = document.querySelector('#workOrderEdit--workOrderOpenDateString').value;
|
||||||
modalElement.querySelector("#lotOccupancySearch--occupancyEffectiveDateString").value = document.querySelector("#workOrderEdit--workOrderOpenDateString").value;
|
|
||||||
doSearch();
|
doSearch();
|
||||||
},
|
},
|
||||||
onshown(modalElement) {
|
onshown(modalElement) {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
modalElement.querySelector("#lotOccupancySearch--occupantName").addEventListener("change", doSearch);
|
modalElement.querySelector('#lotOccupancySearch--occupantName').addEventListener('change', doSearch);
|
||||||
modalElement.querySelector("#lotOccupancySearch--lotName").addEventListener("change", doSearch);
|
modalElement.querySelector('#lotOccupancySearch--lotName').addEventListener('change', doSearch);
|
||||||
searchFormElement.addEventListener("submit", doSearch);
|
searchFormElement.addEventListener('submit', doSearch);
|
||||||
},
|
},
|
||||||
onremoved() {
|
onremoved() {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
|
|
@ -435,7 +453,7 @@ document.querySelector("#button--addLotOccupancy").addEventListener("click", ()
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
function doAddLot(clickEvent) {
|
function doAddLot(clickEvent) {
|
||||||
const rowElement = clickEvent.currentTarget.closest("tr");
|
const rowElement = clickEvent.currentTarget.closest('tr');
|
||||||
const lotId = rowElement.dataset.lotId;
|
const lotId = rowElement.dataset.lotId;
|
||||||
addLot(lotId, (success) => {
|
addLot(lotId, (success) => {
|
||||||
if (success) {
|
if (success) {
|
||||||
|
|
@ -443,20 +461,21 @@ function doAddLot(clickEvent) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
document.querySelector("#button--addLot").addEventListener("click", () => {
|
document.querySelector('#button--addLot').addEventListener('click', () => {
|
||||||
let searchFormElement;
|
let searchFormElement;
|
||||||
let searchResultsContainerElement;
|
let searchResultsContainerElement;
|
||||||
function doSearch(event) {
|
function doSearch(event) {
|
||||||
if (event) {
|
if (event) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
}
|
}
|
||||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML("Searching...");
|
searchResultsContainerElement.innerHTML =
|
||||||
cityssm.postJSON(los.urlPrefix + "/lots/doSearchLots", searchFormElement, (responseJSON) => {
|
los.getLoadingParagraphHTML('Searching...');
|
||||||
|
cityssm.postJSON(los.urlPrefix + '/lots/doSearchLots', searchFormElement, (responseJSON) => {
|
||||||
if (responseJSON.lots.length === 0) {
|
if (responseJSON.lots.length === 0) {
|
||||||
searchResultsContainerElement.innerHTML =
|
searchResultsContainerElement.innerHTML =
|
||||||
'<div class="message is-info">' +
|
'<div class="message is-info">' +
|
||||||
'<p class="message-body">There are no records that meet the search criteria.</p>' +
|
'<p class="message-body">There are no records that meet the search criteria.</p>' +
|
||||||
"</div>";
|
'</div>';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable">
|
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable">
|
||||||
|
|
@ -470,38 +489,41 @@ document.querySelector("#button--addLot").addEventListener("click", () => {
|
||||||
<tbody></tbody>
|
<tbody></tbody>
|
||||||
</table>`;
|
</table>`;
|
||||||
for (const lot of responseJSON.lots) {
|
for (const lot of responseJSON.lots) {
|
||||||
const rowElement = document.createElement("tr");
|
const rowElement = document.createElement('tr');
|
||||||
rowElement.className = "container--lot";
|
rowElement.className = 'container--lot';
|
||||||
rowElement.dataset.lotId = lot.lotId.toString();
|
rowElement.dataset.lotId = lot.lotId.toString();
|
||||||
rowElement.innerHTML =
|
rowElement.innerHTML =
|
||||||
'<td class="has-text-centered">' +
|
'<td class="has-text-centered">' +
|
||||||
'<button class="button is-small is-success button--addLot" data-tooltip="Add" type="button" aria-label="Add">' +
|
'<button class="button is-small is-success button--addLot" data-tooltip="Add" type="button" aria-label="Add">' +
|
||||||
'<i class="fas fa-plus" aria-hidden="true"></i>' +
|
'<i class="fas fa-plus" aria-hidden="true"></i>' +
|
||||||
"</button>" +
|
'</button>' +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
('<td class="has-text-weight-bold">' +
|
('<td class="has-text-weight-bold">' +
|
||||||
cityssm.escapeHTML(lot.lotName || "") +
|
cityssm.escapeHTML(lot.lotName || '') +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
"<td>" +
|
'<td>' +
|
||||||
cityssm.escapeHTML(lot.mapName || "") +
|
cityssm.escapeHTML(lot.mapName || '') +
|
||||||
"</td>" +
|
'</td>' +
|
||||||
("<td>" + cityssm.escapeHTML(lot.lotType || "") + "</td>") +
|
('<td>' + cityssm.escapeHTML(lot.lotType || '') + '</td>') +
|
||||||
("<td>" + cityssm.escapeHTML(lot.lotStatus || "") + "</td>");
|
('<td>' + cityssm.escapeHTML(lot.lotStatus || '') + '</td>');
|
||||||
rowElement.querySelector(".button--addLot").addEventListener("click", doAddLot);
|
rowElement
|
||||||
searchResultsContainerElement.querySelector("tbody").append(rowElement);
|
.querySelector('.button--addLot')
|
||||||
|
.addEventListener('click', doAddLot);
|
||||||
|
searchResultsContainerElement
|
||||||
|
.querySelector('tbody')
|
||||||
|
.append(rowElement);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
cityssm.openHtmlModal("workOrder-addLot", {
|
cityssm.openHtmlModal('workOrder-addLot', {
|
||||||
onshow(modalElement) {
|
onshow(modalElement) {
|
||||||
los.populateAliases(modalElement);
|
los.populateAliases(modalElement);
|
||||||
searchFormElement = modalElement.querySelector("form");
|
searchFormElement = modalElement.querySelector('form');
|
||||||
searchResultsContainerElement = modalElement.querySelector("#resultsContainer--lotAdd");
|
searchResultsContainerElement = modalElement.querySelector('#resultsContainer--lotAdd');
|
||||||
modalElement.querySelector("#lotSearch--notWorkOrderId").value =
|
modalElement.querySelector('#lotSearch--notWorkOrderId').value = workOrderId;
|
||||||
workOrderId;
|
const lotStatusElement = modalElement.querySelector('#lotSearch--lotStatusId');
|
||||||
const lotStatusElement = modalElement.querySelector("#lotSearch--lotStatusId");
|
|
||||||
for (const lotStatus of exports.lotStatuses) {
|
for (const lotStatus of exports.lotStatuses) {
|
||||||
const optionElement = document.createElement("option");
|
const optionElement = document.createElement('option');
|
||||||
optionElement.value = lotStatus.lotStatusId.toString();
|
optionElement.value = lotStatus.lotStatusId.toString();
|
||||||
optionElement.textContent = lotStatus.lotStatus;
|
optionElement.textContent = lotStatus.lotStatus;
|
||||||
lotStatusElement.append(optionElement);
|
lotStatusElement.append(optionElement);
|
||||||
|
|
@ -510,9 +532,13 @@ document.querySelector("#button--addLot").addEventListener("click", () => {
|
||||||
},
|
},
|
||||||
onshown(modalElement) {
|
onshown(modalElement) {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
modalElement.querySelector("#lotSearch--lotName").addEventListener("change", doSearch);
|
modalElement
|
||||||
modalElement.querySelector("#lotSearch--lotStatusId").addEventListener("change", doSearch);
|
.querySelector('#lotSearch--lotName')
|
||||||
searchFormElement.addEventListener("submit", doSearch);
|
.addEventListener('change', doSearch);
|
||||||
|
modalElement
|
||||||
|
.querySelector('#lotSearch--lotStatusId')
|
||||||
|
.addEventListener('change', doSearch);
|
||||||
|
searchFormElement.addEventListener('submit', doSearch);
|
||||||
},
|
},
|
||||||
onremoved() {
|
onremoved() {
|
||||||
bulmaJS.toggleHtmlClipped();
|
bulmaJS.toggleHtmlClipped();
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -3,10 +3,10 @@
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
(() => {
|
(() => {
|
||||||
const los = exports.los;
|
const los = exports.los;
|
||||||
const workOrderSearchFiltersFormElement = document.querySelector("#form--searchFilters");
|
const workOrderSearchFiltersFormElement = document.querySelector('#form--searchFilters');
|
||||||
const workOrderMilestoneDateFilterElement = workOrderSearchFiltersFormElement.querySelector("#searchFilter--workOrderMilestoneDateFilter");
|
const workOrderMilestoneDateFilterElement = workOrderSearchFiltersFormElement.querySelector('#searchFilter--workOrderMilestoneDateFilter');
|
||||||
const workOrderMilestoneDateStringElement = workOrderSearchFiltersFormElement.querySelector("#searchFilter--workOrderMilestoneDateString");
|
const workOrderMilestoneDateStringElement = workOrderSearchFiltersFormElement.querySelector('#searchFilter--workOrderMilestoneDateString');
|
||||||
const milestoneCalendarContainerElement = document.querySelector("#container--milestoneCalendar");
|
const milestoneCalendarContainerElement = document.querySelector('#container--milestoneCalendar');
|
||||||
function renderMilestones(workOrderMilestones) {
|
function renderMilestones(workOrderMilestones) {
|
||||||
if (workOrderMilestones.length === 0) {
|
if (workOrderMilestones.length === 0) {
|
||||||
milestoneCalendarContainerElement.innerHTML = `<div class="message is-info">
|
milestoneCalendarContainerElement.innerHTML = `<div class="message is-info">
|
||||||
|
|
@ -14,51 +14,51 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
</div>`;
|
</div>`;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
milestoneCalendarContainerElement.innerHTML = "";
|
milestoneCalendarContainerElement.innerHTML = '';
|
||||||
const currentDate = cityssm.dateToString(new Date());
|
const currentDate = cityssm.dateToString(new Date());
|
||||||
let currentPanelElement;
|
let currentPanelElement;
|
||||||
let currentPanelDateString = "";
|
let currentPanelDateString = '';
|
||||||
for (const milestone of workOrderMilestones) {
|
for (const milestone of workOrderMilestones) {
|
||||||
if (currentPanelDateString !== milestone.workOrderMilestoneDateString) {
|
if (currentPanelDateString !== milestone.workOrderMilestoneDateString) {
|
||||||
if (currentPanelElement) {
|
if (currentPanelElement) {
|
||||||
milestoneCalendarContainerElement.append(currentPanelElement);
|
milestoneCalendarContainerElement.append(currentPanelElement);
|
||||||
}
|
}
|
||||||
currentPanelElement = document.createElement("div");
|
currentPanelElement = document.createElement('div');
|
||||||
currentPanelElement.className = "panel";
|
currentPanelElement.className = 'panel';
|
||||||
currentPanelElement.innerHTML = `<h2 class="panel-heading">${milestone.workOrderMilestoneDateString}</h2>`;
|
currentPanelElement.innerHTML = `<h2 class="panel-heading">${milestone.workOrderMilestoneDateString}</h2>`;
|
||||||
currentPanelDateString = milestone.workOrderMilestoneDateString;
|
currentPanelDateString = milestone.workOrderMilestoneDateString;
|
||||||
}
|
}
|
||||||
const panelBlockElement = document.createElement("div");
|
const panelBlockElement = document.createElement('div');
|
||||||
panelBlockElement.className = "panel-block is-block";
|
panelBlockElement.className = 'panel-block is-block';
|
||||||
if (!milestone.workOrderMilestoneCompletionDate &&
|
if (!milestone.workOrderMilestoneCompletionDate &&
|
||||||
milestone.workOrderMilestoneDateString < currentDate) {
|
milestone.workOrderMilestoneDateString < currentDate) {
|
||||||
panelBlockElement.classList.add("has-background-warning-light");
|
panelBlockElement.classList.add('has-background-warning-light');
|
||||||
}
|
}
|
||||||
let lotOccupancyHTML = "";
|
let lotOccupancyHTML = '';
|
||||||
for (const lot of milestone.workOrderLots) {
|
for (const lot of milestone.workOrderLots) {
|
||||||
lotOccupancyHTML +=
|
lotOccupancyHTML +=
|
||||||
'<span class="has-tooltip-left" data-tooltip="' +
|
'<span class="has-tooltip-left" data-tooltip="' +
|
||||||
cityssm.escapeHTML(lot.mapName || "") +
|
cityssm.escapeHTML(lot.mapName || '') +
|
||||||
'">' +
|
'">' +
|
||||||
'<i class="fas fa-vector-square" aria-label="' +
|
'<i class="fas fa-vector-square" aria-label="' +
|
||||||
los.escapedAliases.Lot +
|
los.escapedAliases.Lot +
|
||||||
'"></i> ' +
|
'"></i> ' +
|
||||||
cityssm.escapeHTML(lot.lotName || "") +
|
cityssm.escapeHTML(lot.lotName || '') +
|
||||||
"</span>" +
|
'</span>' +
|
||||||
"<br />";
|
'<br />';
|
||||||
}
|
}
|
||||||
for (const lotOccupancy of milestone.workOrderLotOccupancies) {
|
for (const lotOccupancy of milestone.workOrderLotOccupancies) {
|
||||||
for (const occupant of lotOccupancy.lotOccupancyOccupants) {
|
for (const occupant of lotOccupancy.lotOccupancyOccupants) {
|
||||||
lotOccupancyHTML +=
|
lotOccupancyHTML +=
|
||||||
'<span class="has-tooltip-left" data-tooltip="' +
|
'<span class="has-tooltip-left" data-tooltip="' +
|
||||||
cityssm.escapeHTML(occupant.lotOccupantType || "") +
|
cityssm.escapeHTML(occupant.lotOccupantType || '') +
|
||||||
'">' +
|
'">' +
|
||||||
'<i class="fas fa-user" aria-label="' +
|
'<i class="fas fa-user" aria-label="' +
|
||||||
los.escapedAliases.Occupancy +
|
los.escapedAliases.Occupancy +
|
||||||
'"></i> ' +
|
'"></i> ' +
|
||||||
cityssm.escapeHTML(occupant.occupantName || "") +
|
cityssm.escapeHTML(occupant.occupantName || '') +
|
||||||
"</span>" +
|
'</span>' +
|
||||||
"<br />";
|
'<br />';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
panelBlockElement.innerHTML =
|
panelBlockElement.innerHTML =
|
||||||
|
|
@ -68,36 +68,36 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
(milestone.workOrderMilestoneCompletionDate
|
(milestone.workOrderMilestoneCompletionDate
|
||||||
? '<i class="fas fa-check" aria-label="Completed"></i>'
|
? '<i class="fas fa-check" aria-label="Completed"></i>'
|
||||||
: '<i class="far fa-square has-text-grey" aria-label="Incomplete"></i>') +
|
: '<i class="far fa-square has-text-grey" aria-label="Incomplete"></i>') +
|
||||||
"</span>" +
|
'</span>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="column">' +
|
('<div class="column">' +
|
||||||
(milestone.workOrderMilestoneTime === 0
|
(milestone.workOrderMilestoneTime === 0
|
||||||
? ""
|
? ''
|
||||||
: milestone.workOrderMilestoneTimeString + "<br />") +
|
: milestone.workOrderMilestoneTimeString + '<br />') +
|
||||||
(milestone.workOrderMilestoneTypeId
|
(milestone.workOrderMilestoneTypeId
|
||||||
? "<strong>" +
|
? '<strong>' +
|
||||||
cityssm.escapeHTML(milestone.workOrderMilestoneType) +
|
cityssm.escapeHTML(milestone.workOrderMilestoneType) +
|
||||||
"</strong><br />"
|
'</strong><br />'
|
||||||
: "") +
|
: '') +
|
||||||
'<span class="is-size-7">' +
|
'<span class="is-size-7">' +
|
||||||
cityssm.escapeHTML(milestone.workOrderMilestoneDescription) +
|
cityssm.escapeHTML(milestone.workOrderMilestoneDescription) +
|
||||||
"</span>" +
|
'</span>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="column">' +
|
('<div class="column">' +
|
||||||
'<i class="fas fa-circle" style="color:' +
|
'<i class="fas fa-circle" style="color:' +
|
||||||
los.getRandomColor(milestone.workOrderNumber || "") +
|
los.getRandomColor(milestone.workOrderNumber || '') +
|
||||||
'" aria-hidden="true"></i>' +
|
'" aria-hidden="true"></i>' +
|
||||||
' <a class="has-text-weight-bold" href="' +
|
' <a class="has-text-weight-bold" href="' +
|
||||||
los.getWorkOrderURL(milestone.workOrderId) +
|
los.getWorkOrderURL(milestone.workOrderId) +
|
||||||
'">' +
|
'">' +
|
||||||
cityssm.escapeHTML(milestone.workOrderNumber || "") +
|
cityssm.escapeHTML(milestone.workOrderNumber || '') +
|
||||||
"</a><br />" +
|
'</a><br />' +
|
||||||
'<span class="is-size-7">' +
|
'<span class="is-size-7">' +
|
||||||
cityssm.escapeHTML(milestone.workOrderDescription || "") +
|
cityssm.escapeHTML(milestone.workOrderDescription || '') +
|
||||||
"</span>" +
|
'</span>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="column is-size-7">' + lotOccupancyHTML + "</div>") +
|
('<div class="column is-size-7">' + lotOccupancyHTML + '</div>') +
|
||||||
"</div>";
|
'</div>';
|
||||||
currentPanelElement.append(panelBlockElement);
|
currentPanelElement.append(panelBlockElement);
|
||||||
}
|
}
|
||||||
milestoneCalendarContainerElement.append(currentPanelElement);
|
milestoneCalendarContainerElement.append(currentPanelElement);
|
||||||
|
|
@ -106,18 +106,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
if (event) {
|
if (event) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
}
|
}
|
||||||
milestoneCalendarContainerElement.innerHTML = los.getLoadingParagraphHTML("Loading Milestones...");
|
milestoneCalendarContainerElement.innerHTML = los.getLoadingParagraphHTML('Loading Milestones...');
|
||||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doGetWorkOrderMilestones", workOrderSearchFiltersFormElement, (responseJSON) => {
|
cityssm.postJSON(los.urlPrefix + '/workOrders/doGetWorkOrderMilestones', workOrderSearchFiltersFormElement, (responseJSON) => {
|
||||||
renderMilestones(responseJSON.workOrderMilestones);
|
renderMilestones(responseJSON.workOrderMilestones);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
workOrderMilestoneDateFilterElement.addEventListener("change", () => {
|
workOrderMilestoneDateFilterElement.addEventListener('change', () => {
|
||||||
workOrderMilestoneDateStringElement.closest("fieldset").disabled =
|
workOrderMilestoneDateStringElement.closest('fieldset').disabled =
|
||||||
workOrderMilestoneDateFilterElement.value !== "date";
|
workOrderMilestoneDateFilterElement.value !== 'date';
|
||||||
getMilestones();
|
getMilestones();
|
||||||
});
|
});
|
||||||
los.initializeDatePickers(workOrderSearchFiltersFormElement);
|
los.initializeDatePickers(workOrderSearchFiltersFormElement);
|
||||||
workOrderMilestoneDateStringElement.addEventListener("change", getMilestones);
|
workOrderMilestoneDateStringElement.addEventListener('change', getMilestones);
|
||||||
workOrderSearchFiltersFormElement.addEventListener("submit", getMilestones);
|
workOrderSearchFiltersFormElement.addEventListener('submit', getMilestones);
|
||||||
getMilestones();
|
getMilestones();
|
||||||
})();
|
})();
|
||||||
|
|
|
||||||
|
|
@ -1,97 +1,100 @@
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||||
|
|
||||||
import type * as recordTypes from "../types/recordTypes";
|
import type * as recordTypes from '../types/recordTypes'
|
||||||
import type * as globalTypes from "../types/globalTypes";
|
import type * as globalTypes from '../types/globalTypes'
|
||||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal
|
||||||
|
;(() => {
|
||||||
(() => {
|
const los = exports.los as globalTypes.LOS
|
||||||
const los = exports.los as globalTypes.LOS;
|
|
||||||
|
|
||||||
const workOrderSearchFiltersFormElement = document.querySelector(
|
const workOrderSearchFiltersFormElement = document.querySelector(
|
||||||
"#form--searchFilters"
|
'#form--searchFilters'
|
||||||
) as HTMLFormElement;
|
) as HTMLFormElement
|
||||||
|
|
||||||
const workOrderMilestoneDateFilterElement = workOrderSearchFiltersFormElement.querySelector(
|
const workOrderMilestoneDateFilterElement =
|
||||||
"#searchFilter--workOrderMilestoneDateFilter"
|
workOrderSearchFiltersFormElement.querySelector(
|
||||||
) as HTMLSelectElement;
|
'#searchFilter--workOrderMilestoneDateFilter'
|
||||||
|
) as HTMLSelectElement
|
||||||
|
|
||||||
const workOrderMilestoneDateStringElement = workOrderSearchFiltersFormElement.querySelector(
|
const workOrderMilestoneDateStringElement =
|
||||||
"#searchFilter--workOrderMilestoneDateString"
|
workOrderSearchFiltersFormElement.querySelector(
|
||||||
) as HTMLInputElement;
|
'#searchFilter--workOrderMilestoneDateString'
|
||||||
|
) as HTMLInputElement
|
||||||
|
|
||||||
const milestoneCalendarContainerElement = document.querySelector(
|
const milestoneCalendarContainerElement = document.querySelector(
|
||||||
"#container--milestoneCalendar"
|
'#container--milestoneCalendar'
|
||||||
) as HTMLElement;
|
) as HTMLElement
|
||||||
|
|
||||||
function renderMilestones(workOrderMilestones: recordTypes.WorkOrderMilestone[]) {
|
function renderMilestones(
|
||||||
|
workOrderMilestones: recordTypes.WorkOrderMilestone[]
|
||||||
|
) {
|
||||||
if (workOrderMilestones.length === 0) {
|
if (workOrderMilestones.length === 0) {
|
||||||
milestoneCalendarContainerElement.innerHTML = `<div class="message is-info">
|
milestoneCalendarContainerElement.innerHTML = `<div class="message is-info">
|
||||||
<p class="message-body">There are no milestones that meet the search criteria.</p>
|
<p class="message-body">There are no milestones that meet the search criteria.</p>
|
||||||
</div>`;
|
</div>`
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
milestoneCalendarContainerElement.innerHTML = "";
|
milestoneCalendarContainerElement.innerHTML = ''
|
||||||
|
|
||||||
const currentDate = cityssm.dateToString(new Date());
|
const currentDate = cityssm.dateToString(new Date())
|
||||||
|
|
||||||
let currentPanelElement: HTMLElement | undefined;
|
let currentPanelElement: HTMLElement | undefined
|
||||||
let currentPanelDateString = "";
|
let currentPanelDateString = ''
|
||||||
|
|
||||||
for (const milestone of workOrderMilestones) {
|
for (const milestone of workOrderMilestones) {
|
||||||
if (currentPanelDateString !== milestone.workOrderMilestoneDateString) {
|
if (currentPanelDateString !== milestone.workOrderMilestoneDateString) {
|
||||||
if (currentPanelElement) {
|
if (currentPanelElement) {
|
||||||
milestoneCalendarContainerElement.append(currentPanelElement);
|
milestoneCalendarContainerElement.append(currentPanelElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
currentPanelElement = document.createElement("div");
|
currentPanelElement = document.createElement('div')
|
||||||
currentPanelElement.className = "panel";
|
currentPanelElement.className = 'panel'
|
||||||
|
|
||||||
currentPanelElement.innerHTML = `<h2 class="panel-heading">${milestone.workOrderMilestoneDateString}</h2>`;
|
currentPanelElement.innerHTML = `<h2 class="panel-heading">${milestone.workOrderMilestoneDateString}</h2>`
|
||||||
|
|
||||||
currentPanelDateString = milestone.workOrderMilestoneDateString!;
|
currentPanelDateString = milestone.workOrderMilestoneDateString!
|
||||||
}
|
}
|
||||||
|
|
||||||
const panelBlockElement = document.createElement("div");
|
const panelBlockElement = document.createElement('div')
|
||||||
|
|
||||||
panelBlockElement.className = "panel-block is-block";
|
panelBlockElement.className = 'panel-block is-block'
|
||||||
|
|
||||||
if (
|
if (
|
||||||
!milestone.workOrderMilestoneCompletionDate &&
|
!milestone.workOrderMilestoneCompletionDate &&
|
||||||
milestone.workOrderMilestoneDateString! < currentDate
|
milestone.workOrderMilestoneDateString! < currentDate
|
||||||
) {
|
) {
|
||||||
panelBlockElement.classList.add("has-background-warning-light");
|
panelBlockElement.classList.add('has-background-warning-light')
|
||||||
}
|
}
|
||||||
|
|
||||||
let lotOccupancyHTML = "";
|
let lotOccupancyHTML = ''
|
||||||
|
|
||||||
for (const lot of milestone.workOrderLots!) {
|
for (const lot of milestone.workOrderLots!) {
|
||||||
lotOccupancyHTML +=
|
lotOccupancyHTML +=
|
||||||
'<span class="has-tooltip-left" data-tooltip="' +
|
'<span class="has-tooltip-left" data-tooltip="' +
|
||||||
cityssm.escapeHTML(lot.mapName || "") +
|
cityssm.escapeHTML(lot.mapName || '') +
|
||||||
'">' +
|
'">' +
|
||||||
'<i class="fas fa-vector-square" aria-label="' +
|
'<i class="fas fa-vector-square" aria-label="' +
|
||||||
los.escapedAliases.Lot +
|
los.escapedAliases.Lot +
|
||||||
'"></i> ' +
|
'"></i> ' +
|
||||||
cityssm.escapeHTML(lot.lotName || "") +
|
cityssm.escapeHTML(lot.lotName || '') +
|
||||||
"</span>" +
|
'</span>' +
|
||||||
"<br />";
|
'<br />'
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const lotOccupancy of milestone.workOrderLotOccupancies!) {
|
for (const lotOccupancy of milestone.workOrderLotOccupancies!) {
|
||||||
for (const occupant of lotOccupancy.lotOccupancyOccupants!) {
|
for (const occupant of lotOccupancy.lotOccupancyOccupants!) {
|
||||||
lotOccupancyHTML +=
|
lotOccupancyHTML +=
|
||||||
'<span class="has-tooltip-left" data-tooltip="' +
|
'<span class="has-tooltip-left" data-tooltip="' +
|
||||||
cityssm.escapeHTML(occupant.lotOccupantType || "") +
|
cityssm.escapeHTML(occupant.lotOccupantType || '') +
|
||||||
'">' +
|
'">' +
|
||||||
'<i class="fas fa-user" aria-label="' +
|
'<i class="fas fa-user" aria-label="' +
|
||||||
los.escapedAliases.Occupancy +
|
los.escapedAliases.Occupancy +
|
||||||
'"></i> ' +
|
'"></i> ' +
|
||||||
cityssm.escapeHTML(occupant.occupantName || "") +
|
cityssm.escapeHTML(occupant.occupantName || '') +
|
||||||
"</span>" +
|
'</span>' +
|
||||||
"<br />";
|
'<br />'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -102,69 +105,72 @@ declare const cityssm: cityssmGlobal;
|
||||||
(milestone.workOrderMilestoneCompletionDate
|
(milestone.workOrderMilestoneCompletionDate
|
||||||
? '<i class="fas fa-check" aria-label="Completed"></i>'
|
? '<i class="fas fa-check" aria-label="Completed"></i>'
|
||||||
: '<i class="far fa-square has-text-grey" aria-label="Incomplete"></i>') +
|
: '<i class="far fa-square has-text-grey" aria-label="Incomplete"></i>') +
|
||||||
"</span>" +
|
'</span>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="column">' +
|
('<div class="column">' +
|
||||||
(milestone.workOrderMilestoneTime === 0
|
(milestone.workOrderMilestoneTime === 0
|
||||||
? ""
|
? ''
|
||||||
: milestone.workOrderMilestoneTimeString + "<br />") +
|
: milestone.workOrderMilestoneTimeString + '<br />') +
|
||||||
(milestone.workOrderMilestoneTypeId
|
(milestone.workOrderMilestoneTypeId
|
||||||
? "<strong>" +
|
? '<strong>' +
|
||||||
cityssm.escapeHTML(milestone.workOrderMilestoneType!) +
|
cityssm.escapeHTML(milestone.workOrderMilestoneType!) +
|
||||||
"</strong><br />"
|
'</strong><br />'
|
||||||
: "") +
|
: '') +
|
||||||
'<span class="is-size-7">' +
|
'<span class="is-size-7">' +
|
||||||
cityssm.escapeHTML(milestone.workOrderMilestoneDescription!) +
|
cityssm.escapeHTML(milestone.workOrderMilestoneDescription!) +
|
||||||
"</span>" +
|
'</span>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="column">' +
|
('<div class="column">' +
|
||||||
'<i class="fas fa-circle" style="color:' +
|
'<i class="fas fa-circle" style="color:' +
|
||||||
los.getRandomColor(milestone.workOrderNumber || "") +
|
los.getRandomColor(milestone.workOrderNumber || '') +
|
||||||
'" aria-hidden="true"></i>' +
|
'" aria-hidden="true"></i>' +
|
||||||
' <a class="has-text-weight-bold" href="' +
|
' <a class="has-text-weight-bold" href="' +
|
||||||
los.getWorkOrderURL(milestone.workOrderId!) +
|
los.getWorkOrderURL(milestone.workOrderId!) +
|
||||||
'">' +
|
'">' +
|
||||||
cityssm.escapeHTML(milestone.workOrderNumber || "") +
|
cityssm.escapeHTML(milestone.workOrderNumber || '') +
|
||||||
"</a><br />" +
|
'</a><br />' +
|
||||||
'<span class="is-size-7">' +
|
'<span class="is-size-7">' +
|
||||||
cityssm.escapeHTML(milestone.workOrderDescription || "") +
|
cityssm.escapeHTML(milestone.workOrderDescription || '') +
|
||||||
"</span>" +
|
'</span>' +
|
||||||
"</div>") +
|
'</div>') +
|
||||||
('<div class="column is-size-7">' + lotOccupancyHTML + "</div>") +
|
('<div class="column is-size-7">' + lotOccupancyHTML + '</div>') +
|
||||||
"</div>";
|
'</div>'
|
||||||
|
;(currentPanelElement as HTMLElement).append(panelBlockElement)
|
||||||
(currentPanelElement as HTMLElement).append(panelBlockElement);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
milestoneCalendarContainerElement.append(currentPanelElement!);
|
milestoneCalendarContainerElement.append(currentPanelElement!)
|
||||||
}
|
}
|
||||||
|
|
||||||
function getMilestones(event?: Event) {
|
function getMilestones(event?: Event) {
|
||||||
if (event) {
|
if (event) {
|
||||||
event.preventDefault();
|
event.preventDefault()
|
||||||
}
|
}
|
||||||
|
|
||||||
milestoneCalendarContainerElement.innerHTML = los.getLoadingParagraphHTML("Loading Milestones...");
|
milestoneCalendarContainerElement.innerHTML = los.getLoadingParagraphHTML(
|
||||||
|
'Loading Milestones...'
|
||||||
|
)
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/workOrders/doGetWorkOrderMilestones",
|
los.urlPrefix + '/workOrders/doGetWorkOrderMilestones',
|
||||||
workOrderSearchFiltersFormElement,
|
workOrderSearchFiltersFormElement,
|
||||||
(responseJSON: { workOrderMilestones: recordTypes.WorkOrderMilestone[] }) => {
|
(responseJSON: {
|
||||||
renderMilestones(responseJSON.workOrderMilestones);
|
workOrderMilestones: recordTypes.WorkOrderMilestone[]
|
||||||
|
}) => {
|
||||||
|
renderMilestones(responseJSON.workOrderMilestones)
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
workOrderMilestoneDateFilterElement.addEventListener("change", () => {
|
workOrderMilestoneDateFilterElement.addEventListener('change', () => {
|
||||||
workOrderMilestoneDateStringElement.closest("fieldset")!.disabled =
|
workOrderMilestoneDateStringElement.closest('fieldset')!.disabled =
|
||||||
workOrderMilestoneDateFilterElement.value !== "date";
|
workOrderMilestoneDateFilterElement.value !== 'date'
|
||||||
getMilestones();
|
getMilestones()
|
||||||
});
|
})
|
||||||
|
|
||||||
los.initializeDatePickers(workOrderSearchFiltersFormElement);
|
los.initializeDatePickers(workOrderSearchFiltersFormElement)
|
||||||
|
|
||||||
workOrderMilestoneDateStringElement.addEventListener("change", getMilestones);
|
workOrderMilestoneDateStringElement.addEventListener('change', getMilestones)
|
||||||
workOrderSearchFiltersFormElement.addEventListener("submit", getMilestones);
|
workOrderSearchFiltersFormElement.addEventListener('submit', getMilestones)
|
||||||
|
|
||||||
getMilestones();
|
getMilestones()
|
||||||
})();
|
})()
|
||||||
|
|
|
||||||
|
|
@ -3,47 +3,48 @@
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
(() => {
|
(() => {
|
||||||
const los = exports.los;
|
const los = exports.los;
|
||||||
const workOrderTypeIdsElement = document.querySelector("#icsFilters--workOrderTypeIds");
|
const workOrderTypeIdsElement = document.querySelector('#icsFilters--workOrderTypeIds');
|
||||||
const workOrderMilestoneTypeIdsElement = document.querySelector("#icsFilters--workOrderMilestoneTypeIds");
|
const workOrderMilestoneTypeIdsElement = document.querySelector('#icsFilters--workOrderMilestoneTypeIds');
|
||||||
const calendarLinkElement = document.querySelector("#icsFilters--calendarURL");
|
const calendarLinkElement = document.querySelector('#icsFilters--calendarURL');
|
||||||
function updateCalendarURL() {
|
function updateCalendarURL() {
|
||||||
let url = window.location.href.slice(0, Math.max(0, window.location.href.indexOf(window.location.pathname) + 1)) +
|
let url = window.location.href.slice(0, Math.max(0, window.location.href.indexOf(window.location.pathname) + 1)) +
|
||||||
los.urlPrefix +
|
los.urlPrefix +
|
||||||
"api/" +
|
'api/' +
|
||||||
los.apiKey +
|
los.apiKey +
|
||||||
"/" +
|
'/' +
|
||||||
"milestoneICS/" +
|
'milestoneICS/' +
|
||||||
"?";
|
'?';
|
||||||
if (!workOrderTypeIdsElement.disabled &&
|
if (!workOrderTypeIdsElement.disabled &&
|
||||||
workOrderTypeIdsElement.selectedOptions.length > 0) {
|
workOrderTypeIdsElement.selectedOptions.length > 0) {
|
||||||
url += "workOrderTypeIds=";
|
url += 'workOrderTypeIds=';
|
||||||
for (const optionElement of workOrderTypeIdsElement.selectedOptions) {
|
for (const optionElement of workOrderTypeIdsElement.selectedOptions) {
|
||||||
url += optionElement.value + ",";
|
url += optionElement.value + ',';
|
||||||
}
|
}
|
||||||
url = url.slice(0, -1) + "&";
|
url = url.slice(0, -1) + '&';
|
||||||
}
|
}
|
||||||
if (!workOrderMilestoneTypeIdsElement.disabled &&
|
if (!workOrderMilestoneTypeIdsElement.disabled &&
|
||||||
workOrderMilestoneTypeIdsElement.selectedOptions.length > 0) {
|
workOrderMilestoneTypeIdsElement.selectedOptions.length > 0) {
|
||||||
url += "workOrderMilestoneTypeIds=";
|
url += 'workOrderMilestoneTypeIds=';
|
||||||
for (const optionElement of workOrderMilestoneTypeIdsElement.selectedOptions) {
|
for (const optionElement of workOrderMilestoneTypeIdsElement.selectedOptions) {
|
||||||
url += optionElement.value + ",";
|
url += optionElement.value + ',';
|
||||||
}
|
}
|
||||||
url = url.slice(0, -1) + "&";
|
url = url.slice(0, -1) + '&';
|
||||||
}
|
}
|
||||||
calendarLinkElement.value = url.slice(0, -1);
|
calendarLinkElement.value = url.slice(0, -1);
|
||||||
}
|
}
|
||||||
document.querySelector("#icsFilters--workOrderTypeIds-all").addEventListener("change", (changeEvent) => {
|
;
|
||||||
|
document.querySelector('#icsFilters--workOrderTypeIds-all').addEventListener('change', (changeEvent) => {
|
||||||
workOrderTypeIdsElement.disabled = changeEvent.currentTarget.checked;
|
workOrderTypeIdsElement.disabled = changeEvent.currentTarget.checked;
|
||||||
});
|
});
|
||||||
document.querySelector("#icsFilters--workOrderMilestoneTypeIds-all").addEventListener("change", (changeEvent) => {
|
document.querySelector('#icsFilters--workOrderMilestoneTypeIds-all').addEventListener('change', (changeEvent) => {
|
||||||
workOrderMilestoneTypeIdsElement.disabled = changeEvent.currentTarget.checked;
|
workOrderMilestoneTypeIdsElement.disabled = changeEvent.currentTarget.checked;
|
||||||
});
|
});
|
||||||
const inputSelectElements = document.querySelector("#panel--icsFilters").querySelectorAll("input, select");
|
const inputSelectElements = document.querySelector('#panel--icsFilters').querySelectorAll('input, select');
|
||||||
for (const element of inputSelectElements) {
|
for (const element of inputSelectElements) {
|
||||||
element.addEventListener("change", updateCalendarURL);
|
element.addEventListener('change', updateCalendarURL);
|
||||||
}
|
}
|
||||||
updateCalendarURL();
|
updateCalendarURL();
|
||||||
calendarLinkElement.addEventListener("click", () => {
|
calendarLinkElement.addEventListener('click', () => {
|
||||||
calendarLinkElement.focus();
|
calendarLinkElement.focus();
|
||||||
calendarLinkElement.select();
|
calendarLinkElement.select();
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,85 +1,98 @@
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||||
|
|
||||||
import type * as globalTypes from "../types/globalTypes";
|
import type * as globalTypes from '../types/globalTypes'
|
||||||
|
|
||||||
(() => {
|
;(() => {
|
||||||
const los = exports.los as globalTypes.LOS;
|
const los = exports.los as globalTypes.LOS
|
||||||
|
|
||||||
const workOrderTypeIdsElement = document.querySelector(
|
const workOrderTypeIdsElement = document.querySelector(
|
||||||
"#icsFilters--workOrderTypeIds"
|
'#icsFilters--workOrderTypeIds'
|
||||||
) as HTMLSelectElement;
|
) as HTMLSelectElement
|
||||||
|
|
||||||
const workOrderMilestoneTypeIdsElement = document.querySelector(
|
const workOrderMilestoneTypeIdsElement = document.querySelector(
|
||||||
"#icsFilters--workOrderMilestoneTypeIds"
|
'#icsFilters--workOrderMilestoneTypeIds'
|
||||||
) as HTMLSelectElement;
|
) as HTMLSelectElement
|
||||||
|
|
||||||
const calendarLinkElement = document.querySelector(
|
const calendarLinkElement = document.querySelector(
|
||||||
"#icsFilters--calendarURL"
|
'#icsFilters--calendarURL'
|
||||||
) as HTMLTextAreaElement;
|
) as HTMLTextAreaElement
|
||||||
|
|
||||||
function updateCalendarURL() {
|
function updateCalendarURL() {
|
||||||
let url = window.location.href.slice(
|
let url =
|
||||||
|
window.location.href.slice(
|
||||||
0,
|
0,
|
||||||
Math.max(0, window.location.href.indexOf(window.location.pathname) + 1)
|
Math.max(0, window.location.href.indexOf(window.location.pathname) + 1)
|
||||||
) +
|
) +
|
||||||
los.urlPrefix +
|
los.urlPrefix +
|
||||||
"api/" +
|
'api/' +
|
||||||
los.apiKey +
|
los.apiKey +
|
||||||
"/" +
|
'/' +
|
||||||
"milestoneICS/" +
|
'milestoneICS/' +
|
||||||
"?";
|
'?'
|
||||||
|
|
||||||
if (!workOrderTypeIdsElement.disabled &&
|
if (
|
||||||
workOrderTypeIdsElement.selectedOptions.length > 0) {
|
!workOrderTypeIdsElement.disabled &&
|
||||||
url += "workOrderTypeIds=";
|
workOrderTypeIdsElement.selectedOptions.length > 0
|
||||||
|
) {
|
||||||
|
url += 'workOrderTypeIds='
|
||||||
|
|
||||||
for (const optionElement of workOrderTypeIdsElement.selectedOptions) {
|
for (const optionElement of workOrderTypeIdsElement.selectedOptions) {
|
||||||
url += optionElement.value + ",";
|
url += optionElement.value + ','
|
||||||
}
|
}
|
||||||
|
|
||||||
url = url.slice(0, -1) + "&";
|
url = url.slice(0, -1) + '&'
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!workOrderMilestoneTypeIdsElement.disabled &&
|
if (
|
||||||
workOrderMilestoneTypeIdsElement.selectedOptions.length > 0) {
|
!workOrderMilestoneTypeIdsElement.disabled &&
|
||||||
url += "workOrderMilestoneTypeIds=";
|
workOrderMilestoneTypeIdsElement.selectedOptions.length > 0
|
||||||
|
) {
|
||||||
|
url += 'workOrderMilestoneTypeIds='
|
||||||
|
|
||||||
for (const optionElement of workOrderMilestoneTypeIdsElement.selectedOptions) {
|
for (const optionElement of workOrderMilestoneTypeIdsElement.selectedOptions) {
|
||||||
url += optionElement.value + ",";
|
url += optionElement.value + ','
|
||||||
}
|
}
|
||||||
|
|
||||||
url = url.slice(0, -1) + "&";
|
url = url.slice(0, -1) + '&'
|
||||||
}
|
}
|
||||||
|
|
||||||
calendarLinkElement.value = url.slice(0, -1);
|
calendarLinkElement.value = url.slice(0, -1)
|
||||||
}
|
}
|
||||||
|
|
||||||
(
|
;(
|
||||||
document.querySelector("#icsFilters--workOrderTypeIds-all") as HTMLInputElement
|
document.querySelector(
|
||||||
).addEventListener("change", (changeEvent) => {
|
'#icsFilters--workOrderTypeIds-all'
|
||||||
workOrderTypeIdsElement.disabled = (changeEvent.currentTarget as HTMLInputElement).checked;
|
) as HTMLInputElement
|
||||||
});
|
).addEventListener('change', (changeEvent) => {
|
||||||
|
workOrderTypeIdsElement.disabled = (
|
||||||
|
changeEvent.currentTarget as HTMLInputElement
|
||||||
|
).checked
|
||||||
|
})
|
||||||
|
|
||||||
(
|
;(
|
||||||
document.querySelector("#icsFilters--workOrderMilestoneTypeIds-all") as HTMLInputElement
|
document.querySelector(
|
||||||
).addEventListener("change", (changeEvent) => {
|
'#icsFilters--workOrderMilestoneTypeIds-all'
|
||||||
|
) as HTMLInputElement
|
||||||
|
).addEventListener('change', (changeEvent) => {
|
||||||
workOrderMilestoneTypeIdsElement.disabled = (
|
workOrderMilestoneTypeIdsElement.disabled = (
|
||||||
changeEvent.currentTarget as HTMLInputElement
|
changeEvent.currentTarget as HTMLInputElement
|
||||||
).checked;
|
).checked
|
||||||
});
|
})
|
||||||
|
|
||||||
const inputSelectElements = (
|
const inputSelectElements = (
|
||||||
document.querySelector("#panel--icsFilters") as HTMLElement
|
document.querySelector('#panel--icsFilters') as HTMLElement
|
||||||
).querySelectorAll("input, select") as NodeListOf<HTMLInputElement | HTMLSelectElement>;
|
).querySelectorAll('input, select') as NodeListOf<
|
||||||
|
HTMLInputElement | HTMLSelectElement
|
||||||
|
>
|
||||||
|
|
||||||
for (const element of inputSelectElements) {
|
for (const element of inputSelectElements) {
|
||||||
element.addEventListener("change", updateCalendarURL);
|
element.addEventListener('change', updateCalendarURL)
|
||||||
}
|
}
|
||||||
|
|
||||||
updateCalendarURL();
|
updateCalendarURL()
|
||||||
|
|
||||||
calendarLinkElement.addEventListener("click", () => {
|
calendarLinkElement.addEventListener('click', () => {
|
||||||
calendarLinkElement.focus();
|
calendarLinkElement.focus()
|
||||||
calendarLinkElement.select();
|
calendarLinkElement.select()
|
||||||
});
|
})
|
||||||
})();
|
})()
|
||||||
|
|
|
||||||
|
|
@ -4,67 +4,69 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
(() => {
|
(() => {
|
||||||
const los = exports.los;
|
const los = exports.los;
|
||||||
const workOrderPrints = exports.workOrderPrints;
|
const workOrderPrints = exports.workOrderPrints;
|
||||||
const searchFilterFormElement = document.querySelector("#form--searchFilters");
|
const searchFilterFormElement = document.querySelector('#form--searchFilters');
|
||||||
los.initializeDatePickers(searchFilterFormElement);
|
los.initializeDatePickers(searchFilterFormElement);
|
||||||
const searchResultsContainerElement = document.querySelector("#container--searchResults");
|
const searchResultsContainerElement = document.querySelector('#container--searchResults');
|
||||||
const limit = Number.parseInt(document.querySelector("#searchFilter--limit").value, 10);
|
const limit = Number.parseInt(document.querySelector('#searchFilter--limit').value, 10);
|
||||||
const offsetElement = document.querySelector("#searchFilter--offset");
|
const offsetElement = document.querySelector('#searchFilter--offset');
|
||||||
function renderWorkOrders(responseJSON) {
|
function renderWorkOrders(responseJSON) {
|
||||||
var _a, _b;
|
var _a, _b;
|
||||||
if (responseJSON.workOrders.length === 0) {
|
if (responseJSON.workOrders.length === 0) {
|
||||||
searchResultsContainerElement.innerHTML =
|
searchResultsContainerElement.innerHTML =
|
||||||
'<div class="message is-info">' +
|
'<div class="message is-info">' +
|
||||||
'<p class="message-body">There are no work orders that meet the search criteria.</p>' +
|
'<p class="message-body">There are no work orders that meet the search criteria.</p>' +
|
||||||
"</div>";
|
'</div>';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const resultsTbodyElement = document.createElement("tbody");
|
const resultsTbodyElement = document.createElement('tbody');
|
||||||
for (const workOrder of responseJSON.workOrders) {
|
for (const workOrder of responseJSON.workOrders) {
|
||||||
let relatedHTML = "";
|
let relatedHTML = '';
|
||||||
for (const lot of workOrder.workOrderLots) {
|
for (const lot of workOrder.workOrderLots) {
|
||||||
relatedHTML +=
|
relatedHTML +=
|
||||||
'<span class="has-tooltip-left" data-tooltip="' +
|
'<span class="has-tooltip-left" data-tooltip="' +
|
||||||
cityssm.escapeHTML(lot.mapName || "") +
|
cityssm.escapeHTML(lot.mapName || '') +
|
||||||
'">' +
|
'">' +
|
||||||
'<i class="fas fa-fw fa-vector-square" aria-label="' +
|
'<i class="fas fa-fw fa-vector-square" aria-label="' +
|
||||||
los.escapedAliases.Lot +
|
los.escapedAliases.Lot +
|
||||||
'"></i> ' +
|
'"></i> ' +
|
||||||
cityssm.escapeHTML(lot.lotName || "(No " + exports.aliases.Lot + " Name)") +
|
cityssm.escapeHTML(lot.lotName || '(No ' + exports.aliases.Lot + ' Name)') +
|
||||||
"</span><br />";
|
'</span><br />';
|
||||||
}
|
}
|
||||||
for (const occupancy of workOrder.workOrderLotOccupancies) {
|
for (const occupancy of workOrder.workOrderLotOccupancies) {
|
||||||
for (const occupant of occupancy.lotOccupancyOccupants) {
|
for (const occupant of occupancy.lotOccupancyOccupants) {
|
||||||
relatedHTML +=
|
relatedHTML +=
|
||||||
'<span class="has-tooltip-left" data-tooltip="' +
|
'<span class="has-tooltip-left" data-tooltip="' +
|
||||||
cityssm.escapeHTML(occupant.lotOccupantType || "") +
|
cityssm.escapeHTML(occupant.lotOccupantType || '') +
|
||||||
'">' +
|
'">' +
|
||||||
'<i class="fas fa-fw fa-' +
|
'<i class="fas fa-fw fa-' +
|
||||||
cityssm.escapeHTML(occupant.fontAwesomeIconClass || "user") +
|
cityssm.escapeHTML(occupant.fontAwesomeIconClass || 'user') +
|
||||||
'" aria-label="' +
|
'" aria-label="' +
|
||||||
los.escapedAliases.occupant +
|
los.escapedAliases.occupant +
|
||||||
'"></i> ' +
|
'"></i> ' +
|
||||||
cityssm.escapeHTML(occupant.occupantName || "(No Name)") +
|
cityssm.escapeHTML(occupant.occupantName || '(No Name)') +
|
||||||
"</span><br />";
|
'</span><br />';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
|
resultsTbodyElement.insertAdjacentHTML('beforeend', '<tr>' +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
'<a class="has-text-weight-bold" href="' +
|
'<a class="has-text-weight-bold" href="' +
|
||||||
los.getWorkOrderURL(workOrder.workOrderId) +
|
los.getWorkOrderURL(workOrder.workOrderId) +
|
||||||
'">' +
|
'">' +
|
||||||
(workOrder.workOrderNumber.trim()
|
(workOrder.workOrderNumber.trim()
|
||||||
? cityssm.escapeHTML(workOrder.workOrderNumber || "")
|
? cityssm.escapeHTML(workOrder.workOrderNumber || '')
|
||||||
: "(No Number)") +
|
: '(No Number)') +
|
||||||
"</a>" +
|
'</a>' +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
cityssm.escapeHTML(workOrder.workOrderType || "") +
|
cityssm.escapeHTML(workOrder.workOrderType || '') +
|
||||||
"<br />" +
|
'<br />' +
|
||||||
'<span class="is-size-7">' +
|
'<span class="is-size-7">' +
|
||||||
cityssm.escapeHTML(workOrder.workOrderDescription || "") +
|
cityssm.escapeHTML(workOrder.workOrderDescription || '') +
|
||||||
"</span>" +
|
'</span>' +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
('<td class="is-nowrap"><span class="is-size-7">' + relatedHTML + "</span></td>") +
|
('<td class="is-nowrap"><span class="is-size-7">' +
|
||||||
|
relatedHTML +
|
||||||
|
'</span></td>') +
|
||||||
('<td class="is-nowrap">' +
|
('<td class="is-nowrap">' +
|
||||||
('<span class="has-tooltip-left" data-tooltip="' +
|
('<span class="has-tooltip-left" data-tooltip="' +
|
||||||
los.escapedAliases.WorkOrderOpenDate +
|
los.escapedAliases.WorkOrderOpenDate +
|
||||||
|
|
@ -73,7 +75,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
los.escapedAliases.WorkOrderOpenDate +
|
los.escapedAliases.WorkOrderOpenDate +
|
||||||
'"></i> ' +
|
'"></i> ' +
|
||||||
workOrder.workOrderOpenDateString +
|
workOrder.workOrderOpenDateString +
|
||||||
"</span><br />") +
|
'</span><br />') +
|
||||||
('<span class="has-tooltip-left" data-tooltip="' +
|
('<span class="has-tooltip-left" data-tooltip="' +
|
||||||
los.escapedAliases.WorkOrderCloseDate +
|
los.escapedAliases.WorkOrderCloseDate +
|
||||||
'">' +
|
'">' +
|
||||||
|
|
@ -84,55 +86,57 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
? workOrder.workOrderCloseDateString
|
? workOrder.workOrderCloseDateString
|
||||||
: '<span class="has-text-grey">(No ' +
|
: '<span class="has-text-grey">(No ' +
|
||||||
los.escapedAliases.WorkOrderCloseDate +
|
los.escapedAliases.WorkOrderCloseDate +
|
||||||
")</span>") +
|
')</span>') +
|
||||||
"</span>") +
|
'</span>') +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
(workOrder.workOrderMilestoneCount === 0
|
(workOrder.workOrderMilestoneCount === 0
|
||||||
? "-"
|
? '-'
|
||||||
: workOrder.workOrderMilestoneCompletionCount +
|
: workOrder.workOrderMilestoneCompletionCount +
|
||||||
" / " +
|
' / ' +
|
||||||
workOrder.workOrderMilestoneCount) +
|
workOrder.workOrderMilestoneCount) +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
(workOrderPrints.length > 0
|
(workOrderPrints.length > 0
|
||||||
? "<td>" +
|
? '<td>' +
|
||||||
'<a class="button is-small" data-tooltip="Print" href="' +
|
'<a class="button is-small" data-tooltip="Print" href="' +
|
||||||
los.urlPrefix +
|
los.urlPrefix +
|
||||||
"/print/" +
|
'/print/' +
|
||||||
workOrderPrints[0] +
|
workOrderPrints[0] +
|
||||||
"/?workOrderId=" +
|
'/?workOrderId=' +
|
||||||
workOrder.workOrderId +
|
workOrder.workOrderId +
|
||||||
'" target="_blank">' +
|
'" target="_blank">' +
|
||||||
'<i class="fas fa-print" aria-label="Print"></i>' +
|
'<i class="fas fa-print" aria-label="Print"></i>' +
|
||||||
"</a>" +
|
'</a>' +
|
||||||
"</td>"
|
'</td>'
|
||||||
: "") +
|
: '') +
|
||||||
"</tr>");
|
'</tr>');
|
||||||
}
|
}
|
||||||
searchResultsContainerElement.innerHTML =
|
searchResultsContainerElement.innerHTML =
|
||||||
'<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">' +
|
'<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">' +
|
||||||
"<thead><tr>" +
|
'<thead><tr>' +
|
||||||
"<th>Work Order Number</th>" +
|
'<th>Work Order Number</th>' +
|
||||||
"<th>Description</th>" +
|
'<th>Description</th>' +
|
||||||
"<th>Related</th>" +
|
'<th>Related</th>' +
|
||||||
"<th>Date</th>" +
|
'<th>Date</th>' +
|
||||||
'<th class="has-tooltip-bottom" data-tooltip="Completed / Total Milestones">Progress</th>' +
|
'<th class="has-tooltip-bottom" data-tooltip="Completed / Total Milestones">Progress</th>' +
|
||||||
(workOrderPrints.length > 0 ? '<th class="has-width-1"></th>' : "") +
|
(workOrderPrints.length > 0 ? '<th class="has-width-1"></th>' : '') +
|
||||||
"</tr></thead>" +
|
'</tr></thead>' +
|
||||||
"<table>";
|
'<table>';
|
||||||
searchResultsContainerElement.insertAdjacentHTML("beforeend", los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count));
|
searchResultsContainerElement.insertAdjacentHTML('beforeend', los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count));
|
||||||
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement);
|
searchResultsContainerElement
|
||||||
|
.querySelector('table')
|
||||||
|
.append(resultsTbodyElement);
|
||||||
(_a = searchResultsContainerElement
|
(_a = searchResultsContainerElement
|
||||||
.querySelector("button[data-page='previous']")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", previousAndGetWorkOrders);
|
.querySelector("button[data-page='previous']")) === null || _a === void 0 ? void 0 : _a.addEventListener('click', previousAndGetWorkOrders);
|
||||||
(_b = searchResultsContainerElement
|
(_b = searchResultsContainerElement
|
||||||
.querySelector("button[data-page='next']")) === null || _b === void 0 ? void 0 : _b.addEventListener("click", nextAndGetWorkOrders);
|
.querySelector("button[data-page='next']")) === null || _b === void 0 ? void 0 : _b.addEventListener('click', nextAndGetWorkOrders);
|
||||||
}
|
}
|
||||||
function getWorkOrders() {
|
function getWorkOrders() {
|
||||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML("Loading Work Orders...");
|
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML('Loading Work Orders...');
|
||||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doSearchWorkOrders", searchFilterFormElement, renderWorkOrders);
|
cityssm.postJSON(los.urlPrefix + '/workOrders/doSearchWorkOrders', searchFilterFormElement, renderWorkOrders);
|
||||||
}
|
}
|
||||||
function resetOffsetAndGetWorkOrders() {
|
function resetOffsetAndGetWorkOrders() {
|
||||||
offsetElement.value = "0";
|
offsetElement.value = '0';
|
||||||
getWorkOrders();
|
getWorkOrders();
|
||||||
}
|
}
|
||||||
function previousAndGetWorkOrders() {
|
function previousAndGetWorkOrders() {
|
||||||
|
|
@ -143,11 +147,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString();
|
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString();
|
||||||
getWorkOrders();
|
getWorkOrders();
|
||||||
}
|
}
|
||||||
const filterElements = searchFilterFormElement.querySelectorAll("input, select");
|
const filterElements = searchFilterFormElement.querySelectorAll('input, select');
|
||||||
for (const filterElement of filterElements) {
|
for (const filterElement of filterElements) {
|
||||||
filterElement.addEventListener("change", resetOffsetAndGetWorkOrders);
|
filterElement.addEventListener('change', resetOffsetAndGetWorkOrders);
|
||||||
}
|
}
|
||||||
searchFilterFormElement.addEventListener("submit", (formEvent) => {
|
searchFilterFormElement.addEventListener('submit', (formEvent) => {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault();
|
||||||
resetOffsetAndGetWorkOrders();
|
resetOffsetAndGetWorkOrders();
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,96 +1,106 @@
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||||
|
|
||||||
import type * as recordTypes from "../types/recordTypes";
|
import type * as recordTypes from '../types/recordTypes'
|
||||||
import type * as globalTypes from "../types/globalTypes";
|
import type * as globalTypes from '../types/globalTypes'
|
||||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal
|
||||||
|
|
||||||
(() => {
|
;(() => {
|
||||||
const los = exports.los as globalTypes.LOS;
|
const los = exports.los as globalTypes.LOS
|
||||||
|
|
||||||
const workOrderPrints: string[] = exports.workOrderPrints;
|
const workOrderPrints: string[] = exports.workOrderPrints
|
||||||
|
|
||||||
const searchFilterFormElement = document.querySelector("#form--searchFilters") as HTMLFormElement;
|
const searchFilterFormElement = document.querySelector(
|
||||||
|
'#form--searchFilters'
|
||||||
|
) as HTMLFormElement
|
||||||
|
|
||||||
los.initializeDatePickers(searchFilterFormElement);
|
los.initializeDatePickers(searchFilterFormElement)
|
||||||
|
|
||||||
const searchResultsContainerElement = document.querySelector("#container--searchResults") as HTMLElement;
|
const searchResultsContainerElement = document.querySelector(
|
||||||
|
'#container--searchResults'
|
||||||
|
) as HTMLElement
|
||||||
|
|
||||||
const limit = Number.parseInt(
|
const limit = Number.parseInt(
|
||||||
(document.querySelector("#searchFilter--limit") as HTMLInputElement).value,
|
(document.querySelector('#searchFilter--limit') as HTMLInputElement).value,
|
||||||
10
|
10
|
||||||
);
|
)
|
||||||
|
|
||||||
const offsetElement = document.querySelector("#searchFilter--offset") as HTMLInputElement;
|
const offsetElement = document.querySelector(
|
||||||
|
'#searchFilter--offset'
|
||||||
|
) as HTMLInputElement
|
||||||
|
|
||||||
function renderWorkOrders(responseJSON: {
|
function renderWorkOrders(responseJSON: {
|
||||||
count: number;
|
count: number
|
||||||
offset: number;
|
offset: number
|
||||||
workOrders: recordTypes.WorkOrder[];
|
workOrders: recordTypes.WorkOrder[]
|
||||||
}) {
|
}) {
|
||||||
if (responseJSON.workOrders.length === 0) {
|
if (responseJSON.workOrders.length === 0) {
|
||||||
searchResultsContainerElement.innerHTML =
|
searchResultsContainerElement.innerHTML =
|
||||||
'<div class="message is-info">' +
|
'<div class="message is-info">' +
|
||||||
'<p class="message-body">There are no work orders that meet the search criteria.</p>' +
|
'<p class="message-body">There are no work orders that meet the search criteria.</p>' +
|
||||||
"</div>";
|
'</div>'
|
||||||
|
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const resultsTbodyElement = document.createElement("tbody");
|
const resultsTbodyElement = document.createElement('tbody')
|
||||||
|
|
||||||
for (const workOrder of responseJSON.workOrders) {
|
for (const workOrder of responseJSON.workOrders) {
|
||||||
let relatedHTML = "";
|
let relatedHTML = ''
|
||||||
|
|
||||||
for (const lot of workOrder.workOrderLots!) {
|
for (const lot of workOrder.workOrderLots!) {
|
||||||
relatedHTML +=
|
relatedHTML +=
|
||||||
'<span class="has-tooltip-left" data-tooltip="' +
|
'<span class="has-tooltip-left" data-tooltip="' +
|
||||||
cityssm.escapeHTML(lot.mapName || "") +
|
cityssm.escapeHTML(lot.mapName || '') +
|
||||||
'">' +
|
'">' +
|
||||||
'<i class="fas fa-fw fa-vector-square" aria-label="' +
|
'<i class="fas fa-fw fa-vector-square" aria-label="' +
|
||||||
los.escapedAliases.Lot +
|
los.escapedAliases.Lot +
|
||||||
'"></i> ' +
|
'"></i> ' +
|
||||||
cityssm.escapeHTML(lot.lotName || "(No " + exports.aliases.Lot + " Name)") +
|
cityssm.escapeHTML(
|
||||||
"</span><br />";
|
lot.lotName || '(No ' + exports.aliases.Lot + ' Name)'
|
||||||
|
) +
|
||||||
|
'</span><br />'
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const occupancy of workOrder.workOrderLotOccupancies!) {
|
for (const occupancy of workOrder.workOrderLotOccupancies!) {
|
||||||
for (const occupant of occupancy.lotOccupancyOccupants!) {
|
for (const occupant of occupancy.lotOccupancyOccupants!) {
|
||||||
relatedHTML +=
|
relatedHTML +=
|
||||||
'<span class="has-tooltip-left" data-tooltip="' +
|
'<span class="has-tooltip-left" data-tooltip="' +
|
||||||
cityssm.escapeHTML(occupant.lotOccupantType || "") +
|
cityssm.escapeHTML(occupant.lotOccupantType || '') +
|
||||||
'">' +
|
'">' +
|
||||||
'<i class="fas fa-fw fa-' +
|
'<i class="fas fa-fw fa-' +
|
||||||
cityssm.escapeHTML(occupant.fontAwesomeIconClass || "user") +
|
cityssm.escapeHTML(occupant.fontAwesomeIconClass || 'user') +
|
||||||
'" aria-label="' +
|
'" aria-label="' +
|
||||||
los.escapedAliases.occupant +
|
los.escapedAliases.occupant +
|
||||||
'"></i> ' +
|
'"></i> ' +
|
||||||
cityssm.escapeHTML(occupant.occupantName || "(No Name)") +
|
cityssm.escapeHTML(occupant.occupantName || '(No Name)') +
|
||||||
"</span><br />";
|
'</span><br />'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
resultsTbodyElement.insertAdjacentHTML(
|
resultsTbodyElement.insertAdjacentHTML(
|
||||||
"beforeend",
|
'beforeend',
|
||||||
"<tr>" +
|
'<tr>' +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
'<a class="has-text-weight-bold" href="' +
|
'<a class="has-text-weight-bold" href="' +
|
||||||
los.getWorkOrderURL(workOrder.workOrderId!) +
|
los.getWorkOrderURL(workOrder.workOrderId!) +
|
||||||
'">' +
|
'">' +
|
||||||
(workOrder.workOrderNumber!.trim()
|
(workOrder.workOrderNumber!.trim()
|
||||||
? cityssm.escapeHTML(workOrder.workOrderNumber || "")
|
? cityssm.escapeHTML(workOrder.workOrderNumber || '')
|
||||||
: "(No Number)") +
|
: '(No Number)') +
|
||||||
"</a>" +
|
'</a>' +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
cityssm.escapeHTML(workOrder.workOrderType || "") +
|
cityssm.escapeHTML(workOrder.workOrderType || '') +
|
||||||
"<br />" +
|
'<br />' +
|
||||||
'<span class="is-size-7">' +
|
'<span class="is-size-7">' +
|
||||||
cityssm.escapeHTML(workOrder.workOrderDescription || "") +
|
cityssm.escapeHTML(workOrder.workOrderDescription || '') +
|
||||||
"</span>" +
|
'</span>' +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
('<td class="is-nowrap"><span class="is-size-7">' + relatedHTML + "</span></td>") +
|
('<td class="is-nowrap"><span class="is-size-7">' +
|
||||||
|
relatedHTML +
|
||||||
|
'</span></td>') +
|
||||||
('<td class="is-nowrap">' +
|
('<td class="is-nowrap">' +
|
||||||
('<span class="has-tooltip-left" data-tooltip="' +
|
('<span class="has-tooltip-left" data-tooltip="' +
|
||||||
los.escapedAliases.WorkOrderOpenDate +
|
los.escapedAliases.WorkOrderOpenDate +
|
||||||
|
|
@ -99,7 +109,7 @@ declare const cityssm: cityssmGlobal;
|
||||||
los.escapedAliases.WorkOrderOpenDate +
|
los.escapedAliases.WorkOrderOpenDate +
|
||||||
'"></i> ' +
|
'"></i> ' +
|
||||||
workOrder.workOrderOpenDateString +
|
workOrder.workOrderOpenDateString +
|
||||||
"</span><br />") +
|
'</span><br />') +
|
||||||
('<span class="has-tooltip-left" data-tooltip="' +
|
('<span class="has-tooltip-left" data-tooltip="' +
|
||||||
los.escapedAliases.WorkOrderCloseDate +
|
los.escapedAliases.WorkOrderCloseDate +
|
||||||
'">' +
|
'">' +
|
||||||
|
|
@ -110,98 +120,111 @@ declare const cityssm: cityssmGlobal;
|
||||||
? workOrder.workOrderCloseDateString
|
? workOrder.workOrderCloseDateString
|
||||||
: '<span class="has-text-grey">(No ' +
|
: '<span class="has-text-grey">(No ' +
|
||||||
los.escapedAliases.WorkOrderCloseDate +
|
los.escapedAliases.WorkOrderCloseDate +
|
||||||
")</span>") +
|
')</span>') +
|
||||||
"</span>") +
|
'</span>') +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
("<td>" +
|
('<td>' +
|
||||||
(workOrder.workOrderMilestoneCount === 0
|
(workOrder.workOrderMilestoneCount === 0
|
||||||
? "-"
|
? '-'
|
||||||
: workOrder.workOrderMilestoneCompletionCount +
|
: workOrder.workOrderMilestoneCompletionCount +
|
||||||
" / " +
|
' / ' +
|
||||||
workOrder.workOrderMilestoneCount) +
|
workOrder.workOrderMilestoneCount) +
|
||||||
"</td>") +
|
'</td>') +
|
||||||
(workOrderPrints.length > 0
|
(workOrderPrints.length > 0
|
||||||
? "<td>" +
|
? '<td>' +
|
||||||
'<a class="button is-small" data-tooltip="Print" href="' +
|
'<a class="button is-small" data-tooltip="Print" href="' +
|
||||||
los.urlPrefix +
|
los.urlPrefix +
|
||||||
"/print/" +
|
'/print/' +
|
||||||
workOrderPrints[0] +
|
workOrderPrints[0] +
|
||||||
"/?workOrderId=" +
|
'/?workOrderId=' +
|
||||||
workOrder.workOrderId +
|
workOrder.workOrderId +
|
||||||
'" target="_blank">' +
|
'" target="_blank">' +
|
||||||
'<i class="fas fa-print" aria-label="Print"></i>' +
|
'<i class="fas fa-print" aria-label="Print"></i>' +
|
||||||
"</a>" +
|
'</a>' +
|
||||||
"</td>"
|
'</td>'
|
||||||
: "") +
|
: '') +
|
||||||
"</tr>"
|
'</tr>'
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
searchResultsContainerElement.innerHTML =
|
searchResultsContainerElement.innerHTML =
|
||||||
'<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">' +
|
'<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">' +
|
||||||
"<thead><tr>" +
|
'<thead><tr>' +
|
||||||
"<th>Work Order Number</th>" +
|
'<th>Work Order Number</th>' +
|
||||||
"<th>Description</th>" +
|
'<th>Description</th>' +
|
||||||
"<th>Related</th>" +
|
'<th>Related</th>' +
|
||||||
"<th>Date</th>" +
|
'<th>Date</th>' +
|
||||||
'<th class="has-tooltip-bottom" data-tooltip="Completed / Total Milestones">Progress</th>' +
|
'<th class="has-tooltip-bottom" data-tooltip="Completed / Total Milestones">Progress</th>' +
|
||||||
(workOrderPrints.length > 0 ? '<th class="has-width-1"></th>' : "") +
|
(workOrderPrints.length > 0 ? '<th class="has-width-1"></th>' : '') +
|
||||||
"</tr></thead>" +
|
'</tr></thead>' +
|
||||||
"<table>";
|
'<table>'
|
||||||
|
|
||||||
searchResultsContainerElement.insertAdjacentHTML(
|
searchResultsContainerElement.insertAdjacentHTML(
|
||||||
"beforeend",
|
'beforeend',
|
||||||
los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count)
|
los.getSearchResultsPagerHTML(
|
||||||
);
|
limit,
|
||||||
|
responseJSON.offset,
|
||||||
|
responseJSON.count
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
searchResultsContainerElement.querySelector("table")!.append(resultsTbodyElement);
|
searchResultsContainerElement
|
||||||
|
.querySelector('table')!
|
||||||
|
.append(resultsTbodyElement)
|
||||||
|
|
||||||
searchResultsContainerElement
|
searchResultsContainerElement
|
||||||
.querySelector("button[data-page='previous']")
|
.querySelector("button[data-page='previous']")
|
||||||
?.addEventListener("click", previousAndGetWorkOrders);
|
?.addEventListener('click', previousAndGetWorkOrders)
|
||||||
|
|
||||||
searchResultsContainerElement
|
searchResultsContainerElement
|
||||||
.querySelector("button[data-page='next']")
|
.querySelector("button[data-page='next']")
|
||||||
?.addEventListener("click", nextAndGetWorkOrders);
|
?.addEventListener('click', nextAndGetWorkOrders)
|
||||||
}
|
}
|
||||||
|
|
||||||
function getWorkOrders() {
|
function getWorkOrders() {
|
||||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML("Loading Work Orders...");
|
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(
|
||||||
|
'Loading Work Orders...'
|
||||||
|
)
|
||||||
|
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/workOrders/doSearchWorkOrders",
|
los.urlPrefix + '/workOrders/doSearchWorkOrders',
|
||||||
searchFilterFormElement,
|
searchFilterFormElement,
|
||||||
renderWorkOrders
|
renderWorkOrders
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
function resetOffsetAndGetWorkOrders() {
|
function resetOffsetAndGetWorkOrders() {
|
||||||
offsetElement.value = "0";
|
offsetElement.value = '0'
|
||||||
getWorkOrders();
|
getWorkOrders()
|
||||||
}
|
}
|
||||||
|
|
||||||
function previousAndGetWorkOrders() {
|
function previousAndGetWorkOrders() {
|
||||||
offsetElement.value = Math.max(Number.parseInt(offsetElement.value, 10) - limit, 0).toString();
|
offsetElement.value = Math.max(
|
||||||
getWorkOrders();
|
Number.parseInt(offsetElement.value, 10) - limit,
|
||||||
|
0
|
||||||
|
).toString()
|
||||||
|
getWorkOrders()
|
||||||
}
|
}
|
||||||
|
|
||||||
function nextAndGetWorkOrders() {
|
function nextAndGetWorkOrders() {
|
||||||
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString();
|
offsetElement.value = (
|
||||||
getWorkOrders();
|
Number.parseInt(offsetElement.value, 10) + limit
|
||||||
|
).toString()
|
||||||
|
getWorkOrders()
|
||||||
}
|
}
|
||||||
|
|
||||||
const filterElements = searchFilterFormElement.querySelectorAll("input, select") as NodeListOf<
|
const filterElements = searchFilterFormElement.querySelectorAll(
|
||||||
HTMLInputElement | HTMLSelectElement
|
'input, select'
|
||||||
>;
|
) as NodeListOf<HTMLInputElement | HTMLSelectElement>
|
||||||
|
|
||||||
for (const filterElement of filterElements) {
|
for (const filterElement of filterElements) {
|
||||||
filterElement.addEventListener("change", resetOffsetAndGetWorkOrders);
|
filterElement.addEventListener('change', resetOffsetAndGetWorkOrders)
|
||||||
}
|
}
|
||||||
|
|
||||||
searchFilterFormElement.addEventListener("submit", (formEvent) => {
|
searchFilterFormElement.addEventListener('submit', (formEvent) => {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault()
|
||||||
resetOffsetAndGetWorkOrders();
|
resetOffsetAndGetWorkOrders()
|
||||||
});
|
})
|
||||||
|
|
||||||
/*
|
/*
|
||||||
const workOrderOpenDateStringElement = document.querySelector("#searchFilter--workOrderOpenDateString") as HTMLInputElement;
|
const workOrderOpenDateStringElement = document.querySelector("#searchFilter--workOrderOpenDateString") as HTMLInputElement;
|
||||||
|
|
@ -233,5 +256,5 @@ declare const cityssm: cityssmGlobal;
|
||||||
});
|
});
|
||||||
*/
|
*/
|
||||||
|
|
||||||
getWorkOrders();
|
getWorkOrders()
|
||||||
})();
|
})()
|
||||||
|
|
|
||||||
|
|
@ -3,33 +3,32 @@
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
(() => {
|
(() => {
|
||||||
const los = exports.los;
|
const los = exports.los;
|
||||||
const reopenWorkOrderButtonElement = document.querySelector("#button--reopenWorkOrder");
|
const reopenWorkOrderButtonElement = document.querySelector('#button--reopenWorkOrder');
|
||||||
if (reopenWorkOrderButtonElement) {
|
if (reopenWorkOrderButtonElement) {
|
||||||
const workOrderId = reopenWorkOrderButtonElement.dataset.workOrderId;
|
const workOrderId = reopenWorkOrderButtonElement.dataset.workOrderId;
|
||||||
reopenWorkOrderButtonElement.addEventListener("click", () => {
|
reopenWorkOrderButtonElement.addEventListener('click', () => {
|
||||||
function doReopen() {
|
function doReopen() {
|
||||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doReopenWorkOrder", {
|
cityssm.postJSON(los.urlPrefix + '/workOrders/doReopenWorkOrder', {
|
||||||
workOrderId
|
workOrderId
|
||||||
}, (responseJSON) => {
|
}, (responseJSON) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
window.location.href =
|
window.location.href = los.getWorkOrderURL(workOrderId, true, true);
|
||||||
los.getWorkOrderURL(workOrderId, true, true);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Reopening Work Order",
|
title: 'Error Reopening Work Order',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Reopen Work Order",
|
title: 'Reopen Work Order',
|
||||||
message: "Are you sure you want to remove the close date from this work order and reopen it?",
|
message: 'Are you sure you want to remove the close date from this work order and reopen it?',
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Reopen Work Order",
|
text: 'Yes, Reopen Work Order',
|
||||||
callbackFunction: doReopen
|
callbackFunction: doReopen
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,56 +1,59 @@
|
||||||
/* eslint-disable unicorn/prefer-module, @typescript-eslint/no-non-null-assertion */
|
/* eslint-disable unicorn/prefer-module, @typescript-eslint/no-non-null-assertion */
|
||||||
|
|
||||||
import type * as globalTypes from "../types/globalTypes";
|
import type * as globalTypes from '../types/globalTypes'
|
||||||
|
|
||||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||||
|
|
||||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||||
|
|
||||||
declare const cityssm: cityssmGlobal;
|
declare const cityssm: cityssmGlobal
|
||||||
declare const bulmaJS: BulmaJS;
|
declare const bulmaJS: BulmaJS
|
||||||
|
|
||||||
(() => {
|
;(() => {
|
||||||
const los = exports.los as globalTypes.LOS;
|
const los = exports.los as globalTypes.LOS
|
||||||
|
|
||||||
const reopenWorkOrderButtonElement = document.querySelector(
|
const reopenWorkOrderButtonElement = document.querySelector(
|
||||||
"#button--reopenWorkOrder"
|
'#button--reopenWorkOrder'
|
||||||
) as HTMLButtonElement;
|
) as HTMLButtonElement
|
||||||
|
|
||||||
if (reopenWorkOrderButtonElement) {
|
if (reopenWorkOrderButtonElement) {
|
||||||
const workOrderId = reopenWorkOrderButtonElement.dataset.workOrderId!;
|
const workOrderId = reopenWorkOrderButtonElement.dataset.workOrderId!
|
||||||
|
|
||||||
reopenWorkOrderButtonElement.addEventListener("click", () => {
|
reopenWorkOrderButtonElement.addEventListener('click', () => {
|
||||||
function doReopen() {
|
function doReopen() {
|
||||||
cityssm.postJSON(
|
cityssm.postJSON(
|
||||||
los.urlPrefix + "/workOrders/doReopenWorkOrder",
|
los.urlPrefix + '/workOrders/doReopenWorkOrder',
|
||||||
{
|
{
|
||||||
workOrderId
|
workOrderId
|
||||||
},
|
},
|
||||||
(responseJSON: { success: boolean; errorMessage?: string }) => {
|
(responseJSON: { success: boolean; errorMessage?: string }) => {
|
||||||
if (responseJSON.success) {
|
if (responseJSON.success) {
|
||||||
window.location.href =
|
window.location.href = los.getWorkOrderURL(
|
||||||
los.getWorkOrderURL(workOrderId, true, true);
|
workOrderId,
|
||||||
|
true,
|
||||||
|
true
|
||||||
|
)
|
||||||
} else {
|
} else {
|
||||||
bulmaJS.alert({
|
bulmaJS.alert({
|
||||||
title: "Error Reopening Work Order",
|
title: 'Error Reopening Work Order',
|
||||||
message: responseJSON.errorMessage || "",
|
message: responseJSON.errorMessage || '',
|
||||||
contextualColorName: "danger"
|
contextualColorName: 'danger'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
bulmaJS.confirm({
|
bulmaJS.confirm({
|
||||||
title: "Reopen Work Order",
|
title: 'Reopen Work Order',
|
||||||
message:
|
message:
|
||||||
"Are you sure you want to remove the close date from this work order and reopen it?",
|
'Are you sure you want to remove the close date from this work order and reopen it?',
|
||||||
contextualColorName: "warning",
|
contextualColorName: 'warning',
|
||||||
okButton: {
|
okButton: {
|
||||||
text: "Yes, Reopen Work Order",
|
text: 'Yes, Reopen Work Order',
|
||||||
callbackFunction: doReopen
|
callbackFunction: doReopen
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
})();
|
})()
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<div class="modal" role="dialog">
|
<div class="modal" role="dialog">
|
||||||
<div class="modal-background"></div>
|
<div class="modal-background"></div>
|
||||||
<div class="modal-card" style="width:900px">
|
<div class="modal-card has-width-900">
|
||||||
<header class="modal-card-head">
|
<header class="modal-card-head">
|
||||||
<h3 class="modal-card-title">
|
<h3 class="modal-card-title">
|
||||||
Update Fee
|
Update Fee
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<div class="modal" role="dialog">
|
<div class="modal" role="dialog">
|
||||||
<div class="modal-background"></div>
|
<div class="modal-background"></div>
|
||||||
<div class="modal-card" style="width:900px">
|
<div class="modal-card has-width-900">
|
||||||
<header class="modal-card-head">
|
<header class="modal-card-head">
|
||||||
<h3 class="modal-card-title">
|
<h3 class="modal-card-title">
|
||||||
Add <span class="alias" data-alias="Lot"></span> Type
|
Add <span class="alias" data-alias="Lot"></span> Type
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<div class="modal" role="dialog">
|
<div class="modal" role="dialog">
|
||||||
<div class="modal-background"></div>
|
<div class="modal-background"></div>
|
||||||
<div class="modal-card" style="width:900px">
|
<div class="modal-card has-width-900">
|
||||||
<header class="modal-card-head">
|
<header class="modal-card-head">
|
||||||
<h3 class="modal-card-title">
|
<h3 class="modal-card-title">
|
||||||
Add <span class="alias" data-alias="Lot"></span> Type Field
|
Add <span class="alias" data-alias="Lot"></span> Type Field
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<div class="modal" role="dialog">
|
<div class="modal" role="dialog">
|
||||||
<div class="modal-background"></div>
|
<div class="modal-background"></div>
|
||||||
<div class="modal-card" style="width:900px">
|
<div class="modal-card has-width-900">
|
||||||
<header class="modal-card-head">
|
<header class="modal-card-head">
|
||||||
<h3 class="modal-card-title">
|
<h3 class="modal-card-title">
|
||||||
Update <span class="alias" data-alias="Lot"></span> Type
|
Update <span class="alias" data-alias="Lot"></span> Type
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<div class="modal" role="dialog">
|
<div class="modal" role="dialog">
|
||||||
<div class="modal-background"></div>
|
<div class="modal-background"></div>
|
||||||
<div class="modal-card" style="width:900px">
|
<div class="modal-card has-width-900">
|
||||||
<header class="modal-card-head">
|
<header class="modal-card-head">
|
||||||
<h3 class="modal-card-title">
|
<h3 class="modal-card-title">
|
||||||
Update <span class="alias" data-alias="Lot"></span> Type Field
|
Update <span class="alias" data-alias="Lot"></span> Type Field
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<div class="modal" role="dialog">
|
<div class="modal" role="dialog">
|
||||||
<div class="modal-background"></div>
|
<div class="modal-background"></div>
|
||||||
<div class="modal-card" style="width:900px">
|
<div class="modal-card has-width-900">
|
||||||
<header class="modal-card-head">
|
<header class="modal-card-head">
|
||||||
<h3 class="modal-card-title">
|
<h3 class="modal-card-title">
|
||||||
Add <span class="alias" data-alias="Occupancy"></span> Type
|
Add <span class="alias" data-alias="Occupancy"></span> Type
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<div class="modal" role="dialog">
|
<div class="modal" role="dialog">
|
||||||
<div class="modal-background"></div>
|
<div class="modal-background"></div>
|
||||||
<div class="modal-card" style="width:900px">
|
<div class="modal-card has-width-900">
|
||||||
<header class="modal-card-head">
|
<header class="modal-card-head">
|
||||||
<h3 class="modal-card-title">
|
<h3 class="modal-card-title">
|
||||||
Add <span class="alias" data-alias="Occupancy"></span> Type Field
|
Add <span class="alias" data-alias="Occupancy"></span> Type Field
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<div class="modal" role="dialog">
|
<div class="modal" role="dialog">
|
||||||
<div class="modal-background"></div>
|
<div class="modal-background"></div>
|
||||||
<div class="modal-card" style="width:900px">
|
<div class="modal-card has-width-900">
|
||||||
<header class="modal-card-head">
|
<header class="modal-card-head">
|
||||||
<h3 class="modal-card-title">
|
<h3 class="modal-card-title">
|
||||||
Update <span class="alias" data-alias="Occupancy"></span> Type
|
Update <span class="alias" data-alias="Occupancy"></span> Type
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<div class="modal" role="dialog">
|
<div class="modal" role="dialog">
|
||||||
<div class="modal-background"></div>
|
<div class="modal-background"></div>
|
||||||
<div class="modal-card" style="width:900px">
|
<div class="modal-card has-width-900">
|
||||||
<header class="modal-card-head">
|
<header class="modal-card-head">
|
||||||
<h3 class="modal-card-title">
|
<h3 class="modal-card-title">
|
||||||
Update <span class="alias" data-alias="Occupancy"></span> Type Field
|
Update <span class="alias" data-alias="Occupancy"></span> Type Field
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<div class="modal" role="dialog">
|
<div class="modal" role="dialog">
|
||||||
<div class="modal-background"></div>
|
<div class="modal-background"></div>
|
||||||
<div class="modal-card" style="width:900px">
|
<div class="modal-card has-width-900">
|
||||||
<header class="modal-card-head">
|
<header class="modal-card-head">
|
||||||
<h3 class="modal-card-title">
|
<h3 class="modal-card-title">
|
||||||
Add Related <span class="alias" data-alias="Lot"></span> to Work Order
|
Add Related <span class="alias" data-alias="Lot"></span> to Work Order
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<div class="modal" role="dialog">
|
<div class="modal" role="dialog">
|
||||||
<div class="modal-background"></div>
|
<div class="modal-background"></div>
|
||||||
<div class="modal-card" style="width:900px">
|
<div class="modal-card has-width-900">
|
||||||
<header class="modal-card-head">
|
<header class="modal-card-head">
|
||||||
<h3 class="modal-card-title">
|
<h3 class="modal-card-title">
|
||||||
Add Related <span class="alias" data-alias="Occupancy"></span> to Work Order
|
Add Related <span class="alias" data-alias="Occupancy"></span> to Work Order
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,40 @@
|
||||||
|
<table class="layout-table">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<h1 class="m-0">Work Order #<%= workOrder.workOrderNumber %></h1>
|
||||||
|
</td>
|
||||||
|
<td class="has-text-right is-vcentered">
|
||||||
|
<strong>
|
||||||
|
<% if (workOrder.workOrderCloseDate) { %>
|
||||||
|
CLOSED<br />
|
||||||
|
<% } %>
|
||||||
|
<%= workOrder.workOrderType %>
|
||||||
|
</strong>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<div class="box mt-1">
|
||||||
|
<table class="layout-table">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<strong>Description</strong><br />
|
||||||
|
<%= workOrder.workOrderDescription %>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td class="pl-1 is-width-1 has-text-nowrap">
|
||||||
|
<p>
|
||||||
|
<strong><%= configFunctions.getProperty("aliases.workOrderOpenDate") %></strong><br />
|
||||||
|
<%= workOrder.workOrderOpenDateString %>
|
||||||
|
</p>
|
||||||
|
<% if (workOrder.workOrderCloseDate) { %>
|
||||||
|
<p>
|
||||||
|
<strong><%= configFunctions.getProperty("aliases.workOrderCloseDate") %></strong><br />
|
||||||
|
<%= workOrder.workOrderCloseDateString %>
|
||||||
|
</p>
|
||||||
|
<% } %>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue