linting and development

pull/11/head
Dan Gowans 2025-04-22 13:51:02 -04:00
parent b8c9fd723d
commit df3f7725d3
17 changed files with 382 additions and 330 deletions

View File

@ -16,11 +16,11 @@ export declare function getCommittalTypeById(committalTypeId: number): Promise<C
export declare function getCommittalTypes(): Promise<CommittalType[]>; export declare function getCommittalTypes(): Promise<CommittalType[]>;
export declare function getWorkOrderTypeById(workOrderTypeId: number): Promise<WorkOrderType | undefined>; export declare function getWorkOrderTypeById(workOrderTypeId: number): Promise<WorkOrderType | undefined>;
export declare function getWorkOrderTypes(): Promise<WorkOrderType[]>; export declare function getWorkOrderTypes(): Promise<WorkOrderType[]>;
type CacheTableNames = 'BurialSiteStatuses' | 'BurialSiteTypeFields' | 'BurialSiteTypes' | 'CommittalTypes' | 'ContractTypeFields' | 'ContractTypePrints' | 'ContractTypes' | 'FeeCategories' | 'Fees' | 'IntermentContainerTypes' | 'WorkOrderMilestoneTypes' | 'WorkOrderTypes';
export declare function clearCacheByTableName(tableName: CacheTableNames, relayMessage?: boolean): void;
export declare function clearCaches(): void;
export declare function getWorkOrderMilestoneTypeById(workOrderMilestoneTypeId: number): Promise<WorkOrderMilestoneType | undefined>; export declare function getWorkOrderMilestoneTypeById(workOrderMilestoneTypeId: number): Promise<WorkOrderMilestoneType | undefined>;
export declare function getWorkOrderMilestoneTypeByWorkOrderMilestoneType(workOrderMilestoneTypeString: string): Promise<WorkOrderMilestoneType | undefined>; export declare function getWorkOrderMilestoneTypeByWorkOrderMilestoneType(workOrderMilestoneTypeString: string): Promise<WorkOrderMilestoneType | undefined>;
export declare function getWorkOrderMilestoneTypes(): Promise<WorkOrderMilestoneType[]>; export declare function getWorkOrderMilestoneTypes(): Promise<WorkOrderMilestoneType[]>;
export declare function preloadCaches(): Promise<void>; export declare function preloadCaches(): Promise<void>;
type CacheTableNames = 'BurialSiteStatuses' | 'BurialSiteTypeFields' | 'BurialSiteTypes' | 'CommittalTypes' | 'ContractTypeFields' | 'ContractTypePrints' | 'ContractTypes' | 'FeeCategories' | 'Fees' | 'IntermentContainerTypes' | 'WorkOrderMilestoneTypes' | 'WorkOrderTypes';
export declare function clearCacheByTableName(tableName: CacheTableNames, relayMessage?: boolean): void;
export declare function clearCaches(): void;
export {}; export {};

View File

