milestone add and delete
parent
5e898809be
commit
24a30c35cd
|
|
@ -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 { getWorkOrder } from "../../helpers/lotOccupancyDB/getWorkOrder.js";
|
||||
export const handler = (request, response) => {
|
||||
|
|
@ -14,12 +14,14 @@ export const handler = (request, response) => {
|
|||
"/?error=workOrderIsClosed");
|
||||
}
|
||||
const workOrderTypes = getWorkOrderTypes();
|
||||
const workOrderMilestoneTypes = getWorkOrderMilestoneTypes();
|
||||
const lotStatuses = getLotStatuses();
|
||||
response.render("workOrder-edit", {
|
||||
headTitle: "Work Order #" + workOrder.workOrderNumber,
|
||||
workOrder,
|
||||
isCreate: false,
|
||||
workOrderTypes,
|
||||
workOrderMilestoneTypes,
|
||||
lotStatuses
|
||||
});
|
||||
};
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ import type { RequestHandler } from "express";
|
|||
|
||||
import {
|
||||
getLotStatuses,
|
||||
getWorkOrderMilestoneTypes,
|
||||
getWorkOrderTypes
|
||||
} from "../../helpers/functions.cache.js";
|
||||
|
||||
|
|
@ -30,6 +31,8 @@ export const handler: RequestHandler = (request, response) => {
|
|||
|
||||
const workOrderTypes = getWorkOrderTypes();
|
||||
|
||||
const workOrderMilestoneTypes = getWorkOrderMilestoneTypes();
|
||||
|
||||
const lotStatuses = getLotStatuses();
|
||||
|
||||
response.render("workOrder-edit", {
|
||||
|
|
@ -37,6 +40,7 @@ export const handler: RequestHandler = (request, response) => {
|
|||
workOrder,
|
||||
isCreate: false,
|
||||
workOrderTypes,
|
||||
workOrderMilestoneTypes,
|
||||
lotStatuses
|
||||
});
|
||||
};
|
||||
|
|
|
|||
|
|
@ -0,0 +1,3 @@
|
|||
import type { RequestHandler } from "express";
|
||||
export declare const handler: RequestHandler;
|
||||
export default handler;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
import type { RequestHandler } from "express";
|
||||
export declare const handler: RequestHandler;
|
||||
export default handler;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -22,8 +22,8 @@ export const getWorkOrderMilestones = (workOrderId, connectedDatabase) => {
|
|||
" where m.recordDelete_timeMillis is null" +
|
||||
" and m.workOrderId = ?" +
|
||||
" order by" +
|
||||
" m.workOrderMilestoneDate, m.workOrderMilestoneTime," +
|
||||
" m.workOrderMilestoneCompletionDate, m.workOrderMilestoneCompletionTime," +
|
||||
" m.workOrderMilestoneDate, case when m.workOrderMilestoneTime = 0 then 9999 else m.workOrderMilestoneTime end," +
|
||||
" t.orderNumber, m.workOrderMilestoneId")
|
||||
.all(workOrderId);
|
||||
if (!connectedDatabase) {
|
||||
|
|
|
|||
|
|
@ -37,8 +37,8 @@ export const getWorkOrderMilestones = (
|
|||
" where m.recordDelete_timeMillis is null" +
|
||||
" and m.workOrderId = ?" +
|
||||
" order by" +
|
||||
" m.workOrderMilestoneDate, m.workOrderMilestoneTime," +
|
||||
" m.workOrderMilestoneCompletionDate, m.workOrderMilestoneCompletionTime," +
|
||||
" m.workOrderMilestoneDate, case when m.workOrderMilestoneTime = 0 then 9999 else m.workOrderMilestoneTime end," +
|
||||
" t.orderNumber, m.workOrderMilestoneId"
|
||||
)
|
||||
.all(workOrderId);
|
||||
|
|
|
|||
|
|
@ -594,6 +594,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
if (!isCreate) {
|
||||
let workOrderMilestones = 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) => {
|
||||
clickEvent.preventDefault();
|
||||
const currentDateString = cityssm.dateToString(new Date());
|
||||
|
|
@ -606,20 +619,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
cityssm.postJSON(urlPrefix + "/workOrders/doCompleteWorkOrderMilestone", {
|
||||
workOrderId,
|
||||
workOrderMilestoneId
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderMilestones =
|
||||
responseJSON.workOrderMilestones;
|
||||
renderMilestones();
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Completing Milestone",
|
||||
message: responseJSON.errorMessage,
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
});
|
||||
}, processMilestoneResponse);
|
||||
};
|
||||
bulmaJS.confirm({
|
||||
title: "Complete Milestone",
|
||||
|
|
@ -643,20 +643,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
cityssm.postJSON(urlPrefix + "/workOrders/doReopenWorkOrderMilestone", {
|
||||
workOrderId,
|
||||
workOrderMilestoneId
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderMilestones =
|
||||
responseJSON.workOrderMilestones;
|
||||
renderMilestones();
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Reopening Milestone",
|
||||
message: responseJSON.errorMessage,
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
});
|
||||
}, processMilestoneResponse);
|
||||
};
|
||||
bulmaJS.confirm({
|
||||
title: "Reopen Milestone",
|
||||
|
|
@ -670,6 +657,25 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
};
|
||||
const deleteMilestone = (clickEvent) => {
|
||||
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 milestonesPanelElement = document.querySelector("#panel--milestones");
|
||||
|
|
@ -705,6 +711,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
"</strong><br />"
|
||||
: "") +
|
||||
milestone.workOrderMilestoneDateString +
|
||||
(milestone.workOrderMilestoneTime
|
||||
? " " + milestone.workOrderMilestoneTimeString
|
||||
: "") +
|
||||
"<br />" +
|
||||
'<span class="is-size-7">' +
|
||||
cityssm.escapeHTML(milestone.workOrderMilestoneDescription) +
|
||||
|
|
@ -723,9 +732,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
? '<a class="dropdown-item button--reopenMilestone" href="#">' +
|
||||
'<span class="icon is-small"><i class="fas fa-times" aria-hidden="true"></i></span>' +
|
||||
" <span>Reopen Milestone</span>" +
|
||||
"</a>" +
|
||||
'<hr class="dropdown-divider" />'
|
||||
: "") +
|
||||
"</a>"
|
||||
: '<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="#">' +
|
||||
'<span class="icon is-small"><i class="fas fa-trash has-text-danger" aria-hidden="true"></i></span>' +
|
||||
" <span>Delete Milestone</span>" +
|
||||
|
|
@ -741,6 +753,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
.addEventListener("click", reopenMilestone);
|
||||
}
|
||||
else {
|
||||
panelBlockElement
|
||||
.querySelector(".button--editMilestone")
|
||||
.addEventListener("click", editMilestone);
|
||||
panelBlockElement
|
||||
.querySelector(".button--completeMilestone")
|
||||
.addEventListener("click", completeMilestone);
|
||||
|
|
@ -753,5 +768,42 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
bulmaJS.init(milestonesPanelElement);
|
||||
};
|
||||
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();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
})();
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ import type { BulmaJS } from "@cityssm/bulma-js/types";
|
|||
import type * as globalTypes from "../types/globalTypes";
|
||||
import type * as recordTypes from "../types/recordTypes";
|
||||
import { response } from "express";
|
||||
import { closeDelimiter } from "ejs";
|
||||
|
||||
declare const cityssm: cityssmGlobal;
|
||||
declare const bulmaJS: BulmaJS;
|
||||
|
|
@ -844,6 +845,23 @@ declare const bulmaJS: BulmaJS;
|
|||
exports.workOrderMilestones as recordTypes.WorkOrderMilestone[];
|
||||
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) => {
|
||||
clickEvent.preventDefault();
|
||||
|
||||
|
|
@ -874,23 +892,7 @@ declare const bulmaJS: BulmaJS;
|
|||
workOrderId,
|
||||
workOrderMilestoneId
|
||||
},
|
||||
(responseJSON: {
|
||||
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"
|
||||
});
|
||||
}
|
||||
}
|
||||
processMilestoneResponse
|
||||
);
|
||||
};
|
||||
|
||||
|
|
@ -927,23 +929,7 @@ declare const bulmaJS: BulmaJS;
|
|||
workOrderId,
|
||||
workOrderMilestoneId
|
||||
},
|
||||
(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"
|
||||
});
|
||||
}
|
||||
}
|
||||
processMilestoneResponse
|
||||
);
|
||||
};
|
||||
|
||||
|
|
@ -961,6 +947,37 @@ declare const bulmaJS: BulmaJS;
|
|||
|
||||
const deleteMilestone = (clickEvent: Event) => {
|
||||
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 = () => {
|
||||
|
|
@ -1009,6 +1026,9 @@ declare const bulmaJS: BulmaJS;
|
|||
"</strong><br />"
|
||||
: "") +
|
||||
milestone.workOrderMilestoneDateString +
|
||||
(milestone.workOrderMilestoneTime
|
||||
? " " + milestone.workOrderMilestoneTimeString
|
||||
: "") +
|
||||
"<br />" +
|
||||
'<span class="is-size-7">' +
|
||||
cityssm.escapeHTML(
|
||||
|
|
@ -1029,9 +1049,12 @@ declare const bulmaJS: BulmaJS;
|
|||
? '<a class="dropdown-item button--reopenMilestone" href="#">' +
|
||||
'<span class="icon is-small"><i class="fas fa-times" aria-hidden="true"></i></span>' +
|
||||
" <span>Reopen Milestone</span>" +
|
||||
"</a>" +
|
||||
'<hr class="dropdown-divider" />'
|
||||
: "") +
|
||||
"</a>"
|
||||
: '<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="#">' +
|
||||
'<span class="icon is-small"><i class="fas fa-trash has-text-danger" aria-hidden="true"></i></span>' +
|
||||
" <span>Delete Milestone</span>" +
|
||||
|
|
@ -1047,6 +1070,10 @@ declare const bulmaJS: BulmaJS;
|
|||
.querySelector(".button--reopenMilestone")
|
||||
.addEventListener("click", reopenMilestone);
|
||||
} else {
|
||||
panelBlockElement
|
||||
.querySelector(".button--editMilestone")
|
||||
.addEventListener("click", editMilestone);
|
||||
|
||||
panelBlockElement
|
||||
.querySelector(".button--completeMilestone")
|
||||
.addEventListener("click", completeMilestone);
|
||||
|
|
@ -1063,5 +1090,71 @@ declare const bulmaJS: BulmaJS;
|
|||
};
|
||||
|
||||
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();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
})();
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -10,8 +10,10 @@ import handler_doAddWorkOrderLotOccupancy from "../handlers/workOrders-post/doAd
|
|||
import handler_doDeleteWorkOrderLotOccupancy from "../handlers/workOrders-post/doDeleteWorkOrderLotOccupancy.js";
|
||||
import handler_doAddWorkOrderLot from "../handlers/workOrders-post/doAddWorkOrderLot.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_doReopenWorkOrderMilestone from "../handlers/workOrders-post/doReopenWorkOrderMilestone.js";
|
||||
import handler_doDeleteWorkOrderMilestone from "../handlers/workOrders-post/doDeleteWorkOrderMilestone.js";
|
||||
export const router = Router();
|
||||
router.get("/", handler_search);
|
||||
router.post("/doSearchWorkOrders", handler_doSearchWorkOrders);
|
||||
|
|
@ -23,6 +25,8 @@ router.post("/doAddWorkOrderLotOccupancy", permissionHandlers.updatePostHandler,
|
|||
router.post("/doDeleteWorkOrderLotOccupancy", permissionHandlers.updatePostHandler, handler_doDeleteWorkOrderLotOccupancy);
|
||||
router.post("/doAddWorkOrderLot", permissionHandlers.updatePostHandler, handler_doAddWorkOrderLot);
|
||||
router.post("/doDeleteWorkOrderLot", permissionHandlers.updatePostHandler, handler_doDeleteWorkOrderLot);
|
||||
router.post("/doAddWorkOrderMilestone", permissionHandlers.updatePostHandler, handler_doAddWorkOrderMilestone);
|
||||
router.post("/doCompleteWorkOrderMilestone", permissionHandlers.updatePostHandler, handler_doCompleteWorkOrderMilestone);
|
||||
router.post("/doReopenWorkOrderMilestone", permissionHandlers.updatePostHandler, handler_doReopenWorkOrderMilestone);
|
||||
router.post("/doDeleteWorkOrderMilestone", permissionHandlers.updatePostHandler, handler_doDeleteWorkOrderMilestone);
|
||||
export default router;
|
||||
|
|
|
|||
|
|
@ -17,8 +17,10 @@ import handler_doDeleteWorkOrderLotOccupancy from "../handlers/workOrders-post/d
|
|||
import handler_doAddWorkOrderLot from "../handlers/workOrders-post/doAddWorkOrderLot.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_doReopenWorkOrderMilestone from "../handlers/workOrders-post/doReopenWorkOrderMilestone.js";
|
||||
import handler_doDeleteWorkOrderMilestone from "../handlers/workOrders-post/doDeleteWorkOrderMilestone.js";
|
||||
|
||||
export const router = Router();
|
||||
|
||||
|
|
@ -70,6 +72,14 @@ router.post(
|
|||
handler_doDeleteWorkOrderLot
|
||||
);
|
||||
|
||||
// Milestones
|
||||
|
||||
router.post(
|
||||
"/doAddWorkOrderMilestone",
|
||||
permissionHandlers.updatePostHandler,
|
||||
handler_doAddWorkOrderMilestone
|
||||
);
|
||||
|
||||
router.post(
|
||||
"/doCompleteWorkOrderMilestone",
|
||||
permissionHandlers.updatePostHandler,
|
||||
|
|
@ -82,4 +92,10 @@ router.post(
|
|||
handler_doReopenWorkOrderMilestone
|
||||
);
|
||||
|
||||
router.post(
|
||||
"/doDeleteWorkOrderMilestone",
|
||||
permissionHandlers.updatePostHandler,
|
||||
handler_doDeleteWorkOrderMilestone
|
||||
);
|
||||
|
||||
export default router;
|
||||
|
|
|
|||
|
|
@ -210,8 +210,9 @@
|
|||
exports.workOrderLots = <%- JSON.stringify(workOrder.workOrderLots) %>;
|
||||
exports.workOrderLotOccupancies = <%- JSON.stringify(workOrder.workOrderLotOccupancies) %>;
|
||||
exports.workOrderMilestones = <%- JSON.stringify(workOrder.workOrderMilestones) %>;
|
||||
|
||||
|
||||
exports.lotStatuses = <%- JSON.stringify(lotStatuses) %>;
|
||||
exports.workOrderMilestoneTypes = <%- JSON.stringify(workOrderMilestoneTypes) %>;
|
||||
</script>
|
||||
<script src="<% urlPrefix %>/javascripts/workOrderEdit.min.js"></script>
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue