milestone add and delete

deepsource-autofix-76c6eb20
Dan Gowans 2022-09-13 11:11:06 -04:00
parent 5e898809be
commit 24a30c35cd
20 changed files with 420 additions and 73 deletions

View File

@ -1,4 +1,4 @@
import { getLotStatuses, getWorkOrderTypes } from "../../helpers/functions.cache.js"; import { getLotStatuses, getWorkOrderMilestoneTypes, getWorkOrderTypes } from "../../helpers/functions.cache.js";
import * as configFunctions from "../../helpers/functions.config.js"; import * as configFunctions from "../../helpers/functions.config.js";
import { getWorkOrder } from "../../helpers/lotOccupancyDB/getWorkOrder.js"; import { getWorkOrder } from "../../helpers/lotOccupancyDB/getWorkOrder.js";
export const handler = (request, response) => { export const handler = (request, response) => {
@ -14,12 +14,14 @@ export const handler = (request, response) => {
"/?error=workOrderIsClosed"); "/?error=workOrderIsClosed");
} }
const workOrderTypes = getWorkOrderTypes(); const workOrderTypes = getWorkOrderTypes();
const workOrderMilestoneTypes = getWorkOrderMilestoneTypes();
const lotStatuses = getLotStatuses(); const lotStatuses = getLotStatuses();
response.render("workOrder-edit", { response.render("workOrder-edit", {
headTitle: "Work Order #" + workOrder.workOrderNumber, headTitle: "Work Order #" + workOrder.workOrderNumber,
workOrder, workOrder,
isCreate: false, isCreate: false,
workOrderTypes, workOrderTypes,
workOrderMilestoneTypes,
lotStatuses lotStatuses
}); });
}; };

View File

@ -2,6 +2,7 @@ import type { RequestHandler } from "express";
import { import {
getLotStatuses, getLotStatuses,
getWorkOrderMilestoneTypes,
getWorkOrderTypes getWorkOrderTypes
} from "../../helpers/functions.cache.js"; } from "../../helpers/functions.cache.js";
@ -30,6 +31,8 @@ export const handler: RequestHandler = (request, response) => {
const workOrderTypes = getWorkOrderTypes(); const workOrderTypes = getWorkOrderTypes();
const workOrderMilestoneTypes = getWorkOrderMilestoneTypes();
const lotStatuses = getLotStatuses(); const lotStatuses = getLotStatuses();
response.render("workOrder-edit", { response.render("workOrder-edit", {
@ -37,6 +40,7 @@ export const handler: RequestHandler = (request, response) => {
workOrder, workOrder,
isCreate: false, isCreate: false,
workOrderTypes, workOrderTypes,
workOrderMilestoneTypes,
lotStatuses lotStatuses
}); });
}; };

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 { addWorkOrderMilestone } from "../../helpers/lotOccupancyDB/addWorkOrderMilestone.js";
import { getWorkOrderMilestones } from "../../helpers/lotOccupancyDB/getWorkOrderMilestones.js";
export const handler = async (request, response) => {
const success = addWorkOrderMilestone(request.body, request.session);
const workOrderMilestones = getWorkOrderMilestones(request.body.workOrderId);
response.json({
success,
workOrderMilestones
});
};
export default handler;

View File

@ -0,0 +1,19 @@
import type { RequestHandler } from "express";
import { addWorkOrderMilestone } from "../../helpers/lotOccupancyDB/addWorkOrderMilestone.js";
import { getWorkOrderMilestones } from "../../helpers/lotOccupancyDB/getWorkOrderMilestones.js";
export const handler: RequestHandler = async (request, response) => {
const success = addWorkOrderMilestone(request.body, request.session);
const workOrderMilestones = getWorkOrderMilestones(
request.body.workOrderId
);
response.json({
success,
workOrderMilestones
});
};
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 { deleteWorkOrderMilestone } from "../../helpers/lotOccupancyDB/deleteWorkOrderMilestone.js";
import { getWorkOrderMilestones } from "../../helpers/lotOccupancyDB/getWorkOrderMilestones.js";
export const handler = async (request, response) => {
const success = deleteWorkOrderMilestone(request.body.workOrderMilestoneId, request.session);
const workOrderMilestones = getWorkOrderMilestones(request.body.workOrderId);
response.json({
success,
workOrderMilestones
});
};
export default handler;