@ -1,3 +1,5 @@
// eslint-disable-next-line @eslint-community/eslint-comments/disable-enable-pair
/* eslint-disable perfectionist/sort-modules */
import cluster from 'node:cluster'; import cluster from 'node:cluster';
import Debug from 'debug'; import Debug from 'debug';
import getBurialSiteStatusesFromDatabase from '../database/getBurialSiteStatuses.js'; import getBurialSiteStatusesFromDatabase from '../database/getBurialSiteStatuses.js';
@ -137,6 +139,37 @@ function clearWorkOrderTypesCache() {
* Work Order Milestone Types * Work Order Milestone Types
*/ */
let workOrderMilestoneTypes; let workOrderMilestoneTypes;
export async function getWorkOrderMilestoneTypeById(workOrderMilestoneTypeId) {
const cachedWorkOrderMilestoneTypes = await getWorkOrderMilestoneTypes();
return cachedWorkOrderMilestoneTypes.find((currentWorkOrderMilestoneType) => currentWorkOrderMilestoneType.workOrderMilestoneTypeId ===
workOrderMilestoneTypeId);
}
export async function getWorkOrderMilestoneTypeByWorkOrderMilestoneType(workOrderMilestoneTypeString) {
const cachedWorkOrderMilestoneTypes = await getWorkOrderMilestoneTypes();
const workOrderMilestoneTypeLowerCase = workOrderMilestoneTypeString.toLowerCase();
return cachedWorkOrderMilestoneTypes.find((currentWorkOrderMilestoneType) => currentWorkOrderMilestoneType.workOrderMilestoneType.toLowerCase() ===
workOrderMilestoneTypeLowerCase);
}
export async function getWorkOrderMilestoneTypes() {
workOrderMilestoneTypes ??= await getWorkOrderMilestoneTypesFromDatabase();
return workOrderMilestoneTypes;
}
function clearWorkOrderMilestoneTypesCache() {
workOrderMilestoneTypes = undefined;
}
/*
* Cache Management
*/
export async function preloadCaches() {
debug('Preloading caches');
await getBurialSiteStatuses();
await getBurialSiteTypes();
await getContractTypes();
await getCommittalTypes();
await getIntermentContainerTypes();
await getWorkOrderTypes();
await getWorkOrderMilestoneTypes();
}
export function clearCacheByTableName(tableName, relayMessage = true) { export function clearCacheByTableName(tableName, relayMessage = true) {
switch (tableName) { switch (tableName) {
case 'BurialSiteStatuses': { case 'BurialSiteStatuses': {
@ -201,34 +234,6 @@ export function clearCaches() {
clearWorkOrderTypesCache(); clearWorkOrderTypesCache();
clearWorkOrderMilestoneTypesCache(); clearWorkOrderMilestoneTypesCache();
} }
export async function getWorkOrderMilestoneTypeById(workOrderMilestoneTypeId) {
const cachedWorkOrderMilestoneTypes = await getWorkOrderMilestoneTypes();
return cachedWorkOrderMilestoneTypes.find((currentWorkOrderMilestoneType) => currentWorkOrderMilestoneType.workOrderMilestoneTypeId ===
workOrderMilestoneTypeId);
}
export async function getWorkOrderMilestoneTypeByWorkOrderMilestoneType(workOrderMilestoneTypeString) {
const cachedWorkOrderMilestoneTypes = await getWorkOrderMilestoneTypes();
const workOrderMilestoneTypeLowerCase = workOrderMilestoneTypeString.toLowerCase();
return cachedWorkOrderMilestoneTypes.find((currentWorkOrderMilestoneType) => currentWorkOrderMilestoneType.workOrderMilestoneType.toLowerCase() ===
workOrderMilestoneTypeLowerCase);
}
export async function getWorkOrderMilestoneTypes() {
workOrderMilestoneTypes ??= await getWorkOrderMilestoneTypesFromDatabase();
return workOrderMilestoneTypes;
}
export async function preloadCaches() {
debug('Preloading caches');
await getBurialSiteStatuses();
await getBurialSiteTypes();
await getContractTypes();
await getCommittalTypes();
await getIntermentContainerTypes();
await getWorkOrderTypes();
await getWorkOrderMilestoneTypes();
}
function clearWorkOrderMilestoneTypesCache() {
workOrderMilestoneTypes = undefined;
}
process.on('message', (message) => { process.on('message', (message) => {
if (message.messageType === 'clearCache' && message.pid !== process.pid) { if (message.messageType === 'clearCache' && message.pid !== process.pid) {
debug(`Clearing cache: ${message.tableName}`); debug(`Clearing cache: ${message.tableName}`);

View File

@ -1,3 +1,6 @@
// eslint-disable-next-line @eslint-community/eslint-comments/disable-enable-pair
/* eslint-disable perfectionist/sort-modules */
import cluster from 'node:cluster' import cluster from 'node:cluster'
import Debug from 'debug' import Debug from 'debug'
@ -254,6 +257,60 @@ function clearWorkOrderTypesCache(): void {
let workOrderMilestoneTypes: WorkOrderMilestoneType[] | undefined let workOrderMilestoneTypes: WorkOrderMilestoneType[] | undefined
export async function getWorkOrderMilestoneTypeById(
workOrderMilestoneTypeId: number
): Promise<WorkOrderMilestoneType | undefined> {
const cachedWorkOrderMilestoneTypes = await getWorkOrderMilestoneTypes()
return cachedWorkOrderMilestoneTypes.find(
(currentWorkOrderMilestoneType) =>
currentWorkOrderMilestoneType.workOrderMilestoneTypeId ===
workOrderMilestoneTypeId
)
}
export async function getWorkOrderMilestoneTypeByWorkOrderMilestoneType(
workOrderMilestoneTypeString: string
): Promise<WorkOrderMilestoneType | undefined> {
const cachedWorkOrderMilestoneTypes = await getWorkOrderMilestoneTypes()
const workOrderMilestoneTypeLowerCase =
workOrderMilestoneTypeString.toLowerCase()
return cachedWorkOrderMilestoneTypes.find(
(currentWorkOrderMilestoneType) =>
currentWorkOrderMilestoneType.workOrderMilestoneType.toLowerCase() ===
workOrderMilestoneTypeLowerCase
)
}
export async function getWorkOrderMilestoneTypes(): Promise<
WorkOrderMilestoneType[]
> {
workOrderMilestoneTypes ??= await getWorkOrderMilestoneTypesFromDatabase()
return workOrderMilestoneTypes
}
function clearWorkOrderMilestoneTypesCache(): void {
workOrderMilestoneTypes = undefined
}
/*
* Cache Management
*/
export async function preloadCaches(): Promise<void> {
debug('Preloading caches')
await getBurialSiteStatuses()
await getBurialSiteTypes()
await getContractTypes()
await getCommittalTypes()
await getIntermentContainerTypes()
await getWorkOrderTypes()
await getWorkOrderMilestoneTypes()
}
type CacheTableNames = type CacheTableNames =
| 'BurialSiteStatuses' | 'BurialSiteStatuses'
| 'BurialSiteTypeFields' | 'BurialSiteTypeFields'
@ -346,55 +403,6 @@ export function clearCaches(): void {
clearWorkOrderMilestoneTypesCache() clearWorkOrderMilestoneTypesCache()
} }
export async function getWorkOrderMilestoneTypeById(
workOrderMilestoneTypeId: number
): Promise<WorkOrderMilestoneType | undefined> {
const cachedWorkOrderMilestoneTypes = await getWorkOrderMilestoneTypes()
return cachedWorkOrderMilestoneTypes.find(
(currentWorkOrderMilestoneType) =>
currentWorkOrderMilestoneType.workOrderMilestoneTypeId ===
workOrderMilestoneTypeId
)
}
export async function getWorkOrderMilestoneTypeByWorkOrderMilestoneType(
workOrderMilestoneTypeString: string
): Promise<WorkOrderMilestoneType | undefined> {
const cachedWorkOrderMilestoneTypes = await getWorkOrderMilestoneTypes()
const workOrderMilestoneTypeLowerCase =
workOrderMilestoneTypeString.toLowerCase()
return cachedWorkOrderMilestoneTypes.find(
(currentWorkOrderMilestoneType) =>
currentWorkOrderMilestoneType.workOrderMilestoneType.toLowerCase() ===
workOrderMilestoneTypeLowerCase
)
}
export async function getWorkOrderMilestoneTypes(): Promise<
WorkOrderMilestoneType[]
> {
workOrderMilestoneTypes ??= await getWorkOrderMilestoneTypesFromDatabase()
return workOrderMilestoneTypes
}
export async function preloadCaches(): Promise<void> {
debug('Preloading caches')
await getBurialSiteStatuses()
await getBurialSiteTypes()
await getContractTypes()
await getCommittalTypes()
await getIntermentContainerTypes()
await getWorkOrderTypes()
await getWorkOrderMilestoneTypes()
}
function clearWorkOrderMilestoneTypesCache(): void {
workOrderMilestoneTypes = undefined
}
process.on('message', (message: WorkerMessage) => { process.on('message', (message: WorkerMessage) => {
if (message.messageType === 'clearCache' && message.pid !== process.pid) { if (message.messageType === 'clearCache' && message.pid !== process.pid) {
debug(`Clearing cache: ${(message as ClearCacheWorkerMessage).tableName}`) debug(`Clearing cache: ${(message as ClearCacheWorkerMessage).tableName}`)

View File

@ -192,7 +192,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
latitudeElement: document.querySelector('#burialSite--burialSiteLatitude'), latitudeElement: document.querySelector('#burialSite--burialSiteLatitude'),
longitudeElement: document.querySelector('#burialSite--burialSiteLongitude'), longitudeElement: document.querySelector('#burialSite--burialSiteLongitude'),
callbackFunction: () => { callbackFunction: () => {
sunrise.setUnsavedChanges(); setUnsavedChanges();
} }
}); });
}); });

View File

@ -298,7 +298,7 @@ declare const exports: Record<string, unknown>
) as HTMLInputElement, ) as HTMLInputElement,
callbackFunction: () => { callbackFunction: () => {
sunrise.setUnsavedChanges() setUnsavedChanges()
} }
}) })
}) })

View File

@ -15,7 +15,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
latitudeElement: document.querySelector('#cemetery--cemeteryLatitude'), latitudeElement: document.querySelector('#cemetery--cemeteryLatitude'),
longitudeElement: document.querySelector('#cemetery--cemeteryLongitude'), longitudeElement: document.querySelector('#cemetery--cemeteryLongitude'),
callbackFunction: () => { callbackFunction: () => {
sunrise.setUnsavedChanges(); setUnsavedChanges();
} }
}); });
}); });

View File

@ -34,7 +34,7 @@ declare const exports: Record<string, unknown>
) as HTMLInputElement, ) as HTMLInputElement,
callbackFunction: () => { callbackFunction: () => {
sunrise.setUnsavedChanges() setUnsavedChanges()
} }
}) })
}) })

View File

@ -5,6 +5,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
(() => { (() => {
const sunrise = exports.sunrise; const sunrise = exports.sunrise;
const feeCategoriesContainerElement = document.querySelector('#container--feeCategories'); const feeCategoriesContainerElement = document.querySelector('#container--feeCategories');
const feeCategoryContainerClassName = 'container--feeCategory';
const feeCategoryContainerSelector = `.${feeCategoryContainerClassName}`;
let feeCategories = exports.feeCategories; let feeCategories = exports.feeCategories;
delete exports.feeCategories; delete exports.feeCategories;
function getFeeCategory(feeCategoryId) { function getFeeCategory(feeCategoryId) {
@ -24,7 +26,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
feeCategoriesContainerElement.innerHTML = ''; feeCategoriesContainerElement.innerHTML = '';
for (const feeCategory of feeCategories) { for (const feeCategory of feeCategories) {
const feeCategoryContainerElement = document.createElement('section'); const feeCategoryContainerElement = document.createElement('section');
feeCategoryContainerElement.className = 'panel container--feeCategory'; feeCategoryContainerElement.className = `panel ${feeCategoryContainerClassName}`;
feeCategoryContainerElement.dataset.feeCategoryId = feeCategoryContainerElement.dataset.feeCategoryId =
feeCategory.feeCategoryId.toString(); feeCategory.feeCategoryId.toString();
// eslint-disable-next-line no-unsanitized/property // eslint-disable-next-line no-unsanitized/property
@ -221,7 +223,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
}); });
}); });
function openEditFeeCategory(clickEvent) { function openEditFeeCategory(clickEvent) {
const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest('.container--feeCategory').dataset.feeCategoryId ?? '', 10); const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest(feeCategoryContainerSelector).dataset.feeCategoryId ?? '', 10);
const feeCategory = getFeeCategory(feeCategoryId); const feeCategory = getFeeCategory(feeCategoryId);
let editCloseModalFunction; let editCloseModalFunction;
function doUpdateFeeCategory(submitEvent) { function doUpdateFeeCategory(submitEvent) {
@ -266,7 +268,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
}); });
} }
function confirmDeleteFeeCategory(clickEvent) { function confirmDeleteFeeCategory(clickEvent) {
const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest('.container--feeCategory').dataset.feeCategoryId ?? '', 10); const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest(feeCategoryContainerSelector).dataset.feeCategoryId ?? '', 10);
function doDelete() { function doDelete() {
cityssm.postJSON(`${sunrise.urlPrefix}/admin/doDeleteFeeCategory`, { cityssm.postJSON(`${sunrise.urlPrefix}/admin/doDeleteFeeCategory`, {
feeCategoryId feeCategoryId
@ -297,8 +299,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
function moveFeeCategory(clickEvent) { function moveFeeCategory(clickEvent) {
const buttonElement = clickEvent.currentTarget; const buttonElement = clickEvent.currentTarget;
const feeCategoryId = buttonElement.closest('.container--feeCategory').dataset const feeCategoryId = buttonElement.closest(feeCategoryContainerSelector)
.feeCategoryId ?? ''; .dataset.feeCategoryId ?? '';
cityssm.postJSON(`${sunrise.urlPrefix}/admin/${buttonElement.dataset.direction === 'up' cityssm.postJSON(`${sunrise.urlPrefix}/admin/${buttonElement.dataset.direction === 'up'
? 'doMoveFeeCategoryUp' ? 'doMoveFeeCategoryUp'
: 'doMoveFeeCategoryDown'}`, { : 'doMoveFeeCategoryDown'}`, {
@ -323,7 +325,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
* Fees * Fees
*/ */
function openAddFee(clickEvent) { function openAddFee(clickEvent) {
const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest('.container--feeCategory').dataset.feeCategoryId ?? '', 10); const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest(feeCategoryContainerSelector).dataset.feeCategoryId ?? '', 10);
let addCloseModalFunction; let addCloseModalFunction;
function doAddFee(submitEvent) { function doAddFee(submitEvent) {
submitEvent.preventDefault(); submitEvent.preventDefault();
@ -427,7 +429,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
clickEvent.preventDefault(); clickEvent.preventDefault();
const feeContainerElement = clickEvent.currentTarget.closest('.container--fee'); const feeContainerElement = clickEvent.currentTarget.closest('.container--fee');
const feeId = Number.parseInt(feeContainerElement.dataset.feeId ?? '', 10); const feeId = Number.parseInt(feeContainerElement.dataset.feeId ?? '', 10);
const feeCategoryId = Number.parseInt(feeContainerElement.closest('.container--feeCategory') const feeCategoryId = Number.parseInt(feeContainerElement.closest(feeCategoryContainerSelector)
.dataset.feeCategoryId ?? ''); .dataset.feeCategoryId ?? '');
const feeCategory = getFeeCategory(feeCategoryId); const feeCategory = getFeeCategory(feeCategoryId);
const fee = getFee(feeCategory, feeId); const fee = getFee(feeCategory, feeId);
@ -472,7 +474,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
clickEvent.preventDefault(); clickEvent.preventDefault();
const feeContainerElement = clickEvent.currentTarget.closest('.container--fee'); const feeContainerElement = clickEvent.currentTarget.closest('.container--fee');
const feeId = Number.parseInt(feeContainerElement.dataset.feeId ?? '', 10); const feeId = Number.parseInt(feeContainerElement.dataset.feeId ?? '', 10);
const feeCategoryId = Number.parseInt(feeContainerElement.closest('.container--feeCategory') const feeCategoryId = Number.parseInt(feeContainerElement.closest(feeCategoryContainerSelector)
.dataset.feeCategoryId ?? ''); .dataset.feeCategoryId ?? '');
const feeCategory = getFeeCategory(feeCategoryId); const feeCategory = getFeeCategory(feeCategoryId);
const fee = getFee(feeCategory, feeId); const fee = getFee(feeCategory, feeId);

View File

@ -24,6 +24,9 @@ declare const exports: Record<string, unknown>
'#container--feeCategories' '#container--feeCategories'
) as HTMLElement ) as HTMLElement
const feeCategoryContainerClassName = 'container--feeCategory'
const feeCategoryContainerSelector = `.${feeCategoryContainerClassName}`
let feeCategories = exports.feeCategories as FeeCategory[] let feeCategories = exports.feeCategories as FeeCategory[]
delete exports.feeCategories delete exports.feeCategories
@ -66,7 +69,7 @@ declare const exports: Record<string, unknown>
for (const feeCategory of feeCategories) { for (const feeCategory of feeCategories) {
const feeCategoryContainerElement = document.createElement('section') const feeCategoryContainerElement = document.createElement('section')
feeCategoryContainerElement.className = 'panel container--feeCategory' feeCategoryContainerElement.className = `panel ${feeCategoryContainerClassName}`
feeCategoryContainerElement.dataset.feeCategoryId = feeCategoryContainerElement.dataset.feeCategoryId =
feeCategory.feeCategoryId.toString() feeCategory.feeCategoryId.toString()
@ -343,7 +346,7 @@ declare const exports: Record<string, unknown>
const feeCategoryId = Number.parseInt( const feeCategoryId = Number.parseInt(
( (
(clickEvent.currentTarget as HTMLElement).closest( (clickEvent.currentTarget as HTMLElement).closest(
'.container--feeCategory' feeCategoryContainerSelector
) as HTMLElement ) as HTMLElement
).dataset.feeCategoryId ?? '', ).dataset.feeCategoryId ?? '',
10 10
@ -423,7 +426,7 @@ declare const exports: Record<string, unknown>
const feeCategoryId = Number.parseInt( const feeCategoryId = Number.parseInt(
( (
(clickEvent.currentTarget as HTMLElement).closest( (clickEvent.currentTarget as HTMLElement).closest(
'.container--feeCategory' feeCategoryContainerSelector
) as HTMLElement ) as HTMLElement
).dataset.feeCategoryId ?? '', ).dataset.feeCategoryId ?? '',
10 10
@ -467,8 +470,8 @@ declare const exports: Record<string, unknown>
const buttonElement = clickEvent.currentTarget as HTMLButtonElement const buttonElement = clickEvent.currentTarget as HTMLButtonElement
const feeCategoryId = const feeCategoryId =
(buttonElement.closest('.container--feeCategory') as HTMLElement).dataset (buttonElement.closest(feeCategoryContainerSelector) as HTMLElement)
.feeCategoryId ?? '' .dataset.feeCategoryId ?? ''
cityssm.postJSON( cityssm.postJSON(
`${sunrise.urlPrefix}/admin/${ `${sunrise.urlPrefix}/admin/${
@ -505,7 +508,7 @@ declare const exports: Record<string, unknown>
const feeCategoryId = Number.parseInt( const feeCategoryId = Number.parseInt(
( (
(clickEvent.currentTarget as HTMLElement).closest( (clickEvent.currentTarget as HTMLElement).closest(
'.container--feeCategory' feeCategoryContainerSelector
) as HTMLElement ) as HTMLElement
).dataset.feeCategoryId ?? '', ).dataset.feeCategoryId ?? '',
10 10
@ -675,7 +678,7 @@ declare const exports: Record<string, unknown>
const feeId = Number.parseInt(feeContainerElement.dataset.feeId ?? '', 10) const feeId = Number.parseInt(feeContainerElement.dataset.feeId ?? '', 10)
const feeCategoryId = Number.parseInt( const feeCategoryId = Number.parseInt(
(feeContainerElement.closest('.container--feeCategory') as HTMLElement) (feeContainerElement.closest(feeCategoryContainerSelector) as HTMLElement)
.dataset.feeCategoryId ?? '' .dataset.feeCategoryId ?? ''
) )
@ -754,7 +757,7 @@ declare const exports: Record<string, unknown>
const feeId = Number.parseInt(feeContainerElement.dataset.feeId ?? '', 10) const feeId = Number.parseInt(feeContainerElement.dataset.feeId ?? '', 10)
const feeCategoryId = Number.parseInt( const feeCategoryId = Number.parseInt(
(feeContainerElement.closest('.container--feeCategory') as HTMLElement) (feeContainerElement.closest(feeCategoryContainerSelector) as HTMLElement)
.dataset.feeCategoryId ?? '' .dataset.feeCategoryId ?? ''
) )

View File

@ -44,6 +44,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
/* /*
* Leaflet Mapping * Leaflet Mapping
*/ */
const coordinatePrecision = 8;
const leafletConstants = { const leafletConstants = {
tileLayerURL: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', tileLayerURL: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
defaultZoom: 15, defaultZoom: 15,
@ -98,8 +99,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
clickEvent.preventDefault(); clickEvent.preventDefault();
if (currentMarker !== undefined) { if (currentMarker !== undefined) {
const mapCoordinates = currentMarker.getLatLng(); const mapCoordinates = currentMarker.getLatLng();
options.latitudeElement.value = mapCoordinates.lat.toFixed(8); options.latitudeElement.value = mapCoordinates.lat.toFixed(coordinatePrecision);
options.longitudeElement.value = mapCoordinates.lng.toFixed(8); options.longitudeElement.value = mapCoordinates.lng.toFixed(coordinatePrecision);
options.callbackFunction(mapCoordinates.lat, mapCoordinates.lng); options.callbackFunction(mapCoordinates.lat, mapCoordinates.lng);
} }
closeModalFunction(); closeModalFunction();

View File

@ -92,6 +92,8 @@ declare const exports: Record<string, unknown> & {
* Leaflet Mapping * Leaflet Mapping
*/ */
const coordinatePrecision = 8
const leafletConstants = { const leafletConstants = {
tileLayerURL: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', tileLayerURL: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
@ -171,8 +173,8 @@ declare const exports: Record<string, unknown> & {
if (currentMarker !== undefined) { if (currentMarker !== undefined) {
const mapCoordinates = currentMarker.getLatLng() as Leaflet.LatLng const mapCoordinates = currentMarker.getLatLng() as Leaflet.LatLng
options.latitudeElement.value = mapCoordinates.lat.toFixed(8) options.latitudeElement.value = mapCoordinates.lat.toFixed(coordinatePrecision)
options.longitudeElement.value = mapCoordinates.lng.toFixed(8) options.longitudeElement.value = mapCoordinates.lng.toFixed(coordinatePrecision)
options.callbackFunction(mapCoordinates.lat, mapCoordinates.lng) options.callbackFunction(mapCoordinates.lat, mapCoordinates.lng)
} }

View File

@ -37,45 +37,6 @@ const user = {
apiKey: '' apiKey: ''
} }
}; };
function purgeTables() {
console.time('purgeTables');
const tablesToPurge = [
'WorkOrderMilestones',
'WorkOrderComments',
'WorkOrderBurialSites',
'WorkOrderContracts',
'WorkOrders',
'ContractTransactions',
'ContractFees',
'ContractFields',
'ContractComments',
'ContractInterments',
'Contracts',
'FuneralHomes',
'BurialSiteFields',
'BurialSiteComments',
'BurialSites'
];
const database = sqlite(databasePath);
for (const tableName of tablesToPurge) {
database.prepare(`delete from ${tableName}`).run();
database
.prepare('delete from sqlite_sequence where name = ?')
.run(tableName);
}
database.close();
console.timeEnd('purgeTables');
}
function purgeConfigTables() {
console.time('purgeConfigTables');
const database = sqlite(databasePath);
database.prepare('delete from Cemeteries').run();
database
.prepare("delete from sqlite_sequence where name in ('Cemeteries')")
.run();
database.close();
console.timeEnd('purgeConfigTables');
}
function formatDateString(year, month, day) { function formatDateString(year, month, day) {
const formattedYear = `0000${year}`.slice(-4); const formattedYear = `0000${year}`.slice(-4);
const formattedMonth = `00${month}`.slice(-2); const formattedMonth = `00${month}`.slice(-2);
@ -111,8 +72,11 @@ async function importFromMasterCSV() {
(masterRow.CM_RANGE2 === '0' ? '' : masterRow.CM_RANGE2); (masterRow.CM_RANGE2 === '0' ? '' : masterRow.CM_RANGE2);
const burialSiteNameSegment3 = (masterRow.CM_LOT1 === '0' ? '' : masterRow.CM_LOT1) + const burialSiteNameSegment3 = (masterRow.CM_LOT1 === '0' ? '' : masterRow.CM_LOT1) +
(masterRow.CM_LOT2 === '0' ? '' : masterRow.CM_LOT2); (masterRow.CM_LOT2 === '0' ? '' : masterRow.CM_LOT2);
const burialSiteNameSegment4 = (masterRow.CM_GRAVE1 === '0' ? '' : masterRow.CM_GRAVE1) + let burialSiteNameSegment4 = (masterRow.CM_GRAVE1 === '0' ? '' : masterRow.CM_GRAVE1) +
(masterRow.CM_GRAVE2 === '0' ? '' : masterRow.CM_GRAVE2); (masterRow.CM_GRAVE2 === '0' ? '' : masterRow.CM_GRAVE2);
if (burialSiteNameSegment4 === '') {
burialSiteNameSegment4 = '1';
}
const burialSiteName = buildBurialSiteName(masterRow.CM_CEMETERY, { const burialSiteName = buildBurialSiteName(masterRow.CM_CEMETERY, {
burialSiteNameSegment1, burialSiteNameSegment1,
burialSiteNameSegment2, burialSiteNameSegment2,
@ -180,8 +144,8 @@ async function importFromMasterCSV() {
purchaserAddress1: masterRow.CM_ADDRESS, purchaserAddress1: masterRow.CM_ADDRESS,
purchaserAddress2: '', purchaserAddress2: '',
purchaserCity: masterRow.CM_CITY, purchaserCity: masterRow.CM_CITY,
purchaserProvince: masterRow.CM_PROV,
purchaserPostalCode, purchaserPostalCode,
purchaserProvince: masterRow.CM_PROV,
purchaserEmail: '', purchaserEmail: '',
purchaserPhoneNumber: '', purchaserPhoneNumber: '',
deceasedName: masterRow.CM_DECEASED_NAME === '' deceasedName: masterRow.CM_DECEASED_NAME === ''
@ -190,8 +154,8 @@ async function importFromMasterCSV() {
deceasedAddress1: masterRow.CM_ADDRESS, deceasedAddress1: masterRow.CM_ADDRESS,
deceasedAddress2: '', deceasedAddress2: '',
deceasedCity: masterRow.CM_CITY, deceasedCity: masterRow.CM_CITY,
deceasedProvince: masterRow.CM_PROV, deceasedPostalCode: purchaserPostalCode,
deceasedPostalCode: purchaserPostalCode deceasedProvince: masterRow.CM_PROV
}, user); }, user);
if (masterRow.CM_REMARK1 !== '') { if (masterRow.CM_REMARK1 !== '') {
await addContractComment({ await addContractComment({
@ -281,16 +245,16 @@ async function importFromMasterCSV() {
purchaserAddress1: masterRow.CM_ADDRESS, purchaserAddress1: masterRow.CM_ADDRESS,
purchaserAddress2: '', purchaserAddress2: '',
purchaserCity: masterRow.CM_CITY, purchaserCity: masterRow.CM_CITY,
purchaserProvince: masterRow.CM_PROV,
purchaserPostalCode: deceasedPostalCode, purchaserPostalCode: deceasedPostalCode,
purchaserPhoneNumber: '', purchaserProvince: masterRow.CM_PROV,
purchaserEmail: '', purchaserEmail: '',
purchaserPhoneNumber: '',
deceasedName: masterRow.CM_DECEASED_NAME, deceasedName: masterRow.CM_DECEASED_NAME,
deceasedAddress1: masterRow.CM_ADDRESS, deceasedAddress1: masterRow.CM_ADDRESS,
deceasedAddress2: '', deceasedAddress2: '',
deceasedCity: masterRow.CM_CITY, deceasedCity: masterRow.CM_CITY,
deceasedProvince: masterRow.CM_PROV,
deceasedPostalCode, deceasedPostalCode,
deceasedProvince: masterRow.CM_PROV,
birthDateString: '', birthDateString: '',
birthPlace: '', birthPlace: '',
deathDateString, deathDateString,
@ -363,8 +327,11 @@ async function importFromPrepaidCSV() {
(prepaidRow.CMPP_RANGE2 === '0' ? '' : prepaidRow.CMPP_RANGE2); (prepaidRow.CMPP_RANGE2 === '0' ? '' : prepaidRow.CMPP_RANGE2);
const burialSiteNameSegment3 = (prepaidRow.CMPP_LOT1 === '0' ? '' : prepaidRow.CMPP_LOT1) + const burialSiteNameSegment3 = (prepaidRow.CMPP_LOT1 === '0' ? '' : prepaidRow.CMPP_LOT1) +
(prepaidRow.CMPP_LOT2 === '0' ? '' : prepaidRow.CMPP_LOT2); (prepaidRow.CMPP_LOT2 === '0' ? '' : prepaidRow.CMPP_LOT2);
const burialSiteNameSegment4 = (prepaidRow.CMPP_GRAVE1 === '0' ? '' : prepaidRow.CMPP_GRAVE1) + let burialSiteNameSegment4 = (prepaidRow.CMPP_GRAVE1 === '0' ? '' : prepaidRow.CMPP_GRAVE1) +
(prepaidRow.CMPP_GRAVE2 === '0' ? '' : prepaidRow.CMPP_GRAVE2); (prepaidRow.CMPP_GRAVE2 === '0' ? '' : prepaidRow.CMPP_GRAVE2);
if (burialSiteNameSegment4 === '') {
burialSiteNameSegment4 = '1';
}
const burialSiteName = buildBurialSiteName(cemeteryKey, { const burialSiteName = buildBurialSiteName(cemeteryKey, {
burialSiteNameSegment1, burialSiteNameSegment1,
burialSiteNameSegment2, burialSiteNameSegment2,
@ -596,8 +563,11 @@ async function importFromWorkOrderCSV() {
(workOrderRow.WO_RANGE2 === '0' ? '' : workOrderRow.WO_RANGE2); (workOrderRow.WO_RANGE2 === '0' ? '' : workOrderRow.WO_RANGE2);
const burialSiteNameSegment3 = (workOrderRow.WO_LOT1 === '0' ? '' : workOrderRow.WO_LOT1) + const burialSiteNameSegment3 = (workOrderRow.WO_LOT1 === '0' ? '' : workOrderRow.WO_LOT1) +
(workOrderRow.WO_LOT2 === '0' ? '' : workOrderRow.WO_LOT2); (workOrderRow.WO_LOT2 === '0' ? '' : workOrderRow.WO_LOT2);
const burialSiteNameSegment4 = (workOrderRow.WO_GRAVE1 === '0' ? '' : workOrderRow.WO_GRAVE1) + let burialSiteNameSegment4 = (workOrderRow.WO_GRAVE1 === '0' ? '' : workOrderRow.WO_GRAVE1) +
(workOrderRow.WO_GRAVE2 === '0' ? '' : workOrderRow.WO_GRAVE2); (workOrderRow.WO_GRAVE2 === '0' ? '' : workOrderRow.WO_GRAVE2);
if (burialSiteNameSegment4 === '') {
burialSiteNameSegment4 = '1';
}
const burialSiteName = buildBurialSiteName(workOrderRow.WO_CEMETERY, { const burialSiteName = buildBurialSiteName(workOrderRow.WO_CEMETERY, {
burialSiteNameSegment1, burialSiteNameSegment1,
burialSiteNameSegment2, burialSiteNameSegment2,
@ -806,6 +776,45 @@ async function importFromWorkOrderCSV() {
} }
console.timeEnd('importFromWorkOrderCSV'); console.timeEnd('importFromWorkOrderCSV');
} }
function purgeConfigTables() {
console.time('purgeConfigTables');
const database = sqlite(databasePath);
database.prepare('delete from Cemeteries').run();
database
.prepare("delete from sqlite_sequence where name in ('Cemeteries')")
.run();
database.close();
console.timeEnd('purgeConfigTables');
}
function purgeTables() {
console.time('purgeTables');
const tablesToPurge = [
'WorkOrderMilestones',
'WorkOrderComments',
'WorkOrderBurialSites',
'WorkOrderContracts',
'WorkOrders',
'ContractTransactions',
'ContractFees',
'ContractFields',
'ContractComments',
'ContractInterments',
'Contracts',
'FuneralHomes',
'BurialSiteFields',
'BurialSiteComments',
'BurialSites'
];
const database = sqlite(databasePath);
for (const tableName of tablesToPurge) {
database.prepare(`delete from ${tableName}`).run();
database
.prepare('delete from sqlite_sequence where name = ?')
.run(tableName);
}
database.close();
console.timeEnd('purgeTables');
}
console.log(`Started ${new Date().toLocaleString()}`); console.log(`Started ${new Date().toLocaleString()}`);
console.time('importFromCsv'); console.time('importFromCsv');
// Purge Tables // Purge Tables

View File

@ -195,58 +195,11 @@ const user: User = {
userProperties: { userProperties: {
canUpdate: true, canUpdate: true,
isAdmin: false, isAdmin: false,
apiKey: '' apiKey: ''
} }
} }
function purgeTables(): void {
console.time('purgeTables')
const tablesToPurge = [
'WorkOrderMilestones',
'WorkOrderComments',
'WorkOrderBurialSites',
'WorkOrderContracts',
'WorkOrders',
'ContractTransactions',
'ContractFees',
'ContractFields',
'ContractComments',
'ContractInterments',
'Contracts',
'FuneralHomes',
'BurialSiteFields',
'BurialSiteComments',
'BurialSites'
]
const database = sqlite(databasePath)
for (const tableName of tablesToPurge) {
database.prepare(`delete from ${tableName}`).run()
database
.prepare('delete from sqlite_sequence where name = ?')
.run(tableName)
}
database.close()
console.timeEnd('purgeTables')
}
function purgeConfigTables(): void {
console.time('purgeConfigTables')
const database = sqlite(databasePath)
database.prepare('delete from Cemeteries').run()
database
.prepare("delete from sqlite_sequence where name in ('Cemeteries')")
.run()
database.close()
console.timeEnd('purgeConfigTables')
}
function formatDateString( function formatDateString(
year: string, year: string,
month: string, month: string,
@ -301,10 +254,15 @@ async function importFromMasterCSV(): Promise<void> {
const burialSiteNameSegment3 = const burialSiteNameSegment3 =
(masterRow.CM_LOT1 === '0' ? '' : masterRow.CM_LOT1) + (masterRow.CM_LOT1 === '0' ? '' : masterRow.CM_LOT1) +
(masterRow.CM_LOT2 === '0' ? '' : masterRow.CM_LOT2) (masterRow.CM_LOT2 === '0' ? '' : masterRow.CM_LOT2)
const burialSiteNameSegment4 =
let burialSiteNameSegment4 =
(masterRow.CM_GRAVE1 === '0' ? '' : masterRow.CM_GRAVE1) + (masterRow.CM_GRAVE1 === '0' ? '' : masterRow.CM_GRAVE1) +
(masterRow.CM_GRAVE2 === '0' ? '' : masterRow.CM_GRAVE2) (masterRow.CM_GRAVE2 === '0' ? '' : masterRow.CM_GRAVE2)
if (burialSiteNameSegment4 === '') {
burialSiteNameSegment4 = '1'
}
const burialSiteName = buildBurialSiteName(masterRow.CM_CEMETERY, { const burialSiteName = buildBurialSiteName(masterRow.CM_CEMETERY, {
burialSiteNameSegment1, burialSiteNameSegment1,
burialSiteNameSegment2, burialSiteNameSegment2,
@ -413,11 +371,12 @@ async function importFromMasterCSV(): Promise<void> {
contractTypeFieldIds: '', contractTypeFieldIds: '',
purchaserName: masterRow.CM_PRENEED_OWNER, purchaserName: masterRow.CM_PRENEED_OWNER,
purchaserAddress1: masterRow.CM_ADDRESS, purchaserAddress1: masterRow.CM_ADDRESS,
purchaserAddress2: '', purchaserAddress2: '',
purchaserCity: masterRow.CM_CITY, purchaserCity: masterRow.CM_CITY,
purchaserProvince: masterRow.CM_PROV,
purchaserPostalCode, purchaserPostalCode,
purchaserProvince: masterRow.CM_PROV,
purchaserEmail: '', purchaserEmail: '',
purchaserPhoneNumber: '', purchaserPhoneNumber: '',
@ -430,8 +389,8 @@ async function importFromMasterCSV(): Promise<void> {
deceasedAddress1: masterRow.CM_ADDRESS, deceasedAddress1: masterRow.CM_ADDRESS,
deceasedAddress2: '', deceasedAddress2: '',
deceasedCity: masterRow.CM_CITY, deceasedCity: masterRow.CM_CITY,
deceasedProvince: masterRow.CM_PROV, deceasedPostalCode: purchaserPostalCode,
deceasedPostalCode: purchaserPostalCode deceasedProvince: masterRow.CM_PROV
}, },
user user
) )
@ -592,17 +551,19 @@ async function importFromMasterCSV(): Promise<void> {
purchaserAddress1: masterRow.CM_ADDRESS, purchaserAddress1: masterRow.CM_ADDRESS,
purchaserAddress2: '', purchaserAddress2: '',
purchaserCity: masterRow.CM_CITY, purchaserCity: masterRow.CM_CITY,
purchaserProvince: masterRow.CM_PROV,
purchaserPostalCode: deceasedPostalCode, purchaserPostalCode: deceasedPostalCode,
purchaserPhoneNumber: '', purchaserProvince: masterRow.CM_PROV,
purchaserEmail: '', purchaserEmail: '',
purchaserPhoneNumber: '',
deceasedName: masterRow.CM_DECEASED_NAME, deceasedName: masterRow.CM_DECEASED_NAME,
deceasedAddress1: masterRow.CM_ADDRESS, deceasedAddress1: masterRow.CM_ADDRESS,
deceasedAddress2: '', deceasedAddress2: '',
deceasedCity: masterRow.CM_CITY, deceasedCity: masterRow.CM_CITY,
deceasedProvince: masterRow.CM_PROV,
deceasedPostalCode, deceasedPostalCode,
deceasedProvince: masterRow.CM_PROV,
birthDateString: '', birthDateString: '',
birthPlace: '', birthPlace: '',
@ -712,10 +673,14 @@ async function importFromPrepaidCSV(): Promise<void> {
(prepaidRow.CMPP_LOT1 === '0' ? '' : prepaidRow.CMPP_LOT1) + (prepaidRow.CMPP_LOT1 === '0' ? '' : prepaidRow.CMPP_LOT1) +
(prepaidRow.CMPP_LOT2 === '0' ? '' : prepaidRow.CMPP_LOT2) (prepaidRow.CMPP_LOT2 === '0' ? '' : prepaidRow.CMPP_LOT2)
const burialSiteNameSegment4 = let burialSiteNameSegment4 =
(prepaidRow.CMPP_GRAVE1 === '0' ? '' : prepaidRow.CMPP_GRAVE1) + (prepaidRow.CMPP_GRAVE1 === '0' ? '' : prepaidRow.CMPP_GRAVE1) +
(prepaidRow.CMPP_GRAVE2 === '0' ? '' : prepaidRow.CMPP_GRAVE2) (prepaidRow.CMPP_GRAVE2 === '0' ? '' : prepaidRow.CMPP_GRAVE2)
if (burialSiteNameSegment4 === '') {
burialSiteNameSegment4 = '1'
}
const burialSiteName = buildBurialSiteName(cemeteryKey, { const burialSiteName = buildBurialSiteName(cemeteryKey, {
burialSiteNameSegment1, burialSiteNameSegment1,
burialSiteNameSegment2, burialSiteNameSegment2,
@ -1058,10 +1023,14 @@ async function importFromWorkOrderCSV(): Promise<void> {
const burialSiteNameSegment3 = const burialSiteNameSegment3 =
(workOrderRow.WO_LOT1 === '0' ? '' : workOrderRow.WO_LOT1) + (workOrderRow.WO_LOT1 === '0' ? '' : workOrderRow.WO_LOT1) +
(workOrderRow.WO_LOT2 === '0' ? '' : workOrderRow.WO_LOT2) (workOrderRow.WO_LOT2 === '0' ? '' : workOrderRow.WO_LOT2)
const burialSiteNameSegment4 = let burialSiteNameSegment4 =
(workOrderRow.WO_GRAVE1 === '0' ? '' : workOrderRow.WO_GRAVE1) + (workOrderRow.WO_GRAVE1 === '0' ? '' : workOrderRow.WO_GRAVE1) +
(workOrderRow.WO_GRAVE2 === '0' ? '' : workOrderRow.WO_GRAVE2) (workOrderRow.WO_GRAVE2 === '0' ? '' : workOrderRow.WO_GRAVE2)
if (burialSiteNameSegment4 === '') {
burialSiteNameSegment4 = '1'
}
const burialSiteName = buildBurialSiteName(workOrderRow.WO_CEMETERY, { const burialSiteName = buildBurialSiteName(workOrderRow.WO_CEMETERY, {
burialSiteNameSegment1, burialSiteNameSegment1,
burialSiteNameSegment2, burialSiteNameSegment2,
@ -1407,6 +1376,54 @@ async function importFromWorkOrderCSV(): Promise<void> {
console.timeEnd('importFromWorkOrderCSV') console.timeEnd('importFromWorkOrderCSV')
} }
function purgeConfigTables(): void {
console.time('purgeConfigTables')
const database = sqlite(databasePath)
database.prepare('delete from Cemeteries').run()
database
.prepare("delete from sqlite_sequence where name in ('Cemeteries')")
.run()
database.close()
console.timeEnd('purgeConfigTables')
}
function purgeTables(): void {
console.time('purgeTables')
const tablesToPurge = [
'WorkOrderMilestones',
'WorkOrderComments',
'WorkOrderBurialSites',
'WorkOrderContracts',
'WorkOrders',
'ContractTransactions',
'ContractFees',
'ContractFields',
'ContractComments',
'ContractInterments',
'Contracts',
'FuneralHomes',
'BurialSiteFields',
'BurialSiteComments',
'BurialSites'
]
const database = sqlite(databasePath)
for (const tableName of tablesToPurge) {
database.prepare(`delete from ${tableName}`).run()
database
.prepare('delete from sqlite_sequence where name = ?')
.run(tableName)
}
database.close()
console.timeEnd('purgeTables')
}
console.log(`Started ${new Date().toLocaleString()}`) console.log(`Started ${new Date().toLocaleString()}`)
console.time('importFromCsv') console.time('importFromCsv')

View File

@ -61,9 +61,9 @@ export interface Config {
dynamicsGP?: { dynamicsGP?: {
integrationIsEnabled: boolean; integrationIsEnabled: boolean;
mssqlConfig?: MSSQLConfig; mssqlConfig?: MSSQLConfig;
lookupOrder?: DynamicsGPLookup[];
accountCodes?: string[]; accountCodes?: string[];
itemNumbers?: string[]; itemNumbers?: string[];
lookupOrder?: DynamicsGPLookup[];
trialBalanceCodes?: string[]; trialBalanceCodes?: string[];
}; };
}; };

View File

@ -79,9 +79,10 @@ export interface Config {
dynamicsGP?: { dynamicsGP?: {
integrationIsEnabled: boolean integrationIsEnabled: boolean
mssqlConfig?: MSSQLConfig mssqlConfig?: MSSQLConfig
lookupOrder?: DynamicsGPLookup[]
accountCodes?: string[] accountCodes?: string[]
itemNumbers?: string[] itemNumbers?: string[]
lookupOrder?: DynamicsGPLookup[]
trialBalanceCodes?: string[] trialBalanceCodes?: string[]
} }
} }

View File

@ -1,5 +1,6 @@
<!DOCTYPE html> <!DOCTYPE html>
<html class="has-background-grey" id="is-login-page" data-theme="light" lang="en" style="background-image:url('<%= urlPrefix + configFunctions.getConfigProperty("application.backgroundURL") %>')"> <html class="has-background-grey" id="is-login-page" data-theme="light" lang="en"
style="background-image:url('<%= urlPrefix + configFunctions.getConfigProperty("application.backgroundURL") %>')">
<head> <head>
<title> <title>
@ -39,13 +40,16 @@
</span> </span>
</div> </div>
<div class="control is-expanded"> <div class="control is-expanded">
<input class="input" id="login--userName" name="userName" type="text" placeholder="User Name" value="<%= userName %>" aria-label="User Name" autofocus required /> <input class="input" id="login--userName" name="userName" type="text"
placeholder="User Name" value="<%= userName %>" aria-label="User Name"
autofocus required />
</div> </div>
</div> </div>
<div class="field"> <div class="field">
<label class="sr-only" for="login--password">Password</label> <label class="sr-only" for="login--password">Password</label>
<div class="control has-icons-left has-tooltip-right" data-tooltip="Password" > <div class="control has-icons-left has-tooltip-right" data-tooltip="Password" >
<input class="input" id="login--password" name="password" type="password" placeholder="Password" required /> <input class="input" id="login--password" name="password" type="password"
placeholder="Password" required />
<span class="icon is-small is-left"> <span class="icon is-small is-left">
<i class="fas fa-key" aria-hidden="true"></i> <i class="fas fa-key" aria-hidden="true"></i>
</span> </span>