pull/11/head
Dan Gowans 2025-03-31 14:59:31 -04:00
parent 4a1f6b42b0
commit b2da12dac1
41 changed files with 1574 additions and 1406 deletions

3
.ncurc.json 100644
View File

@ -0,0 +1,3 @@
{
"reject": ["puppeteer"]
}

View File

@ -31,6 +31,15 @@ Sunrise CMS does not need an expensive server to run.
No separate database server is required either. No separate database server is required either.
The whole application could run on a current, modest workstation. The whole application could run on a current, modest workstation.
### ✔️ Track Unlimited Cemeteries and Burial Sites
There are no limits to the number of records that can be tracked in Sunrise CMS.
### ✔️ Includes a Built-In Work Order System
In addition to tracking data related to cemetery plots,
Sunrise CMS can also track work order activities, like grave maintenance.
### ✔️ Sunrise CMS is Free and Open Source ### ✔️ Sunrise CMS is Free and Open Source
There's no cost to use it. There's no cost to use it.

View File

@ -1,5 +1,5 @@
import type { Request, Response } from 'express'; import type { Request, Response } from 'express';
export default function handler(request: Request<unknown, unknown, { export default function handler(request: Request<unknown, unknown, {
burialSiteStatus: string; burialSiteStatus: string;
orderNumber?: string | number; orderNumber?: number | string;
}>, response: Response): Promise<void>; }>, response: Response): Promise<void>;

View File

@ -5,7 +5,7 @@ export default async function handler(request, response) {
const burialSiteStatuses = await getBurialSiteStatuses(); const burialSiteStatuses = await getBurialSiteStatuses();
response.json({ response.json({
success: true, success: true,
burialSiteStatusId, burialSiteStatuses,
burialSiteStatuses burialSiteStatusId
}); });
} }

View File

@ -7,7 +7,7 @@ export default async function handler(
request: Request< request: Request<
unknown, unknown,
unknown, unknown,
{ burialSiteStatus: string; orderNumber?: string | number } { burialSiteStatus: string; orderNumber?: number | string }
>, >,
response: Response response: Response
): Promise<void> { ): Promise<void> {
@ -22,7 +22,8 @@ export default async function handler(
response.json({ response.json({
success: true, success: true,
burialSiteStatusId,
burialSiteStatuses burialSiteStatuses,
burialSiteStatusId
}) })
} }

View File

@ -1,5 +1,5 @@
import type { Request, Response } from 'express'; import type { Request, Response } from 'express';
export default function handler(request: Request<unknown, unknown, { export default function handler(request: Request<unknown, unknown, {
burialSiteType: string; burialSiteType: string;
orderNumber?: string | number; orderNumber?: number | string;
}>, response: Response): Promise<void>; }>, response: Response): Promise<void>;

View File