View File

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

View File

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

View File

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

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 deleteWorkOrderMilestone = (
workOrderMilestoneId: number | string,
requestSession: recordTypes.PartialSession
): boolean => {
const database = sqlite(databasePath);
const rightNowMillis = Date.now();
const result = database
.prepare(
"update WorkOrderMilestones" +
" set recordDelete_userName = ?," +
" recordDelete_timeMillis = ?" +
" where workOrderMilestoneId = ?"
)
.run(requestSession.user.userName, rightNowMillis, workOrderMilestoneId);
database.close();
return result.changes > 0;
};
export default deleteWorkOrderMilestone;

View File

@ -22,8 +22,8 @@ export const getWorkOrderMilestones = (workOrderId, connectedDatabase) => {
" where m.recordDelete_timeMillis is null" + " where m.recordDelete_timeMillis is null" +
" and m.workOrderId = ?" + " and m.workOrderId = ?" +
" order by" + " order by" +
" m.workOrderMilestoneDate, m.workOrderMilestoneTime," +
" m.workOrderMilestoneCompletionDate, m.workOrderMilestoneCompletionTime," + " m.workOrderMilestoneCompletionDate, m.workOrderMilestoneCompletionTime," +
" m.workOrderMilestoneDate, case when m.workOrderMilestoneTime = 0 then 9999 else m.workOrderMilestoneTime end," +
" t.orderNumber, m.workOrderMilestoneId") " t.orderNumber, m.workOrderMilestoneId")
.all(workOrderId); .all(workOrderId);
if (!connectedDatabase) { if (!connectedDatabase) {

View File

@ -37,8 +37,8 @@ export const getWorkOrderMilestones = (
" where m.recordDelete_timeMillis is null" + " where m.recordDelete_timeMillis is null" +
" and m.workOrderId = ?" + " and m.workOrderId = ?" +
" order by" + " order by" +
" m.workOrderMilestoneDate, m.workOrderMilestoneTime," +
" m.workOrderMilestoneCompletionDate, m.workOrderMilestoneCompletionTime," + " m.workOrderMilestoneCompletionDate, m.workOrderMilestoneCompletionTime," +
" m.workOrderMilestoneDate, case when m.workOrderMilestoneTime = 0 then 9999 else m.workOrderMilestoneTime end," +
" t.orderNumber, m.workOrderMilestoneId" " t.orderNumber, m.workOrderMilestoneId"
) )
.all(workOrderId); .all(workOrderId);

View File

@ -594,6 +594,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
if (!isCreate) { if (!isCreate) {
let workOrderMilestones = exports.workOrderMilestones; let workOrderMilestones = exports.workOrderMilestones;
delete exports.workOrderMilestones; delete exports.workOrderMilestones;
const processMilestoneResponse = (responseJSON) => {
if (responseJSON.success) {
workOrderMilestones = responseJSON.workOrderMilestones;
renderMilestones();
}
else {
bulmaJS.alert({
title: "Error Reopening Milestone",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
};
const completeMilestone = (clickEvent) => { const completeMilestone = (clickEvent) => {
clickEvent.preventDefault(); clickEvent.preventDefault();
const currentDateString = cityssm.dateToString(new Date()); const currentDateString = cityssm.dateToString(new Date());
@ -606,20 +619,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
cityssm.postJSON(urlPrefix + "/workOrders/doCompleteWorkOrderMilestone", { cityssm.postJSON(urlPrefix + "/workOrders/doCompleteWorkOrderMilestone", {
workOrderId, workOrderId,
workOrderMilestoneId workOrderMilestoneId
}, (responseJSON) => { }, processMilestoneResponse);
if (responseJSON.success) {
workOrderMilestones =
responseJSON.workOrderMilestones;
renderMilestones();
}
else {
bulmaJS.alert({
title: "Error Completing Milestone",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
});
}; };
bulmaJS.confirm({ bulmaJS.confirm({
title: "Complete Milestone", title: "Complete Milestone",
@ -643,20 +643,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
cityssm.postJSON(urlPrefix + "/workOrders/doReopenWorkOrderMilestone", { cityssm.postJSON(urlPrefix + "/workOrders/doReopenWorkOrderMilestone", {
workOrderId, workOrderId,
workOrderMilestoneId workOrderMilestoneId
}, (responseJSON) => { }, processMilestoneResponse);
if (responseJSON.success) {
workOrderMilestones =
responseJSON.workOrderMilestones;
renderMilestones();
}
else {
bulmaJS.alert({
title: "Error Reopening Milestone",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
});
}; };
bulmaJS.confirm({ bulmaJS.confirm({
title: "Reopen Milestone", title: "Reopen Milestone",
@ -670,6 +657,25 @@ Object.defineProperty(exports, "__esModule", { value: true });
}; };
const deleteMilestone = (clickEvent) => { const deleteMilestone = (clickEvent) => {
clickEvent.preventDefault(); clickEvent.preventDefault();
const workOrderMilestoneId = clickEvent.currentTarget.closest(".container--milestone").dataset.workOrderMilestoneId;
const doDelete = () => {
cityssm.postJSON(urlPrefix + "/workOrders/doDeleteWorkOrderMilestone", {
workOrderMilestoneId,
workOrderId
}, processMilestoneResponse);
};
bulmaJS.confirm({
title: "Delete Milestone",
message: "Are you sure you want to delete this milestone?",
contextualColorName: "warning",
okButton: {
text: "Yes, Delete Milestone",
callbackFunction: doDelete
}
});
};
const editMilestone = (clickEvent) => {
clickEvent.preventDefault();
}; };
const renderMilestones = () => { const renderMilestones = () => {
const milestonesPanelElement = document.querySelector("#panel--milestones"); const milestonesPanelElement = document.querySelector("#panel--milestones");
@ -705,6 +711,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
"</strong><br />" "</strong><br />"
: "") + : "") +
milestone.workOrderMilestoneDateString + milestone.workOrderMilestoneDateString +
(milestone.workOrderMilestoneTime
? " " + milestone.workOrderMilestoneTimeString
: "") +
"<br />" + "<br />" +
'<span class="is-size-7">' + '<span class="is-size-7">' +
cityssm.escapeHTML(milestone.workOrderMilestoneDescription) + cityssm.escapeHTML(milestone.workOrderMilestoneDescription) +
@ -723,9 +732,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
? '<a class="dropdown-item button--reopenMilestone" href="#">' + ? '<a class="dropdown-item button--reopenMilestone" href="#">' +
'<span class="icon is-small"><i class="fas fa-times" aria-hidden="true"></i></span>' + '<span class="icon is-small"><i class="fas fa-times" aria-hidden="true"></i></span>' +
" <span>Reopen Milestone</span>" + " <span>Reopen Milestone</span>" +
"</a>" + "</a>"
'<hr class="dropdown-divider" />' : '<a class="dropdown-item button--editMilestone" href="#">' +
: "") + '<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
" <span>Edit Milestone</span>" +
"</a>") +
'<hr class="dropdown-divider" />' +
'<a class="dropdown-item button--deleteMilestone" href="#">' + '<a class="dropdown-item button--deleteMilestone" href="#">' +
'<span class="icon is-small"><i class="fas fa-trash has-text-danger" aria-hidden="true"></i></span>' + '<span class="icon is-small"><i class="fas fa-trash has-text-danger" aria-hidden="true"></i></span>' +
" <span>Delete Milestone</span>" + " <span>Delete Milestone</span>" +
@ -741,6 +753,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
.addEventListener("click", reopenMilestone); .addEventListener("click", reopenMilestone);
} }
else { else {
panelBlockElement
.querySelector(".button--editMilestone")
.addEventListener("click", editMilestone);
panelBlockElement panelBlockElement
.querySelector(".button--completeMilestone") .querySelector(".button--completeMilestone")
.addEventListener("click", completeMilestone); .addEventListener("click", completeMilestone);
@ -753,5 +768,42 @@ Object.defineProperty(exports, "__esModule", { value: true });
bulmaJS.init(milestonesPanelElement); bulmaJS.init(milestonesPanelElement);
}; };
renderMilestones(); renderMilestones();
document
.querySelector("#button--addMilestone")
.addEventListener("click", () => {
let addCloseModalFunction;
const doAdd = (submitEvent) => {
submitEvent.preventDefault();
cityssm.postJSON(urlPrefix + "/workOrders/doAddWorkOrderMilestone", submitEvent.currentTarget, (responseJSON) => {
processMilestoneResponse(responseJSON);
if (responseJSON.success) {
addCloseModalFunction();
}
});
};
cityssm.openHtmlModal("workOrder-addMilestone", {
onshow: (modalElement) => {
modalElement.querySelector("#milestoneAdd--workOrderId").value = workOrderId;
const milestoneTypeElement = modalElement.querySelector("#milestoneAdd--workOrderMilestoneTypeId");
for (const milestoneType of exports.workOrderMilestoneTypes) {
const optionElement = document.createElement("option");
optionElement.value =
milestoneType.workOrderMilestoneTypeId.toString();
optionElement.textContent =
milestoneType.workOrderMilestoneType;
milestoneTypeElement.append(optionElement);
}
modalElement.querySelector("#milestoneAdd--workOrderMilestoneDateString").valueAsDate = new Date();
},
onshown: (modalElement, closeModalFunction) => {
addCloseModalFunction = closeModalFunction;
bulmaJS.toggleHtmlClipped();
modalElement.querySelector("form").addEventListener("submit", doAdd);
},
onremoved: () => {
bulmaJS.toggleHtmlClipped();
}
});
});
} }
})(); })();

View File

@ -6,6 +6,7 @@ import type { BulmaJS } from "@cityssm/bulma-js/types";
import type * as globalTypes from "../types/globalTypes"; import type * as globalTypes from "../types/globalTypes";
import type * as recordTypes from "../types/recordTypes"; import type * as recordTypes from "../types/recordTypes";
import { response } from "express"; import { response } from "express";
import { closeDelimiter } from "ejs";
declare const cityssm: cityssmGlobal; declare const cityssm: cityssmGlobal;
declare const bulmaJS: BulmaJS; declare const bulmaJS: BulmaJS;
@ -844,6 +845,23 @@ declare const bulmaJS: BulmaJS;
exports.workOrderMilestones as recordTypes.WorkOrderMilestone[]; exports.workOrderMilestones as recordTypes.WorkOrderMilestone[];
delete exports.workOrderMilestones; delete exports.workOrderMilestones;
const processMilestoneResponse = (responseJSON: {
success: boolean;
errorMessage?: string;
workOrderMilestones?: recordTypes.WorkOrderMilestone[];
}) => {
if (responseJSON.success) {
workOrderMilestones = responseJSON.workOrderMilestones;
renderMilestones();
} else {
bulmaJS.alert({
title: "Error Reopening Milestone",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
};
const completeMilestone = (clickEvent: Event) => { const completeMilestone = (clickEvent: Event) => {
clickEvent.preventDefault(); clickEvent.preventDefault();
@ -874,23 +892,7 @@ declare const bulmaJS: BulmaJS;
workOrderId, workOrderId,
workOrderMilestoneId workOrderMilestoneId
}, },
(responseJSON: { processMilestoneResponse
success: boolean;
errorMessage?: string;
workOrderMilestones?: recordTypes.WorkOrderMilestone[];
}) => {
if (responseJSON.success) {
workOrderMilestones =
responseJSON.workOrderMilestones;
renderMilestones();
} else {
bulmaJS.alert({
title: "Error Completing Milestone",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
}
); );
}; };
@ -927,23 +929,7 @@ declare const bulmaJS: BulmaJS;
workOrderId, workOrderId,
workOrderMilestoneId workOrderMilestoneId
}, },
(responseJSON: { processMilestoneResponse
success: boolean;
errorMessage?: string;
workOrderMilestones?: recordTypes.WorkOrderMilestone[];
}) => {
if (responseJSON.success) {
workOrderMilestones =
responseJSON.workOrderMilestones;
renderMilestones();
} else {
bulmaJS.alert({
title: "Error Reopening Milestone",
message: responseJSON.errorMessage,
contextualColorName: "danger"
});
}
}
); );
}; };
@ -961,6 +947,37 @@ declare const bulmaJS: BulmaJS;
const deleteMilestone = (clickEvent: Event) => { const deleteMilestone = (clickEvent: Event) => {
clickEvent.preventDefault(); clickEvent.preventDefault();
const workOrderMilestoneId = (
(clickEvent.currentTarget as HTMLElement).closest(
".container--milestone"
) as HTMLElement
).dataset.workOrderMilestoneId;
const doDelete = () => {
cityssm.postJSON(
urlPrefix + "/workOrders/doDeleteWorkOrderMilestone",
{
workOrderMilestoneId,
workOrderId
},
processMilestoneResponse
);
};
bulmaJS.confirm({
title: "Delete Milestone",
message: "Are you sure you want to delete this milestone?",
contextualColorName: "warning",
okButton: {
text: "Yes, Delete Milestone",
callbackFunction: doDelete
}
});
};
const editMilestone = (clickEvent: Event) => {
clickEvent.preventDefault();
}; };
const renderMilestones = () => { const renderMilestones = () => {
@ -1009,6 +1026,9 @@ declare const bulmaJS: BulmaJS;
"</strong><br />" "</strong><br />"
: "") + : "") +
milestone.workOrderMilestoneDateString + milestone.workOrderMilestoneDateString +
(milestone.workOrderMilestoneTime
? " " + milestone.workOrderMilestoneTimeString
: "") +
"<br />" + "<br />" +
'<span class="is-size-7">' + '<span class="is-size-7">' +
cityssm.escapeHTML( cityssm.escapeHTML(
@ -1029,9 +1049,12 @@ declare const bulmaJS: BulmaJS;
? '<a class="dropdown-item button--reopenMilestone" href="#">' + ? '<a class="dropdown-item button--reopenMilestone" href="#">' +
'<span class="icon is-small"><i class="fas fa-times" aria-hidden="true"></i></span>' + '<span class="icon is-small"><i class="fas fa-times" aria-hidden="true"></i></span>' +
" <span>Reopen Milestone</span>" + " <span>Reopen Milestone</span>" +
"</a>" + "</a>"
'<hr class="dropdown-divider" />' : '<a class="dropdown-item button--editMilestone" href="#">' +
: "") + '<span class="icon is-small"><i class="fas fa-pencil-alt" aria-hidden="true"></i></span>' +
" <span>Edit Milestone</span>" +
"</a>") +
'<hr class="dropdown-divider" />' +
'<a class="dropdown-item button--deleteMilestone" href="#">' + '<a class="dropdown-item button--deleteMilestone" href="#">' +
'<span class="icon is-small"><i class="fas fa-trash has-text-danger" aria-hidden="true"></i></span>' + '<span class="icon is-small"><i class="fas fa-trash has-text-danger" aria-hidden="true"></i></span>' +
" <span>Delete Milestone</span>" + " <span>Delete Milestone</span>" +
@ -1047,6 +1070,10 @@ declare const bulmaJS: BulmaJS;
.querySelector(".button--reopenMilestone") .querySelector(".button--reopenMilestone")
.addEventListener("click", reopenMilestone); .addEventListener("click", reopenMilestone);
} else { } else {
panelBlockElement
.querySelector(".button--editMilestone")
.addEventListener("click", editMilestone);
panelBlockElement panelBlockElement
.querySelector(".button--completeMilestone") .querySelector(".button--completeMilestone")
.addEventListener("click", completeMilestone); .addEventListener("click", completeMilestone);
@ -1063,5 +1090,71 @@ declare const bulmaJS: BulmaJS;
}; };
renderMilestones(); renderMilestones();
document
.querySelector("#button--addMilestone")
.addEventListener("click", () => {
let addCloseModalFunction: () => void;
const doAdd = (submitEvent: SubmitEvent) => {
submitEvent.preventDefault();
cityssm.postJSON(
urlPrefix + "/workOrders/doAddWorkOrderMilestone",
submitEvent.currentTarget,
(responseJSON: {
success: boolean;
errorMessage?: string;
workOrderMilestones?: recordTypes.WorkOrderMilestone[];
}) => {
processMilestoneResponse(responseJSON);
if (responseJSON.success) {
addCloseModalFunction();
}
}
);
};
cityssm.openHtmlModal("workOrder-addMilestone", {
onshow: (modalElement) => {
(
modalElement.querySelector(
"#milestoneAdd--workOrderId"
) as HTMLInputElement
).value = workOrderId;
const milestoneTypeElement = modalElement.querySelector(
"#milestoneAdd--workOrderMilestoneTypeId"
) as HTMLSelectElement;
for (const milestoneType of exports.workOrderMilestoneTypes as recordTypes.WorkOrderMilestoneType[]) {
const optionElement =
document.createElement("option");
optionElement.value =
milestoneType.workOrderMilestoneTypeId.toString();
optionElement.textContent =
milestoneType.workOrderMilestoneType;
milestoneTypeElement.append(optionElement);
}
(
modalElement.querySelector(
"#milestoneAdd--workOrderMilestoneDateString"
) as HTMLInputElement
).valueAsDate = new Date();
},
onshown: (modalElement, closeModalFunction) => {
addCloseModalFunction = closeModalFunction;
bulmaJS.toggleHtmlClipped();
modalElement.querySelector("form").addEventListener("submit", doAdd);
},
onremoved: () => {
bulmaJS.toggleHtmlClipped();
}
});
});
} }
})(); })();

View File

@ -0,0 +1,58 @@
<div class="modal">
<div class="modal-background"></div>
<div class="modal-card">
<header class="modal-card-head">
<h3 class="modal-card-title">
Add Milestone
</h3>
<button class="delete is-close-modal-button" aria-label="close" type="button"></button>
</header>
<section class="modal-card-body">
<form id="form--milestoneAdd">
<input id="milestoneAdd--workOrderId" name="workOrderId" type="hidden" value="" />
<div class="field">
<label class="label" for="milestoneAdd--workOrderMilestoneTypeId">Milestone Type</label>
<div class="control">
<div class="select is-fullwidth">
<select id="milestoneAdd--workOrderMilestoneTypeId" name="workOrderMilestoneTypeId">
<option value="">(No Milestone Type)</option>
</select>
</div>
</div>
</div>
<div class="columns">
<div class="column">
<div class="field">
<label class="label" for="milestoneAdd--workOrderMilestoneDateString">Milestone Date</label>
<div class="control">
<input class="input" id="milestoneAdd--workOrderMilestoneDateString" name="workOrderMilestoneDateString" type="date" required />
</div>
</div>
</div>
<div class="column">
<div class="field">
<label class="label" for="milestoneAdd--workOrderMilestoneTimeString">Milestone Time</label>
<div class="control">
<input class="input" id="milestoneAdd--workOrderMilestoneTimeString" name="workOrderMilestoneTimeString" type="time" />
</div>
</div>
</div>
</div>
<div class="field">
<label class="label" for="milestoneAdd--workOrderMilestoneDescription">Description</label>
<div class="control">
<textarea class="textarea" id="milestoneAdd--workOrderMilestoneDescription" name="workOrderMilestoneDescription"></textarea>
</div>
</div>
</form>
</section>
<footer class="modal-card-foot justify-right">
<button class="button is-success" type="submit" form="form--milestoneAdd">
<span class="icon"><i class="fas fa-plus" aria-hidden="true"></i></span>
<span>Add Milestone</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

@ -10,8 +10,10 @@ 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_doAddWorkOrderMilestone from "../handlers/workOrders-post/doAddWorkOrderMilestone.js";
import handler_doCompleteWorkOrderMilestone from "../handlers/workOrders-post/doCompleteWorkOrderMilestone.js"; import handler_doCompleteWorkOrderMilestone from "../handlers/workOrders-post/doCompleteWorkOrderMilestone.js";
import handler_doReopenWorkOrderMilestone from "../handlers/workOrders-post/doReopenWorkOrderMilestone.js"; import handler_doReopenWorkOrderMilestone from "../handlers/workOrders-post/doReopenWorkOrderMilestone.js";
import handler_doDeleteWorkOrderMilestone from "../handlers/workOrders-post/doDeleteWorkOrderMilestone.js";
export const router = Router(); export const router = Router();
router.get("/", handler_search); router.get("/", handler_search);
router.post("/doSearchWorkOrders", handler_doSearchWorkOrders); router.post("/doSearchWorkOrders", handler_doSearchWorkOrders);
@ -23,6 +25,8 @@ 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("/doAddWorkOrderMilestone", permissionHandlers.updatePostHandler, handler_doAddWorkOrderMilestone);
router.post("/doCompleteWorkOrderMilestone", permissionHandlers.updatePostHandler, handler_doCompleteWorkOrderMilestone); router.post("/doCompleteWorkOrderMilestone", permissionHandlers.updatePostHandler, handler_doCompleteWorkOrderMilestone);
router.post("/doReopenWorkOrderMilestone", permissionHandlers.updatePostHandler, handler_doReopenWorkOrderMilestone); router.post("/doReopenWorkOrderMilestone", permissionHandlers.updatePostHandler, handler_doReopenWorkOrderMilestone);
router.post("/doDeleteWorkOrderMilestone", permissionHandlers.updatePostHandler, handler_doDeleteWorkOrderMilestone);
export default router; export default router;

