Here's my code for overriding the New Event from the calendar using navigate to pageReference. Still not perfect and I've left a few commented out attempts. Can anyone provide the final fix?
NewEventOverride2.cmp
<aura:component implements="lightning:actionOverride,lightning:hasPageReference,lightning:isUrlAddressable "
controller="NewEventController" access="global">
<aura:handler name="init" value="{!this}" action="{!c.doInit}"/>
<aura:handler name="change" value="{!v.pageReference}" action="{!c.pageRefChange}" />
<lightning:button label="Return to Calendar Page" onclick="{!c.gotoCalendar}"/>
<lightning:navigation aura:id="navService"/>
<!-- pageReferenceUtil component -->
<lightning:pageReferenceUtils aura:id="pageRefUtils"/>
<aura:attribute name="eventRecordTypes" type="object" />
<aura:attribute name="eventRecordTypeId" type="String" default=""/>
<aura:attribute name="eventRecordType" type="String" default=""/>
</aura:component>
NewEventOveride2Controller
({
doInit: function(component, event, helper) {
var pageReference = component.get("v.pageReference");
console.log(JSON.parse(JSON.stringify(pageReference)));
var getAddParms = pageReference.state.additionalParams;
if(typeof getAddParms !== 'undefined') {
console.log('Add Parms = '+getAddParms);
}//endif
var getCount = pageReference.state.count;
if(typeof getCount !== 'undefined') {
console.log('Count = '+getCount);
}//endif
//Fetching Record Type Id
var eventRecordTypeId = pageReference.state.recordTypeId;
console.log('eventRecordId in new event doInit: '+eventRecordTypeId);
helper.hlpGetRecordType(component, eventRecordTypeId)
.then($A.getCallback(function(records){
var eRecType = component.get("v.eventRecordType");
console.log('eRecType = ', eRecType);
//set defaults according to eRecType
var dFV;
var defaultValues;
//retURL: "~~~.com", ???
if (eRecType == 'Training'){
dFV = {
Subject: "Training"
};
defaultValues = component.find("pageRefUtils").encodeDefaultFieldValues(dFV);
}//endif
var pageReference = {
"type": "standard__objectPage",
"attributes": {
objectApiName: "Event",
actionName: "new",
additionalParams: "",
count: "1"
},
"state": {
count: "1",
nooverride: '1',
defaultFieldValues: defaultValues,
recordTypeId: eventRecordTypeId
}
};
console.log('launch helper with pagereference and navigate');
console.log(JSON.parse(JSON.stringify(pageReference)));
//event.preventDefault();
var navService = component.find("navService");
navService.navigate(pageReference,true);
}))//end then
.catch(function(errors) {
console.error('ERROR: ' + errors);
});
},//doInit
pageRefChange : function(component, event, helper) {
console.log('page Reference has changed');
var pageReference = component.get("v.pageReference");
console.log('pr = ');
console.log(JSON.parse(JSON.stringify(pageReference)));
console.log(pageReference.state);
console.log('count = '+pageReference.state.count);
console.log(pageReference.type);
console.log(pageReference.attributes);
//pageReference.state.count = 1;
//component.set("v.pageReference",pageReference);
console.log('changed pageReference.state.count');
var newState = "{additionalParams: '', count: '4'}"
//helper.updatePageRef( pageReference, newState);
//console.log(JSON.parse(JSON.stringify(updated)));
//console.log(updated.state);
var defaultUrl = "apex/MyVisualForcePage";
var navService = component.find("navService");
navService.generateUrl(pageReference)
.then($A.getCallback(function(url) {
console.log('url' + url);
console.log('defaultUrl' + defaultUrl);
//component.set("v.url", url ? url : defaultUrl);
//now create a new one
var newPageReference = {
"type": "standard__objectPage",
"attributes": {
objectApiName: "Event",
actionName: "home",
additionalParams: "",
navigationLocation: "LIST_VIEW",
backgroundContext: "%2lightning%2o%2Event%2home"
},
"state": {
count: "1",
nooverride: '1'
}
};
//component.set("v.pageReference",newPageReference); //causes infinite loop
console.log('now navigate to calendar with pr = ');
console.log(JSON.parse(JSON.stringify(newPageReference)));
console.log('state = '+newPageReference.state);
//console.log('count = '+pageReference.state.count);
console.log(newPageReference.type);
console.log(newPageReference.attributes);
//navService.navigate(newPageReference,true);
//this works!!!...Thanks Piyush
$A.get('e.force:refreshView').fire();
}), $A.getCallback(function(error) {
//component.set("v.url", defaultUrl);
}));
},//pageRefChange
gotoCalendar : function(component, event, helper) {
var navService = component.find("navService");
var pageReference = {
"type": "standard__objectPage",
"attributes": {
objectApiName: "Event",
actionName: "home",
additionalParams: "",
navigationLocation: "LIST_VIEW",
backgroundContext: "%2lightning%2o%2Event%2home"
},
"state": {
count: "1",
nooverride: '1'
}
};
console.log('go to calendar with pr = ');
console.log(JSON.parse(JSON.stringify(pageReference)));
console.log('state = '+pageReference.state);
//console.log('count = '+pageReference.state.count);
console.log(pageReference.type);
console.log(pageReference.attributes);
navService.navigate(pageReference,true);
},//gotoCalendar
})
NewEventOverride2Helper.js
({
hlpGetRecordType : function(component, recordTypeId) {
return new Promise($A.getCallback(function(resolve, reject) {
var action = component.get("c.getEventRecordTypes");
action.setParams({
objectType: 'Event',
selectedField: 'Type',
extended: true
});
action.setCallback(this, function(response) {
var state = response.getState();
if (state === 'SUCCESS') {
var lstValues = response.getReturnValue();
/*console.log('success ');
console.log('return from get types');
console.log(lstValues);*/
var returning = [];
var recordTypes = response.getReturnValue();
for(var key in recordTypes){
//console.log("Record Type Id: "+key+" Value: "+recordTypes[key][0]);
if (key === recordTypeId){
returning.push({key:key,value:''+recordTypes[key][0]});
component.set("v.eventRecordType",recordTypes[key][0]);
//console.log(recordTypes[key][0]);
}//endif
}//next
component.set("v.eventRecordTypes",returning);
resolve(returning);
} else if(state === 'ERROR') {
console.log('error = '+action.getError());
reject(action.getError())
}//endif success
});//end callback
$A.enqueueAction(action);
}));//end promise
},//hlpGetRecordType
updatePageRef: function( pageRef, newState) {
var pageRef2 = pageRef;
console.log(JSON.parse(JSON.stringify(pageRef2)));
//pageRef2.state = Object.assign(pageRef2.state, newState || {});
//console.log(JSON.parse(JSON.stringify(pageRef2)));
//return pageRef2;
},
})
NewEventController.apxc
public class NewEventController {
@AuraEnabled
public static Map<String,List<String>> getEventRecordTypes()
{
Map<String,List<String>> recordTypeMap = new Map<String,List<String>>();
List<RecordType> listRec = new List<RecordType>();
Schema.DescribeSObjectResult eventObj = Event.SObjectType.getDescribe();
List<Schema.RecordTypeInfo> rtInfo = eventObj.getRecordTypeInfos();
for(RecordType rec : [SELECT Id, Name, Description FROM RecordType WHERE SobjectType = 'Event']) { //and here
listRec.add(rec);
system.debug(rec);
}
for( Schema.RecordTypeInfo recordType : rtInfo )
{
List<String> nameAndDesc = new List<String>();
system.debug('record type '+recordType);
if(recordType.isAvailable())
{
//system.debug('record type name '+recordType.Name);
if(recordType.Name!='Master') {
for(RecordType rList: listRec){
if(rList.Id==recordType.getRecordTypeId()){
nameAndDesc.add(rList.Name);
//ignore description
nameAndDesc.add(rList.Description);
}
}
recordTypeMap.put(recordType.getRecordTypeId(),nameAndDesc);
}
}
}
return recordTypeMap;
}//getEventRecordTypes
}
e.force:closeQuickAction
event seemed to do the trick for me.