In client-specific implementations, there are often situations where the out-of-the-box (OOB) functionality needs to be enhanced with additional business rules.
The custom logic is written in AppCustomizations.js - Override Change status function in woStatusChangeDialog.
/**
* dialogInitialized to validate Failure Code for CM Workorders
* on change status to COMP
* @param {Object} obj
* @param {Dialog} obj.dialog
*/
dialogInitialized(obj) {
if (obj.name === 'woStatusChangeDialog') {
const controller = obj.controllers[0];
if (!controller) return;
const originalChangeStatus = controller.changeStatus.bind(controller);
controller.changeStatus = async (evt) => {
try {
const valid = this.businessLogicBeforeWOComplete(controller);
if (!valid) {
this.app.toast('Please complete failure report before Assignment', 'error');
return;
}
// Continue original logic
return await originalChangeStatus(evt);
}
catch (error) {
this.app.toast({ message: error.message, type: 'error' });
// IMPORTANT: stop further execution
return;
}
};
}
}
/**
* Business Logic Before WOComplete to validate Failure Reporting
* before changing status to COMP
* @param {controller} controller
* @returns {boolean} Returns true if a failure report exists with PCR code
*/
businessLogicBeforeWOComplete(controller) {
const woDetails = controller?.page?.parent?.state?.woItem;
const selectedStatus = controller?.page?.state?.selectedStatus;
// Only validate for COMP WO status
if (selectedStatus !== "COMP") return true;
// Check Work Order work type is corrective or emergency maintenance
if (woDetails.worktype !== "CM" && woDetails.worktype !== "EM") return true;
// check PCR code for the CM WO
if (!this.hasFailureReport(woDetails)) return false;
return true;
}
/**
* Check WO Failure Report
* @returns {boolean} Returns true if a failure report exists with PCR code
*/
hasFailureReport(item) {
const failureReport = item.failurereport || item.failurelist || [];
let hasProblem = false;
let hasCause = false;
let hasRemedy = false;
for (const failure of failureReport) {
if (!hasProblem && failure.type_maxvalue === 'PROBLEM') {
hasProblem = true;
}
if (!hasCause && failure.type_maxvalue === 'CAUSE') {
hasCause = true;
}
if (!hasRemedy && failure.type_maxvalue === 'REMEDY') {
hasRemedy = true;
}
}
if (!failureReport || !Array.isArray(failureReport)) {
return false;
}
return failureReport.length > 0 && hasProblem && hasCause && hasRemedy;
}
Approach 2: Replace a button event handler with a custom method and explicitly invoke the original controller method after validation.
<button disabled="{(woDetailsReportWork.item.flowcontrolled && page.state.taskInComplete)
|| !app.checkSigOption('${app.state.woOSName}.COMPWOBUTTON')}"
hidden="{woDetailsReportWork.item.status_maxvalue === 'COMP'||
woDetailsReportWork.item.status_maxvalue === 'CAN' ||
woDetailsReportWork.item.status_maxvalue === 'CLOSE'}"
icon="carbon:checkmark--outline" id="p6aav" kind="primary" label="Complete work"
loading="{page.state.loadingcomp === true}" on-click="CustomCompleteWorkorder"
on-click-arg="{{'item':woDetailsReportWork.item,'datasource':woDetailsReportWork,
'status':app.state.systemProp['maximo.mobile.completestatus']}}" padding="false"
slot="buttons"/>async CustomCompleteWorkorder (evt) {
const woDetailDs = this.app.findDatasource("woDetailds");
const woItem = woDetailDs.item ;
if (woItem.worktype === "CM" && woItem.worktype === "EM") {
if (!this.checkFailureReport(woItem)) {
this.app.toast('Please fill failure report before completing WO', 'error');
return;
}
}
// Call report page oob method after validation
let page = this.app?.currentPage;
let controller = page?.controllers?.find( c => c.completeWorkorder );
controller?.completeWorkorder(evt);
}ibm-maximo-mobile-replace-existing-method