burial site images

- make cemetery svgs and burial site images only available to logged in users
pull/3/head
Dan Gowans 2025-03-28 10:47:21 -04:00
parent 906f8c41e5
commit 66a697e097
130 changed files with 274 additions and 147 deletions

50
app.js
View File

@ -1,4 +1,5 @@
import path from 'node:path'; import path from 'node:path';
import { secondsToMillis } from '@cityssm/to-millis';
import * as dateTimeFunctions from '@cityssm/utils-datetime'; import * as dateTimeFunctions from '@cityssm/utils-datetime';
import compression from 'compression'; import compression from 'compression';
import cookieParser from 'cookie-parser'; import cookieParser from 'cookie-parser';
@ -27,7 +28,6 @@ import routerPrint from './routes/print.js';
import routerReports from './routes/reports.js'; import routerReports from './routes/reports.js';
import routerWorkOrders from './routes/workOrders.js'; import routerWorkOrders from './routes/workOrders.js';
import { version } from './version.js'; import { version } from './version.js';
import { secondsToMillis } from '@cityssm/to-millis';
const debug = Debug(`${DEBUG_NAMESPACE}:app:${process.pid}`); const debug = Debug(`${DEBUG_NAMESPACE}:app:${process.pid}`);
/* /*
* INITIALIZE APP * INITIALIZE APP
@ -65,23 +65,6 @@ app.use(rateLimit({
max: useTestDatabases ? 1_000_000 : 200, max: useTestDatabases ? 1_000_000 : 200,
windowMs: secondsToMillis(10) windowMs: secondsToMillis(10)
})); }));
/*
* STATIC ROUTES
*/
const urlPrefix = configFunctions.getConfigProperty('reverseProxy.urlPrefix');
if (urlPrefix !== '') {
debug(`urlPrefix = ${urlPrefix}`);
}
app.use(urlPrefix, express.static(path.join('public')));
app.use(`${urlPrefix}/lib/bulma`, express.static(path.join('node_modules', 'bulma', 'css')));
app.use(`${urlPrefix}/lib/bulma-tooltip`, express.static(path.join('node_modules', 'bulma-tooltip', 'dist', 'css')));
app.use(`${urlPrefix}/lib/cityssm-bulma-js/bulma-js.js`, express.static(path.join('node_modules', '@cityssm', 'bulma-js', 'dist', 'bulma-js.js')));
app.use(`${urlPrefix}/lib/cityssm-fa-glow`, express.static(path.join('node_modules', '@cityssm', 'fa-glow')));
app.use(`${urlPrefix}/lib/cityssm-bulma-sticky-table`, express.static(path.join('node_modules', '@cityssm', 'bulma-sticky-table')));
app.use(`${urlPrefix}/lib/cityssm-bulma-webapp-js`, express.static(path.join('node_modules', '@cityssm', 'bulma-webapp-js', 'dist')));
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/randomColor.js`, express.static(path.join('node_modules', 'randomcolor', 'randomColor.js')));
/* /*
* SESSION MANAGEMENT * SESSION MANAGEMENT
*/ */
@ -112,6 +95,34 @@ app.use((request, response, next) => {
} }
next(); next();
}); });
/*
* STATIC ROUTES
*/
const urlPrefix = configFunctions.getConfigProperty('reverseProxy.urlPrefix');
if (urlPrefix !== '') {
debug(`urlPrefix = ${urlPrefix}`);
}
app.use(`${urlPrefix}/internal`, (request, response, next) => {
if (Object.hasOwn(request.session, 'user') &&
Object.hasOwn(request.cookies, sessionCookieName)) {
next();
return;
}
response.sendStatus(403);
}, express.static(path.join('public-internal')));
app.use(urlPrefix, express.static(path.join('public')));
app.use(`${urlPrefix}/lib/bulma`, express.static(path.join('node_modules', 'bulma', 'css')));
app.use(`${urlPrefix}/lib/bulma-tooltip`, express.static(path.join('node_modules', 'bulma-tooltip', 'dist', 'css')));
app.use(`${urlPrefix}/lib/cityssm-bulma-js/bulma-js.js`, express.static(path.join('node_modules', '@cityssm', 'bulma-js', 'dist', 'bulma-js.js')));
app.use(`${urlPrefix}/lib/cityssm-fa-glow`, express.static(path.join('node_modules', '@cityssm', 'fa-glow')));
app.use(`${urlPrefix}/lib/cityssm-bulma-sticky-table`, express.static(path.join('node_modules', '@cityssm', 'bulma-sticky-table')));
app.use(`${urlPrefix}/lib/cityssm-bulma-webapp-js`, express.static(path.join('node_modules', '@cityssm', 'bulma-webapp-js', 'dist')));
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/randomColor.js`, express.static(path.join('node_modules', 'randomcolor', 'randomColor.js')));
/*
* ROUTES
*/
// Redirect logged in users // Redirect logged in users
const sessionChecker = (request, response, next) => { const sessionChecker = (request, response, next) => {
if (Object.hasOwn(request.session, 'user') && if (Object.hasOwn(request.session, 'user') &&
@ -122,9 +133,6 @@ const sessionChecker = (request, response, next) => {
const redirectUrl = getSafeRedirectURL(request.originalUrl); const redirectUrl = getSafeRedirectURL(request.originalUrl);
response.redirect(`${urlPrefix}/login?redirect=${encodeURIComponent(redirectUrl)}`); response.redirect(`${urlPrefix}/login?redirect=${encodeURIComponent(redirectUrl)}`);
}; };
/*
* ROUTES
*/
// Make the user and config objects available to the templates // Make the user and config objects available to the templates
app.use((request, response, next) => { app.use((request, response, next) => {
response.locals.buildNumber = version; response.locals.buildNumber = version;

106
app.ts
View File

@ -1,5 +1,6 @@
import path from 'node:path' import path from 'node:path'
import { secondsToMillis } from '@cityssm/to-millis'
import * as dateTimeFunctions from '@cityssm/utils-datetime' import * as dateTimeFunctions from '@cityssm/utils-datetime'
import compression from 'compression' import compression from 'compression'
import cookieParser from 'cookie-parser' import cookieParser from 'cookie-parser'
@ -29,7 +30,6 @@ import routerPrint from './routes/print.js'
import routerReports from './routes/reports.js' import routerReports from './routes/reports.js'
import routerWorkOrders from './routes/workOrders.js' import routerWorkOrders from './routes/workOrders.js'
import { version } from './version.js' import { version } from './version.js'
import { secondsToMillis } from '@cityssm/to-millis'
const debug = Debug(`${DEBUG_NAMESPACE}:app:${process.pid}`) const debug = Debug(`${DEBUG_NAMESPACE}:app:${process.pid}`)
@ -87,6 +87,49 @@ app.use(
}) })
) )
/*
* SESSION MANAGEMENT
*/
const sessionCookieName: string =
configFunctions.getConfigProperty('session.cookieName')
const FileStoreSession = FileStore(session)
// Initialize session
app.use(
session({
name: sessionCookieName,
cookie: {
maxAge: configFunctions.getConfigProperty('session.maxAgeMillis'),
sameSite: 'strict'
},
secret: configFunctions.getConfigProperty('session.secret'),
store: new FileStoreSession({
logFn: Debug(`${DEBUG_NAMESPACE}:session:${process.pid}`),
path: './data/sessions',
retries: 20
}),
resave: true,
rolling: true,
saveUninitialized: false
})
)
// Clear cookie if no corresponding session
app.use((request, response, next) => {
if (
Object.hasOwn(request.cookies, sessionCookieName) &&
!Object.hasOwn(request.session, 'user')
) {
response.clearCookie(sessionCookieName)
}
next()
})
/* /*
* STATIC ROUTES * STATIC ROUTES
*/ */
@ -97,6 +140,22 @@ if (urlPrefix !== '') {
debug(`urlPrefix = ${urlPrefix}`) debug(`urlPrefix = ${urlPrefix}`)
} }
app.use(
`${urlPrefix}/internal`,
(request, response, next) => {
if (
Object.hasOwn(request.session, 'user') &&
Object.hasOwn(request.cookies, sessionCookieName)
) {
next()
return
}
response.sendStatus(403)
},
express.static(path.join('public-internal'))
)
app.use(urlPrefix, express.static(path.join('public'))) app.use(urlPrefix, express.static(path.join('public')))
app.use( app.use(
@ -149,48 +208,9 @@ app.use(
) )
/* /*
* SESSION MANAGEMENT * ROUTES
*/ */
const sessionCookieName: string =
configFunctions.getConfigProperty('session.cookieName')
const FileStoreSession = FileStore(session)
// Initialize session
app.use(
session({
name: sessionCookieName,
cookie: {
maxAge: configFunctions.getConfigProperty('session.maxAgeMillis'),
sameSite: 'strict'
},
secret: configFunctions.getConfigProperty('session.secret'),
store: new FileStoreSession({
logFn: Debug(`${DEBUG_NAMESPACE}:session:${process.pid}`),
path: './data/sessions',
retries: 20
}),
resave: true,
rolling: true,
saveUninitialized: false
})
)
// Clear cookie if no corresponding session
app.use((request, response, next) => {
if (
Object.hasOwn(request.cookies, sessionCookieName) &&
!Object.hasOwn(request.session, 'user')
) {
response.clearCookie(sessionCookieName)
}
next()
})
// Redirect logged in users // Redirect logged in users
const sessionChecker = ( const sessionChecker = (
request: express.Request, request: express.Request,
@ -212,10 +232,6 @@ const sessionChecker = (
) )
} }
/*
* ROUTES
*/
// Make the user and config objects available to the templates // Make the user and config objects available to the templates
app.use((request, response, next) => { app.use((request, response, next) => {

View File

@ -6,6 +6,7 @@ export interface AddBurialSiteForm {
burialSiteNameSegment5?: string; burialSiteNameSegment5?: string;
burialSiteStatusId: number | string; burialSiteStatusId: number | string;
burialSiteTypeId: number | string; burialSiteTypeId: number | string;
burialSiteImage: string;
cemeteryId: number | string; cemeteryId: number | string;
cemeterySvgId: string; cemeterySvgId: string;
burialSiteLatitude: string; burialSiteLatitude: string;

View File

@ -37,7 +37,7 @@ export default async function addBurialSite(burialSiteForm, user) {
burialSiteNameSegment5, burialSiteNameSegment5,
burialSiteName, burialSiteName,
burialSiteTypeId, burialSiteStatusId, burialSiteTypeId, burialSiteStatusId,
cemeteryId, cemeterySvgId, cemeteryId, cemeterySvgId, burialSiteImage,
burialSiteLatitude, burialSiteLongitude, burialSiteLatitude, burialSiteLongitude,
recordCreate_userName, recordCreate_timeMillis, recordCreate_userName, recordCreate_timeMillis,
@ -47,7 +47,7 @@ export default async function addBurialSite(burialSiteForm, user) {
?, ?, ?, ?)`) ?, ?, ?, ?)`)
.run(burialSiteForm.burialSiteNameSegment1, burialSiteForm.burialSiteNameSegment2 ?? '', burialSiteForm.burialSiteNameSegment3 ?? '', burialSiteForm.burialSiteNameSegment4 ?? '', burialSiteForm.burialSiteNameSegment5 ?? '', burialSiteName, burialSiteForm.burialSiteTypeId, burialSiteForm.burialSiteStatusId === '' .run(burialSiteForm.burialSiteNameSegment1, burialSiteForm.burialSiteNameSegment2 ?? '', burialSiteForm.burialSiteNameSegment3 ?? '', burialSiteForm.burialSiteNameSegment4 ?? '', burialSiteForm.burialSiteNameSegment5 ?? '', burialSiteName, burialSiteForm.burialSiteTypeId, burialSiteForm.burialSiteStatusId === ''
? undefined ? undefined
: burialSiteForm.burialSiteStatusId, burialSiteForm.cemeteryId === '' ? undefined : burialSiteForm.cemeteryId, burialSiteForm.cemeterySvgId, burialSiteForm.burialSiteLatitude === '' : burialSiteForm.burialSiteStatusId, burialSiteForm.cemeteryId === '' ? undefined : burialSiteForm.cemeteryId, burialSiteForm.cemeterySvgId, burialSiteForm.burialSiteImage, burialSiteForm.burialSiteLatitude === ''
? undefined ? undefined
: burialSiteForm.burialSiteLatitude, burialSiteForm.burialSiteLongitude === '' : burialSiteForm.burialSiteLatitude, burialSiteForm.burialSiteLongitude === ''
? undefined ? undefined

View File

@ -14,6 +14,7 @@ export interface AddBurialSiteForm {
burialSiteStatusId: number | string burialSiteStatusId: number | string
burialSiteTypeId: number | string burialSiteTypeId: number | string
burialSiteImage: string
cemeteryId: number | string cemeteryId: number | string
cemeterySvgId: string cemeterySvgId: string
@ -77,7 +78,7 @@ export default async function addBurialSite(
burialSiteNameSegment5, burialSiteNameSegment5,
burialSiteName, burialSiteName,
burialSiteTypeId, burialSiteStatusId, burialSiteTypeId, burialSiteStatusId,
cemeteryId, cemeterySvgId, cemeteryId, cemeterySvgId, burialSiteImage,
burialSiteLatitude, burialSiteLongitude, burialSiteLatitude, burialSiteLongitude,
recordCreate_userName, recordCreate_timeMillis, recordCreate_userName, recordCreate_timeMillis,
@ -99,6 +100,7 @@ export default async function addBurialSite(
: burialSiteForm.burialSiteStatusId, : burialSiteForm.burialSiteStatusId,
burialSiteForm.cemeteryId === '' ? undefined : burialSiteForm.cemeteryId, burialSiteForm.cemeteryId === '' ? undefined : burialSiteForm.cemeteryId,
burialSiteForm.cemeterySvgId, burialSiteForm.cemeterySvgId,
burialSiteForm.burialSiteImage,
burialSiteForm.burialSiteLatitude === '' burialSiteForm.burialSiteLatitude === ''
? undefined ? undefined
: burialSiteForm.burialSiteLatitude, : burialSiteForm.burialSiteLatitude,

View File

@ -12,7 +12,7 @@ const baseSQL = `select l.burialSiteId,
l.burialSiteName, l.burialSiteName,
l.burialSiteStatusId, s.burialSiteStatus, l.burialSiteStatusId, s.burialSiteStatus,
l.cemeteryId, m.cemeteryName, l.cemeteryId, m.cemeteryName,
m.cemeterySvg, l.cemeterySvgId, m.cemeterySvg, l.cemeterySvgId, l.burialSiteImage,
l.burialSiteLatitude, l.burialSiteLongitude l.burialSiteLatitude, l.burialSiteLongitude
from BurialSites l from BurialSites l

View File

@ -15,7 +15,7 @@ const baseSQL = `select l.burialSiteId,
l.burialSiteName, l.burialSiteName,
l.burialSiteStatusId, s.burialSiteStatus, l.burialSiteStatusId, s.burialSiteStatus,
l.cemeteryId, m.cemeteryName, l.cemeteryId, m.cemeteryName,
m.cemeterySvg, l.cemeterySvgId, m.cemeterySvg, l.cemeterySvgId, l.burialSiteImage,
l.burialSiteLatitude, l.burialSiteLongitude l.burialSiteLatitude, l.burialSiteLongitude
from BurialSites l from BurialSites l

View File

@ -88,6 +88,8 @@ const createStatements = [
cemeteryId integer, cemeteryId integer,
cemeterySvgId varchar(100), cemeterySvgId varchar(100),
burialSiteImage varchar(100) not null default '',
burialSiteLatitude decimal(10, 8) burialSiteLatitude decimal(10, 8)
check (burialSiteLatitude between -90 and 90), check (burialSiteLatitude between -90 and 90),
burialSiteLongitude decimal(11, 8) burialSiteLongitude decimal(11, 8)

View File

@ -105,6 +105,8 @@ const createStatements = [
cemeteryId integer, cemeteryId integer,
cemeterySvgId varchar(100), cemeterySvgId varchar(100),
burialSiteImage varchar(100) not null default '',
burialSiteLatitude decimal(10, 8) burialSiteLatitude decimal(10, 8)
check (burialSiteLatitude between -90 and 90), check (burialSiteLatitude between -90 and 90),
burialSiteLongitude decimal(11, 8) burialSiteLongitude decimal(11, 8)

View File

@ -7,6 +7,7 @@ export interface UpdateBurialSiteForm {
burialSiteNameSegment5?: string; burialSiteNameSegment5?: string;
burialSiteStatusId: number | string; burialSiteStatusId: number | string;
burialSiteTypeId: number | string; burialSiteTypeId: number | string;
burialSiteImage: string;
cemeteryId: number | string; cemeteryId: number | string;
cemeterySvgId: string; cemeterySvgId: string;
burialSiteLatitude: string; burialSiteLatitude: string;

View File

@ -41,6 +41,7 @@ export default async function updateBurialSite(updateForm, user) {
burialSiteStatusId = ?, burialSiteStatusId = ?,
cemeteryId = ?, cemeteryId = ?,
cemeterySvgId = ?, cemeterySvgId = ?,
burialSiteImage = ?,
burialSiteLatitude = ?, burialSiteLatitude = ?,
burialSiteLongitude = ?, burialSiteLongitude = ?,
recordUpdate_userName = ?, recordUpdate_userName = ?,
@ -49,7 +50,7 @@ export default async function updateBurialSite(updateForm, user) {
and recordDelete_timeMillis is null`) and recordDelete_timeMillis is null`)
.run(updateForm.burialSiteNameSegment1 ?? '', updateForm.burialSiteNameSegment2 ?? '', updateForm.burialSiteNameSegment3 ?? '', updateForm.burialSiteNameSegment4 ?? '', updateForm.burialSiteNameSegment5 ?? '', burialSiteName, updateForm.burialSiteTypeId, updateForm.burialSiteStatusId === '' .run(updateForm.burialSiteNameSegment1 ?? '', updateForm.burialSiteNameSegment2 ?? '', updateForm.burialSiteNameSegment3 ?? '', updateForm.burialSiteNameSegment4 ?? '', updateForm.burialSiteNameSegment5 ?? '', burialSiteName, updateForm.burialSiteTypeId, updateForm.burialSiteStatusId === ''
? undefined ? undefined
: updateForm.burialSiteStatusId, updateForm.cemeteryId === '' ? undefined : updateForm.cemeteryId, updateForm.cemeterySvgId, updateForm.burialSiteLatitude === '' : updateForm.burialSiteStatusId, updateForm.cemeteryId === '' ? undefined : updateForm.cemeteryId, updateForm.cemeterySvgId, updateForm.burialSiteImage, updateForm.burialSiteLatitude === ''
? undefined ? undefined
: updateForm.burialSiteLatitude, updateForm.burialSiteLongitude === '' : updateForm.burialSiteLatitude, updateForm.burialSiteLongitude === ''
? undefined ? undefined

View File

@ -17,6 +17,7 @@ export interface UpdateBurialSiteForm {
burialSiteStatusId: number | string burialSiteStatusId: number | string
burialSiteTypeId: number | string burialSiteTypeId: number | string
burialSiteImage: string
cemeteryId: number | string cemeteryId: number | string
cemeterySvgId: string cemeterySvgId: string
@ -78,6 +79,7 @@ export default async function updateBurialSite(
burialSiteStatusId = ?, burialSiteStatusId = ?,
cemeteryId = ?, cemeteryId = ?,
cemeterySvgId = ?, cemeterySvgId = ?,
burialSiteImage = ?,
burialSiteLatitude = ?, burialSiteLatitude = ?,
burialSiteLongitude = ?, burialSiteLongitude = ?,
recordUpdate_userName = ?, recordUpdate_userName = ?,
@ -98,6 +100,7 @@ export default async function updateBurialSite(
: updateForm.burialSiteStatusId, : updateForm.burialSiteStatusId,
updateForm.cemeteryId === '' ? undefined : updateForm.cemeteryId, updateForm.cemeteryId === '' ? undefined : updateForm.cemeteryId,
updateForm.cemeterySvgId, updateForm.cemeterySvgId,
updateForm.burialSiteImage,
updateForm.burialSiteLatitude === '' updateForm.burialSiteLatitude === ''
? undefined ? undefined
: updateForm.burialSiteLatitude, : updateForm.burialSiteLatitude,

View File

@ -2,6 +2,7 @@ import getBurialSite from '../../database/getBurialSite.js';
import getCemeteries from '../../database/getCemeteries.js'; import getCemeteries from '../../database/getCemeteries.js';
import { getConfigProperty } from '../../helpers/config.helpers.js'; import { getConfigProperty } from '../../helpers/config.helpers.js';
import { getBurialSiteStatuses, getBurialSiteTypes } from '../../helpers/functions.cache.js'; import { getBurialSiteStatuses, getBurialSiteTypes } from '../../helpers/functions.cache.js';
import { getBurialSiteImages } from '../../helpers/images.helpers.js';
export default async function handler(request, response) { export default async function handler(request, response) {
const burialSite = await getBurialSite(request.params.burialSiteId); const burialSite = await getBurialSite(request.params.burialSiteId);
if (burialSite === undefined) { if (burialSite === undefined) {
@ -9,14 +10,16 @@ export default async function handler(request, response) {
return; return;
} }
const cemeteries = await getCemeteries(); const cemeteries = await getCemeteries();
const burialSiteImages = await getBurialSiteImages();
const burialSiteTypes = await getBurialSiteTypes(); const burialSiteTypes = await getBurialSiteTypes();
const burialSiteStatuses = await getBurialSiteStatuses(); const burialSiteStatuses = await getBurialSiteStatuses();
response.render('burialSite-edit', { response.render('burialSite-edit', {
headTitle: burialSite.burialSiteName, headTitle: burialSite.burialSiteName,
burialSite, burialSite,
isCreate: false, isCreate: false,
cemeteries, burialSiteImages,
burialSiteStatuses,
burialSiteTypes, burialSiteTypes,
burialSiteStatuses cemeteries
}); });
} }

View File

@ -7,6 +7,7 @@ import {
getBurialSiteStatuses, getBurialSiteStatuses,
getBurialSiteTypes getBurialSiteTypes
} from '../../helpers/functions.cache.js' } from '../../helpers/functions.cache.js'
import { getBurialSiteImages } from '../../helpers/images.helpers.js'
export default async function handler( export default async function handler(
request: Request, request: Request,
@ -22,15 +23,19 @@ export default async function handler(
} }
const cemeteries = await getCemeteries() const cemeteries = await getCemeteries()
const burialSiteImages = await getBurialSiteImages()
const burialSiteTypes = await getBurialSiteTypes() const burialSiteTypes = await getBurialSiteTypes()
const burialSiteStatuses = await getBurialSiteStatuses() const burialSiteStatuses = await getBurialSiteStatuses()
response.render('burialSite-edit', { response.render('burialSite-edit', {
headTitle: burialSite.burialSiteName, headTitle: burialSite.burialSiteName,
burialSite, burialSite,
isCreate: false, isCreate: false,
cemeteries,
burialSiteImages,
burialSiteStatuses,
burialSiteTypes, burialSiteTypes,
burialSiteStatuses cemeteries
}) })
} }

View File

@ -1,5 +1,6 @@
import getCemeteries from '../../database/getCemeteries.js'; import getCemeteries from '../../database/getCemeteries.js';
import { getBurialSiteStatuses, getBurialSiteTypes } from '../../helpers/functions.cache.js'; import { getBurialSiteStatuses, getBurialSiteTypes } from '../../helpers/functions.cache.js';
import { getBurialSiteImages } from '../../helpers/images.helpers.js';
export default async function handler(request, response) { export default async function handler(request, response) {
const burialSite = { const burialSite = {
burialSiteId: -1, burialSiteId: -1,
@ -14,14 +15,16 @@ export default async function handler(request, response) {
burialSite.cemeteryName = cemetery.cemeteryName; burialSite.cemeteryName = cemetery.cemeteryName;
} }
} }
const burialSiteImages = await getBurialSiteImages();
const burialSiteTypes = await getBurialSiteTypes(); const burialSiteTypes = await getBurialSiteTypes();
const burialSiteStatuses = await getBurialSiteStatuses(); const burialSiteStatuses = await getBurialSiteStatuses();
response.render('burialSite-edit', { response.render('burialSite-edit', {
headTitle: 'Create a New Burial Site', headTitle: 'Create a New Burial Site',
burialSite, burialSite,
isCreate: true, isCreate: true,
cemeteries, burialSiteImages,
burialSiteStatuses,
burialSiteTypes, burialSiteTypes,
burialSiteStatuses cemeteries,
}); });
} }

View File

@ -5,6 +5,7 @@ import {
getBurialSiteStatuses, getBurialSiteStatuses,
getBurialSiteTypes getBurialSiteTypes
} from '../../helpers/functions.cache.js' } from '../../helpers/functions.cache.js'
import { getBurialSiteImages } from '../../helpers/images.helpers.js'
import type { BurialSite } from '../../types/recordTypes.js' import type { BurialSite } from '../../types/recordTypes.js'
export default async function handler( export default async function handler(
@ -31,15 +32,19 @@ export default async function handler(
} }
} }
const burialSiteImages = await getBurialSiteImages()
const burialSiteTypes = await getBurialSiteTypes() const burialSiteTypes = await getBurialSiteTypes()
const burialSiteStatuses = await getBurialSiteStatuses() const burialSiteStatuses = await getBurialSiteStatuses()
response.render('burialSite-edit', { response.render('burialSite-edit', {
headTitle: 'Create a New Burial Site', headTitle: 'Create a New Burial Site',
burialSite, burialSite,
isCreate: true, isCreate: true,
cemeteries,
burialSiteImages,
burialSiteStatuses,
burialSiteTypes, burialSiteTypes,
burialSiteStatuses cemeteries,
}) })
} }

View File

@ -22,6 +22,7 @@ export default async function handler(
response.render('burialSite-view', { response.render('burialSite-view', {
headTitle: burialSite.burialSiteName, headTitle: burialSite.burialSiteName,
burialSite burialSite
}) })

View File

@ -1,8 +1,8 @@
import getBurialSiteStatusSummary from '../../database/getBurialSiteStatusSummary.js'; import getBurialSiteStatusSummary from '../../database/getBurialSiteStatusSummary.js';
import getBurialSiteTypeSummary from '../../database/getBurialSiteTypeSummary.js'; import getBurialSiteTypeSummary from '../../database/getBurialSiteTypeSummary.js';
import getCemetery from '../../database/getCemetery.js'; import getCemetery from '../../database/getCemetery.js';
import { getCemeterySVGs } from '../../helpers/cemeteries.helpers.js';
import { getConfigProperty } from '../../helpers/config.helpers.js'; import { getConfigProperty } from '../../helpers/config.helpers.js';
import { getCemeterySVGs } from '../../helpers/images.helpers.js';
export default async function handler(request, response) { export default async function handler(request, response) {
const cemetery = await getCemetery(request.params.cemeteryId); const cemetery = await getCemetery(request.params.cemeteryId);
if (cemetery === undefined) { if (cemetery === undefined) {
@ -18,10 +18,10 @@ export default async function handler(request, response) {
}); });
response.render('cemetery-edit', { response.render('cemetery-edit', {
headTitle: cemetery.cemeteryName, headTitle: cemetery.cemeteryName,
isCreate: false,
cemetery, cemetery,
cemeterySVGs, cemeterySVGs,
burialSiteTypeSummary, isCreate: false,
burialSiteStatusSummary burialSiteStatusSummary,
burialSiteTypeSummary
}); });
} }

View File

@ -3,8 +3,8 @@ import type { Request, Response } from 'express'
import getBurialSiteStatusSummary from '../../database/getBurialSiteStatusSummary.js' import getBurialSiteStatusSummary from '../../database/getBurialSiteStatusSummary.js'
import getBurialSiteTypeSummary from '../../database/getBurialSiteTypeSummary.js' import getBurialSiteTypeSummary from '../../database/getBurialSiteTypeSummary.js'
import getCemetery from '../../database/getCemetery.js' import getCemetery from '../../database/getCemetery.js'
import { getCemeterySVGs } from '../../helpers/cemeteries.helpers.js'
import { getConfigProperty } from '../../helpers/config.helpers.js' import { getConfigProperty } from '../../helpers/config.helpers.js'
import { getCemeterySVGs } from '../../helpers/images.helpers.js'
export default async function handler( export default async function handler(
request: Request, request: Request,
@ -31,10 +31,12 @@ export default async function handler(
response.render('cemetery-edit', { response.render('cemetery-edit', {
headTitle: cemetery.cemeteryName, headTitle: cemetery.cemeteryName,
isCreate: false,
cemetery, cemetery,
cemeterySVGs, cemeterySVGs,
burialSiteTypeSummary, isCreate: false,
burialSiteStatusSummary
burialSiteStatusSummary,
burialSiteTypeSummary
}) })
} }

View File

@ -1,5 +1,5 @@
import { getCemeterySVGs } from '../../helpers/cemeteries.helpers.js';
import { getConfigProperty } from '../../helpers/config.helpers.js'; import { getConfigProperty } from '../../helpers/config.helpers.js';
import { getCemeterySVGs } from '../../helpers/images.helpers.js';
export default async function handler(_request, response) { export default async function handler(_request, response) {
const cemetery = { const cemetery = {
cemeteryCity: getConfigProperty('settings.cityDefault'), cemeteryCity: getConfigProperty('settings.cityDefault'),
@ -8,8 +8,8 @@ export default async function handler(_request, response) {
const cemeterySVGs = await getCemeterySVGs(); const cemeterySVGs = await getCemeterySVGs();
response.render('cemetery-edit', { response.render('cemetery-edit', {
headTitle: "Create a Cemetery", headTitle: "Create a Cemetery",
isCreate: true,
cemetery, cemetery,
cemeterySVGs cemeterySVGs,
isCreate: true,
}); });
} }

View File

@ -1,7 +1,7 @@
import type { Request, Response } from 'express' import type { Request, Response } from 'express'
import { getCemeterySVGs } from '../../helpers/cemeteries.helpers.js'
import { getConfigProperty } from '../../helpers/config.helpers.js' import { getConfigProperty } from '../../helpers/config.helpers.js'
import { getCemeterySVGs } from '../../helpers/images.helpers.js'
import type { Cemetery } from '../../types/recordTypes.js' import type { Cemetery } from '../../types/recordTypes.js'
export default async function handler( export default async function handler(
@ -17,8 +17,9 @@ export default async function handler(
response.render('cemetery-edit', { response.render('cemetery-edit', {
headTitle: "Create a Cemetery", headTitle: "Create a Cemetery",
isCreate: true,
cemetery, cemetery,
cemeterySVGs cemeterySVGs,
isCreate: true,
}) })
} }

View File

@ -1 +0,0 @@
export declare function getCemeterySVGs(): Promise<string[]>;

View File

@ -1,15 +0,0 @@
import fs from 'node:fs/promises';
let cemeterySVGs;
export async function getCemeterySVGs() {
if (cemeterySVGs === undefined) {
const files = await fs.readdir('./public/images/cemeteries/');
const SVGs = [];
for (const file of files) {
if (file.toLowerCase().endsWith('.svg')) {
SVGs.push(file);
}
}
cemeterySVGs = SVGs;
}
return cemeterySVGs;
}

View File

@ -1,21 +0,0 @@
import fs from 'node:fs/promises'
let cemeterySVGs: string[] | undefined
export async function getCemeterySVGs(): Promise<string[]> {
if (cemeterySVGs === undefined) {
const files = await fs.readdir('./public/images/cemeteries/')
const SVGs: string[] = []
for (const file of files) {
if (file.toLowerCase().endsWith('.svg')) {
SVGs.push(file)
}
}
cemeterySVGs = SVGs
}
return cemeterySVGs
}

2
helpers/images.helpers.d.ts vendored 100644
View File

@ -0,0 +1,2 @@
export declare function getBurialSiteImages(): Promise<string[]>;
export declare function getCemeterySVGs(): Promise<string[]>;

View File

@ -0,0 +1,32 @@
import fs from 'node:fs/promises';
let burialSiteImages;
export async function getBurialSiteImages() {
if (burialSiteImages === undefined) {
const files = await fs.readdir('./public-internal/images/burialSites/');
const images = [];
for (const file of files) {
const lowerCaseFileName = file.toLowerCase();
if (lowerCaseFileName.endsWith('.jpg') ||
lowerCaseFileName.endsWith('.jpeg') ||
lowerCaseFileName.endsWith('.png')) {
images.push(file);
}
}
burialSiteImages = images;
}
return burialSiteImages;
}
let cemeterySVGs;
export async function getCemeterySVGs() {
if (cemeterySVGs === undefined) {
const files = await fs.readdir('./public-internal/images/cemeteries/');
const SVGs = [];
for (const file of files) {
if (file.toLowerCase().endsWith('.svg')) {
SVGs.push(file);
}
}
cemeterySVGs = SVGs;
}
return cemeterySVGs;
}

View File

@ -0,0 +1,46 @@
import fs from 'node:fs/promises'
let burialSiteImages: string[] | undefined
export async function getBurialSiteImages(): Promise<string[]> {
if (burialSiteImages === undefined) {
const files = await fs.readdir('./public-internal/images/burialSites/')
const images: string[] = []
for (const file of files) {
const lowerCaseFileName = file.toLowerCase()
if (
lowerCaseFileName.endsWith('.jpg') ||
lowerCaseFileName.endsWith('.jpeg') ||
lowerCaseFileName.endsWith('.png')
) {
images.push(file)
}
}
burialSiteImages = images
}
return burialSiteImages
}
let cemeterySVGs: string[] | undefined
export async function getCemeterySVGs(): Promise<string[]> {
if (cemeterySVGs === undefined) {
const files = await fs.readdir('./public-internal/images/cemeteries/')
const SVGs: string[] = []
for (const file of files) {
if (file.toLowerCase().endsWith('.svg')) {
SVGs.push(file)
}
}
cemeterySVGs = SVGs
}
return cemeterySVGs
}

View File

@ -62,7 +62,6 @@
"leaflet": "^1.9.4", "leaflet": "^1.9.4",
"node-cache": "^5.1.2", "node-cache": "^5.1.2",
"papaparse": "^5.5.2", "papaparse": "^5.5.2",
"puppeteer": "^19.4.1",
"randomcolor": "^0.6.2", "randomcolor": "^0.6.2",
"session-file-store": "^1.5.0", "session-file-store": "^1.5.0",
"set-interval-async": "^3.0.3" "set-interval-async": "^3.0.3"
@ -96,6 +95,7 @@
"prettier-config-cityssm": "^1.0.0" "prettier-config-cityssm": "^1.0.0"
}, },
"optionalDependencies": { "optionalDependencies": {
"node-windows": "^1.0.0-beta.8" "node-windows": "^1.0.0-beta.8",
"puppeteer": "^19.4.1"
} }
} }

View File

@ -0,0 +1 @@
Files placed in this folder are only available to logged in users.

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

View File

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 1.4 MiB

View File

Before

Width:  |  Height:  |  Size: 416 KiB

After

Width:  |  Height:  |  Size: 416 KiB

View File

Before

Width:  |  Height:  |  Size: 888 KiB

After

Width:  |  Height:  |  Size: 888 KiB

View File

Before

Width:  |  Height:  |  Size: 239 KiB

After

Width:  |  Height:  |  Size: 239 KiB

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