425 lines
18 KiB
Plaintext
425 lines
18 KiB
Plaintext
<%- include('_header'); -%>
|
|
|
|
<h1 class="title is-1">
|
|
<%= configFunctions.getConfigProperty("application.applicationName") %>
|
|
</h1>
|
|
|
|
<div class="columns">
|
|
<% if (workOrderMilestones.length > 0) { %>
|
|
<% const workOrderPrints = configFunctions.getConfigProperty("settings.workOrders.prints"); %>
|
|
<div class="column is-4">
|
|
<div class="panel is-info">
|
|
<div class="panel-heading">
|
|
<div class="level is-mobile">
|
|
<div class="level-left">
|
|
<div class="level-item">
|
|
<h2 class="title is-5 has-text-weight-bold has-text-white">
|
|
Today's Milestones
|
|
</h2>
|
|
</div>
|
|
</div>
|
|
<div class="level-right">
|
|
<div class="level-item">
|
|
<span class="tag"><%= workOrderMilestones.length %></span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<% for (const milestone of workOrderMilestones) { %>
|
|
<div class="panel-block is-block">
|
|
<div class="columns is-mobile">
|
|
<div class="column is-narrow">
|
|
<% if (milestone.workOrderMilestoneCompletionDate) { %>
|
|
<span class="icon is-small has-tooltip-right" data-tooltip="Completed">
|
|
<i class="fas fa-check" aria-label="Completed"></i>
|
|
</span>
|
|
<% } else { %>
|
|
<span class="icon is-small has-tooltip-right" data-tooltip="Incomplete">
|
|
<i class="far fa-square" aria-label="Incomplete"></i>
|
|
</span>
|
|
<% } %>
|
|
</div>
|
|
<div class="column">
|
|
<% 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>
|
|
</a>
|
|
</span>
|
|
<% } %>
|
|
<% if (milestone.workOrderMilestoneTime) { %>
|
|
<%= milestone.workOrderMilestoneTimePeriodString %><br />
|
|
<% } %>
|
|
<% if (milestone.workOrderMilestoneTypeId) { %>
|
|
<strong><%= milestone.workOrderMilestoneType %></strong><br />
|
|
<% } %>
|
|
<span class="is-size-7">
|
|
<a href="<%= urlPrefix %>/workOrders/<%= milestone.workOrderId %>">
|
|
<i class="fas fa-circle" data-work-order-number="<%= milestone.workOrderNumber %>" aria-label="Work Order"></i>
|
|
<%= milestone.workOrderNumber %>
|
|
</a><br />
|
|
<%
|
|
if (milestone.workOrderLots.length > 0) {
|
|
for (const lot of milestone.workOrderLots) {
|
|
%>
|
|
<span class="has-tooltip-right" data-tooltip="<%= lot.mapName %>">
|
|
<i class="fas fa-fw fa-vector-square" aria-label="<%= configFunctions.getConfigProperty("aliases.lot") %>"></i>
|
|
<%= lot.lotName %>
|
|
</span><br />
|
|
<%
|
|
}
|
|
}
|
|
|
|
if (milestone.workOrderLotOccupancies.length > 0) {
|
|
for (const occupancy of milestone.workOrderLotOccupancies) {
|
|
for (const occupant of occupancy.lotOccupancyOccupants) {
|
|
%>
|
|
<span class="has-tooltip-right" data-tooltip="<%= occupant.lotOccupantType %>">
|
|
<i class="fas fa-fw fa-<%= occupant.fontAwesomeIconClass || 'user' %>" aria-label="<%= configFunctions.getConfigProperty("aliases.occupancy") %>"></i>
|
|
<%= occupant.occupantName %>
|
|
<%= occupant.occupantFamilyName %>
|
|
</span><br />
|
|
<%
|
|
}
|
|
}
|
|
}
|
|
%>
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<% } %>
|
|
</div>
|
|
</div>
|
|
<% } %>
|
|
<div class="column">
|
|
<div class="columns is-desktop">
|
|
<div class="column">
|
|
<div class="card is-hover-container">
|
|
<div class="card-content">
|
|
<div class="media">
|
|
<div class="media-left">
|
|
<span class="fa-layers fa-4x fa-fw">
|
|
<i class="fas fa-fw fa-hard-hat" aria-hidden="true"></i>
|
|
<% if (workOrderCount > 0) { %>
|
|
<a class="fa-layers-counter has-background-success has-text-white" href="<%= urlPrefix %>/workOrders/?workOrderOpenDateString=<%= dateTimeFunctions.dateToString(new Date()) %>"><%= workOrderCount %></a>
|
|
<% } %>
|
|
</span>
|
|
</div>
|
|
<a class="media-content" href="<%= urlPrefix %>/workOrders">
|
|
<h2 class="title is-4 is-marginless has-text-link">
|
|
Work Orders
|
|
</h2>
|
|
<p>
|
|
View and maintain work orders.<br />
|
|
<span class="tags has-addons is-invisible is-visible-hover">
|
|
<span class="tag is-link is-light">Shortcut</span>
|
|
<kbd class="tag">1</kbd>
|
|
</span>
|
|
</p>
|
|
</a>
|
|
</div>
|
|
<% if (user.userProperties.canUpdate) { %>
|
|
<a class="button is-fullwidth is-success is-light mb-2" href="<%= urlPrefix %>/workOrders/new">
|
|
<span class="icon">
|
|
<i class="fas fa-plus" aria-hidden="true"></i>
|
|
</span>
|
|
<span>New Work Order</span>
|
|
</a>
|
|
<% } %>
|
|
<a class="button is-fullwidth is-link is-light" href="<%= urlPrefix %>/workOrders/milestoneCalendar">
|
|
<span class="icon">
|
|
<i class="fas fa-calendar" aria-hidden="true"></i>
|
|
</span>
|
|
<span>Milestone Calendar</span>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="column">
|
|
<div class="card is-hover-container">
|
|
<div class="card-content">
|
|
<div class="media">
|
|
<div class="media-left">
|
|
<span class="fa-layers fa-4x fa-fw" aria-hidden="true">
|
|
<i class="fas fa-vector-square"></i>
|
|
<i class="fas fa-user" data-fa-transform="shrink-10"></i>
|
|
<% if (lotOccupancyCount > 0) { %>
|
|
<span class="fa-layers-counter has-background-success"><%= lotOccupancyCount %></span>
|
|
<% } %>
|
|
</span>
|
|
</div>
|
|
<a class="media-content" href="<%= urlPrefix %>/lotOccupancies">
|
|
<h2 class="title is-4 is-marginless has-text-link">
|
|
<%= configFunctions.getConfigProperty("aliases.occupancies") %>
|
|
</h2>
|
|
<p>
|
|
View and maintain current and past
|
|
<%= configFunctions.getConfigProperty("aliases.occupancies").toLowerCase() %>.<br />
|
|
<span class="tags has-addons is-invisible is-visible-hover">
|
|
<span class="tag is-link is-light">Shortcut</span>
|
|
<kbd class="tag">2</kbd>
|
|
</span>
|
|
</p>
|
|
</a>
|
|
</div>
|
|
<% if (user.userProperties.canUpdate) { %>
|
|
<a class="button is-fullwidth is-success is-light" href="<%= urlPrefix %>/lotOccupancies/new">
|
|
<span class="icon">
|
|
<i class="fas fa-plus" aria-hidden="true"></i>
|
|
</span>
|
|
<span>New <%= configFunctions.getConfigProperty("aliases.occupancy") %></span>
|
|
</a>
|
|
<% } %>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="columns is-desktop">
|
|
<div class="column">
|
|
<div class="card is-hover-container">
|
|
<div class="card-content">
|
|
<div class="media">
|
|
<div class="media-left">
|
|
<i class="fas fa-4x fa-fw fa-vector-square" aria-hidden="true"></i>
|
|
</div>
|
|
<a class="media-content" href="<%= urlPrefix %>/lots">
|
|
<h2 class="title is-4 is-marginless has-text-link">
|
|
<%= configFunctions.getConfigProperty("aliases.lots") %>
|
|
</h2>
|
|
<p>
|
|
View and maintain
|
|
<%= configFunctions.getConfigProperty("aliases.lots").toLowerCase() %> within a
|
|
<%= configFunctions.getConfigProperty("aliases.map").toLowerCase() %>.<br />
|
|
<span class="tags has-addons is-invisible is-visible-hover">
|
|
<span class="tag is-link is-light">Shortcut</span>
|
|
<kbd class="tag">3</kbd>
|
|
</span>
|
|
</p>
|
|
</a>
|
|
</div>
|
|
<% if (user.userProperties.canUpdate) { %>
|
|
<a class="button is-fullwidth is-success is-light" href="<%= urlPrefix %>/lots/new">
|
|
<span class="icon">
|
|
<i class="fas fa-plus" aria-hidden="true"></i>
|
|
</span>
|
|
<span>New <%= configFunctions.getConfigProperty("aliases.lot") %></span>
|
|
</a>
|
|
<% } %>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="column">
|
|
<div class="card is-hover-container">
|
|
<div class="card-content">
|
|
<div class="media">
|
|
<div class="media-left">
|
|
<i class="far fa-4x fa-fw fa-map" aria-hidden="true"></i>
|
|
</div>
|
|
<a class="media-content" href="<%= urlPrefix %>/maps">
|
|
<h2 class="title is-4 is-marginless has-text-link">
|
|
<%= configFunctions.getConfigProperty("aliases.maps") %>
|
|
</h2>
|
|
<p>
|
|
View and maintain <%= configFunctions.getConfigProperty("aliases.maps").toLowerCase() %>.
|
|
<span class="tags has-addons is-invisible is-visible-hover">
|
|
<span class="tag is-link is-light">Shortcut</span>
|
|
<kbd class="tag">4</kbd>
|
|
</span>
|
|
</p>
|
|
</a>
|
|
</div>
|
|
<% if (user.userProperties.canUpdate) { %>
|
|
<a class="button is-fullwidth is-success is-light" href="<%= urlPrefix %>/maps/new">
|
|
<span class="icon">
|
|
<i class="fas fa-plus" aria-hidden="true"></i>
|
|
</span>
|
|
<span>New <%= configFunctions.getConfigProperty("aliases.map") %></span>
|
|
</a>
|
|
<% } %>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="columns is-desktop">
|
|
<div class="column">
|
|
<div class="card">
|
|
<div class="card-content">
|
|
<div class="media">
|
|
<div class="media-left">
|
|
<i class="fas fa-4x fa-fw fa-file" aria-hidden="true"></i>
|
|
</div>
|
|
<a class="media-content" href="<%= urlPrefix %>/reports">
|
|
<h2 class="title is-4 is-marginless has-text-link">
|
|
Report Library
|
|
</h2>
|
|
<p>Produce reports and export data.</p>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="column">
|
|
<div class="card is-hover-container">
|
|
<div class="card-content">
|
|
<div class="media">
|
|
<div class="media-left">
|
|
<i class="fas fa-4x fa-fw fa-question-circle" aria-hidden="true"></i>
|
|
</div>
|
|
<a class="media-content" href="https://cityssm.github.io/lot-occupancy-system/docs" target="_blank" rel="noopener noreferrer">
|
|
<h2 class="title is-4 is-marginless has-text-link">
|
|
Help
|
|
</h2>
|
|
<p>
|
|
Instructions on how to use this application.<br />
|
|
<span class="tags has-addons is-invisible is-visible-hover">
|
|
<span class="tag is-link is-light">Shortcut</span>
|
|
<kbd class="tag">H</kbd>
|
|
</span>
|
|
</p>
|
|
</a>
|
|
</div>
|
|
<a class="button is-fullwidth is-link is-light has-tooltip-bottom" data-tooltip="Latest Updates, Issue Tracker, Say Hello"
|
|
href="https://github.com/cityssm/lot-occupancy-system" target="_blank" rel="noreferrer">
|
|
<span class="icon">
|
|
<i class="fab fa-github" aria-hidden="true"></i>
|
|
</span>
|
|
<span>GitHub</span>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<% if (user.userProperties.isAdmin) { %>
|
|
<h2 class="title is-3">Administrator Tools</h2>
|
|
|
|
<div class="card">
|
|
<div class="card-content">
|
|
<div class="media">
|
|
<div class="media-left">
|
|
<span class="fa-layers fa-4x fa-fw" aria-hidden="true">
|
|
<i class="fas fa-dollar-sign"></i>
|
|
<i class="fas fa-cog" data-fa-transform="shrink-8 right-8 down-5" data-fa-glow="10"></i>
|
|
</span>
|
|
</div>
|
|
<a class="media-content" href="<%= urlPrefix %>/admin/fees">
|
|
<h2 class="title is-4 is-marginless has-text-link">
|
|
Fee Management
|
|
</h2>
|
|
<p>
|
|
Manage fees for
|
|
<%= configFunctions.getConfigProperty("aliases.lot").toLowerCase() %>
|
|
<%= configFunctions.getConfigProperty("aliases.occupancy").toLowerCase() %>
|
|
and specific
|
|
<%= configFunctions.getConfigProperty("aliases.lot").toLowerCase() %> types.
|
|
</p>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
<div class="card-content">
|
|
<div class="media">
|
|
<div class="media-left">
|
|
<span class="fa-layers fa-4x fa-fw" aria-hidden="true">
|
|
<i class="fas fa-user-friends"></i>
|
|
<i class="fas fa-cog" data-fa-transform="shrink-8 right-8 down-5" data-fa-glow="10"></i>
|
|
</span>
|
|
</div>
|
|
<a class="media-content" href="<%= urlPrefix %>/admin/occupancyTypes">
|
|
<h2 class="title is-4 is-marginless has-text-link">
|
|
<%= configFunctions.getConfigProperty("aliases.occupancy") %> Type Management
|
|
</h2>
|
|
<p>
|
|
Manage
|
|
<%= configFunctions.getConfigProperty("aliases.occupancy").toLowerCase() %> types,
|
|
the fields associated with them,
|
|
and their available print options.
|
|
</p>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
<div class="card-content">
|
|
<div class="media">
|
|
<div class="media-left">
|
|
<span class="fa-layers fa-4x fa-fw" aria-hidden="true">
|
|
<i class="fas fa-vector-square"></i>
|
|
<i class="fas fa-cog" data-fa-transform="shrink-8 right-8 down-5" data-fa-glow="10"></i>
|
|
</span>
|
|
</div>
|
|
<a class="media-content" href="<%= urlPrefix %>/admin/lotTypes">
|
|
<h2 class="title is-4 is-marginless has-text-link">
|
|
<%= configFunctions.getConfigProperty("aliases.lot") %> Type Management
|
|
</h2>
|
|
<p>
|
|
Manage
|
|
<%= configFunctions.getConfigProperty("aliases.lot").toLowerCase() %> types
|
|
and fields associated with them.
|
|
</p>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
<div class="card-content">
|
|
<div class="media">
|
|
<div class="media-left">
|
|
<span class="fa-layers fa-4x fa-fw" aria-hidden="true">
|
|
<i class="fas fa-table"></i>
|
|
<i class="fas fa-cog" data-fa-transform="shrink-8 right-8 down-5" data-fa-glow="10"></i>
|
|
</span>
|
|
</div>
|
|
<a class="media-content" href="<%= urlPrefix %>/admin/tables">
|
|
<h2 class="title is-4 is-marginless has-text-link">
|
|
Config Table Management
|
|
</h2>
|
|
<p>
|
|
Manage simple configuration tables fees for
|
|
work order types,
|
|
<%= configFunctions.getConfigProperty("aliases.lot").toLowerCase() %> statuses,
|
|
and <%= configFunctions.getConfigProperty("aliases.lot").toLowerCase() %> <%= configFunctions.getConfigProperty("aliases.occupant").toLowerCase() %> types.
|
|
</p>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
<div class="card-content">
|
|
<div class="media">
|
|
<div class="media-left">
|
|
<i class="fas fa-4x fa-fw fa-database" aria-hidden="true"></i>
|
|
</div>
|
|
<a class="media-content" href="<%= urlPrefix %>/admin/database">
|
|
<h2 class="title is-4 is-marginless has-text-link">
|
|
Database Maintenance
|
|
</h2>
|
|
<p>
|
|
Backup the database before making significant updates.
|
|
Permanently delete records that have been previously deleted from the database.
|
|
</p>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
<% if (configFunctions.getConfigProperty("application.ntfyStartup")) { %>
|
|
<div class="card-content">
|
|
<div class="media">
|
|
<div class="media-left">
|
|
<i class="far fa-4x fa-fw fa-comment-alt" aria-hidden="true"></i>
|
|
</div>
|
|
<a class="media-content" href="<%= urlPrefix %>/admin/ntfyStartup">
|
|
<h2 class="title is-4 is-marginless has-text-link">
|
|
Ntfy Startup Notification
|
|
</h2>
|
|
<p>
|
|
Subscribe to application startup notifications on a phone or a desktop computer.
|
|
</p>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
<% } %>
|
|
</div>
|
|
<% } %>
|
|
</div>
|
|
</div>
|
|
|
|
<%- include('_footerA'); -%>
|
|
|
|
<script src="<%= urlPrefix %>/javascripts/dashboard.min.js"></script>
|
|
|
|
<%- include('_footerB'); -%> |