To Make Custom Record Type Selection Available for Users in Custom Components With force:createRecord i Have created below custom Lightning component . by using this when user create task from any object like Opportunity it will navigate to Task Record Type Selection page , once he select recordtype it will open editable mode Task record with pre populated Relatedto field (opportunity).
Test class:
@isTest
public class recordtypeControllerTest {
static testmethod void testFetchRecordTypes() {
List<String> values = recordtypeController.fetchRecordTypeValues();
}
static testmethod void testgetRecordTypeId() {
String recordTypeLabel = 'Test1';
ID testId = recordtypeController.getRecTypeId(recordTypeLabel);
System.assert(testId != null);
}
}
Lightning component:
<aura:component controller="recordtypeController" implements="force:appHostable,flexipage:availableForAllPageTypes,flexipage:availableForRecordHome,force:hasRecordId,forceCommunity:availableForAllPageTypes,force:lightningQuickAction" access="global">
<aura:handler name="init" value="{!this}" action="{!c.fetchListOfRecordTypes}"/>
<aura:attribute name="lstOfRecordType" type="String[]" />
<aura:attribute name="isOpen" type="boolean" default="false" />
<aura:attribute name="recordId" type="String" />
<div class="slds-m-around--x-large">
<lightning:button label="Create a Task" onclick="{!c.openModal}" />
</div>
<!-- Model Box Start -->
<aura:if isTrue="{!v.isOpen}">
<div role="dialog" tabindex="-1" aria-labelledby="header43" class="slds-modal slds-fade-in-open">
<div class="slds-modal__container">
<div class="slds-modal__header">
<button class="slds-button slds-modal__close slds-button--icon-inverse" title="Close" onclick="{!c.closeModal}">
X<span class="slds-assistive-text">Cancel</span>
</button>
<h2 id="header43" class="slds-text-heading--medium">New Task</h2>
</div>
<div class="slds-modal__content slds-p-around--medium">
<div class="slds-grid slds-wrap">
<div class="slds-size--1-of-2 slds-large-size--1-of-2">
<div class="slds-align--absolute-center">Select a Record Type</div>
</div>
<div class="slds-size--1-of-2 slds-large-size--1-of-2">
<ui:inputSelect aura:id="selectid">
<aura:iteration items="{!v.lstOfRecordType}" var="Objtask">
<ui:inputSelectOption text="{!Objtask}" label="{!Objtask}" />
</aura:iteration>
</ui:inputSelect>
</div>
</div>
</div>
<div class="slds-modal__footer">
<lightning:button class="slds-button slds-button--neutral" onclick="{!c.closeModal}">Cancel</lightning:button>
<lightning:button class="slds-button slds-button--brand" onclick="{!c.createRecord}">Next</lightning:button>
</div>
</div>
</div>
<div class="slds-backdrop slds-backdrop--open"></div>
</aura:if>
</aura:component>
Javascript controller:
({
/* On the component Load this function call the apex class method,
* which is return the list of RecordTypes of object
* and set it to the lstOfRecordType attribute to display record Type values
* on ui:inputSelect component. */
fetchListOfRecordTypes: function(component, event, helper) {
var action = component.get("c.fetchRecordTypeValues");
action.setCallback(this, function(response) {
component.set("v.lstOfRecordType", response.getReturnValue());
});
$A.enqueueAction(action);
},
/* In this "createRecord" function, first we have call apex class method
* and pass the selected RecordType values[label] and this "getRecTypeId"
* apex method return the selected recordType ID.
* When RecordType ID comes, we have call "e.force:createRecord"
* event and pass object API Name and
* set the record type ID in recordTypeId parameter. and fire this event
* if response state is not equal = "SUCCESS" then display message on various situations.
*/
createRecord: function(component, event, helper) {
component.set("v.isOpen", true);
var action = component.get("c.getRecTypeId");
var recordTypeLabel = component.find("selectid").get("v.value");
action.setParams({
"recordTypeLabel": recordTypeLabel
});
action.setCallback(this, function(response) {
var state = response.getState();
if (state === "SUCCESS") {
var createRecordEvent = $A.get("e.force:createRecord");
var RecTypeID = response.getReturnValue();
var whatidvar = component.get("v.recordId");
alert(whatidvar);
createRecordEvent.setParams({
"entityApiName": 'Task',
"recordTypeId": RecTypeID,
'defaultFieldValues': {
'WhatId': whatidvar
}
});
createRecordEvent.fire();
} else if (state == "INCOMPLETE") {
var toastEvent = $A.get("e.force:showToast");
toastEvent.setParams({
"title": "Oops!",
"message": "No Internet Connection"
});
toastEvent.fire();
} else if (state == "ERROR") {
var toastEvent = $A.get("e.force:showToast");
toastEvent.setParams({
"title": "Error!",
"message": "Please contact your administrator"
});
toastEvent.fire();
}
});
$A.enqueueAction(action);
},
closeModal: function(component, event, helper) {
// set "isOpen" attribute to false for hide/close model box
component.set("v.isOpen", false);
},
openModal: function(component, event, helper) {
// set "isOpen" attribute to true to show model box
component.set("v.isOpen", true);
},
})
Server side Controller :
public class recordtypeController {
public static Map<Id, String> recordtypemap {get;set;}
@AuraEnabled
public static List<String> fetchRecordTypeValues(){
List<Schema.RecordTypeInfo> recordtypes = Task.SObjectType.getDescribe().getRecordTypeInfos();
recordtypemap = new Map<Id, String>();
for(RecordTypeInfo rt : recordtypes){
if(rt.getName() != 'Master')
recordtypemap.put(rt.getRecordTypeId(), rt.getName());
}
return recordtypemap.values();
}
@AuraEnabled
public static Id getRecTypeId(String recordTypeLabel){
Id recid = Schema.SObjectType.Task.getRecordTypeInfosByName().get(recordTypeLabel).getRecordTypeId();
return recid;
}
}
Test class:
@isTest
public class recordtypeControllerTest {
static testmethod void testFetchRecordTypes() {
List<String> values = recordtypeController.fetchRecordTypeValues();
}
static testmethod void testgetRecordTypeId() {
String recordTypeLabel = 'Test1';
ID testId = recordtypeController.getRecTypeId(recordTypeLabel);
System.assert(testId != null);
}
}
No comments:
Post a Comment