linting with mega linter
parent
119c325cc3
commit
a4f4b353fc
28
.cspell.json
28
.cspell.json
|
|
@ -1,16 +1,16 @@
|
|||
{
|
||||
"ignorePaths": [
|
||||
"**/node_modules/**",
|
||||
"**/vscode-extension/**",
|
||||
"**/.git/**",
|
||||
"**/.pnpm-lock.json",
|
||||
".vscode",
|
||||
"megalinter",
|
||||
"package-lock.json",
|
||||
"report"
|
||||
],
|
||||
"language": "en",
|
||||
"noConfigSearch": true,
|
||||
"words": ["megalinter", "oxsecurity"],
|
||||
"version": "0.2"
|
||||
"ignorePaths": [
|
||||
"**/node_modules/**",
|
||||
"**/vscode-extension/**",
|
||||
"**/.git/**",
|
||||
"**/.pnpm-lock.json",
|
||||
".vscode",
|
||||
"megalinter",
|
||||
"package-lock.json",
|
||||
"report"
|
||||
],
|
||||
"language": "en",
|
||||
"noConfigSearch": true,
|
||||
"words": ["megalinter", "oxsecurity"],
|
||||
"version": "0.2"
|
||||
}
|
||||
|
|
|
|||
110
.eslintrc.json
110
.eslintrc.json
|
|
@ -1,58 +1,58 @@
|
|||
{
|
||||
"root": true,
|
||||
"env": {
|
||||
"es6": true
|
||||
},
|
||||
"parser": "@typescript-eslint/parser",
|
||||
"parserOptions": {
|
||||
"project": ["./tsconfig.json", "./tsconfig.client.json"],
|
||||
"ecmaVersion": 2020,
|
||||
"sourceType": "module"
|
||||
},
|
||||
"plugins": ["@typescript-eslint", "unicorn"],
|
||||
"extends": [
|
||||
"eslint:recommended",
|
||||
"plugin:import/recommended",
|
||||
"plugin:import/typescript",
|
||||
"plugin:node/recommended",
|
||||
"plugin:promise/recommended",
|
||||
"plugin:unicorn/recommended",
|
||||
"plugin:@typescript-eslint/recommended"
|
||||
"root": true,
|
||||
"env": {
|
||||
"es6": true
|
||||
},
|
||||
"parser": "@typescript-eslint/parser",
|
||||
"parserOptions": {
|
||||
"project": ["./tsconfig.json", "./tsconfig.client.json"],
|
||||
"ecmaVersion": 2020,
|
||||
"sourceType": "module"
|
||||
},
|
||||
"plugins": ["@typescript-eslint", "unicorn"],
|
||||
"extends": [
|
||||
"eslint:recommended",
|
||||
"plugin:import/recommended",
|
||||
"plugin:import/typescript",
|
||||
"plugin:node/recommended",
|
||||
"plugin:promise/recommended",
|
||||
"plugin:unicorn/recommended",
|
||||
"plugin:@typescript-eslint/recommended"
|
||||
],
|
||||
"rules": {
|
||||
"@typescript-eslint/no-extra-semi": "off",
|
||||
"node/no-missing-import": "off",
|
||||
"node/no-unpublished-import": "off",
|
||||
"unicorn/consistent-function-scoping": "warn",
|
||||
"unicorn/empty-brace-spaces": "off",
|
||||
"unicorn/filename-case": [
|
||||
"error",
|
||||
{
|
||||
"case": "camelCase",
|
||||
"ignore": ["DB", "URL"]
|
||||
}
|
||||
],
|
||||
"rules": {
|
||||
"node/no-missing-import": "off",
|
||||
"node/no-unpublished-import": "off",
|
||||
"unicorn/consistent-function-scoping": "warn",
|
||||
"unicorn/empty-brace-spaces": "off",
|
||||
"unicorn/filename-case": [
|
||||
"error",
|
||||
{
|
||||
"case": "camelCase",
|
||||
"ignore": ["DB", "URL"]
|
||||
}
|
||||
],
|
||||
"unicorn/prefer-node-protocol": "off",
|
||||
"unicorn/prevent-abbreviations": [
|
||||
"error",
|
||||
{
|
||||
"replacements": {
|
||||
"def": {
|
||||
"definition": true
|
||||
},
|
||||
"ele": {
|
||||
"element": true
|
||||
},
|
||||
"eles": {
|
||||
"elements": true
|
||||
},
|
||||
"fns": {
|
||||
"functions": true
|
||||
},
|
||||
"res": {
|
||||
"result": false
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
"unicorn/prevent-abbreviations": [
|
||||
"error",
|
||||
{
|
||||
"replacements": {
|
||||
"def": {
|
||||
"definition": true
|
||||
},
|
||||
"ele": {
|
||||
"element": true
|
||||
},
|
||||
"eles": {
|
||||
"elements": true
|
||||
},
|
||||
"fns": {
|
||||
"functions": true
|
||||
},
|
||||
"res": {
|
||||
"result": false
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
|
|||
26
.jscpd.json
26
.jscpd.json
|
|
@ -1,15 +1,15 @@
|
|||
{
|
||||
"threshold": 0,
|
||||
"reporters": ["html", "markdown"],
|
||||
"ignore": [
|
||||
"**/node_modules/**",
|
||||
"**/.git/**",
|
||||
"**/.rbenv/**",
|
||||
"**/.venv/**",
|
||||
"**/*cache*/**",
|
||||
"**/.github/**",
|
||||
"**/.idea/**",
|
||||
"**/report/**",
|
||||
"**/*.svg"
|
||||
]
|
||||
"threshold": 0,
|
||||
"reporters": ["html", "markdown"],
|
||||
"ignore": [
|
||||
"**/node_modules/**",
|
||||
"**/.git/**",
|
||||
"**/.rbenv/**",
|
||||
"**/.venv/**",
|
||||
"**/*cache*/**",
|
||||
"**/.github/**",
|
||||
"**/.idea/**",
|
||||
"**/report/**",
|
||||
"**/*.svg"
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
{
|
||||
"reject": ["@fortawesome/fontawesome-free"]
|
||||
"reject": ["@fortawesome/fontawesome-free"]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
{
|
||||
"trailingComma": "none",
|
||||
"tabWidth": 4,
|
||||
"semi": true,
|
||||
"singleQuote": false,
|
||||
"printWidth": 110
|
||||
"trailingComma": "none",
|
||||
"tabWidth": 2,
|
||||
"semi": false,
|
||||
"singleQuote": true
|
||||
}
|
||||
|
|
|
|||
153
app.js
153
app.js
|
|
@ -1,44 +1,44 @@
|
|||
import createError from "http-errors";
|
||||
import express from "express";
|
||||
import compression from "compression";
|
||||
import path from "node:path";
|
||||
import cookieParser from "cookie-parser";
|
||||
import csurf from "csurf";
|
||||
import rateLimit from "express-rate-limit";
|
||||
import session from "express-session";
|
||||
import FileStore from "session-file-store";
|
||||
import * as permissionHandlers from "./handlers/permissions.js";
|
||||
import routerLogin from "./routes/login.js";
|
||||
import routerDashboard from "./routes/dashboard.js";
|
||||
import routerApi from "./routes/api.js";
|
||||
import routerPrint from "./routes/print.js";
|
||||
import routerMaps from "./routes/maps.js";
|
||||
import routerLots from "./routes/lots.js";
|
||||
import routerLotOccupancies from "./routes/lotOccupancies.js";
|
||||
import routerWorkOrders from "./routes/workOrders.js";
|
||||
import routerReports from "./routes/reports.js";
|
||||
import routerAdmin from "./routes/admin.js";
|
||||
import * as configFunctions from "./helpers/functions.config.js";
|
||||
import * as printFunctions from "./helpers/functions.print.js";
|
||||
import * as dateTimeFns from "@cityssm/expressjs-server-js/dateTimeFns.js";
|
||||
import * as stringFns from "@cityssm/expressjs-server-js/stringFns.js";
|
||||
import * as htmlFns from "@cityssm/expressjs-server-js/htmlFns.js";
|
||||
import { version } from "./version.js";
|
||||
import * as databaseInitializer from "./helpers/initializer.database.js";
|
||||
import { apiGetHandler } from "./handlers/permissions.js";
|
||||
import { getSafeRedirectURL } from "./helpers/functions.authentication.js";
|
||||
import debug from "debug";
|
||||
const debugApp = debug("lot-occupancy-system:app");
|
||||
import createError from 'http-errors';
|
||||
import express from 'express';
|
||||
import compression from 'compression';
|
||||
import path from 'node:path';
|
||||
import cookieParser from 'cookie-parser';
|
||||
import csurf from 'csurf';
|
||||
import rateLimit from 'express-rate-limit';
|
||||
import session from 'express-session';
|
||||
import FileStore from 'session-file-store';
|
||||
import * as permissionHandlers from './handlers/permissions.js';
|
||||
import routerLogin from './routes/login.js';
|
||||
import routerDashboard from './routes/dashboard.js';
|
||||
import routerApi from './routes/api.js';
|
||||
import routerPrint from './routes/print.js';
|
||||
import routerMaps from './routes/maps.js';
|
||||
import routerLots from './routes/lots.js';
|
||||
import routerLotOccupancies from './routes/lotOccupancies.js';
|
||||
import routerWorkOrders from './routes/workOrders.js';
|
||||
import routerReports from './routes/reports.js';
|
||||
import routerAdmin from './routes/admin.js';
|
||||
import * as configFunctions from './helpers/functions.config.js';
|
||||
import * as printFunctions from './helpers/functions.print.js';
|
||||
import * as dateTimeFns from '@cityssm/expressjs-server-js/dateTimeFns.js';
|
||||
import * as stringFns from '@cityssm/expressjs-server-js/stringFns.js';
|
||||
import * as htmlFns from '@cityssm/expressjs-server-js/htmlFns.js';
|
||||
import { version } from './version.js';
|
||||
import * as databaseInitializer from './helpers/initializer.database.js';
|
||||
import { apiGetHandler } from './handlers/permissions.js';
|
||||
import { getSafeRedirectURL } from './helpers/functions.authentication.js';
|
||||
import debug from 'debug';
|
||||
const debugApp = debug('lot-occupancy-system:app');
|
||||
databaseInitializer.initializeDatabase();
|
||||
const __dirname = ".";
|
||||
const __dirname = '.';
|
||||
export const app = express();
|
||||
app.disable("X-Powered-By");
|
||||
if (!configFunctions.getProperty("reverseProxy.disableEtag")) {
|
||||
app.set("etag", false);
|
||||
app.disable('X-Powered-By');
|
||||
if (!configFunctions.getProperty('reverseProxy.disableEtag')) {
|
||||
app.set('etag', false);
|
||||
}
|
||||
app.set("views", path.join(__dirname, "views"));
|
||||
app.set("view engine", "ejs");
|
||||
if (!configFunctions.getProperty("reverseProxy.disableCompression")) {
|
||||
app.set('views', path.join(__dirname, 'views'));
|
||||
app.set('view engine', 'ejs');
|
||||
if (!configFunctions.getProperty('reverseProxy.disableCompression')) {
|
||||
app.use(compression());
|
||||
}
|
||||
app.use((request, _response, next) => {
|
||||
|
|
@ -53,38 +53,37 @@ app.use(cookieParser());
|
|||
app.use(csurf({
|
||||
cookie: true
|
||||
}));
|
||||
const limiter = rateLimit({
|
||||
windowMs: 1000,
|
||||
max: 25 * Math.max(3, configFunctions.getProperty("users.canLogin").length)
|
||||
});
|
||||
app.use(limiter);
|
||||
const urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix");
|
||||
if (urlPrefix !== "") {
|
||||
debugApp("urlPrefix = " + urlPrefix);
|
||||
app.use(rateLimit({
|
||||
windowMs: 10000,
|
||||
max: 200
|
||||
}));
|
||||
const urlPrefix = configFunctions.getProperty('reverseProxy.urlPrefix');
|
||||
if (urlPrefix !== '') {
|
||||
debugApp('urlPrefix = ' + urlPrefix);
|
||||
}
|
||||
app.use(urlPrefix, express.static(path.join("public")));
|
||||
app.use(urlPrefix + "/lib/bulma-calendar", express.static(path.join("node_modules", "bulma-calendar", "dist")));
|
||||
app.use(urlPrefix + "/lib/cityssm-bulma-js", express.static(path.join("node_modules", "@cityssm", "bulma-js", "dist")));
|
||||
app.use(urlPrefix + "/lib/cityssm-bulma-webapp-js", express.static(path.join("node_modules", "@cityssm", "bulma-webapp-js")));
|
||||
app.use(urlPrefix + "/lib/fa", express.static(path.join("node_modules", "@fortawesome", "fontawesome-free")));
|
||||
app.use(urlPrefix + "/lib/leaflet", express.static(path.join("node_modules", "leaflet", "dist")));
|
||||
app.use(urlPrefix + "/lib/randomcolor", express.static(path.join("node_modules", "randomcolor")));
|
||||
const sessionCookieName = configFunctions.getProperty("session.cookieName");
|
||||
app.use(urlPrefix, express.static(path.join('public')));
|
||||
app.use(urlPrefix + '/lib/bulma-calendar', express.static(path.join('node_modules', 'bulma-calendar', 'dist')));
|
||||
app.use(urlPrefix + '/lib/cityssm-bulma-js', express.static(path.join('node_modules', '@cityssm', 'bulma-js', 'dist')));
|
||||
app.use(urlPrefix + '/lib/cityssm-bulma-webapp-js', express.static(path.join('node_modules', '@cityssm', 'bulma-webapp-js')));
|
||||
app.use(urlPrefix + '/lib/fa', express.static(path.join('node_modules', '@fortawesome', 'fontawesome-free')));
|
||||
app.use(urlPrefix + '/lib/leaflet', express.static(path.join('node_modules', 'leaflet', 'dist')));
|
||||
app.use(urlPrefix + '/lib/randomcolor', express.static(path.join('node_modules', 'randomcolor')));
|
||||
const sessionCookieName = configFunctions.getProperty('session.cookieName');
|
||||
const FileStoreSession = FileStore(session);
|
||||
app.use(session({
|
||||
store: new FileStoreSession({
|
||||
path: "./data/sessions",
|
||||
logFn: debug("lot-occupancy-system:session"),
|
||||
path: './data/sessions',
|
||||
logFn: debug('lot-occupancy-system:session'),
|
||||
retries: 20
|
||||
}),
|
||||
name: sessionCookieName,
|
||||
secret: configFunctions.getProperty("session.secret"),
|
||||
secret: configFunctions.getProperty('session.secret'),
|
||||
resave: true,
|
||||
saveUninitialized: false,
|
||||
rolling: true,
|
||||
cookie: {
|
||||
maxAge: configFunctions.getProperty("session.maxAgeMillis"),
|
||||
sameSite: "strict"
|
||||
maxAge: configFunctions.getProperty('session.maxAgeMillis'),
|
||||
sameSite: 'strict'
|
||||
}
|
||||
}));
|
||||
app.use((request, response, next) => {
|
||||
|
|
@ -109,38 +108,38 @@ app.use((request, response, next) => {
|
|||
response.locals.dateTimeFunctions = dateTimeFns;
|
||||
response.locals.stringFunctions = stringFns;
|
||||
response.locals.htmlFunctions = htmlFns;
|
||||
response.locals.urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix");
|
||||
response.locals.urlPrefix = configFunctions.getProperty('reverseProxy.urlPrefix');
|
||||
next();
|
||||
});
|
||||
app.get(urlPrefix + "/", sessionChecker, (_request, response) => {
|
||||
response.redirect(urlPrefix + "/dashboard");
|
||||
app.get(urlPrefix + '/', sessionChecker, (_request, response) => {
|
||||
response.redirect(urlPrefix + '/dashboard');
|
||||
});
|
||||
app.use(urlPrefix + "/dashboard", sessionChecker, routerDashboard);
|
||||
app.use(urlPrefix + "/api/:apiKey", apiGetHandler, routerApi);
|
||||
app.use(urlPrefix + "/print", sessionChecker, routerPrint);
|
||||
app.use(urlPrefix + "/maps", sessionChecker, routerMaps);
|
||||
app.use(urlPrefix + "/lots", sessionChecker, routerLots);
|
||||
app.use(urlPrefix + "/lotOccupancies", sessionChecker, routerLotOccupancies);
|
||||
app.use(urlPrefix + "/workOrders", sessionChecker, routerWorkOrders);
|
||||
app.use(urlPrefix + "/reports", sessionChecker, routerReports);
|
||||
app.use(urlPrefix + "/admin", sessionChecker, permissionHandlers.adminGetHandler, routerAdmin);
|
||||
app.all(urlPrefix + "/keepAlive", (_request, response) => {
|
||||
app.use(urlPrefix + '/dashboard', sessionChecker, routerDashboard);
|
||||
app.use(urlPrefix + '/api/:apiKey', apiGetHandler, routerApi);
|
||||
app.use(urlPrefix + '/print', sessionChecker, routerPrint);
|
||||
app.use(urlPrefix + '/maps', sessionChecker, routerMaps);
|
||||
app.use(urlPrefix + '/lots', sessionChecker, routerLots);
|
||||
app.use(urlPrefix + '/lotOccupancies', sessionChecker, routerLotOccupancies);
|
||||
app.use(urlPrefix + '/workOrders', sessionChecker, routerWorkOrders);
|
||||
app.use(urlPrefix + '/reports', sessionChecker, routerReports);
|
||||
app.use(urlPrefix + '/admin', sessionChecker, permissionHandlers.adminGetHandler, routerAdmin);
|
||||
app.all(urlPrefix + '/keepAlive', (_request, response) => {
|
||||
response.json(true);
|
||||
});
|
||||
app.use(urlPrefix + "/login", routerLogin);
|
||||
app.get(urlPrefix + "/logout", (request, response) => {
|
||||
app.use(urlPrefix + '/login', routerLogin);
|
||||
app.get(urlPrefix + '/logout', (request, response) => {
|
||||
if (request.session.user && request.cookies[sessionCookieName]) {
|
||||
request.session.destroy(() => {
|
||||
response.clearCookie(sessionCookieName);
|
||||
response.redirect(urlPrefix + "/");
|
||||
response.redirect(urlPrefix + '/');
|
||||
});
|
||||
}
|
||||
else {
|
||||
response.redirect(urlPrefix + "/login");
|
||||
response.redirect(urlPrefix + '/login');
|
||||
}
|
||||
});
|
||||
app.use((request, _response, next) => {
|
||||
debugApp(request.url);
|
||||
next(createError(404, "File not found."));
|
||||
next(createError(404, 'File not found.'));
|
||||
});
|
||||
export default app;
|
||||
|
|
|
|||
305
app.ts
305
app.ts
|
|
@ -1,189 +1,182 @@
|
|||
import createError from "http-errors";
|
||||
import express from "express";
|
||||
import createError from 'http-errors'
|
||||
import express from 'express'
|
||||
|
||||
import compression from "compression";
|
||||
import path from "node:path";
|
||||
import cookieParser from "cookie-parser";
|
||||
import csurf from "csurf";
|
||||
import rateLimit from "express-rate-limit";
|
||||
import compression from 'compression'
|
||||
import path from 'node:path'
|
||||
import cookieParser from 'cookie-parser'
|
||||
import csurf from 'csurf'
|
||||
import rateLimit from 'express-rate-limit'
|
||||
|
||||
import session from "express-session";
|
||||
import FileStore from "session-file-store";
|
||||
import session from 'express-session'
|
||||
import FileStore from 'session-file-store'
|
||||
|
||||
import * as permissionHandlers from "./handlers/permissions.js";
|
||||
import routerLogin from "./routes/login.js";
|
||||
import routerDashboard from "./routes/dashboard.js";
|
||||
import routerApi from "./routes/api.js";
|
||||
import routerPrint from "./routes/print.js";
|
||||
import routerMaps from "./routes/maps.js";
|
||||
import routerLots from "./routes/lots.js";
|
||||
import routerLotOccupancies from "./routes/lotOccupancies.js";
|
||||
import routerWorkOrders from "./routes/workOrders.js";
|
||||
import routerReports from "./routes/reports.js";
|
||||
import routerAdmin from "./routes/admin.js";
|
||||
import * as permissionHandlers from './handlers/permissions.js'
|
||||
import routerLogin from './routes/login.js'
|
||||
import routerDashboard from './routes/dashboard.js'
|
||||
import routerApi from './routes/api.js'
|
||||
import routerPrint from './routes/print.js'
|
||||
import routerMaps from './routes/maps.js'
|
||||
import routerLots from './routes/lots.js'
|
||||
import routerLotOccupancies from './routes/lotOccupancies.js'
|
||||
import routerWorkOrders from './routes/workOrders.js'
|
||||
import routerReports from './routes/reports.js'
|
||||
import routerAdmin from './routes/admin.js'
|
||||
|
||||
import * as configFunctions from "./helpers/functions.config.js";
|
||||
import * as printFunctions from "./helpers/functions.print.js";
|
||||
import * as dateTimeFns from "@cityssm/expressjs-server-js/dateTimeFns.js";
|
||||
import * as stringFns from "@cityssm/expressjs-server-js/stringFns.js";
|
||||
import * as htmlFns from "@cityssm/expressjs-server-js/htmlFns.js";
|
||||
import * as configFunctions from './helpers/functions.config.js'
|
||||
import * as printFunctions from './helpers/functions.print.js'
|
||||
import * as dateTimeFns from '@cityssm/expressjs-server-js/dateTimeFns.js'
|
||||
import * as stringFns from '@cityssm/expressjs-server-js/stringFns.js'
|
||||
import * as htmlFns from '@cityssm/expressjs-server-js/htmlFns.js'
|
||||
|
||||
import { version } from "./version.js";
|
||||
import { version } from './version.js'
|
||||
|
||||
import * as databaseInitializer from "./helpers/initializer.database.js";
|
||||
import * as databaseInitializer from './helpers/initializer.database.js'
|
||||
|
||||
import { apiGetHandler } from "./handlers/permissions.js";
|
||||
import { getSafeRedirectURL } from "./helpers/functions.authentication.js";
|
||||
import { apiGetHandler } from './handlers/permissions.js'
|
||||
import { getSafeRedirectURL } from './helpers/functions.authentication.js'
|
||||
|
||||
import debug from "debug";
|
||||
const debugApp = debug("lot-occupancy-system:app");
|
||||
import debug from 'debug'
|
||||
const debugApp = debug('lot-occupancy-system:app')
|
||||
|
||||
/*
|
||||
* INITALIZE THE DATABASE
|
||||
* INITIALIZE THE DATABASE
|
||||
*/
|
||||
|
||||
databaseInitializer.initializeDatabase();
|
||||
databaseInitializer.initializeDatabase()
|
||||
|
||||
/*
|
||||
* INITIALIZE APP
|
||||
*/
|
||||
|
||||
const __dirname = ".";
|
||||
const __dirname = '.'
|
||||
|
||||
export const app = express();
|
||||
export const app = express()
|
||||
|
||||
app.disable("X-Powered-By");
|
||||
app.disable('X-Powered-By')
|
||||
|
||||
if (!configFunctions.getProperty("reverseProxy.disableEtag")) {
|
||||
app.set("etag", false);
|
||||
if (!configFunctions.getProperty('reverseProxy.disableEtag')) {
|
||||
app.set('etag', false)
|
||||
}
|
||||
|
||||
// View engine setup
|
||||
app.set("views", path.join(__dirname, "views"));
|
||||
app.set("view engine", "ejs");
|
||||
app.set('views', path.join(__dirname, 'views'))
|
||||
app.set('view engine', 'ejs')
|
||||
|
||||
if (!configFunctions.getProperty("reverseProxy.disableCompression")) {
|
||||
app.use(compression());
|
||||
if (!configFunctions.getProperty('reverseProxy.disableCompression')) {
|
||||
app.use(compression())
|
||||
}
|
||||
|
||||
app.use((request, _response, next) => {
|
||||
debugApp(`${request.method} ${request.url}`);
|
||||
next();
|
||||
});
|
||||
debugApp(`${request.method} ${request.url}`)
|
||||
next()
|
||||
})
|
||||
|
||||
app.use(express.json());
|
||||
app.use(express.json())
|
||||
|
||||
app.use(
|
||||
express.urlencoded({
|
||||
extended: false
|
||||
})
|
||||
);
|
||||
express.urlencoded({
|
||||
extended: false
|
||||
})
|
||||
)
|
||||
|
||||
app.use(cookieParser());
|
||||
app.use(cookieParser())
|
||||
app.use(
|
||||
csurf({
|
||||
cookie: true
|
||||
})
|
||||
);
|
||||
csurf({
|
||||
cookie: true
|
||||
})
|
||||
)
|
||||
|
||||
/*
|
||||
* Rate Limiter
|
||||
*/
|
||||
|
||||
const limiter = rateLimit({
|
||||
windowMs: 1000,
|
||||
max: 25 * Math.max(3, configFunctions.getProperty("users.canLogin").length)
|
||||
});
|
||||
|
||||
app.use(limiter);
|
||||
app.use(
|
||||
rateLimit({
|
||||
windowMs: 10_000,
|
||||
max: 200
|
||||
})
|
||||
)
|
||||
|
||||
/*
|
||||
* STATIC ROUTES
|
||||
*/
|
||||
|
||||
const urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix");
|
||||
const urlPrefix = configFunctions.getProperty('reverseProxy.urlPrefix')
|
||||
|
||||
if (urlPrefix !== "") {
|
||||
debugApp("urlPrefix = " + urlPrefix);
|
||||
if (urlPrefix !== '') {
|
||||
debugApp('urlPrefix = ' + urlPrefix)
|
||||
}
|
||||
|
||||
app.use(urlPrefix, express.static(path.join("public")));
|
||||
app.use(urlPrefix, express.static(path.join('public')))
|
||||
|
||||
app.use(
|
||||
urlPrefix + "/lib/bulma-calendar",
|
||||
express.static(path.join("node_modules", "bulma-calendar", "dist"))
|
||||
);
|
||||
urlPrefix + '/lib/bulma-calendar',
|
||||
express.static(path.join('node_modules', 'bulma-calendar', 'dist'))
|
||||
)
|
||||
|
||||
app.use(
|
||||
urlPrefix + "/lib/cityssm-bulma-js",
|
||||
express.static(path.join("node_modules", "@cityssm", "bulma-js", "dist"))
|
||||
);
|
||||
urlPrefix + '/lib/cityssm-bulma-js',
|
||||
express.static(path.join('node_modules', '@cityssm', 'bulma-js', 'dist'))
|
||||
)
|
||||
|
||||
app.use(
|
||||
urlPrefix + "/lib/cityssm-bulma-webapp-js",
|
||||
express.static(path.join("node_modules", "@cityssm", "bulma-webapp-js"))
|
||||
);
|
||||
urlPrefix + '/lib/cityssm-bulma-webapp-js',
|
||||
express.static(path.join('node_modules', '@cityssm', 'bulma-webapp-js'))
|
||||
)
|
||||
|
||||
app.use(
|
||||
urlPrefix + "/lib/fa",
|
||||
express.static(path.join("node_modules", "@fortawesome", "fontawesome-free"))
|
||||
);
|
||||
app.use(urlPrefix + '/lib/fa', express.static(path.join('node_modules', '@fortawesome', 'fontawesome-free')))
|
||||
|
||||
app.use(urlPrefix + "/lib/leaflet", express.static(path.join("node_modules", "leaflet", "dist")));
|
||||
app.use(urlPrefix + '/lib/leaflet', express.static(path.join('node_modules', 'leaflet', 'dist')))
|
||||
|
||||
app.use(urlPrefix + "/lib/randomcolor", express.static(path.join("node_modules", "randomcolor")));
|
||||
app.use(urlPrefix + '/lib/randomcolor', express.static(path.join('node_modules', 'randomcolor')))
|
||||
|
||||
/*
|
||||
* SESSION MANAGEMENT
|
||||
*/
|
||||
|
||||
const sessionCookieName: string = configFunctions.getProperty("session.cookieName");
|
||||
const sessionCookieName: string = configFunctions.getProperty('session.cookieName')
|
||||
|
||||
const FileStoreSession = FileStore(session);
|
||||
const FileStoreSession = FileStore(session)
|
||||
|
||||
// Initialize session
|
||||
app.use(
|
||||
session({
|
||||
store: new FileStoreSession({
|
||||
path: "./data/sessions",
|
||||
logFn: debug("lot-occupancy-system:session"),
|
||||
retries: 20
|
||||
}),
|
||||
name: sessionCookieName,
|
||||
secret: configFunctions.getProperty("session.secret"),
|
||||
resave: true,
|
||||
saveUninitialized: false,
|
||||
rolling: true,
|
||||
cookie: {
|
||||
maxAge: configFunctions.getProperty("session.maxAgeMillis"),
|
||||
sameSite: "strict"
|
||||
}
|
||||
})
|
||||
);
|
||||
session({
|
||||
store: new FileStoreSession({
|
||||
path: './data/sessions',
|
||||
logFn: debug('lot-occupancy-system:session'),
|
||||
retries: 20
|
||||
}),
|
||||
name: sessionCookieName,
|
||||
secret: configFunctions.getProperty('session.secret'),
|
||||
resave: true,
|
||||
saveUninitialized: false,
|
||||
rolling: true,
|
||||
cookie: {
|
||||
maxAge: configFunctions.getProperty('session.maxAgeMillis'),
|
||||
sameSite: 'strict'
|
||||
}
|
||||
})
|
||||
)
|
||||
|
||||
// Clear cookie if no corresponding session
|
||||
app.use((request, response, next) => {
|
||||
if (request.cookies[sessionCookieName] && !request.session.user) {
|
||||
response.clearCookie(sessionCookieName);
|
||||
}
|
||||
if (request.cookies[sessionCookieName] && !request.session.user) {
|
||||
response.clearCookie(sessionCookieName)
|
||||
}
|
||||
|
||||
next();
|
||||
});
|
||||
next()
|
||||
})
|
||||
|
||||
// Redirect logged in users
|
||||
const sessionChecker = (
|
||||
request: express.Request,
|
||||
response: express.Response,
|
||||
next: express.NextFunction
|
||||
) => {
|
||||
if (request.session.user && request.cookies[sessionCookieName]) {
|
||||
return next();
|
||||
}
|
||||
const sessionChecker = (request: express.Request, response: express.Response, next: express.NextFunction) => {
|
||||
if (request.session.user && request.cookies[sessionCookieName]) {
|
||||
return next()
|
||||
}
|
||||
|
||||
const redirectUrl = getSafeRedirectURL(request.originalUrl);
|
||||
const redirectUrl = getSafeRedirectURL(request.originalUrl)
|
||||
|
||||
return response.redirect(`${urlPrefix}/login?redirect=${encodeURIComponent(redirectUrl)}`);
|
||||
};
|
||||
return response.redirect(`${urlPrefix}/login?redirect=${encodeURIComponent(redirectUrl)}`)
|
||||
}
|
||||
|
||||
/*
|
||||
* ROUTES
|
||||
|
|
@ -192,60 +185,60 @@ const sessionChecker = (
|
|||
// Make the user and config objects available to the templates
|
||||
|
||||
app.use((request, response, next) => {
|
||||
response.locals.buildNumber = version;
|
||||
response.locals.buildNumber = version
|
||||
|
||||
response.locals.user = request.session.user;
|
||||
response.locals.csrfToken = request.csrfToken();
|
||||
response.locals.user = request.session.user
|
||||
response.locals.csrfToken = request.csrfToken()
|
||||
|
||||
response.locals.configFunctions = configFunctions;
|
||||
response.locals.printFunctions = printFunctions;
|
||||
response.locals.dateTimeFunctions = dateTimeFns;
|
||||
response.locals.stringFunctions = stringFns;
|
||||
response.locals.htmlFunctions = htmlFns;
|
||||
response.locals.configFunctions = configFunctions
|
||||
response.locals.printFunctions = printFunctions
|
||||
response.locals.dateTimeFunctions = dateTimeFns
|
||||
response.locals.stringFunctions = stringFns
|
||||
response.locals.htmlFunctions = htmlFns
|
||||
|
||||
response.locals.urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix");
|
||||
response.locals.urlPrefix = configFunctions.getProperty('reverseProxy.urlPrefix')
|
||||
|
||||
next();
|
||||
});
|
||||
next()
|
||||
})
|
||||
|
||||
app.get(urlPrefix + "/", sessionChecker, (_request, response) => {
|
||||
response.redirect(urlPrefix + "/dashboard");
|
||||
});
|
||||
app.get(urlPrefix + '/', sessionChecker, (_request, response) => {
|
||||
response.redirect(urlPrefix + '/dashboard')
|
||||
})
|
||||
|
||||
app.use(urlPrefix + "/dashboard", sessionChecker, routerDashboard);
|
||||
app.use(urlPrefix + '/dashboard', sessionChecker, routerDashboard)
|
||||
|
||||
app.use(urlPrefix + "/api/:apiKey", apiGetHandler, routerApi);
|
||||
app.use(urlPrefix + '/api/:apiKey', apiGetHandler, routerApi)
|
||||
|
||||
app.use(urlPrefix + "/print", sessionChecker, routerPrint);
|
||||
app.use(urlPrefix + "/maps", sessionChecker, routerMaps);
|
||||
app.use(urlPrefix + "/lots", sessionChecker, routerLots);
|
||||
app.use(urlPrefix + "/lotOccupancies", sessionChecker, routerLotOccupancies);
|
||||
app.use(urlPrefix + "/workOrders", sessionChecker, routerWorkOrders);
|
||||
app.use(urlPrefix + '/print', sessionChecker, routerPrint)
|
||||
app.use(urlPrefix + '/maps', sessionChecker, routerMaps)
|
||||
app.use(urlPrefix + '/lots', sessionChecker, routerLots)
|
||||
app.use(urlPrefix + '/lotOccupancies', sessionChecker, routerLotOccupancies)
|
||||
app.use(urlPrefix + '/workOrders', sessionChecker, routerWorkOrders)
|
||||
|
||||
app.use(urlPrefix + "/reports", sessionChecker, routerReports);
|
||||
app.use(urlPrefix + "/admin", sessionChecker, permissionHandlers.adminGetHandler, routerAdmin);
|
||||
app.use(urlPrefix + '/reports', sessionChecker, routerReports)
|
||||
app.use(urlPrefix + '/admin', sessionChecker, permissionHandlers.adminGetHandler, routerAdmin)
|
||||
|
||||
app.all(urlPrefix + "/keepAlive", (_request, response) => {
|
||||
response.json(true);
|
||||
});
|
||||
app.all(urlPrefix + '/keepAlive', (_request, response) => {
|
||||
response.json(true)
|
||||
})
|
||||
|
||||
app.use(urlPrefix + "/login", routerLogin);
|
||||
app.use(urlPrefix + '/login', routerLogin)
|
||||
|
||||
app.get(urlPrefix + "/logout", (request, response) => {
|
||||
if (request.session.user && request.cookies[sessionCookieName]) {
|
||||
request.session.destroy(() => {
|
||||
response.clearCookie(sessionCookieName);
|
||||
response.redirect(urlPrefix + "/");
|
||||
});
|
||||
} else {
|
||||
response.redirect(urlPrefix + "/login");
|
||||
}
|
||||
});
|
||||
app.get(urlPrefix + '/logout', (request, response) => {
|
||||
if (request.session.user && request.cookies[sessionCookieName]) {
|
||||
request.session.destroy(() => {
|
||||
response.clearCookie(sessionCookieName)
|
||||
response.redirect(urlPrefix + '/')
|
||||
})
|
||||
} else {
|
||||
response.redirect(urlPrefix + '/login')
|
||||
}
|
||||
})
|
||||
|
||||
// Catch 404 and forward to error handler
|
||||
app.use((request, _response, next) => {
|
||||
debugApp(request.url);
|
||||
next(createError(404, "File not found."));
|
||||
});
|
||||
debugApp(request.url)
|
||||
next(createError(404, 'File not found.'))
|
||||
})
|
||||
|
||||
export default app;
|
||||
export default app
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
import { defineConfig } from "cypress";
|
||||
import { defineConfig } from 'cypress';
|
||||
export default defineConfig({
|
||||
e2e: {
|
||||
baseUrl: "http://localhost:7000",
|
||||
specPattern: "cypress/e2e/**/*.cy.ts",
|
||||
baseUrl: 'http://localhost:7000',
|
||||
specPattern: 'cypress/e2e/**/*.cy.ts',
|
||||
supportFile: false,
|
||||
projectId: "xya1fn"
|
||||
projectId: 'xya1fn'
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
import { defineConfig } from "cypress";
|
||||
import { defineConfig } from 'cypress'
|
||||
|
||||
export default defineConfig({
|
||||
e2e: {
|
||||
baseUrl: "http://localhost:7000",
|
||||
specPattern: "cypress/e2e/**/*.cy.ts",
|
||||
supportFile: false,
|
||||
projectId: "xya1fn"
|
||||
}
|
||||
});
|
||||
e2e: {
|
||||
baseUrl: 'http://localhost:7000',
|
||||
specPattern: 'cypress/e2e/**/*.cy.ts',
|
||||
supportFile: false,
|
||||
projectId: 'xya1fn'
|
||||
}
|
||||
})
|
||||
|
|
|
|||
|
|
@ -2,6 +2,6 @@
|
|||
"feeCategory": "Cypress Test - Fee Category",
|
||||
"feeName": "Cypress Test - Fee Name",
|
||||
"feeDescription": "Test Description",
|
||||
"feeAmount": 10.50,
|
||||
"feeAmount": 10.5,
|
||||
"quantityUnit": "units"
|
||||
}
|
||||
|
|
@ -1,10 +1,10 @@
|
|||
{
|
||||
"mapName": "Cypress Test - Holy Sepulchre",
|
||||
"mapDescription": "Operated by the City of Sault Ste. Marie" ,
|
||||
"mapAddress1": "Fourth Line and Peoples Road",
|
||||
"mapAddress2": "27 Fourth Line East",
|
||||
"mapPostalCode": "P6A 5K8",
|
||||
"mapPhoneNumber": "705-759-5336",
|
||||
"mapLatitude": 46.56874795,
|
||||
"mapLongitude": -84.34842824
|
||||
"mapName": "Cypress Test - Holy Sepulchre",
|
||||
"mapDescription": "Operated by the City of Sault Ste. Marie",
|
||||
"mapAddress1": "Fourth Line and Peoples Road",
|
||||
"mapAddress2": "27 Fourth Line East",
|
||||
"mapPostalCode": "P6A 5K8",
|
||||
"mapPhoneNumber": "705-759-5336",
|
||||
"mapLatitude": 46.56874795,
|
||||
"mapLongitude": -84.34842824
|
||||
}
|
||||
62
gulpfile.js
62
gulpfile.js
|
|
@ -1,59 +1,59 @@
|
|||
import gulp from "gulp";
|
||||
import changed from "gulp-changed";
|
||||
import minify from "gulp-minify";
|
||||
import include from "gulp-include";
|
||||
import dartSass from "sass";
|
||||
import gulpSass from "gulp-sass";
|
||||
import gulp from 'gulp';
|
||||
import changed from 'gulp-changed';
|
||||
import minify from 'gulp-minify';
|
||||
import include from 'gulp-include';
|
||||
import dartSass from 'sass';
|
||||
import gulpSass from 'gulp-sass';
|
||||
const sass = gulpSass(dartSass);
|
||||
const publicSCSSDestination = "public/stylesheets";
|
||||
const publicSCSSDestination = 'public/stylesheets';
|
||||
const publicSCSSFunction = () => {
|
||||
return gulp
|
||||
.src("public-scss/*.scss")
|
||||
.pipe(sass({ outputStyle: "compressed", includePaths: ["node_modules"] }).on("error", sass.logError))
|
||||
.src('public-scss/*.scss')
|
||||
.pipe(sass({ outputStyle: 'compressed', includePaths: ['node_modules'] }).on('error', sass.logError))
|
||||
.pipe(gulp.dest(publicSCSSDestination));
|
||||
};
|
||||
gulp.task("public-scss", publicSCSSFunction);
|
||||
const publicJavascriptsDestination = "public/javascripts";
|
||||
gulp.task('public-scss', publicSCSSFunction);
|
||||
const publicJavascriptsDestination = 'public/javascripts';
|
||||
const publicJavascriptsMinFunction = () => {
|
||||
return gulp
|
||||
.src("public-typescript/*.js", { allowEmpty: true })
|
||||
.src('public-typescript/*.js', { allowEmpty: true })
|
||||
.pipe(changed(publicJavascriptsDestination, {
|
||||
extension: ".min.js"
|
||||
extension: '.min.js'
|
||||
}))
|
||||
.pipe(minify({ noSource: true, ext: { min: ".min.js" } }))
|
||||
.pipe(minify({ noSource: true, ext: { min: '.min.js' } }))
|
||||
.pipe(gulp.dest(publicJavascriptsDestination));
|
||||
};
|
||||
const publicJavascriptsAdminTablesFunction = () => {
|
||||
return gulp
|
||||
.src("public-typescript/adminTables/adminTables.js")
|
||||
.src('public-typescript/adminTables/adminTables.js')
|
||||
.pipe(include())
|
||||
.pipe(gulp.dest("public-typescript"));
|
||||
.pipe(gulp.dest('public-typescript'));
|
||||
};
|
||||
const publicJavascriptsLotOccupancyEditFunction = () => {
|
||||
return gulp
|
||||
.src("public-typescript/lotOccupancyEdit/lotOccupancyEdit.js")
|
||||
.src('public-typescript/lotOccupancyEdit/lotOccupancyEdit.js')
|
||||
.pipe(include())
|
||||
.pipe(gulp.dest("public-typescript"));
|
||||
.pipe(gulp.dest('public-typescript'));
|
||||
};
|
||||
const publicJavascriptsWorkOrderEditFunction = () => {
|
||||
return gulp
|
||||
.src("public-typescript/workOrderEdit/workOrderEdit.js")
|
||||
.src('public-typescript/workOrderEdit/workOrderEdit.js')
|
||||
.pipe(include())
|
||||
.pipe(gulp.dest("public-typescript"));
|
||||
.pipe(gulp.dest('public-typescript'));
|
||||
};
|
||||
gulp.task("public-javascript-adminTables", publicJavascriptsAdminTablesFunction);
|
||||
gulp.task("public-javascript-lotOccupancyEdit", publicJavascriptsLotOccupancyEditFunction);
|
||||
gulp.task("public-javascript-workOrderEdit", publicJavascriptsWorkOrderEditFunction);
|
||||
gulp.task("public-javascript-min", publicJavascriptsMinFunction);
|
||||
gulp.task('public-javascript-adminTables', publicJavascriptsAdminTablesFunction);
|
||||
gulp.task('public-javascript-lotOccupancyEdit', publicJavascriptsLotOccupancyEditFunction);
|
||||
gulp.task('public-javascript-workOrderEdit', publicJavascriptsWorkOrderEditFunction);
|
||||
gulp.task('public-javascript-min', publicJavascriptsMinFunction);
|
||||
const watchFunction = () => {
|
||||
gulp.watch("public-scss/*.scss", publicSCSSFunction);
|
||||
gulp.watch("public-typescript/adminTables/*.js", publicJavascriptsAdminTablesFunction);
|
||||
gulp.watch("public-typescript/lotOccupancyEdit/*.js", publicJavascriptsLotOccupancyEditFunction);
|
||||
gulp.watch("public-typescript/workOrderEdit/*.js", publicJavascriptsWorkOrderEditFunction);
|
||||
gulp.watch("public-typescript/*.js", publicJavascriptsMinFunction);
|
||||
gulp.watch('public-scss/*.scss', publicSCSSFunction);
|
||||
gulp.watch('public-typescript/adminTables/*.js', publicJavascriptsAdminTablesFunction);
|
||||
gulp.watch('public-typescript/lotOccupancyEdit/*.js', publicJavascriptsLotOccupancyEditFunction);
|
||||
gulp.watch('public-typescript/workOrderEdit/*.js', publicJavascriptsWorkOrderEditFunction);
|
||||
gulp.watch('public-typescript/*.js', publicJavascriptsMinFunction);
|
||||
};
|
||||
gulp.task("watch", watchFunction);
|
||||
gulp.task("default", () => {
|
||||
gulp.task('watch', watchFunction);
|
||||
gulp.task('default', () => {
|
||||
publicJavascriptsAdminTablesFunction();
|
||||
publicJavascriptsLotOccupancyEditFunction();
|
||||
publicJavascriptsWorkOrderEditFunction();
|
||||
|
|
|
|||
126
gulpfile.ts
126
gulpfile.ts
|
|
@ -1,110 +1,102 @@
|
|||
/* eslint-disable node/no-unpublished-import */
|
||||
|
||||
import gulp from "gulp";
|
||||
import changed from "gulp-changed";
|
||||
import minify from "gulp-minify";
|
||||
import include from "gulp-include";
|
||||
import gulp from 'gulp'
|
||||
import changed from 'gulp-changed'
|
||||
import minify from 'gulp-minify'
|
||||
import include from 'gulp-include'
|
||||
|
||||
import dartSass from "sass";
|
||||
import gulpSass from "gulp-sass";
|
||||
const sass = gulpSass(dartSass);
|
||||
import dartSass from 'sass'
|
||||
import gulpSass from 'gulp-sass'
|
||||
const sass = gulpSass(dartSass)
|
||||
|
||||
/*
|
||||
* Compile SASS
|
||||
*/
|
||||
|
||||
const publicSCSSDestination = "public/stylesheets";
|
||||
const publicSCSSDestination = 'public/stylesheets'
|
||||
|
||||
const publicSCSSFunction = () => {
|
||||
return gulp
|
||||
.src("public-scss/*.scss")
|
||||
.pipe(
|
||||
sass({ outputStyle: "compressed", includePaths: ["node_modules"] }).on(
|
||||
"error",
|
||||
sass.logError
|
||||
)
|
||||
)
|
||||
.pipe(gulp.dest(publicSCSSDestination));
|
||||
};
|
||||
return gulp
|
||||
.src('public-scss/*.scss')
|
||||
.pipe(sass({ outputStyle: 'compressed', includePaths: ['node_modules'] }).on('error', sass.logError))
|
||||
.pipe(gulp.dest(publicSCSSDestination))
|
||||
}
|
||||
|
||||
gulp.task("public-scss", publicSCSSFunction);
|
||||
gulp.task('public-scss', publicSCSSFunction)
|
||||
|
||||
/*
|
||||
* Minify public/javascripts
|
||||
*/
|
||||
|
||||
const publicJavascriptsDestination = "public/javascripts";
|
||||
const publicJavascriptsDestination = 'public/javascripts'
|
||||
|
||||
const publicJavascriptsMinFunction = () => {
|
||||
return gulp
|
||||
.src("public-typescript/*.js", { allowEmpty: true })
|
||||
.pipe(
|
||||
changed(publicJavascriptsDestination, {
|
||||
extension: ".min.js"
|
||||
})
|
||||
)
|
||||
.pipe(minify({ noSource: true, ext: { min: ".min.js" } }))
|
||||
.pipe(gulp.dest(publicJavascriptsDestination));
|
||||
};
|
||||
return gulp
|
||||
.src('public-typescript/*.js', { allowEmpty: true })
|
||||
.pipe(
|
||||
changed(publicJavascriptsDestination, {
|
||||
extension: '.min.js'
|
||||
})
|
||||
)
|
||||
.pipe(minify({ noSource: true, ext: { min: '.min.js' } }))
|
||||
.pipe(gulp.dest(publicJavascriptsDestination))
|
||||
}
|
||||
|
||||
const publicJavascriptsAdminTablesFunction = () => {
|
||||
return gulp
|
||||
.src("public-typescript/adminTables/adminTables.js")
|
||||
.pipe(include())
|
||||
.pipe(gulp.dest("public-typescript"));
|
||||
};
|
||||
return gulp
|
||||
.src('public-typescript/adminTables/adminTables.js')
|
||||
.pipe(include())
|
||||
.pipe(gulp.dest('public-typescript'))
|
||||
}
|
||||
|
||||
const publicJavascriptsLotOccupancyEditFunction = () => {
|
||||
return gulp
|
||||
.src("public-typescript/lotOccupancyEdit/lotOccupancyEdit.js")
|
||||
.pipe(include())
|
||||
.pipe(gulp.dest("public-typescript"));
|
||||
};
|
||||
return gulp
|
||||
.src('public-typescript/lotOccupancyEdit/lotOccupancyEdit.js')
|
||||
.pipe(include())
|
||||
.pipe(gulp.dest('public-typescript'))
|
||||
}
|
||||
|
||||
const publicJavascriptsWorkOrderEditFunction = () => {
|
||||
return gulp
|
||||
.src("public-typescript/workOrderEdit/workOrderEdit.js")
|
||||
.pipe(include())
|
||||
.pipe(gulp.dest("public-typescript"));
|
||||
};
|
||||
return gulp
|
||||
.src('public-typescript/workOrderEdit/workOrderEdit.js')
|
||||
.pipe(include())
|
||||
.pipe(gulp.dest('public-typescript'))
|
||||
}
|
||||
|
||||
gulp.task("public-javascript-adminTables", publicJavascriptsAdminTablesFunction);
|
||||
gulp.task("public-javascript-lotOccupancyEdit", publicJavascriptsLotOccupancyEditFunction);
|
||||
gulp.task("public-javascript-workOrderEdit", publicJavascriptsWorkOrderEditFunction);
|
||||
gulp.task("public-javascript-min", publicJavascriptsMinFunction);
|
||||
gulp.task('public-javascript-adminTables', publicJavascriptsAdminTablesFunction)
|
||||
gulp.task('public-javascript-lotOccupancyEdit', publicJavascriptsLotOccupancyEditFunction)
|
||||
gulp.task('public-javascript-workOrderEdit', publicJavascriptsWorkOrderEditFunction)
|
||||
gulp.task('public-javascript-min', publicJavascriptsMinFunction)
|
||||
|
||||
/*
|
||||
* Watch
|
||||
*/
|
||||
|
||||
const watchFunction = () => {
|
||||
gulp.watch("public-scss/*.scss", publicSCSSFunction);
|
||||
gulp.watch('public-scss/*.scss', publicSCSSFunction)
|
||||
|
||||
gulp.watch("public-typescript/adminTables/*.js", publicJavascriptsAdminTablesFunction);
|
||||
gulp.watch('public-typescript/adminTables/*.js', publicJavascriptsAdminTablesFunction)
|
||||
|
||||
gulp.watch(
|
||||
"public-typescript/lotOccupancyEdit/*.js",
|
||||
publicJavascriptsLotOccupancyEditFunction
|
||||
);
|
||||
gulp.watch('public-typescript/lotOccupancyEdit/*.js', publicJavascriptsLotOccupancyEditFunction)
|
||||
|
||||
gulp.watch("public-typescript/workOrderEdit/*.js", publicJavascriptsWorkOrderEditFunction);
|
||||
gulp.watch('public-typescript/workOrderEdit/*.js', publicJavascriptsWorkOrderEditFunction)
|
||||
|
||||
gulp.watch("public-typescript/*.js", publicJavascriptsMinFunction);
|
||||
};
|
||||
gulp.watch('public-typescript/*.js', publicJavascriptsMinFunction)
|
||||
}
|
||||
|
||||
gulp.task("watch", watchFunction);
|
||||
gulp.task('watch', watchFunction)
|
||||
|
||||
/*
|
||||
* Initialize default
|
||||
*/
|
||||
|
||||
gulp.task("default", () => {
|
||||
publicJavascriptsAdminTablesFunction();
|
||||
publicJavascriptsLotOccupancyEditFunction();
|
||||
publicJavascriptsWorkOrderEditFunction();
|
||||
publicJavascriptsMinFunction();
|
||||
gulp.task('default', () => {
|
||||
publicJavascriptsAdminTablesFunction()
|
||||
publicJavascriptsLotOccupancyEditFunction()
|
||||
publicJavascriptsWorkOrderEditFunction()
|
||||
publicJavascriptsMinFunction()
|
||||
|
||||
publicSCSSFunction();
|
||||
publicSCSSFunction()
|
||||
|
||||
watchFunction();
|
||||
});
|
||||
watchFunction()
|
||||
})
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
import type { RequestHandler } from "express";
|
||||
import type { RequestHandler } from 'express';
|
||||
export declare const handler: RequestHandler;
|
||||
export default handler;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { getLots } from "../../helpers/lotOccupancyDB/getLots.js";
|
||||
import { getLots } from '../../helpers/lotOccupancyDB/getLots.js';
|
||||
export const handler = async (request, response) => {
|
||||
const result = getLots(request.body, {
|
||||
limit: request.body.limit,
|
||||
|
|
|
|||
|
|
@ -1,18 +1,18 @@
|
|||
import type { RequestHandler } from "express";
|
||||
import type { RequestHandler } from 'express';
|
||||
|
||||
import { getLots } from "../../helpers/lotOccupancyDB/getLots.js";
|
||||
import { getLots } from '../../helpers/lotOccupancyDB/getLots.js';
|
||||
|
||||
export const handler: RequestHandler = async (request, response) => {
|
||||
const result = getLots(request.body, {
|
||||
limit: request.body.limit,
|
||||
offset: request.body.offset
|
||||
});
|
||||
const result = getLots(request.body, {
|
||||
limit: request.body.limit,
|
||||
offset: request.body.offset
|
||||
});
|
||||
|
||||
response.json({
|
||||
count: result.count,
|
||||
offset: Number.parseInt(request.body.offset, 10),
|
||||
lots: result.lots
|
||||
});
|
||||
response.json({
|
||||
count: result.count,
|
||||
offset: Number.parseInt(request.body.offset, 10),
|
||||
lots: result.lots
|
||||
});
|
||||
};
|
||||
|
||||
export default handler;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { completeWorkOrderMilestone } from "../../helpers/lotOccupancyDB/completeWorkOrderMiletstone.js";
|
||||
import { completeWorkOrderMilestone } from "../../helpers/lotOccupancyDB/completeWorkOrderMilestone.js";
|
||||
import { getWorkOrderMilestones } from "../../helpers/lotOccupancyDB/getWorkOrderMilestones.js";
|
||||
export const handler = async (request, response) => {
|
||||
const success = completeWorkOrderMilestone({
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import type { RequestHandler } from "express";
|
||||
|
||||
import { completeWorkOrderMilestone } from "../../helpers/lotOccupancyDB/completeWorkOrderMiletstone.js";
|
||||
import { completeWorkOrderMilestone } from "../../helpers/lotOccupancyDB/completeWorkOrderMilestone.js";
|
||||
|
||||
import { getWorkOrderMilestones } from "../../helpers/lotOccupancyDB/getWorkOrderMilestones.js";
|
||||
|
||||
|
|
|
|||
|
|
@ -68,6 +68,7 @@ export function getLots(filters, options, connectedDatabase) {
|
|||
let lots = [];
|
||||
if (options.limit === -1 || count > 0) {
|
||||
database.function("userFn_lotNameSortName", configFunctions.getProperty("settings.lot.lotNameSortNameFunction"));
|
||||
sqlParameters.unshift(currentDate, currentDate);
|
||||
lots = database
|
||||
.prepare("select l.lotId, l.lotName," +
|
||||
" t.lotType," +
|
||||
|
|
@ -82,16 +83,13 @@ export function getLots(filters, options, connectedDatabase) {
|
|||
"select lotId, count(lotOccupancyId) as lotOccupancyCount" +
|
||||
" from LotOccupancies" +
|
||||
" where recordDelete_timeMillis is null" +
|
||||
" and occupancyStartDate <= " +
|
||||
currentDate +
|
||||
" and (occupancyEndDate is null or occupancyEndDate >= " +
|
||||
currentDate +
|
||||
")" +
|
||||
" and occupancyStartDate <= ?" +
|
||||
" and (occupancyEndDate is null or occupancyEndDate >= ?)" +
|
||||
" group by lotId" +
|
||||
") o on l.lotId = o.lotId") +
|
||||
sqlWhereClause +
|
||||
" order by userFn_lotNameSortName(l.lotName), l.lotId" +
|
||||
(options ? " limit " + options.limit + " offset " + options.offset : ""))
|
||||
(options ? ` limit ${options.limit} offset ${options.offset}` : ""))
|
||||
.all(sqlParameters);
|
||||
if (options.limit === -1) {
|
||||
count = lots.length;
|
||||
|
|
|
|||
|
|
@ -119,6 +119,8 @@ export function getLots(
|
|||
configFunctions.getProperty("settings.lot.lotNameSortNameFunction")
|
||||
);
|
||||
|
||||
sqlParameters.unshift(currentDate, currentDate);
|
||||
|
||||
lots = database
|
||||
.prepare(
|
||||
"select l.lotId, l.lotName," +
|
||||
|
|
@ -134,16 +136,13 @@ export function getLots(
|
|||
"select lotId, count(lotOccupancyId) as lotOccupancyCount" +
|
||||
" from LotOccupancies" +
|
||||
" where recordDelete_timeMillis is null" +
|
||||
" and occupancyStartDate <= " +
|
||||
currentDate +
|
||||
" and (occupancyEndDate is null or occupancyEndDate >= " +
|
||||
currentDate +
|
||||
")" +
|
||||
" and occupancyStartDate <= ?" +
|
||||
" and (occupancyEndDate is null or occupancyEndDate >= ?)" +
|
||||
" group by lotId" +
|
||||
") o on l.lotId = o.lotId") +
|
||||
sqlWhereClause +
|
||||
" order by userFn_lotNameSortName(l.lotName), l.lotId" +
|
||||
(options ? " limit " + options.limit + " offset " + options.offset : "")
|
||||
(options ? ` limit ${options.limit} offset ${options.offset}` : "")
|
||||
)
|
||||
.all(sqlParameters);
|
||||
|
||||
|
|
|
|||
|
|
@ -90,9 +90,7 @@ export function getWorkOrders(filters, options, connectedDatabase) {
|
|||
.all(sqlParameters);
|
||||
}
|
||||
if (options &&
|
||||
(options.includeComments ||
|
||||
options.includeLotsAndLotOccupancies ||
|
||||
options.includeMilestones)) {
|
||||
(options.includeComments || options.includeLotsAndLotOccupancies || options.includeMilestones)) {
|
||||
for (const workOrder of workOrders) {
|
||||
if (options.includeComments) {
|
||||
workOrder.workOrderComments = getWorkOrderComments(workOrder.workOrderId, database);
|
||||
|
|
|
|||
|
|
@ -2,10 +2,7 @@ import sqlite from "better-sqlite3";
|
|||
|
||||
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
|
||||
|
||||
import {
|
||||
dateIntegerToString,
|
||||
dateStringToInteger
|
||||
} from "@cityssm/expressjs-server-js/dateTimeFns.js";
|
||||
import { dateIntegerToString, dateStringToInteger } from "@cityssm/expressjs-server-js/dateTimeFns.js";
|
||||
|
||||
import { getWorkOrderComments } from "./getWorkOrderComments.js";
|
||||
import { getLots } from "./getLots.js";
|
||||
|
|
@ -16,192 +13,187 @@ import type * as recordTypes from "../../types/recordTypes";
|
|||
import { getLotNameWhereClause, getOccupantNameWhereClause } from "../functions.sqlFilters.js";
|
||||
|
||||
interface GetWorkOrdersFilters {
|
||||
workOrderTypeId?: number | string;
|
||||
workOrderOpenStatus?: "" | "open" | "closed";
|
||||
workOrderOpenDateString?: string;
|
||||
occupantName?: string;
|
||||
lotName?: string;
|
||||
lotOccupancyId?: number | string;
|
||||
workOrderTypeId?: number | string;
|
||||
workOrderOpenStatus?: "" | "open" | "closed";
|
||||
workOrderOpenDateString?: string;
|
||||
occupantName?: string;
|
||||
lotName?: string;
|
||||
lotOccupancyId?: number | string;
|
||||
}
|
||||
|
||||
interface GetWorkOrdersOptions {
|
||||
limit: number;
|
||||
offset: number;
|
||||
includeLotsAndLotOccupancies?: boolean;
|
||||
includeComments?: boolean;
|
||||
includeMilestones?: boolean;
|
||||
limit: number;
|
||||
offset: number;
|
||||
includeLotsAndLotOccupancies?: boolean;
|
||||
includeComments?: boolean;
|
||||
includeMilestones?: boolean;
|
||||
}
|
||||
|
||||
function buildWhereClause(filters: GetWorkOrdersFilters): {
|
||||
sqlWhereClause: string;
|
||||
sqlParameters: unknown[];
|
||||
sqlWhereClause: string;
|
||||
sqlParameters: unknown[];
|
||||
} {
|
||||
let sqlWhereClause = " where w.recordDelete_timeMillis is null";
|
||||
const sqlParameters: unknown[] = [];
|
||||
let sqlWhereClause = " where w.recordDelete_timeMillis is null";
|
||||
const sqlParameters: unknown[] = [];
|
||||
|
||||
if (filters.workOrderTypeId) {
|
||||
sqlWhereClause += " and w.workOrderTypeId = ?";
|
||||
sqlParameters.push(filters.workOrderTypeId);
|
||||
if (filters.workOrderTypeId) {
|
||||
sqlWhereClause += " and w.workOrderTypeId = ?";
|
||||
sqlParameters.push(filters.workOrderTypeId);
|
||||
}
|
||||
|
||||
if (filters.workOrderOpenStatus) {
|
||||
if (filters.workOrderOpenStatus === "open") {
|
||||
sqlWhereClause += " and w.workOrderCloseDate is null";
|
||||
} else if (filters.workOrderOpenStatus === "closed") {
|
||||
sqlWhereClause += " and w.workOrderCloseDate is not null";
|
||||
}
|
||||
}
|
||||
|
||||
if (filters.workOrderOpenStatus) {
|
||||
if (filters.workOrderOpenStatus === "open") {
|
||||
sqlWhereClause += " and w.workOrderCloseDate is null";
|
||||
} else if (filters.workOrderOpenStatus === "closed") {
|
||||
sqlWhereClause += " and w.workOrderCloseDate is not null";
|
||||
}
|
||||
}
|
||||
if (filters.workOrderOpenDateString) {
|
||||
sqlWhereClause += " and w.workOrderOpenDate = ?";
|
||||
sqlParameters.push(dateStringToInteger(filters.workOrderOpenDateString));
|
||||
}
|
||||
|
||||
if (filters.workOrderOpenDateString) {
|
||||
sqlWhereClause += " and w.workOrderOpenDate = ?";
|
||||
sqlParameters.push(dateStringToInteger(filters.workOrderOpenDateString));
|
||||
}
|
||||
const occupantNameFilters = getOccupantNameWhereClause(filters.occupantName, "o");
|
||||
if (occupantNameFilters.sqlParameters.length > 0) {
|
||||
sqlWhereClause +=
|
||||
" and w.workOrderId in (" +
|
||||
"select workOrderId from WorkOrderLotOccupancies o" +
|
||||
" where recordDelete_timeMillis is null" +
|
||||
" and o.lotOccupancyId in (select lotOccupancyId from LotOccupancyOccupants o where recordDelete_timeMillis is null" +
|
||||
occupantNameFilters.sqlWhereClause +
|
||||
")" +
|
||||
")";
|
||||
sqlParameters.push(...occupantNameFilters.sqlParameters);
|
||||
}
|
||||
|
||||
const occupantNameFilters = getOccupantNameWhereClause(filters.occupantName, "o");
|
||||
if (occupantNameFilters.sqlParameters.length > 0) {
|
||||
sqlWhereClause +=
|
||||
" and w.workOrderId in (" +
|
||||
"select workOrderId from WorkOrderLotOccupancies o" +
|
||||
" where recordDelete_timeMillis is null" +
|
||||
" and o.lotOccupancyId in (select lotOccupancyId from LotOccupancyOccupants o where recordDelete_timeMillis is null" +
|
||||
occupantNameFilters.sqlWhereClause +
|
||||
")" +
|
||||
")";
|
||||
sqlParameters.push(...occupantNameFilters.sqlParameters);
|
||||
}
|
||||
const lotNameFilters = getLotNameWhereClause(filters.lotName, "", "l");
|
||||
if (lotNameFilters.sqlParameters.length > 0) {
|
||||
sqlWhereClause +=
|
||||
" and w.workOrderId in (" +
|
||||
"select workOrderId from WorkOrderLots where recordDelete_timeMillis is null and lotId in (select lotId from Lots l where recordDelete_timeMillis is null" +
|
||||
lotNameFilters.sqlWhereClause +
|
||||
"))";
|
||||
sqlParameters.push(...lotNameFilters.sqlParameters);
|
||||
}
|
||||
|
||||
const lotNameFilters = getLotNameWhereClause(filters.lotName, "", "l");
|
||||
if (lotNameFilters.sqlParameters.length > 0) {
|
||||
sqlWhereClause +=
|
||||
" and w.workOrderId in (" +
|
||||
"select workOrderId from WorkOrderLots where recordDelete_timeMillis is null and lotId in (select lotId from Lots l where recordDelete_timeMillis is null" +
|
||||
lotNameFilters.sqlWhereClause +
|
||||
"))";
|
||||
sqlParameters.push(...lotNameFilters.sqlParameters);
|
||||
}
|
||||
if (filters.lotOccupancyId) {
|
||||
sqlWhereClause +=
|
||||
" and w.workOrderId in (select workOrderId from WorkOrderLotOccupancies where recordDelete_timeMillis is null and lotOccupancyId = ?)";
|
||||
sqlParameters.push(filters.lotOccupancyId);
|
||||
}
|
||||
|
||||
if (filters.lotOccupancyId) {
|
||||
sqlWhereClause +=
|
||||
" and w.workOrderId in (select workOrderId from WorkOrderLotOccupancies where recordDelete_timeMillis is null and lotOccupancyId = ?)";
|
||||
sqlParameters.push(filters.lotOccupancyId);
|
||||
}
|
||||
|
||||
return {
|
||||
sqlWhereClause,
|
||||
sqlParameters
|
||||
};
|
||||
return {
|
||||
sqlWhereClause,
|
||||
sqlParameters
|
||||
};
|
||||
}
|
||||
|
||||
export function getWorkOrders(
|
||||
filters: GetWorkOrdersFilters,
|
||||
options?: GetWorkOrdersOptions,
|
||||
connectedDatabase?: sqlite.Database
|
||||
filters: GetWorkOrdersFilters,
|
||||
options?: GetWorkOrdersOptions,
|
||||
connectedDatabase?: sqlite.Database
|
||||
): {
|
||||
count: number;
|
||||
workOrders: recordTypes.WorkOrder[];
|
||||
count: number;
|
||||
workOrders: recordTypes.WorkOrder[];
|
||||
} {
|
||||
const database =
|
||||
connectedDatabase ||
|
||||
sqlite(databasePath, {
|
||||
readonly: true
|
||||
});
|
||||
const database =
|
||||
connectedDatabase ||
|
||||
sqlite(databasePath, {
|
||||
readonly: true
|
||||
});
|
||||
|
||||
database.function("userFn_dateIntegerToString", dateIntegerToString);
|
||||
database.function("userFn_dateIntegerToString", dateIntegerToString);
|
||||
|
||||
const { sqlWhereClause, sqlParameters } = buildWhereClause(filters);
|
||||
const { sqlWhereClause, sqlParameters } = buildWhereClause(filters);
|
||||
|
||||
const count: number = database
|
||||
.prepare("select count(*) as recordCount from WorkOrders w" + sqlWhereClause)
|
||||
.get(sqlParameters).recordCount;
|
||||
const count: number = database
|
||||
.prepare("select count(*) as recordCount from WorkOrders w" + sqlWhereClause)
|
||||
.get(sqlParameters).recordCount;
|
||||
|
||||
let workOrders: recordTypes.WorkOrder[] = [];
|
||||
let workOrders: recordTypes.WorkOrder[] = [];
|
||||
|
||||
if (count > 0) {
|
||||
workOrders = database
|
||||
.prepare(
|
||||
"select w.workOrderId," +
|
||||
" w.workOrderTypeId, t.workOrderType," +
|
||||
" w.workOrderNumber, w.workOrderDescription," +
|
||||
" w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString," +
|
||||
" w.workOrderCloseDate, userFn_dateIntegerToString(w.workOrderCloseDate) as workOrderCloseDateString," +
|
||||
" ifnull(m.workOrderMilestoneCount, 0) as workOrderMilestoneCount," +
|
||||
" ifnull(m.workOrderMilestoneCompletionCount, 0) as workOrderMilestoneCompletionCount" +
|
||||
" from WorkOrders w" +
|
||||
" left join WorkOrderTypes t on w.workOrderTypeId = t.workOrderTypeId" +
|
||||
(" left join (select workOrderId," +
|
||||
" count(workOrderMilestoneId) as workOrderMilestoneCount," +
|
||||
" sum(case when workOrderMilestoneCompletionDate is null then 0 else 1 end) as workOrderMilestoneCompletionCount" +
|
||||
" from WorkOrderMilestones" +
|
||||
" where recordDelete_timeMillis is null" +
|
||||
" group by workOrderId) m on w.workOrderId = m.workOrderId") +
|
||||
sqlWhereClause +
|
||||
" order by w.workOrderOpenDate desc, w.workOrderNumber desc" +
|
||||
(options ? " limit " + options.limit + " offset " + options.offset : "")
|
||||
)
|
||||
.all(sqlParameters);
|
||||
if (count > 0) {
|
||||
workOrders = database
|
||||
.prepare(
|
||||
"select w.workOrderId," +
|
||||
" w.workOrderTypeId, t.workOrderType," +
|
||||
" w.workOrderNumber, w.workOrderDescription," +
|
||||
" w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString," +
|
||||
" w.workOrderCloseDate, userFn_dateIntegerToString(w.workOrderCloseDate) as workOrderCloseDateString," +
|
||||
" ifnull(m.workOrderMilestoneCount, 0) as workOrderMilestoneCount," +
|
||||
" ifnull(m.workOrderMilestoneCompletionCount, 0) as workOrderMilestoneCompletionCount" +
|
||||
" from WorkOrders w" +
|
||||
" left join WorkOrderTypes t on w.workOrderTypeId = t.workOrderTypeId" +
|
||||
(" left join (select workOrderId," +
|
||||
" count(workOrderMilestoneId) as workOrderMilestoneCount," +
|
||||
" sum(case when workOrderMilestoneCompletionDate is null then 0 else 1 end) as workOrderMilestoneCompletionCount" +
|
||||
" from WorkOrderMilestones" +
|
||||
" where recordDelete_timeMillis is null" +
|
||||
" group by workOrderId) m on w.workOrderId = m.workOrderId") +
|
||||
sqlWhereClause +
|
||||
" order by w.workOrderOpenDate desc, w.workOrderNumber desc" +
|
||||
(options ? " limit " + options.limit + " offset " + options.offset : "")
|
||||
)
|
||||
.all(sqlParameters);
|
||||
}
|
||||
|
||||
if (
|
||||
options &&
|
||||
(options.includeComments || options.includeLotsAndLotOccupancies || options.includeMilestones)
|
||||
) {
|
||||
for (const workOrder of workOrders) {
|
||||
if (options.includeComments) {
|
||||
workOrder.workOrderComments = getWorkOrderComments(workOrder.workOrderId as number, database);
|
||||
}
|
||||
|
||||
if (options.includeLotsAndLotOccupancies) {
|
||||
workOrder.workOrderLots = getLots(
|
||||
{
|
||||
workOrderId: workOrder.workOrderId
|
||||
},
|
||||
{
|
||||
limit: -1,
|
||||
offset: 0
|
||||
},
|
||||
database
|
||||
).lots;
|
||||
|
||||
workOrder.workOrderLotOccupancies = getLotOccupancies(
|
||||
{
|
||||
workOrderId: workOrder.workOrderId
|
||||
},
|
||||
{
|
||||
limit: -1,
|
||||
offset: 0,
|
||||
includeOccupants: true
|
||||
},
|
||||
database
|
||||
).lotOccupancies;
|
||||
}
|
||||
|
||||
if (options.includeMilestones) {
|
||||
workOrder.workOrderMilestones = getWorkOrderMilestones(
|
||||
{
|
||||
workOrderId: workOrder.workOrderId
|
||||
},
|
||||
{
|
||||
orderBy: "date"
|
||||
},
|
||||
database
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (
|
||||
options &&
|
||||
(options.includeComments ||
|
||||
options.includeLotsAndLotOccupancies ||
|
||||
options.includeMilestones)
|
||||
) {
|
||||
for (const workOrder of workOrders) {
|
||||
if (options.includeComments) {
|
||||
workOrder.workOrderComments = getWorkOrderComments(
|
||||
workOrder.workOrderId as number,
|
||||
database
|
||||
);
|
||||
}
|
||||
if (!connectedDatabase) {
|
||||
database.close();
|
||||
}
|
||||
|
||||
if (options.includeLotsAndLotOccupancies) {
|
||||
workOrder.workOrderLots = getLots(
|
||||
{
|
||||
workOrderId: workOrder.workOrderId
|
||||
},
|
||||
{
|
||||
limit: -1,
|
||||
offset: 0
|
||||
},
|
||||
database
|
||||
).lots;
|
||||
|
||||
workOrder.workOrderLotOccupancies = getLotOccupancies(
|
||||
{
|
||||
workOrderId: workOrder.workOrderId
|
||||
},
|
||||
{
|
||||
limit: -1,
|
||||
offset: 0,
|
||||
includeOccupants: true
|
||||
},
|
||||
database
|
||||
).lotOccupancies;
|
||||
}
|
||||
|
||||
if (options.includeMilestones) {
|
||||
workOrder.workOrderMilestones = getWorkOrderMilestones(
|
||||
{
|
||||
workOrderId: workOrder.workOrderId
|
||||
},
|
||||
{
|
||||
orderBy: "date"
|
||||
},
|
||||
database
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!connectedDatabase) {
|
||||
database.close();
|
||||
}
|
||||
|
||||
return {
|
||||
count,
|
||||
workOrders
|
||||
};
|
||||
return {
|
||||
count,
|
||||
workOrders
|
||||
};
|
||||
}
|
||||
|
||||
export default getWorkOrders;
|
||||
|
|
|
|||
|
|
@ -67,8 +67,8 @@
|
|||
"@types/randomcolor": "^0.5.7",
|
||||
"@types/session-file-store": "^1.2.2",
|
||||
"@types/uuid": "^9.0.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.48.0",
|
||||
"@typescript-eslint/parser": "^5.48.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.48.1",
|
||||
"@typescript-eslint/parser": "^5.48.1",
|
||||
"bulma": "^0.9.4",
|
||||
"bulma-divider": "^0.2.0",
|
||||
"bulma-helpers": "^0.4.3",
|
||||
|
|
@ -1376,14 +1376,14 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/eslint-plugin": {
|
||||
"version": "5.48.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.0.tgz",
|
||||
"integrity": "sha512-SVLafp0NXpoJY7ut6VFVUU9I+YeFsDzeQwtK0WZ+xbRN3mtxJ08je+6Oi2N89qDn087COdO0u3blKZNv9VetRQ==",
|
||||
"version": "5.48.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.1.tgz",
|
||||
"integrity": "sha512-9nY5K1Rp2ppmpb9s9S2aBiF3xo5uExCehMDmYmmFqqyxgenbHJ3qbarcLt4ITgaD6r/2ypdlcFRdcuVPnks+fQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@typescript-eslint/scope-manager": "5.48.0",
|
||||
"@typescript-eslint/type-utils": "5.48.0",
|
||||
"@typescript-eslint/utils": "5.48.0",
|
||||
"@typescript-eslint/scope-manager": "5.48.1",
|
||||
"@typescript-eslint/type-utils": "5.48.1",
|
||||
"@typescript-eslint/utils": "5.48.1",
|
||||
"debug": "^4.3.4",
|
||||
"ignore": "^5.2.0",
|
||||
"natural-compare-lite": "^1.4.0",
|
||||
|
|
@ -1409,14 +1409,14 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/parser": {
|
||||
"version": "5.48.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.48.0.tgz",
|
||||
"integrity": "sha512-1mxNA8qfgxX8kBvRDIHEzrRGrKHQfQlbW6iHyfHYS0Q4X1af+S6mkLNtgCOsGVl8+/LUPrqdHMssAemkrQ01qg==",
|
||||
"version": "5.48.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.48.1.tgz",
|
||||
"integrity": "sha512-4yg+FJR/V1M9Xoq56SF9Iygqm+r5LMXvheo6DQ7/yUWynQ4YfCRnsKuRgqH4EQ5Ya76rVwlEpw4Xu+TgWQUcdA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@typescript-eslint/scope-manager": "5.48.0",
|
||||
"@typescript-eslint/types": "5.48.0",
|
||||
"@typescript-eslint/typescript-estree": "5.48.0",
|
||||
"@typescript-eslint/scope-manager": "5.48.1",
|
||||
"@typescript-eslint/types": "5.48.1",
|
||||
"@typescript-eslint/typescript-estree": "5.48.1",
|
||||
"debug": "^4.3.4"
|
||||
},
|
||||
"engines": {
|
||||
|
|
@ -1436,13 +1436,13 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/scope-manager": {
|
||||
"version": "5.48.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.0.tgz",
|
||||
"integrity": "sha512-0AA4LviDtVtZqlyUQnZMVHydDATpD9SAX/RC5qh6cBd3xmyWvmXYF+WT1oOmxkeMnWDlUVTwdODeucUnjz3gow==",
|
||||
"version": "5.48.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.1.tgz",
|
||||
"integrity": "sha512-S035ueRrbxRMKvSTv9vJKIWgr86BD8s3RqoRZmsSh/s8HhIs90g6UlK8ZabUSjUZQkhVxt7nmZ63VJ9dcZhtDQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@typescript-eslint/types": "5.48.0",
|
||||
"@typescript-eslint/visitor-keys": "5.48.0"
|
||||
"@typescript-eslint/types": "5.48.1",
|
||||
"@typescript-eslint/visitor-keys": "5.48.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||
|
|
@ -1453,13 +1453,13 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/type-utils": {
|
||||
"version": "5.48.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.0.tgz",
|
||||
"integrity": "sha512-vbtPO5sJyFjtHkGlGK4Sthmta0Bbls4Onv0bEqOGm7hP9h8UpRsHJwsrCiWtCUndTRNQO/qe6Ijz9rnT/DB+7g==",
|
||||
"version": "5.48.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.1.tgz",
|
||||
"integrity": "sha512-Hyr8HU8Alcuva1ppmqSYtM/Gp0q4JOp1F+/JH5D1IZm/bUBrV0edoewQZiEc1r6I8L4JL21broddxK8HAcZiqQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@typescript-eslint/typescript-estree": "5.48.0",
|
||||
"@typescript-eslint/utils": "5.48.0",
|
||||
"@typescript-eslint/typescript-estree": "5.48.1",
|
||||
"@typescript-eslint/utils": "5.48.1",
|
||||
"debug": "^4.3.4",
|
||||
"tsutils": "^3.21.0"
|
||||
},
|
||||
|
|
@ -1480,9 +1480,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/types": {
|
||||
"version": "5.48.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.0.tgz",
|
||||
"integrity": "sha512-UTe67B0Ypius0fnEE518NB2N8gGutIlTojeTg4nt0GQvikReVkurqxd2LvYa9q9M5MQ6rtpNyWTBxdscw40Xhw==",
|
||||
"version": "5.48.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.1.tgz",
|
||||
"integrity": "sha512-xHyDLU6MSuEEdIlzrrAerCGS3T7AA/L8Hggd0RCYBi0w3JMvGYxlLlXHeg50JI9Tfg5MrtsfuNxbS/3zF1/ATg==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||
|
|
@ -1493,13 +1493,13 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/typescript-estree": {
|
||||
"version": "5.48.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.0.tgz",
|
||||
"integrity": "sha512-7pjd94vvIjI1zTz6aq/5wwE/YrfIyEPLtGJmRfyNR9NYIW+rOvzzUv3Cmq2hRKpvt6e9vpvPUQ7puzX7VSmsEw==",
|
||||
"version": "5.48.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.1.tgz",
|
||||
"integrity": "sha512-Hut+Osk5FYr+sgFh8J/FHjqX6HFcDzTlWLrFqGoK5kVUN3VBHF/QzZmAsIXCQ8T/W9nQNBTqalxi1P3LSqWnRA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@typescript-eslint/types": "5.48.0",
|
||||
"@typescript-eslint/visitor-keys": "5.48.0",
|
||||
"@typescript-eslint/types": "5.48.1",
|
||||
"@typescript-eslint/visitor-keys": "5.48.1",
|
||||
"debug": "^4.3.4",
|
||||
"globby": "^11.1.0",
|
||||
"is-glob": "^4.0.3",
|
||||
|
|
@ -1520,16 +1520,16 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/utils": {
|
||||
"version": "5.48.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.0.tgz",
|
||||
"integrity": "sha512-x2jrMcPaMfsHRRIkL+x96++xdzvrdBCnYRd5QiW5Wgo1OB4kDYPbC1XjWP/TNqlfK93K/lUL92erq5zPLgFScQ==",
|
||||
"version": "5.48.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.1.tgz",
|
||||
"integrity": "sha512-SmQuSrCGUOdmGMwivW14Z0Lj8dxG1mOFZ7soeJ0TQZEJcs3n5Ndgkg0A4bcMFzBELqLJ6GTHnEU+iIoaD6hFGA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@types/json-schema": "^7.0.9",
|
||||
"@types/semver": "^7.3.12",
|
||||
"@typescript-eslint/scope-manager": "5.48.0",
|
||||
"@typescript-eslint/types": "5.48.0",
|
||||
"@typescript-eslint/typescript-estree": "5.48.0",
|
||||
"@typescript-eslint/scope-manager": "5.48.1",
|
||||
"@typescript-eslint/types": "5.48.1",
|
||||
"@typescript-eslint/typescript-estree": "5.48.1",
|
||||
"eslint-scope": "^5.1.1",
|
||||
"eslint-utils": "^3.0.0",
|
||||
"semver": "^7.3.7"
|
||||
|
|
@ -1546,12 +1546,12 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/visitor-keys": {
|
||||
"version": "5.48.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.0.tgz",
|
||||
"integrity": "sha512-5motVPz5EgxQ0bHjut3chzBkJ3Z3sheYVcSwS5BpHZpLqSptSmELNtGixmgj65+rIfhvtQTz5i9OP2vtzdDH7Q==",
|
||||
"version": "5.48.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.1.tgz",
|
||||
"integrity": "sha512-Ns0XBwmfuX7ZknznfXozgnydyR8F6ev/KEGePP4i74uL3ArsKbEhJ7raeKr1JSa997DBDwol/4a0Y+At82c9dA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@typescript-eslint/types": "5.48.0",
|
||||
"@typescript-eslint/types": "5.48.1",
|
||||
"eslint-visitor-keys": "^3.3.0"
|
||||
},
|
||||
"engines": {
|
||||
|
|
@ -13709,14 +13709,14 @@
|
|||
}
|
||||
},
|
||||
"@typescript-eslint/eslint-plugin": {
|
||||
"version": "5.48.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.0.tgz",
|
||||
"integrity": "sha512-SVLafp0NXpoJY7ut6VFVUU9I+YeFsDzeQwtK0WZ+xbRN3mtxJ08je+6Oi2N89qDn087COdO0u3blKZNv9VetRQ==",
|
||||
"version": "5.48.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.1.tgz",
|
||||
"integrity": "sha512-9nY5K1Rp2ppmpb9s9S2aBiF3xo5uExCehMDmYmmFqqyxgenbHJ3qbarcLt4ITgaD6r/2ypdlcFRdcuVPnks+fQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@typescript-eslint/scope-manager": "5.48.0",
|
||||
"@typescript-eslint/type-utils": "5.48.0",
|
||||
"@typescript-eslint/utils": "5.48.0",
|
||||
"@typescript-eslint/scope-manager": "5.48.1",
|
||||
"@typescript-eslint/type-utils": "5.48.1",
|
||||
"@typescript-eslint/utils": "5.48.1",
|
||||
"debug": "^4.3.4",
|
||||
"ignore": "^5.2.0",
|
||||
"natural-compare-lite": "^1.4.0",
|
||||
|
|
@ -13726,53 +13726,53 @@
|
|||
}
|
||||
},
|
||||
"@typescript-eslint/parser": {
|
||||
"version": "5.48.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.48.0.tgz",
|
||||
"integrity": "sha512-1mxNA8qfgxX8kBvRDIHEzrRGrKHQfQlbW6iHyfHYS0Q4X1af+S6mkLNtgCOsGVl8+/LUPrqdHMssAemkrQ01qg==",
|
||||
"version": "5.48.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.48.1.tgz",
|
||||
"integrity": "sha512-4yg+FJR/V1M9Xoq56SF9Iygqm+r5LMXvheo6DQ7/yUWynQ4YfCRnsKuRgqH4EQ5Ya76rVwlEpw4Xu+TgWQUcdA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@typescript-eslint/scope-manager": "5.48.0",
|
||||
"@typescript-eslint/types": "5.48.0",
|
||||
"@typescript-eslint/typescript-estree": "5.48.0",
|
||||
"@typescript-eslint/scope-manager": "5.48.1",
|
||||
"@typescript-eslint/types": "5.48.1",
|
||||
"@typescript-eslint/typescript-estree": "5.48.1",
|
||||
"debug": "^4.3.4"
|
||||
}
|
||||
},
|
||||
"@typescript-eslint/scope-manager": {
|
||||
"version": "5.48.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.0.tgz",
|
||||
"integrity": "sha512-0AA4LviDtVtZqlyUQnZMVHydDATpD9SAX/RC5qh6cBd3xmyWvmXYF+WT1oOmxkeMnWDlUVTwdODeucUnjz3gow==",
|
||||
"version": "5.48.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.1.tgz",
|
||||
"integrity": "sha512-S035ueRrbxRMKvSTv9vJKIWgr86BD8s3RqoRZmsSh/s8HhIs90g6UlK8ZabUSjUZQkhVxt7nmZ63VJ9dcZhtDQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@typescript-eslint/types": "5.48.0",
|
||||
"@typescript-eslint/visitor-keys": "5.48.0"
|
||||
"@typescript-eslint/types": "5.48.1",
|
||||
"@typescript-eslint/visitor-keys": "5.48.1"
|
||||
}
|
||||
},
|
||||
"@typescript-eslint/type-utils": {
|
||||
"version": "5.48.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.0.tgz",
|
||||
"integrity": "sha512-vbtPO5sJyFjtHkGlGK4Sthmta0Bbls4Onv0bEqOGm7hP9h8UpRsHJwsrCiWtCUndTRNQO/qe6Ijz9rnT/DB+7g==",
|
||||
"version": "5.48.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.1.tgz",
|
||||
"integrity": "sha512-Hyr8HU8Alcuva1ppmqSYtM/Gp0q4JOp1F+/JH5D1IZm/bUBrV0edoewQZiEc1r6I8L4JL21broddxK8HAcZiqQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@typescript-eslint/typescript-estree": "5.48.0",
|
||||
"@typescript-eslint/utils": "5.48.0",
|
||||
"@typescript-eslint/typescript-estree": "5.48.1",
|
||||
"@typescript-eslint/utils": "5.48.1",
|
||||
"debug": "^4.3.4",
|
||||
"tsutils": "^3.21.0"
|
||||
}
|
||||
},
|
||||
"@typescript-eslint/types": {
|
||||
"version": "5.48.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.0.tgz",
|
||||
"integrity": "sha512-UTe67B0Ypius0fnEE518NB2N8gGutIlTojeTg4nt0GQvikReVkurqxd2LvYa9q9M5MQ6rtpNyWTBxdscw40Xhw==",
|
||||
"version": "5.48.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.1.tgz",
|
||||
"integrity": "sha512-xHyDLU6MSuEEdIlzrrAerCGS3T7AA/L8Hggd0RCYBi0w3JMvGYxlLlXHeg50JI9Tfg5MrtsfuNxbS/3zF1/ATg==",
|
||||
"dev": true
|
||||
},
|
||||
"@typescript-eslint/typescript-estree": {
|
||||
"version": "5.48.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.0.tgz",
|
||||
"integrity": "sha512-7pjd94vvIjI1zTz6aq/5wwE/YrfIyEPLtGJmRfyNR9NYIW+rOvzzUv3Cmq2hRKpvt6e9vpvPUQ7puzX7VSmsEw==",
|
||||
"version": "5.48.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.1.tgz",
|
||||
"integrity": "sha512-Hut+Osk5FYr+sgFh8J/FHjqX6HFcDzTlWLrFqGoK5kVUN3VBHF/QzZmAsIXCQ8T/W9nQNBTqalxi1P3LSqWnRA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@typescript-eslint/types": "5.48.0",
|
||||
"@typescript-eslint/visitor-keys": "5.48.0",
|
||||
"@typescript-eslint/types": "5.48.1",
|
||||
"@typescript-eslint/visitor-keys": "5.48.1",
|
||||
"debug": "^4.3.4",
|
||||
"globby": "^11.1.0",
|
||||
"is-glob": "^4.0.3",
|
||||
|
|
@ -13781,28 +13781,28 @@
|
|||
}
|
||||
},
|
||||
"@typescript-eslint/utils": {
|
||||
"version": "5.48.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.0.tgz",
|
||||
"integrity": "sha512-x2jrMcPaMfsHRRIkL+x96++xdzvrdBCnYRd5QiW5Wgo1OB4kDYPbC1XjWP/TNqlfK93K/lUL92erq5zPLgFScQ==",
|
||||
"version": "5.48.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.1.tgz",
|
||||
"integrity": "sha512-SmQuSrCGUOdmGMwivW14Z0Lj8dxG1mOFZ7soeJ0TQZEJcs3n5Ndgkg0A4bcMFzBELqLJ6GTHnEU+iIoaD6hFGA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/json-schema": "^7.0.9",
|
||||
"@types/semver": "^7.3.12",
|
||||
"@typescript-eslint/scope-manager": "5.48.0",
|
||||
"@typescript-eslint/types": "5.48.0",
|
||||
"@typescript-eslint/typescript-estree": "5.48.0",
|
||||
"@typescript-eslint/scope-manager": "5.48.1",
|
||||
"@typescript-eslint/types": "5.48.1",
|
||||
"@typescript-eslint/typescript-estree": "5.48.1",
|
||||
"eslint-scope": "^5.1.1",
|
||||
"eslint-utils": "^3.0.0",
|
||||
"semver": "^7.3.7"
|
||||
}
|
||||
},
|
||||
"@typescript-eslint/visitor-keys": {
|
||||
"version": "5.48.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.0.tgz",
|
||||
"integrity": "sha512-5motVPz5EgxQ0bHjut3chzBkJ3Z3sheYVcSwS5BpHZpLqSptSmELNtGixmgj65+rIfhvtQTz5i9OP2vtzdDH7Q==",
|
||||
"version": "5.48.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.1.tgz",
|
||||
"integrity": "sha512-Ns0XBwmfuX7ZknznfXozgnydyR8F6ev/KEGePP4i74uL3ArsKbEhJ7raeKr1JSa997DBDwol/4a0Y+At82c9dA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@typescript-eslint/types": "5.48.0",
|
||||
"@typescript-eslint/types": "5.48.1",
|
||||
"eslint-visitor-keys": "^3.3.0"
|
||||
}
|
||||
},
|
||||
|
|
|
|||
|
|
@ -91,8 +91,8 @@
|
|||
"@types/randomcolor": "^0.5.7",
|
||||
"@types/session-file-store": "^1.2.2",
|
||||
"@types/uuid": "^9.0.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.48.0",
|
||||
"@typescript-eslint/parser": "^5.48.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.48.1",
|
||||
"@typescript-eslint/parser": "^5.48.1",
|
||||
"bulma": "^0.9.4",
|
||||
"bulma-divider": "^0.2.0",
|
||||
"bulma-helpers": "^0.4.3",
|
||||
|
|
|
|||
|
|
@ -7,15 +7,19 @@ $white: #fff;
|
|||
$black: #000;
|
||||
|
||||
.is-linethrough {
|
||||
text-decoration: line-through;
|
||||
text-decoration: line-through;
|
||||
}
|
||||
|
||||
.has-width-10 {
|
||||
width: 10px;
|
||||
width: 10px;
|
||||
}
|
||||
|
||||
.has-width-900 {
|
||||
width: 900px;
|
||||
}
|
||||
|
||||
.has-min-page-height {
|
||||
min-height: 100vh;
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -26,21 +30,21 @@ $black: #000;
|
|||
.has-status-loading .is-hidden-status-loading,
|
||||
.has-status-view .is-hidden-status-view,
|
||||
fieldset:enabled .is-hidden-enabled {
|
||||
display: none;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.has-status-view .is-noninteractive-status-view {
|
||||
pointer-events: none;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
/* to fix page titles inside level components, set on .level-left */
|
||||
|
||||
.has-flex-shrink-1 {
|
||||
flex-shrink: 1;
|
||||
flex-shrink: 1;
|
||||
}
|
||||
|
||||
.has-border-radius-3 {
|
||||
border-radius: 3px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -48,28 +52,28 @@ fieldset:enabled .is-hidden-enabled {
|
|||
*/
|
||||
|
||||
.tab-content {
|
||||
display: none;
|
||||
display: none;
|
||||
|
||||
&.is-active {
|
||||
display: block;
|
||||
}
|
||||
&.is-active {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
#is-login-page {
|
||||
overflow: auto;
|
||||
background-position: top center;
|
||||
background-size: cover;
|
||||
overflow: auto;
|
||||
background-position: top center;
|
||||
background-size: cover;
|
||||
|
||||
body > .columns {
|
||||
min-height: 100vh;
|
||||
}
|
||||
body > .columns {
|
||||
min-height: 100vh;
|
||||
}
|
||||
}
|
||||
|
||||
.button.is-xsmall {
|
||||
height: 2em;
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
font-size: 0.75rem;
|
||||
height: 2em;
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
font-size: 0.75rem;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -77,17 +81,17 @@ fieldset:enabled .is-hidden-enabled {
|
|||
*/
|
||||
|
||||
.container.is-page {
|
||||
width: 8.5in;
|
||||
padding: 10px 20px 20px;
|
||||
margin: 20px auto;
|
||||
background-color: $white;
|
||||
border: 1px solid $black;
|
||||
width: 8.5in;
|
||||
padding: 10px 20px 20px;
|
||||
margin: 20px auto;
|
||||
background-color: $white;
|
||||
border: 1px solid $black;
|
||||
|
||||
@media print {
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
}
|
||||
@media print {
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -95,26 +99,26 @@ fieldset:enabled .is-hidden-enabled {
|
|||
*/
|
||||
|
||||
.image svg {
|
||||
display: block;
|
||||
height: auto;
|
||||
width: 100%;
|
||||
display: block;
|
||||
height: auto;
|
||||
width: 100%;
|
||||
|
||||
.highlight,
|
||||
.highlight path {
|
||||
&.is-danger {
|
||||
stroke: $danger-dark !important;
|
||||
fill: rgba($danger-light, 0.6);
|
||||
}
|
||||
|
||||
&.is-success {
|
||||
stroke: $success-dark !important;
|
||||
fill: rgba($success, 0.6);
|
||||
}
|
||||
.highlight,
|
||||
.highlight path {
|
||||
&.is-danger {
|
||||
stroke: $danger-dark !important;
|
||||
fill: rgba($danger-light, 0.6);
|
||||
}
|
||||
|
||||
text {
|
||||
user-select: none;
|
||||
&.is-success {
|
||||
stroke: $success-dark !important;
|
||||
fill: rgba($success, 0.6);
|
||||
}
|
||||
}
|
||||
|
||||
text {
|
||||
user-select: none;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -122,7 +126,7 @@ fieldset:enabled .is-hidden-enabled {
|
|||
*/
|
||||
|
||||
.select option:disabled {
|
||||
display: none;
|
||||
display: none;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -130,7 +134,7 @@ fieldset:enabled .is-hidden-enabled {
|
|||
*/
|
||||
|
||||
.modal-card {
|
||||
max-width: 100%;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -141,7 +145,7 @@ $black-ter: hsl(0, 0%, 14%);
|
|||
|
||||
.control .button.is-static,
|
||||
.menu .menu-label {
|
||||
color: $black-ter;
|
||||
color: $black-ter;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -149,11 +153,11 @@ $black-ter: hsl(0, 0%, 14%);
|
|||
*/
|
||||
|
||||
.navbar.is-fixed-top {
|
||||
z-index: 1100;
|
||||
z-index: 1100;
|
||||
}
|
||||
|
||||
.modal {
|
||||
z-index: 1200;
|
||||
z-index: 1200;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -161,8 +165,8 @@ $black-ter: hsl(0, 0%, 14%);
|
|||
*/
|
||||
|
||||
span.button.is-static {
|
||||
pointer-events: all;
|
||||
cursor: default;
|
||||
pointer-events: all;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -170,25 +174,25 @@ span.button.is-static {
|
|||
*/
|
||||
|
||||
.datetimepicker-dummy {
|
||||
.datetimepicker-dummy-wrapper::before {
|
||||
mask: unset;
|
||||
-webkit-mask: unset;
|
||||
background-color: transparent !important;
|
||||
}
|
||||
.datetimepicker-dummy-wrapper::before {
|
||||
mask: unset;
|
||||
-webkit-mask: unset;
|
||||
background-color: transparent !important;
|
||||
}
|
||||
|
||||
/* fix left icon */
|
||||
.datetimepicker-dummy-wrapper .datetimepicker-dummy-input:first-child {
|
||||
text-indent: 2rem;
|
||||
}
|
||||
/* fix left icon */
|
||||
.datetimepicker-dummy-wrapper .datetimepicker-dummy-input:first-child {
|
||||
text-indent: 2rem;
|
||||
}
|
||||
|
||||
/* center the button */
|
||||
.datetimepicker-clear-button {
|
||||
transform: none;
|
||||
margin-right: 0.25rem;
|
||||
margin-top: 0.15rem;
|
||||
}
|
||||
/* center the button */
|
||||
.datetimepicker-clear-button {
|
||||
transform: none;
|
||||
margin-right: 0.25rem;
|
||||
margin-top: 0.15rem;
|
||||
}
|
||||
}
|
||||
|
||||
.datetimepicker.is-active {
|
||||
z-index: 10;
|
||||
z-index: 10;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,30 +4,32 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
(() => {
|
||||
const los = exports.los;
|
||||
const doCleanup = () => {
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doCleanupDatabase", {}, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doCleanupDatabase', {}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
bulmaJS.alert({
|
||||
title: "Database Cleaned Up Successfully",
|
||||
title: 'Database Cleaned Up Successfully',
|
||||
message: `${responseJSON.inactivedRecordCount} records inactivated,
|
||||
${responseJSON.purgedRecordCount} permanently deleted.`,
|
||||
contextualColorName: "success"
|
||||
contextualColorName: 'success'
|
||||
});
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Cleaning Database",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Cleaning Database',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
document.querySelector("#button--cleanupDatabase").addEventListener("click", () => {
|
||||
document
|
||||
.querySelector('#button--cleanupDatabase')
|
||||
.addEventListener('click', () => {
|
||||
bulmaJS.confirm({
|
||||
title: "Cleanup Database",
|
||||
message: "Are you sure you want to cleanup up the database?",
|
||||
title: 'Cleanup Database',
|
||||
message: 'Are you sure you want to cleanup up the database?',
|
||||
okButton: {
|
||||
text: "Yes, Cleanup Database",
|
||||
text: 'Yes, Cleanup Database',
|
||||
callbackFunction: doCleanup
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,53 +1,55 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
|
||||
import type * as globalTypes from "../types/globalTypes";
|
||||
import type * as globalTypes from '../types/globalTypes'
|
||||
|
||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||
|
||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
||||
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||
|
||||
declare const cityssm: cityssmGlobal;
|
||||
declare const bulmaJS: BulmaJS;
|
||||
declare const cityssm: cityssmGlobal
|
||||
declare const bulmaJS: BulmaJS
|
||||
|
||||
(() => {
|
||||
const los = exports.los as globalTypes.LOS;
|
||||
;(() => {
|
||||
const los = exports.los as globalTypes.LOS
|
||||
|
||||
const doCleanup = () => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/admin/doCleanupDatabase",
|
||||
{},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
inactivedRecordCount: number;
|
||||
purgedRecordCount: number;
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
bulmaJS.alert({
|
||||
title: "Database Cleaned Up Successfully",
|
||||
message: `${responseJSON.inactivedRecordCount} records inactivated,
|
||||
const doCleanup = () => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/admin/doCleanupDatabase',
|
||||
{},
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
inactivedRecordCount: number
|
||||
purgedRecordCount: number
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
bulmaJS.alert({
|
||||
title: 'Database Cleaned Up Successfully',
|
||||
message: `${responseJSON.inactivedRecordCount} records inactivated,
|
||||
${responseJSON.purgedRecordCount} permanently deleted.`,
|
||||
contextualColorName: "success"
|
||||
});
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Cleaning Database",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
contextualColorName: 'success'
|
||||
})
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: 'Error Cleaning Database',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
document.querySelector("#button--cleanupDatabase")!.addEventListener("click", () => {
|
||||
bulmaJS.confirm({
|
||||
title: "Cleanup Database",
|
||||
message: "Are you sure you want to cleanup up the database?",
|
||||
okButton: {
|
||||
text: "Yes, Cleanup Database",
|
||||
callbackFunction: doCleanup
|
||||
}
|
||||
});
|
||||
});
|
||||
})();
|
||||
document
|
||||
.querySelector('#button--cleanupDatabase')!
|
||||
.addEventListener('click', () => {
|
||||
bulmaJS.confirm({
|
||||
title: 'Cleanup Database',
|
||||
message: 'Are you sure you want to cleanup up the database?',
|
||||
okButton: {
|
||||
text: 'Yes, Cleanup Database',
|
||||
callbackFunction: doCleanup
|
||||
}
|
||||
})
|
||||
})
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
(() => {
|
||||
const los = exports.los;
|
||||
const feeCategoriesContainerElement = document.querySelector("#container--feeCategories");
|
||||
const feeCategoriesContainerElement = document.querySelector('#container--feeCategories');
|
||||
let feeCategories = exports.feeCategories;
|
||||
delete exports.feeCategories;
|
||||
function renderFeeCategories() {
|
||||
|
|
@ -13,152 +13,164 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
</div>`;
|
||||
return;
|
||||
}
|
||||
feeCategoriesContainerElement.innerHTML = "";
|
||||
feeCategoriesContainerElement.innerHTML = '';
|
||||
for (const feeCategory of feeCategories) {
|
||||
const feeCategoryContainerElement = document.createElement("section");
|
||||
feeCategoryContainerElement.className = "panel container--feeCategory";
|
||||
feeCategoryContainerElement.dataset.feeCategoryId = feeCategory.feeCategoryId.toString();
|
||||
const feeCategoryContainerElement = document.createElement('section');
|
||||
feeCategoryContainerElement.className = 'panel container--feeCategory';
|
||||
feeCategoryContainerElement.dataset.feeCategoryId =
|
||||
feeCategory.feeCategoryId.toString();
|
||||
feeCategoryContainerElement.innerHTML =
|
||||
'<div class="panel-heading">' +
|
||||
'<div class="columns">' +
|
||||
('<div class="column">' +
|
||||
'<h2 class="title is-4">' +
|
||||
cityssm.escapeHTML(feeCategory.feeCategory || "") +
|
||||
"</h2>" +
|
||||
"</div>") +
|
||||
cityssm.escapeHTML(feeCategory.feeCategory || '') +
|
||||
'</h2>' +
|
||||
'</div>') +
|
||||
('<div class="column is-narrow">' +
|
||||
'<div class="field is-grouped is-justify-content-end">' +
|
||||
(feeCategory.fees.length === 0
|
||||
? '<div class="control">' +
|
||||
'<button class="button is-small is-danger button--deleteFeeCategory" type="button">' +
|
||||
'<span class="icon is-small"><i class="fas fa-trash" aria-hidden="true"></i></span>' +
|
||||
"<span>Delete Category</span>" +
|
||||
"</button>" +
|
||||
"</div>"
|
||||
: "") +
|
||||
'<span>Delete Category</span>' +
|
||||
'</button>' +
|
||||
'</div>'
|
||||
: '') +
|
||||
('<div class="control">' +
|
||||
'<button class="button is-small is-primary button--editFeeCategory" type="button">' +
|
||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||
"<span>Edit Category</span>" +
|
||||
"</button>" +
|
||||
"</div>") +
|
||||
'<span>Edit Category</span>' +
|
||||
'</button>' +
|
||||
'</div>') +
|
||||
('<div class="control">' +
|
||||
'<button class="button is-small is-success button--addFee" data-cy="addFee" type="button">' +
|
||||
'<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>' +
|
||||
"<span>Add Fee</span>" +
|
||||
"</button>" +
|
||||
"</div>") +
|
||||
'<span>Add Fee</span>' +
|
||||
'</button>' +
|
||||
'</div>') +
|
||||
('<div class="control">' +
|
||||
los.getMoveUpDownButtonFieldHTML("button--moveFeeCategoryUp", "button--moveFeeCategoryDown") +
|
||||
"</div>") +
|
||||
"</div>") +
|
||||
"</div>" +
|
||||
"</div>";
|
||||
los.getMoveUpDownButtonFieldHTML('button--moveFeeCategoryUp', 'button--moveFeeCategoryDown') +
|
||||
'</div>') +
|
||||
'</div>') +
|
||||
'</div>' +
|
||||
'</div>';
|
||||
if (feeCategory.fees.length === 0) {
|
||||
feeCategoryContainerElement.insertAdjacentHTML("beforeend", `<div class="panel-block is-block">
|
||||
feeCategoryContainerElement.insertAdjacentHTML('beforeend', `<div class="panel-block is-block">
|
||||
<div class="message is-info">
|
||||
<p class="message-body">
|
||||
There are no fees in the
|
||||
"${cityssm.escapeHTML(feeCategory.feeCategory || "")}"
|
||||
"${cityssm.escapeHTML(feeCategory.feeCategory || '')}"
|
||||
category.
|
||||
</p>
|
||||
</div>
|
||||
</div>`);
|
||||
feeCategoryContainerElement
|
||||
.querySelector(".button--deleteFeeCategory")
|
||||
.addEventListener("click", confirmDeleteFeeCategory);
|
||||
.querySelector('.button--deleteFeeCategory')
|
||||
.addEventListener('click', confirmDeleteFeeCategory);
|
||||
}
|
||||
else {
|
||||
for (const fee of feeCategory.fees) {
|
||||
const panelBlockElement = document.createElement("div");
|
||||
panelBlockElement.className = "panel-block is-block container--fee";
|
||||
const panelBlockElement = document.createElement('div');
|
||||
panelBlockElement.className = 'panel-block is-block container--fee';
|
||||
panelBlockElement.dataset.feeId = fee.feeId.toString();
|
||||
const hasTagsBlock = fee.isRequired || fee.occupancyTypeId || fee.lotTypeId;
|
||||
panelBlockElement.innerHTML =
|
||||
'<div class="columns">' +
|
||||
('<div class="column is-half">' +
|
||||
"<p>" +
|
||||
'<p>' +
|
||||
'<a class="has-text-weight-bold" href="#">' +
|
||||
cityssm.escapeHTML(fee.feeName || "") +
|
||||
"</a><br />" +
|
||||
"<small>" +
|
||||
cityssm.escapeHTML(fee.feeDescription || "").replace(/\n/g, "<br />") +
|
||||
"</small>" +
|
||||
"</p>" +
|
||||
cityssm.escapeHTML(fee.feeName || '') +
|
||||
'</a><br />' +
|
||||
'<small>' +
|
||||
cityssm
|
||||
.escapeHTML(fee.feeDescription || '')
|
||||
.replace(/\n/g, '<br />') +
|
||||
'</small>' +
|
||||
'</p>' +
|
||||
(hasTagsBlock
|
||||
? '<p class="tags">' +
|
||||
(fee.isRequired ? '<span class="tag is-warning">Required</span>' : "") +
|
||||
(fee.isRequired
|
||||
? '<span class="tag is-warning">Required</span>'
|
||||
: '') +
|
||||
(fee.occupancyTypeId
|
||||
? ' <span class="tag has-tooltip-bottom" data-tooltip="' +
|
||||
los.escapedAliases.Occupancy +
|
||||
' Type Filter">' +
|
||||
cityssm.escapeHTML(fee.occupancyType || "") +
|
||||
"</span>"
|
||||
: "") +
|
||||
cityssm.escapeHTML(fee.occupancyType || '') +
|
||||
'</span>'
|
||||
: '') +
|
||||
(fee.lotTypeId
|
||||
? ' <span class="tag has-tooltip-bottom" data-tooltip="' +
|
||||
los.escapedAliases.Lot +
|
||||
' Type Filter">' +
|
||||
cityssm.escapeHTML(fee.lotType || "") +
|
||||
"</span>"
|
||||
: "") +
|
||||
"</p>"
|
||||
: "") +
|
||||
"</div>") +
|
||||
cityssm.escapeHTML(fee.lotType || '') +
|
||||
'</span>'
|
||||
: '') +
|
||||
'</p>'
|
||||
: '') +
|
||||
'</div>') +
|
||||
('<div class="column">' +
|
||||
'<div class="columns is-mobile">' +
|
||||
('<div class="column has-text-centered">' +
|
||||
(fee.feeFunction
|
||||
? cityssm.escapeHTML(fee.feeFunction) +
|
||||
"<br />" +
|
||||
"<small>Fee Function</small>"
|
||||
: "$" + fee.feeAmount.toFixed(2) + "<br />" + "<small>Fee</small>") +
|
||||
"</div>") +
|
||||
'<br />' +
|
||||
'<small>Fee Function</small>'
|
||||
: '$' +
|
||||
fee.feeAmount.toFixed(2) +
|
||||
'<br />' +
|
||||
'<small>Fee</small>') +
|
||||
'</div>') +
|
||||
('<div class="column has-text-centered">' +
|
||||
(fee.taxPercentage
|
||||
? fee.taxPercentage + "%"
|
||||
: "$" + fee.taxAmount.toFixed(2)) +
|
||||
"<br /><small>Tax</small>" +
|
||||
"</div>") +
|
||||
? fee.taxPercentage + '%'
|
||||
: '$' + fee.taxAmount.toFixed(2)) +
|
||||
'<br /><small>Tax</small>' +
|
||||
'</div>') +
|
||||
('<div class="column has-text-centered">' +
|
||||
(fee.includeQuantity
|
||||
? cityssm.escapeHTML(fee.quantityUnit || "") +
|
||||
"<br />" +
|
||||
"<small>Quantity</small>"
|
||||
: "") +
|
||||
"</div>") +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
? cityssm.escapeHTML(fee.quantityUnit || '') +
|
||||
'<br />' +
|
||||
'<small>Quantity</small>'
|
||||
: '') +
|
||||
'</div>') +
|
||||
'</div>' +
|
||||
'</div>') +
|
||||
('<div class="column is-narrow">' +
|
||||
los.getMoveUpDownButtonFieldHTML("button--moveFeeUp", "button--moveFeeDown") +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
"</div>";
|
||||
panelBlockElement.querySelector("a").addEventListener("click", openEditFee);
|
||||
panelBlockElement.querySelector(".button--moveFeeUp").addEventListener("click", moveFee);
|
||||
panelBlockElement.querySelector(".button--moveFeeDown").addEventListener("click", moveFee);
|
||||
los.getMoveUpDownButtonFieldHTML('button--moveFeeUp', 'button--moveFeeDown') +
|
||||
'</div>' +
|
||||
'</div>') +
|
||||
'</div>';
|
||||
panelBlockElement
|
||||
.querySelector('a')
|
||||
.addEventListener('click', openEditFee);
|
||||
panelBlockElement.querySelector('.button--moveFeeUp').addEventListener('click', moveFee);
|
||||
panelBlockElement.querySelector('.button--moveFeeDown').addEventListener('click', moveFee);
|
||||
feeCategoryContainerElement.append(panelBlockElement);
|
||||
}
|
||||
}
|
||||
feeCategoryContainerElement
|
||||
.querySelector(".button--editFeeCategory")
|
||||
.addEventListener("click", openEditFeeCategory);
|
||||
.querySelector('.button--editFeeCategory')
|
||||
.addEventListener('click', openEditFeeCategory);
|
||||
feeCategoryContainerElement
|
||||
.querySelector(".button--addFee")
|
||||
.addEventListener("click", openAddFee);
|
||||
feeCategoryContainerElement.querySelector(".button--moveFeeCategoryUp").addEventListener("click", moveFeeCategory);
|
||||
feeCategoryContainerElement.querySelector(".button--moveFeeCategoryDown").addEventListener("click", moveFeeCategory);
|
||||
.querySelector('.button--addFee')
|
||||
.addEventListener('click', openAddFee);
|
||||
feeCategoryContainerElement.querySelector('.button--moveFeeCategoryUp').addEventListener('click', moveFeeCategory);
|
||||
feeCategoryContainerElement.querySelector('.button--moveFeeCategoryDown').addEventListener('click', moveFeeCategory);
|
||||
feeCategoriesContainerElement.append(feeCategoryContainerElement);
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Fee Categories
|
||||
*/
|
||||
document.querySelector("#button--addFeeCategory").addEventListener("click", () => {
|
||||
document
|
||||
.querySelector('#button--addFeeCategory')
|
||||
.addEventListener('click', () => {
|
||||
let addCloseModalFunction;
|
||||
const doAddFeeCategory = (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddFeeCategory", submitEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doAddFeeCategory', submitEvent.currentTarget, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
feeCategories = responseJSON.feeCategories;
|
||||
addCloseModalFunction();
|
||||
|
|
@ -166,36 +178,37 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Creating Fee Category",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Creating Fee Category',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
cityssm.openHtmlModal("adminFees-addFeeCategory", {
|
||||
cityssm.openHtmlModal('adminFees-addFeeCategory', {
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
modalElement.querySelector("#feeCategoryAdd--feeCategory").focus();
|
||||
modalElement.querySelector('#feeCategoryAdd--feeCategory').focus();
|
||||
addCloseModalFunction = closeModalFunction;
|
||||
modalElement.querySelector("form").addEventListener("submit", doAddFeeCategory);
|
||||
modalElement
|
||||
.querySelector('form')
|
||||
.addEventListener('submit', doAddFeeCategory);
|
||||
},
|
||||
onremoved() {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
document.querySelector("#button--addFeeCategory").focus();
|
||||
document.querySelector('#button--addFeeCategory').focus();
|
||||
}
|
||||
});
|
||||
});
|
||||
function openEditFeeCategory(clickEvent) {
|
||||
const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest(".container--feeCategory")
|
||||
.dataset.feeCategoryId, 10);
|
||||
const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest('.container--feeCategory').dataset.feeCategoryId, 10);
|
||||
const feeCategory = feeCategories.find((currentFeeCategory) => {
|
||||
return currentFeeCategory.feeCategoryId === feeCategoryId;
|
||||
});
|
||||
let editCloseModalFunction;
|
||||
function doUpdateFeeCategory(submitEvent) {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateFeeCategory", submitEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateFeeCategory', submitEvent.currentTarget, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
feeCategories = responseJSON.feeCategories;
|
||||
editCloseModalFunction();
|
||||
|
|
@ -203,25 +216,26 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating Fee Category",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Updating Fee Category',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
cityssm.openHtmlModal("adminFees-editFeeCategory", {
|
||||
cityssm.openHtmlModal('adminFees-editFeeCategory', {
|
||||
onshow(modalElement) {
|
||||
modalElement.querySelector("#feeCategoryEdit--feeCategoryId").value =
|
||||
feeCategory.feeCategoryId.toString();
|
||||
modalElement.querySelector("#feeCategoryEdit--feeCategory").value =
|
||||
feeCategory.feeCategory;
|
||||
;
|
||||
modalElement.querySelector('#feeCategoryEdit--feeCategoryId').value = feeCategory.feeCategoryId.toString();
|
||||
modalElement.querySelector('#feeCategoryEdit--feeCategory').value = feeCategory.feeCategory;
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
editCloseModalFunction = closeModalFunction;
|
||||
modalElement.querySelector("form").addEventListener("submit", doUpdateFeeCategory);
|
||||
modalElement.querySelector("#feeCategoryEdit--feeCategory").focus();
|
||||
modalElement
|
||||
.querySelector('form')
|
||||
.addEventListener('submit', doUpdateFeeCategory);
|
||||
modalElement.querySelector('#feeCategoryEdit--feeCategory').focus();
|
||||
},
|
||||
onremoved: () => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
|
|
@ -229,10 +243,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
});
|
||||
}
|
||||
function confirmDeleteFeeCategory(clickEvent) {
|
||||
const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest(".container--feeCategory")
|
||||
.dataset.feeCategoryId, 10);
|
||||
const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest('.container--feeCategory').dataset.feeCategoryId, 10);
|
||||
function doDelete() {
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteFeeCategory", {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteFeeCategory', {
|
||||
feeCategoryId
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
|
|
@ -241,32 +254,33 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating Fee Category",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Updating Fee Category',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
bulmaJS.confirm({
|
||||
title: "Delete Fee Category?",
|
||||
message: "Are you sure you want to delete this fee category?",
|
||||
contextualColorName: "warning",
|
||||
title: 'Delete Fee Category?',
|
||||
message: 'Are you sure you want to delete this fee category?',
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: "Yes, Delete the Fee Category",
|
||||
text: 'Yes, Delete the Fee Category',
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
});
|
||||
}
|
||||
function moveFeeCategory(clickEvent) {
|
||||
const buttonElement = clickEvent.currentTarget;
|
||||
const feeCategoryId = buttonElement.closest(".container--feeCategory").dataset
|
||||
.feeCategoryId;
|
||||
const feeCategoryId = buttonElement.closest('.container--feeCategory').dataset.feeCategoryId;
|
||||
cityssm.postJSON(los.urlPrefix +
|
||||
"/admin/" +
|
||||
(buttonElement.dataset.direction === "up" ? "doMoveFeeCategoryUp" : "doMoveFeeCategoryDown"), {
|
||||
'/admin/' +
|
||||
(buttonElement.dataset.direction === 'up'
|
||||
? 'doMoveFeeCategoryUp'
|
||||
: 'doMoveFeeCategoryDown'), {
|
||||
feeCategoryId,
|
||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
||||
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
feeCategories = responseJSON.feeCategories;
|
||||
|
|
@ -274,9 +288,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Moving Fee Category",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Moving Fee Category',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
@ -285,12 +299,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
* Fees
|
||||
*/
|
||||
function openAddFee(clickEvent) {
|
||||
const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest(".container--feeCategory")
|
||||
.dataset.feeCategoryId, 10);
|
||||
const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest('.container--feeCategory').dataset.feeCategoryId, 10);
|
||||
let addCloseModalFunction;
|
||||
function doAddFee(submitEvent) {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddFee", submitEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doAddFee', submitEvent.currentTarget, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
feeCategories = responseJSON.feeCategories;
|
||||
addCloseModalFunction();
|
||||
|
|
@ -298,18 +311,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Adding Fee",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Adding Fee',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
cityssm.openHtmlModal("adminFees-addFee", {
|
||||
cityssm.openHtmlModal('adminFees-addFee', {
|
||||
onshow(modalElement) {
|
||||
const feeCategoryElement = modalElement.querySelector("#feeAdd--feeCategoryId");
|
||||
const feeCategoryElement = modalElement.querySelector('#feeAdd--feeCategoryId');
|
||||
for (const feeCategory of feeCategories) {
|
||||
const optionElement = document.createElement("option");
|
||||
const optionElement = document.createElement('option');
|
||||
optionElement.value = feeCategory.feeCategoryId.toString();
|
||||
optionElement.textContent = feeCategory.feeCategory;
|
||||
if (feeCategory.feeCategoryId === feeCategoryId) {
|
||||
|
|
@ -317,60 +330,67 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
feeCategoryElement.append(optionElement);
|
||||
}
|
||||
const occupancyTypeElement = modalElement.querySelector("#feeAdd--occupancyTypeId");
|
||||
const occupancyTypeElement = modalElement.querySelector('#feeAdd--occupancyTypeId');
|
||||
for (const occupancyType of exports.occupancyTypes) {
|
||||
const optionElement = document.createElement("option");
|
||||
const optionElement = document.createElement('option');
|
||||
optionElement.value = occupancyType.occupancyTypeId.toString();
|
||||
optionElement.textContent = occupancyType.occupancyType;
|
||||
occupancyTypeElement.append(optionElement);
|
||||
}
|
||||
const lotTypeElement = modalElement.querySelector("#feeAdd--lotTypeId");
|
||||
const lotTypeElement = modalElement.querySelector('#feeAdd--lotTypeId');
|
||||
for (const lotType of exports.lotTypes) {
|
||||
const optionElement = document.createElement("option");
|
||||
const optionElement = document.createElement('option');
|
||||
optionElement.value = lotType.lotTypeId.toString();
|
||||
optionElement.textContent = lotType.lotType;
|
||||
lotTypeElement.append(optionElement);
|
||||
}
|
||||
modalElement.querySelector("#feeAdd--taxPercentage").value = exports.taxPercentageDefault.toString();
|
||||
;
|
||||
modalElement.querySelector('#feeAdd--taxPercentage').value = exports.taxPercentageDefault.toString();
|
||||
los.populateAliases(modalElement);
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
addCloseModalFunction = closeModalFunction;
|
||||
modalElement.querySelector("form").addEventListener("submit", doAddFee);
|
||||
modalElement.querySelector("#feeAdd--feeName").focus();
|
||||
modalElement.querySelector("#feeAdd--feeFunction").addEventListener("change", () => {
|
||||
const feeAmountElement = modalElement.querySelector("#feeAdd--feeAmount");
|
||||
const feeFunctionElement = modalElement.querySelector("#feeAdd--feeFunction");
|
||||
if (feeFunctionElement.value === "") {
|
||||
feeFunctionElement.closest(".select").classList.remove("is-success");
|
||||
feeAmountElement.classList.add("is-success");
|
||||
modalElement.querySelector('form').addEventListener('submit', doAddFee);
|
||||
modalElement.querySelector('#feeAdd--feeName').focus();
|
||||
modalElement.querySelector('#feeAdd--feeFunction').addEventListener('change', () => {
|
||||
const feeAmountElement = modalElement.querySelector('#feeAdd--feeAmount');
|
||||
const feeFunctionElement = modalElement.querySelector('#feeAdd--feeFunction');
|
||||
if (feeFunctionElement.value === '') {
|
||||
feeFunctionElement
|
||||
.closest('.select')
|
||||
.classList.remove('is-success');
|
||||
feeAmountElement.classList.add('is-success');
|
||||
feeAmountElement.disabled = false;
|
||||
}
|
||||
else {
|
||||
feeFunctionElement.closest(".select").classList.add("is-success");
|
||||
feeAmountElement.classList.remove("is-success");
|
||||
feeFunctionElement.closest('.select').classList.add('is-success');
|
||||
feeAmountElement.classList.remove('is-success');
|
||||
feeAmountElement.disabled = true;
|
||||
}
|
||||
});
|
||||
modalElement.querySelector("#feeAdd--taxPercentage").addEventListener("keyup", () => {
|
||||
const taxAmountElement = modalElement.querySelector("#feeAdd--taxAmount");
|
||||
const taxPercentageElement = modalElement.querySelector("#feeAdd--taxPercentage");
|
||||
if (taxPercentageElement.value === "") {
|
||||
taxPercentageElement.classList.remove("is-success");
|
||||
taxAmountElement.classList.add("is-success");
|
||||
modalElement
|
||||
.querySelector('#feeAdd--taxPercentage')
|
||||
.addEventListener('keyup', () => {
|
||||
const taxAmountElement = modalElement.querySelector('#feeAdd--taxAmount');
|
||||
const taxPercentageElement = modalElement.querySelector('#feeAdd--taxPercentage');
|
||||
if (taxPercentageElement.value === '') {
|
||||
taxPercentageElement.classList.remove('is-success');
|
||||
taxAmountElement.classList.add('is-success');
|
||||
taxAmountElement.disabled = false;
|
||||
}
|
||||
else {
|
||||
taxPercentageElement.classList.add("is-success");
|
||||
taxAmountElement.classList.remove("is-success");
|
||||
taxPercentageElement.classList.add('is-success');
|
||||
taxAmountElement.classList.remove('is-success');
|
||||
taxAmountElement.disabled = true;
|
||||
}
|
||||
});
|
||||
modalElement.querySelector("#feeAdd--includeQuantity").addEventListener("change", () => {
|
||||
modalElement.querySelector("#feeAdd--quantityUnit").disabled =
|
||||
modalElement.querySelector("#feeAdd--includeQuantity")
|
||||
.value === "";
|
||||
modalElement
|
||||
.querySelector('#feeAdd--includeQuantity')
|
||||
.addEventListener('change', () => {
|
||||
;
|
||||
modalElement.querySelector('#feeAdd--quantityUnit').disabled =
|
||||
modalElement.querySelector('#feeAdd--includeQuantity').value === '';
|
||||
});
|
||||
},
|
||||
onremoved() {
|
||||
|
|
@ -380,9 +400,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
function openEditFee(clickEvent) {
|
||||
clickEvent.preventDefault();
|
||||
const feeContainerElement = clickEvent.currentTarget.closest(".container--fee");
|
||||
const feeContainerElement = clickEvent.currentTarget.closest('.container--fee');
|
||||
const feeId = Number.parseInt(feeContainerElement.dataset.feeId, 10);
|
||||
const feeCategoryId = Number.parseInt(feeContainerElement.closest(".container--feeCategory").dataset.feeCategoryId);
|
||||
const feeCategoryId = Number.parseInt(feeContainerElement.closest('.container--feeCategory')
|
||||
.dataset.feeCategoryId);
|
||||
const feeCategory = feeCategories.find((currentFeeCategory) => {
|
||||
return currentFeeCategory.feeCategoryId === feeCategoryId;
|
||||
});
|
||||
|
|
@ -393,7 +414,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
let editModalElement;
|
||||
function doUpdateFee(submitEvent) {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateFee", submitEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateFee', submitEvent.currentTarget, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
feeCategories = responseJSON.feeCategories;
|
||||
editCloseModalFunction();
|
||||
|
|
@ -401,9 +422,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating Fee",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Updating Fee',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
@ -411,7 +432,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
function confirmDeleteFee(clickEvent) {
|
||||
clickEvent.preventDefault();
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteFee", {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteFee', {
|
||||
feeId
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
|
|
@ -421,64 +442,62 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Deleting Fee",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Deleting Fee',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
bulmaJS.confirm({
|
||||
title: "Delete Fee?",
|
||||
message: "Are you sure you want to delete this fee?",
|
||||
contextualColorName: "warning",
|
||||
title: 'Delete Fee?',
|
||||
message: 'Are you sure you want to delete this fee?',
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: "Yes, Delete the Fee",
|
||||
text: 'Yes, Delete the Fee',
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
});
|
||||
}
|
||||
function toggleFeeFields() {
|
||||
const feeAmountElement = editModalElement.querySelector("#feeEdit--feeAmount");
|
||||
const feeFunctionElement = editModalElement.querySelector("#feeEdit--feeFunction");
|
||||
if (feeFunctionElement.value === "") {
|
||||
feeFunctionElement.closest(".select").classList.remove("is-success");
|
||||
feeAmountElement.classList.add("is-success");
|
||||
const feeAmountElement = editModalElement.querySelector('#feeEdit--feeAmount');
|
||||
const feeFunctionElement = editModalElement.querySelector('#feeEdit--feeFunction');
|
||||
if (feeFunctionElement.value === '') {
|
||||
feeFunctionElement.closest('.select').classList.remove('is-success');
|
||||
feeAmountElement.classList.add('is-success');
|
||||
feeAmountElement.disabled = false;
|
||||
}
|
||||
else {
|
||||
feeFunctionElement.closest(".select").classList.add("is-success");
|
||||
feeAmountElement.classList.remove("is-success");
|
||||
feeFunctionElement.closest('.select').classList.add('is-success');
|
||||
feeAmountElement.classList.remove('is-success');
|
||||
feeAmountElement.disabled = true;
|
||||
}
|
||||
}
|
||||
function toggleTaxFields() {
|
||||
const taxAmountElement = editModalElement.querySelector("#feeEdit--taxAmount");
|
||||
const taxPercentageElement = editModalElement.querySelector("#feeEdit--taxPercentage");
|
||||
if (taxPercentageElement.value === "") {
|
||||
taxPercentageElement.classList.remove("is-success");
|
||||
taxAmountElement.classList.add("is-success");
|
||||
const taxAmountElement = editModalElement.querySelector('#feeEdit--taxAmount');
|
||||
const taxPercentageElement = editModalElement.querySelector('#feeEdit--taxPercentage');
|
||||
if (taxPercentageElement.value === '') {
|
||||
taxPercentageElement.classList.remove('is-success');
|
||||
taxAmountElement.classList.add('is-success');
|
||||
taxAmountElement.disabled = false;
|
||||
}
|
||||
else {
|
||||
taxPercentageElement.classList.add("is-success");
|
||||
taxAmountElement.classList.remove("is-success");
|
||||
taxPercentageElement.classList.add('is-success');
|
||||
taxAmountElement.classList.remove('is-success');
|
||||
taxAmountElement.disabled = true;
|
||||
}
|
||||
}
|
||||
function toggleQuantityFields() {
|
||||
const includeQuanitityValue = editModalElement.querySelector("#feeEdit--includeQuantity").value;
|
||||
editModalElement.querySelector("#feeEdit--quantityUnit").disabled =
|
||||
includeQuanitityValue === "";
|
||||
const includeQuanitityValue = editModalElement.querySelector('#feeEdit--includeQuantity').value;
|
||||
editModalElement.querySelector('#feeEdit--quantityUnit').disabled = includeQuanitityValue === '';
|
||||
}
|
||||
cityssm.openHtmlModal("adminFees-editFee", {
|
||||
cityssm.openHtmlModal('adminFees-editFee', {
|
||||
onshow(modalElement) {
|
||||
editModalElement = modalElement;
|
||||
modalElement.querySelector("#feeEdit--feeId").value =
|
||||
fee.feeId.toString();
|
||||
const feeCategoryElement = modalElement.querySelector("#feeEdit--feeCategoryId");
|
||||
modalElement.querySelector('#feeEdit--feeId').value = fee.feeId.toString();
|
||||
const feeCategoryElement = modalElement.querySelector('#feeEdit--feeCategoryId');
|
||||
for (const feeCategory of feeCategories) {
|
||||
const optionElement = document.createElement("option");
|
||||
const optionElement = document.createElement('option');
|
||||
optionElement.value = feeCategory.feeCategoryId.toString();
|
||||
optionElement.textContent = feeCategory.feeCategory;
|
||||
if (feeCategory.feeCategoryId === feeCategoryId) {
|
||||
|
|
@ -486,12 +505,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
feeCategoryElement.append(optionElement);
|
||||
}
|
||||
modalElement.querySelector("#feeEdit--feeName").value = fee.feeName;
|
||||
modalElement.querySelector("#feeEdit--feeDescription").value =
|
||||
fee.feeDescription;
|
||||
const occupancyTypeElement = modalElement.querySelector("#feeEdit--occupancyTypeId");
|
||||
;
|
||||
modalElement.querySelector('#feeEdit--feeName').value = fee.feeName;
|
||||
modalElement.querySelector('#feeEdit--feeDescription').value = fee.feeDescription;
|
||||
const occupancyTypeElement = modalElement.querySelector('#feeEdit--occupancyTypeId');
|
||||
for (const occupancyType of exports.occupancyTypes) {
|
||||
const optionElement = document.createElement("option");
|
||||
const optionElement = document.createElement('option');
|
||||
optionElement.value = occupancyType.occupancyTypeId.toString();
|
||||
optionElement.textContent = occupancyType.occupancyType;
|
||||
if (occupancyType.occupancyTypeId === fee.occupancyTypeId) {
|
||||
|
|
@ -499,9 +518,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
occupancyTypeElement.append(optionElement);
|
||||
}
|
||||
const lotTypeElement = modalElement.querySelector("#feeEdit--lotTypeId");
|
||||
const lotTypeElement = modalElement.querySelector('#feeEdit--lotTypeId');
|
||||
for (const lotType of exports.lotTypes) {
|
||||
const optionElement = document.createElement("option");
|
||||
const optionElement = document.createElement('option');
|
||||
optionElement.value = lotType.lotTypeId.toString();
|
||||
optionElement.textContent = lotType.lotType;
|
||||
if (lotType.lotTypeId === fee.lotTypeId) {
|
||||
|
|
@ -509,39 +528,42 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
lotTypeElement.append(optionElement);
|
||||
}
|
||||
modalElement.querySelector("#feeEdit--feeAmount").value = fee.feeAmount
|
||||
? fee.feeAmount.toFixed(2)
|
||||
: "";
|
||||
;
|
||||
modalElement.querySelector('#feeEdit--feeAmount').value = fee.feeAmount ? fee.feeAmount.toFixed(2) : '';
|
||||
modalElement
|
||||
.querySelector("#feeEdit--feeFunction")
|
||||
.addEventListener("change", toggleFeeFields);
|
||||
.querySelector('#feeEdit--feeFunction')
|
||||
.addEventListener('change', toggleFeeFields);
|
||||
toggleFeeFields();
|
||||
modalElement.querySelector("#feeEdit--taxAmount").value = fee.taxAmount
|
||||
? fee.taxAmount.toFixed(2)
|
||||
: "";
|
||||
const taxPercentageElement = modalElement.querySelector("#feeEdit--taxPercentage");
|
||||
taxPercentageElement.value = fee.taxPercentage ? fee.taxPercentage.toString() : "";
|
||||
taxPercentageElement.addEventListener("keyup", toggleTaxFields);
|
||||
modalElement.querySelector('#feeEdit--taxAmount').value = fee.taxAmount ? fee.taxAmount.toFixed(2) : '';
|
||||
const taxPercentageElement = modalElement.querySelector('#feeEdit--taxPercentage');
|
||||
taxPercentageElement.value = fee.taxPercentage
|
||||
? fee.taxPercentage.toString()
|
||||
: '';
|
||||
taxPercentageElement.addEventListener('keyup', toggleTaxFields);
|
||||
toggleTaxFields();
|
||||
const includeQuantityElement = modalElement.querySelector("#feeEdit--includeQuantity");
|
||||
const includeQuantityElement = modalElement.querySelector('#feeEdit--includeQuantity');
|
||||
if (fee.includeQuantity) {
|
||||
includeQuantityElement.value = "1";
|
||||
includeQuantityElement.value = '1';
|
||||
}
|
||||
includeQuantityElement.addEventListener("change", toggleQuantityFields);
|
||||
modalElement.querySelector("#feeEdit--quantityUnit").value =
|
||||
fee.quantityUnit || "";
|
||||
includeQuantityElement.addEventListener('change', toggleQuantityFields);
|
||||
modalElement.querySelector('#feeEdit--quantityUnit').value = fee.quantityUnit || '';
|
||||
toggleQuantityFields();
|
||||
if (fee.isRequired) {
|
||||
modalElement.querySelector("#feeEdit--isRequired").value = "1";
|
||||
;
|
||||
modalElement.querySelector('#feeEdit--isRequired').value = '1';
|
||||
}
|
||||
los.populateAliases(modalElement);
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
editCloseModalFunction = closeModalFunction;
|
||||
modalElement.querySelector("form").addEventListener("submit", doUpdateFee);
|
||||
modalElement
|
||||
.querySelector('form')
|
||||
.addEventListener('submit', doUpdateFee);
|
||||
bulmaJS.init(modalElement);
|
||||
modalElement.querySelector(".button--deleteFee").addEventListener("click", confirmDeleteFee);
|
||||
modalElement
|
||||
.querySelector('.button--deleteFee')
|
||||
.addEventListener('click', confirmDeleteFee);
|
||||
},
|
||||
onremoved: () => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
|
|
@ -550,13 +572,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
function moveFee(clickEvent) {
|
||||
const buttonElement = clickEvent.currentTarget;
|
||||
const feeContainerElement = buttonElement.closest(".container--fee");
|
||||
const feeContainerElement = buttonElement.closest('.container--fee');
|
||||
const feeId = feeContainerElement.dataset.feeId;
|
||||
cityssm.postJSON(los.urlPrefix +
|
||||
"/admin/" +
|
||||
(buttonElement.dataset.direction === "up" ? "doMoveFeeUp" : "doMoveFeeDown"), {
|
||||
'/admin/' +
|
||||
(buttonElement.dataset.direction === 'up'
|
||||
? 'doMoveFeeUp'
|
||||
: 'doMoveFeeDown'), {
|
||||
feeId,
|
||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
||||
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
feeCategories = responseJSON.feeCategories;
|
||||
|
|
@ -564,9 +588,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Moving Fee",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Moving Fee',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -3,13 +3,13 @@
|
|||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
(() => {
|
||||
const los = exports.los;
|
||||
const containerElement = document.querySelector("#container--lotTypes");
|
||||
const containerElement = document.querySelector('#container--lotTypes');
|
||||
let lotTypes = exports.lotTypes;
|
||||
delete exports.lotTypes;
|
||||
const expandedLotTypes = new Set();
|
||||
function toggleLotTypeFields(clickEvent) {
|
||||
const toggleButtonElement = clickEvent.currentTarget;
|
||||
const lotTypeElement = toggleButtonElement.closest(".container--lotType");
|
||||
const lotTypeElement = toggleButtonElement.closest('.container--lotType');
|
||||
const lotTypeId = Number.parseInt(lotTypeElement.dataset.lotTypeId, 10);
|
||||
if (expandedLotTypes.has(lotTypeId)) {
|
||||
expandedLotTypes.delete(lotTypeId);
|
||||
|
|
@ -20,9 +20,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
toggleButtonElement.innerHTML = expandedLotTypes.has(lotTypeId)
|
||||
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
|
||||
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>';
|
||||
const panelBlockElements = lotTypeElement.querySelectorAll(".panel-block");
|
||||
const panelBlockElements = lotTypeElement.querySelectorAll('.panel-block');
|
||||
for (const panelBlockElement of panelBlockElements) {
|
||||
panelBlockElement.classList.toggle("is-hidden");
|
||||
panelBlockElement.classList.toggle('is-hidden');
|
||||
}
|
||||
}
|
||||
function lotTypeResponseHandler(responseJSON) {
|
||||
|
|
@ -33,23 +33,22 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Updating ${exports.aliases.lot} Type`,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
}
|
||||
function deleteLotType(clickEvent) {
|
||||
const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--lotType").dataset
|
||||
.lotTypeId, 10);
|
||||
const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotType').dataset.lotTypeId, 10);
|
||||
function doDelete() {
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteLotType", {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteLotType', {
|
||||
lotTypeId
|
||||
}, lotTypeResponseHandler);
|
||||
}
|
||||
bulmaJS.confirm({
|
||||
title: `Delete ${exports.aliases.lot} Type`,
|
||||
message: `Are you sure you want to delete this ${exports.aliases.lot.toLowerCase()} type?`,
|
||||
contextualColorName: "warning",
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: `Yes, Delete ${exports.aliases.lot} Type`,
|
||||
callbackFunction: doDelete
|
||||
|
|
@ -57,33 +56,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
});
|
||||
}
|
||||
function openEditLotType(clickEvent) {
|
||||
const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--lotType").dataset
|
||||
.lotTypeId, 10);
|
||||
const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotType').dataset.lotTypeId, 10);
|
||||
const lotType = lotTypes.find((currentLotType) => {
|
||||
return lotTypeId === currentLotType.lotTypeId;
|
||||
});
|
||||
let editCloseModalFunction;
|
||||
const doEdit = (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateLotType", submitEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateLotType', submitEvent.currentTarget, (responseJSON) => {
|
||||
lotTypeResponseHandler(responseJSON);
|
||||
if (responseJSON.success) {
|
||||
editCloseModalFunction();
|
||||
}
|
||||
});
|
||||
};
|
||||
cityssm.openHtmlModal("adminLotTypes-editLotType", {
|
||||
cityssm.openHtmlModal('adminLotTypes-editLotType', {
|
||||
onshow(modalElement) {
|
||||
los.populateAliases(modalElement);
|
||||
modalElement.querySelector("#lotTypeEdit--lotTypeId").value =
|
||||
lotTypeId.toString();
|
||||
modalElement.querySelector("#lotTypeEdit--lotType").value =
|
||||
lotType.lotType;
|
||||
modalElement.querySelector('#lotTypeEdit--lotTypeId').value = lotTypeId.toString();
|
||||
modalElement.querySelector('#lotTypeEdit--lotType').value = lotType.lotType;
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
editCloseModalFunction = closeModalFunction;
|
||||
modalElement.querySelector("#lotTypeEdit--lotType").focus();
|
||||
modalElement.querySelector("form").addEventListener("submit", doEdit);
|
||||
modalElement.querySelector('#lotTypeEdit--lotType').focus();
|
||||
modalElement.querySelector('form').addEventListener('submit', doEdit);
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
},
|
||||
onremoved() {
|
||||
|
|
@ -92,12 +88,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
});
|
||||
}
|
||||
function openAddLotTypeField(clickEvent) {
|
||||
const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--lotType").dataset
|
||||
.lotTypeId, 10);
|
||||
const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotType').dataset.lotTypeId, 10);
|
||||
let addCloseModalFunction;
|
||||
const doAdd = (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddLotTypeField", submitEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doAddLotTypeField', submitEvent.currentTarget, (responseJSON) => {
|
||||
expandedLotTypes.add(lotTypeId);
|
||||
lotTypeResponseHandler(responseJSON);
|
||||
if (responseJSON.success) {
|
||||
|
|
@ -106,18 +101,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
});
|
||||
};
|
||||
cityssm.openHtmlModal("adminLotTypes-addLotTypeField", {
|
||||
cityssm.openHtmlModal('adminLotTypes-addLotTypeField', {
|
||||
onshow(modalElement) {
|
||||
los.populateAliases(modalElement);
|
||||
if (lotTypeId) {
|
||||
modalElement.querySelector("#lotTypeFieldAdd--lotTypeId").value =
|
||||
lotTypeId.toString();
|
||||
;
|
||||
modalElement.querySelector('#lotTypeFieldAdd--lotTypeId').value = lotTypeId.toString();
|
||||
}
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
addCloseModalFunction = closeModalFunction;
|
||||
modalElement.querySelector("#lotTypeFieldAdd--lotTypeField").focus();
|
||||
modalElement.querySelector("form").addEventListener("submit", doAdd);
|
||||
modalElement.querySelector('#lotTypeFieldAdd--lotTypeField').focus();
|
||||
modalElement.querySelector('form').addEventListener('submit', doAdd);
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
},
|
||||
onremoved() {
|
||||
|
|
@ -127,12 +122,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
function moveLotType(clickEvent) {
|
||||
const buttonElement = clickEvent.currentTarget;
|
||||
const lotTypeId = buttonElement.closest(".container--lotType").dataset.lotTypeId;
|
||||
const lotTypeId = buttonElement.closest('.container--lotType').dataset.lotTypeId;
|
||||
cityssm.postJSON(los.urlPrefix +
|
||||
"/admin/" +
|
||||
(buttonElement.dataset.direction === "up" ? "doMoveLotTypeUp" : "doMoveLotTypeDown"), {
|
||||
'/admin/' +
|
||||
(buttonElement.dataset.direction === 'up'
|
||||
? 'doMoveLotTypeUp'
|
||||
: 'doMoveLotTypeDown'), {
|
||||
lotTypeId,
|
||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
||||
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||
}, lotTypeResponseHandler);
|
||||
}
|
||||
function openEditLotTypeField(lotTypeId, lotTypeFieldId) {
|
||||
|
|
@ -151,7 +148,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
maximumLengthElement.min = minimumLengthElement.value;
|
||||
}
|
||||
function toggleInputFields() {
|
||||
if (lotTypeFieldValuesElement.value === "") {
|
||||
if (lotTypeFieldValuesElement.value === '') {
|
||||
minimumLengthElement.disabled = false;
|
||||
maximumLengthElement.disabled = false;
|
||||
patternElement.disabled = false;
|
||||
|
|
@ -164,7 +161,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
function doUpdate(submitEvent) {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateLotTypeField", submitEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateLotTypeField', submitEvent.currentTarget, (responseJSON) => {
|
||||
lotTypeResponseHandler(responseJSON);
|
||||
if (responseJSON.success) {
|
||||
editCloseModalFunction();
|
||||
|
|
@ -172,7 +169,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
});
|
||||
}
|
||||
function doDelete() {
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteLotTypeField", {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteLotTypeField', {
|
||||
lotTypeFieldId
|
||||
}, (responseJSON) => {
|
||||
lotTypeResponseHandler(responseJSON);
|
||||
|
|
@ -183,31 +180,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
function confirmDoDelete() {
|
||||
bulmaJS.confirm({
|
||||
title: "Delete Field",
|
||||
message: "Are you sure you want to delete this field? Note that historical records that make use of this field will not be affected.",
|
||||
contextualColorName: "warning",
|
||||
title: 'Delete Field',
|
||||
message: 'Are you sure you want to delete this field? Note that historical records that make use of this field will not be affected.',
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: "Yes, Delete Field",
|
||||
text: 'Yes, Delete Field',
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
});
|
||||
}
|
||||
cityssm.openHtmlModal("adminLotTypes-editLotTypeField", {
|
||||
cityssm.openHtmlModal('adminLotTypes-editLotTypeField', {
|
||||
onshow(modalElement) {
|
||||
los.populateAliases(modalElement);
|
||||
modalElement.querySelector("#lotTypeFieldEdit--lotTypeFieldId").value =
|
||||
lotTypeField.lotTypeFieldId.toString();
|
||||
modalElement.querySelector("#lotTypeFieldEdit--lotTypeField").value =
|
||||
lotTypeField.lotTypeField;
|
||||
modalElement.querySelector("#lotTypeFieldEdit--isRequired").value =
|
||||
lotTypeField.isRequired ? "1" : "0";
|
||||
minimumLengthElement = modalElement.querySelector("#lotTypeFieldEdit--minimumLength");
|
||||
modalElement.querySelector('#lotTypeFieldEdit--lotTypeFieldId').value = lotTypeField.lotTypeFieldId.toString();
|
||||
modalElement.querySelector('#lotTypeFieldEdit--lotTypeField').value = lotTypeField.lotTypeField;
|
||||
modalElement.querySelector('#lotTypeFieldEdit--isRequired').value = lotTypeField.isRequired ? '1' : '0';
|
||||
minimumLengthElement = modalElement.querySelector('#lotTypeFieldEdit--minimumLength');
|
||||
minimumLengthElement.value = lotTypeField.minimumLength.toString();
|
||||
maximumLengthElement = modalElement.querySelector("#lotTypeFieldEdit--maximumLength");
|
||||
maximumLengthElement = modalElement.querySelector('#lotTypeFieldEdit--maximumLength');
|
||||
maximumLengthElement.value = lotTypeField.maximumLength.toString();
|
||||
patternElement = modalElement.querySelector("#lotTypeFieldEdit--pattern");
|
||||
patternElement = modalElement.querySelector('#lotTypeFieldEdit--pattern');
|
||||
patternElement.value = lotTypeField.pattern;
|
||||
lotTypeFieldValuesElement = modalElement.querySelector("#lotTypeFieldEdit--lotTypeFieldValues");
|
||||
lotTypeFieldValuesElement = modalElement.querySelector('#lotTypeFieldEdit--lotTypeFieldValues');
|
||||
lotTypeFieldValuesElement.value = lotTypeField.lotTypeFieldValues;
|
||||
toggleInputFields();
|
||||
},
|
||||
|
|
@ -216,13 +210,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
bulmaJS.init(modalElement);
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
cityssm.enableNavBlocker();
|
||||
modalElement.querySelector("form").addEventListener("submit", doUpdate);
|
||||
minimumLengthElement.addEventListener("keyup", updateMaximumLengthMin);
|
||||
modalElement.querySelector('form').addEventListener('submit', doUpdate);
|
||||
minimumLengthElement.addEventListener('keyup', updateMaximumLengthMin);
|
||||
updateMaximumLengthMin();
|
||||
lotTypeFieldValuesElement.addEventListener("keyup", toggleInputFields);
|
||||
lotTypeFieldValuesElement.addEventListener('keyup', toggleInputFields);
|
||||
modalElement
|
||||
.querySelector("#button--deleteLotTypeField")
|
||||
.addEventListener("click", confirmDoDelete);
|
||||
.querySelector('#button--deleteLotTypeField')
|
||||
.addEventListener('click', confirmDoDelete);
|
||||
},
|
||||
onremoved() {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
|
|
@ -232,78 +226,77 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
function openEditLotTypeFieldByClick(clickEvent) {
|
||||
clickEvent.preventDefault();
|
||||
const lotTypeFieldId = Number.parseInt(clickEvent.currentTarget.closest(".container--lotTypeField")
|
||||
.dataset.lotTypeFieldId, 10);
|
||||
const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--lotType").dataset
|
||||
.lotTypeId, 10);
|
||||
const lotTypeFieldId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotTypeField').dataset.lotTypeFieldId, 10);
|
||||
const lotTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--lotType').dataset.lotTypeId, 10);
|
||||
openEditLotTypeField(lotTypeId, lotTypeFieldId);
|
||||
}
|
||||
function moveLotTypeField(clickEvent) {
|
||||
const buttonElement = clickEvent.currentTarget;
|
||||
const lotTypeFieldId = buttonElement.closest(".container--lotTypeField").dataset
|
||||
.lotTypeFieldId;
|
||||
const lotTypeFieldId = buttonElement.closest('.container--lotTypeField').dataset.lotTypeFieldId;
|
||||
cityssm.postJSON(los.urlPrefix +
|
||||
"/admin/" +
|
||||
(buttonElement.dataset.direction === "up"
|
||||
? "doMoveLotTypeFieldUp"
|
||||
: "doMoveLotTypeFieldDown"), {
|
||||
'/admin/' +
|
||||
(buttonElement.dataset.direction === 'up'
|
||||
? 'doMoveLotTypeFieldUp'
|
||||
: 'doMoveLotTypeFieldDown'), {
|
||||
lotTypeFieldId,
|
||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
||||
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||
}, lotTypeResponseHandler);
|
||||
}
|
||||
function renderLotTypeFields(panelElement, lotTypeId, lotTypeFields) {
|
||||
if (lotTypeFields.length === 0) {
|
||||
panelElement.insertAdjacentHTML("beforeend", '<div class="panel-block is-block' +
|
||||
(expandedLotTypes.has(lotTypeId) ? "" : " is-hidden") +
|
||||
panelElement.insertAdjacentHTML('beforeend', '<div class="panel-block is-block' +
|
||||
(expandedLotTypes.has(lotTypeId) ? '' : ' is-hidden') +
|
||||
'">' +
|
||||
'<div class="message is-info">' +
|
||||
'<p class="message-body">There are no additional fields.</p>' +
|
||||
"</div>" +
|
||||
"</div>");
|
||||
'</div>' +
|
||||
'</div>');
|
||||
}
|
||||
else {
|
||||
for (const lotTypeField of lotTypeFields) {
|
||||
const panelBlockElement = document.createElement("div");
|
||||
panelBlockElement.className = "panel-block is-block container--lotTypeField";
|
||||
const panelBlockElement = document.createElement('div');
|
||||
panelBlockElement.className =
|
||||
'panel-block is-block container--lotTypeField';
|
||||
if (!expandedLotTypes.has(lotTypeId)) {
|
||||
panelBlockElement.classList.add("is-hidden");
|
||||
panelBlockElement.classList.add('is-hidden');
|
||||
}
|
||||
panelBlockElement.dataset.lotTypeFieldId = lotTypeField.lotTypeFieldId.toString();
|
||||
panelBlockElement.dataset.lotTypeFieldId =
|
||||
lotTypeField.lotTypeFieldId.toString();
|
||||
panelBlockElement.innerHTML =
|
||||
'<div class="level is-mobile">' +
|
||||
'<div class="level-left">' +
|
||||
('<div class="level-item">' +
|
||||
'<a class="has-text-weight-bold button--editLotTypeField" href="#">' +
|
||||
cityssm.escapeHTML(lotTypeField.lotTypeField || "") +
|
||||
"</a>" +
|
||||
"</div>") +
|
||||
"</div>" +
|
||||
cityssm.escapeHTML(lotTypeField.lotTypeField || '') +
|
||||
'</a>' +
|
||||
'</div>') +
|
||||
'</div>' +
|
||||
'<div class="level-right">' +
|
||||
('<div class="level-item">' +
|
||||
los.getMoveUpDownButtonFieldHTML("button--moveLotTypeFieldUp", "button--moveLotTypeFieldDown") +
|
||||
"</div>") +
|
||||
"</div>" +
|
||||
"</div>";
|
||||
los.getMoveUpDownButtonFieldHTML('button--moveLotTypeFieldUp', 'button--moveLotTypeFieldDown') +
|
||||
'</div>') +
|
||||
'</div>' +
|
||||
'</div>';
|
||||
panelBlockElement
|
||||
.querySelector(".button--editLotTypeField")
|
||||
.addEventListener("click", openEditLotTypeFieldByClick);
|
||||
panelBlockElement.querySelector(".button--moveLotTypeFieldUp").addEventListener("click", moveLotTypeField);
|
||||
panelBlockElement.querySelector(".button--moveLotTypeFieldDown").addEventListener("click", moveLotTypeField);
|
||||
.querySelector('.button--editLotTypeField')
|
||||
.addEventListener('click', openEditLotTypeFieldByClick);
|
||||
panelBlockElement.querySelector('.button--moveLotTypeFieldUp').addEventListener('click', moveLotTypeField);
|
||||
panelBlockElement.querySelector('.button--moveLotTypeFieldDown').addEventListener('click', moveLotTypeField);
|
||||
panelElement.append(panelBlockElement);
|
||||
}
|
||||
}
|
||||
}
|
||||
function renderLotTypes() {
|
||||
containerElement.innerHTML = "";
|
||||
containerElement.innerHTML = '';
|
||||
if (lotTypes.length === 0) {
|
||||
containerElement.insertAdjacentHTML("afterbegin", `<div class="message is-warning>
|
||||
containerElement.insertAdjacentHTML('afterbegin', `<div class="message is-warning>
|
||||
<p class="message-body">There are no active ${los.escapedAliases.lot} types.</p>
|
||||
</div>`);
|
||||
return;
|
||||
}
|
||||
for (const lotType of lotTypes) {
|
||||
const lotTypeContainer = document.createElement("div");
|
||||
lotTypeContainer.className = "panel container--lotType";
|
||||
const lotTypeContainer = document.createElement('div');
|
||||
lotTypeContainer.className = 'panel container--lotType';
|
||||
lotTypeContainer.dataset.lotTypeId = lotType.lotTypeId.toString();
|
||||
lotTypeContainer.innerHTML =
|
||||
'<div class="panel-heading">' +
|
||||
|
|
@ -314,64 +307,66 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
(expandedLotTypes.has(lotType.lotTypeId)
|
||||
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
|
||||
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>') +
|
||||
"</button>" +
|
||||
"</div>" +
|
||||
'</button>' +
|
||||
'</div>' +
|
||||
'<div class="level-item">' +
|
||||
'<h2 class="title is-4">' +
|
||||
cityssm.escapeHTML(lotType.lotType) +
|
||||
"</h2>" +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
'</h2>' +
|
||||
'</div>' +
|
||||
'</div>') +
|
||||
('<div class="level-right">' +
|
||||
('<div class="level-item">' +
|
||||
'<button class="button is-danger is-small button--deleteLotType" type="button">' +
|
||||
'<span class="icon is-small"><i class="fas fa-trash" aria-hidden="true"></i></span>' +
|
||||
"<span>Delete</span>" +
|
||||
"</button>" +
|
||||
"</div>") +
|
||||
'<span>Delete</span>' +
|
||||
'</button>' +
|
||||
'</div>') +
|
||||
('<div class="level-item">' +
|
||||
'<button class="button is-primary is-small button--editLotType" type="button">' +
|
||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||
"<span>Edit " +
|
||||
'<span>Edit ' +
|
||||
exports.aliases.lot +
|
||||
" Type</span>" +
|
||||
"</button>" +
|
||||
"</div>") +
|
||||
' Type</span>' +
|
||||
'</button>' +
|
||||
'</div>') +
|
||||
('<div class="level-item">' +
|
||||
'<button class="button is-success is-small button--addLotTypeField" type="button">' +
|
||||
'<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>' +
|
||||
"<span>Add Field</span>" +
|
||||
"</button>" +
|
||||
"</div>") +
|
||||
'<span>Add Field</span>' +
|
||||
'</button>' +
|
||||
'</div>') +
|
||||
('<div class="level-item">' +
|
||||
los.getMoveUpDownButtonFieldHTML("button--moveLotTypeUp", "button--moveLotTypeDown") +
|
||||
"</div>") +
|
||||
"</div>") +
|
||||
"</div>" +
|
||||
"</div>";
|
||||
los.getMoveUpDownButtonFieldHTML('button--moveLotTypeUp', 'button--moveLotTypeDown') +
|
||||
'</div>') +
|
||||
'</div>') +
|
||||
'</div>' +
|
||||
'</div>';
|
||||
renderLotTypeFields(lotTypeContainer, lotType.lotTypeId, lotType.lotTypeFields);
|
||||
lotTypeContainer
|
||||
.querySelector(".button--toggleLotTypeFields")
|
||||
.addEventListener("click", toggleLotTypeFields);
|
||||
.querySelector('.button--toggleLotTypeFields')
|
||||
.addEventListener('click', toggleLotTypeFields);
|
||||
lotTypeContainer
|
||||
.querySelector(".button--deleteLotType")
|
||||
.addEventListener("click", deleteLotType);
|
||||
.querySelector('.button--deleteLotType')
|
||||
.addEventListener('click', deleteLotType);
|
||||
lotTypeContainer
|
||||
.querySelector(".button--editLotType")
|
||||
.addEventListener("click", openEditLotType);
|
||||
.querySelector('.button--editLotType')
|
||||
.addEventListener('click', openEditLotType);
|
||||
lotTypeContainer
|
||||
.querySelector(".button--addLotTypeField")
|
||||
.addEventListener("click", openAddLotTypeField);
|
||||
lotTypeContainer.querySelector(".button--moveLotTypeUp").addEventListener("click", moveLotType);
|
||||
lotTypeContainer.querySelector(".button--moveLotTypeDown").addEventListener("click", moveLotType);
|
||||
.querySelector('.button--addLotTypeField')
|
||||
.addEventListener('click', openAddLotTypeField);
|
||||
lotTypeContainer.querySelector('.button--moveLotTypeUp').addEventListener('click', moveLotType);
|
||||
lotTypeContainer.querySelector('.button--moveLotTypeDown').addEventListener('click', moveLotType);
|
||||
containerElement.append(lotTypeContainer);
|
||||
}
|
||||
}
|
||||
document.querySelector("#button--addLotType").addEventListener("click", () => {
|
||||
document
|
||||
.querySelector('#button--addLotType')
|
||||
.addEventListener('click', () => {
|
||||
let addCloseModalFunction;
|
||||
function doAdd(submitEvent) {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddLotType", submitEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doAddLotType', submitEvent.currentTarget, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
addCloseModalFunction();
|
||||
lotTypes = responseJSON.lotTypes;
|
||||
|
|
@ -380,20 +375,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Adding ${los.escapedAliases.Lot} Type`,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
cityssm.openHtmlModal("adminLotTypes-addLotType", {
|
||||
cityssm.openHtmlModal('adminLotTypes-addLotType', {
|
||||
onshow(modalElement) {
|
||||
los.populateAliases(modalElement);
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
addCloseModalFunction = closeModalFunction;
|
||||
modalElement.querySelector("#lotTypeAdd--lotType").focus();
|
||||
modalElement.querySelector("form").addEventListener("submit", doAdd);
|
||||
modalElement.querySelector('#lotTypeAdd--lotType').focus();
|
||||
modalElement.querySelector('form').addEventListener('submit', doAdd);
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
},
|
||||
onremoved() {
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -3,8 +3,8 @@
|
|||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
(() => {
|
||||
const los = exports.los;
|
||||
const occupancyTypesContainerElement = document.querySelector("#container--occupancyTypes");
|
||||
const occupancyTypePrintsContainerElement = document.querySelector("#container--occupancyTypePrints");
|
||||
const occupancyTypesContainerElement = document.querySelector('#container--occupancyTypes');
|
||||
const occupancyTypePrintsContainerElement = document.querySelector('#container--occupancyTypePrints');
|
||||
let occupancyTypes = exports.occupancyTypes;
|
||||
delete exports.occupancyTypes;
|
||||
let allOccupancyTypeFields = exports.allOccupancyTypeFields;
|
||||
|
|
@ -12,7 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
const expandedOccupancyTypes = new Set();
|
||||
function toggleOccupancyTypeFields(clickEvent) {
|
||||
const toggleButtonElement = clickEvent.currentTarget;
|
||||
const occupancyTypeElement = toggleButtonElement.closest(".container--occupancyType");
|
||||
const occupancyTypeElement = toggleButtonElement.closest('.container--occupancyType');
|
||||
const occupancyTypeId = Number.parseInt(occupancyTypeElement.dataset.occupancyTypeId, 10);
|
||||
if (expandedOccupancyTypes.has(occupancyTypeId)) {
|
||||
expandedOccupancyTypes.delete(occupancyTypeId);
|
||||
|
|
@ -23,9 +23,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
toggleButtonElement.innerHTML = expandedOccupancyTypes.has(occupancyTypeId)
|
||||
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
|
||||
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>';
|
||||
const panelBlockElements = occupancyTypeElement.querySelectorAll(".panel-block");
|
||||
const panelBlockElements = occupancyTypeElement.querySelectorAll('.panel-block');
|
||||
for (const panelBlockElement of panelBlockElements) {
|
||||
panelBlockElement.classList.toggle("is-hidden");
|
||||
panelBlockElement.classList.toggle('is-hidden');
|
||||
}
|
||||
}
|
||||
function occupancyTypeResponseHandler(responseJSON) {
|
||||
|
|
@ -36,23 +36,23 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating " + exports.aliases.occupancy + " Type",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Updating ' + exports.aliases.occupancy + ' Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
}
|
||||
function deleteOccupancyType(clickEvent) {
|
||||
const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId, 10);
|
||||
const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--occupancyType').dataset.occupancyTypeId, 10);
|
||||
function doDelete() {
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteOccupancyType", {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteOccupancyType', {
|
||||
occupancyTypeId
|
||||
}, occupancyTypeResponseHandler);
|
||||
}
|
||||
bulmaJS.confirm({
|
||||
title: `Delete ${exports.aliases.occupancy} Type`,
|
||||
message: `Are you sure you want to delete this ${exports.aliases.occupancy.toLowerCase()} type?`,
|
||||
contextualColorName: "warning",
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: `Yes, Delete ${exports.aliases.occupancy} Type`,
|
||||
callbackFunction: doDelete
|
||||
|
|
@ -60,30 +60,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
});
|
||||
}
|
||||
function openEditOccupancyType(clickEvent) {
|
||||
const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId, 10);
|
||||
const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--occupancyType').dataset.occupancyTypeId, 10);
|
||||
const occupancyType = occupancyTypes.find((currentOccupancyType) => {
|
||||
return occupancyTypeId === currentOccupancyType.occupancyTypeId;
|
||||
});
|
||||
let editCloseModalFunction;
|
||||
function doEdit(submitEvent) {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateOccupancyType", submitEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateOccupancyType', submitEvent.currentTarget, (responseJSON) => {
|
||||
occupancyTypeResponseHandler(responseJSON);
|
||||
if (responseJSON.success) {
|
||||
editCloseModalFunction();
|
||||
}
|
||||
});
|
||||
}
|
||||
cityssm.openHtmlModal("adminOccupancyTypes-editOccupancyType", {
|
||||
cityssm.openHtmlModal('adminOccupancyTypes-editOccupancyType', {
|
||||
onshow(modalElement) {
|
||||
los.populateAliases(modalElement);
|
||||
modalElement.querySelector("#occupancyTypeEdit--occupancyTypeId").value = occupancyTypeId.toString();
|
||||
modalElement.querySelector("#occupancyTypeEdit--occupancyType").value = occupancyType.occupancyType;
|
||||
modalElement.querySelector('#occupancyTypeEdit--occupancyTypeId').value = occupancyTypeId.toString();
|
||||
modalElement.querySelector('#occupancyTypeEdit--occupancyType').value = occupancyType.occupancyType;
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
editCloseModalFunction = closeModalFunction;
|
||||
modalElement.querySelector("#occupancyTypeEdit--occupancyType").focus();
|
||||
modalElement.querySelector("form").addEventListener("submit", doEdit);
|
||||
modalElement.querySelector('#occupancyTypeEdit--occupancyType').focus();
|
||||
modalElement.querySelector('form').addEventListener('submit', doEdit);
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
},
|
||||
onremoved() {
|
||||
|
|
@ -92,11 +92,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
});
|
||||
}
|
||||
function openAddOccupancyTypeField(clickEvent) {
|
||||
const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId, 10);
|
||||
const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--occupancyType').dataset.occupancyTypeId, 10);
|
||||
let addCloseModalFunction;
|
||||
function doAdd(submitEvent) {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddOccupancyTypeField", submitEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doAddOccupancyTypeField', submitEvent.currentTarget, (responseJSON) => {
|
||||
expandedOccupancyTypes.add(occupancyTypeId);
|
||||
occupancyTypeResponseHandler(responseJSON);
|
||||
if (responseJSON.success) {
|
||||
|
|
@ -105,17 +105,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
});
|
||||
}
|
||||
cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyTypeField", {
|
||||
cityssm.openHtmlModal('adminOccupancyTypes-addOccupancyTypeField', {
|
||||
onshow(modalElement) {
|
||||
los.populateAliases(modalElement);
|
||||
if (occupancyTypeId) {
|
||||
modalElement.querySelector("#occupancyTypeFieldAdd--occupancyTypeId").value = occupancyTypeId.toString();
|
||||
;
|
||||
modalElement.querySelector('#occupancyTypeFieldAdd--occupancyTypeId').value = occupancyTypeId.toString();
|
||||
}
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
addCloseModalFunction = closeModalFunction;
|
||||
modalElement.querySelector("#occupancyTypeFieldAdd--occupancyTypeField").focus();
|
||||
modalElement.querySelector("form").addEventListener("submit", doAdd);
|
||||
modalElement.querySelector('#occupancyTypeFieldAdd--occupancyTypeField').focus();
|
||||
modalElement.querySelector('form').addEventListener('submit', doAdd);
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
},
|
||||
onremoved() {
|
||||
|
|
@ -125,14 +126,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
function moveOccupancyType(clickEvent) {
|
||||
const buttonElement = clickEvent.currentTarget;
|
||||
const occupancyTypeId = clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId;
|
||||
const occupancyTypeId = clickEvent.currentTarget.closest('.container--occupancyType').dataset.occupancyTypeId;
|
||||
cityssm.postJSON(los.urlPrefix +
|
||||
"/admin/" +
|
||||
(buttonElement.dataset.direction === "up"
|
||||
? "doMoveOccupancyTypeUp"
|
||||
: "doMoveOccupancyTypeDown"), {
|
||||
'/admin/' +
|
||||
(buttonElement.dataset.direction === 'up'
|
||||
? 'doMoveOccupancyTypeUp'
|
||||
: 'doMoveOccupancyTypeDown'), {
|
||||
occupancyTypeId,
|
||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
||||
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||
}, occupancyTypeResponseHandler);
|
||||
}
|
||||
function openEditOccupancyTypeField(occupancyTypeId, occupancyTypeFieldId) {
|
||||
|
|
@ -142,8 +143,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
return currentOccupancyType.occupancyTypeId === occupancyTypeId;
|
||||
});
|
||||
}
|
||||
const occupancyTypeField = (occupancyType ? occupancyType.occupancyTypeFields : allOccupancyTypeFields).find((currentOccupancyTypeField) => {
|
||||
return currentOccupancyTypeField.occupancyTypeFieldId === occupancyTypeFieldId;
|
||||
const occupancyTypeField = (occupancyType
|
||||
? occupancyType.occupancyTypeFields
|
||||
: allOccupancyTypeFields).find((currentOccupancyTypeField) => {
|
||||
return (currentOccupancyTypeField.occupancyTypeFieldId === occupancyTypeFieldId);
|
||||
});
|
||||
let minimumLengthElement;
|
||||
let maximumLengthElement;
|
||||
|
|
@ -154,7 +157,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
maximumLengthElement.min = minimumLengthElement.value;
|
||||
}
|
||||
function toggleInputFields() {
|
||||
if (occupancyTypeFieldValuesElement.value === "") {
|
||||
if (occupancyTypeFieldValuesElement.value === '') {
|
||||
minimumLengthElement.disabled = false;
|
||||
maximumLengthElement.disabled = false;
|
||||
patternElement.disabled = false;
|
||||
|
|
@ -167,7 +170,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
function doUpdate(submitEvent) {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateOccupancyTypeField", submitEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateOccupancyTypeField', submitEvent.currentTarget, (responseJSON) => {
|
||||
occupancyTypeResponseHandler(responseJSON);
|
||||
if (responseJSON.success) {
|
||||
editCloseModalFunction();
|
||||
|
|
@ -175,7 +178,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
});
|
||||
}
|
||||
function doDelete() {
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteOccupancyTypeField", {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteOccupancyTypeField', {
|
||||
occupancyTypeFieldId
|
||||
}, (responseJSON) => {
|
||||
occupancyTypeResponseHandler(responseJSON);
|
||||
|
|
@ -186,28 +189,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
function confirmDoDelete() {
|
||||
bulmaJS.confirm({
|
||||
title: "Delete Field",
|
||||
message: "Are you sure you want to delete this field? Note that historical records that make use of this field will not be affected.",
|
||||
contextualColorName: "warning",
|
||||
title: 'Delete Field',
|
||||
message: 'Are you sure you want to delete this field? Note that historical records that make use of this field will not be affected.',
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: "Yes, Delete Field",
|
||||
text: 'Yes, Delete Field',
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
});
|
||||
}
|
||||
cityssm.openHtmlModal("adminOccupancyTypes-editOccupancyTypeField", {
|
||||
cityssm.openHtmlModal('adminOccupancyTypes-editOccupancyTypeField', {
|
||||
onshow: (modalElement) => {
|
||||
los.populateAliases(modalElement);
|
||||
modalElement.querySelector("#occupancyTypeFieldEdit--occupancyTypeFieldId").value = occupancyTypeField.occupancyTypeFieldId.toString();
|
||||
modalElement.querySelector("#occupancyTypeFieldEdit--occupancyTypeField").value = occupancyTypeField.occupancyTypeField;
|
||||
modalElement.querySelector("#occupancyTypeFieldEdit--isRequired").value = occupancyTypeField.isRequired ? "1" : "0";
|
||||
minimumLengthElement = modalElement.querySelector("#occupancyTypeFieldEdit--minimumLength");
|
||||
minimumLengthElement.value = occupancyTypeField.minimumLength.toString();
|
||||
maximumLengthElement = modalElement.querySelector("#occupancyTypeFieldEdit--maximumLength");
|
||||
maximumLengthElement.value = occupancyTypeField.maximumLength.toString();
|
||||
patternElement = modalElement.querySelector("#occupancyTypeFieldEdit--pattern");
|
||||
modalElement.querySelector('#occupancyTypeFieldEdit--occupancyTypeFieldId').value = occupancyTypeField.occupancyTypeFieldId.toString();
|
||||
modalElement.querySelector('#occupancyTypeFieldEdit--occupancyTypeField').value = occupancyTypeField.occupancyTypeField;
|
||||
modalElement.querySelector('#occupancyTypeFieldEdit--isRequired').value = occupancyTypeField.isRequired ? '1' : '0';
|
||||
minimumLengthElement = modalElement.querySelector('#occupancyTypeFieldEdit--minimumLength');
|
||||
minimumLengthElement.value =
|
||||
occupancyTypeField.minimumLength.toString();
|
||||
maximumLengthElement = modalElement.querySelector('#occupancyTypeFieldEdit--maximumLength');
|
||||
maximumLengthElement.value =
|
||||
occupancyTypeField.maximumLength.toString();
|
||||
patternElement = modalElement.querySelector('#occupancyTypeFieldEdit--pattern');
|
||||
patternElement.value = occupancyTypeField.pattern;
|
||||
occupancyTypeFieldValuesElement = modalElement.querySelector("#occupancyTypeFieldEdit--occupancyTypeFieldValues");
|
||||
occupancyTypeFieldValuesElement = modalElement.querySelector('#occupancyTypeFieldEdit--occupancyTypeFieldValues');
|
||||
occupancyTypeFieldValuesElement.value =
|
||||
occupancyTypeField.occupancyTypeFieldValues;
|
||||
toggleInputFields();
|
||||
|
|
@ -217,13 +222,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
bulmaJS.init(modalElement);
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
cityssm.enableNavBlocker();
|
||||
modalElement.querySelector("form").addEventListener("submit", doUpdate);
|
||||
minimumLengthElement.addEventListener("keyup", updateMaximumLengthMin);
|
||||
modalElement.querySelector('form').addEventListener('submit', doUpdate);
|
||||
minimumLengthElement.addEventListener('keyup', updateMaximumLengthMin);
|
||||
updateMaximumLengthMin();
|
||||
occupancyTypeFieldValuesElement.addEventListener("keyup", toggleInputFields);
|
||||
occupancyTypeFieldValuesElement.addEventListener('keyup', toggleInputFields);
|
||||
modalElement
|
||||
.querySelector("#button--deleteOccupancyTypeField")
|
||||
.addEventListener("click", confirmDoDelete);
|
||||
.querySelector('#button--deleteOccupancyTypeField')
|
||||
.addEventListener('click', confirmDoDelete);
|
||||
},
|
||||
onremoved: () => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
|
|
@ -233,40 +238,41 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
function openEditOccupancyTypeFieldByClick(clickEvent) {
|
||||
clickEvent.preventDefault();
|
||||
const occupancyTypeFieldId = Number.parseInt(clickEvent.currentTarget.closest(".container--occupancyTypeField").dataset.occupancyTypeFieldId, 10);
|
||||
const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId, 10);
|
||||
const occupancyTypeFieldId = Number.parseInt(clickEvent.currentTarget.closest('.container--occupancyTypeField').dataset.occupancyTypeFieldId, 10);
|
||||
const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest('.container--occupancyType').dataset.occupancyTypeId, 10);
|
||||
openEditOccupancyTypeField(occupancyTypeId, occupancyTypeFieldId);
|
||||
}
|
||||
function moveOccupancyTypeField(clickEvent) {
|
||||
const buttonElement = clickEvent.currentTarget;
|
||||
const occupancyTypeFieldId = clickEvent.currentTarget.closest(".container--occupancyTypeField").dataset.occupancyTypeFieldId;
|
||||
const occupancyTypeFieldId = clickEvent.currentTarget.closest('.container--occupancyTypeField').dataset.occupancyTypeFieldId;
|
||||
cityssm.postJSON(los.urlPrefix +
|
||||
"/admin/" +
|
||||
(buttonElement.dataset.direction === "up"
|
||||
? "doMoveOccupancyTypeFieldUp"
|
||||
: "doMoveOccupancyTypeFieldDown"), {
|
||||
'/admin/' +
|
||||
(buttonElement.dataset.direction === 'up'
|
||||
? 'doMoveOccupancyTypeFieldUp'
|
||||
: 'doMoveOccupancyTypeFieldDown'), {
|
||||
occupancyTypeFieldId,
|
||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
||||
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||
}, occupancyTypeResponseHandler);
|
||||
}
|
||||
function renderOccupancyTypeFields(panelElement, occupancyTypeId, occupancyTypeFields) {
|
||||
if (occupancyTypeFields.length === 0) {
|
||||
panelElement.insertAdjacentHTML("beforeend", '<div class="panel-block is-block' +
|
||||
panelElement.insertAdjacentHTML('beforeend', '<div class="panel-block is-block' +
|
||||
(!occupancyTypeId || expandedOccupancyTypes.has(occupancyTypeId)
|
||||
? ""
|
||||
: " is-hidden") +
|
||||
? ''
|
||||
: ' is-hidden') +
|
||||
'">' +
|
||||
'<div class="message is-info">' +
|
||||
'<p class="message-body">There are no additional fields.</p>' +
|
||||
"</div>" +
|
||||
"</div>");
|
||||
'</div>' +
|
||||
'</div>');
|
||||
}
|
||||
else {
|
||||
for (const occupancyTypeField of occupancyTypeFields) {
|
||||
const panelBlockElement = document.createElement("div");
|
||||
panelBlockElement.className = "panel-block is-block container--occupancyTypeField";
|
||||
const panelBlockElement = document.createElement('div');
|
||||
panelBlockElement.className =
|
||||
'panel-block is-block container--occupancyTypeField';
|
||||
if (occupancyTypeId && !expandedOccupancyTypes.has(occupancyTypeId)) {
|
||||
panelBlockElement.classList.add("is-hidden");
|
||||
panelBlockElement.classList.add('is-hidden');
|
||||
}
|
||||
panelBlockElement.dataset.occupancyTypeFieldId =
|
||||
occupancyTypeField.occupancyTypeFieldId.toString();
|
||||
|
|
@ -275,44 +281,44 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
'<div class="level-left">' +
|
||||
('<div class="level-item">' +
|
||||
'<a class="has-text-weight-bold button--editOccupancyTypeField" href="#">' +
|
||||
cityssm.escapeHTML(occupancyTypeField.occupancyTypeField || "") +
|
||||
"</a>" +
|
||||
"</div>") +
|
||||
"</div>" +
|
||||
cityssm.escapeHTML(occupancyTypeField.occupancyTypeField || '') +
|
||||
'</a>' +
|
||||
'</div>') +
|
||||
'</div>' +
|
||||
'<div class="level-right">' +
|
||||
('<div class="level-item">' +
|
||||
los.getMoveUpDownButtonFieldHTML("button--moveOccupancyTypeFieldUp", "button--moveOccupancyTypeFieldDown") +
|
||||
"</div>") +
|
||||
"</div>" +
|
||||
"</div>";
|
||||
los.getMoveUpDownButtonFieldHTML('button--moveOccupancyTypeFieldUp', 'button--moveOccupancyTypeFieldDown') +
|
||||
'</div>') +
|
||||
'</div>' +
|
||||
'</div>';
|
||||
panelBlockElement
|
||||
.querySelector(".button--editOccupancyTypeField")
|
||||
.addEventListener("click", openEditOccupancyTypeFieldByClick);
|
||||
panelBlockElement.querySelector(".button--moveOccupancyTypeFieldUp").addEventListener("click", moveOccupancyTypeField);
|
||||
panelBlockElement.querySelector(".button--moveOccupancyTypeFieldDown").addEventListener("click", moveOccupancyTypeField);
|
||||
.querySelector('.button--editOccupancyTypeField')
|
||||
.addEventListener('click', openEditOccupancyTypeFieldByClick);
|
||||
panelBlockElement.querySelector('.button--moveOccupancyTypeFieldUp').addEventListener('click', moveOccupancyTypeField);
|
||||
panelBlockElement.querySelector('.button--moveOccupancyTypeFieldDown').addEventListener('click', moveOccupancyTypeField);
|
||||
panelElement.append(panelBlockElement);
|
||||
}
|
||||
}
|
||||
}
|
||||
function openAddOccupancyTypePrint(clickEvent) {
|
||||
const occupancyTypeId = clickEvent.currentTarget.closest(".container--occupancyTypePrintList").dataset.occupancyTypeId;
|
||||
const occupancyTypeId = clickEvent.currentTarget.closest('.container--occupancyTypePrintList').dataset.occupancyTypeId;
|
||||
let closeAddModalFunction;
|
||||
function doAdd(formEvent) {
|
||||
formEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddOccupancyTypePrint", formEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doAddOccupancyTypePrint', formEvent.currentTarget, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
closeAddModalFunction();
|
||||
}
|
||||
occupancyTypeResponseHandler(responseJSON);
|
||||
});
|
||||
}
|
||||
cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyTypePrint", {
|
||||
cityssm.openHtmlModal('adminOccupancyTypes-addOccupancyTypePrint', {
|
||||
onshow(modalElement) {
|
||||
los.populateAliases(modalElement);
|
||||
modalElement.querySelector("#occupancyTypePrintAdd--occupancyTypeId").value = occupancyTypeId;
|
||||
const printSelectElement = modalElement.querySelector("#occupancyTypePrintAdd--printEJS");
|
||||
modalElement.querySelector('#occupancyTypePrintAdd--occupancyTypeId').value = occupancyTypeId;
|
||||
const printSelectElement = modalElement.querySelector('#occupancyTypePrintAdd--printEJS');
|
||||
for (const [printEJS, printTitle] of Object.entries(exports.occupancyTypePrintTitles)) {
|
||||
const optionElement = document.createElement("option");
|
||||
const optionElement = document.createElement('option');
|
||||
optionElement.value = printEJS;
|
||||
optionElement.textContent = printTitle;
|
||||
printSelectElement.append(optionElement);
|
||||
|
|
@ -321,48 +327,47 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
onshown(modalElement, closeModalFunction) {
|
||||
var _a;
|
||||
closeAddModalFunction = closeModalFunction;
|
||||
(_a = modalElement.querySelector("form")) === null || _a === void 0 ? void 0 : _a.addEventListener("submit", doAdd);
|
||||
(_a = modalElement.querySelector('form')) === null || _a === void 0 ? void 0 : _a.addEventListener('submit', doAdd);
|
||||
}
|
||||
});
|
||||
}
|
||||
function moveOccupancyTypePrint(clickEvent) {
|
||||
const buttonElement = clickEvent.currentTarget;
|
||||
const printEJS = buttonElement.closest(".container--occupancyTypePrint")
|
||||
.dataset.printEJS;
|
||||
const occupancyTypeId = buttonElement.closest(".container--occupancyTypePrintList").dataset.occupancyTypeId;
|
||||
const printEJS = buttonElement.closest('.container--occupancyTypePrint').dataset.printEJS;
|
||||
const occupancyTypeId = buttonElement.closest('.container--occupancyTypePrintList').dataset.occupancyTypeId;
|
||||
cityssm.postJSON(los.urlPrefix +
|
||||
"/admin/" +
|
||||
(buttonElement.dataset.direction === "up"
|
||||
? "doMoveOccupancyTypePrintUp"
|
||||
: "doMoveOccupancyTypePrintDown"), {
|
||||
'/admin/' +
|
||||
(buttonElement.dataset.direction === 'up'
|
||||
? 'doMoveOccupancyTypePrintUp'
|
||||
: 'doMoveOccupancyTypePrintDown'), {
|
||||
occupancyTypeId,
|
||||
printEJS,
|
||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
||||
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||
}, occupancyTypeResponseHandler);
|
||||
}
|
||||
function deleteOccupancyTypePrint(clickEvent) {
|
||||
clickEvent.preventDefault();
|
||||
const printEJS = clickEvent.currentTarget.closest(".container--occupancyTypePrint").dataset.printEJS;
|
||||
const occupancyTypeId = clickEvent.currentTarget.closest(".container--occupancyTypePrintList").dataset.occupancyTypeId;
|
||||
const printEJS = clickEvent.currentTarget.closest('.container--occupancyTypePrint').dataset.printEJS;
|
||||
const occupancyTypeId = clickEvent.currentTarget.closest('.container--occupancyTypePrintList').dataset.occupancyTypeId;
|
||||
function doDelete() {
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteOccupancyTypePrint", {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteOccupancyTypePrint', {
|
||||
occupancyTypeId,
|
||||
printEJS
|
||||
}, occupancyTypeResponseHandler);
|
||||
}
|
||||
bulmaJS.confirm({
|
||||
title: "Delete Print",
|
||||
message: "Are you sure you want to remove this print option?",
|
||||
contextualColorName: "warning",
|
||||
title: 'Delete Print',
|
||||
message: 'Are you sure you want to remove this print option?',
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: "Yes, Remove Print",
|
||||
text: 'Yes, Remove Print',
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
});
|
||||
}
|
||||
function renderOccupancyTypePrints(panelElement, occupancyTypeId, occupancyTypePrints) {
|
||||
if (occupancyTypePrints.length === 0) {
|
||||
panelElement.insertAdjacentHTML("beforeend", `<div class="panel-block is-block">
|
||||
panelElement.insertAdjacentHTML('beforeend', `<div class="panel-block is-block">
|
||||
<div class="message is-info">
|
||||
<p class="message-body">There are no prints associated with this record.</p>
|
||||
</div>
|
||||
|
|
@ -370,18 +375,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
else {
|
||||
for (const printEJS of occupancyTypePrints) {
|
||||
const panelBlockElement = document.createElement("div");
|
||||
panelBlockElement.className = "panel-block is-block container--occupancyTypePrint";
|
||||
const panelBlockElement = document.createElement('div');
|
||||
panelBlockElement.className =
|
||||
'panel-block is-block container--occupancyTypePrint';
|
||||
panelBlockElement.dataset.printEJS = printEJS;
|
||||
const printTitle = printEJS === "*"
|
||||
? "(All Available Prints)"
|
||||
const printTitle = printEJS === '*'
|
||||
? '(All Available Prints)'
|
||||
: exports.occupancyTypePrintTitles[printEJS];
|
||||
let printIconClass = "fa-star";
|
||||
if (printEJS.startsWith("pdf/")) {
|
||||
printIconClass = "fa-file-pdf";
|
||||
let printIconClass = 'fa-star';
|
||||
if (printEJS.startsWith('pdf/')) {
|
||||
printIconClass = 'fa-file-pdf';
|
||||
}
|
||||
else if (printEJS.startsWith("screen/")) {
|
||||
printIconClass = "fa-file";
|
||||
else if (printEJS.startsWith('screen/')) {
|
||||
printIconClass = 'fa-file';
|
||||
}
|
||||
panelBlockElement.innerHTML =
|
||||
'<div class="level is-mobile">' +
|
||||
|
|
@ -390,28 +396,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
'<i class="fas fa-fw ' +
|
||||
printIconClass +
|
||||
'" aria-hidden="true"></i>' +
|
||||
"</div>") +
|
||||
'</div>') +
|
||||
('<div class="level-item">' +
|
||||
cityssm.escapeHTML(printTitle || printEJS) +
|
||||
"</div>") +
|
||||
"</div>" +
|
||||
'</div>') +
|
||||
'</div>' +
|
||||
'<div class="level-right">' +
|
||||
('<div class="level-item">' +
|
||||
los.getMoveUpDownButtonFieldHTML("button--moveOccupancyTypePrintUp", "button--moveOccupancyTypePrintDown") +
|
||||
"</div>") +
|
||||
los.getMoveUpDownButtonFieldHTML('button--moveOccupancyTypePrintUp', 'button--moveOccupancyTypePrintDown') +
|
||||
'</div>') +
|
||||
('<div class="level-item">' +
|
||||
'<button class="button is-small is-danger button--deleteOccupancyTypePrint" data-tooltip="Delete" type="button" aria-label="Delete Print">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
"</button>" +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
"</div>" +
|
||||
"</div>";
|
||||
panelBlockElement.querySelector(".button--moveOccupancyTypePrintUp").addEventListener("click", moveOccupancyTypePrint);
|
||||
panelBlockElement.querySelector(".button--moveOccupancyTypePrintDown").addEventListener("click", moveOccupancyTypePrint);
|
||||
'</button>' +
|
||||
'</div>' +
|
||||
'</div>') +
|
||||
'</div>' +
|
||||
'</div>';
|
||||
panelBlockElement.querySelector('.button--moveOccupancyTypePrintUp').addEventListener('click', moveOccupancyTypePrint);
|
||||
panelBlockElement.querySelector('.button--moveOccupancyTypePrintDown').addEventListener('click', moveOccupancyTypePrint);
|
||||
panelBlockElement
|
||||
.querySelector(".button--deleteOccupancyTypePrint")
|
||||
.addEventListener("click", deleteOccupancyTypePrint);
|
||||
.querySelector('.button--deleteOccupancyTypePrint')
|
||||
.addEventListener('click', deleteOccupancyTypePrint);
|
||||
panelElement.append(panelBlockElement);
|
||||
}
|
||||
}
|
||||
|
|
@ -425,30 +431,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
'<div class="level-item">' +
|
||||
('<h2 class="title is-4">(All ' +
|
||||
cityssm.escapeHTML(exports.aliases.occupancy) +
|
||||
" Types)</h2>") +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
' Types)</h2>') +
|
||||
'</div>' +
|
||||
'</div>') +
|
||||
('<div class="level-right">' +
|
||||
('<div class="level-item">' +
|
||||
'<button class="button is-success is-small button--addOccupancyTypeField" type="button">' +
|
||||
'<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>' +
|
||||
"<span>Add Field</span>" +
|
||||
"</button>" +
|
||||
"</div>") +
|
||||
"</div>") +
|
||||
"</div>") +
|
||||
"</div>" +
|
||||
"</div>";
|
||||
occupancyTypePrintsContainerElement.innerHTML = "";
|
||||
renderOccupancyTypeFields(occupancyTypesContainerElement.querySelector("#container--allOccupancyTypeFields"), undefined, allOccupancyTypeFields);
|
||||
'<span>Add Field</span>' +
|
||||
'</button>' +
|
||||
'</div>') +
|
||||
'</div>') +
|
||||
'</div>') +
|
||||
'</div>' +
|
||||
'</div>';
|
||||
occupancyTypePrintsContainerElement.innerHTML = '';
|
||||
renderOccupancyTypeFields(occupancyTypesContainerElement.querySelector('#container--allOccupancyTypeFields'), undefined, allOccupancyTypeFields);
|
||||
occupancyTypesContainerElement
|
||||
.querySelector(".button--addOccupancyTypeField")
|
||||
.addEventListener("click", openAddOccupancyTypeField);
|
||||
.querySelector('.button--addOccupancyTypeField')
|
||||
.addEventListener('click', openAddOccupancyTypeField);
|
||||
if (occupancyTypes.length === 0) {
|
||||
occupancyTypesContainerElement.insertAdjacentHTML("afterbegin", `<div class="message is-warning>
|
||||
occupancyTypesContainerElement.insertAdjacentHTML('afterbegin', `<div class="message is-warning>
|
||||
<p class="message-body">There are no active ${los.escapedAliases.occupancy} types.</p>
|
||||
</div>`);
|
||||
occupancyTypePrintsContainerElement.insertAdjacentHTML("afterbegin", `<div class="message is-warning>
|
||||
occupancyTypePrintsContainerElement.insertAdjacentHTML('afterbegin', `<div class="message is-warning>
|
||||
<p class="message-body">There are no active ${los.escapedAliases.occupancy} types.</p>
|
||||
</div>`);
|
||||
return;
|
||||
|
|
@ -456,8 +462,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
for (const occupancyType of occupancyTypes) {
|
||||
// Types and Fields
|
||||
{
|
||||
const occupancyTypeContainer = document.createElement("div");
|
||||
occupancyTypeContainer.className = "panel container--occupancyType";
|
||||
const occupancyTypeContainer = document.createElement('div');
|
||||
occupancyTypeContainer.className = 'panel container--occupancyType';
|
||||
occupancyTypeContainer.dataset.occupancyTypeId =
|
||||
occupancyType.occupancyTypeId.toString();
|
||||
occupancyTypeContainer.innerHTML =
|
||||
|
|
@ -469,62 +475,63 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
(expandedOccupancyTypes.has(occupancyType.occupancyTypeId)
|
||||
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
|
||||
: '<i class="fas fa-fw fa-plus" aria-hidden="true"></i>') +
|
||||
"</button>" +
|
||||
"</div>" +
|
||||
'</button>' +
|
||||
'</div>' +
|
||||
'<div class="level-item">' +
|
||||
'<h2 class="title is-4">' +
|
||||
cityssm.escapeHTML(occupancyType.occupancyType) +
|
||||
"</h2>" +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
'</h2>' +
|
||||
'</div>' +
|
||||
'</div>') +
|
||||
('<div class="level-right">' +
|
||||
('<div class="level-item">' +
|
||||
'<button class="button is-danger is-small button--deleteOccupancyType" type="button">' +
|
||||
'<span class="icon is-small"><i class="fas fa-trash" aria-hidden="true"></i></span>' +
|
||||
"<span>Delete</span>" +
|
||||
"</button>" +
|
||||
"</div>") +
|
||||
'<span>Delete</span>' +
|
||||
'</button>' +
|
||||
'</div>') +
|
||||
('<div class="level-item">' +
|
||||
'<button class="button is-primary is-small button--editOccupancyType" type="button">' +
|
||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||
"<span>Edit " +
|
||||
'<span>Edit ' +
|
||||
exports.aliases.occupancy +
|
||||
" Type</span>" +
|
||||
"</button>" +
|
||||
"</div>") +
|
||||
' Type</span>' +
|
||||
'</button>' +
|
||||
'</div>') +
|
||||
('<div class="level-item">' +
|
||||
'<button class="button is-success is-small button--addOccupancyTypeField" type="button">' +
|
||||
'<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>' +
|
||||
"<span>Add Field</span>" +
|
||||
"</button>" +
|
||||
"</div>") +
|
||||
'<span>Add Field</span>' +
|
||||
'</button>' +
|
||||
'</div>') +
|
||||
('<div class="level-item">' +
|
||||
los.getMoveUpDownButtonFieldHTML("button--moveOccupancyTypeUp", "button--moveOccupancyTypeDown") +
|
||||
"</div>") +
|
||||
"</div>") +
|
||||
"</div>" +
|
||||
"</div>";
|
||||
los.getMoveUpDownButtonFieldHTML('button--moveOccupancyTypeUp', 'button--moveOccupancyTypeDown') +
|
||||
'</div>') +
|
||||
'</div>') +
|
||||
'</div>' +
|
||||
'</div>';
|
||||
renderOccupancyTypeFields(occupancyTypeContainer, occupancyType.occupancyTypeId, occupancyType.occupancyTypeFields);
|
||||
occupancyTypeContainer
|
||||
.querySelector(".button--toggleOccupancyTypeFields")
|
||||
.addEventListener("click", toggleOccupancyTypeFields);
|
||||
.querySelector('.button--toggleOccupancyTypeFields')
|
||||
.addEventListener('click', toggleOccupancyTypeFields);
|
||||
occupancyTypeContainer
|
||||
.querySelector(".button--deleteOccupancyType")
|
||||
.addEventListener("click", deleteOccupancyType);
|
||||
.querySelector('.button--deleteOccupancyType')
|
||||
.addEventListener('click', deleteOccupancyType);
|
||||
occupancyTypeContainer
|
||||
.querySelector(".button--editOccupancyType")
|
||||
.addEventListener("click", openEditOccupancyType);
|
||||
.querySelector('.button--editOccupancyType')
|
||||
.addEventListener('click', openEditOccupancyType);
|
||||
occupancyTypeContainer
|
||||
.querySelector(".button--addOccupancyTypeField")
|
||||
.addEventListener("click", openAddOccupancyTypeField);
|
||||
occupancyTypeContainer.querySelector(".button--moveOccupancyTypeUp").addEventListener("click", moveOccupancyType);
|
||||
occupancyTypeContainer.querySelector(".button--moveOccupancyTypeDown").addEventListener("click", moveOccupancyType);
|
||||
.querySelector('.button--addOccupancyTypeField')
|
||||
.addEventListener('click', openAddOccupancyTypeField);
|
||||
occupancyTypeContainer.querySelector('.button--moveOccupancyTypeUp').addEventListener('click', moveOccupancyType);
|
||||
occupancyTypeContainer.querySelector('.button--moveOccupancyTypeDown').addEventListener('click', moveOccupancyType);
|
||||
occupancyTypesContainerElement.append(occupancyTypeContainer);
|
||||
}
|
||||
// Prints
|
||||
{
|
||||
const occupancyTypePrintContainer = document.createElement("div");
|
||||
occupancyTypePrintContainer.className = "panel container--occupancyTypePrintList";
|
||||
const occupancyTypePrintContainer = document.createElement('div');
|
||||
occupancyTypePrintContainer.className =
|
||||
'panel container--occupancyTypePrintList';
|
||||
occupancyTypePrintContainer.dataset.occupancyTypeId =
|
||||
occupancyType.occupancyTypeId.toString();
|
||||
occupancyTypePrintContainer.innerHTML =
|
||||
|
|
@ -534,32 +541,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
'<div class="level-item">' +
|
||||
'<h2 class="title is-4">' +
|
||||
cityssm.escapeHTML(occupancyType.occupancyType) +
|
||||
"</h2>" +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
'</h2>' +
|
||||
'</div>' +
|
||||
'</div>') +
|
||||
('<div class="level-right">' +
|
||||
('<div class="level-item">' +
|
||||
'<button class="button is-success is-small button--addOccupancyTypePrint" type="button">' +
|
||||
'<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>' +
|
||||
"<span>Add Print</span>" +
|
||||
"</button>" +
|
||||
"</div>") +
|
||||
"</div>") +
|
||||
"</div>" +
|
||||
"</div>";
|
||||
'<span>Add Print</span>' +
|
||||
'</button>' +
|
||||
'</div>') +
|
||||
'</div>') +
|
||||
'</div>' +
|
||||
'</div>';
|
||||
renderOccupancyTypePrints(occupancyTypePrintContainer, occupancyType.occupancyTypeId, occupancyType.occupancyTypePrints);
|
||||
occupancyTypePrintContainer
|
||||
.querySelector(".button--addOccupancyTypePrint")
|
||||
.addEventListener("click", openAddOccupancyTypePrint);
|
||||
.querySelector('.button--addOccupancyTypePrint')
|
||||
.addEventListener('click', openAddOccupancyTypePrint);
|
||||
occupancyTypePrintsContainerElement.append(occupancyTypePrintContainer);
|
||||
}
|
||||
}
|
||||
}
|
||||
document.querySelector("#button--addOccupancyType").addEventListener("click", () => {
|
||||
document
|
||||
.querySelector('#button--addOccupancyType')
|
||||
.addEventListener('click', () => {
|
||||
let addCloseModalFunction;
|
||||
const doAdd = (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddOccupancyType", submitEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doAddOccupancyType', submitEvent.currentTarget, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
addCloseModalFunction();
|
||||
occupancyTypes = responseJSON.occupancyTypes;
|
||||
|
|
@ -567,21 +576,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Adding " + exports.aliases.occupancy + " Type",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Adding ' + exports.aliases.occupancy + ' Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyType", {
|
||||
cityssm.openHtmlModal('adminOccupancyTypes-addOccupancyType', {
|
||||
onshow: (modalElement) => {
|
||||
los.populateAliases(modalElement);
|
||||
},
|
||||
onshown: (modalElement, closeModalFunction) => {
|
||||
addCloseModalFunction = closeModalFunction;
|
||||
modalElement.querySelector("#occupancyTypeAdd--occupancyType").focus();
|
||||
modalElement.querySelector("form").addEventListener("submit", doAdd);
|
||||
modalElement.querySelector('#occupancyTypeAdd--occupancyType').focus();
|
||||
modalElement.querySelector('form').addEventListener('submit', doAdd);
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
},
|
||||
onremoved: () => {
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -9,8 +9,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
const inputElement = changeEvent.currentTarget;
|
||||
const fontAwesomeIconClass = inputElement.value;
|
||||
inputElement
|
||||
.closest(".field")
|
||||
.querySelectorAll(".button.is-static")[1].innerHTML = `<i class="fas fa-fw fa-${fontAwesomeIconClass}" aria-hidden="true"></i>`;
|
||||
.closest('.field')
|
||||
.querySelectorAll('.button.is-static')[1].innerHTML = `<i class="fas fa-fw fa-${fontAwesomeIconClass}" aria-hidden="true"></i>`;
|
||||
}
|
||||
"use strict";
|
||||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
|
|
@ -19,28 +19,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
delete exports.workOrderTypes;
|
||||
const updateWorkOrderType = (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateWorkOrderType", submitEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateWorkOrderType', submitEvent.currentTarget, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderTypes = responseJSON.workOrderTypes;
|
||||
bulmaJS.alert({
|
||||
message: "Work Order Type Updated Successfully",
|
||||
contextualColorName: "success"
|
||||
message: 'Work Order Type Updated Successfully',
|
||||
contextualColorName: 'success'
|
||||
});
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating Work Order Type",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Updating Work Order Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
const deleteWorkOrderType = (clickEvent) => {
|
||||
const tableRowElement = clickEvent.currentTarget.closest("tr");
|
||||
const tableRowElement = clickEvent.currentTarget.closest('tr');
|
||||
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteWorkOrderType", {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteWorkOrderType', {
|
||||
workOrderTypeId
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
|
|
@ -52,40 +52,40 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
tableRowElement.remove();
|
||||
}
|
||||
bulmaJS.alert({
|
||||
message: "Work Order Type Deleted Successfully",
|
||||
contextualColorName: "success"
|
||||
message: 'Work Order Type Deleted Successfully',
|
||||
contextualColorName: 'success'
|
||||
});
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Deleting Work Order Type",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Deleting Work Order Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
bulmaJS.confirm({
|
||||
title: "Delete Work Order Type",
|
||||
title: 'Delete Work Order Type',
|
||||
message: `Are you sure you want to delete this work order type?<br />
|
||||
Note that no work orders will be removed.`,
|
||||
messageIsHtml: true,
|
||||
contextualColorName: "warning",
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: "Yes, Delete Work Order Type",
|
||||
text: 'Yes, Delete Work Order Type',
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
});
|
||||
};
|
||||
const moveWorkOrderType = (clickEvent) => {
|
||||
const buttonElement = clickEvent.currentTarget;
|
||||
const tableRowElement = buttonElement.closest("tr");
|
||||
const tableRowElement = buttonElement.closest('tr');
|
||||
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
|
||||
cityssm.postJSON(los.urlPrefix +
|
||||
"/admin/" +
|
||||
(buttonElement.dataset.direction === "up" ? "doMoveWorkOrderTypeUp" : "doMoveWorkOrderTypeDown"), {
|
||||
'/admin/' +
|
||||
(buttonElement.dataset.direction === 'up' ? 'doMoveWorkOrderTypeUp' : 'doMoveWorkOrderTypeDown'), {
|
||||
workOrderTypeId,
|
||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
||||
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderTypes = responseJSON.workOrderTypes;
|
||||
|
|
@ -93,79 +93,79 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Moving Work Order Type",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Moving Work Order Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
const renderWorkOrderTypes = () => {
|
||||
const containerElement = document.querySelector("#container--workOrderTypes");
|
||||
const containerElement = document.querySelector('#container--workOrderTypes');
|
||||
if (workOrderTypes.length === 0) {
|
||||
containerElement.innerHTML = `<tr><td colspan="2">
|
||||
<div class="message is-warning"><p class="message-body">There are no active work order types.</p></div>
|
||||
</td></tr>`;
|
||||
return;
|
||||
}
|
||||
containerElement.innerHTML = "";
|
||||
containerElement.innerHTML = '';
|
||||
for (const workOrderType of workOrderTypes) {
|
||||
const tableRowElement = document.createElement("tr");
|
||||
const tableRowElement = document.createElement('tr');
|
||||
tableRowElement.dataset.workOrderTypeId = workOrderType.workOrderTypeId.toString();
|
||||
tableRowElement.innerHTML =
|
||||
"<td>" +
|
||||
"<form>" +
|
||||
'<td>' +
|
||||
'<form>' +
|
||||
'<input name="workOrderTypeId" type="hidden" value="' +
|
||||
workOrderType.workOrderTypeId.toString() +
|
||||
'" />' +
|
||||
('<div class="field has-addons">' +
|
||||
'<div class="control">' +
|
||||
'<input class="input" name="workOrderType" type="text" value="' +
|
||||
cityssm.escapeHTML(workOrderType.workOrderType || "") +
|
||||
cityssm.escapeHTML(workOrderType.workOrderType || '') +
|
||||
'" maxlength="100" aria-label="Work Order Type" required />' +
|
||||
"</div>" +
|
||||
'</div>' +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
"</form>" +
|
||||
"</td>" +
|
||||
'</div>' +
|
||||
'</div>') +
|
||||
'</form>' +
|
||||
'</td>' +
|
||||
'<td class="is-nowrap">' +
|
||||
'<div class="field is-grouped">' +
|
||||
'<div class="control">' +
|
||||
los.getMoveUpDownButtonFieldHTML("button--moveWorkOrderTypeUp", "button--moveWorkOrderTypeDown", false) +
|
||||
"</div>" +
|
||||
los.getMoveUpDownButtonFieldHTML('button--moveWorkOrderTypeUp', 'button--moveWorkOrderTypeDown', false) +
|
||||
'</div>' +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-danger is-light button--deleteWorkOrderType" data-tooltip="Delete Work Order Type" type="button" aria-label="Delete Work Order Type">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
"</button>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</td>";
|
||||
tableRowElement.querySelector("form").addEventListener("submit", updateWorkOrderType);
|
||||
tableRowElement.querySelector(".button--moveWorkOrderTypeUp").addEventListener("click", moveWorkOrderType);
|
||||
tableRowElement.querySelector(".button--moveWorkOrderTypeDown").addEventListener("click", moveWorkOrderType);
|
||||
'</button>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</td>';
|
||||
tableRowElement.querySelector('form').addEventListener('submit', updateWorkOrderType);
|
||||
tableRowElement.querySelector('.button--moveWorkOrderTypeUp').addEventListener('click', moveWorkOrderType);
|
||||
tableRowElement.querySelector('.button--moveWorkOrderTypeDown').addEventListener('click', moveWorkOrderType);
|
||||
tableRowElement
|
||||
.querySelector(".button--deleteWorkOrderType")
|
||||
.addEventListener("click", deleteWorkOrderType);
|
||||
.querySelector('.button--deleteWorkOrderType')
|
||||
.addEventListener('click', deleteWorkOrderType);
|
||||
containerElement.append(tableRowElement);
|
||||
}
|
||||
};
|
||||
document.querySelector("#form--addWorkOrderType").addEventListener("submit", (submitEvent) => {
|
||||
document.querySelector('#form--addWorkOrderType').addEventListener('submit', (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
const formElement = submitEvent.currentTarget;
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddWorkOrderType", formElement, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doAddWorkOrderType', formElement, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderTypes = responseJSON.workOrderTypes;
|
||||
renderWorkOrderTypes();
|
||||
formElement.reset();
|
||||
formElement.querySelector("input").focus();
|
||||
formElement.querySelector('input').focus();
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Adding Work Order Type",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Adding Work Order Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
@ -179,28 +179,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
delete exports.workOrderMilestoneTypes;
|
||||
const updateWorkOrderMilestoneType = (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateWorkOrderMilestoneType", submitEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateWorkOrderMilestoneType', submitEvent.currentTarget, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes;
|
||||
bulmaJS.alert({
|
||||
message: "Work Order Milestone Type Updated Successfully",
|
||||
contextualColorName: "success"
|
||||
message: 'Work Order Milestone Type Updated Successfully',
|
||||
contextualColorName: 'success'
|
||||
});
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating Work Order Milestone Type",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Updating Work Order Milestone Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
const deleteWorkOrderMilestoneType = (clickEvent) => {
|
||||
const tableRowElement = clickEvent.currentTarget.closest("tr");
|
||||
const tableRowElement = clickEvent.currentTarget.closest('tr');
|
||||
const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId;
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteWorkOrderMilestoneType", {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteWorkOrderMilestoneType', {
|
||||
workOrderMilestoneTypeId
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
|
|
@ -212,42 +212,42 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
tableRowElement.remove();
|
||||
}
|
||||
bulmaJS.alert({
|
||||
message: "Work Order Milestone Type Deleted Successfully",
|
||||
contextualColorName: "success"
|
||||
message: 'Work Order Milestone Type Deleted Successfully',
|
||||
contextualColorName: 'success'
|
||||
});
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Deleting Work Order Milestone Type",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Deleting Work Order Milestone Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
bulmaJS.confirm({
|
||||
title: "Delete Work Order Milestone Type",
|
||||
title: 'Delete Work Order Milestone Type',
|
||||
message: `Are you sure you want to delete this work order milestone type?<br />
|
||||
Note that no work orders will be removed.`,
|
||||
messageIsHtml: true,
|
||||
contextualColorName: "warning",
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: "Yes, Delete Work Order Milestone Type",
|
||||
text: 'Yes, Delete Work Order Milestone Type',
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
});
|
||||
};
|
||||
const moveWorkOrderMilestoneType = (clickEvent) => {
|
||||
const buttonElement = clickEvent.currentTarget;
|
||||
const tableRowElement = buttonElement.closest("tr");
|
||||
const tableRowElement = buttonElement.closest('tr');
|
||||
const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId;
|
||||
cityssm.postJSON(los.urlPrefix +
|
||||
"/admin/" +
|
||||
(buttonElement.dataset.direction === "up"
|
||||
? "doMoveWorkOrderMilestoneTypeUp"
|
||||
: "doMoveWorkOrderMilestoneTypeDown"), {
|
||||
'/admin/' +
|
||||
(buttonElement.dataset.direction === 'up'
|
||||
? 'doMoveWorkOrderMilestoneTypeUp'
|
||||
: 'doMoveWorkOrderMilestoneTypeDown'), {
|
||||
workOrderMilestoneTypeId,
|
||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
||||
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes;
|
||||
|
|
@ -255,29 +255,29 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Moving Work Order Milestone Type",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Moving Work Order Milestone Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
const renderWorkOrderMilestoneTypes = () => {
|
||||
const containerElement = document.querySelector("#container--workOrderMilestoneTypes");
|
||||
const containerElement = document.querySelector('#container--workOrderMilestoneTypes');
|
||||
if (workOrderMilestoneTypes.length === 0) {
|
||||
containerElement.innerHTML = `<tr><td colspan="2">
|
||||
<div class="message is-warning"><p class="message-body">There are no active work order milestone types.</p></div>
|
||||
</td></tr>`;
|
||||
return;
|
||||
}
|
||||
containerElement.innerHTML = "";
|
||||
containerElement.innerHTML = '';
|
||||
for (const workOrderMilestoneType of workOrderMilestoneTypes) {
|
||||
const tableRowElement = document.createElement("tr");
|
||||
const tableRowElement = document.createElement('tr');
|
||||
tableRowElement.dataset.workOrderMilestoneTypeId =
|
||||
workOrderMilestoneType.workOrderMilestoneTypeId.toString();
|
||||
tableRowElement.innerHTML =
|
||||
"<td>" +
|
||||
"<form>" +
|
||||
'<td>' +
|
||||
'<form>' +
|
||||
'<input name="workOrderMilestoneTypeId" type="hidden" value="' +
|
||||
workOrderMilestoneType.workOrderMilestoneTypeId.toString() +
|
||||
'" />' +
|
||||
|
|
@ -286,49 +286,49 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
'<input class="input" name="workOrderMilestoneType" type="text" value="' +
|
||||
cityssm.escapeHTML(workOrderMilestoneType.workOrderMilestoneType) +
|
||||
'" maxlength="100" aria-label="Work Order Milestone Type" required />' +
|
||||
"</div>" +
|
||||
'</div>' +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
"</form>" +
|
||||
"</td>" +
|
||||
'</div>' +
|
||||
'</div>') +
|
||||
'</form>' +
|
||||
'</td>' +
|
||||
'<td class="is-nowrap">' +
|
||||
'<div class="field is-grouped">' +
|
||||
'<div class="control">' +
|
||||
los.getMoveUpDownButtonFieldHTML("button--moveWorkOrderMilestoneTypeUp", "button--moveWorkOrderMilestoneTypeDown", false) +
|
||||
"</div>" +
|
||||
los.getMoveUpDownButtonFieldHTML('button--moveWorkOrderMilestoneTypeUp', 'button--moveWorkOrderMilestoneTypeDown', false) +
|
||||
'</div>' +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-danger is-light button--deleteWorkOrderMilestoneType" data-tooltip="Delete Mielstone Type" type="button" aria-label="Delete Milestone Type">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
"</button>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</td>";
|
||||
tableRowElement.querySelector("form").addEventListener("submit", updateWorkOrderMilestoneType);
|
||||
tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeUp").addEventListener("click", moveWorkOrderMilestoneType);
|
||||
tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeDown").addEventListener("click", moveWorkOrderMilestoneType);
|
||||
'</button>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</td>';
|
||||
tableRowElement.querySelector('form').addEventListener('submit', updateWorkOrderMilestoneType);
|
||||
tableRowElement.querySelector('.button--moveWorkOrderMilestoneTypeUp').addEventListener('click', moveWorkOrderMilestoneType);
|
||||
tableRowElement.querySelector('.button--moveWorkOrderMilestoneTypeDown').addEventListener('click', moveWorkOrderMilestoneType);
|
||||
tableRowElement
|
||||
.querySelector(".button--deleteWorkOrderMilestoneType")
|
||||
.addEventListener("click", deleteWorkOrderMilestoneType);
|
||||
.querySelector('.button--deleteWorkOrderMilestoneType')
|
||||
.addEventListener('click', deleteWorkOrderMilestoneType);
|
||||
containerElement.append(tableRowElement);
|
||||
}
|
||||
};
|
||||
document.querySelector("#form--addWorkOrderMilestoneType").addEventListener("submit", (submitEvent) => {
|
||||
document.querySelector('#form--addWorkOrderMilestoneType').addEventListener('submit', (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
const formElement = submitEvent.currentTarget;
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddWorkOrderMilestoneType", formElement, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doAddWorkOrderMilestoneType', formElement, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes;
|
||||
renderWorkOrderMilestoneTypes();
|
||||
formElement.reset();
|
||||
formElement.querySelector("input").focus();
|
||||
formElement.querySelector('input').focus();
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Adding Work Order Milestone Type",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Adding Work Order Milestone Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
@ -342,28 +342,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
delete exports.lotStatuses;
|
||||
const updateLotStatus = (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateLotStatus", submitEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateLotStatus', submitEvent.currentTarget, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
lotStatuses = responseJSON.lotStatuses;
|
||||
bulmaJS.alert({
|
||||
message: los.escapedAliases.Lot + " Status Updated Successfully",
|
||||
contextualColorName: "success"
|
||||
message: los.escapedAliases.Lot + ' Status Updated Successfully',
|
||||
contextualColorName: 'success'
|
||||
});
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating " + los.escapedAliases.Lot + " Status",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Updating ' + los.escapedAliases.Lot + ' Status',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
const deleteLotStatus = (clickEvent) => {
|
||||
const tableRowElement = clickEvent.currentTarget.closest("tr");
|
||||
const tableRowElement = clickEvent.currentTarget.closest('tr');
|
||||
const lotStatusId = tableRowElement.dataset.lotStatusId;
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteLotStatus", {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteLotStatus', {
|
||||
lotStatusId
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
|
|
@ -375,15 +375,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
tableRowElement.remove();
|
||||
}
|
||||
bulmaJS.alert({
|
||||
message: los.escapedAliases.Lot + " Status Deleted Successfully",
|
||||
contextualColorName: "success"
|
||||
message: los.escapedAliases.Lot + ' Status Deleted Successfully',
|
||||
contextualColorName: 'success'
|
||||
});
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Deleting " + los.escapedAliases.Lot + " Status",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Deleting ' + los.escapedAliases.Lot + ' Status',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
@ -393,22 +393,22 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
message: `Are you sure you want to delete this status?<br />
|
||||
Note that no ${los.escapedAliases.lot} will be removed.`,
|
||||
messageIsHtml: true,
|
||||
contextualColorName: "warning",
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: "Yes, Delete Status",
|
||||
text: 'Yes, Delete Status',
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
});
|
||||
};
|
||||
const moveLotStatus = (clickEvent) => {
|
||||
const buttonElement = clickEvent.currentTarget;
|
||||
const tableRowElement = buttonElement.closest("tr");
|
||||
const tableRowElement = buttonElement.closest('tr');
|
||||
const lotStatusId = tableRowElement.dataset.lotStatusId;
|
||||
cityssm.postJSON(los.urlPrefix +
|
||||
"/admin/" +
|
||||
(buttonElement.dataset.direction === "up" ? "doMoveLotStatusUp" : "doMoveLotStatusDown"), {
|
||||
'/admin/' +
|
||||
(buttonElement.dataset.direction === 'up' ? 'doMoveLotStatusUp' : 'doMoveLotStatusDown'), {
|
||||
lotStatusId,
|
||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
||||
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
lotStatuses = responseJSON.lotStatuses;
|
||||
|
|
@ -416,28 +416,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Moving " + exports.aliases.lot + " Status",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Moving ' + exports.aliases.lot + ' Status',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
const renderLotStatuses = () => {
|
||||
const containerElement = document.querySelector("#container--lotStatuses");
|
||||
const containerElement = document.querySelector('#container--lotStatuses');
|
||||
if (lotStatuses.length === 0) {
|
||||
containerElement.innerHTML = `<tr><td colspan="2">
|
||||
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} statuses.</p></div>
|
||||
</td></tr>`;
|
||||
return;
|
||||
}
|
||||
containerElement.innerHTML = "";
|
||||
containerElement.innerHTML = '';
|
||||
for (const lotStatus of lotStatuses) {
|
||||
const tableRowElement = document.createElement("tr");
|
||||
const tableRowElement = document.createElement('tr');
|
||||
tableRowElement.dataset.lotStatusId = lotStatus.lotStatusId.toString();
|
||||
tableRowElement.innerHTML =
|
||||
"<td>" +
|
||||
"<form>" +
|
||||
'<td>' +
|
||||
'<form>' +
|
||||
'<input name="lotStatusId" type="hidden" value="' +
|
||||
lotStatus.lotStatusId.toString() +
|
||||
'" />' +
|
||||
|
|
@ -447,47 +447,47 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
(' value="' + cityssm.escapeHTML(lotStatus.lotStatus) + '"') +
|
||||
(' aria-label="' + cityssm.escapeHTML(exports.aliases.lot) + ' Status"') +
|
||||
' maxlength="100" required />' +
|
||||
"</div>" +
|
||||
'</div>' +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
"</form>" +
|
||||
"</td>" +
|
||||
'</div>' +
|
||||
'</div>') +
|
||||
'</form>' +
|
||||
'</td>' +
|
||||
'<td class="is-nowrap">' +
|
||||
'<div class="field is-grouped">' +
|
||||
'<div class="control">' +
|
||||
los.getMoveUpDownButtonFieldHTML("button--moveLotStatusUp", "button--moveLotStatusDown", false) +
|
||||
"</div>" +
|
||||
los.getMoveUpDownButtonFieldHTML('button--moveLotStatusUp', 'button--moveLotStatusDown', false) +
|
||||
'</div>' +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-danger is-light button--deleteLotStatus" data-tooltip="Delete Status" type="button" aria-label="Delete Status">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
"</button>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</td>";
|
||||
tableRowElement.querySelector("form").addEventListener("submit", updateLotStatus);
|
||||
tableRowElement.querySelector(".button--moveLotStatusUp").addEventListener("click", moveLotStatus);
|
||||
tableRowElement.querySelector(".button--moveLotStatusDown").addEventListener("click", moveLotStatus);
|
||||
tableRowElement.querySelector(".button--deleteLotStatus").addEventListener("click", deleteLotStatus);
|
||||
'</button>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</td>';
|
||||
tableRowElement.querySelector('form').addEventListener('submit', updateLotStatus);
|
||||
tableRowElement.querySelector('.button--moveLotStatusUp').addEventListener('click', moveLotStatus);
|
||||
tableRowElement.querySelector('.button--moveLotStatusDown').addEventListener('click', moveLotStatus);
|
||||
tableRowElement.querySelector('.button--deleteLotStatus').addEventListener('click', deleteLotStatus);
|
||||
containerElement.append(tableRowElement);
|
||||
}
|
||||
};
|
||||
document.querySelector("#form--addLotStatus").addEventListener("submit", (submitEvent) => {
|
||||
document.querySelector('#form--addLotStatus').addEventListener('submit', (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
const formElement = submitEvent.currentTarget;
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddLotStatus", formElement, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doAddLotStatus', formElement, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
lotStatuses = responseJSON.lotStatuses;
|
||||
renderLotStatuses();
|
||||
formElement.reset();
|
||||
formElement.querySelector("input").focus();
|
||||
formElement.querySelector('input').focus();
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Adding ${los.escapedAliases.Lot} Status`,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
@ -501,28 +501,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
delete exports.lotOccupantTypes;
|
||||
const updateLotOccupantType = (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateLotOccupantType", submitEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateLotOccupantType', submitEvent.currentTarget, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupantTypes = responseJSON.lotOccupantTypes;
|
||||
bulmaJS.alert({
|
||||
message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Updated Successfully`,
|
||||
contextualColorName: "success"
|
||||
contextualColorName: 'success'
|
||||
});
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Updating ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
const deleteLotOccupantType = (clickEvent) => {
|
||||
const tableRowElement = clickEvent.currentTarget.closest("tr");
|
||||
const tableRowElement = clickEvent.currentTarget.closest('tr');
|
||||
const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId;
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteLotOccupantType", {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteLotOccupantType', {
|
||||
lotOccupantTypeId
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
|
|
@ -535,14 +535,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
bulmaJS.alert({
|
||||
message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Deleted Successfully`,
|
||||
contextualColorName: "success"
|
||||
contextualColorName: 'success'
|
||||
});
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Deleting ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
@ -552,7 +552,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
message: `Are you sure you want to delete this ${los.escapedAliases.lot} ${los.escapedAliases.occupant} type?<br />
|
||||
Note that no ${los.escapedAliases.lot} ${los.escapedAliases.occupants} will be removed.`,
|
||||
messageIsHtml: true,
|
||||
contextualColorName: "warning",
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: `Yes, Delete ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||
callbackFunction: doDelete
|
||||
|
|
@ -561,15 +561,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
};
|
||||
const moveLotOccupantType = (clickEvent) => {
|
||||
const buttonElement = clickEvent.currentTarget;
|
||||
const tableRowElement = buttonElement.closest("tr");
|
||||
const tableRowElement = buttonElement.closest('tr');
|
||||
const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId;
|
||||
cityssm.postJSON(los.urlPrefix +
|
||||
"/admin/" +
|
||||
(buttonElement.dataset.direction === "up"
|
||||
? "doMoveLotOccupantTypeUp"
|
||||
: "doMoveLotOccupantTypeDown"), {
|
||||
'/admin/' +
|
||||
(buttonElement.dataset.direction === 'up' ? 'doMoveLotOccupantTypeUp' : 'doMoveLotOccupantTypeDown'), {
|
||||
lotOccupantTypeId,
|
||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
||||
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupantTypes = responseJSON.lotOccupantTypes;
|
||||
|
|
@ -578,40 +576,40 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Moving ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
const renderLotOccupantTypes = () => {
|
||||
const containerElement = document.querySelector("#container--lotOccupantTypes");
|
||||
const containerElement = document.querySelector('#container--lotOccupantTypes');
|
||||
if (lotOccupantTypes.length === 0) {
|
||||
containerElement.innerHTML = `<tr><td colspan="3">
|
||||
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} ${los.escapedAliases.occupant} types.</p></div>
|
||||
</td></tr>`;
|
||||
return;
|
||||
}
|
||||
containerElement.innerHTML = "";
|
||||
containerElement.innerHTML = '';
|
||||
for (const lotOccupantType of lotOccupantTypes) {
|
||||
const tableRowElement = document.createElement("tr");
|
||||
const tableRowElement = document.createElement('tr');
|
||||
tableRowElement.dataset.lotOccupantTypeId = lotOccupantType.lotOccupantTypeId.toString();
|
||||
const formId = "form--lotOccupantType-" + lotOccupantType.lotOccupantTypeId;
|
||||
const formId = 'form--lotOccupantType-' + lotOccupantType.lotOccupantTypeId;
|
||||
tableRowElement.innerHTML =
|
||||
"<td>" +
|
||||
'<td>' +
|
||||
('<div class="field">' +
|
||||
'<div class="control">' +
|
||||
'<input class="input" name="lotOccupantType" type="text"' +
|
||||
(' value="' + cityssm.escapeHTML(lotOccupantType.lotOccupantType) + '"') +
|
||||
(' form="' + formId + '"') +
|
||||
(' aria-label="' +
|
||||
cityssm.escapeHTML(exports.aliases.lot + " " + exports.aliases.occupant) +
|
||||
cityssm.escapeHTML(exports.aliases.lot + ' ' + exports.aliases.occupant) +
|
||||
' Type"') +
|
||||
' maxlength="100" required />' +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
"</td>" +
|
||||
"<td>" +
|
||||
'</div>' +
|
||||
'</div>') +
|
||||
'</td>' +
|
||||
'<td>' +
|
||||
('<div class="field has-addons">' +
|
||||
'<div class="control"><span class="button is-static">fa-</span></div>' +
|
||||
'<div class="control">' +
|
||||
|
|
@ -621,70 +619,70 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
' list="datalist--fontAwesomeIconClass"' +
|
||||
' aria-label="Icon Name"' +
|
||||
' maxlength="50" />' +
|
||||
"</div>" +
|
||||
'</div>' +
|
||||
'<div class="control"><span class="button is-static">' +
|
||||
'<i class="fas fa-fw fa-' +
|
||||
cityssm.escapeHTML(lotOccupantType.fontAwesomeIconClass) +
|
||||
'"></i></span></div>' +
|
||||
"</div>") +
|
||||
"</td>" +
|
||||
("<td>" +
|
||||
'</div>') +
|
||||
'</td>' +
|
||||
('<td>' +
|
||||
('<form id="' + formId + '">') +
|
||||
'<input name="lotOccupantTypeId" type="hidden"' +
|
||||
(' value="' + lotOccupantType.lotOccupantTypeId.toString() + '"') +
|
||||
" />" +
|
||||
' />' +
|
||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||
"</form>" +
|
||||
"</td>") +
|
||||
'</form>' +
|
||||
'</td>') +
|
||||
'<td class="is-nowrap">' +
|
||||
'<div class="field is-grouped">' +
|
||||
'<div class="control">' +
|
||||
los.getMoveUpDownButtonFieldHTML("button--moveLotOccupantTypeUp", "button--moveLotOccupantTypeDown", false) +
|
||||
"</div>" +
|
||||
los.getMoveUpDownButtonFieldHTML('button--moveLotOccupantTypeUp', 'button--moveLotOccupantTypeDown', false) +
|
||||
'</div>' +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-danger is-light button--deleteLotOccupantType"' +
|
||||
' data-tooltip="Delete ' +
|
||||
los.escapedAliases.Lot +
|
||||
" " +
|
||||
' ' +
|
||||
los.escapedAliases.Occupant +
|
||||
' Type" type="button"' +
|
||||
' aria-label="Delete ' +
|
||||
los.escapedAliases.Lot +
|
||||
" " +
|
||||
' ' +
|
||||
los.escapedAliases.Occupant +
|
||||
' Type">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
"</button>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</td>";
|
||||
'</button>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</td>';
|
||||
const fontAwesomeInputElement = tableRowElement.querySelector("input[name='fontAwesomeIconClass']");
|
||||
fontAwesomeInputElement.addEventListener("keyup", refreshFontAwesomeIcon);
|
||||
fontAwesomeInputElement.addEventListener("change", refreshFontAwesomeIcon);
|
||||
tableRowElement.querySelector("form").addEventListener("submit", updateLotOccupantType);
|
||||
tableRowElement.querySelector(".button--moveLotOccupantTypeUp").addEventListener("click", moveLotOccupantType);
|
||||
tableRowElement.querySelector(".button--moveLotOccupantTypeDown").addEventListener("click", moveLotOccupantType);
|
||||
fontAwesomeInputElement.addEventListener('keyup', refreshFontAwesomeIcon);
|
||||
fontAwesomeInputElement.addEventListener('change', refreshFontAwesomeIcon);
|
||||
tableRowElement.querySelector('form').addEventListener('submit', updateLotOccupantType);
|
||||
tableRowElement.querySelector('.button--moveLotOccupantTypeUp').addEventListener('click', moveLotOccupantType);
|
||||
tableRowElement.querySelector('.button--moveLotOccupantTypeDown').addEventListener('click', moveLotOccupantType);
|
||||
tableRowElement
|
||||
.querySelector(".button--deleteLotOccupantType")
|
||||
.addEventListener("click", deleteLotOccupantType);
|
||||
.querySelector('.button--deleteLotOccupantType')
|
||||
.addEventListener('click', deleteLotOccupantType);
|
||||
containerElement.append(tableRowElement);
|
||||
}
|
||||
};
|
||||
document.querySelector("#form--addLotOccupantType").addEventListener("submit", (submitEvent) => {
|
||||
document.querySelector('#form--addLotOccupantType').addEventListener('submit', (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
const formElement = submitEvent.currentTarget;
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddLotOccupantType", formElement, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doAddLotOccupantType', formElement, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupantTypes = responseJSON.lotOccupantTypes;
|
||||
renderLotOccupantTypes();
|
||||
formElement.reset();
|
||||
formElement.querySelector("input").focus();
|
||||
formElement.querySelector('input').focus();
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Adding ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -9,8 +9,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
const inputElement = changeEvent.currentTarget;
|
||||
const fontAwesomeIconClass = inputElement.value;
|
||||
inputElement
|
||||
.closest(".field")
|
||||
.querySelectorAll(".button.is-static")[1].innerHTML = `<i class="fas fa-fw fa-${fontAwesomeIconClass}" aria-hidden="true"></i>`;
|
||||
.closest('.field')
|
||||
.querySelectorAll('.button.is-static')[1].innerHTML = `<i class="fas fa-fw fa-${fontAwesomeIconClass}" aria-hidden="true"></i>`;
|
||||
}
|
||||
//=include adminTablesWorkOrderTypes.js
|
||||
//=include adminTablesWorkOrderMilestoneTypes.js
|
||||
|
|
|
|||
|
|
@ -1,26 +1,26 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
|
||||
import type * as globalTypes from "../../types/globalTypes";
|
||||
import type * as globalTypes from '../../types/globalTypes'
|
||||
|
||||
(() => {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
const los = exports.los as globalTypes.LOS;
|
||||
;(() => {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
const los = exports.los as globalTypes.LOS
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
function refreshFontAwesomeIcon(changeEvent: Event) {
|
||||
const inputElement = changeEvent.currentTarget as HTMLInputElement;
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
function refreshFontAwesomeIcon(changeEvent: Event) {
|
||||
const inputElement = changeEvent.currentTarget as HTMLInputElement
|
||||
|
||||
const fontAwesomeIconClass = inputElement.value;
|
||||
const fontAwesomeIconClass = inputElement.value
|
||||
|
||||
inputElement
|
||||
.closest(".field")!
|
||||
.querySelectorAll(
|
||||
".button.is-static"
|
||||
)[1].innerHTML = `<i class="fas fa-fw fa-${fontAwesomeIconClass}" aria-hidden="true"></i>`;
|
||||
}
|
||||
inputElement
|
||||
.closest('.field')!
|
||||
.querySelectorAll(
|
||||
'.button.is-static'
|
||||
)[1].innerHTML = `<i class="fas fa-fw fa-${fontAwesomeIconClass}" aria-hidden="true"></i>`
|
||||
}
|
||||
|
||||
//=include adminTablesWorkOrderTypes.js
|
||||
//=include adminTablesWorkOrderMilestoneTypes.js
|
||||
//=include adminTablesLotStatuses.js
|
||||
//=include adminTablesLotOccupantTypes.js
|
||||
})();
|
||||
//=include adminTablesWorkOrderTypes.js
|
||||
//=include adminTablesWorkOrderMilestoneTypes.js
|
||||
//=include adminTablesLotStatuses.js
|
||||
//=include adminTablesLotOccupantTypes.js
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -5,28 +5,28 @@ let lotOccupantTypes = exports.lotOccupantTypes;
|
|||
delete exports.lotOccupantTypes;
|
||||
const updateLotOccupantType = (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateLotOccupantType", submitEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateLotOccupantType', submitEvent.currentTarget, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupantTypes = responseJSON.lotOccupantTypes;
|
||||
bulmaJS.alert({
|
||||
message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Updated Successfully`,
|
||||
contextualColorName: "success"
|
||||
contextualColorName: 'success'
|
||||
});
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Updating ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
const deleteLotOccupantType = (clickEvent) => {
|
||||
const tableRowElement = clickEvent.currentTarget.closest("tr");
|
||||
const tableRowElement = clickEvent.currentTarget.closest('tr');
|
||||
const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId;
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteLotOccupantType", {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteLotOccupantType', {
|
||||
lotOccupantTypeId
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
|
|
@ -39,14 +39,14 @@ const deleteLotOccupantType = (clickEvent) => {
|
|||
}
|
||||
bulmaJS.alert({
|
||||
message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Deleted Successfully`,
|
||||
contextualColorName: "success"
|
||||
contextualColorName: 'success'
|
||||
});
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Deleting ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
@ -56,7 +56,7 @@ const deleteLotOccupantType = (clickEvent) => {
|
|||
message: `Are you sure you want to delete this ${los.escapedAliases.lot} ${los.escapedAliases.occupant} type?<br />
|
||||
Note that no ${los.escapedAliases.lot} ${los.escapedAliases.occupants} will be removed.`,
|
||||
messageIsHtml: true,
|
||||
contextualColorName: "warning",
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: `Yes, Delete ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||
callbackFunction: doDelete
|
||||
|
|
@ -65,15 +65,13 @@ const deleteLotOccupantType = (clickEvent) => {
|
|||
};
|
||||
const moveLotOccupantType = (clickEvent) => {
|
||||
const buttonElement = clickEvent.currentTarget;
|
||||
const tableRowElement = buttonElement.closest("tr");
|
||||
const tableRowElement = buttonElement.closest('tr');
|
||||
const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId;
|
||||
cityssm.postJSON(los.urlPrefix +
|
||||
"/admin/" +
|
||||
(buttonElement.dataset.direction === "up"
|
||||
? "doMoveLotOccupantTypeUp"
|
||||
: "doMoveLotOccupantTypeDown"), {
|
||||
'/admin/' +
|
||||
(buttonElement.dataset.direction === 'up' ? 'doMoveLotOccupantTypeUp' : 'doMoveLotOccupantTypeDown'), {
|
||||
lotOccupantTypeId,
|
||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
||||
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupantTypes = responseJSON.lotOccupantTypes;
|
||||
|
|
@ -82,40 +80,40 @@ const moveLotOccupantType = (clickEvent) => {
|
|||
else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Moving ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
const renderLotOccupantTypes = () => {
|
||||
const containerElement = document.querySelector("#container--lotOccupantTypes");
|
||||
const containerElement = document.querySelector('#container--lotOccupantTypes');
|
||||
if (lotOccupantTypes.length === 0) {
|
||||
containerElement.innerHTML = `<tr><td colspan="3">
|
||||
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} ${los.escapedAliases.occupant} types.</p></div>
|
||||
</td></tr>`;
|
||||
return;
|
||||
}
|
||||
containerElement.innerHTML = "";
|
||||
containerElement.innerHTML = '';
|
||||
for (const lotOccupantType of lotOccupantTypes) {
|
||||
const tableRowElement = document.createElement("tr");
|
||||
const tableRowElement = document.createElement('tr');
|
||||
tableRowElement.dataset.lotOccupantTypeId = lotOccupantType.lotOccupantTypeId.toString();
|
||||
const formId = "form--lotOccupantType-" + lotOccupantType.lotOccupantTypeId;
|
||||
const formId = 'form--lotOccupantType-' + lotOccupantType.lotOccupantTypeId;
|
||||
tableRowElement.innerHTML =
|
||||
"<td>" +
|
||||
'<td>' +
|
||||
('<div class="field">' +
|
||||
'<div class="control">' +
|
||||
'<input class="input" name="lotOccupantType" type="text"' +
|
||||
(' value="' + cityssm.escapeHTML(lotOccupantType.lotOccupantType) + '"') +
|
||||
(' form="' + formId + '"') +
|
||||
(' aria-label="' +
|
||||
cityssm.escapeHTML(exports.aliases.lot + " " + exports.aliases.occupant) +
|
||||
cityssm.escapeHTML(exports.aliases.lot + ' ' + exports.aliases.occupant) +
|
||||
' Type"') +
|
||||
' maxlength="100" required />' +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
"</td>" +
|
||||
"<td>" +
|
||||
'</div>' +
|
||||
'</div>') +
|
||||
'</td>' +
|
||||
'<td>' +
|
||||
('<div class="field has-addons">' +
|
||||
'<div class="control"><span class="button is-static">fa-</span></div>' +
|
||||
'<div class="control">' +
|
||||
|
|
@ -125,70 +123,70 @@ const renderLotOccupantTypes = () => {
|
|||
' list="datalist--fontAwesomeIconClass"' +
|
||||
' aria-label="Icon Name"' +
|
||||
' maxlength="50" />' +
|
||||
"</div>" +
|
||||
'</div>' +
|
||||
'<div class="control"><span class="button is-static">' +
|
||||
'<i class="fas fa-fw fa-' +
|
||||
cityssm.escapeHTML(lotOccupantType.fontAwesomeIconClass) +
|
||||
'"></i></span></div>' +
|
||||
"</div>") +
|
||||
"</td>" +
|
||||
("<td>" +
|
||||
'</div>') +
|
||||
'</td>' +
|
||||
('<td>' +
|
||||
('<form id="' + formId + '">') +
|
||||
'<input name="lotOccupantTypeId" type="hidden"' +
|
||||
(' value="' + lotOccupantType.lotOccupantTypeId.toString() + '"') +
|
||||
" />" +
|
||||
' />' +
|
||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||
"</form>" +
|
||||
"</td>") +
|
||||
'</form>' +
|
||||
'</td>') +
|
||||
'<td class="is-nowrap">' +
|
||||
'<div class="field is-grouped">' +
|
||||
'<div class="control">' +
|
||||
los.getMoveUpDownButtonFieldHTML("button--moveLotOccupantTypeUp", "button--moveLotOccupantTypeDown", false) +
|
||||
"</div>" +
|
||||
los.getMoveUpDownButtonFieldHTML('button--moveLotOccupantTypeUp', 'button--moveLotOccupantTypeDown', false) +
|
||||
'</div>' +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-danger is-light button--deleteLotOccupantType"' +
|
||||
' data-tooltip="Delete ' +
|
||||
los.escapedAliases.Lot +
|
||||
" " +
|
||||
' ' +
|
||||
los.escapedAliases.Occupant +
|
||||
' Type" type="button"' +
|
||||
' aria-label="Delete ' +
|
||||
los.escapedAliases.Lot +
|
||||
" " +
|
||||
' ' +
|
||||
los.escapedAliases.Occupant +
|
||||
' Type">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
"</button>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</td>";
|
||||
'</button>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</td>';
|
||||
const fontAwesomeInputElement = tableRowElement.querySelector("input[name='fontAwesomeIconClass']");
|
||||
fontAwesomeInputElement.addEventListener("keyup", refreshFontAwesomeIcon);
|
||||
fontAwesomeInputElement.addEventListener("change", refreshFontAwesomeIcon);
|
||||
tableRowElement.querySelector("form").addEventListener("submit", updateLotOccupantType);
|
||||
tableRowElement.querySelector(".button--moveLotOccupantTypeUp").addEventListener("click", moveLotOccupantType);
|
||||
tableRowElement.querySelector(".button--moveLotOccupantTypeDown").addEventListener("click", moveLotOccupantType);
|
||||
fontAwesomeInputElement.addEventListener('keyup', refreshFontAwesomeIcon);
|
||||
fontAwesomeInputElement.addEventListener('change', refreshFontAwesomeIcon);
|
||||
tableRowElement.querySelector('form').addEventListener('submit', updateLotOccupantType);
|
||||
tableRowElement.querySelector('.button--moveLotOccupantTypeUp').addEventListener('click', moveLotOccupantType);
|
||||
tableRowElement.querySelector('.button--moveLotOccupantTypeDown').addEventListener('click', moveLotOccupantType);
|
||||
tableRowElement
|
||||
.querySelector(".button--deleteLotOccupantType")
|
||||
.addEventListener("click", deleteLotOccupantType);
|
||||
.querySelector('.button--deleteLotOccupantType')
|
||||
.addEventListener('click', deleteLotOccupantType);
|
||||
containerElement.append(tableRowElement);
|
||||
}
|
||||
};
|
||||
document.querySelector("#form--addLotOccupantType").addEventListener("submit", (submitEvent) => {
|
||||
document.querySelector('#form--addLotOccupantType').addEventListener('submit', (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
const formElement = submitEvent.currentTarget;
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddLotOccupantType", formElement, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doAddLotOccupantType', formElement, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupantTypes = responseJSON.lotOccupantTypes;
|
||||
renderLotOccupantTypes();
|
||||
formElement.reset();
|
||||
formElement.querySelector("input").focus();
|
||||
formElement.querySelector('input').focus();
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Adding ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,280 +1,277 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
|
||||
import type * as globalTypes from "../../types/globalTypes";
|
||||
import type * as recordTypes from "../../types/recordTypes";
|
||||
import type * as globalTypes from '../../types/globalTypes'
|
||||
import type * as recordTypes from '../../types/recordTypes'
|
||||
|
||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||
|
||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
||||
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||
|
||||
declare const cityssm: cityssmGlobal;
|
||||
declare const bulmaJS: BulmaJS;
|
||||
declare const cityssm: cityssmGlobal
|
||||
declare const bulmaJS: BulmaJS
|
||||
|
||||
declare const los: globalTypes.LOS;
|
||||
declare const refreshFontAwesomeIcon: (changeEvent: Event) => void;
|
||||
declare const los: globalTypes.LOS
|
||||
declare const refreshFontAwesomeIcon: (changeEvent: Event) => void
|
||||
|
||||
let lotOccupantTypes: recordTypes.LotOccupantType[] = exports.lotOccupantTypes;
|
||||
delete exports.lotOccupantTypes;
|
||||
let lotOccupantTypes: recordTypes.LotOccupantType[] = exports.lotOccupantTypes
|
||||
delete exports.lotOccupantTypes
|
||||
|
||||
const updateLotOccupantType = (submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
submitEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/admin/doUpdateLotOccupantType",
|
||||
submitEvent.currentTarget,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotOccupantTypes?: recordTypes.LotOccupantType[];
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupantTypes = responseJSON.lotOccupantTypes!;
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/admin/doUpdateLotOccupantType',
|
||||
submitEvent.currentTarget,
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotOccupantTypes?: recordTypes.LotOccupantType[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupantTypes = responseJSON.lotOccupantTypes!
|
||||
|
||||
bulmaJS.alert({
|
||||
message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Updated Successfully`,
|
||||
contextualColorName: "success"
|
||||
});
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Updating ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
bulmaJS.alert({
|
||||
message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Updated Successfully`,
|
||||
contextualColorName: 'success'
|
||||
})
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Updating ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
const deleteLotOccupantType = (clickEvent: Event) => {
|
||||
const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest("tr")!;
|
||||
const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest('tr')!
|
||||
|
||||
const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId;
|
||||
const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId
|
||||
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/admin/doDeleteLotOccupantType",
|
||||
{
|
||||
lotOccupantTypeId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotOccupantTypes?: recordTypes.LotOccupantType[];
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupantTypes = responseJSON.lotOccupantTypes!;
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/admin/doDeleteLotOccupantType',
|
||||
{
|
||||
lotOccupantTypeId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotOccupantTypes?: recordTypes.LotOccupantType[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupantTypes = responseJSON.lotOccupantTypes!
|
||||
|
||||
if (lotOccupantTypes.length === 0) {
|
||||
renderLotOccupantTypes();
|
||||
} else {
|
||||
tableRowElement.remove();
|
||||
}
|
||||
if (lotOccupantTypes.length === 0) {
|
||||
renderLotOccupantTypes()
|
||||
} else {
|
||||
tableRowElement.remove()
|
||||
}
|
||||
|
||||
bulmaJS.alert({
|
||||
message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Deleted Successfully`,
|
||||
contextualColorName: "success"
|
||||
});
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Deleting ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
bulmaJS.confirm({
|
||||
title: `Delete ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||
message: `Are you sure you want to delete this ${los.escapedAliases.lot} ${los.escapedAliases.occupant} type?<br />
|
||||
Note that no ${los.escapedAliases.lot} ${los.escapedAliases.occupants} will be removed.`,
|
||||
messageIsHtml: true,
|
||||
contextualColorName: "warning",
|
||||
okButton: {
|
||||
text: `Yes, Delete ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||
callbackFunction: doDelete
|
||||
bulmaJS.alert({
|
||||
message: `${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type Deleted Successfully`,
|
||||
contextualColorName: 'success'
|
||||
})
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Deleting ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
});
|
||||
};
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
bulmaJS.confirm({
|
||||
title: `Delete ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||
message: `Are you sure you want to delete this ${los.escapedAliases.lot} ${los.escapedAliases.occupant} type?<br />
|
||||
Note that no ${los.escapedAliases.lot} ${los.escapedAliases.occupants} will be removed.`,
|
||||
messageIsHtml: true,
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: `Yes, Delete ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const moveLotOccupantType = (clickEvent: MouseEvent) => {
|
||||
const buttonElement = clickEvent.currentTarget as HTMLButtonElement;
|
||||
const buttonElement = clickEvent.currentTarget as HTMLButtonElement
|
||||
|
||||
const tableRowElement = buttonElement.closest("tr")!;
|
||||
const tableRowElement = buttonElement.closest('tr')!
|
||||
|
||||
const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId;
|
||||
const lotOccupantTypeId = tableRowElement.dataset.lotOccupantTypeId
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix +
|
||||
"/admin/" +
|
||||
(buttonElement.dataset.direction === "up"
|
||||
? "doMoveLotOccupantTypeUp"
|
||||
: "doMoveLotOccupantTypeDown"),
|
||||
{
|
||||
lotOccupantTypeId,
|
||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotOccupantTypes?: recordTypes.LotOccupantType[];
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupantTypes = responseJSON.lotOccupantTypes!;
|
||||
renderLotOccupantTypes();
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Moving ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix +
|
||||
'/admin/' +
|
||||
(buttonElement.dataset.direction === 'up' ? 'doMoveLotOccupantTypeUp' : 'doMoveLotOccupantTypeDown'),
|
||||
{
|
||||
lotOccupantTypeId,
|
||||
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotOccupantTypes?: recordTypes.LotOccupantType[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupantTypes = responseJSON.lotOccupantTypes!
|
||||
renderLotOccupantTypes()
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Moving ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
const renderLotOccupantTypes = () => {
|
||||
const containerElement = document.querySelector(
|
||||
"#container--lotOccupantTypes"
|
||||
) as HTMLTableSectionElement;
|
||||
const containerElement = document.querySelector('#container--lotOccupantTypes') as HTMLTableSectionElement
|
||||
|
||||
if (lotOccupantTypes.length === 0) {
|
||||
containerElement.innerHTML = `<tr><td colspan="3">
|
||||
if (lotOccupantTypes.length === 0) {
|
||||
containerElement.innerHTML = `<tr><td colspan="3">
|
||||
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} ${los.escapedAliases.occupant} types.</p></div>
|
||||
</td></tr>`;
|
||||
</td></tr>`
|
||||
|
||||
return;
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
containerElement.innerHTML = "";
|
||||
containerElement.innerHTML = ''
|
||||
|
||||
for (const lotOccupantType of lotOccupantTypes) {
|
||||
const tableRowElement = document.createElement("tr");
|
||||
for (const lotOccupantType of lotOccupantTypes) {
|
||||
const tableRowElement = document.createElement('tr')
|
||||
|
||||
tableRowElement.dataset.lotOccupantTypeId = lotOccupantType.lotOccupantTypeId.toString();
|
||||
tableRowElement.dataset.lotOccupantTypeId = lotOccupantType.lotOccupantTypeId.toString()
|
||||
|
||||
const formId = "form--lotOccupantType-" + lotOccupantType.lotOccupantTypeId;
|
||||
const formId = 'form--lotOccupantType-' + lotOccupantType.lotOccupantTypeId
|
||||
|
||||
tableRowElement.innerHTML =
|
||||
"<td>" +
|
||||
('<div class="field">' +
|
||||
'<div class="control">' +
|
||||
'<input class="input" name="lotOccupantType" type="text"' +
|
||||
(' value="' + cityssm.escapeHTML(lotOccupantType.lotOccupantType) + '"') +
|
||||
(' form="' + formId + '"') +
|
||||
(' aria-label="' +
|
||||
cityssm.escapeHTML(exports.aliases.lot + " " + exports.aliases.occupant) +
|
||||
' Type"') +
|
||||
' maxlength="100" required />' +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
"</td>" +
|
||||
"<td>" +
|
||||
('<div class="field has-addons">' +
|
||||
'<div class="control"><span class="button is-static">fa-</span></div>' +
|
||||
'<div class="control">' +
|
||||
'<input class="input" name="fontAwesomeIconClass" type="text"' +
|
||||
(' value="' + cityssm.escapeHTML(lotOccupantType.fontAwesomeIconClass) + '"') +
|
||||
(' form="' + formId + '"') +
|
||||
' list="datalist--fontAwesomeIconClass"' +
|
||||
' aria-label="Icon Name"' +
|
||||
' maxlength="50" />' +
|
||||
"</div>" +
|
||||
'<div class="control"><span class="button is-static">' +
|
||||
'<i class="fas fa-fw fa-' +
|
||||
cityssm.escapeHTML(lotOccupantType.fontAwesomeIconClass) +
|
||||
'"></i></span></div>' +
|
||||
"</div>") +
|
||||
"</td>" +
|
||||
("<td>" +
|
||||
('<form id="' + formId + '">') +
|
||||
'<input name="lotOccupantTypeId" type="hidden"' +
|
||||
(' value="' + lotOccupantType.lotOccupantTypeId.toString() + '"') +
|
||||
" />" +
|
||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||
"</form>" +
|
||||
"</td>") +
|
||||
'<td class="is-nowrap">' +
|
||||
'<div class="field is-grouped">' +
|
||||
'<div class="control">' +
|
||||
los.getMoveUpDownButtonFieldHTML(
|
||||
"button--moveLotOccupantTypeUp",
|
||||
"button--moveLotOccupantTypeDown",
|
||||
false
|
||||
) +
|
||||
"</div>" +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-danger is-light button--deleteLotOccupantType"' +
|
||||
' data-tooltip="Delete ' +
|
||||
los.escapedAliases.Lot +
|
||||
" " +
|
||||
los.escapedAliases.Occupant +
|
||||
' Type" type="button"' +
|
||||
' aria-label="Delete ' +
|
||||
los.escapedAliases.Lot +
|
||||
" " +
|
||||
los.escapedAliases.Occupant +
|
||||
' Type">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
"</button>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</td>";
|
||||
tableRowElement.innerHTML =
|
||||
'<td>' +
|
||||
('<div class="field">' +
|
||||
'<div class="control">' +
|
||||
'<input class="input" name="lotOccupantType" type="text"' +
|
||||
(' value="' + cityssm.escapeHTML(lotOccupantType.lotOccupantType) + '"') +
|
||||
(' form="' + formId + '"') +
|
||||
(' aria-label="' +
|
||||
cityssm.escapeHTML(exports.aliases.lot + ' ' + exports.aliases.occupant) +
|
||||
' Type"') +
|
||||
' maxlength="100" required />' +
|
||||
'</div>' +
|
||||
'</div>') +
|
||||
'</td>' +
|
||||
'<td>' +
|
||||
('<div class="field has-addons">' +
|
||||
'<div class="control"><span class="button is-static">fa-</span></div>' +
|
||||
'<div class="control">' +
|
||||
'<input class="input" name="fontAwesomeIconClass" type="text"' +
|
||||
(' value="' + cityssm.escapeHTML(lotOccupantType.fontAwesomeIconClass) + '"') +
|
||||
(' form="' + formId + '"') +
|
||||
' list="datalist--fontAwesomeIconClass"' +
|
||||
' aria-label="Icon Name"' +
|
||||
' maxlength="50" />' +
|
||||
'</div>' +
|
||||
'<div class="control"><span class="button is-static">' +
|
||||
'<i class="fas fa-fw fa-' +
|
||||
cityssm.escapeHTML(lotOccupantType.fontAwesomeIconClass) +
|
||||
'"></i></span></div>' +
|
||||
'</div>') +
|
||||
'</td>' +
|
||||
('<td>' +
|
||||
('<form id="' + formId + '">') +
|
||||
'<input name="lotOccupantTypeId" type="hidden"' +
|
||||
(' value="' + lotOccupantType.lotOccupantTypeId.toString() + '"') +
|
||||
' />' +
|
||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||
'</form>' +
|
||||
'</td>') +
|
||||
'<td class="is-nowrap">' +
|
||||
'<div class="field is-grouped">' +
|
||||
'<div class="control">' +
|
||||
los.getMoveUpDownButtonFieldHTML(
|
||||
'button--moveLotOccupantTypeUp',
|
||||
'button--moveLotOccupantTypeDown',
|
||||
false
|
||||
) +
|
||||
'</div>' +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-danger is-light button--deleteLotOccupantType"' +
|
||||
' data-tooltip="Delete ' +
|
||||
los.escapedAliases.Lot +
|
||||
' ' +
|
||||
los.escapedAliases.Occupant +
|
||||
' Type" type="button"' +
|
||||
' aria-label="Delete ' +
|
||||
los.escapedAliases.Lot +
|
||||
' ' +
|
||||
los.escapedAliases.Occupant +
|
||||
' Type">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
'</button>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</td>'
|
||||
|
||||
const fontAwesomeInputElement = tableRowElement.querySelector("input[name='fontAwesomeIconClass']")!;
|
||||
const fontAwesomeInputElement = tableRowElement.querySelector("input[name='fontAwesomeIconClass']")!
|
||||
|
||||
fontAwesomeInputElement.addEventListener("keyup", refreshFontAwesomeIcon);
|
||||
fontAwesomeInputElement.addEventListener("change", refreshFontAwesomeIcon);
|
||||
fontAwesomeInputElement.addEventListener('keyup', refreshFontAwesomeIcon)
|
||||
fontAwesomeInputElement.addEventListener('change', refreshFontAwesomeIcon)
|
||||
|
||||
tableRowElement.querySelector("form")!.addEventListener("submit", updateLotOccupantType);
|
||||
tableRowElement.querySelector('form')!.addEventListener('submit', updateLotOccupantType)
|
||||
|
||||
(
|
||||
tableRowElement.querySelector(".button--moveLotOccupantTypeUp") as HTMLButtonElement
|
||||
).addEventListener("click", moveLotOccupantType);
|
||||
;(tableRowElement.querySelector('.button--moveLotOccupantTypeUp') as HTMLButtonElement).addEventListener(
|
||||
'click',
|
||||
moveLotOccupantType
|
||||
)
|
||||
|
||||
(
|
||||
tableRowElement.querySelector(".button--moveLotOccupantTypeDown") as HTMLButtonElement
|
||||
).addEventListener("click", moveLotOccupantType);
|
||||
;(
|
||||
tableRowElement.querySelector('.button--moveLotOccupantTypeDown') as HTMLButtonElement
|
||||
).addEventListener('click', moveLotOccupantType)
|
||||
|
||||
tableRowElement
|
||||
.querySelector(".button--deleteLotOccupantType")!
|
||||
.addEventListener("click", deleteLotOccupantType);
|
||||
tableRowElement
|
||||
.querySelector('.button--deleteLotOccupantType')!
|
||||
.addEventListener('click', deleteLotOccupantType)
|
||||
|
||||
containerElement.append(tableRowElement);
|
||||
}
|
||||
};
|
||||
containerElement.append(tableRowElement)
|
||||
}
|
||||
}
|
||||
|
||||
(document.querySelector("#form--addLotOccupantType") as HTMLFormElement).addEventListener(
|
||||
"submit",
|
||||
(submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
;(document.querySelector('#form--addLotOccupantType') as HTMLFormElement).addEventListener(
|
||||
'submit',
|
||||
(submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault()
|
||||
|
||||
const formElement = submitEvent.currentTarget as HTMLFormElement;
|
||||
const formElement = submitEvent.currentTarget as HTMLFormElement
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/admin/doAddLotOccupantType",
|
||||
formElement,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotOccupantTypes?: recordTypes.LotOccupantType[];
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupantTypes = responseJSON.lotOccupantTypes!;
|
||||
renderLotOccupantTypes();
|
||||
formElement.reset();
|
||||
formElement.querySelector("input")!.focus();
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Adding ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/admin/doAddLotOccupantType',
|
||||
formElement,
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotOccupantTypes?: recordTypes.LotOccupantType[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupantTypes = responseJSON.lotOccupantTypes!
|
||||
renderLotOccupantTypes()
|
||||
formElement.reset()
|
||||
formElement.querySelector('input')!.focus()
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Adding ${los.escapedAliases.Lot} ${los.escapedAliases.Occupant} Type`,
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
renderLotOccupantTypes();
|
||||
renderLotOccupantTypes()
|
||||
|
|
|
|||
|
|
@ -5,28 +5,28 @@ let lotStatuses = exports.lotStatuses;
|
|||
delete exports.lotStatuses;
|
||||
const updateLotStatus = (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateLotStatus", submitEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateLotStatus', submitEvent.currentTarget, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
lotStatuses = responseJSON.lotStatuses;
|
||||
bulmaJS.alert({
|
||||
message: los.escapedAliases.Lot + " Status Updated Successfully",
|
||||
contextualColorName: "success"
|
||||
message: los.escapedAliases.Lot + ' Status Updated Successfully',
|
||||
contextualColorName: 'success'
|
||||
});
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating " + los.escapedAliases.Lot + " Status",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Updating ' + los.escapedAliases.Lot + ' Status',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
const deleteLotStatus = (clickEvent) => {
|
||||
const tableRowElement = clickEvent.currentTarget.closest("tr");
|
||||
const tableRowElement = clickEvent.currentTarget.closest('tr');
|
||||
const lotStatusId = tableRowElement.dataset.lotStatusId;
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteLotStatus", {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteLotStatus', {
|
||||
lotStatusId
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
|
|
@ -38,15 +38,15 @@ const deleteLotStatus = (clickEvent) => {
|
|||
tableRowElement.remove();
|
||||
}
|
||||
bulmaJS.alert({
|
||||
message: los.escapedAliases.Lot + " Status Deleted Successfully",
|
||||
contextualColorName: "success"
|
||||
message: los.escapedAliases.Lot + ' Status Deleted Successfully',
|
||||
contextualColorName: 'success'
|
||||
});
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Deleting " + los.escapedAliases.Lot + " Status",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Deleting ' + los.escapedAliases.Lot + ' Status',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
@ -56,22 +56,22 @@ const deleteLotStatus = (clickEvent) => {
|
|||
message: `Are you sure you want to delete this status?<br />
|
||||
Note that no ${los.escapedAliases.lot} will be removed.`,
|
||||
messageIsHtml: true,
|
||||
contextualColorName: "warning",
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: "Yes, Delete Status",
|
||||
text: 'Yes, Delete Status',
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
});
|
||||
};
|
||||
const moveLotStatus = (clickEvent) => {
|
||||
const buttonElement = clickEvent.currentTarget;
|
||||
const tableRowElement = buttonElement.closest("tr");
|
||||
const tableRowElement = buttonElement.closest('tr');
|
||||
const lotStatusId = tableRowElement.dataset.lotStatusId;
|
||||
cityssm.postJSON(los.urlPrefix +
|
||||
"/admin/" +
|
||||
(buttonElement.dataset.direction === "up" ? "doMoveLotStatusUp" : "doMoveLotStatusDown"), {
|
||||
'/admin/' +
|
||||
(buttonElement.dataset.direction === 'up' ? 'doMoveLotStatusUp' : 'doMoveLotStatusDown'), {
|
||||
lotStatusId,
|
||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
||||
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
lotStatuses = responseJSON.lotStatuses;
|
||||
|
|
@ -79,28 +79,28 @@ const moveLotStatus = (clickEvent) => {
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Moving " + exports.aliases.lot + " Status",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Moving ' + exports.aliases.lot + ' Status',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
const renderLotStatuses = () => {
|
||||
const containerElement = document.querySelector("#container--lotStatuses");
|
||||
const containerElement = document.querySelector('#container--lotStatuses');
|
||||
if (lotStatuses.length === 0) {
|
||||
containerElement.innerHTML = `<tr><td colspan="2">
|
||||
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} statuses.</p></div>
|
||||
</td></tr>`;
|
||||
return;
|
||||
}
|
||||
containerElement.innerHTML = "";
|
||||
containerElement.innerHTML = '';
|
||||
for (const lotStatus of lotStatuses) {
|
||||
const tableRowElement = document.createElement("tr");
|
||||
const tableRowElement = document.createElement('tr');
|
||||
tableRowElement.dataset.lotStatusId = lotStatus.lotStatusId.toString();
|
||||
tableRowElement.innerHTML =
|
||||
"<td>" +
|
||||
"<form>" +
|
||||
'<td>' +
|
||||
'<form>' +
|
||||
'<input name="lotStatusId" type="hidden" value="' +
|
||||
lotStatus.lotStatusId.toString() +
|
||||
'" />' +
|
||||
|
|
@ -110,47 +110,47 @@ const renderLotStatuses = () => {
|
|||
(' value="' + cityssm.escapeHTML(lotStatus.lotStatus) + '"') +
|
||||
(' aria-label="' + cityssm.escapeHTML(exports.aliases.lot) + ' Status"') +
|
||||
' maxlength="100" required />' +
|
||||
"</div>" +
|
||||
'</div>' +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
"</form>" +
|
||||
"</td>" +
|
||||
'</div>' +
|
||||
'</div>') +
|
||||
'</form>' +
|
||||
'</td>' +
|
||||
'<td class="is-nowrap">' +
|
||||
'<div class="field is-grouped">' +
|
||||
'<div class="control">' +
|
||||
los.getMoveUpDownButtonFieldHTML("button--moveLotStatusUp", "button--moveLotStatusDown", false) +
|
||||
"</div>" +
|
||||
los.getMoveUpDownButtonFieldHTML('button--moveLotStatusUp', 'button--moveLotStatusDown', false) +
|
||||
'</div>' +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-danger is-light button--deleteLotStatus" data-tooltip="Delete Status" type="button" aria-label="Delete Status">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
"</button>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</td>";
|
||||
tableRowElement.querySelector("form").addEventListener("submit", updateLotStatus);
|
||||
tableRowElement.querySelector(".button--moveLotStatusUp").addEventListener("click", moveLotStatus);
|
||||
tableRowElement.querySelector(".button--moveLotStatusDown").addEventListener("click", moveLotStatus);
|
||||
tableRowElement.querySelector(".button--deleteLotStatus").addEventListener("click", deleteLotStatus);
|
||||
'</button>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</td>';
|
||||
tableRowElement.querySelector('form').addEventListener('submit', updateLotStatus);
|
||||
tableRowElement.querySelector('.button--moveLotStatusUp').addEventListener('click', moveLotStatus);
|
||||
tableRowElement.querySelector('.button--moveLotStatusDown').addEventListener('click', moveLotStatus);
|
||||
tableRowElement.querySelector('.button--deleteLotStatus').addEventListener('click', deleteLotStatus);
|
||||
containerElement.append(tableRowElement);
|
||||
}
|
||||
};
|
||||
document.querySelector("#form--addLotStatus").addEventListener("submit", (submitEvent) => {
|
||||
document.querySelector('#form--addLotStatus').addEventListener('submit', (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
const formElement = submitEvent.currentTarget;
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddLotStatus", formElement, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doAddLotStatus', formElement, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
lotStatuses = responseJSON.lotStatuses;
|
||||
renderLotStatuses();
|
||||
formElement.reset();
|
||||
formElement.querySelector("input").focus();
|
||||
formElement.querySelector('input').focus();
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Adding ${los.escapedAliases.Lot} Status`,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,234 +1,218 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
|
||||
import type * as globalTypes from "../../types/globalTypes";
|
||||
import type * as recordTypes from "../../types/recordTypes";
|
||||
import type * as globalTypes from '../../types/globalTypes'
|
||||
import type * as recordTypes from '../../types/recordTypes'
|
||||
|
||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||
|
||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
||||
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||
|
||||
declare const cityssm: cityssmGlobal;
|
||||
declare const bulmaJS: BulmaJS;
|
||||
declare const cityssm: cityssmGlobal
|
||||
declare const bulmaJS: BulmaJS
|
||||
|
||||
declare const los: globalTypes.LOS;
|
||||
declare const los: globalTypes.LOS
|
||||
|
||||
let lotStatuses: recordTypes.LotStatus[] = exports.lotStatuses;
|
||||
delete exports.lotStatuses;
|
||||
let lotStatuses: recordTypes.LotStatus[] = exports.lotStatuses
|
||||
delete exports.lotStatuses
|
||||
|
||||
const updateLotStatus = (submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
submitEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/admin/doUpdateLotStatus",
|
||||
submitEvent.currentTarget,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotStatuses?: recordTypes.LotStatus[];
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotStatuses = responseJSON.lotStatuses!;
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/admin/doUpdateLotStatus',
|
||||
submitEvent.currentTarget,
|
||||
(responseJSON: { success: boolean; errorMessage?: string; lotStatuses?: recordTypes.LotStatus[] }) => {
|
||||
if (responseJSON.success) {
|
||||
lotStatuses = responseJSON.lotStatuses!
|
||||
|
||||
bulmaJS.alert({
|
||||
message: los.escapedAliases.Lot + " Status Updated Successfully",
|
||||
contextualColorName: "success"
|
||||
});
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating " + los.escapedAliases.Lot + " Status",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
bulmaJS.alert({
|
||||
message: los.escapedAliases.Lot + ' Status Updated Successfully',
|
||||
contextualColorName: 'success'
|
||||
})
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: 'Error Updating ' + los.escapedAliases.Lot + ' Status',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
const deleteLotStatus = (clickEvent: Event) => {
|
||||
const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest("tr")!;
|
||||
const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest('tr')!
|
||||
|
||||
const lotStatusId = tableRowElement.dataset.lotStatusId;
|
||||
const lotStatusId = tableRowElement.dataset.lotStatusId
|
||||
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/admin/doDeleteLotStatus",
|
||||
{
|
||||
lotStatusId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotStatuses?: recordTypes.LotStatus[];
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotStatuses = responseJSON.lotStatuses!;
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/admin/doDeleteLotStatus',
|
||||
{
|
||||
lotStatusId
|
||||
},
|
||||
(responseJSON: { success: boolean; errorMessage?: string; lotStatuses?: recordTypes.LotStatus[] }) => {
|
||||
if (responseJSON.success) {
|
||||
lotStatuses = responseJSON.lotStatuses!
|
||||
|
||||
if (lotStatuses.length === 0) {
|
||||
renderLotStatuses();
|
||||
} else {
|
||||
tableRowElement.remove();
|
||||
}
|
||||
if (lotStatuses.length === 0) {
|
||||
renderLotStatuses()
|
||||
} else {
|
||||
tableRowElement.remove()
|
||||
}
|
||||
|
||||
bulmaJS.alert({
|
||||
message: los.escapedAliases.Lot + " Status Deleted Successfully",
|
||||
contextualColorName: "success"
|
||||
});
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Deleting " + los.escapedAliases.Lot + " Status",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
bulmaJS.confirm({
|
||||
title: `Delete ${los.escapedAliases.Lot} Status`,
|
||||
message: `Are you sure you want to delete this status?<br />
|
||||
Note that no ${los.escapedAliases.lot} will be removed.`,
|
||||
messageIsHtml: true,
|
||||
contextualColorName: "warning",
|
||||
okButton: {
|
||||
text: "Yes, Delete Status",
|
||||
callbackFunction: doDelete
|
||||
bulmaJS.alert({
|
||||
message: los.escapedAliases.Lot + ' Status Deleted Successfully',
|
||||
contextualColorName: 'success'
|
||||
})
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: 'Error Deleting ' + los.escapedAliases.Lot + ' Status',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
});
|
||||
};
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
bulmaJS.confirm({
|
||||
title: `Delete ${los.escapedAliases.Lot} Status`,
|
||||
message: `Are you sure you want to delete this status?<br />
|
||||
Note that no ${los.escapedAliases.lot} will be removed.`,
|
||||
messageIsHtml: true,
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: 'Yes, Delete Status',
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const moveLotStatus = (clickEvent: MouseEvent) => {
|
||||
const buttonElement = clickEvent.currentTarget as HTMLButtonElement;
|
||||
const buttonElement = clickEvent.currentTarget as HTMLButtonElement
|
||||
|
||||
const tableRowElement = buttonElement.closest("tr")!;
|
||||
const tableRowElement = buttonElement.closest('tr')!
|
||||
|
||||
const lotStatusId = tableRowElement.dataset.lotStatusId;
|
||||
const lotStatusId = tableRowElement.dataset.lotStatusId
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix +
|
||||
"/admin/" +
|
||||
(buttonElement.dataset.direction === "up" ? "doMoveLotStatusUp" : "doMoveLotStatusDown"),
|
||||
{
|
||||
lotStatusId,
|
||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotStatuses?: recordTypes.LotStatus[];
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotStatuses = responseJSON.lotStatuses!;
|
||||
renderLotStatuses();
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Moving " + exports.aliases.lot + " Status",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix +
|
||||
'/admin/' +
|
||||
(buttonElement.dataset.direction === 'up' ? 'doMoveLotStatusUp' : 'doMoveLotStatusDown'),
|
||||
{
|
||||
lotStatusId,
|
||||
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||
},
|
||||
(responseJSON: { success: boolean; errorMessage?: string; lotStatuses?: recordTypes.LotStatus[] }) => {
|
||||
if (responseJSON.success) {
|
||||
lotStatuses = responseJSON.lotStatuses!
|
||||
renderLotStatuses()
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: 'Error Moving ' + exports.aliases.lot + ' Status',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
const renderLotStatuses = () => {
|
||||
const containerElement = document.querySelector("#container--lotStatuses") as HTMLTableSectionElement;
|
||||
const containerElement = document.querySelector('#container--lotStatuses') as HTMLTableSectionElement
|
||||
|
||||
if (lotStatuses.length === 0) {
|
||||
containerElement.innerHTML = `<tr><td colspan="2">
|
||||
if (lotStatuses.length === 0) {
|
||||
containerElement.innerHTML = `<tr><td colspan="2">
|
||||
<div class="message is-warning"><p class="message-body">There are no active ${los.escapedAliases.lot} statuses.</p></div>
|
||||
</td></tr>`;
|
||||
</td></tr>`
|
||||
|
||||
return;
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
containerElement.innerHTML = "";
|
||||
containerElement.innerHTML = ''
|
||||
|
||||
for (const lotStatus of lotStatuses) {
|
||||
const tableRowElement = document.createElement("tr");
|
||||
for (const lotStatus of lotStatuses) {
|
||||
const tableRowElement = document.createElement('tr')
|
||||
|
||||
tableRowElement.dataset.lotStatusId = lotStatus.lotStatusId.toString();
|
||||
tableRowElement.dataset.lotStatusId = lotStatus.lotStatusId.toString()
|
||||
|
||||
tableRowElement.innerHTML =
|
||||
"<td>" +
|
||||
"<form>" +
|
||||
'<input name="lotStatusId" type="hidden" value="' +
|
||||
lotStatus.lotStatusId.toString() +
|
||||
'" />' +
|
||||
('<div class="field has-addons">' +
|
||||
'<div class="control">' +
|
||||
'<input class="input" name="lotStatus" type="text"' +
|
||||
(' value="' + cityssm.escapeHTML(lotStatus.lotStatus) + '"') +
|
||||
(' aria-label="' + cityssm.escapeHTML(exports.aliases.lot) + ' Status"') +
|
||||
' maxlength="100" required />' +
|
||||
"</div>" +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
"</form>" +
|
||||
"</td>" +
|
||||
'<td class="is-nowrap">' +
|
||||
'<div class="field is-grouped">' +
|
||||
'<div class="control">' +
|
||||
los.getMoveUpDownButtonFieldHTML("button--moveLotStatusUp", "button--moveLotStatusDown", false) +
|
||||
"</div>" +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-danger is-light button--deleteLotStatus" data-tooltip="Delete Status" type="button" aria-label="Delete Status">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
"</button>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</td>";
|
||||
tableRowElement.innerHTML =
|
||||
'<td>' +
|
||||
'<form>' +
|
||||
'<input name="lotStatusId" type="hidden" value="' +
|
||||
lotStatus.lotStatusId.toString() +
|
||||
'" />' +
|
||||
('<div class="field has-addons">' +
|
||||
'<div class="control">' +
|
||||
'<input class="input" name="lotStatus" type="text"' +
|
||||
(' value="' + cityssm.escapeHTML(lotStatus.lotStatus) + '"') +
|
||||
(' aria-label="' + cityssm.escapeHTML(exports.aliases.lot) + ' Status"') +
|
||||
' maxlength="100" required />' +
|
||||
'</div>' +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||
'</div>' +
|
||||
'</div>') +
|
||||
'</form>' +
|
||||
'</td>' +
|
||||
'<td class="is-nowrap">' +
|
||||
'<div class="field is-grouped">' +
|
||||
'<div class="control">' +
|
||||
los.getMoveUpDownButtonFieldHTML('button--moveLotStatusUp', 'button--moveLotStatusDown', false) +
|
||||
'</div>' +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-danger is-light button--deleteLotStatus" data-tooltip="Delete Status" type="button" aria-label="Delete Status">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
'</button>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</td>'
|
||||
|
||||
tableRowElement.querySelector("form")!.addEventListener("submit", updateLotStatus);
|
||||
tableRowElement.querySelector('form')!.addEventListener('submit', updateLotStatus)
|
||||
|
||||
(tableRowElement.querySelector(".button--moveLotStatusUp") as HTMLButtonElement).addEventListener(
|
||||
"click",
|
||||
moveLotStatus
|
||||
);
|
||||
;(tableRowElement.querySelector('.button--moveLotStatusUp') as HTMLButtonElement).addEventListener(
|
||||
'click',
|
||||
moveLotStatus
|
||||
)
|
||||
|
||||
(tableRowElement.querySelector(".button--moveLotStatusDown") as HTMLButtonElement).addEventListener(
|
||||
"click",
|
||||
moveLotStatus
|
||||
);
|
||||
;(tableRowElement.querySelector('.button--moveLotStatusDown') as HTMLButtonElement).addEventListener(
|
||||
'click',
|
||||
moveLotStatus
|
||||
)
|
||||
|
||||
tableRowElement.querySelector(".button--deleteLotStatus")!.addEventListener("click", deleteLotStatus);
|
||||
tableRowElement.querySelector('.button--deleteLotStatus')!.addEventListener('click', deleteLotStatus)
|
||||
|
||||
containerElement.append(tableRowElement);
|
||||
}
|
||||
};
|
||||
containerElement.append(tableRowElement)
|
||||
}
|
||||
}
|
||||
|
||||
(document.querySelector("#form--addLotStatus") as HTMLFormElement).addEventListener(
|
||||
"submit",
|
||||
(submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
;(document.querySelector('#form--addLotStatus') as HTMLFormElement).addEventListener(
|
||||
'submit',
|
||||
(submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault()
|
||||
|
||||
const formElement = submitEvent.currentTarget as HTMLFormElement;
|
||||
const formElement = submitEvent.currentTarget as HTMLFormElement
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/admin/doAddLotStatus",
|
||||
formElement,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotStatuses?: recordTypes.LotStatus[];
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotStatuses = responseJSON.lotStatuses!;
|
||||
renderLotStatuses();
|
||||
formElement.reset();
|
||||
formElement.querySelector("input")!.focus();
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Adding ${los.escapedAliases.Lot} Status`,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/admin/doAddLotStatus',
|
||||
formElement,
|
||||
(responseJSON: { success: boolean; errorMessage?: string; lotStatuses?: recordTypes.LotStatus[] }) => {
|
||||
if (responseJSON.success) {
|
||||
lotStatuses = responseJSON.lotStatuses!
|
||||
renderLotStatuses()
|
||||
formElement.reset()
|
||||
formElement.querySelector('input')!.focus()
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Adding ${los.escapedAliases.Lot} Status`,
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
renderLotStatuses();
|
||||
renderLotStatuses()
|
||||
|
|
|
|||
|
|
@ -5,28 +5,28 @@ let workOrderMilestoneTypes = exports.workOrderMilestoneTypes;
|
|||
delete exports.workOrderMilestoneTypes;
|
||||
const updateWorkOrderMilestoneType = (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateWorkOrderMilestoneType", submitEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateWorkOrderMilestoneType', submitEvent.currentTarget, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes;
|
||||
bulmaJS.alert({
|
||||
message: "Work Order Milestone Type Updated Successfully",
|
||||
contextualColorName: "success"
|
||||
message: 'Work Order Milestone Type Updated Successfully',
|
||||
contextualColorName: 'success'
|
||||
});
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating Work Order Milestone Type",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Updating Work Order Milestone Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
const deleteWorkOrderMilestoneType = (clickEvent) => {
|
||||
const tableRowElement = clickEvent.currentTarget.closest("tr");
|
||||
const tableRowElement = clickEvent.currentTarget.closest('tr');
|
||||
const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId;
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteWorkOrderMilestoneType", {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteWorkOrderMilestoneType', {
|
||||
workOrderMilestoneTypeId
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
|
|
@ -38,42 +38,42 @@ const deleteWorkOrderMilestoneType = (clickEvent) => {
|
|||
tableRowElement.remove();
|
||||
}
|
||||
bulmaJS.alert({
|
||||
message: "Work Order Milestone Type Deleted Successfully",
|
||||
contextualColorName: "success"
|
||||
message: 'Work Order Milestone Type Deleted Successfully',
|
||||
contextualColorName: 'success'
|
||||
});
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Deleting Work Order Milestone Type",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Deleting Work Order Milestone Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
bulmaJS.confirm({
|
||||
title: "Delete Work Order Milestone Type",
|
||||
title: 'Delete Work Order Milestone Type',
|
||||
message: `Are you sure you want to delete this work order milestone type?<br />
|
||||
Note that no work orders will be removed.`,
|
||||
messageIsHtml: true,
|
||||
contextualColorName: "warning",
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: "Yes, Delete Work Order Milestone Type",
|
||||
text: 'Yes, Delete Work Order Milestone Type',
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
});
|
||||
};
|
||||
const moveWorkOrderMilestoneType = (clickEvent) => {
|
||||
const buttonElement = clickEvent.currentTarget;
|
||||
const tableRowElement = buttonElement.closest("tr");
|
||||
const tableRowElement = buttonElement.closest('tr');
|
||||
const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId;
|
||||
cityssm.postJSON(los.urlPrefix +
|
||||
"/admin/" +
|
||||
(buttonElement.dataset.direction === "up"
|
||||
? "doMoveWorkOrderMilestoneTypeUp"
|
||||
: "doMoveWorkOrderMilestoneTypeDown"), {
|
||||
'/admin/' +
|
||||
(buttonElement.dataset.direction === 'up'
|
||||
? 'doMoveWorkOrderMilestoneTypeUp'
|
||||
: 'doMoveWorkOrderMilestoneTypeDown'), {
|
||||
workOrderMilestoneTypeId,
|
||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
||||
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes;
|
||||
|
|
@ -81,29 +81,29 @@ const moveWorkOrderMilestoneType = (clickEvent) => {
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Moving Work Order Milestone Type",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Moving Work Order Milestone Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
const renderWorkOrderMilestoneTypes = () => {
|
||||
const containerElement = document.querySelector("#container--workOrderMilestoneTypes");
|
||||
const containerElement = document.querySelector('#container--workOrderMilestoneTypes');
|
||||
if (workOrderMilestoneTypes.length === 0) {
|
||||
containerElement.innerHTML = `<tr><td colspan="2">
|
||||
<div class="message is-warning"><p class="message-body">There are no active work order milestone types.</p></div>
|
||||
</td></tr>`;
|
||||
return;
|
||||
}
|
||||
containerElement.innerHTML = "";
|
||||
containerElement.innerHTML = '';
|
||||
for (const workOrderMilestoneType of workOrderMilestoneTypes) {
|
||||
const tableRowElement = document.createElement("tr");
|
||||
const tableRowElement = document.createElement('tr');
|
||||
tableRowElement.dataset.workOrderMilestoneTypeId =
|
||||
workOrderMilestoneType.workOrderMilestoneTypeId.toString();
|
||||
tableRowElement.innerHTML =
|
||||
"<td>" +
|
||||
"<form>" +
|
||||
'<td>' +
|
||||
'<form>' +
|
||||
'<input name="workOrderMilestoneTypeId" type="hidden" value="' +
|
||||
workOrderMilestoneType.workOrderMilestoneTypeId.toString() +
|
||||
'" />' +
|
||||
|
|
@ -112,49 +112,49 @@ const renderWorkOrderMilestoneTypes = () => {
|
|||
'<input class="input" name="workOrderMilestoneType" type="text" value="' +
|
||||
cityssm.escapeHTML(workOrderMilestoneType.workOrderMilestoneType) +
|
||||
'" maxlength="100" aria-label="Work Order Milestone Type" required />' +
|
||||
"</div>" +
|
||||
'</div>' +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
"</form>" +
|
||||
"</td>" +
|
||||
'</div>' +
|
||||
'</div>') +
|
||||
'</form>' +
|
||||
'</td>' +
|
||||
'<td class="is-nowrap">' +
|
||||
'<div class="field is-grouped">' +
|
||||
'<div class="control">' +
|
||||
los.getMoveUpDownButtonFieldHTML("button--moveWorkOrderMilestoneTypeUp", "button--moveWorkOrderMilestoneTypeDown", false) +
|
||||
"</div>" +
|
||||
los.getMoveUpDownButtonFieldHTML('button--moveWorkOrderMilestoneTypeUp', 'button--moveWorkOrderMilestoneTypeDown', false) +
|
||||
'</div>' +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-danger is-light button--deleteWorkOrderMilestoneType" data-tooltip="Delete Mielstone Type" type="button" aria-label="Delete Milestone Type">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
"</button>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</td>";
|
||||
tableRowElement.querySelector("form").addEventListener("submit", updateWorkOrderMilestoneType);
|
||||
tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeUp").addEventListener("click", moveWorkOrderMilestoneType);
|
||||
tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeDown").addEventListener("click", moveWorkOrderMilestoneType);
|
||||
'</button>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</td>';
|
||||
tableRowElement.querySelector('form').addEventListener('submit', updateWorkOrderMilestoneType);
|
||||
tableRowElement.querySelector('.button--moveWorkOrderMilestoneTypeUp').addEventListener('click', moveWorkOrderMilestoneType);
|
||||
tableRowElement.querySelector('.button--moveWorkOrderMilestoneTypeDown').addEventListener('click', moveWorkOrderMilestoneType);
|
||||
tableRowElement
|
||||
.querySelector(".button--deleteWorkOrderMilestoneType")
|
||||
.addEventListener("click", deleteWorkOrderMilestoneType);
|
||||
.querySelector('.button--deleteWorkOrderMilestoneType')
|
||||
.addEventListener('click', deleteWorkOrderMilestoneType);
|
||||
containerElement.append(tableRowElement);
|
||||
}
|
||||
};
|
||||
document.querySelector("#form--addWorkOrderMilestoneType").addEventListener("submit", (submitEvent) => {
|
||||
document.querySelector('#form--addWorkOrderMilestoneType').addEventListener('submit', (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
const formElement = submitEvent.currentTarget;
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddWorkOrderMilestoneType", formElement, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doAddWorkOrderMilestoneType', formElement, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes;
|
||||
renderWorkOrderMilestoneTypes();
|
||||
formElement.reset();
|
||||
formElement.querySelector("input").focus();
|
||||
formElement.querySelector('input').focus();
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Adding Work Order Milestone Type",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Adding Work Order Milestone Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,242 +1,242 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
|
||||
import type * as globalTypes from "../../types/globalTypes";
|
||||
import type * as recordTypes from "../../types/recordTypes";
|
||||
import type * as globalTypes from '../../types/globalTypes'
|
||||
import type * as recordTypes from '../../types/recordTypes'
|
||||
|
||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||
|
||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
||||
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||
|
||||
declare const cityssm: cityssmGlobal;
|
||||
declare const bulmaJS: BulmaJS;
|
||||
declare const cityssm: cityssmGlobal
|
||||
declare const bulmaJS: BulmaJS
|
||||
|
||||
declare const los: globalTypes.LOS;
|
||||
declare const los: globalTypes.LOS
|
||||
|
||||
let workOrderMilestoneTypes: recordTypes.WorkOrderMilestoneType[] = exports.workOrderMilestoneTypes;
|
||||
delete exports.workOrderMilestoneTypes;
|
||||
let workOrderMilestoneTypes: recordTypes.WorkOrderMilestoneType[] = exports.workOrderMilestoneTypes
|
||||
delete exports.workOrderMilestoneTypes
|
||||
|
||||
const updateWorkOrderMilestoneType = (submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
submitEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/admin/doUpdateWorkOrderMilestoneType",
|
||||
submitEvent.currentTarget,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[];
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!;
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/admin/doUpdateWorkOrderMilestoneType',
|
||||
submitEvent.currentTarget,
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!
|
||||
|
||||
bulmaJS.alert({
|
||||
message: "Work Order Milestone Type Updated Successfully",
|
||||
contextualColorName: "success"
|
||||
});
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating Work Order Milestone Type",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
bulmaJS.alert({
|
||||
message: 'Work Order Milestone Type Updated Successfully',
|
||||
contextualColorName: 'success'
|
||||
})
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: 'Error Updating Work Order Milestone Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
const deleteWorkOrderMilestoneType = (clickEvent: Event) => {
|
||||
const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest("tr")!;
|
||||
const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest('tr')!
|
||||
|
||||
const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId;
|
||||
const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId
|
||||
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/admin/doDeleteWorkOrderMilestoneType",
|
||||
{
|
||||
workOrderMilestoneTypeId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[];
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!;
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/admin/doDeleteWorkOrderMilestoneType',
|
||||
{
|
||||
workOrderMilestoneTypeId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!
|
||||
|
||||
if (workOrderMilestoneTypes.length === 0) {
|
||||
renderWorkOrderMilestoneTypes();
|
||||
} else {
|
||||
tableRowElement.remove();
|
||||
}
|
||||
if (workOrderMilestoneTypes.length === 0) {
|
||||
renderWorkOrderMilestoneTypes()
|
||||
} else {
|
||||
tableRowElement.remove()
|
||||
}
|
||||
|
||||
bulmaJS.alert({
|
||||
message: "Work Order Milestone Type Deleted Successfully",
|
||||
contextualColorName: "success"
|
||||
});
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Deleting Work Order Milestone Type",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
bulmaJS.confirm({
|
||||
title: "Delete Work Order Milestone Type",
|
||||
message: `Are you sure you want to delete this work order milestone type?<br />
|
||||
Note that no work orders will be removed.`,
|
||||
messageIsHtml: true,
|
||||
contextualColorName: "warning",
|
||||
okButton: {
|
||||
text: "Yes, Delete Work Order Milestone Type",
|
||||
callbackFunction: doDelete
|
||||
bulmaJS.alert({
|
||||
message: 'Work Order Milestone Type Deleted Successfully',
|
||||
contextualColorName: 'success'
|
||||
})
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: 'Error Deleting Work Order Milestone Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
});
|
||||
};
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
bulmaJS.confirm({
|
||||
title: 'Delete Work Order Milestone Type',
|
||||
message: `Are you sure you want to delete this work order milestone type?<br />
|
||||
Note that no work orders will be removed.`,
|
||||
messageIsHtml: true,
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: 'Yes, Delete Work Order Milestone Type',
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const moveWorkOrderMilestoneType = (clickEvent: MouseEvent) => {
|
||||
const buttonElement = clickEvent.currentTarget as HTMLButtonElement;
|
||||
const buttonElement = clickEvent.currentTarget as HTMLButtonElement
|
||||
|
||||
const tableRowElement = buttonElement.closest("tr")!;
|
||||
const tableRowElement = buttonElement.closest('tr')!
|
||||
|
||||
const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId;
|
||||
const workOrderMilestoneTypeId = tableRowElement.dataset.workOrderMilestoneTypeId
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix +
|
||||
"/admin/" +
|
||||
(buttonElement.dataset.direction === "up"
|
||||
? "doMoveWorkOrderMilestoneTypeUp"
|
||||
: "doMoveWorkOrderMilestoneTypeDown"),
|
||||
{
|
||||
workOrderMilestoneTypeId,
|
||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[];
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!;
|
||||
renderWorkOrderMilestoneTypes();
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Moving Work Order Milestone Type",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix +
|
||||
'/admin/' +
|
||||
(buttonElement.dataset.direction === 'up'
|
||||
? 'doMoveWorkOrderMilestoneTypeUp'
|
||||
: 'doMoveWorkOrderMilestoneTypeDown'),
|
||||
{
|
||||
workOrderMilestoneTypeId,
|
||||
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!
|
||||
renderWorkOrderMilestoneTypes()
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: 'Error Moving Work Order Milestone Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
const renderWorkOrderMilestoneTypes = () => {
|
||||
const containerElement = document.querySelector(
|
||||
"#container--workOrderMilestoneTypes"
|
||||
) as HTMLTableSectionElement;
|
||||
const containerElement = document.querySelector(
|
||||
'#container--workOrderMilestoneTypes'
|
||||
) as HTMLTableSectionElement
|
||||
|
||||
if (workOrderMilestoneTypes.length === 0) {
|
||||
containerElement.innerHTML = `<tr><td colspan="2">
|
||||
if (workOrderMilestoneTypes.length === 0) {
|
||||
containerElement.innerHTML = `<tr><td colspan="2">
|
||||
<div class="message is-warning"><p class="message-body">There are no active work order milestone types.</p></div>
|
||||
</td></tr>`;
|
||||
</td></tr>`
|
||||
|
||||
return;
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
containerElement.innerHTML = "";
|
||||
containerElement.innerHTML = ''
|
||||
|
||||
for (const workOrderMilestoneType of workOrderMilestoneTypes) {
|
||||
const tableRowElement = document.createElement("tr");
|
||||
for (const workOrderMilestoneType of workOrderMilestoneTypes) {
|
||||
const tableRowElement = document.createElement('tr')
|
||||
|
||||
tableRowElement.dataset.workOrderMilestoneTypeId =
|
||||
workOrderMilestoneType.workOrderMilestoneTypeId.toString();
|
||||
tableRowElement.dataset.workOrderMilestoneTypeId =
|
||||
workOrderMilestoneType.workOrderMilestoneTypeId.toString()
|
||||
|
||||
tableRowElement.innerHTML =
|
||||
"<td>" +
|
||||
"<form>" +
|
||||
'<input name="workOrderMilestoneTypeId" type="hidden" value="' +
|
||||
workOrderMilestoneType.workOrderMilestoneTypeId.toString() +
|
||||
'" />' +
|
||||
('<div class="field has-addons">' +
|
||||
'<div class="control">' +
|
||||
'<input class="input" name="workOrderMilestoneType" type="text" value="' +
|
||||
cityssm.escapeHTML(workOrderMilestoneType.workOrderMilestoneType) +
|
||||
'" maxlength="100" aria-label="Work Order Milestone Type" required />' +
|
||||
"</div>" +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
"</form>" +
|
||||
"</td>" +
|
||||
'<td class="is-nowrap">' +
|
||||
'<div class="field is-grouped">' +
|
||||
'<div class="control">' +
|
||||
los.getMoveUpDownButtonFieldHTML(
|
||||
"button--moveWorkOrderMilestoneTypeUp",
|
||||
"button--moveWorkOrderMilestoneTypeDown",
|
||||
false
|
||||
) +
|
||||
"</div>" +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-danger is-light button--deleteWorkOrderMilestoneType" data-tooltip="Delete Mielstone Type" type="button" aria-label="Delete Milestone Type">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
"</button>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</td>";
|
||||
tableRowElement.innerHTML =
|
||||
'<td>' +
|
||||
'<form>' +
|
||||
'<input name="workOrderMilestoneTypeId" type="hidden" value="' +
|
||||
workOrderMilestoneType.workOrderMilestoneTypeId.toString() +
|
||||
'" />' +
|
||||
('<div class="field has-addons">' +
|
||||
'<div class="control">' +
|
||||
'<input class="input" name="workOrderMilestoneType" type="text" value="' +
|
||||
cityssm.escapeHTML(workOrderMilestoneType.workOrderMilestoneType) +
|
||||
'" maxlength="100" aria-label="Work Order Milestone Type" required />' +
|
||||
'</div>' +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||
'</div>' +
|
||||
'</div>') +
|
||||
'</form>' +
|
||||
'</td>' +
|
||||
'<td class="is-nowrap">' +
|
||||
'<div class="field is-grouped">' +
|
||||
'<div class="control">' +
|
||||
los.getMoveUpDownButtonFieldHTML(
|
||||
'button--moveWorkOrderMilestoneTypeUp',
|
||||
'button--moveWorkOrderMilestoneTypeDown',
|
||||
false
|
||||
) +
|
||||
'</div>' +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-danger is-light button--deleteWorkOrderMilestoneType" data-tooltip="Delete Mielstone Type" type="button" aria-label="Delete Milestone Type">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
'</button>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</td>'
|
||||
|
||||
tableRowElement.querySelector("form")!.addEventListener("submit", updateWorkOrderMilestoneType);
|
||||
tableRowElement.querySelector('form')!.addEventListener('submit', updateWorkOrderMilestoneType)
|
||||
|
||||
(
|
||||
tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeUp") as HTMLButtonElement
|
||||
).addEventListener("click", moveWorkOrderMilestoneType);
|
||||
;(
|
||||
tableRowElement.querySelector('.button--moveWorkOrderMilestoneTypeUp') as HTMLButtonElement
|
||||
).addEventListener('click', moveWorkOrderMilestoneType)
|
||||
|
||||
(
|
||||
tableRowElement.querySelector(".button--moveWorkOrderMilestoneTypeDown") as HTMLButtonElement
|
||||
).addEventListener("click", moveWorkOrderMilestoneType);
|
||||
;(
|
||||
tableRowElement.querySelector('.button--moveWorkOrderMilestoneTypeDown') as HTMLButtonElement
|
||||
).addEventListener('click', moveWorkOrderMilestoneType)
|
||||
|
||||
tableRowElement
|
||||
.querySelector(".button--deleteWorkOrderMilestoneType")!
|
||||
.addEventListener("click", deleteWorkOrderMilestoneType);
|
||||
tableRowElement
|
||||
.querySelector('.button--deleteWorkOrderMilestoneType')!
|
||||
.addEventListener('click', deleteWorkOrderMilestoneType)
|
||||
|
||||
containerElement.append(tableRowElement);
|
||||
}
|
||||
};
|
||||
containerElement.append(tableRowElement)
|
||||
}
|
||||
}
|
||||
|
||||
(document.querySelector("#form--addWorkOrderMilestoneType") as HTMLFormElement).addEventListener(
|
||||
"submit",
|
||||
(submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
;(document.querySelector('#form--addWorkOrderMilestoneType') as HTMLFormElement).addEventListener(
|
||||
'submit',
|
||||
(submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault()
|
||||
|
||||
const formElement = submitEvent.currentTarget as HTMLFormElement;
|
||||
const formElement = submitEvent.currentTarget as HTMLFormElement
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/admin/doAddWorkOrderMilestoneType",
|
||||
formElement,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[];
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!;
|
||||
renderWorkOrderMilestoneTypes();
|
||||
formElement.reset();
|
||||
formElement.querySelector("input")!.focus();
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Adding Work Order Milestone Type",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/admin/doAddWorkOrderMilestoneType',
|
||||
formElement,
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
workOrderMilestoneTypes?: recordTypes.WorkOrderMilestoneType[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderMilestoneTypes = responseJSON.workOrderMilestoneTypes!
|
||||
renderWorkOrderMilestoneTypes()
|
||||
formElement.reset()
|
||||
formElement.querySelector('input')!.focus()
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: 'Error Adding Work Order Milestone Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
renderWorkOrderMilestoneTypes();
|
||||
renderWorkOrderMilestoneTypes()
|
||||
|
|
|
|||
|
|
@ -5,28 +5,28 @@ let workOrderTypes = exports.workOrderTypes;
|
|||
delete exports.workOrderTypes;
|
||||
const updateWorkOrderType = (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doUpdateWorkOrderType", submitEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doUpdateWorkOrderType', submitEvent.currentTarget, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderTypes = responseJSON.workOrderTypes;
|
||||
bulmaJS.alert({
|
||||
message: "Work Order Type Updated Successfully",
|
||||
contextualColorName: "success"
|
||||
message: 'Work Order Type Updated Successfully',
|
||||
contextualColorName: 'success'
|
||||
});
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating Work Order Type",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Updating Work Order Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
const deleteWorkOrderType = (clickEvent) => {
|
||||
const tableRowElement = clickEvent.currentTarget.closest("tr");
|
||||
const tableRowElement = clickEvent.currentTarget.closest('tr');
|
||||
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doDeleteWorkOrderType", {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doDeleteWorkOrderType', {
|
||||
workOrderTypeId
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
|
|
@ -38,40 +38,40 @@ const deleteWorkOrderType = (clickEvent) => {
|
|||
tableRowElement.remove();
|
||||
}
|
||||
bulmaJS.alert({
|
||||
message: "Work Order Type Deleted Successfully",
|
||||
contextualColorName: "success"
|
||||
message: 'Work Order Type Deleted Successfully',
|
||||
contextualColorName: 'success'
|
||||
});
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Deleting Work Order Type",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Deleting Work Order Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
bulmaJS.confirm({
|
||||
title: "Delete Work Order Type",
|
||||
title: 'Delete Work Order Type',
|
||||
message: `Are you sure you want to delete this work order type?<br />
|
||||
Note that no work orders will be removed.`,
|
||||
messageIsHtml: true,
|
||||
contextualColorName: "warning",
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: "Yes, Delete Work Order Type",
|
||||
text: 'Yes, Delete Work Order Type',
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
});
|
||||
};
|
||||
const moveWorkOrderType = (clickEvent) => {
|
||||
const buttonElement = clickEvent.currentTarget;
|
||||
const tableRowElement = buttonElement.closest("tr");
|
||||
const tableRowElement = buttonElement.closest('tr');
|
||||
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
|
||||
cityssm.postJSON(los.urlPrefix +
|
||||
"/admin/" +
|
||||
(buttonElement.dataset.direction === "up" ? "doMoveWorkOrderTypeUp" : "doMoveWorkOrderTypeDown"), {
|
||||
'/admin/' +
|
||||
(buttonElement.dataset.direction === 'up' ? 'doMoveWorkOrderTypeUp' : 'doMoveWorkOrderTypeDown'), {
|
||||
workOrderTypeId,
|
||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
||||
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderTypes = responseJSON.workOrderTypes;
|
||||
|
|
@ -79,79 +79,79 @@ const moveWorkOrderType = (clickEvent) => {
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Moving Work Order Type",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Moving Work Order Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
const renderWorkOrderTypes = () => {
|
||||
const containerElement = document.querySelector("#container--workOrderTypes");
|
||||
const containerElement = document.querySelector('#container--workOrderTypes');
|
||||
if (workOrderTypes.length === 0) {
|
||||
containerElement.innerHTML = `<tr><td colspan="2">
|
||||
<div class="message is-warning"><p class="message-body">There are no active work order types.</p></div>
|
||||
</td></tr>`;
|
||||
return;
|
||||
}
|
||||
containerElement.innerHTML = "";
|
||||
containerElement.innerHTML = '';
|
||||
for (const workOrderType of workOrderTypes) {
|
||||
const tableRowElement = document.createElement("tr");
|
||||
const tableRowElement = document.createElement('tr');
|
||||
tableRowElement.dataset.workOrderTypeId = workOrderType.workOrderTypeId.toString();
|
||||
tableRowElement.innerHTML =
|
||||
"<td>" +
|
||||
"<form>" +
|
||||
'<td>' +
|
||||
'<form>' +
|
||||
'<input name="workOrderTypeId" type="hidden" value="' +
|
||||
workOrderType.workOrderTypeId.toString() +
|
||||
'" />' +
|
||||
('<div class="field has-addons">' +
|
||||
'<div class="control">' +
|
||||
'<input class="input" name="workOrderType" type="text" value="' +
|
||||
cityssm.escapeHTML(workOrderType.workOrderType || "") +
|
||||
cityssm.escapeHTML(workOrderType.workOrderType || '') +
|
||||
'" maxlength="100" aria-label="Work Order Type" required />' +
|
||||
"</div>" +
|
||||
'</div>' +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
"</form>" +
|
||||
"</td>" +
|
||||
'</div>' +
|
||||
'</div>') +
|
||||
'</form>' +
|
||||
'</td>' +
|
||||
'<td class="is-nowrap">' +
|
||||
'<div class="field is-grouped">' +
|
||||
'<div class="control">' +
|
||||
los.getMoveUpDownButtonFieldHTML("button--moveWorkOrderTypeUp", "button--moveWorkOrderTypeDown", false) +
|
||||
"</div>" +
|
||||
los.getMoveUpDownButtonFieldHTML('button--moveWorkOrderTypeUp', 'button--moveWorkOrderTypeDown', false) +
|
||||
'</div>' +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-danger is-light button--deleteWorkOrderType" data-tooltip="Delete Work Order Type" type="button" aria-label="Delete Work Order Type">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
"</button>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</td>";
|
||||
tableRowElement.querySelector("form").addEventListener("submit", updateWorkOrderType);
|
||||
tableRowElement.querySelector(".button--moveWorkOrderTypeUp").addEventListener("click", moveWorkOrderType);
|
||||
tableRowElement.querySelector(".button--moveWorkOrderTypeDown").addEventListener("click", moveWorkOrderType);
|
||||
'</button>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</td>';
|
||||
tableRowElement.querySelector('form').addEventListener('submit', updateWorkOrderType);
|
||||
tableRowElement.querySelector('.button--moveWorkOrderTypeUp').addEventListener('click', moveWorkOrderType);
|
||||
tableRowElement.querySelector('.button--moveWorkOrderTypeDown').addEventListener('click', moveWorkOrderType);
|
||||
tableRowElement
|
||||
.querySelector(".button--deleteWorkOrderType")
|
||||
.addEventListener("click", deleteWorkOrderType);
|
||||
.querySelector('.button--deleteWorkOrderType')
|
||||
.addEventListener('click', deleteWorkOrderType);
|
||||
containerElement.append(tableRowElement);
|
||||
}
|
||||
};
|
||||
document.querySelector("#form--addWorkOrderType").addEventListener("submit", (submitEvent) => {
|
||||
document.querySelector('#form--addWorkOrderType').addEventListener('submit', (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
const formElement = submitEvent.currentTarget;
|
||||
cityssm.postJSON(los.urlPrefix + "/admin/doAddWorkOrderType", formElement, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/admin/doAddWorkOrderType', formElement, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderTypes = responseJSON.workOrderTypes;
|
||||
renderWorkOrderTypes();
|
||||
formElement.reset();
|
||||
formElement.querySelector("input").focus();
|
||||
formElement.querySelector('input').focus();
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Adding Work Order Type",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Adding Work Order Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,238 +1,239 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
|
||||
import type * as globalTypes from "../../types/globalTypes";
|
||||
import type * as recordTypes from "../../types/recordTypes";
|
||||
import type * as globalTypes from '../../types/globalTypes'
|
||||
import type * as recordTypes from '../../types/recordTypes'
|
||||
|
||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||
|
||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
||||
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||
|
||||
declare const cityssm: cityssmGlobal;
|
||||
declare const bulmaJS: BulmaJS;
|
||||
declare const cityssm: cityssmGlobal
|
||||
declare const bulmaJS: BulmaJS
|
||||
|
||||
declare const los: globalTypes.LOS;
|
||||
declare const los: globalTypes.LOS
|
||||
|
||||
let workOrderTypes: recordTypes.WorkOrderType[] = exports.workOrderTypes;
|
||||
delete exports.workOrderTypes;
|
||||
let workOrderTypes: recordTypes.WorkOrderType[] = exports.workOrderTypes
|
||||
delete exports.workOrderTypes
|
||||
|
||||
const updateWorkOrderType = (submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
submitEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/admin/doUpdateWorkOrderType",
|
||||
submitEvent.currentTarget,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
workOrderTypes?: recordTypes.WorkOrderType[];
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderTypes = responseJSON.workOrderTypes!;
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/admin/doUpdateWorkOrderType',
|
||||
submitEvent.currentTarget,
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
workOrderTypes?: recordTypes.WorkOrderType[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderTypes = responseJSON.workOrderTypes!
|
||||
|
||||
bulmaJS.alert({
|
||||
message: "Work Order Type Updated Successfully",
|
||||
contextualColorName: "success"
|
||||
});
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating Work Order Type",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
bulmaJS.alert({
|
||||
message: 'Work Order Type Updated Successfully',
|
||||
contextualColorName: 'success'
|
||||
})
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: 'Error Updating Work Order Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
const deleteWorkOrderType = (clickEvent: Event) => {
|
||||
const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest("tr")!;
|
||||
const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest('tr')!
|
||||
|
||||
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
|
||||
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId
|
||||
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/admin/doDeleteWorkOrderType",
|
||||
{
|
||||
workOrderTypeId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
workOrderTypes?: recordTypes.WorkOrderType[];
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderTypes = responseJSON.workOrderTypes!;
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/admin/doDeleteWorkOrderType',
|
||||
{
|
||||
workOrderTypeId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
workOrderTypes?: recordTypes.WorkOrderType[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderTypes = responseJSON.workOrderTypes!
|
||||
|
||||
if (workOrderTypes.length === 0) {
|
||||
renderWorkOrderTypes();
|
||||
} else {
|
||||
tableRowElement.remove();
|
||||
}
|
||||
if (workOrderTypes.length === 0) {
|
||||
renderWorkOrderTypes()
|
||||
} else {
|
||||
tableRowElement.remove()
|
||||
}
|
||||
|
||||
bulmaJS.alert({
|
||||
message: "Work Order Type Deleted Successfully",
|
||||
contextualColorName: "success"
|
||||
});
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Deleting Work Order Type",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
bulmaJS.confirm({
|
||||
title: "Delete Work Order Type",
|
||||
message: `Are you sure you want to delete this work order type?<br />
|
||||
Note that no work orders will be removed.`,
|
||||
messageIsHtml: true,
|
||||
contextualColorName: "warning",
|
||||
okButton: {
|
||||
text: "Yes, Delete Work Order Type",
|
||||
callbackFunction: doDelete
|
||||
bulmaJS.alert({
|
||||
message: 'Work Order Type Deleted Successfully',
|
||||
contextualColorName: 'success'
|
||||
})
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: 'Error Deleting Work Order Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
});
|
||||
};
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
bulmaJS.confirm({
|
||||
title: 'Delete Work Order Type',
|
||||
message: `Are you sure you want to delete this work order type?<br />
|
||||
Note that no work orders will be removed.`,
|
||||
messageIsHtml: true,
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: 'Yes, Delete Work Order Type',
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const moveWorkOrderType = (clickEvent: MouseEvent) => {
|
||||
const buttonElement = clickEvent.currentTarget as HTMLButtonElement;
|
||||
const buttonElement = clickEvent.currentTarget as HTMLButtonElement
|
||||
|
||||
const tableRowElement = buttonElement.closest("tr")!;
|
||||
const tableRowElement = buttonElement.closest('tr')!
|
||||
|
||||
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
|
||||
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix +
|
||||
"/admin/" +
|
||||
(buttonElement.dataset.direction === "up" ? "doMoveWorkOrderTypeUp" : "doMoveWorkOrderTypeDown"),
|
||||
{
|
||||
workOrderTypeId,
|
||||
moveToEnd: clickEvent.shiftKey ? "1" : "0"
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
workOrderTypes?: recordTypes.WorkOrderType[];
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderTypes = responseJSON.workOrderTypes!;
|
||||
renderWorkOrderTypes();
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Moving Work Order Type",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix +
|
||||
'/admin/' +
|
||||
(buttonElement.dataset.direction === 'up' ? 'doMoveWorkOrderTypeUp' : 'doMoveWorkOrderTypeDown'),
|
||||
{
|
||||
workOrderTypeId,
|
||||
moveToEnd: clickEvent.shiftKey ? '1' : '0'
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
workOrderTypes?: recordTypes.WorkOrderType[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderTypes = responseJSON.workOrderTypes!
|
||||
renderWorkOrderTypes()
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: 'Error Moving Work Order Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
const renderWorkOrderTypes = () => {
|
||||
const containerElement = document.querySelector("#container--workOrderTypes") as HTMLTableSectionElement;
|
||||
const containerElement = document.querySelector('#container--workOrderTypes') as HTMLTableSectionElement
|
||||
|
||||
if (workOrderTypes.length === 0) {
|
||||
containerElement.innerHTML = `<tr><td colspan="2">
|
||||
if (workOrderTypes.length === 0) {
|
||||
containerElement.innerHTML = `<tr><td colspan="2">
|
||||
<div class="message is-warning"><p class="message-body">There are no active work order types.</p></div>
|
||||
</td></tr>`;
|
||||
</td></tr>`
|
||||
|
||||
return;
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
containerElement.innerHTML = "";
|
||||
containerElement.innerHTML = ''
|
||||
|
||||
for (const workOrderType of workOrderTypes) {
|
||||
const tableRowElement = document.createElement("tr");
|
||||
for (const workOrderType of workOrderTypes) {
|
||||
const tableRowElement = document.createElement('tr')
|
||||
|
||||
tableRowElement.dataset.workOrderTypeId = workOrderType.workOrderTypeId!.toString();
|
||||
tableRowElement.dataset.workOrderTypeId = workOrderType.workOrderTypeId!.toString()
|
||||
|
||||
tableRowElement.innerHTML =
|
||||
"<td>" +
|
||||
"<form>" +
|
||||
'<input name="workOrderTypeId" type="hidden" value="' +
|
||||
workOrderType.workOrderTypeId!.toString() +
|
||||
'" />' +
|
||||
('<div class="field has-addons">' +
|
||||
'<div class="control">' +
|
||||
'<input class="input" name="workOrderType" type="text" value="' +
|
||||
cityssm.escapeHTML(workOrderType.workOrderType || "") +
|
||||
'" maxlength="100" aria-label="Work Order Type" required />' +
|
||||
"</div>" +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
"</form>" +
|
||||
"</td>" +
|
||||
'<td class="is-nowrap">' +
|
||||
'<div class="field is-grouped">' +
|
||||
'<div class="control">' +
|
||||
los.getMoveUpDownButtonFieldHTML(
|
||||
"button--moveWorkOrderTypeUp",
|
||||
"button--moveWorkOrderTypeDown",
|
||||
false
|
||||
) +
|
||||
"</div>" +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-danger is-light button--deleteWorkOrderType" data-tooltip="Delete Work Order Type" type="button" aria-label="Delete Work Order Type">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
"</button>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</td>";
|
||||
tableRowElement.innerHTML =
|
||||
'<td>' +
|
||||
'<form>' +
|
||||
'<input name="workOrderTypeId" type="hidden" value="' +
|
||||
workOrderType.workOrderTypeId!.toString() +
|
||||
'" />' +
|
||||
('<div class="field has-addons">' +
|
||||
'<div class="control">' +
|
||||
'<input class="input" name="workOrderType" type="text" value="' +
|
||||
cityssm.escapeHTML(workOrderType.workOrderType || '') +
|
||||
'" maxlength="100" aria-label="Work Order Type" required />' +
|
||||
'</div>' +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-success" type="submit" aria-label="Save"><i class="fas fa-save" aria-hidden="true"></i></button>' +
|
||||
'</div>' +
|
||||
'</div>') +
|
||||
'</form>' +
|
||||
'</td>' +
|
||||
'<td class="is-nowrap">' +
|
||||
'<div class="field is-grouped">' +
|
||||
'<div class="control">' +
|
||||
los.getMoveUpDownButtonFieldHTML(
|
||||
'button--moveWorkOrderTypeUp',
|
||||
'button--moveWorkOrderTypeDown',
|
||||
false
|
||||
) +
|
||||
'</div>' +
|
||||
'<div class="control">' +
|
||||
'<button class="button is-danger is-light button--deleteWorkOrderType" data-tooltip="Delete Work Order Type" type="button" aria-label="Delete Work Order Type">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
'</button>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</td>'
|
||||
|
||||
tableRowElement.querySelector("form")!.addEventListener("submit", updateWorkOrderType);
|
||||
tableRowElement.querySelector('form')!.addEventListener('submit', updateWorkOrderType)
|
||||
|
||||
(tableRowElement.querySelector(".button--moveWorkOrderTypeUp") as HTMLButtonElement).addEventListener(
|
||||
"click",
|
||||
moveWorkOrderType
|
||||
);
|
||||
;(tableRowElement.querySelector('.button--moveWorkOrderTypeUp') as HTMLButtonElement).addEventListener(
|
||||
'click',
|
||||
moveWorkOrderType
|
||||
)
|
||||
|
||||
(
|
||||
tableRowElement.querySelector(".button--moveWorkOrderTypeDown") as HTMLButtonElement
|
||||
).addEventListener("click", moveWorkOrderType);
|
||||
;(tableRowElement.querySelector('.button--moveWorkOrderTypeDown') as HTMLButtonElement).addEventListener(
|
||||
'click',
|
||||
moveWorkOrderType
|
||||
)
|
||||
|
||||
tableRowElement
|
||||
.querySelector(".button--deleteWorkOrderType")!
|
||||
.addEventListener("click", deleteWorkOrderType);
|
||||
tableRowElement
|
||||
.querySelector('.button--deleteWorkOrderType')!
|
||||
.addEventListener('click', deleteWorkOrderType)
|
||||
|
||||
containerElement.append(tableRowElement);
|
||||
}
|
||||
};
|
||||
containerElement.append(tableRowElement)
|
||||
}
|
||||
}
|
||||
|
||||
(document.querySelector("#form--addWorkOrderType") as HTMLFormElement).addEventListener(
|
||||
"submit",
|
||||
(submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
;(document.querySelector('#form--addWorkOrderType') as HTMLFormElement).addEventListener(
|
||||
'submit',
|
||||
(submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault()
|
||||
|
||||
const formElement = submitEvent.currentTarget as HTMLFormElement;
|
||||
const formElement = submitEvent.currentTarget as HTMLFormElement
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/admin/doAddWorkOrderType",
|
||||
formElement,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
workOrderTypes?: recordTypes.WorkOrderType[];
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderTypes = responseJSON.workOrderTypes!;
|
||||
renderWorkOrderTypes();
|
||||
formElement.reset();
|
||||
formElement.querySelector("input")!.focus();
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Adding Work Order Type",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/admin/doAddWorkOrderType',
|
||||
formElement,
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
workOrderTypes?: recordTypes.WorkOrderType[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderTypes = responseJSON.workOrderTypes!
|
||||
renderWorkOrderTypes()
|
||||
formElement.reset()
|
||||
formElement.querySelector('input')!.focus()
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: 'Error Adding Work Order Type',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
renderWorkOrderTypes();
|
||||
renderWorkOrderTypes()
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@
|
|||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
(() => {
|
||||
const los = exports.los;
|
||||
const workOrderNumberCircleElements = document.querySelectorAll(".fa-circle[data-work-order-number");
|
||||
const workOrderNumberCircleElements = document.querySelectorAll('.fa-circle[data-work-order-number');
|
||||
for (const workOrderNumberCircleElement of workOrderNumberCircleElements) {
|
||||
workOrderNumberCircleElement.style.color = los.getRandomColor(workOrderNumberCircleElement.dataset.workOrderNumber || "");
|
||||
workOrderNumberCircleElement.style.color = los.getRandomColor(workOrderNumberCircleElement.dataset.workOrderNumber || '');
|
||||
}
|
||||
})();
|
||||
|
|
|
|||
|
|
@ -1,17 +1,17 @@
|
|||
/* eslint-disable unicorn/prefer-module */
|
||||
|
||||
import type * as globalTypes from "../types/globalTypes";
|
||||
import type * as globalTypes from '../types/globalTypes'
|
||||
|
||||
(() => {
|
||||
const los = exports.los as globalTypes.LOS;
|
||||
;(() => {
|
||||
const los = exports.los as globalTypes.LOS
|
||||
|
||||
const workOrderNumberCircleElements = document.querySelectorAll(
|
||||
".fa-circle[data-work-order-number"
|
||||
) as NodeListOf<HTMLElement>;
|
||||
const workOrderNumberCircleElements = document.querySelectorAll(
|
||||
'.fa-circle[data-work-order-number'
|
||||
) as NodeListOf<HTMLElement>
|
||||
|
||||
for (const workOrderNumberCircleElement of workOrderNumberCircleElements) {
|
||||
workOrderNumberCircleElement.style.color = los.getRandomColor(
|
||||
workOrderNumberCircleElement.dataset.workOrderNumber || ""
|
||||
);
|
||||
}
|
||||
})();
|
||||
for (const workOrderNumberCircleElement of workOrderNumberCircleElements) {
|
||||
workOrderNumberCircleElement.style.color = los.getRandomColor(
|
||||
workOrderNumberCircleElement.dataset.workOrderNumber || ''
|
||||
)
|
||||
}
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -4,14 +4,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
(() => {
|
||||
var _a;
|
||||
const los = exports.los;
|
||||
const lotId = document.querySelector("#lot--lotId").value;
|
||||
const isCreate = lotId === "";
|
||||
const lotId = document.querySelector('#lot--lotId')
|
||||
.value;
|
||||
const isCreate = lotId === '';
|
||||
// Main form
|
||||
let refreshAfterSave = isCreate;
|
||||
const formElement = document.querySelector("#form--lot");
|
||||
const formElement = document.querySelector('#form--lot');
|
||||
function updateLot(formEvent) {
|
||||
formEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/lots/" + (isCreate ? "doCreateLot" : "doUpdateLot"), formElement, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/lots/' + (isCreate ? 'doCreateLot' : 'doUpdateLot'), formElement, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
los.clearUnsavedChanges();
|
||||
if (isCreate || refreshAfterSave) {
|
||||
|
|
@ -19,30 +20,31 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
message: exports.aliases.lot + " Updated Successfully",
|
||||
contextualColorName: "success"
|
||||
message: exports.aliases.lot + ' Updated Successfully',
|
||||
contextualColorName: 'success'
|
||||
});
|
||||
}
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating " + exports.aliases.lot,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Updating ' + exports.aliases.lot,
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
formElement.addEventListener("submit", updateLot);
|
||||
const formInputElements = formElement.querySelectorAll("input, select");
|
||||
formElement.addEventListener('submit', updateLot);
|
||||
const formInputElements = formElement.querySelectorAll('input, select');
|
||||
for (const formInputElement of formInputElements) {
|
||||
formInputElement.addEventListener("change", los.setUnsavedChanges);
|
||||
formInputElement.addEventListener('change', los.setUnsavedChanges);
|
||||
}
|
||||
los.initializeUnlockFieldButtons(formElement);
|
||||
(_a = document.querySelector("#button--deleteLot")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", (clickEvent) => {
|
||||
(_a = document
|
||||
.querySelector('#button--deleteLot')) === null || _a === void 0 ? void 0 : _a.addEventListener('click', (clickEvent) => {
|
||||
clickEvent.preventDefault();
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(los.urlPrefix + "/lots/doDeleteLot", {
|
||||
cityssm.postJSON(los.urlPrefix + '/lots/doDeleteLot', {
|
||||
lotId
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
|
|
@ -52,16 +54,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Deleting ${los.escapedAliases.Lot}`,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
bulmaJS.confirm({
|
||||
title: "Delete " + exports.aliases.lot,
|
||||
title: 'Delete ' + exports.aliases.lot,
|
||||
message: `Are you sure you want to delete this ${los.escapedAliases.lot}?`,
|
||||
contextualColorName: "warning",
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: `Yes, Delete ${los.escapedAliases.Lot}`,
|
||||
callbackFunction: doDelete
|
||||
|
|
@ -69,17 +71,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
});
|
||||
});
|
||||
// Lot Type
|
||||
const lotTypeIdElement = document.querySelector("#lot--lotTypeId");
|
||||
const lotTypeIdElement = document.querySelector('#lot--lotTypeId');
|
||||
if (isCreate) {
|
||||
const lotFieldsContainerElement = document.querySelector("#container--lotFields");
|
||||
lotTypeIdElement.addEventListener("change", () => {
|
||||
if (lotTypeIdElement.value === "") {
|
||||
const lotFieldsContainerElement = document.querySelector('#container--lotFields');
|
||||
lotTypeIdElement.addEventListener('change', () => {
|
||||
if (lotTypeIdElement.value === '') {
|
||||
lotFieldsContainerElement.innerHTML = `<div class="message is-info">
|
||||
<p class="message-body">Select the ${los.escapedAliases.lot} type to load the available fields.</p>
|
||||
</div>`;
|
||||
return;
|
||||
}
|
||||
cityssm.postJSON(los.urlPrefix + "/lots/doGetLotTypeFields", {
|
||||
cityssm.postJSON(los.urlPrefix + '/lots/doGetLotTypeFields', {
|
||||
lotTypeId: lotTypeIdElement.value
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.lotTypeFields.length === 0) {
|
||||
|
|
@ -88,41 +90,40 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
</div>`;
|
||||
return;
|
||||
}
|
||||
lotFieldsContainerElement.innerHTML = "";
|
||||
let lotTypeFieldIds = "";
|
||||
lotFieldsContainerElement.innerHTML = '';
|
||||
let lotTypeFieldIds = '';
|
||||
for (const lotTypeField of responseJSON.lotTypeFields) {
|
||||
lotTypeFieldIds += "," + lotTypeField.lotTypeFieldId;
|
||||
const fieldName = "lotFieldValue_" + lotTypeField.lotTypeFieldId;
|
||||
const fieldId = "lot--" + fieldName;
|
||||
const fieldElement = document.createElement("div");
|
||||
fieldElement.className = "field";
|
||||
lotTypeFieldIds += ',' + lotTypeField.lotTypeFieldId;
|
||||
const fieldName = 'lotFieldValue_' + lotTypeField.lotTypeFieldId;
|
||||
const fieldId = 'lot--' + fieldName;
|
||||
const fieldElement = document.createElement('div');
|
||||
fieldElement.className = 'field';
|
||||
fieldElement.innerHTML = `<label class="label" for="${fieldId}"></label>
|
||||
<div class="control"></div>`;
|
||||
fieldElement.querySelector("label").textContent =
|
||||
lotTypeField.lotTypeField;
|
||||
if (lotTypeField.lotTypeFieldValues === "") {
|
||||
const inputElement = document.createElement("input");
|
||||
inputElement.className = "input";
|
||||
fieldElement.querySelector('label').textContent = lotTypeField.lotTypeField;
|
||||
if (lotTypeField.lotTypeFieldValues === '') {
|
||||
const inputElement = document.createElement('input');
|
||||
inputElement.className = 'input';
|
||||
inputElement.id = fieldId;
|
||||
inputElement.name = fieldName;
|
||||
inputElement.type = "text";
|
||||
inputElement.type = 'text';
|
||||
inputElement.required = lotTypeField.isRequired;
|
||||
inputElement.minLength = lotTypeField.minimumLength;
|
||||
inputElement.maxLength = lotTypeField.maximumLength;
|
||||
if (lotTypeField.pattern && lotTypeField.pattern !== "") {
|
||||
if (lotTypeField.pattern && lotTypeField.pattern !== '') {
|
||||
inputElement.pattern = lotTypeField.pattern;
|
||||
}
|
||||
fieldElement.querySelector(".control").append(inputElement);
|
||||
fieldElement.querySelector('.control').append(inputElement);
|
||||
}
|
||||
else {
|
||||
fieldElement.querySelector(".control").innerHTML = `<div class="select is-fullwidth">
|
||||
fieldElement.querySelector('.control').innerHTML = `<div class="select is-fullwidth">
|
||||
<select id="${fieldId}" name="${fieldName}"><option value="">(Not Set)</option></select>
|
||||
</div>`;
|
||||
const selectElement = fieldElement.querySelector("select");
|
||||
const selectElement = fieldElement.querySelector('select');
|
||||
selectElement.required = lotTypeField.isRequired;
|
||||
const optionValues = lotTypeField.lotTypeFieldValues.split("\n");
|
||||
const optionValues = lotTypeField.lotTypeFieldValues.split('\n');
|
||||
for (const optionValue of optionValues) {
|
||||
const optionElement = document.createElement("option");
|
||||
const optionElement = document.createElement('option');
|
||||
optionElement.value = optionValue;
|
||||
optionElement.textContent = optionValue;
|
||||
selectElement.append(optionElement);
|
||||
|
|
@ -130,28 +131,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
lotFieldsContainerElement.append(fieldElement);
|
||||
}
|
||||
lotFieldsContainerElement.insertAdjacentHTML("beforeend", `<input name="lotTypeFieldIds" type="hidden"
|
||||
lotFieldsContainerElement.insertAdjacentHTML('beforeend', `<input name="lotTypeFieldIds" type="hidden"
|
||||
value="${lotTypeFieldIds.slice(1)}" />`);
|
||||
});
|
||||
});
|
||||
}
|
||||
else {
|
||||
const originalLotTypeId = lotTypeIdElement.value;
|
||||
lotTypeIdElement.addEventListener("change", () => {
|
||||
lotTypeIdElement.addEventListener('change', () => {
|
||||
if (lotTypeIdElement.value !== originalLotTypeId) {
|
||||
bulmaJS.confirm({
|
||||
title: "Confirm Change",
|
||||
title: 'Confirm Change',
|
||||
message: `Are you sure you want to change the ${los.escapedAliases.lot} type?\n
|
||||
This change affects the additional fields associated with this record.`,
|
||||
contextualColorName: "warning",
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: "Yes, Keep the Change",
|
||||
text: 'Yes, Keep the Change',
|
||||
callbackFunction: () => {
|
||||
refreshAfterSave = true;
|
||||
}
|
||||
},
|
||||
cancelButton: {
|
||||
text: "Revert the Change",
|
||||
text: 'Revert the Change',
|
||||
callbackFunction: () => {
|
||||
lotTypeIdElement.value = originalLotTypeId;
|
||||
}
|
||||
|
|
@ -164,7 +165,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
let lotComments = exports.lotComments;
|
||||
delete exports.lotComments;
|
||||
function openEditLotComment(clickEvent) {
|
||||
const lotCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.lotCommentId, 10);
|
||||
const lotCommentId = Number.parseInt(clickEvent.currentTarget.closest('tr').dataset
|
||||
.lotCommentId, 10);
|
||||
const lotComment = lotComments.find((currentLotComment) => {
|
||||
return currentLotComment.lotCommentId === lotCommentId;
|
||||
});
|
||||
|
|
@ -172,7 +174,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
let editCloseModalFunction;
|
||||
const editComment = (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/lots/doUpdateLotComment", editFormElement, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/lots/doUpdateLotComment', editFormElement, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
lotComments = responseJSON.lotComments;
|
||||
editCloseModalFunction();
|
||||
|
|
@ -180,37 +182,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating Comment",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Updating Comment',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
cityssm.openHtmlModal("lot-editComment", {
|
||||
cityssm.openHtmlModal('lot-editComment', {
|
||||
onshow: (modalElement) => {
|
||||
los.populateAliases(modalElement);
|
||||
modalElement.querySelector("#lotCommentEdit--lotId").value = lotId;
|
||||
modalElement.querySelector("#lotCommentEdit--lotCommentId").value =
|
||||
lotCommentId.toString();
|
||||
modalElement.querySelector("#lotCommentEdit--lotComment").value =
|
||||
lotComment.lotComment;
|
||||
const lotCommentDateStringElement = modalElement.querySelector("#lotCommentEdit--lotCommentDateString");
|
||||
modalElement.querySelector('#lotCommentEdit--lotId').value = lotId;
|
||||
modalElement.querySelector('#lotCommentEdit--lotCommentId').value = lotCommentId.toString();
|
||||
modalElement.querySelector('#lotCommentEdit--lotComment').value = lotComment.lotComment;
|
||||
const lotCommentDateStringElement = modalElement.querySelector('#lotCommentEdit--lotCommentDateString');
|
||||
lotCommentDateStringElement.value = lotComment.lotCommentDateString;
|
||||
const currentDateString = cityssm.dateToString(new Date());
|
||||
lotCommentDateStringElement.max =
|
||||
lotComment.lotCommentDateString <= currentDateString
|
||||
? currentDateString
|
||||
: lotComment.lotCommentDateString;
|
||||
modalElement.querySelector("#lotCommentEdit--lotCommentTimeString").value = lotComment.lotCommentTimeString;
|
||||
modalElement.querySelector('#lotCommentEdit--lotCommentTimeString').value = lotComment.lotCommentTimeString;
|
||||
},
|
||||
onshown: (modalElement, closeModalFunction) => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
los.initializeDatePickers(modalElement);
|
||||
// los.initializeTimePickers(modalElement);
|
||||
modalElement.querySelector("#lotCommentEdit--lotComment").focus();
|
||||
editFormElement = modalElement.querySelector("form");
|
||||
editFormElement.addEventListener("submit", editComment);
|
||||
modalElement.querySelector('#lotCommentEdit--lotComment').focus();
|
||||
editFormElement = modalElement.querySelector('form');
|
||||
editFormElement.addEventListener('submit', editComment);
|
||||
editCloseModalFunction = closeModalFunction;
|
||||
},
|
||||
onremoved: () => {
|
||||
|
|
@ -219,9 +218,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
});
|
||||
}
|
||||
function deleteLotComment(clickEvent) {
|
||||
const lotCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.lotCommentId, 10);
|
||||
const lotCommentId = Number.parseInt(clickEvent.currentTarget.closest('tr').dataset
|
||||
.lotCommentId, 10);
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(los.urlPrefix + "/lots/doDeleteLotComment", {
|
||||
cityssm.postJSON(los.urlPrefix + '/lots/doDeleteLotComment', {
|
||||
lotId,
|
||||
lotCommentId
|
||||
}, (responseJSON) => {
|
||||
|
|
@ -231,33 +231,33 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Removing Comment",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Removing Comment',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
bulmaJS.confirm({
|
||||
title: "Remove Comment?",
|
||||
message: "Are you sure you want to remove this comment?",
|
||||
title: 'Remove Comment?',
|
||||
message: 'Are you sure you want to remove this comment?',
|
||||
okButton: {
|
||||
text: "Yes, Remove Comment",
|
||||
text: 'Yes, Remove Comment',
|
||||
callbackFunction: doDelete
|
||||
},
|
||||
contextualColorName: "warning"
|
||||
contextualColorName: 'warning'
|
||||
});
|
||||
}
|
||||
function renderLotComments() {
|
||||
const containerElement = document.querySelector("#container--lotComments");
|
||||
const containerElement = document.querySelector('#container--lotComments');
|
||||
if (lotComments.length === 0) {
|
||||
containerElement.innerHTML = `<div class="message is-info">
|
||||
<p class="message-body">There are no comments to display.</p>
|
||||
</div>`;
|
||||
return;
|
||||
}
|
||||
const tableElement = document.createElement("table");
|
||||
tableElement.className = "table is-fullwidth is-striped is-hoverable";
|
||||
const tableElement = document.createElement('table');
|
||||
tableElement.className = 'table is-fullwidth is-striped is-hoverable';
|
||||
tableElement.innerHTML = `<thead><tr>
|
||||
<th>Commentor</th>
|
||||
<th>Comment Date</th>
|
||||
|
|
@ -266,42 +266,48 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
</tr></thead>
|
||||
<tbody></tbody>`;
|
||||
for (const lotComment of lotComments) {
|
||||
const tableRowElement = document.createElement("tr");
|
||||
const tableRowElement = document.createElement('tr');
|
||||
tableRowElement.dataset.lotCommentId = lotComment.lotCommentId.toString();
|
||||
tableRowElement.innerHTML =
|
||||
"<td>" +
|
||||
cityssm.escapeHTML(lotComment.recordCreate_userName || "") +
|
||||
"</td>" +
|
||||
"<td>" +
|
||||
'<td>' +
|
||||
cityssm.escapeHTML(lotComment.recordCreate_userName || '') +
|
||||
'</td>' +
|
||||
'<td>' +
|
||||
lotComment.lotCommentDateString +
|
||||
(lotComment.lotCommentTime === 0 ? "" : " " + lotComment.lotCommentTimeString) +
|
||||
"</td>" +
|
||||
"<td>" +
|
||||
cityssm.escapeHTML(lotComment.lotComment || "") +
|
||||
"</td>" +
|
||||
(lotComment.lotCommentTime === 0
|
||||
? ''
|
||||
: ' ' + lotComment.lotCommentTimeString) +
|
||||
'</td>' +
|
||||
'<td>' +
|
||||
cityssm.escapeHTML(lotComment.lotComment || '') +
|
||||
'</td>' +
|
||||
('<td class="is-hidden-print">' +
|
||||
'<div class="buttons are-small is-justify-content-end">' +
|
||||
('<button class="button is-primary button--edit" type="button">' +
|
||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||
" <span>Edit</span>" +
|
||||
"</button>") +
|
||||
' <span>Edit</span>' +
|
||||
'</button>') +
|
||||
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
"</button>") +
|
||||
"</div>" +
|
||||
"</td>");
|
||||
tableRowElement.querySelector(".button--edit").addEventListener("click", openEditLotComment);
|
||||
tableRowElement.querySelector(".button--delete").addEventListener("click", deleteLotComment);
|
||||
tableElement.querySelector("tbody").append(tableRowElement);
|
||||
'</button>') +
|
||||
'</div>' +
|
||||
'</td>');
|
||||
tableRowElement
|
||||
.querySelector('.button--edit')
|
||||
.addEventListener('click', openEditLotComment);
|
||||
tableRowElement
|
||||
.querySelector('.button--delete')
|
||||
.addEventListener('click', deleteLotComment);
|
||||
tableElement.querySelector('tbody').append(tableRowElement);
|
||||
}
|
||||
containerElement.innerHTML = "";
|
||||
containerElement.innerHTML = '';
|
||||
containerElement.append(tableElement);
|
||||
}
|
||||
function openAddCommentModal() {
|
||||
let addCommentCloseModalFunction;
|
||||
const doAddComment = (formEvent) => {
|
||||
formEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/lots/doAddLotComment", formEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/lots/doAddLotComment', formEvent.currentTarget, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
lotComments = responseJSON.lotComments;
|
||||
renderLotComments();
|
||||
|
|
@ -309,25 +315,29 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
});
|
||||
};
|
||||
cityssm.openHtmlModal("lot-addComment", {
|
||||
cityssm.openHtmlModal('lot-addComment', {
|
||||
onshow(modalElement) {
|
||||
los.populateAliases(modalElement);
|
||||
modalElement.querySelector("#lotCommentAdd--lotId").value = lotId;
|
||||
modalElement.querySelector("form").addEventListener("submit", doAddComment);
|
||||
modalElement.querySelector('#lotCommentAdd--lotId').value = lotId;
|
||||
modalElement
|
||||
.querySelector('form')
|
||||
.addEventListener('submit', doAddComment);
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
addCommentCloseModalFunction = closeModalFunction;
|
||||
modalElement.querySelector("#lotCommentAdd--lotComment").focus();
|
||||
modalElement.querySelector('#lotCommentAdd--lotComment').focus();
|
||||
},
|
||||
onremoved() {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
document.querySelector("#lotComments--add").focus();
|
||||
document.querySelector('#lotComments--add').focus();
|
||||
}
|
||||
});
|
||||
}
|
||||
if (!isCreate) {
|
||||
document.querySelector("#lotComments--add").addEventListener("click", openAddCommentModal);
|
||||
document
|
||||
.querySelector('#lotComments--add')
|
||||
.addEventListener('click', openAddCommentModal);
|
||||
renderLotComments();
|
||||
}
|
||||
})();
|
||||
|
|
|
|||
|
|
@ -1,461 +1,520 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
|
||||
import type * as globalTypes from "../types/globalTypes";
|
||||
import type * as recordTypes from "../types/recordTypes";
|
||||
|
||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||
|
||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
||||
|
||||
declare const cityssm: cityssmGlobal;
|
||||
declare const bulmaJS: BulmaJS;
|
||||
|
||||
(() => {
|
||||
const los = exports.los as globalTypes.LOS;
|
||||
|
||||
const lotId = (document.querySelector("#lot--lotId") as HTMLInputElement).value;
|
||||
const isCreate = lotId === "";
|
||||
|
||||
// Main form
|
||||
|
||||
let refreshAfterSave = isCreate;
|
||||
|
||||
const formElement = document.querySelector("#form--lot") as HTMLFormElement;
|
||||
|
||||
function updateLot(formEvent: SubmitEvent) {
|
||||
formEvent.preventDefault();
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lots/" + (isCreate ? "doCreateLot" : "doUpdateLot"),
|
||||
formElement,
|
||||
(responseJSON: { success: boolean; lotId?: number; errorMessage?: string }) => {
|
||||
if (responseJSON.success) {
|
||||
los.clearUnsavedChanges();
|
||||
|
||||
if (isCreate || refreshAfterSave) {
|
||||
window.location.href = los.getLotURL(responseJSON.lotId, true, true);
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
message: exports.aliases.lot + " Updated Successfully",
|
||||
contextualColorName: "success"
|
||||
});
|
||||
}
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating " + exports.aliases.lot,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
formElement.addEventListener("submit", updateLot);
|
||||
|
||||
const formInputElements = formElement.querySelectorAll("input, select");
|
||||
|
||||
for (const formInputElement of formInputElements) {
|
||||
formInputElement.addEventListener("change", los.setUnsavedChanges);
|
||||
}
|
||||
|
||||
los.initializeUnlockFieldButtons(formElement);
|
||||
|
||||
document.querySelector("#button--deleteLot")?.addEventListener("click", (clickEvent) => {
|
||||
clickEvent.preventDefault();
|
||||
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lots/doDeleteLot",
|
||||
{
|
||||
lotId
|
||||
},
|
||||
(responseJSON: { success: boolean; errorMessage?: string }) => {
|
||||
if (responseJSON.success) {
|
||||
cityssm.disableNavBlocker();
|
||||
window.location.href = los.getLotURL();
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Deleting ${los.escapedAliases.Lot}`,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
bulmaJS.confirm({
|
||||
title: "Delete " + exports.aliases.lot,
|
||||
message: `Are you sure you want to delete this ${los.escapedAliases.lot}?`,
|
||||
contextualColorName: "warning",
|
||||
okButton: {
|
||||
text: `Yes, Delete ${los.escapedAliases.Lot}`,
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Lot Type
|
||||
|
||||
const lotTypeIdElement = document.querySelector("#lot--lotTypeId") as HTMLSelectElement;
|
||||
|
||||
if (isCreate) {
|
||||
const lotFieldsContainerElement = document.querySelector("#container--lotFields") as HTMLElement;
|
||||
|
||||
lotTypeIdElement.addEventListener("change", () => {
|
||||
if (lotTypeIdElement.value === "") {
|
||||
lotFieldsContainerElement.innerHTML = `<div class="message is-info">
|
||||
<p class="message-body">Select the ${los.escapedAliases.lot} type to load the available fields.</p>
|
||||
</div>`;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lots/doGetLotTypeFields",
|
||||
{
|
||||
lotTypeId: lotTypeIdElement.value
|
||||
},
|
||||
(responseJSON: { lotTypeFields: recordTypes.LotTypeField[] }) => {
|
||||
if (responseJSON.lotTypeFields.length === 0) {
|
||||
lotFieldsContainerElement.innerHTML = `<div class="message is-info">
|
||||
<p class="message-body">There are no additional fields for this ${los.escapedAliases.lot} type.</p>
|
||||
</div>`;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
lotFieldsContainerElement.innerHTML = "";
|
||||
|
||||
let lotTypeFieldIds = "";
|
||||
|
||||
for (const lotTypeField of responseJSON.lotTypeFields) {
|
||||
lotTypeFieldIds += "," + lotTypeField.lotTypeFieldId;
|
||||
|
||||
const fieldName = "lotFieldValue_" + lotTypeField.lotTypeFieldId;
|
||||
|
||||
const fieldId = "lot--" + fieldName;
|
||||
|
||||
const fieldElement = document.createElement("div");
|
||||
fieldElement.className = "field";
|
||||
fieldElement.innerHTML = `<label class="label" for="${fieldId}"></label>
|
||||
<div class="control"></div>`;
|
||||
|
||||
(fieldElement.querySelector("label") as HTMLLabelElement).textContent =
|
||||
lotTypeField.lotTypeField as string;
|
||||
|
||||
if (lotTypeField.lotTypeFieldValues === "") {
|
||||
const inputElement = document.createElement("input");
|
||||
|
||||
inputElement.className = "input";
|
||||
|
||||
inputElement.id = fieldId;
|
||||
|
||||
inputElement.name = fieldName;
|
||||
|
||||
inputElement.type = "text";
|
||||
|
||||
inputElement.required = lotTypeField.isRequired as boolean;
|
||||
inputElement.minLength = lotTypeField.minimumLength as number;
|
||||
inputElement.maxLength = lotTypeField.maximumLength as number;
|
||||
|
||||
if (lotTypeField.pattern && lotTypeField.pattern !== "") {
|
||||
inputElement.pattern = lotTypeField.pattern;
|
||||
}
|
||||
|
||||
fieldElement.querySelector(".control")!.append(inputElement);
|
||||
} else {
|
||||
fieldElement.querySelector(
|
||||
".control"
|
||||
)!.innerHTML = `<div class="select is-fullwidth">
|
||||
<select id="${fieldId}" name="${fieldName}"><option value="">(Not Set)</option></select>
|
||||
</div>`;
|
||||
|
||||
const selectElement = fieldElement.querySelector("select") as HTMLSelectElement;
|
||||
|
||||
selectElement.required = lotTypeField.isRequired as boolean;
|
||||
|
||||
const optionValues = (lotTypeField.lotTypeFieldValues as string).split("\n");
|
||||
|
||||
for (const optionValue of optionValues) {
|
||||
const optionElement = document.createElement("option");
|
||||
optionElement.value = optionValue;
|
||||
optionElement.textContent = optionValue;
|
||||
selectElement.append(optionElement);
|
||||
}
|
||||
}
|
||||
|
||||
lotFieldsContainerElement.append(fieldElement);
|
||||
}
|
||||
|
||||
lotFieldsContainerElement.insertAdjacentHTML(
|
||||
"beforeend",
|
||||
`<input name="lotTypeFieldIds" type="hidden"
|
||||
value="${lotTypeFieldIds.slice(1)}" />`
|
||||
);
|
||||
}
|
||||
);
|
||||
});
|
||||
} else {
|
||||
const originalLotTypeId = lotTypeIdElement.value;
|
||||
|
||||
lotTypeIdElement.addEventListener("change", () => {
|
||||
if (lotTypeIdElement.value !== originalLotTypeId) {
|
||||
bulmaJS.confirm({
|
||||
title: "Confirm Change",
|
||||
message: `Are you sure you want to change the ${los.escapedAliases.lot} type?\n
|
||||
This change affects the additional fields associated with this record.`,
|
||||
contextualColorName: "warning",
|
||||
okButton: {
|
||||
text: "Yes, Keep the Change",
|
||||
callbackFunction: () => {
|
||||
refreshAfterSave = true;
|
||||
}
|
||||
},
|
||||
cancelButton: {
|
||||
text: "Revert the Change",
|
||||
callbackFunction: () => {
|
||||
lotTypeIdElement.value = originalLotTypeId;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Comments
|
||||
|
||||
let lotComments: recordTypes.LotComment[] = exports.lotComments;
|
||||
delete exports.lotComments;
|
||||
|
||||
function openEditLotComment(clickEvent: Event) {
|
||||
const lotCommentId = Number.parseInt(
|
||||
(clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.lotCommentId!,
|
||||
10
|
||||
);
|
||||
|
||||
const lotComment = lotComments.find((currentLotComment) => {
|
||||
return currentLotComment.lotCommentId === lotCommentId;
|
||||
})!;
|
||||
|
||||
let editFormElement: HTMLFormElement;
|
||||
let editCloseModalFunction: () => void;
|
||||
|
||||
const editComment = (submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lots/doUpdateLotComment",
|
||||
editFormElement,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotComments?: recordTypes.LotComment[];
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotComments = responseJSON.lotComments!;
|
||||
editCloseModalFunction();
|
||||
renderLotComments();
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating Comment",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
cityssm.openHtmlModal("lot-editComment", {
|
||||
onshow: (modalElement) => {
|
||||
los.populateAliases(modalElement);
|
||||
|
||||
(modalElement.querySelector("#lotCommentEdit--lotId") as HTMLInputElement).value = lotId;
|
||||
|
||||
(modalElement.querySelector("#lotCommentEdit--lotCommentId") as HTMLInputElement).value =
|
||||
lotCommentId.toString();
|
||||
|
||||
(modalElement.querySelector("#lotCommentEdit--lotComment") as HTMLInputElement).value =
|
||||
lotComment.lotComment!;
|
||||
|
||||
const lotCommentDateStringElement = modalElement.querySelector(
|
||||
"#lotCommentEdit--lotCommentDateString"
|
||||
) as HTMLInputElement;
|
||||
|
||||
lotCommentDateStringElement.value = lotComment.lotCommentDateString!;
|
||||
|
||||
const currentDateString = cityssm.dateToString(new Date());
|
||||
|
||||
lotCommentDateStringElement.max =
|
||||
lotComment.lotCommentDateString! <= currentDateString
|
||||
? currentDateString
|
||||
: lotComment.lotCommentDateString!;
|
||||
|
||||
(
|
||||
modalElement.querySelector("#lotCommentEdit--lotCommentTimeString") as HTMLInputElement
|
||||
).value = lotComment.lotCommentTimeString!;
|
||||
},
|
||||
onshown: (modalElement, closeModalFunction) => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
|
||||
los.initializeDatePickers(modalElement);
|
||||
// los.initializeTimePickers(modalElement);
|
||||
|
||||
(modalElement.querySelector("#lotCommentEdit--lotComment") as HTMLTextAreaElement).focus();
|
||||
|
||||
editFormElement = modalElement.querySelector("form")!;
|
||||
editFormElement.addEventListener("submit", editComment);
|
||||
|
||||
editCloseModalFunction = closeModalFunction;
|
||||
},
|
||||
onremoved: () => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function deleteLotComment(clickEvent: Event) {
|
||||
const lotCommentId = Number.parseInt(
|
||||
(clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.lotCommentId!,
|
||||
10
|
||||
);
|
||||
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lots/doDeleteLotComment",
|
||||
{
|
||||
lotId,
|
||||
lotCommentId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotComments: recordTypes.LotComment[];
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotComments = responseJSON.lotComments;
|
||||
renderLotComments();
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Removing Comment",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
bulmaJS.confirm({
|
||||
title: "Remove Comment?",
|
||||
message: "Are you sure you want to remove this comment?",
|
||||
okButton: {
|
||||
text: "Yes, Remove Comment",
|
||||
callbackFunction: doDelete
|
||||
},
|
||||
contextualColorName: "warning"
|
||||
});
|
||||
}
|
||||
|
||||
function renderLotComments() {
|
||||
const containerElement = document.querySelector("#container--lotComments") as HTMLElement;
|
||||
|
||||
if (lotComments.length === 0) {
|
||||
containerElement.innerHTML = `<div class="message is-info">
|
||||
<p class="message-body">There are no comments to display.</p>
|
||||
</div>`;
|
||||
return;
|
||||
import type * as globalTypes from '../types/globalTypes'
|
||||
import type * as recordTypes from '../types/recordTypes'
|
||||
|
||||
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||
|
||||
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||
|
||||
declare const cityssm: cityssmGlobal
|
||||
declare const bulmaJS: BulmaJS
|
||||
|
||||
;(() => {
|
||||
const los = exports.los as globalTypes.LOS
|
||||
|
||||
const lotId = (document.querySelector('#lot--lotId') as HTMLInputElement)
|
||||
.value
|
||||
const isCreate = lotId === ''
|
||||
|
||||
// Main form
|
||||
|
||||
let refreshAfterSave = isCreate
|
||||
|
||||
const formElement = document.querySelector('#form--lot') as HTMLFormElement
|
||||
|
||||
function updateLot(formEvent: SubmitEvent) {
|
||||
formEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/lots/' + (isCreate ? 'doCreateLot' : 'doUpdateLot'),
|
||||
formElement,
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
lotId?: number
|
||||
errorMessage?: string
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
los.clearUnsavedChanges()
|
||||
|
||||
if (isCreate || refreshAfterSave) {
|
||||
window.location.href = los.getLotURL(responseJSON.lotId, true, true)
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
message: exports.aliases.lot + ' Updated Successfully',
|
||||
contextualColorName: 'success'
|
||||
})
|
||||
}
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: 'Error Updating ' + exports.aliases.lot,
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
const tableElement = document.createElement("table");
|
||||
tableElement.className = "table is-fullwidth is-striped is-hoverable";
|
||||
tableElement.innerHTML = `<thead><tr>
|
||||
formElement.addEventListener('submit', updateLot)
|
||||
|
||||
const formInputElements = formElement.querySelectorAll('input, select')
|
||||
|
||||
for (const formInputElement of formInputElements) {
|
||||
formInputElement.addEventListener('change', los.setUnsavedChanges)
|
||||
}
|
||||
|
||||
los.initializeUnlockFieldButtons(formElement)
|
||||
|
||||
document
|
||||
.querySelector('#button--deleteLot')
|
||||
?.addEventListener('click', (clickEvent) => {
|
||||
clickEvent.preventDefault()
|
||||
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/lots/doDeleteLot',
|
||||
{
|
||||
lotId
|
||||
},
|
||||
(responseJSON: { success: boolean; errorMessage?: string }) => {
|
||||
if (responseJSON.success) {
|
||||
cityssm.disableNavBlocker()
|
||||
window.location.href = los.getLotURL()
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Deleting ${los.escapedAliases.Lot}`,
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
bulmaJS.confirm({
|
||||
title: 'Delete ' + exports.aliases.lot,
|
||||
message: `Are you sure you want to delete this ${los.escapedAliases.lot}?`,
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: `Yes, Delete ${los.escapedAliases.Lot}`,
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
// Lot Type
|
||||
|
||||
const lotTypeIdElement = document.querySelector(
|
||||
'#lot--lotTypeId'
|
||||
) as HTMLSelectElement
|
||||
|
||||
if (isCreate) {
|
||||
const lotFieldsContainerElement = document.querySelector(
|
||||
'#container--lotFields'
|
||||
) as HTMLElement
|
||||
|
||||
lotTypeIdElement.addEventListener('change', () => {
|
||||
if (lotTypeIdElement.value === '') {
|
||||
lotFieldsContainerElement.innerHTML = `<div class="message is-info">
|
||||
<p class="message-body">Select the ${los.escapedAliases.lot} type to load the available fields.</p>
|
||||
</div>`
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/lots/doGetLotTypeFields',
|
||||
{
|
||||
lotTypeId: lotTypeIdElement.value
|
||||
},
|
||||
(responseJSON: { lotTypeFields: recordTypes.LotTypeField[] }) => {
|
||||
if (responseJSON.lotTypeFields.length === 0) {
|
||||
lotFieldsContainerElement.innerHTML = `<div class="message is-info">
|
||||
<p class="message-body">There are no additional fields for this ${los.escapedAliases.lot} type.</p>
|
||||
</div>`
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
lotFieldsContainerElement.innerHTML = ''
|
||||
|
||||
let lotTypeFieldIds = ''
|
||||
|
||||
for (const lotTypeField of responseJSON.lotTypeFields) {
|
||||
lotTypeFieldIds += ',' + lotTypeField.lotTypeFieldId
|
||||
|
||||
const fieldName = 'lotFieldValue_' + lotTypeField.lotTypeFieldId
|
||||
|
||||
const fieldId = 'lot--' + fieldName
|
||||
|
||||
const fieldElement = document.createElement('div')
|
||||
fieldElement.className = 'field'
|
||||
fieldElement.innerHTML = `<label class="label" for="${fieldId}"></label>
|
||||
<div class="control"></div>`
|
||||
|
||||
;(
|
||||
fieldElement.querySelector('label') as HTMLLabelElement
|
||||
).textContent = lotTypeField.lotTypeField as string
|
||||
|
||||
if (lotTypeField.lotTypeFieldValues === '') {
|
||||
const inputElement = document.createElement('input')
|
||||
|
||||
inputElement.className = 'input'
|
||||
|
||||
inputElement.id = fieldId
|
||||
|
||||
inputElement.name = fieldName
|
||||
|
||||
inputElement.type = 'text'
|
||||
|
||||
inputElement.required = lotTypeField.isRequired as boolean
|
||||
inputElement.minLength = lotTypeField.minimumLength as number
|
||||
inputElement.maxLength = lotTypeField.maximumLength as number
|
||||
|
||||
if (lotTypeField.pattern && lotTypeField.pattern !== '') {
|
||||
inputElement.pattern = lotTypeField.pattern
|
||||
}
|
||||
|
||||
fieldElement.querySelector('.control')!.append(inputElement)
|
||||
} else {
|
||||
fieldElement.querySelector(
|
||||
'.control'
|
||||
)!.innerHTML = `<div class="select is-fullwidth">
|
||||
<select id="${fieldId}" name="${fieldName}"><option value="">(Not Set)</option></select>
|
||||
</div>`
|
||||
|
||||
const selectElement = fieldElement.querySelector(
|
||||
'select'
|
||||
) as HTMLSelectElement
|
||||
|
||||
selectElement.required = lotTypeField.isRequired as boolean
|
||||
|
||||
const optionValues = (
|
||||
lotTypeField.lotTypeFieldValues as string
|
||||
).split('\n')
|
||||
|
||||
for (const optionValue of optionValues) {
|
||||
const optionElement = document.createElement('option')
|
||||
optionElement.value = optionValue
|
||||
optionElement.textContent = optionValue
|
||||
selectElement.append(optionElement)
|
||||
}
|
||||
}
|
||||
|
||||
lotFieldsContainerElement.append(fieldElement)
|
||||
}
|
||||
|
||||
lotFieldsContainerElement.insertAdjacentHTML(
|
||||
'beforeend',
|
||||
`<input name="lotTypeFieldIds" type="hidden"
|
||||
value="${lotTypeFieldIds.slice(1)}" />`
|
||||
)
|
||||
}
|
||||
)
|
||||
})
|
||||
} else {
|
||||
const originalLotTypeId = lotTypeIdElement.value
|
||||
|
||||
lotTypeIdElement.addEventListener('change', () => {
|
||||
if (lotTypeIdElement.value !== originalLotTypeId) {
|
||||
bulmaJS.confirm({
|
||||
title: 'Confirm Change',
|
||||
message: `Are you sure you want to change the ${los.escapedAliases.lot} type?\n
|
||||
This change affects the additional fields associated with this record.`,
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: 'Yes, Keep the Change',
|
||||
callbackFunction: () => {
|
||||
refreshAfterSave = true
|
||||
}
|
||||
},
|
||||
cancelButton: {
|
||||
text: 'Revert the Change',
|
||||
callbackFunction: () => {
|
||||
lotTypeIdElement.value = originalLotTypeId
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// Comments
|
||||
|
||||
let lotComments: recordTypes.LotComment[] = exports.lotComments
|
||||
delete exports.lotComments
|
||||
|
||||
function openEditLotComment(clickEvent: Event) {
|
||||
const lotCommentId = Number.parseInt(
|
||||
(clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset
|
||||
.lotCommentId!,
|
||||
10
|
||||
)
|
||||
|
||||
const lotComment = lotComments.find((currentLotComment) => {
|
||||
return currentLotComment.lotCommentId === lotCommentId
|
||||
})!
|
||||
|
||||
let editFormElement: HTMLFormElement
|
||||
let editCloseModalFunction: () => void
|
||||
|
||||
const editComment = (submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/lots/doUpdateLotComment',
|
||||
editFormElement,
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotComments?: recordTypes.LotComment[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotComments = responseJSON.lotComments!
|
||||
editCloseModalFunction()
|
||||
renderLotComments()
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: 'Error Updating Comment',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
cityssm.openHtmlModal('lot-editComment', {
|
||||
onshow: (modalElement) => {
|
||||
los.populateAliases(modalElement)
|
||||
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotCommentEdit--lotId'
|
||||
) as HTMLInputElement
|
||||
).value = lotId
|
||||
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotCommentEdit--lotCommentId'
|
||||
) as HTMLInputElement
|
||||
).value = lotCommentId.toString()
|
||||
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotCommentEdit--lotComment'
|
||||
) as HTMLInputElement
|
||||
).value = lotComment.lotComment!
|
||||
|
||||
const lotCommentDateStringElement = modalElement.querySelector(
|
||||
'#lotCommentEdit--lotCommentDateString'
|
||||
) as HTMLInputElement
|
||||
|
||||
lotCommentDateStringElement.value = lotComment.lotCommentDateString!
|
||||
|
||||
const currentDateString = cityssm.dateToString(new Date())
|
||||
|
||||
lotCommentDateStringElement.max =
|
||||
lotComment.lotCommentDateString! <= currentDateString
|
||||
? currentDateString
|
||||
: lotComment.lotCommentDateString!
|
||||
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotCommentEdit--lotCommentTimeString'
|
||||
) as HTMLInputElement
|
||||
).value = lotComment.lotCommentTimeString!
|
||||
},
|
||||
onshown: (modalElement, closeModalFunction) => {
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
|
||||
los.initializeDatePickers(modalElement)
|
||||
// los.initializeTimePickers(modalElement);
|
||||
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotCommentEdit--lotComment'
|
||||
) as HTMLTextAreaElement
|
||||
).focus()
|
||||
|
||||
editFormElement = modalElement.querySelector('form')!
|
||||
editFormElement.addEventListener('submit', editComment)
|
||||
|
||||
editCloseModalFunction = closeModalFunction
|
||||
},
|
||||
onremoved: () => {
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function deleteLotComment(clickEvent: Event) {
|
||||
const lotCommentId = Number.parseInt(
|
||||
(clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset
|
||||
.lotCommentId!,
|
||||
10
|
||||
)
|
||||
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/lots/doDeleteLotComment',
|
||||
{
|
||||
lotId,
|
||||
lotCommentId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotComments: recordTypes.LotComment[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotComments = responseJSON.lotComments
|
||||
renderLotComments()
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: 'Error Removing Comment',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
bulmaJS.confirm({
|
||||
title: 'Remove Comment?',
|
||||
message: 'Are you sure you want to remove this comment?',
|
||||
okButton: {
|
||||
text: 'Yes, Remove Comment',
|
||||
callbackFunction: doDelete
|
||||
},
|
||||
contextualColorName: 'warning'
|
||||
})
|
||||
}
|
||||
|
||||
function renderLotComments() {
|
||||
const containerElement = document.querySelector(
|
||||
'#container--lotComments'
|
||||
) as HTMLElement
|
||||
|
||||
if (lotComments.length === 0) {
|
||||
containerElement.innerHTML = `<div class="message is-info">
|
||||
<p class="message-body">There are no comments to display.</p>
|
||||
</div>`
|
||||
return
|
||||
}
|
||||
|
||||
const tableElement = document.createElement('table')
|
||||
tableElement.className = 'table is-fullwidth is-striped is-hoverable'
|
||||
tableElement.innerHTML = `<thead><tr>
|
||||
<th>Commentor</th>
|
||||
<th>Comment Date</th>
|
||||
<th>Comment</th>
|
||||
<th class="is-hidden-print"><span class="is-sr-only">Options</span></th>
|
||||
</tr></thead>
|
||||
<tbody></tbody>`;
|
||||
<tbody></tbody>`
|
||||
|
||||
for (const lotComment of lotComments) {
|
||||
const tableRowElement = document.createElement("tr");
|
||||
tableRowElement.dataset.lotCommentId = lotComment.lotCommentId!.toString();
|
||||
for (const lotComment of lotComments) {
|
||||
const tableRowElement = document.createElement('tr')
|
||||
tableRowElement.dataset.lotCommentId = lotComment.lotCommentId!.toString()
|
||||
|
||||
tableRowElement.innerHTML =
|
||||
"<td>" +
|
||||
cityssm.escapeHTML(lotComment.recordCreate_userName || "") +
|
||||
"</td>" +
|
||||
"<td>" +
|
||||
lotComment.lotCommentDateString +
|
||||
(lotComment.lotCommentTime === 0 ? "" : " " + lotComment.lotCommentTimeString) +
|
||||
"</td>" +
|
||||
"<td>" +
|
||||
cityssm.escapeHTML(lotComment.lotComment || "") +
|
||||
"</td>" +
|
||||
('<td class="is-hidden-print">' +
|
||||
'<div class="buttons are-small is-justify-content-end">' +
|
||||
('<button class="button is-primary button--edit" type="button">' +
|
||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||
" <span>Edit</span>" +
|
||||
"</button>") +
|
||||
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
"</button>") +
|
||||
"</div>" +
|
||||
"</td>");
|
||||
tableRowElement.innerHTML =
|
||||
'<td>' +
|
||||
cityssm.escapeHTML(lotComment.recordCreate_userName || '') +
|
||||
'</td>' +
|
||||
'<td>' +
|
||||
lotComment.lotCommentDateString +
|
||||
(lotComment.lotCommentTime === 0
|
||||
? ''
|
||||
: ' ' + lotComment.lotCommentTimeString) +
|
||||
'</td>' +
|
||||
'<td>' +
|
||||
cityssm.escapeHTML(lotComment.lotComment || '') +
|
||||
'</td>' +
|
||||
('<td class="is-hidden-print">' +
|
||||
'<div class="buttons are-small is-justify-content-end">' +
|
||||
('<button class="button is-primary button--edit" type="button">' +
|
||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||
' <span>Edit</span>' +
|
||||
'</button>') +
|
||||
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
'</button>') +
|
||||
'</div>' +
|
||||
'</td>')
|
||||
|
||||
tableRowElement.querySelector(".button--edit")!.addEventListener("click", openEditLotComment);
|
||||
tableRowElement
|
||||
.querySelector('.button--edit')!
|
||||
.addEventListener('click', openEditLotComment)
|
||||
|
||||
tableRowElement.querySelector(".button--delete")!.addEventListener("click", deleteLotComment);
|
||||
tableRowElement
|
||||
.querySelector('.button--delete')!
|
||||
.addEventListener('click', deleteLotComment)
|
||||
|
||||
tableElement.querySelector("tbody")!.append(tableRowElement);
|
||||
tableElement.querySelector('tbody')!.append(tableRowElement)
|
||||
}
|
||||
|
||||
containerElement.innerHTML = ''
|
||||
containerElement.append(tableElement)
|
||||
}
|
||||
|
||||
function openAddCommentModal() {
|
||||
let addCommentCloseModalFunction: () => void
|
||||
|
||||
const doAddComment = (formEvent: SubmitEvent) => {
|
||||
formEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/lots/doAddLotComment',
|
||||
formEvent.currentTarget,
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
lotComments?: recordTypes.LotComment[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotComments = responseJSON.lotComments!
|
||||
renderLotComments()
|
||||
addCommentCloseModalFunction()
|
||||
}
|
||||
}
|
||||
|
||||
containerElement.innerHTML = "";
|
||||
containerElement.append(tableElement);
|
||||
)
|
||||
}
|
||||
|
||||
function openAddCommentModal() {
|
||||
let addCommentCloseModalFunction: () => void;
|
||||
cityssm.openHtmlModal('lot-addComment', {
|
||||
onshow(modalElement) {
|
||||
los.populateAliases(modalElement)
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotCommentAdd--lotId'
|
||||
) as HTMLInputElement
|
||||
).value = lotId
|
||||
modalElement
|
||||
.querySelector('form')!
|
||||
.addEventListener('submit', doAddComment)
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
addCommentCloseModalFunction = closeModalFunction
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotCommentAdd--lotComment'
|
||||
) as HTMLTextAreaElement
|
||||
).focus()
|
||||
},
|
||||
onremoved() {
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
;(
|
||||
document.querySelector('#lotComments--add') as HTMLButtonElement
|
||||
).focus()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const doAddComment = (formEvent: SubmitEvent) => {
|
||||
formEvent.preventDefault();
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lots/doAddLotComment",
|
||||
formEvent.currentTarget,
|
||||
(responseJSON: { success: boolean; lotComments?: recordTypes.LotComment[] }) => {
|
||||
if (responseJSON.success) {
|
||||
lotComments = responseJSON.lotComments!;
|
||||
renderLotComments();
|
||||
addCommentCloseModalFunction();
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
cityssm.openHtmlModal("lot-addComment", {
|
||||
onshow(modalElement) {
|
||||
los.populateAliases(modalElement);
|
||||
(modalElement.querySelector("#lotCommentAdd--lotId") as HTMLInputElement).value = lotId;
|
||||
modalElement.querySelector("form")!.addEventListener("submit", doAddComment);
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
addCommentCloseModalFunction = closeModalFunction;
|
||||
(modalElement.querySelector("#lotCommentAdd--lotComment") as HTMLTextAreaElement).focus();
|
||||
},
|
||||
onremoved() {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
(document.querySelector("#lotComments--add") as HTMLButtonElement).focus();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (!isCreate) {
|
||||
document.querySelector("#lotComments--add")!.addEventListener("click", openAddCommentModal);
|
||||
renderLotComments();
|
||||
}
|
||||
})();
|
||||
if (!isCreate) {
|
||||
document
|
||||
.querySelector('#lotComments--add')!
|
||||
.addEventListener('click', openAddCommentModal)
|
||||
renderLotComments()
|
||||
}
|
||||
})()
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -4,17 +4,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
(() => {
|
||||
var _a, _b, _c;
|
||||
const los = exports.los;
|
||||
const lotOccupancyId = document.querySelector("#lotOccupancy--lotOccupancyId")
|
||||
.value;
|
||||
const isCreate = lotOccupancyId === "";
|
||||
const lotOccupancyId = document.querySelector('#lotOccupancy--lotOccupancyId').value;
|
||||
const isCreate = lotOccupancyId === '';
|
||||
/*
|
||||
* Main form
|
||||
*/
|
||||
let refreshAfterSave = isCreate;
|
||||
const formElement = document.querySelector("#form--lotOccupancy");
|
||||
formElement.addEventListener("submit", (formEvent) => {
|
||||
const formElement = document.querySelector('#form--lotOccupancy');
|
||||
formElement.addEventListener('submit', (formEvent) => {
|
||||
formEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/" + (isCreate ? "doCreateLotOccupancy" : "doUpdateLotOccupancy"), formElement, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix +
|
||||
'/lotOccupancies/' +
|
||||
(isCreate ? 'doCreateLotOccupancy' : 'doUpdateLotOccupancy'), formElement, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
los.clearUnsavedChanges();
|
||||
if (isCreate || refreshAfterSave) {
|
||||
|
|
@ -23,25 +24,25 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
else {
|
||||
bulmaJS.alert({
|
||||
message: `${los.escapedAliases.Occupancy} Updated Successfully`,
|
||||
contextualColorName: "success"
|
||||
contextualColorName: 'success'
|
||||
});
|
||||
}
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Saving " + exports.aliases.occupancy,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Saving ' + exports.aliases.occupancy,
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
const formInputElements = formElement.querySelectorAll("input, select");
|
||||
const formInputElements = formElement.querySelectorAll('input, select');
|
||||
for (const formInputElement of formInputElements) {
|
||||
formInputElement.addEventListener("change", los.setUnsavedChanges);
|
||||
formInputElement.addEventListener('change', los.setUnsavedChanges);
|
||||
}
|
||||
const doCopy = () => {
|
||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doCopyLotOccupancy", {
|
||||
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doCopyLotOccupancy', {
|
||||
lotOccupancyId
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
|
|
@ -50,38 +51,40 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Copying Record",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Copying Record',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
(_a = document.querySelector("#button--copyLotOccupancy")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", (clickEvent) => {
|
||||
(_a = document
|
||||
.querySelector('#button--copyLotOccupancy')) === null || _a === void 0 ? void 0 : _a.addEventListener('click', (clickEvent) => {
|
||||
clickEvent.preventDefault();
|
||||
if (los.hasUnsavedChanges()) {
|
||||
bulmaJS.alert({
|
||||
title: "Unsaved Changes",
|
||||
message: "Please save all unsaved changes before continuing.",
|
||||
contextualColorName: "warning"
|
||||
title: 'Unsaved Changes',
|
||||
message: 'Please save all unsaved changes before continuing.',
|
||||
contextualColorName: 'warning'
|
||||
});
|
||||
}
|
||||
else {
|
||||
bulmaJS.confirm({
|
||||
title: `Copy ${los.escapedAliases.Occupancy} Record as New`,
|
||||
message: "Are you sure you want to copy this record to a new record?",
|
||||
contextualColorName: "info",
|
||||
message: 'Are you sure you want to copy this record to a new record?',
|
||||
contextualColorName: 'info',
|
||||
okButton: {
|
||||
text: "Yes, Copy",
|
||||
text: 'Yes, Copy',
|
||||
callbackFunction: doCopy
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
(_b = document.querySelector("#button--deleteLotOccupancy")) === null || _b === void 0 ? void 0 : _b.addEventListener("click", (clickEvent) => {
|
||||
(_b = document
|
||||
.querySelector('#button--deleteLotOccupancy')) === null || _b === void 0 ? void 0 : _b.addEventListener('click', (clickEvent) => {
|
||||
clickEvent.preventDefault();
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancy", {
|
||||
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancy', {
|
||||
lotOccupancyId
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
|
|
@ -90,65 +93,69 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Deleting Record",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Deleting Record',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
bulmaJS.confirm({
|
||||
title: "Delete " + exports.aliases.occupancy + " Record",
|
||||
message: "Are you sure you want to delete this record?",
|
||||
contextualColorName: "warning",
|
||||
title: 'Delete ' + exports.aliases.occupancy + ' Record',
|
||||
message: 'Are you sure you want to delete this record?',
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: "Yes, Delete",
|
||||
text: 'Yes, Delete',
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
});
|
||||
});
|
||||
(_c = document.querySelector("#button--createWorkOrder")) === null || _c === void 0 ? void 0 : _c.addEventListener("click", (clickEvent) => {
|
||||
(_c = document
|
||||
.querySelector('#button--createWorkOrder')) === null || _c === void 0 ? void 0 : _c.addEventListener('click', (clickEvent) => {
|
||||
clickEvent.preventDefault();
|
||||
let createCloseModalFunction;
|
||||
const doCreate = (formEvent) => {
|
||||
formEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doCreateWorkOrder", formEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/workOrders/doCreateWorkOrder', formEvent.currentTarget, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
createCloseModalFunction();
|
||||
bulmaJS.confirm({
|
||||
title: "Work Order Created Successfully",
|
||||
message: "Would you like to open the work order now?",
|
||||
contextualColorName: "success",
|
||||
title: 'Work Order Created Successfully',
|
||||
message: 'Would you like to open the work order now?',
|
||||
contextualColorName: 'success',
|
||||
okButton: {
|
||||
text: "Yes, Open the Work Order",
|
||||
text: 'Yes, Open the Work Order',
|
||||
callbackFunction: () => {
|
||||
window.location.href =
|
||||
los.urlPrefix + "/workOrders/" + responseJSON.workOrderId + "/edit";
|
||||
los.urlPrefix +
|
||||
'/workOrders/' +
|
||||
responseJSON.workOrderId +
|
||||
'/edit';
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Creating Work Order",
|
||||
title: 'Error Creating Work Order',
|
||||
message: responseJSON.errorMessage,
|
||||
contextualColorName: "danger"
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
cityssm.openHtmlModal("lotOccupancy-createWorkOrder", {
|
||||
cityssm.openHtmlModal('lotOccupancy-createWorkOrder', {
|
||||
onshow(modalElement) {
|
||||
modalElement.querySelector("#workOrderCreate--lotOccupancyId").value =
|
||||
lotOccupancyId;
|
||||
modalElement.querySelector("#workOrderCreate--workOrderOpenDateString").value = cityssm.dateToString(new Date());
|
||||
const workOrderTypeSelectElement = modalElement.querySelector("#workOrderCreate--workOrderTypeId");
|
||||
;
|
||||
modalElement.querySelector('#workOrderCreate--lotOccupancyId').value = lotOccupancyId;
|
||||
modalElement.querySelector('#workOrderCreate--workOrderOpenDateString').value = cityssm.dateToString(new Date());
|
||||
const workOrderTypeSelectElement = modalElement.querySelector('#workOrderCreate--workOrderTypeId');
|
||||
const workOrderTypes = exports.workOrderTypes;
|
||||
if (workOrderTypes.length === 1) {
|
||||
workOrderTypeSelectElement.innerHTML = "";
|
||||
workOrderTypeSelectElement.innerHTML = '';
|
||||
}
|
||||
for (const workOrderType of workOrderTypes) {
|
||||
const optionElement = document.createElement("option");
|
||||
const optionElement = document.createElement('option');
|
||||
optionElement.value = workOrderType.workOrderTypeId.toString();
|
||||
optionElement.textContent = workOrderType.workOrderType;
|
||||
workOrderTypeSelectElement.append(optionElement);
|
||||
|
|
@ -157,22 +164,23 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
onshown(modalElement, closeModalFunction) {
|
||||
var _a;
|
||||
createCloseModalFunction = closeModalFunction;
|
||||
(_a = modalElement.querySelector("form")) === null || _a === void 0 ? void 0 : _a.addEventListener("submit", doCreate);
|
||||
(_a = modalElement
|
||||
.querySelector('form')) === null || _a === void 0 ? void 0 : _a.addEventListener('submit', doCreate);
|
||||
}
|
||||
});
|
||||
});
|
||||
// Occupancy Type
|
||||
const occupancyTypeIdElement = document.querySelector("#lotOccupancy--occupancyTypeId");
|
||||
const occupancyTypeIdElement = document.querySelector('#lotOccupancy--occupancyTypeId');
|
||||
if (isCreate) {
|
||||
const lotOccupancyFieldsContainerElement = document.querySelector("#container--lotOccupancyFields");
|
||||
occupancyTypeIdElement.addEventListener("change", () => {
|
||||
if (occupancyTypeIdElement.value === "") {
|
||||
const lotOccupancyFieldsContainerElement = document.querySelector('#container--lotOccupancyFields');
|
||||
occupancyTypeIdElement.addEventListener('change', () => {
|
||||
if (occupancyTypeIdElement.value === '') {
|
||||
lotOccupancyFieldsContainerElement.innerHTML = `<div class="message is-info">
|
||||
<p class="message-body">Select the ${los.escapedAliases.occupancy} type to load the available fields.</p>
|
||||
</div>`;
|
||||
return;
|
||||
}
|
||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doGetOccupancyTypeFields", {
|
||||
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doGetOccupancyTypeFields', {
|
||||
occupancyTypeId: occupancyTypeIdElement.value
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.occupancyTypeFields.length === 0) {
|
||||
|
|
@ -181,45 +189,51 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
</div>`;
|
||||
return;
|
||||
}
|
||||
lotOccupancyFieldsContainerElement.innerHTML = "";
|
||||
let occupancyTypeFieldIds = "";
|
||||
lotOccupancyFieldsContainerElement.innerHTML = '';
|
||||
let occupancyTypeFieldIds = '';
|
||||
for (const occupancyTypeField of responseJSON.occupancyTypeFields) {
|
||||
occupancyTypeFieldIds += "," + occupancyTypeField.occupancyTypeFieldId;
|
||||
const fieldName = "lotOccupancyFieldValue_" + occupancyTypeField.occupancyTypeFieldId;
|
||||
const fieldId = "lotOccupancy--" + fieldName;
|
||||
const fieldElement = document.createElement("div");
|
||||
fieldElement.className = "field";
|
||||
occupancyTypeFieldIds +=
|
||||
',' + occupancyTypeField.occupancyTypeFieldId;
|
||||
const fieldName = 'lotOccupancyFieldValue_' +
|
||||
occupancyTypeField.occupancyTypeFieldId;
|
||||
const fieldId = 'lotOccupancy--' + fieldName;
|
||||
const fieldElement = document.createElement('div');
|
||||
fieldElement.className = 'field';
|
||||
fieldElement.innerHTML = `<label class="label" for="${fieldId}"></label><div class="control"></div>`;
|
||||
fieldElement.querySelector("label").textContent =
|
||||
occupancyTypeField.occupancyTypeField;
|
||||
if (occupancyTypeField.occupancyTypeFieldValues === "") {
|
||||
const inputElement = document.createElement("input");
|
||||
inputElement.className = "input";
|
||||
fieldElement.querySelector('label').textContent = occupancyTypeField.occupancyTypeField;
|
||||
if (occupancyTypeField.occupancyTypeFieldValues === '') {
|
||||
const inputElement = document.createElement('input');
|
||||
inputElement.className = 'input';
|
||||
inputElement.id = fieldId;
|
||||
inputElement.name = fieldName;
|
||||
inputElement.type = "text";
|
||||
inputElement.type = 'text';
|
||||
inputElement.required = occupancyTypeField.isRequired;
|
||||
inputElement.minLength = occupancyTypeField.minimumLength;
|
||||
inputElement.maxLength = occupancyTypeField.maximumLength;
|
||||
if (occupancyTypeField.pattern && occupancyTypeField.pattern !== "") {
|
||||
inputElement.minLength =
|
||||
occupancyTypeField.minimumLength;
|
||||
inputElement.maxLength =
|
||||
occupancyTypeField.maximumLength;
|
||||
if (occupancyTypeField.pattern &&
|
||||
occupancyTypeField.pattern !== '') {
|
||||
inputElement.pattern = occupancyTypeField.pattern;
|
||||
}
|
||||
fieldElement.querySelector(".control").append(inputElement);
|
||||
;
|
||||
fieldElement.querySelector('.control').append(inputElement);
|
||||
}
|
||||
else {
|
||||
fieldElement.querySelector(".control").innerHTML =
|
||||
;
|
||||
fieldElement.querySelector('.control').innerHTML =
|
||||
'<div class="select is-fullwidth"><select id="' +
|
||||
fieldId +
|
||||
'" name="' +
|
||||
fieldName +
|
||||
'">' +
|
||||
'<option value="">(Not Set)</option>' +
|
||||
"</select></div>";
|
||||
const selectElement = fieldElement.querySelector("select");
|
||||
'</select></div>';
|
||||
const selectElement = fieldElement.querySelector('select');
|
||||
selectElement.required = occupancyTypeField.isRequired;
|
||||
const optionValues = occupancyTypeField.occupancyTypeFieldValues.split("\n");
|
||||
const optionValues = occupancyTypeField.occupancyTypeFieldValues.split('\n');
|
||||
for (const optionValue of optionValues) {
|
||||
const optionElement = document.createElement("option");
|
||||
const optionElement = document.createElement('option');
|
||||
optionElement.value = optionValue;
|
||||
optionElement.textContent = optionValue;
|
||||
selectElement.append(optionElement);
|
||||
|
|
@ -227,27 +241,27 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
lotOccupancyFieldsContainerElement.append(fieldElement);
|
||||
}
|
||||
lotOccupancyFieldsContainerElement.insertAdjacentHTML("beforeend", `<input name="occupancyTypeFieldIds" type="hidden" value="${occupancyTypeFieldIds.slice(1)}" />`);
|
||||
lotOccupancyFieldsContainerElement.insertAdjacentHTML('beforeend', `<input name="occupancyTypeFieldIds" type="hidden" value="${occupancyTypeFieldIds.slice(1)}" />`);
|
||||
});
|
||||
});
|
||||
}
|
||||
else {
|
||||
const originalOccupancyTypeId = occupancyTypeIdElement.value;
|
||||
occupancyTypeIdElement.addEventListener("change", () => {
|
||||
occupancyTypeIdElement.addEventListener('change', () => {
|
||||
if (occupancyTypeIdElement.value !== originalOccupancyTypeId) {
|
||||
bulmaJS.confirm({
|
||||
title: "Confirm Change",
|
||||
title: 'Confirm Change',
|
||||
message: `Are you sure you want to change the ${los.escapedAliases.occupancy} type?\n
|
||||
This change affects the additional fields associated with this record, and may also affect the available fees.`,
|
||||
contextualColorName: "warning",
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: "Yes, Keep the Change",
|
||||
text: 'Yes, Keep the Change',
|
||||
callbackFunction: () => {
|
||||
refreshAfterSave = true;
|
||||
}
|
||||
},
|
||||
cancelButton: {
|
||||
text: "Revert the Change",
|
||||
text: 'Revert the Change',
|
||||
callbackFunction: () => {
|
||||
occupancyTypeIdElement.value = originalOccupancyTypeId;
|
||||
}
|
||||
|
|
@ -257,16 +271,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
});
|
||||
}
|
||||
// Lot Selector
|
||||
const lotNameElement = document.querySelector("#lotOccupancy--lotName");
|
||||
lotNameElement.addEventListener("click", (clickEvent) => {
|
||||
const lotNameElement = document.querySelector('#lotOccupancy--lotName');
|
||||
lotNameElement.addEventListener('click', (clickEvent) => {
|
||||
const currentLotName = clickEvent.currentTarget.value;
|
||||
let lotSelectCloseModalFunction;
|
||||
let lotSelectModalElement;
|
||||
let lotSelectFormElement;
|
||||
let lotSelectResultsElement;
|
||||
const renderSelectedLotAndClose = (lotId, lotName) => {
|
||||
document.querySelector("#lotOccupancy--lotId").value = lotId.toString();
|
||||
document.querySelector("#lotOccupancy--lotName").value = lotName;
|
||||
;
|
||||
document.querySelector('#lotOccupancy--lotId').value = lotId.toString();
|
||||
document.querySelector('#lotOccupancy--lotName').value = lotName;
|
||||
los.setUnsavedChanges();
|
||||
lotSelectCloseModalFunction();
|
||||
};
|
||||
|
|
@ -276,64 +291,64 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
renderSelectedLotAndClose(selectedLotElement.dataset.lotId, selectedLotElement.dataset.lotName);
|
||||
};
|
||||
const searchLots = () => {
|
||||
lotSelectResultsElement.innerHTML = los.getLoadingParagraphHTML("Searching...");
|
||||
cityssm.postJSON(los.urlPrefix + "/lots/doSearchLots", lotSelectFormElement, (responseJSON) => {
|
||||
lotSelectResultsElement.innerHTML =
|
||||
los.getLoadingParagraphHTML('Searching...');
|
||||
cityssm.postJSON(los.urlPrefix + '/lots/doSearchLots', lotSelectFormElement, (responseJSON) => {
|
||||
if (responseJSON.count === 0) {
|
||||
lotSelectResultsElement.innerHTML = `<div class="message is-info">
|
||||
<p class="message-body">No results.</p>
|
||||
</div>`;
|
||||
return;
|
||||
}
|
||||
const panelElement = document.createElement("div");
|
||||
panelElement.className = "panel";
|
||||
const panelElement = document.createElement('div');
|
||||
panelElement.className = 'panel';
|
||||
for (const lot of responseJSON.lots) {
|
||||
const panelBlockElement = document.createElement("a");
|
||||
panelBlockElement.className = "panel-block is-block";
|
||||
panelBlockElement.href = "#";
|
||||
const panelBlockElement = document.createElement('a');
|
||||
panelBlockElement.className = 'panel-block is-block';
|
||||
panelBlockElement.href = '#';
|
||||
panelBlockElement.dataset.lotId = lot.lotId.toString();
|
||||
panelBlockElement.dataset.lotName = lot.lotName;
|
||||
panelBlockElement.innerHTML =
|
||||
'<div class="columns">' +
|
||||
('<div class="column">' +
|
||||
cityssm.escapeHTML(lot.lotName || "") +
|
||||
"<br />" +
|
||||
cityssm.escapeHTML(lot.lotName || '') +
|
||||
'<br />' +
|
||||
'<span class="is-size-7">' +
|
||||
cityssm.escapeHTML(lot.mapName || "") +
|
||||
"</span>" +
|
||||
"</div>") +
|
||||
cityssm.escapeHTML(lot.mapName || '') +
|
||||
'</span>' +
|
||||
'</div>') +
|
||||
('<div class="column">' +
|
||||
cityssm.escapeHTML(lot.lotStatus) +
|
||||
"<br />" +
|
||||
'<br />' +
|
||||
'<span class="is-size-7">' +
|
||||
(lot.lotOccupancyCount > 0 ? "Currently Occupied" : "") +
|
||||
"</span>" +
|
||||
"</div>") +
|
||||
"</div>";
|
||||
panelBlockElement.addEventListener("click", selectExistingLot);
|
||||
(lot.lotOccupancyCount > 0 ? 'Currently Occupied' : '') +
|
||||
'</span>' +
|
||||
'</div>') +
|
||||
'</div>';
|
||||
panelBlockElement.addEventListener('click', selectExistingLot);
|
||||
panelElement.append(panelBlockElement);
|
||||
}
|
||||
lotSelectResultsElement.innerHTML = "";
|
||||
lotSelectResultsElement.innerHTML = '';
|
||||
lotSelectResultsElement.append(panelElement);
|
||||
});
|
||||
};
|
||||
const createLotAndSelect = (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
const lotName = lotSelectModalElement.querySelector("#lotCreate--lotName")
|
||||
.value;
|
||||
cityssm.postJSON(los.urlPrefix + "/lots/doCreateLot", submitEvent.currentTarget, (responseJSON) => {
|
||||
const lotName = lotSelectModalElement.querySelector('#lotCreate--lotName').value;
|
||||
cityssm.postJSON(los.urlPrefix + '/lots/doCreateLot', submitEvent.currentTarget, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
renderSelectedLotAndClose(responseJSON.lotId, lotName);
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: `Error Creating ${los.escapedAliases.Lot}`,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
cityssm.openHtmlModal("lotOccupancy-selectLot", {
|
||||
cityssm.openHtmlModal('lotOccupancy-selectLot', {
|
||||
onshow: (modalElement) => {
|
||||
los.populateAliases(modalElement);
|
||||
},
|
||||
|
|
@ -343,87 +358,94 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
lotSelectCloseModalFunction = closeModalFunction;
|
||||
bulmaJS.init(modalElement);
|
||||
// search Tab
|
||||
const lotNameFilterElement = modalElement.querySelector("#lotSelect--lotName");
|
||||
if (document.querySelector("#lotOccupancy--lotId").value !== "") {
|
||||
const lotNameFilterElement = modalElement.querySelector('#lotSelect--lotName');
|
||||
if (document.querySelector('#lotOccupancy--lotId')
|
||||
.value !== '') {
|
||||
lotNameFilterElement.value = currentLotName;
|
||||
}
|
||||
lotNameFilterElement.focus();
|
||||
lotNameFilterElement.addEventListener("change", searchLots);
|
||||
const occupancyStatusFilterElement = modalElement.querySelector("#lotSelect--occupancyStatus");
|
||||
occupancyStatusFilterElement.addEventListener("change", searchLots);
|
||||
if (currentLotName !== "") {
|
||||
occupancyStatusFilterElement.value = "";
|
||||
lotNameFilterElement.addEventListener('change', searchLots);
|
||||
const occupancyStatusFilterElement = modalElement.querySelector('#lotSelect--occupancyStatus');
|
||||
occupancyStatusFilterElement.addEventListener('change', searchLots);
|
||||
if (currentLotName !== '') {
|
||||
occupancyStatusFilterElement.value = '';
|
||||
}
|
||||
lotSelectFormElement = modalElement.querySelector("#form--lotSelect");
|
||||
lotSelectResultsElement = modalElement.querySelector("#resultsContainer--lotSelect");
|
||||
lotSelectFormElement.addEventListener("submit", (submitEvent) => {
|
||||
lotSelectFormElement = modalElement.querySelector('#form--lotSelect');
|
||||
lotSelectResultsElement = modalElement.querySelector('#resultsContainer--lotSelect');
|
||||
lotSelectFormElement.addEventListener('submit', (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
});
|
||||
searchLots();
|
||||
// Create Tab
|
||||
if (exports.lotNamePattern) {
|
||||
const regex = exports.lotNamePattern;
|
||||
modalElement.querySelector("#lotCreate--lotName").pattern =
|
||||
regex.source;
|
||||
modalElement.querySelector('#lotCreate--lotName').pattern = regex.source;
|
||||
}
|
||||
const lotTypeElement = modalElement.querySelector("#lotCreate--lotTypeId");
|
||||
const lotTypeElement = modalElement.querySelector('#lotCreate--lotTypeId');
|
||||
for (const lotType of exports.lotTypes) {
|
||||
const optionElement = document.createElement("option");
|
||||
const optionElement = document.createElement('option');
|
||||
optionElement.value = lotType.lotTypeId.toString();
|
||||
optionElement.textContent = lotType.lotType;
|
||||
lotTypeElement.append(optionElement);
|
||||
}
|
||||
const lotStatusElement = modalElement.querySelector("#lotCreate--lotStatusId");
|
||||
const lotStatusElement = modalElement.querySelector('#lotCreate--lotStatusId');
|
||||
for (const lotStatus of exports.lotStatuses) {
|
||||
const optionElement = document.createElement("option");
|
||||
const optionElement = document.createElement('option');
|
||||
optionElement.value = lotStatus.lotStatusId.toString();
|
||||
optionElement.textContent = lotStatus.lotStatus;
|
||||
lotStatusElement.append(optionElement);
|
||||
}
|
||||
const mapElement = modalElement.querySelector("#lotCreate--mapId");
|
||||
const mapElement = modalElement.querySelector('#lotCreate--mapId');
|
||||
for (const map of exports.maps) {
|
||||
const optionElement = document.createElement("option");
|
||||
const optionElement = document.createElement('option');
|
||||
optionElement.value = map.mapId.toString();
|
||||
optionElement.textContent = map.mapName || "(No Name)";
|
||||
optionElement.textContent = map.mapName || '(No Name)';
|
||||
mapElement.append(optionElement);
|
||||
}
|
||||
modalElement.querySelector("#form--lotCreate").addEventListener("submit", createLotAndSelect);
|
||||
;
|
||||
modalElement.querySelector('#form--lotCreate').addEventListener('submit', createLotAndSelect);
|
||||
},
|
||||
onremoved: () => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
}
|
||||
});
|
||||
});
|
||||
document.querySelector(".is-lot-view-button").addEventListener("click", () => {
|
||||
const lotId = document.querySelector("#lotOccupancy--lotId").value;
|
||||
document
|
||||
.querySelector('.is-lot-view-button')
|
||||
.addEventListener('click', () => {
|
||||
const lotId = document.querySelector('#lotOccupancy--lotId').value;
|
||||
if (lotId) {
|
||||
window.open(los.urlPrefix + "/lots/" + lotId);
|
||||
window.open(los.urlPrefix + '/lots/' + lotId);
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
message: `No ${los.escapedAliases.lot} selected.`,
|
||||
contextualColorName: "info"
|
||||
contextualColorName: 'info'
|
||||
});
|
||||
}
|
||||
});
|
||||
document.querySelector(".is-clear-lot-button").addEventListener("click", () => {
|
||||
document
|
||||
.querySelector('.is-clear-lot-button')
|
||||
.addEventListener('click', () => {
|
||||
if (lotNameElement.disabled) {
|
||||
bulmaJS.alert({
|
||||
message: "You need to unlock the field before clearing it.",
|
||||
contextualColorName: "info"
|
||||
message: 'You need to unlock the field before clearing it.',
|
||||
contextualColorName: 'info'
|
||||
});
|
||||
}
|
||||
else {
|
||||
lotNameElement.value = `(No ${los.escapedAliases.Lot})`;
|
||||
document.querySelector("#lotOccupancy--lotId").value = "";
|
||||
document.querySelector('#lotOccupancy--lotId').value = '';
|
||||
los.setUnsavedChanges();
|
||||
}
|
||||
});
|
||||
// Start Date
|
||||
los.initializeDatePickers(formElement);
|
||||
document.querySelector("#lotOccupancy--occupancyStartDateString").addEventListener("change", () => {
|
||||
const endDatePicker = document.querySelector("#lotOccupancy--occupancyEndDateString").bulmaCalendar.datePicker;
|
||||
endDatePicker.min = document.querySelector("#lotOccupancy--occupancyStartDateString").value;
|
||||
document
|
||||
.querySelector('#lotOccupancy--occupancyStartDateString')
|
||||
.addEventListener('change', () => {
|
||||
const endDatePicker = document.querySelector('#lotOccupancy--occupancyEndDateString').bulmaCalendar.datePicker;
|
||||
endDatePicker.min = document.querySelector('#lotOccupancy--occupancyStartDateString').value;
|
||||
endDatePicker.refresh();
|
||||
});
|
||||
los.initializeUnlockFieldButtons(formElement);
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -4,15 +4,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
let lotOccupancyComments = exports.lotOccupancyComments;
|
||||
delete exports.lotOccupancyComments;
|
||||
const openEditLotOccupancyComment = (clickEvent) => {
|
||||
const lotOccupancyCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.lotOccupancyCommentId, 10);
|
||||
const lotOccupancyCommentId = Number.parseInt(clickEvent.currentTarget.closest('tr').dataset
|
||||
.lotOccupancyCommentId, 10);
|
||||
const lotOccupancyComment = lotOccupancyComments.find((currentLotOccupancyComment) => {
|
||||
return currentLotOccupancyComment.lotOccupancyCommentId === lotOccupancyCommentId;
|
||||
return (currentLotOccupancyComment.lotOccupancyCommentId ===
|
||||
lotOccupancyCommentId);
|
||||
});
|
||||
let editFormElement;
|
||||
let editCloseModalFunction;
|
||||
const editComment = (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doUpdateLotOccupancyComment", editFormElement, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doUpdateLotOccupancyComment', editFormElement, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupancyComments = responseJSON.lotOccupancyComments;
|
||||
editCloseModalFunction();
|
||||
|
|
@ -20,20 +22,20 @@ const openEditLotOccupancyComment = (clickEvent) => {
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating Comment",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Updating Comment',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
cityssm.openHtmlModal("lotOccupancy-editComment", {
|
||||
cityssm.openHtmlModal('lotOccupancy-editComment', {
|
||||
onshow: (modalElement) => {
|
||||
los.populateAliases(modalElement);
|
||||
modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyId").value = lotOccupancyId;
|
||||
modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentId").value = lotOccupancyCommentId.toString();
|
||||
modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyComment").value = lotOccupancyComment.lotOccupancyComment;
|
||||
const lotOccupancyCommentDateStringElement = modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentDateString");
|
||||
modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyId').value = lotOccupancyId;
|
||||
modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyCommentId').value = lotOccupancyCommentId.toString();
|
||||
modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyComment').value = lotOccupancyComment.lotOccupancyComment;
|
||||
const lotOccupancyCommentDateStringElement = modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyCommentDateString');
|
||||
lotOccupancyCommentDateStringElement.value =
|
||||
lotOccupancyComment.lotOccupancyCommentDateString;
|
||||
const currentDateString = cityssm.dateToString(new Date());
|
||||
|
|
@ -41,15 +43,14 @@ const openEditLotOccupancyComment = (clickEvent) => {
|
|||
lotOccupancyComment.lotOccupancyCommentDateString <= currentDateString
|
||||
? currentDateString
|
||||
: lotOccupancyComment.lotOccupancyCommentDateString;
|
||||
modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentTimeString").value = lotOccupancyComment.lotOccupancyCommentTimeString;
|
||||
modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyCommentTimeString').value = lotOccupancyComment.lotOccupancyCommentTimeString;
|
||||
},
|
||||
onshown: (modalElement, closeModalFunction) => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
los.initializeDatePickers(modalElement);
|
||||
// los.initializeTimePickers(modalElement);
|
||||
modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyComment").focus();
|
||||
editFormElement = modalElement.querySelector("form");
|
||||
editFormElement.addEventListener("submit", editComment);
|
||||
modalElement.querySelector('#lotOccupancyCommentEdit--lotOccupancyComment').focus();
|
||||
editFormElement = modalElement.querySelector('form');
|
||||
editFormElement.addEventListener('submit', editComment);
|
||||
editCloseModalFunction = closeModalFunction;
|
||||
},
|
||||
onremoved: () => {
|
||||
|
|
@ -58,9 +59,10 @@ const openEditLotOccupancyComment = (clickEvent) => {
|
|||
});
|
||||
};
|
||||
const deleteLotOccupancyComment = (clickEvent) => {
|
||||
const lotOccupancyCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.lotOccupancyCommentId, 10);
|
||||
const lotOccupancyCommentId = Number.parseInt(clickEvent.currentTarget.closest('tr').dataset
|
||||
.lotOccupancyCommentId, 10);
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyComment", {
|
||||
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyComment', {
|
||||
lotOccupancyId,
|
||||
lotOccupancyCommentId
|
||||
}, (responseJSON) => {
|
||||
|
|
@ -70,87 +72,87 @@ const deleteLotOccupancyComment = (clickEvent) => {
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Removing Comment",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Removing Comment',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
bulmaJS.confirm({
|
||||
title: "Remove Comment?",
|
||||
message: "Are you sure you want to remove this comment?",
|
||||
title: 'Remove Comment?',
|
||||
message: 'Are you sure you want to remove this comment?',
|
||||
okButton: {
|
||||
text: "Yes, Remove Comment",
|
||||
text: 'Yes, Remove Comment',
|
||||
callbackFunction: doDelete
|
||||
},
|
||||
contextualColorName: "warning"
|
||||
contextualColorName: 'warning'
|
||||
});
|
||||
};
|
||||
const renderLotOccupancyComments = () => {
|
||||
const containerElement = document.querySelector("#container--lotOccupancyComments");
|
||||
const containerElement = document.querySelector('#container--lotOccupancyComments');
|
||||
if (lotOccupancyComments.length === 0) {
|
||||
containerElement.innerHTML =
|
||||
'<div class="message is-info">' +
|
||||
'<p class="message-body">There are no comments associated with this record.</p>' +
|
||||
"</div>";
|
||||
'</div>';
|
||||
return;
|
||||
}
|
||||
const tableElement = document.createElement("table");
|
||||
tableElement.className = "table is-fullwidth is-striped is-hoverable";
|
||||
const tableElement = document.createElement('table');
|
||||
tableElement.className = 'table is-fullwidth is-striped is-hoverable';
|
||||
tableElement.innerHTML =
|
||||
"<thead><tr>" +
|
||||
"<th>Commentor</th>" +
|
||||
"<th>Comment Date</th>" +
|
||||
"<th>Comment</th>" +
|
||||
'<thead><tr>' +
|
||||
'<th>Commentor</th>' +
|
||||
'<th>Comment Date</th>' +
|
||||
'<th>Comment</th>' +
|
||||
'<th class="is-hidden-print"><span class="is-sr-only">Options</span></th>' +
|
||||
"</tr></thead>" +
|
||||
"<tbody></tbody>";
|
||||
'</tr></thead>' +
|
||||
'<tbody></tbody>';
|
||||
for (const lotOccupancyComment of lotOccupancyComments) {
|
||||
const tableRowElement = document.createElement("tr");
|
||||
const tableRowElement = document.createElement('tr');
|
||||
tableRowElement.dataset.lotOccupancyCommentId =
|
||||
lotOccupancyComment.lotOccupancyCommentId.toString();
|
||||
tableRowElement.innerHTML =
|
||||
"<td>" +
|
||||
cityssm.escapeHTML(lotOccupancyComment.recordCreate_userName || "") +
|
||||
"</td>" +
|
||||
"<td>" +
|
||||
'<td>' +
|
||||
cityssm.escapeHTML(lotOccupancyComment.recordCreate_userName || '') +
|
||||
'</td>' +
|
||||
'<td>' +
|
||||
lotOccupancyComment.lotOccupancyCommentDateString +
|
||||
(lotOccupancyComment.lotOccupancyCommentTime === 0
|
||||
? ""
|
||||
: " " + lotOccupancyComment.lotOccupancyCommentTimeString) +
|
||||
"</td>" +
|
||||
"<td>" +
|
||||
cityssm.escapeHTML(lotOccupancyComment.lotOccupancyComment || "") +
|
||||
"</td>" +
|
||||
? ''
|
||||
: ' ' + lotOccupancyComment.lotOccupancyCommentTimeString) +
|
||||
'</td>' +
|
||||
'<td>' +
|
||||
cityssm.escapeHTML(lotOccupancyComment.lotOccupancyComment || '') +
|
||||
'</td>' +
|
||||
('<td class="is-hidden-print">' +
|
||||
'<div class="buttons are-small is-justify-content-end">' +
|
||||
('<button class="button is-primary button--edit" type="button">' +
|
||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||
" <span>Edit</span>" +
|
||||
"</button>") +
|
||||
' <span>Edit</span>' +
|
||||
'</button>') +
|
||||
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
"</button>") +
|
||||
"</div>" +
|
||||
"</td>");
|
||||
'</button>') +
|
||||
'</div>' +
|
||||
'</td>');
|
||||
tableRowElement
|
||||
.querySelector(".button--edit")
|
||||
.addEventListener("click", openEditLotOccupancyComment);
|
||||
.querySelector('.button--edit')
|
||||
.addEventListener('click', openEditLotOccupancyComment);
|
||||
tableRowElement
|
||||
.querySelector(".button--delete")
|
||||
.addEventListener("click", deleteLotOccupancyComment);
|
||||
tableElement.querySelector("tbody").append(tableRowElement);
|
||||
.querySelector('.button--delete')
|
||||
.addEventListener('click', deleteLotOccupancyComment);
|
||||
tableElement.querySelector('tbody').append(tableRowElement);
|
||||
}
|
||||
containerElement.innerHTML = "";
|
||||
containerElement.innerHTML = '';
|
||||
containerElement.append(tableElement);
|
||||
};
|
||||
document.querySelector("#button--addComment").addEventListener("click", () => {
|
||||
document.querySelector('#button--addComment').addEventListener('click', () => {
|
||||
let addFormElement;
|
||||
let addCloseModalFunction;
|
||||
const addComment = (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doAddLotOccupancyComment", addFormElement, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doAddLotOccupancyComment', addFormElement, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupancyComments = responseJSON.lotOccupancyComments;
|
||||
addCloseModalFunction();
|
||||
|
|
@ -158,23 +160,23 @@ document.querySelector("#button--addComment").addEventListener("click", () => {
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Adding Comment",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Adding Comment',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
cityssm.openHtmlModal("lotOccupancy-addComment", {
|
||||
cityssm.openHtmlModal('lotOccupancy-addComment', {
|
||||
onshow: (modalElement) => {
|
||||
los.populateAliases(modalElement);
|
||||
modalElement.querySelector("#lotOccupancyCommentAdd--lotOccupancyId").value = lotOccupancyId;
|
||||
modalElement.querySelector('#lotOccupancyCommentAdd--lotOccupancyId').value = lotOccupancyId;
|
||||
},
|
||||
onshown: (modalElement, closeModalFunction) => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
modalElement.querySelector("#lotOccupancyCommentAdd--lotOccupancyComment").focus();
|
||||
addFormElement = modalElement.querySelector("form");
|
||||
addFormElement.addEventListener("submit", addComment);
|
||||
modalElement.querySelector('#lotOccupancyCommentAdd--lotOccupancyComment').focus();
|
||||
addFormElement = modalElement.querySelector('form');
|
||||
addFormElement.addEventListener('submit', addComment);
|
||||
addCloseModalFunction = closeModalFunction;
|
||||
},
|
||||
onremoved: () => {
|
||||
|
|
|
|||
|
|
@ -1,295 +1,303 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
|
||||
import type * as globalTypes from "../../types/globalTypes";
|
||||
import type * as recordTypes from "../../types/recordTypes";
|
||||
import type * as globalTypes from '../../types/globalTypes'
|
||||
import type * as recordTypes from '../../types/recordTypes'
|
||||
|
||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||
|
||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
||||
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||
|
||||
declare const cityssm: cityssmGlobal;
|
||||
declare const bulmaJS: BulmaJS;
|
||||
declare const cityssm: cityssmGlobal
|
||||
declare const bulmaJS: BulmaJS
|
||||
|
||||
declare const los: globalTypes.LOS;
|
||||
declare const los: globalTypes.LOS
|
||||
|
||||
declare const lotOccupancyId: string;
|
||||
declare const lotOccupancyId: string
|
||||
|
||||
let lotOccupancyComments: recordTypes.LotOccupancyComment[] = exports.lotOccupancyComments;
|
||||
delete exports.lotOccupancyComments;
|
||||
let lotOccupancyComments: recordTypes.LotOccupancyComment[] =
|
||||
exports.lotOccupancyComments
|
||||
delete exports.lotOccupancyComments
|
||||
|
||||
const openEditLotOccupancyComment = (clickEvent: Event) => {
|
||||
const lotOccupancyCommentId = Number.parseInt(
|
||||
(clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.lotOccupancyCommentId!,
|
||||
10
|
||||
);
|
||||
const lotOccupancyCommentId = Number.parseInt(
|
||||
(clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset
|
||||
.lotOccupancyCommentId!,
|
||||
10
|
||||
)
|
||||
|
||||
const lotOccupancyComment = lotOccupancyComments.find((currentLotOccupancyComment) => {
|
||||
return currentLotOccupancyComment.lotOccupancyCommentId === lotOccupancyCommentId;
|
||||
})!;
|
||||
const lotOccupancyComment = lotOccupancyComments.find(
|
||||
(currentLotOccupancyComment) => {
|
||||
return (
|
||||
currentLotOccupancyComment.lotOccupancyCommentId ===
|
||||
lotOccupancyCommentId
|
||||
)
|
||||
}
|
||||
)!
|
||||
|
||||
let editFormElement: HTMLFormElement;
|
||||
let editCloseModalFunction: () => void;
|
||||
let editFormElement: HTMLFormElement
|
||||
let editCloseModalFunction: () => void
|
||||
|
||||
const editComment = (submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
const editComment = (submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lotOccupancies/doUpdateLotOccupancyComment",
|
||||
editFormElement,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotOccupancyComments?: recordTypes.LotOccupancyComment[];
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupancyComments = responseJSON.lotOccupancyComments!;
|
||||
editCloseModalFunction();
|
||||
renderLotOccupancyComments();
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating Comment",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
cityssm.openHtmlModal("lotOccupancy-editComment", {
|
||||
onshow: (modalElement) => {
|
||||
los.populateAliases(modalElement);
|
||||
|
||||
(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyCommentEdit--lotOccupancyId"
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupancyId;
|
||||
(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyCommentEdit--lotOccupancyCommentId"
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupancyCommentId.toString();
|
||||
|
||||
(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyCommentEdit--lotOccupancyComment"
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupancyComment.lotOccupancyComment!;
|
||||
|
||||
const lotOccupancyCommentDateStringElement = modalElement.querySelector(
|
||||
"#lotOccupancyCommentEdit--lotOccupancyCommentDateString"
|
||||
) as HTMLInputElement;
|
||||
|
||||
lotOccupancyCommentDateStringElement.value =
|
||||
lotOccupancyComment.lotOccupancyCommentDateString!;
|
||||
|
||||
const currentDateString = cityssm.dateToString(new Date());
|
||||
|
||||
lotOccupancyCommentDateStringElement.max =
|
||||
lotOccupancyComment.lotOccupancyCommentDateString! <= currentDateString
|
||||
? currentDateString
|
||||
: lotOccupancyComment.lotOccupancyCommentDateString!;
|
||||
|
||||
(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyCommentEdit--lotOccupancyCommentTimeString"
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupancyComment.lotOccupancyCommentTimeString!;
|
||||
},
|
||||
onshown: (modalElement, closeModalFunction) => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
|
||||
los.initializeDatePickers(modalElement);
|
||||
// los.initializeTimePickers(modalElement);
|
||||
|
||||
(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyCommentEdit--lotOccupancyComment"
|
||||
) as HTMLTextAreaElement
|
||||
).focus();
|
||||
|
||||
editFormElement = modalElement.querySelector("form")!;
|
||||
editFormElement.addEventListener("submit", editComment);
|
||||
|
||||
editCloseModalFunction = closeModalFunction;
|
||||
},
|
||||
onremoved: () => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/lotOccupancies/doUpdateLotOccupancyComment',
|
||||
editFormElement,
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotOccupancyComments?: recordTypes.LotOccupancyComment[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupancyComments = responseJSON.lotOccupancyComments!
|
||||
editCloseModalFunction()
|
||||
renderLotOccupancyComments()
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: 'Error Updating Comment',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
});
|
||||
};
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
cityssm.openHtmlModal('lotOccupancy-editComment', {
|
||||
onshow: (modalElement) => {
|
||||
los.populateAliases(modalElement)
|
||||
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotOccupancyCommentEdit--lotOccupancyId'
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupancyId
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotOccupancyCommentEdit--lotOccupancyCommentId'
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupancyCommentId.toString()
|
||||
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotOccupancyCommentEdit--lotOccupancyComment'
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupancyComment.lotOccupancyComment!
|
||||
|
||||
const lotOccupancyCommentDateStringElement = modalElement.querySelector(
|
||||
'#lotOccupancyCommentEdit--lotOccupancyCommentDateString'
|
||||
) as HTMLInputElement
|
||||
|
||||
lotOccupancyCommentDateStringElement.value =
|
||||
lotOccupancyComment.lotOccupancyCommentDateString!
|
||||
|
||||
const currentDateString = cityssm.dateToString(new Date())
|
||||
|
||||
lotOccupancyCommentDateStringElement.max =
|
||||
lotOccupancyComment.lotOccupancyCommentDateString! <= currentDateString
|
||||
? currentDateString
|
||||
: lotOccupancyComment.lotOccupancyCommentDateString!
|
||||
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotOccupancyCommentEdit--lotOccupancyCommentTimeString'
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupancyComment.lotOccupancyCommentTimeString!
|
||||
},
|
||||
onshown: (modalElement, closeModalFunction) => {
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
|
||||
los.initializeDatePickers(modalElement)
|
||||
// los.initializeTimePickers(modalElement);
|
||||
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotOccupancyCommentEdit--lotOccupancyComment'
|
||||
) as HTMLTextAreaElement
|
||||
).focus()
|
||||
|
||||
editFormElement = modalElement.querySelector('form')!
|
||||
editFormElement.addEventListener('submit', editComment)
|
||||
|
||||
editCloseModalFunction = closeModalFunction
|
||||
},
|
||||
onremoved: () => {
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const deleteLotOccupancyComment = (clickEvent: Event) => {
|
||||
const lotOccupancyCommentId = Number.parseInt(
|
||||
(clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.lotOccupancyCommentId!,
|
||||
10
|
||||
);
|
||||
const lotOccupancyCommentId = Number.parseInt(
|
||||
(clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset
|
||||
.lotOccupancyCommentId!,
|
||||
10
|
||||
)
|
||||
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyComment",
|
||||
{
|
||||
lotOccupancyId,
|
||||
lotOccupancyCommentId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotOccupancyComments: recordTypes.LotOccupancyComment[];
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupancyComments = responseJSON.lotOccupancyComments;
|
||||
renderLotOccupancyComments();
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Removing Comment",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyComment',
|
||||
{
|
||||
lotOccupancyId,
|
||||
lotOccupancyCommentId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotOccupancyComments: recordTypes.LotOccupancyComment[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupancyComments = responseJSON.lotOccupancyComments
|
||||
renderLotOccupancyComments()
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: 'Error Removing Comment',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
bulmaJS.confirm({
|
||||
title: "Remove Comment?",
|
||||
message: "Are you sure you want to remove this comment?",
|
||||
okButton: {
|
||||
text: "Yes, Remove Comment",
|
||||
callbackFunction: doDelete
|
||||
},
|
||||
contextualColorName: "warning"
|
||||
});
|
||||
};
|
||||
bulmaJS.confirm({
|
||||
title: 'Remove Comment?',
|
||||
message: 'Are you sure you want to remove this comment?',
|
||||
okButton: {
|
||||
text: 'Yes, Remove Comment',
|
||||
callbackFunction: doDelete
|
||||
},
|
||||
contextualColorName: 'warning'
|
||||
})
|
||||
}
|
||||
|
||||
const renderLotOccupancyComments = () => {
|
||||
const containerElement = document.querySelector(
|
||||
"#container--lotOccupancyComments"
|
||||
) as HTMLElement;
|
||||
const containerElement = document.querySelector(
|
||||
'#container--lotOccupancyComments'
|
||||
) as HTMLElement
|
||||
|
||||
if (lotOccupancyComments.length === 0) {
|
||||
containerElement.innerHTML =
|
||||
'<div class="message is-info">' +
|
||||
'<p class="message-body">There are no comments associated with this record.</p>' +
|
||||
"</div>";
|
||||
return;
|
||||
}
|
||||
if (lotOccupancyComments.length === 0) {
|
||||
containerElement.innerHTML =
|
||||
'<div class="message is-info">' +
|
||||
'<p class="message-body">There are no comments associated with this record.</p>' +
|
||||
'</div>'
|
||||
return
|
||||
}
|
||||
|
||||
const tableElement = document.createElement("table");
|
||||
tableElement.className = "table is-fullwidth is-striped is-hoverable";
|
||||
tableElement.innerHTML =
|
||||
"<thead><tr>" +
|
||||
"<th>Commentor</th>" +
|
||||
"<th>Comment Date</th>" +
|
||||
"<th>Comment</th>" +
|
||||
'<th class="is-hidden-print"><span class="is-sr-only">Options</span></th>' +
|
||||
"</tr></thead>" +
|
||||
"<tbody></tbody>";
|
||||
const tableElement = document.createElement('table')
|
||||
tableElement.className = 'table is-fullwidth is-striped is-hoverable'
|
||||
tableElement.innerHTML =
|
||||
'<thead><tr>' +
|
||||
'<th>Commentor</th>' +
|
||||
'<th>Comment Date</th>' +
|
||||
'<th>Comment</th>' +
|
||||
'<th class="is-hidden-print"><span class="is-sr-only">Options</span></th>' +
|
||||
'</tr></thead>' +
|
||||
'<tbody></tbody>'
|
||||
|
||||
for (const lotOccupancyComment of lotOccupancyComments) {
|
||||
const tableRowElement = document.createElement("tr");
|
||||
tableRowElement.dataset.lotOccupancyCommentId =
|
||||
lotOccupancyComment.lotOccupancyCommentId!.toString();
|
||||
for (const lotOccupancyComment of lotOccupancyComments) {
|
||||
const tableRowElement = document.createElement('tr')
|
||||
tableRowElement.dataset.lotOccupancyCommentId =
|
||||
lotOccupancyComment.lotOccupancyCommentId!.toString()
|
||||
|
||||
tableRowElement.innerHTML =
|
||||
"<td>" +
|
||||
cityssm.escapeHTML(lotOccupancyComment.recordCreate_userName || "") +
|
||||
"</td>" +
|
||||
"<td>" +
|
||||
lotOccupancyComment.lotOccupancyCommentDateString +
|
||||
(lotOccupancyComment.lotOccupancyCommentTime === 0
|
||||
? ""
|
||||
: " " + lotOccupancyComment.lotOccupancyCommentTimeString) +
|
||||
"</td>" +
|
||||
"<td>" +
|
||||
cityssm.escapeHTML(lotOccupancyComment.lotOccupancyComment || "") +
|
||||
"</td>" +
|
||||
('<td class="is-hidden-print">' +
|
||||
'<div class="buttons are-small is-justify-content-end">' +
|
||||
('<button class="button is-primary button--edit" type="button">' +
|
||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||
" <span>Edit</span>" +
|
||||
"</button>") +
|
||||
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
"</button>") +
|
||||
"</div>" +
|
||||
"</td>");
|
||||
tableRowElement.innerHTML =
|
||||
'<td>' +
|
||||
cityssm.escapeHTML(lotOccupancyComment.recordCreate_userName || '') +
|
||||
'</td>' +
|
||||
'<td>' +
|
||||
lotOccupancyComment.lotOccupancyCommentDateString +
|
||||
(lotOccupancyComment.lotOccupancyCommentTime === 0
|
||||
? ''
|
||||
: ' ' + lotOccupancyComment.lotOccupancyCommentTimeString) +
|
||||
'</td>' +
|
||||
'<td>' +
|
||||
cityssm.escapeHTML(lotOccupancyComment.lotOccupancyComment || '') +
|
||||
'</td>' +
|
||||
('<td class="is-hidden-print">' +
|
||||
'<div class="buttons are-small is-justify-content-end">' +
|
||||
('<button class="button is-primary button--edit" type="button">' +
|
||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||
' <span>Edit</span>' +
|
||||
'</button>') +
|
||||
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
'</button>') +
|
||||
'</div>' +
|
||||
'</td>')
|
||||
|
||||
tableRowElement
|
||||
.querySelector(".button--edit")!
|
||||
.addEventListener("click", openEditLotOccupancyComment);
|
||||
tableRowElement
|
||||
.querySelector('.button--edit')!
|
||||
.addEventListener('click', openEditLotOccupancyComment)
|
||||
|
||||
tableRowElement
|
||||
.querySelector(".button--delete")!
|
||||
.addEventListener("click", deleteLotOccupancyComment);
|
||||
tableRowElement
|
||||
.querySelector('.button--delete')!
|
||||
.addEventListener('click', deleteLotOccupancyComment)
|
||||
|
||||
tableElement.querySelector("tbody")!.append(tableRowElement);
|
||||
}
|
||||
tableElement.querySelector('tbody')!.append(tableRowElement)
|
||||
}
|
||||
|
||||
containerElement.innerHTML = "";
|
||||
containerElement.append(tableElement);
|
||||
};
|
||||
containerElement.innerHTML = ''
|
||||
containerElement.append(tableElement)
|
||||
}
|
||||
|
||||
document.querySelector("#button--addComment")!.addEventListener("click", () => {
|
||||
let addFormElement: HTMLFormElement;
|
||||
let addCloseModalFunction: () => void;
|
||||
document.querySelector('#button--addComment')!.addEventListener('click', () => {
|
||||
let addFormElement: HTMLFormElement
|
||||
let addCloseModalFunction: () => void
|
||||
|
||||
const addComment = (submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
const addComment = (submitEvent: SubmitEvent) => {
|
||||
submitEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lotOccupancies/doAddLotOccupancyComment",
|
||||
addFormElement,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
lotOccupancyComments?: recordTypes.LotOccupancyComment[];
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupancyComments = responseJSON.lotOccupancyComments!;
|
||||
addCloseModalFunction();
|
||||
renderLotOccupancyComments();
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Adding Comment",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
cityssm.openHtmlModal("lotOccupancy-addComment", {
|
||||
onshow: (modalElement) => {
|
||||
los.populateAliases(modalElement);
|
||||
|
||||
(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyCommentAdd--lotOccupancyId"
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupancyId;
|
||||
},
|
||||
onshown: (modalElement, closeModalFunction) => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
|
||||
(
|
||||
modalElement.querySelector(
|
||||
"#lotOccupancyCommentAdd--lotOccupancyComment"
|
||||
) as HTMLTextAreaElement
|
||||
).focus();
|
||||
|
||||
addFormElement = modalElement.querySelector("form")!;
|
||||
addFormElement.addEventListener("submit", addComment);
|
||||
|
||||
addCloseModalFunction = closeModalFunction;
|
||||
},
|
||||
onremoved: () => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/lotOccupancies/doAddLotOccupancyComment',
|
||||
addFormElement,
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
lotOccupancyComments?: recordTypes.LotOccupancyComment[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupancyComments = responseJSON.lotOccupancyComments!
|
||||
addCloseModalFunction()
|
||||
renderLotOccupancyComments()
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: 'Error Adding Comment',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
renderLotOccupancyComments();
|
||||
cityssm.openHtmlModal('lotOccupancy-addComment', {
|
||||
onshow: (modalElement) => {
|
||||
los.populateAliases(modalElement)
|
||||
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotOccupancyCommentAdd--lotOccupancyId'
|
||||
) as HTMLInputElement
|
||||
).value = lotOccupancyId
|
||||
},
|
||||
onshown: (modalElement, closeModalFunction) => {
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#lotOccupancyCommentAdd--lotOccupancyComment'
|
||||
) as HTMLTextAreaElement
|
||||
).focus()
|
||||
|
||||
addFormElement = modalElement.querySelector('form')!
|
||||
addFormElement.addEventListener('submit', addComment)
|
||||
|
||||
addCloseModalFunction = closeModalFunction
|
||||
},
|
||||
onremoved: () => {
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
renderLotOccupancyComments()
|
||||
|
|
|
|||
|
|
@ -3,19 +3,20 @@
|
|||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
let lotOccupancyFees = exports.lotOccupancyFees;
|
||||
delete exports.lotOccupancyFees;
|
||||
const lotOccupancyFeesContainerElement = document.querySelector("#container--lotOccupancyFees");
|
||||
const lotOccupancyFeesContainerElement = document.querySelector('#container--lotOccupancyFees');
|
||||
const getFeeGrandTotal = () => {
|
||||
let feeGrandTotal = 0;
|
||||
for (const lotOccupancyFee of lotOccupancyFees) {
|
||||
feeGrandTotal +=
|
||||
(lotOccupancyFee.feeAmount + lotOccupancyFee.taxAmount) * lotOccupancyFee.quantity;
|
||||
(lotOccupancyFee.feeAmount + lotOccupancyFee.taxAmount) *
|
||||
lotOccupancyFee.quantity;
|
||||
}
|
||||
return feeGrandTotal;
|
||||
};
|
||||
const deleteLotOccupancyFee = (clickEvent) => {
|
||||
const feeId = clickEvent.currentTarget.closest(".container--lotOccupancyFee").dataset.feeId;
|
||||
const feeId = clickEvent.currentTarget.closest('.container--lotOccupancyFee').dataset.feeId;
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyFee", {
|
||||
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyFee', {
|
||||
lotOccupancyId,
|
||||
feeId
|
||||
}, (responseJSON) => {
|
||||
|
|
@ -25,19 +26,19 @@ const deleteLotOccupancyFee = (clickEvent) => {
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Deleting Fee",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Deleting Fee',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
bulmaJS.confirm({
|
||||
title: "Delete Fee",
|
||||
message: "Are you sure you want to delete this fee?",
|
||||
contextualColorName: "warning",
|
||||
title: 'Delete Fee',
|
||||
message: 'Are you sure you want to delete this fee?',
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: "Yes, Delete Fee",
|
||||
text: 'Yes, Delete Fee',
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
});
|
||||
|
|
@ -47,74 +48,81 @@ const renderLotOccupancyFees = () => {
|
|||
lotOccupancyFeesContainerElement.innerHTML =
|
||||
'<div class="message is-info">' +
|
||||
'<p class="message-body">There are no fees associated with this record.</p>' +
|
||||
"</div>";
|
||||
'</div>';
|
||||
renderLotOccupancyTransactions();
|
||||
return;
|
||||
}
|
||||
lotOccupancyFeesContainerElement.innerHTML =
|
||||
'<table class="table is-fullwidth is-striped is-hoverable">' +
|
||||
("<thead><tr>" +
|
||||
"<th>Fee</th>" +
|
||||
('<thead><tr>' +
|
||||
'<th>Fee</th>' +
|
||||
'<th><span class="is-sr-only">Unit Cost</span></th>' +
|
||||
'<th class="has-width-1"><span class="is-sr-only">×</span></th>' +
|
||||
'<th class="has-width-1"><span class="is-sr-only">Quantity</span></th>' +
|
||||
'<th class="has-width-1"><span class="is-sr-only">equals</span></th>' +
|
||||
'<th class="has-width-1 has-text-right">Total</th>' +
|
||||
'<th class="has-width-1 is-hidden-print"><span class="is-sr-only">Options</span></th>' +
|
||||
"</tr></thead>") +
|
||||
"<tbody></tbody>" +
|
||||
("<tfoot>" +
|
||||
'</tr></thead>') +
|
||||
'<tbody></tbody>' +
|
||||
('<tfoot>' +
|
||||
'<tr><th colspan="5">Subtotal</th><td class="has-text-weight-bold has-text-right" id="lotOccupancyFees--feeAmountTotal"></td><td class="is-hidden-print"></td></tr>' +
|
||||
'<tr><th colspan="5">Tax</th><td class="has-text-right" id="lotOccupancyFees--taxAmountTotal"></td><td class="is-hidden-print"></td></tr>' +
|
||||
'<tr><th colspan="5">Grand Total</th><td class="has-text-weight-bold has-text-right" id="lotOccupancyFees--grandTotal"></td><td class="is-hidden-print"></td></tr>' +
|
||||
"</tfoot>") +
|
||||
"</table>";
|
||||
'</tfoot>') +
|
||||
'</table>';
|
||||
let feeAmountTotal = 0;
|
||||
let taxAmountTotal = 0;
|
||||
for (const lotOccupancyFee of lotOccupancyFees) {
|
||||
const tableRowElement = document.createElement("tr");
|
||||
tableRowElement.className = "container--lotOccupancyFee";
|
||||
const tableRowElement = document.createElement('tr');
|
||||
tableRowElement.className = 'container--lotOccupancyFee';
|
||||
tableRowElement.dataset.feeId = lotOccupancyFee.feeId.toString();
|
||||
tableRowElement.dataset.includeQuantity = lotOccupancyFee.includeQuantity ? "1" : "0";
|
||||
tableRowElement.dataset.includeQuantity = lotOccupancyFee.includeQuantity
|
||||
? '1'
|
||||
: '0';
|
||||
tableRowElement.innerHTML =
|
||||
'<td colspan="' +
|
||||
(lotOccupancyFee.quantity === 1 ? "5" : "1") +
|
||||
(lotOccupancyFee.quantity === 1 ? '5' : '1') +
|
||||
'">' +
|
||||
cityssm.escapeHTML(lotOccupancyFee.feeName || "") +
|
||||
"</td>" +
|
||||
cityssm.escapeHTML(lotOccupancyFee.feeName || '') +
|
||||
'</td>' +
|
||||
(lotOccupancyFee.quantity === 1
|
||||
? ""
|
||||
? ''
|
||||
: '<td class="has-text-right">$' +
|
||||
lotOccupancyFee.feeAmount.toFixed(2) +
|
||||
"</td>" +
|
||||
"<td>×</td>" +
|
||||
'</td>' +
|
||||
'<td>×</td>' +
|
||||
'<td class="has-text-right">' +
|
||||
lotOccupancyFee.quantity +
|
||||
"</td>" +
|
||||
"<td>=</td>") +
|
||||
'</td>' +
|
||||
'<td>=</td>') +
|
||||
'<td class="has-text-right">$' +
|
||||
(lotOccupancyFee.feeAmount * lotOccupancyFee.quantity).toFixed(2) +
|
||||
"</td>" +
|
||||
'</td>' +
|
||||
('<td class="is-hidden-print">' +
|
||||
'<button class="button is-small is-danger is-light" data-tooltip="Delete Fee" type="button">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
"</button>" +
|
||||
"</td>");
|
||||
tableRowElement.querySelector("button").addEventListener("click", deleteLotOccupancyFee);
|
||||
lotOccupancyFeesContainerElement.querySelector("tbody").append(tableRowElement);
|
||||
'</button>' +
|
||||
'</td>');
|
||||
tableRowElement
|
||||
.querySelector('button')
|
||||
.addEventListener('click', deleteLotOccupancyFee);
|
||||
lotOccupancyFeesContainerElement
|
||||
.querySelector('tbody')
|
||||
.append(tableRowElement);
|
||||
feeAmountTotal += lotOccupancyFee.feeAmount * lotOccupancyFee.quantity;
|
||||
taxAmountTotal += lotOccupancyFee.taxAmount * lotOccupancyFee.quantity;
|
||||
}
|
||||
lotOccupancyFeesContainerElement.querySelector("#lotOccupancyFees--feeAmountTotal").textContent = "$" + feeAmountTotal.toFixed(2);
|
||||
lotOccupancyFeesContainerElement.querySelector("#lotOccupancyFees--taxAmountTotal").textContent = "$" + taxAmountTotal.toFixed(2);
|
||||
lotOccupancyFeesContainerElement.querySelector("#lotOccupancyFees--grandTotal").textContent = "$" + (feeAmountTotal + taxAmountTotal).toFixed(2);
|
||||
;
|
||||
lotOccupancyFeesContainerElement.querySelector('#lotOccupancyFees--feeAmountTotal').textContent = '$' + feeAmountTotal.toFixed(2);
|
||||
lotOccupancyFeesContainerElement.querySelector('#lotOccupancyFees--taxAmountTotal').textContent = '$' + taxAmountTotal.toFixed(2);
|
||||
lotOccupancyFeesContainerElement.querySelector('#lotOccupancyFees--grandTotal').textContent = '$' + (feeAmountTotal + taxAmountTotal).toFixed(2);
|
||||
renderLotOccupancyTransactions();
|
||||
};
|
||||
document.querySelector("#button--addFee").addEventListener("click", () => {
|
||||
document.querySelector('#button--addFee').addEventListener('click', () => {
|
||||
if (hasUnsavedChanges) {
|
||||
bulmaJS.alert({
|
||||
message: "Please save all unsaved changes before adding fees.",
|
||||
contextualColorName: "warning"
|
||||
message: 'Please save all unsaved changes before adding fees.',
|
||||
contextualColorName: 'warning'
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
|
@ -122,7 +130,7 @@ document.querySelector("#button--addFee").addEventListener("click", () => {
|
|||
let feeFilterElement;
|
||||
let feeFilterResultsElement;
|
||||
const doAddFee = (feeId, quantity = 1) => {
|
||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doAddLotOccupancyFee", {
|
||||
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doAddLotOccupancyFee', {
|
||||
lotOccupancyId,
|
||||
feeId,
|
||||
quantity
|
||||
|
|
@ -134,9 +142,9 @@ document.querySelector("#button--addFee").addEventListener("click", () => {
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Adding Fee",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Adding Fee',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
@ -149,21 +157,24 @@ document.querySelector("#button--addFee").addEventListener("click", () => {
|
|||
doAddFee(fee.feeId, quantityElement.value);
|
||||
quantityCloseModalFunction();
|
||||
};
|
||||
cityssm.openHtmlModal("lotOccupancy-setFeeQuantity", {
|
||||
cityssm.openHtmlModal('lotOccupancy-setFeeQuantity', {
|
||||
onshow: (modalElement) => {
|
||||
modalElement.querySelector("#lotOccupancyFeeQuantity--quantityUnit").textContent = fee.quantityUnit;
|
||||
;
|
||||
modalElement.querySelector('#lotOccupancyFeeQuantity--quantityUnit').textContent = fee.quantityUnit;
|
||||
},
|
||||
onshown: (modalElement, closeModalFunction) => {
|
||||
quantityCloseModalFunction = closeModalFunction;
|
||||
quantityElement = modalElement.querySelector("#lotOccupancyFeeQuantity--quantity");
|
||||
modalElement.querySelector("form").addEventListener("submit", doSetQuantity);
|
||||
quantityElement = modalElement.querySelector('#lotOccupancyFeeQuantity--quantity');
|
||||
modalElement
|
||||
.querySelector('form')
|
||||
.addEventListener('submit', doSetQuantity);
|
||||
}
|
||||
});
|
||||
};
|
||||
const tryAddFee = (clickEvent) => {
|
||||
clickEvent.preventDefault();
|
||||
const feeId = Number.parseInt(clickEvent.currentTarget.dataset.feeId, 10);
|
||||
const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId, 10);
|
||||
const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest('.container--feeCategory').dataset.feeCategoryId, 10);
|
||||
const feeCategory = feeCategories.find((currentFeeCategory) => {
|
||||
return currentFeeCategory.feeCategoryId === feeCategoryId;
|
||||
});
|
||||
|
|
@ -178,16 +189,20 @@ document.querySelector("#button--addFee").addEventListener("click", () => {
|
|||
}
|
||||
};
|
||||
const filterFees = () => {
|
||||
const filterStringPieces = feeFilterElement.value.trim().toLowerCase().split(" ");
|
||||
feeFilterResultsElement.innerHTML = "";
|
||||
const filterStringPieces = feeFilterElement.value
|
||||
.trim()
|
||||
.toLowerCase()
|
||||
.split(' ');
|
||||
feeFilterResultsElement.innerHTML = '';
|
||||
for (const feeCategory of feeCategories) {
|
||||
const categoryContainerElement = document.createElement("div");
|
||||
categoryContainerElement.className = "container--feeCategory";
|
||||
categoryContainerElement.dataset.feeCategoryId = feeCategory.feeCategoryId.toString();
|
||||
const categoryContainerElement = document.createElement('div');
|
||||
categoryContainerElement.className = 'container--feeCategory';
|
||||
categoryContainerElement.dataset.feeCategoryId =
|
||||
feeCategory.feeCategoryId.toString();
|
||||
categoryContainerElement.innerHTML =
|
||||
'<h4 class="title is-5 mt-2">' +
|
||||
cityssm.escapeHTML(feeCategory.feeCategory || "") +
|
||||
"</h4>" +
|
||||
cityssm.escapeHTML(feeCategory.feeCategory || '') +
|
||||
'</h4>' +
|
||||
'<div class="panel mb-5"></div>';
|
||||
let hasFees = false;
|
||||
for (const fee of feeCategory.fees) {
|
||||
|
|
@ -207,35 +222,37 @@ document.querySelector("#button--addFee").addEventListener("click", () => {
|
|||
continue;
|
||||
}
|
||||
hasFees = true;
|
||||
const panelBlockElement = document.createElement("a");
|
||||
panelBlockElement.className = "panel-block is-block container--fee";
|
||||
const panelBlockElement = document.createElement('a');
|
||||
panelBlockElement.className = 'panel-block is-block container--fee';
|
||||
panelBlockElement.dataset.feeId = fee.feeId.toString();
|
||||
panelBlockElement.href = "#";
|
||||
panelBlockElement.href = '#';
|
||||
panelBlockElement.innerHTML =
|
||||
"<strong>" +
|
||||
cityssm.escapeHTML(fee.feeName || "") +
|
||||
"</strong><br />" +
|
||||
"<small>" +
|
||||
cityssm.escapeHTML(fee.feeDescription || "").replace(/\n/g, "<br />") +
|
||||
"</small>";
|
||||
panelBlockElement.addEventListener("click", tryAddFee);
|
||||
categoryContainerElement.querySelector(".panel").append(panelBlockElement);
|
||||
'<strong>' +
|
||||
cityssm.escapeHTML(fee.feeName || '') +
|
||||
'</strong><br />' +
|
||||
'<small>' +
|
||||
cityssm
|
||||
.escapeHTML(fee.feeDescription || '')
|
||||
.replace(/\n/g, '<br />') +
|
||||
'</small>';
|
||||
panelBlockElement.addEventListener('click', tryAddFee);
|
||||
categoryContainerElement.querySelector('.panel').append(panelBlockElement);
|
||||
}
|
||||
if (hasFees) {
|
||||
feeFilterResultsElement.append(categoryContainerElement);
|
||||
}
|
||||
}
|
||||
};
|
||||
cityssm.openHtmlModal("lotOccupancy-addFee", {
|
||||
cityssm.openHtmlModal('lotOccupancy-addFee', {
|
||||
onshow: (modalElement) => {
|
||||
feeFilterElement = modalElement.querySelector("#feeSelect--feeName");
|
||||
feeFilterResultsElement = modalElement.querySelector("#resultsContainer--feeSelect");
|
||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doGetFees", {
|
||||
feeFilterElement = modalElement.querySelector('#feeSelect--feeName');
|
||||
feeFilterResultsElement = modalElement.querySelector('#resultsContainer--feeSelect');
|
||||
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doGetFees', {
|
||||
lotOccupancyId
|
||||
}, (responseJSON) => {
|
||||
feeCategories = responseJSON.feeCategories;
|
||||
feeFilterElement.disabled = false;
|
||||
feeFilterElement.addEventListener("keyup", filterFees);
|
||||
feeFilterElement.addEventListener('keyup', filterFees);
|
||||
feeFilterElement.focus();
|
||||
filterFees();
|
||||
});
|
||||
|
|
@ -253,7 +270,7 @@ document.querySelector("#button--addFee").addEventListener("click", () => {
|
|||
});
|
||||
let lotOccupancyTransactions = exports.lotOccupancyTransactions;
|
||||
delete exports.lotOccupancyTransactions;
|
||||
const lotOccupancyTransactionsContainerElement = document.querySelector("#container--lotOccupancyTransactions");
|
||||
const lotOccupancyTransactionsContainerElement = document.querySelector('#container--lotOccupancyTransactions');
|
||||
const getTransactionGrandTotal = () => {
|
||||
let transactionGrandTotal = 0;
|
||||
for (const lotOccupancyTransaction of lotOccupancyTransactions) {
|
||||
|
|
@ -262,9 +279,9 @@ const getTransactionGrandTotal = () => {
|
|||
return transactionGrandTotal;
|
||||
};
|
||||
const deleteLotOccupancyTransaction = (clickEvent) => {
|
||||
const transactionIndex = clickEvent.currentTarget.closest(".container--lotOccupancyTransaction").dataset.transactionIndex;
|
||||
const transactionIndex = clickEvent.currentTarget.closest('.container--lotOccupancyTransaction').dataset.transactionIndex;
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyTransaction", {
|
||||
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyTransaction', {
|
||||
lotOccupancyId,
|
||||
transactionIndex
|
||||
}, (responseJSON) => {
|
||||
|
|
@ -274,19 +291,19 @@ const deleteLotOccupancyTransaction = (clickEvent) => {
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Deleting Transaction",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Deleting Transaction',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
bulmaJS.confirm({
|
||||
title: "Delete Trasnaction",
|
||||
message: "Are you sure you want to delete this transaction?",
|
||||
contextualColorName: "warning",
|
||||
title: 'Delete Trasnaction',
|
||||
message: 'Are you sure you want to delete this transaction?',
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: "Yes, Delete Transaction",
|
||||
text: 'Yes, Delete Transaction',
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
});
|
||||
|
|
@ -295,80 +312,85 @@ const renderLotOccupancyTransactions = () => {
|
|||
if (lotOccupancyTransactions.length === 0) {
|
||||
lotOccupancyTransactionsContainerElement.innerHTML =
|
||||
'<div class="message ' +
|
||||
(lotOccupancyFees.length === 0 ? "is-info" : "is-warning") +
|
||||
(lotOccupancyFees.length === 0 ? 'is-info' : 'is-warning') +
|
||||
'">' +
|
||||
'<p class="message-body">There are no transactions associated with this record.</p>' +
|
||||
"</div>";
|
||||
'</div>';
|
||||
return;
|
||||
}
|
||||
lotOccupancyTransactionsContainerElement.innerHTML =
|
||||
'<table class="table is-fullwidth is-striped is-hoverable">' +
|
||||
"<thead><tr>" +
|
||||
'<thead><tr>' +
|
||||
'<th class="has-width-1">Date</th>' +
|
||||
"<th>" +
|
||||
'<th>' +
|
||||
cityssm.escapeHTML(exports.aliases.externalReceiptNumber) +
|
||||
"</th>" +
|
||||
'</th>' +
|
||||
'<th class="has-text-right has-width-1">Amount</th>' +
|
||||
'<th class="has-width-1 is-hidden-print"><span class="is-sr-only">Options</span></th>' +
|
||||
"</tr></thead>" +
|
||||
"<tbody></tbody>" +
|
||||
("<tfoot><tr>" +
|
||||
'</tr></thead>' +
|
||||
'<tbody></tbody>' +
|
||||
('<tfoot><tr>' +
|
||||
'<th colspan="2">Transaction Total</th>' +
|
||||
'<td class="has-text-weight-bold has-text-right" id="lotOccupancyTransactions--grandTotal"></td>' +
|
||||
'<td class="is-hidden-print"></td>' +
|
||||
"</tr></tfoot>") +
|
||||
"</table>";
|
||||
'</tr></tfoot>') +
|
||||
'</table>';
|
||||
let transactionGrandTotal = 0;
|
||||
for (const lotOccupancyTransaction of lotOccupancyTransactions) {
|
||||
transactionGrandTotal += lotOccupancyTransaction.transactionAmount;
|
||||
const tableRowElement = document.createElement("tr");
|
||||
tableRowElement.className = "container--lotOccupancyTransaction";
|
||||
const tableRowElement = document.createElement('tr');
|
||||
tableRowElement.className = 'container--lotOccupancyTransaction';
|
||||
tableRowElement.dataset.transactionIndex =
|
||||
lotOccupancyTransaction.transactionIndex.toString();
|
||||
tableRowElement.innerHTML =
|
||||
"<td>" +
|
||||
'<td>' +
|
||||
lotOccupancyTransaction.transactionDateString +
|
||||
"</td>" +
|
||||
("<td>" +
|
||||
cityssm.escapeHTML(lotOccupancyTransaction.externalReceiptNumber || "") +
|
||||
"<br />" +
|
||||
"<small>" +
|
||||
cityssm.escapeHTML(lotOccupancyTransaction.transactionNote || "") +
|
||||
"</small>" +
|
||||
"</td>") +
|
||||
'</td>' +
|
||||
('<td>' +
|
||||
cityssm.escapeHTML(lotOccupancyTransaction.externalReceiptNumber || '') +
|
||||
'<br />' +
|
||||
'<small>' +
|
||||
cityssm.escapeHTML(lotOccupancyTransaction.transactionNote || '') +
|
||||
'</small>' +
|
||||
'</td>') +
|
||||
('<td class="has-text-right">$' +
|
||||
lotOccupancyTransaction.transactionAmount.toFixed(2) +
|
||||
"</td>") +
|
||||
'</td>') +
|
||||
('<td class="is-hidden-print">' +
|
||||
'<button class="button is-small is-danger is-light" data-tooltip="Delete Transaction" type="button">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
"</button>" +
|
||||
"</td>");
|
||||
'</button>' +
|
||||
'</td>');
|
||||
tableRowElement
|
||||
.querySelector("button")
|
||||
.addEventListener("click", deleteLotOccupancyTransaction);
|
||||
lotOccupancyTransactionsContainerElement.querySelector("tbody").append(tableRowElement);
|
||||
.querySelector('button')
|
||||
.addEventListener('click', deleteLotOccupancyTransaction);
|
||||
lotOccupancyTransactionsContainerElement
|
||||
.querySelector('tbody')
|
||||
.append(tableRowElement);
|
||||
}
|
||||
lotOccupancyTransactionsContainerElement.querySelector("#lotOccupancyTransactions--grandTotal").textContent = "$" + transactionGrandTotal.toFixed(2);
|
||||
;
|
||||
lotOccupancyTransactionsContainerElement.querySelector('#lotOccupancyTransactions--grandTotal').textContent = '$' + transactionGrandTotal.toFixed(2);
|
||||
const feeGrandTotal = getFeeGrandTotal();
|
||||
if (feeGrandTotal > transactionGrandTotal) {
|
||||
lotOccupancyTransactionsContainerElement.insertAdjacentHTML("afterbegin", '<div class="message is-warning">' +
|
||||
lotOccupancyTransactionsContainerElement.insertAdjacentHTML('afterbegin', '<div class="message is-warning">' +
|
||||
'<div class="message-body">' +
|
||||
'<div class="level">' +
|
||||
'<div class="level-left"><div class="level-item">Outstanding Balance</div></div>' +
|
||||
'<div class="level-right"><div class="level-item">$' +
|
||||
(feeGrandTotal - transactionGrandTotal).toFixed(2) +
|
||||
"</div></div>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</div>");
|
||||
'</div></div>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</div>');
|
||||
}
|
||||
};
|
||||
document.querySelector("#button--addTransaction").addEventListener("click", () => {
|
||||
document
|
||||
.querySelector('#button--addTransaction')
|
||||
.addEventListener('click', () => {
|
||||
let addCloseModalFunction;
|
||||
const doAddTransaction = (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doAddLotOccupancyTransaction", submitEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doAddLotOccupancyTransaction', submitEvent.currentTarget, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupancyTransactions = responseJSON.lotOccupancyTransactions;
|
||||
addCloseModalFunction();
|
||||
|
|
@ -376,20 +398,20 @@ document.querySelector("#button--addTransaction").addEventListener("click", () =
|
|||
}
|
||||
else {
|
||||
bulmaJS.confirm({
|
||||
title: "Error Adding Transaction",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Adding Transaction',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
cityssm.openHtmlModal("lotOccupancy-addTransaction", {
|
||||
cityssm.openHtmlModal('lotOccupancy-addTransaction', {
|
||||
onshow: (modalElement) => {
|
||||
los.populateAliases(modalElement);
|
||||
modalElement.querySelector("#lotOccupancyTransactionAdd--lotOccupancyId").value = lotOccupancyId.toString();
|
||||
modalElement.querySelector('#lotOccupancyTransactionAdd--lotOccupancyId').value = lotOccupancyId.toString();
|
||||
const feeGrandTotal = getFeeGrandTotal();
|
||||
const transactionGrandTotal = getTransactionGrandTotal();
|
||||
const transactionAmountElement = modalElement.querySelector("#lotOccupancyTransactionAdd--transactionAmount");
|
||||
const transactionAmountElement = modalElement.querySelector('#lotOccupancyTransactionAdd--transactionAmount');
|
||||
transactionAmountElement.min = (-1 * transactionGrandTotal).toFixed(2);
|
||||
transactionAmountElement.max = Math.max(feeGrandTotal - transactionGrandTotal, 0).toFixed(2);
|
||||
transactionAmountElement.value = Math.max(feeGrandTotal - transactionGrandTotal, 0).toFixed(2);
|
||||
|
|
@ -397,7 +419,9 @@ document.querySelector("#button--addTransaction").addEventListener("click", () =
|
|||
onshown: (modalElement, closeModalFunction) => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
addCloseModalFunction = closeModalFunction;
|
||||
modalElement.querySelector("form").addEventListener("submit", doAddTransaction);
|
||||
modalElement
|
||||
.querySelector('form')
|
||||
.addEventListener('submit', doAddTransaction);
|
||||
},
|
||||
onremoved: () => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -3,7 +3,8 @@
|
|||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
let lotOccupancyOccupants;
|
||||
const openEditLotOccupancyOccupant = (clickEvent) => {
|
||||
const lotOccupantIndex = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.lotOccupantIndex, 10);
|
||||
const lotOccupantIndex = Number.parseInt(clickEvent.currentTarget.closest('tr').dataset
|
||||
.lotOccupantIndex, 10);
|
||||
const lotOccupancyOccupant = lotOccupancyOccupants.find((currentLotOccupancyOccupant) => {
|
||||
return currentLotOccupancyOccupant.lotOccupantIndex === lotOccupantIndex;
|
||||
});
|
||||
|
|
@ -11,7 +12,7 @@ const openEditLotOccupancyOccupant = (clickEvent) => {
|
|||
let editCloseModalFunction;
|
||||
const editOccupant = (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doUpdateLotOccupancyOccupant", editFormElement, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doUpdateLotOccupancyOccupant', editFormElement, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupancyOccupants = responseJSON.lotOccupancyOccupants;
|
||||
editCloseModalFunction();
|
||||
|
|
@ -19,52 +20,55 @@ const openEditLotOccupancyOccupant = (clickEvent) => {
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating " + exports.aliases.occupant,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Updating ' + exports.aliases.occupant,
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
cityssm.openHtmlModal("lotOccupancy-editOccupant", {
|
||||
cityssm.openHtmlModal('lotOccupancy-editOccupant', {
|
||||
onshow: (modalElement) => {
|
||||
los.populateAliases(modalElement);
|
||||
modalElement.querySelector("#lotOccupancyOccupantEdit--lotOccupancyId").value = lotOccupancyId;
|
||||
modalElement.querySelector("#lotOccupancyOccupantEdit--lotOccupantIndex").value = lotOccupantIndex.toString();
|
||||
const lotOccupantTypeSelectElement = modalElement.querySelector("#lotOccupancyOccupantEdit--lotOccupantTypeId");
|
||||
modalElement.querySelector('#lotOccupancyOccupantEdit--lotOccupancyId').value = lotOccupancyId;
|
||||
modalElement.querySelector('#lotOccupancyOccupantEdit--lotOccupantIndex').value = lotOccupantIndex.toString();
|
||||
const lotOccupantTypeSelectElement = modalElement.querySelector('#lotOccupancyOccupantEdit--lotOccupantTypeId');
|
||||
let lotOccupantTypeSelected = false;
|
||||
for (const lotOccupantType of exports.lotOccupantTypes) {
|
||||
const optionElement = document.createElement("option");
|
||||
const optionElement = document.createElement('option');
|
||||
optionElement.value = lotOccupantType.lotOccupantTypeId.toString();
|
||||
optionElement.textContent = lotOccupantType.lotOccupantType;
|
||||
if (lotOccupantType.lotOccupantTypeId === lotOccupancyOccupant.lotOccupantTypeId) {
|
||||
if (lotOccupantType.lotOccupantTypeId ===
|
||||
lotOccupancyOccupant.lotOccupantTypeId) {
|
||||
optionElement.selected = true;
|
||||
lotOccupantTypeSelected = true;
|
||||
}
|
||||
lotOccupantTypeSelectElement.append(optionElement);
|
||||
}
|
||||
if (!lotOccupantTypeSelected) {
|
||||
const optionElement = document.createElement("option");
|
||||
const optionElement = document.createElement('option');
|
||||
optionElement.value = lotOccupancyOccupant.lotOccupantTypeId.toString();
|
||||
optionElement.textContent = lotOccupancyOccupant.lotOccupantType;
|
||||
optionElement.textContent =
|
||||
lotOccupancyOccupant.lotOccupantType;
|
||||
optionElement.selected = true;
|
||||
lotOccupantTypeSelectElement.append(optionElement);
|
||||
}
|
||||
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantName").value = lotOccupancyOccupant.occupantName;
|
||||
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantAddress1").value = lotOccupancyOccupant.occupantAddress1;
|
||||
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantAddress2").value = lotOccupancyOccupant.occupantAddress2;
|
||||
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantCity").value = lotOccupancyOccupant.occupantCity;
|
||||
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantProvince").value = lotOccupancyOccupant.occupantProvince;
|
||||
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantPostalCode").value = lotOccupancyOccupant.occupantPostalCode;
|
||||
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantPhoneNumber").value = lotOccupancyOccupant.occupantPhoneNumber;
|
||||
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantEmailAddress").value = lotOccupancyOccupant.occupantEmailAddress;
|
||||
modalElement.querySelector("#lotOccupancyOccupantEdit--occupantComment").value = lotOccupancyOccupant.occupantComment;
|
||||
;
|
||||
modalElement.querySelector('#lotOccupancyOccupantEdit--occupantName').value = lotOccupancyOccupant.occupantName;
|
||||
modalElement.querySelector('#lotOccupancyOccupantEdit--occupantAddress1').value = lotOccupancyOccupant.occupantAddress1;
|
||||
modalElement.querySelector('#lotOccupancyOccupantEdit--occupantAddress2').value = lotOccupancyOccupant.occupantAddress2;
|
||||
modalElement.querySelector('#lotOccupancyOccupantEdit--occupantCity').value = lotOccupancyOccupant.occupantCity;
|
||||
modalElement.querySelector('#lotOccupancyOccupantEdit--occupantProvince').value = lotOccupancyOccupant.occupantProvince;
|
||||
modalElement.querySelector('#lotOccupancyOccupantEdit--occupantPostalCode').value = lotOccupancyOccupant.occupantPostalCode;
|
||||
modalElement.querySelector('#lotOccupancyOccupantEdit--occupantPhoneNumber').value = lotOccupancyOccupant.occupantPhoneNumber;
|
||||
modalElement.querySelector('#lotOccupancyOccupantEdit--occupantEmailAddress').value = lotOccupancyOccupant.occupantEmailAddress;
|
||||
modalElement.querySelector('#lotOccupancyOccupantEdit--occupantComment').value = lotOccupancyOccupant.occupantComment;
|
||||
},
|
||||
onshown: (modalElement, closeModalFunction) => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
modalElement.querySelector("#lotOccupancyOccupantEdit--lotOccupantTypeId").focus();
|
||||
editFormElement = modalElement.querySelector("form");
|
||||
editFormElement.addEventListener("submit", editOccupant);
|
||||
modalElement.querySelector('#lotOccupancyOccupantEdit--lotOccupantTypeId').focus();
|
||||
editFormElement = modalElement.querySelector('form');
|
||||
editFormElement.addEventListener('submit', editOccupant);
|
||||
editCloseModalFunction = closeModalFunction;
|
||||
},
|
||||
onremoved: () => {
|
||||
|
|
@ -73,10 +77,9 @@ const openEditLotOccupancyOccupant = (clickEvent) => {
|
|||
});
|
||||
};
|
||||
const deleteLotOccupancyOccupant = (clickEvent) => {
|
||||
const lotOccupantIndex = clickEvent.currentTarget.closest("tr").dataset
|
||||
.lotOccupantIndex;
|
||||
const lotOccupantIndex = clickEvent.currentTarget.closest('tr').dataset.lotOccupantIndex;
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyOccupant", {
|
||||
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doDeleteLotOccupancyOccupant', {
|
||||
lotOccupancyId,
|
||||
lotOccupantIndex
|
||||
}, (responseJSON) => {
|
||||
|
|
@ -86,128 +89,135 @@ const deleteLotOccupancyOccupant = (clickEvent) => {
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Removing " + exports.aliases.occupant,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Removing ' + exports.aliases.occupant,
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
bulmaJS.confirm({
|
||||
title: "Remove " + exports.aliases.occupant + "?",
|
||||
message: "Are you sure you want to remove this " + exports.aliases.occupant.toLowerCase() + "?",
|
||||
title: 'Remove ' + exports.aliases.occupant + '?',
|
||||
message: 'Are you sure you want to remove this ' +
|
||||
exports.aliases.occupant.toLowerCase() +
|
||||
'?',
|
||||
okButton: {
|
||||
text: "Yes, Remove " + exports.aliases.occupant,
|
||||
text: 'Yes, Remove ' + exports.aliases.occupant,
|
||||
callbackFunction: doDelete
|
||||
},
|
||||
contextualColorName: "warning"
|
||||
contextualColorName: 'warning'
|
||||
});
|
||||
};
|
||||
const renderLotOccupancyOccupants = () => {
|
||||
const occupantsContainer = document.querySelector("#container--lotOccupancyOccupants");
|
||||
const occupantsContainer = document.querySelector('#container--lotOccupancyOccupants');
|
||||
cityssm.clearElement(occupantsContainer);
|
||||
if (lotOccupancyOccupants.length === 0) {
|
||||
occupantsContainer.innerHTML =
|
||||
'<div class="message is-warning">' +
|
||||
'<p class="message-body">There are no ' +
|
||||
exports.aliases.occupants.toLowerCase() +
|
||||
" associated with this record.</p>" +
|
||||
"</div>";
|
||||
' associated with this record.</p>' +
|
||||
'</div>';
|
||||
return;
|
||||
}
|
||||
const tableElement = document.createElement("table");
|
||||
tableElement.className = "table is-fullwidth is-striped is-hoverable";
|
||||
const tableElement = document.createElement('table');
|
||||
tableElement.className = 'table is-fullwidth is-striped is-hoverable';
|
||||
tableElement.innerHTML =
|
||||
"<thead><tr>" +
|
||||
("<th>" + exports.aliases.occupant + "</th>") +
|
||||
"<th>Address</th>" +
|
||||
"<th>Other Contact</th>" +
|
||||
"<th>Comment</th>" +
|
||||
'<thead><tr>' +
|
||||
('<th>' + exports.aliases.occupant + '</th>') +
|
||||
'<th>Address</th>' +
|
||||
'<th>Other Contact</th>' +
|
||||
'<th>Comment</th>' +
|
||||
'<th class="is-hidden-print"><span class="is-sr-only">Options</span></th>' +
|
||||
"</tr></thead>" +
|
||||
"<tbody></tbody>";
|
||||
'</tr></thead>' +
|
||||
'<tbody></tbody>';
|
||||
for (const lotOccupancyOccupant of lotOccupancyOccupants) {
|
||||
const tableRowElement = document.createElement("tr");
|
||||
const tableRowElement = document.createElement('tr');
|
||||
tableRowElement.dataset.lotOccupantIndex =
|
||||
lotOccupancyOccupant.lotOccupantIndex.toString();
|
||||
tableRowElement.innerHTML =
|
||||
"<td>" +
|
||||
cityssm.escapeHTML(lotOccupancyOccupant.occupantName || "(No Name)") +
|
||||
"<br />" +
|
||||
'<td>' +
|
||||
cityssm.escapeHTML(lotOccupancyOccupant.occupantName || '(No Name)') +
|
||||
'<br />' +
|
||||
('<span class="tag">' +
|
||||
'<i class="fas fa-fw fa-' +
|
||||
cityssm.escapeHTML(lotOccupancyOccupant.fontAwesomeIconClass) +
|
||||
'" aria-hidden="true"></i>' +
|
||||
' <span class="ml-1">' +
|
||||
cityssm.escapeHTML(lotOccupancyOccupant.lotOccupantType) +
|
||||
"</span>" +
|
||||
"</span>") +
|
||||
"</td>" +
|
||||
("<td>" +
|
||||
'</span>' +
|
||||
'</span>') +
|
||||
'</td>' +
|
||||
('<td>' +
|
||||
(lotOccupancyOccupant.occupantAddress1
|
||||
? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress1) + "<br />"
|
||||
: "") +
|
||||
? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress1) + '<br />'
|
||||
: '') +
|
||||
(lotOccupancyOccupant.occupantAddress2
|
||||
? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress2) + "<br />"
|
||||
: "") +
|
||||
? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress2) + '<br />'
|
||||
: '') +
|
||||
(lotOccupancyOccupant.occupantCity
|
||||
? cityssm.escapeHTML(lotOccupancyOccupant.occupantCity) + ", "
|
||||
: "") +
|
||||
cityssm.escapeHTML(lotOccupancyOccupant.occupantProvince || "") +
|
||||
"<br />" +
|
||||
cityssm.escapeHTML(lotOccupancyOccupant.occupantPostalCode || "") +
|
||||
"</td>") +
|
||||
("<td>" +
|
||||
? cityssm.escapeHTML(lotOccupancyOccupant.occupantCity) + ', '
|
||||
: '') +
|
||||
cityssm.escapeHTML(lotOccupancyOccupant.occupantProvince || '') +
|
||||
'<br />' +
|
||||
cityssm.escapeHTML(lotOccupancyOccupant.occupantPostalCode || '') +
|
||||
'</td>') +
|
||||
('<td>' +
|
||||
(lotOccupancyOccupant.occupantPhoneNumber
|
||||
? cityssm.escapeHTML(lotOccupancyOccupant.occupantPhoneNumber) + "<br />"
|
||||
: "") +
|
||||
? cityssm.escapeHTML(lotOccupancyOccupant.occupantPhoneNumber) +
|
||||
'<br />'
|
||||
: '') +
|
||||
(lotOccupancyOccupant.occupantEmailAddress
|
||||
? cityssm.escapeHTML(lotOccupancyOccupant.occupantEmailAddress)
|
||||
: "") +
|
||||
"</td>") +
|
||||
("<td>" + cityssm.escapeHTML(lotOccupancyOccupant.occupantComment) + "</td>") +
|
||||
: '') +
|
||||
'</td>') +
|
||||
('<td>' +
|
||||
cityssm.escapeHTML(lotOccupancyOccupant.occupantComment) +
|
||||
'</td>') +
|
||||
('<td class="is-hidden-print">' +
|
||||
'<div class="buttons are-small is-justify-content-end">' +
|
||||
('<button class="button is-primary button--edit" type="button">' +
|
||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||
" <span>Edit</span>" +
|
||||
"</button>") +
|
||||
' <span>Edit</span>' +
|
||||
'</button>') +
|
||||
('<button class="button is-light is-danger button--delete" data-tooltip="Delete ' +
|
||||
cityssm.escapeHTML(exports.aliases.occupant) +
|
||||
'" type="button" aria-label="Delete">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
"</button>") +
|
||||
"</div>" +
|
||||
"</td>");
|
||||
'</button>') +
|
||||
'</div>' +
|
||||
'</td>');
|
||||
tableRowElement
|
||||
.querySelector(".button--edit")
|
||||
.addEventListener("click", openEditLotOccupancyOccupant);
|
||||
.querySelector('.button--edit')
|
||||
.addEventListener('click', openEditLotOccupancyOccupant);
|
||||
tableRowElement
|
||||
.querySelector(".button--delete")
|
||||
.addEventListener("click", deleteLotOccupancyOccupant);
|
||||
tableElement.querySelector("tbody").append(tableRowElement);
|
||||
.querySelector('.button--delete')
|
||||
.addEventListener('click', deleteLotOccupancyOccupant);
|
||||
tableElement.querySelector('tbody').append(tableRowElement);
|
||||
}
|
||||
occupantsContainer.append(tableElement);
|
||||
};
|
||||
if (isCreate) {
|
||||
const lotOccupantTypeIdElement = document.querySelector("#lotOccupancy--lotOccupantTypeId");
|
||||
lotOccupantTypeIdElement.addEventListener("change", () => {
|
||||
const lotOccupantTypeIdElement = document.querySelector('#lotOccupancy--lotOccupantTypeId');
|
||||
lotOccupantTypeIdElement.addEventListener('change', () => {
|
||||
const occupantFields = formElement.querySelectorAll("[data-table='LotOccupancyOccupant']");
|
||||
for (const occupantField of occupantFields) {
|
||||
occupantField.disabled = lotOccupantTypeIdElement.value === "";
|
||||
occupantField.disabled = lotOccupantTypeIdElement.value === '';
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
lotOccupancyOccupants = exports.lotOccupancyOccupants;
|
||||
delete exports.lotOccupancyOccupants;
|
||||
document.querySelector("#button--addOccupant").addEventListener("click", () => {
|
||||
document
|
||||
.querySelector('#button--addOccupant')
|
||||
.addEventListener('click', () => {
|
||||
let addCloseModalFunction;
|
||||
let addFormElement;
|
||||
let searchFormElement;
|
||||
let searchResultsElement;
|
||||
const addOccupant = (formOrObject) => {
|
||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doAddLotOccupancyOccupant", formOrObject, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doAddLotOccupancyOccupant', formOrObject, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
lotOccupancyOccupants = responseJSON.lotOccupancyOccupants;
|
||||
addCloseModalFunction();
|
||||
|
|
@ -215,9 +225,9 @@ else {
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Adding " + exports.aliases.occupant,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Adding ' + exports.aliases.occupant,
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
@ -232,15 +242,15 @@ else {
|
|||
const panelBlockElement = clickEvent.currentTarget;
|
||||
const occupant = pastOccupantSearchResults[Number.parseInt(panelBlockElement.dataset.index, 10)];
|
||||
const lotOccupantTypeId = panelBlockElement
|
||||
.closest(".modal")
|
||||
.querySelector("#lotOccupancyOccupantCopy--lotOccupantTypeId").value;
|
||||
if (lotOccupantTypeId === "") {
|
||||
.closest('.modal')
|
||||
.querySelector('#lotOccupancyOccupantCopy--lotOccupantTypeId').value;
|
||||
if (lotOccupantTypeId === '') {
|
||||
bulmaJS.alert({
|
||||
title: "No " + exports.aliases.occupant + " Type Selected",
|
||||
message: "Select a type to apply to the newly added " +
|
||||
title: 'No ' + exports.aliases.occupant + ' Type Selected',
|
||||
message: 'Select a type to apply to the newly added ' +
|
||||
exports.aliases.occupant.toLowerCase() +
|
||||
".",
|
||||
contextualColorName: "warning"
|
||||
'.',
|
||||
contextualColorName: 'warning'
|
||||
});
|
||||
}
|
||||
else {
|
||||
|
|
@ -251,83 +261,86 @@ else {
|
|||
};
|
||||
const searchOccupants = (event) => {
|
||||
event.preventDefault();
|
||||
if (searchFormElement.querySelector("#lotOccupancyOccupantCopy--searchFilter").value === "") {
|
||||
if (searchFormElement.querySelector('#lotOccupancyOccupantCopy--searchFilter').value === '') {
|
||||
searchResultsElement.innerHTML =
|
||||
'<div class="message is-info">' +
|
||||
'<p class="message-body">Enter a partial name or address in the search field above.</p>' +
|
||||
"</div>";
|
||||
'</div>';
|
||||
return;
|
||||
}
|
||||
searchResultsElement.innerHTML = los.getLoadingParagraphHTML("Searching...");
|
||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doSearchPastOccupants", searchFormElement, (responseJSON) => {
|
||||
searchResultsElement.innerHTML =
|
||||
los.getLoadingParagraphHTML('Searching...');
|
||||
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doSearchPastOccupants', searchFormElement, (responseJSON) => {
|
||||
pastOccupantSearchResults = responseJSON.occupants;
|
||||
const panelElement = document.createElement("div");
|
||||
panelElement.className = "panel";
|
||||
const panelElement = document.createElement('div');
|
||||
panelElement.className = 'panel';
|
||||
for (const [index, occupant] of pastOccupantSearchResults.entries()) {
|
||||
const panelBlockElement = document.createElement("a");
|
||||
panelBlockElement.className = "panel-block is-block";
|
||||
const panelBlockElement = document.createElement('a');
|
||||
panelBlockElement.className = 'panel-block is-block';
|
||||
panelBlockElement.dataset.index = index.toString();
|
||||
panelBlockElement.innerHTML =
|
||||
"<strong>" +
|
||||
cityssm.escapeHTML(occupant.occupantName || "") +
|
||||
"</strong>" +
|
||||
"<br />" +
|
||||
'<strong>' +
|
||||
cityssm.escapeHTML(occupant.occupantName || '') +
|
||||
'</strong>' +
|
||||
'<br />' +
|
||||
'<div class="columns">' +
|
||||
('<div class="column">' +
|
||||
cityssm.escapeHTML(occupant.occupantAddress1 || "") +
|
||||
"<br />" +
|
||||
cityssm.escapeHTML(occupant.occupantAddress1 || '') +
|
||||
'<br />' +
|
||||
(occupant.occupantAddress2
|
||||
? cityssm.escapeHTML(occupant.occupantAddress2) + "<br />"
|
||||
: "") +
|
||||
cityssm.escapeHTML(occupant.occupantCity || "") +
|
||||
", " +
|
||||
cityssm.escapeHTML(occupant.occupantProvince || "") +
|
||||
"<br />" +
|
||||
cityssm.escapeHTML(occupant.occupantPostalCode || "") +
|
||||
"</div>") +
|
||||
? cityssm.escapeHTML(occupant.occupantAddress2) + '<br />'
|
||||
: '') +
|
||||
cityssm.escapeHTML(occupant.occupantCity || '') +
|
||||
', ' +
|
||||
cityssm.escapeHTML(occupant.occupantProvince || '') +
|
||||
'<br />' +
|
||||
cityssm.escapeHTML(occupant.occupantPostalCode || '') +
|
||||
'</div>') +
|
||||
('<div class="column">' +
|
||||
(occupant.occupantPhoneNumber
|
||||
? cityssm.escapeHTML(occupant.occupantPhoneNumber) + "<br />"
|
||||
: "") +
|
||||
cityssm.escapeHTML(occupant.occupantEmailAddress || "") +
|
||||
"<br />" +
|
||||
"</div>") +
|
||||
"</div>";
|
||||
panelBlockElement.addEventListener("click", addOccupantFromCopy);
|
||||
? cityssm.escapeHTML(occupant.occupantPhoneNumber) +
|
||||
'<br />'
|
||||
: '') +
|
||||
cityssm.escapeHTML(occupant.occupantEmailAddress || '') +
|
||||
'<br />' +
|
||||
'</div>') +
|
||||
'</div>';
|
||||
panelBlockElement.addEventListener('click', addOccupantFromCopy);
|
||||
panelElement.append(panelBlockElement);
|
||||
}
|
||||
searchResultsElement.innerHTML = "";
|
||||
searchResultsElement.innerHTML = '';
|
||||
searchResultsElement.append(panelElement);
|
||||
});
|
||||
};
|
||||
cityssm.openHtmlModal("lotOccupancy-addOccupant", {
|
||||
cityssm.openHtmlModal('lotOccupancy-addOccupant', {
|
||||
onshow: (modalElement) => {
|
||||
los.populateAliases(modalElement);
|
||||
modalElement.querySelector("#lotOccupancyOccupantAdd--lotOccupancyId").value = lotOccupancyId;
|
||||
const lotOccupantTypeSelectElement = modalElement.querySelector("#lotOccupancyOccupantAdd--lotOccupantTypeId");
|
||||
const lotOccupantTypeCopySelectElement = modalElement.querySelector("#lotOccupancyOccupantCopy--lotOccupantTypeId");
|
||||
modalElement.querySelector('#lotOccupancyOccupantAdd--lotOccupancyId').value = lotOccupancyId;
|
||||
const lotOccupantTypeSelectElement = modalElement.querySelector('#lotOccupancyOccupantAdd--lotOccupantTypeId');
|
||||
const lotOccupantTypeCopySelectElement = modalElement.querySelector('#lotOccupancyOccupantCopy--lotOccupantTypeId');
|
||||
for (const lotOccupantType of exports.lotOccupantTypes) {
|
||||
const optionElement = document.createElement("option");
|
||||
const optionElement = document.createElement('option');
|
||||
optionElement.value = lotOccupantType.lotOccupantTypeId.toString();
|
||||
optionElement.textContent = lotOccupantType.lotOccupantType;
|
||||
lotOccupantTypeSelectElement.append(optionElement);
|
||||
lotOccupantTypeCopySelectElement.append(optionElement.cloneNode(true));
|
||||
}
|
||||
modalElement.querySelector("#lotOccupancyOccupantAdd--occupantCity").value = exports.occupantCityDefault;
|
||||
modalElement.querySelector("#lotOccupancyOccupantAdd--occupantProvince").value = exports.occupantProvinceDefault;
|
||||
;
|
||||
modalElement.querySelector('#lotOccupancyOccupantAdd--occupantCity').value = exports.occupantCityDefault;
|
||||
modalElement.querySelector('#lotOccupancyOccupantAdd--occupantProvince').value = exports.occupantProvinceDefault;
|
||||
},
|
||||
onshown: (modalElement, closeModalFunction) => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
bulmaJS.init(modalElement);
|
||||
modalElement.querySelector("#lotOccupancyOccupantAdd--lotOccupantTypeId").focus();
|
||||
addFormElement = modalElement.querySelector("#form--lotOccupancyOccupantAdd");
|
||||
addFormElement.addEventListener("submit", addOccupantFromForm);
|
||||
searchResultsElement = modalElement.querySelector("#lotOccupancyOccupantCopy--searchResults");
|
||||
searchFormElement = modalElement.querySelector("#form--lotOccupancyOccupantCopy");
|
||||
searchFormElement.addEventListener("submit", (formEvent) => {
|
||||
modalElement.querySelector('#lotOccupancyOccupantAdd--lotOccupantTypeId').focus();
|
||||
addFormElement = modalElement.querySelector('#form--lotOccupancyOccupantAdd');
|
||||
addFormElement.addEventListener('submit', addOccupantFromForm);
|
||||
searchResultsElement = modalElement.querySelector('#lotOccupancyOccupantCopy--searchResults');
|
||||
searchFormElement = modalElement.querySelector('#form--lotOccupancyOccupantCopy');
|
||||
searchFormElement.addEventListener('submit', (formEvent) => {
|
||||
formEvent.preventDefault();
|
||||
});
|
||||
modalElement.querySelector("#lotOccupancyOccupantCopy--searchFilter").addEventListener("change", searchOccupants);
|
||||
modalElement.querySelector('#lotOccupancyOccupantCopy--searchFilter').addEventListener('change', searchOccupants);
|
||||
addCloseModalFunction = closeModalFunction;
|
||||
},
|
||||
onremoved: () => {
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -3,10 +3,10 @@
|
|||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
(() => {
|
||||
const los = exports.los;
|
||||
const searchFilterFormElement = document.querySelector("#form--searchFilters");
|
||||
const searchResultsContainerElement = document.querySelector("#container--searchResults");
|
||||
const limit = Number.parseInt(document.querySelector("#searchFilter--limit").value, 10);
|
||||
const offsetElement = document.querySelector("#searchFilter--offset");
|
||||
const searchFilterFormElement = document.querySelector('#form--searchFilters');
|
||||
const searchResultsContainerElement = document.querySelector('#container--searchResults');
|
||||
const limit = Number.parseInt(document.querySelector('#searchFilter--limit').value, 10);
|
||||
const offsetElement = document.querySelector('#searchFilter--offset');
|
||||
function renderLotOccupancies(responseJSON) {
|
||||
var _a, _b;
|
||||
if (responseJSON.lotOccupancies.length === 0) {
|
||||
|
|
@ -17,12 +17,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
</div>`;
|
||||
return;
|
||||
}
|
||||
const resultsTbodyElement = document.createElement("tbody");
|
||||
const resultsTbodyElement = document.createElement('tbody');
|
||||
const nowDateString = cityssm.dateToString(new Date());
|
||||
for (const lotOccupancy of responseJSON.lotOccupancies) {
|
||||
let occupancyTimeHTML = "";
|
||||
let occupancyTimeHTML = '';
|
||||
if (lotOccupancy.occupancyStartDateString <= nowDateString &&
|
||||
(lotOccupancy.occupancyEndDateString === "" ||
|
||||
(lotOccupancy.occupancyEndDateString === '' ||
|
||||
lotOccupancy.occupancyEndDateString >= nowDateString)) {
|
||||
occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Current ${los.escapedAliases.Occupancy}">
|
||||
<i class="fas fa-play" aria-label="Current ${los.escapedAliases.Occupancy}"></i>
|
||||
|
|
@ -38,63 +38,65 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
<i class="fas fa-stop" aria-label="Past ${los.escapedAliases.Occupancy}"></i>
|
||||
</span>`;
|
||||
}
|
||||
let occupantsHTML = "";
|
||||
let occupantsHTML = '';
|
||||
for (const occupant of lotOccupancy.lotOccupancyOccupants) {
|
||||
occupantsHTML +=
|
||||
'<span class="has-tooltip-left" data-tooltip="' +
|
||||
cityssm.escapeHTML(occupant.lotOccupantType || "") +
|
||||
cityssm.escapeHTML(occupant.lotOccupantType || '') +
|
||||
'">' +
|
||||
('<i class="fas fa-fw fa-' +
|
||||
cityssm.escapeHTML(occupant.fontAwesomeIconClass || "user") +
|
||||
cityssm.escapeHTML(occupant.fontAwesomeIconClass || 'user') +
|
||||
'" aria-hidden="true"></i> ') +
|
||||
cityssm.escapeHTML(occupant.occupantName || "") +
|
||||
"</span><br />";
|
||||
cityssm.escapeHTML(occupant.occupantName || '') +
|
||||
'</span><br />';
|
||||
}
|
||||
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
|
||||
('<td class="has-width-1">' + occupancyTimeHTML + "</td>") +
|
||||
("<td>" +
|
||||
resultsTbodyElement.insertAdjacentHTML('beforeend', '<tr>' +
|
||||
('<td class="has-width-1">' + occupancyTimeHTML + '</td>') +
|
||||
('<td>' +
|
||||
'<a class="has-text-weight-bold" href="' +
|
||||
los.getLotOccupancyURL(lotOccupancy.lotOccupancyId) +
|
||||
'">' +
|
||||
cityssm.escapeHTML(lotOccupancy.occupancyType) +
|
||||
"</a>" +
|
||||
"</td>") +
|
||||
("<td>" +
|
||||
'</a>' +
|
||||
'</td>') +
|
||||
('<td>' +
|
||||
(lotOccupancy.lotName
|
||||
? '<a class="has-tooltip-right" data-tooltip="' +
|
||||
cityssm.escapeHTML(lotOccupancy.lotType || "") +
|
||||
cityssm.escapeHTML(lotOccupancy.lotType || '') +
|
||||
'" href="' +
|
||||
los.getLotURL(lotOccupancy.lotId) +
|
||||
'">' +
|
||||
cityssm.escapeHTML(lotOccupancy.lotName) +
|
||||
"</a>"
|
||||
: '<span class="has-text-grey">(No ' + los.escapedAliases.Lot + ")</span>") +
|
||||
"<br />" +
|
||||
'</a>'
|
||||
: '<span class="has-text-grey">(No ' +
|
||||
los.escapedAliases.Lot +
|
||||
')</span>') +
|
||||
'<br />' +
|
||||
('<span class="is-size-7">' +
|
||||
cityssm.escapeHTML(lotOccupancy.mapName || "") +
|
||||
"</span>") +
|
||||
"</td>") +
|
||||
("<td>" + lotOccupancy.occupancyStartDateString + "</td>") +
|
||||
("<td>" +
|
||||
cityssm.escapeHTML(lotOccupancy.mapName || '') +
|
||||
'</span>') +
|
||||
'</td>') +
|
||||
('<td>' + lotOccupancy.occupancyStartDateString + '</td>') +
|
||||
('<td>' +
|
||||
(lotOccupancy.occupancyEndDate
|
||||
? lotOccupancy.occupancyEndDateString
|
||||
: '<span class="has-text-grey">(No End Date)</span>') +
|
||||
"</td>") +
|
||||
("<td>" + occupantsHTML + "</td>") +
|
||||
"<td>" +
|
||||
'</td>') +
|
||||
('<td>' + occupantsHTML + '</td>') +
|
||||
'<td>' +
|
||||
(lotOccupancy.printEJS
|
||||
? '<a class="button is-small" data-tooltip="Print" href="' +
|
||||
los.urlPrefix +
|
||||
"/print/" +
|
||||
'/print/' +
|
||||
lotOccupancy.printEJS +
|
||||
"/?lotOccupancyId=" +
|
||||
'/?lotOccupancyId=' +
|
||||
lotOccupancy.lotOccupancyId +
|
||||
'" target="_blank">' +
|
||||
'<i class="fas fa-print" aria-label="Print"></i>' +
|
||||
"</a>"
|
||||
: "") +
|
||||
"</td>" +
|
||||
"</tr>");
|
||||
'</a>'
|
||||
: '') +
|
||||
'</td>' +
|
||||
'</tr>');
|
||||
}
|
||||
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">
|
||||
<thead><tr>
|
||||
|
|
@ -107,19 +109,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
<th class="has-width-1"><span class="is-sr-only">Print</span></th>
|
||||
</tr></thead>
|
||||
<table>`;
|
||||
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement);
|
||||
searchResultsContainerElement.insertAdjacentHTML("beforeend", los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count));
|
||||
searchResultsContainerElement
|
||||
.querySelector('table')
|
||||
.append(resultsTbodyElement);
|
||||
searchResultsContainerElement.insertAdjacentHTML('beforeend', los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count));
|
||||
(_a = searchResultsContainerElement
|
||||
.querySelector("button[data-page='previous']")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", previousAndGetLotOccupancies);
|
||||
.querySelector("button[data-page='previous']")) === null || _a === void 0 ? void 0 : _a.addEventListener('click', previousAndGetLotOccupancies);
|
||||
(_b = searchResultsContainerElement
|
||||
.querySelector("button[data-page='next']")) === null || _b === void 0 ? void 0 : _b.addEventListener("click", nextAndGetLotOccupancies);
|
||||
.querySelector("button[data-page='next']")) === null || _b === void 0 ? void 0 : _b.addEventListener('click', nextAndGetLotOccupancies);
|
||||
}
|
||||
function getLotOccupancies() {
|
||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(`Loading ${exports.aliases.occupancies}...`);
|
||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doSearchLotOccupancies", searchFilterFormElement, renderLotOccupancies);
|
||||
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doSearchLotOccupancies', searchFilterFormElement, renderLotOccupancies);
|
||||
}
|
||||
function resetOffsetAndGetLotOccupancies() {
|
||||
offsetElement.value = "0";
|
||||
offsetElement.value = '0';
|
||||
getLotOccupancies();
|
||||
}
|
||||
function previousAndGetLotOccupancies() {
|
||||
|
|
@ -130,11 +134,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString();
|
||||
getLotOccupancies();
|
||||
}
|
||||
const filterElements = searchFilterFormElement.querySelectorAll("input, select");
|
||||
const filterElements = searchFilterFormElement.querySelectorAll('input, select');
|
||||
for (const filterElement of filterElements) {
|
||||
filterElement.addEventListener("change", resetOffsetAndGetLotOccupancies);
|
||||
filterElement.addEventListener('change', resetOffsetAndGetLotOccupancies);
|
||||
}
|
||||
searchFilterFormElement.addEventListener("submit", (formEvent) => {
|
||||
searchFilterFormElement.addEventListener('submit', (formEvent) => {
|
||||
formEvent.preventDefault();
|
||||
resetOffsetAndGetLotOccupancies();
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,131 +1,139 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
|
||||
import type * as globalTypes from "../types/globalTypes";
|
||||
import type * as recordTypes from "../types/recordTypes";
|
||||
import type * as globalTypes from '../types/globalTypes'
|
||||
import type * as recordTypes from '../types/recordTypes'
|
||||
|
||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||
|
||||
declare const cityssm: cityssmGlobal;
|
||||
declare const cityssm: cityssmGlobal
|
||||
|
||||
(() => {
|
||||
const los = exports.los as globalTypes.LOS;
|
||||
;(() => {
|
||||
const los = exports.los as globalTypes.LOS
|
||||
|
||||
const searchFilterFormElement = document.querySelector("#form--searchFilters") as HTMLFormElement;
|
||||
const searchFilterFormElement = document.querySelector(
|
||||
'#form--searchFilters'
|
||||
) as HTMLFormElement
|
||||
|
||||
const searchResultsContainerElement = document.querySelector("#container--searchResults") as HTMLElement;
|
||||
const searchResultsContainerElement = document.querySelector(
|
||||
'#container--searchResults'
|
||||
) as HTMLElement
|
||||
|
||||
const limit = Number.parseInt(
|
||||
(document.querySelector("#searchFilter--limit") as HTMLInputElement).value,
|
||||
10
|
||||
);
|
||||
const limit = Number.parseInt(
|
||||
(document.querySelector('#searchFilter--limit') as HTMLInputElement).value,
|
||||
10
|
||||
)
|
||||
|
||||
const offsetElement = document.querySelector("#searchFilter--offset") as HTMLInputElement;
|
||||
const offsetElement = document.querySelector(
|
||||
'#searchFilter--offset'
|
||||
) as HTMLInputElement
|
||||
|
||||
function renderLotOccupancies(responseJSON: {
|
||||
count: number;
|
||||
offset: number;
|
||||
lotOccupancies: recordTypes.LotOccupancy[];
|
||||
}) {
|
||||
if (responseJSON.lotOccupancies.length === 0) {
|
||||
searchResultsContainerElement.innerHTML = `<div class="message is-info">
|
||||
function renderLotOccupancies(responseJSON: {
|
||||
count: number
|
||||
offset: number
|
||||
lotOccupancies: recordTypes.LotOccupancy[]
|
||||
}) {
|
||||
if (responseJSON.lotOccupancies.length === 0) {
|
||||
searchResultsContainerElement.innerHTML = `<div class="message is-info">
|
||||
<p class="message-body">
|
||||
There are no ${los.escapedAliases.occupancy} records that meet the search criteria.
|
||||
</p>
|
||||
</div>`;
|
||||
</div>`
|
||||
|
||||
return;
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
const resultsTbodyElement = document.createElement("tbody");
|
||||
const resultsTbodyElement = document.createElement('tbody')
|
||||
|
||||
const nowDateString = cityssm.dateToString(new Date());
|
||||
const nowDateString = cityssm.dateToString(new Date())
|
||||
|
||||
for (const lotOccupancy of responseJSON.lotOccupancies) {
|
||||
let occupancyTimeHTML = "";
|
||||
for (const lotOccupancy of responseJSON.lotOccupancies) {
|
||||
let occupancyTimeHTML = ''
|
||||
|
||||
if (
|
||||
lotOccupancy.occupancyStartDateString! <= nowDateString &&
|
||||
(lotOccupancy.occupancyEndDateString === "" ||
|
||||
lotOccupancy.occupancyEndDateString! >= nowDateString)
|
||||
) {
|
||||
occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Current ${los.escapedAliases.Occupancy}">
|
||||
if (
|
||||
lotOccupancy.occupancyStartDateString! <= nowDateString &&
|
||||
(lotOccupancy.occupancyEndDateString === '' ||
|
||||
lotOccupancy.occupancyEndDateString! >= nowDateString)
|
||||
) {
|
||||
occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Current ${los.escapedAliases.Occupancy}">
|
||||
<i class="fas fa-play" aria-label="Current ${los.escapedAliases.Occupancy}"></i>
|
||||
</span>`;
|
||||
} else if (lotOccupancy.occupancyStartDateString! > nowDateString) {
|
||||
occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Future ${los.escapedAliases.Occupancy}">
|
||||
</span>`
|
||||
} else if (lotOccupancy.occupancyStartDateString! > nowDateString) {
|
||||
occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Future ${los.escapedAliases.Occupancy}">
|
||||
<i class="fas fa-fast-forward" aria-label="Future ${los.escapedAliases.Occupancy}"></i>
|
||||
</span>`;
|
||||
} else {
|
||||
occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Past ${los.escapedAliases.Occupancy}">
|
||||
</span>`
|
||||
} else {
|
||||
occupancyTimeHTML = `<span class="has-tooltip-right" data-tooltip="Past ${los.escapedAliases.Occupancy}">
|
||||
<i class="fas fa-stop" aria-label="Past ${los.escapedAliases.Occupancy}"></i>
|
||||
</span>`;
|
||||
}
|
||||
</span>`
|
||||
}
|
||||
|
||||
let occupantsHTML = "";
|
||||
let occupantsHTML = ''
|
||||
|
||||
for (const occupant of lotOccupancy.lotOccupancyOccupants!) {
|
||||
occupantsHTML +=
|
||||
'<span class="has-tooltip-left" data-tooltip="' +
|
||||
cityssm.escapeHTML(occupant.lotOccupantType || "") +
|
||||
'">' +
|
||||
('<i class="fas fa-fw fa-' +
|
||||
cityssm.escapeHTML(occupant.fontAwesomeIconClass || "user") +
|
||||
'" aria-hidden="true"></i> ') +
|
||||
cityssm.escapeHTML(occupant.occupantName || "") +
|
||||
"</span><br />";
|
||||
}
|
||||
for (const occupant of lotOccupancy.lotOccupancyOccupants!) {
|
||||
occupantsHTML +=
|
||||
'<span class="has-tooltip-left" data-tooltip="' +
|
||||
cityssm.escapeHTML(occupant.lotOccupantType || '') +
|
||||
'">' +
|
||||
('<i class="fas fa-fw fa-' +
|
||||
cityssm.escapeHTML(occupant.fontAwesomeIconClass || 'user') +
|
||||
'" aria-hidden="true"></i> ') +
|
||||
cityssm.escapeHTML(occupant.occupantName || '') +
|
||||
'</span><br />'
|
||||
}
|
||||
|
||||
resultsTbodyElement.insertAdjacentHTML(
|
||||
"beforeend",
|
||||
"<tr>" +
|
||||
('<td class="has-width-1">' + occupancyTimeHTML + "</td>") +
|
||||
("<td>" +
|
||||
'<a class="has-text-weight-bold" href="' +
|
||||
los.getLotOccupancyURL(lotOccupancy.lotOccupancyId!) +
|
||||
'">' +
|
||||
cityssm.escapeHTML(lotOccupancy.occupancyType as string) +
|
||||
"</a>" +
|
||||
"</td>") +
|
||||
("<td>" +
|
||||
(lotOccupancy.lotName
|
||||
? '<a class="has-tooltip-right" data-tooltip="' +
|
||||
cityssm.escapeHTML(lotOccupancy.lotType || "") +
|
||||
'" href="' +
|
||||
los.getLotURL(lotOccupancy.lotId!) +
|
||||
'">' +
|
||||
cityssm.escapeHTML(lotOccupancy.lotName) +
|
||||
"</a>"
|
||||
: '<span class="has-text-grey">(No ' + los.escapedAliases.Lot + ")</span>") +
|
||||
"<br />" +
|
||||
('<span class="is-size-7">' +
|
||||
cityssm.escapeHTML(lotOccupancy.mapName || "") +
|
||||
"</span>") +
|
||||
"</td>") +
|
||||
("<td>" + lotOccupancy.occupancyStartDateString + "</td>") +
|
||||
("<td>" +
|
||||
(lotOccupancy.occupancyEndDate
|
||||
? lotOccupancy.occupancyEndDateString
|
||||
: '<span class="has-text-grey">(No End Date)</span>') +
|
||||
"</td>") +
|
||||
("<td>" + occupantsHTML + "</td>") +
|
||||
"<td>" +
|
||||
(lotOccupancy.printEJS
|
||||
? '<a class="button is-small" data-tooltip="Print" href="' +
|
||||
los.urlPrefix +
|
||||
"/print/" +
|
||||
lotOccupancy.printEJS +
|
||||
"/?lotOccupancyId=" +
|
||||
lotOccupancy.lotOccupancyId +
|
||||
'" target="_blank">' +
|
||||
'<i class="fas fa-print" aria-label="Print"></i>' +
|
||||
"</a>"
|
||||
: "") +
|
||||
"</td>" +
|
||||
"</tr>"
|
||||
);
|
||||
}
|
||||
resultsTbodyElement.insertAdjacentHTML(
|
||||
'beforeend',
|
||||
'<tr>' +
|
||||
('<td class="has-width-1">' + occupancyTimeHTML + '</td>') +
|
||||
('<td>' +
|
||||
'<a class="has-text-weight-bold" href="' +
|
||||
los.getLotOccupancyURL(lotOccupancy.lotOccupancyId!) +
|
||||
'">' +
|
||||
cityssm.escapeHTML(lotOccupancy.occupancyType as string) +
|
||||
'</a>' +
|
||||
'</td>') +
|
||||
('<td>' +
|
||||
(lotOccupancy.lotName
|
||||
? '<a class="has-tooltip-right" data-tooltip="' +
|
||||
cityssm.escapeHTML(lotOccupancy.lotType || '') +
|
||||
'" href="' +
|
||||
los.getLotURL(lotOccupancy.lotId!) +
|
||||
'">' +
|
||||
cityssm.escapeHTML(lotOccupancy.lotName) +
|
||||
'</a>'
|
||||
: '<span class="has-text-grey">(No ' +
|
||||
los.escapedAliases.Lot +
|
||||
')</span>') +
|
||||
'<br />' +
|
||||
('<span class="is-size-7">' +
|
||||
cityssm.escapeHTML(lotOccupancy.mapName || '') +
|
||||
'</span>') +
|
||||
'</td>') +
|
||||
('<td>' + lotOccupancy.occupancyStartDateString + '</td>') +
|
||||
('<td>' +
|
||||
(lotOccupancy.occupancyEndDate
|
||||
? lotOccupancy.occupancyEndDateString
|
||||
: '<span class="has-text-grey">(No End Date)</span>') +
|
||||
'</td>') +
|
||||
('<td>' + occupantsHTML + '</td>') +
|
||||
'<td>' +
|
||||
(lotOccupancy.printEJS
|
||||
? '<a class="button is-small" data-tooltip="Print" href="' +
|
||||
los.urlPrefix +
|
||||
'/print/' +
|
||||
lotOccupancy.printEJS +
|
||||
'/?lotOccupancyId=' +
|
||||
lotOccupancy.lotOccupancyId +
|
||||
'" target="_blank">' +
|
||||
'<i class="fas fa-print" aria-label="Print"></i>' +
|
||||
'</a>'
|
||||
: '') +
|
||||
'</td>' +
|
||||
'</tr>'
|
||||
)
|
||||
}
|
||||
|
||||
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">
|
||||
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">
|
||||
<thead><tr>
|
||||
<th class="has-width-1"></th>
|
||||
<th>${los.escapedAliases.Occupancy} Type</th>
|
||||
|
|
@ -135,63 +143,74 @@ declare const cityssm: cityssmGlobal;
|
|||
<th>${los.escapedAliases.Occupants}</th>
|
||||
<th class="has-width-1"><span class="is-sr-only">Print</span></th>
|
||||
</tr></thead>
|
||||
<table>`;
|
||||
<table>`
|
||||
|
||||
searchResultsContainerElement.querySelector("table")!.append(resultsTbodyElement);
|
||||
searchResultsContainerElement
|
||||
.querySelector('table')!
|
||||
.append(resultsTbodyElement)
|
||||
|
||||
searchResultsContainerElement.insertAdjacentHTML(
|
||||
"beforeend",
|
||||
los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count)
|
||||
);
|
||||
searchResultsContainerElement.insertAdjacentHTML(
|
||||
'beforeend',
|
||||
los.getSearchResultsPagerHTML(
|
||||
limit,
|
||||
responseJSON.offset,
|
||||
responseJSON.count
|
||||
)
|
||||
)
|
||||
|
||||
searchResultsContainerElement
|
||||
.querySelector("button[data-page='previous']")
|
||||
?.addEventListener("click", previousAndGetLotOccupancies);
|
||||
searchResultsContainerElement
|
||||
.querySelector("button[data-page='previous']")
|
||||
?.addEventListener('click', previousAndGetLotOccupancies)
|
||||
|
||||
searchResultsContainerElement
|
||||
.querySelector("button[data-page='next']")
|
||||
?.addEventListener("click", nextAndGetLotOccupancies);
|
||||
}
|
||||
searchResultsContainerElement
|
||||
.querySelector("button[data-page='next']")
|
||||
?.addEventListener('click', nextAndGetLotOccupancies)
|
||||
}
|
||||
|
||||
function getLotOccupancies() {
|
||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(
|
||||
`Loading ${exports.aliases.occupancies}...`
|
||||
);
|
||||
function getLotOccupancies() {
|
||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(
|
||||
`Loading ${exports.aliases.occupancies}...`
|
||||
)
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/lotOccupancies/doSearchLotOccupancies",
|
||||
searchFilterFormElement,
|
||||
renderLotOccupancies
|
||||
);
|
||||
}
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/lotOccupancies/doSearchLotOccupancies',
|
||||
searchFilterFormElement,
|
||||
renderLotOccupancies
|
||||
)
|
||||
}
|
||||
|
||||
function resetOffsetAndGetLotOccupancies() {
|
||||
offsetElement.value = "0";
|
||||
getLotOccupancies();
|
||||
}
|
||||
function resetOffsetAndGetLotOccupancies() {
|
||||
offsetElement.value = '0'
|
||||
getLotOccupancies()
|
||||
}
|
||||
|
||||
function previousAndGetLotOccupancies() {
|
||||
offsetElement.value = Math.max(Number.parseInt(offsetElement.value, 10) - limit, 0).toString();
|
||||
getLotOccupancies();
|
||||
}
|
||||
function previousAndGetLotOccupancies() {
|
||||
offsetElement.value = Math.max(
|
||||
Number.parseInt(offsetElement.value, 10) - limit,
|
||||
0
|
||||
).toString()
|
||||
getLotOccupancies()
|
||||
}
|
||||
|
||||
function nextAndGetLotOccupancies() {
|
||||
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString();
|
||||
getLotOccupancies();
|
||||
}
|
||||
function nextAndGetLotOccupancies() {
|
||||
offsetElement.value = (
|
||||
Number.parseInt(offsetElement.value, 10) + limit
|
||||
).toString()
|
||||
getLotOccupancies()
|
||||
}
|
||||
|
||||
const filterElements = searchFilterFormElement.querySelectorAll("input, select") as NodeListOf<
|
||||
HTMLInputElement | HTMLSelectElement
|
||||
>;
|
||||
const filterElements = searchFilterFormElement.querySelectorAll(
|
||||
'input, select'
|
||||
) as NodeListOf<HTMLInputElement | HTMLSelectElement>
|
||||
|
||||
for (const filterElement of filterElements) {
|
||||
filterElement.addEventListener("change", resetOffsetAndGetLotOccupancies);
|
||||
}
|
||||
for (const filterElement of filterElements) {
|
||||
filterElement.addEventListener('change', resetOffsetAndGetLotOccupancies)
|
||||
}
|
||||
|
||||
searchFilterFormElement.addEventListener("submit", (formEvent) => {
|
||||
formEvent.preventDefault();
|
||||
resetOffsetAndGetLotOccupancies();
|
||||
});
|
||||
searchFilterFormElement.addEventListener('submit', (formEvent) => {
|
||||
formEvent.preventDefault()
|
||||
resetOffsetAndGetLotOccupancies()
|
||||
})
|
||||
|
||||
getLotOccupancies();
|
||||
})();
|
||||
getLotOccupancies()
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -3,10 +3,10 @@
|
|||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
(() => {
|
||||
const los = exports.los;
|
||||
const searchFilterFormElement = document.querySelector("#form--searchFilters");
|
||||
const searchResultsContainerElement = document.querySelector("#container--searchResults");
|
||||
const limit = Number.parseInt(document.querySelector("#searchFilter--limit").value, 10);
|
||||
const offsetElement = document.querySelector("#searchFilter--offset");
|
||||
const searchFilterFormElement = document.querySelector('#form--searchFilters');
|
||||
const searchResultsContainerElement = document.querySelector('#container--searchResults');
|
||||
const limit = Number.parseInt(document.querySelector('#searchFilter--limit').value, 10);
|
||||
const offsetElement = document.querySelector('#searchFilter--offset');
|
||||
function renderLots(responseJSON) {
|
||||
var _a, _b;
|
||||
if (responseJSON.lots.length === 0) {
|
||||
|
|
@ -15,36 +15,36 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
</div>`;
|
||||
return;
|
||||
}
|
||||
const resultsTbodyElement = document.createElement("tbody");
|
||||
const resultsTbodyElement = document.createElement('tbody');
|
||||
for (const lot of responseJSON.lots) {
|
||||
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
|
||||
("<td>" +
|
||||
resultsTbodyElement.insertAdjacentHTML('beforeend', '<tr>' +
|
||||
('<td>' +
|
||||
'<a class="has-text-weight-bold" href="' +
|
||||
los.getLotURL(lot.lotId) +
|
||||
'">' +
|
||||
cityssm.escapeHTML(lot.lotName || "") +
|
||||
"</a>" +
|
||||
"</td>") +
|
||||
("<td>" +
|
||||
cityssm.escapeHTML(lot.lotName || '') +
|
||||
'</a>' +
|
||||
'</td>') +
|
||||
('<td>' +
|
||||
'<a href="' +
|
||||
los.getMapURL(lot.mapId) +
|
||||
'">' +
|
||||
(lot.mapName
|
||||
? cityssm.escapeHTML(lot.mapName)
|
||||
: '<span class="has-text-grey">(No Name)</span>') +
|
||||
"</a>" +
|
||||
"</td>") +
|
||||
("<td>" + cityssm.escapeHTML(lot.lotType || "") + "</td>") +
|
||||
("<td>" +
|
||||
'</a>' +
|
||||
'</td>') +
|
||||
('<td>' + cityssm.escapeHTML(lot.lotType || '') + '</td>') +
|
||||
('<td>' +
|
||||
(lot.lotStatusId
|
||||
? cityssm.escapeHTML(lot.lotStatus || "")
|
||||
? cityssm.escapeHTML(lot.lotStatus || '')
|
||||
: '<span class="has-text-grey">(No Status)</span>') +
|
||||
"<br />" +
|
||||
'<br />' +
|
||||
(lot.lotOccupancyCount > 0
|
||||
? '<span class="is-size-7">Currently Occupied</span>'
|
||||
: "") +
|
||||
"</td>") +
|
||||
"</tr>");
|
||||
: '') +
|
||||
'</td>') +
|
||||
'</tr>');
|
||||
}
|
||||
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">
|
||||
<thead><tr>
|
||||
|
|
@ -54,19 +54,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
<th>Status</th>
|
||||
</tr></thead>
|
||||
<table>`;
|
||||
searchResultsContainerElement.insertAdjacentHTML("beforeend", los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count));
|
||||
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement);
|
||||
searchResultsContainerElement.insertAdjacentHTML('beforeend', los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count));
|
||||
searchResultsContainerElement
|
||||
.querySelector('table')
|
||||
.append(resultsTbodyElement);
|
||||
(_a = searchResultsContainerElement
|
||||
.querySelector("button[data-page='previous']")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", previousAndGetLots);
|
||||
.querySelector("button[data-page='previous']")) === null || _a === void 0 ? void 0 : _a.addEventListener('click', previousAndGetLots);
|
||||
(_b = searchResultsContainerElement
|
||||
.querySelector("button[data-page='next']")) === null || _b === void 0 ? void 0 : _b.addEventListener("click", nextAndGetLots);
|
||||
.querySelector("button[data-page='next']")) === null || _b === void 0 ? void 0 : _b.addEventListener('click', nextAndGetLots);
|
||||
}
|
||||
function getLots() {
|
||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(`Loading ${los.escapedAliases.Lots}...`);
|
||||
cityssm.postJSON(los.urlPrefix + "/lots/doSearchLots", searchFilterFormElement, renderLots);
|
||||
cityssm.postJSON(los.urlPrefix + '/lots/doSearchLots', searchFilterFormElement, renderLots);
|
||||
}
|
||||
function resetOffsetAndGetLots() {
|
||||
offsetElement.value = "0";
|
||||
offsetElement.value = '0';
|
||||
getLots();
|
||||
}
|
||||
function previousAndGetLots() {
|
||||
|
|
@ -77,11 +79,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString();
|
||||
getLots();
|
||||
}
|
||||
const filterElements = searchFilterFormElement.querySelectorAll("input, select");
|
||||
const filterElements = searchFilterFormElement.querySelectorAll('input, select');
|
||||
for (const filterElement of filterElements) {
|
||||
filterElement.addEventListener("change", resetOffsetAndGetLots);
|
||||
filterElement.addEventListener('change', resetOffsetAndGetLots);
|
||||
}
|
||||
searchFilterFormElement.addEventListener("submit", (formEvent) => {
|
||||
searchFilterFormElement.addEventListener('submit', (formEvent) => {
|
||||
formEvent.preventDefault();
|
||||
resetOffsetAndGetLots();
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,130 +1,155 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
|
||||
import type * as globalTypes from "../types/globalTypes";
|
||||
import type * as recordTypes from "../types/recordTypes";
|
||||
import type * as globalTypes from '../types/globalTypes'
|
||||
import type * as recordTypes from '../types/recordTypes'
|
||||
|
||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||
|
||||
declare const cityssm: cityssmGlobal;
|
||||
declare const cityssm: cityssmGlobal
|
||||
|
||||
(() => {
|
||||
const los = exports.los as globalTypes.LOS;
|
||||
;(() => {
|
||||
const los = exports.los as globalTypes.LOS
|
||||
|
||||
const searchFilterFormElement = document.querySelector("#form--searchFilters") as HTMLFormElement;
|
||||
const searchFilterFormElement = document.querySelector(
|
||||
'#form--searchFilters'
|
||||
) as HTMLFormElement
|
||||
|
||||
const searchResultsContainerElement = document.querySelector("#container--searchResults") as HTMLElement;
|
||||
const searchResultsContainerElement = document.querySelector(
|
||||
'#container--searchResults'
|
||||
) as HTMLElement
|
||||
|
||||
const limit = Number.parseInt(
|
||||
(document.querySelector("#searchFilter--limit") as HTMLInputElement).value,
|
||||
10
|
||||
);
|
||||
const offsetElement = document.querySelector("#searchFilter--offset") as HTMLInputElement;
|
||||
const limit = Number.parseInt(
|
||||
(document.querySelector('#searchFilter--limit') as HTMLInputElement).value,
|
||||
10
|
||||
)
|
||||
const offsetElement = document.querySelector(
|
||||
'#searchFilter--offset'
|
||||
) as HTMLInputElement
|
||||
|
||||
function renderLots(responseJSON: { count: number; offset: number; lots: recordTypes.Lot[] }): void {
|
||||
if (responseJSON.lots.length === 0) {
|
||||
searchResultsContainerElement.innerHTML = `<div class="message is-info">
|
||||
function renderLots(responseJSON: {
|
||||
count: number
|
||||
offset: number
|
||||
lots: recordTypes.Lot[]
|
||||
}): void {
|
||||
if (responseJSON.lots.length === 0) {
|
||||
searchResultsContainerElement.innerHTML = `<div class="message is-info">
|
||||
<p class="message-body">There are no ${los.escapedAliases.lots} that meet the search criteria.</p>
|
||||
</div>`;
|
||||
</div>`
|
||||
|
||||
return;
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
const resultsTbodyElement = document.createElement("tbody");
|
||||
const resultsTbodyElement = document.createElement('tbody')
|
||||
|
||||
for (const lot of responseJSON.lots) {
|
||||
resultsTbodyElement.insertAdjacentHTML(
|
||||
"beforeend",
|
||||
"<tr>" +
|
||||
("<td>" +
|
||||
'<a class="has-text-weight-bold" href="' +
|
||||
los.getLotURL(lot.lotId) +
|
||||
'">' +
|
||||
cityssm.escapeHTML(lot.lotName || "") +
|
||||
"</a>" +
|
||||
"</td>") +
|
||||
("<td>" +
|
||||
'<a href="' +
|
||||
los.getMapURL(lot.mapId!) +
|
||||
'">' +
|
||||
(lot.mapName
|
||||
? cityssm.escapeHTML(lot.mapName)
|
||||
: '<span class="has-text-grey">(No Name)</span>') +
|
||||
"</a>" +
|
||||
"</td>") +
|
||||
("<td>" + cityssm.escapeHTML(lot.lotType || "") + "</td>") +
|
||||
("<td>" +
|
||||
(lot.lotStatusId
|
||||
? cityssm.escapeHTML(lot.lotStatus || "")
|
||||
: '<span class="has-text-grey">(No Status)</span>') +
|
||||
"<br />" +
|
||||
(lot.lotOccupancyCount! > 0
|
||||
? '<span class="is-size-7">Currently Occupied</span>'
|
||||
: "") +
|
||||
"</td>") +
|
||||
"</tr>"
|
||||
);
|
||||
}
|
||||
for (const lot of responseJSON.lots) {
|
||||
resultsTbodyElement.insertAdjacentHTML(
|
||||
'beforeend',
|
||||
'<tr>' +
|
||||
('<td>' +
|
||||
'<a class="has-text-weight-bold" href="' +
|
||||
los.getLotURL(lot.lotId) +
|
||||
'">' +
|
||||
cityssm.escapeHTML(lot.lotName || '') +
|
||||
'</a>' +
|
||||
'</td>') +
|
||||
('<td>' +
|
||||
'<a href="' +
|
||||
los.getMapURL(lot.mapId!) +
|
||||
'">' +
|
||||
(lot.mapName
|
||||
? cityssm.escapeHTML(lot.mapName)
|
||||
: '<span class="has-text-grey">(No Name)</span>') +
|
||||
'</a>' +
|
||||
'</td>') +
|
||||
('<td>' + cityssm.escapeHTML(lot.lotType || '') + '</td>') +
|
||||
('<td>' +
|
||||
(lot.lotStatusId
|
||||
? cityssm.escapeHTML(lot.lotStatus || '')
|
||||
: '<span class="has-text-grey">(No Status)</span>') +
|
||||
'<br />' +
|
||||
(lot.lotOccupancyCount! > 0
|
||||
? '<span class="is-size-7">Currently Occupied</span>'
|
||||
: '') +
|
||||
'</td>') +
|
||||
'</tr>'
|
||||
)
|
||||
}
|
||||
|
||||
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">
|
||||
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">
|
||||
<thead><tr>
|
||||
<th>${los.escapedAliases.Lot}</th>
|
||||
<th>${los.escapedAliases.Map}</th>
|
||||
<th>${los.escapedAliases.Lot} Type</th>
|
||||
<th>Status</th>
|
||||
</tr></thead>
|
||||
<table>`;
|
||||
<table>`
|
||||
|
||||
searchResultsContainerElement.insertAdjacentHTML(
|
||||
"beforeend",
|
||||
los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count)
|
||||
);
|
||||
searchResultsContainerElement.insertAdjacentHTML(
|
||||
'beforeend',
|
||||
los.getSearchResultsPagerHTML(
|
||||
limit,
|
||||
responseJSON.offset,
|
||||
responseJSON.count
|
||||
)
|
||||
)
|
||||
|
||||
searchResultsContainerElement.querySelector("table")!.append(resultsTbodyElement);
|
||||
searchResultsContainerElement
|
||||
.querySelector('table')!
|
||||
.append(resultsTbodyElement)
|
||||
|
||||
searchResultsContainerElement
|
||||
.querySelector("button[data-page='previous']")
|
||||
?.addEventListener("click", previousAndGetLots);
|
||||
searchResultsContainerElement
|
||||
.querySelector("button[data-page='previous']")
|
||||
?.addEventListener('click', previousAndGetLots)
|
||||
|
||||
searchResultsContainerElement
|
||||
.querySelector("button[data-page='next']")
|
||||
?.addEventListener("click", nextAndGetLots);
|
||||
}
|
||||
searchResultsContainerElement
|
||||
.querySelector("button[data-page='next']")
|
||||
?.addEventListener('click', nextAndGetLots)
|
||||
}
|
||||
|
||||
function getLots(): void {
|
||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(
|
||||
`Loading ${los.escapedAliases.Lots}...`
|
||||
);
|
||||
function getLots(): void {
|
||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(
|
||||
`Loading ${los.escapedAliases.Lots}...`
|
||||
)
|
||||
|
||||
cityssm.postJSON(los.urlPrefix + "/lots/doSearchLots", searchFilterFormElement, renderLots);
|
||||
}
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/lots/doSearchLots',
|
||||
searchFilterFormElement,
|
||||
renderLots
|
||||
)
|
||||
}
|
||||
|
||||
function resetOffsetAndGetLots(): void {
|
||||
offsetElement.value = "0";
|
||||
getLots();
|
||||
}
|
||||
function resetOffsetAndGetLots(): void {
|
||||
offsetElement.value = '0'
|
||||
getLots()
|
||||
}
|
||||
|
||||
function previousAndGetLots(): void {
|
||||
offsetElement.value = Math.max(Number.parseInt(offsetElement.value, 10) - limit, 0).toString();
|
||||
getLots();
|
||||
}
|
||||
function previousAndGetLots(): void {
|
||||
offsetElement.value = Math.max(
|
||||
Number.parseInt(offsetElement.value, 10) - limit,
|
||||
0
|
||||
).toString()
|
||||
getLots()
|
||||
}
|
||||
|
||||
function nextAndGetLots(): void {
|
||||
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString();
|
||||
getLots();
|
||||
}
|
||||
function nextAndGetLots(): void {
|
||||
offsetElement.value = (
|
||||
Number.parseInt(offsetElement.value, 10) + limit
|
||||
).toString()
|
||||
getLots()
|
||||
}
|
||||
|
||||
const filterElements = searchFilterFormElement.querySelectorAll("input, select") as NodeListOf<
|
||||
HTMLInputElement | HTMLSelectElement
|
||||
>;
|
||||
const filterElements = searchFilterFormElement.querySelectorAll(
|
||||
'input, select'
|
||||
) as NodeListOf<HTMLInputElement | HTMLSelectElement>
|
||||
|
||||
for (const filterElement of filterElements) {
|
||||
filterElement.addEventListener("change", resetOffsetAndGetLots);
|
||||
}
|
||||
for (const filterElement of filterElements) {
|
||||
filterElement.addEventListener('change', resetOffsetAndGetLots)
|
||||
}
|
||||
|
||||
searchFilterFormElement.addEventListener("submit", (formEvent) => {
|
||||
formEvent.preventDefault();
|
||||
resetOffsetAndGetLots();
|
||||
});
|
||||
searchFilterFormElement.addEventListener('submit', (formEvent) => {
|
||||
formEvent.preventDefault()
|
||||
resetOffsetAndGetLots()
|
||||
})
|
||||
|
||||
getLots();
|
||||
})();
|
||||
getLots()
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -2,8 +2,9 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
(() => {
|
||||
const mapContainerElement = document.querySelector("#lot--map");
|
||||
const mapContainerElement = document.querySelector('#lot--map');
|
||||
if (mapContainerElement) {
|
||||
exports.los.highlightMap(mapContainerElement, mapContainerElement.dataset.mapKey, "success");
|
||||
;
|
||||
exports.los.highlightMap(mapContainerElement, mapContainerElement.dataset.mapKey, 'success');
|
||||
}
|
||||
})();
|
||||
|
|
|
|||
|
|
@ -1,15 +1,14 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
|
||||
import * as globalTypes from "../types/globalTypes";
|
||||
import * as globalTypes from '../types/globalTypes'
|
||||
;(() => {
|
||||
const mapContainerElement = document.querySelector('#lot--map') as HTMLElement
|
||||
|
||||
(() => {
|
||||
const mapContainerElement = document.querySelector("#lot--map") as HTMLElement;
|
||||
|
||||
if (mapContainerElement) {
|
||||
(exports.los as globalTypes.LOS).highlightMap(
|
||||
mapContainerElement,
|
||||
mapContainerElement.dataset.mapKey!,
|
||||
"success"
|
||||
);
|
||||
}
|
||||
})();
|
||||
if (mapContainerElement) {
|
||||
;(exports.los as globalTypes.LOS).highlightMap(
|
||||
mapContainerElement,
|
||||
mapContainerElement.dataset.mapKey!,
|
||||
'success'
|
||||
)
|
||||
}
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -28,33 +28,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
let svgElementToHighlight;
|
||||
// eslint-disable-next-line no-constant-condition
|
||||
while (true) {
|
||||
svgElementToHighlight = mapContainerElement.querySelector("#" + svgId);
|
||||
if (svgElementToHighlight || !svgId.includes("-")) {
|
||||
svgElementToHighlight = mapContainerElement.querySelector('#' + svgId);
|
||||
if (svgElementToHighlight || !svgId.includes('-')) {
|
||||
break;
|
||||
}
|
||||
svgId = svgId.slice(0, Math.max(0, svgId.lastIndexOf("-")));
|
||||
svgId = svgId.slice(0, Math.max(0, svgId.lastIndexOf('-')));
|
||||
}
|
||||
if (svgElementToHighlight) {
|
||||
// eslint-disable-next-line unicorn/no-null
|
||||
svgElementToHighlight.style.fill = "";
|
||||
svgElementToHighlight.classList.add("highlight", "is-" + contextualClass);
|
||||
const childPathElements = svgElementToHighlight.querySelectorAll("path");
|
||||
svgElementToHighlight.style.fill = '';
|
||||
svgElementToHighlight.classList.add('highlight', 'is-' + contextualClass);
|
||||
const childPathElements = svgElementToHighlight.querySelectorAll('path');
|
||||
for (const pathElement of childPathElements) {
|
||||
// eslint-disable-next-line unicorn/no-null
|
||||
pathElement.style.fill = "";
|
||||
pathElement.style.fill = '';
|
||||
}
|
||||
}
|
||||
}
|
||||
function unlockField(clickEvent) {
|
||||
const fieldElement = clickEvent.currentTarget.closest(".field");
|
||||
const inputOrSelectElement = fieldElement.querySelector("input, select");
|
||||
inputOrSelectElement.classList.remove("is-readonly");
|
||||
if (inputOrSelectElement.tagName === "INPUT") {
|
||||
const fieldElement = clickEvent.currentTarget.closest('.field');
|
||||
const inputOrSelectElement = fieldElement.querySelector('input, select');
|
||||
inputOrSelectElement.classList.remove('is-readonly');
|
||||
if (inputOrSelectElement.tagName === 'INPUT') {
|
||||
;
|
||||
inputOrSelectElement.readOnly = false;
|
||||
inputOrSelectElement.disabled = false;
|
||||
}
|
||||
else {
|
||||
const optionElements = inputOrSelectElement.querySelectorAll("option");
|
||||
const optionElements = inputOrSelectElement.querySelectorAll('option');
|
||||
for (const optionElement of optionElements) {
|
||||
optionElement.disabled = false;
|
||||
}
|
||||
|
|
@ -62,20 +63,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
inputOrSelectElement.focus();
|
||||
}
|
||||
function initializeUnlockFieldButtons(containerElement) {
|
||||
const unlockFieldButtonElements = containerElement.querySelectorAll(".is-unlock-field-button");
|
||||
const unlockFieldButtonElements = containerElement.querySelectorAll('.is-unlock-field-button');
|
||||
for (const unlockFieldButtonElement of unlockFieldButtonElements) {
|
||||
unlockFieldButtonElement.addEventListener("click", unlockField);
|
||||
unlockFieldButtonElement.addEventListener('click', unlockField);
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Date Pickers
|
||||
*/
|
||||
const datePickerBaseOptions = {
|
||||
type: "date",
|
||||
dateFormat: "yyyy-MM-dd",
|
||||
type: 'date',
|
||||
dateFormat: 'yyyy-MM-dd',
|
||||
showFooter: false,
|
||||
color: "info",
|
||||
displayMode: "dialog"
|
||||
color: 'info',
|
||||
displayMode: 'dialog'
|
||||
};
|
||||
function initializeDatePickers(containerElement) {
|
||||
const dateElements = containerElement.querySelectorAll("input[type='date']");
|
||||
|
|
@ -94,35 +95,35 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
const cal = exports.bulmaCalendar.attach(dateElement, datePickerOptions)[0];
|
||||
// trigger change event on original element
|
||||
cal.on("save", () => {
|
||||
cal.on('save', () => {
|
||||
dateElement.value = cal.value();
|
||||
dateElement.dispatchEvent(new Event("change"));
|
||||
dateElement.dispatchEvent(new Event('change'));
|
||||
});
|
||||
// Disable html scrolling when calendar is open
|
||||
cal.on("show", () => {
|
||||
document.querySelector("html").classList.add("is-clipped");
|
||||
cal.on('show', () => {
|
||||
document.querySelector('html').classList.add('is-clipped');
|
||||
});
|
||||
// Reenable scrolling, if a modal window is not open
|
||||
cal.on("hide", () => {
|
||||
cal.on('hide', () => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
});
|
||||
// Get the datepicker container element
|
||||
const datepickerElement = containerElement.querySelector("#" + cal._id);
|
||||
const datepickerElement = containerElement.querySelector('#' + cal._id);
|
||||
// Override the previous and next month button styles
|
||||
const datePickerNavButtonElements = datepickerElement.querySelectorAll(".datepicker-nav button.is-text");
|
||||
const datePickerNavButtonElements = datepickerElement.querySelectorAll('.datepicker-nav button.is-text');
|
||||
for (const datePickerNavButtonElement of datePickerNavButtonElements) {
|
||||
datePickerNavButtonElement.classList.add("is-" + datePickerBaseOptions.color);
|
||||
datePickerNavButtonElement.classList.remove("is-text");
|
||||
datePickerNavButtonElement.classList.add('is-' + datePickerBaseOptions.color);
|
||||
datePickerNavButtonElement.classList.remove('is-text');
|
||||
}
|
||||
// Override the clear button style
|
||||
const clearButtonElement = datepickerElement.querySelector(".datetimepicker-clear-button");
|
||||
const clearButtonElement = datepickerElement.querySelector('.datetimepicker-clear-button');
|
||||
if (clearButtonElement) {
|
||||
if (dateElement.required) {
|
||||
clearButtonElement.remove();
|
||||
}
|
||||
else {
|
||||
clearButtonElement.dataset.tooltip = "Clear";
|
||||
clearButtonElement.ariaLabel = "Clear";
|
||||
clearButtonElement.dataset.tooltip = 'Clear';
|
||||
clearButtonElement.ariaLabel = 'Clear';
|
||||
clearButtonElement.innerHTML =
|
||||
'<span class="has-text-weight-bold" aria-hidden="true">×</span>';
|
||||
}
|
||||
|
|
@ -130,119 +131,118 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
// Apply a label
|
||||
const labelElement = document.querySelector("label[for='" + dateElement.id + "']");
|
||||
if (labelElement) {
|
||||
datepickerElement.querySelector(".datetimepicker-dummy-input").ariaLabel =
|
||||
labelElement.textContent;
|
||||
datepickerElement.querySelector('.datetimepicker-dummy-input').ariaLabel = labelElement.textContent;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
const timePickerBaseOptions: BulmaCalendarOptions = {
|
||||
type: "time",
|
||||
timeFormat: "hh:mm",
|
||||
color: "info",
|
||||
displayMode: "dialog",
|
||||
validateLabel: "Set Time",
|
||||
minuteSteps: 1
|
||||
};
|
||||
const timePickerBaseOptions: BulmaCalendarOptions = {
|
||||
type: "time",
|
||||
timeFormat: "hh:mm",
|
||||
color: "info",
|
||||
displayMode: "dialog",
|
||||
validateLabel: "Set Time",
|
||||
minuteSteps: 1
|
||||
};
|
||||
|
||||
const initializeTimePickers = (containerElement: HTMLElement) => {
|
||||
const initializeTimePickers = (containerElement: HTMLElement) => {
|
||||
|
||||
const timeElements = containerElement.querySelectorAll(
|
||||
"input[type='time']"
|
||||
) as NodeListOf<HTMLInputElement>;
|
||||
const timeElements = containerElement.querySelectorAll(
|
||||
"input[type='time']"
|
||||
) as NodeListOf<HTMLInputElement>;
|
||||
|
||||
for (const timeElement of timeElements) {
|
||||
const timePickerOptions = Object.assign({}, timePickerBaseOptions);
|
||||
for (const timeElement of timeElements) {
|
||||
const timePickerOptions = Object.assign({}, timePickerBaseOptions);
|
||||
|
||||
if (timeElement.required) {
|
||||
timePickerOptions.showClearButton = false;
|
||||
}
|
||||
if (timeElement.required) {
|
||||
timePickerOptions.showClearButton = false;
|
||||
}
|
||||
|
||||
const cal = exports.bulmaCalendar.attach(timeElement, timePickerOptions)[0];
|
||||
const cal = exports.bulmaCalendar.attach(timeElement, timePickerOptions)[0];
|
||||
|
||||
// trigger change event on original element
|
||||
cal.on("save", () => {
|
||||
timeElement.value = cal.value();
|
||||
timeElement.dispatchEvent(new Event("change"));
|
||||
});
|
||||
// trigger change event on original element
|
||||
cal.on("save", () => {
|
||||
timeElement.value = cal.value();
|
||||
timeElement.dispatchEvent(new Event("change"));
|
||||
});
|
||||
|
||||
// Disable html scrolling when calendar is open
|
||||
cal.on("show", () => {
|
||||
document.querySelector("html")!.classList.add("is-clipped");
|
||||
});
|
||||
// Disable html scrolling when calendar is open
|
||||
cal.on("show", () => {
|
||||
document.querySelector("html")!.classList.add("is-clipped");
|
||||
});
|
||||
|
||||
// Reenable scrolling, if a modal window is not open
|
||||
cal.on("hide", () => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
});
|
||||
// Reenable scrolling, if a modal window is not open
|
||||
cal.on("hide", () => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
});
|
||||
|
||||
// Get the datepicker container element
|
||||
const timePickerElement = containerElement.querySelector("#" + cal._id) as HTMLElement;
|
||||
// Get the datepicker container element
|
||||
const timePickerElement = containerElement.querySelector("#" + cal._id) as HTMLElement;
|
||||
|
||||
// Remove "cancel" button
|
||||
// Remove "cancel" button
|
||||
|
||||
const timePickerCancelButtonElement = timePickerElement.querySelector(
|
||||
".datetimepicker-footer-cancel"
|
||||
);
|
||||
const timePickerCancelButtonElement = timePickerElement.querySelector(
|
||||
".datetimepicker-footer-cancel"
|
||||
);
|
||||
|
||||
if (timePickerCancelButtonElement) {
|
||||
timePickerCancelButtonElement.remove();
|
||||
}
|
||||
if (timePickerCancelButtonElement) {
|
||||
timePickerCancelButtonElement.remove();
|
||||
}
|
||||
|
||||
// Override the clear button style
|
||||
// Override the clear button style
|
||||
|
||||
const clearButtonElement = timePickerElement.querySelector(
|
||||
".datetimepicker-clear-button"
|
||||
) as HTMLElement;
|
||||
const clearButtonElement = timePickerElement.querySelector(
|
||||
".datetimepicker-clear-button"
|
||||
) as HTMLElement;
|
||||
|
||||
if (clearButtonElement) {
|
||||
if (timeElement.required) {
|
||||
clearButtonElement.remove();
|
||||
} else {
|
||||
clearButtonElement.dataset.tooltip = "Clear";
|
||||
clearButtonElement.innerHTML =
|
||||
'<span class="has-text-weight-bold" aria-hidden="true">×</span>';
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
*/
|
||||
if (clearButtonElement) {
|
||||
if (timeElement.required) {
|
||||
clearButtonElement.remove();
|
||||
} else {
|
||||
clearButtonElement.dataset.tooltip = "Clear";
|
||||
clearButtonElement.innerHTML =
|
||||
'<span class="has-text-weight-bold" aria-hidden="true">×</span>';
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
*/
|
||||
/*
|
||||
* Aliases
|
||||
*/
|
||||
function populateAliases(containerElement) {
|
||||
const aliasElements = containerElement.querySelectorAll(".alias");
|
||||
const aliasElements = containerElement.querySelectorAll('.alias');
|
||||
for (const aliasElement of aliasElements) {
|
||||
switch (aliasElement.dataset.alias) {
|
||||
case "Map": {
|
||||
case 'Map': {
|
||||
aliasElement.textContent = exports.aliases.map;
|
||||
break;
|
||||
}
|
||||
case "Lot": {
|
||||
case 'Lot': {
|
||||
aliasElement.textContent = exports.aliases.lot;
|
||||
break;
|
||||
}
|
||||
case "lot": {
|
||||
case 'lot': {
|
||||
aliasElement.textContent = exports.aliases.lot.toLowerCase();
|
||||
break;
|
||||
}
|
||||
case "Occupancy": {
|
||||
case 'Occupancy': {
|
||||
aliasElement.textContent = exports.aliases.occupancy;
|
||||
break;
|
||||
}
|
||||
case "occupancy": {
|
||||
case 'occupancy': {
|
||||
aliasElement.textContent = exports.aliases.occupancy.toLowerCase();
|
||||
break;
|
||||
}
|
||||
case "Occupant": {
|
||||
case 'Occupant': {
|
||||
aliasElement.textContent = exports.aliases.occupant;
|
||||
break;
|
||||
}
|
||||
case "occupant": {
|
||||
case 'occupant': {
|
||||
aliasElement.textContent = exports.aliases.occupant.toLowerCase();
|
||||
break;
|
||||
}
|
||||
case "ExternalReceiptNumber": {
|
||||
case 'ExternalReceiptNumber': {
|
||||
aliasElement.textContent = exports.aliases.externalReceiptNumber;
|
||||
break;
|
||||
}
|
||||
|
|
@ -278,17 +278,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
/*
|
||||
* Colours
|
||||
*/
|
||||
const hues = ["red", "green", "orange", "blue", "pink", "yellow", "purple"];
|
||||
const luminosity = ["bright", "light", "dark"];
|
||||
const hues = ['red', 'green', 'orange', 'blue', 'pink', 'yellow', 'purple'];
|
||||
const luminosity = ['bright', 'light', 'dark'];
|
||||
function getRandomColor(seedString) {
|
||||
let actualSeedString = seedString;
|
||||
if (actualSeedString.length < 2) {
|
||||
actualSeedString = actualSeedString + "a1";
|
||||
actualSeedString = actualSeedString + 'a1';
|
||||
}
|
||||
return exports.randomColor({
|
||||
seed: actualSeedString + actualSeedString,
|
||||
hue: hues[actualSeedString.codePointAt(actualSeedString.length - 1) % hues.length],
|
||||
luminosity: luminosity[actualSeedString.codePointAt(actualSeedString.length - 2) % luminosity.length]
|
||||
luminosity: luminosity[actualSeedString.codePointAt(actualSeedString.length - 2) %
|
||||
luminosity.length]
|
||||
});
|
||||
}
|
||||
/*
|
||||
|
|
@ -298,21 +299,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
return `<div class="field has-addons">
|
||||
<div class="control">
|
||||
<button
|
||||
class="button ${isSmall ? "is-small" : ""} ${upButtonClassNames}"
|
||||
class="button ${isSmall ? 'is-small' : ''} ${upButtonClassNames}"
|
||||
data-tooltip="Move Up" data-direction="up" type="button" aria-label="Move Up">
|
||||
<i class="fas fa-arrow-up" aria-hidden="true"></i>
|
||||
</button>
|
||||
</div>
|
||||
<div class="control">
|
||||
<button
|
||||
class="button ${isSmall ? "is-small" : ""} ${downButtonClassNames}"
|
||||
class="button ${isSmall ? 'is-small' : ''} ${downButtonClassNames}"
|
||||
data-tooltip="Move Down" data-direction="down" type="button" aria-label="Move Down">
|
||||
<i class="fas fa-arrow-down" aria-hidden="true"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>`;
|
||||
}
|
||||
function getLoadingParagraphHTML(captionText = "Loading...") {
|
||||
function getLoadingParagraphHTML(captionText = 'Loading...') {
|
||||
return `<p class="has-text-centered has-text-grey">
|
||||
<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />
|
||||
${cityssm.escapeHTML(captionText)}
|
||||
|
|
@ -322,63 +323,63 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
return ('<div class="level">' +
|
||||
('<div class="level-left">' +
|
||||
'<div class="level-item has-text-weight-bold">' +
|
||||
"Displaying " +
|
||||
'Displaying ' +
|
||||
(offset + 1).toString() +
|
||||
" to " +
|
||||
' to ' +
|
||||
Math.min(count, limit + offset) +
|
||||
" of " +
|
||||
' of ' +
|
||||
count +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
'</div>' +
|
||||
'</div>') +
|
||||
('<div class="level-right">' +
|
||||
(offset > 0
|
||||
? '<div class="level-item">' +
|
||||
'<button class="button is-rounded is-link is-outlined" data-page="previous" type="button" title="Previous">' +
|
||||
'<i class="fas fa-arrow-left" aria-hidden="true"></i>' +
|
||||
"</button>" +
|
||||
"</div>"
|
||||
: "") +
|
||||
'</button>' +
|
||||
'</div>'
|
||||
: '') +
|
||||
(limit + offset < count
|
||||
? '<div class="level-item">' +
|
||||
'<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
|
||||
"<span>Next</span>" +
|
||||
'<span>Next</span>' +
|
||||
'<span class="icon"><i class="fas fa-arrow-right" aria-hidden="true"></i></span>' +
|
||||
"</button>" +
|
||||
"</div>"
|
||||
: "") +
|
||||
"</div>") +
|
||||
"</div>");
|
||||
'</button>' +
|
||||
'</div>'
|
||||
: '') +
|
||||
'</div>') +
|
||||
'</div>');
|
||||
}
|
||||
/*
|
||||
* URLs
|
||||
*/
|
||||
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
||||
const urlPrefix = document.querySelector('main').dataset.urlPrefix;
|
||||
function getRecordURL(recordTypePlural, recordId, edit, time) {
|
||||
return (urlPrefix +
|
||||
"/" +
|
||||
'/' +
|
||||
recordTypePlural +
|
||||
(recordId ? "/" + recordId : "") +
|
||||
(recordId && edit ? "/edit" : "") +
|
||||
(time ? "/?t=" + Date.now() : ""));
|
||||
(recordId ? '/' + recordId : '') +
|
||||
(recordId && edit ? '/edit' : '') +
|
||||
(time ? '/?t=' + Date.now() : ''));
|
||||
}
|
||||
function getMapURL(mapId = "", edit = false, time = false) {
|
||||
return getRecordURL("maps", mapId, edit, time);
|
||||
function getMapURL(mapId = '', edit = false, time = false) {
|
||||
return getRecordURL('maps', mapId, edit, time);
|
||||
}
|
||||
function getLotURL(lotId = "", edit = false, time = false) {
|
||||
return getRecordURL("lots", lotId, edit, time);
|
||||
function getLotURL(lotId = '', edit = false, time = false) {
|
||||
return getRecordURL('lots', lotId, edit, time);
|
||||
}
|
||||
function getLotOccupancyURL(lotOccupancyId = "", edit = false, time = false) {
|
||||
return getRecordURL("lotOccupancies", lotOccupancyId, edit, time);
|
||||
function getLotOccupancyURL(lotOccupancyId = '', edit = false, time = false) {
|
||||
return getRecordURL('lotOccupancies', lotOccupancyId, edit, time);
|
||||
}
|
||||
function getWorkOrderURL(workOrderId = "", edit = false, time = false) {
|
||||
return getRecordURL("workOrders", workOrderId, edit, time);
|
||||
function getWorkOrderURL(workOrderId = '', edit = false, time = false) {
|
||||
return getRecordURL('workOrders', workOrderId, edit, time);
|
||||
}
|
||||
/*
|
||||
* Declare LOS
|
||||
*/
|
||||
const los = {
|
||||
urlPrefix,
|
||||
apiKey: document.querySelector("main").dataset.apiKey,
|
||||
apiKey: document.querySelector('main').dataset.apiKey,
|
||||
highlightMap,
|
||||
initializeUnlockFieldButtons,
|
||||
initializeDatePickers,
|
||||
|
|
|
|||
|
|
@ -1,196 +1,210 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
|
||||
import type * as globalTypes from "../types/globalTypes";
|
||||
import type { Options as BulmaCalendarOptions } from "bulma-calendar";
|
||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
||||
import type * as globalTypes from '../types/globalTypes'
|
||||
import type { Options as BulmaCalendarOptions } from 'bulma-calendar'
|
||||
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||
|
||||
declare const cityssm: cityssmGlobal;
|
||||
declare const bulmaJS: BulmaJS;
|
||||
declare const cityssm: cityssmGlobal
|
||||
declare const bulmaJS: BulmaJS
|
||||
|
||||
(() => {
|
||||
/*
|
||||
* Unsaved Changes
|
||||
*/
|
||||
;(() => {
|
||||
/*
|
||||
* Unsaved Changes
|
||||
*/
|
||||
|
||||
let _hasUnsavedChanges = false;
|
||||
let _hasUnsavedChanges = false
|
||||
|
||||
function setUnsavedChanges() {
|
||||
if (!hasUnsavedChanges()) {
|
||||
_hasUnsavedChanges = true;
|
||||
cityssm.enableNavBlocker();
|
||||
}
|
||||
function setUnsavedChanges() {
|
||||
if (!hasUnsavedChanges()) {
|
||||
_hasUnsavedChanges = true
|
||||
cityssm.enableNavBlocker()
|
||||
}
|
||||
}
|
||||
|
||||
function clearUnsavedChanges() {
|
||||
_hasUnsavedChanges = false
|
||||
cityssm.disableNavBlocker()
|
||||
}
|
||||
|
||||
function hasUnsavedChanges() {
|
||||
return _hasUnsavedChanges
|
||||
}
|
||||
|
||||
/*
|
||||
* Mapping
|
||||
*/
|
||||
|
||||
function highlightMap(
|
||||
mapContainerElement: HTMLElement,
|
||||
mapKey: string,
|
||||
contextualClass: 'success' | 'danger'
|
||||
): void {
|
||||
// Search for ID
|
||||
let svgId = mapKey
|
||||
let svgElementToHighlight: SVGElement | null
|
||||
|
||||
// eslint-disable-next-line no-constant-condition
|
||||
while (true) {
|
||||
svgElementToHighlight = mapContainerElement.querySelector('#' + svgId)
|
||||
|
||||
if (svgElementToHighlight || !svgId.includes('-')) {
|
||||
break
|
||||
}
|
||||
|
||||
svgId = svgId.slice(0, Math.max(0, svgId.lastIndexOf('-')))
|
||||
}
|
||||
|
||||
function clearUnsavedChanges() {
|
||||
_hasUnsavedChanges = false;
|
||||
cityssm.disableNavBlocker();
|
||||
if (svgElementToHighlight) {
|
||||
// eslint-disable-next-line unicorn/no-null
|
||||
svgElementToHighlight.style.fill = ''
|
||||
|
||||
svgElementToHighlight.classList.add('highlight', 'is-' + contextualClass)
|
||||
|
||||
const childPathElements = svgElementToHighlight.querySelectorAll('path')
|
||||
for (const pathElement of childPathElements) {
|
||||
// eslint-disable-next-line unicorn/no-null
|
||||
pathElement.style.fill = ''
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function unlockField(clickEvent: Event): void {
|
||||
const fieldElement = (clickEvent.currentTarget as HTMLElement).closest(
|
||||
'.field'
|
||||
)!
|
||||
|
||||
const inputOrSelectElement = fieldElement.querySelector('input, select') as
|
||||
| HTMLInputElement
|
||||
| HTMLSelectElement
|
||||
|
||||
inputOrSelectElement.classList.remove('is-readonly')
|
||||
|
||||
if (inputOrSelectElement.tagName === 'INPUT') {
|
||||
;(inputOrSelectElement as HTMLInputElement).readOnly = false
|
||||
;(inputOrSelectElement as HTMLInputElement).disabled = false
|
||||
} else {
|
||||
const optionElements = inputOrSelectElement.querySelectorAll('option')
|
||||
for (const optionElement of optionElements) {
|
||||
optionElement.disabled = false
|
||||
}
|
||||
}
|
||||
|
||||
function hasUnsavedChanges() {
|
||||
return _hasUnsavedChanges;
|
||||
inputOrSelectElement.focus()
|
||||
}
|
||||
|
||||
function initializeUnlockFieldButtons(containerElement: HTMLElement): void {
|
||||
const unlockFieldButtonElements = containerElement.querySelectorAll(
|
||||
'.is-unlock-field-button'
|
||||
)
|
||||
|
||||
for (const unlockFieldButtonElement of unlockFieldButtonElements) {
|
||||
unlockFieldButtonElement.addEventListener('click', unlockField)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Mapping
|
||||
*/
|
||||
/*
|
||||
* Date Pickers
|
||||
*/
|
||||
|
||||
function highlightMap(
|
||||
mapContainerElement: HTMLElement,
|
||||
mapKey: string,
|
||||
contextualClass: "success" | "danger"
|
||||
): void {
|
||||
// Search for ID
|
||||
let svgId = mapKey;
|
||||
let svgElementToHighlight: SVGElement | null;
|
||||
const datePickerBaseOptions: BulmaCalendarOptions = {
|
||||
type: 'date',
|
||||
dateFormat: 'yyyy-MM-dd',
|
||||
showFooter: false,
|
||||
color: 'info',
|
||||
displayMode: 'dialog'
|
||||
}
|
||||
|
||||
// eslint-disable-next-line no-constant-condition
|
||||
while (true) {
|
||||
svgElementToHighlight = mapContainerElement.querySelector("#" + svgId);
|
||||
function initializeDatePickers(containerElement: HTMLElement): void {
|
||||
const dateElements = containerElement.querySelectorAll(
|
||||
"input[type='date']"
|
||||
) as NodeListOf<HTMLInputElement>
|
||||
|
||||
if (svgElementToHighlight || !svgId.includes("-")) {
|
||||
break;
|
||||
}
|
||||
for (const dateElement of dateElements) {
|
||||
const datePickerOptions = Object.assign({}, datePickerBaseOptions)
|
||||
|
||||
svgId = svgId.slice(0, Math.max(0, svgId.lastIndexOf("-")));
|
||||
}
|
||||
if (dateElement.required) {
|
||||
datePickerOptions.showClearButton = false
|
||||
}
|
||||
|
||||
if (svgElementToHighlight) {
|
||||
// eslint-disable-next-line unicorn/no-null
|
||||
svgElementToHighlight.style.fill = "";
|
||||
// apply min date if set
|
||||
if (dateElement.min) {
|
||||
datePickerOptions.minDate = cityssm.dateStringToDate(dateElement.min)
|
||||
}
|
||||
|
||||
svgElementToHighlight.classList.add("highlight", "is-" + contextualClass);
|
||||
// apply max date if set
|
||||
if (dateElement.max) {
|
||||
datePickerOptions.maxDate = cityssm.dateStringToDate(dateElement.max)
|
||||
}
|
||||
|
||||
const childPathElements = svgElementToHighlight.querySelectorAll("path");
|
||||
for (const pathElement of childPathElements) {
|
||||
// eslint-disable-next-line unicorn/no-null
|
||||
pathElement.style.fill = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
const cal = exports.bulmaCalendar.attach(
|
||||
dateElement,
|
||||
datePickerOptions
|
||||
)[0]
|
||||
|
||||
function unlockField(clickEvent: Event): void {
|
||||
const fieldElement = (clickEvent.currentTarget as HTMLElement).closest(".field")!;
|
||||
// trigger change event on original element
|
||||
cal.on('save', () => {
|
||||
dateElement.value = cal.value()
|
||||
dateElement.dispatchEvent(new Event('change'))
|
||||
})
|
||||
|
||||
const inputOrSelectElement = fieldElement.querySelector("input, select") as
|
||||
| HTMLInputElement
|
||||
| HTMLSelectElement;
|
||||
// Disable html scrolling when calendar is open
|
||||
cal.on('show', () => {
|
||||
document.querySelector('html')!.classList.add('is-clipped')
|
||||
})
|
||||
|
||||
inputOrSelectElement.classList.remove("is-readonly");
|
||||
// Reenable scrolling, if a modal window is not open
|
||||
cal.on('hide', () => {
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
})
|
||||
|
||||
if (inputOrSelectElement.tagName === "INPUT") {
|
||||
(inputOrSelectElement as HTMLInputElement).readOnly = false;
|
||||
(inputOrSelectElement as HTMLInputElement).disabled = false;
|
||||
// Get the datepicker container element
|
||||
const datepickerElement = containerElement.querySelector(
|
||||
'#' + cal._id
|
||||
) as HTMLElement
|
||||
|
||||
// Override the previous and next month button styles
|
||||
const datePickerNavButtonElements = datepickerElement.querySelectorAll(
|
||||
'.datepicker-nav button.is-text'
|
||||
)
|
||||
|
||||
for (const datePickerNavButtonElement of datePickerNavButtonElements) {
|
||||
datePickerNavButtonElement.classList.add(
|
||||
'is-' + datePickerBaseOptions.color
|
||||
)
|
||||
datePickerNavButtonElement.classList.remove('is-text')
|
||||
}
|
||||
|
||||
// Override the clear button style
|
||||
const clearButtonElement = datepickerElement.querySelector(
|
||||
'.datetimepicker-clear-button'
|
||||
) as HTMLElement
|
||||
|
||||
if (clearButtonElement) {
|
||||
if (dateElement.required) {
|
||||
clearButtonElement.remove()
|
||||
} else {
|
||||
const optionElements = inputOrSelectElement.querySelectorAll("option");
|
||||
for (const optionElement of optionElements) {
|
||||
optionElement.disabled = false;
|
||||
}
|
||||
clearButtonElement.dataset.tooltip = 'Clear'
|
||||
clearButtonElement.ariaLabel = 'Clear'
|
||||
clearButtonElement.innerHTML =
|
||||
'<span class="has-text-weight-bold" aria-hidden="true">×</span>'
|
||||
}
|
||||
}
|
||||
|
||||
inputOrSelectElement.focus();
|
||||
// Apply a label
|
||||
const labelElement = document.querySelector(
|
||||
"label[for='" + dateElement.id + "']"
|
||||
)
|
||||
|
||||
if (labelElement) {
|
||||
datepickerElement.querySelector(
|
||||
'.datetimepicker-dummy-input'
|
||||
)!.ariaLabel = labelElement.textContent
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function initializeUnlockFieldButtons(containerElement: HTMLElement): void {
|
||||
const unlockFieldButtonElements = containerElement.querySelectorAll(".is-unlock-field-button");
|
||||
|
||||
for (const unlockFieldButtonElement of unlockFieldButtonElements) {
|
||||
unlockFieldButtonElement.addEventListener("click", unlockField);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Date Pickers
|
||||
*/
|
||||
|
||||
const datePickerBaseOptions: BulmaCalendarOptions = {
|
||||
type: "date",
|
||||
dateFormat: "yyyy-MM-dd",
|
||||
showFooter: false,
|
||||
color: "info",
|
||||
displayMode: "dialog"
|
||||
};
|
||||
|
||||
function initializeDatePickers(containerElement: HTMLElement): void {
|
||||
const dateElements = containerElement.querySelectorAll(
|
||||
"input[type='date']"
|
||||
) as NodeListOf<HTMLInputElement>;
|
||||
|
||||
for (const dateElement of dateElements) {
|
||||
const datePickerOptions = Object.assign({}, datePickerBaseOptions);
|
||||
|
||||
if (dateElement.required) {
|
||||
datePickerOptions.showClearButton = false;
|
||||
}
|
||||
|
||||
// apply min date if set
|
||||
if (dateElement.min) {
|
||||
datePickerOptions.minDate = cityssm.dateStringToDate(dateElement.min);
|
||||
}
|
||||
|
||||
// apply max date if set
|
||||
if (dateElement.max) {
|
||||
datePickerOptions.maxDate = cityssm.dateStringToDate(dateElement.max);
|
||||
}
|
||||
|
||||
const cal = exports.bulmaCalendar.attach(dateElement, datePickerOptions)[0];
|
||||
|
||||
// trigger change event on original element
|
||||
cal.on("save", () => {
|
||||
dateElement.value = cal.value();
|
||||
dateElement.dispatchEvent(new Event("change"));
|
||||
});
|
||||
|
||||
// Disable html scrolling when calendar is open
|
||||
cal.on("show", () => {
|
||||
document.querySelector("html")!.classList.add("is-clipped");
|
||||
});
|
||||
|
||||
// Reenable scrolling, if a modal window is not open
|
||||
cal.on("hide", () => {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
});
|
||||
|
||||
// Get the datepicker container element
|
||||
const datepickerElement = containerElement.querySelector("#" + cal._id) as HTMLElement;
|
||||
|
||||
// Override the previous and next month button styles
|
||||
const datePickerNavButtonElements = datepickerElement.querySelectorAll(
|
||||
".datepicker-nav button.is-text"
|
||||
);
|
||||
|
||||
for (const datePickerNavButtonElement of datePickerNavButtonElements) {
|
||||
datePickerNavButtonElement.classList.add("is-" + datePickerBaseOptions.color);
|
||||
datePickerNavButtonElement.classList.remove("is-text");
|
||||
}
|
||||
|
||||
// Override the clear button style
|
||||
const clearButtonElement = datepickerElement.querySelector(
|
||||
".datetimepicker-clear-button"
|
||||
) as HTMLElement;
|
||||
|
||||
if (clearButtonElement) {
|
||||
if (dateElement.required) {
|
||||
clearButtonElement.remove();
|
||||
} else {
|
||||
clearButtonElement.dataset.tooltip = "Clear";
|
||||
clearButtonElement.ariaLabel = "Clear";
|
||||
clearButtonElement.innerHTML =
|
||||
'<span class="has-text-weight-bold" aria-hidden="true">×</span>';
|
||||
}
|
||||
}
|
||||
|
||||
// Apply a label
|
||||
const labelElement = document.querySelector("label[for='" + dateElement.id + "']");
|
||||
|
||||
if (labelElement) {
|
||||
datepickerElement.querySelector(".datetimepicker-dummy-input")!.ariaLabel =
|
||||
labelElement.textContent;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
const timePickerBaseOptions: BulmaCalendarOptions = {
|
||||
type: "time",
|
||||
timeFormat: "hh:mm",
|
||||
|
|
@ -263,242 +277,275 @@ declare const bulmaJS: BulmaJS;
|
|||
};
|
||||
*/
|
||||
|
||||
/*
|
||||
* Aliases
|
||||
*/
|
||||
/*
|
||||
* Aliases
|
||||
*/
|
||||
|
||||
function populateAliases(containerElement: HTMLElement): void {
|
||||
const aliasElements = containerElement.querySelectorAll(".alias") as NodeListOf<HTMLElement>;
|
||||
function populateAliases(containerElement: HTMLElement): void {
|
||||
const aliasElements = containerElement.querySelectorAll(
|
||||
'.alias'
|
||||
) as NodeListOf<HTMLElement>
|
||||
|
||||
for (const aliasElement of aliasElements) {
|
||||
switch (aliasElement.dataset.alias) {
|
||||
case "Map": {
|
||||
aliasElement.textContent = exports.aliases.map;
|
||||
break;
|
||||
}
|
||||
case "Lot": {
|
||||
aliasElement.textContent = exports.aliases.lot;
|
||||
break;
|
||||
}
|
||||
case "lot": {
|
||||
aliasElement.textContent = exports.aliases.lot.toLowerCase();
|
||||
break;
|
||||
}
|
||||
case "Occupancy": {
|
||||
aliasElement.textContent = exports.aliases.occupancy;
|
||||
break;
|
||||
}
|
||||
case "occupancy": {
|
||||
aliasElement.textContent = exports.aliases.occupancy.toLowerCase();
|
||||
break;
|
||||
}
|
||||
case "Occupant": {
|
||||
aliasElement.textContent = exports.aliases.occupant;
|
||||
break;
|
||||
}
|
||||
case "occupant": {
|
||||
aliasElement.textContent = exports.aliases.occupant.toLowerCase();
|
||||
break;
|
||||
}
|
||||
case "ExternalReceiptNumber": {
|
||||
aliasElement.textContent = exports.aliases.externalReceiptNumber;
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (const aliasElement of aliasElements) {
|
||||
switch (aliasElement.dataset.alias) {
|
||||
case 'Map': {
|
||||
aliasElement.textContent = exports.aliases.map
|
||||
break
|
||||
}
|
||||
case 'Lot': {
|
||||
aliasElement.textContent = exports.aliases.lot
|
||||
break
|
||||
}
|
||||
case 'lot': {
|
||||
aliasElement.textContent = exports.aliases.lot.toLowerCase()
|
||||
break
|
||||
}
|
||||
case 'Occupancy': {
|
||||
aliasElement.textContent = exports.aliases.occupancy
|
||||
break
|
||||
}
|
||||
case 'occupancy': {
|
||||
aliasElement.textContent = exports.aliases.occupancy.toLowerCase()
|
||||
break
|
||||
}
|
||||
case 'Occupant': {
|
||||
aliasElement.textContent = exports.aliases.occupant
|
||||
break
|
||||
}
|
||||
case 'occupant': {
|
||||
aliasElement.textContent = exports.aliases.occupant.toLowerCase()
|
||||
break
|
||||
}
|
||||
case 'ExternalReceiptNumber': {
|
||||
aliasElement.textContent = exports.aliases.externalReceiptNumber
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const escapedAliases = Object.freeze({
|
||||
Map: cityssm.escapeHTML(exports.aliases.map),
|
||||
map: cityssm.escapeHTML(exports.aliases.map.toLowerCase()),
|
||||
Maps: cityssm.escapeHTML(exports.aliases.maps),
|
||||
maps: cityssm.escapeHTML(exports.aliases.maps.toLowerCase()),
|
||||
|
||||
Lot: cityssm.escapeHTML(exports.aliases.lot),
|
||||
lot: cityssm.escapeHTML(exports.aliases.lot.toLowerCase()),
|
||||
Lots: cityssm.escapeHTML(exports.aliases.lots),
|
||||
lots: cityssm.escapeHTML(exports.aliases.lots.toLowerCase()),
|
||||
|
||||
Occupancy: cityssm.escapeHTML(exports.aliases.occupancy),
|
||||
occupancy: cityssm.escapeHTML(exports.aliases.occupancy.toLowerCase()),
|
||||
Occupancies: cityssm.escapeHTML(exports.aliases.occupancies),
|
||||
occupancies: cityssm.escapeHTML(exports.aliases.occupancies.toLowerCase()),
|
||||
|
||||
Occupant: cityssm.escapeHTML(exports.aliases.occupant),
|
||||
occupant: cityssm.escapeHTML(exports.aliases.occupant.toLowerCase()),
|
||||
Occupants: cityssm.escapeHTML(exports.aliases.occupants),
|
||||
occupants: cityssm.escapeHTML(exports.aliases.occupants.toLowerCase()),
|
||||
|
||||
ExternalReceiptNumber: cityssm.escapeHTML(
|
||||
exports.aliases.externalReceiptNumber
|
||||
),
|
||||
externalReceiptNumber: cityssm.escapeHTML(
|
||||
exports.aliases.externalReceiptNumber.toLowerCase()
|
||||
),
|
||||
|
||||
OccupancyStartDate: cityssm.escapeHTML(exports.aliases.occupancyStartDate),
|
||||
occupancyStartDate: cityssm.escapeHTML(
|
||||
exports.aliases.occupancyStartDate.toLowerCase()
|
||||
),
|
||||
|
||||
WorkOrderOpenDate: cityssm.escapeHTML(exports.aliases.workOrderOpenDate),
|
||||
workOrderOpenDate: cityssm.escapeHTML(
|
||||
exports.aliases.workOrderOpenDate.toLowerCase()
|
||||
),
|
||||
|
||||
WorkOrderCloseDate: cityssm.escapeHTML(exports.aliases.workOrderCloseDate),
|
||||
workOrderCloseDate: cityssm.escapeHTML(
|
||||
exports.aliases.workOrderCloseDate.toLowerCase()
|
||||
)
|
||||
})
|
||||
|
||||
/*
|
||||
* Colours
|
||||
*/
|
||||
|
||||
const hues = ['red', 'green', 'orange', 'blue', 'pink', 'yellow', 'purple']
|
||||
const luminosity = ['bright', 'light', 'dark']
|
||||
|
||||
function getRandomColor(seedString: string) {
|
||||
let actualSeedString = seedString
|
||||
|
||||
if (actualSeedString.length < 2) {
|
||||
actualSeedString = actualSeedString + 'a1'
|
||||
}
|
||||
|
||||
const escapedAliases = Object.freeze({
|
||||
Map: cityssm.escapeHTML(exports.aliases.map),
|
||||
map: cityssm.escapeHTML(exports.aliases.map.toLowerCase()),
|
||||
Maps: cityssm.escapeHTML(exports.aliases.maps),
|
||||
maps: cityssm.escapeHTML(exports.aliases.maps.toLowerCase()),
|
||||
return exports.randomColor({
|
||||
seed: actualSeedString + actualSeedString,
|
||||
hue: hues[
|
||||
actualSeedString.codePointAt(actualSeedString.length - 1)! % hues.length
|
||||
],
|
||||
luminosity:
|
||||
luminosity[
|
||||
actualSeedString.codePointAt(actualSeedString.length - 2)! %
|
||||
luminosity.length
|
||||
]
|
||||
})
|
||||
}
|
||||
|
||||
Lot: cityssm.escapeHTML(exports.aliases.lot),
|
||||
lot: cityssm.escapeHTML(exports.aliases.lot.toLowerCase()),
|
||||
Lots: cityssm.escapeHTML(exports.aliases.lots),
|
||||
lots: cityssm.escapeHTML(exports.aliases.lots.toLowerCase()),
|
||||
/*
|
||||
* Bulma Snippets
|
||||
*/
|
||||
|
||||
Occupancy: cityssm.escapeHTML(exports.aliases.occupancy),
|
||||
occupancy: cityssm.escapeHTML(exports.aliases.occupancy.toLowerCase()),
|
||||
Occupancies: cityssm.escapeHTML(exports.aliases.occupancies),
|
||||
occupancies: cityssm.escapeHTML(exports.aliases.occupancies.toLowerCase()),
|
||||
|
||||
Occupant: cityssm.escapeHTML(exports.aliases.occupant),
|
||||
occupant: cityssm.escapeHTML(exports.aliases.occupant.toLowerCase()),
|
||||
Occupants: cityssm.escapeHTML(exports.aliases.occupants),
|
||||
occupants: cityssm.escapeHTML(exports.aliases.occupants.toLowerCase()),
|
||||
|
||||
ExternalReceiptNumber: cityssm.escapeHTML(exports.aliases.externalReceiptNumber),
|
||||
externalReceiptNumber: cityssm.escapeHTML(exports.aliases.externalReceiptNumber.toLowerCase()),
|
||||
|
||||
OccupancyStartDate: cityssm.escapeHTML(exports.aliases.occupancyStartDate),
|
||||
occupancyStartDate: cityssm.escapeHTML(exports.aliases.occupancyStartDate.toLowerCase()),
|
||||
|
||||
WorkOrderOpenDate: cityssm.escapeHTML(exports.aliases.workOrderOpenDate),
|
||||
workOrderOpenDate: cityssm.escapeHTML(exports.aliases.workOrderOpenDate.toLowerCase()),
|
||||
|
||||
WorkOrderCloseDate: cityssm.escapeHTML(exports.aliases.workOrderCloseDate),
|
||||
workOrderCloseDate: cityssm.escapeHTML(exports.aliases.workOrderCloseDate.toLowerCase())
|
||||
});
|
||||
|
||||
/*
|
||||
* Colours
|
||||
*/
|
||||
|
||||
const hues = ["red", "green", "orange", "blue", "pink", "yellow", "purple"];
|
||||
const luminosity = ["bright", "light", "dark"];
|
||||
|
||||
function getRandomColor(seedString: string) {
|
||||
let actualSeedString = seedString;
|
||||
|
||||
if (actualSeedString.length < 2) {
|
||||
actualSeedString = actualSeedString + "a1";
|
||||
}
|
||||
|
||||
return exports.randomColor({
|
||||
seed: actualSeedString + actualSeedString,
|
||||
hue: hues[actualSeedString.codePointAt(actualSeedString.length - 1)! % hues.length],
|
||||
luminosity:
|
||||
luminosity[actualSeedString.codePointAt(actualSeedString.length - 2)! % luminosity.length]
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
* Bulma Snippets
|
||||
*/
|
||||
|
||||
function getMoveUpDownButtonFieldHTML(
|
||||
upButtonClassNames: string,
|
||||
downButtonClassNames: string,
|
||||
isSmall = true
|
||||
): string {
|
||||
return `<div class="field has-addons">
|
||||
function getMoveUpDownButtonFieldHTML(
|
||||
upButtonClassNames: string,
|
||||
downButtonClassNames: string,
|
||||
isSmall = true
|
||||
): string {
|
||||
return `<div class="field has-addons">
|
||||
<div class="control">
|
||||
<button
|
||||
class="button ${isSmall ? "is-small" : ""} ${upButtonClassNames}"
|
||||
class="button ${
|
||||
isSmall ? 'is-small' : ''
|
||||
} ${upButtonClassNames}"
|
||||
data-tooltip="Move Up" data-direction="up" type="button" aria-label="Move Up">
|
||||
<i class="fas fa-arrow-up" aria-hidden="true"></i>
|
||||
</button>
|
||||
</div>
|
||||
<div class="control">
|
||||
<button
|
||||
class="button ${isSmall ? "is-small" : ""} ${downButtonClassNames}"
|
||||
class="button ${
|
||||
isSmall ? 'is-small' : ''
|
||||
} ${downButtonClassNames}"
|
||||
data-tooltip="Move Down" data-direction="down" type="button" aria-label="Move Down">
|
||||
<i class="fas fa-arrow-down" aria-hidden="true"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>`;
|
||||
}
|
||||
</div>`
|
||||
}
|
||||
|
||||
function getLoadingParagraphHTML(captionText = "Loading..."): string {
|
||||
return `<p class="has-text-centered has-text-grey">
|
||||
function getLoadingParagraphHTML(captionText = 'Loading...'): string {
|
||||
return `<p class="has-text-centered has-text-grey">
|
||||
<i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />
|
||||
${cityssm.escapeHTML(captionText)}
|
||||
</p>`;
|
||||
}
|
||||
</p>`
|
||||
}
|
||||
|
||||
function getSearchResultsPagerHTML(limit: number, offset: number, count: number) {
|
||||
return (
|
||||
'<div class="level">' +
|
||||
('<div class="level-left">' +
|
||||
'<div class="level-item has-text-weight-bold">' +
|
||||
"Displaying " +
|
||||
(offset + 1).toString() +
|
||||
" to " +
|
||||
Math.min(count, limit + offset) +
|
||||
" of " +
|
||||
count +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
('<div class="level-right">' +
|
||||
(offset > 0
|
||||
? '<div class="level-item">' +
|
||||
'<button class="button is-rounded is-link is-outlined" data-page="previous" type="button" title="Previous">' +
|
||||
'<i class="fas fa-arrow-left" aria-hidden="true"></i>' +
|
||||
"</button>" +
|
||||
"</div>"
|
||||
: "") +
|
||||
(limit + offset < count
|
||||
? '<div class="level-item">' +
|
||||
'<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
|
||||
"<span>Next</span>" +
|
||||
'<span class="icon"><i class="fas fa-arrow-right" aria-hidden="true"></i></span>' +
|
||||
"</button>" +
|
||||
"</div>"
|
||||
: "") +
|
||||
"</div>") +
|
||||
"</div>"
|
||||
);
|
||||
}
|
||||
function getSearchResultsPagerHTML(
|
||||
limit: number,
|
||||
offset: number,
|
||||
count: number
|
||||
) {
|
||||
return (
|
||||
'<div class="level">' +
|
||||
('<div class="level-left">' +
|
||||
'<div class="level-item has-text-weight-bold">' +
|
||||
'Displaying ' +
|
||||
(offset + 1).toString() +
|
||||
' to ' +
|
||||
Math.min(count, limit + offset) +
|
||||
' of ' +
|
||||
count +
|
||||
'</div>' +
|
||||
'</div>') +
|
||||
('<div class="level-right">' +
|
||||
(offset > 0
|
||||
? '<div class="level-item">' +
|
||||
'<button class="button is-rounded is-link is-outlined" data-page="previous" type="button" title="Previous">' +
|
||||
'<i class="fas fa-arrow-left" aria-hidden="true"></i>' +
|
||||
'</button>' +
|
||||
'</div>'
|
||||
: '') +
|
||||
(limit + offset < count
|
||||
? '<div class="level-item">' +
|
||||
'<button class="button is-rounded is-link" data-page="next" type="button" title="Next">' +
|
||||
'<span>Next</span>' +
|
||||
'<span class="icon"><i class="fas fa-arrow-right" aria-hidden="true"></i></span>' +
|
||||
'</button>' +
|
||||
'</div>'
|
||||
: '') +
|
||||
'</div>') +
|
||||
'</div>'
|
||||
)
|
||||
}
|
||||
|
||||
/*
|
||||
* URLs
|
||||
*/
|
||||
/*
|
||||
* URLs
|
||||
*/
|
||||
|
||||
const urlPrefix = document.querySelector("main")!.dataset.urlPrefix!;
|
||||
const urlPrefix = document.querySelector('main')!.dataset.urlPrefix!
|
||||
|
||||
function getRecordURL(
|
||||
recordTypePlural: "maps" | "lots" | "lotOccupancies" | "workOrders",
|
||||
recordId: number | string,
|
||||
edit: boolean,
|
||||
time: boolean
|
||||
): string {
|
||||
return (
|
||||
urlPrefix +
|
||||
"/" +
|
||||
recordTypePlural +
|
||||
(recordId ? "/" + recordId : "") +
|
||||
(recordId && edit ? "/edit" : "") +
|
||||
(time ? "/?t=" + Date.now() : "")
|
||||
);
|
||||
}
|
||||
function getRecordURL(
|
||||
recordTypePlural: 'maps' | 'lots' | 'lotOccupancies' | 'workOrders',
|
||||
recordId: number | string,
|
||||
edit: boolean,
|
||||
time: boolean
|
||||
): string {
|
||||
return (
|
||||
urlPrefix +
|
||||
'/' +
|
||||
recordTypePlural +
|
||||
(recordId ? '/' + recordId : '') +
|
||||
(recordId && edit ? '/edit' : '') +
|
||||
(time ? '/?t=' + Date.now() : '')
|
||||
)
|
||||
}
|
||||
|
||||
function getMapURL(mapId: number | string = "", edit = false, time = false) {
|
||||
return getRecordURL("maps", mapId, edit, time);
|
||||
}
|
||||
function getMapURL(mapId: number | string = '', edit = false, time = false) {
|
||||
return getRecordURL('maps', mapId, edit, time)
|
||||
}
|
||||
|
||||
function getLotURL(lotId: number | string = "", edit = false, time = false) {
|
||||
return getRecordURL("lots", lotId, edit, time);
|
||||
}
|
||||
function getLotURL(lotId: number | string = '', edit = false, time = false) {
|
||||
return getRecordURL('lots', lotId, edit, time)
|
||||
}
|
||||
|
||||
function getLotOccupancyURL(lotOccupancyId: number | string = "", edit = false, time = false) {
|
||||
return getRecordURL("lotOccupancies", lotOccupancyId, edit, time);
|
||||
}
|
||||
function getLotOccupancyURL(
|
||||
lotOccupancyId: number | string = '',
|
||||
edit = false,
|
||||
time = false
|
||||
) {
|
||||
return getRecordURL('lotOccupancies', lotOccupancyId, edit, time)
|
||||
}
|
||||
|
||||
function getWorkOrderURL(workOrderId: number | string = "", edit = false, time = false) {
|
||||
return getRecordURL("workOrders", workOrderId, edit, time);
|
||||
}
|
||||
function getWorkOrderURL(
|
||||
workOrderId: number | string = '',
|
||||
edit = false,
|
||||
time = false
|
||||
) {
|
||||
return getRecordURL('workOrders', workOrderId, edit, time)
|
||||
}
|
||||
|
||||
/*
|
||||
* Declare LOS
|
||||
*/
|
||||
/*
|
||||
* Declare LOS
|
||||
*/
|
||||
|
||||
const los: globalTypes.LOS = {
|
||||
urlPrefix,
|
||||
apiKey: document.querySelector("main")!.dataset.apiKey!,
|
||||
highlightMap,
|
||||
initializeUnlockFieldButtons,
|
||||
initializeDatePickers,
|
||||
const los: globalTypes.LOS = {
|
||||
urlPrefix,
|
||||
apiKey: document.querySelector('main')!.dataset.apiKey!,
|
||||
highlightMap,
|
||||
initializeUnlockFieldButtons,
|
||||
initializeDatePickers,
|
||||
|
||||
populateAliases,
|
||||
escapedAliases,
|
||||
populateAliases,
|
||||
escapedAliases,
|
||||
|
||||
getRandomColor,
|
||||
getRandomColor,
|
||||
|
||||
setUnsavedChanges,
|
||||
clearUnsavedChanges,
|
||||
hasUnsavedChanges,
|
||||
setUnsavedChanges,
|
||||
clearUnsavedChanges,
|
||||
hasUnsavedChanges,
|
||||
|
||||
getMoveUpDownButtonFieldHTML,
|
||||
getLoadingParagraphHTML,
|
||||
getSearchResultsPagerHTML,
|
||||
getMoveUpDownButtonFieldHTML,
|
||||
getLoadingParagraphHTML,
|
||||
getSearchResultsPagerHTML,
|
||||
|
||||
getMapURL,
|
||||
getLotURL,
|
||||
getLotOccupancyURL,
|
||||
getWorkOrderURL
|
||||
};
|
||||
getMapURL,
|
||||
getLotURL,
|
||||
getLotOccupancyURL,
|
||||
getWorkOrderURL
|
||||
}
|
||||
|
||||
exports.los = los;
|
||||
})();
|
||||
exports.los = los
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -4,42 +4,45 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
(() => {
|
||||
var _a;
|
||||
const los = exports.los;
|
||||
const mapId = document.querySelector("#map--mapId").value;
|
||||
const isCreate = mapId === "";
|
||||
const mapForm = document.querySelector("#form--map");
|
||||
const mapId = document.querySelector('#map--mapId')
|
||||
.value;
|
||||
const isCreate = mapId === '';
|
||||
const mapForm = document.querySelector('#form--map');
|
||||
function updateMap(formEvent) {
|
||||
formEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/maps/" + (isCreate ? "doCreateMap" : "doUpdateMap"), mapForm, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/maps/' + (isCreate ? 'doCreateMap' : 'doUpdateMap'), mapForm, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
cityssm.disableNavBlocker();
|
||||
if (isCreate) {
|
||||
window.location.href = los.urlPrefix + "/maps/" + responseJSON.mapId + "/edit";
|
||||
window.location.href =
|
||||
los.urlPrefix + '/maps/' + responseJSON.mapId + '/edit';
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
message: exports.aliases.map + " Updated Successfully",
|
||||
contextualColorName: "success"
|
||||
message: exports.aliases.map + ' Updated Successfully',
|
||||
contextualColorName: 'success'
|
||||
});
|
||||
}
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating " + exports.aliases.map,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Updating ' + exports.aliases.map,
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
mapForm.addEventListener("submit", updateMap);
|
||||
const inputElements = mapForm.querySelectorAll("input, select");
|
||||
mapForm.addEventListener('submit', updateMap);
|
||||
const inputElements = mapForm.querySelectorAll('input, select');
|
||||
for (const inputElement of inputElements) {
|
||||
inputElement.addEventListener("change", cityssm.enableNavBlocker);
|
||||
inputElement.addEventListener('change', cityssm.enableNavBlocker);
|
||||
}
|
||||
(_a = document.querySelector("#button--deleteMap")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", (clickEvent) => {
|
||||
(_a = document
|
||||
.querySelector('#button--deleteMap')) === null || _a === void 0 ? void 0 : _a.addEventListener('click', (clickEvent) => {
|
||||
clickEvent.preventDefault();
|
||||
function doDelete() {
|
||||
cityssm.postJSON(los.urlPrefix + "/maps/doDeleteMap", {
|
||||
cityssm.postJSON(los.urlPrefix + '/maps/doDeleteMap', {
|
||||
mapId
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
|
|
@ -47,17 +50,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Deleting " + exports.aliases.map,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Deleting ' + exports.aliases.map,
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
bulmaJS.confirm({
|
||||
title: "Delete " + exports.aliases.map,
|
||||
title: 'Delete ' + exports.aliases.map,
|
||||
message: `Are you sure you want to delete this ${exports.aliases.map.toLowerCase()} and all related ${exports.aliases.lots.toLowerCase()}?`,
|
||||
contextualColorName: "warning",
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: `Yes, Delete ${exports.aliases.map}`,
|
||||
callbackFunction: doDelete
|
||||
|
|
|
|||
|
|
@ -1,91 +1,99 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
|
||||
import type * as globalTypes from "../types/globalTypes";
|
||||
import type * as globalTypes from '../types/globalTypes'
|
||||
|
||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
||||
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||
|
||||
declare const cityssm: cityssmGlobal;
|
||||
declare const bulmaJS: BulmaJS;
|
||||
declare const cityssm: cityssmGlobal
|
||||
declare const bulmaJS: BulmaJS
|
||||
|
||||
(() => {
|
||||
const los = exports.los as globalTypes.LOS;
|
||||
;(() => {
|
||||
const los = exports.los as globalTypes.LOS
|
||||
|
||||
const mapId = (document.querySelector("#map--mapId") as HTMLInputElement).value;
|
||||
const isCreate = mapId === "";
|
||||
const mapId = (document.querySelector('#map--mapId') as HTMLInputElement)
|
||||
.value
|
||||
const isCreate = mapId === ''
|
||||
|
||||
const mapForm = document.querySelector("#form--map") as HTMLFormElement;
|
||||
const mapForm = document.querySelector('#form--map') as HTMLFormElement
|
||||
|
||||
function updateMap(formEvent: SubmitEvent) {
|
||||
formEvent.preventDefault();
|
||||
function updateMap(formEvent: SubmitEvent) {
|
||||
formEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/maps/" + (isCreate ? "doCreateMap" : "doUpdateMap"),
|
||||
mapForm,
|
||||
(responseJSON: { success: boolean; mapId?: number; errorMessage?: string }) => {
|
||||
if (responseJSON.success) {
|
||||
cityssm.disableNavBlocker();
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/maps/' + (isCreate ? 'doCreateMap' : 'doUpdateMap'),
|
||||
mapForm,
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
mapId?: number
|
||||
errorMessage?: string
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
cityssm.disableNavBlocker()
|
||||
|
||||
if (isCreate) {
|
||||
window.location.href = los.urlPrefix + "/maps/" + responseJSON.mapId + "/edit";
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
message: exports.aliases.map + " Updated Successfully",
|
||||
contextualColorName: "success"
|
||||
});
|
||||
}
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating " + exports.aliases.map,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
mapForm.addEventListener("submit", updateMap);
|
||||
|
||||
const inputElements = mapForm.querySelectorAll("input, select") as NodeListOf<
|
||||
HTMLInputElement | HTMLSelectElement
|
||||
>;
|
||||
|
||||
for (const inputElement of inputElements) {
|
||||
inputElement.addEventListener("change", cityssm.enableNavBlocker);
|
||||
}
|
||||
|
||||
document.querySelector("#button--deleteMap")?.addEventListener("click", (clickEvent) => {
|
||||
clickEvent.preventDefault();
|
||||
|
||||
function doDelete() {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/maps/doDeleteMap",
|
||||
{
|
||||
mapId
|
||||
},
|
||||
(responseJSON: { success: boolean; errorMessage?: string }) => {
|
||||
if (responseJSON.success) {
|
||||
window.location.href = los.getMapURL();
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Deleting " + exports.aliases.map,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
if (isCreate) {
|
||||
window.location.href =
|
||||
los.urlPrefix + '/maps/' + responseJSON.mapId + '/edit'
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
message: exports.aliases.map + ' Updated Successfully',
|
||||
contextualColorName: 'success'
|
||||
})
|
||||
}
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: 'Error Updating ' + exports.aliases.map,
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
bulmaJS.confirm({
|
||||
title: "Delete " + exports.aliases.map,
|
||||
message: `Are you sure you want to delete this ${exports.aliases.map.toLowerCase()} and all related ${exports.aliases.lots.toLowerCase()}?`,
|
||||
contextualColorName: "warning",
|
||||
okButton: {
|
||||
text: `Yes, Delete ${exports.aliases.map}`,
|
||||
callbackFunction: doDelete
|
||||
mapForm.addEventListener('submit', updateMap)
|
||||
|
||||
const inputElements = mapForm.querySelectorAll('input, select') as NodeListOf<
|
||||
HTMLInputElement | HTMLSelectElement
|
||||
>
|
||||
|
||||
for (const inputElement of inputElements) {
|
||||
inputElement.addEventListener('change', cityssm.enableNavBlocker)
|
||||
}
|
||||
|
||||
document
|
||||
.querySelector('#button--deleteMap')
|
||||
?.addEventListener('click', (clickEvent) => {
|
||||
clickEvent.preventDefault()
|
||||
|
||||
function doDelete() {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/maps/doDeleteMap',
|
||||
{
|
||||
mapId
|
||||
},
|
||||
(responseJSON: { success: boolean; errorMessage?: string }) => {
|
||||
if (responseJSON.success) {
|
||||
window.location.href = los.getMapURL()
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: 'Error Deleting ' + exports.aliases.map,
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
});
|
||||
});
|
||||
})();
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
bulmaJS.confirm({
|
||||
title: 'Delete ' + exports.aliases.map,
|
||||
message: `Are you sure you want to delete this ${exports.aliases.map.toLowerCase()} and all related ${exports.aliases.lots.toLowerCase()}?`,
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: `Yes, Delete ${exports.aliases.map}`,
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
})
|
||||
})
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -4,13 +4,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
(() => {
|
||||
const los = exports.los;
|
||||
const maps = exports.maps;
|
||||
const searchFilterElement = document.querySelector("#searchFilter--map");
|
||||
const searchResultsContainerElement = document.querySelector("#container--searchResults");
|
||||
const searchFilterElement = document.querySelector('#searchFilter--map');
|
||||
const searchResultsContainerElement = document.querySelector('#container--searchResults');
|
||||
function renderResults() {
|
||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(`Loading ${los.escapedAliases.Maps}...`);
|
||||
let searchResultCount = 0;
|
||||
const searchResultsTbodyElement = document.createElement("tbody");
|
||||
const filterStringSplit = searchFilterElement.value.trim().toLowerCase().split(" ");
|
||||
const searchResultsTbodyElement = document.createElement('tbody');
|
||||
const filterStringSplit = searchFilterElement.value
|
||||
.trim()
|
||||
.toLowerCase()
|
||||
.split(' ');
|
||||
for (const map of maps) {
|
||||
const mapSearchString = `${map.mapName} ${map.mapDescription} ${map.mapAddress1} ${map.mapAddress2}`.toLowerCase();
|
||||
let showMap = true;
|
||||
|
|
@ -24,62 +27,66 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
continue;
|
||||
}
|
||||
searchResultCount += 1;
|
||||
searchResultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
|
||||
("<td>" +
|
||||
searchResultsTbodyElement.insertAdjacentHTML('beforeend', '<tr>' +
|
||||
('<td>' +
|
||||
'<a class="has-text-weight-bold" href="' +
|
||||
los.urlPrefix +
|
||||
"/maps/" +
|
||||
'/maps/' +
|
||||
map.mapId +
|
||||
'">' +
|
||||
cityssm.escapeHTML(map.mapName || "(No Name)") +
|
||||
"</a><br />" +
|
||||
cityssm.escapeHTML(map.mapName || '(No Name)') +
|
||||
'</a><br />' +
|
||||
'<span class="is-size-7">' +
|
||||
cityssm.escapeHTML(map.mapDescription || "") +
|
||||
"</span>" +
|
||||
"</td>") +
|
||||
("<td>" +
|
||||
(map.mapAddress1 ? cityssm.escapeHTML(map.mapAddress1) + "<br />" : "") +
|
||||
(map.mapAddress2 ? cityssm.escapeHTML(map.mapAddress2) + "<br />" : "") +
|
||||
cityssm.escapeHTML(map.mapDescription || '') +
|
||||
'</span>' +
|
||||
'</td>') +
|
||||
('<td>' +
|
||||
(map.mapAddress1
|
||||
? cityssm.escapeHTML(map.mapAddress1) + '<br />'
|
||||
: '') +
|
||||
(map.mapAddress2
|
||||
? cityssm.escapeHTML(map.mapAddress2) + '<br />'
|
||||
: '') +
|
||||
(map.mapCity || map.mapProvince
|
||||
? cityssm.escapeHTML(map.mapCity || "") +
|
||||
", " +
|
||||
cityssm.escapeHTML(map.mapProvince || "") +
|
||||
"<br />"
|
||||
: "") +
|
||||
(map.mapPostalCode ? cityssm.escapeHTML(map.mapPostalCode) : "") +
|
||||
"</td>") +
|
||||
("<td>" + cityssm.escapeHTML(map.mapPhoneNumber || "") + "</td>") +
|
||||
? cityssm.escapeHTML(map.mapCity || '') +
|
||||
', ' +
|
||||
cityssm.escapeHTML(map.mapProvince || '') +
|
||||
'<br />'
|
||||
: '') +
|
||||
(map.mapPostalCode ? cityssm.escapeHTML(map.mapPostalCode) : '') +
|
||||
'</td>') +
|
||||
('<td>' + cityssm.escapeHTML(map.mapPhoneNumber || '') + '</td>') +
|
||||
'<td class="has-text-centered">' +
|
||||
(map.mapLatitude && map.mapLongitude
|
||||
? '<span data-tooltip="Has Geographic Coordinates"><i class="fas fa-map-marker-alt" aria-label="Has Geographic Coordinates"></i></span>'
|
||||
: "") +
|
||||
"</td>" +
|
||||
: '') +
|
||||
'</td>' +
|
||||
'<td class="has-text-centered">' +
|
||||
(map.mapSVG
|
||||
? '<span data-tooltip="Has Image"><i class="fas fa-image" aria-label="Has Image"></i></span>'
|
||||
: "") +
|
||||
"</td>" +
|
||||
: '') +
|
||||
'</td>' +
|
||||
('<td class="has-text-right">' +
|
||||
'<a href="' +
|
||||
los.urlPrefix +
|
||||
"/lots?mapId=" +
|
||||
'/lots?mapId=' +
|
||||
map.mapId +
|
||||
'">' +
|
||||
map.lotCount +
|
||||
"</a>" +
|
||||
"</td>") +
|
||||
"</tr>");
|
||||
'</a>' +
|
||||
'</td>') +
|
||||
'</tr>');
|
||||
}
|
||||
searchResultsContainerElement.innerHTML = "";
|
||||
searchResultsContainerElement.innerHTML = '';
|
||||
if (searchResultCount === 0) {
|
||||
searchResultsContainerElement.innerHTML = `<div class="message is-info">
|
||||
<p class="message-body">There are no ${los.escapedAliases.maps} that meet the search criteria.</p>
|
||||
</div>`;
|
||||
}
|
||||
else {
|
||||
const searchResultsTableElement = document.createElement("table");
|
||||
const searchResultsTableElement = document.createElement('table');
|
||||
searchResultsTableElement.className =
|
||||
"table is-fullwidth is-striped is-hoverable has-sticky-header";
|
||||
'table is-fullwidth is-striped is-hoverable has-sticky-header';
|
||||
searchResultsTableElement.innerHTML = `<thead><tr>
|
||||
<th>${los.escapedAliases.Map}</th>
|
||||
<th>Address</th>
|
||||
|
|
@ -92,8 +99,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
searchResultsContainerElement.append(searchResultsTableElement);
|
||||
}
|
||||
}
|
||||
searchFilterElement.addEventListener("keyup", renderResults);
|
||||
document.querySelector("#form--searchFilters").addEventListener("submit", (formEvent) => {
|
||||
searchFilterElement.addEventListener('keyup', renderResults);
|
||||
document
|
||||
.querySelector('#form--searchFilters')
|
||||
.addEventListener('submit', (formEvent) => {
|
||||
formEvent.preventDefault();
|
||||
renderResults();
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,133 +1,146 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
|
||||
import type * as globalTypes from "../types/globalTypes";
|
||||
import type * as recordTypes from "../types/recordTypes";
|
||||
import type * as globalTypes from '../types/globalTypes'
|
||||
import type * as recordTypes from '../types/recordTypes'
|
||||
|
||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||
|
||||
declare const cityssm: cityssmGlobal;
|
||||
declare const cityssm: cityssmGlobal
|
||||
|
||||
(() => {
|
||||
const los = exports.los as globalTypes.LOS;
|
||||
;(() => {
|
||||
const los = exports.los as globalTypes.LOS
|
||||
|
||||
const maps: recordTypes.Map[] = exports.maps;
|
||||
const maps: recordTypes.Map[] = exports.maps
|
||||
|
||||
const searchFilterElement = document.querySelector("#searchFilter--map") as HTMLInputElement;
|
||||
const searchFilterElement = document.querySelector(
|
||||
'#searchFilter--map'
|
||||
) as HTMLInputElement
|
||||
|
||||
const searchResultsContainerElement = document.querySelector("#container--searchResults") as HTMLElement;
|
||||
const searchResultsContainerElement = document.querySelector(
|
||||
'#container--searchResults'
|
||||
) as HTMLElement
|
||||
|
||||
function renderResults(): void {
|
||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(
|
||||
`Loading ${los.escapedAliases.Maps}...`
|
||||
);
|
||||
function renderResults(): void {
|
||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(
|
||||
`Loading ${los.escapedAliases.Maps}...`
|
||||
)
|
||||
|
||||
let searchResultCount = 0;
|
||||
const searchResultsTbodyElement = document.createElement("tbody");
|
||||
let searchResultCount = 0
|
||||
const searchResultsTbodyElement = document.createElement('tbody')
|
||||
|
||||
const filterStringSplit = searchFilterElement.value.trim().toLowerCase().split(" ");
|
||||
const filterStringSplit = searchFilterElement.value
|
||||
.trim()
|
||||
.toLowerCase()
|
||||
.split(' ')
|
||||
|
||||
for (const map of maps) {
|
||||
const mapSearchString =
|
||||
`${map.mapName} ${map.mapDescription} ${map.mapAddress1} ${map.mapAddress2}`.toLowerCase();
|
||||
for (const map of maps) {
|
||||
const mapSearchString =
|
||||
`${map.mapName} ${map.mapDescription} ${map.mapAddress1} ${map.mapAddress2}`.toLowerCase()
|
||||
|
||||
let showMap = true;
|
||||
let showMap = true
|
||||
|
||||
for (const filterStringPiece of filterStringSplit) {
|
||||
if (!mapSearchString.includes(filterStringPiece)) {
|
||||
showMap = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!showMap) {
|
||||
continue;
|
||||
}
|
||||
|
||||
searchResultCount += 1;
|
||||
|
||||
searchResultsTbodyElement.insertAdjacentHTML(
|
||||
"beforeend",
|
||||
"<tr>" +
|
||||
("<td>" +
|
||||
'<a class="has-text-weight-bold" href="' +
|
||||
los.urlPrefix +
|
||||
"/maps/" +
|
||||
map.mapId +
|
||||
'">' +
|
||||
cityssm.escapeHTML(map.mapName || "(No Name)") +
|
||||
"</a><br />" +
|
||||
'<span class="is-size-7">' +
|
||||
cityssm.escapeHTML(map.mapDescription || "") +
|
||||
"</span>" +
|
||||
"</td>") +
|
||||
("<td>" +
|
||||
(map.mapAddress1 ? cityssm.escapeHTML(map.mapAddress1) + "<br />" : "") +
|
||||
(map.mapAddress2 ? cityssm.escapeHTML(map.mapAddress2) + "<br />" : "") +
|
||||
(map.mapCity || map.mapProvince
|
||||
? cityssm.escapeHTML(map.mapCity || "") +
|
||||
", " +
|
||||
cityssm.escapeHTML(map.mapProvince || "") +
|
||||
"<br />"
|
||||
: "") +
|
||||
(map.mapPostalCode ? cityssm.escapeHTML(map.mapPostalCode) : "") +
|
||||
"</td>") +
|
||||
("<td>" + cityssm.escapeHTML(map.mapPhoneNumber || "") + "</td>") +
|
||||
'<td class="has-text-centered">' +
|
||||
(map.mapLatitude && map.mapLongitude
|
||||
? '<span data-tooltip="Has Geographic Coordinates"><i class="fas fa-map-marker-alt" aria-label="Has Geographic Coordinates"></i></span>'
|
||||
: "") +
|
||||
"</td>" +
|
||||
'<td class="has-text-centered">' +
|
||||
(map.mapSVG
|
||||
? '<span data-tooltip="Has Image"><i class="fas fa-image" aria-label="Has Image"></i></span>'
|
||||
: "") +
|
||||
"</td>" +
|
||||
('<td class="has-text-right">' +
|
||||
'<a href="' +
|
||||
los.urlPrefix +
|
||||
"/lots?mapId=" +
|
||||
map.mapId +
|
||||
'">' +
|
||||
map.lotCount +
|
||||
"</a>" +
|
||||
"</td>") +
|
||||
"</tr>"
|
||||
);
|
||||
for (const filterStringPiece of filterStringSplit) {
|
||||
if (!mapSearchString.includes(filterStringPiece)) {
|
||||
showMap = false
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
searchResultsContainerElement.innerHTML = "";
|
||||
if (!showMap) {
|
||||
continue
|
||||
}
|
||||
|
||||
if (searchResultCount === 0) {
|
||||
searchResultsContainerElement.innerHTML = `<div class="message is-info">
|
||||
searchResultCount += 1
|
||||
|
||||
searchResultsTbodyElement.insertAdjacentHTML(
|
||||
'beforeend',
|
||||
'<tr>' +
|
||||
('<td>' +
|
||||
'<a class="has-text-weight-bold" href="' +
|
||||
los.urlPrefix +
|
||||
'/maps/' +
|
||||
map.mapId +
|
||||
'">' +
|
||||
cityssm.escapeHTML(map.mapName || '(No Name)') +
|
||||
'</a><br />' +
|
||||
'<span class="is-size-7">' +
|
||||
cityssm.escapeHTML(map.mapDescription || '') +
|
||||
'</span>' +
|
||||
'</td>') +
|
||||
('<td>' +
|
||||
(map.mapAddress1
|
||||
? cityssm.escapeHTML(map.mapAddress1) + '<br />'
|
||||
: '') +
|
||||
(map.mapAddress2
|
||||
? cityssm.escapeHTML(map.mapAddress2) + '<br />'
|
||||
: '') +
|
||||
(map.mapCity || map.mapProvince
|
||||
? cityssm.escapeHTML(map.mapCity || '') +
|
||||
', ' +
|
||||
cityssm.escapeHTML(map.mapProvince || '') +
|
||||
'<br />'
|
||||
: '') +
|
||||
(map.mapPostalCode ? cityssm.escapeHTML(map.mapPostalCode) : '') +
|
||||
'</td>') +
|
||||
('<td>' + cityssm.escapeHTML(map.mapPhoneNumber || '') + '</td>') +
|
||||
'<td class="has-text-centered">' +
|
||||
(map.mapLatitude && map.mapLongitude
|
||||
? '<span data-tooltip="Has Geographic Coordinates"><i class="fas fa-map-marker-alt" aria-label="Has Geographic Coordinates"></i></span>'
|
||||
: '') +
|
||||
'</td>' +
|
||||
'<td class="has-text-centered">' +
|
||||
(map.mapSVG
|
||||
? '<span data-tooltip="Has Image"><i class="fas fa-image" aria-label="Has Image"></i></span>'
|
||||
: '') +
|
||||
'</td>' +
|
||||
('<td class="has-text-right">' +
|
||||
'<a href="' +
|
||||
los.urlPrefix +
|
||||
'/lots?mapId=' +
|
||||
map.mapId +
|
||||
'">' +
|
||||
map.lotCount +
|
||||
'</a>' +
|
||||
'</td>') +
|
||||
'</tr>'
|
||||
)
|
||||
}
|
||||
|
||||
searchResultsContainerElement.innerHTML = ''
|
||||
|
||||
if (searchResultCount === 0) {
|
||||
searchResultsContainerElement.innerHTML = `<div class="message is-info">
|
||||
<p class="message-body">There are no ${los.escapedAliases.maps} that meet the search criteria.</p>
|
||||
</div>`;
|
||||
} else {
|
||||
const searchResultsTableElement = document.createElement("table");
|
||||
</div>`
|
||||
} else {
|
||||
const searchResultsTableElement = document.createElement('table')
|
||||
|
||||
searchResultsTableElement.className =
|
||||
"table is-fullwidth is-striped is-hoverable has-sticky-header";
|
||||
searchResultsTableElement.className =
|
||||
'table is-fullwidth is-striped is-hoverable has-sticky-header'
|
||||
|
||||
searchResultsTableElement.innerHTML = `<thead><tr>
|
||||
searchResultsTableElement.innerHTML = `<thead><tr>
|
||||
<th>${los.escapedAliases.Map}</th>
|
||||
<th>Address</th>
|
||||
<th>Phone Number</th>
|
||||
<th class="has-text-centered">Coordinates</th>
|
||||
<th class="has-text-centered">Image</th>
|
||||
<th class="has-text-right">${los.escapedAliases.Lot} Count</th>
|
||||
</tr></thead>`;
|
||||
</tr></thead>`
|
||||
|
||||
searchResultsTableElement.append(searchResultsTbodyElement);
|
||||
searchResultsTableElement.append(searchResultsTbodyElement)
|
||||
|
||||
searchResultsContainerElement.append(searchResultsTableElement);
|
||||
}
|
||||
searchResultsContainerElement.append(searchResultsTableElement)
|
||||
}
|
||||
}
|
||||
|
||||
searchFilterElement.addEventListener("keyup", renderResults);
|
||||
searchFilterElement.addEventListener('keyup', renderResults)
|
||||
|
||||
document.querySelector("#form--searchFilters")!.addEventListener("submit", (formEvent) => {
|
||||
formEvent.preventDefault();
|
||||
renderResults();
|
||||
});
|
||||
document
|
||||
.querySelector('#form--searchFilters')!
|
||||
.addEventListener('submit', (formEvent) => {
|
||||
formEvent.preventDefault()
|
||||
renderResults()
|
||||
})
|
||||
|
||||
renderResults();
|
||||
})();
|
||||
renderResults()
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
(() => {
|
||||
const mapContainerElement = document.querySelector("#map--leaflet");
|
||||
const mapContainerElement = document.querySelector('#map--leaflet');
|
||||
if (mapContainerElement) {
|
||||
const mapLatitude = Number.parseFloat(mapContainerElement.dataset.mapLatitude);
|
||||
const mapLongitude = Number.parseFloat(mapContainerElement.dataset.mapLongitude);
|
||||
|
|
@ -10,9 +10,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
// eslint-disable-next-line unicorn/no-array-callback-reference
|
||||
const map = L.map(mapContainerElement);
|
||||
map.setView(mapCoordinates, 15);
|
||||
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
|
||||
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
||||
maxZoom: 19,
|
||||
attribution: "© OpenStreetMap"
|
||||
attribution: '© OpenStreetMap'
|
||||
}).addTo(map);
|
||||
L.marker(mapCoordinates).addTo(map);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,33 +1,33 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
||||
|
||||
import type * as Leaflet from "leaflet";
|
||||
import type * as Leaflet from 'leaflet'
|
||||
|
||||
declare const L;
|
||||
declare const L
|
||||
|
||||
(() => {
|
||||
const mapContainerElement = document.querySelector(
|
||||
"#map--leaflet"
|
||||
) as HTMLElement;
|
||||
;(() => {
|
||||
const mapContainerElement = document.querySelector(
|
||||
'#map--leaflet'
|
||||
) as HTMLElement
|
||||
|
||||
if (mapContainerElement) {
|
||||
const mapLatitude = Number.parseFloat(
|
||||
mapContainerElement.dataset.mapLatitude!
|
||||
);
|
||||
const mapLongitude = Number.parseFloat(
|
||||
mapContainerElement.dataset.mapLongitude!
|
||||
);
|
||||
if (mapContainerElement) {
|
||||
const mapLatitude = Number.parseFloat(
|
||||
mapContainerElement.dataset.mapLatitude!
|
||||
)
|
||||
const mapLongitude = Number.parseFloat(
|
||||
mapContainerElement.dataset.mapLongitude!
|
||||
)
|
||||
|
||||
const mapCoordinates: Leaflet.LatLngTuple = [mapLatitude, mapLongitude];
|
||||
const mapCoordinates: Leaflet.LatLngTuple = [mapLatitude, mapLongitude]
|
||||
|
||||
// eslint-disable-next-line unicorn/no-array-callback-reference
|
||||
const map: Leaflet.Map = L.map(mapContainerElement);
|
||||
map.setView(mapCoordinates, 15);
|
||||
// eslint-disable-next-line unicorn/no-array-callback-reference
|
||||
const map: Leaflet.Map = L.map(mapContainerElement)
|
||||
map.setView(mapCoordinates, 15)
|
||||
|
||||
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
|
||||
maxZoom: 19,
|
||||
attribution: "© OpenStreetMap"
|
||||
}).addTo(map);
|
||||
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
||||
maxZoom: 19,
|
||||
attribution: '© OpenStreetMap'
|
||||
}).addTo(map)
|
||||
|
||||
L.marker(mapCoordinates).addTo(map);
|
||||
}
|
||||
})();
|
||||
L.marker(mapCoordinates).addTo(map)
|
||||
}
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -1,28 +1,29 @@
|
|||
/* eslint-disable unicorn/prefer-module */
|
||||
;
|
||||
(() => {
|
||||
const menuTabElements = document.querySelectorAll(".menu a");
|
||||
const tabContainerElements = document.querySelectorAll(".tabs-container > div");
|
||||
const menuTabElements = document.querySelectorAll('.menu a');
|
||||
const tabContainerElements = document.querySelectorAll('.tabs-container > div');
|
||||
function selectTab(clickEvent) {
|
||||
clickEvent.preventDefault();
|
||||
// Remove .is-active from all tabs
|
||||
for (const menuTabElement of menuTabElements) {
|
||||
menuTabElement.classList.remove("is-active");
|
||||
menuTabElement.classList.remove('is-active');
|
||||
}
|
||||
// Set .is-active on clicked tab
|
||||
const selectedTabElement = clickEvent.currentTarget;
|
||||
selectedTabElement.classList.add("is-active");
|
||||
selectedTabElement.classList.add('is-active');
|
||||
// Hide all but selected tab
|
||||
const selectedTabContainerId = selectedTabElement.href.slice(Math.max(0, selectedTabElement.href.indexOf("#") + 1));
|
||||
const selectedTabContainerId = selectedTabElement.href.slice(Math.max(0, selectedTabElement.href.indexOf('#') + 1));
|
||||
for (const tabContainerElement of tabContainerElements) {
|
||||
if (tabContainerElement.id === selectedTabContainerId) {
|
||||
tabContainerElement.classList.remove("is-hidden");
|
||||
tabContainerElement.classList.remove('is-hidden');
|
||||
}
|
||||
else {
|
||||
tabContainerElement.classList.add("is-hidden");
|
||||
tabContainerElement.classList.add('is-hidden');
|
||||
}
|
||||
}
|
||||
}
|
||||
for (const menuTabElement of menuTabElements) {
|
||||
menuTabElement.addEventListener("click", selectTab);
|
||||
menuTabElement.addEventListener('click', selectTab);
|
||||
}
|
||||
})();
|
||||
|
|
|
|||
|
|
@ -1,38 +1,41 @@
|
|||
/* eslint-disable unicorn/prefer-module */
|
||||
|
||||
(() => {
|
||||
const menuTabElements = document.querySelectorAll(".menu a") as NodeListOf<HTMLAnchorElement>;
|
||||
const tabContainerElements = document.querySelectorAll(
|
||||
".tabs-container > div"
|
||||
) as NodeListOf<HTMLElement>;
|
||||
;(() => {
|
||||
const menuTabElements = document.querySelectorAll(
|
||||
'.menu a'
|
||||
) as NodeListOf<HTMLAnchorElement>
|
||||
|
||||
function selectTab(clickEvent: Event) {
|
||||
clickEvent.preventDefault();
|
||||
const tabContainerElements = document.querySelectorAll(
|
||||
'.tabs-container > div'
|
||||
) as NodeListOf<HTMLElement>
|
||||
|
||||
// Remove .is-active from all tabs
|
||||
for (const menuTabElement of menuTabElements) {
|
||||
menuTabElement.classList.remove("is-active");
|
||||
}
|
||||
|
||||
// Set .is-active on clicked tab
|
||||
const selectedTabElement = clickEvent.currentTarget as HTMLAnchorElement;
|
||||
selectedTabElement.classList.add("is-active");
|
||||
|
||||
// Hide all but selected tab
|
||||
const selectedTabContainerId = selectedTabElement.href.slice(
|
||||
Math.max(0, selectedTabElement.href.indexOf("#") + 1)
|
||||
);
|
||||
|
||||
for (const tabContainerElement of tabContainerElements) {
|
||||
if (tabContainerElement.id === selectedTabContainerId) {
|
||||
tabContainerElement.classList.remove("is-hidden");
|
||||
} else {
|
||||
tabContainerElement.classList.add("is-hidden");
|
||||
}
|
||||
}
|
||||
}
|
||||
function selectTab(clickEvent: Event) {
|
||||
clickEvent.preventDefault()
|
||||
|
||||
// Remove .is-active from all tabs
|
||||
for (const menuTabElement of menuTabElements) {
|
||||
menuTabElement.addEventListener("click", selectTab);
|
||||
menuTabElement.classList.remove('is-active')
|
||||
}
|
||||
})();
|
||||
|
||||
// Set .is-active on clicked tab
|
||||
const selectedTabElement = clickEvent.currentTarget as HTMLAnchorElement
|
||||
selectedTabElement.classList.add('is-active')
|
||||
|
||||
// Hide all but selected tab
|
||||
const selectedTabContainerId = selectedTabElement.href.slice(
|
||||
Math.max(0, selectedTabElement.href.indexOf('#') + 1)
|
||||
)
|
||||
|
||||
for (const tabContainerElement of tabContainerElements) {
|
||||
if (tabContainerElement.id === selectedTabContainerId) {
|
||||
tabContainerElement.classList.remove('is-hidden')
|
||||
} else {
|
||||
tabContainerElement.classList.add('is-hidden')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (const menuTabElement of menuTabElements) {
|
||||
menuTabElement.addEventListener('click', selectTab)
|
||||
}
|
||||
})()
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -4,16 +4,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
(() => {
|
||||
var _a, _b;
|
||||
const los = exports.los;
|
||||
const workOrderId = document.querySelector("#workOrderEdit--workOrderId").value;
|
||||
const isCreate = workOrderId === "";
|
||||
const workOrderFormElement = document.querySelector("#form--workOrderEdit");
|
||||
const workOrderId = document.querySelector('#workOrderEdit--workOrderId').value;
|
||||
const isCreate = workOrderId === '';
|
||||
const workOrderFormElement = document.querySelector('#form--workOrderEdit');
|
||||
los.initializeDatePickers(workOrderFormElement
|
||||
.querySelector("#workOrderEdit--workOrderOpenDateString")
|
||||
.closest(".field"));
|
||||
.querySelector('#workOrderEdit--workOrderOpenDateString')
|
||||
.closest('.field'));
|
||||
los.initializeUnlockFieldButtons(workOrderFormElement);
|
||||
workOrderFormElement.addEventListener("submit", (submitEvent) => {
|
||||
workOrderFormElement.addEventListener('submit', (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/workOrders/" + (isCreate ? "doCreateWorkOrder" : "doUpdateWorkOrder"), submitEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix +
|
||||
'/workOrders/' +
|
||||
(isCreate ? 'doCreateWorkOrder' : 'doUpdateWorkOrder'), submitEvent.currentTarget, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
cityssm.disableNavBlocker();
|
||||
if (isCreate) {
|
||||
|
|
@ -21,105 +23,107 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
message: "Work Order Updated Successfully",
|
||||
contextualColorName: "success"
|
||||
message: 'Work Order Updated Successfully',
|
||||
contextualColorName: 'success'
|
||||
});
|
||||
}
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating Work Order",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Updating Work Order',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
const inputElements = workOrderFormElement.querySelectorAll("input, select");
|
||||
const inputElements = workOrderFormElement.querySelectorAll('input, select');
|
||||
for (const inputElement of inputElements) {
|
||||
inputElement.addEventListener("change", cityssm.enableNavBlocker);
|
||||
inputElement.addEventListener('change', cityssm.enableNavBlocker);
|
||||
}
|
||||
/*
|
||||
* Work Order Options
|
||||
*/
|
||||
function doClose() {
|
||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doCloseWorkOrder", {
|
||||
cityssm.postJSON(los.urlPrefix + '/workOrders/doCloseWorkOrder', {
|
||||
workOrderId
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
window.location.href = los.urlPrefix + "/workOrders/" + workOrderId;
|
||||
window.location.href = los.urlPrefix + '/workOrders/' + workOrderId;
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Closing Work Order",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Closing Work Order',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
function doDelete() {
|
||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doDeleteWorkOrder", {
|
||||
cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrder', {
|
||||
workOrderId
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
window.location.href = los.urlPrefix + "/workOrders";
|
||||
window.location.href = los.urlPrefix + '/workOrders';
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Deleting Work Order",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Deleting Work Order',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
let workOrderMilestones;
|
||||
(_a = document.querySelector("#button--closeWorkOrder")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", () => {
|
||||
(_a = document
|
||||
.querySelector('#button--closeWorkOrder')) === null || _a === void 0 ? void 0 : _a.addEventListener('click', () => {
|
||||
const hasOpenMilestones = workOrderMilestones.some((milestone) => {
|
||||
return !milestone.workOrderMilestoneCompletionDate;
|
||||
});
|
||||
if (hasOpenMilestones) {
|
||||
bulmaJS.alert({
|
||||
title: "Outstanding Milestones",
|
||||
title: 'Outstanding Milestones',
|
||||
message: `You cannot close a work order with outstanding milestones.
|
||||
Either complete the outstanding milestones, or remove them from the work order.`,
|
||||
contextualColorName: "warning"
|
||||
contextualColorName: 'warning'
|
||||
});
|
||||
/*
|
||||
// Disable closing work orders with open milestones
|
||||
bulmaJS.confirm({
|
||||
title: "Close Work Order with Outstanding Milestones",
|
||||
message:
|
||||
"Are you sure you want to close this work order with outstanding milestones?",
|
||||
contextualColorName: "danger",
|
||||
okButton: {
|
||||
text: "Yes, Close Work Order",
|
||||
callbackFunction: doClose
|
||||
}
|
||||
});
|
||||
*/
|
||||
// Disable closing work orders with open milestones
|
||||
bulmaJS.confirm({
|
||||
title: "Close Work Order with Outstanding Milestones",
|
||||
message:
|
||||
"Are you sure you want to close this work order with outstanding milestones?",
|
||||
contextualColorName: "danger",
|
||||
okButton: {
|
||||
text: "Yes, Close Work Order",
|
||||
callbackFunction: doClose
|
||||
}
|
||||
});
|
||||
*/
|
||||
}
|
||||
else {
|
||||
bulmaJS.confirm({
|
||||
title: "Close Work Order",
|
||||
message: "Are you sure you want to close this work order?",
|
||||
contextualColorName: "info",
|
||||
title: 'Close Work Order',
|
||||
message: 'Are you sure you want to close this work order?',
|
||||
contextualColorName: 'info',
|
||||
okButton: {
|
||||
text: "Yes, Close Work Order",
|
||||
text: 'Yes, Close Work Order',
|
||||
callbackFunction: doClose
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
(_b = document.querySelector("#button--deleteWorkOrder")) === null || _b === void 0 ? void 0 : _b.addEventListener("click", (clickEvent) => {
|
||||
(_b = document
|
||||
.querySelector('#button--deleteWorkOrder')) === null || _b === void 0 ? void 0 : _b.addEventListener('click', (clickEvent) => {
|
||||
clickEvent.preventDefault();
|
||||
bulmaJS.confirm({
|
||||
title: "Delete Work Order",
|
||||
message: "Are you sure you want to delete this work order?",
|
||||
contextualColorName: "warning",
|
||||
title: 'Delete Work Order',
|
||||
message: 'Are you sure you want to delete this work order?',
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: "Yes, Delete Work Order",
|
||||
text: 'Yes, Delete Work Order',
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
});
|
||||
|
|
@ -144,131 +148,136 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Reopening Milestone",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Reopening Milestone',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
}
|
||||
function completeMilestone(clickEvent) {
|
||||
clickEvent.preventDefault();
|
||||
const currentDateString = cityssm.dateToString(new Date());
|
||||
const workOrderMilestoneId = Number.parseInt(clickEvent.currentTarget.closest(".container--milestone")
|
||||
.dataset.workOrderMilestoneId, 10);
|
||||
const workOrderMilestoneId = Number.parseInt(clickEvent.currentTarget.closest('.container--milestone').dataset.workOrderMilestoneId, 10);
|
||||
const workOrderMilestone = workOrderMilestones.find((currentMilestone) => {
|
||||
return currentMilestone.workOrderMilestoneId === workOrderMilestoneId;
|
||||
});
|
||||
const doComplete = () => {
|
||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doCompleteWorkOrderMilestone", {
|
||||
cityssm.postJSON(los.urlPrefix + '/workOrders/doCompleteWorkOrderMilestone', {
|
||||
workOrderId,
|
||||
workOrderMilestoneId
|
||||
}, processMilestoneResponse);
|
||||
};
|
||||
bulmaJS.confirm({
|
||||
title: "Complete Milestone",
|
||||
message: "Are you sure you want to complete this milestone?" +
|
||||
title: 'Complete Milestone',
|
||||
message: 'Are you sure you want to complete this milestone?' +
|
||||
(workOrderMilestone.workOrderMilestoneDateString > currentDateString
|
||||
? "<br /><strong>Note that this milestone is expected to be completed in the future.</strong>"
|
||||
: ""),
|
||||
? '<br /><strong>Note that this milestone is expected to be completed in the future.</strong>'
|
||||
: ''),
|
||||
messageIsHtml: true,
|
||||
contextualColorName: "warning",
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: "Yes, Complete Milestone",
|
||||
text: 'Yes, Complete Milestone',
|
||||
callbackFunction: doComplete
|
||||
}
|
||||
});
|
||||
}
|
||||
function reopenMilestone(clickEvent) {
|
||||
clickEvent.preventDefault();
|
||||
const workOrderMilestoneId = clickEvent.currentTarget.closest(".container--milestone").dataset.workOrderMilestoneId;
|
||||
const workOrderMilestoneId = clickEvent.currentTarget.closest('.container--milestone').dataset.workOrderMilestoneId;
|
||||
const doReopen = () => {
|
||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doReopenWorkOrderMilestone", {
|
||||
cityssm.postJSON(los.urlPrefix + '/workOrders/doReopenWorkOrderMilestone', {
|
||||
workOrderId,
|
||||
workOrderMilestoneId
|
||||
}, processMilestoneResponse);
|
||||
};
|
||||
bulmaJS.confirm({
|
||||
title: "Reopen Milestone",
|
||||
message: "Are you sure you want to remove the completion status from this milestone, and reopen it?",
|
||||
contextualColorName: "warning",
|
||||
title: 'Reopen Milestone',
|
||||
message: 'Are you sure you want to remove the completion status from this milestone, and reopen it?',
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: "Yes, Reopen Milestone",
|
||||
text: 'Yes, Reopen Milestone',
|
||||
callbackFunction: doReopen
|
||||
}
|
||||
});
|
||||
}
|
||||
function deleteMilestone(clickEvent) {
|
||||
clickEvent.preventDefault();
|
||||
const workOrderMilestoneId = clickEvent.currentTarget.closest(".container--milestone").dataset.workOrderMilestoneId;
|
||||
const workOrderMilestoneId = clickEvent.currentTarget.closest('.container--milestone').dataset.workOrderMilestoneId;
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doDeleteWorkOrderMilestone", {
|
||||
cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrderMilestone', {
|
||||
workOrderMilestoneId,
|
||||
workOrderId
|
||||
}, processMilestoneResponse);
|
||||
};
|
||||
bulmaJS.confirm({
|
||||
title: "Delete Milestone",
|
||||
message: "Are you sure you want to delete this milestone?",
|
||||
contextualColorName: "warning",
|
||||
title: 'Delete Milestone',
|
||||
message: 'Are you sure you want to delete this milestone?',
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: "Yes, Delete Milestone",
|
||||
text: 'Yes, Delete Milestone',
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
});
|
||||
}
|
||||
function editMilestone(clickEvent) {
|
||||
clickEvent.preventDefault();
|
||||
const workOrderMilestoneId = Number.parseInt(clickEvent.currentTarget.closest(".container--milestone")
|
||||
.dataset.workOrderMilestoneId, 10);
|
||||
const workOrderMilestoneId = Number.parseInt(clickEvent.currentTarget.closest('.container--milestone').dataset.workOrderMilestoneId, 10);
|
||||
const workOrderMilestone = workOrderMilestones.find((currentMilestone) => {
|
||||
return currentMilestone.workOrderMilestoneId === workOrderMilestoneId;
|
||||
});
|
||||
let editCloseModalFunction;
|
||||
const doEdit = (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doUpdateWorkOrderMilestone", submitEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/workOrders/doUpdateWorkOrderMilestone', submitEvent.currentTarget, (responseJSON) => {
|
||||
processMilestoneResponse(responseJSON);
|
||||
if (responseJSON.success) {
|
||||
editCloseModalFunction();
|
||||
}
|
||||
});
|
||||
};
|
||||
cityssm.openHtmlModal("workOrder-editMilestone", {
|
||||
cityssm.openHtmlModal('workOrder-editMilestone', {
|
||||
onshow(modalElement) {
|
||||
modalElement.querySelector("#milestoneEdit--workOrderId").value =
|
||||
workOrderId;
|
||||
modalElement.querySelector("#milestoneEdit--workOrderMilestoneId").value = workOrderMilestone.workOrderMilestoneId.toString();
|
||||
const milestoneTypeElement = modalElement.querySelector("#milestoneEdit--workOrderMilestoneTypeId");
|
||||
;
|
||||
modalElement.querySelector('#milestoneEdit--workOrderId').value = workOrderId;
|
||||
modalElement.querySelector('#milestoneEdit--workOrderMilestoneId').value = workOrderMilestone.workOrderMilestoneId.toString();
|
||||
const milestoneTypeElement = modalElement.querySelector('#milestoneEdit--workOrderMilestoneTypeId');
|
||||
let milestoneTypeFound = false;
|
||||
for (const milestoneType of exports.workOrderMilestoneTypes) {
|
||||
const optionElement = document.createElement("option");
|
||||
optionElement.value = milestoneType.workOrderMilestoneTypeId.toString();
|
||||
const optionElement = document.createElement('option');
|
||||
optionElement.value =
|
||||
milestoneType.workOrderMilestoneTypeId.toString();
|
||||
optionElement.textContent = milestoneType.workOrderMilestoneType;
|
||||
if (milestoneType.workOrderMilestoneTypeId === workOrderMilestone.workOrderMilestoneTypeId) {
|
||||
if (milestoneType.workOrderMilestoneTypeId ===
|
||||
workOrderMilestone.workOrderMilestoneTypeId) {
|
||||
optionElement.selected = true;
|
||||
milestoneTypeFound = true;
|
||||
}
|
||||
milestoneTypeElement.append(optionElement);
|
||||
}
|
||||
if (!milestoneTypeFound && workOrderMilestone.workOrderMilestoneTypeId) {
|
||||
const optionElement = document.createElement("option");
|
||||
optionElement.value = workOrderMilestone.workOrderMilestoneTypeId.toString();
|
||||
if (!milestoneTypeFound &&
|
||||
workOrderMilestone.workOrderMilestoneTypeId) {
|
||||
const optionElement = document.createElement('option');
|
||||
optionElement.value =
|
||||
workOrderMilestone.workOrderMilestoneTypeId.toString();
|
||||
optionElement.textContent = workOrderMilestone.workOrderMilestoneType;
|
||||
optionElement.selected = true;
|
||||
milestoneTypeElement.append(optionElement);
|
||||
}
|
||||
modalElement.querySelector("#milestoneEdit--workOrderMilestoneDateString").value = workOrderMilestone.workOrderMilestoneDateString;
|
||||
;
|
||||
modalElement.querySelector('#milestoneEdit--workOrderMilestoneDateString').value = workOrderMilestone.workOrderMilestoneDateString;
|
||||
if (workOrderMilestone.workOrderMilestoneTime) {
|
||||
modalElement.querySelector("#milestoneEdit--workOrderMilestoneTimeString").value = workOrderMilestone.workOrderMilestoneTimeString;
|
||||
;
|
||||
modalElement.querySelector('#milestoneEdit--workOrderMilestoneTimeString').value = workOrderMilestone.workOrderMilestoneTimeString;
|
||||
}
|
||||
modalElement.querySelector("#milestoneEdit--workOrderMilestoneDescription").value = workOrderMilestone.workOrderMilestoneDescription;
|
||||
;
|
||||
modalElement.querySelector('#milestoneEdit--workOrderMilestoneDescription').value = workOrderMilestone.workOrderMilestoneDescription;
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
editCloseModalFunction = closeModalFunction;
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
los.initializeDatePickers(modalElement);
|
||||
// los.initializeTimePickers(modalElement);
|
||||
modalElement.querySelector("form").addEventListener("submit", doEdit);
|
||||
modalElement.querySelector('form').addEventListener('submit', doEdit);
|
||||
},
|
||||
onremoved() {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
|
|
@ -278,15 +287,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
function renderMilestones() {
|
||||
var _a, _b, _c;
|
||||
// Clear milestones panel
|
||||
const milestonesPanelElement = document.querySelector("#panel--milestones");
|
||||
const panelBlockElementsToDelete = milestonesPanelElement.querySelectorAll(".panel-block");
|
||||
const milestonesPanelElement = document.querySelector('#panel--milestones');
|
||||
const panelBlockElementsToDelete = milestonesPanelElement.querySelectorAll('.panel-block');
|
||||
for (const panelBlockToDelete of panelBlockElementsToDelete) {
|
||||
panelBlockToDelete.remove();
|
||||
}
|
||||
for (const milestone of workOrderMilestones) {
|
||||
const panelBlockElement = document.createElement("div");
|
||||
panelBlockElement.className = "panel-block is-block container--milestone";
|
||||
panelBlockElement.dataset.workOrderMilestoneId = milestone.workOrderMilestoneId.toString();
|
||||
const panelBlockElement = document.createElement('div');
|
||||
panelBlockElement.className = 'panel-block is-block container--milestone';
|
||||
panelBlockElement.dataset.workOrderMilestoneId =
|
||||
milestone.workOrderMilestoneId.toString();
|
||||
panelBlockElement.innerHTML =
|
||||
'<div class="columns is-mobile">' +
|
||||
('<div class="column is-narrow">' +
|
||||
|
|
@ -297,70 +307,75 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
milestone.workOrderMilestoneCompletionDateString +
|
||||
'">' +
|
||||
'<span class="icon is-small"><i class="fas fa-check" aria-hidden="true"></i></span>' +
|
||||
"</span>"
|
||||
'</span>'
|
||||
: '<button class="button button--completeMilestone" data-tooltip="Incomplete" type="button" aria-label="Incomplete">' +
|
||||
'<span class="icon is-small"><i class="far fa-square" aria-hidden="true"></i></span>' +
|
||||
"</button>") +
|
||||
"</div>") +
|
||||
'</button>') +
|
||||
'</div>') +
|
||||
('<div class="column">' +
|
||||
(milestone.workOrderMilestoneTypeId
|
||||
? "<strong>" +
|
||||
cityssm.escapeHTML(milestone.workOrderMilestoneType || "") +
|
||||
"</strong><br />"
|
||||
: "") +
|
||||
? '<strong>' +
|
||||
cityssm.escapeHTML(milestone.workOrderMilestoneType || '') +
|
||||
'</strong><br />'
|
||||
: '') +
|
||||
milestone.workOrderMilestoneDateString +
|
||||
(milestone.workOrderMilestoneTime ? " " + milestone.workOrderMilestoneTimeString : "") +
|
||||
"<br />" +
|
||||
(milestone.workOrderMilestoneTime
|
||||
? ' ' + milestone.workOrderMilestoneTimeString
|
||||
: '') +
|
||||
'<br />' +
|
||||
'<span class="is-size-7">' +
|
||||
cityssm.escapeHTML(milestone.workOrderMilestoneDescription || "") +
|
||||
"</span>" +
|
||||
"</div>") +
|
||||
cityssm.escapeHTML(milestone.workOrderMilestoneDescription || '') +
|
||||
'</span>' +
|
||||
'</div>') +
|
||||
('<div class="column is-narrow">' +
|
||||
'<div class="dropdown is-right">' +
|
||||
('<div class="dropdown-trigger">' +
|
||||
'<button class="button is-small" data-tooltip="Options" type="button" aria-label="Options">' +
|
||||
'<i class="fas fa-ellipsis-v" aria-hidden="true"></i>' +
|
||||
"</button>" +
|
||||
"</div>") +
|
||||
'</button>' +
|
||||
'</div>') +
|
||||
('<div class="dropdown-menu">' +
|
||||
'<div class="dropdown-content">' +
|
||||
(milestone.workOrderMilestoneCompletionDate
|
||||
? '<a class="dropdown-item button--reopenMilestone" href="#">' +
|
||||
'<span class="icon is-small"><i class="fas fa-times" aria-hidden="true"></i></span>' +
|
||||
" <span>Reopen Milestone</span>" +
|
||||
"</a>"
|
||||
' <span>Reopen Milestone</span>' +
|
||||
'</a>'
|
||||
: '<a class="dropdown-item button--editMilestone" href="#">' +
|
||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||
" <span>Edit Milestone</span>" +
|
||||
"</a>") +
|
||||
' <span>Edit Milestone</span>' +
|
||||
'</a>') +
|
||||
'<hr class="dropdown-divider" />' +
|
||||
'<a class="dropdown-item button--deleteMilestone" href="#">' +
|
||||
'<span class="icon is-small"><i class="fas fa-trash has-text-danger" aria-hidden="true"></i></span>' +
|
||||
" <span>Delete Milestone</span>" +
|
||||
"</a>" +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
"</div>";
|
||||
' <span>Delete Milestone</span>' +
|
||||
'</a>' +
|
||||
'</div>' +
|
||||
'</div>') +
|
||||
'</div>' +
|
||||
'</div>') +
|
||||
'</div>';
|
||||
(_a = panelBlockElement
|
||||
.querySelector(".button--reopenMilestone")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", reopenMilestone);
|
||||
.querySelector('.button--reopenMilestone')) === null || _a === void 0 ? void 0 : _a.addEventListener('click', reopenMilestone);
|
||||
(_b = panelBlockElement
|
||||
.querySelector(".button--editMilestone")) === null || _b === void 0 ? void 0 : _b.addEventListener("click", editMilestone);
|
||||
.querySelector('.button--editMilestone')) === null || _b === void 0 ? void 0 : _b.addEventListener('click', editMilestone);
|
||||
(_c = panelBlockElement
|
||||
.querySelector(".button--completeMilestone")) === null || _c === void 0 ? void 0 : _c.addEventListener("click", completeMilestone);
|
||||
.querySelector('.button--completeMilestone')) === null || _c === void 0 ? void 0 : _c.addEventListener('click', completeMilestone);
|
||||
panelBlockElement
|
||||
.querySelector(".button--deleteMilestone")
|
||||
.addEventListener("click", deleteMilestone);
|
||||
.querySelector('.button--deleteMilestone')
|
||||
.addEventListener('click', deleteMilestone);
|
||||
milestonesPanelElement.append(panelBlockElement);
|
||||
}
|
||||
bulmaJS.init(milestonesPanelElement);
|
||||
}
|
||||
if (!isCreate) {
|
||||
workOrderMilestones = exports.workOrderMilestones;
|
||||
workOrderMilestones =
|
||||
exports.workOrderMilestones;
|
||||
delete exports.workOrderMilestones;
|
||||
renderMilestones();
|
||||
document.querySelector("#button--addMilestone").addEventListener("click", () => {
|
||||
document
|
||||
.querySelector('#button--addMilestone')
|
||||
.addEventListener('click', () => {
|
||||
let addModalElement;
|
||||
let addFormElement;
|
||||
let addCloseModalFunction;
|
||||
|
|
@ -370,20 +385,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
}
|
||||
const currentDateString = cityssm.dateToString(new Date());
|
||||
function _doAdd() {
|
||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doAddWorkOrderMilestone", addFormElement, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/workOrders/doAddWorkOrderMilestone', addFormElement, (responseJSON) => {
|
||||
processMilestoneResponse(responseJSON);
|
||||
if (responseJSON.success) {
|
||||
addCloseModalFunction();
|
||||
}
|
||||
});
|
||||
}
|
||||
if (addModalElement.querySelector("#milestoneAdd--workOrderMilestoneDateString").value < currentDateString) {
|
||||
if (addModalElement.querySelector('#milestoneAdd--workOrderMilestoneDateString').value < currentDateString) {
|
||||
bulmaJS.confirm({
|
||||
title: "Milestone Date in the Past",
|
||||
message: "Are you sure you want to create a milestone with a date in the past?",
|
||||
contextualColorName: "warning",
|
||||
title: 'Milestone Date in the Past',
|
||||
message: 'Are you sure you want to create a milestone with a date in the past?',
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: "Yes, Create a Past Milestone",
|
||||
text: 'Yes, Create a Past Milestone',
|
||||
callbackFunction: _doAdd
|
||||
}
|
||||
});
|
||||
|
|
@ -392,18 +407,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
_doAdd();
|
||||
}
|
||||
};
|
||||
cityssm.openHtmlModal("workOrder-addMilestone", {
|
||||
cityssm.openHtmlModal('workOrder-addMilestone', {
|
||||
onshow(modalElement) {
|
||||
modalElement.querySelector("#milestoneAdd--workOrderId").value =
|
||||
workOrderId;
|
||||
const milestoneTypeElement = modalElement.querySelector("#milestoneAdd--workOrderMilestoneTypeId");
|
||||
;
|
||||
modalElement.querySelector('#milestoneAdd--workOrderId').value = workOrderId;
|
||||
const milestoneTypeElement = modalElement.querySelector('#milestoneAdd--workOrderMilestoneTypeId');
|
||||
for (const milestoneType of exports.workOrderMilestoneTypes) {
|
||||
const optionElement = document.createElement("option");
|
||||
optionElement.value = milestoneType.workOrderMilestoneTypeId.toString();
|
||||
const optionElement = document.createElement('option');
|
||||
optionElement.value =
|
||||
milestoneType.workOrderMilestoneTypeId.toString();
|
||||
optionElement.textContent = milestoneType.workOrderMilestoneType;
|
||||
milestoneTypeElement.append(optionElement);
|
||||
}
|
||||
modalElement.querySelector("#milestoneAdd--workOrderMilestoneDateString").valueAsDate = new Date();
|
||||
;
|
||||
modalElement.querySelector('#milestoneAdd--workOrderMilestoneDateString').valueAsDate = new Date();
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
addModalElement = modalElement;
|
||||
|
|
@ -411,8 +428,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
los.initializeDatePickers(modalElement);
|
||||
// los.initializeTimePickers(modalElement);
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
addFormElement = modalElement.querySelector("form");
|
||||
addFormElement.addEventListener("submit", doAdd);
|
||||
addFormElement = modalElement.querySelector('form');
|
||||
addFormElement.addEventListener('submit', doAdd);
|
||||
},
|
||||
onremoved() {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -5,7 +5,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
let workOrderComments = exports.workOrderComments;
|
||||
delete exports.workOrderComments;
|
||||
const openEditWorkOrderComment = (clickEvent) => {
|
||||
const workOrderCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.workOrderCommentId, 10);
|
||||
const workOrderCommentId = Number.parseInt(clickEvent.currentTarget.closest('tr').dataset
|
||||
.workOrderCommentId, 10);
|
||||
const workOrderComment = workOrderComments.find((currentComment) => {
|
||||
return currentComment.workOrderCommentId === workOrderCommentId;
|
||||
});
|
||||
|
|
@ -13,7 +14,7 @@ const openEditWorkOrderComment = (clickEvent) => {
|
|||
let editCloseModalFunction;
|
||||
function editComment(submitEvent) {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doUpdateWorkOrderComment", editFormElement, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/workOrders/doUpdateWorkOrderComment', editFormElement, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderComments = responseJSON.workOrderComments;
|
||||
editCloseModalFunction();
|
||||
|
|
@ -21,35 +22,35 @@ const openEditWorkOrderComment = (clickEvent) => {
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating Comment",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Updating Comment',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
cityssm.openHtmlModal("workOrder-editComment", {
|
||||
cityssm.openHtmlModal('workOrder-editComment', {
|
||||
onshow(modalElement) {
|
||||
modalElement.querySelector("#workOrderCommentEdit--workOrderId").value =
|
||||
workOrderId;
|
||||
modalElement.querySelector("#workOrderCommentEdit--workOrderCommentId").value = workOrderCommentId.toString();
|
||||
modalElement.querySelector("#workOrderCommentEdit--workOrderComment").value = workOrderComment.workOrderComment;
|
||||
const workOrderCommentDateStringElement = modalElement.querySelector("#workOrderCommentEdit--workOrderCommentDateString");
|
||||
workOrderCommentDateStringElement.value = workOrderComment.workOrderCommentDateString;
|
||||
;
|
||||
modalElement.querySelector('#workOrderCommentEdit--workOrderId').value = workOrderId;
|
||||
modalElement.querySelector('#workOrderCommentEdit--workOrderCommentId').value = workOrderCommentId.toString();
|
||||
modalElement.querySelector('#workOrderCommentEdit--workOrderComment').value = workOrderComment.workOrderComment;
|
||||
const workOrderCommentDateStringElement = modalElement.querySelector('#workOrderCommentEdit--workOrderCommentDateString');
|
||||
workOrderCommentDateStringElement.value =
|
||||
workOrderComment.workOrderCommentDateString;
|
||||
const currentDateString = cityssm.dateToString(new Date());
|
||||
workOrderCommentDateStringElement.max =
|
||||
workOrderComment.workOrderCommentDateString <= currentDateString
|
||||
? currentDateString
|
||||
: workOrderComment.workOrderCommentDateString;
|
||||
modalElement.querySelector("#workOrderCommentEdit--workOrderCommentTimeString").value = workOrderComment.workOrderCommentTimeString;
|
||||
modalElement.querySelector('#workOrderCommentEdit--workOrderCommentTimeString').value = workOrderComment.workOrderCommentTimeString;
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
los.initializeDatePickers(modalElement);
|
||||
// los.initializeTimePickers(modalElement);
|
||||
modalElement.querySelector("#workOrderCommentEdit--workOrderComment").focus();
|
||||
editFormElement = modalElement.querySelector("form");
|
||||
editFormElement.addEventListener("submit", editComment);
|
||||
modalElement.querySelector('#workOrderCommentEdit--workOrderComment').focus();
|
||||
editFormElement = modalElement.querySelector('form');
|
||||
editFormElement.addEventListener('submit', editComment);
|
||||
editCloseModalFunction = closeModalFunction;
|
||||
},
|
||||
onremoved() {
|
||||
|
|
@ -58,9 +59,10 @@ const openEditWorkOrderComment = (clickEvent) => {
|
|||
});
|
||||
};
|
||||
function deleteWorkOrderComment(clickEvent) {
|
||||
const workOrderCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.workOrderCommentId, 10);
|
||||
const workOrderCommentId = Number.parseInt(clickEvent.currentTarget.closest('tr').dataset
|
||||
.workOrderCommentId, 10);
|
||||
function doDelete() {
|
||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doDeleteWorkOrderComment", {
|
||||
cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrderComment', {
|
||||
workOrderId,
|
||||
workOrderCommentId
|
||||
}, (responseJSON) => {
|
||||
|
|
@ -70,77 +72,82 @@ function deleteWorkOrderComment(clickEvent) {
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Removing Comment",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Removing Comment',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
bulmaJS.confirm({
|
||||
title: "Remove Comment?",
|
||||
message: "Are you sure you want to remove this comment?",
|
||||
title: 'Remove Comment?',
|
||||
message: 'Are you sure you want to remove this comment?',
|
||||
okButton: {
|
||||
text: "Yes, Remove Comment",
|
||||
text: 'Yes, Remove Comment',
|
||||
callbackFunction: doDelete
|
||||
},
|
||||
contextualColorName: "warning"
|
||||
contextualColorName: 'warning'
|
||||
});
|
||||
}
|
||||
function renderWorkOrderComments() {
|
||||
const containerElement = document.querySelector("#container--workOrderComments");
|
||||
const containerElement = document.querySelector('#container--workOrderComments');
|
||||
if (workOrderComments.length === 0) {
|
||||
containerElement.innerHTML = `<div class="message is-info">
|
||||
<p class="message-body">There are no comments to display.</p>
|
||||
</div>`;
|
||||
return;
|
||||
}
|
||||
const tableElement = document.createElement("table");
|
||||
tableElement.className = "table is-fullwidth is-striped is-hoverable";
|
||||
const tableElement = document.createElement('table');
|
||||
tableElement.className = 'table is-fullwidth is-striped is-hoverable';
|
||||
tableElement.innerHTML = `<thead><tr>
|
||||
<th>Commentor</th>
|
||||
<th>Comment Date</th>
|
||||
<th>Comment</th>
|
||||
<th class="is-hidden-print"><span class="is-sr-only">Options</span></th></tr></thead><tbody></tbody>`;
|
||||
for (const workOrderComment of workOrderComments) {
|
||||
const tableRowElement = document.createElement("tr");
|
||||
tableRowElement.dataset.workOrderCommentId = workOrderComment.workOrderCommentId.toString();
|
||||
const tableRowElement = document.createElement('tr');
|
||||
tableRowElement.dataset.workOrderCommentId =
|
||||
workOrderComment.workOrderCommentId.toString();
|
||||
tableRowElement.innerHTML =
|
||||
"<td>" +
|
||||
cityssm.escapeHTML(workOrderComment.recordCreate_userName || "") +
|
||||
"</td>" +
|
||||
"<td>" +
|
||||
'<td>' +
|
||||
cityssm.escapeHTML(workOrderComment.recordCreate_userName || '') +
|
||||
'</td>' +
|
||||
'<td>' +
|
||||
workOrderComment.workOrderCommentDateString +
|
||||
(workOrderComment.workOrderCommentTime === 0
|
||||
? ""
|
||||
: " " + workOrderComment.workOrderCommentTimeString) +
|
||||
"</td>" +
|
||||
"<td>" +
|
||||
cityssm.escapeHTML(workOrderComment.workOrderComment || "") +
|
||||
"</td>" +
|
||||
? ''
|
||||
: ' ' + workOrderComment.workOrderCommentTimeString) +
|
||||
'</td>' +
|
||||
'<td>' +
|
||||
cityssm.escapeHTML(workOrderComment.workOrderComment || '') +
|
||||
'</td>' +
|
||||
('<td class="is-hidden-print">' +
|
||||
'<div class="buttons are-small is-justify-content-end">' +
|
||||
('<button class="button is-primary button--edit" type="button">' +
|
||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||
" <span>Edit</span>" +
|
||||
"</button>") +
|
||||
' <span>Edit</span>' +
|
||||
'</button>') +
|
||||
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
"</button>") +
|
||||
"</div>" +
|
||||
"</td>");
|
||||
tableRowElement.querySelector(".button--edit").addEventListener("click", openEditWorkOrderComment);
|
||||
tableRowElement.querySelector(".button--delete").addEventListener("click", deleteWorkOrderComment);
|
||||
tableElement.querySelector("tbody").append(tableRowElement);
|
||||
'</button>') +
|
||||
'</div>' +
|
||||
'</td>');
|
||||
tableRowElement
|
||||
.querySelector('.button--edit')
|
||||
.addEventListener('click', openEditWorkOrderComment);
|
||||
tableRowElement
|
||||
.querySelector('.button--delete')
|
||||
.addEventListener('click', deleteWorkOrderComment);
|
||||
tableElement.querySelector('tbody').append(tableRowElement);
|
||||
}
|
||||
containerElement.innerHTML = "";
|
||||
containerElement.innerHTML = '';
|
||||
containerElement.append(tableElement);
|
||||
}
|
||||
function openAddCommentModal() {
|
||||
let addCommentCloseModalFunction;
|
||||
function doAddComment(formEvent) {
|
||||
formEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doAddWorkOrderComment", formEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/workOrders/doAddWorkOrderComment', formEvent.currentTarget, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderComments = responseJSON.workOrderComments;
|
||||
renderWorkOrderComments();
|
||||
|
|
@ -148,25 +155,27 @@ function openAddCommentModal() {
|
|||
}
|
||||
});
|
||||
}
|
||||
cityssm.openHtmlModal("workOrder-addComment", {
|
||||
cityssm.openHtmlModal('workOrder-addComment', {
|
||||
onshow(modalElement) {
|
||||
los.populateAliases(modalElement);
|
||||
modalElement.querySelector("#workOrderCommentAdd--workOrderId").value =
|
||||
workOrderId;
|
||||
modalElement.querySelector("form").addEventListener("submit", doAddComment);
|
||||
modalElement.querySelector('#workOrderCommentAdd--workOrderId').value = workOrderId;
|
||||
modalElement
|
||||
.querySelector('form')
|
||||
.addEventListener('submit', doAddComment);
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
addCommentCloseModalFunction = closeModalFunction;
|
||||
modalElement.querySelector("#workOrderCommentAdd--workOrderComment").focus();
|
||||
modalElement.querySelector('#workOrderCommentAdd--workOrderComment').focus();
|
||||
},
|
||||
onremoved() {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
document.querySelector("#workOrderComments--add").focus();
|
||||
document.querySelector('#workOrderComments--add').focus();
|
||||
}
|
||||
});
|
||||
}
|
||||
(_a = document.querySelector("#workOrderComments--add")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", openAddCommentModal);
|
||||
(_a = document
|
||||
.querySelector('#workOrderComments--add')) === null || _a === void 0 ? void 0 : _a.addEventListener('click', openAddCommentModal);
|
||||
if (!isCreate) {
|
||||
renderWorkOrderComments();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,256 +1,290 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
|
||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
||||
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||
|
||||
import type * as globalTypes from "../../types/globalTypes";
|
||||
import type * as recordTypes from "../../types/recordTypes";
|
||||
import type * as globalTypes from '../../types/globalTypes'
|
||||
import type * as recordTypes from '../../types/recordTypes'
|
||||
|
||||
declare const cityssm: cityssmGlobal;
|
||||
declare const bulmaJS: BulmaJS;
|
||||
declare const cityssm: cityssmGlobal
|
||||
declare const bulmaJS: BulmaJS
|
||||
|
||||
declare const los: globalTypes.LOS;
|
||||
declare const los: globalTypes.LOS
|
||||
|
||||
declare const workOrderId: string;
|
||||
declare const isCreate: boolean;
|
||||
declare const workOrderId: string
|
||||
declare const isCreate: boolean
|
||||
|
||||
let workOrderComments: recordTypes.WorkOrderComment[] = exports.workOrderComments;
|
||||
delete exports.workOrderComments;
|
||||
let workOrderComments: recordTypes.WorkOrderComment[] =
|
||||
exports.workOrderComments
|
||||
delete exports.workOrderComments
|
||||
|
||||
const openEditWorkOrderComment = (clickEvent: Event) => {
|
||||
const workOrderCommentId = Number.parseInt(
|
||||
(clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.workOrderCommentId!,
|
||||
10
|
||||
);
|
||||
const workOrderCommentId = Number.parseInt(
|
||||
(clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset
|
||||
.workOrderCommentId!,
|
||||
10
|
||||
)
|
||||
|
||||
const workOrderComment = workOrderComments.find((currentComment) => {
|
||||
return currentComment.workOrderCommentId === workOrderCommentId;
|
||||
})!;
|
||||
const workOrderComment = workOrderComments.find((currentComment) => {
|
||||
return currentComment.workOrderCommentId === workOrderCommentId
|
||||
})!
|
||||
|
||||
let editFormElement: HTMLFormElement;
|
||||
let editCloseModalFunction: () => void;
|
||||
let editFormElement: HTMLFormElement
|
||||
let editCloseModalFunction: () => void
|
||||
|
||||
function editComment(submitEvent: SubmitEvent): void {
|
||||
submitEvent.preventDefault();
|
||||
function editComment(submitEvent: SubmitEvent): void {
|
||||
submitEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/workOrders/doUpdateWorkOrderComment",
|
||||
editFormElement,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
workOrderComments?: recordTypes.WorkOrderComment[];
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderComments = responseJSON.workOrderComments!;
|
||||
editCloseModalFunction();
|
||||
renderWorkOrderComments();
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating Comment",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
cityssm.openHtmlModal("workOrder-editComment", {
|
||||
onshow(modalElement) {
|
||||
(modalElement.querySelector("#workOrderCommentEdit--workOrderId") as HTMLInputElement).value =
|
||||
workOrderId;
|
||||
(
|
||||
modalElement.querySelector("#workOrderCommentEdit--workOrderCommentId") as HTMLInputElement
|
||||
).value = workOrderCommentId.toString();
|
||||
|
||||
(
|
||||
modalElement.querySelector("#workOrderCommentEdit--workOrderComment") as HTMLInputElement
|
||||
).value = workOrderComment.workOrderComment!;
|
||||
|
||||
const workOrderCommentDateStringElement = modalElement.querySelector(
|
||||
"#workOrderCommentEdit--workOrderCommentDateString"
|
||||
) as HTMLInputElement;
|
||||
|
||||
workOrderCommentDateStringElement.value = workOrderComment.workOrderCommentDateString!;
|
||||
|
||||
const currentDateString = cityssm.dateToString(new Date());
|
||||
|
||||
workOrderCommentDateStringElement.max =
|
||||
workOrderComment.workOrderCommentDateString! <= currentDateString
|
||||
? currentDateString
|
||||
: workOrderComment.workOrderCommentDateString!;
|
||||
|
||||
(
|
||||
modalElement.querySelector(
|
||||
"#workOrderCommentEdit--workOrderCommentTimeString"
|
||||
) as HTMLInputElement
|
||||
).value = workOrderComment.workOrderCommentTimeString!;
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
|
||||
los.initializeDatePickers(modalElement);
|
||||
// los.initializeTimePickers(modalElement);
|
||||
|
||||
(
|
||||
modalElement.querySelector("#workOrderCommentEdit--workOrderComment") as HTMLTextAreaElement
|
||||
).focus();
|
||||
|
||||
editFormElement = modalElement.querySelector("form")!;
|
||||
editFormElement.addEventListener("submit", editComment);
|
||||
|
||||
editCloseModalFunction = closeModalFunction;
|
||||
},
|
||||
onremoved() {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/workOrders/doUpdateWorkOrderComment',
|
||||
editFormElement,
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
workOrderComments?: recordTypes.WorkOrderComment[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderComments = responseJSON.workOrderComments!
|
||||
editCloseModalFunction()
|
||||
renderWorkOrderComments()
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: 'Error Updating Comment',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
});
|
||||
};
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
cityssm.openHtmlModal('workOrder-editComment', {
|
||||
onshow(modalElement) {
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#workOrderCommentEdit--workOrderId'
|
||||
) as HTMLInputElement
|
||||
).value = workOrderId
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#workOrderCommentEdit--workOrderCommentId'
|
||||
) as HTMLInputElement
|
||||
).value = workOrderCommentId.toString()
|
||||
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#workOrderCommentEdit--workOrderComment'
|
||||
) as HTMLInputElement
|
||||
).value = workOrderComment.workOrderComment!
|
||||
|
||||
const workOrderCommentDateStringElement = modalElement.querySelector(
|
||||
'#workOrderCommentEdit--workOrderCommentDateString'
|
||||
) as HTMLInputElement
|
||||
|
||||
workOrderCommentDateStringElement.value =
|
||||
workOrderComment.workOrderCommentDateString!
|
||||
|
||||
const currentDateString = cityssm.dateToString(new Date())
|
||||
|
||||
workOrderCommentDateStringElement.max =
|
||||
workOrderComment.workOrderCommentDateString! <= currentDateString
|
||||
? currentDateString
|
||||
: workOrderComment.workOrderCommentDateString!
|
||||
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#workOrderCommentEdit--workOrderCommentTimeString'
|
||||
) as HTMLInputElement
|
||||
).value = workOrderComment.workOrderCommentTimeString!
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
|
||||
los.initializeDatePickers(modalElement)
|
||||
// los.initializeTimePickers(modalElement);
|
||||
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#workOrderCommentEdit--workOrderComment'
|
||||
) as HTMLTextAreaElement
|
||||
).focus()
|
||||
|
||||
editFormElement = modalElement.querySelector('form')!
|
||||
editFormElement.addEventListener('submit', editComment)
|
||||
|
||||
editCloseModalFunction = closeModalFunction
|
||||
},
|
||||
onremoved() {
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function deleteWorkOrderComment(clickEvent: Event): void {
|
||||
const workOrderCommentId = Number.parseInt(
|
||||
(clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.workOrderCommentId!,
|
||||
10
|
||||
);
|
||||
const workOrderCommentId = Number.parseInt(
|
||||
(clickEvent.currentTarget as HTMLElement).closest('tr')!.dataset
|
||||
.workOrderCommentId!,
|
||||
10
|
||||
)
|
||||
|
||||
function doDelete() {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/workOrders/doDeleteWorkOrderComment",
|
||||
{
|
||||
workOrderId,
|
||||
workOrderCommentId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage?: string;
|
||||
workOrderComments: recordTypes.WorkOrderComment[];
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderComments = responseJSON.workOrderComments;
|
||||
renderWorkOrderComments();
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Removing Comment",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
function doDelete() {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/workOrders/doDeleteWorkOrderComment',
|
||||
{
|
||||
workOrderId,
|
||||
workOrderCommentId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
errorMessage?: string
|
||||
workOrderComments: recordTypes.WorkOrderComment[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderComments = responseJSON.workOrderComments
|
||||
renderWorkOrderComments()
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: 'Error Removing Comment',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
bulmaJS.confirm({
|
||||
title: "Remove Comment?",
|
||||
message: "Are you sure you want to remove this comment?",
|
||||
okButton: {
|
||||
text: "Yes, Remove Comment",
|
||||
callbackFunction: doDelete
|
||||
},
|
||||
contextualColorName: "warning"
|
||||
});
|
||||
bulmaJS.confirm({
|
||||
title: 'Remove Comment?',
|
||||
message: 'Are you sure you want to remove this comment?',
|
||||
okButton: {
|
||||
text: 'Yes, Remove Comment',
|
||||
callbackFunction: doDelete
|
||||
},
|
||||
contextualColorName: 'warning'
|
||||
})
|
||||
}
|
||||
|
||||
function renderWorkOrderComments() {
|
||||
const containerElement = document.querySelector("#container--workOrderComments") as HTMLElement;
|
||||
const containerElement = document.querySelector(
|
||||
'#container--workOrderComments'
|
||||
) as HTMLElement
|
||||
|
||||
if (workOrderComments.length === 0) {
|
||||
containerElement.innerHTML = `<div class="message is-info">
|
||||
if (workOrderComments.length === 0) {
|
||||
containerElement.innerHTML = `<div class="message is-info">
|
||||
<p class="message-body">There are no comments to display.</p>
|
||||
</div>`;
|
||||
return;
|
||||
}
|
||||
</div>`
|
||||
return
|
||||
}
|
||||
|
||||
const tableElement = document.createElement("table");
|
||||
tableElement.className = "table is-fullwidth is-striped is-hoverable";
|
||||
tableElement.innerHTML = `<thead><tr>
|
||||
const tableElement = document.createElement('table')
|
||||
tableElement.className = 'table is-fullwidth is-striped is-hoverable'
|
||||
tableElement.innerHTML = `<thead><tr>
|
||||
<th>Commentor</th>
|
||||
<th>Comment Date</th>
|
||||
<th>Comment</th>
|
||||
<th class="is-hidden-print"><span class="is-sr-only">Options</span></th></tr></thead><tbody></tbody>`;
|
||||
<th class="is-hidden-print"><span class="is-sr-only">Options</span></th></tr></thead><tbody></tbody>`
|
||||
|
||||
for (const workOrderComment of workOrderComments) {
|
||||
const tableRowElement = document.createElement("tr");
|
||||
tableRowElement.dataset.workOrderCommentId = workOrderComment.workOrderCommentId!.toString();
|
||||
for (const workOrderComment of workOrderComments) {
|
||||
const tableRowElement = document.createElement('tr')
|
||||
tableRowElement.dataset.workOrderCommentId =
|
||||
workOrderComment.workOrderCommentId!.toString()
|
||||
|
||||
tableRowElement.innerHTML =
|
||||
"<td>" +
|
||||
cityssm.escapeHTML(workOrderComment.recordCreate_userName || "") +
|
||||
"</td>" +
|
||||
"<td>" +
|
||||
workOrderComment.workOrderCommentDateString +
|
||||
(workOrderComment.workOrderCommentTime === 0
|
||||
? ""
|
||||
: " " + workOrderComment.workOrderCommentTimeString) +
|
||||
"</td>" +
|
||||
"<td>" +
|
||||
cityssm.escapeHTML(workOrderComment.workOrderComment || "") +
|
||||
"</td>" +
|
||||
('<td class="is-hidden-print">' +
|
||||
'<div class="buttons are-small is-justify-content-end">' +
|
||||
('<button class="button is-primary button--edit" type="button">' +
|
||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||
" <span>Edit</span>" +
|
||||
"</button>") +
|
||||
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
"</button>") +
|
||||
"</div>" +
|
||||
"</td>");
|
||||
tableRowElement.innerHTML =
|
||||
'<td>' +
|
||||
cityssm.escapeHTML(workOrderComment.recordCreate_userName || '') +
|
||||
'</td>' +
|
||||
'<td>' +
|
||||
workOrderComment.workOrderCommentDateString +
|
||||
(workOrderComment.workOrderCommentTime === 0
|
||||
? ''
|
||||
: ' ' + workOrderComment.workOrderCommentTimeString) +
|
||||
'</td>' +
|
||||
'<td>' +
|
||||
cityssm.escapeHTML(workOrderComment.workOrderComment || '') +
|
||||
'</td>' +
|
||||
('<td class="is-hidden-print">' +
|
||||
'<div class="buttons are-small is-justify-content-end">' +
|
||||
('<button class="button is-primary button--edit" type="button">' +
|
||||
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
|
||||
' <span>Edit</span>' +
|
||||
'</button>') +
|
||||
('<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
'</button>') +
|
||||
'</div>' +
|
||||
'</td>')
|
||||
|
||||
tableRowElement.querySelector(".button--edit")!.addEventListener("click", openEditWorkOrderComment);
|
||||
tableRowElement
|
||||
.querySelector('.button--edit')!
|
||||
.addEventListener('click', openEditWorkOrderComment)
|
||||
|
||||
tableRowElement.querySelector(".button--delete")!.addEventListener("click", deleteWorkOrderComment);
|
||||
tableRowElement
|
||||
.querySelector('.button--delete')!
|
||||
.addEventListener('click', deleteWorkOrderComment)
|
||||
|
||||
tableElement.querySelector("tbody")!.append(tableRowElement);
|
||||
}
|
||||
tableElement.querySelector('tbody')!.append(tableRowElement)
|
||||
}
|
||||
|
||||
containerElement.innerHTML = "";
|
||||
containerElement.append(tableElement);
|
||||
containerElement.innerHTML = ''
|
||||
containerElement.append(tableElement)
|
||||
}
|
||||
|
||||
function openAddCommentModal() {
|
||||
let addCommentCloseModalFunction: () => void;
|
||||
let addCommentCloseModalFunction: () => void
|
||||
|
||||
function doAddComment(formEvent: SubmitEvent) {
|
||||
formEvent.preventDefault();
|
||||
function doAddComment(formEvent: SubmitEvent) {
|
||||
formEvent.preventDefault()
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/workOrders/doAddWorkOrderComment",
|
||||
formEvent.currentTarget,
|
||||
(responseJSON: { success: boolean; workOrderComments?: recordTypes.WorkOrderComment[] }) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderComments = responseJSON.workOrderComments!;
|
||||
renderWorkOrderComments();
|
||||
addCommentCloseModalFunction();
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
cityssm.openHtmlModal("workOrder-addComment", {
|
||||
onshow(modalElement) {
|
||||
los.populateAliases(modalElement);
|
||||
(modalElement.querySelector("#workOrderCommentAdd--workOrderId") as HTMLInputElement).value =
|
||||
workOrderId;
|
||||
modalElement.querySelector("form")!.addEventListener("submit", doAddComment);
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
addCommentCloseModalFunction = closeModalFunction;
|
||||
(
|
||||
modalElement.querySelector("#workOrderCommentAdd--workOrderComment") as HTMLTextAreaElement
|
||||
).focus();
|
||||
},
|
||||
onremoved() {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
(document.querySelector("#workOrderComments--add") as HTMLButtonElement).focus();
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/workOrders/doAddWorkOrderComment',
|
||||
formEvent.currentTarget,
|
||||
(responseJSON: {
|
||||
success: boolean
|
||||
workOrderComments?: recordTypes.WorkOrderComment[]
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderComments = responseJSON.workOrderComments!
|
||||
renderWorkOrderComments()
|
||||
addCommentCloseModalFunction()
|
||||
}
|
||||
});
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
cityssm.openHtmlModal('workOrder-addComment', {
|
||||
onshow(modalElement) {
|
||||
los.populateAliases(modalElement)
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#workOrderCommentAdd--workOrderId'
|
||||
) as HTMLInputElement
|
||||
).value = workOrderId
|
||||
modalElement
|
||||
.querySelector('form')!
|
||||
.addEventListener('submit', doAddComment)
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
addCommentCloseModalFunction = closeModalFunction
|
||||
;(
|
||||
modalElement.querySelector(
|
||||
'#workOrderCommentAdd--workOrderComment'
|
||||
) as HTMLTextAreaElement
|
||||
).focus()
|
||||
},
|
||||
onremoved() {
|
||||
bulmaJS.toggleHtmlClipped()
|
||||
;(
|
||||
document.querySelector('#workOrderComments--add') as HTMLButtonElement
|
||||
).focus()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
document.querySelector("#workOrderComments--add")?.addEventListener("click", openAddCommentModal);
|
||||
document
|
||||
.querySelector('#workOrderComments--add')
|
||||
?.addEventListener('click', openAddCommentModal)
|
||||
|
||||
if (!isCreate) {
|
||||
renderWorkOrderComments();
|
||||
renderWorkOrderComments()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,9 +6,9 @@ delete exports.workOrderLots;
|
|||
let workOrderLotOccupancies = exports.workOrderLotOccupancies;
|
||||
delete exports.workOrderLotOccupancies;
|
||||
function deleteLotOccupancy(clickEvent) {
|
||||
const lotOccupancyId = clickEvent.currentTarget.closest(".container--lotOccupancy").dataset.lotOccupancyId;
|
||||
const lotOccupancyId = clickEvent.currentTarget.closest('.container--lotOccupancy').dataset.lotOccupancyId;
|
||||
function doDelete() {
|
||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doDeleteWorkOrderLotOccupancy", {
|
||||
cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrderLotOccupancy', {
|
||||
workOrderId,
|
||||
lotOccupancyId
|
||||
}, (responseJSON) => {
|
||||
|
|
@ -18,9 +18,9 @@ function deleteLotOccupancy(clickEvent) {
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Deleting Relationship",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Deleting Relationship',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
@ -28,15 +28,15 @@ function deleteLotOccupancy(clickEvent) {
|
|||
bulmaJS.confirm({
|
||||
title: `Delete ${los.escapedAliases.Occupancy} Relationship`,
|
||||
message: `Are you sure you want to remove the relationship to this ${los.escapedAliases.occupancy} record from this work order? Note that the record will remain.`,
|
||||
contextualColorName: "warning",
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: "Yes, Delete Relationship",
|
||||
text: 'Yes, Delete Relationship',
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
});
|
||||
}
|
||||
function addLot(lotId, callbackFunction) {
|
||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doAddWorkOrderLot", {
|
||||
cityssm.postJSON(los.urlPrefix + '/workOrders/doAddWorkOrderLot', {
|
||||
workOrderId,
|
||||
lotId
|
||||
}, (responseJSON) => {
|
||||
|
|
@ -46,9 +46,9 @@ function addLot(lotId, callbackFunction) {
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Adding " + los.escapedAliases.Lot,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Adding ' + los.escapedAliases.Lot,
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
if (callbackFunction) {
|
||||
|
|
@ -57,7 +57,7 @@ function addLot(lotId, callbackFunction) {
|
|||
});
|
||||
}
|
||||
function addLotOccupancy(lotOccupancyId, callbackFunction) {
|
||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doAddWorkOrderLotOccupancy", {
|
||||
cityssm.postJSON(los.urlPrefix + '/workOrders/doAddWorkOrderLotOccupancy', {
|
||||
workOrderId,
|
||||
lotOccupancyId
|
||||
}, (responseJSON) => {
|
||||
|
|
@ -67,9 +67,9 @@ function addLotOccupancy(lotOccupancyId, callbackFunction) {
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Adding " + los.escapedAliases.Occupancy,
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Adding ' + los.escapedAliases.Occupancy,
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
if (callbackFunction) {
|
||||
|
|
@ -83,9 +83,8 @@ function addLotFromLotOccupancy(clickEvent) {
|
|||
}
|
||||
function renderRelatedOccupancies() {
|
||||
var _a, _b;
|
||||
const occupanciesContainerElement = document.querySelector("#container--lotOccupancies");
|
||||
document.querySelector(".tabs a[href='#relatedTab--lotOccupancies'] .tag").textContent =
|
||||
workOrderLotOccupancies.length.toString();
|
||||
const occupanciesContainerElement = document.querySelector('#container--lotOccupancies');
|
||||
document.querySelector(".tabs a[href='#relatedTab--lotOccupancies'] .tag").textContent = workOrderLotOccupancies.length.toString();
|
||||
if (workOrderLotOccupancies.length === 0) {
|
||||
occupanciesContainerElement.innerHTML = `<div class="message is-info">
|
||||
<p class="message-body">There are no ${los.escapedAliases.occupancies} associated with this work order.</p>
|
||||
|
|
@ -103,10 +102,11 @@ function renderRelatedOccupancies() {
|
|||
</table>`;
|
||||
const currentDateString = cityssm.dateToString(new Date());
|
||||
for (const lotOccupancy of workOrderLotOccupancies) {
|
||||
const rowElement = document.createElement("tr");
|
||||
rowElement.className = "container--lotOccupancy";
|
||||
const rowElement = document.createElement('tr');
|
||||
rowElement.className = 'container--lotOccupancy';
|
||||
rowElement.dataset.lotOccupancyId = lotOccupancy.lotOccupancyId.toString();
|
||||
const isActive = !(lotOccupancy.occupancyEndDate && lotOccupancy.occupancyEndDateString < currentDateString);
|
||||
const isActive = !(lotOccupancy.occupancyEndDate &&
|
||||
lotOccupancy.occupancyEndDateString < currentDateString);
|
||||
const hasLotRecord = lotOccupancy.lotId &&
|
||||
workOrderLots.some((lot) => {
|
||||
return lotOccupancy.lotId === lot.lotId;
|
||||
|
|
@ -114,21 +114,25 @@ function renderRelatedOccupancies() {
|
|||
rowElement.innerHTML =
|
||||
'<td class="is-width-1 has-text-centered">' +
|
||||
(isActive
|
||||
? '<i class="fas fa-play" title="Current ' + los.escapedAliases.Occupancy + '"></i>'
|
||||
: '<i class="fas fa-stop" title="Previous ' + los.escapedAliases.Occupancy + '"></i>') +
|
||||
"</td>" +
|
||||
("<td>" +
|
||||
? '<i class="fas fa-play" title="Current ' +
|
||||
los.escapedAliases.Occupancy +
|
||||
'"></i>'
|
||||
: '<i class="fas fa-stop" title="Previous ' +
|
||||
los.escapedAliases.Occupancy +
|
||||
'"></i>') +
|
||||
'</td>' +
|
||||
('<td>' +
|
||||
'<a class="has-text-weight-bold" href="' +
|
||||
los.getLotOccupancyURL(lotOccupancy.lotOccupancyId) +
|
||||
'">' +
|
||||
cityssm.escapeHTML(lotOccupancy.occupancyType || "") +
|
||||
"</a>" +
|
||||
"</td>");
|
||||
cityssm.escapeHTML(lotOccupancy.occupancyType || '') +
|
||||
'</a>' +
|
||||
'</td>');
|
||||
if (lotOccupancy.lotId) {
|
||||
rowElement.insertAdjacentHTML("beforeend", "<td>" +
|
||||
cityssm.escapeHTML(lotOccupancy.lotName || "") +
|
||||
rowElement.insertAdjacentHTML('beforeend', '<td>' +
|
||||
cityssm.escapeHTML(lotOccupancy.lotName || '') +
|
||||
(hasLotRecord
|
||||
? ""
|
||||
? ''
|
||||
: ' <button class="button is-small is-light is-success button--addLot"' +
|
||||
' data-lot-id="' +
|
||||
lotOccupancy.lotId +
|
||||
|
|
@ -140,58 +144,61 @@ function renderRelatedOccupancies() {
|
|||
los.escapedAliases.Lot +
|
||||
'" type="button">' +
|
||||
'<i class="fas fa-plus" aria-hidden="true"></i>' +
|
||||
"</button>") +
|
||||
"</td>");
|
||||
'</button>') +
|
||||
'</td>');
|
||||
}
|
||||
else {
|
||||
rowElement.insertAdjacentHTML("beforeend", `<td><span class="has-text-grey">(No ${los.escapedAliases.Lot})</span></td>`);
|
||||
rowElement.insertAdjacentHTML('beforeend', `<td><span class="has-text-grey">(No ${los.escapedAliases.Lot})</span></td>`);
|
||||
}
|
||||
rowElement.insertAdjacentHTML("beforeend", "<td>" +
|
||||
rowElement.insertAdjacentHTML('beforeend', '<td>' +
|
||||
lotOccupancy.occupancyStartDateString +
|
||||
"</td>" +
|
||||
("<td>" +
|
||||
'</td>' +
|
||||
('<td>' +
|
||||
(lotOccupancy.occupancyEndDate
|
||||
? lotOccupancy.occupancyEndDateString
|
||||
: '<span class="has-text-grey">(No End Date)</span>') +
|
||||
"</td>") +
|
||||
("<td>" +
|
||||
'</td>') +
|
||||
('<td>' +
|
||||
(lotOccupancy.lotOccupancyOccupants.length === 0
|
||||
? '<span class="has-text-grey">(No ' + los.escapedAliases.Occupants + ")</span>"
|
||||
? '<span class="has-text-grey">(No ' +
|
||||
los.escapedAliases.Occupants +
|
||||
')</span>'
|
||||
: (_a = lotOccupancy.lotOccupancyOccupants) === null || _a === void 0 ? void 0 : _a.reduce((soFar, occupant) => {
|
||||
return (soFar +
|
||||
'<span class="has-tooltip-left" data-tooltip="' +
|
||||
cityssm.escapeHTML(occupant.lotOccupantType) +
|
||||
'">' +
|
||||
'<i class="fas fa-fw fa-' +
|
||||
cityssm.escapeHTML(occupant.fontAwesomeIconClass || "user") +
|
||||
cityssm.escapeHTML(occupant.fontAwesomeIconClass || 'user') +
|
||||
'" aria-label="' +
|
||||
los.escapedAliases.Occupant +
|
||||
'"></i> ' +
|
||||
cityssm.escapeHTML(occupant.occupantName) +
|
||||
"</span><br />");
|
||||
}, "")) +
|
||||
"</td>") +
|
||||
("<td>" +
|
||||
'</span><br />');
|
||||
}, '')) +
|
||||
'</td>') +
|
||||
('<td>' +
|
||||
'<button class="button is-small is-light is-danger button--deleteLotOccupancy" data-tooltip="Delete Relationship" type="button">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
"</button>" +
|
||||
"</td>"));
|
||||
(_b = rowElement.querySelector(".button--addLot")) === null || _b === void 0 ? void 0 : _b.addEventListener("click", addLotFromLotOccupancy);
|
||||
'</button>' +
|
||||
'</td>'));
|
||||
(_b = rowElement
|
||||
.querySelector('.button--addLot')) === null || _b === void 0 ? void 0 : _b.addEventListener('click', addLotFromLotOccupancy);
|
||||
rowElement
|
||||
.querySelector(".button--deleteLotOccupancy")
|
||||
.addEventListener("click", deleteLotOccupancy);
|
||||
occupanciesContainerElement.querySelector("tbody").append(rowElement);
|
||||
.querySelector('.button--deleteLotOccupancy')
|
||||
.addEventListener('click', deleteLotOccupancy);
|
||||
occupanciesContainerElement.querySelector('tbody').append(rowElement);
|
||||
}
|
||||
}
|
||||
function openEditLotStatus(clickEvent) {
|
||||
const lotId = Number.parseInt(clickEvent.currentTarget.closest(".container--lot").dataset.lotId, 10);
|
||||
const lotId = Number.parseInt(clickEvent.currentTarget.closest('.container--lot').dataset.lotId, 10);
|
||||
const lot = workOrderLots.find((possibleLot) => {
|
||||
return possibleLot.lotId === lotId;
|
||||
});
|
||||
let editCloseModalFunction;
|
||||
function doUpdateLotStatus(submitEvent) {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doUpdateLotStatus", submitEvent.currentTarget, (responseJSON) => {
|
||||
cityssm.postJSON(los.urlPrefix + '/workOrders/doUpdateLotStatus', submitEvent.currentTarget, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderLots = responseJSON.workOrderLots;
|
||||
renderRelatedLotsAndOccupancies();
|
||||
|
|
@ -199,23 +206,22 @@ function openEditLotStatus(clickEvent) {
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Deleting Relationship",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Deleting Relationship',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
cityssm.openHtmlModal("lot-editLotStatus", {
|
||||
cityssm.openHtmlModal('lot-editLotStatus', {
|
||||
onshow(modalElement) {
|
||||
los.populateAliases(modalElement);
|
||||
modalElement.querySelector("#lotStatusEdit--lotId").value =
|
||||
lotId.toString();
|
||||
modalElement.querySelector("#lotStatusEdit--lotName").value = lot.lotName;
|
||||
const lotStatusElement = modalElement.querySelector("#lotStatusEdit--lotStatusId");
|
||||
modalElement.querySelector('#lotStatusEdit--lotId').value = lotId.toString();
|
||||
modalElement.querySelector('#lotStatusEdit--lotName').value = lot.lotName;
|
||||
const lotStatusElement = modalElement.querySelector('#lotStatusEdit--lotStatusId');
|
||||
let lotStatusFound = false;
|
||||
for (const lotStatus of exports.lotStatuses) {
|
||||
const optionElement = document.createElement("option");
|
||||
const optionElement = document.createElement('option');
|
||||
optionElement.value = lotStatus.lotStatusId.toString();
|
||||
optionElement.textContent = lotStatus.lotStatus;
|
||||
if (lotStatus.lotStatusId === lot.lotStatusId) {
|
||||
|
|
@ -224,7 +230,7 @@ function openEditLotStatus(clickEvent) {
|
|||
lotStatusElement.append(optionElement);
|
||||
}
|
||||
if (!lotStatusFound && lot.lotStatusId) {
|
||||
const optionElement = document.createElement("option");
|
||||
const optionElement = document.createElement('option');
|
||||
optionElement.value = lot.lotStatusId.toString();
|
||||
optionElement.textContent = lot.lotStatus;
|
||||
lotStatusElement.append(optionElement);
|
||||
|
|
@ -233,13 +239,15 @@ function openEditLotStatus(clickEvent) {
|
|||
lotStatusElement.value = lot.lotStatusId.toString();
|
||||
}
|
||||
modalElement
|
||||
.querySelector("form")
|
||||
.insertAdjacentHTML("beforeend", `<input name="workOrderId" type="hidden" value="${workOrderId}" />`);
|
||||
.querySelector('form')
|
||||
.insertAdjacentHTML('beforeend', `<input name="workOrderId" type="hidden" value="${workOrderId}" />`);
|
||||
},
|
||||
onshown(modalElement, closeModalFunction) {
|
||||
editCloseModalFunction = closeModalFunction;
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
modalElement.querySelector("form").addEventListener("submit", doUpdateLotStatus);
|
||||
modalElement
|
||||
.querySelector('form')
|
||||
.addEventListener('submit', doUpdateLotStatus);
|
||||
},
|
||||
onremoved() {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
|
|
@ -247,10 +255,9 @@ function openEditLotStatus(clickEvent) {
|
|||
});
|
||||
}
|
||||
function deleteLot(clickEvent) {
|
||||
const lotId = clickEvent.currentTarget.closest(".container--lot")
|
||||
.dataset.lotId;
|
||||
const lotId = clickEvent.currentTarget.closest('.container--lot').dataset.lotId;
|
||||
function doDelete() {
|
||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doDeleteWorkOrderLot", {
|
||||
cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrderLot', {
|
||||
workOrderId,
|
||||
lotId
|
||||
}, (responseJSON) => {
|
||||
|
|
@ -260,9 +267,9 @@ function deleteLot(clickEvent) {
|
|||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Deleting Relationship",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Deleting Relationship',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
@ -270,17 +277,16 @@ function deleteLot(clickEvent) {
|
|||
bulmaJS.confirm({
|
||||
title: `Delete ${los.escapedAliases.Occupancy} Relationship`,
|
||||
message: `Are you sure you want to remove the relationship to this ${los.escapedAliases.occupancy} record from this work order? Note that the record will remain.`,
|
||||
contextualColorName: "warning",
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: "Yes, Delete Relationship",
|
||||
text: 'Yes, Delete Relationship',
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
});
|
||||
}
|
||||
function renderRelatedLots() {
|
||||
const lotsContainerElement = document.querySelector("#container--lots");
|
||||
document.querySelector(".tabs a[href='#relatedTab--lots'] .tag").textContent =
|
||||
workOrderLots.length.toString();
|
||||
const lotsContainerElement = document.querySelector('#container--lots');
|
||||
document.querySelector(".tabs a[href='#relatedTab--lots'] .tag").textContent = workOrderLots.length.toString();
|
||||
if (workOrderLots.length === 0) {
|
||||
lotsContainerElement.innerHTML = `<div class="message is-info">
|
||||
<p class="message-body">There are no ${los.escapedAliases.lots} associated with this work order.</p>
|
||||
|
|
@ -298,35 +304,39 @@ function renderRelatedLots() {
|
|||
<tbody></tbody>
|
||||
</table>`;
|
||||
for (const lot of workOrderLots) {
|
||||
const rowElement = document.createElement("tr");
|
||||
rowElement.className = "container--lot";
|
||||
const rowElement = document.createElement('tr');
|
||||
rowElement.className = 'container--lot';
|
||||
rowElement.dataset.lotId = lot.lotId.toString();
|
||||
rowElement.innerHTML =
|
||||
"<td>" +
|
||||
'<td>' +
|
||||
'<a class="has-text-weight-bold" href="' +
|
||||
los.getLotURL(lot.lotId) +
|
||||
'">' +
|
||||
cityssm.escapeHTML(lot.lotName || "") +
|
||||
"</a>" +
|
||||
"</td>" +
|
||||
("<td>" + cityssm.escapeHTML(lot.mapName || "") + "</td>") +
|
||||
("<td>" + cityssm.escapeHTML(lot.lotType || "") + "</td>") +
|
||||
("<td>" +
|
||||
cityssm.escapeHTML(lot.lotName || '') +
|
||||
'</a>' +
|
||||
'</td>' +
|
||||
('<td>' + cityssm.escapeHTML(lot.mapName || '') + '</td>') +
|
||||
('<td>' + cityssm.escapeHTML(lot.lotType || '') + '</td>') +
|
||||
('<td>' +
|
||||
(lot.lotStatusId
|
||||
? cityssm.escapeHTML(lot.lotStatus || "")
|
||||
? cityssm.escapeHTML(lot.lotStatus || '')
|
||||
: '<span class="has-text-grey">(No Status)</span>') +
|
||||
"</td>") +
|
||||
'</td>') +
|
||||
('<td class="is-nowrap">' +
|
||||
'<button class="button is-small is-light is-info button--editLotStatus" data-tooltip="Update Status" type="button">' +
|
||||
'<i class="fas fa-pencil-alt" aria-hidden="true"></i>' +
|
||||
"</button>" +
|
||||
'</button>' +
|
||||
' <button class="button is-small is-light is-danger button--deleteLot" data-tooltip="Delete Relationship" type="button">' +
|
||||
'<i class="fas fa-trash" aria-hidden="true"></i>' +
|
||||
"</button>" +
|
||||
"</td>");
|
||||
rowElement.querySelector(".button--editLotStatus").addEventListener("click", openEditLotStatus);
|
||||
rowElement.querySelector(".button--deleteLot").addEventListener("click", deleteLot);
|
||||
lotsContainerElement.querySelector("tbody").append(rowElement);
|
||||
'</button>' +
|
||||
'</td>');
|
||||
rowElement
|
||||
.querySelector('.button--editLotStatus')
|
||||
.addEventListener('click', openEditLotStatus);
|
||||
rowElement
|
||||
.querySelector('.button--deleteLot')
|
||||
.addEventListener('click', deleteLot);
|
||||
lotsContainerElement.querySelector('tbody').append(rowElement);
|
||||
}
|
||||
}
|
||||
function renderRelatedLotsAndOccupancies() {
|
||||
|
|
@ -335,7 +345,7 @@ function renderRelatedLotsAndOccupancies() {
|
|||
}
|
||||
renderRelatedLotsAndOccupancies();
|
||||
function doAddLotOccupancy(clickEvent) {
|
||||
const rowElement = clickEvent.currentTarget.closest("tr");
|
||||
const rowElement = clickEvent.currentTarget.closest('tr');
|
||||
const lotOccupancyId = rowElement.dataset.lotOccupancyId;
|
||||
addLotOccupancy(lotOccupancyId, (success) => {
|
||||
if (success) {
|
||||
|
|
@ -343,15 +353,18 @@ function doAddLotOccupancy(clickEvent) {
|
|||
}
|
||||
});
|
||||
}
|
||||
document.querySelector("#button--addLotOccupancy").addEventListener("click", () => {
|
||||
document
|
||||
.querySelector('#button--addLotOccupancy')
|
||||
.addEventListener('click', () => {
|
||||
let searchFormElement;
|
||||
let searchResultsContainerElement;
|
||||
function doSearch(event) {
|
||||
if (event) {
|
||||
event.preventDefault();
|
||||
}
|
||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML("Searching...");
|
||||
cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doSearchLotOccupancies", searchFormElement, (responseJSON) => {
|
||||
searchResultsContainerElement.innerHTML =
|
||||
los.getLoadingParagraphHTML('Searching...');
|
||||
cityssm.postJSON(los.urlPrefix + '/lotOccupancies/doSearchLotOccupancies', searchFormElement, (responseJSON) => {
|
||||
if (responseJSON.lotOccupancies.length === 0) {
|
||||
searchResultsContainerElement.innerHTML = `<div class="message is-info">
|
||||
<p class="message-body">There are no records that meet the search criteria.</p>
|
||||
|
|
@ -370,64 +383,69 @@ document.querySelector("#button--addLotOccupancy").addEventListener("click", ()
|
|||
<tbody></tbody>
|
||||
</table>`;
|
||||
for (const lotOccupancy of responseJSON.lotOccupancies) {
|
||||
const rowElement = document.createElement("tr");
|
||||
rowElement.className = "container--lotOccupancy";
|
||||
rowElement.dataset.lotOccupancyId = lotOccupancy.lotOccupancyId.toString();
|
||||
const rowElement = document.createElement('tr');
|
||||
rowElement.className = 'container--lotOccupancy';
|
||||
rowElement.dataset.lotOccupancyId =
|
||||
lotOccupancy.lotOccupancyId.toString();
|
||||
rowElement.innerHTML =
|
||||
'<td class="has-text-centered">' +
|
||||
'<button class="button is-small is-success button--addLotOccupancy" data-tooltip="Add" type="button" aria-label="Add">' +
|
||||
'<i class="fas fa-plus" aria-hidden="true"></i>' +
|
||||
"</button>" +
|
||||
"</td>" +
|
||||
'</button>' +
|
||||
'</td>' +
|
||||
('<td class="has-text-weight-bold">' +
|
||||
cityssm.escapeHTML(lotOccupancy.occupancyType || "") +
|
||||
"</td>");
|
||||
cityssm.escapeHTML(lotOccupancy.occupancyType || '') +
|
||||
'</td>');
|
||||
if (lotOccupancy.lotId) {
|
||||
rowElement.insertAdjacentHTML("beforeend", "<td>" + cityssm.escapeHTML(lotOccupancy.lotName || "") + "</td>");
|
||||
rowElement.insertAdjacentHTML('beforeend', '<td>' +
|
||||
cityssm.escapeHTML(lotOccupancy.lotName || '') +
|
||||
'</td>');
|
||||
}
|
||||
else {
|
||||
rowElement.insertAdjacentHTML("beforeend", `<td><span class="has-text-grey">(No ${los.escapedAliases.Lot})</span></td>`);
|
||||
rowElement.insertAdjacentHTML('beforeend', `<td><span class="has-text-grey">(No ${los.escapedAliases.Lot})</span></td>`);
|
||||
}
|
||||
rowElement.insertAdjacentHTML("beforeend", "<td>" +
|
||||
rowElement.insertAdjacentHTML('beforeend', '<td>' +
|
||||
lotOccupancy.occupancyStartDateString +
|
||||
"</td>" +
|
||||
("<td>" +
|
||||
'</td>' +
|
||||
('<td>' +
|
||||
(lotOccupancy.occupancyEndDate
|
||||
? lotOccupancy.occupancyEndDateString
|
||||
: '<span class="has-text-grey">(No End Date)</span>') +
|
||||
"</td>") +
|
||||
("<td>" +
|
||||
'</td>') +
|
||||
('<td>' +
|
||||
(lotOccupancy.lotOccupancyOccupants.length === 0
|
||||
? '<span class="has-text-grey">(No ' +
|
||||
cityssm.escapeHTML(exports.aliases.occupants) +
|
||||
")</span>"
|
||||
')</span>'
|
||||
: cityssm.escapeHTML(lotOccupancy.lotOccupancyOccupants[0].occupantName) +
|
||||
(lotOccupancy.lotOccupancyOccupants.length > 1
|
||||
? " plus " + (lotOccupancy.lotOccupancyOccupants.length - 1)
|
||||
: "")) +
|
||||
"</td>"));
|
||||
? ' plus ' +
|
||||
(lotOccupancy.lotOccupancyOccupants.length - 1)
|
||||
: '')) +
|
||||
'</td>'));
|
||||
rowElement
|
||||
.querySelector(".button--addLotOccupancy")
|
||||
.addEventListener("click", doAddLotOccupancy);
|
||||
searchResultsContainerElement.querySelector("tbody").append(rowElement);
|
||||
.querySelector('.button--addLotOccupancy')
|
||||
.addEventListener('click', doAddLotOccupancy);
|
||||
searchResultsContainerElement
|
||||
.querySelector('tbody')
|
||||
.append(rowElement);
|
||||
}
|
||||
});
|
||||
}
|
||||
cityssm.openHtmlModal("workOrder-addLotOccupancy", {
|
||||
cityssm.openHtmlModal('workOrder-addLotOccupancy', {
|
||||
onshow(modalElement) {
|
||||
los.populateAliases(modalElement);
|
||||
searchFormElement = modalElement.querySelector("form");
|
||||
searchResultsContainerElement = modalElement.querySelector("#resultsContainer--lotOccupancyAdd");
|
||||
modalElement.querySelector("#lotOccupancySearch--notWorkOrderId").value =
|
||||
workOrderId;
|
||||
modalElement.querySelector("#lotOccupancySearch--occupancyEffectiveDateString").value = document.querySelector("#workOrderEdit--workOrderOpenDateString").value;
|
||||
searchFormElement = modalElement.querySelector('form');
|
||||
searchResultsContainerElement = modalElement.querySelector('#resultsContainer--lotOccupancyAdd');
|
||||
modalElement.querySelector('#lotOccupancySearch--notWorkOrderId').value = workOrderId;
|
||||
modalElement.querySelector('#lotOccupancySearch--occupancyEffectiveDateString').value = document.querySelector('#workOrderEdit--workOrderOpenDateString').value;
|
||||
doSearch();
|
||||
},
|
||||
onshown(modalElement) {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
modalElement.querySelector("#lotOccupancySearch--occupantName").addEventListener("change", doSearch);
|
||||
modalElement.querySelector("#lotOccupancySearch--lotName").addEventListener("change", doSearch);
|
||||
searchFormElement.addEventListener("submit", doSearch);
|
||||
modalElement.querySelector('#lotOccupancySearch--occupantName').addEventListener('change', doSearch);
|
||||
modalElement.querySelector('#lotOccupancySearch--lotName').addEventListener('change', doSearch);
|
||||
searchFormElement.addEventListener('submit', doSearch);
|
||||
},
|
||||
onremoved() {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
|
|
@ -435,7 +453,7 @@ document.querySelector("#button--addLotOccupancy").addEventListener("click", ()
|
|||
});
|
||||
});
|
||||
function doAddLot(clickEvent) {
|
||||
const rowElement = clickEvent.currentTarget.closest("tr");
|
||||
const rowElement = clickEvent.currentTarget.closest('tr');
|
||||
const lotId = rowElement.dataset.lotId;
|
||||
addLot(lotId, (success) => {
|
||||
if (success) {
|
||||
|
|
@ -443,20 +461,21 @@ function doAddLot(clickEvent) {
|
|||
}
|
||||
});
|
||||
}
|
||||
document.querySelector("#button--addLot").addEventListener("click", () => {
|
||||
document.querySelector('#button--addLot').addEventListener('click', () => {
|
||||
let searchFormElement;
|
||||
let searchResultsContainerElement;
|
||||
function doSearch(event) {
|
||||
if (event) {
|
||||
event.preventDefault();
|
||||
}
|
||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML("Searching...");
|
||||
cityssm.postJSON(los.urlPrefix + "/lots/doSearchLots", searchFormElement, (responseJSON) => {
|
||||
searchResultsContainerElement.innerHTML =
|
||||
los.getLoadingParagraphHTML('Searching...');
|
||||
cityssm.postJSON(los.urlPrefix + '/lots/doSearchLots', searchFormElement, (responseJSON) => {
|
||||
if (responseJSON.lots.length === 0) {
|
||||
searchResultsContainerElement.innerHTML =
|
||||
'<div class="message is-info">' +
|
||||
'<p class="message-body">There are no records that meet the search criteria.</p>' +
|
||||
"</div>";
|
||||
'</div>';
|
||||
return;
|
||||
}
|
||||
searchResultsContainerElement.innerHTML = `<table class="table is-fullwidth is-striped is-hoverable">
|
||||
|
|
@ -470,38 +489,41 @@ document.querySelector("#button--addLot").addEventListener("click", () => {
|
|||
<tbody></tbody>
|
||||
</table>`;
|
||||
for (const lot of responseJSON.lots) {
|
||||
const rowElement = document.createElement("tr");
|
||||
rowElement.className = "container--lot";
|
||||
const rowElement = document.createElement('tr');
|
||||
rowElement.className = 'container--lot';
|
||||
rowElement.dataset.lotId = lot.lotId.toString();
|
||||
rowElement.innerHTML =
|
||||
'<td class="has-text-centered">' +
|
||||
'<button class="button is-small is-success button--addLot" data-tooltip="Add" type="button" aria-label="Add">' +
|
||||
'<i class="fas fa-plus" aria-hidden="true"></i>' +
|
||||
"</button>" +
|
||||
"</td>" +
|
||||
'</button>' +
|
||||
'</td>' +
|
||||
('<td class="has-text-weight-bold">' +
|
||||
cityssm.escapeHTML(lot.lotName || "") +
|
||||
"</td>") +
|
||||
"<td>" +
|
||||
cityssm.escapeHTML(lot.mapName || "") +
|
||||
"</td>" +
|
||||
("<td>" + cityssm.escapeHTML(lot.lotType || "") + "</td>") +
|
||||
("<td>" + cityssm.escapeHTML(lot.lotStatus || "") + "</td>");
|
||||
rowElement.querySelector(".button--addLot").addEventListener("click", doAddLot);
|
||||
searchResultsContainerElement.querySelector("tbody").append(rowElement);
|
||||
cityssm.escapeHTML(lot.lotName || '') +
|
||||
'</td>') +
|
||||
'<td>' +
|
||||
cityssm.escapeHTML(lot.mapName || '') +
|
||||
'</td>' +
|
||||
('<td>' + cityssm.escapeHTML(lot.lotType || '') + '</td>') +
|
||||
('<td>' + cityssm.escapeHTML(lot.lotStatus || '') + '</td>');
|
||||
rowElement
|
||||
.querySelector('.button--addLot')
|
||||
.addEventListener('click', doAddLot);
|
||||
searchResultsContainerElement
|
||||
.querySelector('tbody')
|
||||
.append(rowElement);
|
||||
}
|
||||
});
|
||||
}
|
||||
cityssm.openHtmlModal("workOrder-addLot", {
|
||||
cityssm.openHtmlModal('workOrder-addLot', {
|
||||
onshow(modalElement) {
|
||||
los.populateAliases(modalElement);
|
||||
searchFormElement = modalElement.querySelector("form");
|
||||
searchResultsContainerElement = modalElement.querySelector("#resultsContainer--lotAdd");
|
||||
modalElement.querySelector("#lotSearch--notWorkOrderId").value =
|
||||
workOrderId;
|
||||
const lotStatusElement = modalElement.querySelector("#lotSearch--lotStatusId");
|
||||
searchFormElement = modalElement.querySelector('form');
|
||||
searchResultsContainerElement = modalElement.querySelector('#resultsContainer--lotAdd');
|
||||
modalElement.querySelector('#lotSearch--notWorkOrderId').value = workOrderId;
|
||||
const lotStatusElement = modalElement.querySelector('#lotSearch--lotStatusId');
|
||||
for (const lotStatus of exports.lotStatuses) {
|
||||
const optionElement = document.createElement("option");
|
||||
const optionElement = document.createElement('option');
|
||||
optionElement.value = lotStatus.lotStatusId.toString();
|
||||
optionElement.textContent = lotStatus.lotStatus;
|
||||
lotStatusElement.append(optionElement);
|
||||
|
|
@ -510,9 +532,13 @@ document.querySelector("#button--addLot").addEventListener("click", () => {
|
|||
},
|
||||
onshown(modalElement) {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
modalElement.querySelector("#lotSearch--lotName").addEventListener("change", doSearch);
|
||||
modalElement.querySelector("#lotSearch--lotStatusId").addEventListener("change", doSearch);
|
||||
searchFormElement.addEventListener("submit", doSearch);
|
||||
modalElement
|
||||
.querySelector('#lotSearch--lotName')
|
||||
.addEventListener('change', doSearch);
|
||||
modalElement
|
||||
.querySelector('#lotSearch--lotStatusId')
|
||||
.addEventListener('change', doSearch);
|
||||
searchFormElement.addEventListener('submit', doSearch);
|
||||
},
|
||||
onremoved() {
|
||||
bulmaJS.toggleHtmlClipped();
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -3,62 +3,62 @@
|
|||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
(() => {
|
||||
const los = exports.los;
|
||||
const workOrderSearchFiltersFormElement = document.querySelector("#form--searchFilters");
|
||||
const workOrderMilestoneDateFilterElement = workOrderSearchFiltersFormElement.querySelector("#searchFilter--workOrderMilestoneDateFilter");
|
||||
const workOrderMilestoneDateStringElement = workOrderSearchFiltersFormElement.querySelector("#searchFilter--workOrderMilestoneDateString");
|
||||
const milestoneCalendarContainerElement = document.querySelector("#container--milestoneCalendar");
|
||||
const workOrderSearchFiltersFormElement = document.querySelector('#form--searchFilters');
|
||||
const workOrderMilestoneDateFilterElement = workOrderSearchFiltersFormElement.querySelector('#searchFilter--workOrderMilestoneDateFilter');
|
||||
const workOrderMilestoneDateStringElement = workOrderSearchFiltersFormElement.querySelector('#searchFilter--workOrderMilestoneDateString');
|
||||
const milestoneCalendarContainerElement = document.querySelector('#container--milestoneCalendar');
|
||||
function renderMilestones(workOrderMilestones) {
|
||||
if (workOrderMilestones.length === 0) {
|
||||
milestoneCalendarContainerElement.innerHTML = `<div class="message is-info">
|
||||
<p class="message-body">There are no milestones that meet the search criteria.</p>
|
||||
</div>`;
|
||||
<p class="message-body">There are no milestones that meet the search criteria.</p>
|
||||
</div>`;
|
||||
return;
|
||||
}
|
||||
milestoneCalendarContainerElement.innerHTML = "";
|
||||
milestoneCalendarContainerElement.innerHTML = '';
|
||||
const currentDate = cityssm.dateToString(new Date());
|
||||
let currentPanelElement;
|
||||
let currentPanelDateString = "";
|
||||
let currentPanelDateString = '';
|
||||
for (const milestone of workOrderMilestones) {
|
||||
if (currentPanelDateString !== milestone.workOrderMilestoneDateString) {
|
||||
if (currentPanelElement) {
|
||||
milestoneCalendarContainerElement.append(currentPanelElement);
|
||||
}
|
||||
currentPanelElement = document.createElement("div");
|
||||
currentPanelElement.className = "panel";
|
||||
currentPanelElement = document.createElement('div');
|
||||
currentPanelElement.className = 'panel';
|
||||
currentPanelElement.innerHTML = `<h2 class="panel-heading">${milestone.workOrderMilestoneDateString}</h2>`;
|
||||
currentPanelDateString = milestone.workOrderMilestoneDateString;
|
||||
}
|
||||
const panelBlockElement = document.createElement("div");
|
||||
panelBlockElement.className = "panel-block is-block";
|
||||
const panelBlockElement = document.createElement('div');
|
||||
panelBlockElement.className = 'panel-block is-block';
|
||||
if (!milestone.workOrderMilestoneCompletionDate &&
|
||||
milestone.workOrderMilestoneDateString < currentDate) {
|
||||
panelBlockElement.classList.add("has-background-warning-light");
|
||||
panelBlockElement.classList.add('has-background-warning-light');
|
||||
}
|
||||
let lotOccupancyHTML = "";
|
||||
let lotOccupancyHTML = '';
|
||||
for (const lot of milestone.workOrderLots) {
|
||||
lotOccupancyHTML +=
|
||||
'<span class="has-tooltip-left" data-tooltip="' +
|
||||
cityssm.escapeHTML(lot.mapName || "") +
|
||||
cityssm.escapeHTML(lot.mapName || '') +
|
||||
'">' +
|
||||
'<i class="fas fa-vector-square" aria-label="' +
|
||||
los.escapedAliases.Lot +
|
||||
'"></i> ' +
|
||||
cityssm.escapeHTML(lot.lotName || "") +
|
||||
"</span>" +
|
||||
"<br />";
|
||||
cityssm.escapeHTML(lot.lotName || '') +
|
||||
'</span>' +
|
||||
'<br />';
|
||||
}
|
||||
for (const lotOccupancy of milestone.workOrderLotOccupancies) {
|
||||
for (const occupant of lotOccupancy.lotOccupancyOccupants) {
|
||||
lotOccupancyHTML +=
|
||||
'<span class="has-tooltip-left" data-tooltip="' +
|
||||
cityssm.escapeHTML(occupant.lotOccupantType || "") +
|
||||
cityssm.escapeHTML(occupant.lotOccupantType || '') +
|
||||
'">' +
|
||||
'<i class="fas fa-user" aria-label="' +
|
||||
los.escapedAliases.Occupancy +
|
||||
'"></i> ' +
|
||||
cityssm.escapeHTML(occupant.occupantName || "") +
|
||||
"</span>" +
|
||||
"<br />";
|
||||
cityssm.escapeHTML(occupant.occupantName || '') +
|
||||
'</span>' +
|
||||
'<br />';
|
||||
}
|
||||
}
|
||||
panelBlockElement.innerHTML =
|
||||
|
|
@ -68,36 +68,36 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
(milestone.workOrderMilestoneCompletionDate
|
||||
? '<i class="fas fa-check" aria-label="Completed"></i>'
|
||||
: '<i class="far fa-square has-text-grey" aria-label="Incomplete"></i>') +
|
||||
"</span>" +
|
||||
"</div>") +
|
||||
'</span>' +
|
||||
'</div>') +
|
||||
('<div class="column">' +
|
||||
(milestone.workOrderMilestoneTime === 0
|
||||
? ""
|
||||
: milestone.workOrderMilestoneTimeString + "<br />") +
|
||||
? ''
|
||||
: milestone.workOrderMilestoneTimeString + '<br />') +
|
||||
(milestone.workOrderMilestoneTypeId
|
||||
? "<strong>" +
|
||||
? '<strong>' +
|
||||
cityssm.escapeHTML(milestone.workOrderMilestoneType) +
|
||||
"</strong><br />"
|
||||
: "") +
|
||||
'</strong><br />'
|
||||
: '') +
|
||||
'<span class="is-size-7">' +
|
||||
cityssm.escapeHTML(milestone.workOrderMilestoneDescription) +
|
||||
"</span>" +
|
||||
"</div>") +
|
||||
'</span>' +
|
||||
'</div>') +
|
||||
('<div class="column">' +
|
||||
'<i class="fas fa-circle" style="color:' +
|
||||
los.getRandomColor(milestone.workOrderNumber || "") +
|
||||
los.getRandomColor(milestone.workOrderNumber || '') +
|
||||
'" aria-hidden="true"></i>' +
|
||||
' <a class="has-text-weight-bold" href="' +
|
||||
los.getWorkOrderURL(milestone.workOrderId) +
|
||||
'">' +
|
||||
cityssm.escapeHTML(milestone.workOrderNumber || "") +
|
||||
"</a><br />" +
|
||||
cityssm.escapeHTML(milestone.workOrderNumber || '') +
|
||||
'</a><br />' +
|
||||
'<span class="is-size-7">' +
|
||||
cityssm.escapeHTML(milestone.workOrderDescription || "") +
|
||||
"</span>" +
|
||||
"</div>") +
|
||||
('<div class="column is-size-7">' + lotOccupancyHTML + "</div>") +
|
||||
"</div>";
|
||||
cityssm.escapeHTML(milestone.workOrderDescription || '') +
|
||||
'</span>' +
|
||||
'</div>') +
|
||||
('<div class="column is-size-7">' + lotOccupancyHTML + '</div>') +
|
||||
'</div>';
|
||||
currentPanelElement.append(panelBlockElement);
|
||||
}
|
||||
milestoneCalendarContainerElement.append(currentPanelElement);
|
||||
|
|
@ -106,18 +106,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
if (event) {
|
||||
event.preventDefault();
|
||||
}
|
||||
milestoneCalendarContainerElement.innerHTML = los.getLoadingParagraphHTML("Loading Milestones...");
|
||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doGetWorkOrderMilestones", workOrderSearchFiltersFormElement, (responseJSON) => {
|
||||
milestoneCalendarContainerElement.innerHTML = los.getLoadingParagraphHTML('Loading Milestones...');
|
||||
cityssm.postJSON(los.urlPrefix + '/workOrders/doGetWorkOrderMilestones', workOrderSearchFiltersFormElement, (responseJSON) => {
|
||||
renderMilestones(responseJSON.workOrderMilestones);
|
||||
});
|
||||
}
|
||||
workOrderMilestoneDateFilterElement.addEventListener("change", () => {
|
||||
workOrderMilestoneDateStringElement.closest("fieldset").disabled =
|
||||
workOrderMilestoneDateFilterElement.value !== "date";
|
||||
workOrderMilestoneDateFilterElement.addEventListener('change', () => {
|
||||
workOrderMilestoneDateStringElement.closest('fieldset').disabled =
|
||||
workOrderMilestoneDateFilterElement.value !== 'date';
|
||||
getMilestones();
|
||||
});
|
||||
los.initializeDatePickers(workOrderSearchFiltersFormElement);
|
||||
workOrderMilestoneDateStringElement.addEventListener("change", getMilestones);
|
||||
workOrderSearchFiltersFormElement.addEventListener("submit", getMilestones);
|
||||
workOrderMilestoneDateStringElement.addEventListener('change', getMilestones);
|
||||
workOrderSearchFiltersFormElement.addEventListener('submit', getMilestones);
|
||||
getMilestones();
|
||||
})();
|
||||
|
|
|
|||
|
|
@ -1,170 +1,176 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
|
||||
import type * as recordTypes from "../types/recordTypes";
|
||||
import type * as globalTypes from "../types/globalTypes";
|
||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||
import type * as recordTypes from '../types/recordTypes'
|
||||
import type * as globalTypes from '../types/globalTypes'
|
||||
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||
|
||||
declare const cityssm: cityssmGlobal;
|
||||
declare const cityssm: cityssmGlobal
|
||||
;(() => {
|
||||
const los = exports.los as globalTypes.LOS
|
||||
|
||||
(() => {
|
||||
const los = exports.los as globalTypes.LOS;
|
||||
const workOrderSearchFiltersFormElement = document.querySelector(
|
||||
'#form--searchFilters'
|
||||
) as HTMLFormElement
|
||||
|
||||
const workOrderSearchFiltersFormElement = document.querySelector(
|
||||
"#form--searchFilters"
|
||||
) as HTMLFormElement;
|
||||
const workOrderMilestoneDateFilterElement =
|
||||
workOrderSearchFiltersFormElement.querySelector(
|
||||
'#searchFilter--workOrderMilestoneDateFilter'
|
||||
) as HTMLSelectElement
|
||||
|
||||
const workOrderMilestoneDateFilterElement = workOrderSearchFiltersFormElement.querySelector(
|
||||
"#searchFilter--workOrderMilestoneDateFilter"
|
||||
) as HTMLSelectElement;
|
||||
const workOrderMilestoneDateStringElement =
|
||||
workOrderSearchFiltersFormElement.querySelector(
|
||||
'#searchFilter--workOrderMilestoneDateString'
|
||||
) as HTMLInputElement
|
||||
|
||||
const workOrderMilestoneDateStringElement = workOrderSearchFiltersFormElement.querySelector(
|
||||
"#searchFilter--workOrderMilestoneDateString"
|
||||
) as HTMLInputElement;
|
||||
const milestoneCalendarContainerElement = document.querySelector(
|
||||
'#container--milestoneCalendar'
|
||||
) as HTMLElement
|
||||
|
||||
const milestoneCalendarContainerElement = document.querySelector(
|
||||
"#container--milestoneCalendar"
|
||||
) as HTMLElement;
|
||||
|
||||
function renderMilestones(workOrderMilestones: recordTypes.WorkOrderMilestone[]) {
|
||||
if (workOrderMilestones.length === 0) {
|
||||
milestoneCalendarContainerElement.innerHTML = `<div class="message is-info">
|
||||
<p class="message-body">There are no milestones that meet the search criteria.</p>
|
||||
</div>`;
|
||||
return;
|
||||
}
|
||||
|
||||
milestoneCalendarContainerElement.innerHTML = "";
|
||||
|
||||
const currentDate = cityssm.dateToString(new Date());
|
||||
|
||||
let currentPanelElement: HTMLElement | undefined;
|
||||
let currentPanelDateString = "";
|
||||
|
||||
for (const milestone of workOrderMilestones) {
|
||||
if (currentPanelDateString !== milestone.workOrderMilestoneDateString) {
|
||||
if (currentPanelElement) {
|
||||
milestoneCalendarContainerElement.append(currentPanelElement);
|
||||
}
|
||||
|
||||
currentPanelElement = document.createElement("div");
|
||||
currentPanelElement.className = "panel";
|
||||
|
||||
currentPanelElement.innerHTML = `<h2 class="panel-heading">${milestone.workOrderMilestoneDateString}</h2>`;
|
||||
|
||||
currentPanelDateString = milestone.workOrderMilestoneDateString!;
|
||||
}
|
||||
|
||||
const panelBlockElement = document.createElement("div");
|
||||
|
||||
panelBlockElement.className = "panel-block is-block";
|
||||
|
||||
if (
|
||||
!milestone.workOrderMilestoneCompletionDate &&
|
||||
milestone.workOrderMilestoneDateString! < currentDate
|
||||
) {
|
||||
panelBlockElement.classList.add("has-background-warning-light");
|
||||
}
|
||||
|
||||
let lotOccupancyHTML = "";
|
||||
|
||||
for (const lot of milestone.workOrderLots!) {
|
||||
lotOccupancyHTML +=
|
||||
'<span class="has-tooltip-left" data-tooltip="' +
|
||||
cityssm.escapeHTML(lot.mapName || "") +
|
||||
'">' +
|
||||
'<i class="fas fa-vector-square" aria-label="' +
|
||||
los.escapedAliases.Lot +
|
||||
'"></i> ' +
|
||||
cityssm.escapeHTML(lot.lotName || "") +
|
||||
"</span>" +
|
||||
"<br />";
|
||||
}
|
||||
|
||||
for (const lotOccupancy of milestone.workOrderLotOccupancies!) {
|
||||
for (const occupant of lotOccupancy.lotOccupancyOccupants!) {
|
||||
lotOccupancyHTML +=
|
||||
'<span class="has-tooltip-left" data-tooltip="' +
|
||||
cityssm.escapeHTML(occupant.lotOccupantType || "") +
|
||||
'">' +
|
||||
'<i class="fas fa-user" aria-label="' +
|
||||
los.escapedAliases.Occupancy +
|
||||
'"></i> ' +
|
||||
cityssm.escapeHTML(occupant.occupantName || "") +
|
||||
"</span>" +
|
||||
"<br />";
|
||||
}
|
||||
}
|
||||
|
||||
panelBlockElement.innerHTML =
|
||||
'<div class="columns">' +
|
||||
('<div class="column is-narrow">' +
|
||||
'<span class="icon is-small">' +
|
||||
(milestone.workOrderMilestoneCompletionDate
|
||||
? '<i class="fas fa-check" aria-label="Completed"></i>'
|
||||
: '<i class="far fa-square has-text-grey" aria-label="Incomplete"></i>') +
|
||||
"</span>" +
|
||||
"</div>") +
|
||||
('<div class="column">' +
|
||||
(milestone.workOrderMilestoneTime === 0
|
||||
? ""
|
||||
: milestone.workOrderMilestoneTimeString + "<br />") +
|
||||
(milestone.workOrderMilestoneTypeId
|
||||
? "<strong>" +
|
||||
cityssm.escapeHTML(milestone.workOrderMilestoneType!) +
|
||||
"</strong><br />"
|
||||
: "") +
|
||||
'<span class="is-size-7">' +
|
||||
cityssm.escapeHTML(milestone.workOrderMilestoneDescription!) +
|
||||
"</span>" +
|
||||
"</div>") +
|
||||
('<div class="column">' +
|
||||
'<i class="fas fa-circle" style="color:' +
|
||||
los.getRandomColor(milestone.workOrderNumber || "") +
|
||||
'" aria-hidden="true"></i>' +
|
||||
' <a class="has-text-weight-bold" href="' +
|
||||
los.getWorkOrderURL(milestone.workOrderId!) +
|
||||
'">' +
|
||||
cityssm.escapeHTML(milestone.workOrderNumber || "") +
|
||||
"</a><br />" +
|
||||
'<span class="is-size-7">' +
|
||||
cityssm.escapeHTML(milestone.workOrderDescription || "") +
|
||||
"</span>" +
|
||||
"</div>") +
|
||||
('<div class="column is-size-7">' + lotOccupancyHTML + "</div>") +
|
||||
"</div>";
|
||||
|
||||
(currentPanelElement as HTMLElement).append(panelBlockElement);
|
||||
}
|
||||
|
||||
milestoneCalendarContainerElement.append(currentPanelElement!);
|
||||
function renderMilestones(
|
||||
workOrderMilestones: recordTypes.WorkOrderMilestone[]
|
||||
) {
|
||||
if (workOrderMilestones.length === 0) {
|
||||
milestoneCalendarContainerElement.innerHTML = `<div class="message is-info">
|
||||
<p class="message-body">There are no milestones that meet the search criteria.</p>
|
||||
</div>`
|
||||
return
|
||||
}
|
||||
|
||||
function getMilestones(event?: Event) {
|
||||
if (event) {
|
||||
event.preventDefault();
|
||||
milestoneCalendarContainerElement.innerHTML = ''
|
||||
|
||||
const currentDate = cityssm.dateToString(new Date())
|
||||
|
||||
let currentPanelElement: HTMLElement | undefined
|
||||
let currentPanelDateString = ''
|
||||
|
||||
for (const milestone of workOrderMilestones) {
|
||||
if (currentPanelDateString !== milestone.workOrderMilestoneDateString) {
|
||||
if (currentPanelElement) {
|
||||
milestoneCalendarContainerElement.append(currentPanelElement)
|
||||
}
|
||||
|
||||
milestoneCalendarContainerElement.innerHTML = los.getLoadingParagraphHTML("Loading Milestones...");
|
||||
currentPanelElement = document.createElement('div')
|
||||
currentPanelElement.className = 'panel'
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/workOrders/doGetWorkOrderMilestones",
|
||||
workOrderSearchFiltersFormElement,
|
||||
(responseJSON: { workOrderMilestones: recordTypes.WorkOrderMilestone[] }) => {
|
||||
renderMilestones(responseJSON.workOrderMilestones);
|
||||
}
|
||||
);
|
||||
currentPanelElement.innerHTML = `<h2 class="panel-heading">${milestone.workOrderMilestoneDateString}</h2>`
|
||||
|
||||
currentPanelDateString = milestone.workOrderMilestoneDateString!
|
||||
}
|
||||
|
||||
const panelBlockElement = document.createElement('div')
|
||||
|
||||
panelBlockElement.className = 'panel-block is-block'
|
||||
|
||||
if (
|
||||
!milestone.workOrderMilestoneCompletionDate &&
|
||||
milestone.workOrderMilestoneDateString! < currentDate
|
||||
) {
|
||||
panelBlockElement.classList.add('has-background-warning-light')
|
||||
}
|
||||
|
||||
let lotOccupancyHTML = ''
|
||||
|
||||
for (const lot of milestone.workOrderLots!) {
|
||||
lotOccupancyHTML +=
|
||||
'<span class="has-tooltip-left" data-tooltip="' +
|
||||
cityssm.escapeHTML(lot.mapName || '') +
|
||||
'">' +
|
||||
'<i class="fas fa-vector-square" aria-label="' +
|
||||
los.escapedAliases.Lot +
|
||||
'"></i> ' +
|
||||
cityssm.escapeHTML(lot.lotName || '') +
|
||||
'</span>' +
|
||||
'<br />'
|
||||
}
|
||||
|
||||
for (const lotOccupancy of milestone.workOrderLotOccupancies!) {
|
||||
for (const occupant of lotOccupancy.lotOccupancyOccupants!) {
|
||||
lotOccupancyHTML +=
|
||||
'<span class="has-tooltip-left" data-tooltip="' +
|
||||
cityssm.escapeHTML(occupant.lotOccupantType || '') +
|
||||
'">' +
|
||||
'<i class="fas fa-user" aria-label="' +
|
||||
los.escapedAliases.Occupancy +
|
||||
'"></i> ' +
|
||||
cityssm.escapeHTML(occupant.occupantName || '') +
|
||||
'</span>' +
|
||||
'<br />'
|
||||
}
|
||||
}
|
||||
|
||||
panelBlockElement.innerHTML =
|
||||
'<div class="columns">' +
|
||||
('<div class="column is-narrow">' +
|
||||
'<span class="icon is-small">' +
|
||||
(milestone.workOrderMilestoneCompletionDate
|
||||
? '<i class="fas fa-check" aria-label="Completed"></i>'
|
||||
: '<i class="far fa-square has-text-grey" aria-label="Incomplete"></i>') +
|
||||
'</span>' +
|
||||
'</div>') +
|
||||
('<div class="column">' +
|
||||
(milestone.workOrderMilestoneTime === 0
|
||||
? ''
|
||||
: milestone.workOrderMilestoneTimeString + '<br />') +
|
||||
(milestone.workOrderMilestoneTypeId
|
||||
? '<strong>' +
|
||||
cityssm.escapeHTML(milestone.workOrderMilestoneType!) +
|
||||
'</strong><br />'
|
||||
: '') +
|
||||
'<span class="is-size-7">' +
|
||||
cityssm.escapeHTML(milestone.workOrderMilestoneDescription!) +
|
||||
'</span>' +
|
||||
'</div>') +
|
||||
('<div class="column">' +
|
||||
'<i class="fas fa-circle" style="color:' +
|
||||
los.getRandomColor(milestone.workOrderNumber || '') +
|
||||
'" aria-hidden="true"></i>' +
|
||||
' <a class="has-text-weight-bold" href="' +
|
||||
los.getWorkOrderURL(milestone.workOrderId!) +
|
||||
'">' +
|
||||
cityssm.escapeHTML(milestone.workOrderNumber || '') +
|
||||
'</a><br />' +
|
||||
'<span class="is-size-7">' +
|
||||
cityssm.escapeHTML(milestone.workOrderDescription || '') +
|
||||
'</span>' +
|
||||
'</div>') +
|
||||
('<div class="column is-size-7">' + lotOccupancyHTML + '</div>') +
|
||||
'</div>'
|
||||
;(currentPanelElement as HTMLElement).append(panelBlockElement)
|
||||
}
|
||||
|
||||
workOrderMilestoneDateFilterElement.addEventListener("change", () => {
|
||||
workOrderMilestoneDateStringElement.closest("fieldset")!.disabled =
|
||||
workOrderMilestoneDateFilterElement.value !== "date";
|
||||
getMilestones();
|
||||
});
|
||||
milestoneCalendarContainerElement.append(currentPanelElement!)
|
||||
}
|
||||
|
||||
los.initializeDatePickers(workOrderSearchFiltersFormElement);
|
||||
function getMilestones(event?: Event) {
|
||||
if (event) {
|
||||
event.preventDefault()
|
||||
}
|
||||
|
||||
workOrderMilestoneDateStringElement.addEventListener("change", getMilestones);
|
||||
workOrderSearchFiltersFormElement.addEventListener("submit", getMilestones);
|
||||
milestoneCalendarContainerElement.innerHTML = los.getLoadingParagraphHTML(
|
||||
'Loading Milestones...'
|
||||
)
|
||||
|
||||
getMilestones();
|
||||
})();
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/workOrders/doGetWorkOrderMilestones',
|
||||
workOrderSearchFiltersFormElement,
|
||||
(responseJSON: {
|
||||
workOrderMilestones: recordTypes.WorkOrderMilestone[]
|
||||
}) => {
|
||||
renderMilestones(responseJSON.workOrderMilestones)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
workOrderMilestoneDateFilterElement.addEventListener('change', () => {
|
||||
workOrderMilestoneDateStringElement.closest('fieldset')!.disabled =
|
||||
workOrderMilestoneDateFilterElement.value !== 'date'
|
||||
getMilestones()
|
||||
})
|
||||
|
||||
los.initializeDatePickers(workOrderSearchFiltersFormElement)
|
||||
|
||||
workOrderMilestoneDateStringElement.addEventListener('change', getMilestones)
|
||||
workOrderSearchFiltersFormElement.addEventListener('submit', getMilestones)
|
||||
|
||||
getMilestones()
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -3,47 +3,48 @@
|
|||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
(() => {
|
||||
const los = exports.los;
|
||||
const workOrderTypeIdsElement = document.querySelector("#icsFilters--workOrderTypeIds");
|
||||
const workOrderMilestoneTypeIdsElement = document.querySelector("#icsFilters--workOrderMilestoneTypeIds");
|
||||
const calendarLinkElement = document.querySelector("#icsFilters--calendarURL");
|
||||
const workOrderTypeIdsElement = document.querySelector('#icsFilters--workOrderTypeIds');
|
||||
const workOrderMilestoneTypeIdsElement = document.querySelector('#icsFilters--workOrderMilestoneTypeIds');
|
||||
const calendarLinkElement = document.querySelector('#icsFilters--calendarURL');
|
||||
function updateCalendarURL() {
|
||||
let url = window.location.href.slice(0, Math.max(0, window.location.href.indexOf(window.location.pathname) + 1)) +
|
||||
los.urlPrefix +
|
||||
"api/" +
|
||||
'api/' +
|
||||
los.apiKey +
|
||||
"/" +
|
||||
"milestoneICS/" +
|
||||
"?";
|
||||
'/' +
|
||||
'milestoneICS/' +
|
||||
'?';
|
||||
if (!workOrderTypeIdsElement.disabled &&
|
||||
workOrderTypeIdsElement.selectedOptions.length > 0) {
|
||||
url += "workOrderTypeIds=";
|
||||
url += 'workOrderTypeIds=';
|
||||
for (const optionElement of workOrderTypeIdsElement.selectedOptions) {
|
||||
url += optionElement.value + ",";
|
||||
url += optionElement.value + ',';
|
||||
}
|
||||
url = url.slice(0, -1) + "&";
|
||||
url = url.slice(0, -1) + '&';
|
||||
}
|
||||
if (!workOrderMilestoneTypeIdsElement.disabled &&
|
||||
workOrderMilestoneTypeIdsElement.selectedOptions.length > 0) {
|
||||
url += "workOrderMilestoneTypeIds=";
|
||||
url += 'workOrderMilestoneTypeIds=';
|
||||
for (const optionElement of workOrderMilestoneTypeIdsElement.selectedOptions) {
|
||||
url += optionElement.value + ",";
|
||||
url += optionElement.value + ',';
|
||||
}
|
||||
url = url.slice(0, -1) + "&";
|
||||
url = url.slice(0, -1) + '&';
|
||||
}
|
||||
calendarLinkElement.value = url.slice(0, -1);
|
||||
}
|
||||
document.querySelector("#icsFilters--workOrderTypeIds-all").addEventListener("change", (changeEvent) => {
|
||||
;
|
||||
document.querySelector('#icsFilters--workOrderTypeIds-all').addEventListener('change', (changeEvent) => {
|
||||
workOrderTypeIdsElement.disabled = changeEvent.currentTarget.checked;
|
||||
});
|
||||
document.querySelector("#icsFilters--workOrderMilestoneTypeIds-all").addEventListener("change", (changeEvent) => {
|
||||
document.querySelector('#icsFilters--workOrderMilestoneTypeIds-all').addEventListener('change', (changeEvent) => {
|
||||
workOrderMilestoneTypeIdsElement.disabled = changeEvent.currentTarget.checked;
|
||||
});
|
||||
const inputSelectElements = document.querySelector("#panel--icsFilters").querySelectorAll("input, select");
|
||||
const inputSelectElements = document.querySelector('#panel--icsFilters').querySelectorAll('input, select');
|
||||
for (const element of inputSelectElements) {
|
||||
element.addEventListener("change", updateCalendarURL);
|
||||
element.addEventListener('change', updateCalendarURL);
|
||||
}
|
||||
updateCalendarURL();
|
||||
calendarLinkElement.addEventListener("click", () => {
|
||||
calendarLinkElement.addEventListener('click', () => {
|
||||
calendarLinkElement.focus();
|
||||
calendarLinkElement.select();
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,85 +1,98 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
|
||||
import type * as globalTypes from "../types/globalTypes";
|
||||
import type * as globalTypes from '../types/globalTypes'
|
||||
|
||||
(() => {
|
||||
const los = exports.los as globalTypes.LOS;
|
||||
;(() => {
|
||||
const los = exports.los as globalTypes.LOS
|
||||
|
||||
const workOrderTypeIdsElement = document.querySelector(
|
||||
"#icsFilters--workOrderTypeIds"
|
||||
) as HTMLSelectElement;
|
||||
const workOrderTypeIdsElement = document.querySelector(
|
||||
'#icsFilters--workOrderTypeIds'
|
||||
) as HTMLSelectElement
|
||||
|
||||
const workOrderMilestoneTypeIdsElement = document.querySelector(
|
||||
"#icsFilters--workOrderMilestoneTypeIds"
|
||||
) as HTMLSelectElement;
|
||||
const workOrderMilestoneTypeIdsElement = document.querySelector(
|
||||
'#icsFilters--workOrderMilestoneTypeIds'
|
||||
) as HTMLSelectElement
|
||||
|
||||
const calendarLinkElement = document.querySelector(
|
||||
"#icsFilters--calendarURL"
|
||||
) as HTMLTextAreaElement;
|
||||
const calendarLinkElement = document.querySelector(
|
||||
'#icsFilters--calendarURL'
|
||||
) as HTMLTextAreaElement
|
||||
|
||||
function updateCalendarURL() {
|
||||
let url = window.location.href.slice(
|
||||
0,
|
||||
Math.max(0, window.location.href.indexOf(window.location.pathname) + 1)
|
||||
) +
|
||||
los.urlPrefix +
|
||||
"api/" +
|
||||
los.apiKey +
|
||||
"/" +
|
||||
"milestoneICS/" +
|
||||
"?";
|
||||
function updateCalendarURL() {
|
||||
let url =
|
||||
window.location.href.slice(
|
||||
0,
|
||||
Math.max(0, window.location.href.indexOf(window.location.pathname) + 1)
|
||||
) +
|
||||
los.urlPrefix +
|
||||
'api/' +
|
||||
los.apiKey +
|
||||
'/' +
|
||||
'milestoneICS/' +
|
||||
'?'
|
||||
|
||||
if (!workOrderTypeIdsElement.disabled &&
|
||||
workOrderTypeIdsElement.selectedOptions.length > 0) {
|
||||
url += "workOrderTypeIds=";
|
||||
if (
|
||||
!workOrderTypeIdsElement.disabled &&
|
||||
workOrderTypeIdsElement.selectedOptions.length > 0
|
||||
) {
|
||||
url += 'workOrderTypeIds='
|
||||
|
||||
for (const optionElement of workOrderTypeIdsElement.selectedOptions) {
|
||||
url += optionElement.value + ",";
|
||||
}
|
||||
for (const optionElement of workOrderTypeIdsElement.selectedOptions) {
|
||||
url += optionElement.value + ','
|
||||
}
|
||||
|
||||
url = url.slice(0, -1) + "&";
|
||||
}
|
||||
|
||||
if (!workOrderMilestoneTypeIdsElement.disabled &&
|
||||
workOrderMilestoneTypeIdsElement.selectedOptions.length > 0) {
|
||||
url += "workOrderMilestoneTypeIds=";
|
||||
|
||||
for (const optionElement of workOrderMilestoneTypeIdsElement.selectedOptions) {
|
||||
url += optionElement.value + ",";
|
||||
}
|
||||
|
||||
url = url.slice(0, -1) + "&";
|
||||
}
|
||||
|
||||
calendarLinkElement.value = url.slice(0, -1);
|
||||
url = url.slice(0, -1) + '&'
|
||||
}
|
||||
|
||||
(
|
||||
document.querySelector("#icsFilters--workOrderTypeIds-all") as HTMLInputElement
|
||||
).addEventListener("change", (changeEvent) => {
|
||||
workOrderTypeIdsElement.disabled = (changeEvent.currentTarget as HTMLInputElement).checked;
|
||||
});
|
||||
if (
|
||||
!workOrderMilestoneTypeIdsElement.disabled &&
|
||||
workOrderMilestoneTypeIdsElement.selectedOptions.length > 0
|
||||
) {
|
||||
url += 'workOrderMilestoneTypeIds='
|
||||
|
||||
(
|
||||
document.querySelector("#icsFilters--workOrderMilestoneTypeIds-all") as HTMLInputElement
|
||||
).addEventListener("change", (changeEvent) => {
|
||||
workOrderMilestoneTypeIdsElement.disabled = (
|
||||
changeEvent.currentTarget as HTMLInputElement
|
||||
).checked;
|
||||
});
|
||||
for (const optionElement of workOrderMilestoneTypeIdsElement.selectedOptions) {
|
||||
url += optionElement.value + ','
|
||||
}
|
||||
|
||||
const inputSelectElements = (
|
||||
document.querySelector("#panel--icsFilters") as HTMLElement
|
||||
).querySelectorAll("input, select") as NodeListOf<HTMLInputElement | HTMLSelectElement>;
|
||||
|
||||
for (const element of inputSelectElements) {
|
||||
element.addEventListener("change", updateCalendarURL);
|
||||
url = url.slice(0, -1) + '&'
|
||||
}
|
||||
|
||||
updateCalendarURL();
|
||||
calendarLinkElement.value = url.slice(0, -1)
|
||||
}
|
||||
|
||||
calendarLinkElement.addEventListener("click", () => {
|
||||
calendarLinkElement.focus();
|
||||
calendarLinkElement.select();
|
||||
});
|
||||
})();
|
||||
;(
|
||||
document.querySelector(
|
||||
'#icsFilters--workOrderTypeIds-all'
|
||||
) as HTMLInputElement
|
||||
).addEventListener('change', (changeEvent) => {
|
||||
workOrderTypeIdsElement.disabled = (
|
||||
changeEvent.currentTarget as HTMLInputElement
|
||||
).checked
|
||||
})
|
||||
|
||||
;(
|
||||
document.querySelector(
|
||||
'#icsFilters--workOrderMilestoneTypeIds-all'
|
||||
) as HTMLInputElement
|
||||
).addEventListener('change', (changeEvent) => {
|
||||
workOrderMilestoneTypeIdsElement.disabled = (
|
||||
changeEvent.currentTarget as HTMLInputElement
|
||||
).checked
|
||||
})
|
||||
|
||||
const inputSelectElements = (
|
||||
document.querySelector('#panel--icsFilters') as HTMLElement
|
||||
).querySelectorAll('input, select') as NodeListOf<
|
||||
HTMLInputElement | HTMLSelectElement
|
||||
>
|
||||
|
||||
for (const element of inputSelectElements) {
|
||||
element.addEventListener('change', updateCalendarURL)
|
||||
}
|
||||
|
||||
updateCalendarURL()
|
||||
|
||||
calendarLinkElement.addEventListener('click', () => {
|
||||
calendarLinkElement.focus()
|
||||
calendarLinkElement.select()
|
||||
})
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -4,67 +4,69 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
(() => {
|
||||
const los = exports.los;
|
||||
const workOrderPrints = exports.workOrderPrints;
|
||||
const searchFilterFormElement = document.querySelector("#form--searchFilters");
|
||||
const searchFilterFormElement = document.querySelector('#form--searchFilters');
|
||||
los.initializeDatePickers(searchFilterFormElement);
|
||||
const searchResultsContainerElement = document.querySelector("#container--searchResults");
|
||||
const limit = Number.parseInt(document.querySelector("#searchFilter--limit").value, 10);
|
||||
const offsetElement = document.querySelector("#searchFilter--offset");
|
||||
const searchResultsContainerElement = document.querySelector('#container--searchResults');
|
||||
const limit = Number.parseInt(document.querySelector('#searchFilter--limit').value, 10);
|
||||
const offsetElement = document.querySelector('#searchFilter--offset');
|
||||
function renderWorkOrders(responseJSON) {
|
||||
var _a, _b;
|
||||
if (responseJSON.workOrders.length === 0) {
|
||||
searchResultsContainerElement.innerHTML =
|
||||
'<div class="message is-info">' +
|
||||
'<p class="message-body">There are no work orders that meet the search criteria.</p>' +
|
||||
"</div>";
|
||||
'</div>';
|
||||
return;
|
||||
}
|
||||
const resultsTbodyElement = document.createElement("tbody");
|
||||
const resultsTbodyElement = document.createElement('tbody');
|
||||
for (const workOrder of responseJSON.workOrders) {
|
||||
let relatedHTML = "";
|
||||
let relatedHTML = '';
|
||||
for (const lot of workOrder.workOrderLots) {
|
||||
relatedHTML +=
|
||||
'<span class="has-tooltip-left" data-tooltip="' +
|
||||
cityssm.escapeHTML(lot.mapName || "") +
|
||||
cityssm.escapeHTML(lot.mapName || '') +
|
||||
'">' +
|
||||
'<i class="fas fa-fw fa-vector-square" aria-label="' +
|
||||
los.escapedAliases.Lot +
|
||||
'"></i> ' +
|
||||
cityssm.escapeHTML(lot.lotName || "(No " + exports.aliases.Lot + " Name)") +
|
||||
"</span><br />";
|
||||
cityssm.escapeHTML(lot.lotName || '(No ' + exports.aliases.Lot + ' Name)') +
|
||||
'</span><br />';
|
||||
}
|
||||
for (const occupancy of workOrder.workOrderLotOccupancies) {
|
||||
for (const occupant of occupancy.lotOccupancyOccupants) {
|
||||
relatedHTML +=
|
||||
'<span class="has-tooltip-left" data-tooltip="' +
|
||||
cityssm.escapeHTML(occupant.lotOccupantType || "") +
|
||||
cityssm.escapeHTML(occupant.lotOccupantType || '') +
|
||||
'">' +
|
||||
'<i class="fas fa-fw fa-' +
|
||||
cityssm.escapeHTML(occupant.fontAwesomeIconClass || "user") +
|
||||
cityssm.escapeHTML(occupant.fontAwesomeIconClass || 'user') +
|
||||
'" aria-label="' +
|
||||
los.escapedAliases.occupant +
|
||||
'"></i> ' +
|
||||
cityssm.escapeHTML(occupant.occupantName || "(No Name)") +
|
||||
"</span><br />";
|
||||
cityssm.escapeHTML(occupant.occupantName || '(No Name)') +
|
||||
'</span><br />';
|
||||
}
|
||||
}
|
||||
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
|
||||
("<td>" +
|
||||
resultsTbodyElement.insertAdjacentHTML('beforeend', '<tr>' +
|
||||
('<td>' +
|
||||
'<a class="has-text-weight-bold" href="' +
|
||||
los.getWorkOrderURL(workOrder.workOrderId) +
|
||||
'">' +
|
||||
(workOrder.workOrderNumber.trim()
|
||||
? cityssm.escapeHTML(workOrder.workOrderNumber || "")
|
||||
: "(No Number)") +
|
||||
"</a>" +
|
||||
"</td>") +
|
||||
("<td>" +
|
||||
cityssm.escapeHTML(workOrder.workOrderType || "") +
|
||||
"<br />" +
|
||||
? cityssm.escapeHTML(workOrder.workOrderNumber || '')
|
||||
: '(No Number)') +
|
||||
'</a>' +
|
||||
'</td>') +
|
||||
('<td>' +
|
||||
cityssm.escapeHTML(workOrder.workOrderType || '') +
|
||||
'<br />' +
|
||||
'<span class="is-size-7">' +
|
||||
cityssm.escapeHTML(workOrder.workOrderDescription || "") +
|
||||
"</span>" +
|
||||
"</td>") +
|
||||
('<td class="is-nowrap"><span class="is-size-7">' + relatedHTML + "</span></td>") +
|
||||
cityssm.escapeHTML(workOrder.workOrderDescription || '') +
|
||||
'</span>' +
|
||||
'</td>') +
|
||||
('<td class="is-nowrap"><span class="is-size-7">' +
|
||||
relatedHTML +
|
||||
'</span></td>') +
|
||||
('<td class="is-nowrap">' +
|
||||
('<span class="has-tooltip-left" data-tooltip="' +
|
||||
los.escapedAliases.WorkOrderOpenDate +
|
||||
|
|
@ -73,7 +75,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
los.escapedAliases.WorkOrderOpenDate +
|
||||
'"></i> ' +
|
||||
workOrder.workOrderOpenDateString +
|
||||
"</span><br />") +
|
||||
'</span><br />') +
|
||||
('<span class="has-tooltip-left" data-tooltip="' +
|
||||
los.escapedAliases.WorkOrderCloseDate +
|
||||
'">' +
|
||||
|
|
@ -84,55 +86,57 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
? workOrder.workOrderCloseDateString
|
||||
: '<span class="has-text-grey">(No ' +
|
||||
los.escapedAliases.WorkOrderCloseDate +
|
||||
")</span>") +
|
||||
"</span>") +
|
||||
"</td>") +
|
||||
("<td>" +
|
||||
')</span>') +
|
||||
'</span>') +
|
||||
'</td>') +
|
||||
('<td>' +
|
||||
(workOrder.workOrderMilestoneCount === 0
|
||||
? "-"
|
||||
? '-'
|
||||
: workOrder.workOrderMilestoneCompletionCount +
|
||||
" / " +
|
||||
' / ' +
|
||||
workOrder.workOrderMilestoneCount) +
|
||||
"</td>") +
|
||||
'</td>') +
|
||||
(workOrderPrints.length > 0
|
||||
? "<td>" +
|
||||
? '<td>' +
|
||||
'<a class="button is-small" data-tooltip="Print" href="' +
|
||||
los.urlPrefix +
|
||||
"/print/" +
|
||||
'/print/' +
|
||||
workOrderPrints[0] +
|
||||
"/?workOrderId=" +
|
||||
'/?workOrderId=' +
|
||||
workOrder.workOrderId +
|
||||
'" target="_blank">' +
|
||||
'<i class="fas fa-print" aria-label="Print"></i>' +
|
||||
"</a>" +
|
||||
"</td>"
|
||||
: "") +
|
||||
"</tr>");
|
||||
'</a>' +
|
||||
'</td>'
|
||||
: '') +
|
||||
'</tr>');
|
||||
}
|
||||
searchResultsContainerElement.innerHTML =
|
||||
'<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">' +
|
||||
"<thead><tr>" +
|
||||
"<th>Work Order Number</th>" +
|
||||
"<th>Description</th>" +
|
||||
"<th>Related</th>" +
|
||||
"<th>Date</th>" +
|
||||
'<thead><tr>' +
|
||||
'<th>Work Order Number</th>' +
|
||||
'<th>Description</th>' +
|
||||
'<th>Related</th>' +
|
||||
'<th>Date</th>' +
|
||||
'<th class="has-tooltip-bottom" data-tooltip="Completed / Total Milestones">Progress</th>' +
|
||||
(workOrderPrints.length > 0 ? '<th class="has-width-1"></th>' : "") +
|
||||
"</tr></thead>" +
|
||||
"<table>";
|
||||
searchResultsContainerElement.insertAdjacentHTML("beforeend", los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count));
|
||||
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement);
|
||||
(workOrderPrints.length > 0 ? '<th class="has-width-1"></th>' : '') +
|
||||
'</tr></thead>' +
|
||||
'<table>';
|
||||
searchResultsContainerElement.insertAdjacentHTML('beforeend', los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count));
|
||||
searchResultsContainerElement
|
||||
.querySelector('table')
|
||||
.append(resultsTbodyElement);
|
||||
(_a = searchResultsContainerElement
|
||||
.querySelector("button[data-page='previous']")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", previousAndGetWorkOrders);
|
||||
.querySelector("button[data-page='previous']")) === null || _a === void 0 ? void 0 : _a.addEventListener('click', previousAndGetWorkOrders);
|
||||
(_b = searchResultsContainerElement
|
||||
.querySelector("button[data-page='next']")) === null || _b === void 0 ? void 0 : _b.addEventListener("click", nextAndGetWorkOrders);
|
||||
.querySelector("button[data-page='next']")) === null || _b === void 0 ? void 0 : _b.addEventListener('click', nextAndGetWorkOrders);
|
||||
}
|
||||
function getWorkOrders() {
|
||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML("Loading Work Orders...");
|
||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doSearchWorkOrders", searchFilterFormElement, renderWorkOrders);
|
||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML('Loading Work Orders...');
|
||||
cityssm.postJSON(los.urlPrefix + '/workOrders/doSearchWorkOrders', searchFilterFormElement, renderWorkOrders);
|
||||
}
|
||||
function resetOffsetAndGetWorkOrders() {
|
||||
offsetElement.value = "0";
|
||||
offsetElement.value = '0';
|
||||
getWorkOrders();
|
||||
}
|
||||
function previousAndGetWorkOrders() {
|
||||
|
|
@ -143,42 +147,42 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString();
|
||||
getWorkOrders();
|
||||
}
|
||||
const filterElements = searchFilterFormElement.querySelectorAll("input, select");
|
||||
const filterElements = searchFilterFormElement.querySelectorAll('input, select');
|
||||
for (const filterElement of filterElements) {
|
||||
filterElement.addEventListener("change", resetOffsetAndGetWorkOrders);
|
||||
filterElement.addEventListener('change', resetOffsetAndGetWorkOrders);
|
||||
}
|
||||
searchFilterFormElement.addEventListener("submit", (formEvent) => {
|
||||
searchFilterFormElement.addEventListener('submit', (formEvent) => {
|
||||
formEvent.preventDefault();
|
||||
resetOffsetAndGetWorkOrders();
|
||||
});
|
||||
/*
|
||||
const workOrderOpenDateStringElement = document.querySelector("#searchFilter--workOrderOpenDateString") as HTMLInputElement;
|
||||
const workOrderOpenDateStringElement = document.querySelector("#searchFilter--workOrderOpenDateString") as HTMLInputElement;
|
||||
|
||||
document.querySelector("#button--workOrderOpenDateString-previous").addEventListener("click", () => {
|
||||
document.querySelector("#button--workOrderOpenDateString-previous").addEventListener("click", () => {
|
||||
|
||||
if (workOrderOpenDateStringElement.value === "") {
|
||||
workOrderOpenDateStringElement.valueAsDate = new Date();
|
||||
} else {
|
||||
const openDate = workOrderOpenDateStringElement.valueAsDate;
|
||||
openDate.setDate(openDate.getDate() - 1);
|
||||
workOrderOpenDateStringElement.valueAsDate = openDate;
|
||||
}
|
||||
if (workOrderOpenDateStringElement.value === "") {
|
||||
workOrderOpenDateStringElement.valueAsDate = new Date();
|
||||
} else {
|
||||
const openDate = workOrderOpenDateStringElement.valueAsDate;
|
||||
openDate.setDate(openDate.getDate() - 1);
|
||||
workOrderOpenDateStringElement.valueAsDate = openDate;
|
||||
}
|
||||
|
||||
resetOffsetAndGetWorkOrders();
|
||||
});
|
||||
resetOffsetAndGetWorkOrders();
|
||||
});
|
||||
|
||||
document.querySelector("#button--workOrderOpenDateString-next").addEventListener("click", () => {
|
||||
document.querySelector("#button--workOrderOpenDateString-next").addEventListener("click", () => {
|
||||
|
||||
if (workOrderOpenDateStringElement.value === "") {
|
||||
workOrderOpenDateStringElement.valueAsDate = new Date();
|
||||
} else {
|
||||
const openDate = workOrderOpenDateStringElement.valueAsDate;
|
||||
openDate.setDate(openDate.getDate() + 1);
|
||||
workOrderOpenDateStringElement.valueAsDate = openDate;
|
||||
}
|
||||
if (workOrderOpenDateStringElement.value === "") {
|
||||
workOrderOpenDateStringElement.valueAsDate = new Date();
|
||||
} else {
|
||||
const openDate = workOrderOpenDateStringElement.valueAsDate;
|
||||
openDate.setDate(openDate.getDate() + 1);
|
||||
workOrderOpenDateStringElement.valueAsDate = openDate;
|
||||
}
|
||||
|
||||
resetOffsetAndGetWorkOrders();
|
||||
});
|
||||
*/
|
||||
resetOffsetAndGetWorkOrders();
|
||||
});
|
||||
*/
|
||||
getWorkOrders();
|
||||
})();
|
||||
|
|
|
|||
|
|
@ -1,209 +1,232 @@
|
|||
/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */
|
||||
|
||||
import type * as recordTypes from "../types/recordTypes";
|
||||
import type * as globalTypes from "../types/globalTypes";
|
||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||
import type * as recordTypes from '../types/recordTypes'
|
||||
import type * as globalTypes from '../types/globalTypes'
|
||||
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||
|
||||
declare const cityssm: cityssmGlobal;
|
||||
declare const cityssm: cityssmGlobal
|
||||
|
||||
(() => {
|
||||
const los = exports.los as globalTypes.LOS;
|
||||
;(() => {
|
||||
const los = exports.los as globalTypes.LOS
|
||||
|
||||
const workOrderPrints: string[] = exports.workOrderPrints;
|
||||
const workOrderPrints: string[] = exports.workOrderPrints
|
||||
|
||||
const searchFilterFormElement = document.querySelector("#form--searchFilters") as HTMLFormElement;
|
||||
const searchFilterFormElement = document.querySelector(
|
||||
'#form--searchFilters'
|
||||
) as HTMLFormElement
|
||||
|
||||
los.initializeDatePickers(searchFilterFormElement);
|
||||
los.initializeDatePickers(searchFilterFormElement)
|
||||
|
||||
const searchResultsContainerElement = document.querySelector("#container--searchResults") as HTMLElement;
|
||||
const searchResultsContainerElement = document.querySelector(
|
||||
'#container--searchResults'
|
||||
) as HTMLElement
|
||||
|
||||
const limit = Number.parseInt(
|
||||
(document.querySelector("#searchFilter--limit") as HTMLInputElement).value,
|
||||
10
|
||||
);
|
||||
const limit = Number.parseInt(
|
||||
(document.querySelector('#searchFilter--limit') as HTMLInputElement).value,
|
||||
10
|
||||
)
|
||||
|
||||
const offsetElement = document.querySelector("#searchFilter--offset") as HTMLInputElement;
|
||||
const offsetElement = document.querySelector(
|
||||
'#searchFilter--offset'
|
||||
) as HTMLInputElement
|
||||
|
||||
function renderWorkOrders(responseJSON: {
|
||||
count: number;
|
||||
offset: number;
|
||||
workOrders: recordTypes.WorkOrder[];
|
||||
}) {
|
||||
if (responseJSON.workOrders.length === 0) {
|
||||
searchResultsContainerElement.innerHTML =
|
||||
'<div class="message is-info">' +
|
||||
'<p class="message-body">There are no work orders that meet the search criteria.</p>' +
|
||||
"</div>";
|
||||
function renderWorkOrders(responseJSON: {
|
||||
count: number
|
||||
offset: number
|
||||
workOrders: recordTypes.WorkOrder[]
|
||||
}) {
|
||||
if (responseJSON.workOrders.length === 0) {
|
||||
searchResultsContainerElement.innerHTML =
|
||||
'<div class="message is-info">' +
|
||||
'<p class="message-body">There are no work orders that meet the search criteria.</p>' +
|
||||
'</div>'
|
||||
|
||||
return;
|
||||
return
|
||||
}
|
||||
|
||||
const resultsTbodyElement = document.createElement('tbody')
|
||||
|
||||
for (const workOrder of responseJSON.workOrders) {
|
||||
let relatedHTML = ''
|
||||
|
||||
for (const lot of workOrder.workOrderLots!) {
|
||||
relatedHTML +=
|
||||
'<span class="has-tooltip-left" data-tooltip="' +
|
||||
cityssm.escapeHTML(lot.mapName || '') +
|
||||
'">' +
|
||||
'<i class="fas fa-fw fa-vector-square" aria-label="' +
|
||||
los.escapedAliases.Lot +
|
||||
'"></i> ' +
|
||||
cityssm.escapeHTML(
|
||||
lot.lotName || '(No ' + exports.aliases.Lot + ' Name)'
|
||||
) +
|
||||
'</span><br />'
|
||||
}
|
||||
|
||||
for (const occupancy of workOrder.workOrderLotOccupancies!) {
|
||||
for (const occupant of occupancy.lotOccupancyOccupants!) {
|
||||
relatedHTML +=
|
||||
'<span class="has-tooltip-left" data-tooltip="' +
|
||||
cityssm.escapeHTML(occupant.lotOccupantType || '') +
|
||||
'">' +
|
||||
'<i class="fas fa-fw fa-' +
|
||||
cityssm.escapeHTML(occupant.fontAwesomeIconClass || 'user') +
|
||||
'" aria-label="' +
|
||||
los.escapedAliases.occupant +
|
||||
'"></i> ' +
|
||||
cityssm.escapeHTML(occupant.occupantName || '(No Name)') +
|
||||
'</span><br />'
|
||||
}
|
||||
}
|
||||
|
||||
const resultsTbodyElement = document.createElement("tbody");
|
||||
|
||||
for (const workOrder of responseJSON.workOrders) {
|
||||
let relatedHTML = "";
|
||||
|
||||
for (const lot of workOrder.workOrderLots!) {
|
||||
relatedHTML +=
|
||||
'<span class="has-tooltip-left" data-tooltip="' +
|
||||
cityssm.escapeHTML(lot.mapName || "") +
|
||||
'">' +
|
||||
'<i class="fas fa-fw fa-vector-square" aria-label="' +
|
||||
los.escapedAliases.Lot +
|
||||
'"></i> ' +
|
||||
cityssm.escapeHTML(lot.lotName || "(No " + exports.aliases.Lot + " Name)") +
|
||||
"</span><br />";
|
||||
}
|
||||
|
||||
for (const occupancy of workOrder.workOrderLotOccupancies!) {
|
||||
for (const occupant of occupancy.lotOccupancyOccupants!) {
|
||||
relatedHTML +=
|
||||
'<span class="has-tooltip-left" data-tooltip="' +
|
||||
cityssm.escapeHTML(occupant.lotOccupantType || "") +
|
||||
'">' +
|
||||
'<i class="fas fa-fw fa-' +
|
||||
cityssm.escapeHTML(occupant.fontAwesomeIconClass || "user") +
|
||||
'" aria-label="' +
|
||||
los.escapedAliases.occupant +
|
||||
'"></i> ' +
|
||||
cityssm.escapeHTML(occupant.occupantName || "(No Name)") +
|
||||
"</span><br />";
|
||||
}
|
||||
}
|
||||
|
||||
resultsTbodyElement.insertAdjacentHTML(
|
||||
"beforeend",
|
||||
"<tr>" +
|
||||
("<td>" +
|
||||
'<a class="has-text-weight-bold" href="' +
|
||||
los.getWorkOrderURL(workOrder.workOrderId!) +
|
||||
'">' +
|
||||
(workOrder.workOrderNumber!.trim()
|
||||
? cityssm.escapeHTML(workOrder.workOrderNumber || "")
|
||||
: "(No Number)") +
|
||||
"</a>" +
|
||||
"</td>") +
|
||||
("<td>" +
|
||||
cityssm.escapeHTML(workOrder.workOrderType || "") +
|
||||
"<br />" +
|
||||
'<span class="is-size-7">' +
|
||||
cityssm.escapeHTML(workOrder.workOrderDescription || "") +
|
||||
"</span>" +
|
||||
"</td>") +
|
||||
('<td class="is-nowrap"><span class="is-size-7">' + relatedHTML + "</span></td>") +
|
||||
('<td class="is-nowrap">' +
|
||||
('<span class="has-tooltip-left" data-tooltip="' +
|
||||
los.escapedAliases.WorkOrderOpenDate +
|
||||
'">' +
|
||||
'<i class="fas fa-fw fa-play" aria-label="' +
|
||||
los.escapedAliases.WorkOrderOpenDate +
|
||||
'"></i> ' +
|
||||
workOrder.workOrderOpenDateString +
|
||||
"</span><br />") +
|
||||
('<span class="has-tooltip-left" data-tooltip="' +
|
||||
los.escapedAliases.WorkOrderCloseDate +
|
||||
'">' +
|
||||
'<i class="fas fa-fw fa-stop" aria-label="' +
|
||||
los.escapedAliases.WorkOrderCloseDate +
|
||||
'"></i> ' +
|
||||
(workOrder.workOrderCloseDate
|
||||
? workOrder.workOrderCloseDateString
|
||||
: '<span class="has-text-grey">(No ' +
|
||||
los.escapedAliases.WorkOrderCloseDate +
|
||||
")</span>") +
|
||||
"</span>") +
|
||||
"</td>") +
|
||||
("<td>" +
|
||||
(workOrder.workOrderMilestoneCount === 0
|
||||
? "-"
|
||||
: workOrder.workOrderMilestoneCompletionCount +
|
||||
" / " +
|
||||
workOrder.workOrderMilestoneCount) +
|
||||
"</td>") +
|
||||
(workOrderPrints.length > 0
|
||||
? "<td>" +
|
||||
'<a class="button is-small" data-tooltip="Print" href="' +
|
||||
los.urlPrefix +
|
||||
"/print/" +
|
||||
workOrderPrints[0] +
|
||||
"/?workOrderId=" +
|
||||
workOrder.workOrderId +
|
||||
'" target="_blank">' +
|
||||
'<i class="fas fa-print" aria-label="Print"></i>' +
|
||||
"</a>" +
|
||||
"</td>"
|
||||
: "") +
|
||||
"</tr>"
|
||||
);
|
||||
}
|
||||
|
||||
searchResultsContainerElement.innerHTML =
|
||||
'<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">' +
|
||||
"<thead><tr>" +
|
||||
"<th>Work Order Number</th>" +
|
||||
"<th>Description</th>" +
|
||||
"<th>Related</th>" +
|
||||
"<th>Date</th>" +
|
||||
'<th class="has-tooltip-bottom" data-tooltip="Completed / Total Milestones">Progress</th>' +
|
||||
(workOrderPrints.length > 0 ? '<th class="has-width-1"></th>' : "") +
|
||||
"</tr></thead>" +
|
||||
"<table>";
|
||||
|
||||
searchResultsContainerElement.insertAdjacentHTML(
|
||||
"beforeend",
|
||||
los.getSearchResultsPagerHTML(limit, responseJSON.offset, responseJSON.count)
|
||||
);
|
||||
|
||||
searchResultsContainerElement.querySelector("table")!.append(resultsTbodyElement);
|
||||
|
||||
searchResultsContainerElement
|
||||
.querySelector("button[data-page='previous']")
|
||||
?.addEventListener("click", previousAndGetWorkOrders);
|
||||
|
||||
searchResultsContainerElement
|
||||
.querySelector("button[data-page='next']")
|
||||
?.addEventListener("click", nextAndGetWorkOrders);
|
||||
resultsTbodyElement.insertAdjacentHTML(
|
||||
'beforeend',
|
||||
'<tr>' +
|
||||
('<td>' +
|
||||
'<a class="has-text-weight-bold" href="' +
|
||||
los.getWorkOrderURL(workOrder.workOrderId!) +
|
||||
'">' +
|
||||
(workOrder.workOrderNumber!.trim()
|
||||
? cityssm.escapeHTML(workOrder.workOrderNumber || '')
|
||||
: '(No Number)') +
|
||||
'</a>' +
|
||||
'</td>') +
|
||||
('<td>' +
|
||||
cityssm.escapeHTML(workOrder.workOrderType || '') +
|
||||
'<br />' +
|
||||
'<span class="is-size-7">' +
|
||||
cityssm.escapeHTML(workOrder.workOrderDescription || '') +
|
||||
'</span>' +
|
||||
'</td>') +
|
||||
('<td class="is-nowrap"><span class="is-size-7">' +
|
||||
relatedHTML +
|
||||
'</span></td>') +
|
||||
('<td class="is-nowrap">' +
|
||||
('<span class="has-tooltip-left" data-tooltip="' +
|
||||
los.escapedAliases.WorkOrderOpenDate +
|
||||
'">' +
|
||||
'<i class="fas fa-fw fa-play" aria-label="' +
|
||||
los.escapedAliases.WorkOrderOpenDate +
|
||||
'"></i> ' +
|
||||
workOrder.workOrderOpenDateString +
|
||||
'</span><br />') +
|
||||
('<span class="has-tooltip-left" data-tooltip="' +
|
||||
los.escapedAliases.WorkOrderCloseDate +
|
||||
'">' +
|
||||
'<i class="fas fa-fw fa-stop" aria-label="' +
|
||||
los.escapedAliases.WorkOrderCloseDate +
|
||||
'"></i> ' +
|
||||
(workOrder.workOrderCloseDate
|
||||
? workOrder.workOrderCloseDateString
|
||||
: '<span class="has-text-grey">(No ' +
|
||||
los.escapedAliases.WorkOrderCloseDate +
|
||||
')</span>') +
|
||||
'</span>') +
|
||||
'</td>') +
|
||||
('<td>' +
|
||||
(workOrder.workOrderMilestoneCount === 0
|
||||
? '-'
|
||||
: workOrder.workOrderMilestoneCompletionCount +
|
||||
' / ' +
|
||||
workOrder.workOrderMilestoneCount) +
|
||||
'</td>') +
|
||||
(workOrderPrints.length > 0
|
||||
? '<td>' +
|
||||
'<a class="button is-small" data-tooltip="Print" href="' +
|
||||
los.urlPrefix +
|
||||
'/print/' +
|
||||
workOrderPrints[0] +
|
||||
'/?workOrderId=' +
|
||||
workOrder.workOrderId +
|
||||
'" target="_blank">' +
|
||||
'<i class="fas fa-print" aria-label="Print"></i>' +
|
||||
'</a>' +
|
||||
'</td>'
|
||||
: '') +
|
||||
'</tr>'
|
||||
)
|
||||
}
|
||||
|
||||
function getWorkOrders() {
|
||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML("Loading Work Orders...");
|
||||
searchResultsContainerElement.innerHTML =
|
||||
'<table class="table is-fullwidth is-striped is-hoverable has-sticky-header">' +
|
||||
'<thead><tr>' +
|
||||
'<th>Work Order Number</th>' +
|
||||
'<th>Description</th>' +
|
||||
'<th>Related</th>' +
|
||||
'<th>Date</th>' +
|
||||
'<th class="has-tooltip-bottom" data-tooltip="Completed / Total Milestones">Progress</th>' +
|
||||
(workOrderPrints.length > 0 ? '<th class="has-width-1"></th>' : '') +
|
||||
'</tr></thead>' +
|
||||
'<table>'
|
||||
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/workOrders/doSearchWorkOrders",
|
||||
searchFilterFormElement,
|
||||
renderWorkOrders
|
||||
);
|
||||
}
|
||||
searchResultsContainerElement.insertAdjacentHTML(
|
||||
'beforeend',
|
||||
los.getSearchResultsPagerHTML(
|
||||
limit,
|
||||
responseJSON.offset,
|
||||
responseJSON.count
|
||||
)
|
||||
)
|
||||
|
||||
function resetOffsetAndGetWorkOrders() {
|
||||
offsetElement.value = "0";
|
||||
getWorkOrders();
|
||||
}
|
||||
searchResultsContainerElement
|
||||
.querySelector('table')!
|
||||
.append(resultsTbodyElement)
|
||||
|
||||
function previousAndGetWorkOrders() {
|
||||
offsetElement.value = Math.max(Number.parseInt(offsetElement.value, 10) - limit, 0).toString();
|
||||
getWorkOrders();
|
||||
}
|
||||
searchResultsContainerElement
|
||||
.querySelector("button[data-page='previous']")
|
||||
?.addEventListener('click', previousAndGetWorkOrders)
|
||||
|
||||
function nextAndGetWorkOrders() {
|
||||
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString();
|
||||
getWorkOrders();
|
||||
}
|
||||
searchResultsContainerElement
|
||||
.querySelector("button[data-page='next']")
|
||||
?.addEventListener('click', nextAndGetWorkOrders)
|
||||
}
|
||||
|
||||
const filterElements = searchFilterFormElement.querySelectorAll("input, select") as NodeListOf<
|
||||
HTMLInputElement | HTMLSelectElement
|
||||
>;
|
||||
function getWorkOrders() {
|
||||
searchResultsContainerElement.innerHTML = los.getLoadingParagraphHTML(
|
||||
'Loading Work Orders...'
|
||||
)
|
||||
|
||||
for (const filterElement of filterElements) {
|
||||
filterElement.addEventListener("change", resetOffsetAndGetWorkOrders);
|
||||
}
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/workOrders/doSearchWorkOrders',
|
||||
searchFilterFormElement,
|
||||
renderWorkOrders
|
||||
)
|
||||
}
|
||||
|
||||
searchFilterFormElement.addEventListener("submit", (formEvent) => {
|
||||
formEvent.preventDefault();
|
||||
resetOffsetAndGetWorkOrders();
|
||||
});
|
||||
function resetOffsetAndGetWorkOrders() {
|
||||
offsetElement.value = '0'
|
||||
getWorkOrders()
|
||||
}
|
||||
|
||||
/*
|
||||
function previousAndGetWorkOrders() {
|
||||
offsetElement.value = Math.max(
|
||||
Number.parseInt(offsetElement.value, 10) - limit,
|
||||
0
|
||||
).toString()
|
||||
getWorkOrders()
|
||||
}
|
||||
|
||||
function nextAndGetWorkOrders() {
|
||||
offsetElement.value = (
|
||||
Number.parseInt(offsetElement.value, 10) + limit
|
||||
).toString()
|
||||
getWorkOrders()
|
||||
}
|
||||
|
||||
const filterElements = searchFilterFormElement.querySelectorAll(
|
||||
'input, select'
|
||||
) as NodeListOf<HTMLInputElement | HTMLSelectElement>
|
||||
|
||||
for (const filterElement of filterElements) {
|
||||
filterElement.addEventListener('change', resetOffsetAndGetWorkOrders)
|
||||
}
|
||||
|
||||
searchFilterFormElement.addEventListener('submit', (formEvent) => {
|
||||
formEvent.preventDefault()
|
||||
resetOffsetAndGetWorkOrders()
|
||||
})
|
||||
|
||||
/*
|
||||
const workOrderOpenDateStringElement = document.querySelector("#searchFilter--workOrderOpenDateString") as HTMLInputElement;
|
||||
|
||||
document.querySelector("#button--workOrderOpenDateString-previous").addEventListener("click", () => {
|
||||
|
|
@ -233,5 +256,5 @@ declare const cityssm: cityssmGlobal;
|
|||
});
|
||||
*/
|
||||
|
||||
getWorkOrders();
|
||||
})();
|
||||
getWorkOrders()
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -3,33 +3,32 @@
|
|||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
(() => {
|
||||
const los = exports.los;
|
||||
const reopenWorkOrderButtonElement = document.querySelector("#button--reopenWorkOrder");
|
||||
const reopenWorkOrderButtonElement = document.querySelector('#button--reopenWorkOrder');
|
||||
if (reopenWorkOrderButtonElement) {
|
||||
const workOrderId = reopenWorkOrderButtonElement.dataset.workOrderId;
|
||||
reopenWorkOrderButtonElement.addEventListener("click", () => {
|
||||
reopenWorkOrderButtonElement.addEventListener('click', () => {
|
||||
function doReopen() {
|
||||
cityssm.postJSON(los.urlPrefix + "/workOrders/doReopenWorkOrder", {
|
||||
cityssm.postJSON(los.urlPrefix + '/workOrders/doReopenWorkOrder', {
|
||||
workOrderId
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
window.location.href =
|
||||
los.getWorkOrderURL(workOrderId, true, true);
|
||||
window.location.href = los.getWorkOrderURL(workOrderId, true, true);
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Reopening Work Order",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
title: 'Error Reopening Work Order',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
bulmaJS.confirm({
|
||||
title: "Reopen Work Order",
|
||||
message: "Are you sure you want to remove the close date from this work order and reopen it?",
|
||||
contextualColorName: "warning",
|
||||
title: 'Reopen Work Order',
|
||||
message: 'Are you sure you want to remove the close date from this work order and reopen it?',
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: "Yes, Reopen Work Order",
|
||||
text: 'Yes, Reopen Work Order',
|
||||
callbackFunction: doReopen
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,56 +1,59 @@
|
|||
/* eslint-disable unicorn/prefer-module, @typescript-eslint/no-non-null-assertion */
|
||||
|
||||
import type * as globalTypes from "../types/globalTypes";
|
||||
import type * as globalTypes from '../types/globalTypes'
|
||||
|
||||
import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types";
|
||||
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types'
|
||||
|
||||
import type { BulmaJS } from "@cityssm/bulma-js/types";
|
||||
import type { BulmaJS } from '@cityssm/bulma-js/types'
|
||||
|
||||
declare const cityssm: cityssmGlobal;
|
||||
declare const bulmaJS: BulmaJS;
|
||||
declare const cityssm: cityssmGlobal
|
||||
declare const bulmaJS: BulmaJS
|
||||
|
||||
(() => {
|
||||
const los = exports.los as globalTypes.LOS;
|
||||
;(() => {
|
||||
const los = exports.los as globalTypes.LOS
|
||||
|
||||
const reopenWorkOrderButtonElement = document.querySelector(
|
||||
"#button--reopenWorkOrder"
|
||||
) as HTMLButtonElement;
|
||||
const reopenWorkOrderButtonElement = document.querySelector(
|
||||
'#button--reopenWorkOrder'
|
||||
) as HTMLButtonElement
|
||||
|
||||
if (reopenWorkOrderButtonElement) {
|
||||
const workOrderId = reopenWorkOrderButtonElement.dataset.workOrderId!;
|
||||
if (reopenWorkOrderButtonElement) {
|
||||
const workOrderId = reopenWorkOrderButtonElement.dataset.workOrderId!
|
||||
|
||||
reopenWorkOrderButtonElement.addEventListener("click", () => {
|
||||
function doReopen() {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + "/workOrders/doReopenWorkOrder",
|
||||
{
|
||||
workOrderId
|
||||
},
|
||||
(responseJSON: { success: boolean; errorMessage?: string }) => {
|
||||
if (responseJSON.success) {
|
||||
window.location.href =
|
||||
los.getWorkOrderURL(workOrderId, true, true);
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Reopening Work Order",
|
||||
message: responseJSON.errorMessage || "",
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
reopenWorkOrderButtonElement.addEventListener('click', () => {
|
||||
function doReopen() {
|
||||
cityssm.postJSON(
|
||||
los.urlPrefix + '/workOrders/doReopenWorkOrder',
|
||||
{
|
||||
workOrderId
|
||||
},
|
||||
(responseJSON: { success: boolean; errorMessage?: string }) => {
|
||||
if (responseJSON.success) {
|
||||
window.location.href = los.getWorkOrderURL(
|
||||
workOrderId,
|
||||
true,
|
||||
true
|
||||
)
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: 'Error Reopening Work Order',
|
||||
message: responseJSON.errorMessage || '',
|
||||
contextualColorName: 'danger'
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
bulmaJS.confirm({
|
||||
title: "Reopen Work Order",
|
||||
message:
|
||||
"Are you sure you want to remove the close date from this work order and reopen it?",
|
||||
contextualColorName: "warning",
|
||||
okButton: {
|
||||
text: "Yes, Reopen Work Order",
|
||||
callbackFunction: doReopen
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
})();
|
||||
bulmaJS.confirm({
|
||||
title: 'Reopen Work Order',
|
||||
message:
|
||||
'Are you sure you want to remove the close date from this work order and reopen it?',
|
||||
contextualColorName: 'warning',
|
||||
okButton: {
|
||||
text: 'Yes, Reopen Work Order',
|
||||
callbackFunction: doReopen
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
})()
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<div class="modal" role="dialog">
|
||||
<div class="modal-background"></div>
|
||||
<div class="modal-card" style="width:900px">
|
||||
<div class="modal-card has-width-900">
|
||||
<header class="modal-card-head">
|
||||
<h3 class="modal-card-title">
|
||||
Update Fee
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<div class="modal" role="dialog">
|
||||
<div class="modal-background"></div>
|
||||
<div class="modal-card" style="width:900px">
|
||||
<div class="modal-card has-width-900">
|
||||
<header class="modal-card-head">
|
||||
<h3 class="modal-card-title">
|
||||
Add <span class="alias" data-alias="Lot"></span> Type
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<div class="modal" role="dialog">
|
||||
<div class="modal-background"></div>
|
||||
<div class="modal-card" style="width:900px">
|
||||
<div class="modal-card has-width-900">
|
||||
<header class="modal-card-head">
|
||||
<h3 class="modal-card-title">
|
||||
Add <span class="alias" data-alias="Lot"></span> Type Field
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<div class="modal" role="dialog">
|
||||
<div class="modal-background"></div>
|
||||
<div class="modal-card" style="width:900px">
|
||||
<div class="modal-card has-width-900">
|
||||
<header class="modal-card-head">
|
||||
<h3 class="modal-card-title">
|
||||
Update <span class="alias" data-alias="Lot"></span> Type
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<div class="modal" role="dialog">
|
||||
<div class="modal-background"></div>
|
||||
<div class="modal-card" style="width:900px">
|
||||
<div class="modal-card has-width-900">
|
||||
<header class="modal-card-head">
|
||||
<h3 class="modal-card-title">
|
||||
Update <span class="alias" data-alias="Lot"></span> Type Field
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<div class="modal" role="dialog">
|
||||
<div class="modal-background"></div>
|
||||
<div class="modal-card" style="width:900px">
|
||||
<div class="modal-card has-width-900">
|
||||
<header class="modal-card-head">
|
||||
<h3 class="modal-card-title">
|
||||
Add <span class="alias" data-alias="Occupancy"></span> Type
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<div class="modal" role="dialog">
|
||||
<div class="modal-background"></div>
|
||||
<div class="modal-card" style="width:900px">
|
||||
<div class="modal-card has-width-900">
|
||||
<header class="modal-card-head">
|
||||
<h3 class="modal-card-title">
|
||||
Add <span class="alias" data-alias="Occupancy"></span> Type Field
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<div class="modal" role="dialog">
|
||||
<div class="modal-background"></div>
|
||||
<div class="modal-card" style="width:900px">
|
||||
<div class="modal-card has-width-900">
|
||||
<header class="modal-card-head">
|
||||
<h3 class="modal-card-title">
|
||||
Update <span class="alias" data-alias="Occupancy"></span> Type
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<div class="modal" role="dialog">
|
||||
<div class="modal-background"></div>
|
||||
<div class="modal-card" style="width:900px">
|
||||
<div class="modal-card has-width-900">
|
||||
<header class="modal-card-head">
|
||||
<h3 class="modal-card-title">
|
||||
Update <span class="alias" data-alias="Occupancy"></span> Type Field
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue