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.
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
There's no cost to use it.

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -192,11 +192,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
<strong>Birth:</strong>
</div>
<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)')}
</div>
</div>
<div class="columns">
<div class="columns mb-0">
<div class="column">
<strong>Death:</strong>
</div>
@ -205,12 +207,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
${cityssm.escapeHTML(interment.deathPlace ?? '(No Death Place)')}
</div>
</div>
<div class="columns">
<div class="columns mb-0">
<div class="column">
<strong>Age:</strong>
</div>
<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 ?? '')}
</div>
</div>

View File

@ -291,11 +291,15 @@ declare const exports: Record<string, unknown>
<strong>Birth:</strong>
</div>
<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)')}
</div>
</div>
<div class="columns">
<div class="columns mb-0">
<div class="column">
<strong>Death:</strong>
</div>
@ -304,12 +308,12 @@ declare const exports: Record<string, unknown>
${cityssm.escapeHTML(interment.deathPlace ?? '(No Death Place)')}
</div>
</div>
<div class="columns">
<div class="columns mb-0">
<div class="column">
<strong>Age:</strong>
</div>
<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 ?? '')}
</div>
</div>

View File

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

View File

@ -1,28 +1,28 @@
export interface Sunrise {
urlPrefix: 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;
populateAliases: (containerElement: HTMLElement) => void;
escapedAliases: {
ExternalReceiptNumber: string;
externalReceiptNumber: string;
WorkOrderOpenDate: string;
workOrderOpenDate: string;
WorkOrderCloseDate: string;
workOrderCloseDate: string;
WorkOrderOpenDate: string;
workOrderOpenDate: string;
};
dynamicsGPIntegrationIsEnabled: boolean;
getRandomColor: (seedString: string) => string;
setUnsavedChanges: () => void;
clearUnsavedChanges: () => void;
hasUnsavedChanges: () => boolean;
getMoveUpDownButtonFieldHTML: (upButtonClassNames: string, downButtonClassNames: string, isSmall?: boolean) => string;
setUnsavedChanges: () => void;
getLoadingParagraphHTML: (captionText?: string) => string;
getMoveUpDownButtonFieldHTML: (upButtonClassNames: string, downButtonClassNames: string, isSmall?: boolean) => 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;
getCemeteryURL: (cemeteryId?: 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;
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -171,7 +171,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
: `<ul class="fa-ul ml-5">${intermentsHTML}</ul>`}
</td><td>
<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>
</td>`);
rowElement
@ -317,12 +317,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
${burialSite.burialSiteStatusId
? cityssm.escapeHTML(burialSite.burialSiteStatus ?? '')
: '<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">
<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 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>
</td>`;
rowElement
@ -350,13 +350,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
}
document
.querySelector('#button--addContract')
?.addEventListener('click', () => {
?.addEventListener('click', (addClickEvent) => {
addClickEvent.preventDefault();
let searchFormElement;
let searchResultsContainerElement;
function doSearch(event) {
if (event) {
event.preventDefault();
}
event?.preventDefault();
// eslint-disable-next-line no-unsanitized/property
searchResultsContainerElement.innerHTML =
sunrise.getLoadingParagraphHTML('Searching...');
@ -459,13 +458,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
}
document
.querySelector('#button--addBurialSite')
?.addEventListener('click', () => {
?.addEventListener('click', (addClickEvent) => {
addClickEvent.preventDefault();
let searchFormElement;
let searchResultsContainerElement;
function doSearch(event) {
if (event) {
event.preventDefault();
}
event?.preventDefault();
// eslint-disable-next-line no-unsanitized/property
searchResultsContainerElement.innerHTML =
sunrise.getLoadingParagraphHTML('Searching...');
@ -490,7 +488,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
for (const burialSite of responseJSON.burialSites) {
const rowElement = document.createElement('tr');
rowElement.className = 'container--burialSite';
rowElement.dataset.burialSiteId = burialSite.burialSiteId.toString();
rowElement.dataset.burialSiteId =
burialSite.burialSiteId.toString();
rowElement.innerHTML = `<td class="has-text-centered">
<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>

View File

@ -273,7 +273,7 @@ declare const exports: Record<string, unknown>
}
</td><td>
<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>
</td>`
)
@ -502,12 +502,12 @@ declare const exports: Record<string, unknown>
? cityssm.escapeHTML(burialSite.burialSiteStatus ?? '')
: '<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">
<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 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>
</td>`
@ -546,14 +546,14 @@ declare const exports: Record<string, unknown>
document
.querySelector('#button--addContract')
?.addEventListener('click', () => {
?.addEventListener('click', (addClickEvent) => {
addClickEvent.preventDefault()
let searchFormElement: HTMLFormElement
let searchResultsContainerElement: HTMLElement
function doSearch(event?: Event): void {
if (event) {
event.preventDefault()
}
event?.preventDefault()
// eslint-disable-next-line no-unsanitized/property
searchResultsContainerElement.innerHTML =
@ -703,6 +703,7 @@ declare const exports: Record<string, unknown>
searchFormElement.addEventListener('submit', doSearch)
},
onremoved() {
bulmaJS.toggleHtmlClipped()
;(
@ -728,14 +729,14 @@ declare const exports: Record<string, unknown>
document
.querySelector('#button--addBurialSite')
?.addEventListener('click', () => {
?.addEventListener('click', (addClickEvent) => {
addClickEvent.preventDefault()
let searchFormElement: HTMLFormElement
let searchResultsContainerElement: HTMLElement
function doSearch(event?: Event): void {
if (event) {
event.preventDefault()
}
event?.preventDefault()
// eslint-disable-next-line no-unsanitized/property
searchResultsContainerElement.innerHTML =
@ -745,7 +746,9 @@ declare const exports: Record<string, unknown>
`${sunrise.urlPrefix}/burialSites/doSearchBurialSites`,
searchFormElement,
(rawResponseJSON) => {
const responseJSON = rawResponseJSON as { burialSites: BurialSite[] }
const responseJSON = rawResponseJSON as {
burialSites: BurialSite[]
}
if (responseJSON.burialSites.length === 0) {
searchResultsContainerElement.innerHTML = `<div class="message is-info">
@ -769,7 +772,8 @@ declare const exports: Record<string, unknown>
for (const burialSite of responseJSON.burialSites) {
const rowElement = document.createElement('tr')
rowElement.className = 'container--burialSite'
rowElement.dataset.burialSiteId = burialSite.burialSiteId.toString()
rowElement.dataset.burialSiteId =
burialSite.burialSiteId.toString()
rowElement.innerHTML = `<td class="has-text-centered">
<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)
},
onremoved() {
bulmaJS.toggleHtmlClipped()
;(

View File

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

View File

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

View File

@ -338,7 +338,20 @@
<div class="columns">
<div class="column">
<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="field">
<label class="label" for="burialSite--burialSiteLatitude">Latitude</label>
@ -363,7 +376,20 @@
</div>
<div class="column">
<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="field">
<label class="label" for="burialSite--cemeterySvgId">

View File

@ -101,7 +101,20 @@
<div class="column">
<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">
<% if (burialSite.burialSiteImage) { %>
<div class="image">

View File

@ -125,7 +125,20 @@
</div>
<div class="column">
<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="field">
<label class="label" for="cemetery--cemeteryAddress1">Address</label>
@ -181,7 +194,20 @@
<div class="columns">
<div class="column">
<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="field">
<label class="label" for="cemetery--cemeteryLatitude">Latitude</label>
@ -206,7 +232,20 @@
</div>
<div class="column">
<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="field">
<label class="label" for="cemetery--cemeterySvg">SVG File</label>

View File

@ -96,7 +96,20 @@
<div class="columns">
<div class="column">
<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">
<% if (cemetery.cemeteryLatitude && cemetery.cemeteryLongitude) { %>
<div id="cemetery--leaflet" data-cemetery-latitude="<%= cemetery.cemeteryLatitude %>" data-cemetery-longitude="<%= cemetery.cemeteryLongitude %>" style="height:300px"></div>
@ -112,7 +125,20 @@
</div>
<div class="column">
<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">
<% if (cemetery.cemeterySvg) { %>
<% const imageURL = urlPrefix + "/internal/images/cemeteries/" + cemetery.cemeterySvg %>

View File

@ -43,7 +43,7 @@
<% if (workOrderPrints.length > 0) { %>
<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">
<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>
</span>
<% } %>
@ -228,8 +228,8 @@
</div>
</div>
</div>
<div class="columns is-desktop">
<div class="column">
<div class="columns is-multiline">
<div class="column is-6-widescreen is-full-desktop is-full-tablet">
<div class="panel">
<a class="panel-block" href="<%= urlPrefix %>/reports">
<div class="media">
@ -246,7 +246,7 @@
</a>
</div>
</div>
<div class="column">
<div class="column is-6-widescreen is-full-desktop is-full-tablet">
<div class="panel">
<a class="panel-block" href="https://cityssm.github.io/sunrise-cms/docs" rel="noopener noreferrer" target="_blank">
<div class="media">

View File

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

View File

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

View File

@ -128,7 +128,7 @@
</div>
</div>
<div class="columns is-desktop">
<div class="columns">
<div class="column">
<form id="form--workOrderEdit">
<input id="workOrderEdit--workOrderId" name="workOrderId" type="hidden" value="<%= workOrder.workOrderId %>" />
@ -218,7 +218,40 @@
<% if (!isCreate) { %>
<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">
<%
const tabToSelect = (workOrder.workOrderContracts.length > 0 || workOrder.workOrderBurialSites.length === 0 ? "contracts" : "burialSites");
@ -241,27 +274,62 @@
</div>
<div class="tab-container">
<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>
<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>
</div>
</div>
</div>
<% } %>
</div>
<% if (!isCreate) { %>
<div class="column is-full-desktop is-4-widescreen">
<div class="panel" id="panel--milestones">
<div class="panel-heading">
<div class="level is-mobile">
<div class="level-left">
<div class="level-item">
<h2 class="title is-5 has-text-white has-text-weight-bold">Milestones</h2>
</div>
</div>
<div class="level-right">
<div class="level-item">
<button class="button is-small is-success" id="button--addMilestone" type="button">
<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>
<span>Add Milestone</span>
</button>
</div>
<div class="level-item">
<div class="dropdown is-right has-text-weight-normal">
<div class="dropdown-trigger">
<button class="button is-small has-tooltip-left" data-tooltip="Milestone Options" type="button" aria-label="Options">
<span class="icon is-small"><i class="fas fa-ellipsis-v" aria-hidden="true"></i></span>
</button>
</div>
<div class="dropdown-menu">
<div class="dropdown-content">
<a class="dropdown-item" href="<%= urlPrefix %>/api/<%= user.userProperties.apiKey %>/milestoneICS/?workOrderId=<%= workOrder.workOrderId %>">
<span class="icon is-small"><i class="fas fa-calendar" aria-hidden="true"></i></span>
<span>Download iCalendar</span>
</a>
<a class="dropdown-item" href="<%= urlPrefix %>/reports/workOrderMilestones-byWorkOrderId/?workOrderId=<%= workOrder.workOrderId %>" target="_blank" download>
<span class="icon is-small"><i class="fas fa-download" aria-hidden="true"></i></span>
<span>Export as CSV</span>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<% } %>
</div>
<% if (!isCreate) { %>
<div class="panel">
@ -287,53 +355,6 @@
<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-heading">
<div class="level is-mobile">
<div class="level-left">
<div class="level-item">
<h2 class="title is-5 has-text-white has-text-weight-bold">Milestones</h2>
</div>
</div>
<div class="level-right">
<div class="level-item">
<button class="button is-small is-success" id="button--addMilestone" type="button">
<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>
<span>Add Milestone</span>
</button>
</div>
<div class="level-item">
<div class="dropdown is-right has-text-weight-normal">
<div class="dropdown-trigger">
<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>
</button>
</div>
<div class="dropdown-menu">
<div class="dropdown-content">
<a class="dropdown-item" href="<%= urlPrefix %>/api/<%= user.userProperties.apiKey %>/milestoneICS/?workOrderId=<%= workOrder.workOrderId %>">
<span class="icon is-small"><i class="fas fa-calendar" aria-hidden="true"></i></span>
<span>Download iCalendar</span>
</a>
<a class="dropdown-item" href="<%= urlPrefix %>/reports/workOrderMilestones-byWorkOrderId/?workOrderId=<%= workOrder.workOrderId %>" target="_blank" download>
<span class="icon is-small"><i class="fas fa-download" aria-hidden="true"></i></span>
<span>Export as CSV</span>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<% } %>
</div>
<%- include('_footerA'); -%>