@ -7,7 +7,7 @@ export default async function handler(
request: Request< request: Request<
unknown, unknown,
unknown, unknown,
{ burialSiteType: string; orderNumber?: string | number } { burialSiteType: string; orderNumber?: number | string }
>, >,
response: Response response: Response
): Promise<void> { ): Promise<void> {
@ -22,6 +22,7 @@ export default async function handler(
response.json({ response.json({
success: true, success: true,
burialSiteTypeId, burialSiteTypeId,
burialSiteTypes burialSiteTypes
}) })

View File

@ -18,6 +18,7 @@ export default async function handler(
response.json({ response.json({
success: true, success: true,
burialSiteTypeFieldId, burialSiteTypeFieldId,
burialSiteTypes burialSiteTypes
}) })

View File

@ -6,8 +6,8 @@ export default async function handler(request, response) {
const allContractTypeFields = await getAllContractTypeFields(); const allContractTypeFields = await getAllContractTypeFields();
response.json({ response.json({
success: true, success: true,
allContractTypeFields,
contractTypeId, contractTypeId,
contractTypes, contractTypes
allContractTypeFields
}); });
} }

View File

@ -22,8 +22,9 @@ export default async function handler(
response.json({ response.json({
success: true, success: true,
allContractTypeFields,
contractTypeId, contractTypeId,
contractTypes, contractTypes
allContractTypeFields
}) })
} }

View File

@ -192,11 +192,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
<strong>Birth:</strong> <strong>Birth:</strong>
</div> </div>
<div class="column"> <div class="column">
${cityssm.escapeHTML(interment.birthDateString ?? '(No Birth Date)')}<br /> ${cityssm.escapeHTML((interment.birthDateString ?? '') === ''
? '(No Birth Date)'
: interment.birthDateString ?? '')}<br />
${cityssm.escapeHTML(interment.birthPlace ?? '(No Birth Place)')} ${cityssm.escapeHTML(interment.birthPlace ?? '(No Birth Place)')}
</div> </div>
</div> </div>
<div class="columns"> <div class="columns mb-0">
<div class="column"> <div class="column">
<strong>Death:</strong> <strong>Death:</strong>
</div> </div>
@ -205,12 +207,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
${cityssm.escapeHTML(interment.deathPlace ?? '(No Death Place)')} ${cityssm.escapeHTML(interment.deathPlace ?? '(No Death Place)')}
</div> </div>
</div> </div>
<div class="columns"> <div class="columns mb-0">
<div class="column"> <div class="column">
<strong>Age:</strong> <strong>Age:</strong>
</div> </div>
<div class="column"> <div class="column">
${cityssm.escapeHTML((interment.deathAge ?? '') === '' ? '(No Age)' : interment.deathAge?.toString() ?? '')}<br /> ${cityssm.escapeHTML((interment.deathAge ?? '') === '' ? '(No Age)' : interment.deathAge?.toString() ?? '')}
${cityssm.escapeHTML(interment.deathAgePeriod ?? '')} ${cityssm.escapeHTML(interment.deathAgePeriod ?? '')}
</div> </div>
</div> </div>

View File

@ -291,11 +291,15 @@ declare const exports: Record<string, unknown>
<strong>Birth:</strong> <strong>Birth:</strong>
</div> </div>
<div class="column"> <div class="column">
${cityssm.escapeHTML(interment.birthDateString ?? '(No Birth Date)')}<br /> ${cityssm.escapeHTML(
(interment.birthDateString ?? '') === ''
? '(No Birth Date)'
: interment.birthDateString ?? ''
)}<br />
${cityssm.escapeHTML(interment.birthPlace ?? '(No Birth Place)')} ${cityssm.escapeHTML(interment.birthPlace ?? '(No Birth Place)')}
</div> </div>
</div> </div>
<div class="columns"> <div class="columns mb-0">
<div class="column"> <div class="column">
<strong>Death:</strong> <strong>Death:</strong>
</div> </div>
@ -304,12 +308,12 @@ declare const exports: Record<string, unknown>
${cityssm.escapeHTML(interment.deathPlace ?? '(No Death Place)')} ${cityssm.escapeHTML(interment.deathPlace ?? '(No Death Place)')}
</div> </div>
</div> </div>
<div class="columns"> <div class="columns mb-0">
<div class="column"> <div class="column">
<strong>Age:</strong> <strong>Age:</strong>
</div> </div>
<div class="column"> <div class="column">
${cityssm.escapeHTML((interment.deathAge ?? '') === '' ? '(No Age)' : interment.deathAge?.toString() ?? '')}<br /> ${cityssm.escapeHTML((interment.deathAge ?? '') === '' ? '(No Age)' : interment.deathAge?.toString() ?? '')}
${cityssm.escapeHTML(interment.deathAgePeriod ?? '')} ${cityssm.escapeHTML(interment.deathAgePeriod ?? '')}
</div> </div>
</div> </div>

View File

@ -103,10 +103,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
actualSeedString += 'a1'; actualSeedString += 'a1';
} }
return exports.randomColor({ return exports.randomColor({
seed: actualSeedString + actualSeedString,
hue: hues[actualSeedString.codePointAt(actualSeedString.length - 1) % hue: hues[actualSeedString.codePointAt(actualSeedString.length - 1) %
hues.length], hues.length],
luminosity: luminosity[actualSeedString.codePointAt(actualSeedString.length - 2) % luminosity.length] luminosity: luminosity[actualSeedString.codePointAt(actualSeedString.length - 2) % luminosity.length],
seed: actualSeedString + actualSeedString
}); });
} }
/* /*
@ -202,24 +202,24 @@ Object.defineProperty(exports, "__esModule", { value: true });
* Declare sunrise * Declare sunrise
*/ */
const sunrise = { const sunrise = {
urlPrefix,
apiKey: document.querySelector('main')?.dataset.apiKey ?? '', apiKey: document.querySelector('main')?.dataset.apiKey ?? '',
dynamicsGPIntegrationIsEnabled, dynamicsGPIntegrationIsEnabled,
urlPrefix,
highlightMap, highlightMap,
initializeUnlockFieldButtons, initializeUnlockFieldButtons,
populateAliases,
escapedAliases, escapedAliases,
populateAliases,
getRandomColor, getRandomColor,
setUnsavedChanges,
clearUnsavedChanges, clearUnsavedChanges,
hasUnsavedChanges, hasUnsavedChanges,
getMoveUpDownButtonFieldHTML, setUnsavedChanges,
getLoadingParagraphHTML, getLoadingParagraphHTML,
getMoveUpDownButtonFieldHTML,
getSearchResultsPagerHTML, getSearchResultsPagerHTML,
getCemeteryURL,
getBurialSiteURL, getBurialSiteURL,
getFuneralHomeURL, getCemeteryURL,
getContractURL, getContractURL,
getFuneralHomeURL,
getWorkOrderURL getWorkOrderURL
}; };
exports.sunrise = sunrise; exports.sunrise = sunrise;

View File

@ -3,26 +3,26 @@ import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types.js'
import type { Sunrise } from './types.js' import type { Sunrise } from './types.js'
type RandomColorHue = type RandomColorHue =
| 'red'
| 'orange'
| 'yellow'
| 'green'
| 'blue' | 'blue'
| 'purple' | 'green'
| 'pink'
| 'monochrome' | 'monochrome'
type RandomColorLuminosity = 'bright' | 'light' | 'dark' | 'orange'
| 'pink'
| 'purple'
| 'red'
| 'yellow'
type RandomColorLuminosity = 'bright' | 'dark' | 'light'
declare const cityssm: cityssmGlobal declare const cityssm: cityssmGlobal
declare const exports: Record<string, unknown> & { declare const exports: Record<string, unknown> & {
aliases: Record<string, string> aliases: Record<string, string>
randomColor: (options?: { randomColor: (options?: {
alpha?: number
count?: number
format?: 'hex' | 'hsl' | 'hsla' | 'hslArray' | 'rgb' | 'rgba' | 'rgbArray'
hue?: RandomColorHue hue?: RandomColorHue
luminosity?: RandomColorLuminosity luminosity?: RandomColorLuminosity
count?: number
seed?: number | string seed?: number | string
format?: 'rgb' | 'rgba' | 'rgbArray' | 'hsl' | 'hsla' | 'hslArray' | 'hex'
alpha?: number
}) => string }) => string
} }
;(() => { ;(() => {
@ -55,7 +55,7 @@ declare const exports: Record<string, unknown> & {
function highlightMap( function highlightMap(
mapContainerElement: HTMLElement, mapContainerElement: HTMLElement,
mapKey: string, mapKey: string,
contextualClass: 'success' | 'danger' contextualClass: 'danger' | 'success'
): void { ): void {
// Search for ID // Search for ID
let svgId = mapKey let svgId = mapKey
@ -175,7 +175,6 @@ declare const exports: Record<string, unknown> & {
} }
return exports.randomColor({ return exports.randomColor({
seed: actualSeedString + actualSeedString,
hue: hues[ hue: hues[
(actualSeedString.codePointAt(actualSeedString.length - 1) as number) % (actualSeedString.codePointAt(actualSeedString.length - 1) as number) %
hues.length hues.length
@ -185,7 +184,8 @@ declare const exports: Record<string, unknown> & {
(actualSeedString.codePointAt( (actualSeedString.codePointAt(
actualSeedString.length - 2 actualSeedString.length - 2
) as number) % luminosity.length ) as number) % luminosity.length
] ],
seed: actualSeedString + actualSeedString
}) })
} }
@ -271,10 +271,10 @@ declare const exports: Record<string, unknown> & {
function getRecordURL( function getRecordURL(
recordTypePlural: recordTypePlural:
| 'cemeteries'
| 'burialSites' | 'burialSites'
| 'funeralHomes' | 'cemeteries'
| 'contracts' | 'contracts'
| 'funeralHomes'
| 'workOrders', | 'workOrders',
recordId: number | string, recordId: number | string,
edit: boolean, edit: boolean,
@ -342,29 +342,30 @@ declare const exports: Record<string, unknown> & {
*/ */
const sunrise: Sunrise = { const sunrise: Sunrise = {
urlPrefix,
apiKey: document.querySelector('main')?.dataset.apiKey ?? '', apiKey: document.querySelector('main')?.dataset.apiKey ?? '',
dynamicsGPIntegrationIsEnabled, dynamicsGPIntegrationIsEnabled,
urlPrefix,
highlightMap, highlightMap,
initializeUnlockFieldButtons, initializeUnlockFieldButtons,
populateAliases,
escapedAliases, escapedAliases,
populateAliases,
getRandomColor, getRandomColor,
setUnsavedChanges,
clearUnsavedChanges, clearUnsavedChanges,
hasUnsavedChanges, hasUnsavedChanges,
setUnsavedChanges,
getMoveUpDownButtonFieldHTML,
getLoadingParagraphHTML, getLoadingParagraphHTML,
getMoveUpDownButtonFieldHTML,
getSearchResultsPagerHTML, getSearchResultsPagerHTML,
getCemeteryURL,
getBurialSiteURL, getBurialSiteURL,
getFuneralHomeURL, getCemeteryURL,
getContractURL, getContractURL,
getFuneralHomeURL,
getWorkOrderURL getWorkOrderURL
} }

View File

@ -1,28 +1,28 @@
export interface Sunrise { export interface Sunrise {
urlPrefix: string; urlPrefix: string;
apiKey: string; apiKey: string;
highlightMap: (mapContainerElement: HTMLElement, mapKey: string, contextualClass: 'success' | 'danger') => void; highlightMap: (mapContainerElement: HTMLElement, mapKey: string, contextualClass: 'danger' | 'success') => void;
initializeUnlockFieldButtons: (containerElement: HTMLElement) => void; initializeUnlockFieldButtons: (containerElement: HTMLElement) => void;
populateAliases: (containerElement: HTMLElement) => void; populateAliases: (containerElement: HTMLElement) => void;
escapedAliases: { escapedAliases: {
ExternalReceiptNumber: string; ExternalReceiptNumber: string;
externalReceiptNumber: string; externalReceiptNumber: string;
WorkOrderOpenDate: string;
workOrderOpenDate: string;
WorkOrderCloseDate: string; WorkOrderCloseDate: string;
workOrderCloseDate: string; workOrderCloseDate: string;
WorkOrderOpenDate: string;
workOrderOpenDate: string;
}; };
dynamicsGPIntegrationIsEnabled: boolean; dynamicsGPIntegrationIsEnabled: boolean;
getRandomColor: (seedString: string) => string; getRandomColor: (seedString: string) => string;
setUnsavedChanges: () => void;
clearUnsavedChanges: () => void; clearUnsavedChanges: () => void;
hasUnsavedChanges: () => boolean; hasUnsavedChanges: () => boolean;
getMoveUpDownButtonFieldHTML: (upButtonClassNames: string, downButtonClassNames: string, isSmall?: boolean) => string; setUnsavedChanges: () => void;
getLoadingParagraphHTML: (captionText?: string) => string; getLoadingParagraphHTML: (captionText?: string) => string;
getMoveUpDownButtonFieldHTML: (upButtonClassNames: string, downButtonClassNames: string, isSmall?: boolean) => string;
getSearchResultsPagerHTML: (limit: number, offset: number, count: number) => string; getSearchResultsPagerHTML: (limit: number, offset: number, count: number) => string;
getFuneralHomeURL: (funeralHomeId?: number | string, edit?: boolean, time?: boolean) => string;
getCemeteryURL: (cemeteryId?: number | string, edit?: boolean, time?: boolean) => string;
getBurialSiteURL: (burialSiteId?: number | string, edit?: boolean, time?: boolean) => string; getBurialSiteURL: (burialSiteId?: number | string, edit?: boolean, time?: boolean) => string;
getCemeteryURL: (cemeteryId?: number | string, edit?: boolean, time?: boolean) => string;
getContractURL: (contractId?: number | string, edit?: boolean, time?: boolean) => string; getContractURL: (contractId?: number | string, edit?: boolean, time?: boolean) => string;
getFuneralHomeURL: (funeralHomeId?: number | string, edit?: boolean, time?: boolean) => string;
getWorkOrderURL: (workOrderId?: number | string, edit?: boolean, time?: boolean) => string; getWorkOrderURL: (workOrderId?: number | string, edit?: boolean, time?: boolean) => string;
} }

View File

@ -5,7 +5,7 @@ export interface Sunrise {
highlightMap: ( highlightMap: (
mapContainerElement: HTMLElement, mapContainerElement: HTMLElement,
mapKey: string, mapKey: string,
contextualClass: 'success' | 'danger' contextualClass: 'danger' | 'success'
) => void ) => void
initializeUnlockFieldButtons: (containerElement: HTMLElement) => void initializeUnlockFieldButtons: (containerElement: HTMLElement) => void
@ -15,40 +15,52 @@ export interface Sunrise {
escapedAliases: { escapedAliases: {
ExternalReceiptNumber: string ExternalReceiptNumber: string
externalReceiptNumber: string externalReceiptNumber: string
WorkOrderOpenDate: string
workOrderOpenDate: string
WorkOrderCloseDate: string WorkOrderCloseDate: string
workOrderCloseDate: string workOrderCloseDate: string
WorkOrderOpenDate: string
workOrderOpenDate: string
} }
dynamicsGPIntegrationIsEnabled: boolean dynamicsGPIntegrationIsEnabled: boolean
getRandomColor: (seedString: string) => string getRandomColor: (seedString: string) => string
setUnsavedChanges: () => void
clearUnsavedChanges: () => void clearUnsavedChanges: () => void
hasUnsavedChanges: () => boolean hasUnsavedChanges: () => boolean
setUnsavedChanges: () => void
getLoadingParagraphHTML: (captionText?: string) => string
getMoveUpDownButtonFieldHTML: ( getMoveUpDownButtonFieldHTML: (
upButtonClassNames: string, upButtonClassNames: string,
downButtonClassNames: string, downButtonClassNames: string,
isSmall?: boolean isSmall?: boolean
) => string ) => string
getLoadingParagraphHTML: (captionText?: string) => string
getSearchResultsPagerHTML: ( getSearchResultsPagerHTML: (
limit: number, limit: number,
offset: number, offset: number,
count: number count: number
) => string ) => string
getFuneralHomeURL: (funeralHomeId?: number | string, edit?: boolean, time?: boolean) => string getBurialSiteURL: (
getCemeteryURL: (cemeteryId?: number | string, edit?: boolean, time?: boolean) => string burialSiteId?: number | string,
getBurialSiteURL: (burialSiteId?: number | string, edit?: boolean, time?: boolean) => string edit?: boolean,
time?: boolean
) => string
getCemeteryURL: (
cemeteryId?: number | string,
edit?: boolean,
time?: boolean
) => string
getContractURL: ( getContractURL: (
contractId?: number | string, contractId?: number | string,
edit?: boolean, edit?: boolean,
time?: boolean time?: boolean
) => string ) => string
getFuneralHomeURL: (
funeralHomeId?: number | string,
edit?: boolean,
time?: boolean
) => string
getWorkOrderURL: ( getWorkOrderURL: (
workOrderId?: number | string, workOrderId?: number | string,
edit?: boolean, edit?: boolean,

View File

@ -382,7 +382,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
<div class="dropdown is-right"> <div class="dropdown is-right">
<div class="dropdown-trigger"> <div class="dropdown-trigger">
<button class="button is-small" data-tooltip="Options" type="button" aria-label="Options"> <button class="button is-small" data-tooltip="Options" type="button" aria-label="Options">
<i class="fas fa-ellipsis-v" aria-hidden="true"></i> <span class="icon is-small"><i class="fas fa-ellipsis-v" aria-hidden="true"></i></span>
</button> </button>
</div> </div>
<div class="dropdown-menu"> <div class="dropdown-menu">

View File

@ -559,6 +559,7 @@ declare const exports: Record<string, unknown>
conflictingMilestonePanelElement conflictingMilestonePanelElement
) )
}, },
onremoved() { onremoved() {
bulmaJS.toggleHtmlClipped() bulmaJS.toggleHtmlClipped()
} }
@ -622,7 +623,7 @@ declare const exports: Record<string, unknown>
<div class="dropdown is-right"> <div class="dropdown is-right">
<div class="dropdown-trigger"> <div class="dropdown-trigger">
<button class="button is-small" data-tooltip="Options" type="button" aria-label="Options"> <button class="button is-small" data-tooltip="Options" type="button" aria-label="Options">
<i class="fas fa-ellipsis-v" aria-hidden="true"></i> <span class="icon is-small"><i class="fas fa-ellipsis-v" aria-hidden="true"></i></span>
</button> </button>
</div> </div>
<div class="dropdown-menu"> <div class="dropdown-menu">

View File

@ -127,7 +127,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
<span>Edit</span> <span>Edit</span>
</button> </button>
<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete"> <button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">
<i class="fas fa-trash" aria-hidden="true"></i> <span class="icon is-small"><i class="fas fa-trash" aria-hidden="true"></i></span>
</button> </button>
</div> </div>
</td>`; </td>`;

View File

@ -211,7 +211,7 @@ declare const exports: Record<string, unknown>
<span>Edit</span> <span>Edit</span>
</button> </button>
<button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete"> <button class="button is-light is-danger button--delete" data-tooltip="Delete Comment" type="button" aria-label="Delete">
<i class="fas fa-trash" aria-hidden="true"></i> <span class="icon is-small"><i class="fas fa-trash" aria-hidden="true"></i></span>
</button> </button>
</div> </div>
</td>` </td>`

View File

@ -171,7 +171,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
: `<ul class="fa-ul ml-5">${intermentsHTML}</ul>`} : `<ul class="fa-ul ml-5">${intermentsHTML}</ul>`}
</td><td> </td><td>
<button class="button is-small is-light is-danger button--deleteContract" data-tooltip="Delete Relationship" type="button"> <button class="button is-small is-light is-danger button--deleteContract" data-tooltip="Delete Relationship" type="button">
<i class="fas fa-trash" aria-hidden="true"></i> <span class="icon is-small"><i class="fas fa-trash" aria-hidden="true"></i></span>
</button> </button>
</td>`); </td>`);
rowElement rowElement
@ -317,12 +317,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
${burialSite.burialSiteStatusId ${burialSite.burialSiteStatusId
? cityssm.escapeHTML(burialSite.burialSiteStatus ?? '') ? cityssm.escapeHTML(burialSite.burialSiteStatus ?? '')
: '<span class="has-text-grey">(No Status)</span>'} : '<span class="has-text-grey">(No Status)</span>'}
</td><td class="is-nowrap"> </td><td class="has-text-right is-nowrap">
<button class="button is-small is-light is-info button--editBurialSiteStatus" data-tooltip="Update Status" type="button"> <button class="button is-small is-light is-info button--editBurialSiteStatus" data-tooltip="Update Status" type="button">
<i class="fas fa-pencil-alt" aria-hidden="true"></i> <span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>
</button> </button>
<button class="button is-small is-light is-danger button--deleteBurialSite" data-tooltip="Delete Relationship" type="button"> <button class="button is-small is-light is-danger button--deleteBurialSite" data-tooltip="Delete Relationship" type="button">
<i class="fas fa-trash" aria-hidden="true"></i> <span class="icon is-small"><i class="fas fa-trash" aria-hidden="true"></i></span>
</button> </button>
</td>`; </td>`;
rowElement rowElement
@ -350,13 +350,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
document document
.querySelector('#button--addContract') .querySelector('#button--addContract')
?.addEventListener('click', () => { ?.addEventListener('click', (addClickEvent) => {
addClickEvent.preventDefault();
let searchFormElement; let searchFormElement;
let searchResultsContainerElement; let searchResultsContainerElement;
function doSearch(event) { function doSearch(event) {
if (event) { event?.preventDefault();
event.preventDefault();
}
// eslint-disable-next-line no-unsanitized/property // eslint-disable-next-line no-unsanitized/property
searchResultsContainerElement.innerHTML = searchResultsContainerElement.innerHTML =
sunrise.getLoadingParagraphHTML('Searching...'); sunrise.getLoadingParagraphHTML('Searching...');
@ -459,13 +458,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
document document
.querySelector('#button--addBurialSite') .querySelector('#button--addBurialSite')
?.addEventListener('click', () => { ?.addEventListener('click', (addClickEvent) => {
addClickEvent.preventDefault();
let searchFormElement; let searchFormElement;
let searchResultsContainerElement; let searchResultsContainerElement;
function doSearch(event) { function doSearch(event) {
if (event) { event?.preventDefault();
event.preventDefault();
}
// eslint-disable-next-line no-unsanitized/property // eslint-disable-next-line no-unsanitized/property
searchResultsContainerElement.innerHTML = searchResultsContainerElement.innerHTML =
sunrise.getLoadingParagraphHTML('Searching...'); sunrise.getLoadingParagraphHTML('Searching...');
@ -490,7 +488,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
for (const burialSite of responseJSON.burialSites) { for (const burialSite of responseJSON.burialSites) {
const rowElement = document.createElement('tr'); const rowElement = document.createElement('tr');
rowElement.className = 'container--burialSite'; rowElement.className = 'container--burialSite';
rowElement.dataset.burialSiteId = burialSite.burialSiteId.toString(); rowElement.dataset.burialSiteId =
burialSite.burialSiteId.toString();
rowElement.innerHTML = `<td class="has-text-centered"> rowElement.innerHTML = `<td class="has-text-centered">
<button class="button is-small is-success button--addBurialSite" data-tooltip="Add" type="button" aria-label="Add"> <button class="button is-small is-success button--addBurialSite" data-tooltip="Add" type="button" aria-label="Add">
<i class="fas fa-plus" aria-hidden="true"></i> <i class="fas fa-plus" aria-hidden="true"></i>

View File

@ -273,7 +273,7 @@ declare const exports: Record<string, unknown>
} }
</td><td> </td><td>
<button class="button is-small is-light is-danger button--deleteContract" data-tooltip="Delete Relationship" type="button"> <button class="button is-small is-light is-danger button--deleteContract" data-tooltip="Delete Relationship" type="button">
<i class="fas fa-trash" aria-hidden="true"></i> <span class="icon is-small"><i class="fas fa-trash" aria-hidden="true"></i></span>
</button> </button>
</td>` </td>`
) )
@ -502,12 +502,12 @@ declare const exports: Record<string, unknown>
? cityssm.escapeHTML(burialSite.burialSiteStatus ?? '') ? cityssm.escapeHTML(burialSite.burialSiteStatus ?? '')
: '<span class="has-text-grey">(No Status)</span>' : '<span class="has-text-grey">(No Status)</span>'
} }
</td><td class="is-nowrap"> </td><td class="has-text-right is-nowrap">
<button class="button is-small is-light is-info button--editBurialSiteStatus" data-tooltip="Update Status" type="button"> <button class="button is-small is-light is-info button--editBurialSiteStatus" data-tooltip="Update Status" type="button">
<i class="fas fa-pencil-alt" aria-hidden="true"></i> <span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>
</button> </button>
<button class="button is-small is-light is-danger button--deleteBurialSite" data-tooltip="Delete Relationship" type="button"> <button class="button is-small is-light is-danger button--deleteBurialSite" data-tooltip="Delete Relationship" type="button">
<i class="fas fa-trash" aria-hidden="true"></i> <span class="icon is-small"><i class="fas fa-trash" aria-hidden="true"></i></span>
</button> </button>
</td>` </td>`
@ -546,14 +546,14 @@ declare const exports: Record<string, unknown>
document document
.querySelector('#button--addContract') .querySelector('#button--addContract')
?.addEventListener('click', () => { ?.addEventListener('click', (addClickEvent) => {
addClickEvent.preventDefault()
let searchFormElement: HTMLFormElement let searchFormElement: HTMLFormElement
let searchResultsContainerElement: HTMLElement let searchResultsContainerElement: HTMLElement
function doSearch(event?: Event): void { function doSearch(event?: Event): void {
if (event) { event?.preventDefault()
event.preventDefault()
}
// eslint-disable-next-line no-unsanitized/property // eslint-disable-next-line no-unsanitized/property
searchResultsContainerElement.innerHTML = searchResultsContainerElement.innerHTML =
@ -703,6 +703,7 @@ declare const exports: Record<string, unknown>
searchFormElement.addEventListener('submit', doSearch) searchFormElement.addEventListener('submit', doSearch)
}, },
onremoved() { onremoved() {
bulmaJS.toggleHtmlClipped() bulmaJS.toggleHtmlClipped()
;( ;(
@ -728,14 +729,14 @@ declare const exports: Record<string, unknown>
document document
.querySelector('#button--addBurialSite') .querySelector('#button--addBurialSite')
?.addEventListener('click', () => { ?.addEventListener('click', (addClickEvent) => {
addClickEvent.preventDefault()
let searchFormElement: HTMLFormElement let searchFormElement: HTMLFormElement
let searchResultsContainerElement: HTMLElement let searchResultsContainerElement: HTMLElement
function doSearch(event?: Event): void { function doSearch(event?: Event): void {
if (event) { event?.preventDefault()
event.preventDefault()
}
// eslint-disable-next-line no-unsanitized/property // eslint-disable-next-line no-unsanitized/property
searchResultsContainerElement.innerHTML = searchResultsContainerElement.innerHTML =
@ -745,7 +746,9 @@ declare const exports: Record<string, unknown>
`${sunrise.urlPrefix}/burialSites/doSearchBurialSites`, `${sunrise.urlPrefix}/burialSites/doSearchBurialSites`,
searchFormElement, searchFormElement,
(rawResponseJSON) => { (rawResponseJSON) => {
const responseJSON = rawResponseJSON as { burialSites: BurialSite[] } const responseJSON = rawResponseJSON as {
burialSites: BurialSite[]
}
if (responseJSON.burialSites.length === 0) { if (responseJSON.burialSites.length === 0) {
searchResultsContainerElement.innerHTML = `<div class="message is-info"> searchResultsContainerElement.innerHTML = `<div class="message is-info">
@ -769,7 +772,8 @@ declare const exports: Record<string, unknown>
for (const burialSite of responseJSON.burialSites) { for (const burialSite of responseJSON.burialSites) {
const rowElement = document.createElement('tr') const rowElement = document.createElement('tr')
rowElement.className = 'container--burialSite' rowElement.className = 'container--burialSite'
rowElement.dataset.burialSiteId = burialSite.burialSiteId.toString() rowElement.dataset.burialSiteId =
burialSite.burialSiteId.toString()
rowElement.innerHTML = `<td class="has-text-centered"> rowElement.innerHTML = `<td class="has-text-centered">
<button class="button is-small is-success button--addBurialSite" data-tooltip="Add" type="button" aria-label="Add"> <button class="button is-small is-success button--addBurialSite" data-tooltip="Add" type="button" aria-label="Add">
@ -843,6 +847,7 @@ declare const exports: Record<string, unknown>
searchFormElement.addEventListener('submit', doSearch) searchFormElement.addEventListener('submit', doSearch)
}, },
onremoved() { onremoved() {
bulmaJS.toggleHtmlClipped() bulmaJS.toggleHtmlClipped()
;( ;(

View File

@ -127,8 +127,9 @@ async function importFromMasterCSV() {
burialSiteNameSegment2, burialSiteNameSegment2,
burialSiteNameSegment3, burialSiteNameSegment3,
burialSiteNameSegment4, burialSiteNameSegment4,
burialSiteTypeId,
burialSiteStatusId: importIds.availableBurialSiteStatusId, burialSiteStatusId: importIds.availableBurialSiteStatusId,
burialSiteTypeId,
burialSiteImage: '',
cemeteryId, cemeteryId,
cemeterySvgId: '', cemeterySvgId: '',
burialSiteLatitude: '', burialSiteLatitude: '',

View File

@ -322,10 +322,14 @@ async function importFromMasterCSV(): Promise<void> {
burialSiteNameSegment2, burialSiteNameSegment2,
burialSiteNameSegment3, burialSiteNameSegment3,
burialSiteNameSegment4, burialSiteNameSegment4,
burialSiteTypeId,
burialSiteStatusId: importIds.availableBurialSiteStatusId, burialSiteStatusId: importIds.availableBurialSiteStatusId,
burialSiteTypeId,
burialSiteImage: '',
cemeteryId, cemeteryId,
cemeterySvgId: '', cemeterySvgId: '',
burialSiteLatitude: '', burialSiteLatitude: '',
burialSiteLongitude: '' burialSiteLongitude: ''
}, },

View File

@ -338,7 +338,20 @@
<div class="columns"> <div class="columns">
<div class="column"> <div class="column">
<div class="panel"> <div class="panel">
<h2 class="panel-heading">Geographic Location</h2> <div class="panel-heading">
<div class="level">
<div class="level-left">
<div class="level-item">
<h2 class="title is-5 has-text-weight-bold has-text-white">Geographic Location</h2>
</div>
</div>
<div class="level-right">
<div class="level-item">
<i class="fas fa-map-marker-alt" aria-hidden="true"></i>
</div>
</div>
</div>
</div>
<div class="panel-block is-block"> <div class="panel-block is-block">
<div class="field"> <div class="field">
<label class="label" for="burialSite--burialSiteLatitude">Latitude</label> <label class="label" for="burialSite--burialSiteLatitude">Latitude</label>
@ -363,7 +376,20 @@
</div> </div>
<div class="column"> <div class="column">
<div class="panel"> <div class="panel">
<h2 class="panel-heading">Image</h2> <div class="panel-heading">
<div class="level">
<div class="level-left">
<div class="level-item">
<h2 class="title is-5 has-text-weight-bold has-text-white">Image</h2>
</div>
</div>
<div class="level-right">
<div class="level-item">
<i class="fas fa-image" aria-hidden="true"></i>
</div>
</div>
</div>
</div>
<div class="panel-block is-block"> <div class="panel-block is-block">
<div class="field"> <div class="field">
<label class="label" for="burialSite--cemeterySvgId"> <label class="label" for="burialSite--cemeterySvgId">

View File

@ -101,7 +101,20 @@
<div class="column"> <div class="column">
<div class="panel"> <div class="panel">
<h2 class="panel-heading">Image</h2> <div class="panel-heading">
<div class="level">
<div class="level-left">
<div class="level-item">
<h2 class="title is-5 has-text-weight-bold has-text-white">Image</h2>
</div>
</div>
<div class="level-right">
<div class="level-item">
<i class="fas fa-image" aria-hidden="true"></i>
</div>
</div>
</div>
</div>
<div class="panel-block is-block"> <div class="panel-block is-block">
<% if (burialSite.burialSiteImage) { %> <% if (burialSite.burialSiteImage) { %>
<div class="image"> <div class="image">

View File

@ -125,7 +125,20 @@
</div> </div>
<div class="column"> <div class="column">
<div class="panel"> <div class="panel">
<h2 class="panel-heading">Address</h2> <div class="panel-heading">
<div class="level">
<div class="level-left">
<div class="level-item">
<h2 class="title is-5 has-text-weight-bold has-text-white">Address</h2>
</div>
</div>
<div class="level-right">
<div class="level-item">
<i class="fas fa-location-arrow" aria-hidden="true"></i>
</div>
</div>
</div>
</div>
<div class="panel-block is-block"> <div class="panel-block is-block">
<div class="field"> <div class="field">
<label class="label" for="cemetery--cemeteryAddress1">Address</label> <label class="label" for="cemetery--cemeteryAddress1">Address</label>
@ -181,7 +194,20 @@
<div class="columns"> <div class="columns">
<div class="column"> <div class="column">
<div class="panel"> <div class="panel">
<h2 class="panel-heading">Geographic Location</h2> <div class="panel-heading">
<div class="level">
<div class="level-left">
<div class="level-item">
<h2 class="title is-5 has-text-weight-bold has-text-white">Geographic Location</h2>
</div>
</div>
<div class="level-right">
<div class="level-item">
<i class="fas fa-map-marker-alt" aria-hidden="true"></i>
</div>
</div>
</div>
</div>
<div class="panel-block is-block"> <div class="panel-block is-block">
<div class="field"> <div class="field">
<label class="label" for="cemetery--cemeteryLatitude">Latitude</label> <label class="label" for="cemetery--cemeteryLatitude">Latitude</label>
@ -206,7 +232,20 @@
</div> </div>
<div class="column"> <div class="column">
<div class="panel"> <div class="panel">
<h2 class="panel-heading">Image</h2> <div class="panel-heading">
<div class="level">
<div class="level-left">
<div class="level-item">
<h2 class="title is-5 has-text-weight-bold has-text-white">Image</h2>
</div>
</div>
<div class="level-right">
<div class="level-item">
<i class="fas fa-image" aria-hidden="true"></i>
</div>
</div>
</div>
</div>
<div class="panel-block is-block"> <div class="panel-block is-block">
<div class="field"> <div class="field">
<label class="label" for="cemetery--cemeterySvg">SVG File</label> <label class="label" for="cemetery--cemeterySvg">SVG File</label>

View File

@ -96,7 +96,20 @@
<div class="columns"> <div class="columns">
<div class="column"> <div class="column">
<div class="panel"> <div class="panel">
<h2 class="panel-heading">Geographic Location</h2> <div class="panel-heading">
<div class="level">
<div class="level-left">
<div class="level-item">
<h2 class="title is-5 has-text-weight-bold has-text-white">Geographic Location</h2>
</div>
</div>
<div class="level-right">
<div class="level-item">
<i class="fas fa-map-marker-alt" aria-hidden="true"></i>
</div>
</div>
</div>
</div>
<div class="panel-block is-block"> <div class="panel-block is-block">
<% if (cemetery.cemeteryLatitude && cemetery.cemeteryLongitude) { %> <% if (cemetery.cemeteryLatitude && cemetery.cemeteryLongitude) { %>
<div id="cemetery--leaflet" data-cemetery-latitude="<%= cemetery.cemeteryLatitude %>" data-cemetery-longitude="<%= cemetery.cemeteryLongitude %>" style="height:300px"></div> <div id="cemetery--leaflet" data-cemetery-latitude="<%= cemetery.cemeteryLatitude %>" data-cemetery-longitude="<%= cemetery.cemeteryLongitude %>" style="height:300px"></div>
@ -112,7 +125,20 @@
</div> </div>
<div class="column"> <div class="column">
<div class="panel"> <div class="panel">
<h2 class="panel-heading">Image</h2> <div class="panel-heading">
<div class="level">
<div class="level-left">
<div class="level-item">
<h2 class="title is-5 has-text-weight-bold has-text-white">Image</h2>
</div>
</div>
<div class="level-right">
<div class="level-item">
<i class="fas fa-image" aria-hidden="true"></i>
</div>
</div>
</div>
</div>
<div class="panel-block is-block"> <div class="panel-block is-block">
<% if (cemetery.cemeterySvg) { %> <% if (cemetery.cemeterySvg) { %>
<% const imageURL = urlPrefix + "/internal/images/cemeteries/" + cemetery.cemeterySvg %> <% const imageURL = urlPrefix + "/internal/images/cemeteries/" + cemetery.cemeterySvg %>

View File

@ -43,7 +43,7 @@
<% if (workOrderPrints.length > 0) { %> <% if (workOrderPrints.length > 0) { %>
<span class="is-pulled-right"> <span class="is-pulled-right">
<a class="button is-small" data-tooltip="Print Work Order" href="<%=urlPrefix %>/print/<%= workOrderPrints[0] %>/?workOrderId=<%= milestone.workOrderId %>" target="_blank" aria-label="Print"> <a class="button is-small" data-tooltip="Print Work Order" href="<%=urlPrefix %>/print/<%= workOrderPrints[0] %>/?workOrderId=<%= milestone.workOrderId %>" target="_blank" aria-label="Print">
<i class="fas fa-print" aria-hidden="true"></i> <span class="icon is-small"><i class="fas fa-print" aria-hidden="true"></i></span>
</a> </a>
</span> </span>
<% } %> <% } %>
@ -228,8 +228,8 @@
</div> </div>
</div> </div>
</div> </div>
<div class="columns is-desktop"> <div class="columns is-multiline">
<div class="column"> <div class="column is-6-widescreen is-full-desktop is-full-tablet">
<div class="panel"> <div class="panel">
<a class="panel-block" href="<%= urlPrefix %>/reports"> <a class="panel-block" href="<%= urlPrefix %>/reports">
<div class="media"> <div class="media">
@ -246,7 +246,7 @@
</a> </a>
</div> </div>
</div> </div>
<div class="column"> <div class="column is-6-widescreen is-full-desktop is-full-tablet">
<div class="panel"> <div class="panel">
<a class="panel-block" href="https://cityssm.github.io/sunrise-cms/docs" rel="noopener noreferrer" target="_blank"> <a class="panel-block" href="https://cityssm.github.io/sunrise-cms/docs" rel="noopener noreferrer" target="_blank">
<div class="media"> <div class="media">

View File

@ -83,7 +83,6 @@
</button> </button>
</div> </div>
</div> </div>
</div> </div>
<form id="form--funeralHome"> <form id="form--funeralHome">

View File

@ -33,7 +33,6 @@
</table> </table>
<% } %> <% } %>
<p class="has-text-right is-italic is-8pt" style="position:absolute;bottom:10px;right:10px"> <p class="has-text-right is-italic is-8pt" style="position:absolute;bottom:10px;right:10px">
<% <%
const recordCreateDate = new Date(workOrder.recordCreate_timeMillis); const recordCreateDate = new Date(workOrder.recordCreate_timeMillis);

View File

@ -128,7 +128,7 @@
</div> </div>
</div> </div>
<div class="columns is-desktop"> <div class="columns">
<div class="column"> <div class="column">
<form id="form--workOrderEdit"> <form id="form--workOrderEdit">
<input id="workOrderEdit--workOrderId" name="workOrderId" type="hidden" value="<%= workOrder.workOrderId %>" /> <input id="workOrderEdit--workOrderId" name="workOrderId" type="hidden" value="<%= workOrder.workOrderId %>" />
@ -218,7 +218,40 @@
<% if (!isCreate) { %> <% if (!isCreate) { %>
<div class="panel mt-4"> <div class="panel mt-4">
<h2 class="panel-heading">Related Burial Sites</h2> <div class="panel-heading">
<div class="level">
<div class="level-left">
<div class="level-item">
<h2 class="title is-5 has-text-weight-bold has-text-white">Related Burial Sites</h2>
</div>
</div>
<div class="level-right">
<div class="level-item">
<div class="dropdown is-right">
<div class="dropdown-trigger">
<button class="button is-success is-small" type="button">
<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>
<span>Add</span>
<span class="icon is-small"><i class="fas fa-angle-down" aria-hidden="true"></i></span>
</button>
</div>
<div class="dropdown-menu">
<div class="dropdown-content has-text-weight-normal">
<a class="dropdown-item" id="button--addContract" href="#">
<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>
<span>Add a Related Contract</span>
</a>
<a class="dropdown-item" id="button--addBurialSite" href="#">
<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>
<span>Add a Related Burial Site</span>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="panel-block is-block"> <div class="panel-block is-block">
<% <%
const tabToSelect = (workOrder.workOrderContracts.length > 0 || workOrder.workOrderBurialSites.length === 0 ? "contracts" : "burialSites"); const tabToSelect = (workOrder.workOrderContracts.length > 0 || workOrder.workOrderBurialSites.length === 0 ? "contracts" : "burialSites");
@ -241,55 +274,19 @@
</div> </div>
<div class="tab-container"> <div class="tab-container">
<div class="<%= (tabToSelect === 'contracts' ? '' : 'is-hidden') %>" id="relatedTab--contracts"> <div class="<%= (tabToSelect === 'contracts' ? '' : 'is-hidden') %>" id="relatedTab--contracts">
<div class="box has-background-light has-text-right p-3">
<button class="button is-small is-success" id="button--addContract" type="button">
<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>
<span>Add Related Contract</span>
</button>
</div>
<div id="container--contracts"></div> <div id="container--contracts"></div>
</div> </div>
<div class="<%= (tabToSelect === 'burialSites' ? '' : 'is-hidden') %>" id="relatedTab--burialSites"> <div class="<%= (tabToSelect === 'burialSites' ? '' : 'is-hidden') %>" id="relatedTab--burialSites">
<div class="box has-background-light has-text-right p-3">
<button class="button is-small is-success" id="button--addBurialSite" type="button">
<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>
<span>Add Related Burial Site</span>
</button>
</div>
<div id="container--burialSites"></div> <div id="container--burialSites"></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<% } %> <% } %>
</div>
<% if (!isCreate) { %> <% if (!isCreate) { %>
<div class="panel"> <div class="column is-full-desktop is-4-widescreen">
<div class="panel-heading">
<div class="level is-mobile">
<div class="level-left">
<div class="level-item">
<h2 class="has-text-weight-bold is-size-5">
Comments
</h2>
</div>
</div>
<div class="level-right">
<div class="level-item">
<button class="button is-small is-success" id="workOrderComments--add" type="button">
<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>
<span>Add a Comment</span>
</button>
</div>
</div>
</div>
</div>
<div class="panel-block is-block" id="container--workOrderComments"></div>
</div>
<% } %>
</div>
<% if (!isCreate) { %>
<div class="column is-4-desktop">
<div class="panel" id="panel--milestones"> <div class="panel" id="panel--milestones">
<div class="panel-heading"> <div class="panel-heading">
<div class="level is-mobile"> <div class="level is-mobile">
@ -309,7 +306,7 @@
<div class="dropdown is-right has-text-weight-normal"> <div class="dropdown is-right has-text-weight-normal">
<div class="dropdown-trigger"> <div class="dropdown-trigger">
<button class="button is-small has-tooltip-left" data-tooltip="Milestone Options" type="button" aria-label="Options"> <button class="button is-small has-tooltip-left" data-tooltip="Milestone Options" type="button" aria-label="Options">
<i class="fas fa-ellipsis-v" aria-hidden="true"></i> <span class="icon is-small"><i class="fas fa-ellipsis-v" aria-hidden="true"></i></span>
</button> </button>
</div> </div>
<div class="dropdown-menu"> <div class="dropdown-menu">
@ -334,6 +331,30 @@
<% } %> <% } %>
</div> </div>
<% if (!isCreate) { %>
<div class="panel">
<div class="panel-heading">
<div class="level is-mobile">
<div class="level-left">
<div class="level-item">
<h2 class="has-text-weight-bold is-size-5">
Comments
</h2>
</div>
</div>
<div class="level-right">
<div class="level-item">
<button class="button is-small is-success" id="workOrderComments--add" type="button">
<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>
<span>Add a Comment</span>
</button>
</div>
</div>
</div>
</div>
<div class="panel-block is-block" id="container--workOrderComments"></div>
</div>
<% } %>
<%- include('_footerA'); -%> <%- include('_footerA'); -%>