View File

@ -17,8 +17,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_doAddWorkOrderMilestone from "../handlers/workOrders-post/doAddWorkOrderMilestone.js";
import handler_doCompleteWorkOrderMilestone from "../handlers/workOrders-post/doCompleteWorkOrderMilestone.js"; import handler_doCompleteWorkOrderMilestone from "../handlers/workOrders-post/doCompleteWorkOrderMilestone.js";
import handler_doReopenWorkOrderMilestone from "../handlers/workOrders-post/doReopenWorkOrderMilestone.js"; import handler_doReopenWorkOrderMilestone from "../handlers/workOrders-post/doReopenWorkOrderMilestone.js";
import handler_doDeleteWorkOrderMilestone from "../handlers/workOrders-post/doDeleteWorkOrderMilestone.js";
export const router = Router(); export const router = Router();
@ -70,6 +72,14 @@ router.post(
handler_doDeleteWorkOrderLot handler_doDeleteWorkOrderLot
); );
// Milestones
router.post(
"/doAddWorkOrderMilestone",
permissionHandlers.updatePostHandler,
handler_doAddWorkOrderMilestone
);
router.post( router.post(
"/doCompleteWorkOrderMilestone", "/doCompleteWorkOrderMilestone",
permissionHandlers.updatePostHandler, permissionHandlers.updatePostHandler,
@ -82,4 +92,10 @@ router.post(
handler_doReopenWorkOrderMilestone handler_doReopenWorkOrderMilestone
); );
router.post(
"/doDeleteWorkOrderMilestone",
permissionHandlers.updatePostHandler,
handler_doDeleteWorkOrderMilestone
);
export default router; export default router;

View File

@ -212,6 +212,7 @@
exports.workOrderMilestones = <%- JSON.stringify(workOrder.workOrderMilestones) %>; exports.workOrderMilestones = <%- JSON.stringify(workOrder.workOrderMilestones) %>;
exports.lotStatuses = <%- JSON.stringify(lotStatuses) %>; exports.lotStatuses = <%- JSON.stringify(lotStatuses) %>;
exports.workOrderMilestoneTypes = <%- JSON.stringify(workOrderMilestoneTypes) %>;
</script> </script>
<script src="<% urlPrefix %>/javascripts/workOrderEdit.min.js"></script> <script src="<% urlPrefix %>/javascripts/workOrderEdit.min.js"></script>