work order comments

deepsource-autofix-76c6eb20
Dan Gowans 2022-09-23 15:20:47 -04:00
parent a594b81dd5
commit 9d373d5f2c
27 changed files with 1357 additions and 664 deletions

View File

@ -0,0 +1,3 @@
import type { RequestHandler } from "express";
export declare const handler: RequestHandler;
export default handler;

View File

@ -0,0 +1,11 @@
import { addWorkOrderComment } from "../../helpers/lotOccupancyDB/addWorkOrderComment.js";
import { getWorkOrderComments } from "../../helpers/lotOccupancyDB/getWorkOrderComments.js";
export const handler = async (request, response) => {
addWorkOrderComment(request.body, request.session);
const workOrderComments = getWorkOrderComments(request.body.workOrderId);
response.json({
success: true,
workOrderComments
});
};
export default handler;

View File

@ -0,0 +1,18 @@
import type { RequestHandler } from "express";
import { addWorkOrderComment } from "../../helpers/lotOccupancyDB/addWorkOrderComment.js";
import { getWorkOrderComments } from "../../helpers/lotOccupancyDB/getWorkOrderComments.js";
export const handler: RequestHandler = async (request, response) => {
addWorkOrderComment(request.body, request.session);
const workOrderComments = getWorkOrderComments(request.body.workOrderId);
response.json({
success: true,
workOrderComments
});
};
export default handler;

View File

@ -0,0 +1,3 @@
import type { RequestHandler } from "express";
export declare const handler: RequestHandler;
export default handler;

View File

@ -0,0 +1,11 @@
import { deleteWorkOrderComment } from "../../helpers/lotOccupancyDB/deleteWorkOrderComment.js";
import { getWorkOrderComments } from "../../helpers/lotOccupancyDB/getWorkOrderComments.js";
export const handler = async (request, response) => {
const success = deleteWorkOrderComment(request.body.workOrderCommentId, request.session);
const workOrderComments = getWorkOrderComments(request.body.workOrderId);
response.json({
success,
workOrderComments
});
};
export default handler;

View File

@ -0,0 +1,18 @@
import type { RequestHandler } from "express";
import { deleteWorkOrderComment } from "../../helpers/lotOccupancyDB/deleteWorkOrderComment.js";
import { getWorkOrderComments } from "../../helpers/lotOccupancyDB/getWorkOrderComments.js";
export const handler: RequestHandler = async (request, response) => {
const success = deleteWorkOrderComment(request.body.workOrderCommentId, request.session);
const workOrderComments = getWorkOrderComments(request.body.workOrderId);
response.json({
success,
workOrderComments
});
};
export default handler;

View File

@ -0,0 +1,3 @@
import type { RequestHandler } from "express";
export declare const handler: RequestHandler;
export default handler;

View File

@ -0,0 +1,11 @@
import { updateWorkOrderComment } from "../../helpers/lotOccupancyDB/updateWorkOrderComment.js";
import { getWorkOrderComments } from "../../helpers/lotOccupancyDB/getWorkOrderComments.js";
export const handler = async (request, response) => {
const success = updateWorkOrderComment(request.body, request.session);
const workOrderComments = getWorkOrderComments(request.body.workOrderId);
response.json({
success,
workOrderComments
});
};
export default handler;

View File

@ -0,0 +1,18 @@
import type { RequestHandler } from "express";
import { updateWorkOrderComment } from "../../helpers/lotOccupancyDB/updateWorkOrderComment.js";
import { getWorkOrderComments } from "../../helpers/lotOccupancyDB/getWorkOrderComments.js";
export const handler: RequestHandler = async (request, response) => {
const success = updateWorkOrderComment(request.body, request.session);
const workOrderComments = getWorkOrderComments(request.body.workOrderId);
response.json({
success,
workOrderComments
});
};
export default handler;

View File

@ -0,0 +1,7 @@
import type * as recordTypes from "../../types/recordTypes";
interface AddWorkOrderCommentForm {
workOrderId: string;
workOrderComment: string;
}
export declare const addWorkOrderComment: (workOrderCommentForm: AddWorkOrderCommentForm, requestSession: recordTypes.PartialSession) => number;
export default addWorkOrderComment;

View File

@ -0,0 +1,17 @@
import sqlite from "better-sqlite3";
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
import * as dateTimeFunctions from "@cityssm/expressjs-server-js/dateTimeFns.js";
export const addWorkOrderComment = (workOrderCommentForm, requestSession) => {
const database = sqlite(databasePath);
const rightNow = new Date();
const result = database
.prepare("insert into WorkOrderComments (" +
"workOrderId, workOrderCommentDate, workOrderCommentTime, workOrderComment," +
" recordCreate_userName, recordCreate_timeMillis," +
" recordUpdate_userName, recordUpdate_timeMillis)" +
" values (?, ?, ?, ?, ?, ?, ?, ?)")
.run(workOrderCommentForm.workOrderId, dateTimeFunctions.dateToInteger(rightNow), dateTimeFunctions.dateToTimeInteger(rightNow), workOrderCommentForm.workOrderComment, requestSession.user.userName, rightNow.getTime(), requestSession.user.userName, rightNow.getTime());
database.close();
return result.lastInsertRowid;
};
export default addWorkOrderComment;

View File

@ -0,0 +1,46 @@
import sqlite from "better-sqlite3";
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
import * as dateTimeFunctions from "@cityssm/expressjs-server-js/dateTimeFns.js";
import type * as recordTypes from "../../types/recordTypes";
interface AddWorkOrderCommentForm {
workOrderId: string;
workOrderComment: string;
}
export const addWorkOrderComment = (
workOrderCommentForm: AddWorkOrderCommentForm,
requestSession: recordTypes.PartialSession
): number => {
const database = sqlite(databasePath);
const rightNow = new Date();
const result = database
.prepare(
"insert into WorkOrderComments (" +
"workOrderId, workOrderCommentDate, workOrderCommentTime, workOrderComment," +
" recordCreate_userName, recordCreate_timeMillis," +
" recordUpdate_userName, recordUpdate_timeMillis)" +
" values (?, ?, ?, ?, ?, ?, ?, ?)"
)
.run(
workOrderCommentForm.workOrderId,
dateTimeFunctions.dateToInteger(rightNow),
dateTimeFunctions.dateToTimeInteger(rightNow),
workOrderCommentForm.workOrderComment,
requestSession.user.userName,
rightNow.getTime(),
requestSession.user.userName,
rightNow.getTime()
);
database.close();
return result.lastInsertRowid as number;
};
export default addWorkOrderComment;

View File

@ -0,0 +1,3 @@
import type * as recordTypes from "../../types/recordTypes";
export declare const deleteWorkOrderComment: (workOrderCommentId: number | string, requestSession: recordTypes.PartialSession) => boolean;
export default deleteWorkOrderComment;

View File

@ -0,0 +1,15 @@
import sqlite from "better-sqlite3";
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
export const deleteWorkOrderComment = (workOrderCommentId, requestSession) => {
const database = sqlite(databasePath);
const rightNowMillis = Date.now();
const result = database
.prepare("update WorkOrderComments" +
" set recordDelete_userName = ?," +
" recordDelete_timeMillis = ?" +
" where workOrderCommentId = ?")
.run(requestSession.user.userName, rightNowMillis, workOrderCommentId);
database.close();
return result.changes > 0;
};
export default deleteWorkOrderComment;

View File

@ -0,0 +1,29 @@
import sqlite from "better-sqlite3";
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
import type * as recordTypes from "../../types/recordTypes";
export const deleteWorkOrderComment = (
workOrderCommentId: number | string,
requestSession: recordTypes.PartialSession
): boolean => {
const database = sqlite(databasePath);
const rightNowMillis = Date.now();
const result = database
.prepare(
"update WorkOrderComments" +
" set recordDelete_userName = ?," +
" recordDelete_timeMillis = ?" +
" where workOrderCommentId = ?"
)
.run(requestSession.user.userName, rightNowMillis, workOrderCommentId);
database.close();
return result.changes > 0;
};
export default deleteWorkOrderComment;

View File

@ -0,0 +1,9 @@
import type * as recordTypes from "../../types/recordTypes";
interface UpdateWorkOrderCommentForm {
workOrderCommentId: string | number;
workOrderCommentDateString: string;
workOrderCommentTimeString: string;
workOrderComment: string;
}
export declare const updateWorkOrderComment: (commentForm: UpdateWorkOrderCommentForm, requestSession: recordTypes.PartialSession) => boolean;
export default updateWorkOrderComment;

View File

@ -0,0 +1,20 @@
import sqlite from "better-sqlite3";
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
import { dateStringToInteger } from "@cityssm/expressjs-server-js/dateTimeFns.js";
export const updateWorkOrderComment = (commentForm, requestSession) => {
const rightNowMillis = Date.now();
const database = sqlite(databasePath);
const result = database
.prepare("update WorkOrderComments" +
" set workOrderCommentDate = ?," +
" workOrderCommentTime = ?," +
" workOrderComment = ?," +
" recordUpdate_userName = ?," +
" recordUpdate_timeMillis = ?" +
" where recordDelete_timeMillis is null" +
" and workOrderCommentId = ?")
.run(dateStringToInteger(commentForm.workOrderCommentDateString), dateStringToInteger(commentForm.workOrderCommentTimeString), commentForm.workOrderComment, requestSession.user.userName, rightNowMillis, commentForm.workOrderCommentId);
database.close();
return result.changes > 0;
};
export default updateWorkOrderComment;

View File

@ -0,0 +1,49 @@
import sqlite from "better-sqlite3";
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
import { dateStringToInteger } from "@cityssm/expressjs-server-js/dateTimeFns.js";
import type * as recordTypes from "../../types/recordTypes";
interface UpdateWorkOrderCommentForm {
workOrderCommentId: string | number;
workOrderCommentDateString: string;
workOrderCommentTimeString: string;
workOrderComment: string;
}
export const updateWorkOrderComment = (
commentForm: UpdateWorkOrderCommentForm,
requestSession: recordTypes.PartialSession
): boolean => {
const rightNowMillis = Date.now();
const database = sqlite(databasePath);
const result = database
.prepare(
"update WorkOrderComments" +
" set workOrderCommentDate = ?," +
" workOrderCommentTime = ?," +
" workOrderComment = ?," +
" recordUpdate_userName = ?," +
" recordUpdate_timeMillis = ?" +
" where recordDelete_timeMillis is null" +
" and workOrderCommentId = ?"
)
.run(
dateStringToInteger(commentForm.workOrderCommentDateString),
dateStringToInteger(commentForm.workOrderCommentTimeString),
commentForm.workOrderComment,
requestSession.user.userName,
rightNowMillis,
commentForm.workOrderCommentId
);
database.close();
return result.changes > 0;
};
export default updateWorkOrderComment;

View File

@ -3,24 +3,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
(() => { (() => {
const los = exports.los; const los = exports.los;
const urlPrefix = document.querySelector("main").dataset.urlPrefix; const urlPrefix = document.querySelector("main").dataset.urlPrefix;
const workOrderId = document.querySelector("#workOrderEdit--workOrderId").value; const workOrderId = document.querySelector("#workOrderEdit--workOrderId")
.value;
const isCreate = workOrderId === ""; const isCreate = workOrderId === "";
const workOrderFormElement = document.querySelector("#form--workOrderEdit"); const workOrderFormElement = document.querySelector("#form--workOrderEdit");
los.initializeDatePickers(workOrderFormElement.querySelector("#workOrderEdit--workOrderOpenDateString").closest(".field")); los.initializeDatePickers(workOrderFormElement
.querySelector("#workOrderEdit--workOrderOpenDateString")
.closest(".field"));
los.initializeUnlockFieldButtons(workOrderFormElement); los.initializeUnlockFieldButtons(workOrderFormElement);
workOrderFormElement workOrderFormElement.addEventListener("submit", (submitEvent) => {
.addEventListener("submit", (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(urlPrefix + cityssm.postJSON(urlPrefix + "/workOrders/" + (isCreate ? "doCreateWorkOrder" : "doUpdateWorkOrder"), submitEvent.currentTarget, (responseJSON) => {
"/workOrders/" +
(isCreate ? "doCreateWorkOrder" : "doUpdateWorkOrder"), submitEvent.currentTarget, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
if (isCreate) { if (isCreate) {
window.location.href = window.location.href =
urlPrefix + urlPrefix + "/workOrders/" + responseJSON.workOrderId + "/edit";
"/workOrders/" +
responseJSON.workOrderId +
"/edit";
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
@ -45,8 +42,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
workOrderId workOrderId
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
window.location.href = window.location.href = urlPrefix + "/workOrders/" + workOrderId;
urlPrefix + "/workOrders/" + workOrderId;
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
@ -57,9 +53,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
}); });
}; };
document document.querySelector("#button--closeWorkOrder").addEventListener("click", () => {
.querySelector("#button--closeWorkOrder")
.addEventListener("click", () => {
const hasOpenMilestones = workOrderMilestones.some((milestone) => { const hasOpenMilestones = workOrderMilestones.some((milestone) => {
return !milestone.workOrderMilestoneCompletionDate; return !milestone.workOrderMilestoneCompletionDate;
}); });
@ -130,8 +124,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
lotOccupancyId lotOccupancyId
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderLotOccupancies = workOrderLotOccupancies = responseJSON.workOrderLotOccupancies;
responseJSON.workOrderLotOccupancies;
renderRelatedLotsAndOccupancies(); renderRelatedLotsAndOccupancies();
} }
else { else {
@ -188,8 +181,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
lotOccupancyId lotOccupancyId
}, (responseJSON) => { }, (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderLotOccupancies = workOrderLotOccupancies = responseJSON.workOrderLotOccupancies;
responseJSON.workOrderLotOccupancies;
renderRelatedLotsAndOccupancies(); renderRelatedLotsAndOccupancies();
} }
else { else {
@ -205,13 +197,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
}); });
}; };
const addLotFromLotOccupancy = (clickEvent) => { const addLotFromLotOccupancy = (clickEvent) => {
const lotId = clickEvent.currentTarget.dataset const lotId = clickEvent.currentTarget.dataset.lotId;
.lotId;
addLot(lotId); addLot(lotId);
}; };
const renderRelatedOccupancies = () => { const renderRelatedOccupancies = () => {
const occupanciesContainerElement = document.querySelector("#container--lotOccupancies"); const occupanciesContainerElement = document.querySelector("#container--lotOccupancies");
document.querySelector(".tabs a[href='#relatedTab--lotOccupancies'] .tag").textContent = workOrderLotOccupancies.length.toString(); document.querySelector(".tabs a[href='#relatedTab--lotOccupancies'] .tag").textContent =
workOrderLotOccupancies.length.toString();
if (workOrderLotOccupancies.length === 0) { if (workOrderLotOccupancies.length === 0) {
occupanciesContainerElement.innerHTML = occupanciesContainerElement.innerHTML =
'<div class="message is-info">' + '<div class="message is-info">' +
@ -240,8 +232,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
for (const lotOccupancy of workOrderLotOccupancies) { for (const lotOccupancy of workOrderLotOccupancies) {
const rowElement = document.createElement("tr"); const rowElement = document.createElement("tr");
rowElement.className = "container--lotOccupancy"; rowElement.className = "container--lotOccupancy";
rowElement.dataset.lotOccupancyId = rowElement.dataset.lotOccupancyId = lotOccupancy.lotOccupancyId.toString();
lotOccupancy.lotOccupancyId.toString();
const isActive = !(lotOccupancy.occupancyEndDate && const isActive = !(lotOccupancy.occupancyEndDate &&
lotOccupancy.occupancyEndDateString < currentDateString); lotOccupancy.occupancyEndDateString < currentDateString);
const hasLotRecord = lotOccupancy.lotId && const hasLotRecord = lotOccupancy.lotId &&
@ -306,13 +297,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
? '<span class="has-text-grey">(No ' + ? '<span class="has-text-grey">(No ' +
cityssm.escapeHTML(exports.aliases.occupants) + cityssm.escapeHTML(exports.aliases.occupants) +
")</span>" ")</span>"
: cityssm.escapeHTML(lotOccupancy.lotOccupancyOccupants[0] : cityssm.escapeHTML(lotOccupancy.lotOccupancyOccupants[0].occupantName) +
.occupantName) +
(lotOccupancy.lotOccupancyOccupants.length > 1 (lotOccupancy.lotOccupancyOccupants.length > 1
? " plus " + ? " plus " + (lotOccupancy.lotOccupancyOccupants.length - 1)
(lotOccupancy.lotOccupancyOccupants
.length -
1)
: "")) + : "")) +
"</td>") + "</td>") +
("<td>" + ("<td>" +
@ -328,9 +315,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
rowElement rowElement
.querySelector(".button--deleteLotOccupancy") .querySelector(".button--deleteLotOccupancy")
.addEventListener("click", deleteLotOccupancy); .addEventListener("click", deleteLotOccupancy);
occupanciesContainerElement occupanciesContainerElement.querySelector("tbody").append(rowElement);
.querySelector("tbody")
.append(rowElement);
} }
}; };
const deleteLot = (clickEvent) => { const deleteLot = (clickEvent) => {
@ -373,7 +358,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
}; };
const renderRelatedLots = () => { const renderRelatedLots = () => {
const lotsContainerElement = document.querySelector("#container--lots"); const lotsContainerElement = document.querySelector("#container--lots");
document.querySelector(".tabs a[href='#relatedTab--lots'] .tag").textContent = workOrderLots.length.toString(); document.querySelector(".tabs a[href='#relatedTab--lots'] .tag").textContent =
workOrderLots.length.toString();
if (workOrderLots.length === 0) { if (workOrderLots.length === 0) {
lotsContainerElement.innerHTML = lotsContainerElement.innerHTML =
'<div class="message is-info">' + '<div class="message is-info">' +
@ -418,9 +404,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
'<i class="fas fa-trash" aria-hidden="true"></i>' + '<i class="fas fa-trash" aria-hidden="true"></i>' +
"</button>" + "</button>" +
"</td>"); "</td>");
rowElement rowElement.querySelector(".button--deleteLot").addEventListener("click", deleteLot);
.querySelector(".button--deleteLot")
.addEventListener("click", deleteLot);
lotsContainerElement.querySelector("tbody").append(rowElement); lotsContainerElement.querySelector("tbody").append(rowElement);
} }
}; };
@ -429,9 +413,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
renderRelatedLots(); renderRelatedLots();
}; };
renderRelatedLotsAndOccupancies(); renderRelatedLotsAndOccupancies();
document document.querySelector("#button--addLotOccupancy").addEventListener("click", () => {
.querySelector("#button--addLotOccupancy")
.addEventListener("click", () => {
let searchFormElement; let searchFormElement;
let searchResultsContainerElement; let searchResultsContainerElement;
const doAddLotOccupancy = (clickEvent) => { const doAddLotOccupancy = (clickEvent) => {
@ -465,9 +447,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
"<thead>" + "<thead>" +
"<tr>" + "<tr>" +
'<th class="has-width-1"></th>' + '<th class="has-width-1"></th>' +
("<th>" + ("<th>" + exports.aliases.occupancy + " Type</th>") +
exports.aliases.occupancy +
" Type</th>") +
("<th>" + exports.aliases.lot + "</th>") + ("<th>" + exports.aliases.lot + "</th>") +
"<th>Start Date</th>" + "<th>Start Date</th>" +
"<th>End Date</th>" + "<th>End Date</th>" +
@ -478,8 +458,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
"</table>"; "</table>";
for (const lotOccupancy of responseJSON.lotOccupancies) { for (const lotOccupancy of responseJSON.lotOccupancies) {
const rowElement = document.createElement("tr"); const rowElement = document.createElement("tr");
rowElement.className = rowElement.className = "container--lotOccupancy";
"container--lotOccupancy";
rowElement.dataset.lotOccupancyId = rowElement.dataset.lotOccupancyId =
lotOccupancy.lotOccupancyId.toString(); lotOccupancy.lotOccupancyId.toString();
rowElement.innerHTML = rowElement.innerHTML =
@ -492,9 +471,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
cityssm.escapeHTML(lotOccupancy.occupancyType) + cityssm.escapeHTML(lotOccupancy.occupancyType) +
"</td>"); "</td>");
if (lotOccupancy.lotId) { if (lotOccupancy.lotId) {
rowElement.insertAdjacentHTML("beforeend", "<td>" + rowElement.insertAdjacentHTML("beforeend", "<td>" + cityssm.escapeHTML(lotOccupancy.lotName) + "</td>");
cityssm.escapeHTML(lotOccupancy.lotName) +
"</td>");
} }
else { else {
rowElement.insertAdjacentHTML("beforeend", "<td>" + rowElement.insertAdjacentHTML("beforeend", "<td>" +
@ -512,30 +489,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
: '<span class="has-text-grey">(No End Date)</span>') + : '<span class="has-text-grey">(No End Date)</span>') +
"</td>") + "</td>") +
("<td>" + ("<td>" +
(lotOccupancy.lotOccupancyOccupants (lotOccupancy.lotOccupancyOccupants.length === 0
.length === 0
? '<span class="has-text-grey">(No ' + ? '<span class="has-text-grey">(No ' +
cityssm.escapeHTML(exports.aliases.occupants) + cityssm.escapeHTML(exports.aliases.occupants) +
")</span>" ")</span>"
: cityssm.escapeHTML(lotOccupancy : cityssm.escapeHTML(lotOccupancy.lotOccupancyOccupants[0].occupantName) +
.lotOccupancyOccupants[0] (lotOccupancy.lotOccupancyOccupants.length > 1
.occupantName) +
(lotOccupancy
.lotOccupancyOccupants
.length > 1
? " plus " + ? " plus " +
(lotOccupancy (lotOccupancy.lotOccupancyOccupants.length - 1)
.lotOccupancyOccupants
.length -
1)
: "")) + : "")) +
"</td>")); "</td>"));
rowElement rowElement
.querySelector(".button--addLotOccupancy") .querySelector(".button--addLotOccupancy")
.addEventListener("click", doAddLotOccupancy); .addEventListener("click", doAddLotOccupancy);
searchResultsContainerElement searchResultsContainerElement.querySelector("tbody").append(rowElement);
.querySelector("tbody")
.append(rowElement);
} }
}); });
}; };
@ -543,8 +510,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
onshow: (modalElement) => { onshow: (modalElement) => {
los.populateAliases(modalElement); los.populateAliases(modalElement);
searchFormElement = modalElement.querySelector("form"); searchFormElement = modalElement.querySelector("form");
searchResultsContainerElement = searchResultsContainerElement = modalElement.querySelector("#resultsContainer--lotOccupancyAdd");
modalElement.querySelector("#resultsContainer--lotOccupancyAdd");
modalElement.querySelector("#lotOccupancySearch--notWorkOrderId").value = workOrderId; modalElement.querySelector("#lotOccupancySearch--notWorkOrderId").value = workOrderId;
modalElement.querySelector("#lotOccupancySearch--occupancyEffectiveDateString").value = document.querySelector("#workOrderEdit--workOrderOpenDateString").value; modalElement.querySelector("#lotOccupancySearch--occupancyEffectiveDateString").value = document.querySelector("#workOrderEdit--workOrderOpenDateString").value;
doSearch(); doSearch();
@ -564,9 +530,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
}); });
}); });
document document.querySelector("#button--addLot").addEventListener("click", () => {
.querySelector("#button--addLot")
.addEventListener("click", () => {
let searchFormElement; let searchFormElement;
let searchResultsContainerElement; let searchResultsContainerElement;
const doAddLot = (clickEvent) => { const doAddLot = (clickEvent) => {
@ -624,18 +588,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
"<td>" + "<td>" +
cityssm.escapeHTML(lot.mapName) + cityssm.escapeHTML(lot.mapName) +
"</td>" + "</td>" +
("<td>" + ("<td>" + cityssm.escapeHTML(lot.lotType) + "</td>") +
cityssm.escapeHTML(lot.lotType) + ("<td>" + cityssm.escapeHTML(lot.lotStatus) + "</td>");
"</td>") +
("<td>" +
cityssm.escapeHTML(lot.lotStatus) +
"</td>");
rowElement rowElement
.querySelector(".button--addLot") .querySelector(".button--addLot")
.addEventListener("click", doAddLot); .addEventListener("click", doAddLot);
searchResultsContainerElement searchResultsContainerElement.querySelector("tbody").append(rowElement);
.querySelector("tbody")
.append(rowElement);
} }
}); });
}; };
@ -643,14 +601,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
onshow: (modalElement) => { onshow: (modalElement) => {
los.populateAliases(modalElement); los.populateAliases(modalElement);
searchFormElement = modalElement.querySelector("form"); searchFormElement = modalElement.querySelector("form");
searchResultsContainerElement = searchResultsContainerElement = modalElement.querySelector("#resultsContainer--lotAdd");
modalElement.querySelector("#resultsContainer--lotAdd");
modalElement.querySelector("#lotSearch--notWorkOrderId").value = workOrderId; modalElement.querySelector("#lotSearch--notWorkOrderId").value = workOrderId;
const lotStatusElement = modalElement.querySelector("#lotSearch--lotStatusId"); const lotStatusElement = modalElement.querySelector("#lotSearch--lotStatusId");
for (const lotStatus of exports.lotStatuses) { for (const lotStatus of exports.lotStatuses) {
const optionElement = document.createElement("option"); const optionElement = document.createElement("option");
optionElement.value = optionElement.value = lotStatus.lotStatusId.toString();
lotStatus.lotStatusId.toString();
optionElement.textContent = lotStatus.lotStatus; optionElement.textContent = lotStatus.lotStatus;
lotStatusElement.append(optionElement); lotStatusElement.append(optionElement);
} }
@ -672,9 +628,177 @@ Object.defineProperty(exports, "__esModule", { value: true });
}); });
}); });
} }
let workOrderComments = exports.workOrderComments;
delete exports.workOrderComments;
const openEditWorkOrderComment = (clickEvent) => {
const workOrderCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.workOrderCommentId, 10);
const workOrderComment = workOrderComments.find((currentComment) => {
return currentComment.workOrderCommentId === workOrderCommentId;
});
console.log(workOrderComments);
let editFormElement;
let editCloseModalFunction;
const editComment = (submitEvent) => {
submitEvent.preventDefault();
cityssm.postJSON(urlPrefix + "/workOrders/doUpdateWorkOrderComment", editFormElement, (responseJSON) => {
if (responseJSON.success) {
workOrderComments = responseJSON.workOrderComments;
editCloseModalFunction();
renderWorkOrderComments();
}
else {
bulmaJS.alert({
title: "Error Updating Comment",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
});
};
cityssm.openHtmlModal("workOrder-editComment", {
onshow: (modalElement) => {
modalElement.querySelector("#workOrderCommentEdit--workOrderId").value = workOrderId;
modalElement.querySelector("#workOrderCommentEdit--workOrderCommentId").value = workOrderCommentId.toString();
modalElement.querySelector("#workOrderCommentEdit--workOrderComment").value = workOrderComment.workOrderComment;
modalElement.querySelector("#workOrderCommentEdit--workOrderCommentDateString").value = workOrderComment.workOrderCommentDateString;
modalElement.querySelector("#workOrderCommentEdit--workOrderCommentTimeString").value = workOrderComment.workOrderCommentTimeString;
},
onshown: (modalElement, closeModalFunction) => {
bulmaJS.toggleHtmlClipped();
los.initializeDatePickers(modalElement);
los.initializeTimePickers(modalElement);
modalElement.querySelector("#workOrderCommentEdit--workOrderComment").focus();
editFormElement = modalElement.querySelector("form");
editFormElement.addEventListener("submit", editComment);
editCloseModalFunction = closeModalFunction;
},
onremoved: () => {
bulmaJS.toggleHtmlClipped();
}
});
};
const deleteWorkOrderComment = (clickEvent) => {
const workOrderCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.workOrderCommentId, 10);
const doDelete = () => {
cityssm.postJSON(urlPrefix + "/workOrders/doDeleteWorkOrderComment", {
workOrderId,
workOrderCommentId
}, (responseJSON) => {
if (responseJSON.success) {
workOrderComments = responseJSON.workOrderComments;
renderWorkOrderComments();
}
else {
bulmaJS.alert({
title: "Error Removing Comment",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
});
};
bulmaJS.confirm({
title: "Remove Comment?",
message: "Are you sure you want to remove this comment?",
okButton: {
text: "Yes, Remove Comment",
callbackFunction: doDelete
},
contextualColorName: "warning"
});
};
const renderWorkOrderComments = () => {
const containerElement = document.querySelector("#container--workOrderComments");
if (workOrderComments.length === 0) {
containerElement.innerHTML =
'<div class="message is-info">' +
'<p class="message-body">There are no comments to display.</p>' +
"</div>";
return;
}
const tableElement = document.createElement("table");
tableElement.className = "table is-fullwidth is-striped is-hoverable";
tableElement.innerHTML =
"<thead><tr>" +
"<th>Commentor</th>" +
"<th>Comment Date</th>" +
"<th>Comment</th>" +
'<th class="is-hidden-print"><span class="is-sr-only">Options</span></th>' +
"</tr></thead>" +
"<tbody></tbody>";
for (const workOrderComment of workOrderComments) {
const tableRowElement = document.createElement("tr");
tableRowElement.dataset.workOrderCommentId = workOrderComment.workOrderCommentId.toString();
tableRowElement.innerHTML =
"<td>" +
cityssm.escapeHTML(workOrderComment.recordCreate_userName) +
"</td>" +
"<td>" +
workOrderComment.workOrderCommentDateString +
(workOrderComment.workOrderCommentTime === 0
? ""
: " " + workOrderComment.workOrderCommentTimeString) +
"</td>" +
"<td>" +
cityssm.escapeHTML(workOrderComment.workOrderComment) +
"</td>" +
('<td class="is-hidden-print">' +
'<div class="buttons are-small is-justify-content-end">' +
('<button class="button is-primary button--edit" type="button">' +
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
" <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>' +
"</button>") +
"</div>" +
"</td>");
tableRowElement
.querySelector(".button--edit")
.addEventListener("click", openEditWorkOrderComment);
tableRowElement
.querySelector(".button--delete")
.addEventListener("click", deleteWorkOrderComment);
tableElement.querySelector("tbody").append(tableRowElement);
}
containerElement.innerHTML = "";
containerElement.append(tableElement);
};
const openAddCommentModal = () => {
let addCommentCloseModalFunction;
const doAddComment = (formEvent) => {
formEvent.preventDefault();
cityssm.postJSON(urlPrefix + "/workOrders/doAddWorkOrderComment", formEvent.currentTarget, (responseJSON) => {
if (responseJSON.success) {
workOrderComments = responseJSON.workOrderComments;
renderWorkOrderComments();
addCommentCloseModalFunction();
}
});
};
cityssm.openHtmlModal("workOrder-addComment", {
onshow(modalElement) {
los.populateAliases(modalElement);
modalElement.querySelector("#workOrderCommentAdd--workOrderId").value = workOrderId;
modalElement.querySelector("form").addEventListener("submit", doAddComment);
},
onshown(modalElement, closeModalFunction) {
bulmaJS.toggleHtmlClipped();
addCommentCloseModalFunction = closeModalFunction;
modalElement.querySelector("#workOrderCommentAdd--workOrderComment").focus();
},
onremoved() {
bulmaJS.toggleHtmlClipped();
document.querySelector("#workOrderComments--add").focus();
}
});
};
if (!isCreate) { if (!isCreate) {
workOrderMilestones = document.querySelector("#workOrderComments--add").addEventListener("click", openAddCommentModal);
exports.workOrderMilestones; renderWorkOrderComments();
}
if (!isCreate) {
workOrderMilestones = exports.workOrderMilestones;
delete exports.workOrderMilestones; delete exports.workOrderMilestones;
const processMilestoneResponse = (responseJSON) => { const processMilestoneResponse = (responseJSON) => {
if (responseJSON.success) { if (responseJSON.success) {
@ -694,8 +818,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
const currentDateString = cityssm.dateToString(new Date()); const currentDateString = cityssm.dateToString(new Date());
const workOrderMilestoneId = Number.parseInt(clickEvent.currentTarget.closest(".container--milestone").dataset.workOrderMilestoneId, 10); const workOrderMilestoneId = Number.parseInt(clickEvent.currentTarget.closest(".container--milestone").dataset.workOrderMilestoneId, 10);
const workOrderMilestone = workOrderMilestones.find((currentMilestone) => { const workOrderMilestone = workOrderMilestones.find((currentMilestone) => {
return (currentMilestone.workOrderMilestoneId === return currentMilestone.workOrderMilestoneId === workOrderMilestoneId;
workOrderMilestoneId);
}); });
const doComplete = () => { const doComplete = () => {
cityssm.postJSON(urlPrefix + "/workOrders/doCompleteWorkOrderMilestone", { cityssm.postJSON(urlPrefix + "/workOrders/doCompleteWorkOrderMilestone", {
@ -706,8 +829,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
bulmaJS.confirm({ bulmaJS.confirm({
title: "Complete Milestone", title: "Complete Milestone",
message: "Are you sure you want to complete this milestone?" + message: "Are you sure you want to complete this milestone?" +
(workOrderMilestone.workOrderMilestoneDateString > (workOrderMilestone.workOrderMilestoneDateString > currentDateString
currentDateString
? "<br /><strong>Note that this milestone is expected to be completed in the future.</strong>" ? "<br /><strong>Note that this milestone is expected to be completed in the future.</strong>"
: ""), : ""),
messageIsHtml: true, messageIsHtml: true,
@ -760,8 +882,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
clickEvent.preventDefault(); clickEvent.preventDefault();
const workOrderMilestoneId = Number.parseInt(clickEvent.currentTarget.closest(".container--milestone").dataset.workOrderMilestoneId, 10); const workOrderMilestoneId = Number.parseInt(clickEvent.currentTarget.closest(".container--milestone").dataset.workOrderMilestoneId, 10);
const workOrderMilestone = workOrderMilestones.find((currentMilestone) => { const workOrderMilestone = workOrderMilestones.find((currentMilestone) => {
return (currentMilestone.workOrderMilestoneId === return currentMilestone.workOrderMilestoneId === workOrderMilestoneId;
workOrderMilestoneId);
}); });
let editCloseModalFunction; let editCloseModalFunction;
const doEdit = (submitEvent) => { const doEdit = (submitEvent) => {
@ -776,16 +897,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
cityssm.openHtmlModal("workOrder-editMilestone", { cityssm.openHtmlModal("workOrder-editMilestone", {
onshow: (modalElement) => { onshow: (modalElement) => {
modalElement.querySelector("#milestoneEdit--workOrderId").value = workOrderId; modalElement.querySelector("#milestoneEdit--workOrderId").value = workOrderId;
modalElement.querySelector("#milestoneEdit--workOrderMilestoneId").value = modalElement.querySelector("#milestoneEdit--workOrderMilestoneId").value = workOrderMilestone.workOrderMilestoneId.toString();
workOrderMilestone.workOrderMilestoneId.toString();
const milestoneTypeElement = modalElement.querySelector("#milestoneEdit--workOrderMilestoneTypeId"); const milestoneTypeElement = modalElement.querySelector("#milestoneEdit--workOrderMilestoneTypeId");
let milestoneTypeFound = false; let milestoneTypeFound = false;
for (const milestoneType of exports.workOrderMilestoneTypes) { for (const milestoneType of exports.workOrderMilestoneTypes) {
const optionElement = document.createElement("option"); const optionElement = document.createElement("option");
optionElement.value = optionElement.value = milestoneType.workOrderMilestoneTypeId.toString();
milestoneType.workOrderMilestoneTypeId.toString(); optionElement.textContent = milestoneType.workOrderMilestoneType;
optionElement.textContent =
milestoneType.workOrderMilestoneType;
if (milestoneType.workOrderMilestoneTypeId === if (milestoneType.workOrderMilestoneTypeId ===
workOrderMilestone.workOrderMilestoneTypeId) { workOrderMilestone.workOrderMilestoneTypeId) {
optionElement.selected = true; optionElement.selected = true;
@ -793,20 +911,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
milestoneTypeElement.append(optionElement); milestoneTypeElement.append(optionElement);
} }
if (!milestoneTypeFound && if (!milestoneTypeFound && workOrderMilestone.workOrderMilestoneTypeId) {
workOrderMilestone.workOrderMilestoneTypeId) {
const optionElement = document.createElement("option"); const optionElement = document.createElement("option");
optionElement.value = optionElement.value =
workOrderMilestone.workOrderMilestoneTypeId.toString(); workOrderMilestone.workOrderMilestoneTypeId.toString();
optionElement.textContent = optionElement.textContent = workOrderMilestone.workOrderMilestoneType;
workOrderMilestone.workOrderMilestoneType;
optionElement.selected = true; optionElement.selected = true;
milestoneTypeElement.append(optionElement); milestoneTypeElement.append(optionElement);
} }
modalElement.querySelector("#milestoneEdit--workOrderMilestoneDateString").value = workOrderMilestone.workOrderMilestoneDateString; modalElement.querySelector("#milestoneEdit--workOrderMilestoneDateString").value = workOrderMilestone.workOrderMilestoneDateString;
if (workOrderMilestone.workOrderMilestoneTime) { if (workOrderMilestone.workOrderMilestoneTime) {
modalElement.querySelector("#milestoneEdit--workOrderMilestoneTimeString").value = modalElement.querySelector("#milestoneEdit--workOrderMilestoneTimeString").value = workOrderMilestone.workOrderMilestoneTimeString;
workOrderMilestone.workOrderMilestoneTimeString;
} }
modalElement.querySelector("#milestoneEdit--workOrderMilestoneDescription").value = workOrderMilestone.workOrderMilestoneDescription; modalElement.querySelector("#milestoneEdit--workOrderMilestoneDescription").value = workOrderMilestone.workOrderMilestoneDescription;
}, },
@ -815,9 +930,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
los.initializeDatePickers(modalElement); los.initializeDatePickers(modalElement);
los.initializeTimePickers(modalElement); los.initializeTimePickers(modalElement);
modalElement modalElement.querySelector("form").addEventListener("submit", doEdit);
.querySelector("form")
.addEventListener("submit", doEdit);
}, },
onremoved: () => { onremoved: () => {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
@ -832,8 +945,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
for (const milestone of workOrderMilestones) { for (const milestone of workOrderMilestones) {
const panelBlockElement = document.createElement("div"); const panelBlockElement = document.createElement("div");
panelBlockElement.className = panelBlockElement.className = "panel-block is-block container--milestone";
"panel-block is-block container--milestone";
panelBlockElement.dataset.workOrderMilestoneId = panelBlockElement.dataset.workOrderMilestoneId =
milestone.workOrderMilestoneId.toString(); milestone.workOrderMilestoneId.toString();
panelBlockElement.innerHTML = panelBlockElement.innerHTML =
@ -915,9 +1027,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
bulmaJS.init(milestonesPanelElement); bulmaJS.init(milestonesPanelElement);
}; };
renderMilestones(); renderMilestones();
document document.querySelector("#button--addMilestone").addEventListener("click", () => {
.querySelector("#button--addMilestone")
.addEventListener("click", () => {
let addModalElement; let addModalElement;
let addCloseModalFunction; let addCloseModalFunction;
const doAdd = (submitEvent) => { const doAdd = (submitEvent) => {
@ -952,10 +1062,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
const milestoneTypeElement = modalElement.querySelector("#milestoneAdd--workOrderMilestoneTypeId"); const milestoneTypeElement = modalElement.querySelector("#milestoneAdd--workOrderMilestoneTypeId");
for (const milestoneType of exports.workOrderMilestoneTypes) { for (const milestoneType of exports.workOrderMilestoneTypes) {
const optionElement = document.createElement("option"); const optionElement = document.createElement("option");
optionElement.value = optionElement.value = milestoneType.workOrderMilestoneTypeId.toString();
milestoneType.workOrderMilestoneTypeId.toString(); optionElement.textContent = milestoneType.workOrderMilestoneType;
optionElement.textContent =
milestoneType.workOrderMilestoneType;
milestoneTypeElement.append(optionElement); milestoneTypeElement.append(optionElement);
} }
modalElement.querySelector("#milestoneAdd--workOrderMilestoneDateString").valueAsDate = new Date(); modalElement.querySelector("#milestoneAdd--workOrderMilestoneDateString").valueAsDate = new Date();
@ -966,9 +1074,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
los.initializeDatePickers(modalElement); los.initializeDatePickers(modalElement);
los.initializeTimePickers(modalElement); los.initializeTimePickers(modalElement);
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
modalElement modalElement.querySelector("form").addEventListener("submit", doAdd);
.querySelector("form")
.addEventListener("submit", doAdd);
}, },
onremoved: () => { onremoved: () => {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();

View File

@ -14,40 +14,31 @@ declare const bulmaJS: BulmaJS;
const urlPrefix = document.querySelector("main").dataset.urlPrefix; const urlPrefix = document.querySelector("main").dataset.urlPrefix;
const workOrderId = ( const workOrderId = (document.querySelector("#workOrderEdit--workOrderId") as HTMLInputElement)
document.querySelector( .value;
"#workOrderEdit--workOrderId"
) as HTMLInputElement
).value;
const isCreate = workOrderId === ""; const isCreate = workOrderId === "";
const workOrderFormElement = document.querySelector("#form--workOrderEdit") as HTMLFormElement; const workOrderFormElement = document.querySelector("#form--workOrderEdit") as HTMLFormElement;
los.initializeDatePickers(workOrderFormElement.querySelector("#workOrderEdit--workOrderOpenDateString").closest(".field")); los.initializeDatePickers(
workOrderFormElement
.querySelector("#workOrderEdit--workOrderOpenDateString")
.closest(".field")
);
los.initializeUnlockFieldButtons(workOrderFormElement); los.initializeUnlockFieldButtons(workOrderFormElement);
workOrderFormElement workOrderFormElement.addEventListener("submit", (submitEvent) => {
.addEventListener("submit", (submitEvent) => {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON( cityssm.postJSON(
urlPrefix + urlPrefix + "/workOrders/" + (isCreate ? "doCreateWorkOrder" : "doUpdateWorkOrder"),
"/workOrders/" +
(isCreate ? "doCreateWorkOrder" : "doUpdateWorkOrder"),
submitEvent.currentTarget, submitEvent.currentTarget,
(responseJSON: { (responseJSON: { success: boolean; workOrderId?: number; errorMessage?: string }) => {
success: boolean;
workOrderId?: number;
errorMessage?: string;
}) => {
if (responseJSON.success) { if (responseJSON.success) {
if (isCreate) { if (isCreate) {
window.location.href = window.location.href =
urlPrefix + urlPrefix + "/workOrders/" + responseJSON.workOrderId + "/edit";
"/workOrders/" +
responseJSON.workOrderId +
"/edit";
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
message: "Work Order Updated Successfully", message: "Work Order Updated Successfully",
@ -80,8 +71,7 @@ declare const bulmaJS: BulmaJS;
}, },
(responseJSON: { success: boolean; errorMessage?: string }) => { (responseJSON: { success: boolean; errorMessage?: string }) => {
if (responseJSON.success) { if (responseJSON.success) {
window.location.href = window.location.href = urlPrefix + "/workOrders/" + workOrderId;
urlPrefix + "/workOrders/" + workOrderId;
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
title: "Error Closing Work Order", title: "Error Closing Work Order",
@ -93,14 +83,10 @@ declare const bulmaJS: BulmaJS;
); );
}; };
document document.querySelector("#button--closeWorkOrder").addEventListener("click", () => {
.querySelector("#button--closeWorkOrder") const hasOpenMilestones = workOrderMilestones.some((milestone) => {
.addEventListener("click", () => {
const hasOpenMilestones = workOrderMilestones.some(
(milestone) => {
return !milestone.workOrderMilestoneCompletionDate; return !milestone.workOrderMilestoneCompletionDate;
} });
);
if (hasOpenMilestones) { if (hasOpenMilestones) {
bulmaJS.confirm({ bulmaJS.confirm({
@ -116,8 +102,7 @@ declare const bulmaJS: BulmaJS;
} else { } else {
bulmaJS.confirm({ bulmaJS.confirm({
title: "Close Work Order", title: "Close Work Order",
message: message: "Are you sure you want to close this work order?",
"Are you sure you want to close this work order?",
contextualColorName: "info", contextualColorName: "info",
okButton: { okButton: {
text: "Yes, Close Work Order", text: "Yes, Close Work Order",
@ -172,8 +157,7 @@ declare const bulmaJS: BulmaJS;
let workOrderLots: recordTypes.Lot[] = exports.workOrderLots; let workOrderLots: recordTypes.Lot[] = exports.workOrderLots;
delete exports.workOrderLots; delete exports.workOrderLots;
let workOrderLotOccupancies: recordTypes.LotOccupancy[] = let workOrderLotOccupancies: recordTypes.LotOccupancy[] = exports.workOrderLotOccupancies;
exports.workOrderLotOccupancies;
delete exports.workOrderLotOccupancies; delete exports.workOrderLotOccupancies;
const deleteLotOccupancy = (clickEvent: Event) => { const deleteLotOccupancy = (clickEvent: Event) => {
@ -196,8 +180,7 @@ declare const bulmaJS: BulmaJS;
workOrderLotOccupancies?: recordTypes.LotOccupancy[]; workOrderLotOccupancies?: recordTypes.LotOccupancy[];
}) => { }) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderLotOccupancies = workOrderLotOccupancies = responseJSON.workOrderLotOccupancies;
responseJSON.workOrderLotOccupancies;
renderRelatedLotsAndOccupancies(); renderRelatedLotsAndOccupancies();
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
@ -231,10 +214,7 @@ declare const bulmaJS: BulmaJS;
}); });
}; };
const addLot = ( const addLot = (lotId: number | string, callbackFunction?: (success?: boolean) => void) => {
lotId: number | string,
callbackFunction?: (success?: boolean) => void
) => {
cityssm.postJSON( cityssm.postJSON(
urlPrefix + "/workOrders/doAddWorkOrderLot", urlPrefix + "/workOrders/doAddWorkOrderLot",
{ {
@ -280,8 +260,7 @@ declare const bulmaJS: BulmaJS;
workOrderLotOccupancies?: recordTypes.LotOccupancy[]; workOrderLotOccupancies?: recordTypes.LotOccupancy[];
}) => { }) => {
if (responseJSON.success) { if (responseJSON.success) {
workOrderLotOccupancies = workOrderLotOccupancies = responseJSON.workOrderLotOccupancies;
responseJSON.workOrderLotOccupancies;
renderRelatedLotsAndOccupancies(); renderRelatedLotsAndOccupancies();
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
@ -299,8 +278,7 @@ declare const bulmaJS: BulmaJS;
}; };
const addLotFromLotOccupancy = (clickEvent: Event) => { const addLotFromLotOccupancy = (clickEvent: Event) => {
const lotId = (clickEvent.currentTarget as HTMLElement).dataset const lotId = (clickEvent.currentTarget as HTMLElement).dataset.lotId;
.lotId;
addLot(lotId); addLot(lotId);
}; };
@ -309,9 +287,8 @@ declare const bulmaJS: BulmaJS;
"#container--lotOccupancies" "#container--lotOccupancies"
) as HTMLElement; ) as HTMLElement;
document.querySelector( document.querySelector(".tabs a[href='#relatedTab--lotOccupancies'] .tag").textContent =
".tabs a[href='#relatedTab--lotOccupancies'] .tag" workOrderLotOccupancies.length.toString();
).textContent = workOrderLotOccupancies.length.toString();
if (workOrderLotOccupancies.length === 0) { if (workOrderLotOccupancies.length === 0) {
occupanciesContainerElement.innerHTML = occupanciesContainerElement.innerHTML =
@ -345,8 +322,7 @@ declare const bulmaJS: BulmaJS;
for (const lotOccupancy of workOrderLotOccupancies) { for (const lotOccupancy of workOrderLotOccupancies) {
const rowElement = document.createElement("tr"); const rowElement = document.createElement("tr");
rowElement.className = "container--lotOccupancy"; rowElement.className = "container--lotOccupancy";
rowElement.dataset.lotOccupancyId = rowElement.dataset.lotOccupancyId = lotOccupancy.lotOccupancyId.toString();
lotOccupancy.lotOccupancyId.toString();
const isActive = !( const isActive = !(
lotOccupancy.occupancyEndDate && lotOccupancy.occupancyEndDate &&
@ -424,19 +400,13 @@ declare const bulmaJS: BulmaJS;
("<td>" + ("<td>" +
(lotOccupancy.lotOccupancyOccupants.length === 0 (lotOccupancy.lotOccupancyOccupants.length === 0
? '<span class="has-text-grey">(No ' + ? '<span class="has-text-grey">(No ' +
cityssm.escapeHTML( cityssm.escapeHTML(exports.aliases.occupants) +
exports.aliases.occupants
) +
")</span>" ")</span>"
: cityssm.escapeHTML( : cityssm.escapeHTML(
lotOccupancy.lotOccupancyOccupants[0] lotOccupancy.lotOccupancyOccupants[0].occupantName
.occupantName
) + ) +
(lotOccupancy.lotOccupancyOccupants.length > 1 (lotOccupancy.lotOccupancyOccupants.length > 1
? " plus " + ? " plus " + (lotOccupancy.lotOccupancyOccupants.length - 1)
(lotOccupancy.lotOccupancyOccupants
.length -
1)
: "")) + : "")) +
"</td>") + "</td>") +
("<td>" + ("<td>" +
@ -456,17 +426,13 @@ declare const bulmaJS: BulmaJS;
.querySelector(".button--deleteLotOccupancy") .querySelector(".button--deleteLotOccupancy")
.addEventListener("click", deleteLotOccupancy); .addEventListener("click", deleteLotOccupancy);
occupanciesContainerElement occupanciesContainerElement.querySelector("tbody").append(rowElement);
.querySelector("tbody")
.append(rowElement);
} }
}; };
const deleteLot = (clickEvent: Event) => { const deleteLot = (clickEvent: Event) => {
const lotId = ( const lotId = (
(clickEvent.currentTarget as HTMLElement).closest( (clickEvent.currentTarget as HTMLElement).closest(".container--lot") as HTMLElement
".container--lot"
) as HTMLElement
).dataset.lotId; ).dataset.lotId;
const doDelete = () => { const doDelete = () => {
@ -517,13 +483,10 @@ declare const bulmaJS: BulmaJS;
}; };
const renderRelatedLots = () => { const renderRelatedLots = () => {
const lotsContainerElement = document.querySelector( const lotsContainerElement = document.querySelector("#container--lots") as HTMLElement;
"#container--lots"
) as HTMLElement;
document.querySelector( document.querySelector(".tabs a[href='#relatedTab--lots'] .tag").textContent =
".tabs a[href='#relatedTab--lots'] .tag" workOrderLots.length.toString();
).textContent = workOrderLots.length.toString();
if (workOrderLots.length === 0) { if (workOrderLots.length === 0) {
lotsContainerElement.innerHTML = lotsContainerElement.innerHTML =
@ -575,9 +538,7 @@ declare const bulmaJS: BulmaJS;
"</button>" + "</button>" +
"</td>"); "</td>");
rowElement rowElement.querySelector(".button--deleteLot").addEventListener("click", deleteLot);
.querySelector(".button--deleteLot")
.addEventListener("click", deleteLot);
lotsContainerElement.querySelector("tbody").append(rowElement); lotsContainerElement.querySelector("tbody").append(rowElement);
} }
@ -590,16 +551,12 @@ declare const bulmaJS: BulmaJS;
renderRelatedLotsAndOccupancies(); renderRelatedLotsAndOccupancies();
document document.querySelector("#button--addLotOccupancy").addEventListener("click", () => {
.querySelector("#button--addLotOccupancy")
.addEventListener("click", () => {
let searchFormElement: HTMLFormElement; let searchFormElement: HTMLFormElement;
let searchResultsContainerElement: HTMLElement; let searchResultsContainerElement: HTMLElement;
const doAddLotOccupancy = (clickEvent: Event) => { const doAddLotOccupancy = (clickEvent: Event) => {
const rowElement = ( const rowElement = (clickEvent.currentTarget as HTMLElement).closest("tr");
clickEvent.currentTarget as HTMLElement
).closest("tr");
const lotOccupancyId = rowElement.dataset.lotOccupancyId; const lotOccupancyId = rowElement.dataset.lotOccupancyId;
@ -624,9 +581,7 @@ declare const bulmaJS: BulmaJS;
cityssm.postJSON( cityssm.postJSON(
urlPrefix + "/lotOccupancies/doSearchLotOccupancies", urlPrefix + "/lotOccupancies/doSearchLotOccupancies",
searchFormElement, searchFormElement,
(responseJSON: { (responseJSON: { lotOccupancies: recordTypes.LotOccupancy[] }) => {
lotOccupancies: recordTypes.LotOccupancy[];
}) => {
if (responseJSON.lotOccupancies.length === 0) { if (responseJSON.lotOccupancies.length === 0) {
searchResultsContainerElement.innerHTML = searchResultsContainerElement.innerHTML =
'<div class="message is-info">' + '<div class="message is-info">' +
@ -641,9 +596,7 @@ declare const bulmaJS: BulmaJS;
"<thead>" + "<thead>" +
"<tr>" + "<tr>" +
'<th class="has-width-1"></th>' + '<th class="has-width-1"></th>' +
("<th>" + ("<th>" + exports.aliases.occupancy + " Type</th>") +
exports.aliases.occupancy +
" Type</th>") +
("<th>" + exports.aliases.lot + "</th>") + ("<th>" + exports.aliases.lot + "</th>") +
"<th>Start Date</th>" + "<th>Start Date</th>" +
"<th>End Date</th>" + "<th>End Date</th>" +
@ -655,8 +608,7 @@ declare const bulmaJS: BulmaJS;
for (const lotOccupancy of responseJSON.lotOccupancies) { for (const lotOccupancy of responseJSON.lotOccupancies) {
const rowElement = document.createElement("tr"); const rowElement = document.createElement("tr");
rowElement.className = rowElement.className = "container--lotOccupancy";
"container--lotOccupancy";
rowElement.dataset.lotOccupancyId = rowElement.dataset.lotOccupancyId =
lotOccupancy.lotOccupancyId.toString(); lotOccupancy.lotOccupancyId.toString();
@ -667,19 +619,13 @@ declare const bulmaJS: BulmaJS;
"</button>" + "</button>" +
"</td>" + "</td>" +
('<td class="has-text-weight-bold">' + ('<td class="has-text-weight-bold">' +
cityssm.escapeHTML( cityssm.escapeHTML(lotOccupancy.occupancyType) +
lotOccupancy.occupancyType
) +
"</td>"); "</td>");
if (lotOccupancy.lotId) { if (lotOccupancy.lotId) {
rowElement.insertAdjacentHTML( rowElement.insertAdjacentHTML(
"beforeend", "beforeend",
"<td>" + "<td>" + cityssm.escapeHTML(lotOccupancy.lotName) + "</td>"
cityssm.escapeHTML(
lotOccupancy.lotName
) +
"</td>"
); );
} else { } else {
rowElement.insertAdjacentHTML( rowElement.insertAdjacentHTML(
@ -703,40 +649,25 @@ declare const bulmaJS: BulmaJS;
: '<span class="has-text-grey">(No End Date)</span>') + : '<span class="has-text-grey">(No End Date)</span>') +
"</td>") + "</td>") +
("<td>" + ("<td>" +
(lotOccupancy.lotOccupancyOccupants (lotOccupancy.lotOccupancyOccupants.length === 0
.length === 0
? '<span class="has-text-grey">(No ' + ? '<span class="has-text-grey">(No ' +
cityssm.escapeHTML( cityssm.escapeHTML(exports.aliases.occupants) +
exports.aliases.occupants
) +
")</span>" ")</span>"
: cityssm.escapeHTML( : cityssm.escapeHTML(
lotOccupancy lotOccupancy.lotOccupancyOccupants[0].occupantName
.lotOccupancyOccupants[0]
.occupantName
) + ) +
(lotOccupancy (lotOccupancy.lotOccupancyOccupants.length > 1
.lotOccupancyOccupants
.length > 1
? " plus " + ? " plus " +
(lotOccupancy (lotOccupancy.lotOccupancyOccupants.length - 1)
.lotOccupancyOccupants
.length -
1)
: "")) + : "")) +
"</td>") "</td>")
); );
rowElement rowElement
.querySelector(".button--addLotOccupancy") .querySelector(".button--addLotOccupancy")
.addEventListener( .addEventListener("click", doAddLotOccupancy);
"click",
doAddLotOccupancy
);
searchResultsContainerElement searchResultsContainerElement.querySelector("tbody").append(rowElement);
.querySelector("tbody")
.append(rowElement);
} }
} }
); );
@ -747,8 +678,7 @@ declare const bulmaJS: BulmaJS;
los.populateAliases(modalElement); los.populateAliases(modalElement);
searchFormElement = modalElement.querySelector("form"); searchFormElement = modalElement.querySelector("form");
searchResultsContainerElement = searchResultsContainerElement = modalElement.querySelector(
modalElement.querySelector(
"#resultsContainer--lotOccupancyAdd" "#resultsContainer--lotOccupancyAdd"
); );
@ -788,16 +718,12 @@ declare const bulmaJS: BulmaJS;
}); });
}); });
document document.querySelector("#button--addLot").addEventListener("click", () => {
.querySelector("#button--addLot")
.addEventListener("click", () => {
let searchFormElement: HTMLFormElement; let searchFormElement: HTMLFormElement;
let searchResultsContainerElement: HTMLElement; let searchResultsContainerElement: HTMLElement;
const doAddLot = (clickEvent: Event) => { const doAddLot = (clickEvent: Event) => {
const rowElement = ( const rowElement = (clickEvent.currentTarget as HTMLElement).closest("tr");
clickEvent.currentTarget as HTMLElement
).closest("tr");
const lotId = rowElement.dataset.lotId; const lotId = rowElement.dataset.lotId;
@ -863,20 +789,14 @@ declare const bulmaJS: BulmaJS;
"<td>" + "<td>" +
cityssm.escapeHTML(lot.mapName) + cityssm.escapeHTML(lot.mapName) +
"</td>" + "</td>" +
("<td>" + ("<td>" + cityssm.escapeHTML(lot.lotType) + "</td>") +
cityssm.escapeHTML(lot.lotType) + ("<td>" + cityssm.escapeHTML(lot.lotStatus) + "</td>");
"</td>") +
("<td>" +
cityssm.escapeHTML(lot.lotStatus) +
"</td>");
rowElement rowElement
.querySelector(".button--addLot") .querySelector(".button--addLot")
.addEventListener("click", doAddLot); .addEventListener("click", doAddLot);
searchResultsContainerElement searchResultsContainerElement.querySelector("tbody").append(rowElement);
.querySelector("tbody")
.append(rowElement);
} }
} }
); );
@ -887,15 +807,12 @@ declare const bulmaJS: BulmaJS;
los.populateAliases(modalElement); los.populateAliases(modalElement);
searchFormElement = modalElement.querySelector("form"); searchFormElement = modalElement.querySelector("form");
searchResultsContainerElement = searchResultsContainerElement = modalElement.querySelector(
modalElement.querySelector(
"#resultsContainer--lotAdd" "#resultsContainer--lotAdd"
); );
( (
modalElement.querySelector( modalElement.querySelector("#lotSearch--notWorkOrderId") as HTMLInputElement
"#lotSearch--notWorkOrderId"
) as HTMLInputElement
).value = workOrderId; ).value = workOrderId;
const lotStatusElement = modalElement.querySelector( const lotStatusElement = modalElement.querySelector(
@ -903,10 +820,8 @@ declare const bulmaJS: BulmaJS;
) as HTMLSelectElement; ) as HTMLSelectElement;
for (const lotStatus of exports.lotStatuses as recordTypes.LotStatus[]) { for (const lotStatus of exports.lotStatuses as recordTypes.LotStatus[]) {
const optionElement = const optionElement = document.createElement("option");
document.createElement("option"); optionElement.value = lotStatus.lotStatusId.toString();
optionElement.value =
lotStatus.lotStatusId.toString();
optionElement.textContent = lotStatus.lotStatus; optionElement.textContent = lotStatus.lotStatus;
lotStatusElement.append(optionElement); lotStatusElement.append(optionElement);
} }
@ -937,13 +852,269 @@ declare const bulmaJS: BulmaJS;
* Comments * Comments
*/ */
let workOrderComments: recordTypes.WorkOrderComment[] = exports.workOrderComments;
delete exports.workOrderComments;
const openEditWorkOrderComment = (clickEvent: Event) => {
const workOrderCommentId = Number.parseInt(
(clickEvent.currentTarget as HTMLElement).closest("tr").dataset.workOrderCommentId,
10
);
const workOrderComment = workOrderComments.find((currentComment) => {
return currentComment.workOrderCommentId === workOrderCommentId;
});
console.log(workOrderComments)
let editFormElement: HTMLFormElement;
let editCloseModalFunction: () => void;
const editComment = (submitEvent: SubmitEvent) => {
submitEvent.preventDefault();
cityssm.postJSON(
urlPrefix + "/workOrders/doUpdateWorkOrderComment",
editFormElement,
(responseJSON: {
success: boolean;
errorMessage?: string;
workOrderComments?: recordTypes.WorkOrderComment[];
}) => {
if (responseJSON.success) {
workOrderComments = responseJSON.workOrderComments;
editCloseModalFunction();
renderWorkOrderComments();
} else {
bulmaJS.alert({
title: "Error Updating Comment",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
}
);
};
cityssm.openHtmlModal("workOrder-editComment", {
onshow: (modalElement) => {
(
modalElement.querySelector(
"#workOrderCommentEdit--workOrderId"
) as HTMLInputElement
).value = workOrderId;
(
modalElement.querySelector(
"#workOrderCommentEdit--workOrderCommentId"
) as HTMLInputElement
).value = workOrderCommentId.toString();
(
modalElement.querySelector(
"#workOrderCommentEdit--workOrderComment"
) as HTMLInputElement
).value = workOrderComment.workOrderComment;
(
modalElement.querySelector(
"#workOrderCommentEdit--workOrderCommentDateString"
) as HTMLInputElement
).value = workOrderComment.workOrderCommentDateString;
(
modalElement.querySelector(
"#workOrderCommentEdit--workOrderCommentTimeString"
) as HTMLInputElement
).value = workOrderComment.workOrderCommentTimeString;
},
onshown: (modalElement, closeModalFunction) => {
bulmaJS.toggleHtmlClipped();
los.initializeDatePickers(modalElement);
los.initializeTimePickers(modalElement);
(
modalElement.querySelector(
"#workOrderCommentEdit--workOrderComment"
) as HTMLTextAreaElement
).focus();
editFormElement = modalElement.querySelector("form");
editFormElement.addEventListener("submit", editComment);
editCloseModalFunction = closeModalFunction;
},
onremoved: () => {
bulmaJS.toggleHtmlClipped();
}
});
};
const deleteWorkOrderComment = (clickEvent: Event) => {
const workOrderCommentId = Number.parseInt(
(clickEvent.currentTarget as HTMLElement).closest("tr").dataset.workOrderCommentId,
10
);
const doDelete = () => {
cityssm.postJSON(
urlPrefix + "/workOrders/doDeleteWorkOrderComment",
{
workOrderId,
workOrderCommentId
},
(responseJSON: {
success: boolean;
errorMessage?: string;
workOrderComments: recordTypes.WorkOrderComment[];
}) => {
if (responseJSON.success) {
workOrderComments = responseJSON.workOrderComments;
renderWorkOrderComments();
} else {
bulmaJS.alert({
title: "Error Removing Comment",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
}
);
};
bulmaJS.confirm({
title: "Remove Comment?",
message: "Are you sure you want to remove this comment?",
okButton: {
text: "Yes, Remove Comment",
callbackFunction: doDelete
},
contextualColorName: "warning"
});
};
const renderWorkOrderComments = () => {
const containerElement = document.querySelector(
"#container--workOrderComments"
) as HTMLElement;
if (workOrderComments.length === 0) {
containerElement.innerHTML =
'<div class="message is-info">' +
'<p class="message-body">There are no comments to display.</p>' +
"</div>";
return;
}
const tableElement = document.createElement("table");
tableElement.className = "table is-fullwidth is-striped is-hoverable";
tableElement.innerHTML =
"<thead><tr>" +
"<th>Commentor</th>" +
"<th>Comment Date</th>" +
"<th>Comment</th>" +
'<th class="is-hidden-print"><span class="is-sr-only">Options</span></th>' +
"</tr></thead>" +
"<tbody></tbody>";
for (const workOrderComment of workOrderComments) {
const tableRowElement = document.createElement("tr");
tableRowElement.dataset.workOrderCommentId = workOrderComment.workOrderCommentId.toString();
tableRowElement.innerHTML =
"<td>" +
cityssm.escapeHTML(workOrderComment.recordCreate_userName) +
"</td>" +
"<td>" +
workOrderComment.workOrderCommentDateString +
(workOrderComment.workOrderCommentTime === 0
? ""
: " " + workOrderComment.workOrderCommentTimeString) +
"</td>" +
"<td>" +
cityssm.escapeHTML(workOrderComment.workOrderComment) +
"</td>" +
('<td class="is-hidden-print">' +
'<div class="buttons are-small is-justify-content-end">' +
('<button class="button is-primary button--edit" type="button">' +
'<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
" <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>' +
"</button>") +
"</div>" +
"</td>");
tableRowElement
.querySelector(".button--edit")
.addEventListener("click", openEditWorkOrderComment);
tableRowElement
.querySelector(".button--delete")
.addEventListener("click", deleteWorkOrderComment);
tableElement.querySelector("tbody").append(tableRowElement);
}
containerElement.innerHTML = "";
containerElement.append(tableElement);
};
const openAddCommentModal = () => {
let addCommentCloseModalFunction: () => void;
const doAddComment = (formEvent: SubmitEvent) => {
formEvent.preventDefault();
cityssm.postJSON(
urlPrefix + "/workOrders/doAddWorkOrderComment",
formEvent.currentTarget,
(responseJSON: {
success: boolean;
workOrderComments?: recordTypes.WorkOrderComment[];
}) => {
if (responseJSON.success) {
workOrderComments = responseJSON.workOrderComments;
renderWorkOrderComments();
addCommentCloseModalFunction();
}
}
);
};
cityssm.openHtmlModal("workOrder-addComment", {
onshow(modalElement) {
los.populateAliases(modalElement);
(
modalElement.querySelector(
"#workOrderCommentAdd--workOrderId"
) as HTMLInputElement
).value = workOrderId;
modalElement.querySelector("form").addEventListener("submit", doAddComment);
},
onshown(modalElement, closeModalFunction) {
bulmaJS.toggleHtmlClipped();
addCommentCloseModalFunction = closeModalFunction;
(
modalElement.querySelector("#workOrderCommentAdd--workOrderComment") as HTMLTextAreaElement
).focus();
},
onremoved() {
bulmaJS.toggleHtmlClipped();
(document.querySelector("#workOrderComments--add") as HTMLButtonElement).focus();
}
});
};
if (!isCreate) {
document.querySelector("#workOrderComments--add").addEventListener("click", openAddCommentModal);
renderWorkOrderComments();
}
/* /*
* Milestones * Milestones
*/ */
if (!isCreate) { if (!isCreate) {
workOrderMilestones = workOrderMilestones = exports.workOrderMilestones as recordTypes.WorkOrderMilestone[];
exports.workOrderMilestones as recordTypes.WorkOrderMilestone[];
delete exports.workOrderMilestones; delete exports.workOrderMilestones;
const processMilestoneResponse = (responseJSON: { const processMilestoneResponse = (responseJSON: {
@ -977,14 +1148,9 @@ declare const bulmaJS: BulmaJS;
10 10
); );
const workOrderMilestone = workOrderMilestones.find( const workOrderMilestone = workOrderMilestones.find((currentMilestone) => {
(currentMilestone) => { return currentMilestone.workOrderMilestoneId === workOrderMilestoneId;
return ( });
currentMilestone.workOrderMilestoneId ===
workOrderMilestoneId
);
}
);
const doComplete = () => { const doComplete = () => {
cityssm.postJSON( cityssm.postJSON(
@ -1001,8 +1167,7 @@ declare const bulmaJS: BulmaJS;
title: "Complete Milestone", title: "Complete Milestone",
message: message:
"Are you sure you want to complete this milestone?" + "Are you sure you want to complete this milestone?" +
(workOrderMilestone.workOrderMilestoneDateString > (workOrderMilestone.workOrderMilestoneDateString > currentDateString
currentDateString
? "<br /><strong>Note that this milestone is expected to be completed in the future.</strong>" ? "<br /><strong>Note that this milestone is expected to be completed in the future.</strong>"
: ""), : ""),
messageIsHtml: true, messageIsHtml: true,
@ -1089,14 +1254,9 @@ declare const bulmaJS: BulmaJS;
10 10
); );
const workOrderMilestone = workOrderMilestones.find( const workOrderMilestone = workOrderMilestones.find((currentMilestone) => {
(currentMilestone) => { return currentMilestone.workOrderMilestoneId === workOrderMilestoneId;
return ( });
currentMilestone.workOrderMilestoneId ===
workOrderMilestoneId
);
}
);
let editCloseModalFunction: () => void; let editCloseModalFunction: () => void;
@ -1131,8 +1291,7 @@ declare const bulmaJS: BulmaJS;
modalElement.querySelector( modalElement.querySelector(
"#milestoneEdit--workOrderMilestoneId" "#milestoneEdit--workOrderMilestoneId"
) as HTMLInputElement ) as HTMLInputElement
).value = ).value = workOrderMilestone.workOrderMilestoneId.toString();
workOrderMilestone.workOrderMilestoneId.toString();
const milestoneTypeElement = modalElement.querySelector( const milestoneTypeElement = modalElement.querySelector(
"#milestoneEdit--workOrderMilestoneTypeId" "#milestoneEdit--workOrderMilestoneTypeId"
@ -1143,10 +1302,8 @@ declare const bulmaJS: BulmaJS;
for (const milestoneType of exports.workOrderMilestoneTypes as recordTypes.WorkOrderMilestoneType[]) { for (const milestoneType of exports.workOrderMilestoneTypes as recordTypes.WorkOrderMilestoneType[]) {
const optionElement = document.createElement("option"); const optionElement = document.createElement("option");
optionElement.value = optionElement.value = milestoneType.workOrderMilestoneTypeId.toString();
milestoneType.workOrderMilestoneTypeId.toString(); optionElement.textContent = milestoneType.workOrderMilestoneType;
optionElement.textContent =
milestoneType.workOrderMilestoneType;
if ( if (
milestoneType.workOrderMilestoneTypeId === milestoneType.workOrderMilestoneTypeId ===
@ -1159,15 +1316,11 @@ declare const bulmaJS: BulmaJS;
milestoneTypeElement.append(optionElement); milestoneTypeElement.append(optionElement);
} }
if ( if (!milestoneTypeFound && workOrderMilestone.workOrderMilestoneTypeId) {
!milestoneTypeFound &&
workOrderMilestone.workOrderMilestoneTypeId
) {
const optionElement = document.createElement("option"); const optionElement = document.createElement("option");
optionElement.value = optionElement.value =
workOrderMilestone.workOrderMilestoneTypeId.toString(); workOrderMilestone.workOrderMilestoneTypeId.toString();
optionElement.textContent = optionElement.textContent = workOrderMilestone.workOrderMilestoneType;
workOrderMilestone.workOrderMilestoneType;
optionElement.selected = true; optionElement.selected = true;
milestoneTypeElement.append(optionElement); milestoneTypeElement.append(optionElement);
} }
@ -1183,8 +1336,7 @@ declare const bulmaJS: BulmaJS;
modalElement.querySelector( modalElement.querySelector(
"#milestoneEdit--workOrderMilestoneTimeString" "#milestoneEdit--workOrderMilestoneTimeString"
) as HTMLInputElement ) as HTMLInputElement
).value = ).value = workOrderMilestone.workOrderMilestoneTimeString;
workOrderMilestone.workOrderMilestoneTimeString;
} }
( (
@ -1201,9 +1353,7 @@ declare const bulmaJS: BulmaJS;
los.initializeDatePickers(modalElement); los.initializeDatePickers(modalElement);
los.initializeTimePickers(modalElement); los.initializeTimePickers(modalElement);
modalElement modalElement.querySelector("form").addEventListener("submit", doEdit);
.querySelector("form")
.addEventListener("submit", doEdit);
}, },
onremoved: () => { onremoved: () => {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
@ -1227,8 +1377,7 @@ declare const bulmaJS: BulmaJS;
for (const milestone of workOrderMilestones) { for (const milestone of workOrderMilestones) {
const panelBlockElement = document.createElement("div"); const panelBlockElement = document.createElement("div");
panelBlockElement.className = panelBlockElement.className = "panel-block is-block container--milestone";
"panel-block is-block container--milestone";
panelBlockElement.dataset.workOrderMilestoneId = panelBlockElement.dataset.workOrderMilestoneId =
milestone.workOrderMilestoneId.toString(); milestone.workOrderMilestoneId.toString();
@ -1251,9 +1400,7 @@ declare const bulmaJS: BulmaJS;
('<div class="column">' + ('<div class="column">' +
(milestone.workOrderMilestoneTypeId (milestone.workOrderMilestoneTypeId
? "<strong>" + ? "<strong>" +
cityssm.escapeHTML( cityssm.escapeHTML(milestone.workOrderMilestoneType) +
milestone.workOrderMilestoneType
) +
"</strong><br />" "</strong><br />"
: "") + : "") +
milestone.workOrderMilestoneDateString + milestone.workOrderMilestoneDateString +
@ -1262,9 +1409,7 @@ declare const bulmaJS: BulmaJS;
: "") + : "") +
"<br />" + "<br />" +
'<span class="is-size-7">' + '<span class="is-size-7">' +
cityssm.escapeHTML( cityssm.escapeHTML(milestone.workOrderMilestoneDescription) +
milestone.workOrderMilestoneDescription
) +
"</span>" + "</span>" +
"</div>") + "</div>") +
('<div class="column is-narrow">' + ('<div class="column is-narrow">' +
@ -1322,9 +1467,7 @@ declare const bulmaJS: BulmaJS;
renderMilestones(); renderMilestones();
document document.querySelector("#button--addMilestone").addEventListener("click", () => {
.querySelector("#button--addMilestone")
.addEventListener("click", () => {
let addModalElement: HTMLElement; let addModalElement: HTMLElement;
let addCloseModalFunction: () => void; let addCloseModalFunction: () => void;
@ -1376,9 +1519,7 @@ declare const bulmaJS: BulmaJS;
cityssm.openHtmlModal("workOrder-addMilestone", { cityssm.openHtmlModal("workOrder-addMilestone", {
onshow: (modalElement) => { onshow: (modalElement) => {
( (
modalElement.querySelector( modalElement.querySelector("#milestoneAdd--workOrderId") as HTMLInputElement
"#milestoneAdd--workOrderId"
) as HTMLInputElement
).value = workOrderId; ).value = workOrderId;
const milestoneTypeElement = modalElement.querySelector( const milestoneTypeElement = modalElement.querySelector(
@ -1386,13 +1527,10 @@ declare const bulmaJS: BulmaJS;
) as HTMLSelectElement; ) as HTMLSelectElement;
for (const milestoneType of exports.workOrderMilestoneTypes as recordTypes.WorkOrderMilestoneType[]) { for (const milestoneType of exports.workOrderMilestoneTypes as recordTypes.WorkOrderMilestoneType[]) {
const optionElement = const optionElement = document.createElement("option");
document.createElement("option");
optionElement.value = optionElement.value = milestoneType.workOrderMilestoneTypeId.toString();
milestoneType.workOrderMilestoneTypeId.toString(); optionElement.textContent = milestoneType.workOrderMilestoneType;
optionElement.textContent =
milestoneType.workOrderMilestoneType;
milestoneTypeElement.append(optionElement); milestoneTypeElement.append(optionElement);
} }
@ -1402,7 +1540,6 @@ declare const bulmaJS: BulmaJS;
"#milestoneAdd--workOrderMilestoneDateString" "#milestoneAdd--workOrderMilestoneDateString"
) as HTMLInputElement ) as HTMLInputElement
).valueAsDate = new Date(); ).valueAsDate = new Date();
}, },
onshown: (modalElement, closeModalFunction) => { onshown: (modalElement, closeModalFunction) => {
addModalElement = modalElement; addModalElement = modalElement;
@ -1413,9 +1550,7 @@ declare const bulmaJS: BulmaJS;
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
modalElement modalElement.querySelector("form").addEventListener("submit", doAdd);
.querySelector("form")
.addEventListener("submit", doAdd);
}, },
onremoved: () => { onremoved: () => {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();

View File

@ -0,0 +1,29 @@
<div class="modal">
<div class="modal-background"></div>
<div class="modal-card">
<header class="modal-card-head">
<h3 class="modal-card-title">
Add Work Order Comment
</h3>
<button class="delete is-close-modal-button" aria-label="close" type="button"></button>
</header>
<section class="modal-card-body">
<form id="form--workOrderCommentAdd">
<input id="workOrderCommentAdd--workOrderId" name="workOrderId" type="hidden" value="" />
<div class="field">
<label class="label" for="workOrderCommentAdd--workOrderComment">Comment</label>
<div class="control">
<textarea class="textarea" id="workOrderCommentAdd--workOrderComment" name="workOrderComment" required></textarea>
</div>
</div>
</form>
</section>
<footer class="modal-card-foot justify-right">
<button class="button is-success" type="submit" form="form--workOrderCommentAdd">
<span class="icon"><i class="fas fa-plus" aria-hidden="true"></i></span>
<span>Add Comment</span>
</button>
<button class="button is-close-modal-button" type="button">Cancel</button>
</footer>
</div>
</div>

View File

@ -0,0 +1,54 @@
<div class="modal">
<div class="modal-background"></div>
<div class="modal-card">
<header class="modal-card-head">
<h3 class="modal-card-title">
Edit Comment
</h3>
<button class="delete is-close-modal-button" aria-label="close" type="button"></button>
</header>
<section class="modal-card-body">
<form id="form--workOrderCommentEdit">
<input id="workOrderCommentEdit--workOrderId" name="workOrderId" type="hidden" value="" />
<input id="workOrderCommentEdit--workOrderCommentId" name="workOrderCommentId" type="hidden" value="" />
<div class="field">
<label class="label" for="workOrderCommentEdit--workOrderComment">Comment</label>
<div class="control">
<textarea class="textarea" id="workOrderCommentEdit--workOrderComment" name="workOrderComment" required></textarea>
</div>
</div>
<div class="columns">
<div class="column">
<div class="field">
<label class="label" for="workOrderCommentEdit--workOrderCommentDateString">Comment Date</label>
<div class="control has-icons-left">
<input class="input" id="workOrderCommentEdit--workOrderCommentDateString" name="workOrderCommentDateString" type="date" required />
<span class="icon is-left">
<i class="fas fa-calendar" aria-hidden="true"></i>
</span>
</div>
</div>
</div>
<div class="column">
<div class="field">
<label class="label" for="workOrderCommentEdit--workOrderCommentTimeString">Comment Time</label>
<div class="control has-icons-left">
<input class="input" id="workOrderCommentEdit--workOrderCommentTimeString" name="workOrderCommentTimeString" type="time" required />
<span class="icon is-left">
<i class="fas fa-clock" aria-hidden="true"></i>
</span>
</div>
</div>
</div>
</div>
</form>
</section>
<footer class="modal-card-foot justify-right">
<button class="button is-success" type="submit" form="form--workOrderCommentEdit">
<span class="icon"><i class="fas fa-save" aria-hidden="true"></i></span>
<span>Update Comment</span>
</button>
<button class="button is-close-modal-button" type="button">Cancel</button>
</footer>
</div>
</div>

File diff suppressed because one or more lines are too long

View File

@ -17,6 +17,9 @@ import handler_doAddWorkOrderLotOccupancy from "../handlers/workOrders-post/doAd
import handler_doDeleteWorkOrderLotOccupancy from "../handlers/workOrders-post/doDeleteWorkOrderLotOccupancy.js"; import handler_doDeleteWorkOrderLotOccupancy from "../handlers/workOrders-post/doDeleteWorkOrderLotOccupancy.js";
import handler_doAddWorkOrderLot from "../handlers/workOrders-post/doAddWorkOrderLot.js"; import handler_doAddWorkOrderLot from "../handlers/workOrders-post/doAddWorkOrderLot.js";
import handler_doDeleteWorkOrderLot from "../handlers/workOrders-post/doDeleteWorkOrderLot.js"; import handler_doDeleteWorkOrderLot from "../handlers/workOrders-post/doDeleteWorkOrderLot.js";
import handler_doAddWorkOrderComment from "../handlers/workOrders-post/doAddWorkOrderComment.js";
import handler_doUpdateWorkOrderComment from "../handlers/workOrders-post/doUpdateWorkOrderComment.js";
import handler_doDeleteWorkOrderComment from "../handlers/workOrders-post/doDeleteWorkOrderComment.js";
import handler_doAddWorkOrderMilestone from "../handlers/workOrders-post/doAddWorkOrderMilestone.js"; import handler_doAddWorkOrderMilestone from "../handlers/workOrders-post/doAddWorkOrderMilestone.js";
import handler_doUpdateWorkOrderMilestone from "../handlers/workOrders-post/doUpdateWorkOrderMilestone.js"; import handler_doUpdateWorkOrderMilestone from "../handlers/workOrders-post/doUpdateWorkOrderMilestone.js";
import handler_doCompleteWorkOrderMilestone from "../handlers/workOrders-post/doCompleteWorkOrderMilestone.js"; import handler_doCompleteWorkOrderMilestone from "../handlers/workOrders-post/doCompleteWorkOrderMilestone.js";
@ -40,6 +43,9 @@ router.post("/doAddWorkOrderLotOccupancy", permissionHandlers.updatePostHandler,
router.post("/doDeleteWorkOrderLotOccupancy", permissionHandlers.updatePostHandler, handler_doDeleteWorkOrderLotOccupancy); router.post("/doDeleteWorkOrderLotOccupancy", permissionHandlers.updatePostHandler, handler_doDeleteWorkOrderLotOccupancy);
router.post("/doAddWorkOrderLot", permissionHandlers.updatePostHandler, handler_doAddWorkOrderLot); router.post("/doAddWorkOrderLot", permissionHandlers.updatePostHandler, handler_doAddWorkOrderLot);
router.post("/doDeleteWorkOrderLot", permissionHandlers.updatePostHandler, handler_doDeleteWorkOrderLot); router.post("/doDeleteWorkOrderLot", permissionHandlers.updatePostHandler, handler_doDeleteWorkOrderLot);
router.post("/doAddWorkOrderComment", permissionHandlers.updatePostHandler, handler_doAddWorkOrderComment);
router.post("/doUpdateWorkOrderComment", permissionHandlers.updatePostHandler, handler_doUpdateWorkOrderComment);
router.post("/doDeleteWorkOrderComment", permissionHandlers.updatePostHandler, handler_doDeleteWorkOrderComment);
router.post("/doAddWorkOrderMilestone", permissionHandlers.updatePostHandler, handler_doAddWorkOrderMilestone); router.post("/doAddWorkOrderMilestone", permissionHandlers.updatePostHandler, handler_doAddWorkOrderMilestone);
router.post("/doUpdateWorkOrderMilestone", permissionHandlers.updatePostHandler, handler_doUpdateWorkOrderMilestone); router.post("/doUpdateWorkOrderMilestone", permissionHandlers.updatePostHandler, handler_doUpdateWorkOrderMilestone);
router.post("/doCompleteWorkOrderMilestone", permissionHandlers.updatePostHandler, handler_doCompleteWorkOrderMilestone); router.post("/doCompleteWorkOrderMilestone", permissionHandlers.updatePostHandler, handler_doCompleteWorkOrderMilestone);

View File

@ -27,6 +27,10 @@ import handler_doDeleteWorkOrderLotOccupancy from "../handlers/workOrders-post/d
import handler_doAddWorkOrderLot from "../handlers/workOrders-post/doAddWorkOrderLot.js"; import handler_doAddWorkOrderLot from "../handlers/workOrders-post/doAddWorkOrderLot.js";
import handler_doDeleteWorkOrderLot from "../handlers/workOrders-post/doDeleteWorkOrderLot.js"; import handler_doDeleteWorkOrderLot from "../handlers/workOrders-post/doDeleteWorkOrderLot.js";
import handler_doAddWorkOrderComment from "../handlers/workOrders-post/doAddWorkOrderComment.js";
import handler_doUpdateWorkOrderComment from "../handlers/workOrders-post/doUpdateWorkOrderComment.js";
import handler_doDeleteWorkOrderComment from "../handlers/workOrders-post/doDeleteWorkOrderComment.js";
import handler_doAddWorkOrderMilestone from "../handlers/workOrders-post/doAddWorkOrderMilestone.js"; import handler_doAddWorkOrderMilestone from "../handlers/workOrders-post/doAddWorkOrderMilestone.js";
import handler_doUpdateWorkOrderMilestone from "../handlers/workOrders-post/doUpdateWorkOrderMilestone.js"; import handler_doUpdateWorkOrderMilestone from "../handlers/workOrders-post/doUpdateWorkOrderMilestone.js";
import handler_doCompleteWorkOrderMilestone from "../handlers/workOrders-post/doCompleteWorkOrderMilestone.js"; import handler_doCompleteWorkOrderMilestone from "../handlers/workOrders-post/doCompleteWorkOrderMilestone.js";
@ -123,6 +127,26 @@ router.post(
handler_doDeleteWorkOrderLot handler_doDeleteWorkOrderLot
); );
// Comments
router.post(
"/doAddWorkOrderComment",
permissionHandlers.updatePostHandler,
handler_doAddWorkOrderComment
);
router.post(
"/doUpdateWorkOrderComment",
permissionHandlers.updatePostHandler,
handler_doUpdateWorkOrderComment
);
router.post(
"/doDeleteWorkOrderComment",
permissionHandlers.updatePostHandler,
handler_doDeleteWorkOrderComment
);
// Milestones // Milestones
router.post( router.post(

View File

@ -193,6 +193,31 @@
</div> </div>
</div> </div>
<% } %> <% } %>
<% if (!isCreate) { %>
<div class="panel">
<div class="panel-heading">
<div class="level is-mobile">
<div class="level-left">
<div class="level-item">
<h2 class="has-text-weight-bold is-size-5">
Comments
</h2>
</div>
</div>
<div class="level-right">
<div class="level-item">
<button class="button is-small is-success" id="workOrderComments--add" type="button">
<span class="icon is-small"><i class="fas fa-plus" aria-hidden="true"></i></span>
<span>Add a Comment</span>
</button>
</div>
</div>
</div>
</div>
<div class="panel-block is-block" id="container--workOrderComments"></div>
</div>
<% } %>
</div> </div>
<% if (!isCreate) { %> <% if (!isCreate) { %>
<div class="column is-4-desktop"> <div class="column is-4-desktop">

View File

@ -208,6 +208,29 @@
<% if (workOrder.workOrderComments.length > 0) { %> <% if (workOrder.workOrderComments.length > 0) { %>
<div class="panel"> <div class="panel">
<h2 class="panel-heading">Work Order Comments</h2> <h2 class="panel-heading">Work Order Comments</h2>
<div class="panel-block is-block">
<table class="table is-fullwidth is-striped is-hoverable">
<thead>
<tr>
<th>Commentor</th>
<th>Comment Date</th>
<th>Comment</th>
</tr>
</thead>
<tbody>
<% for (const workOrderComment of workOrder.workOrderComments) { %>
<tr>
<td><%= workOrderComment.recordCreate_userName %></td>
<td>
<%= workOrderComment.workOrderCommentDateString %>
<%= (workOrderComment.workOrderCommentTime === 0 ? "" : workOrderComment.workOrderCommentTimeString) %>
</td>
<td><%= workOrderComment.workOrderComment %></td>
</tr>
<% } %>
</tbody>
</table>
</div>
</div> </div>
<% } %> <% } %>
</div> </div>