Is it possible to cancel a DCM transition from JS code? I believe it used to be possible in the classic UI, but I can't find any info on achieving it in Freedom UI. Trying to intercept the call with a handler for `crt.EntityStageProgressBarStageChangedHandlerRequest` allows "cancelling" it in a sense, as we can prevent the continuation of the handler chain by not performing the `return await next?.handle(request);` call, similar to how you would omit the `this.callParent(arguments)` when using classic UI, which does prevent the change from happening/further processing, but this leaves the selected stage highlighted instead of visually returning it back to the actually active stage. I'm currently using version 8.1.0
Like
Hello!
In order to cancel a DCM transition you will have to add a handler for the system request crt.SaveRecordRequest, which is executed when you click the Save button on the record editing page.
In this example, we also added crt.HandleViewModelAttributeChangeRequest, which is executed whenever the value of an attribute changes, and an "IsStageChanged" attribute to control the Stage state. This way we check if a Stage attribute (LookupAttribute_ioghn6a) has been changed and prevent it from being saved. You can adjust this code according to your business needs:
... viewModelConfigDiff: /**SCHEMA_VIEW_MODEL_CONFIG_DIFF*/[ { "operation": "merge", "path": [ "attributes" ], "values": { ... "IsStageChanged":{ value: false } } }, ]/**SCHEMA_VIEW_MODEL_CONFIG_DIFF*/, handlers: /**SCHEMA_HANDLERS*/[ { request: "crt.SaveRecordRequest", handler: async (request, next) => { if(await request.$context.LookupAttribute_ioghn6a && await request.$context.IsStageChanged){ request.$context._notifyService.show({message: 'Cannot set status'}); return false; } const saveResult = await next.handle(request); if(saveResult){ request.$context.IsStageChanged = false; } return saveResult; } }, { request: "crt.HandleViewModelAttributeChangeRequest", handler: async (request, next) => { if (request.attributeName === 'LookupAttribute_ioghn6a' && request.value != request.oldValue && request.oldValue) { request.$context.IsStageChanged = true; } return next?.handle(request); }, } ]/**SCHEMA_HANDLERS*/, ...
Hello!
In order to cancel a DCM transition you will have to add a handler for the system request crt.SaveRecordRequest, which is executed when you click the Save button on the record editing page.
In this example, we also added crt.HandleViewModelAttributeChangeRequest, which is executed whenever the value of an attribute changes, and an "IsStageChanged" attribute to control the Stage state. This way we check if a Stage attribute (LookupAttribute_ioghn6a) has been changed and prevent it from being saved. You can adjust this code according to your business needs:
... viewModelConfigDiff: /**SCHEMA_VIEW_MODEL_CONFIG_DIFF*/[ { "operation": "merge", "path": [ "attributes" ], "values": { ... "IsStageChanged":{ value: false } } }, ]/**SCHEMA_VIEW_MODEL_CONFIG_DIFF*/, handlers: /**SCHEMA_HANDLERS*/[ { request: "crt.SaveRecordRequest", handler: async (request, next) => { if(await request.$context.LookupAttribute_ioghn6a && await request.$context.IsStageChanged){ request.$context._notifyService.show({message: 'Cannot set status'}); return false; } const saveResult = await next.handle(request); if(saveResult){ request.$context.IsStageChanged = false; } return saveResult; } }, { request: "crt.HandleViewModelAttributeChangeRequest", handler: async (request, next) => { if (request.attributeName === 'LookupAttribute_ioghn6a' && request.value != request.oldValue && request.oldValue) { request.$context.IsStageChanged = true; } return next?.handle(request); }, } ]/**SCHEMA_HANDLERS*/, ...