global occupancy type fields

deepsource-autofix-76c6eb20
Dan Gowans 2022-09-19 10:28:46 -04:00
parent fd3d622dc8
commit db790d2e8a
37 changed files with 580 additions and 571 deletions

View File

@ -1,11 +1,13 @@
import { getOccupancyTypes } from "../../helpers/functions.cache.js";
import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js";
import * as configFunctions from "../../helpers/functions.config.js";
export const handler = (_request, response) => {
const occupancyTypes = getOccupancyTypes();
const allOccupancyTypeFields = getAllOccupancyTypeFields();
response.render("admin-occupancyTypes", {
headTitle: configFunctions.getProperty("aliases.occupancy") +
" Type Management",
occupancyTypes
occupancyTypes,
allOccupancyTypeFields
});
};
export default handler;

View File

@ -1,17 +1,19 @@
import type { RequestHandler } from "express";
import { getOccupancyTypes } from "../../helpers/functions.cache.js";
import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js";
import * as configFunctions from "../../helpers/functions.config.js";
export const handler: RequestHandler = (_request, response) => {
const occupancyTypes = getOccupancyTypes();
const allOccupancyTypeFields = getAllOccupancyTypeFields();
response.render("admin-occupancyTypes", {
headTitle:
configFunctions.getProperty("aliases.occupancy") +
" Type Management",
occupancyTypes
occupancyTypes,
allOccupancyTypeFields
});
};

View File

@ -1,12 +1,14 @@
import { addOccupancyType } from "../../helpers/lotOccupancyDB/addOccupancyType.js";
import { getOccupancyTypes } from "../../helpers/functions.cache.js";
import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js";
export const handler = async (request, response) => {
const occupancyTypeId = addOccupancyType(request.body, request.session);
const occupancyTypes = getOccupancyTypes();
const allOccupancyTypeFields = getAllOccupancyTypeFields();
response.json({
success: true,
occupancyTypeId,
occupancyTypes
occupancyTypes,
allOccupancyTypeFields
});
};
export default handler;

View File

@ -2,17 +2,19 @@ import type { RequestHandler } from "express";
import { addOccupancyType } from "../../helpers/lotOccupancyDB/addOccupancyType.js";
import { getOccupancyTypes } from "../../helpers/functions.cache.js";
import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js";
export const handler: RequestHandler = async (request, response) => {
const occupancyTypeId = addOccupancyType(request.body, request.session);
const occupancyTypes = getOccupancyTypes();
const allOccupancyTypeFields = getAllOccupancyTypeFields();
response.json({
success: true,
occupancyTypeId,
occupancyTypes
occupancyTypes,
allOccupancyTypeFields
});
};

View File

@ -1,12 +1,14 @@
import { addOccupancyTypeField } from "../../helpers/lotOccupancyDB/addOccupancyTypeField.js";
import { getOccupancyTypes } from "../../helpers/functions.cache.js";
import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js";
export const handler = async (request, response) => {
const occupancyTypeFieldId = addOccupancyTypeField(request.body, request.session);
const occupancyTypes = getOccupancyTypes();
const allOccupancyTypeFields = getAllOccupancyTypeFields();
response.json({
success: true,
occupancyTypeFieldId,
occupancyTypes
occupancyTypes,
allOccupancyTypeFields
});
};
export default handler;

View File

@ -2,17 +2,19 @@ import type { RequestHandler } from "express";
import { addOccupancyTypeField } from "../../helpers/lotOccupancyDB/addOccupancyTypeField.js";
import { getOccupancyTypes } from "../../helpers/functions.cache.js";
import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js";
export const handler: RequestHandler = async (request, response) => {
const occupancyTypeFieldId = addOccupancyTypeField(request.body, request.session);
const occupancyTypes = getOccupancyTypes();
const allOccupancyTypeFields = getAllOccupancyTypeFields();
response.json({
success: true,
occupancyTypeFieldId,
occupancyTypes
occupancyTypes,
allOccupancyTypeFields
});
};

View File

@ -1,11 +1,13 @@
import { deleteOccupancyType } from "../../helpers/lotOccupancyDB/deleteOccupancyType.js";
import { getOccupancyTypes } from "../../helpers/functions.cache.js";
import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js";
export const handler = async (request, response) => {
const success = deleteOccupancyType(request.body.occupancyTypeId, request.session);
const occupancyTypes = getOccupancyTypes();
const allOccupancyTypeFields = getAllOccupancyTypeFields();
response.json({
success,
occupancyTypes
occupancyTypes,
allOccupancyTypeFields
});
};
export default handler;

View File

@ -2,7 +2,7 @@ import type { RequestHandler } from "express";
import { deleteOccupancyType } from "../../helpers/lotOccupancyDB/deleteOccupancyType.js";
import { getOccupancyTypes } from "../../helpers/functions.cache.js";
import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js";
export const handler: RequestHandler = async (request, response) => {
const success = deleteOccupancyType(
@ -11,10 +11,12 @@ export const handler: RequestHandler = async (request, response) => {
);
const occupancyTypes = getOccupancyTypes();
const allOccupancyTypeFields = getAllOccupancyTypeFields();
response.json({
success,
occupancyTypes
occupancyTypes,
allOccupancyTypeFields
});
};

View File

@ -1,11 +1,13 @@
import { deleteOccupancyTypeField } from "../../helpers/lotOccupancyDB/deleteOccupancyTypeField.js";
import { getOccupancyTypes } from "../../helpers/functions.cache.js";
import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js";
export const handler = async (request, response) => {
const success = deleteOccupancyTypeField(request.body.occupancyTypeFieldId, request.session);
const occupancyTypes = getOccupancyTypes();
const allOccupancyTypeFields = getAllOccupancyTypeFields();
response.json({
success,
occupancyTypes
occupancyTypes,
allOccupancyTypeFields
});
};
export default handler;

View File

@ -2,7 +2,7 @@ import type { RequestHandler } from "express";
import { deleteOccupancyTypeField } from "../../helpers/lotOccupancyDB/deleteOccupancyTypeField.js";
import { getOccupancyTypes } from "../../helpers/functions.cache.js";
import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js";
export const handler: RequestHandler = async (request, response) => {
const success = deleteOccupancyTypeField(
@ -11,10 +11,12 @@ export const handler: RequestHandler = async (request, response) => {
);
const occupancyTypes = getOccupancyTypes();
const allOccupancyTypeFields = getAllOccupancyTypeFields();
response.json({
success,
occupancyTypes
occupancyTypes,
allOccupancyTypeFields
});
};

View File

@ -1,11 +1,13 @@
import { moveOccupancyTypeDown } from "../../helpers/lotOccupancyDB/moveOccupancyTypeDown.js";
import { getOccupancyTypes } from "../../helpers/functions.cache.js";
import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js";
export const handler = async (request, response) => {
const success = moveOccupancyTypeDown(request.body.occupancyTypeId);
const occupancyTypes = getOccupancyTypes();
const allOccupancyTypeFields = getAllOccupancyTypeFields();
response.json({
success,
occupancyTypes
occupancyTypes,
allOccupancyTypeFields
});
};
export default handler;

View File

@ -2,16 +2,18 @@ import type { RequestHandler } from "express";
import { moveOccupancyTypeDown } from "../../helpers/lotOccupancyDB/moveOccupancyTypeDown.js";
import { getOccupancyTypes } from "../../helpers/functions.cache.js";
import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js";
export const handler: RequestHandler = async (request, response) => {
const success = moveOccupancyTypeDown(request.body.occupancyTypeId);
const occupancyTypes = getOccupancyTypes();
const allOccupancyTypeFields = getAllOccupancyTypeFields();
response.json({
success,
occupancyTypes
occupancyTypes,
allOccupancyTypeFields
});
};

View File

@ -1,11 +1,13 @@
import { moveOccupancyTypeUp } from "../../helpers/lotOccupancyDB/moveOccupancyTypeUp.js";
import { getOccupancyTypes } from "../../helpers/functions.cache.js";
import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js";
export const handler = async (request, response) => {
const success = moveOccupancyTypeUp(request.body.occupancyTypeId);
const occupancyTypes = getOccupancyTypes();
const allOccupancyTypeFields = getAllOccupancyTypeFields();
response.json({
success,
occupancyTypes
occupancyTypes,
allOccupancyTypeFields
});
};
export default handler;

View File

@ -2,16 +2,18 @@ import type { RequestHandler } from "express";
import { moveOccupancyTypeUp } from "../../helpers/lotOccupancyDB/moveOccupancyTypeUp.js";
import { getOccupancyTypes } from "../../helpers/functions.cache.js";
import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js";
export const handler: RequestHandler = async (request, response) => {
const success = moveOccupancyTypeUp(request.body.occupancyTypeId);
const occupancyTypes = getOccupancyTypes();
const allOccupancyTypeFields = getAllOccupancyTypeFields();
response.json({
success,
occupancyTypes
occupancyTypes,
allOccupancyTypeFields
});
};

View File

@ -1,11 +1,13 @@
import { updateOccupancyType } from "../../helpers/lotOccupancyDB/updateOccupancyType.js";
import { getOccupancyTypes } from "../../helpers/functions.cache.js";
import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js";
export const handler = async (request, response) => {
const success = updateOccupancyType(request.body, request.session);
const occupancyTypes = getOccupancyTypes();
const allOccupancyTypeFields = getAllOccupancyTypeFields();
response.json({
success,
occupancyTypes
occupancyTypes,
allOccupancyTypeFields
});
};
export default handler;

View File

@ -2,16 +2,18 @@ import type { RequestHandler } from "express";
import { updateOccupancyType } from "../../helpers/lotOccupancyDB/updateOccupancyType.js";
import { getOccupancyTypes } from "../../helpers/functions.cache.js";
import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js";
export const handler: RequestHandler = async (request, response) => {
const success = updateOccupancyType(request.body, request.session);
const occupancyTypes = getOccupancyTypes();
const allOccupancyTypeFields = getAllOccupancyTypeFields();
response.json({
success,
occupancyTypes
occupancyTypes,
allOccupancyTypeFields
});
};

View File

@ -1,11 +1,13 @@
import { updateOccupancyTypeField } from "../../helpers/lotOccupancyDB/updateOccupancyTypeField.js";
import { getOccupancyTypes } from "../../helpers/functions.cache.js";
import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js";
export const handler = async (request, response) => {
const success = updateOccupancyTypeField(request.body, request.session);
const occupancyTypes = getOccupancyTypes();
const allOccupancyTypeFields = getAllOccupancyTypeFields();
response.json({
success,
occupancyTypes
occupancyTypes,
allOccupancyTypeFields
});
};
export default handler;

View File

@ -2,16 +2,18 @@ import type { RequestHandler } from "express";
import { updateOccupancyTypeField } from "../../helpers/lotOccupancyDB/updateOccupancyTypeField.js";
import { getOccupancyTypes } from "../../helpers/functions.cache.js";
import { getAllOccupancyTypeFields, getOccupancyTypes } from "../../helpers/functions.cache.js";
export const handler: RequestHandler = async (request, response) => {
const success = updateOccupancyTypeField(request.body, request.session);
const occupancyTypes = getOccupancyTypes();
const allOccupancyTypeFields = getAllOccupancyTypeFields();
response.json({
success,
occupancyTypes
occupancyTypes,
allOccupancyTypeFields
});
};

View File

@ -12,6 +12,7 @@ export declare function getLotTypeById(lotTypeId: number): recordTypes.LotType;
export declare function getLotTypesByLotType(lotType: string): recordTypes.LotType;
export declare function clearLotTypesCache(): void;
export declare function getOccupancyTypes(): recordTypes.OccupancyType[];
export declare function getAllOccupancyTypeFields(): recordTypes.OccupancyTypeField[];
export declare function getOccupancyTypeById(occupancyTypeId: number): recordTypes.OccupancyType;
export declare function getOccupancyTypeByOccupancyType(occupancyTypeString: string): recordTypes.OccupancyType;
export declare function clearOccupancyTypesCache(): void;

View File

@ -2,6 +2,7 @@ import { getLotOccupantTypes as getLotOccupantTypesFromDatabase } from "./lotOcc
import { getLotStatuses as getLotStatusesFromDatabase } from "./lotOccupancyDB/getLotStatuses.js";
import { getLotTypes as getLotTypesFromDatabase } from "./lotOccupancyDB/getLotTypes.js";
import { getOccupancyTypes as getOccupancyTypesFromDatabase } from "./lotOccupancyDB/getOccupancyTypes.js";
import { getOccupancyTypeFields as getOccupancyTypeFieldsFromDatabase } from "./lotOccupancyDB/getOccupancyTypeFields.js";
import { getWorkOrderTypes as getWorkOrderTypesFromDatabase } from "./lotOccupancyDB/getWorkOrderTypes.js";
import { getWorkOrderMilestoneTypes as getWorkOrderMilestoneTypesFromDatabase } from "./lotOccupancyDB/getWorkOrderMilestoneTypes.js";
let lotOccupantTypes;
@ -21,8 +22,7 @@ export function getLotOccupantTypesByLotOccupantType(lotOccupantType) {
const cachedLotOccupantTypes = getLotOccupantTypes();
const lotOccupantTypeLowerCase = lotOccupantType.toLowerCase();
return cachedLotOccupantTypes.find((currentLotOccupantType) => {
return (currentLotOccupantType.lotOccupantType.toLowerCase() ===
lotOccupantTypeLowerCase);
return currentLotOccupantType.lotOccupantType.toLowerCase() === lotOccupantTypeLowerCase;
});
}
export function clearLotOccupantTypesCache() {
@ -75,12 +75,19 @@ export function clearLotTypesCache() {
lotTypes = undefined;
}
let occupancyTypes;
let allOccupancyTypeFields;
export function getOccupancyTypes() {
if (!occupancyTypes) {
occupancyTypes = getOccupancyTypesFromDatabase();
}
return occupancyTypes;
}
export function getAllOccupancyTypeFields() {
if (!allOccupancyTypeFields) {
allOccupancyTypeFields = getOccupancyTypeFieldsFromDatabase();
}
return allOccupancyTypeFields;
}
export function getOccupancyTypeById(occupancyTypeId) {
const cachedOccupancyTypes = getOccupancyTypes();
return cachedOccupancyTypes.find((currentOccupancyType) => {
@ -91,12 +98,12 @@ export function getOccupancyTypeByOccupancyType(occupancyTypeString) {
const cachedOccupancyTypes = getOccupancyTypes();
const occupancyTypeLowerCase = occupancyTypeString.toLowerCase();
return cachedOccupancyTypes.find((currentOccupancyType) => {
return (currentOccupancyType.occupancyType.toLowerCase() ===
occupancyTypeLowerCase);
return currentOccupancyType.occupancyType.toLowerCase() === occupancyTypeLowerCase;
});
}
export function clearOccupancyTypesCache() {
occupancyTypes = undefined;
allOccupancyTypeFields = undefined;
}
let workOrderTypes;
export function getWorkOrderTypes() {

View File

@ -5,6 +5,7 @@ import { getLotStatuses as getLotStatusesFromDatabase } from "./lotOccupancyDB/g
import { getLotTypes as getLotTypesFromDatabase } from "./lotOccupancyDB/getLotTypes.js";
import { getOccupancyTypes as getOccupancyTypesFromDatabase } from "./lotOccupancyDB/getOccupancyTypes.js";
import { getOccupancyTypeFields as getOccupancyTypeFieldsFromDatabase } from "./lotOccupancyDB/getOccupancyTypeFields.js";
import { getWorkOrderTypes as getWorkOrderTypesFromDatabase } from "./lotOccupancyDB/getWorkOrderTypes.js";
@ -40,10 +41,7 @@ export function getLotOccupantTypesByLotOccupantType(lotOccupantType: string) {
const lotOccupantTypeLowerCase = lotOccupantType.toLowerCase();
return cachedLotOccupantTypes.find((currentLotOccupantType) => {
return (
currentLotOccupantType.lotOccupantType.toLowerCase() ===
lotOccupantTypeLowerCase
);
return currentLotOccupantType.lotOccupantType.toLowerCase() === lotOccupantTypeLowerCase;
});
}
@ -128,6 +126,7 @@ export function clearLotTypesCache() {
*/
let occupancyTypes: recordTypes.OccupancyType[];
let allOccupancyTypeFields: recordTypes.OccupancyTypeField[];
export function getOccupancyTypes() {
if (!occupancyTypes) {
@ -137,6 +136,13 @@ export function getOccupancyTypes() {
return occupancyTypes;
}
export function getAllOccupancyTypeFields() {
if (!allOccupancyTypeFields) {
allOccupancyTypeFields = getOccupancyTypeFieldsFromDatabase();
}
return allOccupancyTypeFields;
}
export function getOccupancyTypeById(occupancyTypeId: number) {
const cachedOccupancyTypes = getOccupancyTypes();
@ -151,15 +157,13 @@ export function getOccupancyTypeByOccupancyType(occupancyTypeString: string) {
const occupancyTypeLowerCase = occupancyTypeString.toLowerCase();
return cachedOccupancyTypes.find((currentOccupancyType) => {
return (
currentOccupancyType.occupancyType.toLowerCase() ===
occupancyTypeLowerCase
);
return currentOccupancyType.occupancyType.toLowerCase() === occupancyTypeLowerCase;
});
}
export function clearOccupancyTypesCache() {
occupancyTypes = undefined;
allOccupancyTypeFields = undefined;
}
/*
@ -194,7 +198,9 @@ export function getWorkOrderMilestoneTypes() {
return workOrderMilestoneTypes;
}
export function getWorkOrderMilestoneTypeByWorkOrderMilestoneType(workOrderMilestoneTypeString: string) {
export function getWorkOrderMilestoneTypeByWorkOrderMilestoneType(
workOrderMilestoneTypeString: string
) {
const cachedWorkOrderMilestoneTypes = getWorkOrderMilestoneTypes();
const workOrderMilestoneTypeLowerCase = workOrderMilestoneTypeString.toLowerCase();

View File

@ -24,8 +24,7 @@ export const initializeDatabase = () => {
")")
.run();
lotOccupancyDB
.prepare("create index if not exists idx_lottypes_ordernumber" +
" on LotTypes (orderNumber, lotType)")
.prepare("create index if not exists idx_lottypes_ordernumber" + " on LotTypes (orderNumber, lotType)")
.run();
lotOccupancyDB
.prepare("create table if not exists LotTypeFields (" +
@ -56,8 +55,7 @@ export const initializeDatabase = () => {
")")
.run();
lotOccupancyDB
.prepare("create index if not exists idx_lotstatuses_ordernumber" +
" on LotStatuses (orderNumber, lotStatus)")
.prepare("create index if not exists idx_lotstatuses_ordernumber" + " on LotStatuses (orderNumber, lotStatus)")
.run();
lotOccupancyDB
.prepare("create table if not exists Maps (" +
@ -136,7 +134,7 @@ export const initializeDatabase = () => {
lotOccupancyDB
.prepare("create table if not exists OccupancyTypeFields (" +
"occupancyTypeFieldId integer not null primary key autoincrement," +
" occupancyTypeId integer not null," +
" occupancyTypeId integer," +
" occupancyTypeField varchar(100) not null," +
" occupancyTypeFieldValues text," +
" isRequired bit not null default 0," +
@ -257,8 +255,7 @@ export const initializeDatabase = () => {
")")
.run();
lotOccupancyDB
.prepare("create index if not exists idx_fees_ordernumber" +
" on Fees (orderNumber, feeName)")
.prepare("create index if not exists idx_fees_ordernumber" + " on Fees (orderNumber, feeName)")
.run();
lotOccupancyDB
.prepare("create table if not exists LotOccupancyFees (" +

View File

@ -17,9 +17,7 @@ export const initializeDatabase = (): boolean => {
const lotOccupancyDB = sqlite(databasePath);
const row = lotOccupancyDB
.prepare(
"select name from sqlite_master where type = 'table' and name = 'WorkOrderMilestones'"
)
.prepare("select name from sqlite_master where type = 'table' and name = 'WorkOrderMilestones'")
.get();
if (!row) {
@ -39,10 +37,7 @@ export const initializeDatabase = (): boolean => {
.run();
lotOccupancyDB
.prepare(
"create index if not exists idx_lottypes_ordernumber" +
" on LotTypes (orderNumber, lotType)"
)
.prepare("create index if not exists idx_lottypes_ordernumber" + " on LotTypes (orderNumber, lotType)")
.run();
lotOccupancyDB
@ -84,8 +79,7 @@ export const initializeDatabase = (): boolean => {
lotOccupancyDB
.prepare(
"create index if not exists idx_lotstatuses_ordernumber" +
" on LotStatuses (orderNumber, lotStatus)"
"create index if not exists idx_lotstatuses_ordernumber" + " on LotStatuses (orderNumber, lotStatus)"
)
.run();
@ -192,7 +186,7 @@ export const initializeDatabase = (): boolean => {
.prepare(
"create table if not exists OccupancyTypeFields (" +
"occupancyTypeFieldId integer not null primary key autoincrement," +
" occupancyTypeId integer not null," +
" occupancyTypeId integer," +
" occupancyTypeField varchar(100) not null," +
" occupancyTypeFieldValues text," +
" isRequired bit not null default 0," +
@ -347,10 +341,7 @@ export const initializeDatabase = (): boolean => {
.run();
lotOccupancyDB
.prepare(
"create index if not exists idx_fees_ordernumber" +
" on Fees (orderNumber, feeName)"
)
.prepare("create index if not exists idx_fees_ordernumber" + " on Fees (orderNumber, feeName)")
.run();
lotOccupancyDB

View File

@ -1,6 +1,6 @@
import type * as recordTypes from "../../types/recordTypes";
interface AddOccupancyTypeFieldForm {
occupancyTypeId: string | number;
occupancyTypeId?: string | number;
occupancyTypeField: string;
occupancyTypeFieldValues?: string;
isRequired?: string;

View File

@ -13,7 +13,7 @@ export const addOccupancyTypeField = (occupancyTypeFieldForm, requestSession) =>
" recordCreate_userName, recordCreate_timeMillis," +
" recordUpdate_userName, recordUpdate_timeMillis)" +
" values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
.run(occupancyTypeFieldForm.occupancyTypeId, occupancyTypeFieldForm.occupancyTypeField, occupancyTypeFieldForm.occupancyTypeFieldValues || "", occupancyTypeFieldForm.isRequired ? 1 : 0, occupancyTypeFieldForm.pattern || "", occupancyTypeFieldForm.minimumLength || 0, occupancyTypeFieldForm.maximumLength || 100, occupancyTypeFieldForm.orderNumber || -1, requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis);
.run(occupancyTypeFieldForm.occupancyTypeId || undefined, occupancyTypeFieldForm.occupancyTypeField, occupancyTypeFieldForm.occupancyTypeFieldValues || "", occupancyTypeFieldForm.isRequired ? 1 : 0, occupancyTypeFieldForm.pattern || "", occupancyTypeFieldForm.minimumLength || 0, occupancyTypeFieldForm.maximumLength || 100, occupancyTypeFieldForm.orderNumber || -1, requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis);
database.close();
clearOccupancyTypesCache();
return result.lastInsertRowid;

View File

@ -6,7 +6,7 @@ import type * as recordTypes from "../../types/recordTypes";
import { clearOccupancyTypesCache } from "../functions.cache.js";
interface AddOccupancyTypeFieldForm {
occupancyTypeId: string | number;
occupancyTypeId?: string | number;
occupancyTypeField: string;
occupancyTypeFieldValues?: string;
isRequired?: string;
@ -36,7 +36,7 @@ export const addOccupancyTypeField = (
" values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
)
.run(
occupancyTypeFieldForm.occupancyTypeId,
occupancyTypeFieldForm.occupancyTypeId || undefined,
occupancyTypeFieldForm.occupancyTypeField,
occupancyTypeFieldForm.occupancyTypeFieldValues || "",
occupancyTypeFieldForm.isRequired ? 1 : 0,

View File

@ -23,7 +23,7 @@ export const getLotOccupancyFields = (lotOccupancyId, connectedDatabase) => {
" f.orderNumber" +
" from OccupancyTypeFields f" +
" where f.recordDelete_timeMillis is null" +
" and f.occupancyTypeId in (select occupancyTypeId from LotOccupancies where lotOccupancyId = ?)" +
" and (f.occupancyTypeId is null or f.occupancyTypeId in (select occupancyTypeId from LotOccupancies where lotOccupancyId = ?))" +
" and f.occupancyTypeFieldId not in (select occupancyTypeFieldId from LotOccupancyFields where lotOccupancyId = ? and recordDelete_timeMillis is null)" +
" order by orderNumber, occupancyTypeField")
.all(lotOccupancyId, lotOccupancyId, lotOccupancyId, lotOccupancyId);

View File

@ -33,7 +33,7 @@ export const getLotOccupancyFields = (
" f.orderNumber" +
" from OccupancyTypeFields f" +
" where f.recordDelete_timeMillis is null" +
" and f.occupancyTypeId in (select occupancyTypeId from LotOccupancies where lotOccupancyId = ?)" +
" and (f.occupancyTypeId is null or f.occupancyTypeId in (select occupancyTypeId from LotOccupancies where lotOccupancyId = ?))" +
" and f.occupancyTypeFieldId not in (select occupancyTypeFieldId from LotOccupancyFields where lotOccupancyId = ? and recordDelete_timeMillis is null)" +
" order by orderNumber, occupancyTypeField"
)

View File

@ -0,0 +1,4 @@
import sqlite from "better-sqlite3";
import type * as recordTypes from "../../types/recordTypes";
export declare const getOccupancyTypeFields: (occupancyTypeId?: number, connectedDatabase?: sqlite.Database) => recordTypes.OccupancyTypeField[];
export default getOccupancyTypeFields;

View File

@ -0,0 +1,36 @@
import sqlite from "better-sqlite3";
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
export const getOccupancyTypeFields = (occupancyTypeId, connectedDatabase) => {
const database = connectedDatabase || sqlite(databasePath);
const sqlParameters = [];
if (occupancyTypeId) {
sqlParameters.push(occupancyTypeId);
}
const occupancyTypeFields = database
.prepare("select occupancyTypeFieldId," +
" occupancyTypeField, occupancyTypeFieldValues, isRequired, pattern," +
" minimumLength, maximumLength," +
" orderNumber" +
" from OccupancyTypeFields" +
" where recordDelete_timeMillis is null" +
(occupancyTypeId ? " and occupancyTypeId = ?" : " and occupancyTypeId is null") +
" order by orderNumber, occupancyTypeField")
.all(sqlParameters);
let expectedFieldOrderNumber = -1;
for (const occupancyTypeField of occupancyTypeFields) {
expectedFieldOrderNumber += 1;
if (occupancyTypeField.orderNumber !== expectedFieldOrderNumber) {
database
.prepare("update OccupancyTypeFields" +
" set orderNumber = ?" +
" where occupancyTypeFieldId = ?")
.run(expectedFieldOrderNumber, occupancyTypeField.occupancyTypeFieldId);
occupancyTypeField.orderNumber = expectedFieldOrderNumber;
}
}
if (!connectedDatabase) {
database.close();
}
return occupancyTypeFields;
};
export default getOccupancyTypeFields;

View File

@ -0,0 +1,57 @@
import sqlite from "better-sqlite3";
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
import type * as recordTypes from "../../types/recordTypes";
export const getOccupancyTypeFields = (
occupancyTypeId?: number,
connectedDatabase?: sqlite.Database
): recordTypes.OccupancyTypeField[] => {
const database = connectedDatabase || sqlite(databasePath);
const sqlParameters = [];
if (occupancyTypeId) {
sqlParameters.push(occupancyTypeId);
}
const occupancyTypeFields: recordTypes.OccupancyTypeField[] = database
.prepare(
"select occupancyTypeFieldId," +
" occupancyTypeField, occupancyTypeFieldValues, isRequired, pattern," +
" minimumLength, maximumLength," +
" orderNumber" +
" from OccupancyTypeFields" +
" where recordDelete_timeMillis is null" +
(occupancyTypeId ? " and occupancyTypeId = ?" : " and occupancyTypeId is null") +
" order by orderNumber, occupancyTypeField"
)
.all(sqlParameters);
let expectedFieldOrderNumber = -1;
for (const occupancyTypeField of occupancyTypeFields) {
expectedFieldOrderNumber += 1;
if (occupancyTypeField.orderNumber !== expectedFieldOrderNumber) {
database
.prepare(
"update OccupancyTypeFields" +
" set orderNumber = ?" +
" where occupancyTypeFieldId = ?"
)
.run(expectedFieldOrderNumber, occupancyTypeField.occupancyTypeFieldId);
occupancyTypeField.orderNumber = expectedFieldOrderNumber;
}
}
if (!connectedDatabase) {
database.close();
}
return occupancyTypeFields;
};
export default getOccupancyTypeFields;

View File

@ -1,5 +1,6 @@
import sqlite from "better-sqlite3";
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
import { getOccupancyTypeFields } from "./getOccupancyTypeFields.js";
export const getOccupancyTypes = () => {
const database = sqlite(databasePath);
const occupancyTypes = database
@ -13,22 +14,11 @@ export const getOccupancyTypes = () => {
expectedTypeOrderNumber += 1;
if (occupancyType.orderNumber !== expectedTypeOrderNumber) {
database
.prepare("update OccupancyTypes" +
" set orderNumber = ?" +
" where occupancyTypeId = ?")
.prepare("update OccupancyTypes" + " set orderNumber = ?" + " where occupancyTypeId = ?")
.run(expectedTypeOrderNumber, occupancyType.occupancyTypeId);
occupancyType.orderNumber = expectedTypeOrderNumber;
}
occupancyType.occupancyTypeFields = database
.prepare("select occupancyTypeFieldId," +
" occupancyTypeField, occupancyTypeFieldValues, isRequired, pattern," +
" minimumLength, maximumLength," +
" orderNumber" +
" from OccupancyTypeFields" +
" where recordDelete_timeMillis is null" +
" and occupancyTypeId = ?" +
" order by orderNumber, occupancyTypeField")
.all(occupancyType.occupancyTypeId);
occupancyType.occupancyTypeFields = getOccupancyTypeFields(occupancyType.occupancyTypeId, database);
let expectedFieldOrderNumber = -1;
for (const occupancyTypeField of occupancyType.occupancyTypeFields) {
expectedFieldOrderNumber += 1;

View File

@ -2,6 +2,8 @@ import sqlite from "better-sqlite3";
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
import { getOccupancyTypeFields } from "./getOccupancyTypeFields.js";
import type * as recordTypes from "../../types/recordTypes";
export const getOccupancyTypes = (): recordTypes.OccupancyType[] => {
@ -24,27 +26,17 @@ export const getOccupancyTypes = (): recordTypes.OccupancyType[] => {
if (occupancyType.orderNumber !== expectedTypeOrderNumber) {
database
.prepare(
"update OccupancyTypes" +
" set orderNumber = ?" +
" where occupancyTypeId = ?"
"update OccupancyTypes" + " set orderNumber = ?" + " where occupancyTypeId = ?"
)
.run(expectedTypeOrderNumber, occupancyType.occupancyTypeId);
occupancyType.orderNumber = expectedTypeOrderNumber;
}
occupancyType.occupancyTypeFields = database
.prepare(
"select occupancyTypeFieldId," +
" occupancyTypeField, occupancyTypeFieldValues, isRequired, pattern," +
" minimumLength, maximumLength," +
" orderNumber" +
" from OccupancyTypeFields" +
" where recordDelete_timeMillis is null" +
" and occupancyTypeId = ?" +
" order by orderNumber, occupancyTypeField"
)
.all(occupancyType.occupancyTypeId);
occupancyType.occupancyTypeFields = getOccupancyTypeFields(
occupancyType.occupancyTypeId,
database
);
let expectedFieldOrderNumber = -1;
@ -58,10 +50,7 @@ export const getOccupancyTypes = (): recordTypes.OccupancyType[] => {
" set orderNumber = ?" +
" where occupancyTypeFieldId = ?"
)
.run(
expectedFieldOrderNumber,
occupancyTypeField.occupancyTypeFieldId
);
.run(expectedFieldOrderNumber, occupancyTypeField.occupancyTypeFieldId);
occupancyTypeField.orderNumber = expectedFieldOrderNumber;
}

View File

@ -6,6 +6,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
const containerElement = document.querySelector("#container--occupancyTypes");
let occupancyTypes = exports.occupancyTypes;
delete exports.occupancyTypes;
let allOccupancyTypeFields = exports.allOccupancyTypeFields;
delete exports.allOccupancyTypeFields;
const expandedOccupancyTypes = new Set();
const toggleOccupancyTypeFields = (clickEvent) => {
const toggleButtonElement = clickEvent.currentTarget;
@ -25,26 +27,26 @@ Object.defineProperty(exports, "__esModule", { value: true });
panelBlockElement.classList.toggle("is-hidden");
}
};
const occupancyTypeResponseHandler = (responseJSON) => {
if (responseJSON.success) {
occupancyTypes = responseJSON.occupancyTypes;
allOccupancyTypeFields = responseJSON.allOccupancyTypeFields;
renderOccupancyTypes();
}
else {
bulmaJS.alert({
title: "Error Updating " + exports.aliases.occupancy + " Type",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
};
const deleteOccupancyType = (clickEvent) => {
const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId, 10);
const doDelete = () => {
cityssm.postJSON(urlPrefix + "/admin/doDeleteOccupancyType", {
occupancyTypeId
}, (responseJSON) => {
if (responseJSON.success) {
occupancyTypes = responseJSON.occupancyTypes;
renderOccupancyTypes();
}
else {
bulmaJS.alert({
title: "Error Deleting " +
exports.aliases.occupancy +
" Type",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
});
}, occupancyTypeResponseHandler);
};
bulmaJS.confirm({
title: "Delete " + exports.aliases.occupancy + " Type",
@ -67,19 +69,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
const doEdit = (submitEvent) => {
submitEvent.preventDefault();
cityssm.postJSON(urlPrefix + "/admin/doUpdateOccupancyType", submitEvent.currentTarget, (responseJSON) => {
occupancyTypeResponseHandler(responseJSON);
if (responseJSON.success) {
editCloseModalFunction();
occupancyTypes = responseJSON.occupancyTypes;
renderOccupancyTypes();
}
else {
bulmaJS.alert({
title: "Error Updating " +
exports.aliases.occupancy +
" Type",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
});
};
@ -92,9 +84,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
onshown: (modalElement, closeModalFunction) => {
editCloseModalFunction = closeModalFunction;
modalElement.querySelector("#occupancyTypeEdit--occupancyType").focus();
modalElement
.querySelector("form")
.addEventListener("submit", doEdit);
modalElement.querySelector("form").addEventListener("submit", doEdit);
bulmaJS.toggleHtmlClipped();
},
onremoved: () => {
@ -108,33 +98,25 @@ Object.defineProperty(exports, "__esModule", { value: true });
const doAdd = (submitEvent) => {
submitEvent.preventDefault();
cityssm.postJSON(urlPrefix + "/admin/doAddOccupancyTypeField", submitEvent.currentTarget, (responseJSON) => {
expandedOccupancyTypes.add(occupancyTypeId);
occupancyTypeResponseHandler(responseJSON);
if (responseJSON.success) {
expandedOccupancyTypes.add(occupancyTypeId);
addCloseModalFunction();
occupancyTypes = responseJSON.occupancyTypes;
renderOccupancyTypes();
openEditOccupancyTypeField(occupancyTypeId, responseJSON.occupancyTypeFieldId);
}
else {
bulmaJS.alert({
title: "Error Adding Field",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
});
};
cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyTypeField", {
onshow: (modalElement) => {
los.populateAliases(modalElement);
modalElement.querySelector("#occupancyTypeFieldAdd--occupancyTypeId").value = occupancyTypeId.toString();
if (occupancyTypeId) {
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("form").addEventListener("submit", doAdd);
bulmaJS.toggleHtmlClipped();
},
onremoved: () => {
@ -147,51 +129,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
const occupancyTypeId = clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId;
cityssm.postJSON(urlPrefix + "/admin/doMoveOccupancyTypeUp", {
occupancyTypeId
}, (responseJSON) => {
if (responseJSON.success) {
occupancyTypes = responseJSON.occupancyTypes;
renderOccupancyTypes();
}
else {
bulmaJS.alert({
title: "Error Moving " +
exports.aliases.occupancy +
" Type",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
});
}, occupancyTypeResponseHandler);
};
const moveOccupancyTypeDown = (clickEvent) => {
clickEvent.preventDefault();
const occupancyTypeId = clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId;
cityssm.postJSON(urlPrefix + "/admin/doMoveOccupancyTypeDown", {
occupancyTypeId
}, (responseJSON) => {
if (responseJSON.success) {
occupancyTypes = responseJSON.occupancyTypes;
renderOccupancyTypes();
}
else {
bulmaJS.alert({
title: "Error Moving " +
exports.aliases.occupancy +
" Type",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
});
}, occupancyTypeResponseHandler);
};
const openEditOccupancyTypeField = (occupancyTypeId, occupancyTypeFieldId) => {
const occupancyType = occupancyTypes.find((currentOccupancyType) => {
return currentOccupancyType.occupancyTypeId === occupancyTypeId;
});
const occupancyTypeField = occupancyType.occupancyTypeFields.find((currentOccupancyTypeField) => {
return (currentOccupancyTypeField.occupancyTypeFieldId ===
occupancyTypeFieldId);
});
let occupancyTypeField;
if (occupancyTypeId) {
const occupancyType = occupancyTypes.find((currentOccupancyType) => {
return currentOccupancyType.occupancyTypeId === occupancyTypeId;
});
occupancyTypeField = occupancyType.occupancyTypeFields.find((currentOccupancyTypeField) => {
return currentOccupancyTypeField.occupancyTypeFieldId === occupancyTypeFieldId;
});
}
else {
occupancyTypeField = allOccupancyTypeFields.find((currentOccupancyTypeField) => {
return currentOccupancyTypeField.occupancyTypeFieldId === occupancyTypeFieldId;
});
}
let minimumLengthElement;
let maximumLengthElement;
let patternElement;
@ -215,17 +176,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
const doUpdate = (submitEvent) => {
submitEvent.preventDefault();
cityssm.postJSON(urlPrefix + "/admin/doUpdateOccupancyTypeField", submitEvent.currentTarget, (responseJSON) => {
occupancyTypeResponseHandler(responseJSON);
if (responseJSON.success) {
occupancyTypes = responseJSON.occupancyTypes;
editCloseModalFunction();
renderOccupancyTypes();
}
else {
bulmaJS.alert({
title: "Error Updating Field",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
});
};
@ -234,17 +187,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
cityssm.postJSON(urlPrefix + "/admin/doDeleteOccupancyTypeField", {
occupancyTypeFieldId
}, (responseJSON) => {
occupancyTypeResponseHandler(responseJSON);
if (responseJSON.success) {
occupancyTypes = responseJSON.occupancyTypes;
editCloseModalFunction();
renderOccupancyTypes();
}
else {
bulmaJS.alert({
title: "Error Deleting Field",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
});
};
@ -265,16 +210,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
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();
minimumLengthElement.value = occupancyTypeField.minimumLength.toString();
maximumLengthElement = modalElement.querySelector("#occupancyTypeFieldEdit--maximumLength");
maximumLengthElement.value =
occupancyTypeField.maximumLength.toString();
maximumLengthElement.value = occupancyTypeField.maximumLength.toString();
patternElement = modalElement.querySelector("#occupancyTypeFieldEdit--pattern");
patternElement.value = occupancyTypeField.pattern;
occupancyTypeFieldValuesElement = modalElement.querySelector("#occupancyTypeFieldEdit--occupancyTypeFieldValues");
occupancyTypeFieldValuesElement.value =
occupancyTypeField.occupancyTypeFieldValues;
occupancyTypeFieldValuesElement.value = occupancyTypeField.occupancyTypeFieldValues;
toggleInputFields();
},
onshown: (modalElement, closeModalFunction) => {
@ -282,9 +224,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
bulmaJS.init(modalElement);
bulmaJS.toggleHtmlClipped();
cityssm.enableNavBlocker();
modalElement
.querySelector("form")
.addEventListener("submit", doUpdate);
modalElement.querySelector("form").addEventListener("submit", doUpdate);
minimumLengthElement.addEventListener("keyup", updateMaximumLengthMin);
updateMaximumLengthMin();
occupancyTypeFieldValuesElement.addEventListener("keyup", toggleInputFields);
@ -304,17 +244,91 @@ Object.defineProperty(exports, "__esModule", { value: true });
const occupancyTypeId = Number.parseInt(clickEvent.currentTarget.closest(".container--occupancyType").dataset.occupancyTypeId, 10);
openEditOccupancyTypeField(occupancyTypeId, occupancyTypeFieldId);
};
const renderOccupancyTypeFields = (panelElement, occupancyTypeId, occupancyTypeFields) => {
if (occupancyTypeFields.length === 0) {
panelElement.insertAdjacentHTML("beforeend", '<div class="panel-block is-block' +
(!occupancyTypeId || expandedOccupancyTypes.has(occupancyTypeId)
? ""
: " is-hidden") +
'">' +
'<div class="message is-info">' +
'<p class="message-body">There are no additional fields.</p>' +
"</div>" +
"</div>");
}
else {
for (const occupancyTypeField of occupancyTypeFields) {
const panelBlockElement = document.createElement("div");
panelBlockElement.className = "panel-block is-block container--occupancyTypeField";
if (occupancyTypeId && !expandedOccupancyTypes.has(occupancyTypeId)) {
panelBlockElement.classList.add("is-hidden");
}
panelBlockElement.dataset.occupancyTypeFieldId =
occupancyTypeField.occupancyTypeFieldId.toString();
panelBlockElement.innerHTML =
'<div class="level is-mobile">' +
'<div class="level-left">' +
('<div class="level-item">' +
'<a class="has-text-weight-bold button--editOccupancyTypeField" href="#">' +
cityssm.escapeHTML(occupancyTypeField.occupancyTypeField) +
"</a>" +
"</div>") +
"</div>" +
'<div class="level-right">' +
('<div class="level-item">' +
'<div class="field has-addons">' +
'<div class="control">' +
'<button class="button is-small button--moveOccupancyTypeFieldUp" data-tooltip="Move 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 is-small button--moveOccupancyTypeFieldDown" data-tooltip="Move Down" type="button" aria-label="Move Down">' +
'<i class="fas fa-arrow-down" aria-hidden="true"></i>' +
"</button>" +
"</div>" +
"</div>" +
"</div>") +
"</div>" +
"</div>";
panelBlockElement
.querySelector(".button--editOccupancyTypeField")
.addEventListener("click", openEditOccupancyTypeFieldByClick);
panelElement.append(panelBlockElement);
}
}
};
const renderOccupancyTypes = () => {
containerElement.innerHTML =
'<div class="panel container--occupancyType" id="container--allOccupancyTypeFields" data-occupancy-type-id="">' +
'<div class="panel-heading">' +
('<div class="level is-mobile">' +
('<div class="level-left">' +
'<div class="level-item"><h2 class="title is-4">(All Occupancy 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>";
renderOccupancyTypeFields(containerElement.querySelector("#container--allOccupancyTypeFields"), undefined, allOccupancyTypeFields);
containerElement
.querySelector(".button--addOccupancyTypeField")
.addEventListener("click", openAddOccupancyTypeField);
if (occupancyTypes.length === 0) {
containerElement.innerHTML =
'<div class="message is-warning>' +
'<p class="message-body">There are no active ' +
exports.aliases.occupancy.toLowerCase() +
" types.</p>" +
"</div>";
containerElement.insertAdjacentHTML("afterbegin", '<div class="message is-warning>' +
'<p class="message-body">There are no active ' +
exports.aliases.occupancy.toLowerCase() +
" types.</p>" +
"</div>");
return;
}
containerElement.innerHTML = "";
for (const occupancyType of occupancyTypes) {
const occupancyTypeContainer = document.createElement("div");
occupancyTypeContainer.className = "panel container--occupancyType";
@ -375,59 +389,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
"</div>") +
"</div>" +
"</div>";
if (occupancyType.occupancyTypeFields.length === 0) {
occupancyTypeContainer.insertAdjacentHTML("beforeend", '<div class="panel-block is-block' +
(expandedOccupancyTypes.has(occupancyType.occupancyTypeId)
? ""
: " is-hidden") +
'">' +
'<div class="message is-info">' +
'<p class="message-body">There are no additional fields.</p>' +
"</div>" +
"</div>");
}
else {
for (const occupancyTypeField of occupancyType.occupancyTypeFields) {
const panelBlockElement = document.createElement("div");
panelBlockElement.className =
"panel-block is-block container--occupancyTypeField";
if (!expandedOccupancyTypes.has(occupancyType.occupancyTypeId)) {
panelBlockElement.classList.add("is-hidden");
}
panelBlockElement.dataset.occupancyTypeFieldId =
occupancyTypeField.occupancyTypeFieldId.toString();
panelBlockElement.innerHTML =
'<div class="level is-mobile">' +
'<div class="level-left">' +
('<div class="level-item">' +
'<a class="has-text-weight-bold button--editOccupancyTypeField" href="#">' +
cityssm.escapeHTML(occupancyTypeField.occupancyTypeField) +
"</a>" +
"</div>") +
"</div>" +
'<div class="level-right">' +
('<div class="level-item">' +
'<div class="field has-addons">' +
'<div class="control">' +
'<button class="button is-small button--moveOccupancyTypeFieldUp" data-tooltip="Move 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 is-small button--moveOccupancyTypeFieldDown" data-tooltip="Move Down" type="button" aria-label="Move Down">' +
'<i class="fas fa-arrow-down" aria-hidden="true"></i>' +
"</button>" +
"</div>" +
"</div>" +
"</div>") +
"</div>" +
"</div>";
panelBlockElement
.querySelector(".button--editOccupancyTypeField")
.addEventListener("click", openEditOccupancyTypeFieldByClick);
occupancyTypeContainer.append(panelBlockElement);
}
}
renderOccupancyTypeFields(occupancyTypeContainer, occupancyType.occupancyTypeId, occupancyType.occupancyTypeFields);
occupancyTypeContainer
.querySelector(".button--toggleOccupancyTypeFields")
.addEventListener("click", toggleOccupancyTypeFields);
@ -449,9 +411,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
containerElement.append(occupancyTypeContainer);
}
};
document
.querySelector("#button--addOccupancyType")
.addEventListener("click", () => {
document.querySelector("#button--addOccupancyType").addEventListener("click", () => {
let addCloseModalFunction;
const doAdd = (submitEvent) => {
submitEvent.preventDefault();
@ -463,9 +423,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
}
else {
bulmaJS.alert({
title: "Error Adding " +
exports.aliases.occupancy +
" Type",
title: "Error Adding " + exports.aliases.occupancy + " Type",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
@ -479,9 +437,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
onshown: (modalElement, closeModalFunction) => {
addCloseModalFunction = closeModalFunction;
modalElement.querySelector("#occupancyTypeAdd--occupancyType").focus();
modalElement
.querySelector("form")
.addEventListener("submit", doAdd);
modalElement.querySelector("form").addEventListener("submit", doAdd);
bulmaJS.toggleHtmlClipped();
},
onremoved: () => {

View File

@ -15,27 +15,24 @@ declare const bulmaJS: BulmaJS;
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
const containerElement = document.querySelector(
"#container--occupancyTypes"
) as HTMLElement;
const containerElement = document.querySelector("#container--occupancyTypes") as HTMLElement;
let occupancyTypes: recordTypes.OccupancyType[] = exports.occupancyTypes;
delete exports.occupancyTypes;
let allOccupancyTypeFields: recordTypes.OccupancyTypeField[] = exports.allOccupancyTypeFields;
delete exports.allOccupancyTypeFields;
const expandedOccupancyTypes = new Set<number>();
const toggleOccupancyTypeFields = (clickEvent: Event) => {
const toggleButtonElement =
clickEvent.currentTarget as HTMLButtonElement;
const toggleButtonElement = clickEvent.currentTarget as HTMLButtonElement;
const occupancyTypeElement = toggleButtonElement.closest(
".container--occupancyType"
) as HTMLElement;
const occupancyTypeId = Number.parseInt(
occupancyTypeElement.dataset.occupancyTypeId,
10
);
const occupancyTypeId = Number.parseInt(occupancyTypeElement.dataset.occupancyTypeId, 10);
if (expandedOccupancyTypes.has(occupancyTypeId)) {
expandedOccupancyTypes.delete(occupancyTypeId);
@ -43,20 +40,36 @@ declare const bulmaJS: BulmaJS;
expandedOccupancyTypes.add(occupancyTypeId);
}
toggleButtonElement.innerHTML = expandedOccupancyTypes.has(
occupancyTypeId
)
toggleButtonElement.innerHTML = expandedOccupancyTypes.has(occupancyTypeId)
? '<i class="fas fa-fw fa-minus" aria-hidden="true"></i>'
: '<i class="fas fa-fw fa-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");
}
};
const occupancyTypeResponseHandler = (responseJSON: {
success: boolean;
errorMessage?: string;
occupancyTypes?: recordTypes.OccupancyType[];
allOccupancyTypeFields?: recordTypes.OccupancyTypeField[];
}) => {
if (responseJSON.success) {
occupancyTypes = responseJSON.occupancyTypes;
allOccupancyTypeFields = responseJSON.allOccupancyTypeFields;
renderOccupancyTypes();
} else {
bulmaJS.alert({
title: "Error Updating " + exports.aliases.occupancy + " Type",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
};
const deleteOccupancyType = (clickEvent: Event) => {
const occupancyTypeId = Number.parseInt(
(
@ -73,25 +86,7 @@ declare const bulmaJS: BulmaJS;
{
occupancyTypeId
},
(responseJSON: {
success: boolean;
errorMessage?: string;
occupancyTypes?: recordTypes.OccupancyType[];
}) => {
if (responseJSON.success) {
occupancyTypes = responseJSON.occupancyTypes;
renderOccupancyTypes();
} else {
bulmaJS.alert({
title:
"Error Deleting " +
exports.aliases.occupancy +
" Type",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
}
occupancyTypeResponseHandler
);
};
@ -135,20 +130,11 @@ declare const bulmaJS: BulmaJS;
success: boolean;
errorMessage?: string;
occupancyTypes?: recordTypes.OccupancyType[];
allOccupancyTypeFields?: recordTypes.OccupancyTypeField[];
}) => {
occupancyTypeResponseHandler(responseJSON);
if (responseJSON.success) {
editCloseModalFunction();
occupancyTypes = responseJSON.occupancyTypes;
renderOccupancyTypes();
} else {
bulmaJS.alert({
title:
"Error Updating " +
exports.aliases.occupancy +
" Type",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
}
);
@ -179,9 +165,7 @@ declare const bulmaJS: BulmaJS;
) as HTMLInputElement
).focus();
modalElement
.querySelector("form")
.addEventListener("submit", doEdit);
modalElement.querySelector("form").addEventListener("submit", doEdit);
bulmaJS.toggleHtmlClipped();
},
@ -213,25 +197,18 @@ declare const bulmaJS: BulmaJS;
success: boolean;
errorMessage?: string;
occupancyTypes?: recordTypes.OccupancyType[];
allOccupancyTypeFields?: recordTypes.OccupancyTypeField[];
occupancyTypeFieldId?: number;
}) => {
expandedOccupancyTypes.add(occupancyTypeId);
occupancyTypeResponseHandler(responseJSON);
if (responseJSON.success) {
expandedOccupancyTypes.add(occupancyTypeId);
addCloseModalFunction();
occupancyTypes = responseJSON.occupancyTypes;
renderOccupancyTypes();
openEditOccupancyTypeField(
occupancyTypeId,
responseJSON.occupancyTypeFieldId
);
} else {
bulmaJS.alert({
title: "Error Adding Field",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
}
);
@ -241,11 +218,13 @@ declare const bulmaJS: BulmaJS;
onshow: (modalElement) => {
los.populateAliases(modalElement);
(
modalElement.querySelector(
"#occupancyTypeFieldAdd--occupancyTypeId"
) as HTMLInputElement
).value = occupancyTypeId.toString();
if (occupancyTypeId) {
(
modalElement.querySelector(
"#occupancyTypeFieldAdd--occupancyTypeId"
) as HTMLInputElement
).value = occupancyTypeId.toString();
}
},
onshown: (modalElement, closeModalFunction) => {
addCloseModalFunction = closeModalFunction;
@ -256,9 +235,7 @@ declare const bulmaJS: BulmaJS;
) as HTMLInputElement
).focus();
modalElement
.querySelector("form")
.addEventListener("submit", doAdd);
modalElement.querySelector("form").addEventListener("submit", doAdd);
bulmaJS.toggleHtmlClipped();
},
@ -282,25 +259,7 @@ declare const bulmaJS: BulmaJS;
{
occupancyTypeId
},
(responseJSON: {
success: boolean;
errorMessage?: string;
occupancyTypes?: recordTypes.OccupancyType[];
}) => {
if (responseJSON.success) {
occupancyTypes = responseJSON.occupancyTypes;
renderOccupancyTypes();
} else {
bulmaJS.alert({
title:
"Error Moving " +
exports.aliases.occupancy +
" Type",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
}
occupancyTypeResponseHandler
);
};
@ -318,44 +277,28 @@ declare const bulmaJS: BulmaJS;
{
occupancyTypeId
},
(responseJSON: {
success: boolean;
errorMessage?: string;
occupancyTypes?: recordTypes.OccupancyType[];
}) => {
if (responseJSON.success) {
occupancyTypes = responseJSON.occupancyTypes;
renderOccupancyTypes();
} else {
bulmaJS.alert({
title:
"Error Moving " +
exports.aliases.occupancy +
" Type",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
}
occupancyTypeResponseHandler
);
};
const openEditOccupancyTypeField = (
occupancyTypeId: number,
occupancyTypeFieldId: number
) => {
const occupancyType = occupancyTypes.find((currentOccupancyType) => {
return currentOccupancyType.occupancyTypeId === occupancyTypeId;
});
const openEditOccupancyTypeField = (occupancyTypeId: number, occupancyTypeFieldId: number) => {
let occupancyTypeField: recordTypes.OccupancyTypeField;
const occupancyTypeField = occupancyType.occupancyTypeFields.find(
(currentOccupancyTypeField) => {
return (
currentOccupancyTypeField.occupancyTypeFieldId ===
occupancyTypeFieldId
);
}
);
if (occupancyTypeId) {
const occupancyType = occupancyTypes.find((currentOccupancyType) => {
return currentOccupancyType.occupancyTypeId === occupancyTypeId;
});
occupancyTypeField = occupancyType.occupancyTypeFields.find(
(currentOccupancyTypeField) => {
return currentOccupancyTypeField.occupancyTypeFieldId === occupancyTypeFieldId;
}
);
} else {
occupancyTypeField = allOccupancyTypeFields.find((currentOccupancyTypeField) => {
return currentOccupancyTypeField.occupancyTypeFieldId === occupancyTypeFieldId;
});
}
let minimumLengthElement: HTMLInputElement;
let maximumLengthElement: HTMLInputElement;
@ -391,16 +334,9 @@ declare const bulmaJS: BulmaJS;
errorMessage?: string;
occupancyTypes?: recordTypes.OccupancyType[];
}) => {
occupancyTypeResponseHandler(responseJSON);
if (responseJSON.success) {
occupancyTypes = responseJSON.occupancyTypes;
editCloseModalFunction();
renderOccupancyTypes();
} else {
bulmaJS.alert({
title: "Error Updating Field",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
}
);
@ -418,16 +354,9 @@ declare const bulmaJS: BulmaJS;
errorMessage?: string;
occupancyTypes?: recordTypes.OccupancyType[];
}) => {
occupancyTypeResponseHandler(responseJSON);
if (responseJSON.success) {
occupancyTypes = responseJSON.occupancyTypes;
editCloseModalFunction();
renderOccupancyTypes();
} else {
bulmaJS.alert({
title: "Error Deleting Field",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
}
);
@ -471,19 +400,15 @@ declare const bulmaJS: BulmaJS;
"#occupancyTypeFieldEdit--minimumLength"
);
minimumLengthElement.value =
occupancyTypeField.minimumLength.toString();
minimumLengthElement.value = occupancyTypeField.minimumLength.toString();
maximumLengthElement = modalElement.querySelector(
"#occupancyTypeFieldEdit--maximumLength"
);
maximumLengthElement.value =
occupancyTypeField.maximumLength.toString();
maximumLengthElement.value = occupancyTypeField.maximumLength.toString();
patternElement = modalElement.querySelector(
"#occupancyTypeFieldEdit--pattern"
);
patternElement = modalElement.querySelector("#occupancyTypeFieldEdit--pattern");
patternElement.value = occupancyTypeField.pattern;
@ -491,8 +416,7 @@ declare const bulmaJS: BulmaJS;
"#occupancyTypeFieldEdit--occupancyTypeFieldValues"
);
occupancyTypeFieldValuesElement.value =
occupancyTypeField.occupancyTypeFieldValues;
occupancyTypeFieldValuesElement.value = occupancyTypeField.occupancyTypeFieldValues;
toggleInputFields();
},
@ -503,20 +427,12 @@ declare const bulmaJS: BulmaJS;
bulmaJS.toggleHtmlClipped();
cityssm.enableNavBlocker();
modalElement
.querySelector("form")
.addEventListener("submit", doUpdate);
modalElement.querySelector("form").addEventListener("submit", doUpdate);
minimumLengthElement.addEventListener(
"keyup",
updateMaximumLengthMin
);
minimumLengthElement.addEventListener("keyup", updateMaximumLengthMin);
updateMaximumLengthMin();
occupancyTypeFieldValuesElement.addEventListener(
"keyup",
toggleInputFields
);
occupancyTypeFieldValuesElement.addEventListener("keyup", toggleInputFields);
modalElement
.querySelector("#button--deleteOccupancyTypeField")
@ -553,20 +469,115 @@ declare const bulmaJS: BulmaJS;
openEditOccupancyTypeField(occupancyTypeId, occupancyTypeFieldId);
};
const renderOccupancyTypeFields = (
panelElement: HTMLElement,
occupancyTypeId: number | undefined,
occupancyTypeFields: recordTypes.OccupancyTypeField[]
) => {
if (occupancyTypeFields.length === 0) {
panelElement.insertAdjacentHTML(
"beforeend",
'<div class="panel-block is-block' +
(!occupancyTypeId || expandedOccupancyTypes.has(occupancyTypeId)
? ""
: " is-hidden") +
'">' +
'<div class="message is-info">' +
'<p class="message-body">There are no additional fields.</p>' +
"</div>" +
"</div>"
);
} else {
for (const occupancyTypeField of occupancyTypeFields) {
const panelBlockElement = document.createElement("div");
panelBlockElement.className = "panel-block is-block container--occupancyTypeField";
if (occupancyTypeId && !expandedOccupancyTypes.has(occupancyTypeId)) {
panelBlockElement.classList.add("is-hidden");
}
panelBlockElement.dataset.occupancyTypeFieldId =
occupancyTypeField.occupancyTypeFieldId.toString();
panelBlockElement.innerHTML =
'<div class="level is-mobile">' +
'<div class="level-left">' +
('<div class="level-item">' +
'<a class="has-text-weight-bold button--editOccupancyTypeField" href="#">' +
cityssm.escapeHTML(occupancyTypeField.occupancyTypeField) +
"</a>" +
"</div>") +
"</div>" +
'<div class="level-right">' +
('<div class="level-item">' +
'<div class="field has-addons">' +
'<div class="control">' +
'<button class="button is-small button--moveOccupancyTypeFieldUp" data-tooltip="Move 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 is-small button--moveOccupancyTypeFieldDown" data-tooltip="Move Down" type="button" aria-label="Move Down">' +
'<i class="fas fa-arrow-down" aria-hidden="true"></i>' +
"</button>" +
"</div>" +
"</div>" +
"</div>") +
"</div>" +
"</div>";
panelBlockElement
.querySelector(".button--editOccupancyTypeField")
.addEventListener("click", openEditOccupancyTypeFieldByClick);
panelElement.append(panelBlockElement);
}
}
};
const renderOccupancyTypes = () => {
containerElement.innerHTML =
'<div class="panel container--occupancyType" id="container--allOccupancyTypeFields" data-occupancy-type-id="">' +
'<div class="panel-heading">' +
('<div class="level is-mobile">' +
('<div class="level-left">' +
'<div class="level-item"><h2 class="title is-4">(All Occupancy 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>";
renderOccupancyTypeFields(
containerElement.querySelector("#container--allOccupancyTypeFields"),
undefined,
allOccupancyTypeFields
);
containerElement
.querySelector(".button--addOccupancyTypeField")
.addEventListener("click", openAddOccupancyTypeField);
if (occupancyTypes.length === 0) {
containerElement.innerHTML =
containerElement.insertAdjacentHTML(
"afterbegin",
'<div class="message is-warning>' +
'<p class="message-body">There are no active ' +
exports.aliases.occupancy.toLowerCase() +
" types.</p>" +
"</div>";
'<p class="message-body">There are no active ' +
exports.aliases.occupancy.toLowerCase() +
" types.</p>" +
"</div>"
);
return;
}
containerElement.innerHTML = "";
for (const occupancyType of occupancyTypes) {
const occupancyTypeContainer = document.createElement("div");
@ -631,77 +642,11 @@ declare const bulmaJS: BulmaJS;
"</div>" +
"</div>";
if (occupancyType.occupancyTypeFields.length === 0) {
occupancyTypeContainer.insertAdjacentHTML(
"beforeend",
'<div class="panel-block is-block' +
(expandedOccupancyTypes.has(
occupancyType.occupancyTypeId
)
? ""
: " is-hidden") +
'">' +
'<div class="message is-info">' +
'<p class="message-body">There are no additional fields.</p>' +
"</div>" +
"</div>"
);
} else {
for (const occupancyTypeField of occupancyType.occupancyTypeFields) {
const panelBlockElement = document.createElement("div");
panelBlockElement.className =
"panel-block is-block container--occupancyTypeField";
if (
!expandedOccupancyTypes.has(
occupancyType.occupancyTypeId
)
) {
panelBlockElement.classList.add("is-hidden");
}
panelBlockElement.dataset.occupancyTypeFieldId =
occupancyTypeField.occupancyTypeFieldId.toString();
panelBlockElement.innerHTML =
'<div class="level is-mobile">' +
'<div class="level-left">' +
('<div class="level-item">' +
'<a class="has-text-weight-bold button--editOccupancyTypeField" href="#">' +
cityssm.escapeHTML(
occupancyTypeField.occupancyTypeField
) +
"</a>" +
"</div>") +
"</div>" +
'<div class="level-right">' +
('<div class="level-item">' +
'<div class="field has-addons">' +
'<div class="control">' +
'<button class="button is-small button--moveOccupancyTypeFieldUp" data-tooltip="Move 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 is-small button--moveOccupancyTypeFieldDown" data-tooltip="Move Down" type="button" aria-label="Move Down">' +
'<i class="fas fa-arrow-down" aria-hidden="true"></i>' +
"</button>" +
"</div>" +
"</div>" +
"</div>") +
"</div>" +
"</div>";
panelBlockElement
.querySelector(".button--editOccupancyTypeField")
.addEventListener(
"click",
openEditOccupancyTypeFieldByClick
);
occupancyTypeContainer.append(panelBlockElement);
}
}
renderOccupancyTypeFields(
occupancyTypeContainer,
occupancyType.occupancyTypeId,
occupancyType.occupancyTypeFields
);
occupancyTypeContainer
.querySelector(".button--toggleOccupancyTypeFields")
@ -731,64 +676,57 @@ declare const bulmaJS: BulmaJS;
}
};
document
.querySelector("#button--addOccupancyType")
.addEventListener("click", () => {
let addCloseModalFunction: () => void;
document.querySelector("#button--addOccupancyType").addEventListener("click", () => {
let addCloseModalFunction: () => void;
const doAdd = (submitEvent: SubmitEvent) => {
submitEvent.preventDefault();
const doAdd = (submitEvent: SubmitEvent) => {
submitEvent.preventDefault();
cityssm.postJSON(
urlPrefix + "/admin/doAddOccupancyType",
submitEvent.currentTarget,
(responseJSON: {
success: boolean;
errorMessage?: string;
occupancyTypes?: recordTypes.OccupancyType[];
}) => {
if (responseJSON.success) {
addCloseModalFunction();
occupancyTypes = responseJSON.occupancyTypes;
renderOccupancyTypes();
} else {
bulmaJS.alert({
title:
"Error Adding " +
exports.aliases.occupancy +
" Type",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
cityssm.postJSON(
urlPrefix + "/admin/doAddOccupancyType",
submitEvent.currentTarget,
(responseJSON: {
success: boolean;
errorMessage?: string;
occupancyTypes?: recordTypes.OccupancyType[];
}) => {
if (responseJSON.success) {
addCloseModalFunction();
occupancyTypes = responseJSON.occupancyTypes;
renderOccupancyTypes();
} else {
bulmaJS.alert({
title: "Error Adding " + exports.aliases.occupancy + " Type",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
);
};
cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyType", {
onshow: (modalElement) => {
los.populateAliases(modalElement);
},
onshown: (modalElement, closeModalFunction) => {
addCloseModalFunction = closeModalFunction;
(
modalElement.querySelector(
"#occupancyTypeAdd--occupancyType"
) as HTMLInputElement
).focus();
modalElement
.querySelector("form")
.addEventListener("submit", doAdd);
bulmaJS.toggleHtmlClipped();
},
onremoved: () => {
bulmaJS.toggleHtmlClipped();
}
});
);
};
cityssm.openHtmlModal("adminOccupancyTypes-addOccupancyType", {
onshow: (modalElement) => {
los.populateAliases(modalElement);
},
onshown: (modalElement, closeModalFunction) => {
addCloseModalFunction = closeModalFunction;
(
modalElement.querySelector(
"#occupancyTypeAdd--occupancyType"
) as HTMLInputElement
).focus();
modalElement.querySelector("form").addEventListener("submit", doAdd);
bulmaJS.toggleHtmlClipped();
},
onremoved: () => {
bulmaJS.toggleHtmlClipped();
}
});
});
renderOccupancyTypes();
})();

File diff suppressed because one or more lines are too long

View File

@ -49,6 +49,7 @@
<script>
exports.occupancyTypes = <%- JSON.stringify(occupancyTypes) %>;
exports.allOccupancyTypeFields = <%- JSON.stringify(allOccupancyTypeFields) %>;
</script>
<script src="<%= urlPrefix %>/javascripts/adminOccupancyTypes.min.js"></script>