work order progress
parent
f007dd1f63
commit
659318c536
|
|
@ -0,0 +1,3 @@
|
|||
import type { RequestHandler } from "express";
|
||||
export declare const handler: RequestHandler;
|
||||
export default handler;
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
import * as configFunctions from "../../helpers/functions.config.js";
|
||||
import { getWorkOrder } from "../../helpers/lotOccupancyDB/getWorkOrder.js";
|
||||
export const handler = (request, response) => {
|
||||
const workOrder = getWorkOrder(request.params.workOrderId);
|
||||
if (!workOrder) {
|
||||
return response.redirect(configFunctions.getProperty("reverseProxy.urlPrefix") +
|
||||
"/workOrders/?error=workOrderIdNotFound");
|
||||
}
|
||||
response.render("workOrder-edit", {
|
||||
headTitle: "Work Order #" + workOrder.workOrderNumber,
|
||||
workOrder
|
||||
});
|
||||
};
|
||||
export default handler;
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
import type { RequestHandler } from "express";
|
||||
|
||||
import * as configFunctions from "../../helpers/functions.config.js";
|
||||
|
||||
import { getWorkOrder } from "../../helpers/lotOccupancyDB/getWorkOrder.js";
|
||||
|
||||
export const handler: RequestHandler = (request, response) => {
|
||||
const workOrder = getWorkOrder(request.params.workOrderId);
|
||||
|
||||
if (!workOrder) {
|
||||
return response.redirect(
|
||||
configFunctions.getProperty("reverseProxy.urlPrefix") +
|
||||
"/workOrders/?error=workOrderIdNotFound"
|
||||
);
|
||||
}
|
||||
|
||||
response.render("workOrder-edit", {
|
||||
headTitle: "Work Order #" + workOrder.workOrderNumber,
|
||||
workOrder
|
||||
});
|
||||
};
|
||||
|
||||
export default handler;
|
||||
|
|
@ -64,6 +64,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
lotOccupancyId
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
cityssm.disableNavBlocker();
|
||||
window.location.href =
|
||||
urlPrefix +
|
||||
"/lotOccupancies?t=" +
|
||||
|
|
@ -119,36 +120,58 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
for (const occupancyTypeField of responseJSON.occupancyTypeFields) {
|
||||
occupancyTypeFieldIds +=
|
||||
"," + occupancyTypeField.occupancyTypeFieldId;
|
||||
const fieldName = "lotOccupancyFieldValue_" +
|
||||
occupancyTypeField.occupancyTypeFieldId;
|
||||
const fieldId = "lotOccupancy--" + fieldName;
|
||||
const fieldElement = document.createElement("div");
|
||||
fieldElement.className = "field";
|
||||
fieldElement.innerHTML =
|
||||
'<label class="label" for="lotOccupancy--lotOccupancyFieldValue_' +
|
||||
occupancyTypeField.occupancyTypeFieldId +
|
||||
'<label class="label" for="' +
|
||||
fieldId +
|
||||
'"></label>' +
|
||||
'<div class="control"></div>';
|
||||
fieldElement.querySelector("label").textContent =
|
||||
occupancyTypeField.occupancyTypeField;
|
||||
if (occupancyTypeField.occupancyTypeFieldValues === "") {
|
||||
const inputElement = document.createElement("input");
|
||||
inputElement.className = "input";
|
||||
inputElement.id =
|
||||
"lotOccupancy--lotOccupancyFieldValue_" +
|
||||
occupancyTypeField.occupancyTypeFieldId;
|
||||
inputElement.name =
|
||||
"lotOccupancyFieldValue_" +
|
||||
occupancyTypeField.occupancyTypeFieldId;
|
||||
inputElement.id = fieldId;
|
||||
inputElement.name = fieldName;
|
||||
inputElement.type = "text";
|
||||
inputElement.required = occupancyTypeField.isRequired;
|
||||
inputElement.required =
|
||||
occupancyTypeField.isRequired;
|
||||
inputElement.minLength =
|
||||
occupancyTypeField.minimumLength;
|
||||
inputElement.maxLength =
|
||||
occupancyTypeField.maximumLength;
|
||||
if (occupancyTypeField.pattern &&
|
||||
occupancyTypeField.pattern !== "") {
|
||||
inputElement.pattern = occupancyTypeField.pattern;
|
||||
inputElement.pattern =
|
||||
occupancyTypeField.pattern;
|
||||
}
|
||||
fieldElement
|
||||
.querySelector(".control")
|
||||
.append(inputElement);
|
||||
}
|
||||
else {
|
||||
fieldElement.querySelector(".control").innerHTML =
|
||||
'<div class="select is-fullwidth"><select id="' +
|
||||
fieldId +
|
||||
'" name="' +
|
||||
fieldName +
|
||||
'">' +
|
||||
'<option value="">(Not Set)</option>' +
|
||||
"</select></div>";
|
||||
fieldElement.querySelector("select").required =
|
||||
occupancyTypeField.isRequired;
|
||||
const optionValues = occupancyTypeField.occupancyTypeFieldValues.split("\n");
|
||||
for (const optionValue of optionValues) {
|
||||
const optionElement = document.createElement("option");
|
||||
optionElement.value = optionValue;
|
||||
optionElement.textContent = optionValue;
|
||||
fieldElement.querySelector("select").append(optionElement);
|
||||
}
|
||||
}
|
||||
lotOccupancyFieldsContainerElement.append(fieldElement);
|
||||
}
|
||||
lotOccupancyFieldsContainerElement.insertAdjacentHTML("beforeend", '<input name="occupancyTypeFieldIds" type="hidden" value="' +
|
||||
|
|
|
|||
|
|
@ -110,6 +110,7 @@ declare const bulmaJS: BulmaJS;
|
|||
errorMessage?: string;
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
cityssm.disableNavBlocker();
|
||||
window.location.href =
|
||||
urlPrefix +
|
||||
"/lotOccupancies?t=" +
|
||||
|
|
@ -187,28 +188,39 @@ declare const bulmaJS: BulmaJS;
|
|||
occupancyTypeFieldIds +=
|
||||
"," + occupancyTypeField.occupancyTypeFieldId;
|
||||
|
||||
const fieldName =
|
||||
"lotOccupancyFieldValue_" +
|
||||
occupancyTypeField.occupancyTypeFieldId;
|
||||
|
||||
const fieldId = "lotOccupancy--" + fieldName;
|
||||
|
||||
const fieldElement = document.createElement("div");
|
||||
fieldElement.className = "field";
|
||||
fieldElement.innerHTML =
|
||||
'<label class="label" for="lotOccupancy--lotOccupancyFieldValue_' +
|
||||
occupancyTypeField.occupancyTypeFieldId +
|
||||
'<label class="label" for="' +
|
||||
fieldId +
|
||||
'"></label>' +
|
||||
'<div class="control"></div>';
|
||||
|
||||
fieldElement.querySelector("label").textContent =
|
||||
occupancyTypeField.occupancyTypeField;
|
||||
|
||||
const inputElement = document.createElement("input");
|
||||
if (
|
||||
occupancyTypeField.occupancyTypeFieldValues === ""
|
||||
) {
|
||||
const inputElement =
|
||||
document.createElement("input");
|
||||
|
||||
inputElement.className = "input";
|
||||
inputElement.id =
|
||||
"lotOccupancy--lotOccupancyFieldValue_" +
|
||||
occupancyTypeField.occupancyTypeFieldId;
|
||||
inputElement.name =
|
||||
"lotOccupancyFieldValue_" +
|
||||
occupancyTypeField.occupancyTypeFieldId;
|
||||
|
||||
inputElement.id = fieldId;
|
||||
|
||||
inputElement.name = fieldName;
|
||||
|
||||
inputElement.type = "text";
|
||||
|
||||
inputElement.required = occupancyTypeField.isRequired;
|
||||
inputElement.required =
|
||||
occupancyTypeField.isRequired;
|
||||
inputElement.minLength =
|
||||
occupancyTypeField.minimumLength;
|
||||
inputElement.maxLength =
|
||||
|
|
@ -218,12 +230,35 @@ declare const bulmaJS: BulmaJS;
|
|||
occupancyTypeField.pattern &&
|
||||
occupancyTypeField.pattern !== ""
|
||||
) {
|
||||
inputElement.pattern = occupancyTypeField.pattern;
|
||||
inputElement.pattern =
|
||||
occupancyTypeField.pattern;
|
||||
}
|
||||
|
||||
fieldElement
|
||||
.querySelector(".control")
|
||||
.append(inputElement);
|
||||
} else {
|
||||
fieldElement.querySelector(".control").innerHTML =
|
||||
'<div class="select is-fullwidth"><select id="' +
|
||||
fieldId +
|
||||
'" name="' +
|
||||
fieldName +
|
||||
'">' +
|
||||
'<option value="">(Not Set)</option>' +
|
||||
"</select></div>";
|
||||
|
||||
fieldElement.querySelector("select").required =
|
||||
occupancyTypeField.isRequired;
|
||||
|
||||
const optionValues = occupancyTypeField.occupancyTypeFieldValues.split("\n");
|
||||
|
||||
for (const optionValue of optionValues) {
|
||||
const optionElement = document.createElement("option");
|
||||
optionElement.value = optionValue;
|
||||
optionElement.textContent = optionValue;
|
||||
fieldElement.querySelector("select").append(optionElement);
|
||||
}
|
||||
}
|
||||
|
||||
lotOccupancyFieldsContainerElement.append(fieldElement);
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -1,9 +1,12 @@
|
|||
import { Router } from "express";
|
||||
import * as permissionHandlers from "../handlers/permissions.js";
|
||||
import handler_search from "../handlers/workOrders-get/search.js";
|
||||
import handler_doSearchWorkOrders from "../handlers/workOrders-post/doSearchWorkOrders.js";
|
||||
import handler_view from "../handlers/workOrders-get/view.js";
|
||||
import handler_edit from "../handlers/workOrders-get/edit.js";
|
||||
export const router = Router();
|
||||
router.get("/", handler_search);
|
||||
router.post("/doSearchWorkOrders", handler_doSearchWorkOrders);
|
||||
router.get("/:workOrderId", handler_view);
|
||||
router.get("/:workOrderId/edit", permissionHandlers.updateGetHandler, handler_edit);
|
||||
export default router;
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
import { Router } from "express";
|
||||
|
||||
import * as permissionHandlers from "../handlers/permissions.js";
|
||||
import * as configFunctions from "../helpers/functions.config.js";
|
||||
|
||||
import handler_search from "../handlers/workOrders-get/search.js";
|
||||
import handler_doSearchWorkOrders from "../handlers/workOrders-post/doSearchWorkOrders.js";
|
||||
|
||||
import handler_view from "../handlers/workOrders-get/view.js";
|
||||
|
||||
import handler_edit from "../handlers/workOrders-get/edit.js";
|
||||
|
||||
export const router = Router();
|
||||
|
||||
router.get("/", handler_search);
|
||||
|
|
@ -16,4 +17,8 @@ router.post("/doSearchWorkOrders", handler_doSearchWorkOrders);
|
|||
|
||||
router.get("/:workOrderId", handler_view);
|
||||
|
||||
router.get("/:workOrderId/edit",
|
||||
permissionHandlers.updateGetHandler,
|
||||
handler_edit);
|
||||
|
||||
export default router;
|
||||
|
|
|
|||
|
|
@ -18,7 +18,8 @@
|
|||
|
||||
<body>
|
||||
<nav class="navbar is-light is-fixed-top is-static-print" id="cityssm-theme--navbar" role="navigation"
|
||||
aria-label="main navigation">
|
||||
aria-label="main navigation"
|
||||
style="z-index:1100">
|
||||
<div class="container">
|
||||
<div class="navbar-brand">
|
||||
<a class="navbar-item" href="<%= urlPrefix %>/dashboard">
|
||||
|
|
|
|||
|
|
@ -1,8 +1,5 @@
|
|||
<%- include('_header'); -%>
|
||||
|
||||
<div class="columns is-variable is-4-mobile is-4-tablet is-block-print" id="is-site-layout">
|
||||
|
||||
<div class="column is-block-print">
|
||||
<nav class="breadcrumb">
|
||||
<ul>
|
||||
<li><a href="<%= urlPrefix %>/dashboard">Home</a></li>
|
||||
|
|
@ -187,8 +184,6 @@
|
|||
<% } %>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<%- include('_footerA'); -%>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,5 @@
|
|||
<%- include('_header'); -%>
|
||||
|
||||
<div class="columns is-variable is-4-mobile is-4-tablet is-block-print" id="is-site-layout">
|
||||
|
||||
<div class="column is-block-print">
|
||||
<nav class="breadcrumb">
|
||||
<ul>
|
||||
<li><a href="<%= urlPrefix %>/dashboard">Home</a></li>
|
||||
|
|
@ -110,9 +107,6 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<%- include('_footerA'); -%>
|
||||
|
||||
<script src="<%= urlPrefix %>/javascripts/mapView.min.js"></script>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,27 @@
|
|||
<%- include('_header'); -%>
|
||||
|
||||
<nav class="breadcrumb">
|
||||
<ul>
|
||||
<li><a href="<%= urlPrefix %>/dashboard">Home</a></li>
|
||||
<li>
|
||||
<a href="<%= urlPrefix %>/workOrders">
|
||||
<span class="icon is-small"><i class="fas fa-hard-hat" aria-hidden="true"></i></span>
|
||||
<span>Work Orders</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="<%= urlPrefix %>/workOrders/<%= workOrder.workOrderId %>">
|
||||
Work Order #<%= workOrder.workOrderNumber || "(No Number)" %>
|
||||
</a>
|
||||
</li>
|
||||
<li class="is-active">
|
||||
<a href="#" aria-current="page">
|
||||
Update Work Order
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<%- include('_footerA'); -%>
|
||||
|
||||
<%- include('_footerB'); -%>
|
||||
|
|
@ -3,10 +3,12 @@
|
|||
<nav class="breadcrumb">
|
||||
<ul>
|
||||
<li><a href="<%= urlPrefix %>/dashboard">Home</a></li>
|
||||
<li class="is-active"><a href="#" aria-current="page">
|
||||
<li class="is-active">
|
||||
<a href="#" aria-current="page">
|
||||
<span class="icon is-small"><i class="fas fa-hard-hat" aria-hidden="true"></i></span>
|
||||
<span>Work Orders</span>
|
||||
</a></li>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,5 @@
|
|||
<%- include('_header'); -%>
|
||||
|
||||
<div class="columns is-variable is-4-mobile is-4-tablet is-block-print" id="is-site-layout">
|
||||
|
||||
<div class="column is-block-print">
|
||||
<nav class="breadcrumb">
|
||||
<ul>
|
||||
<li><a href="<%= urlPrefix %>/dashboard">Home</a></li>
|
||||
|
|
@ -33,6 +30,168 @@
|
|||
</div>
|
||||
<% } %>
|
||||
|
||||
<div class="panel">
|
||||
<div class="panel-block is-block">
|
||||
<div class="columns">
|
||||
<div class="column">
|
||||
<p class="mb-2">
|
||||
<strong>Work Order Type</strong><br />
|
||||
<%= workOrder.workOrderType %>
|
||||
</p>
|
||||
<p>
|
||||
<strong>Description</strong><br />
|
||||
<% if (workOrder.workOrderDescription) { %>
|
||||
<%= workOrder.workOrderDescription %>
|
||||
<% } else { %>
|
||||
<span class="has-text-grey">(No Description)</span>
|
||||
<% } %>
|
||||
</p>
|
||||
</div>
|
||||
<div class="column">
|
||||
<p class="mb-2">
|
||||
<strong>Open Date</strong><br />
|
||||
<%= workOrder.workOrderOpenDateString %>
|
||||
</p>
|
||||
<p>
|
||||
<strong>Close Date</strong><br />
|
||||
<% if (workOrder.workOrderCloseDate) { %>
|
||||
<%= workOrder.workOrderCloseDateString %>
|
||||
<% } else { %>
|
||||
<span class="has-text-grey">(No Close Date)</span>
|
||||
<% } %>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel">
|
||||
<h2 class="panel-heading">Related <%= configFunctions.getProperty("aliases.lots") %></h2>
|
||||
<div class="panel-block is-block">
|
||||
<%
|
||||
const tabToSelect = (workOrder.workOrderLotOccupancies.length > 0 || workOrder.workOrderLots.length === 0 ? "lotOccupancies" : "lots");
|
||||
%>
|
||||
<div class="tabs is-boxed">
|
||||
<ul>
|
||||
<li class="<%= (tabToSelect === "lotOccupancies" ? "is-active" : "") %>">
|
||||
<a href="#relatedTab--lotOccupancies">
|
||||
<span><%= configFunctions.getProperty("aliases.occupancies") %></span>
|
||||
<span class="ml-2 tag"><%= workOrder.workOrderLotOccupancies.length %></span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="<%= (tabToSelect === "lots" ? "is-active" : "") %>">
|
||||
<a href="#relatedTab--lots">
|
||||
<span><%= configFunctions.getProperty("aliases.lots") %></span>
|
||||
<span class="ml-2 tag"><%= workOrder.workOrderLots.length %></span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="tab-container">
|
||||
<div class="<%= (tabToSelect === "lotOccupancies" ? "" : "is-hidden") %>" id="relatedTab--lotOccupancies">
|
||||
<% if (workOrder.workOrderLotOccupancies.length === 0) { %>
|
||||
<div class="message is-info">
|
||||
<p class="message-body">
|
||||
There are no
|
||||
<%= configFunctions.getProperty("aliases.lot").toLowerCase() %>
|
||||
<%= configFunctions.getProperty("aliases.occupancy").toLowerCase() %>
|
||||
records associated with this work order.
|
||||
</p>
|
||||
</div>
|
||||
<% } else { %>
|
||||
<table class="table is-fullwidth is-striped is-hoverable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="has-width-1"></th>
|
||||
<th>Occupancy Type</th>
|
||||
<th><%= configFunctions.getProperty("aliases.lot") %></th>
|
||||
<th>Start Date</th>
|
||||
<th>End Date</th>
|
||||
<th><%= configFunctions.getProperty("aliases.occupants") %></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% for (const lotOccupancy of workOrder.workOrderLotOccupancies) { %>
|
||||
<% const isActive = !(lotOccupancy.occupancyEndDate && lotOccupancy.occupancyEndDate < currentDate); %>
|
||||
<tr>
|
||||
<td class="has-text-centered">
|
||||
<% if (isActive) { %>
|
||||
<i class="fas fa-play" title="Current <%= configFunctions.getProperty("aliases.occupancy") %>"></i>
|
||||
<% } else { %>
|
||||
<i class="fas fa-stop" title="Previous <%= configFunctions.getProperty("aliases.occupancy") %>"></i>
|
||||
<% } %>
|
||||
</td>
|
||||
<td>
|
||||
<a class="has-text-weight-bold"
|
||||
href="<%= urlPrefix %>/lotOccupancies/<%= lotOccupancy.lotOccupancyId %>">
|
||||
<%= lotOccupancy.occupancyType %>
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
<% if (lotOccupancy.lotId) { %>
|
||||
<%= lotOccupancy.lotName %>
|
||||
<% } else { %>
|
||||
<span class="has-text-grey">(No <%= configFunctions.getProperty("aliases.lot") %>)</span>
|
||||
<% } %>
|
||||
</td>
|
||||
<td><%= lotOccupancy.occupancyStartDateString %></td>
|
||||
<td>
|
||||
<% if (lotOccupancy.occupancyEndDate) { %>
|
||||
<%= lotOccupancy.occupancyEndDateString %>
|
||||
<% } else { %>
|
||||
<span class="has-text-grey">(No End Date)</span>
|
||||
<% } %>
|
||||
</td>
|
||||
<td>
|
||||
<% if (lotOccupancy.lotOccupancyOccupants.length === 0) { %>
|
||||
<span class="has-text-grey">(No <%= configFunctions.getProperty("aliases.occupants") %>)</span>
|
||||
<% } else { %>
|
||||
<% const occupant = lotOccupancy.lotOccupancyOccupants[0]; %>
|
||||
<%= occupant.occupantName %>
|
||||
<%= (lotOccupancy.lotOccupancyOccupants.length > 1 ? " plus " + (lotOccupancy.lotOccupancyOccupants.length - 1) : "") %>
|
||||
<% } %>
|
||||
</td>
|
||||
</tr>
|
||||
<% } %>
|
||||
</tbody>
|
||||
</table>
|
||||
<% } %>
|
||||
</div>
|
||||
<div class="<%= (tabToSelect === "lots" ? "" : "is-hidden") %>" id="relatedTab--lots">
|
||||
<% if (workOrder.workOrderLots.length === 0) { %>
|
||||
<div class="message is-info">
|
||||
<p class="message-body">
|
||||
There are no
|
||||
<%= configFunctions.getProperty("aliases.lots").toLowerCase() %>
|
||||
records associated with this work order.
|
||||
</p>
|
||||
</div>
|
||||
<% } else { %>
|
||||
<table class="table is-fullwidth is-striped is-hoverable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th><%= configFunctions.getProperty("aliases.lot") %></th>
|
||||
<th><%= configFunctions.getProperty("aliases.map") %></th>
|
||||
<th><%= configFunctions.getProperty("aliases.lot") %> Type</th>
|
||||
<th>Status</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% for (const lot of workOrder.workOrderLots) { %>
|
||||
<tr>
|
||||
<td>
|
||||
<a class="has-text-weight-bold" href="<%= urlPrefix %>/lots/<%= lot.lotId %>"><%= lot.lotName %></a>
|
||||
</td>
|
||||
<td><%= lot.mapName %></td>
|
||||
<td><%= lot.lotType %></td>
|
||||
<td><%= lot.lotStatus %></td>
|
||||
</tr>
|
||||
<% } %>
|
||||
</tbody>
|
||||
</table>
|
||||
<% } %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue